From 8b7994599207105e5a3ef7e978f2389898e6d0f0 Mon Sep 17 00:00:00 2001 From: Arne Dalhuisen <59421074+Bloepiloepi@users.noreply.github.com> Date: Sun, 23 May 2021 16:46:29 +0200 Subject: [PATCH] Fixed eating particles when eating was cancelled by client --- .../net/minestom/server/entity/Player.java | 18 +++++++++++------- .../server/listener/PlayerDiggingListener.java | 8 ++++++-- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/main/java/net/minestom/server/entity/Player.java b/src/main/java/net/minestom/server/entity/Player.java index 49bd4ec3f..923f010fc 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 Hand getEatingHand() { + return eatingHand; + } + /** * Gets the player default eating time. * @@ -2287,19 +2296,14 @@ public class Player extends LivingEntity implements CommandSender, Localizable, * Used to call {@link ItemUpdateStateEvent} with the proper item * It does check which hand to get the item to update. * - * @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 */ - public @Nullable ItemUpdateStateEvent callItemUpdateStateEvent(boolean allowFood, @Nullable Hand hand) { + public @Nullable ItemUpdateStateEvent callItemUpdateStateEvent(@Nullable Hand hand) { if (hand == null) return null; final ItemStack updatedItem = getItemInHand(hand); - final boolean isFood = updatedItem.getMaterial().isFood(); - - if (isFood && !allowFood) - return null; ItemUpdateStateEvent itemUpdateStateEvent = new ItemUpdateStateEvent(this, hand, updatedItem); callEvent(ItemUpdateStateEvent.class, itemUpdateStateEvent); 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);