From fbb011d30371946648d92f7da768f4fa23584389 Mon Sep 17 00:00:00 2001 From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com> Date: Thu, 21 Mar 2024 16:22:11 -0400 Subject: [PATCH 1/2] Add simple ItemPickupEvent This event will throw when player try to pick up partial items from stacked dropped items on the ground, since RoseStacker cancel the EntityPickupItemEvent if player doesn't pick up the entire stacked item. --- .../rosestacker/event/ItemPickupEvent.java | 66 +++++++++++++++++++ .../rosestacker/listener/ItemListener.java | 10 +++ 2 files changed, 76 insertions(+) create mode 100644 Plugin/src/main/java/dev/rosewood/rosestacker/event/ItemPickupEvent.java diff --git a/Plugin/src/main/java/dev/rosewood/rosestacker/event/ItemPickupEvent.java b/Plugin/src/main/java/dev/rosewood/rosestacker/event/ItemPickupEvent.java new file mode 100644 index 000000000..9f67776e7 --- /dev/null +++ b/Plugin/src/main/java/dev/rosewood/rosestacker/event/ItemPickupEvent.java @@ -0,0 +1,66 @@ +package dev.rosewood.rosestacker.event; + +import org.bukkit.entity.LivingEntity; +import org.bukkit.event.Cancellable; +import org.bukkit.event.HandlerList; +import org.bukkit.event.entity.EntityEvent; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; + +public class ItemPickupEvent extends EntityEvent implements Cancellable { + + private static final HandlerList HANDLERS = new HandlerList(); + + private final ItemStack item; + private boolean cancelled; + + /** + * @param entity The entity picking up item + * @param item The item being picking up from stacked dropped items + */ + public ItemPickupEvent(@NotNull final LivingEntity entity, @NotNull final ItemStack item) { + super(entity); + this.item = item; + } + + /** + * Gets the entity picking up items. + * + * @return the entity + */ + @NotNull + @Override + public LivingEntity getEntity() { + return (LivingEntity) entity; + } + + /** + * Gets the items being picking up. + * + * @return the itemStack being picking up + */ + @NotNull + public ItemStack getItem() { + return this.item; + } + + @Override + public HandlerList getHandlers() { + return HANDLERS; + } + + public static HandlerList getHandlerList() { + return HANDLERS; + } + + @Override + public boolean isCancelled() { + return this.cancelled; + } + + @Override + public void setCancelled(boolean cancelled) { + this.cancelled = cancelled; + } + +} diff --git a/Plugin/src/main/java/dev/rosewood/rosestacker/listener/ItemListener.java b/Plugin/src/main/java/dev/rosewood/rosestacker/listener/ItemListener.java index 8b67b2a78..e2de55584 100644 --- a/Plugin/src/main/java/dev/rosewood/rosestacker/listener/ItemListener.java +++ b/Plugin/src/main/java/dev/rosewood/rosestacker/listener/ItemListener.java @@ -1,6 +1,7 @@ package dev.rosewood.rosestacker.listener; import dev.rosewood.rosegarden.RosePlugin; +import dev.rosewood.rosestacker.event.ItemPickupEvent; import dev.rosewood.rosestacker.manager.ConfigurationManager; import dev.rosewood.rosestacker.manager.StackManager; import dev.rosewood.rosestacker.manager.StackSettingManager; @@ -10,11 +11,14 @@ import dev.rosewood.rosestacker.utils.StackerUtils; import java.util.ArrayList; import java.util.List; + +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.block.Container; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.entity.Villager; import org.bukkit.event.EventHandler; @@ -165,6 +169,12 @@ private boolean applyInventoryItemPickup(Inventory inventory, StackedItem stacke boolean willPickupAll = inventorySpace >= stackedItem.getStackSize(); int amount = willPickupAll ? stackedItem.getStackSize() - target.getAmount() : inventorySpace; + // Fire the event to allow other plugins to manipulate the items before we pick up partial items from stacked item + ItemPickupEvent event = new ItemPickupEvent((LivingEntity) eventEntity, target); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) + return false; + this.addItemStackAmountToInventory(inventory, target, amount); if (willPickupAll) { From aa5995566dcd63dc485a10ffa5240910c50b8c07 Mon Sep 17 00:00:00 2001 From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com> Date: Thu, 21 Mar 2024 19:49:09 -0400 Subject: [PATCH 2/2] Fix --- .../rosestacker/event/ItemPickupEvent.java | 20 +++++++++---------- .../rosestacker/listener/ItemListener.java | 14 +++++++------ 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/Plugin/src/main/java/dev/rosewood/rosestacker/event/ItemPickupEvent.java b/Plugin/src/main/java/dev/rosewood/rosestacker/event/ItemPickupEvent.java index 9f67776e7..b90351eef 100644 --- a/Plugin/src/main/java/dev/rosewood/rosestacker/event/ItemPickupEvent.java +++ b/Plugin/src/main/java/dev/rosewood/rosestacker/event/ItemPickupEvent.java @@ -4,29 +4,29 @@ import org.bukkit.event.Cancellable; import org.bukkit.event.HandlerList; import org.bukkit.event.entity.EntityEvent; -import org.bukkit.inventory.ItemStack; +import dev.rosewood.rosestacker.stack.StackedItem; import org.jetbrains.annotations.NotNull; public class ItemPickupEvent extends EntityEvent implements Cancellable { private static final HandlerList HANDLERS = new HandlerList(); - private final ItemStack item; + private final StackedItem stackedItem; private boolean cancelled; /** * @param entity The entity picking up item - * @param item The item being picking up from stacked dropped items + * @param stackedItem The StackedItem being picking up from stacked dropped items */ - public ItemPickupEvent(@NotNull final LivingEntity entity, @NotNull final ItemStack item) { + public ItemPickupEvent(@NotNull final LivingEntity entity, @NotNull final StackedItem stackedItem) { super(entity); - this.item = item; + this.stackedItem = stackedItem; } /** * Gets the entity picking up items. * - * @return the entity + * @return the entity try to pick up item */ @NotNull @Override @@ -35,13 +35,13 @@ public LivingEntity getEntity() { } /** - * Gets the items being picking up. + * Gets the StackedItem being picking up. * - * @return the itemStack being picking up + * @return the StackedItem being picking up */ @NotNull - public ItemStack getItem() { - return this.item; + public StackedItem getStackedItem() { + return this.stackedItem; } @Override diff --git a/Plugin/src/main/java/dev/rosewood/rosestacker/listener/ItemListener.java b/Plugin/src/main/java/dev/rosewood/rosestacker/listener/ItemListener.java index e2de55584..0e61f5a00 100644 --- a/Plugin/src/main/java/dev/rosewood/rosestacker/listener/ItemListener.java +++ b/Plugin/src/main/java/dev/rosewood/rosestacker/listener/ItemListener.java @@ -83,6 +83,14 @@ public void onItemPickup(EntityPickupItemEvent event) { if (stackedItem == null) return; + // Fire the event to allow other plugins to manipulate the items before we pick up items from stacked item + ItemPickupEvent pickupEvent = new ItemPickupEvent(event.getEntity(), stackedItem); + Bukkit.getPluginManager().callEvent(pickupEvent); + if (pickupEvent.isCancelled()) { + event.setCancelled(true); + return; + } + Inventory inventory; if (event.getEntity() instanceof Player player) { if (StackerUtils.isVanished(player)) { @@ -169,12 +177,6 @@ private boolean applyInventoryItemPickup(Inventory inventory, StackedItem stacke boolean willPickupAll = inventorySpace >= stackedItem.getStackSize(); int amount = willPickupAll ? stackedItem.getStackSize() - target.getAmount() : inventorySpace; - // Fire the event to allow other plugins to manipulate the items before we pick up partial items from stacked item - ItemPickupEvent event = new ItemPickupEvent((LivingEntity) eventEntity, target); - Bukkit.getPluginManager().callEvent(event); - if (event.isCancelled()) - return false; - this.addItemStackAmountToInventory(inventory, target, amount); if (willPickupAll) {