Skip to content

Commit 8079d9a

Browse files
Fix block packet for other palette types
1 parent 8f5160c commit 8079d9a

File tree

1 file changed

+98
-39
lines changed

1 file changed

+98
-39
lines changed

parallelworlds/src/main/java/parallelmc/parallelworlds/events/BlockPacketListener.java

Lines changed: 98 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,16 @@
55
import com.github.retrooper.packetevents.event.PacketSendEvent;
66
import com.github.retrooper.packetevents.protocol.item.ItemStack;
77
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
8+
import com.github.retrooper.packetevents.protocol.packettype.PacketTypeCommon;
89
import com.github.retrooper.packetevents.protocol.world.chunk.BaseChunk;
910
import com.github.retrooper.packetevents.protocol.world.chunk.impl.v_1_18.Chunk_v1_18;
1011
import com.github.retrooper.packetevents.protocol.world.chunk.palette.DataPalette;
1112
import 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;
1215
import com.github.retrooper.packetevents.util.Vector3i;
1316
import 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.*;
1818
import io.github.retrooper.packetevents.util.SpigotConversionUtil;
1919
import net.minecraft.world.level.block.Block;
2020
import net.minecraft.world.level.block.Blocks;
@@ -23,6 +23,8 @@
2323
import parallelmc.parallelworlds.ParallelWorldsBootstrapper;
2424
import parallelmc.parallelworlds.registry.ParallelBlockRegistry;
2525

26+
import java.util.HashMap;
27+
import java.util.Map;
2628
import java.util.Optional;
2729
import java.util.logging.Level;
2830
import 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

Comments
 (0)