From a18485e61e094f74b06a158f06b10f2cf9ba8598 Mon Sep 17 00:00:00 2001 From: mworzala Date: Thu, 15 Jun 2023 19:55:05 -0400 Subject: [PATCH] hollow-cube/block-interact-ack-fix (cherry picked from commit 1f1a2bf1962f0fd9a0b4170b736bbbfe843dc6a1) --- .../main/java/net/minestom/demo/PlayerInit.java | 17 +++++++++++++++++ .../server/listener/BlockPlacementListener.java | 2 ++ 2 files changed, 19 insertions(+) diff --git a/demo/src/main/java/net/minestom/demo/PlayerInit.java b/demo/src/main/java/net/minestom/demo/PlayerInit.java index d4ddb1e4a..7c0a72dff 100644 --- a/demo/src/main/java/net/minestom/demo/PlayerInit.java +++ b/demo/src/main/java/net/minestom/demo/PlayerInit.java @@ -117,6 +117,23 @@ public class PlayerInit { }) .addListener(PlayerPacketEvent.class, event -> { //System.out.println("in " + event.getPacket().getClass().getSimpleName()); + }) + .addListener(PlayerUseItemOnBlockEvent.class, event -> { + if (event.getHand() != Player.Hand.MAIN) return; + + var itemStack = event.getItemStack(); + var block = event.getInstance().getBlock(event.getPosition()); + + if ("false".equals(block.getProperty("waterlogged")) && itemStack.material().equals(Material.WATER_BUCKET)) { + block = block.withProperty("waterlogged", "true"); + System.out.println("SET WATERLOGGER"); + } else if ("true".equals(block.getProperty("waterlogged")) && itemStack.material().equals(Material.BUCKET)) { + block = block.withProperty("waterlogged", "false"); + System.out.println("SET NOT WATERLOGGED"); + } else return; + + event.getInstance().setBlock(event.getPosition(), block); + }); static { diff --git a/src/main/java/net/minestom/server/listener/BlockPlacementListener.java b/src/main/java/net/minestom/server/listener/BlockPlacementListener.java index cf41ebe71..58f57e85e 100644 --- a/src/main/java/net/minestom/server/listener/BlockPlacementListener.java +++ b/src/main/java/net/minestom/server/listener/BlockPlacementListener.java @@ -75,6 +75,8 @@ public class BlockPlacementListener { // Player didn't try to place a block but interacted with one PlayerUseItemOnBlockEvent event = new PlayerUseItemOnBlockEvent(player, hand, usedItem, blockPosition, cursorPosition, blockFace); EventDispatcher.call(event); + // Ack the block change. This is required to reset the client prediction to the server state. + player.sendPacket(new AcknowledgeBlockChangePacket(packet.sequence())); return; }