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;
+ }
+ }
}