diff --git a/src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/vanilla/AnvilChunkLoaderMixin.java b/src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/base/AnvilChunkLoaderMixin.java similarity index 99% rename from src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/vanilla/AnvilChunkLoaderMixin.java rename to src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/base/AnvilChunkLoaderMixin.java index 2d49dd8..1d589b2 100644 --- a/src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/vanilla/AnvilChunkLoaderMixin.java +++ b/src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/base/AnvilChunkLoaderMixin.java @@ -20,7 +20,7 @@ * along with this program. If not, see . */ -package com.falsepattern.chunk.internal.mixin.mixins.common.vanilla; +package com.falsepattern.chunk.internal.mixin.mixins.common.base; import com.falsepattern.chunk.internal.DataRegistryImpl; import lombok.val; diff --git a/src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/vanilla/PlayerInstanceMixin.java b/src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/base/PlayerInstanceMixin.java similarity index 96% rename from src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/vanilla/PlayerInstanceMixin.java rename to src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/base/PlayerInstanceMixin.java index 59644d3..7e0e5d4 100644 --- a/src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/vanilla/PlayerInstanceMixin.java +++ b/src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/base/PlayerInstanceMixin.java @@ -20,7 +20,7 @@ * along with this program. If not, see . */ -package com.falsepattern.chunk.internal.mixin.mixins.common.vanilla; +package com.falsepattern.chunk.internal.mixin.mixins.common.base; import com.falsepattern.chunk.internal.impl.CustomPacketMultiBlockChange; import lombok.val; diff --git a/src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/vanilla/S21PacketChunkDataMixin.java b/src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/base/S21PacketChunkDataMixin.java similarity index 98% rename from src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/vanilla/S21PacketChunkDataMixin.java rename to src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/base/S21PacketChunkDataMixin.java index 99faabb..1f2c989 100644 --- a/src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/vanilla/S21PacketChunkDataMixin.java +++ b/src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/base/S21PacketChunkDataMixin.java @@ -20,7 +20,7 @@ * along with this program. If not, see . */ -package com.falsepattern.chunk.internal.mixin.mixins.common.vanilla; +package com.falsepattern.chunk.internal.mixin.mixins.common.base; import com.falsepattern.chunk.internal.DataRegistryImpl; import com.falsepattern.chunk.internal.mixin.helpers.LockHelper; diff --git a/src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/vanilla/S22PacketMultiBlockChangeMixin.java b/src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/base/S22PacketMultiBlockChangeMixin.java similarity index 98% rename from src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/vanilla/S22PacketMultiBlockChangeMixin.java rename to src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/base/S22PacketMultiBlockChangeMixin.java index a652550..55ccf41 100644 --- a/src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/vanilla/S22PacketMultiBlockChangeMixin.java +++ b/src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/base/S22PacketMultiBlockChangeMixin.java @@ -20,7 +20,7 @@ * along with this program. If not, see . */ -package com.falsepattern.chunk.internal.mixin.mixins.common.vanilla; +package com.falsepattern.chunk.internal.mixin.mixins.common.base; import com.falsepattern.chunk.internal.DataRegistryImpl; import com.falsepattern.chunk.internal.impl.CustomPacketBlockChange; diff --git a/src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/vanilla/S23PacketBlockChangeMixin.java b/src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/base/S23PacketBlockChangeMixin.java similarity index 98% rename from src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/vanilla/S23PacketBlockChangeMixin.java rename to src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/base/S23PacketBlockChangeMixin.java index 0d89625..d3f51d3 100644 --- a/src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/vanilla/S23PacketBlockChangeMixin.java +++ b/src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/base/S23PacketBlockChangeMixin.java @@ -20,7 +20,7 @@ * along with this program. If not, see . */ -package com.falsepattern.chunk.internal.mixin.mixins.common.vanilla; +package com.falsepattern.chunk.internal.mixin.mixins.common.base; import com.falsepattern.chunk.internal.BlockPosUtil; import com.falsepattern.chunk.internal.DataRegistryImpl; diff --git a/src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/base/S26PacketMapChunkBulkMixin.java b/src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/base/S26PacketMapChunkBulkMixin.java new file mode 100644 index 0000000..c31fe32 --- /dev/null +++ b/src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/base/S26PacketMapChunkBulkMixin.java @@ -0,0 +1,123 @@ +/* + * ChunkAPI + * + * Copyright (C) 2023-2025 FalsePattern, The MEGA Team, LegacyModdingMC contributors + * All Rights Reserved + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, only version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +package com.falsepattern.chunk.internal.mixin.mixins.common.base; + +import com.falsepattern.chunk.internal.mixin.helpers.LockHelper; +import lombok.val; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.network.PacketBuffer; +import net.minecraft.network.play.server.S21PacketChunkData; +import net.minecraft.network.play.server.S26PacketMapChunkBulk; + +import java.io.IOException; +import java.util.zip.DataFormatException; +import java.util.zip.Inflater; + +@Mixin(S26PacketMapChunkBulk.class) +public abstract class S26PacketMapChunkBulkMixin { + @Shadow(aliases = "field_149268_i", + remap = false) + private static byte[] inflaterBuffer; + @Shadow(aliases = "field_149266_a", + remap = false) + private int[] xPositions; + @Shadow(aliases = "field_149264_b", + remap = false) + private int[] zPositions; + @Shadow(aliases = "field_149265_c", + remap = false) + private int[] subChunkMasks; + @Shadow(aliases = "field_149262_d", + remap = false) + private int[] subChunkMSBMasks; + @Shadow(aliases = "field_149261_g", + remap = false) + private int deflatedSize; + @Shadow(aliases = "field_149267_h", + remap = false) + private boolean skylight; + @Shadow(aliases = "field_149260_f", + remap = false) + private byte[][] datas; + + /** + * @author FalsePattern + * @reason Replace functionality + */ + @Overwrite + public void readPacketData(PacketBuffer data) throws IOException { + short chunkCount = data.readShort(); + val sizes = new int[chunkCount]; + for (int i = 0; i < chunkCount; i++) { + sizes[i] = data.readInt(); + } + deflatedSize = data.readInt(); + skylight = data.readBoolean(); + xPositions = new int[chunkCount]; + zPositions = new int[chunkCount]; + subChunkMasks = new int[chunkCount]; + subChunkMSBMasks = new int[chunkCount]; + datas = new byte[chunkCount][]; + + while (!LockHelper.bufferLockS26PacketMapChunkBulk.tryLock()) { + Thread.yield(); + } + byte[] buf; + try { + if (inflaterBuffer.length < deflatedSize) { + inflaterBuffer = new byte[deflatedSize]; + } + + data.readBytes(inflaterBuffer, 0, deflatedSize); + buf = new byte[S21PacketChunkData.func_149275_c() * chunkCount]; + Inflater inflater = new Inflater(); + inflater.setInput(inflaterBuffer, 0, deflatedSize); + + try { + inflater.inflate(buf); + } catch (DataFormatException dataformatexception) { + throw new IOException("Bad compressed data format"); + } finally { + inflater.end(); + } + } finally { + LockHelper.bufferLockS26PacketMapChunkBulk.unlock(); + } + + int pos = 0; + + for (int i = 0; i < chunkCount; ++i) { + val size = sizes[i]; + xPositions[i] = data.readInt(); + zPositions[i] = data.readInt(); + subChunkMasks[i] = data.readUnsignedShort(); + + datas[i] = new byte[size]; + System.arraycopy(buf, pos, datas[i], 0, size); + pos += size; + } + } +} diff --git a/src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/thermos/S26PacketMapChunkBulkMixin.java b/src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/thermos/S26PacketMapChunkBulkMixin.java new file mode 100644 index 0000000..00a929f --- /dev/null +++ b/src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/thermos/S26PacketMapChunkBulkMixin.java @@ -0,0 +1,84 @@ +/* + * ChunkAPI + * + * Copyright (C) 2023-2025 FalsePattern, The MEGA Team, LegacyModdingMC contributors + * Copyright (C) 2025 Cardinalstar16 + * All Rights Reserved + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, only version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +package com.falsepattern.chunk.internal.mixin.mixins.common.thermos; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.network.PacketBuffer; +import net.minecraft.network.play.server.S26PacketMapChunkBulk; + + +@Mixin(S26PacketMapChunkBulk.class) +public abstract class S26PacketMapChunkBulkMixin { + @Shadow(aliases = "field_149263_e", + remap = false) + private byte[] deflatedData; + @Shadow(aliases = "field_149266_a", + remap = false) + private int[] xPositions; + @Shadow(aliases = "field_149264_b", + remap = false) + private int[] zPositions; + @Shadow(aliases = "field_149265_c", + remap = false) + private int[] subChunkMasks; + @Shadow(aliases = "field_149261_g", + remap = false) + private int deflatedSize; + @Shadow(aliases = "field_149267_h", + remap = false) + private boolean skylight; + @Shadow(aliases = "field_149260_f", + remap = false) + private byte[][] datas; + + @Shadow(remap = false) + protected abstract void compress(); + + /** + * @author FalsePattern + * @author Cardinalstar16 + * @reason Replace functionality for thermos + */ + @Overwrite + public void writePacketData(PacketBuffer data) { + compress(); + + data.writeShort(xPositions.length); + for (byte[] bytes : datas) { + data.writeInt(bytes.length); + } + data.writeInt(deflatedSize); + data.writeBoolean(skylight); + data.writeBytes(deflatedData, 0, deflatedSize); + + for (int i = 0; i < xPositions.length; ++i) { + data.writeInt(xPositions[i]); + data.writeInt(zPositions[i]); + data.writeShort((short) (subChunkMasks[i] & 65535)); + } + } +} diff --git a/src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/vanilla/S26PacketMapChunkBulkMixin.java b/src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/vanilla/S26PacketMapChunkBulkMixin.java index c2a3009..b9feafc 100644 --- a/src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/vanilla/S26PacketMapChunkBulkMixin.java +++ b/src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/vanilla/S26PacketMapChunkBulkMixin.java @@ -22,26 +22,17 @@ package com.falsepattern.chunk.internal.mixin.mixins.common.vanilla; -import com.falsepattern.chunk.internal.mixin.helpers.LockHelper; -import lombok.val; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; import org.spongepowered.asm.mixin.Shadow; import net.minecraft.network.PacketBuffer; -import net.minecraft.network.play.server.S21PacketChunkData; import net.minecraft.network.play.server.S26PacketMapChunkBulk; -import java.io.IOException; import java.util.concurrent.Semaphore; -import java.util.zip.DataFormatException; -import java.util.zip.Inflater; @Mixin(S26PacketMapChunkBulk.class) public abstract class S26PacketMapChunkBulkMixin { - @Shadow(aliases = "field_149268_i", - remap = false) - private static byte[] inflaterBuffer; @Shadow(aliases = "field_149263_e", remap = false) private byte[] deflatedData; @@ -56,9 +47,6 @@ public abstract class S26PacketMapChunkBulkMixin { @Shadow(aliases = "field_149265_c", remap = false) private int[] subChunkMasks; - @Shadow(aliases = "field_149262_d", - remap = false) - private int[] subChunkMSBMasks; @Shadow(aliases = "field_149261_g", remap = false) private int deflatedSize; @@ -72,64 +60,6 @@ public abstract class S26PacketMapChunkBulkMixin { @Shadow(remap = false) protected abstract void deflate(); - /** - * @author FalsePattern - * @reason Replace functionality - */ - @Overwrite - public void readPacketData(PacketBuffer data) throws IOException { - short chunkCount = data.readShort(); - val sizes = new int[chunkCount]; - for (int i = 0; i < chunkCount; i++) { - sizes[i] = data.readInt(); - } - deflatedSize = data.readInt(); - skylight = data.readBoolean(); - xPositions = new int[chunkCount]; - zPositions = new int[chunkCount]; - subChunkMasks = new int[chunkCount]; - subChunkMSBMasks = new int[chunkCount]; - datas = new byte[chunkCount][]; - - while (!LockHelper.bufferLockS26PacketMapChunkBulk.tryLock()) { - Thread.yield(); - } - byte[] buf; - try { - if (inflaterBuffer.length < deflatedSize) { - inflaterBuffer = new byte[deflatedSize]; - } - - data.readBytes(inflaterBuffer, 0, deflatedSize); - buf = new byte[S21PacketChunkData.func_149275_c() * chunkCount]; - Inflater inflater = new Inflater(); - inflater.setInput(inflaterBuffer, 0, deflatedSize); - - try { - inflater.inflate(buf); - } catch (DataFormatException dataformatexception) { - throw new IOException("Bad compressed data format"); - } finally { - inflater.end(); - } - } finally { - LockHelper.bufferLockS26PacketMapChunkBulk.unlock(); - } - - int pos = 0; - - for (int i = 0; i < chunkCount; ++i) { - val size = sizes[i]; - xPositions[i] = data.readInt(); - zPositions[i] = data.readInt(); - subChunkMasks[i] = data.readUnsignedShort(); - - datas[i] = new byte[size]; - System.arraycopy(buf, pos, datas[i], 0, size); - pos += size; - } - } - /** * @author FalsePattern * @reason Replace functionality diff --git a/src/main/java/com/falsepattern/chunk/internal/mixin/plugin/Mixin.java b/src/main/java/com/falsepattern/chunk/internal/mixin/plugin/Mixin.java index 2e5f6c8..6d99bcd 100644 --- a/src/main/java/com/falsepattern/chunk/internal/mixin/plugin/Mixin.java +++ b/src/main/java/com/falsepattern/chunk/internal/mixin/plugin/Mixin.java @@ -44,18 +44,25 @@ @RequiredArgsConstructor public enum Mixin implements IMixins { // @formatter:off - Core(Phase.EARLY, - common("vanilla.PlayerInstanceMixin", - "vanilla.S21PacketChunkDataMixin", - "vanilla.S22PacketMultiBlockChangeMixin", - "vanilla.S23PacketBlockChangeMixin", - "vanilla.S26PacketMapChunkBulkMixin"), - client("vanilla.NetHandlerPlayClientMixin")), - + VanillaCore(Phase.EARLY, + () -> !hasThermos(), + common("vanilla.S26PacketMapChunkBulkMixin")), + + ThermosCore(Phase.EARLY, + () -> hasThermos(), + common("thermos.S26PacketMapChunkBulkMixin")), + + CommonCore(Phase.EARLY, + common("base.PlayerInstanceMixin", + "base.S21PacketChunkDataMixin", + "base.S22PacketMultiBlockChangeMixin", + "base.S23PacketBlockChangeMixin"), + client("vanilla.NetHandlerPlayClientMixin")), + //from: https://github.com/BallOfEnergy1/ChunkAPI/commit/4f5c0e60e04b6892d206f5f5d93cb20ba6b45608 Core_NoSpool(Phase.EARLY, avoid(Spool), - common("vanilla.AnvilChunkLoaderMixin"), + common("base.AnvilChunkLoaderMixin"), client("vanilla.ChunkMixin")), Compat_LookingGlass(Phase.LATE, @@ -110,4 +117,16 @@ private static SidedMixins server(@Language(value = "JAVA", return MixinHelper.server(mixins); } //endregion + + static boolean hasThermos() + { + try + { + Class.forName("thermos.Thermos"); + return true; + } + catch(ClassNotFoundException ignored) { + return false; + } + } }