diff --git a/eco-api/src/main/java/com/willfp/eco/core/gui/menu/Menu.java b/eco-api/src/main/java/com/willfp/eco/core/gui/menu/Menu.java index c6a34b5f..79acbdf4 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/gui/menu/Menu.java +++ b/eco-api/src/main/java/com/willfp/eco/core/gui/menu/Menu.java @@ -128,6 +128,13 @@ public interface Menu { */ Map getState(@NotNull Player player); + /** + * Re-render the menu for a player. + * + * @param player The player. + */ + void refresh(@NotNull Player player); + /** * Write data. * @@ -171,13 +178,6 @@ public interface Menu { @Deprecated(since = "6.35.0", forRemoval = true) Set getKeys(@NotNull Player player); - /** - * Re-render the menu for a player. - * - * @param player The player. - */ - void refresh(@NotNull Player player); - /** * Create a builder with a given amount of rows. * diff --git a/eco-api/src/main/java/com/willfp/eco/core/gui/slot/CustomSlot.java b/eco-api/src/main/java/com/willfp/eco/core/gui/slot/CustomSlot.java index 0771dee1..b05ac4a4 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/gui/slot/CustomSlot.java +++ b/eco-api/src/main/java/com/willfp/eco/core/gui/slot/CustomSlot.java @@ -40,21 +40,13 @@ public abstract class CustomSlot implements Slot { } @Override - public boolean isCaptive() { + public boolean isCaptive(@NotNull final Player player, + @NotNull final Menu menu) { if (delegate == null) { throw new IllegalStateException("Custom Slot was not initialized!"); } - return delegate.isCaptive(); - } - - @Override - public boolean isNotCaptiveFor(@NotNull final Player player) { - if (delegate == null) { - throw new IllegalStateException("Custom Slot was not initialized!"); - } - - return delegate.isNotCaptiveFor(player); + return delegate.isCaptive(player, menu); } @Override @@ -66,19 +58,6 @@ public abstract class CustomSlot implements Slot { return delegate.isCaptiveFromEmpty(); } - /** - * Get the delegate slot. - *

- * This is not required to add the slot to a menu, but is instead used internally. - * - * @return The slot. - * @deprecated Replaced with {@link Slot#getActionableSlot(Player, Menu)} - */ - @Deprecated(since = "6.43.0", forRemoval = true) - public Slot getDelegate() { - return this.delegate; - } - @Override public final Slot getActionableSlot(@NotNull final Player player, @NotNull final Menu menu) { @@ -99,4 +78,17 @@ public abstract class CustomSlot implements Slot { public final Slot getSlotAt(int row, int column) { return Slot.super.getSlotAt(row, column); } + + /** + * Get the delegate slot. + *

+ * This is not required to add the slot to a menu, but is instead used internally. + * + * @return The slot. + * @deprecated Replaced with {@link Slot#getActionableSlot(Player, Menu)} + */ + @Deprecated(since = "6.43.0", forRemoval = true) + public Slot getDelegate() { + return this.delegate; + } } diff --git a/eco-api/src/main/java/com/willfp/eco/core/gui/slot/ReactiveSlot.java b/eco-api/src/main/java/com/willfp/eco/core/gui/slot/ReactiveSlot.java index 14d52228..1af5db4a 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/gui/slot/ReactiveSlot.java +++ b/eco-api/src/main/java/com/willfp/eco/core/gui/slot/ReactiveSlot.java @@ -34,8 +34,9 @@ public abstract class ReactiveSlot implements Slot { } @Override - public boolean isCaptive() { - return false; + public boolean isCaptive(@NotNull final Player player, + @NotNull final Menu menu) { + return getSlot(player, menu).isCaptive(player, menu); } @Override 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 1e361821..f60d45c8 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 @@ -30,9 +30,14 @@ public interface Slot extends GUIComponent { /** * If the slot is captive. (Can items be placed in it). * + * @param player The player. + * @param menu The menu. * @return If captive. */ - boolean isCaptive(); + default boolean isCaptive(@NotNull final Player player, + @NotNull final Menu menu) { + return false; + } /** * Get the actionable slot to be shown. @@ -43,22 +48,16 @@ public interface Slot extends GUIComponent { *

* **Never** return {@code this} from this method. Always make sure that your * slots eventually delegate to a slot created by {@link Slot#builder()}. + *

+ * {@code this} is returned by default for backwards-compatibility. * * @param player The player. * @param menu The menu. * @return The slot. */ - Slot getActionableSlot(@NotNull final Player player, - @NotNull final Menu menu); - - /** - * If the slot is not captive for a player. - * - * @param player The player. - * @return If not captive for the player. - */ - default boolean isNotCaptiveFor(@NotNull Player player) { - return false; + default Slot getActionableSlot(@NotNull final Player player, + @NotNull final Menu menu) { + return this; } /** @@ -135,4 +134,27 @@ public interface Slot extends GUIComponent { static SlotBuilder builder(@NotNull final SlotProvider provider) { return Eco.getHandler().getGUIFactory().createSlotBuilder(provider); } + + /** + * If the slot is not captive for a player. + * + * @param player The player. + * @return If not captive for the player. + * @deprecated Captivity is now reactive, this method can produce incorrect results. + */ + @Deprecated(since = "6.43.0", forRemoval = true) + default boolean isNotCaptiveFor(@NotNull Player player) { + return false; + } + + /** + * If the slot is captive. (Can items be placed in it). + * + * @return If captive. + * @deprecated Captivity is now reactive, this method can produce incorrect results. + */ + @Deprecated(since = "6.43.0", forRemoval = true) + default boolean isCaptive() { + return false; + } } 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 5d531be2..2d46b5fe 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 @@ -145,21 +145,6 @@ public interface SlotBuilder { */ SlotBuilder notCaptiveFor(@NotNull Predicate predicate); - /** - * Modify the ItemStack. - * - * @param modifier The modifier. - * @return The builder. - * @deprecated Use {@link SlotBuilder#setUpdater(SlotUpdater)} instead. - */ - @Deprecated - default SlotBuilder setModifier(@NotNull SlotModifier modifier) { - return setUpdater((player, menu, previous) -> { - modifier.modify(player, menu, previous); - return previous; - }); - } - /** * Set the ItemStack updater. * @@ -191,4 +176,19 @@ public interface SlotBuilder { * @return The slot. */ Slot build(); + + /** + * Modify the ItemStack. + * + * @param modifier The modifier. + * @return The builder. + * @deprecated Use {@link SlotBuilder#setUpdater(SlotUpdater)} instead. + */ + @Deprecated + default SlotBuilder setModifier(@NotNull SlotModifier modifier) { + return setUpdater((player, menu, previous) -> { + modifier.modify(player, menu, previous); + return previous; + }); + } } 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 02784d89..f6aff538 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,22 +3,18 @@ package com.willfp.eco.internal.gui import com.willfp.eco.core.gui.GUIFactory import com.willfp.eco.core.gui.menu.Menu import com.willfp.eco.core.gui.menu.MenuBuilder -import com.willfp.eco.core.gui.slot.SlotBuilder import com.willfp.eco.core.gui.slot.functional.SlotProvider import com.willfp.eco.internal.gui.menu.EcoMenuBuilder import com.willfp.eco.internal.gui.page.MergedStateMenu import com.willfp.eco.internal.gui.slot.EcoSlotBuilder object EcoGUIFactory : GUIFactory { - override fun createSlotBuilder(provider: SlotProvider): SlotBuilder { - return EcoSlotBuilder(provider) - } + override fun createSlotBuilder(provider: SlotProvider) = + EcoSlotBuilder(provider) - override fun createMenuBuilder(rows: Int): MenuBuilder { - return EcoMenuBuilder(rows) - } + override fun createMenuBuilder(rows: Int): MenuBuilder = + EcoMenuBuilder(rows) - override fun blendMenuState(base: Menu, additional: Menu): Menu { - return MergedStateMenu(base, additional) - } + override fun blendMenuState(base: Menu, additional: Menu): Menu = + MergedStateMenu(base, additional) } 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 dddfebf0..9a65b00b 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 @@ -37,13 +37,9 @@ class MenuRenderedInventory( val slot = menu.getSlot(row, column, player, menu) val renderedItem = slot.getItemStack(player) - if (slot.isCaptive) { + if (slot.isCaptive(player, menu)) { val itemStack = inventory.getItem(bukkit) ?: continue - if (slot.isNotCaptiveFor(player)) { - continue - } - if (!slot.isCaptiveFromEmpty) { if (itemStack == renderedItem) { 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 76790e41..8b014aff 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 @@ -1,5 +1,6 @@ package com.willfp.eco.internal.gui.slot +import com.willfp.eco.core.gui.menu.Menu import com.willfp.eco.core.gui.slot.functional.SlotHandler import com.willfp.eco.core.gui.slot.functional.SlotProvider import com.willfp.eco.util.toSingletonList @@ -17,17 +18,13 @@ class EcoCaptiveSlot( }, { _, _, prev -> prev } ) { - override fun isCaptive(): Boolean { - return true + override fun isCaptive(player: Player, menu: Menu): Boolean { + return !notCaptiveFor(player) } override fun isCaptiveFromEmpty(): Boolean { return captiveFromEmpty } - - override fun isNotCaptiveFor(player: Player): Boolean { - return notCaptiveFor(player) - } } private fun captiveWithTest(test: (Player) -> Boolean): SlotHandler { 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 25c6ac63..1b1c8543 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,7 +5,6 @@ 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.internal.gui.menu.getMenu import com.willfp.eco.util.openMenu import org.bukkit.Material import org.bukkit.entity.Player @@ -34,7 +33,7 @@ open class EcoSlot( return updater.update(player, menu, prev) ?: ItemStack(Material.AIR) } - override fun isCaptive(): Boolean { + override fun isCaptive(player: Player, menu: Menu): Boolean { return false } diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/gui/GUIListener.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/gui/GUIListener.kt index 24085214..1784beb6 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/gui/GUIListener.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/gui/GUIListener.kt @@ -39,6 +39,8 @@ class GUIListener(private val plugin: EcoPlugin) : Listener { if (delegate is EcoSlot) { delegate.handleInventoryClick(event, menu) + } else if (delegate === this) { + return } else { delegate.handle(player, event, menu, depth + 1) } @@ -79,7 +81,7 @@ class GUIListener(private val plugin: EcoPlugin) : Listener { val slot = menu.getSlot(row, column, player, menu) - if (!slot.isCaptive) { + if (!slot.isCaptive(player, menu)) { event.isCancelled = true } }