8
8
package com .falsepattern .chunk .internal ;
9
9
10
10
import com .falsepattern .chunk .api .ChunkDataManager ;
11
+ import lombok .Data ;
11
12
import lombok .val ;
12
13
import lombok .var ;
13
14
28
29
29
30
public class ChunkDataRegistryImpl {
30
31
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 <>();
32
33
private static final Map <String , ChunkDataManager .ChunkNBTDataManager > chunkNBTManagers = new HashMap <>();
33
34
private static final Map <String , ChunkDataManager .SectionNBTDataManager > sectionNBTManagers = new HashMap <>();
34
35
private static final Set <String > disabledManagers = new HashSet <>();
35
36
private static int maxPacketSize = 4 ;
36
37
38
+ @ Data
39
+ private static class PacketManagerInfo {
40
+ public final int maxPacketSize ;
41
+ public final ChunkDataManager .PacketDataManager manager ;
42
+ }
43
+
37
44
public static void registerDataManager (ChunkDataManager manager )
38
45
throws IllegalStateException , IllegalArgumentException {
39
46
if (Loader .instance ().getLoaderState () != LoaderState .INITIALIZATION ) {
@@ -53,9 +60,9 @@ public static void registerDataManager(ChunkDataManager manager)
53
60
managers .add (id );
54
61
if (manager instanceof ChunkDataManager .PacketDataManager ) {
55
62
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 ) );
59
66
}
60
67
if (manager instanceof ChunkDataManager .ChunkNBTDataManager ) {
61
68
chunkNBTManagers .put (id , (ChunkDataManager .ChunkNBTDataManager ) manager );
@@ -78,8 +85,7 @@ public static void disableDataManager(String domain, String id) {
78
85
//Clear the maps
79
86
if (packetManagers .containsKey (manager )) {
80
87
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 ;
83
89
}
84
90
chunkNBTManagers .remove (manager );
85
91
sectionNBTManagers .remove (manager );
@@ -113,15 +119,18 @@ public static void readFromBuffer(Chunk chunk, int ebsMask, boolean forceUpdate,
113
119
for (int i = 0 ; i < count ; i ++) {
114
120
val id = readString (buf );
115
121
val length = buf .getInt ();
116
- val manager = packetManagers .get (id );
117
- if (manager == null ) {
122
+ val managerInfo = packetManagers .get (id );
123
+ if (managerInfo == null ) {
118
124
Common .LOG .error ("Received data for unknown PacketDataManager " + id + ". Skipping." );
119
125
buf .position (buf .position () + length );
120
126
continue ;
121
127
}
128
+ if (length > managerInfo .maxPacketSize ) {
129
+ Common .LOG .error ("Received packet larger than max size for PacketDataManager " + id + "! Continuing anyways, things might break!" );
130
+ }
122
131
int start = buf .position ();
123
132
val slice = createSlice (buf , start , length );
124
- manager .readFromBuffer (chunk , ebsMask , forceUpdate , slice );
133
+ managerInfo . manager .readFromBuffer (chunk , ebsMask , forceUpdate , slice );
125
134
buf .position (start + length );
126
135
}
127
136
}
@@ -132,11 +141,11 @@ public static int writeToBuffer(Chunk chunk, int ebsMask, boolean forceUpdate, b
132
141
buf .putInt (packetManagers .size ());
133
142
for (val pair : packetManagers .entrySet ()) {
134
143
val id = pair .getKey ();
135
- val manager = pair .getValue ();
144
+ val managerInfo = pair .getValue ();
136
145
writeString (buf , id );
137
146
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 );
140
149
int length = slice .position ();
141
150
buf .putInt (length );
142
151
buf .position (start + length );
0 commit comments