Improved slots

This commit is contained in:
Auxilor
2022-05-29 11:11:16 +01:00
parent d539b9e59e
commit 2c96b79aba
3 changed files with 72 additions and 20 deletions

View File

@@ -102,6 +102,13 @@ public interface SlotBuilder {
*/
SlotBuilder onMiddleClick(@NotNull SlotHandler handler);
/**
* Prevent all clicks.
*
* @return The builder.
*/
SlotBuilder preventAllClicks();
/**
* Modify the ItemStack.
*

View File

@@ -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
}

View File

@@ -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
)
}
}
}