Skip to content

Commit e7be80c

Browse files
committed
Remove predictions of invalidated blocks
1 parent 95a0f31 commit e7be80c

3 files changed

Lines changed: 21 additions & 15 deletions

File tree

core/src/main/java/org/geysermc/geyser/session/cache/WorldCache.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -180,9 +180,7 @@ public void markPositionInSequence(Vector3i position) {
180180
}
181181

182182
public void updateServerCorrectBlockState(Vector3i position, int blockState) {
183-
if (!this.unverifiedPredictions.isEmpty()) {
184-
this.unverifiedPredictions.removeInt(position);
185-
}
183+
this.unverifiedPredictions.removeInt(position);
186184

187185
// Hack to avoid looking up blockstates for the currently broken position each tick
188186
Vector3i clientBreakPos = session.getBlockBreakHandler().getCurrentBlockPos();
@@ -193,11 +191,11 @@ public void updateServerCorrectBlockState(Vector3i position, int blockState) {
193191
ChunkUtils.updateBlock(session, blockState, position);
194192
}
195193

196-
public void endPredictionsUpTo(int sequence) {
197-
if (this.unverifiedPredictions.isEmpty()) {
198-
return;
199-
}
194+
public void removePrediction(Vector3i position) {
195+
this.unverifiedPredictions.removeInt(position);
196+
}
200197

198+
public void endPredictionsUpTo(int sequence) {
201199
Iterator<Object2IntMap.Entry<Vector3i>> it = Object2IntMaps.fastIterator(this.unverifiedPredictions);
202200
while (it.hasNext()) {
203201
Object2IntMap.Entry<Vector3i> entry = it.next();

core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaRecipeBookAddTranslator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
import java.util.ArrayList;
4848
import java.util.List;
4949

50-
@Translator(packet = ClientboundRecipeBookAddPacket.class)
50+
//@Translator(packet = ClientboundRecipeBookAddPacket.class)
5151
public class JavaRecipeBookAddTranslator extends PacketTranslator<ClientboundRecipeBookAddPacket> {
5252

5353
@Override

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

Lines changed: 15 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,35 @@ 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()) {
61+
session.getWorldCache().removePrediction(entry.getPosition());
62+
5763
int oldBlock = palette != null
5864
? palette.get(entry.getPosition().getX() & 0xF, entry.getPosition().getY() & 0xF, entry.getPosition().getZ() & 0xF)
5965
: session.getGeyser().getWorldManager().getBlockAt(session, entry.getPosition());
6066
if (entry.getBlock() == oldBlock) {
67+
// Skip unchanged blocks which may occur with older versions of Minecraft
6168
continue;
6269
}
6370

71+
if (palette != null) {
72+
palette.set(entry.getPosition().getX() & 0xF, entry.getPosition().getY() & 0xF, entry.getPosition().getZ() & 0xF, entry.getBlock());
73+
}
74+
6475
BlockState blockState = BlockState.of(entry.getBlock());
6576
if (blockState.is(Blocks.AIR)) {
6677
ItemFrameEntity itemFrameEntity = ItemFrameEntity.getItemFrameEntity(session, entry.getPosition());
67-
if (itemFrameEntity != null) {
78+
if (itemFrameEntity != null) { // Item frame is still present and no block overrides that; refresh it
6879
itemFrameEntity.updateBlock(true);
6980
continue;
7081
}
7182
}
7283
if (!(blockState.block() instanceof SkullBlock)) {
84+
// Skull is gone
7385
session.getSkullCache().removeSkull(entry.getPosition());
7486
}
7587

@@ -81,8 +93,8 @@ public void translate(GeyserSession session, ClientboundSectionBlocksUpdatePacke
8193
org.cloudburstmc.protocol.bedrock.data.BlockChangeEntry.MessageType.NONE
8294
));
8395

84-
boolean isWaterlogged = BlockRegistries.WATERLOGGED.get().get(entry.getBlock());
85-
if (BlockRegistries.WATERLOGGED.get().get(oldBlock) != isWaterlogged) {
96+
boolean isWaterlogged = waterlogged.get(entry.getBlock());
97+
if (waterlogged.get(oldBlock) != isWaterlogged) {
8698
updateSubChunkBlocksPacket.getExtraBlocks().add(new org.cloudburstmc.protocol.bedrock.data.BlockChangeEntry(
8799
entry.getPosition(),
88100
isWaterlogged ? session.getBlockMappings().getBedrockWater() : session.getBlockMappings().getBedrockAir(),
@@ -91,10 +103,6 @@ public void translate(GeyserSession session, ClientboundSectionBlocksUpdatePacke
91103
org.cloudburstmc.protocol.bedrock.data.BlockChangeEntry.MessageType.NONE
92104
));
93105
}
94-
95-
if (palette != null) {
96-
palette.set(entry.getPosition().getX() & 0xF, entry.getPosition().getY() & 0xF, entry.getPosition().getZ() & 0xF, entry.getBlock());
97-
}
98106
}
99107

100108
session.sendUpstreamPacket(updateSubChunkBlocksPacket);

0 commit comments

Comments
 (0)