55import com .github .retrooper .packetevents .event .PacketSendEvent ;
66import com .github .retrooper .packetevents .protocol .item .ItemStack ;
77import com .github .retrooper .packetevents .protocol .packettype .PacketType ;
8+ import com .github .retrooper .packetevents .protocol .packettype .PacketTypeCommon ;
89import com .github .retrooper .packetevents .protocol .world .chunk .BaseChunk ;
910import com .github .retrooper .packetevents .protocol .world .chunk .impl .v_1_18 .Chunk_v1_18 ;
1011import com .github .retrooper .packetevents .protocol .world .chunk .palette .DataPalette ;
1112import com .github .retrooper .packetevents .protocol .world .chunk .palette .ListPalette ;
13+ import com .github .retrooper .packetevents .protocol .world .chunk .palette .MapPalette ;
14+ import com .github .retrooper .packetevents .protocol .world .chunk .palette .SingletonPalette ;
1215import com .github .retrooper .packetevents .util .Vector3i ;
1316import com .github .retrooper .packetevents .wrapper .play .client .WrapperPlayClientPlayerBlockPlacement ;
14- import com .github .retrooper .packetevents .wrapper .play .server .WrapperPlayServerBlockAction ;
15- import com .github .retrooper .packetevents .wrapper .play .server .WrapperPlayServerBlockChange ;
16- import com .github .retrooper .packetevents .wrapper .play .server .WrapperPlayServerChunkData ;
17- import com .github .retrooper .packetevents .wrapper .play .server .WrapperPlayServerDeclareCommands ;
17+ import com .github .retrooper .packetevents .wrapper .play .server .*;
1818import io .github .retrooper .packetevents .util .SpigotConversionUtil ;
1919import net .minecraft .world .level .block .Block ;
2020import net .minecraft .world .level .block .Blocks ;
2323import parallelmc .parallelworlds .ParallelWorldsBootstrapper ;
2424import parallelmc .parallelworlds .registry .ParallelBlockRegistry ;
2525
26+ import java .util .HashMap ;
27+ import java .util .Map ;
2628import java .util .Optional ;
2729import java .util .logging .Level ;
2830import java .util .logging .Logger ;
@@ -54,50 +56,107 @@ public void onPacketReceive(PacketReceiveEvent event) {
5456
5557 @ Override
5658 public void onPacketSend (PacketSendEvent event ) {
57- if (event .getPacketType () == PacketType .Play .Server .CHUNK_DATA ) {
58- WrapperPlayServerChunkData packet = new WrapperPlayServerChunkData (event );
59-
60- for (BaseChunk c : packet .getColumn ().getChunks ()) {
61- for (int x = 0 ; x < 16 ; x ++) {
62- for (int y = 0 ; y < 16 ; y ++) {
63- for (int z = 0 ; z < 16 ; z ++) {
64- int id = c .getBlockId (x , y , z );
65- Integer replace_state ;
59+
60+ PacketTypeCommon type = event .getPacketType ();
61+
62+ if (type == PacketType .Play .Server .CHUNK_DATA || type == PacketType .Play .Server .MAP_CHUNK_BULK ) {
63+
64+ BaseChunk [][] chunks ;
65+ if (type == PacketType .Play .Server .CHUNK_DATA ) {
66+ WrapperPlayServerChunkData packet = new WrapperPlayServerChunkData (event );
67+
68+ chunks = new BaseChunk [][] {packet .getColumn ().getChunks ()};
69+ } else {
70+ WrapperPlayServerChunkDataBulk packet = new WrapperPlayServerChunkDataBulk (event );
71+ chunks = packet .getChunks ();
72+ }
73+
74+ for (BaseChunk [] arr : chunks ) {
75+ for (BaseChunk c : arr ) {
76+ for (int x = 0 ; x < 16 ; x ++) {
77+ for (int y = 0 ; y < 16 ; y ++) {
78+ for (int z = 0 ; z < 16 ; z ++) {
79+ int id = c .getBlockId (x , y , z );
80+ Integer replace_state ;
81+ if (id >= firstCustomId ) {
82+ //BlockState state = Block.BLOCK_STATE_REGISTRY.byId(id);
83+ //Logger.getGlobal().log(Level.WARNING, state.toString());
84+ replace_state = registry .getMappedState (id );
85+ if (replace_state == null ) {
86+ replace_state = defaultReplaceState ;
87+ Logger .getGlobal ().log (Level .WARNING , "Could not find mapping for id" + id );
88+ }
89+ } else if (id >= noteblockStart && id <= noteblockEnd ) {
90+ replace_state = noteblockStart ;
91+ } else {
92+ continue ;
93+ }
94+ c .set (x , y , z , replace_state );
95+
96+ event .markForReEncode (true );
97+ }
98+ }
99+ }
100+
101+ Chunk_v1_18 chunkV118 = (Chunk_v1_18 ) c ;
102+
103+ DataPalette palette = getPrivateField ("chunkData" , Chunk_v1_18 .class , chunkV118 , DataPalette .class );
104+ if (palette .palette instanceof ListPalette lp ) {
105+ int [] palatteData = getPrivateField ("data" , ListPalette .class , lp , int [].class );
106+
107+ for (int i = 0 ; i < palatteData .length ; i ++) {
108+ int id = palatteData [i ];
66109 if (id >= firstCustomId ) {
67- //BlockState state = Block.BLOCK_STATE_REGISTRY.byId(id);
68- //Logger.getGlobal().log(Level.WARNING, state.toString());
69- replace_state = registry .getMappedState (id );
110+ Integer replace_state = registry .getMappedState (id );
70111 if (replace_state == null ) {
71112 replace_state = defaultReplaceState ;
72113 Logger .getGlobal ().log (Level .WARNING , "Could not find mapping for id" + id );
73114 }
74- } else if (id >= noteblockStart && id <= noteblockEnd ) {
75- replace_state = noteblockStart ;
76- } else {
77- continue ;
115+ palatteData [i ] = replace_state ;
116+ event .markForReEncode (true );
117+ }
118+ }
119+ } else if (palette .palette instanceof SingletonPalette sp ) {
120+ int id = sp .idToState (0 );
121+
122+ if (id >= firstCustomId ) {
123+ Integer replace_state = registry .getMappedState (id );
124+ if (replace_state == null ) {
125+ replace_state = defaultReplaceState ;
126+ Logger .getGlobal ().log (Level .WARNING , "Could not find mapping for id" + id );
78127 }
79- c .set (x , y , z , replace_state );
128+ palette .palette = new SingletonPalette (replace_state );
129+ event .markForReEncode (true );
130+ }
131+ } else if (palette .palette instanceof MapPalette mp ) {
132+ int [] idToState = getPrivateField ("idToState" , MapPalette .class , mp , int [].class );
133+ HashMap <Object , Integer > stateToId = getPrivateField ("stateToId" , MapPalette .class , mp , HashMap .class );
80134
81- Chunk_v1_18 chunkV118 = (Chunk_v1_18 ) c ;
135+ // NOTE: This is not the most efficient, but it was an easy solution
136+ for (Object state : Map .copyOf (stateToId ).keySet ()) {
137+ Integer st = (Integer ) state ;
138+ int id = stateToId .get (state );
82139
83- DataPalette palette = getPrivateField ("chunkData" , Chunk_v1_18 .class , chunkV118 , DataPalette .class );
84- ListPalette lp = (ListPalette ) palette .palette ;
140+ if (st >= firstCustomId ) {
141+ Integer replace_state = registry .getMappedState (st );
142+ if (replace_state == null ) {
143+ replace_state = defaultReplaceState ;
144+ Logger .getGlobal ().log (Level .WARNING , "Could not find mapping for id" + st );
145+ }
85146
86- int [] palatteData = getPrivateField ("data" , ListPalette .class , lp , int [].class );
147+ stateToId .remove (state );
148+ stateToId .put (replace_state , id );
149+ idToState [id ] = replace_state ;
87150
88- for (int i = 0 ; i < palatteData .length ; i ++) {
89- if (palatteData [i ] >= firstCustomId ) {
90- palatteData [i ] = replace_state ;
91- }
151+ event .markForReEncode (true );
92152 }
153+ }
93154
94155
95- event .markForReEncode (true );
96- }
97156 }
98157 }
99158 }
100- } else if (event . getPacketType () == PacketType .Play .Server .BLOCK_CHANGE ) {
159+ } else if (type == PacketType .Play .Server .BLOCK_CHANGE ) {
101160 WrapperPlayServerBlockChange packet = new WrapperPlayServerBlockChange (event );
102161
103162 int id = packet .getBlockId ();
@@ -118,7 +177,7 @@ public void onPacketSend(PacketSendEvent event) {
118177 event .markForReEncode (true );
119178
120179 //Logger.getGlobal().log(Level.WARNING, String.valueOf(packet.getBlockId()));
121- } else if (event . getPacketType () == PacketType .Play .Server .BLOCK_ACTION ) {
180+ } else if (type == PacketType .Play .Server .BLOCK_ACTION ) {
122181 WrapperPlayServerBlockAction packet = new WrapperPlayServerBlockAction (event );
123182
124183 int id = packet .getBlockTypeId ();
@@ -138,16 +197,16 @@ public void onPacketSend(PacketSendEvent event) {
138197
139198 packet .setBlockTypeId (replace_state );
140199 event .markForReEncode (true );
141- } else if (event . getPacketType () == PacketType .Play .Server .DECLARE_COMMANDS ) {
200+ } else if (type == PacketType .Play .Server .DECLARE_COMMANDS ) {
142201 WrapperPlayServerDeclareCommands packet = new WrapperPlayServerDeclareCommands (event );
143202
144203 packet .getNodes ();
145204 }
146- // } else if (event.getPacketType() != PacketType.Play.Server.ENTITY_HEAD_LOOK &&
147- // event.getPacketType() != PacketType.Play.Server.ENTITY_RELATIVE_MOVE &&
148- // event.getPacketType() != PacketType.Play.Server.ENTITY_RELATIVE_MOVE_AND_ROTATION &&
149- // event.getPacketType() != PacketType.Play.Server.ENTITY_VELOCITY){
150- // Logger.getGlobal().log(Level.WARNING, event.getPacketType() .getName());
205+ // } else if (type != PacketType.Play.Server.ENTITY_HEAD_LOOK &&
206+ // type != PacketType.Play.Server.ENTITY_RELATIVE_MOVE &&
207+ // type != PacketType.Play.Server.ENTITY_RELATIVE_MOVE_AND_ROTATION &&
208+ // type != PacketType.Play.Server.ENTITY_VELOCITY){
209+ // Logger.getGlobal().log(Level.WARNING, type .getName());
151210// }
152211 }
153212
0 commit comments