From b6149523b1ee51ee425a7f61f0f323615a121810 Mon Sep 17 00:00:00 2001 From: Glare Date: Sat, 11 Jul 2026 21:58:02 -0500 Subject: [PATCH 1/2] feat: add shared direct vault opening --- .../me/glaremasters/guilds/guis/VaultGUI.kt | 44 ++++++++++++------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/src/main/kotlin/me/glaremasters/guilds/guis/VaultGUI.kt b/src/main/kotlin/me/glaremasters/guilds/guis/VaultGUI.kt index 9423c632e..955b156af 100644 --- a/src/main/kotlin/me/glaremasters/guilds/guis/VaultGUI.kt +++ b/src/main/kotlin/me/glaremasters/guilds/guis/VaultGUI.kt @@ -51,27 +51,50 @@ class VaultGUI(private val guilds: Guilds, private val settingsManager: Settings addItems(gui, guild, player) addBackground(gui) - num = 0 return gui } + /** + * Opens a specific guild vault, creating any missing cached vaults up to that number. + * + * @param guild the guild that owns the vault + * @param player the player opening the vault + * @param vaultNumber the one-based vault number + * @return true when the vault was valid and opened, otherwise false + */ + fun open(guild: Guild, player: Player, vaultNumber: Int): Boolean { + if (vaultNumber < 1 || !guildHandler.hasVaultUnlocked(vaultNumber, guild)) { + return false + } + + val vaults = guildHandler.vaults[guild] ?: return false + while (vaults.size < vaultNumber) { + vaults.add(guildHandler.createNewVault(settingsManager)) + } + + player.openInventory(guildHandler.getGuildVault(guild, vaultNumber)) + guildHandler.opened.add(player) + return true + } + /** * Create the regular items that will be on the GUI * - * @param pane the pane to be added to + * @param gui the GUI to add items to * @param guild the guild of the player */ private fun addItems(gui: Gui, guild: Guild, player: Player) { val max = guildHandler.getGuildTier(guild.tier.level)?.vaultAmount!! for (i in 0 until max) { - val status = if (guildHandler.hasVaultUnlocked(i + 1, guild)) settingsManager.getProperty(VaultPickerSettings.PICKER_UNLOCKED) else settingsManager.getProperty(VaultPickerSettings.PICKER_LOCKED) + val vaultNumber = i + 1 + val status = if (guildHandler.hasVaultUnlocked(vaultNumber, guild)) settingsManager.getProperty(VaultPickerSettings.PICKER_UNLOCKED) else settingsManager.getProperty(VaultPickerSettings.PICKER_LOCKED) val lore = settingsManager.getProperty(VaultPickerSettings.PICKER_LORE) val updated = mutableListOf() lore.forEach { line -> updated.add(StringUtils.color(line - .replace("{number}", (num + 1).toString()) + .replace("{number}", vaultNumber.toString()) .replace("{status}", status) )) } @@ -80,21 +103,10 @@ class VaultGUI(private val guilds: Guilds, private val settingsManager: Settings item.setAction { event -> event.isCancelled = true - try { - guildHandler.getGuildVault(guild, event.rawSlot + 1) - } catch (ex: IndexOutOfBoundsException) { - guildHandler.vaults[guild]?.add(guildHandler.createNewVault(settingsManager)) - } - player.openInventory(guildHandler.getGuildVault(guild, event.rawSlot + 1)) - guildHandler.opened.add(player) + open(guild, player, vaultNumber) } gui.addItem(item) - num++ } } - - companion object { - private var num = 0 - } } From e92ba0d18407ecc7b9ee4f063c46cbfd257b61c5 Mon Sep 17 00:00:00 2001 From: Glare Date: Sat, 11 Jul 2026 21:58:16 -0500 Subject: [PATCH 2/2] feat: support opening a numbered guild vault --- .../guilds/commands/gui/CommandGUI.kt | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/me/glaremasters/guilds/commands/gui/CommandGUI.kt b/src/main/kotlin/me/glaremasters/guilds/commands/gui/CommandGUI.kt index f823b0ebb..0d89399ea 100644 --- a/src/main/kotlin/me/glaremasters/guilds/commands/gui/CommandGUI.kt +++ b/src/main/kotlin/me/glaremasters/guilds/commands/gui/CommandGUI.kt @@ -29,12 +29,15 @@ import co.aikar.commands.annotation.CommandPermission import co.aikar.commands.annotation.Conditions import co.aikar.commands.annotation.Dependency import co.aikar.commands.annotation.Description +import co.aikar.commands.annotation.Optional import co.aikar.commands.annotation.Subcommand import co.aikar.commands.annotation.Syntax import dev.triumphteam.gui.guis.PaginatedGui import me.glaremasters.guilds.Guilds +import me.glaremasters.guilds.exceptions.ExpectationNotMet import me.glaremasters.guilds.exceptions.InvalidTierException import me.glaremasters.guilds.guild.Guild +import me.glaremasters.guilds.messages.Messages import me.glaremasters.guilds.utils.Constants import org.bukkit.entity.Player @@ -86,9 +89,16 @@ internal class CommandGUI : BaseCommand() { @Subcommand("vault") @Description("{@@descriptions.vault}") - @Syntax("") + @Syntax("%optional %vault-number") @CommandPermission(Constants.BASE_PERM + "vault") - fun vault(player: Player, @Conditions("perm:perm=OPEN_VAULT") guild: Guild) { - guilds.guiHandler.vaults.get(guild, player).open(player) + fun vault(player: Player, @Conditions("perm:perm=OPEN_VAULT") guild: Guild, @Optional vaultNumber: Int?) { + if (vaultNumber == null) { + guilds.guiHandler.vaults.get(guild, player).open(player) + return + } + + if (!guilds.guiHandler.vaults.open(guild, player, vaultNumber)) { + throw ExpectationNotMet(Messages.VAULTS__MAXED) + } } }