diff --git a/src/main/java/com/falsepattern/endlessids/config/GeneralConfig.java b/src/main/java/com/falsepattern/endlessids/config/GeneralConfig.java index 9372d94..fbbc9ac 100644 --- a/src/main/java/com/falsepattern/endlessids/config/GeneralConfig.java +++ b/src/main/java/com/falsepattern/endlessids/config/GeneralConfig.java @@ -9,25 +9,55 @@ public class GeneralConfig { static { ConfigurationManager.selfInit(); } + @Config.Comment("WARNING: THIS CONFIG IS EXTREMELY SENSITIVE TO CHANGES, DISABLING STUFF ONCE THEY HAVE BEEN ENABLED\n" + + "CAN CORRUPT YOUR WORLD! ONLY TOUCH THIS FILE IF YOU KNOW WHAT YOU'RE DOING!\n" + + "This file should only be edited by modpack developers to finetune it for the modpack. Once an option\n" + + "has been enabled, it modifies the chunk save data format, which is (partially) compatible with\n" + + "vanilla, but removing the mod might cause block/item corruption for higher IDs.\n" + + "Additional note: Every client and server must have the exact same config, this also affects netcode.") + @Config.DefaultString("") + public static String __NOTICE__; + @Config.Comment("Throw an exception when an invalid block is registered. FOR DEBUGGING PURPOSES") @Config.DefaultBoolean(false) public static boolean catchUnregisteredBlocks; - @Config.Comment("Remove invalid (corrupted) blocks from the game.") + @Config.Comment("Remove invalid (corrupted) blocks from the game. FOR DEBUGGING PURPOSES") @Config.DefaultBoolean(false) public static boolean removeInvalidBlocks; - @Config.Comment("Extend DataWatcher IDs. Vanilla limit is 31, new limit is 127.") + @Config.Comment("Extend Biome IDs. Vanilla limit is 256, new limit is 65536.") + @Config.DefaultBoolean(true) + public static boolean extendBiome; + + @Config.Comment("Extend Block and Item IDs. Vanilla limit is 4096/32000, new limit is 16777216 for both.\n" + + "See also: countCorrectionBits") + @Config.DefaultBoolean(true) + public static boolean extendBlockItem; + + @Config.Comment("Extend DataWatcher IDs. Vanilla limit is 31, new limit is 127.\n" + + "Disabled by default because of uncertain/weak implementation (taken from NotEnoughIDs)") @Config.DefaultBoolean(false) public static boolean extendDataWatcher; + @Config.Comment("Extend Enchantment IDs. Vanilla limit is 256, new limit is 32768.") + @Config.DefaultBoolean(true) + public static boolean extendEnchantment; + + @Config.Comment("Extend Potion IDs. Vanilla limit is 32, new limit is 65536.") + @Config.DefaultBoolean(true) + public static boolean extendPotion; + @Config.Comment( - "Setting this value greater than 0 will reduce RAM usage, at the cost of less available Block IDs.\n" + + "Use this to tune the amount of available block IDs.\n" + + "Minecraft contains some internal code that uses a HUGE amount of RAM with too many block IDs available.\n" + "Notice: This does not affect ITEM IDs.\n" + - "By default, block IDs can also go up to 16 Million, and each additional bit in this setting halves\n" + - "this value.\n" + + "The vanilla default is 4k block IDs, while the maximum is 16 million.\n" + + "The default setting sets it to 4k (vanilla).\n" + + "increase if necessary (when running out of BLOCK IDs in your modpack)\n" + + "Only effective if extendBlockItem is enabled.\n" + "(0: 16M, 1: 8M, 2: 4M, 3: 2M, 4: 1M, 5: 512K, 6: 256K, 7: 128K, 8: 64K, 9: 32K, 10: 16K, 11: 8K, 12: 4K)\n") @Config.RangeInt(min = 0, max = 12) - @Config.DefaultInt(0) + @Config.DefaultInt(12) public static int countCorrectionBits; } diff --git a/src/main/java/com/falsepattern/endlessids/constants/ExtendedConstants.java b/src/main/java/com/falsepattern/endlessids/constants/ExtendedConstants.java index 044f71a..ea241dd 100644 --- a/src/main/java/com/falsepattern/endlessids/constants/ExtendedConstants.java +++ b/src/main/java/com/falsepattern/endlessids/constants/ExtendedConstants.java @@ -34,10 +34,14 @@ public class ExtendedConstants { public static final int biomeIDMask = biomeIDCount - 1; public static final int biomeIDNull = biomeIDMask; public static final int bytesPerBiome = (bitsPerBiome + 7) / 8; - //Chunk - public static final int bytesPerChunk = bytesPerBiome * 256 + bytesPerEBS * 16; + //DataWatcher public static final int watchableCount = 1 << watchableBits; public static final int maxWatchableID = watchableCount - 1; public static final int watchableMask = (0x7 << watchableBits) | maxWatchableID; + + //Chunk + public static final int bytesPerChunk = + (GeneralConfig.extendBiome ? bytesPerBiome : VanillaConstants.bytesPerBiome) * 256 + + (GeneralConfig.extendBlockItem ? bytesPerEBS : VanillaConstants.bytesPerEBS) * 16; } diff --git a/src/main/java/com/falsepattern/endlessids/mixin/helpers/PotionIDHelper.java b/src/main/java/com/falsepattern/endlessids/mixin/helpers/PotionIDHelper.java deleted file mode 100644 index d8d6a58..0000000 --- a/src/main/java/com/falsepattern/endlessids/mixin/helpers/PotionIDHelper.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.falsepattern.endlessids.mixin.helpers; - -public class PotionIDHelper { - public static final ThreadLocal theID = new ThreadLocal<>(); -} diff --git a/src/main/java/com/falsepattern/endlessids/mixin/mixins/client/biome/vanilla/ChunkMixin.java b/src/main/java/com/falsepattern/endlessids/mixin/mixins/client/biome/vanilla/ChunkMixin.java new file mode 100644 index 0000000..a4339b7 --- /dev/null +++ b/src/main/java/com/falsepattern/endlessids/mixin/mixins/client/biome/vanilla/ChunkMixin.java @@ -0,0 +1,48 @@ +package com.falsepattern.endlessids.mixin.mixins.client.biome.vanilla; + +import com.falsepattern.endlessids.Hooks; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.Slice; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +import net.minecraft.world.chunk.Chunk; + +import java.util.Iterator; + +@Mixin(Chunk.class) +public abstract class ChunkMixin { + @SuppressWarnings("rawtypes") + @Inject(method = "fillChunk", + at = @At(value = "INVOKE", + target = "Ljava/lang/System;arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V", + ordinal = 0), + slice = @Slice(from = @At(value = "INVOKE", + target = "Lnet/minecraft/world/chunk/storage/ExtendedBlockStorage;clearMSBArray()V")), + locals = LocalCapture.CAPTURE_FAILHARD, + require = 1) + private void biomeData(byte[] p_76607_1_, int p_76607_2_, int p_76607_3_, boolean p_76607_4_, CallbackInfo ci, Iterator iterator, int k, boolean flag1, int l) { + Hooks.readBiomeArrayFromPacket((Chunk) (Object) this, p_76607_1_, k); + } + + @Redirect(method = "fillChunk", + at = @At(value = "INVOKE", + target = "Ljava/lang/System;arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V", + ordinal = 0), + slice = @Slice(from = @At(value = "INVOKE", + target = "Lnet/minecraft/world/chunk/storage/ExtendedBlockStorage;clearMSBArray()V")), + require = 1) + private void noCopyBiome(Object src, int srcPos, Object dest, int destPos, int length) {} + + @Redirect(method = "fillChunk", + at = @At(value = "FIELD", + target = "Lnet/minecraft/world/chunk/Chunk;blockBiomeArray:[B", + args = "array=length"), + require = 1) + private int noBiomeArrayLength(byte[] array) { + return 0; + } +} diff --git a/src/main/java/com/falsepattern/endlessids/mixin/mixins/client/blockitem/vanilla/ChunkMixin.java b/src/main/java/com/falsepattern/endlessids/mixin/mixins/client/blockitem/vanilla/ChunkMixin.java new file mode 100644 index 0000000..b37cfe1 --- /dev/null +++ b/src/main/java/com/falsepattern/endlessids/mixin/mixins/client/blockitem/vanilla/ChunkMixin.java @@ -0,0 +1,66 @@ +package com.falsepattern.endlessids.mixin.mixins.client.blockitem.vanilla; + +import com.falsepattern.endlessids.Hooks; +import com.falsepattern.endlessids.constants.ExtendedConstants; +import com.falsepattern.endlessids.mixin.helpers.IExtendedBlockStorageMixin; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.Slice; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.storage.ExtendedBlockStorage; + +import java.util.Iterator; + +@Mixin(Chunk.class) +public abstract class ChunkMixin { + @Shadow + private ExtendedBlockStorage[] storageArrays; + + //This is needed because the array is not a field, but a local, and local arraylength overriding does not exist + private static byte[] fakeArray; + + @Redirect(method = "fillChunk", + at = @At(value = "FIELD", + target = "Lnet/minecraft/world/chunk/Chunk;storageArrays:[Lnet/minecraft/world/chunk/storage/ExtendedBlockStorage;", + args = "array=length", + ordinal = 0), + slice = @Slice(from = @At(value = "INVOKE", + target = "Lnet/minecraft/world/chunk/storage/ExtendedBlockStorage;getSkylightArray()Lnet/minecraft/world/chunk/NibbleArray;")), + require = 1) + private int noMSBLoop(ExtendedBlockStorage[] array) { + return 0; + } + + @SuppressWarnings("rawtypes") + @Inject(method = "fillChunk", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/world/chunk/storage/ExtendedBlockStorage;getBlockLSBArray()[B"), + locals = LocalCapture.CAPTURE_FAILHARD, + require = 1) + private void blockData(byte[] p_76607_1_, int p_76607_2_, int p_76607_3_, boolean p_76607_4_, CallbackInfo ci, Iterator iterator, int k, boolean flag1, int l) { + Hooks.setBlockData((IExtendedBlockStorageMixin) this.storageArrays[l], p_76607_1_, k); + } + + @Redirect(method = "fillChunk", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/world/chunk/storage/ExtendedBlockStorage;getBlockLSBArray()[B"), + require = 1) + private byte[] fakeLSBArray(ExtendedBlockStorage instance) { + return fakeArray != null ? fakeArray : (fakeArray = new byte[16 * 16 * 16 * ExtendedConstants.bytesPerID]); + } + + @Redirect(method = "fillChunk", + at = @At(value = "INVOKE", + target = "Ljava/lang/System;arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V", + ordinal = 0), + slice = @Slice(from = @At(value = "INVOKE", + target = "Lnet/minecraft/world/chunk/storage/ExtendedBlockStorage;getBlockLSBArray()[B")), + require = 1) + private void noCopy(Object src, int srcPos, Object dest, int destPos, int length) {} +} diff --git a/src/main/java/com/falsepattern/endlessids/mixin/mixins/client/blockitem/vanilla/NetHandlerPlayClientMixin.java b/src/main/java/com/falsepattern/endlessids/mixin/mixins/client/blockitem/vanilla/NetHandlerPlayClientMixin.java new file mode 100644 index 0000000..e139ac2 --- /dev/null +++ b/src/main/java/com/falsepattern/endlessids/mixin/mixins/client/blockitem/vanilla/NetHandlerPlayClientMixin.java @@ -0,0 +1,50 @@ +package com.falsepattern.endlessids.mixin.mixins.client.blockitem.vanilla; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.block.Block; +import net.minecraft.client.multiplayer.WorldClient; +import net.minecraft.client.network.NetHandlerPlayClient; +import net.minecraft.network.play.server.S22PacketMultiBlockChange; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; + +@SideOnly(Side.CLIENT) +@Mixin(NetHandlerPlayClient.class) +public abstract class NetHandlerPlayClientMixin { + @Shadow + private WorldClient clientWorldController; + + /** + * @author FalsePattern + * @reason Ported code, TODO figure out a proper mixin for this (difficult) + */ + @Overwrite + public void handleMultiBlockChange(S22PacketMultiBlockChange packetIn) { + int chunkX = packetIn.func_148920_c().chunkXPos * 16; + int chunkZ = packetIn.func_148920_c().chunkZPos * 16; + if (packetIn.func_148921_d() != null) { + DataInputStream dataInput = new DataInputStream(new ByteArrayInputStream(packetIn.func_148921_d())); + + try { + for (int var5 = 0; var5 < packetIn.func_148922_e(); ++var5) { + short pos = dataInput.readShort(); + short idLSB = dataInput.readShort(); + byte idMSB = dataInput.readByte(); + int id = (idLSB & 0xFFFF) | ((idMSB & 0xFF) << 16); + int meta = dataInput.readByte() & 15; + int x = pos >> 12 & 15; + int z = pos >> 8 & 15; + int y = pos & 255; + this.clientWorldController.func_147492_c(x + chunkX, y, z + chunkZ, Block.getBlockById(id), meta); + } + } catch (IOException ignored) {} + } + } +} diff --git a/src/main/java/com/falsepattern/endlessids/mixin/mixins/client/potion/vanilla/NetHandlerPlayClientMixin.java b/src/main/java/com/falsepattern/endlessids/mixin/mixins/client/potion/vanilla/NetHandlerPlayClientMixin.java new file mode 100644 index 0000000..fb1f019 --- /dev/null +++ b/src/main/java/com/falsepattern/endlessids/mixin/mixins/client/potion/vanilla/NetHandlerPlayClientMixin.java @@ -0,0 +1,40 @@ +package com.falsepattern.endlessids.mixin.mixins.client.potion.vanilla; + +import com.falsepattern.endlessids.mixin.helpers.IS1DPacketEntityEffectMixin; +import lombok.val; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.client.network.NetHandlerPlayClient; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.network.play.server.S1DPacketEntityEffect; +import net.minecraft.potion.PotionEffect; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +@Mixin(NetHandlerPlayClient.class) +public abstract class NetHandlerPlayClientMixin { + private static int theID; + + @Inject(method = "handleEntityEffect", + at = @At("HEAD"), + require = 1) + private void grabID(S1DPacketEntityEffect packetIn, CallbackInfo ci) { + theID = ((IS1DPacketEntityEffectMixin)packetIn).getIDExtended(); + } + + @Redirect(method = "handleEntityEffect", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/entity/EntityLivingBase;addPotionEffect(Lnet/minecraft/potion/PotionEffect;)V"), + require = 1) + private void addPotionEffect(EntityLivingBase entity, PotionEffect effect) { + val newPotion = new PotionEffect(theID, effect.getDuration(), effect.getAmplifier()); + theID = 0; + newPotion.setPotionDurationMax(effect.getIsPotionDurationMax()); + entity.addPotionEffect(newPotion); + } +} diff --git a/src/main/java/com/falsepattern/endlessids/mixin/mixins/client/vanilla/ChunkMixin.java b/src/main/java/com/falsepattern/endlessids/mixin/mixins/client/vanilla/ChunkMixin.java deleted file mode 100644 index 684d65d..0000000 --- a/src/main/java/com/falsepattern/endlessids/mixin/mixins/client/vanilla/ChunkMixin.java +++ /dev/null @@ -1,147 +0,0 @@ -package com.falsepattern.endlessids.mixin.mixins.client.vanilla; - -import com.falsepattern.endlessids.Hooks; -import com.falsepattern.endlessids.constants.ExtendedConstants; -import com.falsepattern.endlessids.mixin.helpers.IExtendedBlockStorageMixin; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Shadow; - -import net.minecraft.block.Block; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.chunk.NibbleArray; -import net.minecraft.world.chunk.storage.ExtendedBlockStorage; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.Map; - -@SuppressWarnings({"rawtypes", "WhileLoopReplaceableByForEach", "unchecked"}) -@Mixin(Chunk.class) -public abstract class ChunkMixin { - @Shadow - public Map chunkTileEntityMap; - - @Shadow - public World worldObj; - @Shadow - public boolean isLightPopulated; - @Shadow - public boolean isTerrainPopulated; - @Shadow - private ExtendedBlockStorage[] storageArrays; - @Shadow - private byte[] blockBiomeArray; - - @Shadow - public abstract void generateHeightMap(); - - @Shadow - public abstract Block getBlock(int p_150810_1_, int p_150810_2_, int p_150810_3_); - - @Shadow - public abstract int getBlockMetadata(int p_76628_1_, int p_76628_2_, int p_76628_3_); - - /** - * @author FalsePattern - * @reason Direct port from dumped code - */ - @SideOnly(Side.CLIENT) - @Overwrite - public void fillChunk(byte[] var1, int var2, int var3, boolean var4) { - Iterator var5 = this.chunkTileEntityMap.values().iterator(); - - while (var5.hasNext()) { - TileEntity var6 = (TileEntity) var5.next(); - var6.updateContainingBlockInfo(); - var6.getBlockMetadata(); - var6.getBlockType(); - } - - int var16 = 0; - boolean var7 = !this.worldObj.provider.hasNoSky; - - int var8; - for (var8 = 0; var8 < this.storageArrays.length; ++var8) { - if ((var2 & 1 << var8) != 0) { - if (this.storageArrays[var8] == null) { - this.storageArrays[var8] = new ExtendedBlockStorage(var8 << 4, var7); - } - - Hooks.setBlockData((IExtendedBlockStorageMixin) this.storageArrays[var8], var1, var16); - var16 += 16 * 16 * 16 * ExtendedConstants.bytesPerID; - } else if (var4 && this.storageArrays[var8] != null) { - this.storageArrays[var8] = null; - } - } - - NibbleArray var9; - for (var8 = 0; var8 < this.storageArrays.length; ++var8) { - if ((var2 & 1 << var8) != 0 && this.storageArrays[var8] != null) { - var9 = this.storageArrays[var8].getMetadataArray(); - System.arraycopy(var1, var16, var9.data, 0, var9.data.length); - var16 += var9.data.length; - } - } - - for (var8 = 0; var8 < this.storageArrays.length; ++var8) { - if ((var2 & 1 << var8) != 0 && this.storageArrays[var8] != null) { - var9 = this.storageArrays[var8].getBlocklightArray(); - System.arraycopy(var1, var16, var9.data, 0, var9.data.length); - var16 += var9.data.length; - } - } - - if (var7) { - for (var8 = 0; var8 < this.storageArrays.length; ++var8) { - if ((var2 & 1 << var8) != 0 && this.storageArrays[var8] != null) { - var9 = this.storageArrays[var8].getSkylightArray(); - System.arraycopy(var1, var16, var9.data, 0, var9.data.length); - var16 += var9.data.length; - } - } - } - - if (var4) { - var16 += Hooks.readBiomeArrayFromPacket((Chunk) (Object) this, var1, var16); - } - - for (var8 = 0; var8 < this.storageArrays.length; ++var8) { - if (this.storageArrays[var8] != null && (var2 & 1 << var8) != 0) { - this.storageArrays[var8].removeInvalidBlocks(); - } - } - - this.isLightPopulated = true; - this.isTerrainPopulated = true; - this.generateHeightMap(); - ArrayList var10 = new ArrayList(); - - TileEntity var11; - for (var5 = this.chunkTileEntityMap.values().iterator(); var5.hasNext(); var11.updateContainingBlockInfo()) { - var11 = (TileEntity) var5.next(); - int var12 = var11.xCoord & 15; - int var13 = var11.yCoord; - int var14 = var11.zCoord & 15; - Block var15 = var11.getBlockType(); - if ((var15 != this.getBlock(var12, var13, var14) || - var11.blockMetadata != this.getBlockMetadata(var12, var13, var14)) && - var11.shouldRefresh(var15, this.getBlock(var12, var13, var14), var11.blockMetadata, - this.getBlockMetadata(var12, var13, var14), this.worldObj, var12, var13, var14)) { - var10.add(var11); - } - } - - Iterator var17 = var10.iterator(); - - while (var17.hasNext()) { - TileEntity var18 = (TileEntity) var17.next(); - var18.invalidate(); - } - - } -} diff --git a/src/main/java/com/falsepattern/endlessids/mixin/mixins/client/vanilla/NetHandlerPlayClientMixin.java b/src/main/java/com/falsepattern/endlessids/mixin/mixins/client/vanilla/NetHandlerPlayClientMixin.java deleted file mode 100644 index 31698bc..0000000 --- a/src/main/java/com/falsepattern/endlessids/mixin/mixins/client/vanilla/NetHandlerPlayClientMixin.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.falsepattern.endlessids.mixin.mixins.client.vanilla; - -import com.falsepattern.endlessids.mixin.helpers.IS1DPacketEntityEffectMixin; -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import lombok.val; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.minecraft.block.Block; -import net.minecraft.client.multiplayer.WorldClient; -import net.minecraft.client.network.NetHandlerPlayClient; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.network.play.server.S1DPacketEntityEffect; -import net.minecraft.network.play.server.S22PacketMultiBlockChange; -import net.minecraft.potion.PotionEffect; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -import java.io.ByteArrayInputStream; -import java.io.DataInputStream; -import java.io.IOException; - -import static com.falsepattern.endlessids.mixin.helpers.PotionIDHelper.theID; - -@SideOnly(Side.CLIENT) -@Mixin(NetHandlerPlayClient.class) -public abstract class NetHandlerPlayClientMixin { - @Shadow - private WorldClient clientWorldController; - - /** - * @author FalsePattern - * @reason Direct port from dumped code - */ - @Overwrite - public void handleMultiBlockChange(S22PacketMultiBlockChange packetIn) throws IOException { - int var2 = packetIn.func_148920_c().chunkXPos * 16; - int var3 = packetIn.func_148920_c().chunkZPos * 16; - if (packetIn.func_148921_d() != null) { - DataInputStream dataInput = new DataInputStream(new ByteArrayInputStream(packetIn.func_148921_d())); - - for (int var5 = 0; var5 < packetIn.func_148922_e(); ++var5) { - short var6 = dataInput.readShort(); - short idLSB = dataInput.readShort(); - byte idMSB = dataInput.readByte(); - int id = (idLSB & 0xFFFF) | ((idMSB & 0xFF) << 16); - int var9 = dataInput.readByte() & 15; - int var10 = var6 >> 12 & 15; - int var11 = var6 >> 8 & 15; - int var12 = var6 & 255; - this.clientWorldController.func_147492_c(var10 + var2, var12, var11 + var3, Block.getBlockById(id), - var9); - } - } - } - - //POTIONS - @Inject(method = "handleEntityEffect", - at = @At("HEAD"), - require = 1) - private void grabID(S1DPacketEntityEffect packetIn, CallbackInfo ci) { - theID.set(((IS1DPacketEntityEffectMixin)packetIn).getIDExtended()); - } - - @WrapOperation(method = "handleEntityEffect", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/entity/EntityLivingBase;addPotionEffect(Lnet/minecraft/potion/PotionEffect;)V"), - require = 1) - private void addPotionEffect(EntityLivingBase entity, PotionEffect effect, Operation op) { - val newPotion = new PotionEffect(theID.get(), effect.getDuration(), effect.getAmplifier()); - newPotion.setPotionDurationMax(effect.getIsPotionDurationMax()); - op.call(entity, newPotion); - } -} diff --git a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/biome/vanilla/AnvilChunkLoaderMixin.java b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/biome/vanilla/AnvilChunkLoaderMixin.java new file mode 100644 index 0000000..c2196bc --- /dev/null +++ b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/biome/vanilla/AnvilChunkLoaderMixin.java @@ -0,0 +1,65 @@ +package com.falsepattern.endlessids.mixin.mixins.common.biome.vanilla; + +import com.falsepattern.endlessids.Hooks; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.Slice; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.storage.AnvilChunkLoader; + +@Mixin(AnvilChunkLoader.class) +public abstract class AnvilChunkLoaderMixin { + + //TODO not thread safe + private Chunk chunk; + + private NBTTagCompound nbt; + + @Redirect(method = "writeChunkToNBT", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/world/chunk/Chunk;getBiomeArray()[B"), + require = 1) + private byte[] grabChunkBiomeDataWrite(Chunk instance) { + chunk = instance; + return null; + } + + @Redirect(method = "writeChunkToNBT", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/nbt/NBTTagCompound;setByteArray(Ljava/lang/String;[B)V"), + slice = @Slice(from = @At(value = "CONSTANT", + args = "stringValue=Sections"), + to = @At(value = "FIELD", + target = "Lnet/minecraft/world/chunk/Chunk;hasEntities:Z", + ordinal = 0)), + require = 1) + private void redirectBiomeDataWrite(NBTTagCompound instance, String p_74773_1_, byte[] p_74773_2_) { + Hooks.writeChunkBiomeArrayToNbt(chunk, instance); + chunk = null; + } + + @Redirect(method = "readChunkFromNBT", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/nbt/NBTTagCompound;hasKey(Ljava/lang/String;I)Z", + ordinal = 0), + slice = @Slice(from = @At(value = "CONSTANT", + args = "stringValue=Biomes", + ordinal = 0)), + require = 1) + private boolean grabBiomeNBTRead(NBTTagCompound instance, String p_150297_1_, int p_150297_2_) { + nbt = instance; + return true; + } + + @Redirect(method = "readChunkFromNBT", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/world/chunk/Chunk;setBiomeArray([B)V"), + require = 1) + private void redirectBiomeDataRead(Chunk instance, byte[] p_76616_1_) { + Hooks.readChunkBiomeArrayFromNbt(instance, nbt); + nbt = null; + } +} diff --git a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/biome/vanilla/S21PacketChunkDataMixin.java b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/biome/vanilla/S21PacketChunkDataMixin.java new file mode 100644 index 0000000..5e71a68 --- /dev/null +++ b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/biome/vanilla/S21PacketChunkDataMixin.java @@ -0,0 +1,21 @@ +package com.falsepattern.endlessids.mixin.mixins.common.biome.vanilla; + +import com.falsepattern.endlessids.Hooks; +import com.falsepattern.endlessids.mixin.helpers.IChunkMixin; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import net.minecraft.network.play.server.S21PacketChunkData; +import net.minecraft.world.chunk.Chunk; + +@Mixin(S21PacketChunkData.class) +public abstract class S21PacketChunkDataMixin { + @Redirect(method = "func_149269_a", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/world/chunk/Chunk;getBiomeArray()[B"), + require = 1) + private static byte[] getBiomesArrayShort(Chunk instance) { + return Hooks.shortToByteArray(((IChunkMixin) instance).getBiomeShortArray()); + } +} diff --git a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/biome/vanilla/S26PacketMapChunkBulkMixin.java b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/biome/vanilla/S26PacketMapChunkBulkMixin.java new file mode 100644 index 0000000..5f0d259 --- /dev/null +++ b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/biome/vanilla/S26PacketMapChunkBulkMixin.java @@ -0,0 +1,20 @@ +package com.falsepattern.endlessids.mixin.mixins.common.biome.vanilla; + +import com.falsepattern.endlessids.constants.ExtendedConstants; +import com.falsepattern.endlessids.constants.VanillaConstants; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.Constant; +import org.spongepowered.asm.mixin.injection.ModifyConstant; + +import net.minecraft.network.play.server.S26PacketMapChunkBulk; + +@Mixin(S26PacketMapChunkBulk.class) +public abstract class S26PacketMapChunkBulkMixin { + + @ModifyConstant(method = "readPacketData", + constant = @Constant(intValue = VanillaConstants.bytesPerBiome * 16 * 16), + require = 1) + private int extend2(int contant) { + return ExtendedConstants.bytesPerBiome * 16 * 16; + } +} diff --git a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/blockitem/vanilla/AnvilChunkLoaderMixin.java b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/blockitem/vanilla/AnvilChunkLoaderMixin.java new file mode 100644 index 0000000..2e89afc --- /dev/null +++ b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/blockitem/vanilla/AnvilChunkLoaderMixin.java @@ -0,0 +1,89 @@ +package com.falsepattern.endlessids.mixin.mixins.common.blockitem.vanilla; + +import com.falsepattern.endlessids.Hooks; +import com.falsepattern.endlessids.mixin.helpers.IExtendedBlockStorageMixin; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.Slice; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.world.World; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.NibbleArray; +import net.minecraft.world.chunk.storage.AnvilChunkLoader; +import net.minecraft.world.chunk.storage.ExtendedBlockStorage; + +@Mixin(AnvilChunkLoader.class) +public abstract class AnvilChunkLoaderMixin { + + //TODO not thread safe + private IExtendedBlockStorageMixin ebs; + + private NBTTagCompound nbt; + + @Redirect(method = "writeChunkToNBT", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/world/chunk/storage/ExtendedBlockStorage;getBlockLSBArray()[B"), + require = 1) + private byte[] grabEBSBlockDataWrite(ExtendedBlockStorage instance) { + ebs = (IExtendedBlockStorageMixin) instance; + return null; + } + + @Redirect(method = "writeChunkToNBT", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/nbt/NBTTagCompound;setByteArray(Ljava/lang/String;[B)V"), + slice = @Slice(from = @At(value = "INVOKE", + target = "Lnet/minecraft/world/chunk/storage/ExtendedBlockStorage;getYLocation()I"), + to = @At(value = "INVOKE", + target = "Lnet/minecraft/world/chunk/storage/ExtendedBlockStorage;getBlockMSBArray()Lnet/minecraft/world/chunk/NibbleArray;")), + require = 1) + private void redirectBlockDataWrite(NBTTagCompound instance, String p_74773_1_, byte[] p_74773_2_) { + Hooks.writeChunkToNbt(instance, ebs); + ebs = null; + } + + @Redirect(method = "writeChunkToNBT", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/world/chunk/storage/ExtendedBlockStorage;getBlockMSBArray()Lnet/minecraft/world/chunk/NibbleArray;"), + require = 1) + private NibbleArray suppressVanillaBlockDataWrite(ExtendedBlockStorage instance) { + return null; + } + + @Redirect(method = "readChunkFromNBT", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/nbt/NBTTagCompound;getByteArray(Ljava/lang/String;)[B", + ordinal = 0), + slice = @Slice(from = @At(value = "CONSTANT", + args = "stringValue=Blocks")), + require = 1) + private byte[] grabNBTBlockDataRead(NBTTagCompound instance, String p_74770_1_) { + nbt = instance; + return null; + } + + @Redirect(method = "readChunkFromNBT", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/world/chunk/storage/ExtendedBlockStorage;setBlockLSBArray([B)V"), + require = 1) + private void redirectBlockDataRead(ExtendedBlockStorage instance, byte[] p_76664_1_) { + Hooks.readChunkFromNbt((IExtendedBlockStorageMixin) instance, nbt); + nbt = null; + } + + @Redirect(method = "readChunkFromNBT", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/nbt/NBTTagCompound;hasKey(Ljava/lang/String;I)Z", + ordinal = 0), + slice = @Slice(from = @At(value = "CONSTANT", + args = "stringValue=Add", + ordinal = 0)), + require = 1) + private boolean suppressVanillaBlockDataRead(NBTTagCompound instance, String p_150297_1_, int p_150297_2_) { + return false; + } +} diff --git a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/networking/S21PacketChunkDataMixin.java b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/blockitem/vanilla/S21PacketChunkDataMixin.java similarity index 62% rename from src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/networking/S21PacketChunkDataMixin.java rename to src/main/java/com/falsepattern/endlessids/mixin/mixins/common/blockitem/vanilla/S21PacketChunkDataMixin.java index 538a21f..b685e91 100644 --- a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/networking/S21PacketChunkDataMixin.java +++ b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/blockitem/vanilla/S21PacketChunkDataMixin.java @@ -1,9 +1,8 @@ -package com.falsepattern.endlessids.mixin.mixins.common.vanilla.networking; +package com.falsepattern.endlessids.mixin.mixins.common.blockitem.vanilla; import com.falsepattern.endlessids.Hooks; import com.falsepattern.endlessids.constants.ExtendedConstants; import com.falsepattern.endlessids.constants.VanillaConstants; -import com.falsepattern.endlessids.mixin.helpers.IChunkMixin; import com.falsepattern.endlessids.mixin.helpers.IExtendedBlockStorageMixin; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -12,19 +11,10 @@ import org.spongepowered.asm.mixin.injection.ModifyConstant; import org.spongepowered.asm.mixin.injection.Redirect; import net.minecraft.network.play.server.S21PacketChunkData; -import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.storage.ExtendedBlockStorage; @Mixin(S21PacketChunkData.class) public abstract class S21PacketChunkDataMixin { - - @ModifyConstant(method = {"", "func_149275_c"}, - constant = @Constant(intValue = VanillaConstants.bytesPerChunk), - require = 1) - private static int increasePacketSize(int constant) { - return ExtendedConstants.bytesPerChunk; - } - @Redirect(method = "func_149269_a", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/chunk/storage/ExtendedBlockStorage;getBlockLSBArray()[B"), @@ -33,14 +23,6 @@ public abstract class S21PacketChunkDataMixin { return Hooks.getBlockData((IExtendedBlockStorageMixin) instance); } - @Redirect(method = "func_149269_a", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/world/chunk/Chunk;getBiomeArray()[B"), - require = 1) - private static byte[] getBiomesArrayShort(Chunk instance) { - return Hooks.shortToByteArray(((IChunkMixin) instance).getBiomeShortArray()); - } - @ModifyConstant(method = "readPacketData", constant = @Constant(intValue = VanillaConstants.bytesPerEBS), require = 1) diff --git a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/networking/S26PacketMapChunkBulkMixin.java b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/blockitem/vanilla/S26PacketMapChunkBulkMixin.java similarity index 67% rename from src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/networking/S26PacketMapChunkBulkMixin.java rename to src/main/java/com/falsepattern/endlessids/mixin/mixins/common/blockitem/vanilla/S26PacketMapChunkBulkMixin.java index 0273cf2..2789728 100644 --- a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/networking/S26PacketMapChunkBulkMixin.java +++ b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/blockitem/vanilla/S26PacketMapChunkBulkMixin.java @@ -1,4 +1,4 @@ -package com.falsepattern.endlessids.mixin.mixins.common.vanilla.networking; +package com.falsepattern.endlessids.mixin.mixins.common.blockitem.vanilla; import com.falsepattern.endlessids.constants.ExtendedConstants; import com.falsepattern.endlessids.constants.VanillaConstants; @@ -16,11 +16,4 @@ public abstract class S26PacketMapChunkBulkMixin { private int extend1(int constant) { return ExtendedConstants.bytesPerIDPlusMetadata * 16 * 16 * 16; } - - @ModifyConstant(method = "readPacketData", - constant = @Constant(intValue = VanillaConstants.bytesPerBiome * 16 * 16), - require = 1) - private int extend2(int contant) { - return ExtendedConstants.bytesPerBiome * 16 * 16; - } } diff --git a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/S21PacketChunkDataMixin.java b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/S21PacketChunkDataMixin.java new file mode 100644 index 0000000..8c95d76 --- /dev/null +++ b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/S21PacketChunkDataMixin.java @@ -0,0 +1,26 @@ +package com.falsepattern.endlessids.mixin.mixins.common.vanilla; + +import com.falsepattern.endlessids.Hooks; +import com.falsepattern.endlessids.constants.ExtendedConstants; +import com.falsepattern.endlessids.constants.VanillaConstants; +import com.falsepattern.endlessids.mixin.helpers.IChunkMixin; +import com.falsepattern.endlessids.mixin.helpers.IExtendedBlockStorageMixin; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Constant; +import org.spongepowered.asm.mixin.injection.ModifyConstant; +import org.spongepowered.asm.mixin.injection.Redirect; + +import net.minecraft.network.play.server.S21PacketChunkData; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.storage.ExtendedBlockStorage; + +@Mixin(S21PacketChunkData.class) +public abstract class S21PacketChunkDataMixin { + @ModifyConstant(method = {"", "func_149275_c"}, + constant = @Constant(intValue = VanillaConstants.bytesPerChunk), + require = 1) + private static int increasePacketSize(int constant) { + return ExtendedConstants.bytesPerChunk; + } +} diff --git a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/storage/AnvilChunkLoaderMixin.java b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/storage/AnvilChunkLoaderMixin.java deleted file mode 100644 index b69f481..0000000 --- a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/storage/AnvilChunkLoaderMixin.java +++ /dev/null @@ -1,157 +0,0 @@ -package com.falsepattern.endlessids.mixin.mixins.common.vanilla.storage; - -import com.falsepattern.endlessids.Hooks; -import com.falsepattern.endlessids.mixin.helpers.IExtendedBlockStorageMixin; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; - -import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.NextTickListEntry; -import net.minecraft.world.World; -import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.chunk.NibbleArray; -import net.minecraft.world.chunk.storage.AnvilChunkLoader; -import net.minecraft.world.chunk.storage.ExtendedBlockStorage; - -import java.util.Iterator; -import java.util.List; - -@Mixin(AnvilChunkLoader.class) -public abstract class AnvilChunkLoaderMixin { - - /** - * @author FalsePattern - * @reason Direct port from dumped code - */ - @Overwrite - private void writeChunkToNBT(Chunk p_75820_1_, World p_75820_2_, NBTTagCompound p_75820_3_) { - p_75820_3_.setByte("V", (byte) 1); - p_75820_3_.setInteger("xPos", p_75820_1_.xPosition); - p_75820_3_.setInteger("zPos", p_75820_1_.zPosition); - p_75820_3_.setLong("LastUpdate", p_75820_2_.getTotalWorldTime()); - p_75820_3_.setIntArray("HeightMap", p_75820_1_.heightMap); - p_75820_3_.setBoolean("TerrainPopulated", p_75820_1_.isTerrainPopulated); - p_75820_3_.setBoolean("LightPopulated", p_75820_1_.isLightPopulated); - p_75820_3_.setLong("InhabitedTime", p_75820_1_.inhabitedTime); - ExtendedBlockStorage[] var4 = p_75820_1_.getBlockStorageArray(); - NBTTagList var5 = new NBTTagList(); - boolean var6 = !p_75820_2_.provider.hasNoSky; - ExtendedBlockStorage[] var7 = var4; - int var8 = var4.length; - - NBTTagCompound var11; - for (int var9 = 0; var9 < var8; ++var9) { - ExtendedBlockStorage var10 = var7[var9]; - if (var10 != null) { - var11 = new NBTTagCompound(); - var11.setByte("Y", (byte) (var10.getYLocation() >> 4 & 255)); - Hooks.writeChunkToNbt(var11, (IExtendedBlockStorageMixin) var10); - - var11.setByteArray("Data", var10.getMetadataArray().data); - var11.setByteArray("BlockLight", var10.getBlocklightArray().data); - if (var6) { - var11.setByteArray("SkyLight", var10.getSkylightArray().data); - } else { - var11.setByteArray("SkyLight", new byte[var10.getBlocklightArray().data.length]); - } - - var5.appendTag(var11); - } - } - - p_75820_3_.setTag("Sections", var5); - Hooks.writeChunkBiomeArrayToNbt(p_75820_1_, p_75820_3_); - p_75820_1_.hasEntities = false; - NBTTagList var21 = new NBTTagList(); - - Iterator var22; - for (var8 = 0; var8 < p_75820_1_.entityLists.length; ++var8) { - var22 = p_75820_1_.entityLists[var8].iterator(); - - while (var22.hasNext()) { - Entity var12 = (Entity) var22.next(); - var11 = new NBTTagCompound(); - if (var12.writeToNBTOptional(var11)) { - p_75820_1_.hasEntities = true; - var21.appendTag(var11); - } - } - } - - p_75820_3_.setTag("Entities", var21); - NBTTagList var23 = new NBTTagList(); - var22 = p_75820_1_.chunkTileEntityMap.values().iterator(); - - while (var22.hasNext()) { - TileEntity var13 = (TileEntity) var22.next(); - var11 = new NBTTagCompound(); - var13.writeToNBT(var11); - var23.appendTag(var11); - } - - p_75820_3_.setTag("TileEntities", var23); - List var24 = p_75820_2_.getPendingBlockUpdates(p_75820_1_, false); - if (var24 != null) { - long var15 = p_75820_2_.getTotalWorldTime(); - NBTTagList var17 = new NBTTagList(); - Iterator var18 = var24.iterator(); - - while (var18.hasNext()) { - NextTickListEntry var19 = (NextTickListEntry) var18.next(); - NBTTagCompound var20 = new NBTTagCompound(); - var20.setInteger("i", Block.getIdFromBlock(var19.func_151351_a())); - var20.setInteger("x", var19.xCoord); - var20.setInteger("y", var19.yCoord); - var20.setInteger("z", var19.zCoord); - var20.setInteger("t", (int) (var19.scheduledTime - var15)); - var20.setInteger("p", var19.priority); - var17.appendTag(var20); - } - - p_75820_3_.setTag("TileTicks", var17); - } - - } - - /** - * @author FalsePattern - * @reason Direct port from dumped code - */ - @Overwrite - private Chunk readChunkFromNBT(World p_75823_1_, NBTTagCompound p_75823_2_) { - int var3 = p_75823_2_.getInteger("xPos"); - int var4 = p_75823_2_.getInteger("zPos"); - Chunk var5 = new Chunk(p_75823_1_, var3, var4); - var5.heightMap = p_75823_2_.getIntArray("HeightMap"); - var5.isTerrainPopulated = p_75823_2_.getBoolean("TerrainPopulated"); - var5.isLightPopulated = p_75823_2_.getBoolean("LightPopulated"); - var5.inhabitedTime = p_75823_2_.getLong("InhabitedTime"); - NBTTagList var6 = p_75823_2_.getTagList("Sections", 10); - byte var7 = 16; - ExtendedBlockStorage[] var8 = new ExtendedBlockStorage[var7]; - boolean var9 = !p_75823_1_.provider.hasNoSky; - - for (int var10 = 0; var10 < var6.tagCount(); ++var10) { - NBTTagCompound var11 = var6.getCompoundTagAt(var10); - byte var12 = var11.getByte("Y"); - ExtendedBlockStorage var13 = new ExtendedBlockStorage(var12 << 4, var9); - Hooks.readChunkFromNbt((IExtendedBlockStorageMixin) var13, var11); - var13.setBlockMetadataArray(new NibbleArray(var11.getByteArray("Data"), 4)); - var13.setBlocklightArray(new NibbleArray(var11.getByteArray("BlockLight"), 4)); - if (var9) { - var13.setSkylightArray(new NibbleArray(var11.getByteArray("SkyLight"), 4)); - } - - var13.removeInvalidBlocks(); - var8[var12] = var13; - } - - var5.setStorageArrays(var8); - Hooks.readChunkBiomeArrayFromNbt(var5, p_75823_2_); - return var5; - } -} diff --git a/src/main/java/com/falsepattern/endlessids/mixin/plugin/Mixin.java b/src/main/java/com/falsepattern/endlessids/mixin/plugin/Mixin.java index 06aaeb1..2207638 100644 --- a/src/main/java/com/falsepattern/endlessids/mixin/plugin/Mixin.java +++ b/src/main/java/com/falsepattern/endlessids/mixin/plugin/Mixin.java @@ -18,10 +18,9 @@ import static com.falsepattern.lib.mixin.IMixin.PredicateHelpers.require; public enum Mixin implements IMixin { //region common //region vanilla - AnvilChunkLoaderMixin(Side.COMMON, always(), "vanilla.storage.AnvilChunkLoaderMixin"), - S21PacketChunkDataMixin(Side.COMMON, always(), "vanilla.networking.S21PacketChunkDataMixin"), - S26PacketMapChunkBulkMixin(Side.COMMON, always(), "vanilla.networking.S26PacketMapChunkBulkMixin"), + S21PacketChunkDataMixin(Side.COMMON, always(), "vanilla.S21PacketChunkDataMixin"), //endregion vanilla + //region AntiIDConflict AIDCAntiIdConflictBaseMixin(Side.COMMON, require(TargetedMod.ANTIIDCONFLICT), "antiidconflict.AntiIdConflictBaseMixin"), @@ -35,13 +34,17 @@ public enum Mixin implements IMixin { AIDCEntitiesManagerMixin(Side.COMMON, require(TargetedMod.ANTIIDCONFLICT), "antiidconflict.EntitiesManagerMixin"), AIDCPotionsManagerMixin(Side.COMMON, require(TargetedMod.ANTIIDCONFLICT), "antiidconflict.PotionsManagerMixin"), //endregion AntiIDConflict + //region biome //region vanilla + AnvilChunkLoaderMixinBiome(Side.COMMON, always(), "biome.vanilla.AnvilChunkLoaderMixin"), BiomeDictionaryMixin(Side.COMMON, always(), "biome.vanilla.BiomeDictionaryMixin"), BiomeGenBaseMixin(Side.COMMON, always(), "biome.vanilla.BiomeGenBaseMixin"), ChunkMixin(Side.COMMON, always(), "biome.vanilla.ChunkMixin"), GenLayerRiverMixMixin(Side.COMMON, avoid(TargetedMod.DRAGONAPI), "biome.vanilla.GenLayerRiverMixMixin"), GenLayerVoronoiZoomMixin(Side.COMMON, always(), "biome.vanilla.GenLayerVoronoiZoomMixin"), + S21PacketChunkDataMixinBiome(Side.COMMON, always(), "biome.vanilla.S21PacketChunkDataMixin"), + S26PacketMapChunkBulkMixinBiome(Side.COMMON, always(), "biome.vanilla.S26PacketMapChunkBulkMixin"), //endregion vanilla //region AbyssalCraft AbyssalCraftMixin(Side.COMMON, require(TargetedMod.ABYSSALCRAFT), "biome.abyssalcraft.AbyssalCraftMixin"), @@ -170,15 +173,19 @@ public enum Mixin implements IMixin { //endregion Witchery //endregion biome + //region blockitem //region vanilla + AnvilChunkLoaderMixinBlockItem(Side.COMMON, always(), "blockitem.vanilla.AnvilChunkLoaderMixin"), BlockFireMixin(Side.COMMON, always(), "blockitem.vanilla.BlockFireMixin"), ExtendedBlockStorageMixin(Side.COMMON, always(), "blockitem.vanilla.ExtendedBlockStorageMixin"), ItemInWorldManagerMixin(Side.COMMON, always(), "blockitem.vanilla.ItemInWorldManagerMixin"), ItemStackMixin(Side.COMMON, always(), "blockitem.vanilla.ItemStackMixin"), PacketBufferMixin(Side.COMMON, always(), "blockitem.vanilla.PacketBufferMixin"), + S21PacketChunkDataMixinBlockItem(Side.COMMON, always(), "blockitem.vanilla.S21PacketChunkDataMixin"), S22PacketMultiBlockChangeMixin(Side.COMMON, always(), "blockitem.vanilla.S22PacketMultiBlockChangeMixin"), S24PacketBlockActionMixin(Side.COMMON, always(), "blockitem.vanilla.S24PacketBlockActionMixin"), + S26PacketMapChunkBulkMixinBlockItem(Side.COMMON, always(), "blockitem.vanilla.S26PacketMapChunkBulkMixin"), StatListMixin(Side.COMMON, always(), "blockitem.vanilla.StatListMixin"), WorldMixin(Side.COMMON, always(), "blockitem.vanilla.WorldMixin"), //endregion vanilla @@ -200,6 +207,7 @@ public enum Mixin implements IMixin { UBCBiomeUndergroundDecoratorMixin(Side.COMMON, require(TargetedMod.UBC), "blockitem.ubc.BiomeUndergroundDecoratorMixin"), //endregion UBC //endregion blockitem + //region datawatcher //region vanilla DataWatcherMixin(Side.COMMON, condition(() -> GeneralConfig.extendDataWatcher), "datawatcher.vanilla.DataWatcherMixin"), @@ -209,11 +217,13 @@ public enum Mixin implements IMixin { "datawatcher.mfqm.MFQMDataWatcherMixin"), //endregion MFQM //endregion datawatcher + //region enchantment //region vanilla EnchantmentMixin(Side.COMMON, always(), "enchantment.vanilla.EnchantmentMixin"), //endregion vanilla //endregion enchantment + //region potion //region vanilla PotionEffectMixin(Side.COMMON, always(), "potion.vanilla.PotionEffectMixin"), @@ -222,23 +232,33 @@ public enum Mixin implements IMixin { S1EPacketRemoveEntityEffectMixin(Side.COMMON, always(), "potion.vanilla.network.S1EPacketRemoveEntityEffectMixin"), //endregion vanilla //endregion potion + //endregion common //region client - //region vanilla - ChunkMixinClient(Side.CLIENT, always(), "vanilla.ChunkMixin"), - NetHandlerPlayClientMixin(Side.CLIENT, always(), "vanilla.NetHandlerPlayClientMixin"), - //endregion vanilla //region biome + //region vanilla + ChunkMixinClientBiome(Side.CLIENT, always(), "biome.vanilla.ChunkMixin"), + //endregion vanilla //region Biome Wand BiomeWandItemClientMixin(Side.CLIENT, require(TargetedMod.BIOMEWAND), "biome.biomewand.BiomeWandItemMixin"), //endregion Biome Wand //endregion biome + //region blockitem + //region vanilla + ChunkMixinClientBlockItem(Side.CLIENT, always(), "blockitem.vanilla.ChunkMixin"), + NetHandlerPlayClientMixinBlockItem(Side.CLIENT, always(), "blockitem.vanilla.NetHandlerPlayClientMixin"), PlayerControllerMPMixin(Side.CLIENT, always(), "blockitem.vanilla.PlayerControllerMPMixin"), RenderGlobalMixin(Side.CLIENT, always(), "blockitem.vanilla.RenderGlobalMixin"), + //endregion vanilla //endregion blockitem + + //region potion + NetHandlerPlayClientMixinPotion(Side.CLIENT, always(), "potion.vanilla.NetHandlerPlayClientMixin"), + //endregion potion + //endregion client ;