99import it .feargames .tileculling .occlusionculling .BlockChangeListener ;
1010import it .unimi .dsi .fastutil .ints .IntOpenHashSet ;
1111import it .unimi .dsi .fastutil .ints .IntSet ;
12- import it .unimi .dsi .fastutil .longs .LongSet ;
1312import net .minecraft .server .v1_16_R3 .PacketDataSerializer ;
1413import org .bukkit .Bukkit ;
1514import org .bukkit .Material ;
@@ -56,7 +55,7 @@ public void onPacketSending(PacketEvent event) {
5655 Player player = event .getPlayer ();
5756 PacketContainer packet = event .getPacket ();
5857
59- if (!player .getName ().equals ("sgdc3" )) {
58+ if (!player .getName ().equals ("sgdc3" ) && ! player . getName (). equals ( "tr7zw" ) ) {
6059 return ;
6160 }
6261
@@ -69,12 +68,7 @@ public void onPacketSending(PacketEvent event) {
6968 return ;
7069 }
7170
72- //boolean full = packet.getBooleans().read(0);
73- int bitMask = packet .getIntegers ().read (2 ); // 65535 when chunk is marked as full?
74- //NbtCompound heightmaps = (NbtCompound) packet.getNbtModifier().read(0);
75- //if (full) {
76- // int[] biomes = packet.getIntegerArrays().read(0);
77- //}
71+ int bitMask = packet .getIntegers ().read (2 );
7872 byte [] chunkData = packet .getByteArrays ().read (0 );
7973
8074 IntSet removedBlocks = null ;
@@ -85,6 +79,8 @@ public void onPacketSending(PacketEvent event) {
8579 if (!type .equals (Material .CHEST .getKey ().toString ())) {
8680 continue ;
8781 }
82+
83+ iterator .remove ();
8884 if (removedBlocks == null ) {
8985 removedBlocks = new IntOpenHashSet ();
9086 }
@@ -96,6 +92,7 @@ public void onPacketSending(PacketEvent event) {
9692 byte z = (byte ) (compound .getInteger ("z" ) & 0xF );
9793
9894 int key = section + (x << 8 ) + (y << 16 ) + (z << 24 );
95+ removedBlocks .add (key );
9996
10097 getLogger ().info (section + ": " + x + "," + y + "," + z + " => " + key );
10198 }
@@ -106,63 +103,106 @@ public void onPacketSending(PacketEvent event) {
106103 getLogger ().warning (chunkX + "," + chunkZ + ": Changes detected." );
107104 packet .getListNbtModifier ().write (0 , tileEntities );
108105
109- PacketDataSerializer serializer = new PacketDataSerializer (Unpooled .wrappedBuffer (chunkData ));
106+ PacketDataSerializer reader = new PacketDataSerializer (Unpooled .wrappedBuffer (chunkData ));
107+ PacketDataSerializer writer = new PacketDataSerializer (Unpooled .buffer ());
110108 for (int sectionY = 0 ; sectionY < 16 ; sectionY ++) {
111109 if ((bitMask & (1 << sectionY )) == 0 ) {
112110 continue ;
113111 }
114112
115- short nonAirBlockCount = serializer .readShort ();
116- byte bitsPerBlock = serializer .readByte ();
117- if (bitsPerBlock < 4 ) {
118- //bitsPerBlock = 4;
113+ short nonAirBlockCount = reader .readShort ();
114+ writer .writeShort (nonAirBlockCount );
115+
116+ byte bitsPerBlock = reader .readByte ();
117+ if (bitsPerBlock < 4 || bitsPerBlock > 64 ) {
119118 throw new RuntimeException ("Invalid bits per block! (" + bitsPerBlock + ")" );
120119 }
121120 boolean direct = bitsPerBlock > 8 ;
122- int indirectAirId = -1 ;
121+ writer .writeByte (bitsPerBlock );
122+
123+ int palletteAirIndex ;
124+ if (direct ) {
125+ palletteAirIndex = 0 ; // Global index
126+ } else {
127+ palletteAirIndex = -1 ;
128+
129+ int palletLength = reader .readVarInt ();
130+ int [] pallette = new int [palletLength ];
123131
124- if (!direct ) {
125- getLogger ().info ("Indirect!" );
126- int palletLength = serializer .readVarInt ();
127132 for (int i = 0 ; i < palletLength ; i ++) {
128- int globalId = serializer .readVarInt ();
129- //getLogger().info(i + " => " + globalId);
133+ int globalId = reader .readVarInt ();
134+ pallette [i ] = globalId ;
135+
130136 if (globalId == 0 ) {
131- indirectAirId = i ;
132- break ;
137+ palletteAirIndex = i ;
133138 }
134139 }
135- if (indirectAirId == -1 ) {
136- getLogger ().severe ("Missing air in pallette!" );
137- continue ;
140+
141+ if (palletteAirIndex == -1 ) {
142+ // Expand
143+ int [] newPallette = new int [palletLength + 1 ];
144+ System .arraycopy (pallette , 0 , newPallette , 0 , palletLength );
145+ pallette = newPallette ;
146+ palletLength ++;
147+ // Add mapping to pallet
148+ pallette [palletLength - 1 ] = 0 ;
149+ palletteAirIndex = palletLength - 1 ;
150+ }
151+
152+ writer .d (palletLength );
153+ for (int i = 0 ; i < palletLength ; i ++) {
154+ writer .d (pallette [i ]);
138155 }
139156 }
140157
141- int dataArrayLength = serializer .readVarInt ();
158+ int dataArrayLength = reader .readVarInt ();
159+ writer .b (dataArrayLength );
160+
142161 long [] dataArray = new long [dataArrayLength ];
143162 for (int i = 0 ; i < dataArrayLength ; i ++) {
144- dataArray [i ] = serializer .readLong ();
163+ dataArray [i ] = reader .readLong ();
145164 }
146165
147166 int individualValueMask = ((1 << bitsPerBlock ) - 1 );
148167 byte blocksPerLong = (byte ) (64 / bitsPerBlock );
149168
150- //StringBuffer buffer = new StringBuffer();
151169 for (byte y = 0 ; y < 16 ; y ++) {
152170 for (byte z = 0 ; z < 16 ; z ++) {
153171 for (byte x = 0 ; x < 16 ; x ++) {
172+ int key = sectionY + (x << 8 ) + (y << 16 ) + (z << 24 );
173+ if (!removedBlocks .contains (key )) {
174+ continue ;
175+ }
176+
154177 short blockNumber = (short ) ((((y * 16 ) + z ) * 16 ) + x );
155178 short longIndex = (short ) (blockNumber / blocksPerLong );
156179 byte startOffset = (byte ) (blockNumber % blocksPerLong );
157180
181+ if (longIndex >= dataArrayLength ) {
182+ getLogger ().severe ("Tried to access section data at index " + longIndex + " but length was " + dataArrayLength );
183+ continue ;
184+ }
185+
158186 int data = (int ) (dataArray [longIndex ] >> startOffset );
159187 data &= individualValueMask ;
160- //buffer.append(x).append(',').append(y).append(',').append(z).append(':').append(data).append(';');
188+
189+ // TODO: replace data
161190 }
162191 }
163192 }
164- //getLogger().warning(buffer.toString());
193+
194+ for (int i = 0 ; i < dataArrayLength ; i ++) {
195+ writer .writeLong (dataArray [i ]);
196+ }
197+
198+ // Copy light data
199+ writer .writeBytes (reader );
165200 }
201+
202+ // Replace data
203+ chunkData = writer .array ();
204+ packet .getByteArrays ().write (0 , chunkData );
205+
166206 getLogger ().warning (chunkX + "," + chunkZ + ": Processed." );
167207 } catch (Throwable t ) {
168208 getLogger ().log (Level .SEVERE , "WTF" , t );
0 commit comments