Skip to content

Commit 6aecb95

Browse files
committed
Update palette always
1 parent 95a0f31 commit 6aecb95

1 file changed

Lines changed: 13 additions & 7 deletions

File tree

core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaSectionBlocksUpdateTranslator.java

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@
3838
import org.geysermc.geyser.translator.protocol.PacketTranslator;
3939
import org.geysermc.geyser.translator.protocol.Translator;
4040

41+
import java.util.BitSet;
42+
4143
@Translator(packet = ClientboundSectionBlocksUpdatePacket.class)
4244
public class JavaSectionBlocksUpdateTranslator extends PacketTranslator<ClientboundSectionBlocksUpdatePacket> {
4345

@@ -51,25 +53,33 @@ public void translate(GeyserSession session, ClientboundSectionBlocksUpdatePacke
5153
}
5254
}
5355

56+
BitSet waterlogged = BlockRegistries.WATERLOGGED.get();
57+
5458
UpdateSubChunkBlocksPacket updateSubChunkBlocksPacket = new UpdateSubChunkBlocksPacket();
5559

5660
for (BlockChangeEntry entry : packet.getEntries()) {
5761
int oldBlock = palette != null
5862
? palette.get(entry.getPosition().getX() & 0xF, entry.getPosition().getY() & 0xF, entry.getPosition().getZ() & 0xF)
5963
: session.getGeyser().getWorldManager().getBlockAt(session, entry.getPosition());
6064
if (entry.getBlock() == oldBlock) {
65+
// Skip unchanged blocks which may occur with older versions of Minecraft
6166
continue;
6267
}
6368

69+
if (palette != null) {
70+
palette.set(entry.getPosition().getX() & 0xF, entry.getPosition().getY() & 0xF, entry.getPosition().getZ() & 0xF, entry.getBlock());
71+
}
72+
6473
BlockState blockState = BlockState.of(entry.getBlock());
6574
if (blockState.is(Blocks.AIR)) {
6675
ItemFrameEntity itemFrameEntity = ItemFrameEntity.getItemFrameEntity(session, entry.getPosition());
67-
if (itemFrameEntity != null) {
76+
if (itemFrameEntity != null) { // Item frame is still present and no block overrides that; refresh it
6877
itemFrameEntity.updateBlock(true);
6978
continue;
7079
}
7180
}
7281
if (!(blockState.block() instanceof SkullBlock)) {
82+
// Skull is gone
7383
session.getSkullCache().removeSkull(entry.getPosition());
7484
}
7585

@@ -81,8 +91,8 @@ public void translate(GeyserSession session, ClientboundSectionBlocksUpdatePacke
8191
org.cloudburstmc.protocol.bedrock.data.BlockChangeEntry.MessageType.NONE
8292
));
8393

84-
boolean isWaterlogged = BlockRegistries.WATERLOGGED.get().get(entry.getBlock());
85-
if (BlockRegistries.WATERLOGGED.get().get(oldBlock) != isWaterlogged) {
94+
boolean isWaterlogged = waterlogged.get(entry.getBlock());
95+
if (waterlogged.get(oldBlock) != isWaterlogged) {
8696
updateSubChunkBlocksPacket.getExtraBlocks().add(new org.cloudburstmc.protocol.bedrock.data.BlockChangeEntry(
8797
entry.getPosition(),
8898
isWaterlogged ? session.getBlockMappings().getBedrockWater() : session.getBlockMappings().getBedrockAir(),
@@ -91,10 +101,6 @@ public void translate(GeyserSession session, ClientboundSectionBlocksUpdatePacke
91101
org.cloudburstmc.protocol.bedrock.data.BlockChangeEntry.MessageType.NONE
92102
));
93103
}
94-
95-
if (palette != null) {
96-
palette.set(entry.getPosition().getX() & 0xF, entry.getPosition().getY() & 0xF, entry.getPosition().getZ() & 0xF, entry.getBlock());
97-
}
98104
}
99105

100106
session.sendUpstreamPacket(updateSubChunkBlocksPacket);

0 commit comments

Comments
 (0)