diff --git a/core/src/main/java/github/nighter/smartspawner/spawner/gui/layout/GuiButton.java b/core/src/main/java/github/nighter/smartspawner/spawner/gui/layout/GuiButton.java index b4a499a2..50d18f80 100644 --- a/core/src/main/java/github/nighter/smartspawner/spawner/gui/layout/GuiButton.java +++ b/core/src/main/java/github/nighter/smartspawner/spawner/gui/layout/GuiButton.java @@ -2,6 +2,9 @@ import lombok.Getter; import org.bukkit.Material; +import org.bukkit.Sound; + +import java.util.Map; @Getter public class GuiButton { @@ -9,12 +12,24 @@ public class GuiButton { private final int slot; private final Material material; private final boolean enabled; + private final Sound sound; + private final Map conditions; - public GuiButton(String buttonType, int slot, Material material, boolean enabled) { + public GuiButton(String buttonType, int slot, Material material, boolean enabled, Sound sound, Map conditions) { this.buttonType = buttonType; this.slot = slot; this.material = material; this.enabled = enabled; + this.sound = sound; + this.conditions = conditions; + } + + public boolean hasSound() { + return sound != null; + } + + public boolean hasConditions() { + return conditions != null && !conditions.isEmpty(); } @Override @@ -24,6 +39,8 @@ public String toString() { ", slot=" + slot + ", material=" + material + ", enabled=" + enabled + + ", sound=" + sound + + ", conditions=" + conditions + '}'; } } \ No newline at end of file diff --git a/core/src/main/java/github/nighter/smartspawner/spawner/gui/layout/GuiLayout.java b/core/src/main/java/github/nighter/smartspawner/spawner/gui/layout/GuiLayout.java index 467e0b7c..6046ad9a 100644 --- a/core/src/main/java/github/nighter/smartspawner/spawner/gui/layout/GuiLayout.java +++ b/core/src/main/java/github/nighter/smartspawner/spawner/gui/layout/GuiLayout.java @@ -10,7 +10,14 @@ public class GuiLayout { private final Map slotToButtonType = new HashMap<>(); public void addButton(String buttonType, GuiButton button) { - // Remove old button if it exists + // Check if slot is already occupied by another button + String existingButtonType = slotToButtonType.get(button.getSlot()); + if (existingButtonType != null && !existingButtonType.equals(buttonType)) { + // Remove the existing button to replace it with the new one + buttons.remove(existingButtonType); + } + + // Remove old button if this buttonType already exists in a different slot GuiButton oldButton = buttons.get(buttonType); if (oldButton != null) { slotToButtonType.remove(oldButton.getSlot()); diff --git a/core/src/main/java/github/nighter/smartspawner/spawner/gui/layout/GuiLayoutConfig.java b/core/src/main/java/github/nighter/smartspawner/spawner/gui/layout/GuiLayoutConfig.java index ba631c6e..0f470ce5 100644 --- a/core/src/main/java/github/nighter/smartspawner/spawner/gui/layout/GuiLayoutConfig.java +++ b/core/src/main/java/github/nighter/smartspawner/spawner/gui/layout/GuiLayoutConfig.java @@ -1,11 +1,16 @@ package github.nighter.smartspawner.spawner.gui.layout; import github.nighter.smartspawner.SmartSpawner; +import github.nighter.smartspawner.updates.GuiLayoutUpdater; import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import java.io.File; +import java.util.HashMap; +import java.util.Map; import java.util.logging.Level; public class GuiLayoutConfig { @@ -18,12 +23,14 @@ public class GuiLayoutConfig { private final SmartSpawner plugin; private final File layoutsDir; + private final GuiLayoutUpdater guiLayoutUpdater; private String currentLayout; private GuiLayout currentGuiLayout; public GuiLayoutConfig(SmartSpawner plugin) { this.plugin = plugin; this.layoutsDir = new File(plugin.getDataFolder(), GUI_LAYOUTS_DIR); + this.guiLayoutUpdater = new GuiLayoutUpdater(plugin); loadLayout(); } @@ -38,6 +45,9 @@ private void initializeLayoutsDirectory() { layoutsDir.mkdirs(); } autoSaveLayoutFiles(); + + // Update GUI layouts using the new updater system + guiLayoutUpdater.checkAndUpdateGuiLayouts(); } private void autoSaveLayoutFiles() { @@ -128,8 +138,16 @@ private boolean loadButton(FileConfiguration config, GuiLayout layout, String bu return false; } + // Check conditions first + Map conditions = loadConditions(config, path); + if (!evaluateConditions(conditions)) { + plugin.debug("Button '" + buttonKey + "' skipped due to failed conditions: " + conditions); + return false; + } + int slot = config.getInt(path + ".slot", -1); String materialName = config.getString(path + ".material", "STONE"); + String soundName = config.getString(path + ".sound", null); if (!isValidSlot(slot)) { plugin.getLogger().warning(String.format( @@ -139,13 +157,56 @@ private boolean loadButton(FileConfiguration config, GuiLayout layout, String bu } Material material = parseMaterial(materialName, buttonKey); + Sound sound = parseSound(soundName, buttonKey); int actualSlot = SLOT_OFFSET + slot; - GuiButton button = new GuiButton(buttonKey, actualSlot, material, true); + GuiButton button = new GuiButton(buttonKey, actualSlot, material, true, sound, conditions); layout.addButton(buttonKey, button); return true; } + private Map loadConditions(FileConfiguration config, String path) { + Map conditions = new HashMap<>(); + ConfigurationSection conditionsSection = config.getConfigurationSection(path + ".conditions"); + if (conditionsSection != null) { + for (String key : conditionsSection.getKeys(false)) { + conditions.put(key, conditionsSection.get(key)); + } + } + return conditions; + } + + private boolean evaluateConditions(Map conditions) { + if (conditions.isEmpty()) { + return true; // No conditions means always show + } + + for (Map.Entry condition : conditions.entrySet()) { + String conditionKey = condition.getKey(); + Object expectedValue = condition.getValue(); + + if (!evaluateCondition(conditionKey, expectedValue)) { + return false; // If any condition fails, don't show button + } + } + + return true; // All conditions passed + } + + private boolean evaluateCondition(String conditionKey, Object expectedValue) { + switch (conditionKey.toLowerCase()) { + case "shopintegration": + // Check if shop integration is enabled in the plugin + boolean shopEnabled = plugin.getConfig().getBoolean("custom_economy.shop_integration.enabled", false); + return shopEnabled == (Boolean) expectedValue; + + // Add more condition types here as needed + default: + plugin.getLogger().warning("Unknown condition type: " + conditionKey); + return true; // Unknown conditions default to true to avoid breaking configs + } + } + private boolean isValidSlot(int slot) { return slot >= MIN_SLOT && slot <= MAX_SLOT; } @@ -161,6 +222,21 @@ private Material parseMaterial(String materialName, String buttonKey) { } } + private Sound parseSound(String soundName, String buttonKey) { + if (soundName == null || soundName.trim().isEmpty()) { + return null; // No sound specified + } + + try { + return Sound.valueOf(soundName.toUpperCase()); + } catch (IllegalArgumentException e) { + plugin.getLogger().warning(String.format( + "Invalid sound %s for button %s. No sound will be played.", + soundName, buttonKey)); + return null; + } + } + public GuiLayout getCurrentLayout() { return currentGuiLayout; } diff --git a/core/src/main/java/github/nighter/smartspawner/spawner/gui/storage/SpawnerStorageAction.java b/core/src/main/java/github/nighter/smartspawner/spawner/gui/storage/SpawnerStorageAction.java index 9271db74..fa303313 100644 --- a/core/src/main/java/github/nighter/smartspawner/spawner/gui/storage/SpawnerStorageAction.java +++ b/core/src/main/java/github/nighter/smartspawner/spawner/gui/storage/SpawnerStorageAction.java @@ -10,6 +10,7 @@ import github.nighter.smartspawner.spawner.gui.main.SpawnerMenuUI; import github.nighter.smartspawner.spawner.gui.synchronization.SpawnerGuiViewManager; import github.nighter.smartspawner.spawner.gui.layout.GuiLayout; +import github.nighter.smartspawner.spawner.gui.layout.GuiButton; import github.nighter.smartspawner.spawner.properties.SpawnerManager; import github.nighter.smartspawner.spawner.properties.VirtualInventory; import github.nighter.smartspawner.language.LanguageManager; @@ -155,7 +156,8 @@ private void handleControlSlotClick(Player player, int slot, StoragePageHolder h break; case "previous_page": if (holder.getCurrentPage() > 1) { - updatePageContent(player, spawner, holder.getCurrentPage() - 1, inventory, true); + playButtonSound(player, buttonType); + updatePageContent(player, spawner, holder.getCurrentPage() - 1, inventory, false); } break; case "take_all": @@ -163,13 +165,15 @@ private void handleControlSlotClick(Player player, int slot, StoragePageHolder h break; case "next_page": if (holder.getCurrentPage() < holder.getTotalPages()) { - updatePageContent(player, spawner, holder.getCurrentPage() + 1, inventory, true); + playButtonSound(player, buttonType); + updatePageContent(player, spawner, holder.getCurrentPage() + 1, inventory, false); } break; case "drop_page": handleDropPageItems(player, spawner, inventory); break; case "shop_indicator": + case "sell": if (plugin.hasSellIntegration()) { if (!player.hasPermission("smartspawner.sellall")) { messageService.sendMessage(player, "no_permission"); @@ -178,7 +182,7 @@ private void handleControlSlotClick(Player player, int slot, StoragePageHolder h if (isClickTooFrequent(player)) { return; } - player.playSound(player.getLocation(), Sound.UI_BUTTON_CLICK, 1.0f, 1.0f); + playButtonSound(player, buttonType); spawnerSellManager.sellAllItems(player, spawner); } break; @@ -313,7 +317,7 @@ private void handleDropPageItems(Player player, SpawnerData spawner, Inventory i } updatePageContent(player, spawner, holder.getCurrentPage(), inventory, false); - player.playSound(player.getLocation(), Sound.ENTITY_ITEM_PICKUP, 0.8f, 0.8f); + playButtonSound(player, "drop_page"); } private void dropItemsInDirection(Player player, List items) { @@ -357,6 +361,7 @@ private void openFilterConfig(Player player, SpawnerData spawner) { if (isClickTooFrequent(player)) { return; } + playButtonSound(player, "item_filter"); filterConfigUI.openFilterConfigGUI(player, spawner); } @@ -417,9 +422,8 @@ private void updatePageContent(Player player, SpawnerData spawner, int newPage, updateInventoryTitle(player, inventory, spawner, newPage, totalPages); - if (uiClickSound) { - player.playSound(player.getLocation(), Sound.UI_BUTTON_CLICK, 1.0f, 1.0f); - } + // Note: Sound is now handled by playButtonSound in the calling method + // This method no longer plays sounds directly } private int calculateTotalPages(SpawnerData spawner) { @@ -452,7 +456,7 @@ public void onPlayerQuit(PlayerQuitEvent event) { } private void openMainMenu(Player player, SpawnerData spawner) { - player.playSound(player.getLocation(), Sound.UI_BUTTON_CLICK, 1.0f, 1.0f); + playButtonSound(player, "return"); if (spawner.isInteracted()){ spawnerManager.markSpawnerModified(spawner.getSpawnerId()); spawner.clearInteracted(); @@ -512,6 +516,7 @@ private void handleDiscardAllItems(Player player, SpawnerData spawner, Inventory Map placeholders = new HashMap<>(); placeholders.put("amount", languageManager.formatNumber(totalItems)); messageService.sendMessage(player, "discard_all_success", placeholders); + playButtonSound(player, "discard_all"); if (!spawner.isInteracted()) { spawner.markInteracted(); } @@ -668,6 +673,27 @@ private void sendTransferMessage(Player player, TransferResult result) { Map placeholders = new HashMap<>(); placeholders.put("amount", String.valueOf(result.totalMoved)); messageService.sendMessage(player, "take_all_items", placeholders); + playButtonSound(player, "take_all"); + } + } + + /** + * Plays the configured sound for a specific button type + */ + private void playButtonSound(Player player, String buttonType) { + GuiLayout layout = guiLayoutConfig.getCurrentLayout(); + if (layout == null) { + return; + } + + GuiButton button = layout.getButton(buttonType); + if (button != null && button.hasSound()) { + try { + player.playSound(player.getLocation(), button.getSound(), 1.0f, 1.0f); + } catch (Exception e) { + // Log and continue gracefully if sound playback fails + plugin.getLogger().warning("Failed to play sound for button '" + buttonType + "': " + e.getMessage()); + } } } diff --git a/core/src/main/java/github/nighter/smartspawner/updates/GuiLayoutUpdater.java b/core/src/main/java/github/nighter/smartspawner/updates/GuiLayoutUpdater.java new file mode 100644 index 00000000..6345e07d --- /dev/null +++ b/core/src/main/java/github/nighter/smartspawner/updates/GuiLayoutUpdater.java @@ -0,0 +1,219 @@ +package github.nighter.smartspawner.updates; + +import github.nighter.smartspawner.SmartSpawner; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; +import java.util.*; + +public class GuiLayoutUpdater { + private final String currentVersion; + private final SmartSpawner plugin; + private static final String GUI_VERSION_KEY = "gui_version"; + private static final String GUI_LAYOUTS_DIR = "gui_layouts"; + private static final String STORAGE_GUI_FILE = "storage_gui.yml"; + private static final List SUPPORTED_LAYOUTS = Arrays.asList("default", "DonutSMP"); + + public GuiLayoutUpdater(SmartSpawner plugin) { + this.plugin = plugin; + this.currentVersion = plugin.getDescription().getVersion(); + } + + /** + * Check and update all GUI layout files for all supported layouts + */ + public void checkAndUpdateGuiLayouts() { + for (String layout : SUPPORTED_LAYOUTS) { + File layoutDir = new File(plugin.getDataFolder(), GUI_LAYOUTS_DIR + "/" + layout); + + // Create layout directory if it doesn't exist + if (!layoutDir.exists()) { + layoutDir.mkdirs(); + } + + // Check and update storage GUI file + File storageGuiFile = new File(layoutDir, STORAGE_GUI_FILE); + updateStorageGuiFile(layout, storageGuiFile); + } + } + + /** + * Update a specific storage GUI file + * + * @param layout The layout name (e.g., "default", "DonutSMP") + * @param storageGuiFile The file to update + */ + private void updateStorageGuiFile(String layout, File storageGuiFile) { + try { + // Create parent directory if it doesn't exist + if (!storageGuiFile.getParentFile().exists()) { + storageGuiFile.getParentFile().mkdirs(); + } + + // Create the file if it doesn't exist + if (!storageGuiFile.exists()) { + createDefaultStorageGuiFileWithHeader(layout, storageGuiFile); + plugin.getLogger().info("Created new storage_gui.yml for " + layout + " layout"); + return; + } + + FileConfiguration currentConfig = YamlConfiguration.loadConfiguration(storageGuiFile); + String configVersionStr = currentConfig.getString(GUI_VERSION_KEY, "0.0.0"); + Version configVersion = new Version(configVersionStr); + Version pluginVersion = new Version(currentVersion); + + if (configVersion.compareTo(pluginVersion) >= 0) { + return; // No update needed + } + + if (!configVersionStr.equals("0.0.0")) { + plugin.debug("Updating " + layout + " storage_gui.yml from version " + configVersionStr + " to " + currentVersion); + } + + // Store user's current values + Map userValues = flattenConfig(currentConfig); + + // Create temp file with new default config + File tempFile = new File(plugin.getDataFolder(), + GUI_LAYOUTS_DIR + "/" + layout + "/storage_gui_new.yml"); + createDefaultStorageGuiFileWithHeader(layout, tempFile); + + FileConfiguration newConfig = YamlConfiguration.loadConfiguration(tempFile); + newConfig.set(GUI_VERSION_KEY, currentVersion); + + // Check if there are actual differences before creating backup + boolean configDiffers = hasConfigDifferences(userValues, newConfig); + + if (configDiffers) { + File backupFile = new File(plugin.getDataFolder(), + GUI_LAYOUTS_DIR + "/" + layout + "/storage_gui_backup_" + configVersionStr + ".yml"); + Files.copy(storageGuiFile.toPath(), backupFile.toPath(), StandardCopyOption.REPLACE_EXISTING); + plugin.debug(layout + " storage_gui.yml backup created at " + backupFile.getName()); + } else { + if (!configVersionStr.equals("0.0.0")) { + plugin.debug("No significant changes detected in " + layout + " storage_gui.yml, skipping backup creation"); + } + } + + // Apply user values and save + applyUserValues(newConfig, userValues); + newConfig.save(storageGuiFile); + tempFile.delete(); + + } catch (Exception e) { + plugin.getLogger().severe("Failed to update " + layout + " storage_gui.yml: " + e.getMessage()); + e.printStackTrace(); + } + } + + /** + * Create a default storage GUI file with a version header + */ + private void createDefaultStorageGuiFileWithHeader(String layout, File destinationFile) { + try (InputStream in = plugin.getResource(GUI_LAYOUTS_DIR + "/" + layout + "/" + STORAGE_GUI_FILE)) { + if (in != null) { + List defaultLines = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8)) + .lines() + .toList(); + + List newLines = new ArrayList<>(); + newLines.add("# GUI Layout version - Do not modify this value"); + newLines.add(GUI_VERSION_KEY + ": " + currentVersion); + newLines.add(""); + newLines.addAll(defaultLines); + + destinationFile.getParentFile().mkdirs(); + Files.write(destinationFile.toPath(), newLines, StandardCharsets.UTF_8); + } else { + plugin.getLogger().warning("Default storage_gui.yml for " + layout + + " layout not found in the plugin's resources."); + + // Create empty file with just version + destinationFile.getParentFile().mkdirs(); + + // Create basic YAML with just the version + YamlConfiguration emptyConfig = new YamlConfiguration(); + emptyConfig.set(GUI_VERSION_KEY, currentVersion); + emptyConfig.set("_note", "This is an empty storage_gui.yml created because no default was found in the plugin resources."); + emptyConfig.save(destinationFile); + } + } catch (IOException e) { + plugin.getLogger().severe("Failed to create default storage_gui.yml for " + layout + " layout: " + e.getMessage()); + e.printStackTrace(); + } + } + + /** + * Determines if there are actual differences between old and new configs + */ + private boolean hasConfigDifferences(Map userValues, FileConfiguration newConfig) { + // Get all paths from new config (excluding version key) + Map newConfigMap = flattenConfig(newConfig); + + // Check for removed or changed keys + for (Map.Entry entry : userValues.entrySet()) { + String path = entry.getKey(); + Object oldValue = entry.getValue(); + + // Skip version key + if (path.equals(GUI_VERSION_KEY)) continue; + + // Check if path no longer exists + if (!newConfig.contains(path)) { + return true; // Found a removed path + } + + // Check if default value changed + Object newDefaultValue = newConfig.get(path); + if (newDefaultValue != null && !newDefaultValue.equals(oldValue)) { + return true; // Default value changed + } + } + + // Check for new keys + for (String path : newConfigMap.keySet()) { + if (!path.equals(GUI_VERSION_KEY) && !userValues.containsKey(path)) { + return true; // Found a new path + } + } + + return false; // No significant differences + } + + /** + * Flattens a configuration section into a map of path -> value + */ + private Map flattenConfig(ConfigurationSection config) { + Map result = new HashMap<>(); + for (String key : config.getKeys(true)) { + if (!config.isConfigurationSection(key)) { + result.put(key, config.get(key)); + } + } + return result; + } + + /** + * Applies the user values to the new config + */ + private void applyUserValues(FileConfiguration newConfig, Map userValues) { + for (Map.Entry entry : userValues.entrySet()) { + String path = entry.getKey(); + Object value = entry.getValue(); + + // Don't override version key + if (path.equals(GUI_VERSION_KEY)) continue; + + if (newConfig.contains(path)) { + newConfig.set(path, value); + } else { + plugin.getLogger().fine("Config path '" + path + "' from old config no longer exists in new config"); + } + } + } +} \ No newline at end of file diff --git a/core/src/main/resources/gui_layouts/DonutSMP/storage_gui.yml b/core/src/main/resources/gui_layouts/DonutSMP/storage_gui.yml index 2fd0fc75..299ea7a9 100644 --- a/core/src/main/resources/gui_layouts/DonutSMP/storage_gui.yml +++ b/core/src/main/resources/gui_layouts/DonutSMP/storage_gui.yml @@ -1,6 +1,10 @@ +# GUI Layout version - Do not modify this value +gui_version: "1.0.0" + # DonutSMP Storage GUI Layout Configuration # Slot positions: 1-9 corresponds to inventory slots 46-54 (bottom row) -# Valid materials can be found at: https://jd.papermc.io/paper/1.21.6/org/bukkit/Material.html +# Valid materials can be found at: https://jd.papermc.io/paper/1.21.8/org/bukkit/Material.html +# Valid sounds can be found at: https://jd.papermc.io/paper/1.21.8/org/bukkit/Sound.html buttons: # Return to main menu button @@ -8,33 +12,43 @@ buttons: slot: 1 material: BARRIER enabled: true + sound: UI_BUTTON_CLICK + conditions: + shopIntegration: false # Previous page navigation button previous_page: slot: 4 material: ARROW enabled: true + sound: UI_BUTTON_CLICK # Take all items button take_all: slot: 5 material: SPECTRAL_ARROW enabled: true + sound: ENTITY_ITEM_PICKUP # Next page navigation button next_page: slot: 6 material: ARROW enabled: true + sound: UI_BUTTON_CLICK drop_page: slot: 8 material: DROPPER enabled: true + sound: UI_BUTTON_CLICK - # Shop/sell indicator button (requires sell integration) - shop_indicator: + # Sell button (requires shop integration) + sell: slot: 9 material: GOLD_INGOT enabled: true + sound: ENTITY_EXPERIENCE_ORB_PICKUP + conditions: + shopIntegration: true diff --git a/core/src/main/resources/gui_layouts/default/storage_gui.yml b/core/src/main/resources/gui_layouts/default/storage_gui.yml index 0f9c11a0..f565bfca 100644 --- a/core/src/main/resources/gui_layouts/default/storage_gui.yml +++ b/core/src/main/resources/gui_layouts/default/storage_gui.yml @@ -1,6 +1,10 @@ +# GUI Layout version - Do not modify this value +gui_version: "1.0.0" + # Default Storage GUI Layout Configuration # Slot positions: 1-9 corresponds to inventory slots 46-54 (bottom row) # Valid materials can be found at: https://jd.papermc.io/paper/1.21.8/org/bukkit/Material.html +# Valid sounds can be found at: https://jd.papermc.io/paper/1.21.8/org/bukkit/Sound.html buttons: @@ -9,44 +13,56 @@ buttons: slot: 1 material: SPECTRAL_ARROW enabled: true + sound: UI_BUTTON_CLICK # Discard all items button discard_all: slot: 3 material: CAULDRON enabled: true + sound: ENTITY_GENERIC_BURN # Item filter configuration button item_filter: slot: 4 material: HOPPER enabled: true + sound: UI_BUTTON_CLICK # Return to main menu button return: slot: 5 material: RED_STAINED_GLASS_PANE enabled: true + sound: UI_BUTTON_CLICK + conditions: + shopIntegration: false + + # Sell button (requires shop integration) + sell: + slot: 5 + material: GOLD_INGOT + enabled: true + sound: ENTITY_EXPERIENCE_ORB_PICKUP + conditions: + shopIntegration: true # Take all items button take_all: slot: 6 material: CHEST enabled: true + sound: ENTITY_ITEM_PICKUP drop_page: slot: 7 material: DROPPER enabled: true - - # Shop/sell indicator button (requires sell integration) - shop_indicator: - slot: 8 - material: GOLD_INGOT - enabled: true + sound: UI_BUTTON_CLICK # Next page navigation button next_page: slot: 9 material: SPECTRAL_ARROW - enabled: true \ No newline at end of file + enabled: true + sound: UI_BUTTON_CLICK \ No newline at end of file diff --git a/core/src/main/resources/language/DonutSMP/messages.yml b/core/src/main/resources/language/DonutSMP/messages.yml index b8b489e4..9e598cb9 100644 --- a/core/src/main/resources/language/DonutSMP/messages.yml +++ b/core/src/main/resources/language/DonutSMP/messages.yml @@ -61,27 +61,21 @@ exp_collected_with_mending: # ------------------------------------------------------ inventory_full: message: "&#ff5252ɪɴᴠᴇɴᴛᴏʀʏ ꜰᴜʟʟ!" - sound: block.note_block.pling no_items_to_discard: message: "&#ff5252ɴᴏ ɪᴛᴇᴍꜱ ᴛᴏ ᴅɪꜱᴄᴀʀᴅ" - sound: block.note_block.pling discard_all_success: action_bar: "&#ff5252ᴅɪꜱᴄᴀʀᴅᴇᴅ &#f8f8ff%amount% &#ff5252ɪᴛᴇᴍꜱ" - sound: entity.generic.burn no_items_to_take: message: "&#ff5252ɴᴏ ɪᴛᴇᴍꜱ ᴛᴏ ᴛᴀᴋᴇ" - sound: block.note_block.pling take_all_items: action_bar: "%eb9aᴛᴏᴏᴋ &#f8f8ff%amount% %eb9aɪᴛᴇᴍꜱ ꜰʀᴏᴍ ꜱᴘᴀᴡɴᴇʀ" - sound: entity.item.pickup no_items_to_drop: message: "&#ff5252ɴᴏ ɪᴛᴇᴍꜱ ᴛᴏ ᴅʀᴏᴘ" - sound: block.note_block.pling # ------------------------------------------------------ # Spawner - Stacker GUI Interaction diff --git a/core/src/main/resources/language/en_US/messages.yml b/core/src/main/resources/language/en_US/messages.yml index 12c58b8a..815561ba 100644 --- a/core/src/main/resources/language/en_US/messages.yml +++ b/core/src/main/resources/language/en_US/messages.yml @@ -61,27 +61,21 @@ exp_collected_with_mending: # ------------------------------------------------------ inventory_full: message: "&#ff5252ɪɴᴠᴇɴᴛᴏʀʏ ꜰᴜʟʟ!" - sound: block.note_block.pling no_items_to_discard: message: "&#ff5252ɴᴏ ɪᴛᴇᴍꜱ ᴛᴏ ᴅɪꜱᴄᴀʀᴅ" - sound: block.note_block.pling discard_all_success: action_bar: "&#ff5252ᴅɪꜱᴄᴀʀᴅᴇᴅ &#f8f8ff%amount% &#ff5252ɪᴛᴇᴍꜱ" - sound: entity.generic.burn no_items_to_take: message: "&#ff5252ɴᴏ ɪᴛᴇᴍꜱ ᴛᴏ ᴛᴀᴋᴇ" - sound: block.note_block.pling take_all_items: action_bar: "%eb9aᴛᴏᴏᴋ &#f8f8ff%amount% %eb9aɪᴛᴇᴍꜱ ꜰʀᴏᴍ ꜱᴘᴀᴡɴᴇʀ" - sound: entity.item.pickup no_items_to_drop: message: "&#ff5252ɴᴏ ɪᴛᴇᴍꜱ ᴛᴏ ᴅʀᴏᴘ" - sound: block.note_block.pling # ------------------------------------------------------ # Spawner - Stacker GUI Interaction diff --git a/core/src/main/resources/language/vi_VN/messages.yml b/core/src/main/resources/language/vi_VN/messages.yml index 32eec04b..cd218f27 100644 --- a/core/src/main/resources/language/vi_VN/messages.yml +++ b/core/src/main/resources/language/vi_VN/messages.yml @@ -61,27 +61,21 @@ exp_collected_with_mending: # ------------------------------------------------------ inventory_full: message: "&#ff5252ᴛúɪ đồ đầʏ!" - sound: block.note_block.pling no_items_to_discard: message: "&#ff5252ᴋʜôɴɢ ᴄó ᴠậᴛ ᴘʜẩᴍ để ʟᴏạɪ ʙỏ!" - sound: block.note_block.pling discard_all_success: action_bar: "&#ff5252Đã ʟᴏạɪ ʙỏ &#f8f8ff%amount% &#ff5252ᴠậᴛ ᴘʜẩᴍ" - sound: entity.generic.burn no_items_to_take: message: "&#ff5252ᴋʜôɴɢ ᴄó ᴠậᴛ ᴘʜẩᴍ để ʟấʏ" - sound: block.note_block.pling take_all_items: action_bar: "%eb9aĐã ʟấʏ &#f8f8ff%amount% %eb9aᴠậᴛ ᴘʜẩᴍ ᴛừ ʟồɴɢ sᴘᴀᴡɴ" - sound: entity.item.pickup no_items_to_drop: message: "&#ff5252ᴋʜôɴɢ ᴄó ᴠậᴛ ᴘʜẩᴍ để ᴛʜả" - sound: block.note_block.pling # ------------------------------------------------------ # Spawner - Stacker GUI Interaction