diff --git a/README.md b/README.md index 1d6e8a9..196d548 100644 --- a/README.md +++ b/README.md @@ -1,101 +1,51 @@ -# ⚔️ BattlePass - Ultimate Progression Plugin for Minecraft (1.21+) +# BattlePass Fork (Paper 1.16.5 + Java 17) -> **The most advanced, feature-rich Battle Pass system for Spigot & Paper servers.** -> Engage your players with Daily Missions, Tiered Rewards, and a custom Currency Shop. -> **No config editing required** — manage everything via In-Game GUI! +Fork of BattlePass prepared for legacy Paper servers with cleaner config/gui structure. -![Java](https://img.shields.io/badge/Java-21-orange) ![Spigot](https://img.shields.io/badge/API-1.21-yellow) ![License](https://img.shields.io/badge/License-MIT-blue) +## Compatibility ---- +- Java: `17` +- Server API: `Paper 1.16.5` (`paper-api:1.16.5-R0.1-SNAPSHOT`) +- Plugin `api-version`: `1.16` -## 🌟 Why Choose BattlePass? -Unlike other plugins, **BattlePass** focuses on ease of use for admins and engagement for players. It includes a powerful **In-Game Editor**, robust **MySQL Database** support for networks, and deep integrations with popular plugins like **MythicMobs**. +## What Is Included -### 🔥 Key Features +- Player GUI cleanup and localization split by language. +- Language switch in `config.yml`: `language: RU` or `language: ENG` (`EN` also works). +- Separate files: + - `messages_ru.yml` / `messages_en.yml` + - `gui_ru.yml` / `gui_en.yml` +- HEX color support: + - `&#RRGGBB` + - `<#RRGGBB>` +- Cleaner custom items config in GUI language files. +- Material display names localized by language (RU or readable EN). +- Config validation on startup/reload for common material/command mistakes. -* **🏆 Seasonal Progression System** - * Fully customizable tier system (default 54 levels). - * **Dual Reward Tracks**: Free Pass (for everyone) and Premium Pass (VIP/Paid). - * Automatic season reset options (Monthly or Duration-based). +## Build -* **🛠️ In-Game GUI Editor (No YAML needed!)** - * **Mission Editor**: Create, edit, or delete daily missions directly inside the game. - * **Rewards Editor**: Drag-and-drop items from your inventory to set rewards for any level. +```bash +mvn -DskipTests package +``` -* **💾 Database & Sync Support** - * **SQLite** (Default): Plug and play for single servers. - * **MySQL**: Full support for syncing player progress, XP, and rewards across a BungeeCord/Velocity network. +Output jar: -* **📜 Dynamic Missions** - * **7 Daily Missions** generated randomly every day. - * **Mission Types**: Mining, Crafting, Fishing, Farming, Killing Mobs, Playtime, Walking Distance, and more!. +- `target/BattlePass-1.0.jar` -* **💰 Battle Coins & Shop** - * Players earn **Battle Coins** by ranking in the daily leaderboard. - * Spend coins in the customizable **Shop GUI** for exclusive items, XP boosts, or commands. +## Language Setup -* **🔌 Powerful Integrations** - * **PlaceholderAPI**: Full support for scoreboards, tabs, and chat. - * **MythicMobs**: Create missions to kill specific custom bosses or mobs. +In `config.yml`: ---- +```yml +language: RU +``` -## 📥 Installation +Available values: -1. Download `BattlePass.jar`. -2. Drop it into your server's `/plugins/` folder. -3. (Optional) Install **PlaceholderAPI** for placeholders. -4. Restart your server. -5. Enjoy! Config files (`config.yml`, `missions.yml`, `shop.yml`) will generate automatically. +- `RU` +- `ENG` (or `EN`) ---- +## Notes -## 🎮 Commands & Permissions - -| Command | Permission | Description | -| :--- | :--- | :--- | -| `/bp` or `/battlepass` | `battlepass.use` | Opens the main Battle Pass menu. | -| `/bp help` | `battlepass.use` | Shows the help menu. | -| `/bp giveitem ` | `battlepass.admin` | Give special items (Premium Voucher, Coins, XP Boosts). | -| `/bp addpremium ` | `battlepass.admin` | Force unlock Premium Pass for a player. | -| `/bp addxp ` | `battlepass.admin` | Give XP to a player. | -| `/bp reset season` | `battlepass.admin` | Force reset the entire season progress. | -| `/bp reset missions` | `battlepass.admin` | Force generate new daily missions. | -| `/bp resetplayer ` | `battlepass.admin` | Reset battle pass progress for a player. | -| `/bp reload` | `battlepass.admin` | Reloads all configuration files. | - ---- - -## 🧩 Placeholders (PAPI) - -Add these to your scoreboard or tablist! - -* `%battlepass_level%` - Player's current tier. -* `%battlepass_xp_progress%` - Formatted XP (e.g., 50/200). -* `%battlepass_premium_status%` - Returns "Active" or "Inactive". -* `%battlepass_season_time%` - Time remaining in the current season. -* `%battlepass_coins%` - Current Battle Coins balance. -* `%battlepass_daily_reward_available%` - Check if daily reward is ready ("Yes"/"No"). - -*(See `Placeholders.md` for the full list)* - ---- - -## 📸 Screenshots - -image - - ---- - -
-

I've just launched https://www.hytaleservers.it/

-

Are you working on a server? List it now for free and build your audience before launch.​

-
- ---- - -
-

Made with ❤️ by Lino

-

Found a bug? Report it in the Issues tab!

-
+- If your data folder already exists, new language files are auto-created only when missing. +- After language/config edits, use `/bp reload`. diff --git a/pom.xml b/pom.xml index 5103736..a4fa734 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ BattlePass - 21 + 17 UTF-8 @@ -32,6 +32,9 @@ org.apache.maven.plugins maven-shade-plugin 3.5.3 + + false + package @@ -52,8 +55,8 @@ - spigotmc-repo - https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + papermc-repo + https://repo.papermc.io/repository/maven-public/ sonatype @@ -72,9 +75,9 @@ - org.spigotmc - spigot-api - 1.21.4-R0.1-SNAPSHOT + com.destroystokyo.paper + paper-api + 1.16.5-R0.1-SNAPSHOT provided @@ -95,25 +98,22 @@ com.mysql mysql-connector-j 8.3.0 - provided com.zaxxer HikariCP 5.1.0 - provided org.slf4j slf4j-api 2.0.9 - provided - org.slf4j - slf4j-simple - 2.0.9 - provided + org.xerial + sqlite-jdbc + 3.45.3.0 + runtime - \ No newline at end of file + diff --git a/src/main/java/com/Lino/battlePass/BattlePass.java b/src/main/java/com/Lino/battlePass/BattlePass.java index 86293a8..1987adb 100644 --- a/src/main/java/com/Lino/battlePass/BattlePass.java +++ b/src/main/java/com/Lino/battlePass/BattlePass.java @@ -11,6 +11,7 @@ import com.Lino.battlePass.listeners.EventManager; import com.Lino.battlePass.tasks.BattlePassTask; import com.Lino.battlePass.tasks.CoinsDistributionTask; +import com.Lino.battlePass.utils.GradientColorParser; import org.bukkit.scheduler.BukkitRunnable; import java.io.BufferedReader; @@ -39,6 +40,7 @@ public class BattlePass extends JavaPlugin { private BattlePassExpansion placeholderExpansion; private MissionEditorManager missionEditorManager; private SeasonRotationManager seasonRotationManager; + private ConfigValidator configValidator; private boolean updateAvailable = false; private String latestVersion = ""; @@ -49,6 +51,10 @@ public void onEnable() { saveDefaultConfig(); saveResourceIfNotExists("missions.yml"); saveResourceIfNotExists("messages.yml"); + saveResourceIfNotExists("messages_ru.yml"); + saveResourceIfNotExists("messages_en.yml"); + saveResourceIfNotExists("gui_ru.yml"); + saveResourceIfNotExists("gui_en.yml"); saveResourceIfNotExists("BattlePassFREE.yml"); saveResourceIfNotExists("BattlePassPREMIUM.yml"); saveResourceIfNotExists("shop.yml"); @@ -60,6 +66,7 @@ public void onEnable() { seasonRotationManager.createDefaultSeasonFolders(); configManager.reload(); + GradientColorParser.setCleanMode(configManager.isCleanUiMode()); databaseManager = new DatabaseManager(this); playerDataManager = new PlayerDataManager(this, databaseManager); @@ -71,7 +78,8 @@ public void onEnable() { guiManager = new GuiManager(this, playerDataManager, missionManager, rewardManager, messageManager, configManager); rewardEditorManager = new RewardEditorManager(this); missionEditorManager = new MissionEditorManager(this); - rewardEditorManager = new RewardEditorManager(this); + configValidator = new ConfigValidator(this); + configValidator.validateAll(); databaseManager.initialize().thenRun(() -> { getServer().getScheduler().runTask(this, () -> { @@ -212,9 +220,13 @@ public void reload() { reloadConfig(); seasonRotationManager.reload(); configManager.reload(); + GradientColorParser.setCleanMode(configManager.isCleanUiMode()); messageManager.reload(); rewardManager.loadRewards(); shopManager.reload(); + if (configValidator != null) { + configValidator.validateAll(); + } guiManager.clearCache(); missionManager.recalculateResetTimeOnReload(); @@ -225,7 +237,7 @@ public void reload() { int currentPage = 1; for (int i = 1; i <= 6; i++) { - if (title.equals(messageManager.getMessage("gui.battlepass", "%page%", String.valueOf(i)))) { + if (title.equals(messageManager.getGuiMessage("gui.battlepass", "%page%", String.valueOf(i)))) { isBattlePassGUI = true; currentPage = i; break; @@ -238,17 +250,17 @@ public void reload() { Bukkit.getScheduler().runTaskLater(this, () -> { guiManager.openBattlePassGUI(player, page); }, 1L); - } else if (title.equals(messageManager.getMessage("gui.leaderboard"))) { + } else if (title.equals(messageManager.getGuiMessage("gui.leaderboard"))) { player.closeInventory(); Bukkit.getScheduler().runTaskLater(this, () -> { guiManager.openLeaderboardGUI(player); }, 1L); - } else if (title.equals(messageManager.getMessage("gui.missions"))) { + } else if (title.equals(messageManager.getGuiMessage("gui.missions"))) { player.closeInventory(); Bukkit.getScheduler().runTaskLater(this, () -> { guiManager.openMissionsGUI(player); }, 1L); - } else if (title.equals(messageManager.getMessage("gui.shop"))) { + } else if (title.equals(messageManager.getGuiMessage("gui.shop"))) { player.closeInventory(); Bukkit.getScheduler().runTaskLater(this, () -> { guiManager.openShopGUI(player); @@ -336,4 +348,4 @@ public RewardEditorManager getRewardEditorManager() { public SeasonRotationManager getSeasonRotationManager() { return seasonRotationManager; } -} \ No newline at end of file +} diff --git a/src/main/java/com/Lino/battlePass/commands/BattlePassCommand.java b/src/main/java/com/Lino/battlePass/commands/BattlePassCommand.java index a191b06..b0e472e 100644 --- a/src/main/java/com/Lino/battlePass/commands/BattlePassCommand.java +++ b/src/main/java/com/Lino/battlePass/commands/BattlePassCommand.java @@ -468,7 +468,9 @@ private boolean handleExcludeTopCommand(CommandSender sender, String[] args, boo } if (args.length < 2) { - sender.sendMessage(plugin.getMessageManager().getPrefix() + "Usage: /battlepass " + (exclude ? "excludefromtop" : "includetop") + " "); + String commandName = exclude ? "excludefromtop" : "includetop"; + sender.sendMessage(plugin.getMessageManager().getPrefix() + + plugin.getMessageManager().getMessage("messages.top.usage", "%command%", commandName)); return true; } @@ -485,8 +487,13 @@ private boolean handleExcludeTopCommand(CommandSender sender, String[] args, boo plugin.getPlayerDataManager().markForSave(target.getUniqueId()); plugin.getPlayerDataManager().savePlayer(target.getUniqueId()); - String status = exclude ? "excluded from" : "included in"; - sender.sendMessage(plugin.getMessageManager().getPrefix() + "Player " + target.getName() + " is now " + status + " the top leaderboard."); + String status = exclude + ? plugin.getMessageManager().getMessage("messages.top.excluded-status") + : plugin.getMessageManager().getMessage("messages.top.included-status"); + sender.sendMessage(plugin.getMessageManager().getPrefix() + + plugin.getMessageManager().getMessage("messages.top.updated", + "%player%", target.getName(), + "%status%", status)); return true; } @@ -527,15 +534,15 @@ private boolean handleGiveItemCommand(CommandSender sender, String[] args) { switch (itemType) { case "premium": item = plugin.getCustomItemManager().createPremiumPassItem(amount); - itemName = "Premium Pass Voucher"; + itemName = plugin.getMessageManager().getMessage("messages.items.names.premium-pass"); break; case "coins": item = plugin.getCustomItemManager().createBattleCoinsItem(amount); - itemName = "Battle Coin Token"; + itemName = plugin.getMessageManager().getMessage("messages.items.names.battle-coin"); break; case "levelboost": item = plugin.getCustomItemManager().createLevelBoostItem(amount); - itemName = "Experience Boost Elixir"; + itemName = plugin.getMessageManager().getMessage("messages.items.names.level-boost"); break; default: sender.sendMessage(plugin.getMessageManager().getPrefix() + @@ -602,4 +609,4 @@ private void checkLevelUp(Player player, PlayerData data, int xpPerLevel) { plugin.getPlayerDataManager().markForSave(player.getUniqueId()); } } -} \ No newline at end of file +} diff --git a/src/main/java/com/Lino/battlePass/gui/BaseGui.java b/src/main/java/com/Lino/battlePass/gui/BaseGui.java index a53b035..35d178a 100644 --- a/src/main/java/com/Lino/battlePass/gui/BaseGui.java +++ b/src/main/java/com/Lino/battlePass/gui/BaseGui.java @@ -46,12 +46,10 @@ protected ItemStack createItem(Material material, String displayName, List lore = new ArrayList<>(); - for (String line : plugin.getMessageManager().getMessagesConfig().getStringList("items.back-button.lore")) { - lore.add(GradientColorParser.parse(line)); - } + lore.addAll(plugin.getMessageManager().getGuiMessages("items.back-button.lore")); meta.setLore(lore); back.setItemMeta(meta); @@ -61,4 +59,4 @@ protected ItemStack createBackButton() { protected String formatMaterial(Material material) { return material.name().toLowerCase().replace("_", " "); } -} \ No newline at end of file +} diff --git a/src/main/java/com/Lino/battlePass/gui/BattlePassGui.java b/src/main/java/com/Lino/battlePass/gui/BattlePassGui.java index 94d8fc7..ecbd6f6 100644 --- a/src/main/java/com/Lino/battlePass/gui/BattlePassGui.java +++ b/src/main/java/com/Lino/battlePass/gui/BattlePassGui.java @@ -4,7 +4,6 @@ import com.Lino.battlePass.managers.SeasonRotationManager; import com.Lino.battlePass.models.PlayerData; import com.Lino.battlePass.models.Reward; -import com.Lino.battlePass.utils.GradientColorParser; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; @@ -12,7 +11,9 @@ import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataType; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; public class BattlePassGui extends BaseGui { @@ -22,7 +23,7 @@ public class BattlePassGui extends BaseGui { private final int maxLevel; public BattlePassGui(BattlePass plugin, Player player, int page) { - super(plugin, plugin.getMessageManager().getMessage("gui.battlepass", "%page%", String.valueOf(page)), 54); + super(plugin, plugin.getMessageManager().getGuiMessage("gui.battlepass", "%page%", String.valueOf(page)), 54); this.player = player; this.playerData = plugin.getPlayerDataManager().getPlayerData(player.getUniqueId()); this.page = page; @@ -45,34 +46,22 @@ public void open() { private void setupProgressItem(Inventory gui) { ItemStack info = new ItemStack(Material.NETHER_STAR); ItemMeta meta = info.getItemMeta(); - meta.setDisplayName(plugin.getMessageManager().getMessage("items.progress.name")); + meta.setDisplayName(plugin.getMessageManager().getGuiMessage("items.progress.name")); - List lore = new ArrayList<>(); - String premiumStatus = playerData.hasPremium ? - plugin.getMessageManager().getMessage("items.premium-status.active") : - plugin.getMessageManager().getMessage("items.premium-status.inactive"); + String premiumStatus = playerData.hasPremium + ? plugin.getMessageManager().getGuiMessage("items.premium-status.active") + : plugin.getMessageManager().getGuiMessage("items.premium-status.inactive"); SeasonRotationManager rotation = plugin.getSeasonRotationManager(); - String currentSeason = rotation.isRotationEnabled() ? - String.valueOf(rotation.getCurrentSeason()) : "1"; - - for (String line : plugin.getMessageManager().getMessagesConfig().getStringList("items.progress.lore")) { - String processedLine = line - .replace("%level%", String.valueOf(playerData.level)) - .replace("%xp%", String.valueOf(playerData.xp)) - .replace("%xp_needed%", String.valueOf(plugin.getConfigManager().getXpPerLevel())) - .replace("%premium_status%", premiumStatus) - .replace("%season_time%", plugin.getMissionManager().getTimeUntilSeasonEnd()) - .replace("%current_season%", currentSeason); - lore.add(GradientColorParser.parse(processedLine)); - - if (line.contains("%season_time%")) { - lore.add(GradientColorParser.parse( - "&8▸ &7Current Season: " + currentSeason + "")); - } - } - - meta.setLore(lore); + String currentSeason = rotation.isRotationEnabled() ? String.valueOf(rotation.getCurrentSeason()) : "1"; + + meta.setLore(plugin.getMessageManager().getGuiMessages("items.progress.lore", + "%level%", String.valueOf(playerData.level), + "%xp%", String.valueOf(playerData.xp), + "%xp_needed%", String.valueOf(plugin.getConfigManager().getXpPerLevel()), + "%premium_status%", premiumStatus, + "%season_time%", plugin.getMissionManager().getTimeUntilSeasonEnd(), + "%current_season%", currentSeason)); info.setItemMeta(meta); gui.setItem(4, info); } @@ -84,19 +73,18 @@ private void setupRewards(Inventory gui) { for (int i = 0; i <= 8; i++) { int level = startLevel + i; - if (level > maxLevel) break; + if (level > maxLevel) { + break; + } List premiumLevel = premiumRewards.get(level); if (premiumLevel != null && !premiumLevel.isEmpty()) { if (!playerData.claimedPremiumRewards.contains(level)) { - ItemStack premiumItem = createRewardItem(premiumLevel, level, playerData, playerData.hasPremium, true); - gui.setItem(9 + i, premiumItem); - } else { - if (!plugin.getConfigManager().shouldHidePremiumClaimedRewards()) { - ItemStack claimedItem = createClaimedRewardItem(premiumLevel, level, true); - if (claimedItem != null) { - gui.setItem(9 + i, claimedItem); - } + gui.setItem(9 + i, createRewardItem(premiumLevel, level, playerData, playerData.hasPremium, true)); + } else if (!plugin.getConfigManager().shouldHidePremiumClaimedRewards()) { + ItemStack claimed = createClaimedRewardItem(premiumLevel, level, true); + if (claimed != null) { + gui.setItem(9 + i, claimed); } } } @@ -104,14 +92,11 @@ private void setupRewards(Inventory gui) { List freeLevel = freeRewards.get(level); if (freeLevel != null && !freeLevel.isEmpty()) { if (!playerData.claimedFreeRewards.contains(level)) { - ItemStack freeItem = createRewardItem(freeLevel, level, playerData, true, false); - gui.setItem(27 + i, freeItem); - } else { - if (!plugin.getConfigManager().shouldHideFreeClaimedRewards()) { - ItemStack claimedItem = createClaimedRewardItem(freeLevel, level, false); - if (claimedItem != null) { - gui.setItem(27 + i, claimedItem); - } + gui.setItem(27 + i, createRewardItem(freeLevel, level, playerData, true, false)); + } else if (!plugin.getConfigManager().shouldHideFreeClaimedRewards()) { + ItemStack claimed = createClaimedRewardItem(freeLevel, level, false); + if (claimed != null) { + gui.setItem(27 + i, claimed); } } } @@ -124,48 +109,42 @@ private ItemStack createRewardItem(List rewards, int level, PlayerData d if (data.level >= level && hasAccess) { ItemStack item = new ItemStack(plugin.getConfigManager().getGuiRewardAvailableMaterial()); ItemMeta meta = item.getItemMeta(); - meta.setDisplayName(plugin.getMessageManager().getMessage("items.reward-available.name", + meta.setDisplayName(plugin.getMessageManager().getGuiMessage("items.reward-available.name", "%level%", String.valueOf(level), "%type%", rewardType)); - - List lore = createRewardLore(rewards, "items.reward-available"); - meta.setLore(lore); + meta.setLore(createRewardLore(rewards, "items.reward-available")); item.setItemMeta(meta); return item; + } - } else if (!hasAccess && isPremium) { + if (!hasAccess && isPremium) { ItemStack item = new ItemStack(plugin.getConfigManager().getGuiPremiumNoPassMaterial()); ItemMeta meta = item.getItemMeta(); - meta.setDisplayName(plugin.getMessageManager().getMessage("items.reward-premium-locked.name", + meta.setDisplayName(plugin.getMessageManager().getGuiMessage("items.reward-premium-locked.name", "%level%", String.valueOf(level))); - - List lore = createRewardLore(rewards, "items.reward-premium-locked"); - meta.setLore(lore); + meta.setLore(createRewardLore(rewards, "items.reward-premium-locked")); item.setItemMeta(meta); return item; + } - } else { - Material lockedMaterial = isPremium ? - plugin.getConfigManager().getGuiPremiumLockedMaterial() : - plugin.getConfigManager().getGuiFreeLockedMaterial(); - - ItemStack item = new ItemStack(lockedMaterial); - ItemMeta meta = item.getItemMeta(); - meta.setDisplayName(plugin.getMessageManager().getMessage("items.reward-level-locked.name", - "%level%", String.valueOf(level), - "%type%", rewardType)); + Material lockedMaterial = isPremium + ? plugin.getConfigManager().getGuiPremiumLockedMaterial() + : plugin.getConfigManager().getGuiFreeLockedMaterial(); - List lore = createRewardLore(rewards, "items.reward-level-locked"); - meta.setLore(lore); - item.setItemMeta(meta); - return item; - } + ItemStack item = new ItemStack(lockedMaterial); + ItemMeta meta = item.getItemMeta(); + meta.setDisplayName(plugin.getMessageManager().getGuiMessage("items.reward-level-locked.name", + "%level%", String.valueOf(level), + "%type%", rewardType)); + meta.setLore(createRewardLore(rewards, "items.reward-level-locked")); + item.setItemMeta(meta); + return item; } private ItemStack createClaimedRewardItem(List rewards, int level, boolean isPremium) { - Material material = isPremium ? - plugin.getConfigManager().getGuiPremiumClaimedMaterial() : - plugin.getConfigManager().getGuiFreeClaimedMaterial(); + Material material = isPremium + ? plugin.getConfigManager().getGuiPremiumClaimedMaterial() + : plugin.getConfigManager().getGuiFreeClaimedMaterial(); if (material == null) { return null; @@ -173,41 +152,32 @@ private ItemStack createClaimedRewardItem(List rewards, int level, boole ItemStack item = new ItemStack(material); ItemMeta meta = item.getItemMeta(); - meta.setDisplayName(plugin.getMessageManager().getMessage("items.reward-claimed.name", + meta.setDisplayName(plugin.getMessageManager().getGuiMessage("items.reward-claimed.name", "%level%", String.valueOf(level), "%type%", plugin.getMessageManager().getMessage(isPremium ? "reward-types.premium" : "reward-types.free"))); - - List lore = createRewardLore(rewards, "items.reward-claimed"); - meta.setLore(lore); + meta.setLore(createRewardLore(rewards, "items.reward-claimed")); item.setItemMeta(meta); return item; } private List createRewardLore(List rewards, String configPath) { List lore = new ArrayList<>(); + lore.addAll(plugin.getMessageManager().getGuiMessages(configPath + ".lore-header")); - for (String line : plugin.getMessageManager().getMessagesConfig().getStringList(configPath + ".lore-header")) { - lore.add(GradientColorParser.parse(line)); - } - - for (Reward r : rewards) { - lore.add(plugin.getMessageManager().getMessage("messages.rewards.command-reward", "%reward%", r.displayName)); - } - - for (String line : plugin.getMessageManager().getMessagesConfig().getStringList(configPath + ".lore-footer")) { - String processedLine = line - .replace("%level%", String.valueOf(rewards.get(0).level)) - .replace("%season_time%", plugin.getMissionManager().getTimeUntilSeasonEnd()); - lore.add(GradientColorParser.parse(processedLine)); + for (Reward reward : rewards) { + lore.add(plugin.getMessageManager().getMessage("messages.rewards.command-reward", "%reward%", reward.displayName)); } + lore.addAll(plugin.getMessageManager().getGuiMessages(configPath + ".lore-footer", + "%level%", String.valueOf(rewards.get(0).level), + "%season_time%", plugin.getMissionManager().getTimeUntilSeasonEnd())); return lore; } private void setupSeparator(Inventory gui) { ItemStack separator = new ItemStack(plugin.getConfigManager().getGuiSeparatorMaterial()); ItemMeta meta = separator.getItemMeta(); - meta.setDisplayName(plugin.getMessageManager().getMessage("items.separator.name")); + meta.setDisplayName(plugin.getMessageManager().getGuiMessage("items.separator.name")); separator.setItemMeta(meta); for (int i = 18; i < 27; i++) { @@ -217,7 +187,9 @@ private void setupSeparator(Inventory gui) { private void setupNavigationButtons(Inventory gui) { int maxPages = (int) Math.ceil(maxLevel / 9.0); - if (maxPages < 1) maxPages = 1; + if (maxPages < 1) { + maxPages = 1; + } if (page > 1) { gui.setItem(36, createNavigationButton("previous", page - 1)); @@ -232,32 +204,16 @@ private ItemStack createNavigationButton(String direction, int targetPage) { ItemStack item = new ItemStack(Material.ARROW); ItemMeta meta = item.getItemMeta(); - if (direction.equals("previous")) { - meta.setDisplayName(plugin.getMessageManager().getMessage("items.previous-page.name")); - List lore = new ArrayList<>(); - for (String line : plugin.getMessageManager().getMessagesConfig().getStringList("items.previous-page.lore")) { - String processedLine = line.replace("%page%", String.valueOf(targetPage)); - lore.add(GradientColorParser.parse(processedLine)); - } - meta.setLore(lore); - meta.getPersistentDataContainer().set( - plugin.getEventManager().getNavigationKey(), - PersistentDataType.STRING, - "previous" - ); + if ("previous".equals(direction)) { + meta.setDisplayName(plugin.getMessageManager().getGuiMessage("items.previous-page.name")); + meta.setLore(plugin.getMessageManager().getGuiMessages("items.previous-page.lore", + "%page%", String.valueOf(targetPage))); + meta.getPersistentDataContainer().set(plugin.getEventManager().getNavigationKey(), PersistentDataType.STRING, "previous"); } else { - meta.setDisplayName(plugin.getMessageManager().getMessage("items.next-page.name")); - List lore = new ArrayList<>(); - for (String line : plugin.getMessageManager().getMessagesConfig().getStringList("items.next-page.lore")) { - String processedLine = line.replace("%page%", String.valueOf(targetPage)); - lore.add(GradientColorParser.parse(processedLine)); - } - meta.setLore(lore); - meta.getPersistentDataContainer().set( - plugin.getEventManager().getNavigationKey(), - PersistentDataType.STRING, - "next" - ); + meta.setDisplayName(plugin.getMessageManager().getGuiMessage("items.next-page.name")); + meta.setLore(plugin.getMessageManager().getGuiMessages("items.next-page.lore", + "%page%", String.valueOf(targetPage))); + meta.getPersistentDataContainer().set(plugin.getEventManager().getNavigationKey(), PersistentDataType.STRING, "next"); } item.setItemMeta(meta); @@ -267,80 +223,53 @@ private ItemStack createNavigationButton(String direction, int targetPage) { private void setupActionButtons(Inventory gui) { ItemStack missions = new ItemStack(Material.BOOK); ItemMeta missionsMeta = missions.getItemMeta(); - missionsMeta.setDisplayName(plugin.getMessageManager().getMessage("items.missions-button.name")); - - List missionsLore = new ArrayList<>(); - for (String line : plugin.getMessageManager().getMessagesConfig().getStringList("items.missions-button.lore")) { - String processedLine = line.replace("%reset_time%", plugin.getMissionManager().getTimeUntilReset()); - missionsLore.add(GradientColorParser.parse(processedLine)); - } - missionsMeta.setLore(missionsLore); + missionsMeta.setDisplayName(plugin.getMessageManager().getGuiMessage("items.missions-button.name")); + missionsMeta.setLore(plugin.getMessageManager().getGuiMessages("items.missions-button.lore", + "%reset_time%", plugin.getMissionManager().getTimeUntilReset())); missions.setItemMeta(missionsMeta); gui.setItem(49, missions); ItemStack leaderboard = new ItemStack(Material.GOLDEN_HELMET); ItemMeta leaderboardMeta = leaderboard.getItemMeta(); - leaderboardMeta.setDisplayName(plugin.getMessageManager().getMessage("items.leaderboard-button.name")); - - List lboardLore = new ArrayList<>(); - String coinsTime = plugin.getCoinsDistributionTask() != null ? - plugin.getCoinsDistributionTask().getTimeUntilNextDistribution() : "Unknown"; - - for (String line : plugin.getMessageManager().getMessagesConfig().getStringList("items.leaderboard-button.lore")) { - String processedLine = line.replace("%coins_time%", coinsTime); - lboardLore.add(GradientColorParser.parse(processedLine)); - } - leaderboardMeta.setLore(lboardLore); + leaderboardMeta.setDisplayName(plugin.getMessageManager().getGuiMessage("items.leaderboard-button.name")); + String coinsTime = plugin.getCoinsDistributionTask() != null + ? plugin.getCoinsDistributionTask().getTimeUntilNextDistribution() + : plugin.getMessageManager().getMessage("time.unknown"); + leaderboardMeta.setLore(plugin.getMessageManager().getGuiMessages("items.leaderboard-button.lore", + "%coins_time%", coinsTime)); leaderboard.setItemMeta(leaderboardMeta); gui.setItem(48, leaderboard); if (plugin.getConfigManager().isShopEnabled()) { ItemStack shop = new ItemStack(Material.GOLD_INGOT); ItemMeta shopMeta = shop.getItemMeta(); - shopMeta.setDisplayName(plugin.getMessageManager().getMessage("items.shop-button.name")); - - List shopLore = new ArrayList<>(); - for (String line : plugin.getMessageManager().getMessagesConfig().getStringList("items.shop-button.lore")) { - String processedLine = line.replace("%coins%", String.valueOf(playerData.battleCoins)); - shopLore.add(GradientColorParser.parse(processedLine)); - } - shopMeta.setLore(shopLore); + shopMeta.setDisplayName(plugin.getMessageManager().getGuiMessage("items.shop-button.name")); + shopMeta.setLore(plugin.getMessageManager().getGuiMessages("items.shop-button.lore", + "%coins%", String.valueOf(playerData.battleCoins))); shop.setItemMeta(shopMeta); gui.setItem(47, shop); } ItemStack dailyReward = new ItemStack(Material.SUNFLOWER); ItemMeta dailyMeta = dailyReward.getItemMeta(); - dailyMeta.setDisplayName(plugin.getMessageManager().getMessage("items.daily-reward.name")); + dailyMeta.setDisplayName(plugin.getMessageManager().getGuiMessage("items.daily-reward.name")); - List dailyLore = new ArrayList<>(); - boolean canClaim = System.currentTimeMillis() - playerData.lastDailyReward >= 24 * 60 * 60 * 1000; + boolean canClaim = System.currentTimeMillis() - playerData.lastDailyReward >= 24L * 60L * 60L * 1000L; String timeUntil = plugin.getMissionManager().getTimeUntilDailyReward(playerData.lastDailyReward); - - for (String line : plugin.getMessageManager().getMessagesConfig().getStringList( - canClaim ? "items.daily-reward.lore-available" : "items.daily-reward.lore-cooldown")) { - String processedLine = line - .replace("%xp%", String.valueOf(plugin.getConfigManager().getDailyRewardXP())) - .replace("%time%", timeUntil); - dailyLore.add(GradientColorParser.parse(processedLine)); - } - dailyMeta.setLore(dailyLore); + dailyMeta.setLore(plugin.getMessageManager().getGuiMessages( + canClaim ? "items.daily-reward.lore-available" : "items.daily-reward.lore-cooldown", + "%xp%", String.valueOf(plugin.getConfigManager().getDailyRewardXP()), + "%time%", timeUntil)); dailyReward.setItemMeta(dailyMeta); gui.setItem(50, dailyReward); if (player.hasPermission("battlepass.admin")) { ItemStack editRewards = new ItemStack(Material.COMMAND_BLOCK); ItemMeta editMeta = editRewards.getItemMeta(); - editMeta.setDisplayName(GradientColorParser.parse("⚙ Edit Rewards")); - List editLore = new ArrayList<>(); - editLore.add(""); - editLore.add(GradientColorParser.parse("&7Open the rewards editor")); - editLore.add(GradientColorParser.parse("&7to modify battle pass rewards")); - editLore.add(""); - editLore.add(GradientColorParser.parse("▶ CLICK TO EDIT")); - editMeta.setLore(editLore); + editMeta.setDisplayName(plugin.getMessageManager().getGuiMessage("items.admin-rewards-editor.name")); + editMeta.setLore(plugin.getMessageManager().getGuiMessages("items.admin-rewards-editor.lore")); editRewards.setItemMeta(editMeta); gui.setItem(46, editRewards); } } -} \ No newline at end of file +} diff --git a/src/main/java/com/Lino/battlePass/gui/LeaderboardGui.java b/src/main/java/com/Lino/battlePass/gui/LeaderboardGui.java index a06e2f7..63602d6 100644 --- a/src/main/java/com/Lino/battlePass/gui/LeaderboardGui.java +++ b/src/main/java/com/Lino/battlePass/gui/LeaderboardGui.java @@ -2,7 +2,6 @@ import com.Lino.battlePass.BattlePass; import com.Lino.battlePass.models.PlayerData; -import com.Lino.battlePass.utils.GradientColorParser; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.OfflinePlayer; @@ -20,7 +19,7 @@ public class LeaderboardGui extends BaseGui { private final Player player; public LeaderboardGui(BattlePass plugin, Player player) { - super(plugin, plugin.getMessageManager().getMessage("gui.leaderboard"), 54); + super(plugin, plugin.getMessageManager().getGuiMessage("gui.leaderboard"), 54); this.player = player; } @@ -35,102 +34,94 @@ public void open() { } gui.setItem(49, createBackButton()); - player.openInventory(gui); } private void setupTitleItem(Inventory gui) { ItemStack titleItem = new ItemStack(Material.GOLDEN_HELMET); ItemMeta meta = titleItem.getItemMeta(); - meta.setDisplayName(plugin.getMessageManager().getMessage("items.leaderboard-title.name")); + meta.setDisplayName(plugin.getMessageManager().getGuiMessage("items.leaderboard-title.name")); - List lore = new ArrayList<>(); - String coinsTime = plugin.getCoinsDistributionTask() != null ? - plugin.getCoinsDistributionTask().getTimeUntilNextDistribution() : "Unknown"; + String coinsTime = plugin.getCoinsDistributionTask() != null + ? plugin.getCoinsDistributionTask().getTimeUntilNextDistribution() + : plugin.getMessageManager().getMessage("time.unknown"); - for (String line : plugin.getMessageManager().getMessagesConfig().getStringList("items.leaderboard-title.lore")) { - String processedLine = line - .replace("%season_time%", plugin.getMissionManager().getTimeUntilSeasonEnd()) - .replace("%coins_time%", coinsTime); - lore.add(GradientColorParser.parse(processedLine)); - } + meta.setLore(plugin.getMessageManager().getGuiMessages("items.leaderboard-title.lore", + "%season_time%", plugin.getMissionManager().getTimeUntilSeasonEnd(), + "%coins_time%", coinsTime)); - meta.setLore(lore); titleItem.setItemMeta(meta); gui.setItem(4, titleItem); } private void setupLeaderboard(Inventory gui) { - plugin.getDatabaseManager().getTop10Players().thenAccept(topPlayers -> { - Bukkit.getScheduler().runTask(plugin, () -> { - int[] slots = {19, 20, 21, 22, 23, 24, 25, 28, 29, 30}; - - for (int i = 0; i < topPlayers.size() && i < 10; i++) { - PlayerData topPlayer = topPlayers.get(i); - OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(topPlayer.uuid); - - // FIX: Controllo se il nome è null per evitare il crash - String playerName = offlinePlayer.getName(); - if (playerName == null) { - playerName = "Unknown"; + plugin.getDatabaseManager().getTop10Players().thenAccept(topPlayers -> + Bukkit.getScheduler().runTask(plugin, () -> { + int[] slots = {19, 20, 21, 22, 23, 24, 25, 28, 29, 30}; + + for (int i = 0; i < topPlayers.size() && i < 10; i++) { + PlayerData topPlayer = topPlayers.get(i); + OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(topPlayer.uuid); + + String playerName = offlinePlayer.getName(); + if (playerName == null) { + playerName = plugin.getMessageManager().getMessage("time.unknown"); + } + + ItemStack skull = new ItemStack(Material.PLAYER_HEAD); + SkullMeta skullMeta = (SkullMeta) skull.getItemMeta(); + skullMeta.setOwningPlayer(offlinePlayer); + + String rank; + if (i == 0) { + rank = plugin.getMessageManager().getGuiMessage("items.leaderboard-rank.first"); + } else if (i == 1) { + rank = plugin.getMessageManager().getGuiMessage("items.leaderboard-rank.second"); + } else if (i == 2) { + rank = plugin.getMessageManager().getGuiMessage("items.leaderboard-rank.third"); + } else { + rank = plugin.getMessageManager().getGuiMessage("items.leaderboard-rank.other", "%rank%", String.valueOf(i + 1)); + } + + skullMeta.setDisplayName(plugin.getMessageManager().getGuiMessage("items.leaderboard-player.name", + "%rank%", rank, + "%player%", playerName)); + + String status = topPlayer.uuid.equals(player.getUniqueId()) + ? plugin.getMessageManager().getGuiMessage("items.leaderboard-status.you") + : plugin.getMessageManager().getGuiMessage("items.leaderboard-status.other"); + + List lore = new ArrayList<>(plugin.getMessageManager().getGuiMessages("items.leaderboard-player.lore", + "%level%", String.valueOf(topPlayer.level), + "%total_levels%", String.valueOf(topPlayer.totalLevels), + "%xp%", String.valueOf(topPlayer.xp), + "%coins%", String.valueOf(topPlayer.battleCoins), + "%status%", status)); + + skullMeta.setLore(lore); + skull.setItemMeta(skullMeta); + gui.setItem(slots[i], skull); } - ItemStack skull = new ItemStack(Material.PLAYER_HEAD); - SkullMeta skullMeta = (SkullMeta) skull.getItemMeta(); - skullMeta.setOwningPlayer(offlinePlayer); - - String rank; - if (i == 0) rank = plugin.getMessageManager().getMessage("items.leaderboard-rank.first"); - else if (i == 1) rank = plugin.getMessageManager().getMessage("items.leaderboard-rank.second"); - else if (i == 2) rank = plugin.getMessageManager().getMessage("items.leaderboard-rank.third"); - else rank = plugin.getMessageManager().getMessage("items.leaderboard-rank.other", "%rank%", String.valueOf(i + 1)); - - skullMeta.setDisplayName(plugin.getMessageManager().getMessage("items.leaderboard-player.name", - "%rank%", rank, "%player%", playerName)); - - String status = topPlayer.uuid.equals(player.getUniqueId()) ? - plugin.getMessageManager().getMessage("items.leaderboard-status.you") : - plugin.getMessageManager().getMessage("items.leaderboard-status.other"); - - List lore = new ArrayList<>(); - for (String line : plugin.getMessageManager().getMessagesConfig().getStringList("items.leaderboard-player.lore")) { - String processedLine = line - .replace("%level%", String.valueOf(topPlayer.level)) - .replace("%total_levels%", String.valueOf(topPlayer.totalLevels)) - .replace("%xp%", String.valueOf(topPlayer.xp)) - .replace("%coins%", String.valueOf(topPlayer.battleCoins)) - .replace("%status%", status); - lore.add(GradientColorParser.parse(processedLine)); + if (player.getOpenInventory().getTitle().equals(title)) { + player.updateInventory(); } - - skullMeta.setLore(lore); - skull.setItemMeta(skullMeta); - gui.setItem(slots[i], skull); - } - - if (player.getOpenInventory().getTitle().equals(title)) { - player.updateInventory(); - } - }); - }); + })); } private void setupCoinsInfo(Inventory gui) { ItemStack coinsInfo = new ItemStack(Material.GOLD_BLOCK); ItemMeta meta = coinsInfo.getItemMeta(); - meta.setDisplayName(plugin.getMessageManager().getMessage("items.coins-info.name")); + meta.setDisplayName(plugin.getMessageManager().getGuiMessage("items.coins-info.name")); - List lore = new ArrayList<>(); - String nextDistTime = plugin.getCoinsDistributionTask() != null ? - plugin.getCoinsDistributionTask().getTimeUntilNextDistribution() : "Unknown"; + String nextDistTime = plugin.getCoinsDistributionTask() != null + ? plugin.getCoinsDistributionTask().getTimeUntilNextDistribution() + : plugin.getMessageManager().getMessage("time.unknown"); - for (String line : plugin.getMessageManager().getMessagesConfig().getStringList("items.coins-info.lore")) { - String processedLine = line.replace("%time%", nextDistTime); - lore.add(GradientColorParser.parse(processedLine)); - } + meta.setLore(plugin.getMessageManager().getGuiMessages("items.coins-info.lore", + "%time%", nextDistTime)); - meta.setLore(lore); coinsInfo.setItemMeta(meta); gui.setItem(40, coinsInfo); } -} \ No newline at end of file +} diff --git a/src/main/java/com/Lino/battlePass/gui/LevelRewardEditGui.java b/src/main/java/com/Lino/battlePass/gui/LevelRewardEditGui.java index 9c07ba8..166d793 100644 --- a/src/main/java/com/Lino/battlePass/gui/LevelRewardEditGui.java +++ b/src/main/java/com/Lino/battlePass/gui/LevelRewardEditGui.java @@ -2,9 +2,7 @@ import com.Lino.battlePass.BattlePass; import com.Lino.battlePass.models.EditableReward; -import com.Lino.battlePass.models.Reward; import com.Lino.battlePass.utils.GradientColorParser; -import com.Lino.battlePass.utils.ItemSerializer; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -39,14 +37,14 @@ private void loadCurrentRewards() { currentRewards.addAll(rewards); } } catch (Exception e) { - // Se il metodo non esiste, lascia la lista vuota + // Keep editor open even if reward loading fails. } } public void open() { if (!player.hasPermission("battlepass.admin")) { player.sendMessage(plugin.getMessageManager().getPrefix() + - GradientColorParser.parse("✗ You don't have permission to access this!")); + GradientColorParser.parse("✗ У вас нет прав для доступа к этому!")); return; } @@ -54,8 +52,8 @@ public void open() { "" : ""; - String title = GradientColorParser.parse(gradient + "Edit Level " + level + " " + - (isPremium ? "Premium" : "Free") + " Rewards"); + String title = GradientColorParser.parse(gradient + "Редактирование уровня " + level + " " + + (isPremium ? "премиум" : "бесплатных") + " наград"); Inventory gui = Bukkit.createInventory(null, 54, title); @@ -66,14 +64,14 @@ public void open() { if (reward.isCommand()) { ItemStack commandItem = new ItemStack(Material.COMMAND_BLOCK); ItemMeta meta = commandItem.getItemMeta(); - meta.setDisplayName(GradientColorParser.parse("Command Reward")); + meta.setDisplayName(GradientColorParser.parse("Награда-команда")); List lore = new ArrayList<>(); lore.add(""); - lore.add(GradientColorParser.parse("&7Display: &f" + reward.getDisplayName())); - lore.add(GradientColorParser.parse("&7Command: &f" + reward.getCommand())); + lore.add(GradientColorParser.parse("&7Отображение: &f" + reward.getDisplayName())); + lore.add(GradientColorParser.parse("&7Команда: &f" + reward.getCommand())); lore.add(""); - lore.add(GradientColorParser.parse("▶ CLICK TO REMOVE")); + lore.add(GradientColorParser.parse("▶ НАЖМИТЕ, ЧТОБЫ УДАЛИТЬ")); meta.setLore(lore); commandItem.setItemMeta(meta); @@ -85,7 +83,7 @@ public void open() { List newLore = new ArrayList<>(originalLore); newLore.add(""); - newLore.add(GradientColorParser.parse("▶ CLICK TO REMOVE")); + newLore.add(GradientColorParser.parse("▶ НАЖМИТЕ, ЧТОБЫ УДАЛИТЬ")); meta.setLore(newLore); item.setItemMeta(meta); @@ -96,18 +94,18 @@ public void open() { ItemStack addItem = new ItemStack(Material.LIME_DYE); ItemMeta addMeta = addItem.getItemMeta(); - addMeta.setDisplayName(GradientColorParser.parse("+ Add Item Reward")); + addMeta.setDisplayName(GradientColorParser.parse("+ Добавить предмет-награду")); List addLore = new ArrayList<>(); addLore.add(""); - addLore.add(GradientColorParser.parse("&7Drag items from your inventory")); - addLore.add(GradientColorParser.parse("&7to the empty slots above to add")); - addLore.add(GradientColorParser.parse("&7them as rewards for this level")); + addLore.add(GradientColorParser.parse("&7Перетащите предметы из инвентаря")); + addLore.add(GradientColorParser.parse("&7в свободные слоты сверху, чтобы добавить")); + addLore.add(GradientColorParser.parse("&7их как награды для этого уровня")); addLore.add(""); - addLore.add(GradientColorParser.parse("&7Supports all item types including:")); - addLore.add(GradientColorParser.parse("&8• &7Custom items with NBT")); - addLore.add(GradientColorParser.parse("&8• &7Items with lore")); - addLore.add(GradientColorParser.parse("&8• &7Enchanted items")); + addLore.add(GradientColorParser.parse("&7Поддерживаются все типы предметов, включая:")); + addLore.add(GradientColorParser.parse("&8• &7Кастомные предметы с NBT")); + addLore.add(GradientColorParser.parse("&8• &7Предметы с описанием")); + addLore.add(GradientColorParser.parse("&8• &7Зачарованные предметы")); addMeta.setLore(addLore); addItem.setItemMeta(addMeta); @@ -115,18 +113,18 @@ public void open() { ItemStack addCommand = new ItemStack(Material.COMMAND_BLOCK); ItemMeta cmdMeta = addCommand.getItemMeta(); - cmdMeta.setDisplayName(GradientColorParser.parse("+ Add Command Reward")); + cmdMeta.setDisplayName(GradientColorParser.parse("+ Добавить награду-команду")); List cmdLore = new ArrayList<>(); cmdLore.add(""); - cmdLore.add(GradientColorParser.parse("&7Add a command reward")); - cmdLore.add(GradientColorParser.parse("&7Type in chat after clicking:")); + cmdLore.add(GradientColorParser.parse("&7Добавьте награду-команду")); + cmdLore.add(GradientColorParser.parse("&7После нажатия введите в чат:")); cmdLore.add(GradientColorParser.parse("&e/cmdreward | ")); cmdLore.add(""); - cmdLore.add(GradientColorParser.parse("&7Example:")); + cmdLore.add(GradientColorParser.parse("&7Пример:")); cmdLore.add(GradientColorParser.parse("&e/cmdreward $1000 | eco give 1000")); cmdLore.add(""); - cmdLore.add(GradientColorParser.parse("▶ CLICK TO ADD COMMAND")); + cmdLore.add(GradientColorParser.parse("▶ НАЖМИТЕ, ЧТОБЫ ДОБАВИТЬ КОМАНДУ")); cmdMeta.setLore(cmdLore); addCommand.setItemMeta(cmdMeta); @@ -134,14 +132,14 @@ public void open() { ItemStack saveButton = new ItemStack(Material.EMERALD); ItemMeta saveMeta = saveButton.getItemMeta(); - saveMeta.setDisplayName(GradientColorParser.parse("✓ Save Changes")); + saveMeta.setDisplayName(GradientColorParser.parse("✓ Сохранить изменения")); List saveLore = new ArrayList<>(); saveLore.add(""); - saveLore.add(GradientColorParser.parse("&7Save changes for this level")); - saveLore.add(GradientColorParser.parse("&7and return to level selection")); + saveLore.add(GradientColorParser.parse("&7Сохранить изменения для этого уровня")); + saveLore.add(GradientColorParser.parse("&7и вернуться к выбору уровней")); saveLore.add(""); - saveLore.add(GradientColorParser.parse("▶ CLICK TO SAVE")); + saveLore.add(GradientColorParser.parse("▶ НАЖМИТЕ, ЧТОБЫ СОХРАНИТЬ")); saveMeta.setLore(saveLore); saveButton.setItemMeta(saveMeta); @@ -149,12 +147,12 @@ public void open() { ItemStack cancelButton = new ItemStack(Material.BARRIER); ItemMeta cancelMeta = cancelButton.getItemMeta(); - cancelMeta.setDisplayName(GradientColorParser.parse("✗ Cancel")); + cancelMeta.setDisplayName(GradientColorParser.parse("✗ Отмена")); List cancelLore = new ArrayList<>(); cancelLore.add(""); - cancelLore.add(GradientColorParser.parse("&7Discard changes and return")); - cancelLore.add(GradientColorParser.parse("&7to level selection")); + cancelLore.add(GradientColorParser.parse("&7Отменить изменения и вернуться")); + cancelLore.add(GradientColorParser.parse("&7к выбору уровней")); cancelMeta.setLore(cancelLore); cancelButton.setItemMeta(cancelMeta); @@ -162,14 +160,14 @@ public void open() { ItemStack clearButton = new ItemStack(Material.TNT); ItemMeta clearMeta = clearButton.getItemMeta(); - clearMeta.setDisplayName(GradientColorParser.parse("⚠ Clear All Rewards")); + clearMeta.setDisplayName(GradientColorParser.parse("⚠ Очистить все награды")); List clearLore = new ArrayList<>(); clearLore.add(""); - clearLore.add(GradientColorParser.parse("&7Remove all rewards")); - clearLore.add(GradientColorParser.parse("&7from this level")); + clearLore.add(GradientColorParser.parse("&7Удалить все награды")); + clearLore.add(GradientColorParser.parse("&7с этого уровня")); clearLore.add(""); - clearLore.add(GradientColorParser.parse("⚠ This cannot be undone!")); + clearLore.add(GradientColorParser.parse("⚠ Это нельзя отменить!")); clearMeta.setLore(clearLore); clearButton.setItemMeta(clearMeta); @@ -177,15 +175,15 @@ public void open() { ItemStack info = new ItemStack(Material.BOOK); ItemMeta infoMeta = info.getItemMeta(); - infoMeta.setDisplayName(GradientColorParser.parse("Level " + level + " Information")); + infoMeta.setDisplayName(GradientColorParser.parse("Информация об уровне " + level + "")); List infoLore = new ArrayList<>(); infoLore.add(""); - infoLore.add(GradientColorParser.parse("&7Type: " + (isPremium ? "&6Premium" : "&bFree"))); - infoLore.add(GradientColorParser.parse("&7Current rewards: &f" + currentRewards.size())); + infoLore.add(GradientColorParser.parse("&7Тип: " + (isPremium ? "&6Премиум" : "&bБесплатный"))); + infoLore.add(GradientColorParser.parse("&7Текущих наград: &f" + currentRewards.size())); infoLore.add(""); - infoLore.add(GradientColorParser.parse("&8Drag items to add")); - infoLore.add(GradientColorParser.parse("&8Click items to remove")); + infoLore.add(GradientColorParser.parse("&8Перетаскивайте предметы для добавления")); + infoLore.add(GradientColorParser.parse("&8Нажимайте на предметы для удаления")); infoMeta.setLore(infoLore); info.setItemMeta(infoMeta); @@ -219,4 +217,4 @@ public int getLevel() { public boolean isPremium() { return isPremium; } -} \ No newline at end of file +} diff --git a/src/main/java/com/Lino/battlePass/gui/MissionDetailsGui.java b/src/main/java/com/Lino/battlePass/gui/MissionDetailsGui.java index 3974ac6..c459084 100644 --- a/src/main/java/com/Lino/battlePass/gui/MissionDetailsGui.java +++ b/src/main/java/com/Lino/battlePass/gui/MissionDetailsGui.java @@ -26,37 +26,37 @@ public MissionDetailsGui(BattlePass plugin, Player player, String missionKey) { } public void open() { - Inventory gui = Bukkit.createInventory(null, 36, GradientColorParser.parse("Editing: " + missionKey + "")); + Inventory gui = Bukkit.createInventory(null, 36, GradientColorParser.parse("Редактирование: " + missionKey + "")); ConfigurationSection section = plugin.getConfigManager().getMissionsConfig().getConfigurationSection("mission-pools." + missionKey); if (section == null) { - player.sendMessage("§cMission not found!"); + player.sendMessage("§cМиссия не найдена!"); player.closeInventory(); return; } String type = section.getString("type"); - gui.setItem(10, createEditItem(Material.NAME_TAG, "&eDisplay Name", section.getString("display-name"))); - gui.setItem(11, createEditItem(Material.DIAMOND_SWORD, "&eType", type)); + gui.setItem(10, createEditItem(Material.NAME_TAG, "&eНазвание", section.getString("display-name"))); + gui.setItem(11, createEditItem(Material.DIAMOND_SWORD, "&eТип", type)); if (plugin.getMissionEditorManager().isTargetRequired(type)) { - gui.setItem(12, createEditItem(Material.TARGET, "&eTarget", section.getString("target"))); + gui.setItem(12, createEditItem(Material.TARGET, "&eЦель", section.getString("target"))); } else { - gui.setItem(12, createNonEditItem(Material.BARRIER, "&7Target", "&7Not needed for " + type)); + gui.setItem(12, createNonEditItem(Material.BARRIER, "&7Цель", "&7Не требуется для " + type)); } - gui.setItem(14, createEditItem(Material.IRON_INGOT, "&eMin Required", String.valueOf(section.getInt("min-required")))); - gui.setItem(15, createEditItem(Material.GOLD_INGOT, "&eMax Required", String.valueOf(section.getInt("max-required")))); + gui.setItem(14, createEditItem(Material.IRON_INGOT, "&eМин. требование", String.valueOf(section.getInt("min-required")))); + gui.setItem(15, createEditItem(Material.GOLD_INGOT, "&eМакс. требование", String.valueOf(section.getInt("max-required")))); - gui.setItem(23, createEditItem(Material.EXPERIENCE_BOTTLE, "&eMin XP", String.valueOf(section.getInt("min-xp")))); - gui.setItem(24, createEditItem(Material.EXPERIENCE_BOTTLE, "&eMax XP", String.valueOf(section.getInt("max-xp")))); + gui.setItem(23, createEditItem(Material.EXPERIENCE_BOTTLE, "&eМин. XP", String.valueOf(section.getInt("min-xp")))); + gui.setItem(24, createEditItem(Material.EXPERIENCE_BOTTLE, "&eМакс. XP", String.valueOf(section.getInt("max-xp")))); - gui.setItem(22, createEditItem(Material.ANVIL, "&eWeight", String.valueOf(section.getInt("weight")))); + gui.setItem(22, createEditItem(Material.ANVIL, "&eВес", String.valueOf(section.getInt("weight")))); ItemStack back = new ItemStack(Material.BARRIER); ItemMeta meta = back.getItemMeta(); - meta.setDisplayName(GradientColorParser.parse("&cBack to List")); + meta.setDisplayName(GradientColorParser.parse("&cНазад к списку")); back.setItemMeta(meta); gui.setItem(31, back); @@ -69,9 +69,9 @@ private ItemStack createEditItem(Material mat, String title, String value) { meta.setDisplayName(GradientColorParser.parse(title)); List lore = new ArrayList<>(); lore.add(""); - lore.add(GradientColorParser.parse("&7Current: &f" + value)); + lore.add(GradientColorParser.parse("&7Текущее: &f" + value)); lore.add(""); - lore.add(GradientColorParser.parse("&eClick to Change")); + lore.add(GradientColorParser.parse("&eНажмите, чтобы изменить")); meta.setLore(lore); item.setItemMeta(meta); return item; @@ -88,4 +88,4 @@ private ItemStack createNonEditItem(Material mat, String title, String reason) { item.setItemMeta(meta); return item; } -} \ No newline at end of file +} diff --git a/src/main/java/com/Lino/battlePass/gui/MissionEditorGui.java b/src/main/java/com/Lino/battlePass/gui/MissionEditorGui.java index 95ba280..7ec932c 100644 --- a/src/main/java/com/Lino/battlePass/gui/MissionEditorGui.java +++ b/src/main/java/com/Lino/battlePass/gui/MissionEditorGui.java @@ -27,7 +27,7 @@ public MissionEditorGui(BattlePass plugin, Player player, int page) { } public void open() { - Inventory gui = Bukkit.createInventory(null, 54, GradientColorParser.parse("Mission Editor - Page " + page + "")); + Inventory gui = Bukkit.createInventory(null, 54, GradientColorParser.parse("Редактор миссий - Страница " + page + "")); ConfigurationSection pools = plugin.getConfigManager().getMissionsConfig().getConfigurationSection("mission-pools"); List keys = pools != null ? new ArrayList<>(pools.getKeys(false)) : new ArrayList<>(); @@ -42,17 +42,17 @@ public void open() { } if (page > 1) { - ItemStack prev = createButton(Material.ARROW, "&ePrevious Page"); + ItemStack prev = createButton(Material.ARROW, "&eПредыдущая страница"); gui.setItem(45, prev); } if (end < keys.size()) { - ItemStack next = createButton(Material.ARROW, "&eNext Page"); + ItemStack next = createButton(Material.ARROW, "&eСледующая страница"); gui.setItem(53, next); } - gui.setItem(49, createButton(Material.EMERALD, "&a+ Create New Mission")); - gui.setItem(48, createButton(Material.BARRIER, "&cBack to Menu")); + gui.setItem(49, createButton(Material.EMERALD, "&a+ Создать новую миссию")); + gui.setItem(48, createButton(Material.BARRIER, "&cНазад в меню")); player.openInventory(gui); } @@ -63,12 +63,12 @@ private ItemStack createMissionIcon(String key, ConfigurationSection section) { meta.setDisplayName(GradientColorParser.parse("&e" + key)); List lore = new ArrayList<>(); - lore.add(GradientColorParser.parse("&7Type: &f" + section.getString("type"))); - lore.add(GradientColorParser.parse("&7Target: &f" + section.getString("target"))); - lore.add(GradientColorParser.parse("&7Display: &f" + section.getString("display-name"))); + lore.add(GradientColorParser.parse("&7Тип: &f" + section.getString("type"))); + lore.add(GradientColorParser.parse("&7Цель: &f" + section.getString("target"))); + lore.add(GradientColorParser.parse("&7Название: &f" + section.getString("display-name"))); lore.add(""); - lore.add(GradientColorParser.parse("&eLeft-Click to Edit")); - lore.add(GradientColorParser.parse("&cRight-Click to Delete")); + lore.add(GradientColorParser.parse("&eЛКМ - редактировать")); + lore.add(GradientColorParser.parse("&cПКМ - удалить")); meta.setLore(lore); // Store key in persistent data @@ -85,4 +85,4 @@ private ItemStack createButton(Material mat, String name) { item.setItemMeta(meta); return item; } -} \ No newline at end of file +} diff --git a/src/main/java/com/Lino/battlePass/gui/MissionTypeSelectionGui.java b/src/main/java/com/Lino/battlePass/gui/MissionTypeSelectionGui.java index 43478ff..a9df519 100644 --- a/src/main/java/com/Lino/battlePass/gui/MissionTypeSelectionGui.java +++ b/src/main/java/com/Lino/battlePass/gui/MissionTypeSelectionGui.java @@ -51,7 +51,7 @@ public MissionTypeSelectionGui(BattlePass plugin, Player player) { } public void open() { - Inventory gui = Bukkit.createInventory(null, 54, GradientColorParser.parse("Select Mission Type")); + Inventory gui = Bukkit.createInventory(null, 54, GradientColorParser.parse("Выберите тип миссии")); int slot = 0; for (Map.Entry entry : MISSION_TYPES.entrySet()) { @@ -62,7 +62,7 @@ public void open() { ItemStack back = new ItemStack(Material.BARRIER); ItemMeta meta = back.getItemMeta(); - meta.setDisplayName(GradientColorParser.parse("&cBack to Editor")); + meta.setDisplayName(GradientColorParser.parse("&cНазад в редактор")); back.setItemMeta(meta); gui.setItem(53, back); @@ -76,8 +76,8 @@ private ItemStack createTypeItem(String type, Material material) { List lore = new ArrayList<>(); lore.add(""); - lore.add(GradientColorParser.parse("&7Click to create a new")); - lore.add(GradientColorParser.parse("&7mission of this type.")); + lore.add(GradientColorParser.parse("&7Нажмите, чтобы создать новую")); + lore.add(GradientColorParser.parse("&7миссию этого типа.")); meta.setLore(lore); meta.getPersistentDataContainer().set(plugin.getCustomItemManager().getPremiumItemKey(), PersistentDataType.STRING, type); @@ -85,4 +85,4 @@ private ItemStack createTypeItem(String type, Material material) { item.setItemMeta(meta); return item; } -} \ No newline at end of file +} diff --git a/src/main/java/com/Lino/battlePass/gui/MissionsGui.java b/src/main/java/com/Lino/battlePass/gui/MissionsGui.java index 53e4cb8..5e772e6 100644 --- a/src/main/java/com/Lino/battlePass/gui/MissionsGui.java +++ b/src/main/java/com/Lino/battlePass/gui/MissionsGui.java @@ -3,14 +3,12 @@ import com.Lino.battlePass.BattlePass; import com.Lino.battlePass.models.Mission; import com.Lino.battlePass.models.PlayerData; -import com.Lino.battlePass.utils.GradientColorParser; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; -import java.util.ArrayList; import java.util.List; public class MissionsGui extends BaseGui { @@ -19,7 +17,7 @@ public class MissionsGui extends BaseGui { private final PlayerData playerData; public MissionsGui(BattlePass plugin, Player player) { - super(plugin, plugin.getMessageManager().getMessage("gui.missions"), 54); + super(plugin, plugin.getMessageManager().getGuiMessage("gui.missions"), 54); this.player = player; this.playerData = plugin.getPlayerDataManager().getPlayerData(player.getUniqueId()); } @@ -42,15 +40,10 @@ public void open() { private void setupTimerItem(Inventory gui) { ItemStack timer = new ItemStack(Material.CLOCK); ItemMeta meta = timer.getItemMeta(); - meta.setDisplayName(plugin.getMessageManager().getMessage("items.mission-timer.name")); + meta.setDisplayName(plugin.getMessageManager().getGuiMessage("items.mission-timer.name")); + meta.setLore(plugin.getMessageManager().getGuiMessages("items.mission-timer.lore", + "%reset_time%", plugin.getMissionManager().getTimeUntilReset())); - List lore = new ArrayList<>(); - for (String line : plugin.getMessageManager().getMessagesConfig().getStringList("items.mission-timer.lore")) { - String processedLine = line.replace("%reset_time%", plugin.getMissionManager().getTimeUntilReset()); - lore.add(GradientColorParser.parse(processedLine)); - } - - meta.setLore(lore); timer.setItemMeta(meta); gui.setItem(4, timer); } @@ -61,7 +54,6 @@ private void setupMissions(Inventory gui) { for (int i = 0; i < currentMissions.size() && i < slots.length; i++) { Mission mission = currentMissions.get(i); - String key = mission.type + "_" + mission.target + "_" + mission.required + "_" + mission.name.hashCode(); int progress = playerData.missionProgress.getOrDefault(key, 0); @@ -70,19 +62,16 @@ private void setupMissions(Inventory gui) { ItemStack missionItem = new ItemStack(completed ? Material.LIME_DYE : Material.GRAY_DYE); ItemMeta meta = missionItem.getItemMeta(); - String itemNamePath = completed ? "items.mission-completed.name" : "items.mission-in-progress.name"; - String itemLorePath = completed ? "items.mission-completed.lore" : "items.mission-in-progress.lore"; + String namePath = completed ? "items.mission-completed.name" : "items.mission-in-progress.name"; + String lorePath = completed ? "items.mission-completed.lore" : "items.mission-in-progress.lore"; - meta.setDisplayName(plugin.getMessageManager().getMessage(itemNamePath, "%mission%", mission.name)); - - List lore = plugin.getMessageManager().getMessages(itemLorePath, + meta.setDisplayName(plugin.getMessageManager().getGuiMessage(namePath, "%mission%", mission.name)); + meta.setLore(plugin.getMessageManager().getGuiMessages(lorePath, "%progress%", String.valueOf(progress), "%required%", String.valueOf(mission.required), "%reward_xp%", String.valueOf(mission.xpReward), - "%reset_time%", plugin.getMissionManager().getTimeUntilReset() - ); + "%reset_time%", plugin.getMissionManager().getTimeUntilReset())); - meta.setLore(lore); missionItem.setItemMeta(meta); gui.setItem(slots[i], missionItem); } @@ -91,17 +80,8 @@ private void setupMissions(Inventory gui) { private void setupAdminResetButton(Inventory gui) { ItemStack resetButton = new ItemStack(Material.TNT); ItemMeta meta = resetButton.getItemMeta(); - - meta.setDisplayName(GradientColorParser.parse("Force Reset Missions")); - - List lore = new ArrayList<>(); - lore.add(""); - lore.add(GradientColorParser.parse("Admin Only")); - lore.add(GradientColorParser.parse("&7Force reset all daily missions")); - lore.add(""); - lore.add(GradientColorParser.parse("▶ CLICK TO RESET")); - - meta.setLore(lore); + meta.setDisplayName(plugin.getMessageManager().getGuiMessage("items.admin-missions-reset.name")); + meta.setLore(plugin.getMessageManager().getGuiMessages("items.admin-missions-reset.lore")); resetButton.setItemMeta(meta); gui.setItem(45, resetButton); } @@ -109,19 +89,9 @@ private void setupAdminResetButton(Inventory gui) { private void setupMissionEditorButton(Inventory gui) { ItemStack editButton = new ItemStack(Material.WRITABLE_BOOK); ItemMeta meta = editButton.getItemMeta(); - - meta.setDisplayName(GradientColorParser.parse("Mission Editor")); - - List lore = new ArrayList<>(); - lore.add(""); - lore.add(GradientColorParser.parse("Admin Only")); - lore.add(GradientColorParser.parse("&7Create, Edit or Delete")); - lore.add(GradientColorParser.parse("&7mission templates.")); - lore.add(""); - lore.add(GradientColorParser.parse("▶ CLICK TO EDIT")); - - meta.setLore(lore); + meta.setDisplayName(plugin.getMessageManager().getGuiMessage("items.admin-missions-editor.name")); + meta.setLore(plugin.getMessageManager().getGuiMessages("items.admin-missions-editor.lore")); editButton.setItemMeta(meta); gui.setItem(53, editButton); } -} \ No newline at end of file +} diff --git a/src/main/java/com/Lino/battlePass/gui/RewardsCategoryGui.java b/src/main/java/com/Lino/battlePass/gui/RewardsCategoryGui.java index a1232dd..419186c 100644 --- a/src/main/java/com/Lino/battlePass/gui/RewardsCategoryGui.java +++ b/src/main/java/com/Lino/battlePass/gui/RewardsCategoryGui.java @@ -3,6 +3,7 @@ import com.Lino.battlePass.BattlePass; import com.Lino.battlePass.models.Reward; import com.Lino.battlePass.utils.GradientColorParser; +import com.Lino.battlePass.utils.MaterialNameResolver; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; @@ -37,16 +38,21 @@ public RewardsCategoryGui(BattlePass plugin, Player player, boolean isPremium, i public void open() { if (!player.hasPermission("battlepass.admin")) { player.sendMessage(plugin.getMessageManager().getPrefix() + - GradientColorParser.parse("✗ You don't have permission to access this!")); + plugin.getMessageManager().getMessage("messages.no-permission")); return; } + boolean english = isEnglishLanguage(); int editingSeason = plugin.getRewardEditorManager().getSeasonEditingContext(player.getUniqueId()); - String seasonLabel = editingSeason > 0 ? " &8[&eSeason " + editingSeason + "&8]" : ""; + String seasonLabel = editingSeason > 0 + ? " &8[&e" + (english ? "Season " : "Сезон ") + editingSeason + "&8]" + : ""; String title = isPremium ? - GradientColorParser.parse("★ Premium Rewards" + seasonLabel + " &8- &7Page " + page) : - GradientColorParser.parse("⚡ Free Rewards" + seasonLabel + " &8- &7Page " + page); + GradientColorParser.parse("" + (english ? "★ Premium Rewards" : "★ Премиум-награды") + + "" + seasonLabel + " &8- &7" + (english ? "Page " : "Страница ") + page) : + GradientColorParser.parse("" + (english ? "⚡ Free Rewards" : "⚡ Бесплатные награды") + + "" + seasonLabel + " &8- &7" + (english ? "Page " : "Страница ") + page); Inventory gui = Bukkit.createInventory(null, 54, title); @@ -73,21 +79,26 @@ public void open() { if (page > 1) { ItemStack prevPage = new ItemStack(Material.ARROW); ItemMeta prevMeta = prevPage.getItemMeta(); - prevMeta.setDisplayName(GradientColorParser.parse("← Previous Page")); + prevMeta.setDisplayName(GradientColorParser.parse("" + + (english ? "← Previous page" : "← Предыдущая страница") + "")); List prevLore = new ArrayList<>(); - prevLore.add(GradientColorParser.parse("&7Go to page " + (page - 1))); + prevLore.add(GradientColorParser.parse("&7" + (english ? "Go to page " : "Перейти на страницу ") + (page - 1))); prevMeta.setLore(prevLore); prevPage.setItemMeta(prevMeta); gui.setItem(45, prevPage); } - int maxLevel = plugin.getRewardManager().getMaxLevel(); - if (endLevel < maxLevel + LEVELS_PER_PAGE) { + int maxLevel = Math.max( + plugin.getRewardManager().getMaxLevel(), + rewardsByLevel.keySet().stream().mapToInt(Integer::intValue).max().orElse(0) + ); + if (endLevel < maxLevel) { ItemStack nextPage = new ItemStack(Material.ARROW); ItemMeta nextMeta = nextPage.getItemMeta(); - nextMeta.setDisplayName(GradientColorParser.parse("Next Page →")); + nextMeta.setDisplayName(GradientColorParser.parse("" + + (english ? "Next page →" : "Следующая страница →") + "")); List nextLore = new ArrayList<>(); - nextLore.add(GradientColorParser.parse("&7Go to page " + (page + 1))); + nextLore.add(GradientColorParser.parse("&7" + (english ? "Go to page " : "Перейти на страницу ") + (page + 1))); nextMeta.setLore(nextLore); nextPage.setItemMeta(nextMeta); gui.setItem(53, nextPage); @@ -95,18 +106,20 @@ public void open() { ItemStack back = new ItemStack(Material.BARRIER); ItemMeta backMeta = back.getItemMeta(); - backMeta.setDisplayName(GradientColorParser.parse("← Back")); + backMeta.setDisplayName(GradientColorParser.parse("" + + (english ? "← Back" : "← Назад") + "")); List backLore = new ArrayList<>(); - backLore.add(GradientColorParser.parse("&7Return to category selection")); + backLore.add(GradientColorParser.parse("&7" + (english ? "Return to category selection" : "Вернуться к выбору категории"))); backMeta.setLore(backLore); back.setItemMeta(backMeta); gui.setItem(48, back); ItemStack save = new ItemStack(Material.EMERALD); ItemMeta saveMeta = save.getItemMeta(); - saveMeta.setDisplayName(GradientColorParser.parse("✓ Save & Apply All")); + saveMeta.setDisplayName(GradientColorParser.parse("" + + (english ? "✓ Save and apply all" : "✓ Сохранить и применить всё") + "")); List saveLore = new ArrayList<>(); - saveLore.add(GradientColorParser.parse("&7Save all changes and reload")); + saveLore.add(GradientColorParser.parse("&7" + (english ? "Save all changes and reload" : "Сохранить все изменения и перезагрузить"))); saveMeta.setLore(saveLore); save.setItemMeta(saveMeta); gui.setItem(49, save); @@ -116,6 +129,7 @@ public void open() { private Map> loadSeasonRewards(int seasonNumber, boolean premium) { Map> rewardsByLevel = new HashMap<>(); + String defaultRewardName = isEnglishLanguage() ? "Reward" : "Награда"; File file = plugin.getSeasonRotationManager().getSeasonRewardFile(seasonNumber, premium); if (!file.exists()) return rewardsByLevel; @@ -142,23 +156,25 @@ private Map> loadSeasonRewards(int seasonNumber, boolean p for (String itemKey : items.getKeys(false)) { ConfigurationSection itemSection = items.getConfigurationSection(itemKey); if (itemSection != null && itemSection.contains("command")) { - String display = itemSection.getString("display", "Reward"); + String display = itemSection.getString("display", defaultRewardName); String cmd = itemSection.getString("command", ""); rewards.add(new Reward(level, cmd, display, premium)); } else if (itemSection != null) { String material = itemSection.getString("material", "STONE"); - String displayName = itemSection.getString("display-name", material); + String displayName = itemSection.getString("display-name", + resolveMaterialDisplayName(material)); rewards.add(new Reward(level, "", displayName, premium)); } } } } else if (section.contains("command")) { - String display = section.getString("display", "Reward"); + String display = section.getString("display", defaultRewardName); String cmd = section.getString("command", ""); rewards.add(new Reward(level, cmd, display, premium)); } else if (section.contains("material")) { String material = section.getString("material", "STONE"); - String displayName = section.getString("display-name", material); + String displayName = section.getString("display-name", + resolveMaterialDisplayName(material)); rewards.add(new Reward(level, "", displayName, premium)); } @@ -170,7 +186,12 @@ private Map> loadSeasonRewards(int seasonNumber, boolean p return rewardsByLevel; } + private String resolveMaterialDisplayName(String materialName) { + return MaterialNameResolver.resolve(materialName, getCurrentLanguage()); + } + private ItemStack createLevelChest(int level, List rewards) { + boolean english = isEnglishLanguage(); boolean hasRewards = rewards != null && !rewards.isEmpty(); Material material = hasRewards ? Material.CHEST : Material.GLASS; @@ -179,26 +200,40 @@ private ItemStack createLevelChest(int level, List rewards) { meta.setDisplayName(GradientColorParser.parse( (hasRewards ? "" : "&7") + - "Level " + level + + (english ? "Level " : "Уровень ") + level + (hasRewards ? "" : ""))); List lore = new ArrayList<>(); lore.add(""); if (hasRewards) { - lore.add(GradientColorParser.parse("Current Rewards:")); + lore.add(GradientColorParser.parse("" + + (english ? "Current rewards:" : "Текущие награды:") + "")); for (Reward reward : rewards) { lore.add(GradientColorParser.parse("&7• &f" + reward.displayName)); } } else { - lore.add(GradientColorParser.parse("&7No rewards configured")); + lore.add(GradientColorParser.parse("&7" + (english ? "Rewards are not configured" : "Награды не настроены"))); } lore.add(""); - lore.add(GradientColorParser.parse("▶ CLICK TO EDIT")); + lore.add(GradientColorParser.parse("" + + (english ? "▶ CLICK TO EDIT" : "▶ НАЖМИТЕ ДЛЯ РЕДАКТИРОВАНИЯ") + "")); meta.setLore(lore); item.setItemMeta(meta); return item; } -} \ No newline at end of file + + private String getCurrentLanguage() { + if (plugin.getConfigManager() == null) { + return "RU"; + } + return plugin.getConfigManager().getLanguage(); + } + + private boolean isEnglishLanguage() { + String language = getCurrentLanguage(); + return "EN".equalsIgnoreCase(language) || "ENG".equalsIgnoreCase(language); + } +} diff --git a/src/main/java/com/Lino/battlePass/gui/RewardsEditorGui.java b/src/main/java/com/Lino/battlePass/gui/RewardsEditorGui.java index 781d55b..4d73ccd 100644 --- a/src/main/java/com/Lino/battlePass/gui/RewardsEditorGui.java +++ b/src/main/java/com/Lino/battlePass/gui/RewardsEditorGui.java @@ -16,14 +16,14 @@ public class RewardsEditorGui extends BaseGui { private final Player player; public RewardsEditorGui(BattlePass plugin, Player player) { - super(plugin, GradientColorParser.parse("⚙ Rewards Editor"), 27); + super(plugin, GradientColorParser.parse("⚙ Редактор наград"), 27); this.player = player; } public void open() { if (!player.hasPermission("battlepass.admin")) { player.sendMessage(plugin.getMessageManager().getPrefix() + - GradientColorParser.parse("✗ You don't have permission to access this!")); + GradientColorParser.parse("✗ У вас нет прав для доступа к этому!")); return; } @@ -31,19 +31,19 @@ public void open() { ItemStack freeRewards = new ItemStack(Material.CHEST); ItemMeta freeMeta = freeRewards.getItemMeta(); - freeMeta.setDisplayName(GradientColorParser.parse("⚡ Free Rewards Editor")); + freeMeta.setDisplayName(GradientColorParser.parse("⚡ Редактор бесплатных наград")); List freeLore = new ArrayList<>(); freeLore.add(""); - freeLore.add(GradientColorParser.parse("&7Edit rewards for the free battle pass")); - freeLore.add(GradientColorParser.parse("&7that all players can claim")); + freeLore.add(GradientColorParser.parse("&7Редактировать награды бесплатной ветки")); + freeLore.add(GradientColorParser.parse("&7которые доступны всем игрокам")); freeLore.add(""); - freeLore.add(GradientColorParser.parse("▼ Features ▼")); - freeLore.add(GradientColorParser.parse("&7• View all 54 levels")); - freeLore.add(GradientColorParser.parse("&7• Add/remove items")); - freeLore.add(GradientColorParser.parse("&7• Configure commands")); + freeLore.add(GradientColorParser.parse("▼ Возможности ▼")); + freeLore.add(GradientColorParser.parse("&7• Просмотр всех 54 уровней")); + freeLore.add(GradientColorParser.parse("&7• Добавление/удаление предметов")); + freeLore.add(GradientColorParser.parse("&7• Настройка команд")); freeLore.add(""); - freeLore.add(GradientColorParser.parse("▶ CLICK TO EDIT")); + freeLore.add(GradientColorParser.parse("▶ НАЖМИТЕ ДЛЯ РЕДАКТИРОВАНИЯ")); freeMeta.setLore(freeLore); freeRewards.setItemMeta(freeMeta); @@ -51,19 +51,19 @@ public void open() { ItemStack premiumRewards = new ItemStack(Material.ENDER_CHEST); ItemMeta premiumMeta = premiumRewards.getItemMeta(); - premiumMeta.setDisplayName(GradientColorParser.parse("★ Premium Rewards Editor")); + premiumMeta.setDisplayName(GradientColorParser.parse("★ Редактор премиум-наград")); List premiumLore = new ArrayList<>(); premiumLore.add(""); - premiumLore.add(GradientColorParser.parse("&7Edit rewards for the premium battle pass")); - premiumLore.add(GradientColorParser.parse("&7exclusive to premium pass holders")); + premiumLore.add(GradientColorParser.parse("&7Редактировать награды премиум-ветки")); + premiumLore.add(GradientColorParser.parse("&7доступные только владельцам Premium Pass")); premiumLore.add(""); - premiumLore.add(GradientColorParser.parse("▼ Features ▼")); - premiumLore.add(GradientColorParser.parse("&7• View all 54 levels")); - premiumLore.add(GradientColorParser.parse("&7• Add/remove items")); - premiumLore.add(GradientColorParser.parse("&7• Configure commands")); + premiumLore.add(GradientColorParser.parse("▼ Возможности ▼")); + premiumLore.add(GradientColorParser.parse("&7• Просмотр всех 54 уровней")); + premiumLore.add(GradientColorParser.parse("&7• Добавление/удаление предметов")); + premiumLore.add(GradientColorParser.parse("&7• Настройка команд")); premiumLore.add(""); - premiumLore.add(GradientColorParser.parse("▶ CLICK TO EDIT")); + premiumLore.add(GradientColorParser.parse("▶ НАЖМИТЕ ДЛЯ РЕДАКТИРОВАНИЯ")); premiumMeta.setLore(premiumLore); premiumRewards.setItemMeta(premiumMeta); @@ -71,20 +71,20 @@ public void open() { ItemStack info = new ItemStack(Material.BOOK); ItemMeta infoMeta = info.getItemMeta(); - infoMeta.setDisplayName(GradientColorParser.parse("ℹ Information")); + infoMeta.setDisplayName(GradientColorParser.parse("ℹ Информация")); List infoLore = new ArrayList<>(); infoLore.add(""); - infoLore.add(GradientColorParser.parse("How to Edit Rewards:")); - infoLore.add(GradientColorParser.parse("&71. Choose Free or Premium rewards")); - infoLore.add(GradientColorParser.parse("&72. Click on a level chest to edit")); - infoLore.add(GradientColorParser.parse("&73. Add items from your inventory")); - infoLore.add(GradientColorParser.parse("&74. Remove items by clicking them")); - infoLore.add(GradientColorParser.parse("&75. Click Save to apply changes")); + infoLore.add(GradientColorParser.parse("Как редактировать награды:")); + infoLore.add(GradientColorParser.parse("&71. Выберите бесплатные или премиум-награды")); + infoLore.add(GradientColorParser.parse("&72. Нажмите на сундук уровня для редактирования")); + infoLore.add(GradientColorParser.parse("&73. Добавьте предметы из инвентаря")); + infoLore.add(GradientColorParser.parse("&74. Удалите предметы кликом")); + infoLore.add(GradientColorParser.parse("&75. Нажмите Сохранить для применения")); infoLore.add(""); - infoLore.add(GradientColorParser.parse("⚠ Warning:")); - infoLore.add(GradientColorParser.parse("&7Changes will reload the plugin")); - infoLore.add(GradientColorParser.parse("&7and update configuration files")); + infoLore.add(GradientColorParser.parse("⚠ Внимание:")); + infoLore.add(GradientColorParser.parse("&7Изменения перезагрузят плагин")); + infoLore.add(GradientColorParser.parse("&7и обновят конфигурационные файлы")); infoMeta.setLore(infoLore); info.setItemMeta(infoMeta); @@ -94,4 +94,4 @@ public void open() { player.openInventory(gui); } -} \ No newline at end of file +} diff --git a/src/main/java/com/Lino/battlePass/gui/ShopGui.java b/src/main/java/com/Lino/battlePass/gui/ShopGui.java index b20d0de..ca71cae 100644 --- a/src/main/java/com/Lino/battlePass/gui/ShopGui.java +++ b/src/main/java/com/Lino/battlePass/gui/ShopGui.java @@ -19,7 +19,7 @@ public class ShopGui extends BaseGui { private final PlayerData playerData; public ShopGui(BattlePass plugin, Player player) { - super(plugin, plugin.getMessageManager().getMessage("gui.shop"), 54); + super(plugin, plugin.getMessageManager().getGuiMessage("gui.shop"), 54); this.player = player; this.playerData = plugin.getPlayerDataManager().getPlayerData(player.getUniqueId()); } @@ -37,15 +37,10 @@ public void open() { private void setupBalanceItem(Inventory gui) { ItemStack balance = new ItemStack(Material.GOLD_INGOT); ItemMeta meta = balance.getItemMeta(); - meta.setDisplayName(plugin.getMessageManager().getMessage("items.shop-balance.name")); + meta.setDisplayName(plugin.getMessageManager().getGuiMessage("items.shop-balance.name")); + meta.setLore(plugin.getMessageManager().getGuiMessages("items.shop-balance.lore", + "%coins%", String.valueOf(playerData.battleCoins))); - List lore = new ArrayList<>(); - for (String line : plugin.getMessageManager().getMessagesConfig().getStringList("items.shop-balance.lore")) { - String processedLine = line.replace("%coins%", String.valueOf(playerData.battleCoins)); - lore.add(GradientColorParser.parse(processedLine)); - } - - meta.setLore(lore); balance.setItemMeta(meta); gui.setItem(4, balance); } @@ -66,4 +61,4 @@ private void setupShopItems(Inventory gui) { gui.setItem(item.slot, shopItem); } } -} \ No newline at end of file +} diff --git a/src/main/java/com/Lino/battlePass/listeners/GuiClickListener.java b/src/main/java/com/Lino/battlePass/listeners/GuiClickListener.java index 5113c40..9af2666 100644 --- a/src/main/java/com/Lino/battlePass/listeners/GuiClickListener.java +++ b/src/main/java/com/Lino/battlePass/listeners/GuiClickListener.java @@ -27,11 +27,11 @@ public void onInventoryClick(InventoryClickEvent event) { String title = event.getView().getTitle(); Player player = (Player) event.getWhoClicked(); - boolean isBattlePassGUI = title.startsWith(plugin.getMessageManager().getMessage("gui.battlepass").split("%")[0]); + boolean isBattlePassGUI = title.startsWith(plugin.getMessageManager().getGuiMessage("gui.battlepass").split("%")[0]); - if (!isBattlePassGUI && !title.equals(plugin.getMessageManager().getMessage("gui.leaderboard")) && - !title.equals(plugin.getMessageManager().getMessage("gui.missions")) && - !title.equals(plugin.getMessageManager().getMessage("gui.shop"))) { + if (!isBattlePassGUI && !title.equals(plugin.getMessageManager().getGuiMessage("gui.leaderboard")) && + !title.equals(plugin.getMessageManager().getGuiMessage("gui.missions")) && + !title.equals(plugin.getMessageManager().getGuiMessage("gui.shop"))) { return; } @@ -42,14 +42,14 @@ public void onInventoryClick(InventoryClickEvent event) { if (isBattlePassGUI) { handleBattlePassClick(player, clicked, event.getSlot()); - } else if (title.equals(plugin.getMessageManager().getMessage("gui.leaderboard"))) { + } else if (title.equals(plugin.getMessageManager().getGuiMessage("gui.leaderboard"))) { if (clicked.getType() == Material.BARRIER) { int page = plugin.getGuiManager().getCurrentPages().getOrDefault(player.getEntityId(), 1); plugin.getGuiManager().openBattlePassGUI(player, page); } - } else if (title.equals(plugin.getMessageManager().getMessage("gui.missions"))) { + } else if (title.equals(plugin.getMessageManager().getGuiMessage("gui.missions"))) { handleMissionsClick(player, clicked, event.getSlot()); - } else if (title.equals(plugin.getMessageManager().getMessage("gui.shop"))) { + } else if (title.equals(plugin.getMessageManager().getGuiMessage("gui.shop"))) { handleShopClick(player, clicked, event.getSlot()); } } @@ -84,7 +84,7 @@ private void handleBattlePassClick(Player player, ItemStack clicked, int slot) { if (meta.getPersistentDataContainer().has(plugin.getEventManager().getNavigationKey(), PersistentDataType.STRING)) { String action = meta.getPersistentDataContainer().get(plugin.getEventManager().getNavigationKey(), PersistentDataType.STRING); - // Calcolo dinamico delle pagine massime + // Dynamic max page calculation based on configured max reward level. int maxLevel = plugin.getRewardManager().getMaxLevel(); int maxPages = (int) Math.ceil(maxLevel / 9.0); if (maxPages < 1) maxPages = 1; @@ -232,4 +232,4 @@ private void handleDailyRewardClaim(Player player, int currentPage) { player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1.0f, 1.0f); } } -} \ No newline at end of file +} diff --git a/src/main/java/com/Lino/battlePass/listeners/MissionEditorListener.java b/src/main/java/com/Lino/battlePass/listeners/MissionEditorListener.java index d2490ed..6697233 100644 --- a/src/main/java/com/Lino/battlePass/listeners/MissionEditorListener.java +++ b/src/main/java/com/Lino/battlePass/listeners/MissionEditorListener.java @@ -43,19 +43,19 @@ public void onInventoryClick(InventoryClickEvent event) { if (title == null) return; - if (title.startsWith("Mission Editor")) { - if (!title.contains("Page ")) return; + if (title.startsWith("Редактор миссий")) { + if (!title.contains("Страница ")) return; event.setCancelled(true); handleEditorClick(player, event, title); - } else if (title.startsWith("Select Mission Type")) { + } else if (title.startsWith("Выберите тип миссии")) { if (event.getView().getTopInventory().getSize() != 54) return; ItemStack back = event.getView().getTopInventory().getItem(53); if (back == null || back.getType() != Material.BARRIER) return; event.setCancelled(true); handleTypeSelectionClick(player, event); - } else if (title.startsWith("Editing: ")) { - String missionKey = title.replace("Editing: ", "").trim(); + } else if (title.startsWith("Редактирование: ")) { + String missionKey = title.replace("Редактирование: ", "").trim(); if (!plugin.getConfigManager().getMissionsConfig().contains("mission-pools." + missionKey)) return; event.setCancelled(true); @@ -65,7 +65,7 @@ public void onInventoryClick(InventoryClickEvent event) { private void handleEditorClick(Player player, InventoryClickEvent event, String title) { try { - int page = Integer.parseInt(title.split("Page ")[1]); + int page = Integer.parseInt(title.substring(title.lastIndexOf("Страница ") + "Страница ".length()).trim()); ItemStack clicked = event.getCurrentItem(); if (clicked == null || clicked.getType() == Material.AIR) return; @@ -146,4 +146,4 @@ private void handleDetailsClick(Player player, InventoryClickEvent event, String plugin.getMissionEditorManager().startEditingValue(player, key, type); } } -} \ No newline at end of file +} diff --git a/src/main/java/com/Lino/battlePass/listeners/RewardsEditorListener.java b/src/main/java/com/Lino/battlePass/listeners/RewardsEditorListener.java index 1f8a754..8cc0862 100644 --- a/src/main/java/com/Lino/battlePass/listeners/RewardsEditorListener.java +++ b/src/main/java/com/Lino/battlePass/listeners/RewardsEditorListener.java @@ -20,8 +20,16 @@ public class RewardsEditorListener implements Listener { private final BattlePass plugin; - private static final String EDIT_LEVEL_START = "Edit Level"; - private static final String EDIT_LEVEL_END = "Rewards"; + private static final String EDIT_LEVEL_START = "Редактирование уровня"; + private static final String EDIT_LEVEL_END = "наград"; + private static final String REWARDS_EDITOR_TITLE_RU = "Редактор наград"; + private static final String REWARDS_EDITOR_TITLE_EN = "Rewards Editor"; + private static final String FREE_CATEGORY_TITLE_RU = "Бесплатные награды"; + private static final String FREE_CATEGORY_TITLE_EN = "Free Rewards"; + private static final String PREMIUM_CATEGORY_TITLE_RU = "Премиум-награды"; + private static final String PREMIUM_CATEGORY_TITLE_EN = "Premium Rewards"; + private static final String PAGE_MARKER_RU = "Страница "; + private static final String PAGE_MARKER_EN = "Page "; public RewardsEditorListener(BattlePass plugin) { this.plugin = plugin; @@ -35,7 +43,7 @@ public void onInventoryClick(InventoryClickEvent event) { String title = ChatColor.stripColor(event.getView().getTitle()); if (title == null) return; - if (title.contains("Rewards Editor")) { + if (isRewardsEditorTitle(title)) { event.setCancelled(true); int slot = event.getRawSlot(); if (slot >= 0 && slot < event.getInventory().getSize()) { @@ -44,10 +52,9 @@ public void onInventoryClick(InventoryClickEvent event) { return; } - if (title.contains("Free Rewards") || title.contains("Premium Rewards")) { - boolean isPremium = title.contains("Premium Rewards"); - String cleanTitle = title; - if (cleanTitle.contains("Page")) { + if (isRewardsCategoryTitle(title)) { + boolean isPremium = isPremiumCategoryTitle(title); + if (containsPageMarker(title)) { event.setCancelled(true); int slot = event.getRawSlot(); if (slot >= 0 && slot < event.getInventory().getSize()) { @@ -142,14 +149,7 @@ private void handleRewardsEditorClick(Player player, int slot) { private void handleRewardsCategoryClick(Player player, int slot, boolean isPremium) { String title = ChatColor.stripColor(player.getOpenInventory().getTitle()); - int currentPage = 1; - - if (title != null && title.contains("Page")) { - String pageStr = title.substring(title.lastIndexOf("Page") + 5).trim(); - try { - currentPage = Integer.parseInt(pageStr); - } catch (NumberFormatException ignored) {} - } + int currentPage = extractPage(title); if (slot < 45) { int startLevel = (currentPage - 1) * 45 + 1; @@ -172,7 +172,7 @@ private void handleRewardsCategoryClick(Player player, int slot, boolean isPremi } else if (slot == 53) { int maxLevel = plugin.getRewardManager().getMaxLevel(); int endLevel = (currentPage - 1) * 45 + 45; - if (endLevel < maxLevel + 45) { + if (endLevel < maxLevel) { player.closeInventory(); final int nextPage = currentPage + 1; final boolean finalIsPremium = isPremium; @@ -283,4 +283,55 @@ private void refreshEditor(Player player, LevelRewardEditGui editor) { editor.open(); }); } -} \ No newline at end of file + + private boolean isRewardsEditorTitle(String title) { + return title.contains(REWARDS_EDITOR_TITLE_RU) || title.contains(REWARDS_EDITOR_TITLE_EN); + } + + private boolean isRewardsCategoryTitle(String title) { + return title.contains(FREE_CATEGORY_TITLE_RU) || + title.contains(FREE_CATEGORY_TITLE_EN) || + title.contains(PREMIUM_CATEGORY_TITLE_RU) || + title.contains(PREMIUM_CATEGORY_TITLE_EN); + } + + private boolean isPremiumCategoryTitle(String title) { + return title.contains(PREMIUM_CATEGORY_TITLE_RU) || title.contains(PREMIUM_CATEGORY_TITLE_EN); + } + + private boolean containsPageMarker(String title) { + return title.contains(PAGE_MARKER_RU) || title.contains(PAGE_MARKER_EN); + } + + private int extractPage(String title) { + if (title == null) { + return 1; + } + + int page = extractPageByMarker(title, PAGE_MARKER_RU); + if (page > 0) { + return page; + } + + page = extractPageByMarker(title, PAGE_MARKER_EN); + if (page > 0) { + return page; + } + + return 1; + } + + private int extractPageByMarker(String title, String marker) { + int markerIndex = title.lastIndexOf(marker); + if (markerIndex < 0) { + return -1; + } + + String pageString = title.substring(markerIndex + marker.length()).trim(); + try { + return Integer.parseInt(pageString); + } catch (NumberFormatException ignored) { + return -1; + } + } +} diff --git a/src/main/java/com/Lino/battlePass/managers/ConfigManager.java b/src/main/java/com/Lino/battlePass/managers/ConfigManager.java index 1adbad9..47f1db4 100644 --- a/src/main/java/com/Lino/battlePass/managers/ConfigManager.java +++ b/src/main/java/com/Lino/battlePass/managers/ConfigManager.java @@ -29,6 +29,8 @@ public class ConfigManager { private int coinsDistributionHours = 24; private int missionResetHours = 24; private boolean customItemSoundsEnabled = true; + private boolean cleanUiMode = true; + private String language = "RU"; private Material guiFreeLockedMaterial = Material.GRAY_STAINED_GLASS; private Material guiPremiumLockedMaterial = Material.GRAY_STAINED_GLASS; @@ -65,6 +67,8 @@ public void reload() { coinsDistributionHours = config.getInt("battle-coins.distribution-hours", 24); missionResetHours = config.getInt("missions.reset-hours", 24); customItemSoundsEnabled = config.getBoolean("custom-items.sounds-enabled", true); + cleanUiMode = config.getBoolean("ui.clean-mode", true); + language = normalizeLanguage(config.getString("language", "RU")); databaseType = config.getString("database.type", "SQLITE"); dbHost = config.getString("database.host", "localhost"); @@ -137,6 +141,18 @@ private Material parseMaterial(String materialName, Material defaultMaterial) { } } + private String normalizeLanguage(String value) { + if (value == null) { + return "RU"; + } + + String normalized = value.trim().toUpperCase(); + if ("EN".equals(normalized) || "ENG".equals(normalized) || "ENGLISH".equals(normalized)) { + return "EN"; + } + return "RU"; + } + public FileConfiguration getConfig() { return config; } @@ -201,6 +217,14 @@ public boolean isCustomItemSoundsEnabled() { return customItemSoundsEnabled; } + public boolean isCleanUiMode() { + return cleanUiMode; + } + + public String getLanguage() { + return language; + } + public Material getGuiFreeLockedMaterial() { return guiFreeLockedMaterial; } diff --git a/src/main/java/com/Lino/battlePass/managers/ConfigValidator.java b/src/main/java/com/Lino/battlePass/managers/ConfigValidator.java new file mode 100644 index 0000000..a8cd96f --- /dev/null +++ b/src/main/java/com/Lino/battlePass/managers/ConfigValidator.java @@ -0,0 +1,238 @@ +package com.Lino.battlePass.managers; + +import com.Lino.battlePass.BattlePass; +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.Arrays; +import java.util.List; +import java.util.Map; + +public class ConfigValidator { + + private static final List KNOWN_SOUND_KEYS = Arrays.asList( + "ENTITY_VILLAGER_NO", + "UI_TOAST_CHALLENGE_COMPLETE", + "ENTITY_EXPERIENCE_ORB_PICKUP", + "ENTITY_PLAYER_LEVELUP", + "ENTITY_ENDER_DRAGON_DEATH", + "ENTITY_ITEM_PICKUP", + "BLOCK_BEACON_AMBIENT", + "BLOCK_NOTE_BLOCK_CHIME", + "BLOCK_END_PORTAL_FRAME_FILL", + "BLOCK_NOTE_BLOCK_BELL", + "ENTITY_SQUID_AMBIENT", + "BLOCK_ENCHANTMENT_TABLE_USE", + "BLOCK_RESPAWN_ANCHOR_CHARGE" + ); + + private final BattlePass plugin; + + public ConfigValidator(BattlePass plugin) { + this.plugin = plugin; + } + + public ValidationReport validateAll() { + ValidationReport report = new ValidationReport(); + + validateGuiMaterials(plugin.getConfigManager().getConfig(), report); + validateRewardConfig("BattlePassFREE.yml", plugin.getConfigManager().getBattlePassFreeConfig(), report); + validateRewardConfig("BattlePassPREMIUM.yml", plugin.getConfigManager().getBattlePassPremiumConfig(), report); + validateShopConfig(report); + validateKnownSounds(report); + + plugin.getLogger().info("[ConfigValidator] " + report.summary()); + return report; + } + + private void validateGuiMaterials(FileConfiguration config, ValidationReport report) { + validateMaterialValue(config, "gui.reward-locked.free", report); + validateMaterialValue(config, "gui.reward-locked.premium", report); + validateMaterialValue(config, "gui.premium-no-pass", report); + validateMaterialValue(config, "gui.reward-available", report); + validateMaterialValue(config, "gui.separator", report); + + String freeClaimed = config.getString("gui.reward-claimed.free"); + if (freeClaimed != null && !"NONE".equalsIgnoreCase(freeClaimed)) { + validateMaterialValue(config, "gui.reward-claimed.free", report); + } + + String premiumClaimed = config.getString("gui.reward-claimed.premium"); + if (premiumClaimed != null && !"NONE".equalsIgnoreCase(premiumClaimed)) { + validateMaterialValue(config, "gui.reward-claimed.premium", report); + } + } + + private void validateRewardConfig(String fileName, FileConfiguration config, ValidationReport report) { + if (config == null) { + report.warning(plugin, "[ConfigValidator] " + fileName + " is not loaded."); + return; + } + + for (String key : config.getKeys(false)) { + if (!key.startsWith("level-")) { + continue; + } + + ConfigurationSection levelSection = config.getConfigurationSection(key); + if (levelSection == null) { + continue; + } + + validateRewardSection(fileName, key, levelSection, report); + } + } + + private void validateRewardSection(String fileName, String basePath, ConfigurationSection section, ValidationReport report) { + if (section.contains("material")) { + String material = section.getString("material"); + if (!isValidMaterial(material)) { + report.error(plugin, "[ConfigValidator] " + fileName + " -> " + basePath + ".material: invalid material '" + material + "'"); + } + } + + if (section.contains("command")) { + String command = section.getString("command", "").trim(); + if (command.isEmpty()) { + report.warning(plugin, "[ConfigValidator] " + fileName + " -> " + basePath + ".command is empty."); + } + } + + ConfigurationSection items = section.getConfigurationSection("items"); + if (items == null) { + return; + } + + for (String itemKey : items.getKeys(false)) { + ConfigurationSection item = items.getConfigurationSection(itemKey); + if (item == null) { + continue; + } + + String path = basePath + ".items." + itemKey; + + if (item.contains("material")) { + String material = item.getString("material"); + if (!isValidMaterial(material)) { + report.error(plugin, "[ConfigValidator] " + fileName + " -> " + path + ".material: invalid material '" + material + "'"); + } + } + + if (item.contains("command")) { + String command = item.getString("command", "").trim(); + if (command.isEmpty()) { + report.warning(plugin, "[ConfigValidator] " + fileName + " -> " + path + ".command is empty."); + } + } + } + } + + private void validateShopConfig(ValidationReport report) { + File shopFile = new File(plugin.getDataFolder(), "shop.yml"); + if (!shopFile.exists()) { + report.warning(plugin, "[ConfigValidator] shop.yml is missing."); + return; + } + + FileConfiguration shopConfig = YamlConfiguration.loadConfiguration(shopFile); + ConfigurationSection items = shopConfig.getConfigurationSection("shop-items"); + if (items == null) { + report.warning(plugin, "[ConfigValidator] shop.yml has no 'shop-items' section."); + return; + } + + for (String itemKey : items.getKeys(false)) { + ConfigurationSection item = items.getConfigurationSection(itemKey); + if (item == null) { + continue; + } + + String material = item.getString("material"); + if (!isValidMaterial(material)) { + report.error(plugin, "[ConfigValidator] shop.yml -> shop-items." + itemKey + ".material: invalid material '" + material + "'"); + } + + List commands = item.getStringList("commands"); + if (commands.isEmpty()) { + report.warning(plugin, "[ConfigValidator] shop.yml -> shop-items." + itemKey + ".commands is empty."); + } else { + for (int i = 0; i < commands.size(); i++) { + if (commands.get(i) == null || commands.get(i).trim().isEmpty()) { + report.warning(plugin, "[ConfigValidator] shop.yml -> shop-items." + itemKey + ".commands[" + i + "] is empty."); + } + } + } + + if (item.contains("items")) { + List rewards = item.getList("items"); + if (rewards != null) { + for (int i = 0; i < rewards.size(); i++) { + Object raw = rewards.get(i); + if (!(raw instanceof Map)) { + continue; + } + + Map rewardItem = (Map) raw; + Object rewardMaterialValue = rewardItem.get("material"); + String rewardMaterial = rewardMaterialValue == null ? null : rewardMaterialValue.toString(); + if (!isValidMaterial(rewardMaterial)) { + report.error(plugin, "[ConfigValidator] shop.yml -> shop-items." + itemKey + ".items[" + i + "].material: invalid material '" + rewardMaterial + "'"); + } + } + } + } + } + } + + private void validateKnownSounds(ValidationReport report) { + for (String soundKey : KNOWN_SOUND_KEYS) { + try { + Sound.valueOf(soundKey); + } catch (IllegalArgumentException ex) { + report.error(plugin, "[ConfigValidator] Sound constant is unavailable on this API version: " + soundKey); + } + } + } + + private void validateMaterialValue(FileConfiguration config, String path, ValidationReport report) { + String material = config.getString(path); + if (!isValidMaterial(material)) { + report.error(plugin, "[ConfigValidator] config.yml -> " + path + ": invalid material '" + material + "'"); + } + } + + private boolean isValidMaterial(String name) { + if (name == null || name.trim().isEmpty()) { + return false; + } + try { + Material.valueOf(name.trim().toUpperCase()); + return true; + } catch (IllegalArgumentException ignored) { + return false; + } + } + + public static class ValidationReport { + private int errors; + private int warnings; + + private void error(BattlePass plugin, String message) { + errors++; + plugin.getLogger().severe(message); + } + + private void warning(BattlePass plugin, String message) { + warnings++; + plugin.getLogger().warning(message); + } + + public String summary() { + return "validation finished: " + errors + " error(s), " + warnings + " warning(s)."; + } + } +} diff --git a/src/main/java/com/Lino/battlePass/managers/CustomItemManager.java b/src/main/java/com/Lino/battlePass/managers/CustomItemManager.java index 9ed9a0d..2124cc3 100644 --- a/src/main/java/com/Lino/battlePass/managers/CustomItemManager.java +++ b/src/main/java/com/Lino/battlePass/managers/CustomItemManager.java @@ -1,7 +1,6 @@ package com.Lino.battlePass.managers; import com.Lino.battlePass.BattlePass; -import com.Lino.battlePass.utils.GradientColorParser; import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.enchantments.Enchantment; @@ -10,11 +9,10 @@ import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataType; -import java.util.ArrayList; -import java.util.List; - public class CustomItemManager { + private static final byte ITEM_MARKER = (byte) 1; + private final BattlePass plugin; private final NamespacedKey premiumItemKey; private final NamespacedKey coinsItemKey; @@ -31,28 +29,9 @@ public ItemStack createPremiumPassItem(int amount) { ItemStack item = new ItemStack(Material.NETHER_STAR, amount); ItemMeta meta = item.getItemMeta(); - meta.setDisplayName(GradientColorParser.parse("★ Premium Battle Pass Voucher ★")); - - List lore = new ArrayList<>(); - lore.add(""); - lore.add(GradientColorParser.parse("Mystical Voucher")); - lore.add(GradientColorParser.parse("&7A mysterious artifact pulsing with")); - lore.add(GradientColorParser.parse("&7ancient power, granting access to")); - lore.add(GradientColorParser.parse("&7the premium rewards of legends")); - lore.add(""); - lore.add(GradientColorParser.parse("▼ Effects ▼")); - lore.add(GradientColorParser.parse("&7• Unlocks Premium Battle Pass")); - lore.add(GradientColorParser.parse("&7• Access to exclusive rewards")); - lore.add(GradientColorParser.parse("&7• Permanent upgrade for this season")); - lore.add(""); - lore.add(GradientColorParser.parse("➤ RIGHT CLICK TO ACTIVATE")); - lore.add(""); - lore.add(GradientColorParser.parse("&8&oThe star pulses with ethereal energy...")); - - meta.setLore(lore); - meta.addEnchant(Enchantment.UNBREAKING, 1, true); - meta.addItemFlags(ItemFlag.HIDE_ENCHANTS); - meta.getPersistentDataContainer().set(premiumItemKey, PersistentDataType.BOOLEAN, true); + meta.setDisplayName(plugin.getMessageManager().getGuiMessage("custom-items.premium-pass.name")); + meta.setLore(plugin.getMessageManager().getGuiMessages("custom-items.premium-pass.lore")); + markAsSpecial(meta, premiumItemKey); item.setItemMeta(meta); return item; @@ -62,28 +41,9 @@ public ItemStack createBattleCoinsItem(int amount) { ItemStack item = new ItemStack(Material.GOLD_NUGGET, amount); ItemMeta meta = item.getItemMeta(); - meta.setDisplayName(GradientColorParser.parse("✦ Battle Coin Token ✦")); - - List lore = new ArrayList<>(); - lore.add(""); - lore.add(GradientColorParser.parse("Gleaming Token")); - lore.add(GradientColorParser.parse("&7A shimmering golden token that")); - lore.add(GradientColorParser.parse("&7sparkles with magical radiance,")); - lore.add(GradientColorParser.parse("&7containing concentrated battle essence")); - lore.add(""); - lore.add(GradientColorParser.parse("▼ Value ▼")); - lore.add(GradientColorParser.parse("&7• Worth 1 Battle Coin")); - lore.add(GradientColorParser.parse("&7• Stackable currency")); - lore.add(GradientColorParser.parse("&7• Use in the Battle Shop")); - lore.add(""); - lore.add(GradientColorParser.parse("➤ RIGHT CLICK TO REDEEM")); - lore.add(""); - lore.add(GradientColorParser.parse("&8&oThe token glimmers with golden light...")); - - meta.setLore(lore); - meta.addEnchant(Enchantment.UNBREAKING, 1, true); - meta.addItemFlags(ItemFlag.HIDE_ENCHANTS); - meta.getPersistentDataContainer().set(coinsItemKey, PersistentDataType.BOOLEAN, true); + meta.setDisplayName(plugin.getMessageManager().getGuiMessage("custom-items.battle-coin.name")); + meta.setLore(plugin.getMessageManager().getGuiMessages("custom-items.battle-coin.lore")); + markAsSpecial(meta, coinsItemKey); item.setItemMeta(meta); return item; @@ -93,49 +53,36 @@ public ItemStack createLevelBoostItem(int amount) { ItemStack item = new ItemStack(Material.EXPERIENCE_BOTTLE, amount); ItemMeta meta = item.getItemMeta(); - meta.setDisplayName(GradientColorParser.parse("✧ Experience Boost Elixir ✧")); - - List lore = new ArrayList<>(); - lore.add(""); - lore.add(GradientColorParser.parse("Experience Elixir")); - lore.add(GradientColorParser.parse("&7A powerful elixir infused with")); - lore.add(GradientColorParser.parse("&7concentrated experience essence,")); - lore.add(GradientColorParser.parse("&7boosting your battle pass progress")); - lore.add(""); - lore.add(GradientColorParser.parse("▼ Power ▼")); - lore.add(GradientColorParser.parse("&7• Grants +100 Battle Pass XP")); - lore.add(GradientColorParser.parse("&7• Instant experience boost")); - lore.add(GradientColorParser.parse("&7• Stackable consumable")); - lore.add(""); - lore.add(GradientColorParser.parse("➤ RIGHT CLICK TO CONSUME")); - lore.add(""); - lore.add(GradientColorParser.parse("&8&oThe elixir bubbles with raw experience...")); - - meta.setLore(lore); - meta.addEnchant(Enchantment.UNBREAKING, 1, true); - meta.addItemFlags(ItemFlag.HIDE_ENCHANTS); - meta.getPersistentDataContainer().set(levelItemKey, PersistentDataType.BOOLEAN, true); + meta.setDisplayName(plugin.getMessageManager().getGuiMessage("custom-items.level-boost.name")); + meta.setLore(plugin.getMessageManager().getGuiMessages("custom-items.level-boost.lore")); + markAsSpecial(meta, levelItemKey); item.setItemMeta(meta); return item; } public boolean isPremiumPassItem(ItemStack item) { - if (item == null || !item.hasItemMeta()) return false; + if (item == null || !item.hasItemMeta()) { + return false; + } ItemMeta meta = item.getItemMeta(); - return meta.getPersistentDataContainer().has(premiumItemKey, PersistentDataType.BOOLEAN); + return meta.getPersistentDataContainer().has(premiumItemKey, PersistentDataType.BYTE); } public boolean isBattleCoinsItem(ItemStack item) { - if (item == null || !item.hasItemMeta()) return false; + if (item == null || !item.hasItemMeta()) { + return false; + } ItemMeta meta = item.getItemMeta(); - return meta.getPersistentDataContainer().has(coinsItemKey, PersistentDataType.BOOLEAN); + return meta.getPersistentDataContainer().has(coinsItemKey, PersistentDataType.BYTE); } public boolean isLevelBoostItem(ItemStack item) { - if (item == null || !item.hasItemMeta()) return false; + if (item == null || !item.hasItemMeta()) { + return false; + } ItemMeta meta = item.getItemMeta(); - return meta.getPersistentDataContainer().has(levelItemKey, PersistentDataType.BOOLEAN); + return meta.getPersistentDataContainer().has(levelItemKey, PersistentDataType.BYTE); } public NamespacedKey getPremiumItemKey() { @@ -149,4 +96,10 @@ public NamespacedKey getCoinsItemKey() { public NamespacedKey getLevelItemKey() { return levelItemKey; } -} \ No newline at end of file + + private void markAsSpecial(ItemMeta meta, NamespacedKey key) { + meta.addEnchant(Enchantment.DURABILITY, 1, true); + meta.addItemFlags(ItemFlag.HIDE_ENCHANTS); + meta.getPersistentDataContainer().set(key, PersistentDataType.BYTE, ITEM_MARKER); + } +} diff --git a/src/main/java/com/Lino/battlePass/managers/MessageManager.java b/src/main/java/com/Lino/battlePass/managers/MessageManager.java index 8cfe16c..56d5f28 100644 --- a/src/main/java/com/Lino/battlePass/managers/MessageManager.java +++ b/src/main/java/com/Lino/battlePass/managers/MessageManager.java @@ -2,17 +2,23 @@ import com.Lino.battlePass.BattlePass; import com.Lino.battlePass.utils.GradientColorParser; +import org.bukkit.ChatColor; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import java.io.File; import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import java.util.Locale; public class MessageManager { private final BattlePass plugin; private FileConfiguration messagesConfig; + private FileConfiguration guiConfig; + private FileConfiguration legacyMessagesConfig; + private String language = "ru"; public MessageManager(BattlePass plugin) { this.plugin = plugin; @@ -20,48 +26,169 @@ public MessageManager(BattlePass plugin) { } public void reload() { - File messagesFile = new File(plugin.getDataFolder(), "messages.yml"); + String configuredLanguage = "RU"; + if (plugin.getConfigManager() != null) { + configuredLanguage = plugin.getConfigManager().getLanguage(); + } else { + configuredLanguage = plugin.getConfig().getString("language", "RU"); + } + + language = normalizeLanguage(configuredLanguage); + String messagesFileName = "messages_" + language + ".yml"; + String guiFileName = "gui_" + language + ".yml"; + + ensureResource(messagesFileName); + ensureResource(guiFileName); + ensureResource("messages.yml"); + + File messagesFile = new File(plugin.getDataFolder(), messagesFileName); + File guiFile = new File(plugin.getDataFolder(), guiFileName); + File legacyMessagesFile = new File(plugin.getDataFolder(), "messages.yml"); + messagesConfig = YamlConfiguration.loadConfiguration(messagesFile); + guiConfig = YamlConfiguration.loadConfiguration(guiFile); + legacyMessagesConfig = YamlConfiguration.loadConfiguration(legacyMessagesFile); } public String getMessage(String path, Object... replacements) { - String message = messagesConfig.getString(path, path); + String message = readString(messagesConfig, path); + if (message == null) { + message = readString(guiConfig, path); + } + if (message == null) { + message = readString(legacyMessagesConfig, path); + } + if (message == null) { + message = path; + } - if (replacements.length > 0 && replacements.length % 2 == 0) { - for (int i = 0; i < replacements.length; i += 2) { - String target = replacements[i] != null ? replacements[i].toString() : "null"; - String replacement = replacements[i + 1] != null ? replacements[i + 1].toString() : "null"; - message = message.replace(target, replacement); - } + return GradientColorParser.parse(applyReplacements(message, replacements)); + } + + public String getGuiMessage(String path, Object... replacements) { + String message = readString(guiConfig, path); + if (message == null) { + message = readString(messagesConfig, path); } + if (message == null) { + message = readString(legacyMessagesConfig, path); + } + if (message == null) { + message = path; + } + + return GradientColorParser.parse(applyReplacements(message, replacements)); + } - return GradientColorParser.parse(message); + public String getGuiMessageStripped(String path, Object... replacements) { + return ChatColor.stripColor(getGuiMessage(path, replacements)); } public List getMessages(String path, Object... replacements) { - List messages = messagesConfig.getStringList(path); - List processedMessages = new ArrayList<>(); - - for (String message : messages) { - String processedLine = message; - if (replacements.length > 0 && replacements.length % 2 == 0) { - for (int i = 0; i < replacements.length; i += 2) { - String target = replacements[i] != null ? replacements[i].toString() : "null"; - String replacement = replacements[i + 1] != null ? replacements[i + 1].toString() : "null"; - processedLine = processedLine.replace(target, replacement); - } - } - processedMessages.add(GradientColorParser.parse(processedLine)); + List lines = readStringList(messagesConfig, path); + if (lines.isEmpty()) { + lines = readStringList(legacyMessagesConfig, path); + } + return processLines(lines, replacements); + } + + public List getGuiMessages(String path, Object... replacements) { + List lines = readStringList(guiConfig, path); + if (lines.isEmpty()) { + lines = readStringList(messagesConfig, path); + } + if (lines.isEmpty()) { + lines = readStringList(legacyMessagesConfig, path); } - return processedMessages; + return processLines(lines, replacements); } public String getPrefix() { - return GradientColorParser.parse( - messagesConfig.getString("prefix", "&6&l[BATTLE PASS] &e")); + String prefix = readString(messagesConfig, "prefix"); + if (prefix == null) { + prefix = readString(legacyMessagesConfig, "prefix"); + } + if (prefix == null) { + prefix = "&6[BattlePass] &8» &r"; + } + return GradientColorParser.parse(prefix); } public FileConfiguration getMessagesConfig() { - return messagesConfig; + if (messagesConfig != null) { + return messagesConfig; + } + return legacyMessagesConfig; + } + + public FileConfiguration getGuiConfig() { + return guiConfig; + } + + public String getLanguage() { + return language.toUpperCase(Locale.ROOT); + } + + private String normalizeLanguage(String value) { + if (value == null) { + return "ru"; + } + + String normalized = value.trim(); + if ("EN".equalsIgnoreCase(normalized) || + "ENG".equalsIgnoreCase(normalized) || + "ENGLISH".equalsIgnoreCase(normalized)) { + return "en"; + } + return "ru"; + } + + private void ensureResource(String fileName) { + File file = new File(plugin.getDataFolder(), fileName); + if (file.exists()) { + return; + } + + try { + plugin.saveResource(fileName, false); + } catch (IllegalArgumentException ignored) { + // Optional language file may be absent in legacy forks. + } + } + + private String readString(FileConfiguration config, String path) { + if (config == null) { + return null; + } + return config.getString(path); + } + + private List readStringList(FileConfiguration config, String path) { + if (config == null) { + return Collections.emptyList(); + } + List list = config.getStringList(path); + return list == null ? Collections.emptyList() : list; + } + + private String applyReplacements(String value, Object... replacements) { + String result = value; + if (replacements.length > 0 && replacements.length % 2 == 0) { + for (int i = 0; i < replacements.length; i += 2) { + String target = replacements[i] != null ? replacements[i].toString() : "null"; + String replacement = replacements[i + 1] != null ? replacements[i + 1].toString() : "null"; + result = result.replace(target, replacement); + } + } + return result; + } + + private List processLines(List lines, Object... replacements) { + List processed = new ArrayList<>(lines.size()); + for (String line : lines) { + String replaced = applyReplacements(line, replacements); + processed.add(GradientColorParser.parse(replaced)); + } + return processed; } -} \ No newline at end of file +} diff --git a/src/main/java/com/Lino/battlePass/managers/MissionEditorManager.java b/src/main/java/com/Lino/battlePass/managers/MissionEditorManager.java index 9d8aa50..d9b2587 100644 --- a/src/main/java/com/Lino/battlePass/managers/MissionEditorManager.java +++ b/src/main/java/com/Lino/battlePass/managers/MissionEditorManager.java @@ -27,7 +27,7 @@ public MissionEditorManager(BattlePass plugin) { } public void openMissionEditor(Player player, int page) { - editingStates.remove(player.getUniqueId()); // Pulisce stati precedenti + editingStates.remove(player.getUniqueId()); new MissionEditorGui(plugin, player, page).open(); } @@ -36,7 +36,7 @@ public void openMissionTypeSelector(Player player) { } public void openMissionDetails(Player player, String missionKey) { - editingStates.remove(player.getUniqueId()); // Pulisce stati precedenti + editingStates.remove(player.getUniqueId()); new MissionDetailsGui(plugin, player, missionKey).open(); } @@ -58,7 +58,7 @@ public void createMissionFromType(Player player, String type) { saveConfig(file, config); - player.sendMessage(plugin.getMessageManager().getPrefix() + "§aMission created: " + uniqueId); + player.sendMessage(plugin.getMessageManager().getPrefix() + "§aМиссия создана: " + uniqueId); openMissionDetails(player, uniqueId); } @@ -72,16 +72,14 @@ public void updateMissionType(Player player, String newType) { config.set(path + ".type", newType); - // Se il nuovo tipo non richiede target, lo impostiamo su ANY automaticamente if (!isTargetRequired(newType)) { config.set(path + ".target", "ANY"); } else { - // Imposta un target di default valido per evitare configurazioni rotte config.set(path + ".target", getDefaultTarget(newType)); } saveConfig(file, config); - player.sendMessage(plugin.getMessageManager().getPrefix() + "§aMission type updated to " + newType); + player.sendMessage(plugin.getMessageManager().getPrefix() + "§aТип миссии изменен на " + newType); openMissionDetails(player, state.missionKey); } @@ -92,7 +90,7 @@ public void deleteMission(Player player, String missionKey) { config.set("mission-pools." + missionKey, null); saveConfig(file, config); - player.sendMessage(plugin.getMessageManager().getPrefix() + "§aMission deleted successfully!"); + player.sendMessage(plugin.getMessageManager().getPrefix() + "§aМиссия успешно удалена!"); openMissionEditor(player, 1); } @@ -106,16 +104,16 @@ public void startEditingValue(Player player, String missionKey, EditType type) { player.closeInventory(); player.sendMessage(GradientColorParser.parse(plugin.getMessageManager().getPrefix() + - "Editing " + type.name() + "")); - player.sendMessage(GradientColorParser.parse("&7Enter the new value in chat.")); - player.sendMessage(GradientColorParser.parse("&7Type &c'cancel' &7to cancel.")); + "Редактирование: " + type.name() + "")); + player.sendMessage(GradientColorParser.parse("&7Введите новое значение в чат.")); + player.sendMessage(GradientColorParser.parse("&7Введите &c'cancel' &7или &c'отмена' &7для отмены.")); } public void handleChatInput(Player player, String message) { EditorState state = editingStates.remove(player.getUniqueId()); if (state == null) return; - if (message.equalsIgnoreCase("cancel")) { + if (message.equalsIgnoreCase("cancel") || message.equalsIgnoreCase("отмена")) { openMissionDetails(player, state.missionKey); return; } @@ -150,8 +148,9 @@ public void handleChatInput(Player player, String message) { default: break; } + saveConfig(file, config); - player.sendMessage(plugin.getMessageManager().getPrefix() + "§aValue updated!"); + player.sendMessage(plugin.getMessageManager().getPrefix() + "§aЗначение обновлено!"); new BukkitRunnable() { @Override @@ -161,16 +160,14 @@ public void run() { }.runTask(plugin); } catch (NumberFormatException e) { - player.sendMessage(plugin.getMessageManager().getPrefix() + "§cInvalid number format!"); - editingStates.put(player.getUniqueId(), state); // Restore state + player.sendMessage(plugin.getMessageManager().getPrefix() + "§cНеверный числовой формат!"); + editingStates.put(player.getUniqueId(), state); } catch (Exception e) { - player.sendMessage(plugin.getMessageManager().getPrefix() + "§cError updating value!"); + player.sendMessage(plugin.getMessageManager().getPrefix() + "§cОшибка при обновлении значения!"); e.printStackTrace(); } } - // --- Helpers --- - private void saveConfig(File file, FileConfiguration config) { try { config.save(file); @@ -187,18 +184,28 @@ private String generateUniqueId(String type) { } private String formatDisplayName(String type) { - String readable = type.toLowerCase().replace("_", " "); - return Character.toUpperCase(readable.charAt(0)) + readable.substring(1) + " "; + return "Новая миссия "; } private String getDefaultTarget(String type) { switch (type) { - case "KILL_MOB": return "ZOMBIE"; - case "MINE_BLOCK": case "BREAK_BLOCK": case "PLACE_BLOCK": return "STONE"; - case "CRAFT_ITEM": case "EAT_ITEM": return "BREAD"; - case "FISH_ITEM": return "COD"; - case "BREED_ANIMAL": case "TAME_ANIMAL": case "SHEAR_SHEEP": return "SHEEP"; - default: return "ANY"; + case "KILL_MOB": + return "ZOMBIE"; + case "MINE_BLOCK": + case "BREAK_BLOCK": + case "PLACE_BLOCK": + return "STONE"; + case "CRAFT_ITEM": + case "EAT_ITEM": + return "BREAD"; + case "FISH_ITEM": + return "COD"; + case "BREED_ANIMAL": + case "TAME_ANIMAL": + case "SHEAR_SHEEP": + return "SHEEP"; + default: + return "ANY"; } } @@ -239,4 +246,4 @@ public EditorState(String missionKey, EditType type) { this.type = type; } } -} \ No newline at end of file +} diff --git a/src/main/java/com/Lino/battlePass/managers/MissionProgressTracker.java b/src/main/java/com/Lino/battlePass/managers/MissionProgressTracker.java index e4d8358..f7c4401 100644 --- a/src/main/java/com/Lino/battlePass/managers/MissionProgressTracker.java +++ b/src/main/java/com/Lino/battlePass/managers/MissionProgressTracker.java @@ -131,7 +131,7 @@ private void sendActionBar(Player player, String message) { try { player.spigot().sendMessage(ChatMessageType.ACTION_BAR, new TextComponent(message)); } catch (Exception e) { - player.sendMessage("§7[§6Progress§7] " + message); + player.sendMessage("§7[§6Прогресс§7] " + message); } } @@ -262,4 +262,4 @@ public int getCompletedMissionsCount(PlayerData data, List missions) { } return completed; } -} \ No newline at end of file +} diff --git a/src/main/java/com/Lino/battlePass/managers/MissionResetHandler.java b/src/main/java/com/Lino/battlePass/managers/MissionResetHandler.java index d9f89ef..8c3f788 100644 --- a/src/main/java/com/Lino/battlePass/managers/MissionResetHandler.java +++ b/src/main/java/com/Lino/battlePass/managers/MissionResetHandler.java @@ -145,7 +145,7 @@ public void calculateSeasonEndDate() { public String getTimeUntilReset() { if (nextMissionReset == null) { - return "Unknown"; + return plugin.getMessageManager().getMessage("time.unknown"); } LocalDateTime now = LocalDateTime.now(); @@ -153,16 +153,13 @@ public String getTimeUntilReset() { long minutes = ChronoUnit.MINUTES.between(now, nextMissionReset) % 60; MessageManager messageManager = plugin.getMessageManager(); - String hourStr = hours == 1 ? messageManager.getMessage("time.hour") : messageManager.getMessage("time.hours"); - String minuteStr = minutes == 1 ? messageManager.getMessage("time.minute") : messageManager.getMessage("time.minutes"); - return messageManager.getMessage("time.hours-minutes", "%hours%", String.valueOf(hours), "%minutes%", String.valueOf(minutes)); } public String getTimeUntilSeasonEnd() { if (seasonEndDate == null) { - return "Unknown"; + return plugin.getMessageManager().getMessage("time.unknown"); } LocalDateTime now = LocalDateTime.now(); @@ -170,9 +167,6 @@ public String getTimeUntilSeasonEnd() { long hours = ChronoUnit.HOURS.between(now, seasonEndDate) % 24; MessageManager messageManager = plugin.getMessageManager(); - String dayStr = days == 1 ? messageManager.getMessage("time.day") : messageManager.getMessage("time.days"); - String hourStr = hours == 1 ? messageManager.getMessage("time.hour") : messageManager.getMessage("time.hours"); - return messageManager.getMessage("time.days-hours", "%days%", String.valueOf(days), "%hours%", String.valueOf(hours)); } @@ -190,9 +184,6 @@ public String getTimeUntilDailyReward(long lastClaimed) { long minutes = ChronoUnit.MINUTES.between(now, nextAvailable) % 60; MessageManager messageManager = plugin.getMessageManager(); - String hourStr = hours == 1 ? messageManager.getMessage("time.hour") : messageManager.getMessage("time.hours"); - String minuteStr = minutes == 1 ? messageManager.getMessage("time.minute") : messageManager.getMessage("time.minutes"); - return messageManager.getMessage("time.hours-minutes", "%hours%", String.valueOf(hours), "%minutes%", String.valueOf(minutes)); } @@ -212,4 +203,4 @@ public LocalDateTime getSeasonEndDate() { public void setSeasonEndDate(LocalDateTime seasonEndDate) { this.seasonEndDate = seasonEndDate; } -} \ No newline at end of file +} diff --git a/src/main/java/com/Lino/battlePass/managers/RewardEditorManager.java b/src/main/java/com/Lino/battlePass/managers/RewardEditorManager.java index 15bb231..ae092cd 100644 --- a/src/main/java/com/Lino/battlePass/managers/RewardEditorManager.java +++ b/src/main/java/com/Lino/battlePass/managers/RewardEditorManager.java @@ -68,11 +68,11 @@ public void startCommandInput(Player player, int level, boolean isPremium) { player.closeInventory(); player.sendMessage(GradientColorParser.parse( plugin.getMessageManager().getPrefix() + - "Enter command reward format:")); + "Введите формат награды-команды:")); player.sendMessage(GradientColorParser.parse( - "&7Example: &e$1000 | eco give 1000")); + "&7Пример: &e$1000 | eco give 1000")); player.sendMessage(GradientColorParser.parse( - "&7Type &c'cancel' &7to cancel")); + "&7Введите &c'cancel' &7или &c'отмена' &7для отмены")); } public boolean handleCommandInput(Player player, String message) { @@ -83,10 +83,10 @@ public boolean handleCommandInput(Player player, String message) { commandInputStates.remove(player.getUniqueId()); - if (message.equalsIgnoreCase("cancel")) { + if (message.equalsIgnoreCase("cancel") || message.equalsIgnoreCase("отмена")) { player.sendMessage(GradientColorParser.parse( plugin.getMessageManager().getPrefix() + - "Command input cancelled")); + "Ввод команды отменен")); openLevelEditor(player, state.level, state.isPremium); return true; } @@ -95,7 +95,7 @@ public boolean handleCommandInput(Player player, String message) { if (parts.length != 2) { player.sendMessage(GradientColorParser.parse( plugin.getMessageManager().getPrefix() + - "Invalid format! Use: display | command")); + "Неверный формат! Используйте: название | команда")); openLevelEditor(player, state.level, state.isPremium); return true; } @@ -113,7 +113,7 @@ public boolean handleCommandInput(Player player, String message) { player.sendMessage(GradientColorParser.parse( plugin.getMessageManager().getPrefix() + - "✓ Command reward added!")); + "✓ Награда-команда добавлена!")); final LevelRewardEditGui finalEditor = editor; new BukkitRunnable() { @@ -150,7 +150,7 @@ public void saveRewards(Player player, int level, boolean isPremium, List✓ Level " + level + " rewards cleared!")); + "✓ Награды уровня " + level + " очищены!")); return; } @@ -192,8 +192,8 @@ public void saveRewards(Player player, int level, boolean isPremium, List✓ Level " + level + " rewards saved!" + - (editingSeason > 0 ? " (Season " + editingSeason + ")" : "") + + "✓ Награды уровня " + level + " сохранены!" + + (editingSeason > 0 ? " (Сезон " + editingSeason + ")" : "") + "")); } @@ -213,19 +213,19 @@ public void saveAllRewards(Player player) { syncSeasonIfActive(editingSeason, player); player.sendMessage(GradientColorParser.parse( plugin.getMessageManager().getPrefix() + - "✓ Season " + editingSeason + " rewards saved!")); + "✓ Награды сезона " + editingSeason + " сохранены!")); } else { plugin.reload(); player.sendMessage(GradientColorParser.parse( plugin.getMessageManager().getPrefix() + - "✓ All rewards saved and plugin reloaded!")); + "✓ Все награды сохранены, плагин перезагружен!")); } for (Player onlinePlayer : plugin.getServer().getOnlinePlayers()) { if (!onlinePlayer.equals(player)) { onlinePlayer.sendMessage(GradientColorParser.parse( plugin.getMessageManager().getPrefix() + - "Battle Pass rewards have been updated by an admin!")); + "Награды Battle Pass обновлены администратором!")); } } } @@ -234,7 +234,7 @@ private void saveConfig(File file, FileConfiguration config) { try { config.save(file); } catch (IOException e) { - plugin.getLogger().severe("Failed to save rewards configuration: " + e.getMessage()); + plugin.getLogger().severe("Не удалось сохранить конфигурацию наград: " + e.getMessage()); } } @@ -251,4 +251,4 @@ private static class CommandInputState { this.isPremium = isPremium; } } -} \ No newline at end of file +} diff --git a/src/main/java/com/Lino/battlePass/managers/RewardManager.java b/src/main/java/com/Lino/battlePass/managers/RewardManager.java index 3e34a00..eb5b511 100644 --- a/src/main/java/com/Lino/battlePass/managers/RewardManager.java +++ b/src/main/java/com/Lino/battlePass/managers/RewardManager.java @@ -5,6 +5,7 @@ import com.Lino.battlePass.models.PlayerData; import com.Lino.battlePass.models.Reward; import com.Lino.battlePass.utils.ItemSerializer; +import com.Lino.battlePass.utils.MaterialNameResolver; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.Sound; @@ -111,7 +112,7 @@ private void updateMaxLevel(FileConfiguration config) { private Reward loadSingleReward(FileConfiguration config, String path, int level, boolean isFree) { if (config.contains(path + ".command")) { String command = config.getString(path + ".command"); - String displayName = config.getString(path + ".display", "Mystery Reward"); + String displayName = config.getString(path + ".display", "Тайная награда"); return new Reward(level, command, displayName, isFree); } else if (config.contains(path + ".material")) { String material = config.getString(path + ".material", "DIRT"); @@ -119,11 +120,12 @@ private Reward loadSingleReward(FileConfiguration config, String path, int level try { Material mat = Material.valueOf(material.toUpperCase()); - String displayName = config.getString(path + ".display", amount + "x " + formatMaterial(mat)); + String displayName = config.getString(path + ".display", + amount + "x " + MaterialNameResolver.resolve(mat, getCurrentLanguage())); return new Reward(level, mat, displayName, amount, isFree); } catch (IllegalArgumentException e) { - plugin.getLogger().warning("Invalid material for " + (isFree ? "free" : "premium") + - " level " + level + ": " + material); + plugin.getLogger().warning("Неверный материал для " + (isFree ? "бесплатной" : "премиум") + + " уровня " + level + ": " + material); return null; } } @@ -137,7 +139,7 @@ public void claimRewards(Player player, PlayerData data, List rewards, try { dbClaimedData = plugin.getDatabaseManager().getClaimedRewards(player.getUniqueId()).join(); } catch (Exception e) { - player.sendMessage(plugin.getMessageManager().getPrefix() + "§cError while claiming reward. Please try again."); + player.sendMessage(plugin.getMessageManager().getPrefix() + "§cОшибка при получении награды. Попробуйте снова."); e.printStackTrace(); return; } @@ -254,10 +256,6 @@ public int countAvailableRewards(Player player, PlayerData data) { return count; } - private String formatMaterial(Material material) { - return material.name().toLowerCase().replace("_", " "); - } - public Map> getFreeRewardsByLevel() { return freeRewardsByLevel; } @@ -288,7 +286,7 @@ public List getEditableRewards(int level, boolean isPremium) { if (levelSection.contains("command")) { String command = levelSection.getString("command"); - String display = levelSection.getString("display", "Mystery Reward"); + String display = levelSection.getString("display", "Тайная награда"); editableRewards.add(new EditableReward(command, display)); } else if (levelSection.contains("material")) { ItemStack item = ItemSerializer.loadItemFromConfig(levelSection); @@ -303,7 +301,7 @@ public List getEditableRewards(int level, boolean isPremium) { if (itemSection != null) { if (itemSection.contains("command")) { String command = itemSection.getString("command"); - String display = itemSection.getString("display", "Mystery Reward"); + String display = itemSection.getString("display", "Тайная награда"); editableRewards.add(new EditableReward(command, display)); } else { ItemStack item = ItemSerializer.loadItemFromConfig(itemSection); @@ -318,4 +316,11 @@ public List getEditableRewards(int level, boolean isPremium) { return editableRewards; } -} \ No newline at end of file + + private String getCurrentLanguage() { + if (plugin.getConfigManager() == null) { + return "RU"; + } + return plugin.getConfigManager().getLanguage(); + } +} diff --git a/src/main/java/com/Lino/battlePass/managers/ShopManager.java b/src/main/java/com/Lino/battlePass/managers/ShopManager.java index 494b7b9..9416699 100644 --- a/src/main/java/com/Lino/battlePass/managers/ShopManager.java +++ b/src/main/java/com/Lino/battlePass/managers/ShopManager.java @@ -44,7 +44,12 @@ public void loadShop() { if (item == null) continue; int slot = item.getInt("slot"); - Material material = Material.valueOf(item.getString("material", "STONE")); + String materialName = item.getString("material", "STONE"); + Material material = parseMaterial(materialName); + if (material == null) { + plugin.getLogger().warning("Skipping shop item '" + key + "': invalid material '" + materialName + "'"); + continue; + } String displayName = item.getString("display-name", "Shop Item"); List lore = item.getStringList("lore"); int price = item.getInt("price", 0); @@ -54,8 +59,22 @@ public void loadShop() { if (item.contains("items")) { List> itemMaps = item.getMapList("items"); for (Map map : itemMaps) { - Material mat = Material.valueOf((String) map.get("material")); - int amount = (Integer) map.get("amount"); + Object nestedMaterialRaw = map.get("material"); + Material mat = nestedMaterialRaw == null ? null : parseMaterial(nestedMaterialRaw.toString()); + if (mat == null) { + plugin.getLogger().warning("Skipping nested shop reward material in '" + key + "': " + nestedMaterialRaw); + continue; + } + + int amount = 1; + Object amountRaw = map.get("amount"); + if (amountRaw instanceof Number) { + amount = ((Number) amountRaw).intValue(); + } + if (amount <= 0) { + amount = 1; + } + itemsList.add(new ItemStack(mat, amount)); } } @@ -65,6 +84,17 @@ public void loadShop() { } } + private Material parseMaterial(String name) { + if (name == null || name.trim().isEmpty()) { + return null; + } + try { + return Material.valueOf(name.trim().toUpperCase()); + } catch (IllegalArgumentException ignored) { + return null; + } + } + public void purchaseItem(Player player, int slot) { ShopItem item = shopItems.get(slot); if (item == null) return; @@ -109,4 +139,4 @@ public Map getShopItems() { public void reload() { loadShop(); } -} \ No newline at end of file +} diff --git a/src/main/java/com/Lino/battlePass/managers/SoundManager.java b/src/main/java/com/Lino/battlePass/managers/SoundManager.java index 3d77735..36fd067 100644 --- a/src/main/java/com/Lino/battlePass/managers/SoundManager.java +++ b/src/main/java/com/Lino/battlePass/managers/SoundManager.java @@ -48,7 +48,7 @@ public void run() { player.playSound(player.getLocation(), Sound.BLOCK_BEACON_AMBIENT, 0.3f, pitch); if (tickCounter % 40 == 0) { - player.playSound(player.getLocation(), Sound.BLOCK_AMETHYST_BLOCK_CHIME, 0.2f, 1.2f); + player.playSound(player.getLocation(), Sound.BLOCK_NOTE_BLOCK_CHIME, 0.2f, 1.2f); } if (tickCounter % 60 == 0) { @@ -65,7 +65,7 @@ public void run() { } if (tickCounter % 15 == 5) { - player.playSound(player.getLocation(), Sound.ENTITY_GLOW_SQUID_AMBIENT, 0.1f, 2.0f); + player.playSound(player.getLocation(), Sound.ENTITY_SQUID_AMBIENT, 0.1f, 2.0f); } } else if (customItemManager.isLevelBoostItem(itemInHand)) { @@ -130,4 +130,4 @@ public void stopAllSounds() { } activeSoundTasks.clear(); } -} \ No newline at end of file +} diff --git a/src/main/java/com/Lino/battlePass/placeholders/BattlePassExpansion.java b/src/main/java/com/Lino/battlePass/placeholders/BattlePassExpansion.java index e1f2c98..64cef64 100644 --- a/src/main/java/com/Lino/battlePass/placeholders/BattlePassExpansion.java +++ b/src/main/java/com/Lino/battlePass/placeholders/BattlePassExpansion.java @@ -56,7 +56,7 @@ public String onRequest(OfflinePlayer player, String identifier) { PlayerData data = plugin.getPlayerDataManager().getPlayerData(uuid); if (data == null) { - return "Loading..."; + return plugin.getMessageManager().getMessage("placeholders.loading"); } switch (identifier.toLowerCase()) { @@ -80,10 +80,14 @@ public String onRequest(OfflinePlayer player, String identifier) { return String.valueOf(data.totalLevels); case "premium": - return data.hasPremium ? "Yes" : "No"; + return data.hasPremium + ? plugin.getMessageManager().getMessage("placeholders.yes") + : plugin.getMessageManager().getMessage("placeholders.no"); case "premium_status": - return data.hasPremium ? "Active" : "Inactive"; + return data.hasPremium + ? plugin.getMessageManager().getMessage("placeholders.active") + : plugin.getMessageManager().getMessage("placeholders.inactive"); case "coins": case "battlecoins": @@ -109,7 +113,9 @@ public String onRequest(OfflinePlayer player, String identifier) { case "daily_reward_available": long now = System.currentTimeMillis(); - return (now - data.lastDailyReward >= 24 * 60 * 60 * 1000) ? "Yes" : "No"; + return (now - data.lastDailyReward >= 24 * 60 * 60 * 1000) + ? plugin.getMessageManager().getMessage("placeholders.yes") + : plugin.getMessageManager().getMessage("placeholders.no"); case "rank": case "leaderboard_rank": @@ -119,7 +125,7 @@ public String onRequest(OfflinePlayer player, String identifier) { if (plugin.getCoinsDistributionTask() != null) { return plugin.getCoinsDistributionTask().getTimeUntilNextDistribution(); } - return "Unknown"; + return plugin.getMessageManager().getMessage("placeholders.unknown"); case "completed_missions": return String.valueOf(getCompletedMissionsCount(data)); @@ -164,7 +170,7 @@ private String getPlayerRank(UUID uuid) { } } - return "Unranked"; + return plugin.getMessageManager().getMessage("placeholders.outside-top"); } private int getCompletedMissionsCount(PlayerData data) { @@ -189,7 +195,9 @@ private String getMissionPlaceholder(PlayerData data, String missionIdentifier) } else if (missionIdentifier.startsWith("name_")) { return mission.name; } else if (missionIdentifier.startsWith("status_")) { - return progress >= mission.required ? "Completed" : "In Progress"; + return progress >= mission.required + ? plugin.getMessageManager().getMessage("placeholders.mission-completed") + : plugin.getMessageManager().getMessage("placeholders.mission-in-progress"); } } } catch (NumberFormatException ignored) {} @@ -210,7 +218,7 @@ private String getTopPlayerPlaceholder(String identifier) { List topPlayers = future.join(); if (position > topPlayers.size()) { - return "Empty"; + return plugin.getMessageManager().getMessage("placeholders.empty"); } PlayerData topPlayer = topPlayers.get(position - 1); @@ -218,7 +226,8 @@ private String getTopPlayerPlaceholder(String identifier) { if (parts.length > 1) { switch (parts[1].toLowerCase()) { case "name": - return Bukkit.getOfflinePlayer(topPlayer.uuid).getName(); + String topName = Bukkit.getOfflinePlayer(topPlayer.uuid).getName(); + return topName != null ? topName : plugin.getMessageManager().getMessage("placeholders.unknown"); case "level": return String.valueOf(topPlayer.level); case "xp": @@ -230,10 +239,11 @@ private String getTopPlayerPlaceholder(String identifier) { } } - return Bukkit.getOfflinePlayer(topPlayer.uuid).getName(); + String defaultTopName = Bukkit.getOfflinePlayer(topPlayer.uuid).getName(); + return defaultTopName != null ? defaultTopName : plugin.getMessageManager().getMessage("placeholders.unknown"); } catch (NumberFormatException ignored) {} return ""; } -} \ No newline at end of file +} diff --git a/src/main/java/com/Lino/battlePass/utils/GradientColorParser.java b/src/main/java/com/Lino/battlePass/utils/GradientColorParser.java index 9312147..3a207a2 100644 --- a/src/main/java/com/Lino/battlePass/utils/GradientColorParser.java +++ b/src/main/java/com/Lino/battlePass/utils/GradientColorParser.java @@ -1,7 +1,6 @@ package com.Lino.battlePass.utils; import net.md_5.bungee.api.ChatColor; -import org.bukkit.Bukkit; import java.awt.Color; import java.util.regex.Matcher; @@ -11,8 +10,11 @@ public class GradientColorParser { private static final Pattern GRADIENT_PATTERN = Pattern.compile("(.*?)"); private static final Pattern HEX_PATTERN = Pattern.compile("&#([A-Fa-f0-9]{6})"); + private static final Pattern MINI_HEX_PATTERN = Pattern.compile("<#([A-Fa-f0-9]{6})>"); + private static final Pattern STRIP_GRADIENT_PATTERN = Pattern.compile("(.*?)"); private static final boolean SUPPORTS_HEX = checkHexSupport(); + private static volatile boolean cleanMode = false; private static boolean checkHexSupport() { try { @@ -26,6 +28,13 @@ private static boolean checkHexSupport() { public static String parse(String message) { if (message == null) return null; + if (cleanMode) { + message = STRIP_GRADIENT_PATTERN.matcher(message).replaceAll("$1"); + message = message.replaceAll("&#[A-Fa-f0-9]{6}", ""); + message = message.replaceAll("<#[A-Fa-f0-9]{6}>", ""); + return ChatColor.translateAlternateColorCodes('&', message); + } + message = parseGradients(message); message = parseHexColors(message); @@ -55,10 +64,16 @@ private static String parseGradients(String message) { private static String parseHexColors(String message) { if (!SUPPORTS_HEX) { - return message.replaceAll("&#[A-Fa-f0-9]{6}", ""); + message = message.replaceAll("&#[A-Fa-f0-9]{6}", ""); + return message.replaceAll("<#[A-Fa-f0-9]{6}>", ""); } - Matcher matcher = HEX_PATTERN.matcher(message); + String parsed = replaceHexPattern(message, HEX_PATTERN); + return replaceHexPattern(parsed, MINI_HEX_PATTERN); + } + + private static String replaceHexPattern(String message, Pattern pattern) { + Matcher matcher = pattern.matcher(message); StringBuffer buffer = new StringBuffer(); while (matcher.find()) { @@ -126,9 +141,14 @@ private static Color interpolateColor(Color start, Color end, float ratio) { public static String stripColors(String message) { if (message == null) return null; - message = message.replaceAll("(.*?)", "$1"); + message = STRIP_GRADIENT_PATTERN.matcher(message).replaceAll("$1"); message = message.replaceAll("&#[A-Fa-f0-9]{6}", ""); + message = message.replaceAll("<#[A-Fa-f0-9]{6}>", ""); return ChatColor.stripColor(message); } -} \ No newline at end of file + + public static void setCleanMode(boolean enabled) { + cleanMode = enabled; + } +} diff --git a/src/main/java/com/Lino/battlePass/utils/MaterialNameResolver.java b/src/main/java/com/Lino/battlePass/utils/MaterialNameResolver.java new file mode 100644 index 0000000..f6f5ac5 --- /dev/null +++ b/src/main/java/com/Lino/battlePass/utils/MaterialNameResolver.java @@ -0,0 +1,188 @@ +package com.Lino.battlePass.utils; + +import org.bukkit.Material; + +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +public final class MaterialNameResolver { + + private static final Map RUSSIAN_NAMES = new HashMap<>(); + private static final String LANGUAGE_RU = "RU"; + private static final String LANGUAGE_EN = "EN"; + + static { + register("AMETHYST_BLOCK", "Аметистовый блок"); + register("AMETHYST_SHARD", "Аметистовый осколок"); + register("ANCIENT_DEBRIS", "Древние обломки"); + register("ANVIL", "Наковальня"); + register("BEACON", "Маяк"); + register("BLAZE_POWDER", "Огненный порошок"); + register("BLAZE_ROD", "Стержень ифрита"); + register("BREWING_STAND", "Варочная стойка"); + register("CHEST", "Сундук"); + register("CHORUS_FRUIT", "Плод коруса"); + register("COAL", "Уголь"); + register("COMMAND_BLOCK", "Командный блок"); + register("CONDUIT", "Морской проводник"); + register("COMPASS", "Компас"); + register("COPPER_BLOCK", "Медный блок"); + register("CREEPER_HEAD", "Голова крипера"); + register("CRYING_OBSIDIAN", "Плачущий обсидиан"); + register("DIAMOND", "Алмаз"); + register("DIAMOND_BLOCK", "Алмазный блок"); + register("DIAMOND_BOOTS", "Алмазные ботинки"); + register("DIAMOND_CHESTPLATE", "Алмазный нагрудник"); + register("DIAMOND_HELMET", "Алмазный шлем"); + register("DIAMOND_HORSE_ARMOR", "Алмазная конская броня"); + register("DIAMOND_LEGGINGS", "Алмазные поножи"); + register("DIRT", "Земля"); + register("DRAGON_BREATH", "Дыхание дракона"); + register("DRAGON_EGG", "Яйцо дракона"); + register("DRAGON_HEAD", "Голова дракона"); + register("ECHO_SHARD", "Осколок эха"); + register("ELYTRA", "Элитры"); + register("EMERALD", "Изумруд"); + register("EMERALD_BLOCK", "Изумрудный блок"); + register("ENCHANTED_BOOK", "Зачарованная книга"); + register("ENCHANTED_GOLDEN_APPLE", "Зачарованное золотое яблоко"); + register("END_CRYSTAL", "Кристалл Края"); + register("ENDER_CHEST", "Эндер-сундук"); + register("ENDER_EYE", "Око Края"); + register("ENDER_PEARL", "Эндер-жемчуг"); + register("EXPERIENCE_BOTTLE", "Пузырек опыта"); + register("FERMENTED_SPIDER_EYE", "Маринованный паучий глаз"); + register("GHAST_TEAR", "Слеза гаста"); + register("GLISTERING_MELON_SLICE", "Сверкающий ломтик арбуза"); + register("GLOWSTONE", "Светокамень"); + register("GOLD_BLOCK", "Золотой блок"); + register("GOLD_INGOT", "Золотой слиток"); + register("GOLD_NUGGET", "Золотой самородок"); + register("GOLDEN_APPLE", "Золотое яблоко"); + register("GOLDEN_CARROT", "Золотая морковь"); + register("GRAY_STAINED_GLASS", "Серое стекло"); + register("GRAY_STAINED_GLASS_PANE", "Серая стеклянная панель"); + register("GREEN_STAINED_GLASS", "Зеленое стекло"); + register("GUNPOWDER", "Порох"); + register("HEART_OF_THE_SEA", "Сердце моря"); + register("HONEY_BLOCK", "Медовый блок"); + register("HONEYCOMB", "Пчелиные соты"); + register("IRON_BARS", "Железные прутья"); + register("IRON_BLOCK", "Железный блок"); + register("IRON_HORSE_ARMOR", "Железная конская броня"); + register("IRON_INGOT", "Железный слиток"); + register("LAPIS_LAZULI", "Лазурит"); + register("LIME_STAINED_GLASS", "Лаймовое стекло"); + register("LODESTONE", "Магнетит"); + register("MAGMA_CREAM", "Магмовый крем"); + register("MUSIC_DISC_OTHERSIDE", "Пластинка Otherside"); + register("MUSIC_DISC_PIGSTEP", "Пластинка Pigstep"); + register("NAME_TAG", "Бирка"); + register("NAUTILUS_SHELL", "Раковина наутилуса"); + register("NETHER_STAR", "Звезда Незера"); + register("NETHERITE_BLOCK", "Незеритовый блок"); + register("NETHERITE_BOOTS", "Незеритовые ботинки"); + register("NETHERITE_CHESTPLATE", "Незеритовый нагрудник"); + register("NETHERITE_HELMET", "Незеритовый шлем"); + register("NETHERITE_INGOT", "Незеритовый слиток"); + register("NETHERITE_LEGGINGS", "Незеритовые поножи"); + register("NETHERITE_SCRAP", "Незеритовый лом"); + register("NETHERITE_SWORD", "Незеритовый меч"); + register("NETHERITE_UPGRADE_SMITHING_TEMPLATE", "Кузнечный шаблон незерита"); + register("PHANTOM_MEMBRANE", "Мембрана фантома"); + register("PRISMARINE_CRYSTALS", "Кристаллы призмарина"); + register("PRISMARINE_SHARD", "Осколок призмарина"); + register("QUARTZ", "Кварц"); + register("RABBIT_FOOT", "Кроличья лапка"); + register("RECOVERY_COMPASS", "Компас восстановления"); + register("REDSTONE", "Редстоун"); + register("RESPAWN_ANCHOR", "Якорь возрождения"); + register("SADDLE", "Седло"); + register("SCUTE", "Щиток черепахи"); + register("SHULKER_BOX", "Шалкеровый ящик"); + register("SHULKER_SHELL", "Раковина шалкера"); + register("SKELETON_SKULL", "Череп скелета"); + register("SLIME_BALL", "Слизь"); + register("SPIDER_EYE", "Паучий глаз"); + register("SPYGLASS", "Подзорная труба"); + register("STONE", "Камень"); + register("STRING", "Нить"); + register("TOTEM_OF_UNDYING", "Тотем бессмертия"); + register("TRIDENT", "Трезубец"); + register("TURTLE_SCUTE", "Черепок черепахи"); + register("WITHER_SKELETON_SKULL", "Череп визер-скелета"); + register("ZOMBIE_HEAD", "Голова зомби"); + } + + private MaterialNameResolver() { + } + + public static String resolve(Material material) { + return resolve(material, LANGUAGE_RU); + } + + public static String resolve(Material material, String language) { + if (material == null) { + return getDefaultName(language); + } + return resolve(material.name(), language); + } + + public static String resolve(String materialName) { + return resolve(materialName, LANGUAGE_RU); + } + + public static String resolve(String materialName, String language) { + if (materialName == null || materialName.isEmpty()) { + return getDefaultName(language); + } + + String normalized = materialName.toUpperCase(Locale.ROOT); + if (isEnglish(language)) { + return toReadableName(normalized); + } + + String translatedName = RUSSIAN_NAMES.get(normalized); + if (translatedName != null) { + return translatedName; + } + + return toReadableName(normalized); + } + + private static String toReadableName(String value) { + String[] words = value.toLowerCase(Locale.ROOT).split("_"); + StringBuilder fallbackName = new StringBuilder(); + for (String word : words) { + if (word.isEmpty()) { + continue; + } + if (fallbackName.length() > 0) { + fallbackName.append(' '); + } + fallbackName.append(Character.toUpperCase(word.charAt(0))).append(word.substring(1)); + } + return fallbackName.length() == 0 ? value : fallbackName.toString(); + } + + private static void register(String materialName, String russianName) { + RUSSIAN_NAMES.put(materialName, russianName); + } + + private static boolean isEnglish(String language) { + if (language == null) { + return false; + } + + String normalized = language.trim().toUpperCase(Locale.ROOT); + return LANGUAGE_EN.equals(normalized) || "ENG".equals(normalized) || "ENGLISH".equals(normalized); + } + + private static String getDefaultName(String language) { + if (isEnglish(language)) { + return "Item"; + } + return "Предмет"; + } +} diff --git a/src/main/resources/BattlePassFREE.yml b/src/main/resources/BattlePassFREE.yml index b9970e5..4c2ee84 100644 --- a/src/main/resources/BattlePassFREE.yml +++ b/src/main/resources/BattlePassFREE.yml @@ -1,16 +1,16 @@ -# Battle Pass Free Rewards Configuration +# Бесплатные награды Battle Pass # -# Single item reward: +# 1) Обычная предметная награда: # level-X: # material: DIAMOND # amount: 5 # -# Command reward: +# 2) Награда-команда: # level-X: # command: "eco give 1000" # display: "$1000" # -# Multiple rewards in one level: +# 3) Несколько наград на одном уровне: # level-X: # items: # reward1: @@ -20,7 +20,7 @@ # command: "kit vip " # display: "VIP Kit" # -# will be replaced with the player's name +# Плейсхолдер автоматически заменяется на ник игрока. level-1: material: IRON_INGOT @@ -59,7 +59,7 @@ level-9: amount: 1 level-10: command: "eco give 5000" - display: "$5000 Money" + display: "$5000 Денег" level-11: material: ENDER_PEARL amount: 8 @@ -102,7 +102,7 @@ level-20: display: "$10,000" permission: command: "lp user permission set kit.vip true" - display: "VIP Kit Access" + display: "Доступ к VIP-набору" level-21: material: SLIME_BALL amount: 16 @@ -128,7 +128,7 @@ level-28: material: RABBIT_FOOT amount: 4 level-29: - material: TURTLE_SCUTE + material: SCUTE amount: 2 level-30: items: @@ -140,7 +140,7 @@ level-30: display: "$7,500" xp: command: "xp give 100L" - display: "100 XP Levels" + display: "100 уровней опыта" level-31: material: IRON_HORSE_ARMOR amount: 1 @@ -178,7 +178,7 @@ level-40: display: "$20,000" effect: command: "effect give minecraft:speed 3600 2" - display: "Speed II (1 hour)" + display: "Скорость II (1 час)" level-41: material: EMERALD_BLOCK amount: 1 @@ -210,13 +210,13 @@ level-50: material: TOTEM_OF_UNDYING amount: 1 level-51: - material: COPPER_BLOCK + material: IRON_BLOCK amount: 16 level-52: - material: AMETHYST_SHARD + material: PRISMARINE_CRYSTALS amount: 32 level-53: - material: ECHO_SHARD + material: NAUTILUS_SHELL amount: 4 level-54: items: @@ -228,7 +228,7 @@ level-54: display: "$30,000" title: command: "lp user meta addprefix 100 \"&6[Battle Master] \"" - display: "Battle Master Title" + display: "Титул Battle Master" announce: - command: "say has completed the entire Battle Pass!" - display: "Server-wide Recognition" \ No newline at end of file + command: "say полностью завершил Battle Pass!" + display: "Объявление на весь сервер" diff --git a/src/main/resources/BattlePassPREMIUM.yml b/src/main/resources/BattlePassPREMIUM.yml index 19dad4f..5968c46 100644 --- a/src/main/resources/BattlePassPREMIUM.yml +++ b/src/main/resources/BattlePassPREMIUM.yml @@ -1,16 +1,16 @@ -# Battle Pass Premium Rewards Configuration +# Премиум-награды Battle Pass # -# Single item reward: +# 1) Обычная предметная награда: # level-X: # material: DIAMOND # amount: 5 # -# Command reward: +# 2) Награда-команда: # level-X: # command: "eco give 1000" # display: "$1000" # -# Multiple rewards in one level: +# 3) Несколько наград на одном уровне: # level-X: # items: # reward1: @@ -20,7 +20,7 @@ # command: "kit vip " # display: "VIP Kit" # -# will be replaced with the player's name +# Плейсхолдер автоматически заменяется на ник игрока. level-1: items: @@ -32,7 +32,7 @@ level-1: display: "$5000" kit: command: "kit premium " - display: "Premium Kit" + display: "Премиум-набор" level-2: material: NETHERITE_INGOT amount: 1 @@ -72,10 +72,10 @@ level-10: display: "$25,000" fly: command: "lp user permission set essentials.fly true" - display: "Fly Permission" + display: "Право на полет" announce: - command: "say has reached Battle Pass Level 10!" - display: "Server Announcement" + command: "say достиг 10 уровня Battle Pass!" + display: "Объявление на сервер" level-11: material: TRIDENT amount: 1 @@ -92,7 +92,7 @@ level-15: material: DIAMOND_BOOTS amount: 1 level-16: - material: NETHERITE_UPGRADE_SMITHING_TEMPLATE + material: NETHERITE_INGOT amount: 1 level-17: material: DIAMOND_HORSE_ARMOR @@ -113,10 +113,10 @@ level-20: display: "$50,000" rank: command: "lp user parent add vip" - display: "VIP Rank" + display: "Ранг VIP" crate: command: "crate give legendary 3" - display: "3x Legendary Crates" + display: "3x легендарных кейса" level-21: material: NETHERITE_HELMET amount: 1 @@ -154,7 +154,7 @@ level-32: material: MUSIC_DISC_PIGSTEP amount: 1 level-33: - material: MUSIC_DISC_OTHERSIDE + material: MUSIC_DISC_PIGSTEP amount: 1 level-34: material: CREEPER_HEAD @@ -184,7 +184,7 @@ level-40: display: "$75,000" effect: command: "effect give minecraft:regeneration 7200 2" - display: "Regeneration II (2 hours)" + display: "Регенерация II (2 часа)" level-41: material: DRAGON_BREATH amount: 16 @@ -204,25 +204,25 @@ level-46: material: ENCHANTED_GOLDEN_APPLE amount: 3 level-47: - material: NETHERITE_UPGRADE_SMITHING_TEMPLATE + material: NETHERITE_INGOT amount: 3 level-48: material: NETHERITE_SWORD amount: 1 level-49: - material: AMETHYST_BLOCK + material: DIAMOND_BLOCK amount: 8 level-50: material: DRAGON_EGG amount: 2 level-51: - material: ECHO_SHARD + material: NETHER_STAR amount: 8 level-52: - material: SPYGLASS + material: ENDER_EYE amount: 1 level-53: - material: RECOVERY_COMPASS + material: COMPASS amount: 1 level-54: items: @@ -234,10 +234,10 @@ level-54: display: "$100,000" rank: command: "lp user parent add legend" - display: "Legend Rank" + display: "Ранг Legend" title: command: "lp user meta addprefix 100 \"&5[Legend] \"" - display: "Legend Title" + display: "Титул Legend" announce: - command: "say has become a LEGEND by completing the Premium Battle Pass!" - display: "Legendary Achievement" \ No newline at end of file + command: "say стал ЛЕГЕНДОЙ, завершив Premium Battle Pass!" + display: "Легендарное достижение" diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 1b177b4..8b56d05 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,50 +1,62 @@ -# Battle Pass Configuration +# Основной конфиг Battle Pass -# Season configuration +# Язык плагина: +# RU - русский +# EN / ENG - английский +# Загружаются файлы messages_<язык>.yml и gui_<язык>.yml +language: RU + +# Настройки сезона season: - # Reset type: MONTH_START (reset at beginning of month) or DURATION (reset after X days) + # Тип сброса сезона: + # MONTH_START - в начале каждого месяца + # DURATION - каждые N дней (см. duration) reset-type: "DURATION" - # Season duration in days (only used when reset-type is DURATION) + # Длительность сезона в днях (используется только при reset-type: DURATION) duration: 30 - # Whether to reset battle coins when season ends + # Сбрасывать Battle Coins при смене сезона reset-coins-on-season-end: true - # Season Rotation - automatically cycle through different reward sets - # When enabled, each season reset will load the next set of rewards from the /seasons/ folder - # Seasons loop: season-1 -> season-2 -> season-3 -> season-1 -> ... + + # Ротация сезонных наград из папки /plugins/BattlePass/seasons/ + # Цикл: season-1 -> season-2 -> ... -> season-N -> season-1 rotation: enabled: false - # How many seasons to cycle through (must match the number of folders in /seasons/) + # Количество сезонов в цикле (должно совпадать с числом папок season-*) total-seasons: 3 -# Database configuration -# type: SQLITE (default) or MYSQL -# If SQLITE is selected, the plugin will use the local 'Database' folder. +# База данных +# type: SQLITE (по умолчанию) или MYSQL database: - type: SQLITE #Or MySQL - #MySQL Settings (Uncomment to use MySQL) - #host: localhost - #port: 3306 - #database: battlepass - #username: root - #password: "" - #prefix: "bp_" - #pool-size: 10 + type: SQLITE + # Настройки MySQL (используются только если type: MYSQL) + # host: localhost + # port: 3306 + # database: battlepass + # username: root + # password: "" + # prefix: "bp_" + # pool-size: 10 -# Experience configuration +# Опыт Battle Pass experience: + # Сколько XP нужно на 1 уровень xp-per-level: 200 -# Daily reward configuration +# Ежедневная награда daily-reward: + # XP за ежедневный бонус xp: 200 -# Missions configuration +# Ежедневные миссии missions: + # Через сколько часов обновляются миссии reset-hours: 24 -# Battle Coins distribution configuration +# Battle Coins battle-coins: + # Интервал выдачи монет топ-10 (в часах) distribution-hours: 24 + # Награда по местам в топе distribution: 1: 10 2: 9 @@ -57,15 +69,20 @@ battle-coins: 9: 2 10: 1 -# Shop configuration +# Магазин shop: enabled: true -# Custom Items configuration +# Кастомные предметы custom-items: sounds-enabled: true -# GUI Customization +# Визуальные настройки интерфейса +ui: + # Чистый режим: отключает градиенты/hex-цвета и делает GUI спокойнее + clean-mode: true + +# Материалы в GUI (используйте Bukkit Material) gui: reward-locked: free: GRAY_STAINED_GLASS @@ -75,4 +92,4 @@ gui: reward-claimed: free: GREEN_STAINED_GLASS premium: LIME_STAINED_GLASS - separator: GRAY_STAINED_GLASS_PANE \ No newline at end of file + separator: GRAY_STAINED_GLASS_PANE diff --git a/src/main/resources/gui_en.yml b/src/main/resources/gui_en.yml new file mode 100644 index 0000000..bd4f311 --- /dev/null +++ b/src/main/resources/gui_en.yml @@ -0,0 +1,192 @@ +gui: + battlepass: "&6Battle Pass &8| &7Page %page%" + missions: "&6Daily Missions" + leaderboard: "&6Leaderboard" + shop: "&6BattlePass Shop" + +items: + progress: + name: "�D4FFYour Progress" + lore: + - "&7Level: &f%level%" + - "&7XP: &f%xp%&7/&f%xp_needed%" + - "&7Premium: %premium_status%" + - "&7Season: &f%current_season%" + - "&7Season reset in: &f%season_time%" + + premium-status: + active: "&aActive" + inactive: "&cInactive" + + separator: + name: " " + + previous-page: + name: "&e← Previous Page" + lore: + - "&7Open page %page%" + + next-page: + name: "&eNext Page →" + lore: + - "&7Open page %page%" + + missions-button: + name: "&eMissions" + lore: + - "&7Complete missions" + - "&7and earn XP." + - "&7Resets in: &f%reset_time%" + + leaderboard-button: + name: "&eLeaderboard" + lore: + - "&7Top players by progress." + - "&7Next coin payout: &f%coins_time%" + + shop-button: + name: "&eShop" + lore: + - "&7Buy items for coins." + - "&7Your coins: &f%coins%" + + daily-reward: + name: "&eDaily Reward" + lore-available: + - "&7Reward: &f%xp% XP" + - "&aClick to claim" + lore-cooldown: + - "&7Reward: &f%xp% XP" + - "&7Available in: &f%time%" + + reward-available: + name: "&a%type% Reward • Level %level%" + lore-header: + - "&7Rewards:" + lore-footer: + - "&7" + - "&aClick to claim" + + reward-claimed: + name: "&8%type% Reward • Level %level%" + lore-header: + - "&7Rewards:" + lore-footer: + - "&7" + - "&8Already claimed" + + reward-premium-locked: + name: "&6Premium Reward • Level %level%" + lore-header: + - "&7Rewards:" + lore-footer: + - "&7" + - "&6Premium required" + + reward-level-locked: + name: "&c%type% Reward • Level %level%" + lore-header: + - "&7Rewards:" + lore-footer: + - "&7" + - "&cInsufficient level" + + mission-timer: + name: "&eMission Reset" + lore: + - "&7Resets in: &f%reset_time%" + + mission-completed: + name: "&a%mission%" + lore: + - "&7Progress: &f%progress%/%required%" + - "&7Reward: &f%reward_xp% XP" + - "&7Resets in: &f%reset_time%" + - "&aCompleted" + + mission-in-progress: + name: "&e%mission%" + lore: + - "&7Progress: &f%progress%/%required%" + - "&7Reward: &f%reward_xp% XP" + - "&7Resets in: &f%reset_time%" + - "&eIn progress" + + leaderboard-title: + name: "&eTop 10 Players" + lore: + - "&7Season ends in: &f%season_time%" + - "&7Next coin payout: &f%coins_time%" + + leaderboard-player: + name: "%rank% &b%player%" + lore: + - "&7Level: &f%level%" + - "&7Total Levels: &f%total_levels%" + - "&7XP: &f%xp%" + - "&7Coins: &f%coins%" + - "&7%status%" + + leaderboard-rank: + first: "&6#1" + second: "&f#2" + third: "&c#3" + other: "&7#%rank%" + + leaderboard-status: + you: "&aYou" + other: "&7Keep grinding" + + coins-info: + name: "&eBattle Coins" + lore: + - "&7Coins are paid to top-10 players." + - "&7Next payout: &f%time%" + + back-button: + name: "&c← Back" + lore: + - "&7Return" + + shop-balance: + name: "&eYour Balance" + lore: + - "&7Battle Coins: &f%coins%" + + admin-rewards-editor: + name: "&6Rewards Editor" + lore: + - "&7Open rewards editor." + + admin-missions-reset: + name: "&cReset Missions" + lore: + - "&7Admin only." + - "&cClick to reset" + + admin-missions-editor: + name: "&6Mission Editor" + lore: + - "&7Create and edit missions." + +custom-items: + premium-pass: + name: "&#FF66FF★ Premium Battle Pass Voucher ★" + lore: + - "&7Unlocks the Premium reward track." + - "&7Valid until the end of current season." + - "&aRight-click to activate" + + battle-coin: + name: "&#FFD54F✦ Battle Coin Token ✦" + lore: + - "&7Adds 1 Battle Coin." + - "&7Can be stacked." + - "&aRight-click to use" + + level-boost: + name: "BFFCC✧ XP Boost Elixir ✧" + lore: + - "&7Gives +100 Battle Pass XP." + - "&7Can be used in batches." + - "&aRight-click to use" diff --git a/src/main/resources/gui_ru.yml b/src/main/resources/gui_ru.yml new file mode 100644 index 0000000..804b998 --- /dev/null +++ b/src/main/resources/gui_ru.yml @@ -0,0 +1,192 @@ +gui: + battlepass: "&6Боевой пропуск &8| &7Страница %page%" + missions: "&6Ежедневные миссии" + leaderboard: "&6Таблица лидеров" + shop: "&6Магазин BattlePass" + +items: + progress: + name: "�D4FFВаш прогресс" + lore: + - "&7Уровень: &f%level%" + - "&7XP: &f%xp%&7/&f%xp_needed%" + - "&7Premium: %premium_status%" + - "&7Сезон: &f%current_season%" + - "&7До сброса: &f%season_time%" + + premium-status: + active: "&aАктивен" + inactive: "&cНе активен" + + separator: + name: " " + + previous-page: + name: "&e← Предыдущая страница" + lore: + - "&7Открыть страницу %page%" + + next-page: + name: "&eСледующая страница →" + lore: + - "&7Открыть страницу %page%" + + missions-button: + name: "&eМиссии" + lore: + - "&7Выполняйте задания" + - "&7и получайте XP." + - "&7Сброс через: &f%reset_time%" + + leaderboard-button: + name: "&eЛидеры" + lore: + - "&7Топ игроков по прогрессу." + - "&7Следующие монеты: &f%coins_time%" + + shop-button: + name: "&eМагазин" + lore: + - "&7Покупка предметов за монеты." + - "&7Ваши монеты: &f%coins%" + + daily-reward: + name: "&eЕжедневная награда" + lore-available: + - "&7Награда: &f%xp% XP" + - "&aНажмите, чтобы забрать" + lore-cooldown: + - "&7Награда: &f%xp% XP" + - "&7Доступно через: &f%time%" + + reward-available: + name: "&aНаграда %type% • Уровень %level%" + lore-header: + - "&7Награды:" + lore-footer: + - "&7" + - "&aНажмите, чтобы забрать" + + reward-claimed: + name: "&8Награда %type% • Уровень %level%" + lore-header: + - "&7Награды:" + lore-footer: + - "&7" + - "&8Уже получено" + + reward-premium-locked: + name: "&6Premium награда • Уровень %level%" + lore-header: + - "&7Награды:" + lore-footer: + - "&7" + - "&6Требуется Premium" + + reward-level-locked: + name: "&cНаграда %type% • Уровень %level%" + lore-header: + - "&7Награды:" + lore-footer: + - "&7" + - "&cНедостаточный уровень" + + mission-timer: + name: "&eСброс миссий" + lore: + - "&7До сброса: &f%reset_time%" + + mission-completed: + name: "&a%mission%" + lore: + - "&7Прогресс: &f%progress%/%required%" + - "&7Награда: &f%reward_xp% XP" + - "&7Сброс через: &f%reset_time%" + - "&aВыполнено" + + mission-in-progress: + name: "&e%mission%" + lore: + - "&7Прогресс: &f%progress%/%required%" + - "&7Награда: &f%reward_xp% XP" + - "&7Сброс через: &f%reset_time%" + - "&eВ процессе" + + leaderboard-title: + name: "&eТоп 10 игроков" + lore: + - "&7До конца сезона: &f%season_time%" + - "&7Следующая выдача монет: &f%coins_time%" + + leaderboard-player: + name: "%rank% &b%player%" + lore: + - "&7Уровень: &f%level%" + - "&7Всего уровней: &f%total_levels%" + - "&7XP: &f%xp%" + - "&7Монеты: &f%coins%" + - "&7%status%" + + leaderboard-rank: + first: "&6#1" + second: "&f#2" + third: "&c#3" + other: "&7#%rank%" + + leaderboard-status: + you: "&aЭто вы" + other: "&7Продолжайте прокачку" + + coins-info: + name: "&eBattle Coins" + lore: + - "&7Монеты выдаются топ-10 игроков." + - "&7Следующая выдача: &f%time%" + + back-button: + name: "&c← Назад" + lore: + - "&7Вернуться назад" + + shop-balance: + name: "&eВаш баланс" + lore: + - "&7Battle Coins: &f%coins%" + + admin-rewards-editor: + name: "&6Редактор наград" + lore: + - "&7Открыть редактор наград." + + admin-missions-reset: + name: "&cСбросить миссии" + lore: + - "&7Только для администратора." + - "&cНажмите для сброса" + + admin-missions-editor: + name: "&6Редактор миссий" + lore: + - "&7Создание и редактирование миссий." + +custom-items: + premium-pass: + name: "&#FF66FF★ Ваучер Premium Battle Pass ★" + lore: + - "&7Активирует Premium ветку наград." + - "&7Действует до конца текущего сезона." + - "&aПКМ для активации" + + battle-coin: + name: "&#FFD54F✦ Жетон Battle Coin ✦" + lore: + - "&7Добавляет 1 Battle Coin." + - "&7Можно складывать в стаки." + - "&aПКМ для использования" + + level-boost: + name: "BFFCC✧ Эликсир ускорения опыта ✧" + lore: + - "&7Даёт +100 XP Battle Pass." + - "&7Можно использовать пачкой." + - "&aПКМ для использования" diff --git a/src/main/resources/messages.yml b/src/main/resources/messages.yml index f633f36..a1c3569 100644 --- a/src/main/resources/messages.yml +++ b/src/main/resources/messages.yml @@ -1,317 +1,317 @@ -prefix: "BATTLE PASS &8» " +prefix: "&6[BattlePass] &8» &r" messages: - plugin-enabled: "✓ Battle Pass enabled successfully!" - config-reloaded: "✓ Configuration reloaded!" + plugin-enabled: "✓ Battle Pass успешно включен!" + config-reloaded: "✓ Конфигурация перезагружена!" - player-only: "✗ Only players can use this command!" - no-permission: "✗ You don't have permission to use this command!" - player-not-found: "✗ Player not found!" - invalid-amount: "✗ Invalid amount! Please enter a number." - amount-must-be-positive: "✗ Amount must be positive!" - invalid-item-type: "✗ Invalid item type! Use 'premium', 'coins' or 'levelboost'." + player-only: "✗ Эту команду может использовать только игрок!" + no-permission: "✗ У вас нет прав на использование этой команды!" + player-not-found: "✗ Игрок не найден!" + invalid-amount: "✗ Некорректное число! Введите число." + amount-must-be-positive: "✗ Значение должно быть больше нуля!" + invalid-item-type: "✗ Неверный тип предмета! Используйте 'premium', 'coins' или 'levelboost'." usage: - battlepass: "Usage: &f/battlepass" - add-premium: "Usage: &f/battlepass addpremium " - remove-premium: "Usage: &f/battlepass removepremium " - add-xp: "Usage: &f/battlepass addxp " - remove-xp: "Usage: &f/battlepass removexp " - add-coins: "Usage: &f/battlepass addcoins " - remove-coins: "Usage: &f/battlepass removecoins " - giveitem: "Usage: &f/battlepass giveitem " - reset-player: "Usage: &f/battlepass resetplayer " - edit-rewards-season: "Usage: &f/battlepass edit rewards season " + battlepass: "Использование: &f/battlepass" + add-premium: "Использование: &f/battlepass addpremium <игрок>" + remove-premium: "Использование: &f/battlepass removepremium <игрок>" + add-xp: "Использование: &f/battlepass addxp <игрок> <кол-во>" + remove-xp: "Использование: &f/battlepass removexp <игрок> <кол-во>" + add-coins: "Использование: &f/battlepass addcoins <игрок> <кол-во>" + remove-coins: "Использование: &f/battlepass removecoins <игрок> <кол-во>" + giveitem: "Использование: &f/battlepass giveitem <тип> <игрок> <кол-во>" + reset-player: "Использование: &f/battlepass resetplayer <игрок>" + edit-rewards-season: "Использование: &f/battlepass edit rewards season <номер>" reset-player: - sender: "✓ Successfully reset battle pass progress for %player%" - target: "⚠ Your Battle Pass progress has been reset by an admin!" + sender: "✓ Прогресс Battle Pass игрока %player% успешно сброшен" + target: "⚠ Ваш прогресс Battle Pass был сброшен администратором!" help: - header: "⚡ BATTLE PASS COMMANDS ⚡" - battlepass: "/battlepass &7- Open the Battle Pass GUI" - help: "/bp help &7- Show this help menu" - reload: "/bp reload &7- Reload the configuration" - reset-season: "/bp reset season &7- Force reset the season" - reset-missions: "/bp reset missions &7- Force reset daily missions" - reset-player: "/bp resetplayer &7- Reset battle pass progress for a player" - add-premium: "/bp addpremium &7- Give premium pass" - remove-premium: "/bp removepremium &7- Remove premium pass" - add-xp: "/bp addxp &7- Add XP to a player" - remove-xp: "/bp removexp &7- Remove XP from a player" - add-coins: "/bp addcoins &7- Add Battle Coins" - remove-coins: "/bp removecoins &7- Remove Battle Coins" - giveitem: "/bp giveitem &7- Give custom items" - exclude-top: "/bp excludefromtop &7- Hide player from leaderboard" - include-top: "/bp includetop &7- Show player in leaderboard" - edit-rewards-season: "/bp edit rewards season &7- Edit rewards for a specific season" + header: "⚡ КОМАНДЫ BATTLE PASS ⚡" + battlepass: "/battlepass &7- Открыть GUI Battle Pass" + help: "/bp help &7- Показать это меню помощи" + reload: "/bp reload &7- Перезагрузить конфигурацию" + reset-season: "/bp reset season &7- Принудительно сбросить сезон" + reset-missions: "/bp reset missions &7- Принудительно сбросить ежедневные миссии" + reset-player: "/bp resetplayer <игрок> &7- Сбросить прогресс Battle Pass игрока" + add-premium: "/bp addpremium <игрок> &7- Выдать Premium Pass" + remove-premium: "/bp removepremium <игрок> &7- Убрать Premium Pass" + add-xp: "/bp addxp <игрок> <кол-во> &7- Добавить XP игроку" + remove-xp: "/bp removexp <игрок> <кол-во> &7- Убрать XP у игрока" + add-coins: "/bp addcoins <игрок> <кол-во> &7- Добавить Battle Coins" + remove-coins: "/bp removecoins <игрок> <кол-во> &7- Убрать Battle Coins" + giveitem: "/bp giveitem <тип> <игрок> <кол-во> &7- Выдать особые предметы" + exclude-top: "/bp excludefromtop <игрок> &7- Скрыть игрока из топа" + include-top: "/bp includetop <игрок> &7- Вернуть игрока в топ" + edit-rewards-season: "/bp edit rewards season <номер> &7- Редактировать награды выбранного сезона" premium: - given-sender: "✓ Premium pass given to %target%" - given-target: "★ CONGRATULATIONS ★\nYou now have the Premium Battle Pass!" - removed-sender: "✗ Premium pass removed from %target%" - removed-target: "Your Premium Battle Pass has been removed!" - required: "⚠ You need the Premium Pass to claim this reward!" + given-sender: "✓ Premium Pass выдан игроку %target%" + given-target: "★ ПОЗДРАВЛЯЕМ ★\nУ вас теперь есть Premium Battle Pass!" + removed-sender: "✗ Premium Pass удален у %target%" + removed-target: "Ваш Premium Battle Pass был удален!" + required: "⚠ Для получения этой награды нужен Premium Pass!" xp: - added-sender: "✓ Added %amount% XP to %target%" + added-sender: "✓ Добавлено %amount% XP игроку %target%" added-target: "+ %amount% XP" - removed-sender: "✗ Removed %amount% XP from %target%" + removed-sender: "✗ Убрано %amount% XP у %target%" removed-target: "- %amount% XP" - level-up: "⬆ LEVEL UP! You are now level %level%" - new-rewards: "NEW REWARDS! &fYou have new rewards available to claim!" + level-up: "⬆ НОВЫЙ УРОВЕНЬ! Теперь ваш уровень: %level%" + new-rewards: "НОВЫЕ НАГРАДЫ! &fВам доступны новые награды!" - rewards-available: "Welcome back! &fYou have %amount% rewards available!" - rewards-notification: "You have %amount% new rewards to claim!" + rewards-available: "С возвращением! &fУ вас доступно %amount% наград!" + rewards-notification: "У вас есть %amount% новых наград к получению!" mission: - completed: "✓ MISSION COMPLETED: &a%mission% (+%reward_xp% XP)" - reset: "⟳ Daily missions have been reset!" - forced-reset: "⟳ An administrator has reset the daily missions!" - reset-complete: "✓ Missions have been successfully reset!" - reset-admin: "⟳ %admin% has forcefully reset the daily missions!" + completed: "✓ МИССИЯ ВЫПОЛНЕНА: &a%mission% (+%reward_xp% XP)" + reset: "⟳ Ежедневные миссии были сброшены!" + forced-reset: "⟳ Администратор сбросил ежедневные миссии!" + reset-complete: "✓ Миссии успешно сброшены!" + reset-admin: "⟳ %admin% принудительно сбросил ежедневные миссии!" actionbar-progress: "&c%mission%: &7%current%&f/&8%required%" - actionbar-completed: "✓ COMPLETED: &a&l%mission%" + actionbar-completed: "✓ ВЫПОЛНЕНО: &a&l%mission%" season: - reset: "SEASON RESET\nThe Battle Pass season has ended! A new season begins now!" - forced-reset: "FORCED SEASON RESET\nAn administrator has reset the Battle Pass season!" - reset-warning: "⚠ WARNING: &fThe season will be reset in 2 seconds. All player progress will be lost!" - reset-complete: "✓ Season has been successfully reset!" - reset-admin: "SEASON RESET\n%admin% has forcefully reset the Battle Pass season!" - ends-in: "&7Season ends in: %season_time%" - achievement: "%player% has completed the entire Battle Pass!" - premium-achievement: "%player% has become a LEGEND by completing the Premium Battle Pass!" - new-season: "Season %season% has begun!" - rotation-disabled: "✗ Season rotation is not enabled in config!" - invalid-season: "✗ Invalid season number! Must be between 1 and %max%." - editing-season: "✓ Editing rewards for Season %season%. Changes save directly to the season folder." + reset: "СБРОС СЕЗОНА\nСезон Battle Pass завершен! Новый сезон начинается прямо сейчас!" + forced-reset: "ПРИНУДИТЕЛЬНЫЙ СБРОС СЕЗОНА\nАдминистратор сбросил сезон Battle Pass!" + reset-warning: "⚠ ВНИМАНИЕ: &fСезон будет сброшен через 2 секунды. Прогресс всех игроков будет утерян!" + reset-complete: "✓ Сезон успешно сброшен!" + reset-admin: "СБРОС СЕЗОНА\n%admin% принудительно сбросил сезон Battle Pass!" + ends-in: "&7До конца сезона: %season_time%" + achievement: "%player% полностью завершил Battle Pass!" + premium-achievement: "%player% стал ЛЕГЕНДОЙ, завершив Premium Battle Pass!" + new-season: "Начался сезон %season%!" + rotation-disabled: "✗ Ротация сезонов отключена в конфиге!" + invalid-season: "✗ Неверный номер сезона! Допустимо от 1 до %max%." + editing-season: "✓ Редактирование наград для сезона %season%. Изменения сохраняются напрямую в папку сезона." rewards: - free-claimed: "✓ Free Rewards Claimed!" - premium-claimed: "★ Premium Rewards Claimed!" - already-claimed: "✗ You have already claimed this reward!" - cannot-claim: "✗ You cannot claim this reward!" - locked: "LOCKED &7(Level %level% Required)" + free-claimed: "✓ Бесплатные награды получены!" + premium-claimed: "★ Премиум-награды получены!" + already-claimed: "✗ Вы уже получили эту награду!" + cannot-claim: "✗ Вы не можете получить эту награду!" + locked: "ЗАКРЫТО &7(Нужен уровень %level%)" item-reward: "&7• &f%amount%x %item%" - item-reward-dropped: "&7• &f%amount%x %item% (Dropped on ground)" + item-reward-dropped: "&7• &f%amount%x %item% (Выброшено на землю)" command-reward: "&7• %reward%" - already-claimed-error: "✗ This reward has already been redeemed! If you believe this is an error, please contact our staff." + already-claimed-error: "✗ Эта награда уже получена! Если это ошибка, обратитесь к администрации." daily-reward: - claimed: "✓ Daily Reward Claimed! &fYou received %amount% XP" - already-claimed: "✗ You have already claimed your daily reward!" + claimed: "✓ Ежедневная награда получена! &fВы получили %amount% XP" + already-claimed: "✗ Вы уже забрали ежедневную награду!" coins: - distribution-announcement: "BATTLE COINS Top 10 players are receiving their daily Battle Coins!" - distribution-player: "#%rank% %player% &7received %amount% Battle Coins" + distribution-announcement: "BATTLE COINS Топ-10 игроков получают ежедневные Battle Coins!" + distribution-player: "#%rank% %player% &7получил %amount% Battle Coins" received: "+ %amount% Battle Coins!" - balance: "&7Your Battle Coins: %amount%" - added-sender: "✓ Added %amount% Battle Coins to %target%" + balance: "&7Ваши Battle Coins: %amount%" + added-sender: "✓ Добавлено %amount% Battle Coins игроку %target%" added-target: "+ %amount% Battle Coins!" - removed-sender: "✗ Removed %amount% Battle Coins from %target%" + removed-sender: "✗ Убрано %amount% Battle Coins у %target%" removed-target: "- %amount% Battle Coins!" - insufficient-remove: "✗ %target% only has %current% Battle Coins!" + insufficient-remove: "✗ У %target% только %current% Battle Coins!" shop: - insufficient-coins: "✗ Insufficient Battle Coins! &7Need: %required% &7Have: %current%" - purchase-success: "✓ Purchase Successful! &fBought %item% &ffor %price% Battle Coins" - shop-title: "Battle Pass Shop" + insufficient-coins: "✗ Недостаточно Battle Coins! &7Нужно: %required% &7Есть: %current%" + purchase-success: "✓ Покупка успешна! &fКуплено %item% &fза %price% Battle Coins" + shop-title: "Магазин Battle Pass" items: - given: "✓ Given %amount%x %item% to %target%" - given-dropped: "✓ Given %amount%x %item% to %target% (Some items dropped)" - received: "✓ You received %amount%x %item%" - already-have-premium: "✗ You already have the Premium Battle Pass!" - premium-activated: "★ PREMIUM ACTIVATED ★\nYou now have access to all premium rewards!" - coins-redeemed: "✓ Redeemed %amount% Battle Coins!" - max-level-reached: "✗ You have already reached the maximum level!" - xp-boost-used: "★ XP BOOST!\nConsumed %items% elixir(s) and gained %amount% XP!" + given: "✓ Выдано %amount%x %item% игроку %target%" + given-dropped: "✓ Выдано %amount%x %item% игроку %target% (Часть предметов выпала)" + received: "✓ Вы получили %amount%x %item%" + already-have-premium: "✗ У вас уже есть Premium Battle Pass!" + premium-activated: "★ PREMIUM АКТИВИРОВАН ★\nТеперь вам доступны все премиум-награды!" + coins-redeemed: "✓ Вы использовали %amount% Battle Coins!" + max-level-reached: "✗ Вы уже достигли максимального уровня!" + xp-boost-used: "★ XP-БУСТ!\nИспользовано %items% эликсиров и получено %amount% XP!" gui: - battlepass: "⚡ BATTLE PASS &8- &7Page %page%" - missions: "Daily Missions" - leaderboard: "Battle Pass Leaderboard" - shop: "Battle Pass Shop" + battlepass: "&6Battle Pass &8| &7Страница %page%" + missions: "&6Ежедневные миссии" + leaderboard: "&6Топ игроков" + shop: "&6Магазин Battle Pass" items: progress: - name: "⭐ Your Progress" + name: "&eВаш прогресс" lore: - "&7" - - "&8▸ &7Level: %level%&7/54" - - "&8▸ &7XP: %xp%&7/%xp_needed%" + - "&8▪ &7Уровень: %level%&7/54" + - "&8▪ &7XP: %xp%&7/%xp_needed%" - "&7" - - "&8▸ &7Premium Pass: %premium_status%" - - "&8▸ &7Season Ends: %season_time%" + - "&8▪ &7Премиум пропуск: %premium_status%" + - "&8▪ &7До конца сезона: %season_time%" - "&7" - - "&7Complete missions to earn XP" - - "&7and unlock amazing rewards!" + - "&7Выполняйте миссии, чтобы получать XP" + - "&7и открывать крутые награды!" premium-status: - active: "✓ ACTIVE" - inactive: "✗ INACTIVE" + active: "&aАктивен" + inactive: "&cНе активен" separator: name: " " previous-page: - name: "← Previous Page" + name: "&e← Предыдущая страница" lore: - - "&7Click to go to page %page%" + - "&7Нажмите, чтобы перейти на страницу %page%" next-page: - name: "Next Page →" + name: "&eСледующая страница →" lore: - - "&7Click to go to page %page%" + - "&7Нажмите, чтобы перейти на страницу %page%" missions-button: - name: "Daily Missions" + name: "&eЕжедневные миссии" lore: - "&7" - - "&7Complete daily missions" - - "&7to earn bonus XP!" + - "&7Выполняйте ежедневные миссии" + - "&7и получайте бонусный XP!" - "&7" - - "&8▸ &7Resets in: %reset_time%" + - "&8▪ &7Сброс через: %reset_time%" - "&7" - - "▶ CLICK TO VIEW" + - "▶ НАЖМИТЕ ДЛЯ ПРОСМОТРА" leaderboard-button: - name: "Leaderboard" + name: "&eТаблица лидеров" lore: - "&7" - - "&7View the top 10 players" - - "&7with highest battle pass levels!" + - "&7Посмотрите топ-10 игроков" + - "&7с наивысшими уровнями Battle Pass!" - "&7" - - "&8▸ &7Next Coins: %coins_time%" + - "&8▪ &7Следующие монеты: %coins_time%" - "&7" - - "▶ CLICK TO VIEW" + - "▶ НАЖМИТЕ ДЛЯ ПРОСМОТРА" shop-button: - name: "Battle Pass Shop" + name: "&eМагазин Battle Pass" lore: - "&7" - - "&7Spend your Battle Coins on" - - "&7exclusive rewards and items!" + - "&7Тратьте Battle Coins на" + - "&7эксклюзивные награды и предметы!" - "&7" - - "&8▸ &7Your Coins: %coins%" + - "&8▪ &7Ваши монеты: %coins%" - "&7" - - "▶ CLICK TO OPEN" + - "▶ НАЖМИТЕ, ЧТОБЫ ОТКРЫТЬ" daily-reward: - name: "☀ Daily Reward" + name: "&eЕжедневная награда" lore-available: - "&7" - - "&7Claim your daily XP bonus!" + - "&7Заберите ежедневный бонус XP!" - "&7" - - "&8▸ &7Reward: %xp% XP" + - "&8▪ &7Награда: %xp% XP" - "&7" - - "▶ CLICK TO CLAIM!" + - "▶ НАЖМИТЕ, ЧТОБЫ ЗАБРАТЬ!" lore-cooldown: - "&7" - - "&7You have already claimed" - - "&7your daily reward!" + - "&7Вы уже забрали" + - "&7свою ежедневную награду!" - "&7" - - "&8▸ &7Reward: %xp% XP" - - "&8▸ &7Next claim: %time%" + - "&8▪ &7Награда: %xp% XP" + - "&8▪ &7Следующий сбор: %time%" - "&7" - - "⏰ ON COOLDOWN" + - "⏰ ПЕРЕЗАРЯДКА" reward-available: - name: "✓ Level %level% Reward" + name: "&aНаграда уровня %level%" lore-header: - "&7" - - "▼ Rewards ▼" + - "▼ Награды ▼" lore-footer: - "&7" - - "&8▸ &7Required Level: %level%" + - "&8▪ &7Требуемый уровень: %level%" - "&7" - - "▶ CLICK TO CLAIM!" + - "▶ НАЖМИТЕ, ЧТОБЫ ЗАБРАТЬ!" reward-claimed: - name: "&8Level %level% Reward" + name: "&8Награда уровня %level%" lore-header: - "&7" - - "&8▼ Rewards ▼" + - "&8▼ Награды ▼" lore-footer: - "&7" - - "&8▸ &7Required Level: &8%level%" + - "&8▪ &7Требуемый уровень: &8%level%" - "&7" - - "&8✓ ALREADY CLAIMED" + - "&8✓ УЖЕ ПОЛУЧЕНО" reward-premium-locked: - name: "Level %level% Premium Reward" + name: "&6Премиум-награда уровня %level%" lore-header: - "&7" - - "▼ Rewards ▼" + - "▼ Награды ▼" lore-footer: - "&7" - - "&8▸ &7Required Level: %level%" + - "&8▪ &7Требуемый уровень: %level%" - "&7" - - "⭐ PREMIUM ONLY" + - "⭐ ТОЛЬКО PREMIUM" reward-level-locked: - name: "Level %level% Reward" + name: "&cНаграда уровня %level%" lore-header: - "&7" - - "&8▼ Rewards ▼" + - "&8▼ Награды ▼" lore-footer: - "&7" - - "&8▸ &7Required Level: %level%" + - "&8▪ &7Требуемый уровень: %level%" - "&7" - - "LOCKED" + - "ЗАКРЫТО" mission-timer: - name: "⏰ Time Until Reset" + name: "&eСброс миссий" lore: - "&7" - - "&7Missions reset in:" + - "&7Миссии сбросятся через:" - "%reset_time%" - "&7" - - "&7Complete missions before" - - "&7they reset to earn XP!" + - "&7Выполните миссии до" + - "&7сброса, чтобы получить XP!" mission-completed: - name: "✓ %mission%" + name: "&a%mission%" lore: - "&7" - - "&8▸ &7Progress: %progress%/%required%" - - "&8▸ &7Reward: %reward_xp% XP" + - "&8▪ &7Прогресс: %progress%/%required%" + - "&8▪ &7Награда: %reward_xp% XP" - "&7" - - "&8▸ &7Resets in: %reset_time%" + - "&8▪ &7Сброс через: %reset_time%" - "&7" - - "✓ COMPLETED" + - "✓ ВЫПОЛНЕНО" mission-in-progress: - name: "&c&l %mission%" + name: "&e%mission%" lore: - "&7" - - "&8▸ &7Progress: %progress%/%required%" - - "&8▸ &7Reward: %reward_xp% XP" + - "&8▪ &7Прогресс: %progress%/%required%" + - "&8▪ &7Награда: %reward_xp% XP" - "&7" - - "&8▸ &7Resets in: %reset_time%" + - "&8▪ &7Сброс через: %reset_time%" - "&7" - - "⚡ IN PROGRESS" + - "⚡ В ПРОЦЕССЕ" leaderboard-title: - name: "Top 10 Players" + name: "&eТоп 10 игроков" lore: - "&7" - - "&8▸ &7Season ends: %season_time%" - - "&8▸ &7Next coins: %coins_time%" + - "&8▪ &7До конца сезона: %season_time%" + - "&8▪ &7Следующие монеты: %coins_time%" - "&7" - - "&7Compete for the top spots" - - "&7and earn Battle Coins daily!" + - "&7Соревнуйтесь за первые места" + - "&7и получайте Battle Coins ежедневно!" leaderboard-player: name: "%rank% %player%" lore: - "&7" - - "&8▸ &7Level: %level%" - - "&8▸ &7Total Levels: %total_levels%" - - "&8▸ &7XP: %xp%" - - "&8▸ &7Battle Coins: %coins%" + - "&8▪ &7Уровень: %level%" + - "&8▪ &7Всего уровней: %total_levels%" + - "&8▪ &7XP: %xp%" + - "&8▪ &7Battle Coins: %coins%" - "&7" - "%status%" @@ -322,76 +322,76 @@ items: other: "&7#%rank%" leaderboard-status: - you: "★ THIS IS YOU! ★" - other: "&7Keep grinding to beat them!" + you: "★ ЭТО ВЫ! ★" + other: "&7Прокачивайтесь, чтобы обогнать их!" coins-info: - name: "Battle Coins Info" + name: "&eBattle Coins" lore: - "&7" - - "&7Battle Coins are special currency" - - "&7awarded to top players daily!" + - "&7Battle Coins — это особая валюта," + - "&7которую ежедневно получают лучшие игроки!" - "&7" - - "▼ How to earn ▼" - - "&7• Be in the top 10 leaderboard" - - "&7• #1 gets 10 coins" - - "&7• #2 gets 9 coins" - - "&7• ... and so on" + - "▼ Как получить ▼" + - "&7• Быть в топ-10 таблицы лидеров" + - "&7• #1 получает 10 монет" + - "&7• #2 получает 9 монет" + - "&7• ... и так далее" - "&7" - - "▼ What they're for ▼" - - "&7• Purchase exclusive items" - - "&7• Get special perks" - - "&7• Show off your dedication!" + - "▼ Для чего нужны ▼" + - "&7• Покупка эксклюзивных предметов" + - "&7• Получение особых бонусов" + - "&7• Демонстрация вашего прогресса!" - "&7" - - "&8▸ &7Next distribution: %time%" + - "&8▪ &7Следующая выдача: %time%" back-button: - name: "← Back" + name: "&c← Назад" lore: - - "&7Return to Battle Pass" + - "&7Вернуться в Battle Pass" shop-balance: - name: "Your Balance" + name: "&eВаш баланс" lore: - "&7" - - "&8▸ &7Battle Coins: %coins%" + - "&8▪ &7Battle Coins: %coins%" - "&7" - - "&7Earn more by staying" - - "&7in the top 10!" + - "&7Получайте больше монет," + - "&7удерживаясь в топ-10!" time: - days-hours: "%days%d %hours%h" - hours-minutes: "%hours%h %minutes%m" - day: "day" - days: "days" - hour: "hour" - hours: "hours" - minute: "minute" - minutes: "minutes" - available-now: "Available now!" + days-hours: "%days%д %hours%ч" + hours-minutes: "%hours%ч %minutes%м" + day: "день" + days: "дней" + hour: "час" + hours: "часов" + minute: "минута" + minutes: "минут" + available-now: "Доступно сейчас!" reward-types: - free: "Free" - premium: "Premium" + free: "Бесплатно" + premium: "Премиум" reward-level-locked: - name: "Level %level% Reward" + name: "Награда уровня %level%" lore-header: - "&7" - - "&8▼ Rewards ▼" + - "&8▼ Награды ▼" lore-footer: - "&7" - - "&8▸ &7Required Level: %level%" + - "&8▪ &7Требуемый уровень: %level%" - "&7" - - "LOCKED" + - "ЗАКРЫТО" reward-claimed: - name: "&8Level %level% %type% Reward" + name: "&8Награда %type% уровня %level%" lore-header: - "&7" - - "&8▼ Rewards ▼" + - "&8▼ Награды ▼" lore-footer: - "&7" - - "&8▸ &7Required Level: &8%level%" + - "&8▪ &7Требуемый уровень: &8%level%" - "&7" - - "&8✓ ALREADY CLAIMED" \ No newline at end of file + - "&8✓ УЖЕ ПОЛУЧЕНО" diff --git a/src/main/resources/messages_en.yml b/src/main/resources/messages_en.yml new file mode 100644 index 0000000..8a37712 --- /dev/null +++ b/src/main/resources/messages_en.yml @@ -0,0 +1,169 @@ +prefix: "&6[BattlePass] &8» &r" + +messages: + plugin-enabled: "&aBattle Pass enabled." + config-reloaded: "&aConfiguration reloaded." + + player-only: "&cThis command can only be used by players." + no-permission: "&cYou do not have permission." + player-not-found: "&cPlayer not found." + invalid-amount: "&cInvalid number." + amount-must-be-positive: "&cAmount must be greater than zero." + invalid-item-type: "&cInvalid item type. Use: premium, coins, levelboost." + + usage: + battlepass: "&eUsage: &f/battlepass" + add-premium: "&eUsage: &f/battlepass addpremium " + remove-premium: "&eUsage: &f/battlepass removepremium " + add-xp: "&eUsage: &f/battlepass addxp " + remove-xp: "&eUsage: &f/battlepass removexp " + add-coins: "&eUsage: &f/battlepass addcoins " + remove-coins: "&eUsage: &f/battlepass removecoins " + giveitem: "&eUsage: &f/battlepass giveitem " + reset-player: "&eUsage: &f/battlepass resetplayer " + edit-rewards-season: "&eUsage: &f/battlepass edit rewards season " + + reset-player: + sender: "&aBattle Pass progress for &e%player% &ahas been reset." + target: "&cYour Battle Pass progress was reset by an administrator." + + help: + header: "&6Battle Pass Commands" + battlepass: "&b/battlepass &7- Open Battle Pass GUI" + help: "&b/bp help &7- Show this help" + reload: "&b/bp reload &7- Reload plugin configuration" + reset-season: "&b/bp reset season &7- Force season reset" + reset-missions: "&b/bp reset missions &7- Force daily mission reset" + reset-player: "&b/bp resetplayer &7- Reset player's Battle Pass progress" + add-premium: "&b/bp addpremium &7- Grant Premium Pass" + remove-premium: "&b/bp removepremium &7- Remove Premium Pass" + add-xp: "&b/bp addxp &7- Add XP" + remove-xp: "&b/bp removexp &7- Remove XP" + add-coins: "&b/bp addcoins &7- Add Battle Coins" + remove-coins: "&b/bp removecoins &7- Remove Battle Coins" + giveitem: "&b/bp giveitem &7- Give custom item" + exclude-top: "&b/bp excludefromtop &7- Hide player from leaderboard" + include-top: "&b/bp includetop &7- Return player to leaderboard" + edit-rewards-season: "&b/bp edit rewards season &7- Edit selected season rewards" + + premium: + given-sender: "&aPremium Pass granted to &e%target%&a." + given-target: "&aYou have received Premium Battle Pass." + removed-sender: "&cPremium Pass removed from &e%target%&c." + removed-target: "&cYour Premium Battle Pass has been removed." + required: "&cPremium Pass is required for this reward." + + xp: + added-sender: "&aAdded &e%amount% XP &ato &e%target%&a." + added-target: "&a+%amount% XP" + removed-sender: "&cRemoved &e%amount% XP &cfrom &e%target%&c." + removed-target: "&c-%amount% XP" + + level-up: "&aLevel up! New level: &e%level%" + new-rewards: "&aNew rewards are available." + + rewards-available: "&aYou have &e%amount% &aavailable rewards." + rewards-notification: "&aYou have &e%amount% &anew rewards to claim." + + mission: + completed: "&aMission completed: &f%mission% &7(+%reward_xp% XP)" + reset: "&eDaily missions have been reset." + forced-reset: "&eDaily missions were reset by an administrator." + reset-complete: "&aMissions reset complete." + reset-admin: "&e%admin% forced a mission reset." + admin-reset: "&eDaily missions were reset." + actionbar-progress: "&c%mission%: &7%current%&f/&8%required%" + actionbar-completed: "&aCompleted: &f%mission%" + + season: + reset: "&cSeason ended. Starting a new season." + forced-reset: "&cSeason was force-reset by administrator." + reset-warning: "&cSeason will reset in 2 seconds. All progress will be lost." + reset-complete: "&aSeason reset complete." + reset-admin: "&cSeason was reset by %admin%." + ends-in: "&7Season ends in: &f%season_time%" + achievement: "&e%player% &7has fully completed the Battle Pass." + premium-achievement: "&e%player% &7has completed Premium Battle Pass." + new-season: "&aSeason %season% has started." + rotation-disabled: "&cSeason rotation is disabled in config." + invalid-season: "&cInvalid season number. Allowed: 1..%max%." + editing-season: "&aEditing rewards for season &e%season%&a." + + rewards: + free-claimed: "&aFree rewards claimed." + premium-claimed: "&aPremium rewards claimed." + already-claimed: "&cThis reward is already claimed." + cannot-claim: "&cYou cannot claim this reward yet." + locked: "&cLOCKED &7(Level %level% required)" + item-reward: "&7• &f%amount%x %item%" + item-reward-dropped: "&7• &f%amount%x %item% &e(dropped on ground)" + command-reward: "&7• %reward%" + already-claimed-error: "&cThis reward was already claimed." + + daily-reward: + claimed: "&aDaily reward claimed: &e%amount% XP" + already-claimed: "&cYou already claimed the daily reward." + + coins: + distribution-announcement: "&6Battle Coins payout for top-10 players." + distribution-player: "&e#%rank% %player% &7received &6%amount% Battle Coins" + received: "&a+%amount% Battle Coins" + balance: "&7Your Battle Coins: &e%amount%" + added-sender: "&aAdded &e%amount% Battle Coins &ato &e%target%&a." + added-target: "&a+%amount% Battle Coins" + removed-sender: "&cRemoved &e%amount% Battle Coins &cfrom &e%target%&c." + removed-target: "&c-%amount% Battle Coins" + insufficient-remove: "&c%target% only has %current% Battle Coins." + + shop: + insufficient-coins: "&cNot enough Battle Coins. Need: %required%, have: %current%." + purchase-success: "&aPurchase successful: %item% for %price% Battle Coins." + shop-title: "&6Battle Pass Shop" + + items: + given: "&aGiven &e%amount%x %item% &ato &e%target%&a." + given-dropped: "&aGiven &e%amount%x %item% &ato &e%target% &e(some items dropped)." + received: "&aYou received &e%amount%x %item%&a." + already-have-premium: "&cYou already have Premium Battle Pass." + premium-activated: "&aPremium Battle Pass activated." + coins-redeemed: "&aRedeemed %amount% Battle Coins." + max-level-reached: "&cYou already reached max level." + xp-boost-used: "&aUsed %items% XP boosters for %amount% XP." + names: + premium-pass: "Premium Pass Voucher" + battle-coin: "Battle Coin Token" + level-boost: "XP Boost Elixir" + + top: + usage: "&eUsage: /battlepass %command% " + updated: "&aPlayer %player% is now %status% leaderboard." + excluded-status: "excluded from" + included-status: "included in" + +time: + days-hours: "%days%d %hours%h" + hours-minutes: "%hours%h %minutes%m" + day: "day" + days: "days" + hour: "hour" + hours: "hours" + minute: "minute" + minutes: "minutes" + available-now: "&aAvailable now!" + unknown: "Unknown" + +reward-types: + free: "&bFree" + premium: "&6Premium" + +placeholders: + loading: "Loading..." + yes: "Yes" + no: "No" + active: "Active" + inactive: "Inactive" + unknown: "Unknown" + outside-top: "Outside top" + mission-completed: "Completed" + mission-in-progress: "In progress" + empty: "Empty" diff --git a/src/main/resources/messages_ru.yml b/src/main/resources/messages_ru.yml new file mode 100644 index 0000000..9e5d60f --- /dev/null +++ b/src/main/resources/messages_ru.yml @@ -0,0 +1,420 @@ +prefix: "&6[BattlePass] &8» &r" + +messages: + plugin-enabled: "✓ Battle Pass успешно включен!" + config-reloaded: "✓ Конфигурация перезагружена!" + + player-only: "✗ Эту команду может использовать только игрок!" + no-permission: "✗ У вас нет прав на использование этой команды!" + player-not-found: "✗ Игрок не найден!" + invalid-amount: "✗ Некорректное число! Введите число." + amount-must-be-positive: "✗ Значение должно быть больше нуля!" + invalid-item-type: "✗ Неверный тип предмета! Используйте 'premium', 'coins' или 'levelboost'." + + top: + usage: "Использование: &f/battlepass %command% <игрок>" + updated: "✓ Игрок %player% теперь %status% таблицу лидеров." + excluded-status: "исключен из" + included-status: "включен в" + + usage: + battlepass: "Использование: &f/battlepass" + add-premium: "Использование: &f/battlepass addpremium <игрок>" + remove-premium: "Использование: &f/battlepass removepremium <игрок>" + add-xp: "Использование: &f/battlepass addxp <игрок> <кол-во>" + remove-xp: "Использование: &f/battlepass removexp <игрок> <кол-во>" + add-coins: "Использование: &f/battlepass addcoins <игрок> <кол-во>" + remove-coins: "Использование: &f/battlepass removecoins <игрок> <кол-во>" + giveitem: "Использование: &f/battlepass giveitem <тип> <игрок> <кол-во>" + reset-player: "Использование: &f/battlepass resetplayer <игрок>" + edit-rewards-season: "Использование: &f/battlepass edit rewards season <номер>" + + reset-player: + sender: "✓ Прогресс Battle Pass игрока %player% успешно сброшен" + target: "⚠ Ваш прогресс Battle Pass был сброшен администратором!" + + help: + header: "⚡ КОМАНДЫ BATTLE PASS ⚡" + battlepass: "/battlepass &7- Открыть GUI Battle Pass" + help: "/bp help &7- Показать это меню помощи" + reload: "/bp reload &7- Перезагрузить конфигурацию" + reset-season: "/bp reset season &7- Принудительно сбросить сезон" + reset-missions: "/bp reset missions &7- Принудительно сбросить ежедневные миссии" + reset-player: "/bp resetplayer <игрок> &7- Сбросить прогресс Battle Pass игрока" + add-premium: "/bp addpremium <игрок> &7- Выдать Premium Pass" + remove-premium: "/bp removepremium <игрок> &7- Убрать Premium Pass" + add-xp: "/bp addxp <игрок> <кол-во> &7- Добавить XP игроку" + remove-xp: "/bp removexp <игрок> <кол-во> &7- Убрать XP у игрока" + add-coins: "/bp addcoins <игрок> <кол-во> &7- Добавить Battle Coins" + remove-coins: "/bp removecoins <игрок> <кол-во> &7- Убрать Battle Coins" + giveitem: "/bp giveitem <тип> <игрок> <кол-во> &7- Выдать особые предметы" + exclude-top: "/bp excludefromtop <игрок> &7- Скрыть игрока из топа" + include-top: "/bp includetop <игрок> &7- Вернуть игрока в топ" + edit-rewards-season: "/bp edit rewards season <номер> &7- Редактировать награды выбранного сезона" + + premium: + given-sender: "✓ Premium Pass выдан игроку %target%" + given-target: "★ ПОЗДРАВЛЯЕМ ★\nУ вас теперь есть Premium Battle Pass!" + removed-sender: "✗ Premium Pass удален у %target%" + removed-target: "Ваш Premium Battle Pass был удален!" + required: "⚠ Для получения этой награды нужен Premium Pass!" + + xp: + added-sender: "✓ Добавлено %amount% XP игроку %target%" + added-target: "+ %amount% XP" + removed-sender: "✗ Убрано %amount% XP у %target%" + removed-target: "- %amount% XP" + + level-up: "⬆ НОВЫЙ УРОВЕНЬ! Теперь ваш уровень: %level%" + new-rewards: "НОВЫЕ НАГРАДЫ! &fВам доступны новые награды!" + + rewards-available: "С возвращением! &fУ вас доступно %amount% наград!" + rewards-notification: "У вас есть %amount% новых наград к получению!" + + mission: + completed: "✓ МИССИЯ ВЫПОЛНЕНА: &a%mission% (+%reward_xp% XP)" + reset: "⟳ Ежедневные миссии были сброшены!" + forced-reset: "⟳ Администратор сбросил ежедневные миссии!" + reset-complete: "✓ Миссии успешно сброшены!" + reset-admin: "⟳ %admin% принудительно сбросил ежедневные миссии!" + actionbar-progress: "&c%mission%: &7%current%&f/&8%required%" + actionbar-completed: "✓ ВЫПОЛНЕНО: &a&l%mission%" + + season: + reset: "СБРОС СЕЗОНА\nСезон Battle Pass завершен! Новый сезон начинается прямо сейчас!" + forced-reset: "ПРИНУДИТЕЛЬНЫЙ СБРОС СЕЗОНА\nАдминистратор сбросил сезон Battle Pass!" + reset-warning: "⚠ ВНИМАНИЕ: &fСезон будет сброшен через 2 секунды. Прогресс всех игроков будет утерян!" + reset-complete: "✓ Сезон успешно сброшен!" + reset-admin: "СБРОС СЕЗОНА\n%admin% принудительно сбросил сезон Battle Pass!" + ends-in: "&7До конца сезона: %season_time%" + achievement: "%player% полностью завершил Battle Pass!" + premium-achievement: "%player% стал ЛЕГЕНДОЙ, завершив Premium Battle Pass!" + new-season: "Начался сезон %season%!" + rotation-disabled: "✗ Ротация сезонов отключена в конфиге!" + invalid-season: "✗ Неверный номер сезона! Допустимо от 1 до %max%." + editing-season: "✓ Редактирование наград для сезона %season%. Изменения сохраняются напрямую в папку сезона." + + rewards: + free-claimed: "✓ Бесплатные награды получены!" + premium-claimed: "★ Премиум-награды получены!" + already-claimed: "✗ Вы уже получили эту награду!" + cannot-claim: "✗ Вы не можете получить эту награду!" + locked: "ЗАКРЫТО &7(Нужен уровень %level%)" + item-reward: "&7• &f%amount%x %item%" + item-reward-dropped: "&7• &f%amount%x %item% (Выброшено на землю)" + command-reward: "&7• %reward%" + already-claimed-error: "✗ Эта награда уже получена! Если это ошибка, обратитесь к администрации." + + daily-reward: + claimed: "✓ Ежедневная награда получена! &fВы получили %amount% XP" + already-claimed: "✗ Вы уже забрали ежедневную награду!" + + coins: + distribution-announcement: "BATTLE COINS Топ-10 игроков получают ежедневные Battle Coins!" + distribution-player: "#%rank% %player% &7получил %amount% Battle Coins" + received: "+ %amount% Battle Coins!" + balance: "&7Ваши Battle Coins: %amount%" + added-sender: "✓ Добавлено %amount% Battle Coins игроку %target%" + added-target: "+ %amount% Battle Coins!" + removed-sender: "✗ Убрано %amount% Battle Coins у %target%" + removed-target: "- %amount% Battle Coins!" + insufficient-remove: "✗ У %target% только %current% Battle Coins!" + + shop: + insufficient-coins: "✗ Недостаточно Battle Coins! &7Нужно: %required% &7Есть: %current%" + purchase-success: "✓ Покупка успешна! &fКуплено %item% &fза %price% Battle Coins" + shop-title: "Магазин Battle Pass" + + items: + given: "✓ Выдано %amount%x %item% игроку %target%" + given-dropped: "✓ Выдано %amount%x %item% игроку %target% (Часть предметов выпала)" + received: "✓ Вы получили %amount%x %item%" + already-have-premium: "✗ У вас уже есть Premium Battle Pass!" + premium-activated: "★ PREMIUM АКТИВИРОВАН ★\nТеперь вам доступны все премиум-награды!" + coins-redeemed: "✓ Вы использовали %amount% Battle Coins!" + max-level-reached: "✗ Вы уже достигли максимального уровня!" + xp-boost-used: "★ XP-БУСТ!\nИспользовано %items% эликсиров и получено %amount% XP!" + names: + premium-pass: "Ваучер Premium Pass" + battle-coin: "Жетон Battle Coin" + level-boost: "Эликсир ускорения опыта" + +gui: + battlepass: "&6Battle Pass &8| &7Страница %page%" + missions: "&6Ежедневные миссии" + leaderboard: "&6Топ игроков" + shop: "&6Магазин Battle Pass" + +items: + progress: + name: "&eВаш прогресс" + lore: + - "&7" + - "&8▪ &7Уровень: %level%&7/54" + - "&8▪ &7XP: %xp%&7/%xp_needed%" + - "&7" + - "&8▪ &7Премиум пропуск: %premium_status%" + - "&8▪ &7До конца сезона: %season_time%" + - "&7" + - "&7Выполняйте миссии, чтобы получать XP" + - "&7и открывать крутые награды!" + + premium-status: + active: "&aАктивен" + inactive: "&cНе активен" + + separator: + name: " " + + previous-page: + name: "&e← Предыдущая страница" + lore: + - "&7Нажмите, чтобы перейти на страницу %page%" + + next-page: + name: "&eСледующая страница →" + lore: + - "&7Нажмите, чтобы перейти на страницу %page%" + + missions-button: + name: "&eЕжедневные миссии" + lore: + - "&7" + - "&7Выполняйте ежедневные миссии" + - "&7и получайте бонусный XP!" + - "&7" + - "&8▪ &7Сброс через: %reset_time%" + - "&7" + - "▶ НАЖМИТЕ ДЛЯ ПРОСМОТРА" + + leaderboard-button: + name: "&eТаблица лидеров" + lore: + - "&7" + - "&7Посмотрите топ-10 игроков" + - "&7с наивысшими уровнями Battle Pass!" + - "&7" + - "&8▪ &7Следующие монеты: %coins_time%" + - "&7" + - "▶ НАЖМИТЕ ДЛЯ ПРОСМОТРА" + + shop-button: + name: "&eМагазин Battle Pass" + lore: + - "&7" + - "&7Тратьте Battle Coins на" + - "&7эксклюзивные награды и предметы!" + - "&7" + - "&8▪ &7Ваши монеты: %coins%" + - "&7" + - "▶ НАЖМИТЕ, ЧТОБЫ ОТКРЫТЬ" + + daily-reward: + name: "&eЕжедневная награда" + lore-available: + - "&7" + - "&7Заберите ежедневный бонус XP!" + - "&7" + - "&8▪ &7Награда: %xp% XP" + - "&7" + - "▶ НАЖМИТЕ, ЧТОБЫ ЗАБРАТЬ!" + lore-cooldown: + - "&7" + - "&7Вы уже забрали" + - "&7свою ежедневную награду!" + - "&7" + - "&8▪ &7Награда: %xp% XP" + - "&8▪ &7Следующий сбор: %time%" + - "&7" + - "⏰ ПЕРЕЗАРЯДКА" + + reward-available: + name: "&aНаграда уровня %level%" + lore-header: + - "&7" + - "▼ Награды ▼" + lore-footer: + - "&7" + - "&8▪ &7Требуемый уровень: %level%" + - "&7" + - "▶ НАЖМИТЕ, ЧТОБЫ ЗАБРАТЬ!" + + reward-claimed: + name: "&8Награда уровня %level%" + lore-header: + - "&7" + - "&8▼ Награды ▼" + lore-footer: + - "&7" + - "&8▪ &7Требуемый уровень: &8%level%" + - "&7" + - "&8✓ УЖЕ ПОЛУЧЕНО" + + reward-premium-locked: + name: "&6Премиум-награда уровня %level%" + lore-header: + - "&7" + - "▼ Награды ▼" + lore-footer: + - "&7" + - "&8▪ &7Требуемый уровень: %level%" + - "&7" + - "⭐ ТОЛЬКО PREMIUM" + + reward-level-locked: + name: "&cНаграда уровня %level%" + lore-header: + - "&7" + - "&8▼ Награды ▼" + lore-footer: + - "&7" + - "&8▪ &7Требуемый уровень: %level%" + - "&7" + - "ЗАКРЫТО" + + mission-timer: + name: "&eСброс миссий" + lore: + - "&7" + - "&7Миссии сбросятся через:" + - "%reset_time%" + - "&7" + - "&7Выполните миссии до" + - "&7сброса, чтобы получить XP!" + + mission-completed: + name: "&a%mission%" + lore: + - "&7" + - "&8▪ &7Прогресс: %progress%/%required%" + - "&8▪ &7Награда: %reward_xp% XP" + - "&7" + - "&8▪ &7Сброс через: %reset_time%" + - "&7" + - "✓ ВЫПОЛНЕНО" + + mission-in-progress: + name: "&e%mission%" + lore: + - "&7" + - "&8▪ &7Прогресс: %progress%/%required%" + - "&8▪ &7Награда: %reward_xp% XP" + - "&7" + - "&8▪ &7Сброс через: %reset_time%" + - "&7" + - "⚡ В ПРОЦЕССЕ" + + leaderboard-title: + name: "&eТоп 10 игроков" + lore: + - "&7" + - "&8▪ &7До конца сезона: %season_time%" + - "&8▪ &7Следующие монеты: %coins_time%" + - "&7" + - "&7Соревнуйтесь за первые места" + - "&7и получайте Battle Coins ежедневно!" + + leaderboard-player: + name: "%rank% %player%" + lore: + - "&7" + - "&8▪ &7Уровень: %level%" + - "&8▪ &7Всего уровней: %total_levels%" + - "&8▪ &7XP: %xp%" + - "&8▪ &7Battle Coins: %coins%" + - "&7" + - "%status%" + + leaderboard-rank: + first: "#1" + second: "#2" + third: "#3" + other: "&7#%rank%" + + leaderboard-status: + you: "★ ЭТО ВЫ! ★" + other: "&7Прокачивайтесь, чтобы обогнать их!" + + coins-info: + name: "&eBattle Coins" + lore: + - "&7" + - "&7Battle Coins — это особая валюта," + - "&7которую ежедневно получают лучшие игроки!" + - "&7" + - "▼ Как получить ▼" + - "&7• Быть в топ-10 таблицы лидеров" + - "&7• #1 получает 10 монет" + - "&7• #2 получает 9 монет" + - "&7• ... и так далее" + - "&7" + - "▼ Для чего нужны ▼" + - "&7• Покупка эксклюзивных предметов" + - "&7• Получение особых бонусов" + - "&7• Демонстрация вашего прогресса!" + - "&7" + - "&8▪ &7Следующая выдача: %time%" + + back-button: + name: "&c← Назад" + lore: + - "&7Вернуться в Battle Pass" + + shop-balance: + name: "&eВаш баланс" + lore: + - "&7" + - "&8▪ &7Battle Coins: %coins%" + - "&7" + - "&7Получайте больше монет," + - "&7удерживаясь в топ-10!" + +time: + days-hours: "%days%д %hours%ч" + hours-minutes: "%hours%ч %minutes%м" + day: "день" + days: "дней" + hour: "час" + hours: "часов" + minute: "минута" + minutes: "минут" + available-now: "Доступно сейчас!" + unknown: "Неизвестно" + +reward-types: + free: "Бесплатно" + premium: "Премиум" + +placeholders: + loading: "Загрузка..." + yes: "Да" + no: "Нет" + active: "Активен" + inactive: "Неактивен" + unknown: "Неизвестно" + outside-top: "Вне топа" + mission-completed: "Выполнена" + mission-in-progress: "В процессе" + empty: "Пусто" + +reward-level-locked: + name: "Награда уровня %level%" + lore-header: + - "&7" + - "&8▼ Награды ▼" + lore-footer: + - "&7" + - "&8▪ &7Требуемый уровень: %level%" + - "&7" + - "ЗАКРЫТО" + +reward-claimed: + name: "&8Награда %type% уровня %level%" + lore-header: + - "&7" + - "&8▼ Награды ▼" + lore-footer: + - "&7" + - "&8▪ &7Требуемый уровень: &8%level%" + - "&7" + - "&8✓ УЖЕ ПОЛУЧЕНО" diff --git a/src/main/resources/missions.yml b/src/main/resources/missions.yml index 452244b..79d0ac9 100644 --- a/src/main/resources/missions.yml +++ b/src/main/resources/missions.yml @@ -1,11 +1,11 @@ -daily-missions-count: 7 +daily-missions-count: 7 mission-pools: - # Combat Missions - Common Mobs + # Боевые миссии - обычные мобы kill-zombies: type: KILL_MOB target: ZOMBIE - display-name: "Kill Zombies" + display-name: "Убить зомби" min-required: 15 max-required: 40 min-xp: 150 @@ -15,7 +15,7 @@ mission-pools: kill-skeletons: type: KILL_MOB target: SKELETON - display-name: "Kill Skeletons" + display-name: "Убить скелетов" min-required: 15 max-required: 35 min-xp: 150 @@ -25,7 +25,7 @@ mission-pools: kill-spiders: type: KILL_MOB target: SPIDER - display-name: "Kill Spiders" + display-name: "Убить пауков" min-required: 10 max-required: 30 min-xp: 120 @@ -35,18 +35,18 @@ mission-pools: kill-creepers: type: KILL_MOB target: CREEPER - display-name: "Kill Creepers" + display-name: "Убить криперов" min-required: 5 max-required: 20 min-xp: 180 max-xp: 300 weight: 9 - # Combat Missions - Nether/End/Specific + # Боевые миссии - Незер/Энд/особые kill-endermen: type: KILL_MOB target: ENDERMAN - display-name: "Kill Endermen" + display-name: "Убить эндерменов" min-required: 5 max-required: 15 min-xp: 250 @@ -56,7 +56,7 @@ mission-pools: kill-blazes: type: KILL_MOB target: BLAZE - display-name: "Kill Blazes" + display-name: "Убить ифритов" min-required: 10 max-required: 20 min-xp: 300 @@ -66,7 +66,7 @@ mission-pools: kill-witches: type: KILL_MOB target: WITCH - display-name: "Kill Witches" + display-name: "Убить ведьм" min-required: 3 max-required: 8 min-xp: 250 @@ -76,7 +76,7 @@ mission-pools: kill-piglins: type: KILL_MOB target: PIGLIN - display-name: "Kill Piglins" + display-name: "Убить пиглинов" min-required: 10 max-required: 25 min-xp: 200 @@ -86,18 +86,18 @@ mission-pools: kill-magma-cubes: type: KILL_MOB target: MAGMA_CUBE - display-name: "Kill Magma Cubes" + display-name: "Убить магмовых кубов" min-required: 5 max-required: 15 min-xp: 200 max-xp: 300 weight: 5 - # Mining Missions + # Миссии на добычу mine-coal: type: MINE_BLOCK target: COAL_ORE - display-name: "Mine Coal Ores" + display-name: "Добыть угольной руды" min-required: 30 max-required: 100 min-xp: 100 @@ -107,7 +107,7 @@ mission-pools: mine-iron: type: MINE_BLOCK target: IRON_ORE - display-name: "Mine Iron Ores" + display-name: "Добыть железной руды" min-required: 20 max-required: 60 min-xp: 150 @@ -117,7 +117,7 @@ mission-pools: mine-gold: type: MINE_BLOCK target: GOLD_ORE - display-name: "Mine Gold Ores" + display-name: "Добыть золотой руды" min-required: 10 max-required: 30 min-xp: 200 @@ -127,7 +127,7 @@ mission-pools: mine-diamonds: type: MINE_BLOCK target: DIAMOND_ORE - display-name: "Mine Diamond Ores" + display-name: "Добыть алмазной руды" min-required: 5 max-required: 15 min-xp: 400 @@ -137,7 +137,7 @@ mission-pools: mine-deepslate-diamonds: type: MINE_BLOCK target: DEEPSLATE_DIAMOND_ORE - display-name: "Mine Deepslate Diamonds" + display-name: "Добыть глубинной алмазной руды" min-required: 5 max-required: 15 min-xp: 450 @@ -147,7 +147,7 @@ mission-pools: mine-lapis: type: MINE_BLOCK target: LAPIS_ORE - display-name: "Mine Lapis Ores" + display-name: "Добыть лазуритовой руды" min-required: 15 max-required: 40 min-xp: 150 @@ -157,7 +157,7 @@ mission-pools: mine-redstone: type: MINE_BLOCK target: REDSTONE_ORE - display-name: "Mine Redstone Ores" + display-name: "Добыть редстоуновой руды" min-required: 20 max-required: 50 min-xp: 150 @@ -167,7 +167,7 @@ mission-pools: mine-quartz: type: MINE_BLOCK target: NETHER_QUARTZ_ORE - display-name: "Mine Nether Quartz" + display-name: "Добыть незер-кварца" min-required: 30 max-required: 80 min-xp: 150 @@ -177,18 +177,18 @@ mission-pools: mine-ancient-debris: type: MINE_BLOCK target: ANCIENT_DEBRIS - display-name: "Mine Ancient Debris" + display-name: "Добыть древних обломков" min-required: 2 max-required: 5 min-xp: 600 max-xp: 1000 weight: 3 - # Farming & Nature + # Фермерство и природа break-logs: type: BREAK_BLOCK target: OAK_LOG - display-name: "Chop Oak Logs" + display-name: "Срубить дубовых брёвен" min-required: 64 max-required: 200 min-xp: 100 @@ -198,7 +198,7 @@ mission-pools: break-stone: type: BREAK_BLOCK target: STONE - display-name: "Break Stone" + display-name: "Сломать камня" min-required: 200 max-required: 500 min-xp: 100 @@ -208,7 +208,7 @@ mission-pools: eat-bread: type: EAT_ITEM target: BREAD - display-name: "Eat Bread" + display-name: "Съесть хлеба" min-required: 5 max-required: 20 min-xp: 100 @@ -218,7 +218,7 @@ mission-pools: eat-steak: type: EAT_ITEM target: COOKED_BEEF - display-name: "Eat Steaks" + display-name: "Съесть стейков" min-required: 5 max-required: 20 min-xp: 120 @@ -228,18 +228,18 @@ mission-pools: eat-golden-apple: type: EAT_ITEM target: GOLDEN_APPLE - display-name: "Eat Golden Apples" + display-name: "Съесть золотых яблок" min-required: 1 max-required: 3 min-xp: 500 max-xp: 800 weight: 4 - # Crafting & Smelting + # Крафт и плавка smelt-iron: type: SMELT_ITEM target: IRON_INGOT - display-name: "Smelt Iron Ingots" + display-name: "Переплавить железных слитков" min-required: 32 max-required: 128 min-xp: 150 @@ -249,7 +249,7 @@ mission-pools: smelt-gold: type: SMELT_ITEM target: GOLD_INGOT - display-name: "Smelt Gold Ingots" + display-name: "Переплавить золотых слитков" min-required: 16 max-required: 64 min-xp: 200 @@ -259,7 +259,7 @@ mission-pools: craft-bread: type: CRAFT_ITEM target: BREAD - display-name: "Craft Bread" + display-name: "Скрафтить хлеба" min-required: 20 max-required: 64 min-xp: 100 @@ -269,18 +269,18 @@ mission-pools: craft-tnt: type: CRAFT_ITEM target: TNT - display-name: "Craft TNT" + display-name: "Скрафтить ТНТ" min-required: 5 max-required: 20 min-xp: 300 max-xp: 500 weight: 5 - # Fishing + # Рыбалка fish-cod: type: FISH_ITEM target: COD - display-name: "Catch Cod" + display-name: "Поймать трески" min-required: 10 max-required: 30 min-xp: 150 @@ -290,18 +290,18 @@ mission-pools: fish-salmon: type: FISH_ITEM target: SALMON - display-name: "Catch Salmon" + display-name: "Поймать лосося" min-required: 10 max-required: 30 min-xp: 150 max-xp: 250 weight: 7 - # Husbandry & Interactions + # Животные и взаимодействия breed-cows: type: BREED_ANIMAL target: COW - display-name: "Breed Cows" + display-name: "Развести коров" min-required: 5 max-required: 20 min-xp: 150 @@ -311,7 +311,7 @@ mission-pools: breed-sheep: type: BREED_ANIMAL target: SHEEP - display-name: "Breed Sheep" + display-name: "Развести овец" min-required: 5 max-required: 20 min-xp: 150 @@ -321,7 +321,7 @@ mission-pools: shear-sheep: type: SHEAR_SHEEP target: SHEEP - display-name: "Shear Sheep" + display-name: "Подстричь овец" min-required: 10 max-required: 50 min-xp: 100 @@ -331,7 +331,7 @@ mission-pools: tame-dog: type: TAME_ANIMAL target: WOLF - display-name: "Tame Wolves" + display-name: "Приручить волков" min-required: 1 max-required: 5 min-xp: 300 @@ -341,7 +341,7 @@ mission-pools: trade-villager: type: TRADE_VILLAGER target: ANY - display-name: "Trade Times with Villagers" + display-name: "Поторговать раз с жителями" min-required: 5 max-required: 20 min-xp: 200 @@ -351,18 +351,18 @@ mission-pools: enchant-items: type: ENCHANT_ITEM target: ANY - display-name: "Enchant Items" + display-name: "Зачаровать предметов" min-required: 3 max-required: 10 min-xp: 250 max-xp: 500 weight: 6 - # General Progression + # Общий прогресс gain-xp: type: GAIN_XP target: ANY - display-name: "Gain XP Points" + display-name: "Получить очков опыта" min-required: 500 max-required: 2000 min-xp: 200 @@ -372,7 +372,7 @@ mission-pools: walk-distance: type: WALK_DISTANCE target: ANY - display-name: "Walk Blocks" + display-name: "Пройти блоков" min-required: 2000 max-required: 10000 min-xp: 150 @@ -382,7 +382,7 @@ mission-pools: deal-damage: type: DAMAGE_DEALT target: ANY - display-name: "Deal Damage" + display-name: "Нанести урона" min-required: 1000 max-required: 5000 min-xp: 200 @@ -392,9 +392,9 @@ mission-pools: play-time: type: PLAY_TIME target: ANY - display-name: "Play for Minutes" + display-name: "Играть минут" min-required: 60 max-required: 180 min-xp: 250 max-xp: 500 - weight: 7 \ No newline at end of file + weight: 7 diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index c38e20a..4dff8ee 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,29 +1,23 @@ name: BattlePass version: '8.1' main: com.Lino.battlePass.BattlePass -api-version: '1.21' +api-version: '1.16' author: Lino website: https://www.spigotmc.org/resources/battlepass.125992/ softdepend: [PlaceholderAPI, MythicMobs] -libraries: - - com.zaxxer:HikariCP:5.1.0 - - com.mysql:mysql-connector-j:8.3.0 - - org.slf4j:slf4j-api:2.0.9 - - org.slf4j:slf4j-simple:2.0.9 - commands: battlepass: - description: Open the BattlePass GUI or manage battle pass system - usage: /battlepass [help|reload|addpremium|removepremium|addxp|removexp|addcoins|removecoins] [player] [amount] + description: Открыть GUI BattlePass или управлять системой боевого пропуска + usage: /battlepass [help|reload|addpremium|removepremium|addxp|removexp|addcoins|removecoins] [игрок] [кол-во] aliases: [bp, pass] permission: battlepass.use - permission-message: You don't have permission to use this command! + permission-message: У вас нет прав на использование этой команды! permissions: battlepass.use: - description: Allows use of /battlepass command + description: Разрешает использовать команду /battlepass default: true battlepass.admin: - description: Access to admin commands (reload, addpremium, removepremium) - default: op \ No newline at end of file + description: Доступ к админ-командам (reload, addpremium, removepremium) + default: op diff --git a/src/main/resources/shop.yml b/src/main/resources/shop.yml index d2b67cb..5c7d666 100644 --- a/src/main/resources/shop.yml +++ b/src/main/resources/shop.yml @@ -1,67 +1,67 @@ -shop-items: - # Premium Battle Pass Voucher +shop-items: + # Ваучер Premium Battle Pass premium-pass-single: slot: 11 material: NETHER_STAR - display-name: "★ Premium Battle Pass Voucher ★" + display-name: "★ Ваучер Premium Battle Pass ★" lore: - "" - - "Mystical Voucher" - - "&7Unlock the legendary premium pass" - - "&7and gain access to exclusive rewards!" + - "Мистический ваучер" + - "&7Откройте легендарный премиум-пропуск" + - "&7и получите доступ к эксклюзивным наградам!" - "" - - "▼ Features ▼" - - "&7• Premium Battle Pass for this season" - - "&7• Access to all premium rewards" - - "&7• Exclusive items and perks" + - "▼ Особенности ▼" + - "&7• Premium Battle Pass на текущий сезон" + - "&7• Доступ ко всем премиум-наградам" + - "&7• Эксклюзивные предметы и бонусы" - "" - - "&7Price: 250 Battle Coins" + - "&7Цена: 250 Battle Coins" - "" - - "▶ CLICK TO PURCHASE" + - "▶ НАЖМИТЕ ДЛЯ ПОКУПКИ" price: 250 commands: - "bp giveitem premium 1" - # Battle Coin Token Bundles + # Наборы жетонов Battle Coin coins-small: slot: 15 material: GOLD_NUGGET - display-name: "✦ Small Coin Bundle ✦" + display-name: "✦ Малый набор монет ✦" lore: - "" - - "Currency Bundle" - - "&7A small stack of gleaming" - - "&7battle coin tokens" + - "Набор валюты" + - "&7Небольшая стопка сияющих" + - "&7жетонов Battle Coin" - "" - - "▼ Contains ▼" - - "&7• 10 Battle Coin Tokens" - - "&7• Worth 10 Battle Coins when redeemed" + - "▼ Содержит ▼" + - "&7• 10 жетонов Battle Coin" + - "&7• После использования = 10 Battle Coins" - "" - - "&7Price: 10 Battle Coins" + - "&7Цена: 10 Battle Coins" - "" - - "▶ CLICK TO PURCHASE" + - "▶ НАЖМИТЕ ДЛЯ ПОКУПКИ" price: 10 commands: - "bp giveitem coins 10" - # Experience Boost Elixirs + # Эликсиры усиления опыта xp-boost-single: slot: 20 material: EXPERIENCE_BOTTLE - display-name: "✧ Experience Boost Elixir ✧" + display-name: "✧ Эликсир ускорения опыта ✧" lore: - "" - - "Experience Elixir" - - "&7A single dose of concentrated" - - "&7experience essence" + - "Эликсир опыта" + - "&7Одна доза концентрированной" + - "&7эссенции опыта" - "" - - "▼ Effect ▼" - - "&7• Grants +100 Battle Pass XP" - - "&7• Instant experience boost" + - "▼ Эффект ▼" + - "&7• Даёт +100 XP Battle Pass" + - "&7• Мгновенное усиление опыта" - "" - - "&7Price: 15 Battle Coins" + - "&7Цена: 15 Battle Coins" - "" - - "▶ CLICK TO PURCHASE" + - "▶ НАЖМИТЕ ДЛЯ ПОКУПКИ" price: 15 commands: - "bp giveitem levelboost 1" @@ -69,21 +69,21 @@ shop-items: xp-boost-bundle-small: slot: 21 material: EXPERIENCE_BOTTLE - display-name: "✧ Small XP Bundle ✧" + display-name: "✧ Малый XP-набор ✧" lore: - "" - - "Experience Bundle" - - "&7A collection of experience" - - "&7boost elixirs" + - "Набор опыта" + - "&7Небольшой комплект" + - "&7эликсиров опыта" - "" - - "▼ Contains ▼" - - "&7• 5 Experience Elixirs" - - "&7• Total: +500 Battle Pass XP" + - "▼ Содержит ▼" + - "&7• 5 эликсиров опыта" + - "&7• Итого: +500 XP Battle Pass" - "" - - "&7Price: 70 Battle Coins" - - "&8&oSave 5 coins!" + - "&7Цена: 70 Battle Coins" + - "&8&oЭкономия 5 монет!" - "" - - "▶ CLICK TO PURCHASE" + - "▶ НАЖМИТЕ ДЛЯ ПОКУПКИ" price: 70 commands: - "bp giveitem levelboost 5" @@ -91,21 +91,21 @@ shop-items: xp-boost-bundle-medium: slot: 22 material: EXPERIENCE_BOTTLE - display-name: "✧ Medium XP Bundle ✧" + display-name: "✧ Средний XP-набор ✧" lore: - "" - - "Experience Bundle" - - "&7A generous collection of" - - "&7experience boost elixirs" + - "Набор опыта" + - "&7Щедрый комплект" + - "&7эликсиров опыта" - "" - - "▼ Contains ▼" - - "&7• 16 Experience Elixirs" - - "&7• Total: +1,600 Battle Pass XP" + - "▼ Содержит ▼" + - "&7• 16 эликсиров опыта" + - "&7• Итого: +1,600 XP Battle Pass" - "" - - "&7Price: 200 Battle Coins" - - "&8&oSave 40 coins!" + - "&7Цена: 200 Battle Coins" + - "&8&oЭкономия 40 монет!" - "" - - "▶ CLICK TO PURCHASE" + - "▶ НАЖМИТЕ ДЛЯ ПОКУПКИ" price: 200 commands: - "bp giveitem levelboost 16" @@ -113,21 +113,21 @@ shop-items: xp-boost-bundle-large: slot: 23 material: EXPERIENCE_BOTTLE - display-name: "✧ Large XP Bundle ✧" + display-name: "✧ Большой XP-набор ✧" lore: - "" - - "Experience Bundle" - - "&7A massive collection of" - - "&7experience boost elixirs" + - "Набор опыта" + - "&7Крупный комплект" + - "&7эликсиров опыта" - "" - - "▼ Contains ▼" - - "&7• 32 Experience Elixirs" - - "&7• Total: +3,200 Battle Pass XP" + - "▼ Содержит ▼" + - "&7• 32 эликсира опыта" + - "&7• Итого: +3,200 XP Battle Pass" - "" - - "&7Price: 380 Battle Coins" - - "&8&oSave 100 coins!" + - "&7Цена: 380 Battle Coins" + - "&8&oЭкономия 100 монет!" - "" - - "▶ CLICK TO PURCHASE" + - "▶ НАЖМИТЕ ДЛЯ ПОКУПКИ" price: 380 commands: - "bp giveitem levelboost 32" @@ -135,22 +135,22 @@ shop-items: xp-boost-bundle-mega: slot: 24 material: EXPERIENCE_BOTTLE - display-name: "✧ MEGA XP Bundle ✧" + display-name: "✧ МЕГА XP-набор ✧" lore: - "" - - "MEGA Experience Bundle" - - "&7The ultimate collection of" - - "&7experience boost elixirs!" + - "МЕГА набор опыта" + - "&7Максимальный комплект" + - "&7эликсиров опыта!" - "" - - "▼ Contains ▼" - - "&7• 64 Experience Elixirs" - - "&7• Total: +6,400 Battle Pass XP" - - "&7• ★ BEST VALUE ★" + - "▼ Содержит ▼" + - "&7• 64 эликсира опыта" + - "&7• Итого: +6,400 XP Battle Pass" + - "&7• ★ ЛУЧШАЯ ЦЕНА ★" - "" - - "&7Price: 700 Battle Coins" - - "&8&oSave 260 coins!" + - "&7Цена: 700 Battle Coins" + - "&8&oЭкономия 260 монет!" - "" - - "▶ CLICK TO PURCHASE" + - "▶ НАЖМИТЕ ДЛЯ ПОКУПКИ" price: 700 commands: - - "bp giveitem levelboost 64" \ No newline at end of file + - "bp giveitem levelboost 64" diff --git a/target/BattlePass-1.0-shaded.jar b/target/BattlePass-1.0-shaded.jar new file mode 100644 index 0000000..1833d7b Binary files /dev/null and b/target/BattlePass-1.0-shaded.jar differ diff --git a/target/BattlePass-1.0.jar b/target/BattlePass-1.0.jar new file mode 100644 index 0000000..1833d7b Binary files /dev/null and b/target/BattlePass-1.0.jar differ diff --git a/target/classes/BattlePassFREE.yml b/target/classes/BattlePassFREE.yml new file mode 100644 index 0000000..4c2ee84 --- /dev/null +++ b/target/classes/BattlePassFREE.yml @@ -0,0 +1,234 @@ +# Бесплатные награды Battle Pass +# +# 1) Обычная предметная награда: +# level-X: +# material: DIAMOND +# amount: 5 +# +# 2) Награда-команда: +# level-X: +# command: "eco give 1000" +# display: "$1000" +# +# 3) Несколько наград на одном уровне: +# level-X: +# items: +# reward1: +# material: DIAMOND +# amount: 5 +# reward2: +# command: "kit vip " +# display: "VIP Kit" +# +# Плейсхолдер автоматически заменяется на ник игрока. + +level-1: + material: IRON_INGOT + amount: 16 +level-2: + material: IRON_INGOT + amount: 8 +level-3: + material: COAL + amount: 32 +level-4: + material: REDSTONE + amount: 16 +level-5: + items: + item1: + material: LAPIS_LAZULI + amount: 16 + item2: + material: EXPERIENCE_BOTTLE + amount: 8 + money: + command: "eco give 1000" + display: "$1000" +level-6: + material: EMERALD + amount: 4 +level-7: + material: DIAMOND + amount: 2 +level-8: + material: IRON_BLOCK + amount: 2 +level-9: + material: GOLD_BLOCK + amount: 1 +level-10: + command: "eco give 5000" + display: "$5000 Денег" +level-11: + material: ENDER_PEARL + amount: 8 +level-12: + material: BLAZE_ROD + amount: 4 +level-13: + material: GHAST_TEAR + amount: 2 +level-14: + material: MAGMA_CREAM + amount: 8 +level-15: + items: + bottles: + material: EXPERIENCE_BOTTLE + amount: 16 + money: + command: "eco give 2500" + display: "$2500" +level-16: + material: QUARTZ + amount: 32 +level-17: + material: GLOWSTONE + amount: 16 +level-18: + material: PRISMARINE_SHARD + amount: 16 +level-19: + material: PRISMARINE_CRYSTALS + amount: 8 +level-20: + items: + diamonds: + material: DIAMOND + amount: 4 + money: + command: "eco give 10000" + display: "$10,000" + permission: + command: "lp user permission set kit.vip true" + display: "Доступ к VIP-набору" +level-21: + material: SLIME_BALL + amount: 16 +level-22: + material: GUNPOWDER + amount: 16 +level-23: + material: STRING + amount: 32 +level-24: + material: SPIDER_EYE + amount: 8 +level-25: + material: SHULKER_SHELL + amount: 1 +level-26: + material: PHANTOM_MEMBRANE + amount: 4 +level-27: + material: NAUTILUS_SHELL + amount: 2 +level-28: + material: RABBIT_FOOT + amount: 4 +level-29: + material: SCUTE + amount: 2 +level-30: + items: + enchantedbook: + material: ENCHANTED_BOOK + amount: 1 + money: + command: "eco give 7500" + display: "$7,500" + xp: + command: "xp give 100L" + display: "100 уровней опыта" +level-31: + material: IRON_HORSE_ARMOR + amount: 1 +level-32: + material: IRON_HORSE_ARMOR + amount: 1 +level-33: + material: SADDLE + amount: 1 +level-34: + material: NAME_TAG + amount: 2 +level-35: + material: GOLDEN_CARROT + amount: 8 +level-36: + material: GLISTERING_MELON_SLICE + amount: 8 +level-37: + material: FERMENTED_SPIDER_EYE + amount: 4 +level-38: + material: BLAZE_POWDER + amount: 8 +level-39: + material: ENDER_EYE + amount: 2 +level-40: + items: + diamond: + material: DIAMOND_BLOCK + amount: 1 + money: + command: "eco give 20000" + display: "$20,000" + effect: + command: "effect give minecraft:speed 3600 2" + display: "Скорость II (1 час)" +level-41: + material: EMERALD_BLOCK + amount: 1 +level-42: + material: ANCIENT_DEBRIS + amount: 1 +level-43: + material: NETHERITE_SCRAP + amount: 1 +level-44: + material: CRYING_OBSIDIAN + amount: 8 +level-45: + material: RESPAWN_ANCHOR + amount: 1 +level-46: + material: LODESTONE + amount: 1 +level-47: + material: HONEYCOMB + amount: 16 +level-48: + material: HONEY_BLOCK + amount: 4 +level-49: + material: SHULKER_SHELL + amount: 2 +level-50: + material: TOTEM_OF_UNDYING + amount: 1 +level-51: + material: IRON_BLOCK + amount: 16 +level-52: + material: PRISMARINE_CRYSTALS + amount: 32 +level-53: + material: NAUTILUS_SHELL + amount: 4 +level-54: + items: + star: + material: NETHER_STAR + amount: 1 + money: + command: "eco give 30000" + display: "$30,000" + title: + command: "lp user meta addprefix 100 \"&6[Battle Master] \"" + display: "Титул Battle Master" + announce: + command: "say полностью завершил Battle Pass!" + display: "Объявление на весь сервер" diff --git a/target/classes/BattlePassPREMIUM.yml b/target/classes/BattlePassPREMIUM.yml new file mode 100644 index 0000000..5968c46 --- /dev/null +++ b/target/classes/BattlePassPREMIUM.yml @@ -0,0 +1,243 @@ +# Премиум-награды Battle Pass +# +# 1) Обычная предметная награда: +# level-X: +# material: DIAMOND +# amount: 5 +# +# 2) Награда-команда: +# level-X: +# command: "eco give 1000" +# display: "$1000" +# +# 3) Несколько наград на одном уровне: +# level-X: +# items: +# reward1: +# material: DIAMOND +# amount: 5 +# reward2: +# command: "kit vip " +# display: "VIP Kit" +# +# Плейсхолдер автоматически заменяется на ник игрока. + +level-1: + items: + diamonds: + material: DIAMOND + amount: 8 + money: + command: "eco give 5000" + display: "$5000" + kit: + command: "kit premium " + display: "Премиум-набор" +level-2: + material: NETHERITE_INGOT + amount: 1 +level-3: + material: GOLDEN_APPLE + amount: 4 +level-4: + material: ENCHANTED_GOLDEN_APPLE + amount: 1 +level-5: + items: + beacon: + material: BEACON + amount: 1 + money: + command: "eco give 15000" + display: "$15,000" +level-6: + material: ELYTRA + amount: 1 +level-7: + material: NETHER_STAR + amount: 2 +level-8: + material: DRAGON_HEAD + amount: 1 +level-9: + material: HEART_OF_THE_SEA + amount: 1 +level-10: + items: + totem: + material: TOTEM_OF_UNDYING + amount: 2 + money: + command: "eco give 25000" + display: "$25,000" + fly: + command: "lp user permission set essentials.fly true" + display: "Право на полет" + announce: + command: "say достиг 10 уровня Battle Pass!" + display: "Объявление на сервер" +level-11: + material: TRIDENT + amount: 1 +level-12: + material: DIAMOND_HELMET + amount: 1 +level-13: + material: DIAMOND_CHESTPLATE + amount: 1 +level-14: + material: DIAMOND_LEGGINGS + amount: 1 +level-15: + material: DIAMOND_BOOTS + amount: 1 +level-16: + material: NETHERITE_INGOT + amount: 1 +level-17: + material: DIAMOND_HORSE_ARMOR + amount: 1 +level-18: + material: ENCHANTED_BOOK + amount: 3 +level-19: + material: EXPERIENCE_BOTTLE + amount: 64 +level-20: + items: + dragonegg: + material: DRAGON_EGG + amount: 1 + money: + command: "eco give 50000" + display: "$50,000" + rank: + command: "lp user parent add vip" + display: "Ранг VIP" + crate: + command: "crate give legendary 3" + display: "3x легендарных кейса" +level-21: + material: NETHERITE_HELMET + amount: 1 +level-22: + material: NETHERITE_CHESTPLATE + amount: 1 +level-23: + material: NETHERITE_LEGGINGS + amount: 1 +level-24: + material: NETHERITE_BOOTS + amount: 1 +level-25: + material: BEACON + amount: 2 +level-26: + material: NETHERITE_BOOTS + amount: 1 +level-27: + material: ANVIL + amount: 3 +level-28: + material: BREWING_STAND + amount: 3 +level-29: + material: ENDER_CHEST + amount: 2 +level-30: + material: SHULKER_BOX + amount: 1 +level-31: + material: CONDUIT + amount: 1 +level-32: + material: MUSIC_DISC_PIGSTEP + amount: 1 +level-33: + material: MUSIC_DISC_PIGSTEP + amount: 1 +level-34: + material: CREEPER_HEAD + amount: 1 +level-35: + material: ZOMBIE_HEAD + amount: 1 +level-36: + material: SKELETON_SKULL + amount: 1 +level-37: + material: WITHER_SKELETON_SKULL + amount: 3 +level-38: + material: NETHERITE_INGOT + amount: 3 +level-39: + material: NETHERITE_BLOCK + amount: 1 +level-40: + items: + elytra: + material: ELYTRA + amount: 2 + money: + command: "eco give 75000" + display: "$75,000" + effect: + command: "effect give minecraft:regeneration 7200 2" + display: "Регенерация II (2 часа)" +level-41: + material: DRAGON_BREATH + amount: 16 +level-42: + material: END_CRYSTAL + amount: 4 +level-43: + material: CHORUS_FRUIT + amount: 32 +level-44: + material: TOTEM_OF_UNDYING + amount: 3 +level-45: + material: NETHER_STAR + amount: 4 +level-46: + material: ENCHANTED_GOLDEN_APPLE + amount: 3 +level-47: + material: NETHERITE_INGOT + amount: 3 +level-48: + material: NETHERITE_SWORD + amount: 1 +level-49: + material: DIAMOND_BLOCK + amount: 8 +level-50: + material: DRAGON_EGG + amount: 2 +level-51: + material: NETHER_STAR + amount: 8 +level-52: + material: ENDER_EYE + amount: 1 +level-53: + material: COMPASS + amount: 1 +level-54: + items: + dragonegg: + material: DRAGON_EGG + amount: 3 + money: + command: "eco give 100000" + display: "$100,000" + rank: + command: "lp user parent add legend" + display: "Ранг Legend" + title: + command: "lp user meta addprefix 100 \"&5[Legend] \"" + display: "Титул Legend" + announce: + command: "say стал ЛЕГЕНДОЙ, завершив Premium Battle Pass!" + display: "Легендарное достижение" diff --git a/target/classes/com/Lino/battlePass/BattlePass$1.class b/target/classes/com/Lino/battlePass/BattlePass$1.class new file mode 100644 index 0000000..bc0e580 Binary files /dev/null and b/target/classes/com/Lino/battlePass/BattlePass$1.class differ diff --git a/target/classes/com/Lino/battlePass/BattlePass$2.class b/target/classes/com/Lino/battlePass/BattlePass$2.class new file mode 100644 index 0000000..6feb4ee Binary files /dev/null and b/target/classes/com/Lino/battlePass/BattlePass$2.class differ diff --git a/target/classes/com/Lino/battlePass/BattlePass.class b/target/classes/com/Lino/battlePass/BattlePass.class new file mode 100644 index 0000000..6faf236 Binary files /dev/null and b/target/classes/com/Lino/battlePass/BattlePass.class differ diff --git a/target/classes/com/Lino/battlePass/commands/BattlePassCommand.class b/target/classes/com/Lino/battlePass/commands/BattlePassCommand.class new file mode 100644 index 0000000..25b2c2b Binary files /dev/null and b/target/classes/com/Lino/battlePass/commands/BattlePassCommand.class differ diff --git a/target/classes/com/Lino/battlePass/commands/BattlePassTabCompleter.class b/target/classes/com/Lino/battlePass/commands/BattlePassTabCompleter.class new file mode 100644 index 0000000..0d06852 Binary files /dev/null and b/target/classes/com/Lino/battlePass/commands/BattlePassTabCompleter.class differ diff --git a/target/classes/com/Lino/battlePass/gui/BaseGui.class b/target/classes/com/Lino/battlePass/gui/BaseGui.class new file mode 100644 index 0000000..aea7e5f Binary files /dev/null and b/target/classes/com/Lino/battlePass/gui/BaseGui.class differ diff --git a/target/classes/com/Lino/battlePass/gui/BattlePassGui.class b/target/classes/com/Lino/battlePass/gui/BattlePassGui.class new file mode 100644 index 0000000..de8c4e2 Binary files /dev/null and b/target/classes/com/Lino/battlePass/gui/BattlePassGui.class differ diff --git a/target/classes/com/Lino/battlePass/gui/LeaderboardGui.class b/target/classes/com/Lino/battlePass/gui/LeaderboardGui.class new file mode 100644 index 0000000..fc6c532 Binary files /dev/null and b/target/classes/com/Lino/battlePass/gui/LeaderboardGui.class differ diff --git a/target/classes/com/Lino/battlePass/gui/LevelRewardEditGui.class b/target/classes/com/Lino/battlePass/gui/LevelRewardEditGui.class new file mode 100644 index 0000000..b601e1a Binary files /dev/null and b/target/classes/com/Lino/battlePass/gui/LevelRewardEditGui.class differ diff --git a/target/classes/com/Lino/battlePass/gui/MissionDetailsGui.class b/target/classes/com/Lino/battlePass/gui/MissionDetailsGui.class new file mode 100644 index 0000000..8b1d7b3 Binary files /dev/null and b/target/classes/com/Lino/battlePass/gui/MissionDetailsGui.class differ diff --git a/target/classes/com/Lino/battlePass/gui/MissionEditorGui.class b/target/classes/com/Lino/battlePass/gui/MissionEditorGui.class new file mode 100644 index 0000000..3c74f41 Binary files /dev/null and b/target/classes/com/Lino/battlePass/gui/MissionEditorGui.class differ diff --git a/target/classes/com/Lino/battlePass/gui/MissionTypeSelectionGui.class b/target/classes/com/Lino/battlePass/gui/MissionTypeSelectionGui.class new file mode 100644 index 0000000..3b01bca Binary files /dev/null and b/target/classes/com/Lino/battlePass/gui/MissionTypeSelectionGui.class differ diff --git a/target/classes/com/Lino/battlePass/gui/MissionsGui.class b/target/classes/com/Lino/battlePass/gui/MissionsGui.class new file mode 100644 index 0000000..b18094e Binary files /dev/null and b/target/classes/com/Lino/battlePass/gui/MissionsGui.class differ diff --git a/target/classes/com/Lino/battlePass/gui/RewardsCategoryGui.class b/target/classes/com/Lino/battlePass/gui/RewardsCategoryGui.class new file mode 100644 index 0000000..17bf4b5 Binary files /dev/null and b/target/classes/com/Lino/battlePass/gui/RewardsCategoryGui.class differ diff --git a/target/classes/com/Lino/battlePass/gui/RewardsEditorGui.class b/target/classes/com/Lino/battlePass/gui/RewardsEditorGui.class new file mode 100644 index 0000000..9260488 Binary files /dev/null and b/target/classes/com/Lino/battlePass/gui/RewardsEditorGui.class differ diff --git a/target/classes/com/Lino/battlePass/gui/ShopGui.class b/target/classes/com/Lino/battlePass/gui/ShopGui.class new file mode 100644 index 0000000..d2967b7 Binary files /dev/null and b/target/classes/com/Lino/battlePass/gui/ShopGui.class differ diff --git a/target/classes/com/Lino/battlePass/listeners/CustomItemsListener.class b/target/classes/com/Lino/battlePass/listeners/CustomItemsListener.class new file mode 100644 index 0000000..1673470 Binary files /dev/null and b/target/classes/com/Lino/battlePass/listeners/CustomItemsListener.class differ diff --git a/target/classes/com/Lino/battlePass/listeners/EventManager.class b/target/classes/com/Lino/battlePass/listeners/EventManager.class new file mode 100644 index 0000000..4fbc14d Binary files /dev/null and b/target/classes/com/Lino/battlePass/listeners/EventManager.class differ diff --git a/target/classes/com/Lino/battlePass/listeners/GuiClickListener$1.class b/target/classes/com/Lino/battlePass/listeners/GuiClickListener$1.class new file mode 100644 index 0000000..b6030ab Binary files /dev/null and b/target/classes/com/Lino/battlePass/listeners/GuiClickListener$1.class differ diff --git a/target/classes/com/Lino/battlePass/listeners/GuiClickListener.class b/target/classes/com/Lino/battlePass/listeners/GuiClickListener.class new file mode 100644 index 0000000..ed50471 Binary files /dev/null and b/target/classes/com/Lino/battlePass/listeners/GuiClickListener.class differ diff --git a/target/classes/com/Lino/battlePass/listeners/MissionEditorListener.class b/target/classes/com/Lino/battlePass/listeners/MissionEditorListener.class new file mode 100644 index 0000000..ab5b975 Binary files /dev/null and b/target/classes/com/Lino/battlePass/listeners/MissionEditorListener.class differ diff --git a/target/classes/com/Lino/battlePass/listeners/MissionProgressListener.class b/target/classes/com/Lino/battlePass/listeners/MissionProgressListener.class new file mode 100644 index 0000000..47a2bb9 Binary files /dev/null and b/target/classes/com/Lino/battlePass/listeners/MissionProgressListener.class differ diff --git a/target/classes/com/Lino/battlePass/listeners/MythicMobsListener.class b/target/classes/com/Lino/battlePass/listeners/MythicMobsListener.class new file mode 100644 index 0000000..38c4c2f Binary files /dev/null and b/target/classes/com/Lino/battlePass/listeners/MythicMobsListener.class differ diff --git a/target/classes/com/Lino/battlePass/listeners/PlayerConnectionListener$1.class b/target/classes/com/Lino/battlePass/listeners/PlayerConnectionListener$1.class new file mode 100644 index 0000000..6ba9b8e Binary files /dev/null and b/target/classes/com/Lino/battlePass/listeners/PlayerConnectionListener$1.class differ diff --git a/target/classes/com/Lino/battlePass/listeners/PlayerConnectionListener.class b/target/classes/com/Lino/battlePass/listeners/PlayerConnectionListener.class new file mode 100644 index 0000000..129f3c7 Binary files /dev/null and b/target/classes/com/Lino/battlePass/listeners/PlayerConnectionListener.class differ diff --git a/target/classes/com/Lino/battlePass/listeners/RewardsEditorListener.class b/target/classes/com/Lino/battlePass/listeners/RewardsEditorListener.class new file mode 100644 index 0000000..7251766 Binary files /dev/null and b/target/classes/com/Lino/battlePass/listeners/RewardsEditorListener.class differ diff --git a/target/classes/com/Lino/battlePass/managers/ConfigManager.class b/target/classes/com/Lino/battlePass/managers/ConfigManager.class new file mode 100644 index 0000000..7fe020b Binary files /dev/null and b/target/classes/com/Lino/battlePass/managers/ConfigManager.class differ diff --git a/target/classes/com/Lino/battlePass/managers/ConfigValidator$ValidationReport.class b/target/classes/com/Lino/battlePass/managers/ConfigValidator$ValidationReport.class new file mode 100644 index 0000000..6a9d7be Binary files /dev/null and b/target/classes/com/Lino/battlePass/managers/ConfigValidator$ValidationReport.class differ diff --git a/target/classes/com/Lino/battlePass/managers/ConfigValidator.class b/target/classes/com/Lino/battlePass/managers/ConfigValidator.class new file mode 100644 index 0000000..25798e1 Binary files /dev/null and b/target/classes/com/Lino/battlePass/managers/ConfigValidator.class differ diff --git a/target/classes/com/Lino/battlePass/managers/CustomItemManager.class b/target/classes/com/Lino/battlePass/managers/CustomItemManager.class new file mode 100644 index 0000000..8f9a8c0 Binary files /dev/null and b/target/classes/com/Lino/battlePass/managers/CustomItemManager.class differ diff --git a/target/classes/com/Lino/battlePass/managers/DatabaseManager.class b/target/classes/com/Lino/battlePass/managers/DatabaseManager.class new file mode 100644 index 0000000..7b36547 Binary files /dev/null and b/target/classes/com/Lino/battlePass/managers/DatabaseManager.class differ diff --git a/target/classes/com/Lino/battlePass/managers/GuiManager.class b/target/classes/com/Lino/battlePass/managers/GuiManager.class new file mode 100644 index 0000000..65ad579 Binary files /dev/null and b/target/classes/com/Lino/battlePass/managers/GuiManager.class differ diff --git a/target/classes/com/Lino/battlePass/managers/MessageManager.class b/target/classes/com/Lino/battlePass/managers/MessageManager.class new file mode 100644 index 0000000..8cf0ac8 Binary files /dev/null and b/target/classes/com/Lino/battlePass/managers/MessageManager.class differ diff --git a/target/classes/com/Lino/battlePass/managers/MissionEditorManager$1.class b/target/classes/com/Lino/battlePass/managers/MissionEditorManager$1.class new file mode 100644 index 0000000..d795ab6 Binary files /dev/null and b/target/classes/com/Lino/battlePass/managers/MissionEditorManager$1.class differ diff --git a/target/classes/com/Lino/battlePass/managers/MissionEditorManager$2.class b/target/classes/com/Lino/battlePass/managers/MissionEditorManager$2.class new file mode 100644 index 0000000..4a281e9 Binary files /dev/null and b/target/classes/com/Lino/battlePass/managers/MissionEditorManager$2.class differ diff --git a/target/classes/com/Lino/battlePass/managers/MissionEditorManager$EditType.class b/target/classes/com/Lino/battlePass/managers/MissionEditorManager$EditType.class new file mode 100644 index 0000000..8de6085 Binary files /dev/null and b/target/classes/com/Lino/battlePass/managers/MissionEditorManager$EditType.class differ diff --git a/target/classes/com/Lino/battlePass/managers/MissionEditorManager$EditorState.class b/target/classes/com/Lino/battlePass/managers/MissionEditorManager$EditorState.class new file mode 100644 index 0000000..68f305c Binary files /dev/null and b/target/classes/com/Lino/battlePass/managers/MissionEditorManager$EditorState.class differ diff --git a/target/classes/com/Lino/battlePass/managers/MissionEditorManager.class b/target/classes/com/Lino/battlePass/managers/MissionEditorManager.class new file mode 100644 index 0000000..d2ee899 Binary files /dev/null and b/target/classes/com/Lino/battlePass/managers/MissionEditorManager.class differ diff --git a/target/classes/com/Lino/battlePass/managers/MissionGenerator$WeightedMissionTemplate.class b/target/classes/com/Lino/battlePass/managers/MissionGenerator$WeightedMissionTemplate.class new file mode 100644 index 0000000..3634184 Binary files /dev/null and b/target/classes/com/Lino/battlePass/managers/MissionGenerator$WeightedMissionTemplate.class differ diff --git a/target/classes/com/Lino/battlePass/managers/MissionGenerator.class b/target/classes/com/Lino/battlePass/managers/MissionGenerator.class new file mode 100644 index 0000000..c122740 Binary files /dev/null and b/target/classes/com/Lino/battlePass/managers/MissionGenerator.class differ diff --git a/target/classes/com/Lino/battlePass/managers/MissionManager.class b/target/classes/com/Lino/battlePass/managers/MissionManager.class new file mode 100644 index 0000000..0b47f41 Binary files /dev/null and b/target/classes/com/Lino/battlePass/managers/MissionManager.class differ diff --git a/target/classes/com/Lino/battlePass/managers/MissionProgressTracker$1.class b/target/classes/com/Lino/battlePass/managers/MissionProgressTracker$1.class new file mode 100644 index 0000000..fcc03d9 Binary files /dev/null and b/target/classes/com/Lino/battlePass/managers/MissionProgressTracker$1.class differ diff --git a/target/classes/com/Lino/battlePass/managers/MissionProgressTracker$2.class b/target/classes/com/Lino/battlePass/managers/MissionProgressTracker$2.class new file mode 100644 index 0000000..83c3bd9 Binary files /dev/null and b/target/classes/com/Lino/battlePass/managers/MissionProgressTracker$2.class differ diff --git a/target/classes/com/Lino/battlePass/managers/MissionProgressTracker.class b/target/classes/com/Lino/battlePass/managers/MissionProgressTracker.class new file mode 100644 index 0000000..051afa5 Binary files /dev/null and b/target/classes/com/Lino/battlePass/managers/MissionProgressTracker.class differ diff --git a/target/classes/com/Lino/battlePass/managers/MissionResetHandler.class b/target/classes/com/Lino/battlePass/managers/MissionResetHandler.class new file mode 100644 index 0000000..0f16b86 Binary files /dev/null and b/target/classes/com/Lino/battlePass/managers/MissionResetHandler.class differ diff --git a/target/classes/com/Lino/battlePass/managers/PlayerDataManager.class b/target/classes/com/Lino/battlePass/managers/PlayerDataManager.class new file mode 100644 index 0000000..9fc9320 Binary files /dev/null and b/target/classes/com/Lino/battlePass/managers/PlayerDataManager.class differ diff --git a/target/classes/com/Lino/battlePass/managers/RewardEditorManager$1.class b/target/classes/com/Lino/battlePass/managers/RewardEditorManager$1.class new file mode 100644 index 0000000..8596929 Binary files /dev/null and b/target/classes/com/Lino/battlePass/managers/RewardEditorManager$1.class differ diff --git a/target/classes/com/Lino/battlePass/managers/RewardEditorManager$CommandInputState.class b/target/classes/com/Lino/battlePass/managers/RewardEditorManager$CommandInputState.class new file mode 100644 index 0000000..5c69d62 Binary files /dev/null and b/target/classes/com/Lino/battlePass/managers/RewardEditorManager$CommandInputState.class differ diff --git a/target/classes/com/Lino/battlePass/managers/RewardEditorManager.class b/target/classes/com/Lino/battlePass/managers/RewardEditorManager.class new file mode 100644 index 0000000..8a5f154 Binary files /dev/null and b/target/classes/com/Lino/battlePass/managers/RewardEditorManager.class differ diff --git a/target/classes/com/Lino/battlePass/managers/RewardManager.class b/target/classes/com/Lino/battlePass/managers/RewardManager.class new file mode 100644 index 0000000..bbe0bc6 Binary files /dev/null and b/target/classes/com/Lino/battlePass/managers/RewardManager.class differ diff --git a/target/classes/com/Lino/battlePass/managers/SeasonRotationManager.class b/target/classes/com/Lino/battlePass/managers/SeasonRotationManager.class new file mode 100644 index 0000000..ab074bc Binary files /dev/null and b/target/classes/com/Lino/battlePass/managers/SeasonRotationManager.class differ diff --git a/target/classes/com/Lino/battlePass/managers/ShopManager.class b/target/classes/com/Lino/battlePass/managers/ShopManager.class new file mode 100644 index 0000000..5d751c4 Binary files /dev/null and b/target/classes/com/Lino/battlePass/managers/ShopManager.class differ diff --git a/target/classes/com/Lino/battlePass/managers/SoundManager$1.class b/target/classes/com/Lino/battlePass/managers/SoundManager$1.class new file mode 100644 index 0000000..74d0c23 Binary files /dev/null and b/target/classes/com/Lino/battlePass/managers/SoundManager$1.class differ diff --git a/target/classes/com/Lino/battlePass/managers/SoundManager.class b/target/classes/com/Lino/battlePass/managers/SoundManager.class new file mode 100644 index 0000000..5879ca3 Binary files /dev/null and b/target/classes/com/Lino/battlePass/managers/SoundManager.class differ diff --git a/target/classes/com/Lino/battlePass/models/EditableReward.class b/target/classes/com/Lino/battlePass/models/EditableReward.class new file mode 100644 index 0000000..5854128 Binary files /dev/null and b/target/classes/com/Lino/battlePass/models/EditableReward.class differ diff --git a/target/classes/com/Lino/battlePass/models/Mission.class b/target/classes/com/Lino/battlePass/models/Mission.class new file mode 100644 index 0000000..4fd65cd Binary files /dev/null and b/target/classes/com/Lino/battlePass/models/Mission.class differ diff --git a/target/classes/com/Lino/battlePass/models/MissionTemplate.class b/target/classes/com/Lino/battlePass/models/MissionTemplate.class new file mode 100644 index 0000000..c2d58c7 Binary files /dev/null and b/target/classes/com/Lino/battlePass/models/MissionTemplate.class differ diff --git a/target/classes/com/Lino/battlePass/models/PlayerData.class b/target/classes/com/Lino/battlePass/models/PlayerData.class new file mode 100644 index 0000000..2d0feca Binary files /dev/null and b/target/classes/com/Lino/battlePass/models/PlayerData.class differ diff --git a/target/classes/com/Lino/battlePass/models/Reward.class b/target/classes/com/Lino/battlePass/models/Reward.class new file mode 100644 index 0000000..a4a2b27 Binary files /dev/null and b/target/classes/com/Lino/battlePass/models/Reward.class differ diff --git a/target/classes/com/Lino/battlePass/models/ShopItem.class b/target/classes/com/Lino/battlePass/models/ShopItem.class new file mode 100644 index 0000000..addb8fa Binary files /dev/null and b/target/classes/com/Lino/battlePass/models/ShopItem.class differ diff --git a/target/classes/com/Lino/battlePass/placeholders/BattlePassExpansion.class b/target/classes/com/Lino/battlePass/placeholders/BattlePassExpansion.class new file mode 100644 index 0000000..14b6e85 Binary files /dev/null and b/target/classes/com/Lino/battlePass/placeholders/BattlePassExpansion.class differ diff --git a/target/classes/com/Lino/battlePass/tasks/BattlePassTask.class b/target/classes/com/Lino/battlePass/tasks/BattlePassTask.class new file mode 100644 index 0000000..051d816 Binary files /dev/null and b/target/classes/com/Lino/battlePass/tasks/BattlePassTask.class differ diff --git a/target/classes/com/Lino/battlePass/tasks/CoinsDistributionTask.class b/target/classes/com/Lino/battlePass/tasks/CoinsDistributionTask.class new file mode 100644 index 0000000..4dfeb45 Binary files /dev/null and b/target/classes/com/Lino/battlePass/tasks/CoinsDistributionTask.class differ diff --git a/target/classes/com/Lino/battlePass/utils/GradientColorParser.class b/target/classes/com/Lino/battlePass/utils/GradientColorParser.class new file mode 100644 index 0000000..e327e60 Binary files /dev/null and b/target/classes/com/Lino/battlePass/utils/GradientColorParser.class differ diff --git a/target/classes/com/Lino/battlePass/utils/ItemSerializer.class b/target/classes/com/Lino/battlePass/utils/ItemSerializer.class new file mode 100644 index 0000000..36ea5df Binary files /dev/null and b/target/classes/com/Lino/battlePass/utils/ItemSerializer.class differ diff --git a/target/classes/com/Lino/battlePass/utils/MaterialNameResolver.class b/target/classes/com/Lino/battlePass/utils/MaterialNameResolver.class new file mode 100644 index 0000000..276cb2f Binary files /dev/null and b/target/classes/com/Lino/battlePass/utils/MaterialNameResolver.class differ diff --git a/target/classes/config.yml b/target/classes/config.yml new file mode 100644 index 0000000..8b56d05 --- /dev/null +++ b/target/classes/config.yml @@ -0,0 +1,95 @@ +# Основной конфиг Battle Pass + +# Язык плагина: +# RU - русский +# EN / ENG - английский +# Загружаются файлы messages_<язык>.yml и gui_<язык>.yml +language: RU + +# Настройки сезона +season: + # Тип сброса сезона: + # MONTH_START - в начале каждого месяца + # DURATION - каждые N дней (см. duration) + reset-type: "DURATION" + # Длительность сезона в днях (используется только при reset-type: DURATION) + duration: 30 + # Сбрасывать Battle Coins при смене сезона + reset-coins-on-season-end: true + + # Ротация сезонных наград из папки /plugins/BattlePass/seasons/ + # Цикл: season-1 -> season-2 -> ... -> season-N -> season-1 + rotation: + enabled: false + # Количество сезонов в цикле (должно совпадать с числом папок season-*) + total-seasons: 3 + +# База данных +# type: SQLITE (по умолчанию) или MYSQL +database: + type: SQLITE + # Настройки MySQL (используются только если type: MYSQL) + # host: localhost + # port: 3306 + # database: battlepass + # username: root + # password: "" + # prefix: "bp_" + # pool-size: 10 + +# Опыт Battle Pass +experience: + # Сколько XP нужно на 1 уровень + xp-per-level: 200 + +# Ежедневная награда +daily-reward: + # XP за ежедневный бонус + xp: 200 + +# Ежедневные миссии +missions: + # Через сколько часов обновляются миссии + reset-hours: 24 + +# Battle Coins +battle-coins: + # Интервал выдачи монет топ-10 (в часах) + distribution-hours: 24 + # Награда по местам в топе + distribution: + 1: 10 + 2: 9 + 3: 8 + 4: 7 + 5: 6 + 6: 5 + 7: 4 + 8: 3 + 9: 2 + 10: 1 + +# Магазин +shop: + enabled: true + +# Кастомные предметы +custom-items: + sounds-enabled: true + +# Визуальные настройки интерфейса +ui: + # Чистый режим: отключает градиенты/hex-цвета и делает GUI спокойнее + clean-mode: true + +# Материалы в GUI (используйте Bukkit Material) +gui: + reward-locked: + free: GRAY_STAINED_GLASS + premium: GRAY_STAINED_GLASS + premium-no-pass: IRON_BARS + reward-available: CHEST + reward-claimed: + free: GREEN_STAINED_GLASS + premium: LIME_STAINED_GLASS + separator: GRAY_STAINED_GLASS_PANE diff --git a/target/classes/gui_en.yml b/target/classes/gui_en.yml new file mode 100644 index 0000000..bd4f311 --- /dev/null +++ b/target/classes/gui_en.yml @@ -0,0 +1,192 @@ +gui: + battlepass: "&6Battle Pass &8| &7Page %page%" + missions: "&6Daily Missions" + leaderboard: "&6Leaderboard" + shop: "&6BattlePass Shop" + +items: + progress: + name: "�D4FFYour Progress" + lore: + - "&7Level: &f%level%" + - "&7XP: &f%xp%&7/&f%xp_needed%" + - "&7Premium: %premium_status%" + - "&7Season: &f%current_season%" + - "&7Season reset in: &f%season_time%" + + premium-status: + active: "&aActive" + inactive: "&cInactive" + + separator: + name: " " + + previous-page: + name: "&e← Previous Page" + lore: + - "&7Open page %page%" + + next-page: + name: "&eNext Page →" + lore: + - "&7Open page %page%" + + missions-button: + name: "&eMissions" + lore: + - "&7Complete missions" + - "&7and earn XP." + - "&7Resets in: &f%reset_time%" + + leaderboard-button: + name: "&eLeaderboard" + lore: + - "&7Top players by progress." + - "&7Next coin payout: &f%coins_time%" + + shop-button: + name: "&eShop" + lore: + - "&7Buy items for coins." + - "&7Your coins: &f%coins%" + + daily-reward: + name: "&eDaily Reward" + lore-available: + - "&7Reward: &f%xp% XP" + - "&aClick to claim" + lore-cooldown: + - "&7Reward: &f%xp% XP" + - "&7Available in: &f%time%" + + reward-available: + name: "&a%type% Reward • Level %level%" + lore-header: + - "&7Rewards:" + lore-footer: + - "&7" + - "&aClick to claim" + + reward-claimed: + name: "&8%type% Reward • Level %level%" + lore-header: + - "&7Rewards:" + lore-footer: + - "&7" + - "&8Already claimed" + + reward-premium-locked: + name: "&6Premium Reward • Level %level%" + lore-header: + - "&7Rewards:" + lore-footer: + - "&7" + - "&6Premium required" + + reward-level-locked: + name: "&c%type% Reward • Level %level%" + lore-header: + - "&7Rewards:" + lore-footer: + - "&7" + - "&cInsufficient level" + + mission-timer: + name: "&eMission Reset" + lore: + - "&7Resets in: &f%reset_time%" + + mission-completed: + name: "&a%mission%" + lore: + - "&7Progress: &f%progress%/%required%" + - "&7Reward: &f%reward_xp% XP" + - "&7Resets in: &f%reset_time%" + - "&aCompleted" + + mission-in-progress: + name: "&e%mission%" + lore: + - "&7Progress: &f%progress%/%required%" + - "&7Reward: &f%reward_xp% XP" + - "&7Resets in: &f%reset_time%" + - "&eIn progress" + + leaderboard-title: + name: "&eTop 10 Players" + lore: + - "&7Season ends in: &f%season_time%" + - "&7Next coin payout: &f%coins_time%" + + leaderboard-player: + name: "%rank% &b%player%" + lore: + - "&7Level: &f%level%" + - "&7Total Levels: &f%total_levels%" + - "&7XP: &f%xp%" + - "&7Coins: &f%coins%" + - "&7%status%" + + leaderboard-rank: + first: "&6#1" + second: "&f#2" + third: "&c#3" + other: "&7#%rank%" + + leaderboard-status: + you: "&aYou" + other: "&7Keep grinding" + + coins-info: + name: "&eBattle Coins" + lore: + - "&7Coins are paid to top-10 players." + - "&7Next payout: &f%time%" + + back-button: + name: "&c← Back" + lore: + - "&7Return" + + shop-balance: + name: "&eYour Balance" + lore: + - "&7Battle Coins: &f%coins%" + + admin-rewards-editor: + name: "&6Rewards Editor" + lore: + - "&7Open rewards editor." + + admin-missions-reset: + name: "&cReset Missions" + lore: + - "&7Admin only." + - "&cClick to reset" + + admin-missions-editor: + name: "&6Mission Editor" + lore: + - "&7Create and edit missions." + +custom-items: + premium-pass: + name: "&#FF66FF★ Premium Battle Pass Voucher ★" + lore: + - "&7Unlocks the Premium reward track." + - "&7Valid until the end of current season." + - "&aRight-click to activate" + + battle-coin: + name: "&#FFD54F✦ Battle Coin Token ✦" + lore: + - "&7Adds 1 Battle Coin." + - "&7Can be stacked." + - "&aRight-click to use" + + level-boost: + name: "BFFCC✧ XP Boost Elixir ✧" + lore: + - "&7Gives +100 Battle Pass XP." + - "&7Can be used in batches." + - "&aRight-click to use" diff --git a/target/classes/gui_ru.yml b/target/classes/gui_ru.yml new file mode 100644 index 0000000..804b998 --- /dev/null +++ b/target/classes/gui_ru.yml @@ -0,0 +1,192 @@ +gui: + battlepass: "&6Боевой пропуск &8| &7Страница %page%" + missions: "&6Ежедневные миссии" + leaderboard: "&6Таблица лидеров" + shop: "&6Магазин BattlePass" + +items: + progress: + name: "�D4FFВаш прогресс" + lore: + - "&7Уровень: &f%level%" + - "&7XP: &f%xp%&7/&f%xp_needed%" + - "&7Premium: %premium_status%" + - "&7Сезон: &f%current_season%" + - "&7До сброса: &f%season_time%" + + premium-status: + active: "&aАктивен" + inactive: "&cНе активен" + + separator: + name: " " + + previous-page: + name: "&e← Предыдущая страница" + lore: + - "&7Открыть страницу %page%" + + next-page: + name: "&eСледующая страница →" + lore: + - "&7Открыть страницу %page%" + + missions-button: + name: "&eМиссии" + lore: + - "&7Выполняйте задания" + - "&7и получайте XP." + - "&7Сброс через: &f%reset_time%" + + leaderboard-button: + name: "&eЛидеры" + lore: + - "&7Топ игроков по прогрессу." + - "&7Следующие монеты: &f%coins_time%" + + shop-button: + name: "&eМагазин" + lore: + - "&7Покупка предметов за монеты." + - "&7Ваши монеты: &f%coins%" + + daily-reward: + name: "&eЕжедневная награда" + lore-available: + - "&7Награда: &f%xp% XP" + - "&aНажмите, чтобы забрать" + lore-cooldown: + - "&7Награда: &f%xp% XP" + - "&7Доступно через: &f%time%" + + reward-available: + name: "&aНаграда %type% • Уровень %level%" + lore-header: + - "&7Награды:" + lore-footer: + - "&7" + - "&aНажмите, чтобы забрать" + + reward-claimed: + name: "&8Награда %type% • Уровень %level%" + lore-header: + - "&7Награды:" + lore-footer: + - "&7" + - "&8Уже получено" + + reward-premium-locked: + name: "&6Premium награда • Уровень %level%" + lore-header: + - "&7Награды:" + lore-footer: + - "&7" + - "&6Требуется Premium" + + reward-level-locked: + name: "&cНаграда %type% • Уровень %level%" + lore-header: + - "&7Награды:" + lore-footer: + - "&7" + - "&cНедостаточный уровень" + + mission-timer: + name: "&eСброс миссий" + lore: + - "&7До сброса: &f%reset_time%" + + mission-completed: + name: "&a%mission%" + lore: + - "&7Прогресс: &f%progress%/%required%" + - "&7Награда: &f%reward_xp% XP" + - "&7Сброс через: &f%reset_time%" + - "&aВыполнено" + + mission-in-progress: + name: "&e%mission%" + lore: + - "&7Прогресс: &f%progress%/%required%" + - "&7Награда: &f%reward_xp% XP" + - "&7Сброс через: &f%reset_time%" + - "&eВ процессе" + + leaderboard-title: + name: "&eТоп 10 игроков" + lore: + - "&7До конца сезона: &f%season_time%" + - "&7Следующая выдача монет: &f%coins_time%" + + leaderboard-player: + name: "%rank% &b%player%" + lore: + - "&7Уровень: &f%level%" + - "&7Всего уровней: &f%total_levels%" + - "&7XP: &f%xp%" + - "&7Монеты: &f%coins%" + - "&7%status%" + + leaderboard-rank: + first: "&6#1" + second: "&f#2" + third: "&c#3" + other: "&7#%rank%" + + leaderboard-status: + you: "&aЭто вы" + other: "&7Продолжайте прокачку" + + coins-info: + name: "&eBattle Coins" + lore: + - "&7Монеты выдаются топ-10 игроков." + - "&7Следующая выдача: &f%time%" + + back-button: + name: "&c← Назад" + lore: + - "&7Вернуться назад" + + shop-balance: + name: "&eВаш баланс" + lore: + - "&7Battle Coins: &f%coins%" + + admin-rewards-editor: + name: "&6Редактор наград" + lore: + - "&7Открыть редактор наград." + + admin-missions-reset: + name: "&cСбросить миссии" + lore: + - "&7Только для администратора." + - "&cНажмите для сброса" + + admin-missions-editor: + name: "&6Редактор миссий" + lore: + - "&7Создание и редактирование миссий." + +custom-items: + premium-pass: + name: "&#FF66FF★ Ваучер Premium Battle Pass ★" + lore: + - "&7Активирует Premium ветку наград." + - "&7Действует до конца текущего сезона." + - "&aПКМ для активации" + + battle-coin: + name: "&#FFD54F✦ Жетон Battle Coin ✦" + lore: + - "&7Добавляет 1 Battle Coin." + - "&7Можно складывать в стаки." + - "&aПКМ для использования" + + level-boost: + name: "BFFCC✧ Эликсир ускорения опыта ✧" + lore: + - "&7Даёт +100 XP Battle Pass." + - "&7Можно использовать пачкой." + - "&aПКМ для использования" diff --git a/target/classes/messages.yml b/target/classes/messages.yml new file mode 100644 index 0000000..a1c3569 --- /dev/null +++ b/target/classes/messages.yml @@ -0,0 +1,397 @@ +prefix: "&6[BattlePass] &8» &r" + +messages: + plugin-enabled: "✓ Battle Pass успешно включен!" + config-reloaded: "✓ Конфигурация перезагружена!" + + player-only: "✗ Эту команду может использовать только игрок!" + no-permission: "✗ У вас нет прав на использование этой команды!" + player-not-found: "✗ Игрок не найден!" + invalid-amount: "✗ Некорректное число! Введите число." + amount-must-be-positive: "✗ Значение должно быть больше нуля!" + invalid-item-type: "✗ Неверный тип предмета! Используйте 'premium', 'coins' или 'levelboost'." + + usage: + battlepass: "Использование: &f/battlepass" + add-premium: "Использование: &f/battlepass addpremium <игрок>" + remove-premium: "Использование: &f/battlepass removepremium <игрок>" + add-xp: "Использование: &f/battlepass addxp <игрок> <кол-во>" + remove-xp: "Использование: &f/battlepass removexp <игрок> <кол-во>" + add-coins: "Использование: &f/battlepass addcoins <игрок> <кол-во>" + remove-coins: "Использование: &f/battlepass removecoins <игрок> <кол-во>" + giveitem: "Использование: &f/battlepass giveitem <тип> <игрок> <кол-во>" + reset-player: "Использование: &f/battlepass resetplayer <игрок>" + edit-rewards-season: "Использование: &f/battlepass edit rewards season <номер>" + + reset-player: + sender: "✓ Прогресс Battle Pass игрока %player% успешно сброшен" + target: "⚠ Ваш прогресс Battle Pass был сброшен администратором!" + + help: + header: "⚡ КОМАНДЫ BATTLE PASS ⚡" + battlepass: "/battlepass &7- Открыть GUI Battle Pass" + help: "/bp help &7- Показать это меню помощи" + reload: "/bp reload &7- Перезагрузить конфигурацию" + reset-season: "/bp reset season &7- Принудительно сбросить сезон" + reset-missions: "/bp reset missions &7- Принудительно сбросить ежедневные миссии" + reset-player: "/bp resetplayer <игрок> &7- Сбросить прогресс Battle Pass игрока" + add-premium: "/bp addpremium <игрок> &7- Выдать Premium Pass" + remove-premium: "/bp removepremium <игрок> &7- Убрать Premium Pass" + add-xp: "/bp addxp <игрок> <кол-во> &7- Добавить XP игроку" + remove-xp: "/bp removexp <игрок> <кол-во> &7- Убрать XP у игрока" + add-coins: "/bp addcoins <игрок> <кол-во> &7- Добавить Battle Coins" + remove-coins: "/bp removecoins <игрок> <кол-во> &7- Убрать Battle Coins" + giveitem: "/bp giveitem <тип> <игрок> <кол-во> &7- Выдать особые предметы" + exclude-top: "/bp excludefromtop <игрок> &7- Скрыть игрока из топа" + include-top: "/bp includetop <игрок> &7- Вернуть игрока в топ" + edit-rewards-season: "/bp edit rewards season <номер> &7- Редактировать награды выбранного сезона" + + premium: + given-sender: "✓ Premium Pass выдан игроку %target%" + given-target: "★ ПОЗДРАВЛЯЕМ ★\nУ вас теперь есть Premium Battle Pass!" + removed-sender: "✗ Premium Pass удален у %target%" + removed-target: "Ваш Premium Battle Pass был удален!" + required: "⚠ Для получения этой награды нужен Premium Pass!" + + xp: + added-sender: "✓ Добавлено %amount% XP игроку %target%" + added-target: "+ %amount% XP" + removed-sender: "✗ Убрано %amount% XP у %target%" + removed-target: "- %amount% XP" + + level-up: "⬆ НОВЫЙ УРОВЕНЬ! Теперь ваш уровень: %level%" + new-rewards: "НОВЫЕ НАГРАДЫ! &fВам доступны новые награды!" + + rewards-available: "С возвращением! &fУ вас доступно %amount% наград!" + rewards-notification: "У вас есть %amount% новых наград к получению!" + + mission: + completed: "✓ МИССИЯ ВЫПОЛНЕНА: &a%mission% (+%reward_xp% XP)" + reset: "⟳ Ежедневные миссии были сброшены!" + forced-reset: "⟳ Администратор сбросил ежедневные миссии!" + reset-complete: "✓ Миссии успешно сброшены!" + reset-admin: "⟳ %admin% принудительно сбросил ежедневные миссии!" + actionbar-progress: "&c%mission%: &7%current%&f/&8%required%" + actionbar-completed: "✓ ВЫПОЛНЕНО: &a&l%mission%" + + season: + reset: "СБРОС СЕЗОНА\nСезон Battle Pass завершен! Новый сезон начинается прямо сейчас!" + forced-reset: "ПРИНУДИТЕЛЬНЫЙ СБРОС СЕЗОНА\nАдминистратор сбросил сезон Battle Pass!" + reset-warning: "⚠ ВНИМАНИЕ: &fСезон будет сброшен через 2 секунды. Прогресс всех игроков будет утерян!" + reset-complete: "✓ Сезон успешно сброшен!" + reset-admin: "СБРОС СЕЗОНА\n%admin% принудительно сбросил сезон Battle Pass!" + ends-in: "&7До конца сезона: %season_time%" + achievement: "%player% полностью завершил Battle Pass!" + premium-achievement: "%player% стал ЛЕГЕНДОЙ, завершив Premium Battle Pass!" + new-season: "Начался сезон %season%!" + rotation-disabled: "✗ Ротация сезонов отключена в конфиге!" + invalid-season: "✗ Неверный номер сезона! Допустимо от 1 до %max%." + editing-season: "✓ Редактирование наград для сезона %season%. Изменения сохраняются напрямую в папку сезона." + + rewards: + free-claimed: "✓ Бесплатные награды получены!" + premium-claimed: "★ Премиум-награды получены!" + already-claimed: "✗ Вы уже получили эту награду!" + cannot-claim: "✗ Вы не можете получить эту награду!" + locked: "ЗАКРЫТО &7(Нужен уровень %level%)" + item-reward: "&7• &f%amount%x %item%" + item-reward-dropped: "&7• &f%amount%x %item% (Выброшено на землю)" + command-reward: "&7• %reward%" + already-claimed-error: "✗ Эта награда уже получена! Если это ошибка, обратитесь к администрации." + + daily-reward: + claimed: "✓ Ежедневная награда получена! &fВы получили %amount% XP" + already-claimed: "✗ Вы уже забрали ежедневную награду!" + + coins: + distribution-announcement: "BATTLE COINS Топ-10 игроков получают ежедневные Battle Coins!" + distribution-player: "#%rank% %player% &7получил %amount% Battle Coins" + received: "+ %amount% Battle Coins!" + balance: "&7Ваши Battle Coins: %amount%" + added-sender: "✓ Добавлено %amount% Battle Coins игроку %target%" + added-target: "+ %amount% Battle Coins!" + removed-sender: "✗ Убрано %amount% Battle Coins у %target%" + removed-target: "- %amount% Battle Coins!" + insufficient-remove: "✗ У %target% только %current% Battle Coins!" + + shop: + insufficient-coins: "✗ Недостаточно Battle Coins! &7Нужно: %required% &7Есть: %current%" + purchase-success: "✓ Покупка успешна! &fКуплено %item% &fза %price% Battle Coins" + shop-title: "Магазин Battle Pass" + + items: + given: "✓ Выдано %amount%x %item% игроку %target%" + given-dropped: "✓ Выдано %amount%x %item% игроку %target% (Часть предметов выпала)" + received: "✓ Вы получили %amount%x %item%" + already-have-premium: "✗ У вас уже есть Premium Battle Pass!" + premium-activated: "★ PREMIUM АКТИВИРОВАН ★\nТеперь вам доступны все премиум-награды!" + coins-redeemed: "✓ Вы использовали %amount% Battle Coins!" + max-level-reached: "✗ Вы уже достигли максимального уровня!" + xp-boost-used: "★ XP-БУСТ!\nИспользовано %items% эликсиров и получено %amount% XP!" + +gui: + battlepass: "&6Battle Pass &8| &7Страница %page%" + missions: "&6Ежедневные миссии" + leaderboard: "&6Топ игроков" + shop: "&6Магазин Battle Pass" + +items: + progress: + name: "&eВаш прогресс" + lore: + - "&7" + - "&8▪ &7Уровень: %level%&7/54" + - "&8▪ &7XP: %xp%&7/%xp_needed%" + - "&7" + - "&8▪ &7Премиум пропуск: %premium_status%" + - "&8▪ &7До конца сезона: %season_time%" + - "&7" + - "&7Выполняйте миссии, чтобы получать XP" + - "&7и открывать крутые награды!" + + premium-status: + active: "&aАктивен" + inactive: "&cНе активен" + + separator: + name: " " + + previous-page: + name: "&e← Предыдущая страница" + lore: + - "&7Нажмите, чтобы перейти на страницу %page%" + + next-page: + name: "&eСледующая страница →" + lore: + - "&7Нажмите, чтобы перейти на страницу %page%" + + missions-button: + name: "&eЕжедневные миссии" + lore: + - "&7" + - "&7Выполняйте ежедневные миссии" + - "&7и получайте бонусный XP!" + - "&7" + - "&8▪ &7Сброс через: %reset_time%" + - "&7" + - "▶ НАЖМИТЕ ДЛЯ ПРОСМОТРА" + + leaderboard-button: + name: "&eТаблица лидеров" + lore: + - "&7" + - "&7Посмотрите топ-10 игроков" + - "&7с наивысшими уровнями Battle Pass!" + - "&7" + - "&8▪ &7Следующие монеты: %coins_time%" + - "&7" + - "▶ НАЖМИТЕ ДЛЯ ПРОСМОТРА" + + shop-button: + name: "&eМагазин Battle Pass" + lore: + - "&7" + - "&7Тратьте Battle Coins на" + - "&7эксклюзивные награды и предметы!" + - "&7" + - "&8▪ &7Ваши монеты: %coins%" + - "&7" + - "▶ НАЖМИТЕ, ЧТОБЫ ОТКРЫТЬ" + + daily-reward: + name: "&eЕжедневная награда" + lore-available: + - "&7" + - "&7Заберите ежедневный бонус XP!" + - "&7" + - "&8▪ &7Награда: %xp% XP" + - "&7" + - "▶ НАЖМИТЕ, ЧТОБЫ ЗАБРАТЬ!" + lore-cooldown: + - "&7" + - "&7Вы уже забрали" + - "&7свою ежедневную награду!" + - "&7" + - "&8▪ &7Награда: %xp% XP" + - "&8▪ &7Следующий сбор: %time%" + - "&7" + - "⏰ ПЕРЕЗАРЯДКА" + + reward-available: + name: "&aНаграда уровня %level%" + lore-header: + - "&7" + - "▼ Награды ▼" + lore-footer: + - "&7" + - "&8▪ &7Требуемый уровень: %level%" + - "&7" + - "▶ НАЖМИТЕ, ЧТОБЫ ЗАБРАТЬ!" + + reward-claimed: + name: "&8Награда уровня %level%" + lore-header: + - "&7" + - "&8▼ Награды ▼" + lore-footer: + - "&7" + - "&8▪ &7Требуемый уровень: &8%level%" + - "&7" + - "&8✓ УЖЕ ПОЛУЧЕНО" + + reward-premium-locked: + name: "&6Премиум-награда уровня %level%" + lore-header: + - "&7" + - "▼ Награды ▼" + lore-footer: + - "&7" + - "&8▪ &7Требуемый уровень: %level%" + - "&7" + - "⭐ ТОЛЬКО PREMIUM" + + reward-level-locked: + name: "&cНаграда уровня %level%" + lore-header: + - "&7" + - "&8▼ Награды ▼" + lore-footer: + - "&7" + - "&8▪ &7Требуемый уровень: %level%" + - "&7" + - "ЗАКРЫТО" + + mission-timer: + name: "&eСброс миссий" + lore: + - "&7" + - "&7Миссии сбросятся через:" + - "%reset_time%" + - "&7" + - "&7Выполните миссии до" + - "&7сброса, чтобы получить XP!" + + mission-completed: + name: "&a%mission%" + lore: + - "&7" + - "&8▪ &7Прогресс: %progress%/%required%" + - "&8▪ &7Награда: %reward_xp% XP" + - "&7" + - "&8▪ &7Сброс через: %reset_time%" + - "&7" + - "✓ ВЫПОЛНЕНО" + + mission-in-progress: + name: "&e%mission%" + lore: + - "&7" + - "&8▪ &7Прогресс: %progress%/%required%" + - "&8▪ &7Награда: %reward_xp% XP" + - "&7" + - "&8▪ &7Сброс через: %reset_time%" + - "&7" + - "⚡ В ПРОЦЕССЕ" + + leaderboard-title: + name: "&eТоп 10 игроков" + lore: + - "&7" + - "&8▪ &7До конца сезона: %season_time%" + - "&8▪ &7Следующие монеты: %coins_time%" + - "&7" + - "&7Соревнуйтесь за первые места" + - "&7и получайте Battle Coins ежедневно!" + + leaderboard-player: + name: "%rank% %player%" + lore: + - "&7" + - "&8▪ &7Уровень: %level%" + - "&8▪ &7Всего уровней: %total_levels%" + - "&8▪ &7XP: %xp%" + - "&8▪ &7Battle Coins: %coins%" + - "&7" + - "%status%" + + leaderboard-rank: + first: "#1" + second: "#2" + third: "#3" + other: "&7#%rank%" + + leaderboard-status: + you: "★ ЭТО ВЫ! ★" + other: "&7Прокачивайтесь, чтобы обогнать их!" + + coins-info: + name: "&eBattle Coins" + lore: + - "&7" + - "&7Battle Coins — это особая валюта," + - "&7которую ежедневно получают лучшие игроки!" + - "&7" + - "▼ Как получить ▼" + - "&7• Быть в топ-10 таблицы лидеров" + - "&7• #1 получает 10 монет" + - "&7• #2 получает 9 монет" + - "&7• ... и так далее" + - "&7" + - "▼ Для чего нужны ▼" + - "&7• Покупка эксклюзивных предметов" + - "&7• Получение особых бонусов" + - "&7• Демонстрация вашего прогресса!" + - "&7" + - "&8▪ &7Следующая выдача: %time%" + + back-button: + name: "&c← Назад" + lore: + - "&7Вернуться в Battle Pass" + + shop-balance: + name: "&eВаш баланс" + lore: + - "&7" + - "&8▪ &7Battle Coins: %coins%" + - "&7" + - "&7Получайте больше монет," + - "&7удерживаясь в топ-10!" + +time: + days-hours: "%days%д %hours%ч" + hours-minutes: "%hours%ч %minutes%м" + day: "день" + days: "дней" + hour: "час" + hours: "часов" + minute: "минута" + minutes: "минут" + available-now: "Доступно сейчас!" + +reward-types: + free: "Бесплатно" + premium: "Премиум" + +reward-level-locked: + name: "Награда уровня %level%" + lore-header: + - "&7" + - "&8▼ Награды ▼" + lore-footer: + - "&7" + - "&8▪ &7Требуемый уровень: %level%" + - "&7" + - "ЗАКРЫТО" + +reward-claimed: + name: "&8Награда %type% уровня %level%" + lore-header: + - "&7" + - "&8▼ Награды ▼" + lore-footer: + - "&7" + - "&8▪ &7Требуемый уровень: &8%level%" + - "&7" + - "&8✓ УЖЕ ПОЛУЧЕНО" diff --git a/target/classes/messages_en.yml b/target/classes/messages_en.yml new file mode 100644 index 0000000..8a37712 --- /dev/null +++ b/target/classes/messages_en.yml @@ -0,0 +1,169 @@ +prefix: "&6[BattlePass] &8» &r" + +messages: + plugin-enabled: "&aBattle Pass enabled." + config-reloaded: "&aConfiguration reloaded." + + player-only: "&cThis command can only be used by players." + no-permission: "&cYou do not have permission." + player-not-found: "&cPlayer not found." + invalid-amount: "&cInvalid number." + amount-must-be-positive: "&cAmount must be greater than zero." + invalid-item-type: "&cInvalid item type. Use: premium, coins, levelboost." + + usage: + battlepass: "&eUsage: &f/battlepass" + add-premium: "&eUsage: &f/battlepass addpremium " + remove-premium: "&eUsage: &f/battlepass removepremium " + add-xp: "&eUsage: &f/battlepass addxp " + remove-xp: "&eUsage: &f/battlepass removexp " + add-coins: "&eUsage: &f/battlepass addcoins " + remove-coins: "&eUsage: &f/battlepass removecoins " + giveitem: "&eUsage: &f/battlepass giveitem " + reset-player: "&eUsage: &f/battlepass resetplayer " + edit-rewards-season: "&eUsage: &f/battlepass edit rewards season " + + reset-player: + sender: "&aBattle Pass progress for &e%player% &ahas been reset." + target: "&cYour Battle Pass progress was reset by an administrator." + + help: + header: "&6Battle Pass Commands" + battlepass: "&b/battlepass &7- Open Battle Pass GUI" + help: "&b/bp help &7- Show this help" + reload: "&b/bp reload &7- Reload plugin configuration" + reset-season: "&b/bp reset season &7- Force season reset" + reset-missions: "&b/bp reset missions &7- Force daily mission reset" + reset-player: "&b/bp resetplayer &7- Reset player's Battle Pass progress" + add-premium: "&b/bp addpremium &7- Grant Premium Pass" + remove-premium: "&b/bp removepremium &7- Remove Premium Pass" + add-xp: "&b/bp addxp &7- Add XP" + remove-xp: "&b/bp removexp &7- Remove XP" + add-coins: "&b/bp addcoins &7- Add Battle Coins" + remove-coins: "&b/bp removecoins &7- Remove Battle Coins" + giveitem: "&b/bp giveitem &7- Give custom item" + exclude-top: "&b/bp excludefromtop &7- Hide player from leaderboard" + include-top: "&b/bp includetop &7- Return player to leaderboard" + edit-rewards-season: "&b/bp edit rewards season &7- Edit selected season rewards" + + premium: + given-sender: "&aPremium Pass granted to &e%target%&a." + given-target: "&aYou have received Premium Battle Pass." + removed-sender: "&cPremium Pass removed from &e%target%&c." + removed-target: "&cYour Premium Battle Pass has been removed." + required: "&cPremium Pass is required for this reward." + + xp: + added-sender: "&aAdded &e%amount% XP &ato &e%target%&a." + added-target: "&a+%amount% XP" + removed-sender: "&cRemoved &e%amount% XP &cfrom &e%target%&c." + removed-target: "&c-%amount% XP" + + level-up: "&aLevel up! New level: &e%level%" + new-rewards: "&aNew rewards are available." + + rewards-available: "&aYou have &e%amount% &aavailable rewards." + rewards-notification: "&aYou have &e%amount% &anew rewards to claim." + + mission: + completed: "&aMission completed: &f%mission% &7(+%reward_xp% XP)" + reset: "&eDaily missions have been reset." + forced-reset: "&eDaily missions were reset by an administrator." + reset-complete: "&aMissions reset complete." + reset-admin: "&e%admin% forced a mission reset." + admin-reset: "&eDaily missions were reset." + actionbar-progress: "&c%mission%: &7%current%&f/&8%required%" + actionbar-completed: "&aCompleted: &f%mission%" + + season: + reset: "&cSeason ended. Starting a new season." + forced-reset: "&cSeason was force-reset by administrator." + reset-warning: "&cSeason will reset in 2 seconds. All progress will be lost." + reset-complete: "&aSeason reset complete." + reset-admin: "&cSeason was reset by %admin%." + ends-in: "&7Season ends in: &f%season_time%" + achievement: "&e%player% &7has fully completed the Battle Pass." + premium-achievement: "&e%player% &7has completed Premium Battle Pass." + new-season: "&aSeason %season% has started." + rotation-disabled: "&cSeason rotation is disabled in config." + invalid-season: "&cInvalid season number. Allowed: 1..%max%." + editing-season: "&aEditing rewards for season &e%season%&a." + + rewards: + free-claimed: "&aFree rewards claimed." + premium-claimed: "&aPremium rewards claimed." + already-claimed: "&cThis reward is already claimed." + cannot-claim: "&cYou cannot claim this reward yet." + locked: "&cLOCKED &7(Level %level% required)" + item-reward: "&7• &f%amount%x %item%" + item-reward-dropped: "&7• &f%amount%x %item% &e(dropped on ground)" + command-reward: "&7• %reward%" + already-claimed-error: "&cThis reward was already claimed." + + daily-reward: + claimed: "&aDaily reward claimed: &e%amount% XP" + already-claimed: "&cYou already claimed the daily reward." + + coins: + distribution-announcement: "&6Battle Coins payout for top-10 players." + distribution-player: "&e#%rank% %player% &7received &6%amount% Battle Coins" + received: "&a+%amount% Battle Coins" + balance: "&7Your Battle Coins: &e%amount%" + added-sender: "&aAdded &e%amount% Battle Coins &ato &e%target%&a." + added-target: "&a+%amount% Battle Coins" + removed-sender: "&cRemoved &e%amount% Battle Coins &cfrom &e%target%&c." + removed-target: "&c-%amount% Battle Coins" + insufficient-remove: "&c%target% only has %current% Battle Coins." + + shop: + insufficient-coins: "&cNot enough Battle Coins. Need: %required%, have: %current%." + purchase-success: "&aPurchase successful: %item% for %price% Battle Coins." + shop-title: "&6Battle Pass Shop" + + items: + given: "&aGiven &e%amount%x %item% &ato &e%target%&a." + given-dropped: "&aGiven &e%amount%x %item% &ato &e%target% &e(some items dropped)." + received: "&aYou received &e%amount%x %item%&a." + already-have-premium: "&cYou already have Premium Battle Pass." + premium-activated: "&aPremium Battle Pass activated." + coins-redeemed: "&aRedeemed %amount% Battle Coins." + max-level-reached: "&cYou already reached max level." + xp-boost-used: "&aUsed %items% XP boosters for %amount% XP." + names: + premium-pass: "Premium Pass Voucher" + battle-coin: "Battle Coin Token" + level-boost: "XP Boost Elixir" + + top: + usage: "&eUsage: /battlepass %command% " + updated: "&aPlayer %player% is now %status% leaderboard." + excluded-status: "excluded from" + included-status: "included in" + +time: + days-hours: "%days%d %hours%h" + hours-minutes: "%hours%h %minutes%m" + day: "day" + days: "days" + hour: "hour" + hours: "hours" + minute: "minute" + minutes: "minutes" + available-now: "&aAvailable now!" + unknown: "Unknown" + +reward-types: + free: "&bFree" + premium: "&6Premium" + +placeholders: + loading: "Loading..." + yes: "Yes" + no: "No" + active: "Active" + inactive: "Inactive" + unknown: "Unknown" + outside-top: "Outside top" + mission-completed: "Completed" + mission-in-progress: "In progress" + empty: "Empty" diff --git a/target/classes/messages_ru.yml b/target/classes/messages_ru.yml new file mode 100644 index 0000000..9e5d60f --- /dev/null +++ b/target/classes/messages_ru.yml @@ -0,0 +1,420 @@ +prefix: "&6[BattlePass] &8» &r" + +messages: + plugin-enabled: "✓ Battle Pass успешно включен!" + config-reloaded: "✓ Конфигурация перезагружена!" + + player-only: "✗ Эту команду может использовать только игрок!" + no-permission: "✗ У вас нет прав на использование этой команды!" + player-not-found: "✗ Игрок не найден!" + invalid-amount: "✗ Некорректное число! Введите число." + amount-must-be-positive: "✗ Значение должно быть больше нуля!" + invalid-item-type: "✗ Неверный тип предмета! Используйте 'premium', 'coins' или 'levelboost'." + + top: + usage: "Использование: &f/battlepass %command% <игрок>" + updated: "✓ Игрок %player% теперь %status% таблицу лидеров." + excluded-status: "исключен из" + included-status: "включен в" + + usage: + battlepass: "Использование: &f/battlepass" + add-premium: "Использование: &f/battlepass addpremium <игрок>" + remove-premium: "Использование: &f/battlepass removepremium <игрок>" + add-xp: "Использование: &f/battlepass addxp <игрок> <кол-во>" + remove-xp: "Использование: &f/battlepass removexp <игрок> <кол-во>" + add-coins: "Использование: &f/battlepass addcoins <игрок> <кол-во>" + remove-coins: "Использование: &f/battlepass removecoins <игрок> <кол-во>" + giveitem: "Использование: &f/battlepass giveitem <тип> <игрок> <кол-во>" + reset-player: "Использование: &f/battlepass resetplayer <игрок>" + edit-rewards-season: "Использование: &f/battlepass edit rewards season <номер>" + + reset-player: + sender: "✓ Прогресс Battle Pass игрока %player% успешно сброшен" + target: "⚠ Ваш прогресс Battle Pass был сброшен администратором!" + + help: + header: "⚡ КОМАНДЫ BATTLE PASS ⚡" + battlepass: "/battlepass &7- Открыть GUI Battle Pass" + help: "/bp help &7- Показать это меню помощи" + reload: "/bp reload &7- Перезагрузить конфигурацию" + reset-season: "/bp reset season &7- Принудительно сбросить сезон" + reset-missions: "/bp reset missions &7- Принудительно сбросить ежедневные миссии" + reset-player: "/bp resetplayer <игрок> &7- Сбросить прогресс Battle Pass игрока" + add-premium: "/bp addpremium <игрок> &7- Выдать Premium Pass" + remove-premium: "/bp removepremium <игрок> &7- Убрать Premium Pass" + add-xp: "/bp addxp <игрок> <кол-во> &7- Добавить XP игроку" + remove-xp: "/bp removexp <игрок> <кол-во> &7- Убрать XP у игрока" + add-coins: "/bp addcoins <игрок> <кол-во> &7- Добавить Battle Coins" + remove-coins: "/bp removecoins <игрок> <кол-во> &7- Убрать Battle Coins" + giveitem: "/bp giveitem <тип> <игрок> <кол-во> &7- Выдать особые предметы" + exclude-top: "/bp excludefromtop <игрок> &7- Скрыть игрока из топа" + include-top: "/bp includetop <игрок> &7- Вернуть игрока в топ" + edit-rewards-season: "/bp edit rewards season <номер> &7- Редактировать награды выбранного сезона" + + premium: + given-sender: "✓ Premium Pass выдан игроку %target%" + given-target: "★ ПОЗДРАВЛЯЕМ ★\nУ вас теперь есть Premium Battle Pass!" + removed-sender: "✗ Premium Pass удален у %target%" + removed-target: "Ваш Premium Battle Pass был удален!" + required: "⚠ Для получения этой награды нужен Premium Pass!" + + xp: + added-sender: "✓ Добавлено %amount% XP игроку %target%" + added-target: "+ %amount% XP" + removed-sender: "✗ Убрано %amount% XP у %target%" + removed-target: "- %amount% XP" + + level-up: "⬆ НОВЫЙ УРОВЕНЬ! Теперь ваш уровень: %level%" + new-rewards: "НОВЫЕ НАГРАДЫ! &fВам доступны новые награды!" + + rewards-available: "С возвращением! &fУ вас доступно %amount% наград!" + rewards-notification: "У вас есть %amount% новых наград к получению!" + + mission: + completed: "✓ МИССИЯ ВЫПОЛНЕНА: &a%mission% (+%reward_xp% XP)" + reset: "⟳ Ежедневные миссии были сброшены!" + forced-reset: "⟳ Администратор сбросил ежедневные миссии!" + reset-complete: "✓ Миссии успешно сброшены!" + reset-admin: "⟳ %admin% принудительно сбросил ежедневные миссии!" + actionbar-progress: "&c%mission%: &7%current%&f/&8%required%" + actionbar-completed: "✓ ВЫПОЛНЕНО: &a&l%mission%" + + season: + reset: "СБРОС СЕЗОНА\nСезон Battle Pass завершен! Новый сезон начинается прямо сейчас!" + forced-reset: "ПРИНУДИТЕЛЬНЫЙ СБРОС СЕЗОНА\nАдминистратор сбросил сезон Battle Pass!" + reset-warning: "⚠ ВНИМАНИЕ: &fСезон будет сброшен через 2 секунды. Прогресс всех игроков будет утерян!" + reset-complete: "✓ Сезон успешно сброшен!" + reset-admin: "СБРОС СЕЗОНА\n%admin% принудительно сбросил сезон Battle Pass!" + ends-in: "&7До конца сезона: %season_time%" + achievement: "%player% полностью завершил Battle Pass!" + premium-achievement: "%player% стал ЛЕГЕНДОЙ, завершив Premium Battle Pass!" + new-season: "Начался сезон %season%!" + rotation-disabled: "✗ Ротация сезонов отключена в конфиге!" + invalid-season: "✗ Неверный номер сезона! Допустимо от 1 до %max%." + editing-season: "✓ Редактирование наград для сезона %season%. Изменения сохраняются напрямую в папку сезона." + + rewards: + free-claimed: "✓ Бесплатные награды получены!" + premium-claimed: "★ Премиум-награды получены!" + already-claimed: "✗ Вы уже получили эту награду!" + cannot-claim: "✗ Вы не можете получить эту награду!" + locked: "ЗАКРЫТО &7(Нужен уровень %level%)" + item-reward: "&7• &f%amount%x %item%" + item-reward-dropped: "&7• &f%amount%x %item% (Выброшено на землю)" + command-reward: "&7• %reward%" + already-claimed-error: "✗ Эта награда уже получена! Если это ошибка, обратитесь к администрации." + + daily-reward: + claimed: "✓ Ежедневная награда получена! &fВы получили %amount% XP" + already-claimed: "✗ Вы уже забрали ежедневную награду!" + + coins: + distribution-announcement: "BATTLE COINS Топ-10 игроков получают ежедневные Battle Coins!" + distribution-player: "#%rank% %player% &7получил %amount% Battle Coins" + received: "+ %amount% Battle Coins!" + balance: "&7Ваши Battle Coins: %amount%" + added-sender: "✓ Добавлено %amount% Battle Coins игроку %target%" + added-target: "+ %amount% Battle Coins!" + removed-sender: "✗ Убрано %amount% Battle Coins у %target%" + removed-target: "- %amount% Battle Coins!" + insufficient-remove: "✗ У %target% только %current% Battle Coins!" + + shop: + insufficient-coins: "✗ Недостаточно Battle Coins! &7Нужно: %required% &7Есть: %current%" + purchase-success: "✓ Покупка успешна! &fКуплено %item% &fза %price% Battle Coins" + shop-title: "Магазин Battle Pass" + + items: + given: "✓ Выдано %amount%x %item% игроку %target%" + given-dropped: "✓ Выдано %amount%x %item% игроку %target% (Часть предметов выпала)" + received: "✓ Вы получили %amount%x %item%" + already-have-premium: "✗ У вас уже есть Premium Battle Pass!" + premium-activated: "★ PREMIUM АКТИВИРОВАН ★\nТеперь вам доступны все премиум-награды!" + coins-redeemed: "✓ Вы использовали %amount% Battle Coins!" + max-level-reached: "✗ Вы уже достигли максимального уровня!" + xp-boost-used: "★ XP-БУСТ!\nИспользовано %items% эликсиров и получено %amount% XP!" + names: + premium-pass: "Ваучер Premium Pass" + battle-coin: "Жетон Battle Coin" + level-boost: "Эликсир ускорения опыта" + +gui: + battlepass: "&6Battle Pass &8| &7Страница %page%" + missions: "&6Ежедневные миссии" + leaderboard: "&6Топ игроков" + shop: "&6Магазин Battle Pass" + +items: + progress: + name: "&eВаш прогресс" + lore: + - "&7" + - "&8▪ &7Уровень: %level%&7/54" + - "&8▪ &7XP: %xp%&7/%xp_needed%" + - "&7" + - "&8▪ &7Премиум пропуск: %premium_status%" + - "&8▪ &7До конца сезона: %season_time%" + - "&7" + - "&7Выполняйте миссии, чтобы получать XP" + - "&7и открывать крутые награды!" + + premium-status: + active: "&aАктивен" + inactive: "&cНе активен" + + separator: + name: " " + + previous-page: + name: "&e← Предыдущая страница" + lore: + - "&7Нажмите, чтобы перейти на страницу %page%" + + next-page: + name: "&eСледующая страница →" + lore: + - "&7Нажмите, чтобы перейти на страницу %page%" + + missions-button: + name: "&eЕжедневные миссии" + lore: + - "&7" + - "&7Выполняйте ежедневные миссии" + - "&7и получайте бонусный XP!" + - "&7" + - "&8▪ &7Сброс через: %reset_time%" + - "&7" + - "▶ НАЖМИТЕ ДЛЯ ПРОСМОТРА" + + leaderboard-button: + name: "&eТаблица лидеров" + lore: + - "&7" + - "&7Посмотрите топ-10 игроков" + - "&7с наивысшими уровнями Battle Pass!" + - "&7" + - "&8▪ &7Следующие монеты: %coins_time%" + - "&7" + - "▶ НАЖМИТЕ ДЛЯ ПРОСМОТРА" + + shop-button: + name: "&eМагазин Battle Pass" + lore: + - "&7" + - "&7Тратьте Battle Coins на" + - "&7эксклюзивные награды и предметы!" + - "&7" + - "&8▪ &7Ваши монеты: %coins%" + - "&7" + - "▶ НАЖМИТЕ, ЧТОБЫ ОТКРЫТЬ" + + daily-reward: + name: "&eЕжедневная награда" + lore-available: + - "&7" + - "&7Заберите ежедневный бонус XP!" + - "&7" + - "&8▪ &7Награда: %xp% XP" + - "&7" + - "▶ НАЖМИТЕ, ЧТОБЫ ЗАБРАТЬ!" + lore-cooldown: + - "&7" + - "&7Вы уже забрали" + - "&7свою ежедневную награду!" + - "&7" + - "&8▪ &7Награда: %xp% XP" + - "&8▪ &7Следующий сбор: %time%" + - "&7" + - "⏰ ПЕРЕЗАРЯДКА" + + reward-available: + name: "&aНаграда уровня %level%" + lore-header: + - "&7" + - "▼ Награды ▼" + lore-footer: + - "&7" + - "&8▪ &7Требуемый уровень: %level%" + - "&7" + - "▶ НАЖМИТЕ, ЧТОБЫ ЗАБРАТЬ!" + + reward-claimed: + name: "&8Награда уровня %level%" + lore-header: + - "&7" + - "&8▼ Награды ▼" + lore-footer: + - "&7" + - "&8▪ &7Требуемый уровень: &8%level%" + - "&7" + - "&8✓ УЖЕ ПОЛУЧЕНО" + + reward-premium-locked: + name: "&6Премиум-награда уровня %level%" + lore-header: + - "&7" + - "▼ Награды ▼" + lore-footer: + - "&7" + - "&8▪ &7Требуемый уровень: %level%" + - "&7" + - "⭐ ТОЛЬКО PREMIUM" + + reward-level-locked: + name: "&cНаграда уровня %level%" + lore-header: + - "&7" + - "&8▼ Награды ▼" + lore-footer: + - "&7" + - "&8▪ &7Требуемый уровень: %level%" + - "&7" + - "ЗАКРЫТО" + + mission-timer: + name: "&eСброс миссий" + lore: + - "&7" + - "&7Миссии сбросятся через:" + - "%reset_time%" + - "&7" + - "&7Выполните миссии до" + - "&7сброса, чтобы получить XP!" + + mission-completed: + name: "&a%mission%" + lore: + - "&7" + - "&8▪ &7Прогресс: %progress%/%required%" + - "&8▪ &7Награда: %reward_xp% XP" + - "&7" + - "&8▪ &7Сброс через: %reset_time%" + - "&7" + - "✓ ВЫПОЛНЕНО" + + mission-in-progress: + name: "&e%mission%" + lore: + - "&7" + - "&8▪ &7Прогресс: %progress%/%required%" + - "&8▪ &7Награда: %reward_xp% XP" + - "&7" + - "&8▪ &7Сброс через: %reset_time%" + - "&7" + - "⚡ В ПРОЦЕССЕ" + + leaderboard-title: + name: "&eТоп 10 игроков" + lore: + - "&7" + - "&8▪ &7До конца сезона: %season_time%" + - "&8▪ &7Следующие монеты: %coins_time%" + - "&7" + - "&7Соревнуйтесь за первые места" + - "&7и получайте Battle Coins ежедневно!" + + leaderboard-player: + name: "%rank% %player%" + lore: + - "&7" + - "&8▪ &7Уровень: %level%" + - "&8▪ &7Всего уровней: %total_levels%" + - "&8▪ &7XP: %xp%" + - "&8▪ &7Battle Coins: %coins%" + - "&7" + - "%status%" + + leaderboard-rank: + first: "#1" + second: "#2" + third: "#3" + other: "&7#%rank%" + + leaderboard-status: + you: "★ ЭТО ВЫ! ★" + other: "&7Прокачивайтесь, чтобы обогнать их!" + + coins-info: + name: "&eBattle Coins" + lore: + - "&7" + - "&7Battle Coins — это особая валюта," + - "&7которую ежедневно получают лучшие игроки!" + - "&7" + - "▼ Как получить ▼" + - "&7• Быть в топ-10 таблицы лидеров" + - "&7• #1 получает 10 монет" + - "&7• #2 получает 9 монет" + - "&7• ... и так далее" + - "&7" + - "▼ Для чего нужны ▼" + - "&7• Покупка эксклюзивных предметов" + - "&7• Получение особых бонусов" + - "&7• Демонстрация вашего прогресса!" + - "&7" + - "&8▪ &7Следующая выдача: %time%" + + back-button: + name: "&c← Назад" + lore: + - "&7Вернуться в Battle Pass" + + shop-balance: + name: "&eВаш баланс" + lore: + - "&7" + - "&8▪ &7Battle Coins: %coins%" + - "&7" + - "&7Получайте больше монет," + - "&7удерживаясь в топ-10!" + +time: + days-hours: "%days%д %hours%ч" + hours-minutes: "%hours%ч %minutes%м" + day: "день" + days: "дней" + hour: "час" + hours: "часов" + minute: "минута" + minutes: "минут" + available-now: "Доступно сейчас!" + unknown: "Неизвестно" + +reward-types: + free: "Бесплатно" + premium: "Премиум" + +placeholders: + loading: "Загрузка..." + yes: "Да" + no: "Нет" + active: "Активен" + inactive: "Неактивен" + unknown: "Неизвестно" + outside-top: "Вне топа" + mission-completed: "Выполнена" + mission-in-progress: "В процессе" + empty: "Пусто" + +reward-level-locked: + name: "Награда уровня %level%" + lore-header: + - "&7" + - "&8▼ Награды ▼" + lore-footer: + - "&7" + - "&8▪ &7Требуемый уровень: %level%" + - "&7" + - "ЗАКРЫТО" + +reward-claimed: + name: "&8Награда %type% уровня %level%" + lore-header: + - "&7" + - "&8▼ Награды ▼" + lore-footer: + - "&7" + - "&8▪ &7Требуемый уровень: &8%level%" + - "&7" + - "&8✓ УЖЕ ПОЛУЧЕНО" diff --git a/target/classes/missions.yml b/target/classes/missions.yml new file mode 100644 index 0000000..79d0ac9 --- /dev/null +++ b/target/classes/missions.yml @@ -0,0 +1,400 @@ +daily-missions-count: 7 + +mission-pools: + # Боевые миссии - обычные мобы + kill-zombies: + type: KILL_MOB + target: ZOMBIE + display-name: "Убить зомби" + min-required: 15 + max-required: 40 + min-xp: 150 + max-xp: 250 + weight: 10 + + kill-skeletons: + type: KILL_MOB + target: SKELETON + display-name: "Убить скелетов" + min-required: 15 + max-required: 35 + min-xp: 150 + max-xp: 250 + weight: 10 + + kill-spiders: + type: KILL_MOB + target: SPIDER + display-name: "Убить пауков" + min-required: 10 + max-required: 30 + min-xp: 120 + max-xp: 220 + weight: 9 + + kill-creepers: + type: KILL_MOB + target: CREEPER + display-name: "Убить криперов" + min-required: 5 + max-required: 20 + min-xp: 180 + max-xp: 300 + weight: 9 + + # Боевые миссии - Незер/Энд/особые + kill-endermen: + type: KILL_MOB + target: ENDERMAN + display-name: "Убить эндерменов" + min-required: 5 + max-required: 15 + min-xp: 250 + max-xp: 400 + weight: 7 + + kill-blazes: + type: KILL_MOB + target: BLAZE + display-name: "Убить ифритов" + min-required: 10 + max-required: 20 + min-xp: 300 + max-xp: 450 + weight: 6 + + kill-witches: + type: KILL_MOB + target: WITCH + display-name: "Убить ведьм" + min-required: 3 + max-required: 8 + min-xp: 250 + max-xp: 350 + weight: 5 + + kill-piglins: + type: KILL_MOB + target: PIGLIN + display-name: "Убить пиглинов" + min-required: 10 + max-required: 25 + min-xp: 200 + max-xp: 300 + weight: 6 + + kill-magma-cubes: + type: KILL_MOB + target: MAGMA_CUBE + display-name: "Убить магмовых кубов" + min-required: 5 + max-required: 15 + min-xp: 200 + max-xp: 300 + weight: 5 + + # Миссии на добычу + mine-coal: + type: MINE_BLOCK + target: COAL_ORE + display-name: "Добыть угольной руды" + min-required: 30 + max-required: 100 + min-xp: 100 + max-xp: 200 + weight: 10 + + mine-iron: + type: MINE_BLOCK + target: IRON_ORE + display-name: "Добыть железной руды" + min-required: 20 + max-required: 60 + min-xp: 150 + max-xp: 250 + weight: 10 + + mine-gold: + type: MINE_BLOCK + target: GOLD_ORE + display-name: "Добыть золотой руды" + min-required: 10 + max-required: 30 + min-xp: 200 + max-xp: 300 + weight: 8 + + mine-diamonds: + type: MINE_BLOCK + target: DIAMOND_ORE + display-name: "Добыть алмазной руды" + min-required: 5 + max-required: 15 + min-xp: 400 + max-xp: 600 + weight: 6 + + mine-deepslate-diamonds: + type: MINE_BLOCK + target: DEEPSLATE_DIAMOND_ORE + display-name: "Добыть глубинной алмазной руды" + min-required: 5 + max-required: 15 + min-xp: 450 + max-xp: 650 + weight: 6 + + mine-lapis: + type: MINE_BLOCK + target: LAPIS_ORE + display-name: "Добыть лазуритовой руды" + min-required: 15 + max-required: 40 + min-xp: 150 + max-xp: 250 + weight: 7 + + mine-redstone: + type: MINE_BLOCK + target: REDSTONE_ORE + display-name: "Добыть редстоуновой руды" + min-required: 20 + max-required: 50 + min-xp: 150 + max-xp: 250 + weight: 7 + + mine-quartz: + type: MINE_BLOCK + target: NETHER_QUARTZ_ORE + display-name: "Добыть незер-кварца" + min-required: 30 + max-required: 80 + min-xp: 150 + max-xp: 250 + weight: 8 + + mine-ancient-debris: + type: MINE_BLOCK + target: ANCIENT_DEBRIS + display-name: "Добыть древних обломков" + min-required: 2 + max-required: 5 + min-xp: 600 + max-xp: 1000 + weight: 3 + + # Фермерство и природа + break-logs: + type: BREAK_BLOCK + target: OAK_LOG + display-name: "Срубить дубовых брёвен" + min-required: 64 + max-required: 200 + min-xp: 100 + max-xp: 200 + weight: 9 + + break-stone: + type: BREAK_BLOCK + target: STONE + display-name: "Сломать камня" + min-required: 200 + max-required: 500 + min-xp: 100 + max-xp: 200 + weight: 9 + + eat-bread: + type: EAT_ITEM + target: BREAD + display-name: "Съесть хлеба" + min-required: 5 + max-required: 20 + min-xp: 100 + max-xp: 200 + weight: 8 + + eat-steak: + type: EAT_ITEM + target: COOKED_BEEF + display-name: "Съесть стейков" + min-required: 5 + max-required: 20 + min-xp: 120 + max-xp: 220 + weight: 8 + + eat-golden-apple: + type: EAT_ITEM + target: GOLDEN_APPLE + display-name: "Съесть золотых яблок" + min-required: 1 + max-required: 3 + min-xp: 500 + max-xp: 800 + weight: 4 + + # Крафт и плавка + smelt-iron: + type: SMELT_ITEM + target: IRON_INGOT + display-name: "Переплавить железных слитков" + min-required: 32 + max-required: 128 + min-xp: 150 + max-xp: 300 + weight: 8 + + smelt-gold: + type: SMELT_ITEM + target: GOLD_INGOT + display-name: "Переплавить золотых слитков" + min-required: 16 + max-required: 64 + min-xp: 200 + max-xp: 400 + weight: 7 + + craft-bread: + type: CRAFT_ITEM + target: BREAD + display-name: "Скрафтить хлеба" + min-required: 20 + max-required: 64 + min-xp: 100 + max-xp: 200 + weight: 8 + + craft-tnt: + type: CRAFT_ITEM + target: TNT + display-name: "Скрафтить ТНТ" + min-required: 5 + max-required: 20 + min-xp: 300 + max-xp: 500 + weight: 5 + + # Рыбалка + fish-cod: + type: FISH_ITEM + target: COD + display-name: "Поймать трески" + min-required: 10 + max-required: 30 + min-xp: 150 + max-xp: 250 + weight: 7 + + fish-salmon: + type: FISH_ITEM + target: SALMON + display-name: "Поймать лосося" + min-required: 10 + max-required: 30 + min-xp: 150 + max-xp: 250 + weight: 7 + + # Животные и взаимодействия + breed-cows: + type: BREED_ANIMAL + target: COW + display-name: "Развести коров" + min-required: 5 + max-required: 20 + min-xp: 150 + max-xp: 300 + weight: 7 + + breed-sheep: + type: BREED_ANIMAL + target: SHEEP + display-name: "Развести овец" + min-required: 5 + max-required: 20 + min-xp: 150 + max-xp: 300 + weight: 7 + + shear-sheep: + type: SHEAR_SHEEP + target: SHEEP + display-name: "Подстричь овец" + min-required: 10 + max-required: 50 + min-xp: 100 + max-xp: 200 + weight: 8 + + tame-dog: + type: TAME_ANIMAL + target: WOLF + display-name: "Приручить волков" + min-required: 1 + max-required: 5 + min-xp: 300 + max-xp: 500 + weight: 5 + + trade-villager: + type: TRADE_VILLAGER + target: ANY + display-name: "Поторговать раз с жителями" + min-required: 5 + max-required: 20 + min-xp: 200 + max-xp: 400 + weight: 7 + + enchant-items: + type: ENCHANT_ITEM + target: ANY + display-name: "Зачаровать предметов" + min-required: 3 + max-required: 10 + min-xp: 250 + max-xp: 500 + weight: 6 + + # Общий прогресс + gain-xp: + type: GAIN_XP + target: ANY + display-name: "Получить очков опыта" + min-required: 500 + max-required: 2000 + min-xp: 200 + max-xp: 400 + weight: 8 + + walk-distance: + type: WALK_DISTANCE + target: ANY + display-name: "Пройти блоков" + min-required: 2000 + max-required: 10000 + min-xp: 150 + max-xp: 300 + weight: 9 + + deal-damage: + type: DAMAGE_DEALT + target: ANY + display-name: "Нанести урона" + min-required: 1000 + max-required: 5000 + min-xp: 200 + max-xp: 400 + weight: 8 + + play-time: + type: PLAY_TIME + target: ANY + display-name: "Играть минут" + min-required: 60 + max-required: 180 + min-xp: 250 + max-xp: 500 + weight: 7 diff --git a/target/classes/plugin.yml b/target/classes/plugin.yml new file mode 100644 index 0000000..4dff8ee --- /dev/null +++ b/target/classes/plugin.yml @@ -0,0 +1,23 @@ +name: BattlePass +version: '8.1' +main: com.Lino.battlePass.BattlePass +api-version: '1.16' +author: Lino +website: https://www.spigotmc.org/resources/battlepass.125992/ +softdepend: [PlaceholderAPI, MythicMobs] + +commands: + battlepass: + description: Открыть GUI BattlePass или управлять системой боевого пропуска + usage: /battlepass [help|reload|addpremium|removepremium|addxp|removexp|addcoins|removecoins] [игрок] [кол-во] + aliases: [bp, pass] + permission: battlepass.use + permission-message: У вас нет прав на использование этой команды! + +permissions: + battlepass.use: + description: Разрешает использовать команду /battlepass + default: true + battlepass.admin: + description: Доступ к админ-командам (reload, addpremium, removepremium) + default: op diff --git a/target/classes/shop.yml b/target/classes/shop.yml new file mode 100644 index 0000000..5c7d666 --- /dev/null +++ b/target/classes/shop.yml @@ -0,0 +1,156 @@ +shop-items: + # Ваучер Premium Battle Pass + premium-pass-single: + slot: 11 + material: NETHER_STAR + display-name: "★ Ваучер Premium Battle Pass ★" + lore: + - "" + - "Мистический ваучер" + - "&7Откройте легендарный премиум-пропуск" + - "&7и получите доступ к эксклюзивным наградам!" + - "" + - "▼ Особенности ▼" + - "&7• Premium Battle Pass на текущий сезон" + - "&7• Доступ ко всем премиум-наградам" + - "&7• Эксклюзивные предметы и бонусы" + - "" + - "&7Цена: 250 Battle Coins" + - "" + - "▶ НАЖМИТЕ ДЛЯ ПОКУПКИ" + price: 250 + commands: + - "bp giveitem premium 1" + + # Наборы жетонов Battle Coin + coins-small: + slot: 15 + material: GOLD_NUGGET + display-name: "✦ Малый набор монет ✦" + lore: + - "" + - "Набор валюты" + - "&7Небольшая стопка сияющих" + - "&7жетонов Battle Coin" + - "" + - "▼ Содержит ▼" + - "&7• 10 жетонов Battle Coin" + - "&7• После использования = 10 Battle Coins" + - "" + - "&7Цена: 10 Battle Coins" + - "" + - "▶ НАЖМИТЕ ДЛЯ ПОКУПКИ" + price: 10 + commands: + - "bp giveitem coins 10" + + # Эликсиры усиления опыта + xp-boost-single: + slot: 20 + material: EXPERIENCE_BOTTLE + display-name: "✧ Эликсир ускорения опыта ✧" + lore: + - "" + - "Эликсир опыта" + - "&7Одна доза концентрированной" + - "&7эссенции опыта" + - "" + - "▼ Эффект ▼" + - "&7• Даёт +100 XP Battle Pass" + - "&7• Мгновенное усиление опыта" + - "" + - "&7Цена: 15 Battle Coins" + - "" + - "▶ НАЖМИТЕ ДЛЯ ПОКУПКИ" + price: 15 + commands: + - "bp giveitem levelboost 1" + + xp-boost-bundle-small: + slot: 21 + material: EXPERIENCE_BOTTLE + display-name: "✧ Малый XP-набор ✧" + lore: + - "" + - "Набор опыта" + - "&7Небольшой комплект" + - "&7эликсиров опыта" + - "" + - "▼ Содержит ▼" + - "&7• 5 эликсиров опыта" + - "&7• Итого: +500 XP Battle Pass" + - "" + - "&7Цена: 70 Battle Coins" + - "&8&oЭкономия 5 монет!" + - "" + - "▶ НАЖМИТЕ ДЛЯ ПОКУПКИ" + price: 70 + commands: + - "bp giveitem levelboost 5" + + xp-boost-bundle-medium: + slot: 22 + material: EXPERIENCE_BOTTLE + display-name: "✧ Средний XP-набор ✧" + lore: + - "" + - "Набор опыта" + - "&7Щедрый комплект" + - "&7эликсиров опыта" + - "" + - "▼ Содержит ▼" + - "&7• 16 эликсиров опыта" + - "&7• Итого: +1,600 XP Battle Pass" + - "" + - "&7Цена: 200 Battle Coins" + - "&8&oЭкономия 40 монет!" + - "" + - "▶ НАЖМИТЕ ДЛЯ ПОКУПКИ" + price: 200 + commands: + - "bp giveitem levelboost 16" + + xp-boost-bundle-large: + slot: 23 + material: EXPERIENCE_BOTTLE + display-name: "✧ Большой XP-набор ✧" + lore: + - "" + - "Набор опыта" + - "&7Крупный комплект" + - "&7эликсиров опыта" + - "" + - "▼ Содержит ▼" + - "&7• 32 эликсира опыта" + - "&7• Итого: +3,200 XP Battle Pass" + - "" + - "&7Цена: 380 Battle Coins" + - "&8&oЭкономия 100 монет!" + - "" + - "▶ НАЖМИТЕ ДЛЯ ПОКУПКИ" + price: 380 + commands: + - "bp giveitem levelboost 32" + + xp-boost-bundle-mega: + slot: 24 + material: EXPERIENCE_BOTTLE + display-name: "✧ МЕГА XP-набор ✧" + lore: + - "" + - "МЕГА набор опыта" + - "&7Максимальный комплект" + - "&7эликсиров опыта!" + - "" + - "▼ Содержит ▼" + - "&7• 64 эликсира опыта" + - "&7• Итого: +6,400 XP Battle Pass" + - "&7• ★ ЛУЧШАЯ ЦЕНА ★" + - "" + - "&7Цена: 700 Battle Coins" + - "&8&oЭкономия 260 монет!" + - "" + - "▶ НАЖМИТЕ ДЛЯ ПОКУПКИ" + price: 700 + commands: + - "bp giveitem levelboost 64" diff --git a/target/maven-archiver/pom.properties b/target/maven-archiver/pom.properties new file mode 100644 index 0000000..b9bce77 --- /dev/null +++ b/target/maven-archiver/pom.properties @@ -0,0 +1,3 @@ +artifactId=BattlePass +groupId=com.Lino +version=1.0 diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..0dc5d6d --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,66 @@ +com\Lino\battlePass\managers\MissionResetHandler.class +com\Lino\battlePass\managers\RewardEditorManager$1.class +com\Lino\battlePass\managers\PlayerDataManager.class +com\Lino\battlePass\managers\DatabaseManager.class +com\Lino\battlePass\managers\MissionManager.class +com\Lino\battlePass\gui\BattlePassGui.class +com\Lino\battlePass\gui\MissionTypeSelectionGui.class +com\Lino\battlePass\managers\MissionEditorManager.class +com\Lino\battlePass\gui\ShopGui.class +com\Lino\battlePass\models\ShopItem.class +com\Lino\battlePass\BattlePass$2.class +com\Lino\battlePass\utils\MaterialNameResolver.class +com\Lino\battlePass\gui\MissionDetailsGui.class +com\Lino\battlePass\managers\MissionProgressTracker.class +com\Lino\battlePass\managers\ConfigValidator$ValidationReport.class +com\Lino\battlePass\models\MissionTemplate.class +com\Lino\battlePass\tasks\BattlePassTask.class +com\Lino\battlePass\managers\MissionEditorManager$EditorState.class +com\Lino\battlePass\gui\MissionsGui.class +com\Lino\battlePass\models\Mission.class +com\Lino\battlePass\models\Reward.class +com\Lino\battlePass\managers\GuiManager.class +com\Lino\battlePass\managers\ConfigManager.class +com\Lino\battlePass\models\PlayerData.class +com\Lino\battlePass\BattlePass.class +com\Lino\battlePass\placeholders\BattlePassExpansion.class +com\Lino\battlePass\commands\BattlePassTabCompleter.class +com\Lino\battlePass\listeners\CustomItemsListener.class +com\Lino\battlePass\utils\ItemSerializer.class +com\Lino\battlePass\managers\SoundManager$1.class +com\Lino\battlePass\managers\RewardEditorManager$CommandInputState.class +com\Lino\battlePass\models\EditableReward.class +com\Lino\battlePass\managers\MissionEditorManager$2.class +com\Lino\battlePass\listeners\EventManager.class +com\Lino\battlePass\commands\BattlePassCommand.class +com\Lino\battlePass\managers\ShopManager.class +com\Lino\battlePass\gui\BaseGui.class +com\Lino\battlePass\managers\MessageManager.class +com\Lino\battlePass\BattlePass$1.class +com\Lino\battlePass\managers\SoundManager.class +com\Lino\battlePass\managers\RewardEditorManager.class +com\Lino\battlePass\managers\MissionEditorManager$1.class +com\Lino\battlePass\listeners\GuiClickListener.class +com\Lino\battlePass\gui\RewardsCategoryGui.class +com\Lino\battlePass\listeners\MissionProgressListener.class +com\Lino\battlePass\managers\MissionProgressTracker$2.class +com\Lino\battlePass\utils\GradientColorParser.class +com\Lino\battlePass\listeners\GuiClickListener$1.class +com\Lino\battlePass\tasks\CoinsDistributionTask.class +com\Lino\battlePass\managers\MissionEditorManager$EditType.class +com\Lino\battlePass\managers\MissionGenerator$WeightedMissionTemplate.class +com\Lino\battlePass\managers\MissionGenerator.class +com\Lino\battlePass\listeners\RewardsEditorListener.class +com\Lino\battlePass\gui\MissionEditorGui.class +com\Lino\battlePass\listeners\MythicMobsListener.class +com\Lino\battlePass\managers\CustomItemManager.class +com\Lino\battlePass\gui\RewardsEditorGui.class +com\Lino\battlePass\managers\ConfigValidator.class +com\Lino\battlePass\gui\LeaderboardGui.class +com\Lino\battlePass\listeners\PlayerConnectionListener$1.class +com\Lino\battlePass\managers\RewardManager.class +com\Lino\battlePass\managers\SeasonRotationManager.class +com\Lino\battlePass\gui\LevelRewardEditGui.class +com\Lino\battlePass\listeners\PlayerConnectionListener.class +com\Lino\battlePass\managers\MissionProgressTracker$1.class +com\Lino\battlePass\listeners\MissionEditorListener.class diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..5b0a140 --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,51 @@ +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\BattlePass.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\commands\BattlePassCommand.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\commands\BattlePassTabCompleter.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\gui\BaseGui.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\gui\BattlePassGui.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\gui\LeaderboardGui.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\gui\LevelRewardEditGui.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\gui\MissionDetailsGui.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\gui\MissionEditorGui.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\gui\MissionsGui.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\gui\MissionTypeSelectionGui.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\gui\RewardsCategoryGui.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\gui\RewardsEditorGui.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\gui\ShopGui.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\listeners\CustomItemsListener.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\listeners\EventManager.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\listeners\GuiClickListener.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\listeners\MissionEditorListener.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\listeners\MissionProgressListener.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\listeners\MythicMobsListener.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\listeners\PlayerConnectionListener.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\listeners\RewardsEditorListener.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\managers\ConfigManager.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\managers\ConfigValidator.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\managers\CustomItemManager.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\managers\DatabaseManager.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\managers\GuiManager.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\managers\MessageManager.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\managers\MissionEditorManager.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\managers\MissionGenerator.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\managers\MissionManager.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\managers\MissionProgressTracker.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\managers\MissionResetHandler.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\managers\PlayerDataManager.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\managers\RewardEditorManager.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\managers\RewardManager.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\managers\SeasonRotationManager.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\managers\ShopManager.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\managers\SoundManager.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\models\EditableReward.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\models\Mission.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\models\MissionTemplate.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\models\PlayerData.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\models\Reward.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\models\ShopItem.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\placeholders\BattlePassExpansion.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\tasks\BattlePassTask.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\tasks\CoinsDistributionTask.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\utils\GradientColorParser.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\utils\ItemSerializer.java +C:\Users\Mark\Desktop\BattlePass-master\src\main\java\com\Lino\battlePass\utils\MaterialNameResolver.java diff --git a/target/original-BattlePass-1.0.jar b/target/original-BattlePass-1.0.jar new file mode 100644 index 0000000..ecb4c39 Binary files /dev/null and b/target/original-BattlePass-1.0.jar differ