diff --git a/src/main/java/net/minestom/server/entity/Player.java b/src/main/java/net/minestom/server/entity/Player.java index 49bd4ec3f..846194261 100644 --- a/src/main/java/net/minestom/server/entity/Player.java +++ b/src/main/java/net/minestom/server/entity/Player.java @@ -401,7 +401,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable, if (isEating()) { if (time - startEatingTime >= eatingTime) { triggerStatus((byte) 9); // Mark item use as finished - ItemUpdateStateEvent itemUpdateStateEvent = callItemUpdateStateEvent(true, eatingHand); + ItemUpdateStateEvent itemUpdateStateEvent = callItemUpdateStateEvent(eatingHand); Check.notNull(itemUpdateStateEvent, "#callItemUpdateStateEvent returned null."); @@ -1136,6 +1136,15 @@ public class Player extends LivingEntity implements CommandSender, Localizable, return eatingHand != null; } + /** + * Gets the hand which the player is eating from. + * + * @return the eating hand, null if none + */ + public @Nullable Hand getEatingHand() { + return eatingHand; + } + /** * Gets the player default eating time. * @@ -2290,7 +2299,10 @@ public class Player extends LivingEntity implements CommandSender, Localizable, * @param allowFood true if food should be updated, false otherwise * @return the called {@link ItemUpdateStateEvent}, * null if there is no item to update the state + * + * @deprecated Use {@link #callItemUpdateStateEvent(Hand)} instead */ + @Deprecated public @Nullable ItemUpdateStateEvent callItemUpdateStateEvent(boolean allowFood, @Nullable Hand hand) { if (hand == null) return null; @@ -2307,6 +2319,17 @@ public class Player extends LivingEntity implements CommandSender, Localizable, return itemUpdateStateEvent; } + /** + * Used to call {@link ItemUpdateStateEvent} with the proper item + * It does check which hand to get the item to update. Allows food. + * + * @return the called {@link ItemUpdateStateEvent}, + * null if there is no item to update the state + */ + public @Nullable ItemUpdateStateEvent callItemUpdateStateEvent(@Nullable Hand hand) { + return callItemUpdateStateEvent(true, hand); + } + /** * Makes the player digging a custom block, see {@link #resetTargetBlock()} to rewind. * diff --git a/src/main/java/net/minestom/server/listener/PlayerDiggingListener.java b/src/main/java/net/minestom/server/listener/PlayerDiggingListener.java index 351c78bac..2940944cf 100644 --- a/src/main/java/net/minestom/server/listener/PlayerDiggingListener.java +++ b/src/main/java/net/minestom/server/listener/PlayerDiggingListener.java @@ -136,14 +136,18 @@ public class PlayerDiggingListener { } else if (status == ClientPlayerDiggingPacket.Status.UPDATE_ITEM_STATE) { Player.Hand hand = null; - if (player.getItemInHand(Player.Hand.OFF).getMaterial().hasState()) { + if (player.isEating()) { + hand = player.getEatingHand(); + } else if (player.getItemInHand(Player.Hand.OFF).getMaterial().hasState()) { hand = Player.Hand.OFF; } else if (player.getItemInHand(Player.Hand.MAIN).getMaterial().hasState()) { hand = Player.Hand.MAIN; } player.refreshEating(null); - ItemUpdateStateEvent itemUpdateStateEvent = player.callItemUpdateStateEvent(false, hand); + player.triggerStatus((byte) 9); + + ItemUpdateStateEvent itemUpdateStateEvent = player.callItemUpdateStateEvent(hand); if (itemUpdateStateEvent == null) { player.refreshActiveHand(true, false, false); diff --git a/src/main/java/net/minestom/server/listener/UseItemListener.java b/src/main/java/net/minestom/server/listener/UseItemListener.java index df80bed7b..a72bba3ef 100644 --- a/src/main/java/net/minestom/server/listener/UseItemListener.java +++ b/src/main/java/net/minestom/server/listener/UseItemListener.java @@ -50,6 +50,8 @@ public class UseItemListener { PlayerItemAnimationEvent.ItemAnimationType itemAnimationType = null; boolean riptideSpinAttack = false; + boolean cancelAnimation = false; + if (material == Material.BOW) { itemAnimationType = PlayerItemAnimationEvent.ItemAnimationType.BOW; } else if (material == Material.CROSSBOW) { @@ -64,9 +66,13 @@ public class UseItemListener { // Eating code, contains the eating time customisation PlayerPreEatEvent playerPreEatEvent = new PlayerPreEatEvent(player, itemStack, hand, player.getDefaultEatingTime()); player.callCancellableEvent(PlayerPreEatEvent.class, playerPreEatEvent, () -> player.refreshEating(hand, playerPreEatEvent.getEatingTime())); + + if (playerPreEatEvent.isCancelled()) { + cancelAnimation = true; + } } - if (itemAnimationType != null) { + if (!cancelAnimation && itemAnimationType != null) { PlayerItemAnimationEvent playerItemAnimationEvent = new PlayerItemAnimationEvent(player, itemAnimationType); player.callCancellableEvent(PlayerItemAnimationEvent.class, playerItemAnimationEvent, () -> { player.refreshActiveHand(true, hand == Player.Hand.OFF, riptideSpinAttack);