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; }