Fixed captive slot changes PR
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user