From 2c96b79aba5c110cc601560ab86ea1c1f87fa28f Mon Sep 17 00:00:00 2001 From: Auxilor Date: Sun, 29 May 2022 11:11:16 +0100 Subject: [PATCH] Improved slots --- .../willfp/eco/core/gui/slot/SlotBuilder.java | 7 +++ .../eco/internal/gui/slot/EcoCaptiveSlot.kt | 27 ++++++--- .../eco/internal/gui/slot/EcoSlotBuilder.kt | 58 ++++++++++++++----- 3 files changed, 72 insertions(+), 20 deletions(-) diff --git a/eco-api/src/main/java/com/willfp/eco/core/gui/slot/SlotBuilder.java b/eco-api/src/main/java/com/willfp/eco/core/gui/slot/SlotBuilder.java index abd82a40..ed560c36 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/gui/slot/SlotBuilder.java +++ b/eco-api/src/main/java/com/willfp/eco/core/gui/slot/SlotBuilder.java @@ -102,6 +102,13 @@ public interface SlotBuilder { */ SlotBuilder onMiddleClick(@NotNull SlotHandler handler); + /** + * Prevent all clicks. + * + * @return The builder. + */ + SlotBuilder preventAllClicks(); + /** * Modify the ItemStack. * diff --git a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/slot/EcoCaptiveSlot.kt b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/slot/EcoCaptiveSlot.kt index 3d1fb15d..cb1551d3 100644 --- a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/slot/EcoCaptiveSlot.kt +++ b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/slot/EcoCaptiveSlot.kt @@ -5,14 +5,19 @@ import com.willfp.eco.core.gui.slot.functional.SlotProvider class EcoCaptiveSlot( provider: SlotProvider, - private val captiveFromEmpty: Boolean + private val captiveFromEmpty: Boolean, + onLeftClick: SlotHandler, + onRightClick: SlotHandler, + onShiftLeftClick: SlotHandler, + onShiftRightClick: SlotHandler, + onMiddleClick: SlotHandler, ) : EcoSlot( provider, - allowMovingItem, - allowMovingItem, - allowMovingItem, - allowMovingItem, - allowMovingItem, + onLeftClick.captiveIfNoop(), + onRightClick.captiveIfNoop(), + onShiftLeftClick.captiveIfNoop(), + onShiftRightClick.captiveIfNoop(), + onMiddleClick.captiveIfNoop(), { _, _, prev -> prev } ) { override fun isCaptive(): Boolean { @@ -24,6 +29,14 @@ class EcoCaptiveSlot( } } +private fun SlotHandler.captiveIfNoop(): SlotHandler { + return if (this == NoOpSlot) { + allowMovingItem + } else { + this + } +} + private val allowMovingItem = SlotHandler { event, _, _ -> event.isCancelled = false -} \ No newline at end of file +} diff --git a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/slot/EcoSlotBuilder.kt b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/slot/EcoSlotBuilder.kt index abce4746..b1f8d1fb 100644 --- a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/slot/EcoSlotBuilder.kt +++ b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/slot/EcoSlotBuilder.kt @@ -1,26 +1,33 @@ package com.willfp.eco.internal.gui.slot +import com.willfp.eco.core.gui.menu.Menu import com.willfp.eco.core.gui.slot.Slot import com.willfp.eco.core.gui.slot.SlotBuilder import com.willfp.eco.core.gui.slot.functional.SlotHandler import com.willfp.eco.core.gui.slot.functional.SlotProvider import com.willfp.eco.core.gui.slot.functional.SlotUpdater +import org.bukkit.event.inventory.InventoryClickEvent + +internal object NoOpSlot : SlotHandler { + override fun handle(event: InventoryClickEvent, slot: Slot, menu: Menu) { + // Do nothing + } + + override fun equals(other: Any?): Boolean { + return other is NoOpSlot + } +} class EcoSlotBuilder(private val provider: SlotProvider) : SlotBuilder { private var captive = false private var captiveFromEmpty = false private var updater: SlotUpdater = SlotUpdater { player, menu, _ -> provider.provide(player, menu) } - private var onLeftClick = - SlotHandler { _, _, _ -> run { } } - private var onRightClick = - SlotHandler { _, _, _ -> run { } } - private var onShiftLeftClick = - SlotHandler { _, _, _ -> run { } } - private var onShiftRightClick = - SlotHandler { _, _, _ -> run { } } - private var onMiddleClick = - SlotHandler { _, _, _ -> run { } } + private var onLeftClick: SlotHandler = NoOpSlot + private var onRightClick: SlotHandler = NoOpSlot + private var onShiftLeftClick: SlotHandler = NoOpSlot + private var onShiftRightClick: SlotHandler = NoOpSlot + private var onMiddleClick: SlotHandler = NoOpSlot override fun onLeftClick(action: SlotHandler): SlotBuilder { onLeftClick = action @@ -47,6 +54,15 @@ class EcoSlotBuilder(private val provider: SlotProvider) : SlotBuilder { return this } + override fun preventAllClicks(): SlotBuilder { + onLeftClick = NoOpSlot + onRightClick = NoOpSlot + onShiftLeftClick = NoOpSlot + onShiftRightClick = NoOpSlot + onMiddleClick = NoOpSlot + return this + } + override fun setCaptive(fromEmpty: Boolean): SlotBuilder { captive = true captiveFromEmpty = fromEmpty @@ -60,9 +76,25 @@ class EcoSlotBuilder(private val provider: SlotProvider) : SlotBuilder { override fun build(): Slot { return if (captive) { - EcoCaptiveSlot(provider, captiveFromEmpty) + EcoCaptiveSlot( + provider, + captiveFromEmpty, + onLeftClick, + onRightClick, + onShiftLeftClick, + onShiftRightClick, + onMiddleClick + ) } else { - EcoSlot(provider, onLeftClick, onRightClick, onShiftLeftClick, onShiftRightClick, onMiddleClick, updater) + EcoSlot( + provider, + onLeftClick, + onRightClick, + onShiftLeftClick, + onShiftRightClick, + onMiddleClick, + updater + ) } } -} \ No newline at end of file +}