diff --git a/core/src/main/java/github/nighter/smartspawner/SmartSpawner.java b/core/src/main/java/github/nighter/smartspawner/SmartSpawner.java index 6a93f8d1..f10169cc 100644 --- a/core/src/main/java/github/nighter/smartspawner/SmartSpawner.java +++ b/core/src/main/java/github/nighter/smartspawner/SmartSpawner.java @@ -433,4 +433,16 @@ public void debug(String message) { public SpawnerMenuFormUI getSpawnerMenuFormUI() { return spawnerMenuFormUI; } + + public SpawnerMenuAction getSpawnerMenuAction() { + return spawnerMenuAction; + } + + public SpawnerStackerUI getSpawnerStackerUI() { + return spawnerStackerUI; + } + + public SpawnerSellManager getSpawnerSellManager() { + return spawnerSellManager; + } } diff --git a/core/src/main/java/github/nighter/smartspawner/spawner/gui/main/SpawnerMenuAction.java b/core/src/main/java/github/nighter/smartspawner/spawner/gui/main/SpawnerMenuAction.java index 54959635..cc6dd979 100644 --- a/core/src/main/java/github/nighter/smartspawner/spawner/gui/main/SpawnerMenuAction.java +++ b/core/src/main/java/github/nighter/smartspawner/spawner/gui/main/SpawnerMenuAction.java @@ -161,6 +161,18 @@ private boolean handleLayoutAction(Player player, SpawnerData spawner, int slot, handleExpBottleClick(player, spawner, true); handleSellAllItems(player, spawner); return true; + case "sell_all": + if (isClickTooFrequent(player)) { + return true; + } + // Check permissions for selling + if (!plugin.hasSellIntegration() || !player.hasPermission("smartspawner.sellall")) { + messageService.sendMessage(player, "no_permission"); + return true; + } + // Sell all items only (no XP collection) + handleSellAllItems(player, spawner); + return true; case "collect_exp": handleExpBottleClick(player, spawner, false); return true; diff --git a/core/src/main/java/github/nighter/smartspawner/spawner/gui/main/SpawnerMenuFormUI.java b/core/src/main/java/github/nighter/smartspawner/spawner/gui/main/SpawnerMenuFormUI.java index d654fe06..16250fdf 100644 --- a/core/src/main/java/github/nighter/smartspawner/spawner/gui/main/SpawnerMenuFormUI.java +++ b/core/src/main/java/github/nighter/smartspawner/spawner/gui/main/SpawnerMenuFormUI.java @@ -4,6 +4,8 @@ import github.nighter.smartspawner.language.MessageService; import github.nighter.smartspawner.spawner.properties.SpawnerData; import github.nighter.smartspawner.language.LanguageManager; +import github.nighter.smartspawner.spawner.gui.layout.GuiLayout; +import github.nighter.smartspawner.spawner.gui.layout.GuiButton; import org.bukkit.entity.Player; import org.geysermc.cumulus.form.SimpleForm; import org.geysermc.cumulus.util.FormImage; @@ -11,32 +13,20 @@ import java.util.HashMap; import java.util.Map; +import java.util.List; +import java.util.ArrayList; -/** - * Manages form-based UI for Bedrock players using Floodgate - */ public class SpawnerMenuFormUI { private final SmartSpawner plugin; private final LanguageManager languageManager; private final MessageService messageService; - /** - * Constructs the SpawnerMenuFormUI. - * - * @param plugin The main plugin instance - */ public SpawnerMenuFormUI(SmartSpawner plugin) { this.plugin = plugin; this.languageManager = plugin.getLanguageManager(); this.messageService = plugin.getMessageService(); } - /** - * Opens the spawner form for a Bedrock player - * - * @param player The player to open the form for - * @param spawner The spawner data to display - */ public void openSpawnerForm(Player player, SpawnerData spawner) { String entityName = languageManager.getFormattedMobName(spawner.getEntityType()); Map placeholders = new HashMap<>(); @@ -50,43 +40,47 @@ public void openSpawnerForm(Player player, SpawnerData spawner) { title = languageManager.getGuiTitle("gui_title_main.single_spawner", placeholders); } - // Get button texts from language configuration - String lootButtonText = languageManager.getGuiItemName("bedrock_gui.buttons.storage", placeholders); - String infoButtonText = languageManager.getGuiItemName("bedrock_gui.buttons.stack_info", placeholders); - String expButtonText = languageManager.getGuiItemName("bedrock_gui.buttons.experience", placeholders); + // Get layout configuration to determine which buttons to show + GuiLayout layout = plugin.getGuiLayoutConfig().getCurrentMainLayout(); + if (layout == null) { + // Fallback to original behavior if no layout available + openFallbackForm(player, spawner, title); + return; + } - // Create a simple form with buttons for each action - SimpleForm form = SimpleForm.builder() + // Collect available buttons based on layout and permissions + List availableButtons = collectAvailableButtons(layout, player, spawner, placeholders); + + if (availableButtons.isEmpty()) { + messageService.sendMessage(player, "no_permission"); + return; + } + + // Build the form with available buttons and info content at bottom + SimpleForm.Builder formBuilder = SimpleForm.builder() .title(title) - .content(createInfoContent(player, spawner)) - // Add buttons with configurable text from language files - .button(lootButtonText, FormImage.Type.URL, "https://img.icons8.com/?size=100&id=e78DnJp8bhmX&format=png&color=000000") - .button(infoButtonText, FormImage.Type.URL, "https://static.wikia.nocookie.net/minecraft_gamepedia/images/c/cf/Spawner_with_fire.png/revision/latest?cb=20190925003048") - .button(expButtonText, FormImage.Type.URL, "https://static.wikia.nocookie.net/minecraft_gamepedia/images/1/10/Bottle_o%27_Enchanting.gif/revision/latest?cb=20200428012753") - // Add closed or invalid response handler + .content(createInfoContent(player, spawner)); + + // Add buttons to form + for (ButtonInfo buttonInfo : availableButtons) { + formBuilder.button(buttonInfo.text, FormImage.Type.URL, buttonInfo.imageUrl); + } + + // Configure form response handlers + SimpleForm form = formBuilder .closedOrInvalidResultHandler(() -> { // Do nothing when form is closed without selecting }) - // Add valid response handler .validResultHandler(response -> { - // Get the index of the clicked button int buttonId = response.clickedButtonId(); - - // Schedule the action to run on the main server thread - plugin.getServer().getScheduler().runTask(plugin, () -> { - // Handle the button click based on the button ID - switch (buttonId) { - case 0: // Loot Storage - handleLootStorage(player, spawner); - break; - case 1: // Spawner Info - handleSpawnerInfo(player, spawner); - break; - case 2: // Experience - handleExpCollection(player, spawner); - break; - } - }); + if (buttonId >= 0 && buttonId < availableButtons.size()) { + ButtonInfo buttonInfo = availableButtons.get(buttonId); + + // Schedule the action to run on the main server thread + plugin.getServer().getScheduler().runTask(plugin, () -> { + handleButtonAction(player, spawner, buttonInfo.action); + }); + } }) .build(); @@ -94,15 +88,99 @@ public void openSpawnerForm(Player player, SpawnerData spawner) { FloodgateApi.getInstance().getPlayer(player.getUniqueId()).sendForm(form); } + private List collectAvailableButtons(GuiLayout layout, Player player, SpawnerData spawner, Map placeholders) { + List buttons = new ArrayList<>(); + + // Check for storage button + GuiButton storageButton = layout.getButton("storage"); + if (storageButton != null && storageButton.isEnabled()) { + String text = languageManager.getGuiItemName("bedrock_gui.buttons.storage", placeholders); + buttons.add(new ButtonInfo("open_storage", text, "https://img.icons8.com/?size=100&id=e78DnJp8bhmX&format=png&color=000000")); + } + + // Check for spawner info/stacker button + boolean hasShopPermission = plugin.hasSellIntegration() && player.hasPermission("smartspawner.sellall"); + GuiButton spawnerInfoButton = getSpawnerInfoButton(layout, hasShopPermission); + if (spawnerInfoButton != null && spawnerInfoButton.isEnabled() && + player.hasPermission("smartspawner.stack")) { + String text = languageManager.getGuiItemName("bedrock_gui.buttons.stack_info", placeholders); + buttons.add(new ButtonInfo("open_stacker", text, "https://static.wikia.nocookie.net/minecraft_gamepedia/images/c/cf/Spawner_with_fire.png/revision/latest?cb=20190925003048")); + } + + // Check for sell_inventory button (Claim XP and Sell All) + if (hasShopPermission) { + GuiButton sellInventoryButton = layout.getButton("spawner_info_with_shop"); + if (sellInventoryButton != null && sellInventoryButton.isEnabled() && + sellInventoryButton.getAction("left_click") != null && + sellInventoryButton.getAction("left_click").equals("sell_inventory")) { + String text = languageManager.getGuiItemName("bedrock_gui.buttons.sell_inventory", placeholders); + buttons.add(new ButtonInfo("sell_inventory", text, "https://img.icons8.com/?size=100&id=12815&format=png&color=FFD700")); + } + + // Check for sell_all button (Sell items only) + GuiButton sellAllButton = layout.getButton("sell_all"); + if (sellAllButton != null && sellAllButton.isEnabled()) { + String text = languageManager.getGuiItemName("bedrock_gui.buttons.sell_all", placeholders); + buttons.add(new ButtonInfo("sell_all", text, "https://img.icons8.com/?size=100&id=12815&format=png&color=FFA500")); + } + } + + // Check for experience button + GuiButton expButton = layout.getButton("exp"); + if (expButton != null && expButton.isEnabled()) { + String text = languageManager.getGuiItemName("bedrock_gui.buttons.experience", placeholders); + buttons.add(new ButtonInfo("collect_exp", text, "https://static.wikia.nocookie.net/minecraft_gamepedia/images/1/10/Bottle_o%27_Enchanting.gif/revision/latest?cb=20200428012753")); + } + + return buttons; + } + + private GuiButton getSpawnerInfoButton(GuiLayout layout, boolean hasShopPermission) { + // Check for shop integration permission + if (hasShopPermission) { + GuiButton shopButton = layout.getButton("spawner_info_with_shop"); + if (shopButton != null) { + return shopButton; + } + } else { + GuiButton noShopButton = layout.getButton("spawner_info_no_shop"); + if (noShopButton != null) { + return noShopButton; + } + } + + // Fallback to the generic spawner_info button if conditional ones don't exist + return layout.getButton("spawner_info"); + } + private String createInfoContent(Player player, SpawnerData spawner) { + // Get configured info content from language file - use hardcoded header as fallback + String header = "INFORMATION:"; + StringBuilder content = new StringBuilder(); + content.append(header).append("\n\n"); - // Get entity names with proper formatting - String entityName = languageManager.getFormattedMobName(spawner.getEntityType()); - String entityNameSmallCaps = languageManager.getSmallCaps(languageManager.getFormattedMobName(spawner.getEntityType())); + // Prepare placeholders for content replacement + Map placeholders = createContentPlaceholders(player, spawner); + + // Add spawner info section + addConfiguredSection(content, "spawner_info", placeholders); + + // Add storage info section + addConfiguredSection(content, "storage_info", placeholders); + + // Add experience info section + addConfiguredSection(content, "experience_info", placeholders); + + return content.toString(); + } - // Prepare placeholders for consistent formatting + private Map createContentPlaceholders(Player player, SpawnerData spawner) { Map placeholders = new HashMap<>(); + + // Entity information + String entityName = languageManager.getFormattedMobName(spawner.getEntityType()); + String entityNameSmallCaps = languageManager.getSmallCaps(entityName); placeholders.put("entity", entityName); placeholders.put("ᴇɴᴛɪᴛʏ", entityNameSmallCaps); placeholders.put("stack_size", String.valueOf(spawner.getStackSize())); @@ -120,6 +198,7 @@ private String createInfoContent(Player player, SpawnerData spawner) { placeholders.put("current_items", String.valueOf(currentItems)); placeholders.put("max_items", languageManager.formatNumber(maxSlots)); placeholders.put("formatted_storage", formattedPercentStorage); + placeholders.put("storage_status", getStorageStatus(currentItems, maxSlots)); // Experience information long currentExp = spawner.getSpawnerExp(); @@ -132,31 +211,50 @@ private String createInfoContent(Player player, SpawnerData spawner) { placeholders.put("current_exp", formattedCurrentExp); placeholders.put("max_exp", formattedMaxExp); placeholders.put("formatted_exp", formattedPercentExp); + placeholders.put("exp_status", getExpStatus(currentExp, maxExp)); - // Build content using the same style as the main GUI + return placeholders; + } + + private void addConfiguredSection(StringBuilder content, String sectionName, Map placeholders) { + // Use the GUI item lore method which can access configuration + List sectionLines = languageManager.getGuiItemLoreAsList("bedrock_gui.info_content.sections." + sectionName, placeholders); - // Spawner Information Section - matching spawner_info_item style - content.append("b68ee◈ a2be2ɪɴꜰᴏʀᴍᴀᴛɪᴏɴ:\n"); - content.append(" &#e6e6fa• ꜱᴛᴀᴄᴋ: &#c2a8fc").append(spawner.getStackSize()).append("\n"); - content.append(" &#e6e6fa• ʀᴀɴɢᴇ: &#c2a8fc").append(spawner.getSpawnerRange()).append("&#e6e6fa ʙʟᴏᴄᴋꜱ\n"); - content.append(" &#e6e6fa• ᴍᴏʙꜱ: &#c2a8fc").append(spawner.getMinMobs()).append("&#e6e6fa - &#c2a8fc").append(spawner.getMaxMobs()).append("\n"); - content.append(" &#e6e6fa• ᴅᴇʟᴀʏ: &#c2a8fc").append(spawner.getSpawnDelay() / 20).append("&#e6e6faꜱ\n\n"); - - // Storage Section - matching spawner_storage_item style - content.append("&#d9b50c◈ &#fce96aꜱᴛᴏʀᴀɢᴇ:\n"); - content.append(" &#f8f8ff• ꜱʟᴏᴛꜱ: &#f9cf51").append(currentItems).append("&#d9b50c/&#f9cf51").append(languageManager.formatNumber(maxSlots)).append("\n"); - content.append(" &#f8f8ff• ꜱᴛᴀᴛᴜꜱ: ").append(getStorageStatus(currentItems, maxSlots)).append("\n\n"); - - // Experience Section - matching exp_info_item style - content.append("cc483◈ 0e89bᴇxᴘᴇʀɪᴇɴᴄᴇ:\n"); - content.append(" &#f8f8ff• ᴄᴜʀʀᴇɴᴛ: %eb9a").append(formattedCurrentExp).append("cc483/%eb9a").append(formattedMaxExp).append(" cc483xᴘ\n"); - content.append(" &#f8f8ff• ꜱᴛᴀᴛᴜꜱ: ").append(getExpStatus(currentExp, maxExp)).append("\n"); + // If the configuration key doesn't exist, add default content + if (sectionLines.isEmpty()) { + addDefaultSection(content, sectionName, placeholders); + return; + } + + for (String line : sectionLines) { + content.append(line).append("\n"); + } + } - return content.toString(); + private void addDefaultSection(StringBuilder content, String sectionName, Map placeholders) { + // Default fallback content if configuration is missing + switch (sectionName) { + case "spawner_info": + content.append("Stack: ").append(placeholders.get("stack_size")).append("\n"); + content.append("Range: ").append(placeholders.get("range")).append(" blocks\n"); + content.append("Mobs: ").append(placeholders.get("min_mobs")).append(" - ").append(placeholders.get("max_mobs")).append("\n"); + content.append("Delay: ").append(placeholders.get("delay")).append("s\n\n"); + break; + case "storage_info": + content.append("STORAGE:\n"); + content.append("Slots: ").append(placeholders.get("current_items")).append("/").append(placeholders.get("max_items")).append("\n"); + content.append("Status: ").append(placeholders.get("storage_status")).append("\n\n"); + break; + case "experience_info": + content.append("EXPERIENCE:\n"); + content.append("Current: ").append(placeholders.get("current_exp")).append("/").append(placeholders.get("max_exp")).append(" XP\n"); + content.append("Status: ").append(placeholders.get("exp_status")).append("\n"); + break; + } } private String getStorageStatus(int current, int max) { - double ratio = (double) current / max; + double ratio = max > 0 ? (double) current / max : 0; Map placeholders = new HashMap<>(); if (ratio >= 0.9) return languageManager.getGuiItemName("bedrock_gui.status.storage.nearly_full", placeholders); @@ -167,7 +265,7 @@ private String getStorageStatus(int current, int max) { } private String getExpStatus(long current, long max) { - double ratio = (double) current / max; + double ratio = max > 0 ? (double) current / max : 0; Map placeholders = new HashMap<>(); if (ratio >= 0.9) return languageManager.getGuiItemName("bedrock_gui.status.experience.almost_full", placeholders); @@ -177,60 +275,93 @@ private String getExpStatus(long current, long max) { return languageManager.getGuiItemName("bedrock_gui.status.experience.empty", placeholders); } - /** - * Handles the loot storage button click - * - * @param player The player clicking the button - * @param spawner The spawner data - */ + private void handleButtonAction(Player player, SpawnerData spawner, String action) { + switch (action) { + case "open_storage": + handleLootStorage(player, spawner); + break; + case "open_stacker": + handleSpawnerInfo(player, spawner); + break; + case "sell_inventory": + handleSellInventory(player, spawner); + break; + case "sell_all": + handleSellAll(player, spawner); + break; + case "collect_exp": + handleExpCollection(player, spawner); + break; + } + } + private void handleLootStorage(Player player, SpawnerData spawner) { - // Use the existing chest handler from your SpawnerMenuAction class plugin.getSpawnerMenuAction().handleChestClick(player, spawner); } - /** - * Handles the spawner info button click - * - * @param player The player clicking the button - * @param spawner The spawner data - */ private void handleSpawnerInfo(Player player, SpawnerData spawner) { if (!player.hasPermission("smartspawner.stack")) { messageService.sendMessage(player, "no_permission"); return; } - plugin.getSpawnerStackerUI().openStackerGui(player, spawner); } - /** - * Handles the experience collection button click - * - * @param player The player clicking the button - * @param spawner The spawner data - */ + private void handleSellInventory(Player player, SpawnerData spawner) { + if (!plugin.hasSellIntegration() || !player.hasPermission("smartspawner.sellall")) { + messageService.sendMessage(player, "no_permission"); + return; + } + // Collect XP and sell all items + plugin.getSpawnerMenuAction().handleExpBottleClick(player, spawner, true); + plugin.getSpawnerSellManager().sellAllItems(player, spawner); + } + + private void handleSellAll(Player player, SpawnerData spawner) { + if (!plugin.hasSellIntegration() || !player.hasPermission("smartspawner.sellall")) { + messageService.sendMessage(player, "no_permission"); + return; + } + // Sell all items only (no XP collection) + plugin.getSpawnerSellManager().sellAllItems(player, spawner); + } + private void handleExpCollection(Player player, SpawnerData spawner) { - // This will execute the same logic as your handleExpBottleClick method plugin.getSpawnerMenuAction().handleExpBottleClick(player, spawner, false); } - /** - * Calculates a percentage safely (avoids division by zero). - * - * @param current Current value - * @param maximum Maximum value - * @return Percentage (0-100) - */ - private int calculatePercentage(long current, long maximum) { - return maximum > 0 ? (int) ((double) current / maximum * 100) : 0; + private void openFallbackForm(Player player, SpawnerData spawner, String title) { + // Fallback to original hard-coded form if layout is not available + Map placeholders = new HashMap<>(); + placeholders.put("entity", languageManager.getFormattedMobName(spawner.getEntityType())); + placeholders.put("amount", String.valueOf(spawner.getStackSize())); + + String lootButtonText = languageManager.getGuiItemName("bedrock_gui.buttons.storage", placeholders); + String infoButtonText = languageManager.getGuiItemName("bedrock_gui.buttons.stack_info", placeholders); + String expButtonText = languageManager.getGuiItemName("bedrock_gui.buttons.experience", placeholders); + + SimpleForm form = SimpleForm.builder() + .title(title) + .content(createInfoContent(player, spawner)) + .button(lootButtonText, FormImage.Type.URL, "https://img.icons8.com/?size=100&id=e78DnJp8bhmX&format=png&color=000000") + .button(infoButtonText, FormImage.Type.URL, "https://static.wikia.nocookie.net/minecraft_gamepedia/images/c/cf/Spawner_with_fire.png/revision/latest?cb=20190925003048") + .button(expButtonText, FormImage.Type.URL, "https://static.wikia.nocookie.net/minecraft_gamepedia/images/1/10/Bottle_o%27_Enchanting.gif/revision/latest?cb=20200428012753") + .closedOrInvalidResultHandler(() -> {}) + .validResultHandler(response -> { + int buttonId = response.clickedButtonId(); + plugin.getServer().getScheduler().runTask(plugin, () -> { + switch (buttonId) { + case 0: handleLootStorage(player, spawner); break; + case 1: handleSpawnerInfo(player, spawner); break; + case 2: handleExpCollection(player, spawner); break; + } + }); + }) + .build(); + + FloodgateApi.getInstance().getPlayer(player.getUniqueId()).sendForm(form); } - /** - * Checks if a player is a Bedrock player via Floodgate - * - * @param player The player to check - * @return true if player is from Bedrock, false otherwise - */ public static boolean isBedrockPlayer(Player player) { try { return FloodgateApi.getInstance().isFloodgatePlayer(player.getUniqueId()); @@ -238,4 +369,16 @@ public static boolean isBedrockPlayer(Player player) { return false; } } + + private static class ButtonInfo { + final String action; + final String text; + final String imageUrl; + + ButtonInfo(String action, String text, String imageUrl) { + this.action = action; + this.text = text; + this.imageUrl = imageUrl; + } + } } \ No newline at end of file diff --git a/core/src/main/resources/gui_layouts/DonutSMP/main_gui.yml b/core/src/main/resources/gui_layouts/DonutSMP/main_gui.yml index 68eefc56..f423d712 100644 --- a/core/src/main/resources/gui_layouts/DonutSMP/main_gui.yml +++ b/core/src/main/resources/gui_layouts/DonutSMP/main_gui.yml @@ -23,7 +23,7 @@ buttons: condition: "shop_integration" actions: left_click: "sell_inventory" # Collect EXP and sell items in storage - right_click: "sell_inventory" # Open stacker GUI + right_click: "open_stacker" # Open stacker GUI # Spawner information display without shop integration # Without shop integration: Both clicks open stacker GUI @@ -32,6 +32,9 @@ buttons: material: PLAYER_HEAD enabled: true condition: "no_shop_integration" + actions: + left_click: "open_stacker" # Open stacker GUI + right_click: "open_stacker" # Open stacker GUI # Experience collection button exp: @@ -40,4 +43,14 @@ buttons: enabled: true actions: left_click: "collect_exp" - right_click: "collect_exp" \ No newline at end of file + right_click: "collect_exp" + + # Sell all items button (only items, no experience) + sell_all: + slot: 10 + material: GOLD_INGOT + enabled: true + condition: "shop_integration" + actions: + left_click: "sell_all" + right_click: "sell_all" \ No newline at end of file diff --git a/core/src/main/resources/gui_layouts/default/main_gui.yml b/core/src/main/resources/gui_layouts/default/main_gui.yml index b06dd051..8d9e8e51 100644 --- a/core/src/main/resources/gui_layouts/default/main_gui.yml +++ b/core/src/main/resources/gui_layouts/default/main_gui.yml @@ -43,4 +43,14 @@ buttons: enabled: true actions: left_click: "collect_exp" - right_click: "collect_exp" \ No newline at end of file + right_click: "collect_exp" + + # Sell all items button (only items, no experience) + sell_all: + slot: 10 + material: GOLD_INGOT + enabled: true + condition: "shop_integration" + actions: + left_click: "sell_all" + right_click: "sell_all" \ No newline at end of file diff --git a/core/src/main/resources/language/DonutSMP/gui.yml b/core/src/main/resources/language/DonutSMP/gui.yml index 9c2916c1..20380248 100644 --- a/core/src/main/resources/language/DonutSMP/gui.yml +++ b/core/src/main/resources/language/DonutSMP/gui.yml @@ -33,29 +33,55 @@ bedrock_gui: # Button text configuration for Bedrock forms buttons: # Storage button - opens spawner loot storage - storage: '&#F97603Open Storage' + storage: 'Open Storage' # Info/Stack button - opens spawner stacking menu - stack_info: '&#FCE300Open Stack Menu' + stack_info: 'Open Stack Menu' # Experience button - collects stored experience - experience: '&#FCE300Collect Experience' + experience: 'Collect Experience' + + # Sell inventory button - collects XP and sells all items + sell_inventory: 'Claim XP & Sell All' + + # Sell all button - sells all items only + sell_all: 'Sell All Items' # Status text for storage and experience displays status: storage: - empty: '&#aEmpty' - plenty_space: '&#aPlenty of Space' - half_full: '&#eHalf Full' - filling_up: '&#F97603Filling Up' - nearly_full: '&#cNearly Full' + empty: 'Empty' + plenty_space: 'Plenty of Space' + half_full: 'Half Full' + filling_up: 'Filling Up' + nearly_full: 'Nearly Full' experience: - empty: '&#aEmpty' - small_amount: '&#aSmall Amount' - medium_amount: '&#FCE300Medium Amount' - large_amount: '&#F97603Large Amount' - almost_full: '&#cAlmost Full' + empty: 'Empty' + small_amount: 'Small Amount' + medium_amount: 'Medium Amount' + large_amount: 'Large Amount' + almost_full: 'Almost Full' + + # Configurable spawner info content for Bedrock forms (displayed at bottom) + info_content: + header: 'INFORMATION:' + sections: + spawner_info: + - 'Stack: %stack_size%' + - 'Range: %range% blocks' + - 'Mobs: %min_mobs% - %max_mobs%' + - 'Delay: %delay%s' + - '' + storage_info: + - 'STORAGE:' + - 'Slots: %current_items%/%max_items%' + - 'Status: %storage_status%' + - '' + experience_info: + - 'EXPERIENCE:' + - 'Current: %current_exp%/%max_exp% XP' + - 'Status: %exp_status%' spawner_storage_item: name: '&#F97603sᴘᴀᴡɴᴇʀ sᴛᴏʀᴀɢᴇ' diff --git a/core/src/main/resources/language/en_US/gui.yml b/core/src/main/resources/language/en_US/gui.yml index 3b34c1ab..22a55b8d 100644 --- a/core/src/main/resources/language/en_US/gui.yml +++ b/core/src/main/resources/language/en_US/gui.yml @@ -33,29 +33,57 @@ bedrock_gui: # Button text configuration for Bedrock forms buttons: # Storage button - opens spawner loot storage - storage: '&#fce96aOpen Storage' + storage: 'Open Storage' # Info/Stack button - opens spawner stacking menu - stack_info: '&#ab7afdOpen Stack Menu' + stack_info: 'Open Stack Menu' # Experience button - collects stored experience - experience: '%eb9aCollect Experience' + experience: 'Collect Experience' + + # Sell inventory button - collects XP and sells all items + sell_inventory: 'Claim XP & Sell All' + + # Sell all button - sells all items only + sell_all: 'Sell All Items' # Status text for storage and experience displays status: storage: - empty: '&#aEmpty' - plenty_space: '&#aPlenty of Space' - half_full: '&#eHalf Full' - filling_up: 'Filling Up' - nearly_full: '&#cNearly Full' + empty: 'Empty' + plenty_space: 'Plenty of Space' + half_full: 'Half Full' + filling_up: 'Filling Up' + nearly_full: 'Nearly Full' experience: - empty: '&#aEmpty' - small_amount: '&#aSmall Amount' - medium_amount: '&#eMedium Amount' - large_amount: 'Large Amount' - almost_full: '&#cAlmost Full' + empty: 'Empty' + small_amount: 'Small Amount' + medium_amount: 'Medium Amount' + large_amount: 'Large Amount' + almost_full: 'Almost Full' + + # Configurable spawner info content for Bedrock forms (displayed at bottom) + # Available placeholders: %entity%, %ᴇɴᴛɪᴛʏ%, %stack_size%, %range%, %min_mobs%, %max_mobs%, %delay%, + # %current_items%, %max_items%, %formatted_storage%, %current_exp%, %max_exp%, %formatted_exp% + info_content: + header: 'INFORMATION:' + sections: + spawner_info: + - 'Stack: %stack_size%' + - 'Range: %range% blocks' + - 'Mobs: %min_mobs% - %max_mobs%' + - 'Delay: %delay%s' + - '' + storage_info: + - 'STORAGE:' + - 'Slots: %current_items%/%max_items%' + - 'Status: %storage_status%' + - '' + experience_info: + - 'EXPERIENCE:' + - 'Current: %current_exp%/%max_exp% XP' + - 'Status: %exp_status%' # Spawner Storage Item Configuration diff --git a/core/src/main/resources/language/vi_VN/gui.yml b/core/src/main/resources/language/vi_VN/gui.yml index 9d590c9a..49d7feec 100644 --- a/core/src/main/resources/language/vi_VN/gui.yml +++ b/core/src/main/resources/language/vi_VN/gui.yml @@ -33,29 +33,55 @@ bedrock_gui: # Button text configuration for Bedrock forms buttons: # Storage button - opens spawner loot storage - storage: '&#fce96aᴍở ᴋʜᴏ ᴄʜứᴀ' + storage: 'Mở Kho Chứa' # Info/Stack button - opens spawner stacking menu - stack_info: '&#ab7afdᴍở ᴍᴇɴᴜ xếᴘ ᴄʜồɴɢ' + stack_info: 'Mở Menu Xếp Chồng' # Experience button - collects stored experience - experience: '%eb9aThu thập ᴋɪɴʜ ɴɢʜɪệᴍ' + experience: 'Thu Thập Kinh Nghiệm' + + # Sell inventory button - collects XP and sells all items + sell_inventory: 'Nhận XP & Bán Tất Cả' + + # Sell all button - sells all items only + sell_all: 'Bán Tất Cả Vật Phẩm' # Status text for storage and experience displays status: storage: - empty: '&#aTrống' - plenty_space: '&#aCòn ɴʜɪềᴜ ᴄʜỗ' - half_full: '&#eNửᴀ đầʏ' - filling_up: 'Đang đầʏ dần' - nearly_full: '&#cGầɴ đầʏ' + empty: 'Trống' + plenty_space: 'Còn nhiều chỗ' + half_full: 'Nửa đầy' + filling_up: 'Đang đầy dần' + nearly_full: 'Gần đầy' experience: - empty: '&#aTrống' - small_amount: '&#aSố ʟượɴɢ ɪ́ᴛ' - medium_amount: '&#eSố ʟượɴɢ ᴛrung bình' - large_amount: 'Số ʟượɴɢ ʟớɴ' - almost_full: '&#cGầɴ đầʏ' + empty: 'Trống' + small_amount: 'Số lượng ít' + medium_amount: 'Số lượng trung bình' + large_amount: 'Số lượng lớn' + almost_full: 'Gần đầy' + + # Configurable spawner info content for Bedrock forms (displayed at bottom) + info_content: + header: 'THÔNG TIN:' + sections: + spawner_info: + - 'Chồng: %stack_size%' + - 'Phạm vi: %range% khối' + - 'Quái vật: %min_mobs% - %max_mobs%' + - 'Độ trễ: %delay%s' + - '' + storage_info: + - 'KHO CHỨA:' + - 'Ô: %current_items%/%max_items%' + - 'Trạng thái: %storage_status%' + - '' + experience_info: + - 'KINH NGHIỆM:' + - 'Hiện tại: %current_exp%/%max_exp% XP' + - 'Trạng thái: %exp_status%' spawner_storage_item: name: '&#fce96aᴋʜᴏ ᴄʜứᴀ'