Skip to content

Commit a3165a0

Browse files
committed
fix: crash when joining server due to buggy thermos compat patch
2 parents 220755b + 3c4ffe5 commit a3165a0

3 files changed

Lines changed: 141 additions & 123 deletions

File tree

src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/base/S26PacketMapChunkBulkMixin.java

Lines changed: 0 additions & 123 deletions
This file was deleted.

src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/thermos/S26PacketMapChunkBulkMixin.java

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,26 @@
2323

2424
package com.falsepattern.chunk.internal.mixin.mixins.common.thermos;
2525

26+
import com.falsepattern.chunk.internal.mixin.helpers.LockHelper;
27+
import lombok.val;
2628
import org.spongepowered.asm.mixin.Mixin;
2729
import org.spongepowered.asm.mixin.Overwrite;
2830
import org.spongepowered.asm.mixin.Shadow;
2931

3032
import net.minecraft.network.PacketBuffer;
33+
import net.minecraft.network.play.server.S21PacketChunkData;
3134
import net.minecraft.network.play.server.S26PacketMapChunkBulk;
3235

36+
import java.io.IOException;
37+
import java.util.zip.DataFormatException;
38+
import java.util.zip.Inflater;
39+
3340

3441
@Mixin(S26PacketMapChunkBulk.class)
3542
public abstract class S26PacketMapChunkBulkMixin {
43+
@Shadow(aliases = "field_149268_i",
44+
remap = false)
45+
private byte[] inflaterBuffer;
3646
@Shadow(aliases = "field_149263_e",
3747
remap = false)
3848
private byte[] deflatedData;
@@ -45,6 +55,9 @@ public abstract class S26PacketMapChunkBulkMixin {
4555
@Shadow(aliases = "field_149265_c",
4656
remap = false)
4757
private int[] subChunkMasks;
58+
@Shadow(aliases = "field_149262_d",
59+
remap = false)
60+
private int[] subChunkMSBMasks;
4861
@Shadow(aliases = "field_149261_g",
4962
remap = false)
5063
private int deflatedSize;
@@ -57,6 +70,64 @@ public abstract class S26PacketMapChunkBulkMixin {
5770

5871
@Shadow(remap = false)
5972
protected abstract void compress();
73+
74+
/**
75+
* @author FalsePattern
76+
* @reason Replace functionality
77+
*/
78+
@Overwrite
79+
public void readPacketData(PacketBuffer data) throws IOException {
80+
short chunkCount = data.readShort();
81+
val sizes = new int[chunkCount];
82+
for (int i = 0; i < chunkCount; i++) {
83+
sizes[i] = data.readInt();
84+
}
85+
deflatedSize = data.readInt();
86+
skylight = data.readBoolean();
87+
xPositions = new int[chunkCount];
88+
zPositions = new int[chunkCount];
89+
subChunkMasks = new int[chunkCount];
90+
subChunkMSBMasks = new int[chunkCount];
91+
datas = new byte[chunkCount][];
92+
93+
while (!LockHelper.bufferLockS26PacketMapChunkBulk.tryLock()) {
94+
Thread.yield();
95+
}
96+
byte[] buf;
97+
try {
98+
if (inflaterBuffer.length < deflatedSize) {
99+
inflaterBuffer = new byte[deflatedSize];
100+
}
101+
102+
data.readBytes(inflaterBuffer, 0, deflatedSize);
103+
buf = new byte[S21PacketChunkData.func_149275_c() * chunkCount];
104+
Inflater inflater = new Inflater();
105+
inflater.setInput(inflaterBuffer, 0, deflatedSize);
106+
107+
try {
108+
inflater.inflate(buf);
109+
} catch (DataFormatException dataformatexception) {
110+
throw new IOException("Bad compressed data format");
111+
} finally {
112+
inflater.end();
113+
}
114+
} finally {
115+
LockHelper.bufferLockS26PacketMapChunkBulk.unlock();
116+
}
117+
118+
int pos = 0;
119+
120+
for (int i = 0; i < chunkCount; ++i) {
121+
val size = sizes[i];
122+
xPositions[i] = data.readInt();
123+
zPositions[i] = data.readInt();
124+
subChunkMasks[i] = data.readUnsignedShort();
125+
126+
datas[i] = new byte[size];
127+
System.arraycopy(buf, pos, datas[i], 0, size);
128+
pos += size;
129+
}
130+
}
60131

61132
/**
62133
* @author FalsePattern

src/main/java/com/falsepattern/chunk/internal/mixin/mixins/common/vanilla/S26PacketMapChunkBulkMixin.java

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,26 @@
2222

2323
package com.falsepattern.chunk.internal.mixin.mixins.common.vanilla;
2424

25+
import com.falsepattern.chunk.internal.mixin.helpers.LockHelper;
26+
import lombok.val;
2527
import org.spongepowered.asm.mixin.Mixin;
2628
import org.spongepowered.asm.mixin.Overwrite;
2729
import org.spongepowered.asm.mixin.Shadow;
2830

2931
import net.minecraft.network.PacketBuffer;
32+
import net.minecraft.network.play.server.S21PacketChunkData;
3033
import net.minecraft.network.play.server.S26PacketMapChunkBulk;
3134

35+
import java.io.IOException;
3236
import java.util.concurrent.Semaphore;
37+
import java.util.zip.DataFormatException;
38+
import java.util.zip.Inflater;
3339

3440
@Mixin(S26PacketMapChunkBulk.class)
3541
public abstract class S26PacketMapChunkBulkMixin {
42+
@Shadow(aliases = "field_149268_i",
43+
remap = false)
44+
private static byte[] inflaterBuffer;
3645
@Shadow(aliases = "field_149263_e",
3746
remap = false)
3847
private byte[] deflatedData;
@@ -47,6 +56,9 @@ public abstract class S26PacketMapChunkBulkMixin {
4756
@Shadow(aliases = "field_149265_c",
4857
remap = false)
4958
private int[] subChunkMasks;
59+
@Shadow(aliases = "field_149262_d",
60+
remap = false)
61+
private int[] subChunkMSBMasks;
5062
@Shadow(aliases = "field_149261_g",
5163
remap = false)
5264
private int deflatedSize;
@@ -60,6 +72,64 @@ public abstract class S26PacketMapChunkBulkMixin {
6072
@Shadow(remap = false)
6173
protected abstract void deflate();
6274

75+
/**
76+
* @author FalsePattern
77+
* @reason Replace functionality
78+
*/
79+
@Overwrite
80+
public void readPacketData(PacketBuffer data) throws IOException {
81+
short chunkCount = data.readShort();
82+
val sizes = new int[chunkCount];
83+
for (int i = 0; i < chunkCount; i++) {
84+
sizes[i] = data.readInt();
85+
}
86+
deflatedSize = data.readInt();
87+
skylight = data.readBoolean();
88+
xPositions = new int[chunkCount];
89+
zPositions = new int[chunkCount];
90+
subChunkMasks = new int[chunkCount];
91+
subChunkMSBMasks = new int[chunkCount];
92+
datas = new byte[chunkCount][];
93+
94+
while (!LockHelper.bufferLockS26PacketMapChunkBulk.tryLock()) {
95+
Thread.yield();
96+
}
97+
byte[] buf;
98+
try {
99+
if (inflaterBuffer.length < deflatedSize) {
100+
inflaterBuffer = new byte[deflatedSize];
101+
}
102+
103+
data.readBytes(inflaterBuffer, 0, deflatedSize);
104+
buf = new byte[S21PacketChunkData.func_149275_c() * chunkCount];
105+
Inflater inflater = new Inflater();
106+
inflater.setInput(inflaterBuffer, 0, deflatedSize);
107+
108+
try {
109+
inflater.inflate(buf);
110+
} catch (DataFormatException dataformatexception) {
111+
throw new IOException("Bad compressed data format");
112+
} finally {
113+
inflater.end();
114+
}
115+
} finally {
116+
LockHelper.bufferLockS26PacketMapChunkBulk.unlock();
117+
}
118+
119+
int pos = 0;
120+
121+
for (int i = 0; i < chunkCount; ++i) {
122+
val size = sizes[i];
123+
xPositions[i] = data.readInt();
124+
zPositions[i] = data.readInt();
125+
subChunkMasks[i] = data.readUnsignedShort();
126+
127+
datas[i] = new byte[size];
128+
System.arraycopy(buf, pos, datas[i], 0, size);
129+
pos += size;
130+
}
131+
}
132+
63133
/**
64134
* @author FalsePattern
65135
* @reason Replace functionality

0 commit comments

Comments
 (0)