From de5fa2d322b8d5e79ff38e5586891b6249f1d3b7 Mon Sep 17 00:00:00 2001 From: FalsePattern <30945458+FalsePattern@users.noreply.github.com> Date: Thu, 30 Mar 2023 22:46:57 +0200 Subject: [PATCH] migrate some spaghetti code to ChunkAPI replaced netcode/saving logic for blocks, metadata, and biomes --- README.MD | 1 + dependencies.gradle | 2 + repositories.gradle | 1 + .../falsepattern/endlessids/EndlessIDs.java | 19 ++ .../com/falsepattern/endlessids/Hooks.java | 214 +----------------- .../endlessids/managers/BiomeManager.java | 75 ++++++ .../endlessids/managers/BlockIDManager.java | 161 +++++++++++++ .../endlessids/managers/BlockMetaManager.java | 134 +++++++++++ .../client/biome/vanilla/ChunkMixin.java | 49 ---- .../client/blockitem/vanilla/ChunkMixin.java | 141 ------------ .../biome/vanilla/AnvilChunkLoaderMixin.java | 65 ------ .../vanilla/S21PacketChunkDataMixin.java | 21 -- .../vanilla/AnvilChunkLoaderMixin.java | 138 ----------- .../vanilla/S21PacketChunkDataMixin.java | 120 ---------- .../vanilla/S21PacketChunkDataMixin.java | 121 ---------- .../vanilla/S26PacketMapChunkBulkMixin.java | 97 -------- .../endlessids/mixin/plugin/Mixin.java | 13 -- 17 files changed, 394 insertions(+), 978 deletions(-) create mode 100644 src/main/java/com/falsepattern/endlessids/managers/BiomeManager.java create mode 100644 src/main/java/com/falsepattern/endlessids/managers/BlockIDManager.java create mode 100644 src/main/java/com/falsepattern/endlessids/managers/BlockMetaManager.java delete mode 100644 src/main/java/com/falsepattern/endlessids/mixin/mixins/client/biome/vanilla/ChunkMixin.java delete mode 100644 src/main/java/com/falsepattern/endlessids/mixin/mixins/client/blockitem/vanilla/ChunkMixin.java delete mode 100644 src/main/java/com/falsepattern/endlessids/mixin/mixins/common/biome/vanilla/AnvilChunkLoaderMixin.java delete mode 100644 src/main/java/com/falsepattern/endlessids/mixin/mixins/common/biome/vanilla/S21PacketChunkDataMixin.java delete mode 100644 src/main/java/com/falsepattern/endlessids/mixin/mixins/common/blockitem/vanilla/AnvilChunkLoaderMixin.java delete mode 100644 src/main/java/com/falsepattern/endlessids/mixin/mixins/common/blockitem/vanilla/S21PacketChunkDataMixin.java delete mode 100644 src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/S21PacketChunkDataMixin.java delete mode 100644 src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/S26PacketMapChunkBulkMixin.java diff --git a/README.MD b/README.MD index 5a02004..3a24c4d 100644 --- a/README.MD +++ b/README.MD @@ -72,3 +72,4 @@ If you find any crashes or incompatibilities, don't hesitate to open an issue. ## Dependencies - [FalsePatternLib](https://github.com/FalsePattern/FalsePatternLib) - [GasStation](https://github.com/FalsePattern/GasStation) +- [ChunkAPI](https://github.com/FalsePattern/ChunkAPI) (since 1.5-alpha0006. Incompatible with ChunkAPI in previous versions.) diff --git a/dependencies.gradle b/dependencies.gradle index ba4ef4f..ea2e13d 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -23,6 +23,8 @@ dependencies { compile("com.falsepattern:falsepatternlib-mc1.7.10:0.10.15:dev") + compile("com.falsepattern:chunkapi-mc1.7.10:446ee60:dev") + ////////////////Patched mods//////////////// //AbyssalCraft 1.9.1.3-FINAL diff --git a/repositories.gradle b/repositories.gradle index 4845be7..9528657 100644 --- a/repositories.gradle +++ b/repositories.gradle @@ -16,4 +16,5 @@ repositories { name = "jitpack" url = "https://mvn.falsepattern.com/jitpack/" } + mavenLocal() } diff --git a/src/main/java/com/falsepattern/endlessids/EndlessIDs.java b/src/main/java/com/falsepattern/endlessids/EndlessIDs.java index 1499d5d..23e7083 100644 --- a/src/main/java/com/falsepattern/endlessids/EndlessIDs.java +++ b/src/main/java/com/falsepattern/endlessids/EndlessIDs.java @@ -1,5 +1,10 @@ package com.falsepattern.endlessids; +import com.falsepattern.chunk.api.ChunkDataRegistry; +import com.falsepattern.endlessids.config.GeneralConfig; +import com.falsepattern.endlessids.managers.BiomeManager; +import com.falsepattern.endlessids.managers.BlockIDManager; +import com.falsepattern.endlessids.managers.BlockMetaManager; import com.falsepattern.endlessids.patching.CommonManager; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -39,10 +44,24 @@ public class EndlessIDs { @Mod.EventHandler public void init(FMLInitializationEvent e) { patchManager.init(); + if (GeneralConfig.extendBiome) { + ChunkDataRegistry.registerDataManager(new BiomeManager()); + } + if (GeneralConfig.extendBlockItem) { + ChunkDataRegistry.registerDataManager(new BlockIDManager()); + ChunkDataRegistry.registerDataManager(new BlockMetaManager()); + } } @Mod.EventHandler public void postInit(FMLPostInitializationEvent e) { patchManager.postInit(); + if (GeneralConfig.extendBiome) { + ChunkDataRegistry.disableDataManager("minecraft", "biome"); + } + if (GeneralConfig.extendBlockItem) { + ChunkDataRegistry.disableDataManager("minecraft", "blockid"); + ChunkDataRegistry.disableDataManager("minecraft", "metadata"); + } } } diff --git a/src/main/java/com/falsepattern/endlessids/Hooks.java b/src/main/java/com/falsepattern/endlessids/Hooks.java index 872ecac..348fd77 100644 --- a/src/main/java/com/falsepattern/endlessids/Hooks.java +++ b/src/main/java/com/falsepattern/endlessids/Hooks.java @@ -2,184 +2,10 @@ package com.falsepattern.endlessids; import com.falsepattern.endlessids.config.GeneralConfig; import com.falsepattern.endlessids.constants.ExtendedConstants; -import com.falsepattern.endlessids.mixin.helpers.IChunkMixin; -import com.falsepattern.endlessids.mixin.helpers.IExtendedBlockStorageMixin; -import lombok.val; -import lombok.var; import net.minecraft.block.Block; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.chunk.NibbleArray; public class Hooks { - - public static int getBlockData(final IExtendedBlockStorageMixin ebs, final byte[] data, int offset) { - val b1 = ebs.getB1(); - System.arraycopy(b1, 0, data, offset, b1.length); - offset += b1.length; - val b2Low = ebs.getB2Low(); - if (b2Low != null) { - System.arraycopy(b2Low.data, 0, data, offset, b2Low.data.length); - offset += b2Low.data.length; - val b2High = ebs.getB2High(); - if (b2High != null) { - System.arraycopy(b2High.data, 0, data, offset, b2High.data.length); - offset += b2High.data.length; - val b3 = ebs.getB3(); - if (b3 != null) { - System.arraycopy(b3, 0, data, offset, b3.length); - } - } - } - return ebs.getEBSMSBMask(); - } - - public static void setBlockData(final IExtendedBlockStorageMixin ebs, final byte[] data, int offset, final int storageFlag) { - val b1 = ebs.getB1(); - System.arraycopy(data, offset, b1, 0, b1.length); - offset += b1.length; - if (storageFlag == 0b00) { - ebs.clearB2Low(); - ebs.clearB2High(); - ebs.clearB3(); - return; - } - var b2Low = ebs.getB2Low(); - if (b2Low == null) { - b2Low = ebs.createB2Low(); - } - System.arraycopy(data, offset, b2Low.data, 0, b2Low.data.length); - offset += b2Low.data.length; - if (storageFlag == 0b01) { - ebs.clearB2High(); - ebs.clearB3(); - return; - } - var b2High = ebs.getB2High(); - if (b2High == null) { - b2High = ebs.createB2High(); - } - System.arraycopy(data, offset, b2High.data, 0, b2High.data.length); - offset += b2High.data.length; - if (storageFlag == 0b10) { - ebs.clearB3(); - return; - } - var b3 = ebs.getB3(); - if (b3 == null) { - b3 = ebs.createB3(); - } - System.arraycopy(data, offset, b3, 0, b3.length); - } - - public static void writeBlockDataToNBT(final NBTTagCompound nbt, final IExtendedBlockStorageMixin ebs) { - val b1 = ebs.getB1(); - val b2Low = ebs.getB2Low(); - val b2High = ebs.getB2High(); - val b3 = ebs.getB3(); - nbt.setByteArray("Blocks", b1); - if (b2Low != null) { - nbt.setByteArray("Add", b2Low.data); - } - if (b2High != null) { - nbt.setByteArray("BlocksB2Hi", b2High.data); - } - if (b3 != null) { - nbt.setByteArray("BlocksB3", b3); - } - } - - public static void readBlockDataFromNBT(final IExtendedBlockStorageMixin ebs, final NBTTagCompound nbt) { - assert nbt.hasKey("Blocks"); - val b1 = nbt.getByteArray("Blocks"); - final byte[] b2Low = nbt.hasKey("Add") ? nbt.getByteArray("Add") : null; - final byte[] b2High = nbt.hasKey("BlocksB2Hi") ? nbt.getByteArray("BlocksB2Hi") : null; - final byte[] b3 = nbt.hasKey("BlocksB3") ? nbt.getByteArray("BlocksB3") : null; - - ebs.setB1(b1); - if (b2Low == null) { - ebs.clearB2Low(); - } else { - ebs.setB2Low(new NibbleArray(b2Low, 4)); - } - if (b2High == null) { - ebs.clearB2High(); - } else { - ebs.setB2High(new NibbleArray(b2High, 4)); - } - ebs.setB3(b3); - } - - public static int getBlockMeta(final IExtendedBlockStorageMixin ebs, final byte[] data, int offset) { - val m1Low = ebs.getM1Low(); - System.arraycopy(m1Low.data, 0, data, offset, m1Low.data.length); - offset += m1Low.data.length; - val m1High = ebs.getM1High(); - if (m1High != null) { - System.arraycopy(m1High.data, 0, data, offset, m1High.data.length); - offset += m1High.data.length; - val m2 = ebs.getM2(); - if (m2 != null) { - System.arraycopy(m2, 0, data, offset, m2.length); - } - } - return ebs.getEBSMask(); - } - - public static void setBlockMeta(final IExtendedBlockStorageMixin ebs, final byte[] data, int offset, final int storageFlag) { - val m1Low = ebs.getM1Low(); - System.arraycopy(data, offset, m1Low.data, 0, m1Low.data.length); - offset += m1Low.data.length; - if (storageFlag == 0b01) { - ebs.clearM1High(); - ebs.clearM2(); - return; - } - var m1High = ebs.getM1High(); - if (m1High == null) { - m1High = ebs.createM1High(); - } - System.arraycopy(data, offset, m1High.data, 0, m1High.data.length); - if (storageFlag == 0b10) { - ebs.clearM2(); - return; - } - var m2 = ebs.getM2(); - if (m2 == null) { - m2 = ebs.createM2(); - } - System.arraycopy(data, offset, m2, 0, m2.length); - } - - public static void writeBlockMetaToNBT(IExtendedBlockStorageMixin ebs, NBTTagCompound nbt) { - val m1Low = ebs.getM1Low(); - val m1High = ebs.getM1High(); - val m2 = ebs.getM2(); - nbt.setByteArray("Data", m1Low.data); - if (m1High != null) { - nbt.setByteArray("Data1High", m1High.data); - } - if (m2 != null) { - nbt.setByteArray("Data2", m2); - } - } - - public static void readBlockMetaFromNBT(IExtendedBlockStorageMixin ebs, NBTTagCompound nbt) { - assert nbt.hasKey("Data"); - val m1Low = nbt.getByteArray("Data"); - final byte[] m1High = nbt.hasKey("Data1High") ? nbt.getByteArray("Data1High") : null; - final byte[] m2 = nbt.hasKey("Data2") ? nbt.getByteArray("Data2") : null; - - ebs.setM1Low(new NibbleArray(m1Low, 4)); - if (m1High == null) { - ebs.clearM1High(); - } else { - ebs.setM1High(new NibbleArray(m1High, 4)); - } - ebs.setM2(m2); - } - public static int getIdFromBlockWithCheck(final Block block, final Block oldBlock) { final int id = Block.getIdFromBlock(block); if (GeneralConfig.catchUnregisteredBlocks && id == -1) { @@ -230,47 +56,9 @@ public class Hooks { } } - private static void scatter(byte[] byteArray, short[] shortArray) { + public static void scatter(byte[] byteArray, short[] shortArray) { for (int i = 0; i < byteArray.length; i++) { shortArray[i] = (short) (byteArray[i] & 0xff); } } - - public static int readBiomeArrayFromPacket(Chunk chunk, byte[] array, int offset) { - short[] biomeArray = ((IChunkMixin) chunk).getBiomeShortArray(); - byteToShortArray(array, offset, biomeArray, 0, biomeArray.length * 2); - return biomeArray.length * 2; - } - - public static int writeBiomeArrayToPacket(Chunk chunk, byte[] array, int offset) { - short[] biomeArray = ((IChunkMixin) chunk).getBiomeShortArray(); - shortToByteArray(biomeArray, 0, array, offset, biomeArray.length); - return biomeArray.length * 2; - } - - public static void writeChunkBiomeArrayToNbt(Chunk chunk, NBTTagCompound nbt) { - byte[] byteArray = shortToByteArray(((IChunkMixin) chunk).getBiomeShortArray()); - nbt.setByteArray("Biomes16v2", byteArray); - } - - public static void readChunkBiomeArrayFromNbt(Chunk chunk, NBTTagCompound nbt) { - short[] data = ((IChunkMixin) chunk).getBiomeShortArray(); - boolean put = false; - if (data == null) { - data = new short[16 * 16]; - put = true; - } - if (nbt.hasKey("Biomes16v2", 7)) { - byteToShortArray(nbt.getByteArray("Biomes16v2"), 0, data, 0, data.length * 2); - } else if (nbt.hasKey("Biomes16", 7)) { //NotEnoughBiomes DFU - byteToShortArrayLegacy(nbt.getByteArray("Biomes16"), data); - } else if (nbt.hasKey("Biomes", 7)) { //Vanilla DFU - scatter(nbt.getByteArray("Biomes"), data); - } else { - put = false; - } - if (put) { - ((IChunkMixin) chunk).setBiomeShortArray(data); - } - } } diff --git a/src/main/java/com/falsepattern/endlessids/managers/BiomeManager.java b/src/main/java/com/falsepattern/endlessids/managers/BiomeManager.java new file mode 100644 index 0000000..c1a5aa4 --- /dev/null +++ b/src/main/java/com/falsepattern/endlessids/managers/BiomeManager.java @@ -0,0 +1,75 @@ +package com.falsepattern.endlessids.managers; + +import com.falsepattern.chunk.api.ChunkDataManager; +import com.falsepattern.endlessids.Hooks; +import com.falsepattern.endlessids.Tags; +import com.falsepattern.endlessids.mixin.helpers.IChunkMixin; +import lombok.var; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.chunk.Chunk; + +import java.nio.ByteBuffer; + +public class BiomeManager implements ChunkDataManager, ChunkDataManager.PacketDataManager, ChunkDataManager.ChunkNBTDataManager { + + @Override + public String domain() { + return Tags.MODID; + } + + @Override + public String id() { + return "biome"; + } + + @Override + public int maxPacketSize() { + return 2 * 16 * 16; + } + + @Override + public void writeToBuffer(Chunk chunk, int ebsMask, boolean forceUpdate, ByteBuffer data) { + data.asShortBuffer().put(((IChunkMixin)chunk).getBiomeShortArray()); + data.position(data.position() + maxPacketSize()); + } + + @Override + public void readFromBuffer(Chunk chunk, int ebsMask, boolean forceUpdate, ByteBuffer buffer) { + var arr = ((IChunkMixin)chunk).getBiomeShortArray(); + if (arr == null) { + arr = new short[16 * 16]; + ((IChunkMixin)chunk).setBiomeShortArray(arr); + } + buffer.asShortBuffer().get(arr); + buffer.position(buffer.position() + maxPacketSize()); + } + + @Override + public boolean chunkPrivilegedAccess() { + return true; + } + + @Override + public void writeChunkToNBT(Chunk chunk, NBTTagCompound nbt) { + byte[] arr = Hooks.shortToByteArray(((IChunkMixin)chunk).getBiomeShortArray()); + nbt.setByteArray("Biomes16v2", arr); + } + + @Override + public void readChunkFromNBT(Chunk chunk, NBTTagCompound nbt) { + var data = ((IChunkMixin) chunk).getBiomeShortArray(); + if (data == null) { + data = new short[16 * 16]; + ((IChunkMixin)chunk).setBiomeShortArray(data); + } + if (nbt.hasKey("Biomes16v2", 7)) { + Hooks.byteToShortArray(nbt.getByteArray("Biomes16v2"), 0, data, 0, data.length * 2); + } else if (nbt.hasKey("Biomes16", 7)) { //NotEnoughBiomes DFU + Hooks.byteToShortArrayLegacy(nbt.getByteArray("Biomes16"), data); + } else if (nbt.hasKey("Biomes", 7)) { //Vanilla DFU + Hooks.scatter(nbt.getByteArray("Biomes"), data); + } + + } +} diff --git a/src/main/java/com/falsepattern/endlessids/managers/BlockIDManager.java b/src/main/java/com/falsepattern/endlessids/managers/BlockIDManager.java new file mode 100644 index 0000000..b61305b --- /dev/null +++ b/src/main/java/com/falsepattern/endlessids/managers/BlockIDManager.java @@ -0,0 +1,161 @@ +package com.falsepattern.endlessids.managers; + +import com.falsepattern.chunk.api.ChunkDataManager; +import com.falsepattern.endlessids.Tags; +import com.falsepattern.endlessids.mixin.helpers.IExtendedBlockStorageMixin; +import lombok.val; +import lombok.var; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.NibbleArray; +import net.minecraft.world.chunk.storage.ExtendedBlockStorage; + +import java.nio.ByteBuffer; + +public class BlockIDManager implements ChunkDataManager, ChunkDataManager.PacketDataManager, ChunkDataManager.SectionNBTDataManager { + + @Override + public String domain() { + return Tags.MODID; + } + + @Override + public String id() { + return "blockid"; + } + + @Override + public int maxPacketSize() { + return 3 * 16 * 16 * 16 * 16 + 4; + } + + @Override + public void writeToBuffer(Chunk chunk, int ebsMask, boolean forceUpdate, ByteBuffer data) { + val ebsList = chunk.getBlockStorageArray(); + int storageFlags = 0; + val start = data.position() + 4; + data.position(start); + for (int i = 0; i < 16; i++) { + if ((ebsMask & (1 << i)) == 0 || ebsList[i] == null) { + continue; + } + val ebs = (IExtendedBlockStorageMixin) ebsList[i]; + + storageFlags |= ebs.getEBSMSBMask() << (i * 2); + + val b1 = ebs.getB1(); + data.put(b1); + + val b2Low = ebs.getB2Low(); + if (b2Low == null) { + continue; + } + data.put(b2Low.data); + + val b2High = ebs.getB2High(); + if (b2High == null) { + continue; + } + data.put(b2High.data); + + val b3 = ebs.getB3(); + if (b3 != null) { + data.put(b3); + } + } + data.putInt(start - 4, storageFlags); + } + + @Override + public void readFromBuffer(Chunk chunk, int ebsMask, boolean forceUpdate, ByteBuffer buffer) { + val ebsList = chunk.getBlockStorageArray(); + val storageFlags = buffer.getInt(); + for (int i = 0; i < 16; i++) { + if ((ebsMask & (1 << i)) == 0 || ebsList[i] == null) { + continue; + } + val ebs = (IExtendedBlockStorageMixin) ebsList[i]; + val storageFlag = (storageFlags >>> (i * 2)) & 3; + val b1 = ebs.getB1(); + buffer.get(b1); + if (storageFlag == 0b00) { + ebs.clearB2Low(); + ebs.clearB2High(); + ebs.clearB3(); + continue; + } + var b2Low = ebs.getB2Low(); + if (b2Low == null) { + b2Low = ebs.createB2Low(); + } + buffer.get(b2Low.data); + if (storageFlag == 0b01) { + ebs.clearB2High(); + ebs.clearB3(); + continue; + } + var b2High = ebs.getB2High(); + if (b2High == null) { + b2High = ebs.createB2High(); + } + buffer.get(b2High.data); + if (storageFlag == 0b10) { + ebs.clearB3(); + continue; + } + var b3 = ebs.getB3(); + if (b3 == null) { + b3 = ebs.createB3(); + } + buffer.get(b3); + } + } + + @Override + public boolean sectionPrivilegedAccess() { + return true; + } + + @Override + public void writeSectionToNBT(Chunk chunk, ExtendedBlockStorage ebsVanilla, NBTTagCompound section) { + val ebs = (IExtendedBlockStorageMixin) ebsVanilla; + val b1 = ebs.getB1(); + val b2Low = ebs.getB2Low(); + val b2High = ebs.getB2High(); + val b3 = ebs.getB3(); + section.setByteArray("Blocks", b1); + if (b2Low != null) { + section.setByteArray("Add", b2Low.data); + } + if (b2High != null) { + section.setByteArray("BlocksB2Hi", b2High.data); + } + if (b3 != null) { + section.setByteArray("BlocksB3", b3); + } + } + + @Override + public void readSectionFromNBT(Chunk chunk, ExtendedBlockStorage ebsVanilla, NBTTagCompound section) { + val ebs = (IExtendedBlockStorageMixin) ebsVanilla; + assert section.hasKey("Blocks"); + val b1 = section.getByteArray("Blocks"); + final byte[] b2Low = section.hasKey("Add") ? section.getByteArray("Add") : null; + final byte[] b2High = section.hasKey("BlocksB2Hi") ? section.getByteArray("BlocksB2Hi") : null; + final byte[] b3 = section.hasKey("BlocksB3") ? section.getByteArray("BlocksB3") : null; + + ebs.setB1(b1); + if (b2Low == null) { + ebs.clearB2Low(); + } else { + ebs.setB2Low(new NibbleArray(b2Low, 4)); + } + if (b2High == null) { + ebs.clearB2High(); + } else { + ebs.setB2High(new NibbleArray(b2High, 4)); + } + ebs.setB3(b3); + } +} diff --git a/src/main/java/com/falsepattern/endlessids/managers/BlockMetaManager.java b/src/main/java/com/falsepattern/endlessids/managers/BlockMetaManager.java new file mode 100644 index 0000000..a17ac06 --- /dev/null +++ b/src/main/java/com/falsepattern/endlessids/managers/BlockMetaManager.java @@ -0,0 +1,134 @@ +package com.falsepattern.endlessids.managers; + +import com.falsepattern.chunk.api.ChunkDataManager; +import com.falsepattern.endlessids.Tags; +import com.falsepattern.endlessids.mixin.helpers.IExtendedBlockStorageMixin; +import lombok.val; +import lombok.var; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.NibbleArray; +import net.minecraft.world.chunk.storage.ExtendedBlockStorage; + +import java.nio.ByteBuffer; + +public class BlockMetaManager implements ChunkDataManager, ChunkDataManager.PacketDataManager, ChunkDataManager.SectionNBTDataManager { + + @Override + public String domain() { + return Tags.MODID; + } + + @Override + public String id() { + return "metadata"; + } + + @Override + public int maxPacketSize() { + return 2 * 16 * 16 * 16 * 16 + 4; + } + + @Override + public void writeToBuffer(Chunk chunk, int ebsMask, boolean forceUpdate, ByteBuffer data) { + val ebsList = chunk.getBlockStorageArray(); + int storageFlags = 0; + val start = data.position() + 4; + data.position(start); + for (int i = 0; i < 16; i++) { + if ((ebsMask & (1 << i)) == 0 || ebsList[i] == null) { + continue; + } + val ebs = (IExtendedBlockStorageMixin) ebsList[i]; + + storageFlags |= ebs.getEBSMask() << (i * 2); + + val m1Low = ebs.getM1Low(); + data.put(m1Low.data); + + val m1High = ebs.getM1High(); + if (m1High == null) { + continue; + } + data.put(m1High.data); + + val m2 = ebs.getM2(); + if (m2 != null) { + data.put(m2); + } + } + data.putInt(start - 4, storageFlags); + } + + @Override + public void readFromBuffer(Chunk chunk, int ebsMask, boolean forceUpdate, ByteBuffer buffer) { + val ebsList = chunk.getBlockStorageArray(); + val storageFlags = buffer.getInt(); + for (int i = 0; i < 16; i++) { + if ((ebsMask & (1 << i)) == 0 || ebsList[i] == null) { + continue; + } + val ebs = (IExtendedBlockStorageMixin) ebsList[i]; + val storageFlag = (storageFlags >>> (i * 2)) & 3; + val m1Low = ebs.getM1Low(); + buffer.get(m1Low.data); + if (storageFlag == 0b01) { + ebs.clearM1High(); + ebs.clearM2(); + continue; + } + var m1High = ebs.getM1High(); + if (m1High == null) { + m1High = ebs.createM1High(); + } + buffer.get(m1High.data); + if (storageFlag == 0b10) { + ebs.clearM2(); + continue; + } + var m2 = ebs.getM2(); + if (m2 == null) { + m2 = ebs.createM2(); + } + buffer.get(m2); + } + } + + @Override + public boolean sectionPrivilegedAccess() { + return true; + } + + @Override + public void writeSectionToNBT(Chunk chunk, ExtendedBlockStorage ebsVanilla, NBTTagCompound section) { + val ebs = (IExtendedBlockStorageMixin) ebsVanilla; + val m1Low = ebs.getM1Low(); + val m1High = ebs.getM1High(); + val m2 = ebs.getM2(); + section.setByteArray("Data", m1Low.data); + if (m1High != null) { + section.setByteArray("Data1High", m1High.data); + } + if (m2 != null) { + section.setByteArray("Data2", m2); + } + } + + @Override + public void readSectionFromNBT(Chunk chunk, ExtendedBlockStorage ebsVanilla, NBTTagCompound section) { + val ebs = (IExtendedBlockStorageMixin) ebsVanilla; + assert section.hasKey("Data"); + val m1Low = section.getByteArray("Data"); + final byte[] m1High = section.hasKey("Data1High") ? section.getByteArray("Data1High") : null; + final byte[] m2 = section.hasKey("Data2") ? section.getByteArray("Data2") : null; + + ebs.setM1Low(new NibbleArray(m1Low, 4)); + if (m1High == null) { + ebs.clearM1High(); + } else { + ebs.setM1High(new NibbleArray(m1High, 4)); + } + ebs.setM2(m2); + } +} 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 deleted file mode 100644 index c72ee61..0000000 --- a/src/main/java/com/falsepattern/endlessids/mixin/mixins/client/biome/vanilla/ChunkMixin.java +++ /dev/null @@ -1,49 +0,0 @@ -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 deleted file mode 100644 index f5bfdb2..0000000 --- a/src/main/java/com/falsepattern/endlessids/mixin/mixins/client/blockitem/vanilla/ChunkMixin.java +++ /dev/null @@ -1,141 +0,0 @@ -package com.falsepattern.endlessids.mixin.mixins.client.blockitem.vanilla; - -import com.falsepattern.endlessids.Hooks; -import com.falsepattern.endlessids.mixin.helpers.IExtendedBlockStorageMixin; -import lombok.val; -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.ModifyVariable; -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.NibbleArray; -import net.minecraft.world.chunk.storage.ExtendedBlockStorage; - -import java.util.Iterator; - -@Mixin(Chunk.class) -public abstract class ChunkMixin { - //This is needed because the array is not a field, but a local, and local arraylength overriding does not exist - private static byte[][] fakeArrays; - private static NibbleArray[] fakeNarrays; - @Shadow - private ExtendedBlockStorage[] storageArrays; - - private int ebsData; - - @ModifyVariable(method = "fillChunk", - at = @At("HEAD"), - ordinal = 0, - argsOnly = true) - private int extractEBSData(int ebs) { - ebsData = ebs; - int result = 0; - for (int i = 0; i < 16; i++) { - result |= ((ebs >>> (i << 1)) & 0b11) > 0 ? 1 << i : 0; - } - return result; - } - - @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) { - val storageFlag = (p_76607_3_ >>> (l << 1)) & 0b11; - Hooks.setBlockData((IExtendedBlockStorageMixin) this.storageArrays[l], p_76607_1_, k, storageFlag); - } - - @Redirect(method = "fillChunk", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/world/chunk/storage/ExtendedBlockStorage;getBlockLSBArray()[B"), - require = 1) - private byte[] fakeLSBArray(ExtendedBlockStorage instance) { - if (fakeArrays == null) { - fakeArrays = new byte[4][]; - fakeArrays[0] = new byte[16 * 16 * 16 * 2 / 2]; - fakeArrays[1] = new byte[16 * 16 * 16 * 3 / 2]; - fakeArrays[2] = new byte[16 * 16 * 16 * 4 / 2]; - fakeArrays[3] = new byte[16 * 16 * 16 * 6 / 2]; - } - return fakeArrays[((IExtendedBlockStorageMixin) instance).getEBSMSBMask()]; - } - - @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) { - } - - @Inject(method = "fillChunk", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/world/chunk/storage/ExtendedBlockStorage;getMetadataArray()Lnet/minecraft/world/chunk/NibbleArray;"), - locals = LocalCapture.CAPTURE_FAILHARD, - require = 1) - private void hookSetBlockMeta(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) { - val storageFlag = (ebsData >>> (l << 1)) & 0b11; - Hooks.setBlockMeta((IExtendedBlockStorageMixin) this.storageArrays[l], p_76607_1_, k, storageFlag); - } - - @Redirect(method = "fillChunk", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/world/chunk/storage/ExtendedBlockStorage;getMetadataArray()Lnet/minecraft/world/chunk/NibbleArray;"), - require = 1) - private NibbleArray hookSetBlockMetaNoArray(ExtendedBlockStorage instance) { - if (fakeNarrays == null) { - fakeNarrays = new NibbleArray[3]; - fakeNarrays[0] = new NibbleArray(new byte[]{(byte)0b01}, 0); - fakeNarrays[1] = new NibbleArray(new byte[]{(byte)0b10}, 0); - fakeNarrays[2] = new NibbleArray(new byte[]{(byte)0b100}, 0); - } - return fakeNarrays[((IExtendedBlockStorageMixin)instance).getEBSMask() - 1]; - } - - @Redirect(method = "fillChunk", - at = @At(value = "FIELD", - target = "Lnet/minecraft/world/chunk/NibbleArray;data:[B", - args = "array=length"), - slice = @Slice(from = @At(value = "INVOKE", - target = "Lnet/minecraft/world/chunk/storage/ExtendedBlockStorage;getMetadataArray()Lnet/minecraft/world/chunk/NibbleArray;"), - to = @At(value = "INVOKE", - target = "Lnet/minecraft/world/chunk/storage/ExtendedBlockStorage;getBlocklightArray()Lnet/minecraft/world/chunk/NibbleArray;")), - expect = 2, - require = 2) - private int hookSetBlockMetaFakeBytesLength(byte[] array) { - return 16 * 16 * 16 * (array[0] & 0xFF) / 2; - } - - @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;getMetadataArray()Lnet/minecraft/world/chunk/NibbleArray;")), - require = 1) - private void hookSetBlockMetaNoCopy(Object src, int srcPos, Object dest, int destPos, int length) { - - } -} 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 deleted file mode 100644 index c2196bc..0000000 --- a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/biome/vanilla/AnvilChunkLoaderMixin.java +++ /dev/null @@ -1,65 +0,0 @@ -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 deleted file mode 100644 index 5e71a68..0000000 --- a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/biome/vanilla/S21PacketChunkDataMixin.java +++ /dev/null @@ -1,21 +0,0 @@ -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/blockitem/vanilla/AnvilChunkLoaderMixin.java b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/blockitem/vanilla/AnvilChunkLoaderMixin.java deleted file mode 100644 index 3149695..0000000 --- a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/blockitem/vanilla/AnvilChunkLoaderMixin.java +++ /dev/null @@ -1,138 +0,0 @@ -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.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.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 key, byte[] value) { - Hooks.writeBlockDataToNBT(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 = "writeChunkToNBT", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/world/chunk/storage/ExtendedBlockStorage;getMetadataArray()Lnet/minecraft/world/chunk/NibbleArray;"), - require = 1) - private NibbleArray grabEBSBlockMetaWrite(ExtendedBlockStorage instance) { - ebs = (IExtendedBlockStorageMixin) instance; - return null; - } - - @Redirect(method = "writeChunkToNBT", - at = @At(value = "FIELD", - target = "Lnet/minecraft/world/chunk/NibbleArray;data:[B", - ordinal = 0), - slice = @Slice(from = @At(value = "INVOKE", - target = "Lnet/minecraft/world/chunk/storage/ExtendedBlockStorage;getMetadataArray()Lnet/minecraft/world/chunk/NibbleArray;")), - require = 1) - private byte[] suppressEBSBlockMetaNibbleArrayAccess(NibbleArray instance) { - return null; - } - - @Redirect(method = "writeChunkToNBT", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/nbt/NBTTagCompound;setByteArray(Ljava/lang/String;[B)V", - ordinal = 0), - slice = @Slice(from = @At(value = "CONSTANT", - args = "stringValue=Data")), - require = 1) - private void redirectBlockMetaWrite(NBTTagCompound instance, String p_74773_1_, byte[] p_74773_2_) { - Hooks.writeBlockMetaToNBT(ebs, instance); - ebs = 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 key) { - 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.readBlockDataFromNBT((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 key, int type) { - return false; - } - - @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=Data")), - require = 1) - private byte[] grabNBTBlockMetaRead(NBTTagCompound instance, String key) { - nbt = instance; - return null; - } - - @Redirect(method = "readChunkFromNBT", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/world/chunk/storage/ExtendedBlockStorage;setBlockMetadataArray(Lnet/minecraft/world/chunk/NibbleArray;)V"), - require = 1) - private void redirectBlockMetaRead(ExtendedBlockStorage instance, NibbleArray p_76668_1_) { - Hooks.readBlockMetaFromNBT((IExtendedBlockStorageMixin) instance, nbt); - nbt = null; - } -} diff --git a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/blockitem/vanilla/S21PacketChunkDataMixin.java b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/blockitem/vanilla/S21PacketChunkDataMixin.java deleted file mode 100644 index 4369346..0000000 --- a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/blockitem/vanilla/S21PacketChunkDataMixin.java +++ /dev/null @@ -1,120 +0,0 @@ -package com.falsepattern.endlessids.mixin.mixins.common.blockitem.vanilla; - -import com.falsepattern.endlessids.Hooks; -import com.falsepattern.endlessids.mixin.helpers.IExtendedBlockStorageMixin; -import lombok.val; -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.CallbackInfoReturnable; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; - -import net.minecraft.network.play.server.S21PacketChunkData; -import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.chunk.NibbleArray; -import net.minecraft.world.chunk.storage.ExtendedBlockStorage; - -@Mixin(S21PacketChunkData.class) -public abstract class S21PacketChunkDataMixin { - private static byte[][] fakeArrays; - private static NibbleArray[] fakeNarrays; - - @Redirect(method = "func_149269_a", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/world/chunk/storage/ExtendedBlockStorage;getBlockMSBArray()Lnet/minecraft/world/chunk/NibbleArray;", - ordinal = 0), - require = 1) - private static NibbleArray noMSB(ExtendedBlockStorage instance) { - return null; - } - - @Inject(method = "func_149269_a", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/world/chunk/storage/ExtendedBlockStorage;getBlockLSBArray()[B"), - locals = LocalCapture.CAPTURE_FAILHARD, - require = 1) - private static void hookGetBlockData(Chunk p_149269_0_, boolean p_149269_1_, int p_149269_2_, CallbackInfoReturnable cir, int j, ExtendedBlockStorage[] aextendedblockstorage, int k, S21PacketChunkData.Extracted extracted, byte[] abyte, int l) { - val ebs = (IExtendedBlockStorageMixin) aextendedblockstorage[l]; - extracted.field_150281_c |= Hooks.getBlockData(ebs, abyte, j) << (l << 1); - } - - @Redirect(method = "func_149269_a", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/world/chunk/storage/ExtendedBlockStorage;getBlockLSBArray()[B"), - require = 1) - private static byte[] hookGetBlockDataFakeArray(ExtendedBlockStorage instance) { - if (fakeArrays == null) { - fakeArrays = new byte[4][]; - fakeArrays[0] = new byte[16 * 16 * 16 * 2 / 2]; - fakeArrays[1] = new byte[16 * 16 * 16 * 3 / 2]; - fakeArrays[2] = new byte[16 * 16 * 16 * 4 / 2]; - fakeArrays[3] = new byte[16 * 16 * 16 * 6 / 2]; - } - return fakeArrays[((IExtendedBlockStorageMixin) instance).getEBSMSBMask()]; - } - - @Redirect(method = "func_149269_a", - 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 static void hookGetBlockDataNoCopy(Object src, int srcPos, Object dest, int destPos, int length) { - - } - - @Inject(method = "func_149269_a", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/world/chunk/storage/ExtendedBlockStorage;getMetadataArray()Lnet/minecraft/world/chunk/NibbleArray;"), - locals = LocalCapture.CAPTURE_FAILHARD, - require = 1) - private static void hookGetBlockMeta(Chunk p_149269_0_, boolean p_149269_1_, int p_149269_2_, CallbackInfoReturnable cir, int j, ExtendedBlockStorage[] aextendedblockstorage, int k, S21PacketChunkData.Extracted extracted, byte[] abyte, int l) { - if (l == 0) { - extracted.field_150280_b = 0; - } - extracted.field_150280_b |= Hooks.getBlockMeta((IExtendedBlockStorageMixin) aextendedblockstorage[l], abyte, j) << (l << 1); - } - - @Redirect(method = "func_149269_a", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/world/chunk/storage/ExtendedBlockStorage;getMetadataArray()Lnet/minecraft/world/chunk/NibbleArray;"), - require = 1) - private static NibbleArray hookGetBlockMetaNoArray(ExtendedBlockStorage instance) { - if (fakeNarrays == null) { - fakeNarrays = new NibbleArray[3]; - fakeNarrays[0] = new NibbleArray(new byte[]{(byte)0b01}, 0); - fakeNarrays[1] = new NibbleArray(new byte[]{(byte)0b10}, 0); - fakeNarrays[2] = new NibbleArray(new byte[]{(byte)0b100}, 0); - } - return fakeNarrays[((IExtendedBlockStorageMixin)instance).getEBSMask() - 1]; - } - - @Redirect(method = "func_149269_a", - at = @At(value = "FIELD", - target = "Lnet/minecraft/world/chunk/NibbleArray;data:[B", - args = "array=length"), - slice = @Slice(from = @At(value = "INVOKE", - target = "Lnet/minecraft/world/chunk/storage/ExtendedBlockStorage;getMetadataArray()Lnet/minecraft/world/chunk/NibbleArray;"), - to = @At(value = "INVOKE", - target = "Lnet/minecraft/world/chunk/storage/ExtendedBlockStorage;getBlocklightArray()Lnet/minecraft/world/chunk/NibbleArray;")), - expect = 2, - require = 2) - private static int hookGetBlockMetaFakeBytesLength(byte[] array) { - return 16 * 16 * 16 * (array[0] & 0xFF) / 2; - } - - @Redirect(method = "func_149269_a", - 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;getMetadataArray()Lnet/minecraft/world/chunk/NibbleArray;")), - require = 1) - private static void hookGetBlockMetaNoCopy(Object src, int srcPos, Object dest, int destPos, int length) { - - } -} 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 deleted file mode 100644 index 53183d5..0000000 --- a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/S21PacketChunkDataMixin.java +++ /dev/null @@ -1,121 +0,0 @@ -package com.falsepattern.endlessids.mixin.mixins.common.vanilla; - -import com.falsepattern.endlessids.config.GeneralConfig; -import com.falsepattern.endlessids.constants.ExtendedConstants; -import com.falsepattern.endlessids.constants.VanillaConstants; -import io.netty.buffer.ByteBuf; -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.Constant; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.ModifyConstant; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.minecraft.network.PacketBuffer; -import net.minecraft.network.play.server.S21PacketChunkData; - -import java.io.IOException; -import java.util.zip.DataFormatException; -import java.util.zip.Inflater; - -@Mixin(S21PacketChunkData.class) -public abstract class S21PacketChunkDataMixin { - @Shadow - private static byte[] field_149286_i; - @Shadow - private int field_149280_d; - @Shadow - private byte[] field_149278_f; - @Shadow - private int field_149284_a; - @Shadow - private int field_149282_b; - @Shadow - private boolean field_149279_g; - @Shadow - private int field_149283_c; - @Shadow - private int field_149285_h; - - @ModifyConstant(method = {"", "func_149275_c"}, - constant = @Constant(intValue = VanillaConstants.bytesPerChunk), - require = 1) - private static int increasePacketSize(int constant) { - return ExtendedConstants.bytesPerChunk; - } - - - @Inject(method = "writePacketData", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/network/PacketBuffer;writeShort(I)Lio/netty/buffer/ByteBuf;", - ordinal = 0), - require = 1) - private void extendWrite(PacketBuffer p_148840_1_, CallbackInfo ci) { - if (GeneralConfig.extendBlockItem) { - p_148840_1_.writeInt(this.field_149283_c); - p_148840_1_.writeInt(this.field_149280_d); - } else { - p_148840_1_.writeShort((short)(this.field_149283_c & 65535)); - p_148840_1_.writeShort((short)(this.field_149280_d & 65535)); - } - p_148840_1_.writeInt(this.field_149278_f.length); - } - - @Redirect(method = "writePacketData", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/network/PacketBuffer;writeShort(I)Lio/netty/buffer/ByteBuf;", - ordinal = 0), - require = 1) - private ByteBuf suppressOldWrite1(PacketBuffer instance, int p_writeShort_1_) { - return null; - } - - @Redirect(method = "writePacketData", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/network/PacketBuffer;writeShort(I)Lio/netty/buffer/ByteBuf;", - ordinal = 1), - require = 1) - private ByteBuf suppressOldWrite2(PacketBuffer instance, int p_writeShort_1_) { - return null; - } - - @Inject(method = "readPacketData", - at = @At("HEAD"), - require = 1, - cancellable = true) - private void customRead(PacketBuffer data, CallbackInfo ci) throws IOException { - this.field_149284_a = data.readInt(); - this.field_149282_b = data.readInt(); - this.field_149279_g = data.readBoolean(); - if (GeneralConfig.extendBlockItem) { - this.field_149283_c = data.readInt(); - this.field_149280_d = data.readInt(); - } else { - this.field_149283_c = data.readShort(); - this.field_149280_d = data.readShort(); - } - int length = data.readInt(); - this.field_149285_h = data.readInt(); - - if (field_149286_i.length < this.field_149285_h) { - field_149286_i = new byte[this.field_149285_h]; - } - - data.readBytes(field_149286_i, 0, this.field_149285_h); - - this.field_149278_f = new byte[length]; - Inflater inflater = new Inflater(); - inflater.setInput(field_149286_i, 0, this.field_149285_h); - - try { - inflater.inflate(this.field_149278_f); - } catch (DataFormatException dataformatexception) { - throw new IOException("Bad compressed data format"); - } finally { - inflater.end(); - } - ci.cancel(); - } -} diff --git a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/S26PacketMapChunkBulkMixin.java b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/S26PacketMapChunkBulkMixin.java deleted file mode 100644 index 4b379aa..0000000 --- a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/S26PacketMapChunkBulkMixin.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.falsepattern.endlessids.mixin.mixins.common.vanilla; - -import com.falsepattern.endlessids.config.GeneralConfig; -import io.netty.buffer.ByteBuf; -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.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; - -import net.minecraft.network.PacketBuffer; -import net.minecraft.network.play.server.S26PacketMapChunkBulk; - -import java.util.zip.Inflater; - -@Mixin(S26PacketMapChunkBulk.class) -public abstract class S26PacketMapChunkBulkMixin { - @Shadow - private int[] field_149262_d; - - @Shadow - private byte[][] field_149260_f; - - @Shadow - private int[] field_149266_a; - - @Shadow - private int[] field_149264_b; - - @Shadow - private int[] field_149265_c; - - @Inject(method = "writePacketData", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/network/PacketBuffer;writeShort(I)Lio/netty/buffer/ByteBuf;", - ordinal = 1), - locals = LocalCapture.CAPTURE_FAILHARD, - require = 1) - private void extendWrite(PacketBuffer p_148840_1_, CallbackInfo ci, int i) { - if (GeneralConfig.extendBlockItem) { - p_148840_1_.writeInt(this.field_149265_c[i]); - p_148840_1_.writeInt(this.field_149262_d[i]); - } else { - p_148840_1_.writeShort((short)(this.field_149265_c[i] & 65535)); - p_148840_1_.writeShort((short)(this.field_149262_d[i] & 65535)); - } - p_148840_1_.writeInt(this.field_149260_f[i].length); - } - - @Redirect(method = "writePacketData", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/network/PacketBuffer;writeShort(I)Lio/netty/buffer/ByteBuf;", - ordinal = 1), - require = 1) - private ByteBuf suppressOldWrite1(PacketBuffer instance, int p_writeShort_1_) { - return null; - } - - @Redirect(method = "writePacketData", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/network/PacketBuffer;writeShort(I)Lio/netty/buffer/ByteBuf;", - ordinal = 2), - require = 1) - private ByteBuf suppressOldWrite2(PacketBuffer instance, int p_writeShort_1_) { - return null; - } - - @Inject(method = "readPacketData", - at = @At(value = "INVOKE", - target = "Ljava/util/zip/Inflater;inflate([B)I", - shift = At.Shift.AFTER), - require = 1, - locals = LocalCapture.CAPTURE_FAILHARD, - cancellable = true) - private void customRead(PacketBuffer data, CallbackInfo ci, short short1, byte[] abyte, Inflater inflater) { - int i = 0; - - for (int j = 0; j < short1; ++j) { - this.field_149266_a[j] = data.readInt(); - this.field_149264_b[j] = data.readInt(); - if (GeneralConfig.extendBlockItem) { - this.field_149265_c[j] = data.readInt(); - this.field_149262_d[j] = data.readInt(); - } else { - this.field_149265_c[j] = data.readShort(); - this.field_149262_d[j] = data.readShort(); - } - byte[] dataBytes = new byte[data.readInt()]; - this.field_149260_f[j] = dataBytes; - System.arraycopy(abyte, i, dataBytes, 0, dataBytes.length); - i += dataBytes.length; - } - ci.cancel(); - } -} 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 18d382e..5773594 100644 --- a/src/main/java/com/falsepattern/endlessids/mixin/plugin/Mixin.java +++ b/src/main/java/com/falsepattern/endlessids/mixin/plugin/Mixin.java @@ -9,7 +9,6 @@ import lombok.RequiredArgsConstructor; import java.util.List; import java.util.function.Predicate; -import static com.falsepattern.lib.mixin.IMixin.PredicateHelpers.always; import static com.falsepattern.lib.mixin.IMixin.PredicateHelpers.avoid; import static com.falsepattern.lib.mixin.IMixin.PredicateHelpers.condition; import static com.falsepattern.lib.mixin.IMixin.PredicateHelpers.require; @@ -17,10 +16,6 @@ import static com.falsepattern.lib.mixin.IMixin.PredicateHelpers.require; @RequiredArgsConstructor public enum Mixin implements IMixin { //region common - //region vanilla - S21PacketChunkDataMixin(Side.COMMON, always(), "vanilla.S21PacketChunkDataMixin"), - S26PacketMapChunkBulkMixin(Side.COMMON, always(), "vanilla.S26PacketMapChunkBulkMixin"), - //endregion vanilla //region AntiIDConflict AIDCAntiIdConflictBaseMixin(Side.COMMON, require(TargetedMod.ANTIIDCONFLICT), "antiidconflict.AntiIdConflictBaseMixin"), AIDCBiomesGenBasePlaceholderMixin(Side.COMMON, require(TargetedMod.ANTIIDCONFLICT), "antiidconflict.BiomeGenBasePlaceholderMixin"), @@ -32,13 +27,11 @@ public enum Mixin implements IMixin { //endregion AntiIDConflict //region biome //region vanilla - AnvilChunkLoaderMixinBiome(Side.COMMON, condition(() -> GeneralConfig.extendBiome), "biome.vanilla.AnvilChunkLoaderMixin"), BiomeDictionaryMixin(Side.COMMON, condition(() -> GeneralConfig.extendBiome), "biome.vanilla.BiomeDictionaryMixin"), BiomeGenBaseMixin(Side.COMMON, condition(() -> GeneralConfig.extendBiome), "biome.vanilla.BiomeGenBaseMixin"), ChunkMixin(Side.COMMON, condition(() -> GeneralConfig.extendBiome), "biome.vanilla.ChunkMixin"), GenLayerRiverMixMixin(Side.COMMON, condition(() -> GeneralConfig.extendBiome).and(avoid(TargetedMod.DRAGONAPI)), "biome.vanilla.GenLayerRiverMixMixin"), GenLayerVoronoiZoomMixin(Side.COMMON, condition(() -> GeneralConfig.extendBiome), "biome.vanilla.GenLayerVoronoiZoomMixin"), - S21PacketChunkDataMixinBiome(Side.COMMON, condition(() -> GeneralConfig.extendBiome), "biome.vanilla.S21PacketChunkDataMixin"), //endregion vanilla //region AbyssalCraft AbyssalCraftMixin(Side.COMMON, condition(() -> GeneralConfig.extendBiome).and(require(TargetedMod.ABYSSALCRAFT)), "biome.abyssalcraft.AbyssalCraftMixin"), @@ -164,13 +157,11 @@ public enum Mixin implements IMixin { //endregion biome //region blockitem //region vanilla - AnvilChunkLoaderMixinBlockItem(Side.COMMON, condition(() -> GeneralConfig.extendBlockItem), "blockitem.vanilla.AnvilChunkLoaderMixin"), BlockFireMixin(Side.COMMON, condition(() -> GeneralConfig.extendBlockItem), "blockitem.vanilla.BlockFireMixin"), ExtendedBlockStorageMixin(Side.COMMON, condition(() -> GeneralConfig.extendBlockItem), "blockitem.vanilla.ExtendedBlockStorageMixin"), ItemInWorldManagerMixin(Side.COMMON, condition(() -> GeneralConfig.extendBlockItem), "blockitem.vanilla.ItemInWorldManagerMixin"), ItemStackMixin(Side.COMMON, condition(() -> GeneralConfig.extendBlockItem), "blockitem.vanilla.ItemStackMixin"), PacketBufferMixin(Side.COMMON, condition(() -> GeneralConfig.extendBlockItem), "blockitem.vanilla.PacketBufferMixin"), - S21PacketChunkDataMixinBlockItem(Side.COMMON, condition(() -> GeneralConfig.extendBlockItem), "blockitem.vanilla.S21PacketChunkDataMixin"), S22PacketMultiBlockChangeMixin(Side.COMMON, condition(() -> GeneralConfig.extendBlockItem), "blockitem.vanilla.S22PacketMultiBlockChangeMixin"), S24PacketBlockActionMixin(Side.COMMON, condition(() -> GeneralConfig.extendBlockItem), "blockitem.vanilla.S24PacketBlockActionMixin"), StatListMixin(Side.COMMON, condition(() -> GeneralConfig.extendBlockItem), "blockitem.vanilla.StatListMixin"), @@ -219,16 +210,12 @@ public enum Mixin implements IMixin { //region client //region biome - //region vanilla - ChunkMixinClientBiome(Side.CLIENT, condition(() -> GeneralConfig.extendBiome), "biome.vanilla.ChunkMixin"), - //endregion vanilla //region Biome Wand BiomeWandItemClientMixin(Side.CLIENT, condition(() -> GeneralConfig.extendBiome).and(require(TargetedMod.BIOMEWAND)), "biome.biomewand.BiomeWandItemMixin"), //endregion Biome Wand //endregion biome //region blockitem //region vanilla - ChunkMixinClientBlockItem(Side.CLIENT, condition(() -> GeneralConfig.extendBlockItem), "blockitem.vanilla.ChunkMixin"), NetHandlerPlayClientMixinBlockItem(Side.CLIENT, condition(() -> GeneralConfig.extendBlockItem), "blockitem.vanilla.NetHandlerPlayClientMixin"), PlayerControllerMPMixin(Side.CLIENT, condition(() -> GeneralConfig.extendBlockItem), "blockitem.vanilla.PlayerControllerMPMixin"), RenderGlobalMixin(Side.CLIENT, condition(() -> GeneralConfig.extendBlockItem), "blockitem.vanilla.RenderGlobalMixin"),