Added captivator slots

This commit is contained in:
Auxilor
2021-08-11 23:56:09 +01:00
parent 50550d077a
commit b652dbad2d
10 changed files with 151 additions and 25 deletions

View File

@@ -4,8 +4,11 @@ import com.willfp.eco.core.Eco;
import com.willfp.eco.core.gui.slot.Slot;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import java.util.List;
/**
* GUI version of {@link Inventory}.
* <p>
@@ -44,6 +47,14 @@ public interface Menu {
*/
Inventory open(@NotNull Player player);
/**
* Get captive items.
*
* @param player The player.
* @return The items.
*/
List<ItemStack> getCaptiveItems(@NotNull Player player);
/**
* Create a builder with a given amount of rows.
*

View File

@@ -49,6 +49,13 @@ public interface SlotBuilder {
*/
SlotBuilder onMiddleClick(@NotNull BiConsumer<InventoryClickEvent, Slot> action);
/**
* Set slot to be a captive slot.
*
* @return The builder.
*/
SlotBuilder setCaptive();
/**
* Build the slot.
*

View File

@@ -1,14 +1,13 @@
package com.willfp.eco.internal.gui.menu
import com.willfp.eco.core.gui.menu.Menu
import com.willfp.eco.core.gui.slot.FillerSlot
import com.willfp.eco.core.gui.slot.Slot
import com.willfp.eco.internal.gui.slot.EcoFillerSlot
import com.willfp.eco.util.StringUtils
import org.bukkit.Bukkit
import org.bukkit.entity.Player
import org.bukkit.event.inventory.InventoryCloseEvent
import org.bukkit.inventory.Inventory
import org.bukkit.inventory.ItemStack
import java.util.function.Consumer
class EcoMenu(
@@ -17,7 +16,6 @@ class EcoMenu(
private val title: String,
private val onClose: Consumer<InventoryCloseEvent>
): Menu {
override fun getSlot(row: Int, column: Int): Slot {
if (row < 1 || row > this.rows) {
throw IllegalArgumentException("Invalid row number!")
@@ -27,14 +25,7 @@ class EcoMenu(
throw IllegalArgumentException("Invalid column number!")
}
val slot = slots[row - 1][column - 1]
if (slot is FillerSlot) {
slots[row - 1][column - 1] = EcoFillerSlot(slot.itemStack)
return getSlot(row, column)
}
return slot
return slots[row - 1][column - 1]
}
override fun open(player: Player): Inventory {
@@ -77,4 +68,9 @@ class EcoMenu(
override fun getTitle(): String {
return title
}
override fun getCaptiveItems(player: Player): MutableList<ItemStack> {
val inventory = MenuHandler.getExtendedInventory(player.openInventory.topInventory)
return inventory.captiveItems
}
}

View File

@@ -3,6 +3,7 @@ package com.willfp.eco.internal.gui.menu
import com.willfp.eco.core.gui.menu.Menu
import com.willfp.eco.core.gui.menu.MenuBuilder
import com.willfp.eco.core.gui.slot.FillerMask
import com.willfp.eco.core.gui.slot.FillerSlot
import com.willfp.eco.core.gui.slot.Slot
import com.willfp.eco.internal.gui.slot.EcoFillerSlot
import com.willfp.eco.util.ListUtils
@@ -58,7 +59,10 @@ class EcoMenuBuilder(private val rows: Int) : MenuBuilder {
for (i in slots.indices) {
for (j in slots[i].indices) {
val slot = slots[i][j]
var slot = slots[i][j]
if (slot is FillerSlot) {
slot = EcoFillerSlot(slot.itemStack)
}
finalSlots[i][j] = slot
}
}

View File

@@ -0,0 +1,31 @@
package com.willfp.eco.internal.gui.menu
import com.willfp.eco.internal.gui.slot.EcoCaptivatorSlot
import com.willfp.eco.util.MenuUtils
import org.bukkit.entity.Player
import org.bukkit.inventory.Inventory
import org.bukkit.inventory.ItemStack
class ExtendedInventory(
val inventory: Inventory,
private val menu: EcoMenu
) {
val captiveItems: MutableList<ItemStack> = ArrayList()
fun refresh(player: Player) {
captiveItems.clear()
for (i in 0 until inventory.size) {
val pair = MenuUtils.convertSlotToRowColumn(i);
val row = pair.first!!
val column = pair.second!!
val slot = menu.getSlot(row, column)
if (slot is EcoCaptivatorSlot) {
val defaultItem = slot.getItemStack(player)
val item = inventory.getItem(i) ?: continue
if (item != defaultItem) {
captiveItems.add(item)
}
}
}
}
}

View File

@@ -4,20 +4,28 @@ import com.willfp.eco.core.gui.menu.Menu
import org.bukkit.inventory.Inventory
object MenuHandler {
private val MENUS: MutableMap<Inventory, Menu> = HashMap()
private val MENUS: MutableMap<ExtendedInventory, EcoMenu> = HashMap()
private val INVS: MutableMap<Inventory, ExtendedInventory> = HashMap()
fun registerMenu(
inventory: Inventory,
menu: Menu
menu: EcoMenu
) {
MENUS[inventory] = menu
val extendedInventory = ExtendedInventory(inventory, menu)
INVS[inventory] = extendedInventory
MENUS[extendedInventory] = menu
}
fun unregisterMenu(inventory: Inventory) {
MENUS.remove(inventory)
MENUS.remove(INVS[inventory])
INVS.remove(inventory)
}
fun getMenu(inventory: Inventory): Menu? {
return MENUS[inventory]
return MENUS[INVS[inventory]]
}
fun getExtendedInventory(inventory: Inventory): ExtendedInventory {
return INVS[inventory]!!
}
}

View File

@@ -0,0 +1,34 @@
package com.willfp.eco.internal.gui.slot
import com.willfp.eco.core.Eco
import com.willfp.eco.core.gui.slot.Slot
import org.bukkit.entity.Player
import org.bukkit.event.inventory.InventoryClickEvent
import org.bukkit.inventory.ItemStack
import java.util.function.BiConsumer
import java.util.function.Function
class EcoCaptivatorSlot(
provider: Function<Player, ItemStack>
) : EcoSlot(
provider,
allowMovingItem,
allowMovingItem,
allowMovingItem,
allowMovingItem,
allowMovingItem
) {
var captive: ItemStack? = null
override fun getItemStack(player: Player): ItemStack {
return captive ?: provider.apply(player);
}
companion object {
val plugin = Eco.getHandler().ecoPlugin!!
val allowMovingItem: BiConsumer<InventoryClickEvent, Slot> = BiConsumer { event, _ ->
event.isCancelled = false
}
}
}

View File

@@ -9,7 +9,7 @@ import java.util.function.BiConsumer
import java.util.function.Function
open class EcoSlot(
private val provider: Function<Player, ItemStack>,
val provider: Function<Player, ItemStack>,
private val onLeftClick: BiConsumer<InventoryClickEvent, Slot>,
private val onRightClick: BiConsumer<InventoryClickEvent, Slot>,
private val onShiftLeftClick: BiConsumer<InventoryClickEvent, Slot>,

View File

@@ -9,6 +9,8 @@ import java.util.function.BiConsumer
import java.util.function.Function
class EcoSlotBuilder(private val provider: Function<Player, ItemStack>) : SlotBuilder {
private var captive = false;
private var onLeftClick: BiConsumer<InventoryClickEvent, Slot> = BiConsumer { _, _ -> run { } }
private var onRightClick: BiConsumer<InventoryClickEvent, Slot> = BiConsumer { _, _ -> run { } }
private var onShiftLeftClick: BiConsumer<InventoryClickEvent, Slot> = BiConsumer { _, _ -> run { } }
@@ -40,7 +42,16 @@ class EcoSlotBuilder(private val provider: Function<Player, ItemStack>) : SlotBu
return this
}
override fun setCaptive(): SlotBuilder {
captive = true
return this
}
override fun build(): Slot {
return EcoSlot(provider, onLeftClick, onRightClick, onShiftLeftClick, onShiftRightClick, onMiddleClick)
return if (captive) {
EcoCaptivatorSlot(provider)
} else {
EcoSlot(provider, onLeftClick, onRightClick, onShiftLeftClick, onShiftRightClick, onMiddleClick)
}
}
}

View File

@@ -2,13 +2,16 @@ package com.willfp.eco.spigot.gui
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.PluginDependent
import com.willfp.eco.core.drops.DropQueue
import com.willfp.eco.internal.gui.menu.EcoMenu
import com.willfp.eco.internal.gui.menu.MenuHandler
import com.willfp.eco.internal.gui.slot.EcoSlot
import com.willfp.eco.util.MenuUtils
import org.apache.commons.lang.Validate
import org.bukkit.Bukkit
import org.bukkit.entity.Player
import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority
import org.bukkit.event.Listener
import org.bukkit.event.inventory.InventoryClickEvent
import org.bukkit.event.inventory.InventoryCloseEvent
@@ -16,13 +19,11 @@ import org.bukkit.event.inventory.InventoryCloseEvent
class GUIListener(plugin: EcoPlugin) : PluginDependent<EcoPlugin>(plugin), Listener {
@EventHandler
fun handleSlotClick(event: InventoryClickEvent) {
if (event.whoClicked !is Player) {
val player = event.whoClicked
if (player !is Player) {
return
}
if (event.clickedInventory == null) {
return
}
val menu = MenuHandler.getMenu(event.clickedInventory!!) ?: return
val menu = MenuHandler.getMenu(event.clickedInventory ?: return) ?: return
val rowColumn = MenuUtils.convertSlotToRowColumn(event.slot)
val row = rowColumn.first!!
val column = rowColumn.second!!
@@ -31,17 +32,40 @@ class GUIListener(plugin: EcoPlugin) : PluginDependent<EcoPlugin>(plugin), Liste
val ecoSlot = menu.getSlot(row, column) as EcoSlot
event.isCancelled = true
ecoSlot.handleInventoryClick(event)
plugin.scheduler.run{ MenuHandler.getExtendedInventory(event.clickedInventory!!).refresh(player) }
}
@EventHandler
fun handleCaptivatorSlots(event: InventoryClickEvent) {
val player = event.whoClicked
if (player !is Player) {
return
}
val menu = MenuHandler.getMenu(player.openInventory.topInventory) ?: return
plugin.scheduler.run{ MenuHandler.getExtendedInventory(player.openInventory.topInventory).refresh(player) }
plugin.scheduler.runLater({ Bukkit.getLogger().info(menu.getCaptiveItems(player).toString()) }, 1)
}
@EventHandler(priority = EventPriority.HIGH)
fun handleClose(event: InventoryCloseEvent) {
if (event.player !is Player) {
val player = event.player
if (player !is Player) {
return
}
val menu = MenuHandler.getMenu(event.inventory) ?: return
Validate.isTrue(menu is EcoMenu, "Menu not instance of EcoMenu!")
val ecoMenu = menu as EcoMenu
ecoMenu.handleClose(event)
DropQueue(player)
.addItems(ecoMenu.getCaptiveItems(player))
.setLocation(player.location)
.forceTelekinesis()
.push()
plugin.scheduler.run { MenuHandler.unregisterMenu(event.inventory) }
}
}