package fr.azur.tcoww.ui import fr.azur.tcoww.Tcoww import fr.azur.tcoww.roles.Role import net.kyori.adventure.text.Component import net.kyori.adventure.text.format.NamedTextColor import org.bukkit.NamespacedKey import org.bukkit.event.inventory.InventoryClickEvent import org.bukkit.event.inventory.InventoryCloseEvent import org.bukkit.inventory.Inventory import org.bukkit.inventory.ItemStack import org.bukkit.inventory.meta.Damageable import java.util.concurrent.CompletableFuture import kotlin.math.ceil class GameConfig( playerCount: Int, ) : CustomUI { // [index, [role key, amount]] val rolesConfig = hashMapOf>() val size = (Role.registerRoles.count() / 9 + 1) * 9 val future = CompletableFuture>() private val inventory = Tcoww.instance.server.createInventory(this, size, Component.text("Game Config.", NamedTextColor.GREEN)).apply { Role.registerRoles.values.sortedBy { it.order }.onEachIndexed { index, role -> setItem(index, createItem(index, role)) } } init { val werewolfCount = ceil((playerCount * (Tcoww.instance.config.getInt("werewolf-default-percentage") / 100f))).toInt() editItem(0, playerCount - werewolfCount) editItem(1, werewolfCount) } private fun createItem( index: Int, role: Role, ): ItemStack { rolesConfig[index] = Pair(role.id, 0) return ItemStack.of(role.icon).apply { itemMeta = (itemMeta as Damageable).apply { lore( role.description, ) itemName( role.displayName, ) setMaxStackSize(1) setMaxDamage(1) damage = 1 } } } private fun editItem( index: Int, newAmount: Int, ) { if (newAmount !in 0..99) throw IllegalArgumentException("Amount must be in 0 and 99 !") rolesConfig[index] = Pair(rolesConfig[index]!!.first, newAmount) val item = inventory.getItem(index) ?: return item.itemMeta = (item.itemMeta as Damageable).apply { if (newAmount == 0) { setMaxStackSize(1) setMaxDamage(1) damage = 1 } else { damage = 0 setMaxStackSize(99) item.amount = newAmount } } } override fun getInventory(): Inventory = inventory override fun onClick(event: InventoryClickEvent) { event.isCancelled = true val index = event.slot if (index !in 0..