BIDE porting... (chunk and worldgen stuff)

This commit is contained in:
FalsePattern committed 2022-06-18 21:10:42 +02:00
1 parent 6bcf0e8bd5
commit b46cd34868
6 files changed
+200 -45

No files matched your search

@@ -5,5 +5,4 @@ import net.minecraft.world.chunk.storage.ExtendedBlockStorage;
public interface IChunkMixin {
short[] getBiomeShortArray();
void setBiomeShortArray(short[] data);
ExtendedBlockStorage _getBlockStorageArray(int index);
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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;
}
}