2222
2323package com .falsepattern .chunk .internal .mixin .mixins .common .vanilla ;
2424
25+ import com .falsepattern .chunk .internal .mixin .helpers .LockHelper ;
26+ import lombok .val ;
2527import org .spongepowered .asm .mixin .Mixin ;
2628import org .spongepowered .asm .mixin .Overwrite ;
2729import org .spongepowered .asm .mixin .Shadow ;
2830
2931import net .minecraft .network .PacketBuffer ;
32+ import net .minecraft .network .play .server .S21PacketChunkData ;
3033import net .minecraft .network .play .server .S26PacketMapChunkBulk ;
3134
35+ import java .io .IOException ;
3236import java .util .concurrent .Semaphore ;
37+ import java .util .zip .DataFormatException ;
38+ import java .util .zip .Inflater ;
3339
3440@ Mixin (S26PacketMapChunkBulk .class )
3541public 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