3838import org .geysermc .geyser .translator .protocol .PacketTranslator ;
3939import org .geysermc .geyser .translator .protocol .Translator ;
4040
41+ import java .util .BitSet ;
42+
4143@ Translator (packet = ClientboundSectionBlocksUpdatePacket .class )
4244public 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