diff --git a/src/main/java/com/falsepattern/endlessids/mixin/helpers/IChunkMixin.java b/src/main/java/com/falsepattern/endlessids/mixin/helpers/IChunkMixin.java index 5a53f68..b811456 100644 --- a/src/main/java/com/falsepattern/endlessids/mixin/helpers/IChunkMixin.java +++ b/src/main/java/com/falsepattern/endlessids/mixin/helpers/IChunkMixin.java @@ -5,5 +5,4 @@ import net.minecraft.world.chunk.storage.ExtendedBlockStorage; public interface IChunkMixin { short[] getBiomeShortArray(); void setBiomeShortArray(short[] data); - ExtendedBlockStorage _getBlockStorageArray(int index); } diff --git a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/storage/ChunkMixin.java b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/storage/ChunkMixin.java index 404e191..143b186 100644 --- a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/storage/ChunkMixin.java +++ b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/storage/ChunkMixin.java @@ -73,4 +73,14 @@ public abstract class ChunkMixin implements IChunkMixin { return BiomeGenBase.getBiome(id) == null ? BiomeGenBase.plains : BiomeGenBase.getBiome(id); } + + @Override + public short[] getBiomeShortArray() { + return blockBiomeShortArray; + } + + @Override + public void setBiomeShortArray(short[] data) { + blockBiomeShortArray = data; + } } diff --git a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/worldgen/ChunkProviderEndMixin.java b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/worldgen/ChunkProviderEndMixin.java index 591f819..516e060 100644 --- a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/worldgen/ChunkProviderEndMixin.java +++ b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/worldgen/ChunkProviderEndMixin.java @@ -31,22 +31,21 @@ public abstract class ChunkProviderEndMixin { * @reason Direct port from decompiled code */ @Overwrite - public Chunk provideChunk(int p_73154_1_, int p_73154_2_) { - this.endRNG.setSeed((long)p_73154_1_ * 341873128712L + (long)p_73154_2_ * 132897987541L); - Block[] var3 = new Block[32768]; - byte[] var4 = new byte[var3.length]; - this.biomesForGeneration = this.endWorld.getWorldChunkManager().loadBlockGeneratorData(this.biomesForGeneration, p_73154_1_ * 16, p_73154_2_ * 16, 16, 16); - this.func_147420_a(p_73154_1_, p_73154_2_, var3, this.biomesForGeneration); - this.replaceBiomeBlocks(p_73154_1_, p_73154_2_, var3, this.biomesForGeneration, var4); - Chunk var5 = new Chunk(this.endWorld, var3, var4, p_73154_1_, p_73154_2_); - @SuppressWarnings("ConstantConditions") //Mixin moment - short[] var6 = ((IChunkMixin)var5).getBiomeShortArray(); + public Chunk provideChunk(int x, int z) { + this.endRNG.setSeed((long)x * 341873128712L + (long)z * 132897987541L); + Block[] blocks = new Block[32768]; + byte[] metadatas = new byte[blocks.length]; + this.biomesForGeneration = this.endWorld.getWorldChunkManager().loadBlockGeneratorData(this.biomesForGeneration, x * 16, z * 16, 16, 16); + this.func_147420_a(x, z, blocks, this.biomesForGeneration); + this.replaceBiomeBlocks(x, z, blocks, this.biomesForGeneration, metadatas); + Chunk chunk = new Chunk(this.endWorld, blocks, metadatas, x, z); + short[] biomes = ((IChunkMixin)chunk).getBiomeShortArray(); - for(int var7 = 0; var7 < var6.length; ++var7) { - var6[var7] = (short)this.biomesForGeneration[var7].biomeID; + for(int i = 0; i < biomes.length; ++i) { + biomes[i] = (short)this.biomesForGeneration[i].biomeID; } - var5.generateSkylightMap(); - return var5; + chunk.generateSkylightMap(); + return chunk; } } diff --git a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/worldgen/ChunkProviderFlatMixin.java b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/worldgen/ChunkProviderFlatMixin.java index b15e69c..7afe938 100644 --- a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/worldgen/ChunkProviderFlatMixin.java +++ b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/worldgen/ChunkProviderFlatMixin.java @@ -1,64 +1,75 @@ package com.falsepattern.endlessids.mixin.mixins.common.vanilla.worldgen; -import com.sk89q.worldedit.world.chunk.Chunk; +import com.falsepattern.endlessids.mixin.helpers.IChunkMixin; +import com.falsepattern.endlessids.mixin.helpers.IExtendedBlockStorageMixin; import net.minecraft.block.Block; import net.minecraft.world.World; +import net.minecraft.world.biome.BiomeGenBase; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.chunk.storage.ExtendedBlockStorage; import net.minecraft.world.gen.ChunkProviderFlat; +import net.minecraft.world.gen.MapGenBase; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; import org.spongepowered.asm.mixin.Shadow; import java.util.Iterator; +import java.util.List; @Mixin(ChunkProviderFlat.class) -public abstract class ChunkProviderFlatMixin { +public abstract class ChunkProviderFlatMixin implements IChunkProvider { @Shadow private World worldObj; @Shadow @Final private Block[] cachedBlockIDs; - @Overwrite - public Chunk provideChunk(int var1, int var2) { - Chunk var3 = new Chunk(this.worldObj, var1, var2); + @Shadow @Final private byte[] cachedBlockMetadata; - int var6; - for(int var4 = 0; var4 < this.cachedBlockIDs.length; ++var4) { - Block var5 = this.cachedBlockIDs[var4]; - if (var5 != null) { - var6 = var4 >> 4; - ExtendedBlockStorage var7 = var3.getBlockStorageArray()[var6]; - if (var7 == null) { - var7 = new ExtendedBlockStorage(var4, !this.worldObj.provider.hasNoSky); - var3.getBlockStorageArray()[var6] = var7; + @Shadow @Final private List structureGenerators; + + /** + * @author FalsePattern + * @reason Direct port from dumped code + */ + @Overwrite + public Chunk provideChunk(int x, int z) { + Chunk chunk = new Chunk(this.worldObj, x, z); + + for(int Y = 0; Y < this.cachedBlockIDs.length; ++Y) { + Block block = this.cachedBlockIDs[Y]; + if (block != null) { + int ebsID = Y >> 4; + ExtendedBlockStorage ebs = chunk.getBlockStorageArray()[ebsID]; + if (ebs == null) { + ebs = new ExtendedBlockStorage(Y, !this.worldObj.provider.hasNoSky); + chunk.getBlockStorageArray()[ebsID] = ebs; } - for(int var8 = 0; var8 < 16; ++var8) { - for(int var9 = 0; var9 < 16; ++var9) { - var7.setExtBlockID(var8, var4 & 15, var9, var5); - var7.setExtBlockMetadata(var8, var4 & 15, var9, this.cachedBlockMetadata[var4]); + for(int X = 0; X < 16; ++X) { + for(int Z = 0; Z < 16; ++Z) { + ebs.func_150818_a(X, Y & 15, Z, block); + ebs.setExtBlockMetadata(X, Y & 15, Z, this.cachedBlockMetadata[Y]); } } } } - var3.generateSkylightMap(); - BiomeGenBase[] var10 = this.worldObj.getWorldChunkManager().loadBlockGeneratorData((BiomeGenBase[])null, var1 * 16, var2 * 16, 16, 16); - short[] var11 = var3.getBiomeShortArray(); + chunk.generateSkylightMap(); + BiomeGenBase[] bgb = this.worldObj.getWorldChunkManager().loadBlockGeneratorData(null, x * 16, z * 16, 16, 16); + short[] biomeArray = ((IChunkMixin)chunk).getBiomeShortArray(); - for(var6 = 0; var6 < var11.length; ++var6) { - var11[var6] = (short)var10[var6].biomeID; + for(int i = 0; i < biomeArray.length; ++i) { + biomeArray[i] = (short)bgb[i].biomeID; } - Iterator var12 = this.structureGenerators.iterator(); - - while(var12.hasNext()) { - MapGenBase var13 = (MapGenBase)var12.next(); - var13.generate(this, this.worldObj, var1, var2, (Block[])null); + for (Object o : this.structureGenerators) { + MapGenBase structureGenerator = (MapGenBase) o; + structureGenerator.func_151539_a(this, this.worldObj, x, z, null); } - var3.generateSkylightMap(); - return var3; + chunk.generateSkylightMap(); + return chunk; } } diff --git a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/worldgen/ChunkProviderGenerateMixin.java b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/worldgen/ChunkProviderGenerateMixin.java new file mode 100644 index 0000000..8d8320b --- /dev/null +++ b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/worldgen/ChunkProviderGenerateMixin.java @@ -0,0 +1,79 @@ +package com.falsepattern.endlessids.mixin.mixins.common.vanilla.worldgen; + +import com.falsepattern.endlessids.mixin.helpers.IChunkMixin; +import net.minecraft.block.Block; +import net.minecraft.world.World; +import net.minecraft.world.biome.BiomeGenBase; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.IChunkProvider; +import net.minecraft.world.gen.ChunkProviderGenerate; +import net.minecraft.world.gen.MapGenBase; +import net.minecraft.world.gen.structure.MapGenMineshaft; +import net.minecraft.world.gen.structure.MapGenScatteredFeature; +import net.minecraft.world.gen.structure.MapGenStronghold; +import net.minecraft.world.gen.structure.MapGenVillage; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.Random; + +@Mixin(ChunkProviderGenerate.class) +public abstract class ChunkProviderGenerateMixin implements IChunkProvider { + @Shadow public abstract void func_147424_a(int p_147424_1_, int p_147424_2_, Block[] p_147424_3_); + + @Shadow private Random rand; + + @Shadow private BiomeGenBase[] biomesForGeneration; + + @Shadow private World worldObj; + + @Shadow public abstract void replaceBlocksForBiome(int p_147422_1_, int p_147422_2_, Block[] p_147422_3_, byte[] p_147422_4_, BiomeGenBase[] p_147422_5_); + + @Shadow private MapGenBase caveGenerator; + + @Shadow private MapGenBase ravineGenerator; + + @Shadow @Final private boolean mapFeaturesEnabled; + + @Shadow private MapGenMineshaft mineshaftGenerator; + + @Shadow private MapGenVillage villageGenerator; + + @Shadow private MapGenStronghold strongholdGenerator; + + @Shadow private MapGenScatteredFeature scatteredFeatureGenerator; + + /** + * @author FalsePattern + * @reason Direct port from dumped code + */ + @Overwrite + public Chunk provideChunk(int x, int z) { + this.rand.setSeed((long)x * 341873128712L + (long)z * 132897987541L); + Block[] blocks = new Block[65536]; + byte[] metadata = new byte[65536]; + this.func_147424_a(x, z, blocks); + this.biomesForGeneration = this.worldObj.getWorldChunkManager().loadBlockGeneratorData(this.biomesForGeneration, x * 16, z * 16, 16, 16); + this.replaceBlocksForBiome(x, z, blocks, metadata, this.biomesForGeneration); + this.caveGenerator.func_151539_a(this, this.worldObj, x, z, blocks); + this.ravineGenerator.func_151539_a(this, this.worldObj, x, z, blocks); + if (this.mapFeaturesEnabled) { + this.mineshaftGenerator.func_151539_a(this, this.worldObj, x, z, blocks); + this.villageGenerator.func_151539_a(this, this.worldObj, x, z, blocks); + this.strongholdGenerator.func_151539_a(this, this.worldObj, x, z, blocks); + this.scatteredFeatureGenerator.func_151539_a(this, this.worldObj, x, z, blocks); + } + + Chunk chunk = new Chunk(this.worldObj, blocks, metadata, x, z); + short[] biomes = ((IChunkMixin)chunk).getBiomeShortArray(); + + for(int i = 0; i < biomes.length; ++i) { + biomes[i] = (short)this.biomesForGeneration[i].biomeID; + } + + chunk.generateSkylightMap(); + return chunk; + } +} diff --git a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/worldgen/ChunkProviderHellMixin.java b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/worldgen/ChunkProviderHellMixin.java new file mode 100644 index 0000000..4bbb0e8 --- /dev/null +++ b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/worldgen/ChunkProviderHellMixin.java @@ -0,0 +1,57 @@ +package com.falsepattern.endlessids.mixin.mixins.common.vanilla.worldgen; + +import com.falsepattern.endlessids.mixin.helpers.IChunkMixin; +import net.minecraft.block.Block; +import net.minecraft.world.World; +import net.minecraft.world.biome.BiomeGenBase; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.IChunkProvider; +import net.minecraft.world.gen.ChunkProviderHell; +import net.minecraft.world.gen.MapGenBase; +import net.minecraft.world.gen.structure.MapGenNetherBridge; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.Random; + +@Mixin(ChunkProviderHell.class) +public abstract class ChunkProviderHellMixin implements IChunkProvider { + + @Shadow private Random hellRNG; + + @Shadow private World worldObj; + + @Shadow public abstract void func_147419_a(int p_147419_1_, int p_147419_2_, Block[] p_147419_3_); + + @Shadow public abstract void replaceBiomeBlocks(int p_147418_1_, int p_147418_2_, Block[] p_147418_3_, byte[] meta, BiomeGenBase[] biomes); + + @Shadow private MapGenBase netherCaveGenerator; + + @Shadow public MapGenNetherBridge genNetherBridge; + + /** + * @author FalsePattern + * @reason Direct port from dumped code + */ + @Overwrite + public Chunk provideChunk(int x, int z) { + this.hellRNG.setSeed((long)x * 341873128712L + (long)z * 132897987541L); + Block[] blocks = new Block[32768]; + byte[] metadata = new byte[blocks.length]; + BiomeGenBase[] bgb = this.worldObj.getWorldChunkManager().loadBlockGeneratorData(null, x * 16, z * 16, 16, 16); + this.func_147419_a(x, z, blocks); + this.replaceBiomeBlocks(x, z, blocks, metadata, bgb); + this.netherCaveGenerator.func_151539_a(this, this.worldObj, x, z, blocks); + this.genNetherBridge.func_151539_a(this, this.worldObj, x, z, blocks); + Chunk chunk = new Chunk(this.worldObj, blocks, metadata, x, z); + short[] biomes = ((IChunkMixin)chunk).getBiomeShortArray(); + + for(int i = 0; i < biomes.length; ++i) { + biomes[i] = (short)bgb[i].biomeID; + } + + chunk.resetRelightChecks(); + return chunk; + } +}