diff --git a/core/src/main/java/org/geysermc/geyser/level/block/type/DoorBlock.java b/core/src/main/java/org/geysermc/geyser/level/block/type/DoorBlock.java index 956d4b771..cec4618cd 100644 --- a/core/src/main/java/org/geysermc/geyser/level/block/type/DoorBlock.java +++ b/core/src/main/java/org/geysermc/geyser/level/block/type/DoorBlock.java @@ -30,6 +30,8 @@ import org.geysermc.geyser.level.block.property.Properties; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.ChunkUtils; +import java.util.Objects; + public class DoorBlock extends Block { public DoorBlock(String javaIdentifier, Builder builder) { super(javaIdentifier, builder); @@ -40,7 +42,10 @@ public class DoorBlock extends Block { // Needed to check whether we must force the client to update the door state. String doubleBlockHalf = state.getValue(Properties.DOUBLE_BLOCK_HALF); - if (!session.getGeyser().getWorldManager().hasOwnChunkCache() && doubleBlockHalf.equals("lower")) { + Vector3i lastLowerDoor = session.getLastLowerDoorPosition(); + session.setLastLowerDoorPosition(null); + + if (Objects.equals(lastLowerDoor, position) && doubleBlockHalf.equals("lower")) { BlockState oldBlockState = session.getGeyser().getWorldManager().blockAt(session, position); // If these are the same, it means that we already updated the lower door block (manually in the workaround below), // and we do not need to update the block in the cache/on the client side using the super.updateBlock() method again. @@ -55,9 +60,14 @@ public class DoorBlock extends Block { if (doubleBlockHalf.equals("upper")) { // Update the lower door block as Bedrock client doesn't like door to be closed from the top // See https://github.com/GeyserMC/Geyser/issues/4358 - Vector3i belowDoorPosition = position.sub(0, 1, 0); + Vector3i belowDoorPosition = position.down(1); BlockState belowDoorBlockState = session.getGeyser().getWorldManager().blockAt(session, belowDoorPosition.getX(), belowDoorPosition.getY(), belowDoorPosition.getZ()); - ChunkUtils.updateBlock(session, belowDoorBlockState, belowDoorPosition); + // better safe than sorry - withValue can throw + if (belowDoorBlockState.block() instanceof DoorBlock) { + belowDoorBlockState = belowDoorBlockState.withValue(Properties.OPEN, state.getValue(Properties.OPEN)); + ChunkUtils.updateBlock(session, belowDoorBlockState, belowDoorPosition); + session.setLastLowerDoorPosition(belowDoorPosition); + } } } } diff --git a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java index 570946e9f..ecdf47fb1 100644 --- a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java +++ b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java @@ -590,6 +590,12 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource { @Setter private boolean placedBucket; + /** + * Stores whether we've updated a lower door block + */ + @Setter + private @Nullable Vector3i lastLowerDoorPosition = null; + /** * Counts how many ticks have occurred since an arm animation started. * -1 means there is no active arm swing diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockInventoryTransactionTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockInventoryTransactionTranslator.java index 3e8e889bf..fcd21533b 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockInventoryTransactionTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockInventoryTransactionTranslator.java @@ -63,6 +63,7 @@ import org.geysermc.geyser.level.block.type.Block; import org.geysermc.geyser.level.block.type.BlockState; import org.geysermc.geyser.level.block.type.ButtonBlock; import org.geysermc.geyser.level.block.type.CauldronBlock; +import org.geysermc.geyser.level.block.type.DoorBlock; import org.geysermc.geyser.level.block.type.FlowerPotBlock; import org.geysermc.geyser.level.physics.Direction; import org.geysermc.geyser.registry.BlockRegistries; @@ -281,6 +282,11 @@ public class BedrockInventoryTransactionTranslator extends PacketTranslator