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 6fb28ddd..5995e11b 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 @@ -2,10 +2,12 @@ package com.willfp.eco.core.gui.slot; import com.willfp.eco.core.Eco; import com.willfp.eco.core.gui.slot.functional.SlotProvider; +import com.willfp.eco.core.items.TestableItem; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.function.Function; @@ -28,6 +30,14 @@ public interface Slot { */ boolean isCaptive(); + /** + * Get default captive item. + * + * @param player The player. + * @return The item, or null if no captive default was found. + */ + @Nullable TestableItem getCaptiveDefault(@NotNull Player player); + /** * Create a builder for an ItemStack. * 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 caed0b72..af517a45 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 @@ -3,10 +3,14 @@ package com.willfp.eco.core.gui.slot; import com.willfp.eco.core.gui.slot.functional.SlotHandler; import com.willfp.eco.core.gui.slot.functional.SlotModifier; import com.willfp.eco.core.gui.slot.functional.SlotUpdater; +import com.willfp.eco.core.items.TestableItem; +import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryClickEvent; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.function.BiConsumer; +import java.util.function.Function; /** * Builder to create slots. @@ -130,7 +134,17 @@ public interface SlotBuilder { * * @return The builder. */ - SlotBuilder setCaptive(); + default SlotBuilder setCaptive() { + return setCaptive(null); + } + + /** + * Set slot to be a captive default with a default provider. + * + * @param provider The provider. + * @return The builder. + */ + SlotBuilder setCaptive(@Nullable Function provider); /** * Build the slot. diff --git a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/menu/MenuRenderedInventory.kt b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/menu/MenuRenderedInventory.kt index 6f6f5dd4..20994f0d 100644 --- a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/menu/MenuRenderedInventory.kt +++ b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/menu/MenuRenderedInventory.kt @@ -43,7 +43,10 @@ class MenuRenderedInventory( val renderedItem = slot.getItemStack(player) val itemStack = inventory.getItem(i) ?: continue - if (itemStack == renderedItem || itemStack.type.isAir || itemStack.amount == 0) { + val isCaptiveDefault = (slot.getCaptiveDefault(player)?.matches(itemStack)) + ?: (renderedItem == itemStack) + + if (isCaptiveDefault || itemStack.type.isAir || itemStack.amount == 0) { continue } 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 cb9ada47..109f9d43 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 @@ -2,9 +2,12 @@ package com.willfp.eco.internal.gui.slot import com.willfp.eco.core.gui.slot.functional.SlotHandler import com.willfp.eco.core.gui.slot.functional.SlotProvider +import com.willfp.eco.core.items.TestableItem +import org.bukkit.entity.Player class EcoCaptiveSlot( - provider: SlotProvider + provider: SlotProvider, + private val captiveDefault: ((Player) -> TestableItem?)? ) : EcoSlot( provider, allowMovingItem, @@ -17,8 +20,12 @@ class EcoCaptiveSlot( override fun isCaptive(): Boolean { return true } + + override fun getCaptiveDefault(player: Player): TestableItem? { + return captiveDefault?.invoke(player) + } } 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/EcoSlot.kt b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/slot/EcoSlot.kt index 84857be5..66eebbd8 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 @@ -5,6 +5,7 @@ import com.willfp.eco.core.gui.slot.Slot 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 com.willfp.eco.core.items.TestableItem import com.willfp.eco.internal.gui.menu.getMenu import org.bukkit.Material import org.bukkit.entity.Player @@ -55,4 +56,8 @@ open class EcoSlot( override fun isCaptive(): Boolean { return false } + + override fun getCaptiveDefault(player: Player): TestableItem? { + return null + } } \ 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 d4f7da97..007aa0de 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 @@ -5,9 +5,13 @@ 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 com.willfp.eco.core.items.TestableItem +import org.bukkit.entity.Player +import java.util.function.Function class EcoSlotBuilder(private val provider: SlotProvider) : SlotBuilder { private var captive = false + private var captiveDefault: ((Player) -> TestableItem?)? = null private var updater: SlotUpdater = SlotUpdater { player, menu, _ -> provider.provide(player, menu) } private var onLeftClick = @@ -46,8 +50,11 @@ class EcoSlotBuilder(private val provider: SlotProvider) : SlotBuilder { return this } - override fun setCaptive(): SlotBuilder { + override fun setCaptive(provider: Function?): SlotBuilder { captive = true + if (provider != null) { + captiveDefault = { provider.apply(it) } + } return this } @@ -58,7 +65,7 @@ class EcoSlotBuilder(private val provider: SlotProvider) : SlotBuilder { override fun build(): Slot { return if (captive) { - EcoCaptiveSlot(provider) + EcoCaptiveSlot(provider, captiveDefault) } else { EcoSlot(provider, onLeftClick, onRightClick, onShiftLeftClick, onShiftRightClick, onMiddleClick, updater) }