From 422c091bfacc1224b31c00dbcf8055214429bf0c Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Sat, 26 Jul 2025 17:54:58 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BA=A4=E4=BA=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item/listener/ItemEventListener.java | 11 +++++++++- .../plugin/user/BukkitServerPlayer.java | 21 +++++++++++++++++++ .../core/entity/player/Player.java | 4 ++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/ItemEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/ItemEventListener.java index 5145a7b05..2b2277636 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/ItemEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/ItemEventListener.java @@ -71,7 +71,11 @@ public class ItemEventListener implements Listener { Entity entity = event.getRightClicked(); BukkitServerPlayer serverPlayer = this.plugin.adapt(player); if (serverPlayer == null) return; + InteractionHand hand = event.getHand() == EquipmentSlot.HAND ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND; + // prevent duplicated interact air events + serverPlayer.updateLastInteractEntityTick(hand); + Item itemInHand = serverPlayer.getItemInHand(hand); if (ItemUtils.isEmpty(itemInHand)) return; @@ -350,11 +354,16 @@ public class ItemEventListener implements Listener { return; // Gets the item in hand InteractionHand hand = event.getHand() == EquipmentSlot.HAND ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND; + // prevents duplicated events + if (serverPlayer.lastInteractEntityCheck(hand)) { + return; + } + Item itemInHand = serverPlayer.getItemInHand(hand); // should never be null if (ItemUtils.isEmpty(itemInHand)) return; - // todo 真的需要这个吗 + // TODO 有必要存在吗? if (cancelEventIfHasInteraction(event, serverPlayer, hand)) { return; } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java index 5e78643a6..2eef99bbb 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java @@ -76,6 +76,9 @@ public class BukkitServerPlayer extends Player { private Key clientSideDimension; // check main hand/offhand interaction private int lastSuccessfulInteraction; + // to prevent duplicated events + private int lastInteractEntityWithMainHand; + private int lastInteractEntityWithOffHand; // re-sync attribute timely to prevent some bugs private long lastAttributeSyncTime; // for breaking blocks @@ -234,6 +237,24 @@ public class BukkitServerPlayer extends Player { return this.lastSuccessfulInteraction; } + @Override + public void updateLastInteractEntityTick(@NotNull InteractionHand hand) { + if (hand == InteractionHand.MAIN_HAND) { + this.lastInteractEntityWithMainHand = gameTicks(); + } else { + this.lastInteractEntityWithOffHand = gameTicks(); + } + } + + @Override + public boolean lastInteractEntityCheck(@NotNull InteractionHand hand) { + if (hand == InteractionHand.MAIN_HAND) { + return gameTicks() == this.lastInteractEntityWithMainHand; + } else { + return gameTicks() == this.lastInteractEntityWithOffHand; + } + } + @Override public int gameTicks() { return this.gameTicks; diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java b/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java index 073a8d41c..9cc7ac42d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java @@ -68,6 +68,10 @@ public abstract class Player extends AbstractEntity implements NetWorkUser { public abstract int lastSuccessfulInteractionTick(); + public abstract void updateLastInteractEntityTick(@NotNull InteractionHand hand); + + public abstract boolean lastInteractEntityCheck(@NotNull InteractionHand hand); + public abstract int gameTicks(); public abstract void swingHand(InteractionHand hand);