Skip to content

Commit 40b8e34

Browse files
committed
fix bad packet size calculation.
1 parent 90f31a4 commit 40b8e34

File tree

2 files changed

+22
-12
lines changed

2 files changed

+22
-12
lines changed

src/main/java/com/falsepattern/chunk/api/ChunkDataManager.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ interface PacketDataManager extends ChunkDataManager {
5959
* @return The maximum amount of bytes your data can take up in a packet.
6060
*
6161
* @implNote This is used to determine the size of the packet compression/decompression buffer.
62+
* Only called ONCE, during registration!
6263
*/
6364
@StableAPI.Expose
6465
@Contract(pure = true)

src/main/java/com/falsepattern/chunk/internal/ChunkDataRegistryImpl.java

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
package com.falsepattern.chunk.internal;
99

1010
import com.falsepattern.chunk.api.ChunkDataManager;
11+
import lombok.Data;
1112
import lombok.val;
1213
import lombok.var;
1314

@@ -28,12 +29,18 @@
2829

2930
public class ChunkDataRegistryImpl {
3031
private static final Set<String> managers = new HashSet<>();
31-
private static final Map<String, ChunkDataManager.PacketDataManager> packetManagers = new HashMap<>();
32+
private static final Map<String, PacketManagerInfo> packetManagers = new HashMap<>();
3233
private static final Map<String, ChunkDataManager.ChunkNBTDataManager> chunkNBTManagers = new HashMap<>();
3334
private static final Map<String, ChunkDataManager.SectionNBTDataManager> sectionNBTManagers = new HashMap<>();
3435
private static final Set<String> disabledManagers = new HashSet<>();
3536
private static int maxPacketSize = 4;
3637

38+
@Data
39+
private static class PacketManagerInfo {
40+
public final int maxPacketSize;
41+
public final ChunkDataManager.PacketDataManager manager;
42+
}
43+
3744
public static void registerDataManager(ChunkDataManager manager)
3845
throws IllegalStateException, IllegalArgumentException {
3946
if (Loader.instance().getLoaderState() != LoaderState.INITIALIZATION) {
@@ -53,9 +60,9 @@ public static void registerDataManager(ChunkDataManager manager)
5360
managers.add(id);
5461
if (manager instanceof ChunkDataManager.PacketDataManager) {
5562
val packetManager = (ChunkDataManager.PacketDataManager) manager;
56-
maxPacketSize += 4 + id.getBytes(StandardCharsets.UTF_8).length;
57-
maxPacketSize += packetManager.maxPacketSize();
58-
packetManagers.put(id, packetManager);
63+
val maxSize = packetManager.maxPacketSize();
64+
maxPacketSize += 4 + id.getBytes(StandardCharsets.UTF_8).length + 4 + maxSize;
65+
packetManagers.put(id, new PacketManagerInfo(maxSize, packetManager));
5966
}
6067
if (manager instanceof ChunkDataManager.ChunkNBTDataManager) {
6168
chunkNBTManagers.put(id, (ChunkDataManager.ChunkNBTDataManager) manager);
@@ -78,8 +85,7 @@ public static void disableDataManager(String domain, String id) {
7885
//Clear the maps
7986
if (packetManagers.containsKey(manager)) {
8087
val removed = packetManagers.remove(manager);
81-
maxPacketSize -= 4 + manager.getBytes(StandardCharsets.UTF_8).length;
82-
maxPacketSize -= removed.maxPacketSize();
88+
maxPacketSize -= 4 + id.getBytes(StandardCharsets.UTF_8).length + 4 + removed.maxPacketSize;
8389
}
8490
chunkNBTManagers.remove(manager);
8591
sectionNBTManagers.remove(manager);
@@ -113,15 +119,18 @@ public static void readFromBuffer(Chunk chunk, int ebsMask, boolean forceUpdate,
113119
for (int i = 0; i < count; i++) {
114120
val id = readString(buf);
115121
val length = buf.getInt();
116-
val manager = packetManagers.get(id);
117-
if (manager == null) {
122+
val managerInfo = packetManagers.get(id);
123+
if (managerInfo == null) {
118124
Common.LOG.error("Received data for unknown PacketDataManager " + id + ". Skipping.");
119125
buf.position(buf.position() + length);
120126
continue;
121127
}
128+
if (length > managerInfo.maxPacketSize) {
129+
Common.LOG.error("Received packet larger than max size for PacketDataManager " + id + "! Continuing anyways, things might break!");
130+
}
122131
int start = buf.position();
123132
val slice = createSlice(buf, start, length);
124-
manager.readFromBuffer(chunk, ebsMask, forceUpdate, slice);
133+
managerInfo.manager.readFromBuffer(chunk, ebsMask, forceUpdate, slice);
125134
buf.position(start + length);
126135
}
127136
}
@@ -132,11 +141,11 @@ public static int writeToBuffer(Chunk chunk, int ebsMask, boolean forceUpdate, b
132141
buf.putInt(packetManagers.size());
133142
for (val pair : packetManagers.entrySet()) {
134143
val id = pair.getKey();
135-
val manager = pair.getValue();
144+
val managerInfo = pair.getValue();
136145
writeString(buf, id);
137146
int start = buf.position() + 4;
138-
val slice = createSlice(buf, start, manager.maxPacketSize());
139-
manager.writeToBuffer(chunk, ebsMask, forceUpdate, slice);
147+
val slice = createSlice(buf, start, managerInfo.maxPacketSize);
148+
managerInfo.manager.writeToBuffer(chunk, ebsMask, forceUpdate, slice);
140149
int length = slice.position();
141150
buf.putInt(length);
142151
buf.position(start + length);

0 commit comments

Comments
 (0)