From 6a8ac9dce345e77096bcb316b79bd9c6c4f5bfb0 Mon Sep 17 00:00:00 2001 From: NichtStudioCode <51272202+NichtStudioCode@users.noreply.github.com> Date: Sat, 15 Apr 2023 17:56:32 +0200 Subject: [PATCH] Fix ItemPostUpdateEvent receiving air item stack when shift-clicking out of gui-embedded inventory --- .../java/xyz/xenondevs/invui/gui/AbstractGui.java | 12 ++++++++---- .../java/xyz/xenondevs/invui/util/ItemUtils.java | 12 ++++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/invui/src/main/java/xyz/xenondevs/invui/gui/AbstractGui.java b/invui/src/main/java/xyz/xenondevs/invui/gui/AbstractGui.java index f4701d4..1ea758f 100644 --- a/invui/src/main/java/xyz/xenondevs/invui/gui/AbstractGui.java +++ b/invui/src/main/java/xyz/xenondevs/invui/gui/AbstractGui.java @@ -11,17 +11,18 @@ import org.jetbrains.annotations.Nullable; import xyz.xenondevs.invui.animation.Animation; import xyz.xenondevs.invui.gui.structure.Marker; import xyz.xenondevs.invui.gui.structure.Structure; +import xyz.xenondevs.invui.inventory.Inventory; +import xyz.xenondevs.invui.inventory.event.ItemPreUpdateEvent; +import xyz.xenondevs.invui.inventory.event.PlayerUpdateReason; +import xyz.xenondevs.invui.inventory.event.UpdateReason; import xyz.xenondevs.invui.item.Item; import xyz.xenondevs.invui.item.ItemProvider; import xyz.xenondevs.invui.item.ItemWrapper; import xyz.xenondevs.invui.item.impl.controlitem.ControlItem; import xyz.xenondevs.invui.util.ArrayUtils; import xyz.xenondevs.invui.util.InventoryUtils; +import xyz.xenondevs.invui.util.ItemUtils; import xyz.xenondevs.invui.util.SlotUtils; -import xyz.xenondevs.invui.inventory.Inventory; -import xyz.xenondevs.invui.inventory.event.ItemPreUpdateEvent; -import xyz.xenondevs.invui.inventory.event.PlayerUpdateReason; -import xyz.xenondevs.invui.inventory.event.UpdateReason; import xyz.xenondevs.invui.window.*; import java.util.*; @@ -222,6 +223,9 @@ public abstract class AbstractGui implements Gui, GuiParent { } clicked.setAmount(leftOverAmount); + if (ItemUtils.isEmpty(clicked)) + clicked = null; + inventory.setItemSilently(slot, clicked); inventory.callPostUpdateEvent(updateReason, slot, previousStack, clicked); diff --git a/invui/src/main/java/xyz/xenondevs/invui/util/ItemUtils.java b/invui/src/main/java/xyz/xenondevs/invui/util/ItemUtils.java index 00bbf27..3ea9053 100644 --- a/invui/src/main/java/xyz/xenondevs/invui/util/ItemUtils.java +++ b/invui/src/main/java/xyz/xenondevs/invui/util/ItemUtils.java @@ -18,6 +18,18 @@ public class ItemUtils { return itemStack == null || itemStack.getType().isAir() || itemStack.getAmount() <= 0; } + /** + * Checks whether the given {@link ItemStack} is empty and returns null if it is. + * @param itemStack The {@link ItemStack} to check. + * @return The {@link ItemStack} if it is not empty or null otherwise. + */ + public static @Nullable ItemStack takeUnlessEmpty(@Nullable ItemStack itemStack) { + if (isEmpty(itemStack)) + return null; + + return itemStack; + } + /** * Creates a new array with clones of the given {@link ItemStack ItemStacks}. *