diff --git a/src/main/java/net/minestom/server/event/player/PlayerAddItemStackEvent.java b/src/main/java/net/minestom/server/event/player/PlayerAddItemStackEvent.java new file mode 100644 index 000000000..e06bc11ee --- /dev/null +++ b/src/main/java/net/minestom/server/event/player/PlayerAddItemStackEvent.java @@ -0,0 +1,46 @@ +package net.minestom.server.event.player; + +import net.minestom.server.entity.Player; +import net.minestom.server.event.CancellableEvent; +import net.minestom.server.item.ItemStack; + +/** + * Called as a result of {@link net.minestom.server.inventory.PlayerInventory#addItemStack(ItemStack)} + */ +public class PlayerAddItemStackEvent extends CancellableEvent { + + private Player player; + private ItemStack itemStack; + + public PlayerAddItemStackEvent(Player player, ItemStack itemStack) { + this.player = player; + this.itemStack = itemStack; + } + + /** + * Get the player who has an item stack added to his inventory + * + * @return the player + */ + public Player getPlayer() { + return player; + } + + /** + * Get the item stack which will be added + * + * @return the item stack + */ + public ItemStack getItemStack() { + return itemStack; + } + + /** + * Change the item stack which will be added + * + * @param itemStack the new item stack + */ + public void setItemStack(ItemStack itemStack) { + this.itemStack = itemStack; + } +} diff --git a/src/main/java/net/minestom/server/event/player/PlayerSetItemStackEvent.java b/src/main/java/net/minestom/server/event/player/PlayerSetItemStackEvent.java new file mode 100644 index 000000000..8abdc372f --- /dev/null +++ b/src/main/java/net/minestom/server/event/player/PlayerSetItemStackEvent.java @@ -0,0 +1,47 @@ +package net.minestom.server.event.player; + +import net.minestom.server.entity.Player; +import net.minestom.server.event.CancellableEvent; +import net.minestom.server.item.ItemStack; + +/** + * Called as a result of {@link net.minestom.server.inventory.PlayerInventory#setItemStack(int, ItemStack)} + */ +public class PlayerSetItemStackEvent extends CancellableEvent { + + private Player player; + private ItemStack itemStack; + + public PlayerSetItemStackEvent(Player player, ItemStack itemStack) { + this.player = player; + this.itemStack = itemStack; + } + + /** + * Get the player who has an item stack set to his inventory + * + * @return the player + */ + public Player getPlayer() { + return player; + } + + /** + * Get the item stack which will be set + * + * @return the item stack + */ + public ItemStack getItemStack() { + return itemStack; + } + + /** + * Change the item stack which will be set + * + * @param itemStack the new item stack + */ + public void setItemStack(ItemStack itemStack) { + this.itemStack = itemStack; + } + +} diff --git a/src/main/java/net/minestom/server/inventory/PlayerInventory.java b/src/main/java/net/minestom/server/inventory/PlayerInventory.java index 452417c9e..25e9130a9 100644 --- a/src/main/java/net/minestom/server/inventory/PlayerInventory.java +++ b/src/main/java/net/minestom/server/inventory/PlayerInventory.java @@ -2,6 +2,8 @@ package net.minestom.server.inventory; import net.minestom.server.entity.Player; import net.minestom.server.event.item.ArmorEquipEvent; +import net.minestom.server.event.player.PlayerAddItemStackEvent; +import net.minestom.server.event.player.PlayerSetItemStackEvent; import net.minestom.server.inventory.click.ClickType; import net.minestom.server.inventory.click.InventoryClickLoopHandler; import net.minestom.server.inventory.click.InventoryClickProcessor; @@ -67,11 +69,26 @@ public class PlayerInventory implements InventoryModifier, InventoryClickHandler @Override public void setItemStack(int slot, ItemStack itemStack) { - safeItemInsert(slot, itemStack); + itemStack = ItemStackUtils.notNull(itemStack); + + PlayerSetItemStackEvent setItemStackEvent = new PlayerSetItemStackEvent(player, itemStack); + player.callCancellableEvent(PlayerSetItemStackEvent.class, setItemStackEvent, () -> { + ItemStack item = setItemStackEvent.getItemStack(); + safeItemInsert(slot, item); + }); } @Override public synchronized boolean addItemStack(ItemStack itemStack) { + itemStack = ItemStackUtils.notNull(itemStack); + + PlayerAddItemStackEvent addItemStackEvent = new PlayerAddItemStackEvent(player, itemStack); + player.callEvent(PlayerAddItemStackEvent.class, addItemStackEvent); + if (addItemStackEvent.isCancelled()) + return false; + + itemStack = addItemStackEvent.getItemStack(); + StackingRule stackingRule = itemStack.getStackingRule(); for (int i = 0; i < items.length - 10; i++) { ItemStack item = items[i]; @@ -93,7 +110,7 @@ public class PlayerInventory implements InventoryModifier, InventoryClickHandler return true; } } else if (item.isAir()) { - setItemStack(i, itemStack); + safeItemInsert(i, itemStack); return true; } } @@ -207,8 +224,6 @@ public class PlayerInventory implements InventoryModifier, InventoryClickHandler * @param itemStack the item to insert at the slot */ private synchronized void safeItemInsert(int slot, ItemStack itemStack) { - itemStack = ItemStackUtils.notNull(itemStack); - EntityEquipmentPacket.Slot equipmentSlot; if (slot == player.getHeldSlot()) { @@ -259,7 +274,7 @@ public class PlayerInventory implements InventoryModifier, InventoryClickHandler */ protected void setItemStack(int slot, int offset, ItemStack itemStack) { slot = convertSlot(slot, offset); - safeItemInsert(slot, itemStack); + setItemStack(slot, itemStack); } /**