diff --git a/eco-api/src/main/java/com/willfp/eco/core/gui/slot/FillerSlot.java b/eco-api/src/main/java/com/willfp/eco/core/gui/slot/FillerSlot.java index 4ae98a35..d282c554 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/gui/slot/FillerSlot.java +++ b/eco-api/src/main/java/com/willfp/eco/core/gui/slot/FillerSlot.java @@ -30,4 +30,9 @@ public class FillerSlot implements Slot { public ItemStack getItemStack(@NotNull final Player player) { return itemStack; } + + @Override + public boolean isCaptive() { + return false; + } } diff --git a/eco-api/src/main/java/com/willfp/eco/core/gui/slot/Slot.java b/eco-api/src/main/java/com/willfp/eco/core/gui/slot/Slot.java index 1689d55e..94ec8594 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/gui/slot/Slot.java +++ b/eco-api/src/main/java/com/willfp/eco/core/gui/slot/Slot.java @@ -19,6 +19,13 @@ public interface Slot { */ ItemStack getItemStack(@NotNull Player player); + /** + * If the slot is captive. (Can items be placed in it). + * + * @return If captive. + */ + boolean isCaptive(); + /** * Create a builder for an ItemStack. * diff --git a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/EcoGUIFactory.kt b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/EcoGUIFactory.kt index 553b8367..64e0d50c 100644 --- a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/EcoGUIFactory.kt +++ b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/EcoGUIFactory.kt @@ -3,14 +3,12 @@ package com.willfp.eco.internal.gui import com.willfp.eco.core.gui.GUIFactory import com.willfp.eco.core.gui.menu.MenuBuilder import com.willfp.eco.core.gui.slot.SlotBuilder +import com.willfp.eco.core.gui.slot.SlotProvider import com.willfp.eco.internal.gui.menu.EcoMenuBuilder import com.willfp.eco.internal.gui.slot.EcoSlotBuilder -import org.bukkit.entity.Player -import org.bukkit.inventory.ItemStack -import java.util.function.Function class EcoGUIFactory : GUIFactory { - override fun createSlotBuilder(provider: Function): SlotBuilder { + override fun createSlotBuilder(provider: SlotProvider): SlotBuilder { return EcoSlotBuilder(provider) } diff --git a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/slot/EcoCaptivatorSlot.kt b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/slot/EcoCaptivatorSlot.kt index ceea0d9d..fc2190bd 100644 --- a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/slot/EcoCaptivatorSlot.kt +++ b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/slot/EcoCaptivatorSlot.kt @@ -20,4 +20,8 @@ class EcoCaptivatorSlot : EcoSlot( event.isCancelled = false } } + + override fun isCaptive(): Boolean { + return true + } } \ No newline at end of file diff --git a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/slot/EcoSlot.kt b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/slot/EcoSlot.kt index 559e8c6f..a0d19949 100644 --- a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/slot/EcoSlot.kt +++ b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/slot/EcoSlot.kt @@ -37,4 +37,8 @@ open class EcoSlot( override fun getItemStack(player: Player): ItemStack { return provider.provide(player, MenuHandler.getMenu(player.openInventory.topInventory)!!) } + + override fun isCaptive(): Boolean { + return false + } } \ No newline at end of file diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/gui/GUIListener.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/gui/GUIListener.kt index 3c57d233..d3a3402e 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/gui/GUIListener.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/gui/GUIListener.kt @@ -13,6 +13,7 @@ import org.bukkit.entity.Player import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority import org.bukkit.event.Listener +import org.bukkit.event.inventory.ClickType import org.bukkit.event.inventory.InventoryClickEvent import org.bukkit.event.inventory.InventoryCloseEvent @@ -49,6 +50,31 @@ class GUIListener(plugin: EcoPlugin) : PluginDependent(plugin), Liste plugin.scheduler.runLater({ Bukkit.getLogger().info(menu.getCaptiveItems(player).toString()) }, 1) } + @EventHandler + fun handleShiftClick(event: InventoryClickEvent) { + if (!(event.click == ClickType.SHIFT_RIGHT || event.click == ClickType.SHIFT_LEFT)) { + return + } + + val player = event.whoClicked + if (player !is Player) { + return + } + + val inv = player.openInventory.topInventory + + val menu = MenuHandler.getMenu(inv) ?: return + + val rowColumn = MenuUtils.convertSlotToRowColumn(inv.firstEmpty()) + val row = rowColumn.first!! + val column = rowColumn.second!! + val slot = menu.getSlot(row, column) + + if (!slot.isCaptive) { + event.isCancelled = true + } + } + @EventHandler(priority = EventPriority.HIGH) fun handleClose(event: InventoryCloseEvent) { val player = event.player