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..b90351eef --- /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 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 StackedItem stackedItem; + private boolean cancelled; + + /** + * @param entity The entity picking up item + * @param stackedItem The StackedItem being picking up from stacked dropped items + */ + public ItemPickupEvent(@NotNull final LivingEntity entity, @NotNull final StackedItem stackedItem) { + super(entity); + this.stackedItem = stackedItem; + } + + /** + * Gets the entity picking up items. + * + * @return the entity try to pick up item + */ + @NotNull + @Override + public LivingEntity getEntity() { + return (LivingEntity) entity; + } + + /** + * Gets the StackedItem being picking up. + * + * @return the StackedItem being picking up + */ + @NotNull + public StackedItem getStackedItem() { + return this.stackedItem; + } + + @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..0e61f5a00 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; @@ -79,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)) {