diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecopets/pets/PetsGUI.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecopets/pets/PetsGUI.kt index f90504f..71d4d8a 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecopets/pets/PetsGUI.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecopets/pets/PetsGUI.kt @@ -3,6 +3,8 @@ package com.willfp.ecopets.pets import com.willfp.eco.core.config.updating.ConfigUpdater import com.willfp.eco.core.gui.menu import com.willfp.eco.core.gui.menu.Menu +import com.willfp.eco.core.gui.page.Page +import com.willfp.eco.core.gui.page.PageChangeEvent import com.willfp.eco.core.gui.slot import com.willfp.eco.core.gui.slot.ConfigSlot import com.willfp.eco.core.gui.slot.FillerMask @@ -21,17 +23,6 @@ import kotlin.math.min object PetsGUI { private lateinit var menu: Menu private val petAreaSlots = mutableListOf>() - private const val pageKey = "page" - - private fun getPage(menu: Menu, player: Player): Int { - val pages = ceil(Pets.values() - .filter { player.getPetLevel(it) > 0 } - .size.toDouble() / petAreaSlots.size).toInt() - - val page = menu.getState(player, pageKey) ?: 1 - - return max(min(pages, page + 1), 1) - } @JvmStatic @ConfigUpdater @@ -42,8 +33,8 @@ object PetsGUI { val bottomRightColumn = plugin.configYml.getInt("gui.pet-area.bottom-right.column") petAreaSlots.clear() - for (row in topLeftRow..bottomRightRow) { - for (column in topLeftColumn..bottomRightColumn) { + for (row in topLeftRow .. bottomRightRow) { + for (column in topLeftColumn .. bottomRightColumn) { petAreaSlots.add(Pair(row, column)) } } @@ -55,31 +46,28 @@ object PetsGUI { val petInfoItemBuilder = { player: Player, _: Menu -> val pet = player.activePet - if (pet == null) { - ItemStackBuilder(Items.lookup(plugin.configYml.getString("gui.pet-info.no-active.item"))) + pet?.getPetInfoIcon(player) + ?: ItemStackBuilder(Items.lookup(plugin.configYml.getString("gui.pet-info.no-active.item"))) .setDisplayName(plugin.configYml.getFormattedString("gui.pet-info.no-active.name")) .addLoreLines(plugin.configYml.getFormattedStrings("gui.pet-info.no-active.lore")) .build() - } else { - pet.getPetInfoIcon(player) - } } val petIconBuilder = { player: Player, menu: Menu, index: Int -> - val page = getPage(menu, player) + val page = menu.getPage(player) val unlockedPets = Pets.values() .sortedByDescending { player.getPetLevel(it) } .filter { player.getPetLevel(it) > 0 } - val pagedIndex = ((page - 1) * petAreaSlots.size) + index + val pagedIndex = page * petAreaSlots.size - petAreaSlots.size + index val pet = unlockedPets.getOrNull(pagedIndex) pet?.getIcon(player) ?: ItemStack(Material.AIR) } return menu(plugin.configYml.getInt("gui.rows")) { - setTitle(plugin.langYml.getString("menu.title")) + title = plugin.langYml.getString("menu.title") setMask( FillerMask( @@ -88,35 +76,30 @@ object PetsGUI { ) ) - setSlot( - plugin.configYml.getInt("gui.pet-info.row"), - plugin.configYml.getInt("gui.pet-info.column"), - slot(petInfoItemBuilder) { - onLeftClick { event, _, _ -> - val player = event.whoClicked as Player - player.activePet?.levelGUI?.open(player) - } + onRender { player, menu -> + menu.setState(player, "ecopets", true) + + if (menu.getPage(player) > menu.getMaxPage(player)) { + menu.setState(player, Page.PAGE_KEY, 1) } - ) + } for ((index, pair) in petAreaSlots.withIndex()) { val (row, column) = pair - - setSlot(row, column, slot({ p, m -> petIconBuilder(p, m, index) }) { - setUpdater { p, m, _ -> - petIconBuilder(p, m, index) + setSlot(row, column, slot({ player, menu -> petIconBuilder(player, menu, index) }) { + setUpdater { player, menu, _ -> + petIconBuilder(player, menu, index) } onLeftClick { event, _, _ -> val player = event.whoClicked as Player - - val page = getPage(menu, player) + val page = menu.getPage(player) val unlockedPets = Pets.values() .sortedByDescending { player.getPetLevel(it) } .filter { player.getPetLevel(it) > 0 } - val pagedIndex = ((page - 1) * petAreaSlots.size) + index + val pagedIndex = page * petAreaSlots.size - petAreaSlots.size + index val pet = unlockedPets.getOrNull(pagedIndex) ?: return@onLeftClick @@ -134,6 +117,8 @@ object PetsGUI { }) } + // I do this for backwards compatibility because with PageChanger if you don't have any more pages, the item will disappear and this would require an update of the config for all users + // This is terrible imo, but everything for compatibility! setSlot( plugin.configYml.getInt("gui.prev-page.location.row"), plugin.configYml.getInt("gui.prev-page.location.column"), @@ -141,14 +126,19 @@ object PetsGUI { ItemStackBuilder(Items.lookup(plugin.configYml.getString("gui.prev-page.item"))) .setDisplayName(plugin.configYml.getString("gui.prev-page.name")) .build() - ) { - onLeftClick { event, _, menu -> + ) + { + onLeftClick { event, _, _ -> val player = event.whoClicked as Player - val page = getPage(menu, player) + val page = menu.getPage(player) + val newPage = max(1, min(page + -1, menu.getMaxPage(player))) - val newPage = max(1, page - 1) + if (newPage == page) { + return@onLeftClick + } - menu.setState(player, pageKey, newPage) + menu.setState(player, Page.PAGE_KEY, newPage) + menu.callEvent(player, PageChangeEvent(newPage, page)) } } ) @@ -160,19 +150,30 @@ object PetsGUI { ItemStackBuilder(Items.lookup(plugin.configYml.getString("gui.next-page.item"))) .setDisplayName(plugin.configYml.getString("gui.next-page.name")) .build() - ) { - onLeftClick { event, _, menu -> + ) + { + onLeftClick { event, _, _ -> val player = event.whoClicked as Player + val page = menu.getPage(player) + val newPage = max(1, min(page + 1, menu.getMaxPage(player))) - val pages = ceil(Pets.values() - .filter { player.getPetLevel(it) > 0 } - .size.toDouble() / petAreaSlots.size).toInt() + if (newPage == page) { + return@onLeftClick + } - val page = getPage(menu, player) + menu.setState(player, Page.PAGE_KEY, newPage) + menu.callEvent(player, PageChangeEvent(newPage, page)) + } + } + ) - val newPage = min(pages, page + 1) - - menu.setState(player, pageKey, newPage) + setSlot( + plugin.configYml.getInt("gui.pet-info.row"), + plugin.configYml.getInt("gui.pet-info.column"), + slot(petInfoItemBuilder) { + onLeftClick { event, _, _ -> + val player = event.whoClicked as Player + player.activePet?.levelGUI?.open(player) } } ) @@ -209,6 +210,21 @@ object PetsGUI { ConfigSlot(config) ) } + + maxPages { player -> + val unlockedPets = Pets.values() + .sortedByDescending { player.getPetLevel(it) } + .filter { player.getPetLevel(it) > 0 } + + val perPage = petAreaSlots.size + + val pages = if (unlockedPets.isEmpty()) { + 0 + } else { + ceil((unlockedPets.size.toDouble() / perPage)).toInt() + } + pages + } } }