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

@@ -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)
}
}
}