From 0a79eee89bb428a303d9bb56f980dbb08cfe913d Mon Sep 17 00:00:00 2001 From: Amaury Carrade Date: Fri, 10 Jul 2015 12:12:13 +0200 Subject: [PATCH] Fixed & enhanced GUI API (blame @IamBlueSlime for bugs). * NEW: Added another onClick signature with the full event as the last parameter. * NEW: Added a new method triggered when an item is dropped in the inventory GUI (`onItemDeposit`), with various signatures. * BUG: Click triggered on click on a slot with the same raw number on the player inventory (out of the GUI). * BUG: Fixed items ate by the GUI when dragged on it by cancelling all drags on managed inventories. --- .../imageonmap/gui/core/AbstractGui.java | 24 ++++++++++- .../imageonmap/gui/core/GuiListener.java | 41 +++++++++++++++---- 2 files changed, 56 insertions(+), 9 deletions(-) diff --git a/src/main/java/fr/moribus/imageonmap/gui/core/AbstractGui.java b/src/main/java/fr/moribus/imageonmap/gui/core/AbstractGui.java index a944082..9d95103 100644 --- a/src/main/java/fr/moribus/imageonmap/gui/core/AbstractGui.java +++ b/src/main/java/fr/moribus/imageonmap/gui/core/AbstractGui.java @@ -28,7 +28,7 @@ import java.util.*; /** - * @author IamBlueSlime + * @author IamBlueSlime, Amaury Carrade */ public abstract class AbstractGui { protected TreeMap actions = new TreeMap<>(); @@ -40,6 +40,11 @@ public abstract class AbstractGui { public void onClose(Player player) {} + public void onClick(Player player, ItemStack stack, String action, ClickType clickType, InventoryClickEvent event) + { + this.onClick(player, stack, action, clickType); + } + public void onClick(Player player, ItemStack stack, String action, ClickType clickType) { this.onClick(player, stack, action); @@ -47,7 +52,22 @@ public abstract class AbstractGui { public void onClick(Player player, ItemStack stack, String action) {} - public void setSlotData(Inventory inv, String name, Material material, int slot, String[] description, String action) { + + public void onItemDeposit(Player player, ItemStack stack, ClickType clickType, InventoryClickEvent event) + { + onItemDeposit(player, stack, clickType); + } + + public void onItemDeposit(Player player, ItemStack stack, ClickType clickType) + { + onItemDeposit(player, stack); + } + + public void onItemDeposit(Player player, ItemStack stack) {} + + + public void setSlotData(Inventory inv, String name, Material material, int slot, String[] description, String action) + { this.setSlotData(inv, name, new ItemStack(material, 1), slot, description, action); } diff --git a/src/main/java/fr/moribus/imageonmap/gui/core/GuiListener.java b/src/main/java/fr/moribus/imageonmap/gui/core/GuiListener.java index 7431fdf..bfc9179 100644 --- a/src/main/java/fr/moribus/imageonmap/gui/core/GuiListener.java +++ b/src/main/java/fr/moribus/imageonmap/gui/core/GuiListener.java @@ -19,6 +19,7 @@ package fr.moribus.imageonmap.gui.core; import fr.moribus.imageonmap.*; +import org.bukkit.*; import org.bukkit.entity.*; import org.bukkit.event.*; import org.bukkit.event.inventory.*; @@ -26,7 +27,7 @@ import org.bukkit.inventory.*; /** - * @author IamBlueSlime + * @author IamBlueSlime, Amaury Carrade * * Changes by Amaury Carrade to use statics (beh, code style, these things). */ @@ -40,24 +41,50 @@ public class GuiListener implements Listener { @EventHandler public void onInventoryClick(InventoryClickEvent event) { - if (event.getWhoClicked() instanceof Player) { + if (event.getWhoClicked() instanceof Player) + { Player player = (Player) event.getWhoClicked(); AbstractGui gui = GuiManager.getPlayerGui(player); - if (gui != null) { + if (gui != null) + { if (event.getInventory() instanceof PlayerInventory) return; - String action = gui.getAction(event.getSlot()); + if(event.getRawSlot() == event.getSlot()) // Chest inventory, not player one + { - if (action != null) - gui.onClick(player, event.getCurrentItem(), action, event.getClick()); + if(event.getCursor() != null && event.getCursor().getType() != Material.AIR) + { + gui.onItemDeposit(player, event.getCursor(), event.getClick(), event); + } - event.setCancelled(true); + else + { + String action = gui.getAction(event.getSlot()); + + if (action != null) + gui.onClick(player, event.getCurrentItem(), action, event.getClick(), event); + } + + event.setCancelled(true); + } } } } + @EventHandler + public void onInventoryDrag(InventoryDragEvent event) + { + Player player = (Player) event.getWhoClicked(); + AbstractGui gui = GuiManager.getPlayerGui(player); + + if (gui != null) + { + event.setCancelled(true); + } + } + @EventHandler public void onInventoryClose(InventoryCloseEvent event) {