Fixed captive slot changes PR

This commit is contained in:
Auxilor
2022-11-17 15:10:05 +00:00
parent f05c5f3cd6
commit bcb7401c74
8 changed files with 31 additions and 64 deletions

View File

@@ -42,23 +42,13 @@ public abstract class CustomSlot implements Slot {
@Override
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(player, menu);
}
@Override
public boolean isCaptiveForItem(@NotNull final Player player,
@NotNull final Menu menu,
@Nullable final ItemStack item) {
if (delegate == null) {
throw new IllegalStateException("Custom Slot was not initialized!");
}
return delegate.isCaptiveForItem(player, menu, item);
return delegate.isCaptive(player, menu, item);
}
@Override
@@ -71,7 +61,7 @@ public abstract class CustomSlot implements Slot {
}
@Override
public final Slot getActionableSlot(@NotNull final Player player,
public final @NotNull Slot getActionableSlot(@NotNull final Player player,
@NotNull final Menu menu) {
return delegate;
}

View File

@@ -36,15 +36,9 @@ public abstract class ReactiveSlot implements Slot {
@Override
public boolean isCaptive(@NotNull final Player player,
@NotNull final Menu menu) {
return getSlot(player, menu).isCaptive(player, menu);
}
@Override
public boolean isCaptiveForItem(@NotNull final Player player,
@NotNull final Menu menu,
@Nullable final ItemStack item) {
return getSlot(player, menu).isCaptiveForItem(player, menu, item);
return getSlot(player, menu).isCaptive(player, menu, item);
}
@Override

View File

@@ -47,17 +47,18 @@ public interface Slot extends GUIComponent {
}
/**
* If the slot is captive for this item. (Can this item be placed in it).
* If the slot is captive for a given item (can this item be placed in it).
*
* @param player The player.
* @param menu The menu.
* @param itemStack The item.
* @return If captive.
*/
default boolean isCaptiveForItem(@NotNull final Player player,
default boolean isCaptive(@NotNull final Player player,
@NotNull final Menu menu,
@Nullable final ItemStack itemStack) {
return false;
// Delegate to no-item version for backwards compatibility.
return this.isCaptive(player, menu);
}
/**

View File

@@ -146,15 +146,19 @@ public interface SlotBuilder {
* @param predicate The predicate. Returns true when the slot should not be captive.
* @return The builder.
*/
SlotBuilder notCaptiveFor(Predicate<Player> predicate);
default SlotBuilder notCaptiveFor(@NotNull final Predicate<Player> predicate) {
return this.notCaptiveFor((player, itemStack) -> predicate.test(player));
}
/**
* Prevent captive for players that match a predicate.
* Prevent captive for players and items that match a predicate.
*
* @param predicate The predicate. Returns true when the slot should not be captive.
* @return The builder.
*/
SlotBuilder notCaptiveForItem(BiPredicate<Player, @Nullable ItemStack> predicate);
default SlotBuilder notCaptiveFor(@NotNull BiPredicate<Player, @Nullable ItemStack> predicate) {
return this;
}
/**
* Set the ItemStack updater.

View File

@@ -72,11 +72,11 @@ fun SlotBuilder.onClick(clickType: ClickType, action: (Player, InventoryClickEve
/** @see SlotBuilder.notCaptiveFor */
fun SlotBuilder.notCaptiveFor(test: (Player) -> Boolean): SlotBuilder =
this.notCaptiveFor { test(it) }
this.notCaptiveFor { t, _ -> test(t) }
/** @see SlotBuilder.notCaptiveFor */
fun SlotBuilder.notCaptiveForItem(test: (Player, ItemStack?) -> Boolean): SlotBuilder =
this.notCaptiveForItem { player, item -> test(player, item) }
fun SlotBuilder.notCaptiveFor(test: (Player, ItemStack?) -> Boolean): SlotBuilder =
this.notCaptiveFor { player, item -> test(player, item) }
/**
* @see SlotBuilder.setModifier

View File

@@ -11,21 +11,16 @@ import org.bukkit.inventory.ItemStack
class EcoCaptiveSlot(
provider: SlotProvider,
private val captiveFromEmpty: Boolean,
private val notCaptiveFor: (Player) -> Boolean,
private val notCaptiveForItem: (Player, ItemStack?) -> Boolean
private val notCaptiveFor: (Player, ItemStack?) -> Boolean
) : EcoSlot(
provider,
ClickType.values().associateWith {
captiveWithTest(notCaptiveFor, notCaptiveForItem).toSingletonList()
captiveWithTest(notCaptiveFor).toSingletonList()
},
{ _, _, prev -> prev }
) {
override fun isCaptive(player: Player, menu: Menu): Boolean {
return !notCaptiveFor(player)
}
override fun isCaptiveForItem(player: Player, menu: Menu, itemStack: ItemStack?): Boolean {
return !notCaptiveForItem(player, itemStack)
override fun isCaptive(player: Player, menu: Menu, itemStack: ItemStack?): Boolean {
return !notCaptiveFor(player, itemStack)
}
override fun isCaptiveFromEmpty(): Boolean {
@@ -33,9 +28,6 @@ class EcoCaptiveSlot(
}
}
private fun captiveWithTest(test: (Player) -> Boolean,
itemTest: (Player, ItemStack?) -> Boolean): SlotHandler {
return SlotHandler { event, _, _ ->
event.isCancelled = itemTest(event.whoClicked as Player, event.cursor) || test(event.whoClicked as Player)
}
private fun captiveWithTest(itemTest: (Player, ItemStack?) -> Boolean): SlotHandler = SlotHandler { event, _, _ ->
event.isCancelled = itemTest(event.whoClicked as Player, event.cursor)
}

View File

@@ -9,7 +9,6 @@ import org.bukkit.entity.Player
import org.bukkit.event.inventory.ClickType
import org.bukkit.inventory.ItemStack
import java.util.function.BiPredicate
import java.util.function.Predicate
class EcoSlotBuilder(private val provider: SlotProvider) : SlotBuilder {
private var captive = false
@@ -18,27 +17,15 @@ class EcoSlotBuilder(private val provider: SlotProvider) : SlotBuilder {
private val handlers = mutableMapOf<ClickType, MutableList<SlotHandler>>()
private var notCaptiveFor: (Player) -> Boolean = { false }
private var notCaptiveForItem: (Player, ItemStack?) -> Boolean = { _, _ -> false}
private var notCaptiveFor: (Player, ItemStack?) -> Boolean = { _, _ -> false}
override fun onClick(type: ClickType, action: SlotHandler): SlotBuilder {
handlers.computeIfAbsent(type) { mutableListOf() } += action
return this
}
override fun notCaptiveFor(predicate: Predicate<Player>): SlotBuilder {
notCaptiveFor = { predicate.test(it) }
return this
}
/**
* Prevent captive for players that match a predicate.
*
* @param predicate The predicate. Returns true when the slot should not be captive.
* @return The builder.
*/
override fun notCaptiveForItem(predicate: BiPredicate<Player, ItemStack?>): SlotBuilder {
notCaptiveForItem = { player, item -> predicate.test(player, item) }
override fun notCaptiveFor(predicate: BiPredicate<Player, ItemStack?>): SlotBuilder {
notCaptiveFor = { player, item -> predicate.test(player, item) }
return this
}
@@ -58,8 +45,7 @@ class EcoSlotBuilder(private val provider: SlotProvider) : SlotBuilder {
EcoCaptiveSlot(
provider,
captiveFromEmpty,
notCaptiveFor,
notCaptiveForItem
notCaptiveFor
)
} else {
EcoSlot(

View File

@@ -95,7 +95,7 @@ class GUIListener(private val plugin: EcoPlugin) : Listener {
val slot = menu.getSlot(row, column, player)
if (!slot.isCaptive(player, menu) || !slot.isCaptiveForItem(player, menu, event.currentItem)) {
if (!slot.isCaptive(player, menu, event.currentItem)) {
event.isCancelled = true
}
}