diff --git a/README.md b/README.md index 37658c9..c70c2eb 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Supported Minecraft versions: 1.16.5 ~ 1.21 +Supported Minecraft versions: 1.16.5 ~ 1.21.10 Free version https://www.spigotmc.org/resources/65603/ diff --git a/pom.xml b/pom.xml index f3c31f2..9669be0 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ me.sat7 DynamicShop - 3.120.1 + 3.120.4 jar DynamicShop @@ -104,6 +104,10 @@ rosewood-repo https://repo.rosewooddev.io/repository/public/ + + codemc-repo + https://repo.codemc.io/repository/maven-public/ + @@ -128,12 +132,12 @@ com.opencsv opencsv - 5.2 + 5.11.2 commons-io commons-io - 2.11.0 + 2.14.0 me.clip @@ -162,7 +166,7 @@ com.github.PikaMug LocaleLib - 3.9 + 4.1.1 org.black_ixx diff --git a/src/main/java/me/sat7/dynamicshop/DynaShopAPI.java b/src/main/java/me/sat7/dynamicshop/DynaShopAPI.java index 1626017..f7393bd 100644 --- a/src/main/java/me/sat7/dynamicshop/DynaShopAPI.java +++ b/src/main/java/me/sat7/dynamicshop/DynaShopAPI.java @@ -36,7 +36,7 @@ public static boolean IsShopEnable(String shopName) return shopData.get().getBoolean("Options.enable", true); } - // 상점 UI생성 후 열기 + // 상점 UI생성 후 열기 (建立商店UI後開啟) public static void openShopGui(Player player, String shopName, int page) { if(!IsShopEnable(shopName)) @@ -60,7 +60,7 @@ public static void openShopGui(Player player, String shopName, int page) } } - // 상점 설정 화면 + // 상점 설정 화면 (商店設定畫面) public static void openShopSettingGui(Player player, String shopName) { ShopSettings uiClass = new ShopSettings(); @@ -68,7 +68,7 @@ public static void openShopSettingGui(Player player, String shopName) UIManager.Open(player, inventory, uiClass); } - // 상점 로테이트 편집기 + // 상점 로테이트 편집기 (商店輪換編輯器) public static void OpenRotationEditor(Player player, String shopName) { RotationEditor uiClass = new RotationEditor(); @@ -76,7 +76,7 @@ public static void OpenRotationEditor(Player player, String shopName) UIManager.Open(player, inventory, uiClass); } - // 거래화면 생성 및 열기 + // 거래화면 생성 및 열기 (建立並開啟交易畫面) public static void openItemTradeGui(Player player, String shopName, String tradeIdx) { if(!IsShopEnable(shopName)) @@ -94,7 +94,7 @@ public static void openItemTradeGui(Player player, String shopName, String trade } - // 아이탬 파렛트 생성 및 열기 + // 아이탬 파렛트 생성 및 열기 (建立並開啟物品調色盤) public static void openItemPalette(Player player, int uiSubType, String shopName, int targetSlot, int page, String search) { ItemPalette uiClass = new ItemPalette(); @@ -114,7 +114,7 @@ public static void openItemSettingGui(Player player, String shopName, int shopSl UIManager.Open(player, inventory, uiClass); } - // 페이지 에디터 열기 + // 페이지 에디터 열기 (開啟頁面編輯器) public static void openPageEditor(Player player, String shopName, int page) { PageEditor uiClass = new PageEditor(); @@ -122,7 +122,7 @@ public static void openPageEditor(Player player, String shopName, int page) UIManager.Open(player, inventory, uiClass); } - // 로그뷰어 열기 + // 로그뷰어 열기 (開啟日誌檢視器) public static void openLogViewer(Player player, String shopName) { LogViewer uiClass = new LogViewer(); @@ -130,7 +130,7 @@ public static void openLogViewer(Player player, String shopName) UIManager.Open(player, inventory, uiClass); } - // 재고 시뮬레이터 열기 + // 재고 시뮬레이터 열기 (開啟庫存模擬器) public static void openStockSimulator(Player player, String shopName) { StockSimulator uiClass = new StockSimulator(); @@ -138,7 +138,7 @@ public static void openStockSimulator(Player player, String shopName) UIManager.Open(player, inventory, uiClass); } - // 스타트 페이지 + // 스타트 페이지 (起始頁) public static void openStartPage(Player player) { StartPage uiClass = new StartPage(); @@ -146,7 +146,7 @@ public static void openStartPage(Player player) UIManager.Open(player, inventory, uiClass); } - // 상점 목록창 + // 상점 목록창 (商店列表視窗) public static void openShopListUI(Player player, int page, int slotIndex) { ShopList uiClass = new ShopList(); @@ -154,7 +154,7 @@ public static void openShopListUI(Player player, int page, int slotIndex) UIManager.Open(player, inventory, uiClass); } - // 컬러 픽커 + // 컬러 픽커 (顏色選擇器) public static void openColorPicker(Player player, int slotIndex) { ColorPicker uiClass = new ColorPicker(); @@ -162,7 +162,7 @@ public static void openColorPicker(Player player, int slotIndex) UIManager.Open(player, inventory, uiClass); } - // 퀵셀 창 + // 퀵셀 창 (快速銷售視窗) public static void openQuickSellGUI(Player player) { QuickSell uiClass = new QuickSell(); @@ -170,13 +170,13 @@ public static void openQuickSellGUI(Player player) UIManager.Open(player, inventory, uiClass); } - // 유저 데이터를 다시 만들고 만들어졌는지 확인함. + // 유저 데이터를 다시 만들고 만들어졌는지 확인함. (重新建立使用者資料並確認是否已建立) public static boolean recreateUserData(Player player) { return UserUtil.RecreateUserData(player); } - // 스타트페이지 셋팅창 + // 스타트페이지 셋팅창 (起始頁設定視窗) public static void openStartPageSettingGui(Player player, int slotIndex) { StartPageSettings uiClass = new StartPageSettings(); @@ -245,10 +245,10 @@ public static ArrayList getShopItems(@NonNull String shopName) if (!data.get().contains(s + ".value")) { - continue; // 장식용임 + continue; // 장식용임 (裝飾用) } - String itemName = data.get().getString(s + ".mat"); // 메테리얼 + String itemName = data.get().getString(s + ".mat"); // 메테리얼 (材料) try { Material mat = Material.getMaterial(itemName); diff --git a/src/main/java/me/sat7/dynamicshop/DynamicShop.java b/src/main/java/me/sat7/dynamicshop/DynamicShop.java index 86a975b..b7d4913 100644 --- a/src/main/java/me/sat7/dynamicshop/DynamicShop.java +++ b/src/main/java/me/sat7/dynamicshop/DynamicShop.java @@ -42,7 +42,7 @@ public final class DynamicShop extends JavaPlugin implements Listener { - private static Economy econ = null; // 볼트에 물려있는 이코노미 + private static Economy econ = null; // 볼트에 물려있는 이코노미 (與Vault掛鉤的經濟系統) public static Economy getEconomy() { return econ; @@ -203,14 +203,14 @@ private void Init() RotationUtil.RestartAllRotationTask(); - // 완료 + // 완료 (完成) console.sendMessage(Constants.DYNAMIC_SHOP_PREFIX + " Enabled! :)"); CheckUpdate(); InitBstats(); } - // 볼트 이코노미 초기화 + // 볼트 이코노미 초기화 (Vault經濟系統初始化) private void SetupVault() { if (getServer().getPluginManager().getPlugin("Vault") == null) @@ -380,8 +380,8 @@ public void PeriodicRepetitiveTask() periodicRepetitiveTask.cancel(); } - // 1000틱 = 50초 = 마인크래프트 1시간 - // 20틱 = 현실시간 1초 + // 1000틱 = 50초 = 마인크래프트 1시간 (1000 tick = 50秒 = Minecraft 1小時) + // 20틱 = 현실시간 1초 (20 tick = 現實時間 1秒) periodicRepetitiveTask = Bukkit.getScheduler().runTaskTimer(DynamicShop.plugin, this::RepeatAction, 20, 20); } @@ -394,7 +394,7 @@ private void RepeatAction() //String time = sdf.format(System.currentTimeMillis()); //console.sendMessage(time + " / " + repeatTaskCount); - if (repeatTaskCount == 25) // 25초 = 500틱 = 마인크래프트 30분 + if (repeatTaskCount == 25) // 25초 = 500틱 = 마인크래프트 30분 (25秒 = 500 tick = Minecraft 30分鐘) { ShopUtil.randomChange(new Random()); repeatTaskCount = 0; @@ -458,12 +458,12 @@ private void hookIntoPlayerPoints() private void initCommands() { - // 명령어 등록 (개별 클레스로 되어있는것들) + // 명령어 등록 (개별 클레스로 되어있는것들) (指令註冊(分別在不同的類別中)) getCommand("DynamicShop").setExecutor(new Root()); getCommand("shop").setExecutor(new Optional()); getCommand("sell").setExecutor(new Sell()); - // 자동완성 + // 자동완성 (自動完成) getCommand("DynamicShop").setTabCompleter(this); getCommand("shop").setTabCompleter(this); getCommand("sell").setTabCompleter(this); @@ -484,7 +484,7 @@ private void registerEvents() private void makeFolders() { File shopFolder = new File(getDataFolder(), "Shop"); - shopFolder.mkdir(); // new 하고 같은줄에서 바로 하면 폴더 안만들어짐. + shopFolder.mkdir(); // new 하고 같은줄에서 바로 하면 폴더 안만들어짐. (如果在new的同一行直接執行,資料夾不會建立) File rotationFolder = new File(getDataFolder(), "Rotation"); rotationFolder.mkdir(); @@ -498,8 +498,9 @@ private void InitConfig() UserUtil.Init(); ShopUtil.Reload(); ConfigUtil.Load(); + DynamicShop.DEBUG_MODE = ConfigUtil.GetDebugMode(); - LangUtil.setupLangFile(ConfigUtil.GetLanguage()); // ConfigUtil.Load() 보다 밑에 있어야함. + LangUtil.setupLangFile(ConfigUtil.GetLanguage()); // ConfigUtil.Load() 보다 밑에 있어야함. (必須在 ConfigUtil.Load() 之後) LayoutUtil.Setup(); StartPage.setupStartPageFile(); @@ -518,7 +519,7 @@ private void setupSignFile() ccSign.save(); } - // 명령어 자동완성 + // 명령어 자동완성 (指令自動完成) @Override public List onTabComplete(CommandSender sender, Command cmd, String commandLabel, String[] args) { diff --git a/src/main/java/me/sat7/dynamicshop/commands/CMDManager.java b/src/main/java/me/sat7/dynamicshop/commands/CMDManager.java index ece64aa..3dbe7c6 100644 --- a/src/main/java/me/sat7/dynamicshop/commands/CMDManager.java +++ b/src/main/java/me/sat7/dynamicshop/commands/CMDManager.java @@ -123,6 +123,8 @@ public static void RunCMD(String key, String[] args, CommandSender sender) if(CMDHashMap.containsKey(key)) { CMDHashMap.get(key).RunCMD(args, sender); + } else { + Help.showHelp("main", sender, args); } } } diff --git a/src/main/java/me/sat7/dynamicshop/commands/DeleteUser.java b/src/main/java/me/sat7/dynamicshop/commands/DeleteUser.java index cf1cb90..3e82f71 100644 --- a/src/main/java/me/sat7/dynamicshop/commands/DeleteUser.java +++ b/src/main/java/me/sat7/dynamicshop/commands/DeleteUser.java @@ -62,7 +62,7 @@ public void RunCMD(String[] args, CommandSender sender) if (lastJoinLong == 0) continue; - // 마지막으로 접속한지 입력한 일보다 더 지남. + // 마지막으로 접속한지 입력한 일보다 더 지남. (最後上線時間已超過輸入的天數) long dayPassed = currentTime - lastJoinLong; if (dayPassed > target) { diff --git a/src/main/java/me/sat7/dynamicshop/commands/Help.java b/src/main/java/me/sat7/dynamicshop/commands/Help.java index 30cbbbf..2ab5291 100644 --- a/src/main/java/me/sat7/dynamicshop/commands/Help.java +++ b/src/main/java/me/sat7/dynamicshop/commands/Help.java @@ -3,6 +3,7 @@ import me.sat7.dynamicshop.commands.shop.Command; import me.sat7.dynamicshop.utilities.UserUtil; import org.bukkit.Material; +import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -22,7 +23,7 @@ private Help() } - // 명령어 도움말 표시 + // 명령어 도움말 표시 (顯示指令說明) public static void showHelp(String helpcode, Player player, String[] args) { if (!UserUtil.ccUser.get().getBoolean(player.getUniqueId() + ".cmdHelp")) @@ -103,7 +104,9 @@ public static void showHelp(String helpcode, Player player, String[] args) { try { - ItemStack tempItem = new ItemStack(Material.getMaterial(args[3])); + Material material = Material.getMaterial(args[3]); + if(material == null) return; + ItemStack tempItem = new ItemStack(material); int idx = ShopUtil.findItemFromShop(args[1], tempItem); if (idx != -1) @@ -124,7 +127,9 @@ public static void showHelp(String helpcode, Player player, String[] args) { try { - ItemStack tempItem = new ItemStack(Material.getMaterial(args[3].substring(args[3].indexOf("/") + 1))); + Material material = Material.getMaterial(args[3].substring(args[3].indexOf("/") + 1)); + if(material == null) return; + ItemStack tempItem = new ItemStack(material); int idx = ShopUtil.findItemFromShop(args[1], tempItem); if (idx != -1) @@ -222,5 +227,193 @@ else if (helpcode.equals("background")) { CMDManager.background.SendHelpMessage(player); } + else + { + CMDManager.commandHelp.SendHelpMessage(player); + } + } + + public static void showHelp(String helpcode, CommandSender sender, String[] args) { + // 控制台不需要权限和用户数据检查 + + switch (helpcode) { + case "main": + sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "HELP.TITLE").replace("{command}", "main")); + sender.sendMessage(" - shop: " + t(sender, "HELP.SHOP")); + sender.sendMessage(" - qsell: " + t(sender, "HELP.QSELL")); + sender.sendMessage(" - cmdHelp: " + t(sender, "HELP.CMD")); + sender.sendMessage("§e - createshop: " + t(sender, "HELP.CREATE_SHOP")); + sender.sendMessage("§e - deleteshop: " + t(sender, "HELP.DELETE_SHOP")); + sender.sendMessage("§e - reload: " + t(sender, "HELP.RELOAD")); + sender.sendMessage(""); + break; + case "shop": + sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "HELP.TITLE").replace("{command}", "shop")); + sender.sendMessage(" - " + t(sender, "HELP.USAGE") + ": /ds shop []"); + sender.sendMessage(" - " + t(sender, "HELP.USAGE") + + ": /ds shop "); + + sender.sendMessage("§e - enable: " + t(sender, "HELP.SHOP_ENABLE")); + sender.sendMessage("§e - add: " + t(sender, "HELP.SHOP_ADD_ITEM")); + sender.sendMessage("§e - edit: " + t(sender, "HELP.SHOP_EDIT")); + sender.sendMessage("§e - editall: " + t(sender, "HELP.EDIT_ALL")); + sender.sendMessage("§e - setToRecAll: " + t(sender, "HELP.SET_TO_REC_ALL")); + sender.sendMessage(""); + break; + case "open_shop": + sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "HELP.TITLE").replace("{command}", "open_shop")); + sender.sendMessage(" - " + t(sender, "HELP.USAGE") + ": /ds openshop [player]"); + sender.sendMessage(""); + break; + case "enable": + sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "HELP.TITLE").replace("{command}", "enable")); + sender.sendMessage(" - " + t(sender, "HELP.USAGE") + ": /ds shop enable "); + sender.sendMessage(""); + break; + case "add": + sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "HELP.TITLE").replace("{command}", "add")); + sender.sendMessage(" - " + t(sender, "HELP.USAGE") + ": /ds shop add [display_name]"); + sender.sendMessage(""); + break; + case "edit": + sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "HELP.TITLE").replace("{command}", "edit")); + sender.sendMessage(" - " + t(sender, "HELP.USAGE") + ": /ds shop edit "); + sender.sendMessage(""); + break; + case "edit_all": + sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "HELP.TITLE").replace("{command}", "edit_all")); + sender.sendMessage(" - " + t(sender, "HELP.USAGE") + ": /ds shop editall "); + sender.sendMessage(""); + break; + case "set_to_rec_all": + sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "HELP.TITLE").replace("{command}", "set_to_rec_all")); + sender.sendMessage(" - " + t(sender, "HELP.USAGE") + ": /ds shop setToRecAll"); + sender.sendMessage(""); + break; + case "cmd_help": + sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "HELP.TITLE").replace("{command}", "cmdHelp")); + sender.sendMessage(" - " + t(sender, "HELP.USAGE") + ": /ds cmdHelp "); + sender.sendMessage(" - " + t(sender, "HELP.CMD")); + sender.sendMessage(""); + break; + case "iteminfo": + sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "HELP.TITLE").replace("{command}", "iteminfo")); + sender.sendMessage(" - " + t(sender, "HELP.USAGE") + ": /ds iteminfo"); + sender.sendMessage(""); + break; + case "create_shop": + sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "HELP.TITLE").replace("{command}", "createshop")); + sender.sendMessage(" - " + t(sender, "HELP.USAGE") + ": /ds createshop "); + sender.sendMessage(""); + break; + case "delete_shop": + sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "HELP.TITLE").replace("{command}", "deleteshop")); + sender.sendMessage(" - " + t(sender, "HELP.USAGE") + ": /ds deleteshop "); + sender.sendMessage(""); + break; + case "merge_shop": + sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "HELP.TITLE").replace("{command}", "mergeshop")); + sender.sendMessage(" - " + t(sender, "HELP.USAGE") + ": /ds mergeshop "); + sender.sendMessage(""); + break; + case "rename_shop": + sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "HELP.TITLE").replace("{command}", "renameshop")); + sender.sendMessage(" - " + t(sender, "HELP.USAGE") + ": /ds renameshop "); + sender.sendMessage(""); + break; + case "copy_shop": + sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "HELP.TITLE").replace("{command}", "copyshop")); + sender.sendMessage(" - " + t(sender, "HELP.USAGE") + ": /ds copyshop "); + sender.sendMessage(""); + break; + case "permission": + sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "HELP.TITLE").replace("{command}", "permission")); + sender.sendMessage(" - " + t(sender, "HELP.USAGE") + ": /ds shop permission "); + sender.sendMessage(""); + break; + case "max_page": + sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "HELP.TITLE").replace("{command}", "maxpage")); + sender.sendMessage(" - " + t(sender, "HELP.USAGE") + ": /ds shop maxpage "); + sender.sendMessage(""); + break; + case "currency": + sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "HELP.TITLE").replace("{command}", "currency")); + sender.sendMessage(" - " + t(sender, "HELP.USAGE") + ": /ds shop currency "); + sender.sendMessage(""); + break; + case "flag": + sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "HELP.TITLE").replace("{command}", "flag")); + sender.sendMessage(" - " + t(sender, "HELP.USAGE") + ": /ds shop flag "); + sender.sendMessage(""); + break; + case "position": + sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "HELP.TITLE").replace("{command}", "position")); + sender.sendMessage(" - " + t(sender, "HELP.USAGE") + ": /ds shop position"); + sender.sendMessage(""); + break; + case "shophours": + sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "HELP.TITLE").replace("{command}", "shophours")); + sender.sendMessage(" - " + t(sender, "HELP.USAGE") + ": /ds shop shophours "); + sender.sendMessage(""); + break; + case "fluctuation": + sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "HELP.TITLE").replace("{command}", "fluctuation")); + sender.sendMessage(" - " + t(sender, "HELP.USAGE") + ": /ds shop fluctuation "); + sender.sendMessage(""); + break; + case "stock_stabilizing": + sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "HELP.TITLE").replace("{command}", "stockStabilizing")); + sender.sendMessage(" - " + t(sender, "HELP.USAGE") + ": /ds shop stockStabilizing "); + sender.sendMessage(""); + break; + case "command": + sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "HELP.TITLE").replace("{command}", "command")); + sender.sendMessage(" - " + t(sender, "HELP.USAGE") + ": /ds shop command add "); + sender.sendMessage(" - " + t(sender, "HELP.USAGE") + ": /ds shop command delete "); + sender.sendMessage(" - " + t(sender, "HELP.USAGE") + ": /ds shop command active "); + sender.sendMessage(""); + Command.PrintCurrentState(sender, Shop.GetShopName(args), true, true); + break; + case "account": + sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "HELP.TITLE").replace("{command}", "account")); + sender.sendMessage(" - " + t(sender, "HELP.USAGE") + ": /ds shop account [value]"); + sender.sendMessage(""); + break; + case "set_tax": + sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "HELP.TITLE").replace("{command}", "settax")); + sender.sendMessage(" - " + t(sender, "HELP.USAGE") + ": /ds settax "); + sender.sendMessage(""); + break; + case "set_default_shop": + sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "HELP.TITLE").replace("{command}", "setdefaultshop")); + sender.sendMessage(" - " + t(sender, "HELP.USAGE") + ": /ds setdefaultshop "); + sender.sendMessage(""); + break; + case "delete_old_user": + sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "HELP.TITLE").replace("{command}", "deleteolduser")); + sender.sendMessage(" - " + t(sender, "HELP.USAGE") + ": /ds deleteolduser "); + sender.sendMessage(""); + break; + case "sellbuy": + sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "HELP.TITLE").replace("{command}", "sellbuy")); + sender.sendMessage(" - " + t(sender, "HELP.USAGE") + ": /ds shop sellbuy "); + sender.sendMessage(""); + break; + case "log": + sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "HELP.TITLE").replace("{command}", "log")); + sender.sendMessage(" - " + t(sender, "HELP.USAGE") + ": /ds shop log "); + sender.sendMessage(""); + break; + case "resetTradingVolume": + sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "HELP.TITLE").replace("{command}", "resetTradingVolume")); + sender.sendMessage(" - " + t(sender, "HELP.USAGE") + ": /ds shop resetTradingVolume"); + sender.sendMessage(""); + break; + case "background": + sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "HELP.TITLE").replace("{command}", "background")); + sender.sendMessage(" - " + t(sender, "HELP.USAGE") + ": /ds shop background "); + sender.sendMessage(""); + break; + } } } diff --git a/src/main/java/me/sat7/dynamicshop/commands/Reload.java b/src/main/java/me/sat7/dynamicshop/commands/Reload.java index 0e35da5..e862cca 100644 --- a/src/main/java/me/sat7/dynamicshop/commands/Reload.java +++ b/src/main/java/me/sat7/dynamicshop/commands/Reload.java @@ -65,7 +65,7 @@ public void RunCMD(String[] args, CommandSender sender) QuickSell.quickSellGui.reload(); QuickSell.SetupQuickSellGUIFile(); - LangUtil.setupLangFile(ConfigUtil.GetLanguage()); // ConfigUtil.Load() 보다 밑에 있어야함. + LangUtil.setupLangFile(ConfigUtil.GetLanguage()); // ConfigUtil.Load() 보다 밑에 있어야함. (必須在 ConfigUtil.Load() 之後) RotationUtil.Reload(); diff --git a/src/main/java/me/sat7/dynamicshop/commands/Root.java b/src/main/java/me/sat7/dynamicshop/commands/Root.java index a7c8eb1..e7f6947 100644 --- a/src/main/java/me/sat7/dynamicshop/commands/Root.java +++ b/src/main/java/me/sat7/dynamicshop/commands/Root.java @@ -18,6 +18,39 @@ public class Root implements CommandExecutor @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + if (args.length > 0) + { + if (args[0].equalsIgnoreCase("dbgToggle")) + { + if (sender instanceof Player && !sender.hasPermission(Constants.P_ADMIN_SHOP_EDIT)) { + sender.sendMessage(DynamicShop.dsPrefix((Player)sender) + t((Player)sender, "ERR.NO_PERMISSION")); + return true; + } + DynamicShop.DEBUG_MODE = !DynamicShop.DEBUG_MODE; + sender.sendMessage(Constants.DYNAMIC_SHOP_PREFIX + "DebugMode " + DynamicShop.DEBUG_MODE); + return true; + } + else if (args[0].equalsIgnoreCase("dbgLog")) + { + if (sender instanceof Player && !sender.hasPermission(Constants.P_ADMIN_SHOP_EDIT)) { + sender.sendMessage(DynamicShop.dsPrefix((Player)sender) + t((Player)sender, "ERR.NO_PERMISSION")); + return true; + } + DynamicShop.DEBUG_LOG_ENABLED = !DynamicShop.DEBUG_LOG_ENABLED; + sender.sendMessage(Constants.DYNAMIC_SHOP_PREFIX + "DebugLog " + DynamicShop.DEBUG_LOG_ENABLED); + return true; + } + else if (args[0].equalsIgnoreCase("dbg") && DynamicShop.DEBUG_MODE) + { + if (sender instanceof Player && !sender.hasPermission(Constants.P_ADMIN_SHOP_EDIT)) { + sender.sendMessage(DynamicShop.dsPrefix((Player)sender) + t((Player)sender, "ERR.NO_PERMISSION")); + return true; + } + DynamicShop.DebugLog(); + return true; + } + } + boolean senderIsPlayer = (sender instanceof Player); if(senderIsPlayer) { @@ -35,14 +68,14 @@ public boolean onCommand(CommandSender sender, Command command, String label, St return true; } - // user.yml 에 player가 없으면 재생성 시도. 실패시 리턴. + // user.yml 에 player가 없으면 재생성 시도. 실패시 리턴. (如果 player 不在 user.yml 中,請嘗試重新建立。如果失敗,則返回。) if (!DynaShopAPI.recreateUserData(player)) { player.sendMessage(DynamicShop.dsPrefix(player) + t(player, "ERR.NO_USER_ID")); return true; } - // 스타트페이지 + // 스타트페이지 (起始頁) if (args.length == 0) { DynaShopAPI.openStartPage(player); @@ -72,29 +105,12 @@ else if (args[0].equalsIgnoreCase("dummyUUID") && DynamicShop.DEBUG_MODE && play return true; } } - // 콘솔에서 실행했음. + // 콘솔에서 실행했음. (從控制台執行) else { if (args.length > 0) { - if (args[0].equalsIgnoreCase("dbgToggle")) - { - DynamicShop.DEBUG_MODE = !DynamicShop.DEBUG_MODE; - sender.sendMessage(Constants.DYNAMIC_SHOP_PREFIX + "DebugMode " + DynamicShop.DEBUG_MODE); - return true; - } - else if (args[0].equalsIgnoreCase("dbgLog")) - { - DynamicShop.DEBUG_LOG_ENABLED = !DynamicShop.DEBUG_LOG_ENABLED; - sender.sendMessage(Constants.DYNAMIC_SHOP_PREFIX + "DebugLog " + DynamicShop.DEBUG_LOG_ENABLED); - return true; - } - else if (args[0].equalsIgnoreCase("dbg") && DynamicShop.DEBUG_MODE) - { - DynamicShop.DebugLog(); - return true; - } - else if (args[0].equalsIgnoreCase("shop")) + if (args[0].equalsIgnoreCase("shop")) { Shop.shopCommand(args, sender); return true; diff --git a/src/main/java/me/sat7/dynamicshop/commands/Shop.java b/src/main/java/me/sat7/dynamicshop/commands/Shop.java index 6575874..80fc68c 100644 --- a/src/main/java/me/sat7/dynamicshop/commands/Shop.java +++ b/src/main/java/me/sat7/dynamicshop/commands/Shop.java @@ -53,7 +53,7 @@ static void shopCommand(String[] args, CommandSender sender) String shopName = GetShopName(args); - // 그런 이름을 가진 상점이 있는지 확인 + // 그런 이름을 가진 상점이 있는지 확인 (檢查是否存在具有該名稱的商店) if (player != null && !ShopUtil.shopConfigFiles.containsKey(shopName)) { player.sendMessage(DynamicShop.dsPrefix(player) + t(player, "ERR.SHOP_NOT_FOUND")); @@ -62,10 +62,10 @@ static void shopCommand(String[] args, CommandSender sender) CustomConfig shopData = ShopUtil.shopConfigFiles.get(shopName); - // 상점 UI 열기 + // 상점 UI 열기 (開啟商店UI) if (player != null && args.length <= 2) { - //권한 확인 + //권한 확인 (權限確認) String s = shopData.get().getString("Options.permission"); if (s != null && s.length() > 0) { @@ -76,7 +76,7 @@ static void shopCommand(String[] args, CommandSender sender) } } - // 플래그 확인 + // 플래그 확인 (旗標確認) ConfigurationSection shopConf = shopData.get().getConfigurationSection("Options"); if (shopConf.contains("flag.signshop")) { @@ -123,7 +123,7 @@ static void shopCommand(String[] args, CommandSender sender) DynaShopAPI.openShopGui(player, shopName, 1); } - // 그외 각종 상점관련 명령어 + // 그외 각종 상점관련 명령어 (其他各種商店相關指令) else if (args.length >= 3) { CMDManager.RunCMD(args[2].toLowerCase(), args, sender); diff --git a/src/main/java/me/sat7/dynamicshop/commands/shop/Account.java b/src/main/java/me/sat7/dynamicshop/commands/shop/Account.java index 3fa6d80..3dfdff7 100644 --- a/src/main/java/me/sat7/dynamicshop/commands/shop/Account.java +++ b/src/main/java/me/sat7/dynamicshop/commands/shop/Account.java @@ -72,19 +72,19 @@ public void RunCMD(String[] args, CommandSender sender) } break; case "linkto": - // 그런 상점(타깃) 없음 + // 그런 상점(타깃) 없음 (沒有這樣的商店(目標)) if (!ShopUtil.shopConfigFiles.containsKey(args[4])) { sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "ERR.SHOP_NOT_FOUND")); return; } - // 타깃 상점이 연동계좌임 + // 타깃 상점이 연동계좌임 (目標商店是連結帳戶) if (targetShopData.get().contains("Options.Balance")) { try { - // temp 를 직접 사용하지는 않지만 의도적으로 넣은 코드임. 숫자가 아니면 건너뛰기 위함. + // temp 를 직접 사용하지는 않지만 의도적으로 넣은 코드임. 숫자가 아니면 건너뛰기 위함. (雖然沒有直接使用temp,但這是刻意加入的程式碼。目的是為了跳過非數字的情況。) Double temp = Double.parseDouble(targetShopData.get().getString("Options.Balance")); } catch (Exception e) { @@ -93,7 +93,7 @@ public void RunCMD(String[] args, CommandSender sender) } } - // 출발상점을 타깃으로 하는 상점이 있음 + // 출발상점을 타깃으로 하는 상점이 있음 (有以出發商店為目標的商店) for (CustomConfig tempShopData : ShopUtil.shopConfigFiles.values()) { String temp = tempShopData.get().getString("Options.Balance"); @@ -110,14 +110,14 @@ public void RunCMD(String[] args, CommandSender sender) } } - // 출발 상점과 도착 상점이 같음 + // 출발 상점과 도착 상점이 같음 (出發商店和到達商店相同) if (args[1].equals(args[4])) { sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "ERR.WRONG_USAGE")); return; } - // 출발 상점과 도착 상점의 통화 유형이 다름 + // 출발 상점과 도착 상점의 통화 유형이 다름 (出發商店和到達商店的貨幣類型不同) if (!ShopUtil.GetCurrency(shopData).equals(ShopUtil.GetCurrency(targetShopData))) { sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "ERR.SHOP_DIFF_CURRENCY")); @@ -129,7 +129,7 @@ public void RunCMD(String[] args, CommandSender sender) sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "MESSAGE.CHANGES_APPLIED") + args[4]); break; case "transfer": - //[4] 대상 [5] 금액 + //[4] 대상 [5] 금액 ([4] 對象 [5] 金額) if (args.length < 6) { sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "ERR.WRONG_USAGE")); @@ -137,7 +137,7 @@ public void RunCMD(String[] args, CommandSender sender) } double amount; - // 마지막 인자가 숫자가 아님 + // 마지막 인자가 숫자가 아님 (最後一個參數不是數字) try { amount = Double.parseDouble(args[5]); @@ -147,14 +147,14 @@ public void RunCMD(String[] args, CommandSender sender) return; } - // 출발 상점이 무한계좌임 + // 출발 상점이 무한계좌임 (出發商店是無限帳戶) if (!shopData.get().contains("Options.Balance")) { sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "ERR.SHOP_HAS_INF_BAL").replace("{shop}", args[1])); return; } - // 출발 상점에 돈이 부족 + // 출발 상점에 돈이 부족 (出發商店金額不足) if (ShopUtil.getShopBalance(args[1]) < amount) { if (ShopUtil.GetCurrency(shopData).equalsIgnoreCase(Constants.S_JOBPOINT)) @@ -180,31 +180,31 @@ else if (ShopUtil.GetCurrency(shopData).equalsIgnoreCase(Constants.S_EXP)) return; } - // 다른 상점으로 송금 + // 다른 상점으로 송금 (匯款到其他商店) if (ShopUtil.shopConfigFiles.containsKey(args[4])) { - // 도착 상점이 무한계좌임 + // 도착 상점이 무한계좌임 (到達商店是無限帳戶) if (!targetShopData.get().contains("Options.Balance")) { sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "ERR.SHOP_HAS_INF_BAL").replace("{shop}", args[4])); return; } - // 출발 상점과 도착 상점이 같음 + // 출발 상점과 도착 상점이 같음 (出發商店和到達商店相同) if (args[1].equals(args[4])) { sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "ERR.WRONG_USAGE")); return; } - // 출발 상점과 도착 상점의 통화 유형이 다름 + // 출발 상점과 도착 상점의 통화 유형이 다름 (出發商店和到達商店的貨幣類型不同) if (!ShopUtil.GetCurrency(shopData).equals(ShopUtil.GetCurrency(targetShopData))) { sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "ERR.SHOP_DIFF_CURRENCY")); return; } - // 송금. + // 송금. (匯款.) ShopUtil.addShopBalance(args[1], amount * -1); ShopUtil.addShopBalance(args[4], amount); @@ -213,7 +213,7 @@ else if (ShopUtil.GetCurrency(shopData).equalsIgnoreCase(Constants.S_EXP)) sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "MESSAGE.TRANSFER_SUCCESS")); } - // 플레이어에게 송금 + // 플레이어에게 송금 (匯款給玩家) else { try diff --git a/src/main/java/me/sat7/dynamicshop/commands/shop/Add.java b/src/main/java/me/sat7/dynamicshop/commands/shop/Add.java index 2a96f3b..fb63221 100644 --- a/src/main/java/me/sat7/dynamicshop/commands/shop/Add.java +++ b/src/main/java/me/sat7/dynamicshop/commands/shop/Add.java @@ -69,7 +69,7 @@ public void RunCMD(String[] args, CommandSender sender) median = Integer.parseInt(args[7]); stock = Integer.parseInt(args[8]); - // 유효성 검사 + // 유효성 검사 (有效性檢查) if (valueMax > 0 && valueMin > 0 && valueMin >= valueMax) { sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "ERR.MAX_LOWER_THAN_MIN")); @@ -98,14 +98,14 @@ public void RunCMD(String[] args, CommandSender sender) return; } - // 금지품목 + // 금지품목 (禁止品項) if (Material.getMaterial(args[3]) == Material.AIR) { sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "ERR.ITEM_FORBIDDEN")); return; } - // 상점에서 같은 아이탬 찾기 + // 상점에서 같은 아이탬 찾기 (在商店中尋找相同的物品) ItemStack itemStack; try { @@ -119,20 +119,20 @@ public void RunCMD(String[] args, CommandSender sender) int idx = ShopUtil.findItemFromShop(shopName, itemStack); DSItem temp = new DSItem(itemStack, buyValue, buyValue, valueMin, valueMax, median, stock); - // 상점에 새 아이탬 추가 + // 상점에 새 아이탬 추가 (向商店新增物品) if (idx == -1) { idx = ShopUtil.findEmptyShopSlot(shopName, 1, true); if (idx == -1) { sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "ERR.NO_EMPTY_SLOT")); - } else if (ShopUtil.addItemToShop(shopName, idx, temp)) // 아이탬 추가 + } else if (ShopUtil.addItemToShop(shopName, idx, temp)) // 아이탬 추가 (新增物品) { sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "MESSAGE.ITEM_ADDED")); ItemsUtil.sendItemInfo(sender, shopName, idx, "HELP.ITEM_INFO"); } } - // 기존 아이탬 수정 + // 기존 아이탬 수정 (修改現有物品) else { ShopUtil.editShopItem(shopName, idx, temp); diff --git a/src/main/java/me/sat7/dynamicshop/commands/shop/AddHand.java b/src/main/java/me/sat7/dynamicshop/commands/shop/AddHand.java index f03d423..019d50c 100644 --- a/src/main/java/me/sat7/dynamicshop/commands/shop/AddHand.java +++ b/src/main/java/me/sat7/dynamicshop/commands/shop/AddHand.java @@ -63,7 +63,7 @@ public void RunCMD(String[] args, CommandSender sender) median = Integer.parseInt(args[6]); stock = Integer.parseInt(args[7]); - // 유효성 검사 + // 유효성 검사 (有效性檢查) if (valueMax > 0 && valueMin > 0 && valueMin >= valueMax) { player.sendMessage(DynamicShop.dsPrefix(player) + t(player, "ERR.MAX_LOWER_THAN_MIN")); @@ -92,14 +92,14 @@ public void RunCMD(String[] args, CommandSender sender) return; } - // 손에 뭔가 들고있는지 확인 + // 손에 뭔가 들고있는지 확인 (檢查手上是否有物品) if (player.getInventory().getItemInMainHand() == null || player.getInventory().getItemInMainHand().getType() == Material.AIR) { player.sendMessage(DynamicShop.dsPrefix(player) + t(player, "ERR.HAND_EMPTY")); return; } - // 금지품목 + // 금지품목 (禁止品項) if (Material.getMaterial(player.getInventory().getItemInMainHand().getType().toString()) == Material.AIR) { player.sendMessage(DynamicShop.dsPrefix(player) + t(player, "ERR.ITEM_FORBIDDEN")); @@ -108,22 +108,22 @@ public void RunCMD(String[] args, CommandSender sender) DSItem temp = new DSItem(player.getInventory().getItemInMainHand(), buyValue, buyValue, valueMin, valueMax, median, stock); - // 상점에서 같은 아이탬 찾기 + // 상점에서 같은 아이탬 찾기 (在商店中尋找相同的物品) int idx = ShopUtil.findItemFromShop(shopName, player.getInventory().getItemInMainHand()); - // 상점에 새 아이탬 추가 + // 상점에 새 아이탬 추가 (向商店新增物品) if (idx == -1) { idx = ShopUtil.findEmptyShopSlot(shopName, 1, true); if (idx == -1) { player.sendMessage(DynamicShop.dsPrefix(player) + t(player, "ERR.NO_EMPTY_SLOT")); - } else if (ShopUtil.addItemToShop(shopName, idx, temp)) // 아이탬 추가 + } else if (ShopUtil.addItemToShop(shopName, idx, temp)) // 아이탬 추가 (新增物品) { player.sendMessage(DynamicShop.dsPrefix(player) + t(player, "MESSAGE.ITEM_ADDED")); ItemsUtil.sendItemInfo(player, shopName, idx, "HELP.ITEM_INFO"); } } - // 기존 아이탬 수정 + // 기존 아이탬 수정 (修改現有物品) else { ShopUtil.editShopItem(shopName, idx, temp); diff --git a/src/main/java/me/sat7/dynamicshop/commands/shop/Edit.java b/src/main/java/me/sat7/dynamicshop/commands/shop/Edit.java index 2effd81..bba13d1 100644 --- a/src/main/java/me/sat7/dynamicshop/commands/shop/Edit.java +++ b/src/main/java/me/sat7/dynamicshop/commands/shop/Edit.java @@ -66,7 +66,7 @@ public void RunCMD(String[] args, CommandSender sender) } buyValue = Double.parseDouble(args[4]); - // 삭제 + // 삭제 (刪除) if (buyValue <= 0) { ShopUtil.removeItemFromShop(shopName, idx); @@ -91,7 +91,7 @@ public void RunCMD(String[] args, CommandSender sender) else maxStock = shopData.get().getInt(idx + ".maxStock", -1); - // 유효성 검사 + // 유효성 검사 (有效性檢查) if (valueMax > 0 && valueMin > 0 && valueMin >= valueMax) { sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "ERR.MAX_LOWER_THAN_MIN")); @@ -115,7 +115,7 @@ public void RunCMD(String[] args, CommandSender sender) return; } - // 수정 + // 수정 (修改) int discount = shopData.get().getInt(idx + ".discount"); int sellLimit = shopData.get().getInt(idx + ".tradeLimitPerPlayer.sell"); int buyLimit = shopData.get().getInt(idx + ".tradeLimitPerPlayer.buy"); diff --git a/src/main/java/me/sat7/dynamicshop/commands/shop/EditAll.java b/src/main/java/me/sat7/dynamicshop/commands/shop/EditAll.java index 838b5e5..b6fd323 100644 --- a/src/main/java/me/sat7/dynamicshop/commands/shop/EditAll.java +++ b/src/main/java/me/sat7/dynamicshop/commands/shop/EditAll.java @@ -85,13 +85,13 @@ public void RunCMD(String[] args, CommandSender sender) return; } - // 수정 + // 수정 (修改) for (String s : shopData.get().getKeys(false)) { try { - @SuppressWarnings("unused") int i = Integer.parseInt(s); // 의도적으로 넣은 코드임. 숫자가 아니면 건너뛰기 위함. - if (!shopData.get().contains(s + ".value")) continue; //장식용임 + @SuppressWarnings("unused") int i = Integer.parseInt(s); // 의도적으로 넣은 코드임. 숫자가 아니면 건너뛰기 위함. (這是刻意加入的程式碼。目的是為了跳過非數字的情況。) + if (!shopData.get().contains(s + ".value")) continue; //장식용임 (裝飾用) } catch (Exception e) { diff --git a/src/main/java/me/sat7/dynamicshop/commands/shop/SellBuy.java b/src/main/java/me/sat7/dynamicshop/commands/shop/SellBuy.java index 1a22b5f..8290de4 100644 --- a/src/main/java/me/sat7/dynamicshop/commands/shop/SellBuy.java +++ b/src/main/java/me/sat7/dynamicshop/commands/shop/SellBuy.java @@ -54,9 +54,9 @@ public void RunCMD(String[] args, CommandSender sender) { try { - // i를 직접 사용하지는 않지만 의도적으로 넣은 코드임. + // i를 직접 사용하지는 않지만 의도적으로 넣은 코드임. (雖然沒有直接使用i,但這是刻意加入的程式碼。) int i = Integer.parseInt(s); - if (!shopData.get().contains(s + ".value")) continue; //장식용임 + if (!shopData.get().contains(s + ".value")) continue; //장식용임 (裝飾用) } catch (Exception e) { continue; diff --git a/src/main/java/me/sat7/dynamicshop/constants/Constants.java b/src/main/java/me/sat7/dynamicshop/constants/Constants.java index 8e209ef..9546cf5 100644 --- a/src/main/java/me/sat7/dynamicshop/constants/Constants.java +++ b/src/main/java/me/sat7/dynamicshop/constants/Constants.java @@ -25,9 +25,9 @@ public final class Constants public static final String P_ADMIN_ITEM_INFO = "dshop.admin.iteminfo"; // Permission_User - public static final String P_USE = "dshop.use"; // 이 권한은 기본적으로 지급됨 - public static final String P_SELL = "dshop.sell"; // 이 권한은 기본적으로 지급됨 - public static final String P_USE_QSELL = "dshop.use.qsell"; // 이 권한은 기본적으로 지급됨 + public static final String P_USE = "dshop.use"; // 이 권한은 기본적으로 지급됨 (此權限預設授予) + public static final String P_SELL = "dshop.sell"; // 이 권한은 기본적으로 지급됨 (此權限預設授予) + public static final String P_USE_QSELL = "dshop.use.qsell"; // 이 권한은 기본적으로 지급됨 (此權限預設授予) // Currency public static final String S_VAULT = "Vault"; diff --git a/src/main/java/me/sat7/dynamicshop/economyhook/JobsHook.java b/src/main/java/me/sat7/dynamicshop/economyhook/JobsHook.java index fc4cc40..578802a 100644 --- a/src/main/java/me/sat7/dynamicshop/economyhook/JobsHook.java +++ b/src/main/java/me/sat7/dynamicshop/economyhook/JobsHook.java @@ -20,7 +20,7 @@ private JobsHook() } - // JobsReborn의 points 수정 + // JobsReborn의 points 수정 (修改JobsReborn的點數) public static boolean addJobsPoint(Player p, double amount) { if (!jobsRebornActive) @@ -30,7 +30,7 @@ public static boolean addJobsPoint(Player p, double amount) } PlayerPoints pp = JobsHook.getJobsPlayerPoints(p); - // 차감 + // 차감 (扣除) if (amount < 0.0) { if (pp.havePoints(amount * -1)) @@ -38,7 +38,7 @@ public static boolean addJobsPoint(Player p, double amount) pp.takePoints(amount * -1); return true; } - // 포인트 부족 + // 포인트 부족 (點數不足) else { p.sendMessage(DynamicShop.dsPrefix(p) + t(p, "MESSAGE.NOT_ENOUGH_POINT") @@ -46,7 +46,7 @@ public static boolean addJobsPoint(Player p, double amount) return false; } } - // 증가 + // 증가 (增加) else { pp.addPoints(amount); @@ -54,7 +54,7 @@ public static boolean addJobsPoint(Player p, double amount) } } - // JobsReborn. 플레이어의 잔액 확인 + // JobsReborn. 플레이어의 잔액 확인 (JobsReborn. 確認玩家餘額) public static double getCurJobPoints(Player p) { JobsPlayer jobsPlayer = Jobs.getPlayerManager().getJobsPlayer(p); diff --git a/src/main/java/me/sat7/dynamicshop/events/OnClick.java b/src/main/java/me/sat7/dynamicshop/events/OnClick.java index 6a71415..decabc2 100644 --- a/src/main/java/me/sat7/dynamicshop/events/OnClick.java +++ b/src/main/java/me/sat7/dynamicshop/events/OnClick.java @@ -19,7 +19,7 @@ public class OnClick implements Listener @EventHandler public void OnInventoryDragEvent(InventoryDragEvent e) { - // UI 인벤토리에 드래그로 아이탬 올리는것을 막음 + // UI 인벤토리에 드래그로 아이탬 올리는것을 막음 (防止拖曳物品到UI介面) if (UIManager.IsPlayerUsingPluginGUI((Player) e.getWhoClicked())) e.setCancelled(true); } @@ -32,10 +32,10 @@ public void OnInventoryClickEvent(InventoryClickEvent e) Player player = (Player) e.getWhoClicked(); - // 위쪽 인벤토리를 클릭함 (= 내 인벤토리가 아님) + // 위쪽 인벤토리를 클릭함 (= 내 인벤토리가 아님) (點擊了上方的介面(= 不是自己的背包)) if (e.getClickedInventory() != player.getInventory()) { - // UUID 확인되지 않는 경우 플러그인 사용을 막음. (이게 실질적으로 의미가 있는지는 모르겠음) + // UUID 확인되지 않는 경우 플러그인 사용을 막음. (이게 실질적으로 의미가 있는지는 모르겠음) (如果UUID未經驗證,則阻止使用插件。(不確定這是否真的有意義)) String pUuid = player.getUniqueId().toString(); if (UserUtil.ccUser.get().getConfigurationSection(pUuid) == null) @@ -54,7 +54,7 @@ public void OnInventoryClickEvent(InventoryClickEvent e) UIManager.OnClickUpperInventory(e); } } - // 아래쪽 인벤토리를 클릭함 + // 아래쪽 인벤토리를 클릭함 (點擊了下方的介面) else { if (UIManager.GetPlayerCurrentUIType(player) == InGameUI.UI_TYPE.ItemPalette || @@ -66,7 +66,7 @@ public void OnInventoryClickEvent(InventoryClickEvent e) e.setCancelled(true); UIManager.OnClickLowerInventory(e); } - // Shift클릭으로 상단의 UI인벤토리로 아이템 올리는것을 막음 + // Shift클릭으로 상단의 UI인벤토리로 아이템 올리는것을 막음 (防止使用Shift點擊將物品放入上方的UI介面) else if (e.isShiftClick() && UIManager.IsPlayerUsingPluginGUI(player)) { e.setCancelled(true); diff --git a/src/main/java/me/sat7/dynamicshop/events/OnSignClick.java b/src/main/java/me/sat7/dynamicshop/events/OnSignClick.java index 06e86da..1e5dede 100644 --- a/src/main/java/me/sat7/dynamicshop/events/OnSignClick.java +++ b/src/main/java/me/sat7/dynamicshop/events/OnSignClick.java @@ -37,7 +37,7 @@ public class OnSignClick implements Listener { - // 생성 + // 생성 (建立) @EventHandler public void onSignChange(SignChangeEvent e) { if (!e.getPlayer().hasPermission(P_ADMIN_CREATE_SIGN)) return; @@ -110,7 +110,7 @@ public void onSignChange(SignChangeEvent e) { } } - // 상호작용 + // 상호작용 (互動) @EventHandler public void onInteract(PlayerInteractEvent e) { @@ -132,12 +132,12 @@ public void onInteract(PlayerInteractEvent e) String signId = CreateID(e.getClickedBlock()); - // 정보가 없음 + // 정보가 없음 (沒有資訊) if (!DynamicShop.ccSign.get().contains(signId) && s.getLine(1).length() > 0 && ShopUtil.shopConfigFiles.containsKey(ChatColor.stripColor(s.getLine(1)))) { - // 재생성 시도 + // 재생성 시도 (嘗試重建) if (e.getPlayer().hasPermission(P_ADMIN_CREATE_SIGN)) { String shop = ChatColor.stripColor(s.getLine(1)); @@ -188,7 +188,7 @@ public void onInteract(PlayerInteractEvent e) String shopName = DynamicShop.ccSign.get().getString(signId + ".shop"); if (shopName == null || shopName.length() == 0) return; - // 상점 존재 확인 + // 상점 존재 확인 (確認商店是否存在) if (ShopUtil.shopConfigFiles.containsKey(shopName)) { if (p.getGameMode() == GameMode.CREATIVE && !p.hasPermission(Constants.P_ADMIN_CREATIVE)) @@ -207,7 +207,7 @@ public void onInteract(PlayerInteractEvent e) } - //권한 확인 + //권한 확인 (權限確認) String permission = ShopUtil.shopConfigFiles.get(shopName).get().getString("Options.permission"); if (permission != null && permission.length() > 0) { @@ -242,7 +242,7 @@ public void onInteract(PlayerInteractEvent e) } } - // 파괴 + // 파괴 (破壞) @EventHandler public void onBlockBreak(BlockBreakEvent e) { @@ -279,7 +279,7 @@ public void onBlockBreak(BlockBreakEvent e) } } - // 상점 표지판이 폭발하는것 방지 + // 상점 표지판이 폭발하는것 방지 (防止商店招牌爆炸) @EventHandler public void onEntityExplode(EntityExplodeEvent event) { @@ -298,7 +298,7 @@ public void onEntityExplode(EntityExplodeEvent event) } } - // 상점 표지판이 불타는것 방지 + // 상점 표지판이 불타는것 방지 (防止商店招牌燒毀) @EventHandler public void onBlockBurn(BlockBurnEvent e) { diff --git a/src/main/java/me/sat7/dynamicshop/files/CustomConfig.java b/src/main/java/me/sat7/dynamicshop/files/CustomConfig.java index f9400fd..16550bd 100644 --- a/src/main/java/me/sat7/dynamicshop/files/CustomConfig.java +++ b/src/main/java/me/sat7/dynamicshop/files/CustomConfig.java @@ -15,7 +15,7 @@ public class CustomConfig { private File file; - protected FileConfiguration customFile; // 버킷의 데이터 타입 + protected FileConfiguration customFile; // 버킷의 데이터 타입 (Bukkit的資料型態) //Finds or generates the custom config file public void setup(String name, String folder) diff --git a/src/main/java/me/sat7/dynamicshop/guis/ItemPalette.java b/src/main/java/me/sat7/dynamicshop/guis/ItemPalette.java index cf2ad44..13f22ee 100644 --- a/src/main/java/me/sat7/dynamicshop/guis/ItemPalette.java +++ b/src/main/java/me/sat7/dynamicshop/guis/ItemPalette.java @@ -1,8 +1,6 @@ package me.sat7.dynamicshop.guis; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; +import java.util.*; import me.sat7.dynamicshop.DynaShopAPI; import me.sat7.dynamicshop.events.OnChat; @@ -29,6 +27,7 @@ public final class ItemPalette extends InGameUI { + public ItemPalette() { uiType = UI_TYPE.ItemPalette; @@ -44,6 +43,7 @@ public ItemPalette() private static ArrayList sortedList = new ArrayList<>(); private ArrayList paletteList = new ArrayList<>(); + private Map lastPage = new HashMap<>(); private Player player; private String shopName = ""; private int shopSlotIndex = 0; @@ -392,6 +392,10 @@ private void MovePage(boolean isLeft, boolean isRight) return; DynaShopAPI.openItemPalette(player, uiSubType, shopName, shopSlotIndex, targetPage, this.search); + + if(uiType == UI_TYPE.Shop) { + lastPage.put(player.getUniqueId(), currentPage); + } } private void AddAll(boolean applyRecommend) @@ -404,7 +408,7 @@ private void AddAll(boolean applyRecommend) { if (inventory.getItem(i) != null) { - ItemStack original = inventory.getItem(i); // UI 요소가 추가된 상태임. + ItemStack original = inventory.getItem(i); // UI 요소가 추가된 상태임. (UI元素已新增的狀態) if (original == null || original.getType() == Material.AIR) continue; @@ -431,6 +435,7 @@ private void AddAll(boolean applyRecommend) if (worth != 0) { median = ShopUtil.CalcRecommendedMedian(worth, ConfigUtil.GetNumberOfPlayer()); + worth = 1; } else { if (player != null) @@ -442,7 +447,7 @@ private void AddAll(boolean applyRecommend) ShopUtil.addItemToShop(shopName, targetSlotIdx, temp); } } - DynaShopAPI.openShopGui(player, shopName, 1); + DynaShopAPI.openShopGui(player, shopName, lastPage.getOrDefault(player.getUniqueId(), 1)); } private void OnClickSearch(boolean isLeft, boolean isRight) @@ -467,7 +472,7 @@ private void OnClickItem(boolean isLeft, boolean isRight, boolean isShift, ItemS if (item == null || item.getType() == Material.AIR) return; - // 인자로 들어오는 item은 UI요소임 + // 인자로 들어오는 item은 UI요소임 (作為參數傳入的item是UI元素) ItemStack itemStack = CreateItemStackWithRef(item); if(uiSubType == 0) diff --git a/src/main/java/me/sat7/dynamicshop/guis/ItemSettings.java b/src/main/java/me/sat7/dynamicshop/guis/ItemSettings.java index 4a9b20c..ea4d5a1 100644 --- a/src/main/java/me/sat7/dynamicshop/guis/ItemSettings.java +++ b/src/main/java/me/sat7/dynamicshop/guis/ItemSettings.java @@ -113,7 +113,7 @@ public Inventory getGui(Player player, String shopName, int shopSlotIndex, int t CreateButton(SHIFT, Material.BLACK_STAINED_GLASS_PANE, "Shift = x5", ""); - // 조절버튼 + // 조절버튼 (調整按鈕) if (dsItem.getBuyValue() == dsItem.getSellValue()) sellValueStr = "§8" + ChatColor.stripColor(sellValueStr); if (dsItem.getMinPrice() <= 0.0001) @@ -174,7 +174,7 @@ public Inventory getGui(Player player, String shopName, int shopSlotIndex, int t if(buyPrice < 0.0001) buyPrice = 0.0001; - if (dsItem.getBuyValue() != dsItem.getSellValue()) // 판매가 별도설정 + if (dsItem.getBuyValue() != dsItem.getSellValue()) // 판매가 별도설정 (另外設定售價) { editBtnLore.add("§7" + ChatColor.stripColor(t(null, "ITEM_SETTING.TAX_IGNORED"))); sellPrice = (dsItem.getSellValue() * dsItem.getMedian()) / dsItem.getStock(); @@ -233,7 +233,7 @@ public Inventory getGui(Player player, String shopName, int shopSlotIndex, int t else if (currentTab == MAX_STOCK) CreateButton(SET_TO_OTHER, yellow, t(null, "ITEM_SETTING.SET_TO_STOCK"), editBtnLore); } - inventory.setItem(SAMPLE_ITEM, dsItem.getItemStack()); // 아이탬 견본 + inventory.setItem(SAMPLE_ITEM, dsItem.getItemStack()); // 아이탬 견본 (物品樣本) inventory.getItem(SAMPLE_ITEM).setAmount(1); double worth = TryGetWorth(dsItem.getItemStack().getType().name()); @@ -286,11 +286,11 @@ public Inventory getGui(Player player, String shopName, int shopSlotIndex, int t t(player, "ITEM_SETTING.TRADE_LIMIT_TIMER_LORE").replace("{num}", String.valueOf(timerOffset / 1000 / 60 / 60)).replace("{time}", tradeLimitNextTimerString)); } - CreateButton(RECOMMEND, Material.NETHER_STAR, t(player, "ITEM_SETTING.RECOMMEND"), recommendLore); // 추천 버튼 + CreateButton(RECOMMEND, Material.NETHER_STAR, t(player, "ITEM_SETTING.RECOMMEND"), recommendLore); // 추천 버튼 (推薦按鈕) - CreateButton(DONE, Material.STRUCTURE_VOID, t(player, "ITEM_SETTING.DONE"), t(player, "ITEM_SETTING.DONE_LORE")); // 완료 버튼 - CreateButton(CLOSE, Material.BARRIER, t(player, "ITEM_SETTING.CLOSE"), t(player, "ITEM_SETTING.CLOSE_LORE")); // 닫기 버튼 - CreateButton(REMOVE, Material.BONE, t(player, "ITEM_SETTING.REMOVE"), t(player, "ITEM_SETTING.REMOVE_LORE")); // 삭제 버튼 + CreateButton(DONE, Material.STRUCTURE_VOID, t(player, "ITEM_SETTING.DONE"), t(player, "ITEM_SETTING.DONE_LORE")); // 완료 버튼 (完成按鈕) + CreateButton(CLOSE, Material.BARRIER, t(player, "ITEM_SETTING.CLOSE"), t(player, "ITEM_SETTING.CLOSE_LORE")); // 닫기 버튼 (關閉按鈕) + CreateButton(REMOVE, Material.BONE, t(player, "ITEM_SETTING.REMOVE"), t(player, "ITEM_SETTING.REMOVE_LORE")); // 삭제 버튼 (刪除按鈕) return inventory; } @@ -318,7 +318,7 @@ public void OnClickUpperInventory(InventoryClickEvent e) else if (e.getSlot() == TRADE_LIMIT_INTERVAL_TIMER) OnTradeLimitTimerAdjustButtonClick(e.isLeftClick(), e.isShiftClick()); else if (e.getSlot() >= TAB_START && e.getSlot() <= TAB_END) ChangeTab(e.getSlot()); else if (e.getSlot() == RESET) Reset(); - else if (e.getSlot() >= 18 && e.getSlot() < 27) PlusMinus(e.isShiftClick(), e.getCurrentItem()); // RESET 이 22인것에 주의 + else if (e.getSlot() >= 18 && e.getSlot() < 27) PlusMinus(e.isShiftClick(), e.getCurrentItem()); // RESET 이 22인것에 주의 (注意RESET是22) else if (e.getSlot() == DIVIDE) Divide(e.isShiftClick()); else if (e.getSlot() == MULTIPLY) Multiply(e.isShiftClick()); else if (e.getSlot() == ROUND_DOWN) RoundDown(); @@ -328,7 +328,7 @@ public void OnClickUpperInventory(InventoryClickEvent e) private void SaveSetting() { - // 유효성 검사 + // 유효성 검사 (有效性檢查) if (dsItem.maxPrice > 0 && dsItem.buyValue > dsItem.maxPrice) { player.sendMessage(DynamicShop.dsPrefix(player) + t(player, "ERR.DEFAULT_VALUE_OUT_OF_RANGE")); diff --git a/src/main/java/me/sat7/dynamicshop/guis/ItemTrade.java b/src/main/java/me/sat7/dynamicshop/guis/ItemTrade.java index 7ff6a90..fd641f0 100644 --- a/src/main/java/me/sat7/dynamicshop/guis/ItemTrade.java +++ b/src/main/java/me/sat7/dynamicshop/guis/ItemTrade.java @@ -116,7 +116,7 @@ public void OnClickUpperInventory(InventoryClickEvent e) { if (e.getSlot() == CLOSE) { - // 표지판을 클릭해서 거래화면에 진입한 경우에는 상점UI로 돌아가는 대신 인벤토리를 닫음 + // 표지판을 클릭해서 거래화면에 진입한 경우에는 상점UI로 돌아가는 대신 인벤토리를 닫음 (點擊招牌進入交易畫面時,直接關閉介面而不是返回商店UI) if (UserUtil.userTempData.get(player.getUniqueId()).equalsIgnoreCase("sign")) { UserUtil.userTempData.put(player.getUniqueId(), ""); @@ -193,17 +193,17 @@ public void OnClickUpperInventory(InventoryClickEvent e) ItemStack tempIS = new ItemStack(e.getCurrentItem().getType(), e.getCurrentItem().getAmount()); tempIS.setItemMeta((ItemMeta) data.get().get(tradeIdx + ".itemStack")); - // 무한재고&고정가격 + // 무한재고&고정가격 (無限庫存&固定價格) boolean infiniteStock = data.get().getInt(tradeIdx + ".stock") <= 0; - // 배달비 계산 + // 배달비 (運費) 계산 (運費計算) ConfigurationSection optionS = data.get().getConfigurationSection("Options"); if (optionS.contains("world") && optionS.contains("pos1") && optionS.contains("pos2") && optionS.contains("flag.deliverycharge")) { deliveryCharge = ShopUtil.CalcShipping(shopName, player); if (deliveryCharge == -1) { - player.sendMessage(DynamicShop.dsPrefix(player) + t(player, "MESSAGE.DELIVERY_CHARGE_NA")); // 다른 월드로 배달 불가능 + player.sendMessage(DynamicShop.dsPrefix(player) + t(player, "MESSAGE.DELIVERY_CHARGE_NA")); // 다른 월드로 배달 불가능 (無法配送到其他世界) return; } } @@ -302,7 +302,7 @@ private void CreateTradeButtons() private void CreateTradeButtons(boolean sell) { - // 플레이어당 거래 제한 + // 플레이어당 거래 제한 (每位玩家的交易限制) String tradeLimitString = ""; int tradeIdxInt = Integer.parseInt(tradeIdx); int tradeLimitLeft = UserUtil.GetTradingLimitLeft(player, shopName, tradeIdxInt, HashUtil.GetItemHash(new ItemStack(Material.getMaterial(material))), sell); @@ -413,7 +413,7 @@ else if (ShopUtil.GetCurrency(shopData).equalsIgnoreCase(Constants.S_EXP)) if (!sell) { - if (stock != -1 && stock <= amount) // stock은 1이거나 그보다 작을 수 없음. 단 -1은 무한재고를 의미함. + if (stock != -1 && stock <= amount) // stock은 1이거나 그보다 작을 수 없음. 단 -1은 무한재고를 의미함. (stock不能是1或更小。但是-1代表無限庫存。) continue; } @@ -449,7 +449,7 @@ else if (ShopUtil.GetCurrency(shopData).equalsIgnoreCase(Constants.S_EXP)) } } - // 플레이어당 거래 제한 + // 플레이어당 거래 제한 (每位玩家的交易限制) if (tradeLimitLeft != Integer.MAX_VALUE) { if (!stockText.isEmpty()) @@ -457,7 +457,7 @@ else if (ShopUtil.GetCurrency(shopData).equalsIgnoreCase(Constants.S_EXP)) stockText += tradeLimitString; } - // 배달비 + // 배달비 (運費) String deliveryChargeText = ""; if (deliveryCharge > 0) { diff --git a/src/main/java/me/sat7/dynamicshop/guis/PageEditor.java b/src/main/java/me/sat7/dynamicshop/guis/PageEditor.java index 146ebb9..3ec93d4 100644 --- a/src/main/java/me/sat7/dynamicshop/guis/PageEditor.java +++ b/src/main/java/me/sat7/dynamicshop/guis/PageEditor.java @@ -56,17 +56,17 @@ public Inventory getGui(Player player, String shopName, int page) { try { - // 현재 페이지에 해당하는 것들만 출력 + // 현재 페이지에 해당하는 것들만 출력 (只輸出目前頁面的項目) int idx = Integer.parseInt(s); idx -= ((page - 1) * 45); if (!(idx < 45 && idx >= 0)) continue; - // 아이탬 생성 - String itemName = data.get().getString(s + ".mat"); // 메테리얼 + // 아이탬 생성 (建立物品) + String itemName = data.get().getString(s + ".mat"); // 메테리얼 (材料) ItemStack itemStack = new ItemStack(Material.getMaterial(itemName), 1); // 아이탬 생성 - itemStack.setItemMeta((ItemMeta) data.get().get(s + ".itemStack")); // 저장된 메타 적용 + itemStack.setItemMeta((ItemMeta) data.get().get(s + ".itemStack")); // 저장된 메타 적용 (套用已儲存的Meta) - // 커스텀 메타 설정 + // 커스텀 메타 설정 (自訂Meta設定) ItemMeta meta = itemStack.getItemMeta(); meta.setDisplayName("§8#" + s); ArrayList loreList = new ArrayList<>(); @@ -116,7 +116,7 @@ public void OnClickUpperInventory(InventoryClickEvent e) int pageButtonCount = PAGE_BUTTON_END - PAGE_BUTTON_START + 1; - // 닫기 버튼 + // 닫기 버튼 (關閉按鈕) if (e.getSlot() == CLOSE) { DynaShopAPI.openShopGui(player, shopName, page); @@ -286,7 +286,7 @@ private void DeletePage(Player player, String shopName, int page) { ShopUtil.closeInventoryWithDelay(player); - UserUtil.userInteractItem.put(player.getUniqueId(), shopName + "/" + page); // 삭제 확인을 위해 필요. + UserUtil.userInteractItem.put(player.getUniqueId(), shopName + "/" + page); // 삭제 확인을 위해 필요. (刪除確認時需要。) UserUtil.userTempData.put(player.getUniqueId(), "waitforPageDelete"); OnChat.WaitForInput(player); diff --git a/src/main/java/me/sat7/dynamicshop/guis/QuickSell.java b/src/main/java/me/sat7/dynamicshop/guis/QuickSell.java index 1cd59c8..ef1e340 100644 --- a/src/main/java/me/sat7/dynamicshop/guis/QuickSell.java +++ b/src/main/java/me/sat7/dynamicshop/guis/QuickSell.java @@ -83,7 +83,7 @@ public void OnClickLowerInventory(InventoryClickEvent e) { if (e.isLeftClick()) { - // 찾은 상점에 판매 + // 찾은 상점에 판매 (銷售到找到的商店) Sell.quickSellItem(player, e.getCurrentItem(), topShopName, tradeIdx, e.isShiftClick(), e.getSlot()); } else if (e.isRightClick()) { diff --git a/src/main/java/me/sat7/dynamicshop/guis/RotationEditor.java b/src/main/java/me/sat7/dynamicshop/guis/RotationEditor.java index 8630528..c8721cc 100644 --- a/src/main/java/me/sat7/dynamicshop/guis/RotationEditor.java +++ b/src/main/java/me/sat7/dynamicshop/guis/RotationEditor.java @@ -39,10 +39,10 @@ public RotationEditor() private final SimpleDateFormat sdf = new SimpleDateFormat("MM.dd.yyyy HH:mm:ss"); private String timeLore; - private long period; // 밀리초 - private long period_new; // 밀리초 - private long nextTimer; // 밀리초 - private long nextTimer_new; // 밀리초 + private long period; // 밀리초 (毫秒) + private long period_new; // 밀리초 (毫秒) + private long nextTimer; // 밀리초 (毫秒) + private long nextTimer_new; // 밀리초 (毫秒) private int moveTarget; @@ -110,7 +110,7 @@ else if (e.isRightClick()) nextTimer_new += editAmount; nextTimer_new = nextTimer_new / 1000 / 60 / 10; - nextTimer_new = nextTimer_new * 1000 * 60 * 10; // 10분단위로 내림처리. + nextTimer_new = nextTimer_new * 1000 * 60 * 10; // 10분단위로 내림처리. (以10分鐘為單位進行無條件捨去) RefreshUI(); } else if (e.getSlot() == APPLY_CHANGES) { @@ -160,7 +160,7 @@ public void RefreshUI() private void UpdateToggleButton() { - // 활성화 토글 + // 활성화 토글 (啟用/禁用 切換) if (currentRotation != -1) { String lore = t(player, "ROTATION_EDITOR.CLICK_TO_DISABLE") + "\n\n" + timeLore; @@ -253,7 +253,7 @@ private void OnClickDataButton(boolean isEmptySlot, int dataIndex, boolean isLef { if (isEmptySlot) { - // 새 로테이션 파일 생성 + // 새 로테이션 파일 생성 (建立新的輪換檔案) if (isLeftClick) { RotationUtil.AddNewRotationData(shopName, dataIndex, true); @@ -261,7 +261,7 @@ private void OnClickDataButton(boolean isEmptySlot, int dataIndex, boolean isLef } else if (isRightClick) { - // 이동 + // 이동 (移動) if(moveTarget != -1) { RotationUtil.OnRotationFileSlotMoved(shopName, moveTarget, dataIndex); @@ -272,7 +272,7 @@ else if (isRightClick) } moveTarget = -1; } - // 현재 상점 복사하여 새로 만들기 + // 현재 상점 복사하여 새로 만들기 (複製目前商店以建立新商店) else { RotationUtil.AddNewRotationData(shopName, dataIndex, false); @@ -283,21 +283,21 @@ else if (isRightClick) { if (isLeftClick) { - // 로테이션 적용 + // 로테이션 적용 (套用輪換) if (currentRotation != dataIndex || isShift) { RotationUtil.ApplyRotation(shopName, currentRotation, dataIndex); currentRotation = dataIndex; RefreshUI(); } - // 로테이션 적용된 상태의 상점 UI를 연다 + // 로테이션 적용된 상태의 상점 UI를 연다 (開啟已套用輪換的商店UI) else { DynaShopAPI.openShopGui(player, shopName, 0); } } else if (isRightClick) { - // 로테이션 데이터 삭제 + // 로테이션 데이터 삭제 (刪除輪換資料) if (isShift) { RotationUtil.DeleteRotationFile(shopName, dataIndex); @@ -314,7 +314,7 @@ else if (isRightClick) } RefreshUI(); } - // 이동 + // 이동 (移動) else { if(moveTarget == -1) diff --git a/src/main/java/me/sat7/dynamicshop/guis/Shop.java b/src/main/java/me/sat7/dynamicshop/guis/Shop.java index adaf8b0..2421cc9 100644 --- a/src/main/java/me/sat7/dynamicshop/guis/Shop.java +++ b/src/main/java/me/sat7/dynamicshop/guis/Shop.java @@ -136,21 +136,30 @@ private void ShowItems() { try { - // 현재 페이지에 해당하는 것들만 출력 + // 현재 페이지에 해당하는 것들만 출력 (只輸出目前頁面的項目) idx = Integer.parseInt(s); idx -= ((page - 1) * 45); if (!(idx < 45 && idx >= 0)) continue; - // 아이탬 생성 - String itemName = shopData.getString(s + ".mat"); // 메테리얼 - ItemStack itemStack = new ItemStack(Material.getMaterial(itemName), 1); // 아이탬 생성 - itemStack.setItemMeta((ItemMeta) shopData.get(s + ".itemStack")); // 저장된 메타 적용 + // 아이탬 생성 (建立物品) + String itemName = shopData.getString(s + ".mat"); // 메테리얼 (材料) + Material mat = Material.getMaterial(itemName); + if(mat == null) + { + if (player.hasPermission(P_ADMIN_SHOP_EDIT)) + CreateButton(idx, Material.BARRIER, t(player, "SHOP.INCOMPLETE_DATA"), t(null, "SHOP.INCOMPLETE_DATA_Lore") + s); + + DynamicShop.console.sendMessage(Constants.DYNAMIC_SHOP_PREFIX + "Invalid material '" + itemName + "' in shop '" + shopName + "' at index " + s); + continue; + } + ItemStack itemStack = new ItemStack(mat, 1); // 아이탬 생성 + itemStack.setItemMeta((ItemMeta) shopData.get(s + ".itemStack")); // 저장된 메타 적용 (套用已儲存的Meta) - // 커스텀 메타 설정 + // 커스텀 메타 설정 (自訂Meta設定) ItemMeta meta = itemStack.getItemMeta(); String lore = ""; - // 상품 + // 상품 (商品) if (shopData.contains(s + ".value")) { int tradeIdx = Integer.parseInt(s); @@ -345,7 +354,7 @@ else if (ShopUtil.GetCurrency(shopData).equalsIgnoreCase(Constants.S_EXP)) lore += "\n" + t(player, "SHOP.ITEM_EDIT_LORE"); } } - // 장식용 + // 장식용 (裝飾用) else { if (player.hasPermission(P_ADMIN_SHOP_EDIT)) @@ -417,7 +426,7 @@ private String CreateShopInfoText() } } - // 권한 + // 권한 (權限) String finalPermText = ""; String perm = shopData.getString("Options.permission"); if (perm != null && perm.length() > 0) @@ -426,12 +435,12 @@ private String CreateShopInfoText() finalPermText += t(player, "SHOP.PERMISSION_ITEM").replace("{permission}", perm) + "\n"; } - // 세금 + // 세금 (稅金) String finalTaxText = ""; finalTaxText += t(player, "TAX.SALES_TAX") + ":" + "\n"; finalTaxText += t(player, "SHOP.SHOP_INFO_DASH") + Calc.getTaxRate(shopName) + "%" + "\n"; - // 상점 잔액 + // 상점 잔액 (商店餘額) String finalShopBalanceText = ""; if(!shopData.contains("Options.flag.hideshopbalance")) @@ -456,7 +465,7 @@ else if (ShopUtil.GetCurrency(shopData).equalsIgnoreCase(Constants.S_EXP)) } } - // 영업시간 + // 영업시간 (營業時間) String finalShopHourText = ""; if (shopData.contains("Options.shophours")) { @@ -469,7 +478,7 @@ else if (ShopUtil.GetCurrency(shopData).equalsIgnoreCase(Constants.S_EXP)) finalShopHourText += t(player, "SHOP.SHOP_INFO_DASH") + t(player, "TIME.CLOSE") + ": " + close + "\n"; } - // 상점 좌표 + // 상점 좌표 (商店座標) String finalShopPosText = ""; if (shopData.contains("Options.pos1") && shopData.contains("Options.pos2")) { @@ -497,11 +506,11 @@ else if (ShopUtil.GetCurrency(shopData).equalsIgnoreCase(Constants.S_EXP)) if(ChatColor.stripColor(temp).startsWith("\n")) shopLore = shopLore.replaceFirst("\n",""); - // 어드민이면---------- + // 어드민이면---------- (如果是管理員----------) if (player.hasPermission(P_ADMIN_SHOP_EDIT)) shopLore += "\n"; - // 플래그 + // 플래그 (旗標) StringBuilder finalFlagText = new StringBuilder(); if (player.hasPermission(P_ADMIN_SHOP_EDIT)) { @@ -527,7 +536,7 @@ else if (ShopUtil.GetCurrency(shopData).equalsIgnoreCase(Constants.S_EXP)) private void CloseUI() { - // 표지판으로 접근한 경우에는 그냥 창을 닫음 + // 표지판으로 접근한 경우에는 그냥 창을 닫음 (透過招牌進入時直接關閉視窗) if (UserUtil.userTempData.get(player.getUniqueId()).equalsIgnoreCase("sign")) { UserUtil.userTempData.put(player.getUniqueId(), ""); @@ -603,13 +612,13 @@ else if (e.getCurrentItem().getItemMeta().getDisplayName().equals(" ") || return; } - // 거래화면 열기 + // 거래화면 열기 (開啟交易畫面) if (e.isLeftClick() && shopData.contains(idx + ".value")) { SoundUtil.playerSoundEffect(player, "tradeview"); DynaShopAPI.openItemTradeGui(player, shopName, String.valueOf(idx)); } - // 아이탬 이동, 수정, 또는 장식탬 삭제 + // 아이탬 이동, 수정, 또는 장식탬 삭제 (移動、修改物品或刪除裝飾品) else if (e.isRightClick() && player.hasPermission(P_ADMIN_SHOP_EDIT)) { if (e.isShiftClick()) @@ -656,7 +665,7 @@ else if (e.isRightClick() && player.hasPermission(P_ADMIN_SHOP_EDIT)) } else if (player.hasPermission(P_ADMIN_SHOP_EDIT)) { - // 아이탬 이동. 또는 장식 복사 + // 아이탬 이동. 또는 장식 복사 (移動物品或複製裝飾) if (e.isRightClick() && selectedSlot != -1) { shopData.set(String.valueOf(idx), shopData.get(String.valueOf(selectedSlot))); @@ -673,7 +682,7 @@ else if (player.hasPermission(P_ADMIN_SHOP_EDIT)) selectedSlot = -1; RefreshUI(); } - // 팔렛트 열기 + // 팔렛트 열기 (開啟調色盤) else { DynaShopAPI.openItemPalette(player, 0, shopName, idx, 1, ""); diff --git a/src/main/java/me/sat7/dynamicshop/guis/ShopSettings.java b/src/main/java/me/sat7/dynamicshop/guis/ShopSettings.java index d6c4272..72a6369 100644 --- a/src/main/java/me/sat7/dynamicshop/guis/ShopSettings.java +++ b/src/main/java/me/sat7/dynamicshop/guis/ShopSettings.java @@ -92,10 +92,10 @@ public Inventory getGui(Player player, String shopName) CustomConfig data = ShopUtil.shopConfigFiles.get(shopName); ConfigurationSection confSec_Options = data.get().getConfigurationSection("Options"); - // 닫기 버튼 + // 닫기 버튼 (關閉按鈕) CreateCloseButton(player, CLOSE); - // 활성화 버튼 + // 활성화 (啟用) 버튼 (啟用按鈕) boolean isShopEnable = confSec_Options.getBoolean("enable", true); Material enableToggleMat = isShopEnable ? Material.GREEN_STAINED_GLASS : Material.RED_STAINED_GLASS; String current = isShopEnable ? t(player, "SHOP_SETTING.STATE_ENABLE") : t(player, "SHOP_SETTING.STATE_DISABLE"); @@ -104,7 +104,7 @@ public Inventory getGui(Player player, String shopName) enableToggleLore += "\n§e" + t(player, "CLICK") + ": " + set; CreateButton(ENABLE_TOGGLE, enableToggleMat, t(player, "SHOP_SETTING.STATE"), enableToggleLore); - // 권한 버튼 + // 권한 (權限) 버튼 (權限按鈕) String permStr = confSec_Options.getString("permission"); String permNew = "dshop.user.shop." + shopName; Material permIcon; @@ -128,22 +128,22 @@ public Inventory getGui(Player player, String shopName) permLore.add("§e" + t(player, "CLICK") + ": " + permNew); CreateButton(PERMISSION, permIcon, t(player, "SHOP_SETTING.PERMISSION"), permLore); - //최대 페이지 버튼 + //최대 페이지 버튼 (最大頁數按鈕) CreateButton(MAX_PAGE, InGameUI.GetPageButtonIconMat(), t(player, "SHOP_SETTING.MAX_PAGE"), new ArrayList<>(Arrays.asList(t(player, "SHOP_SETTING.MAX_PAGE_LORE"), t(player, "SHOP_SETTING.L_R_SHIFT"))), data.get().getInt("Options.page")); - // 배경 색상 + // 배경 색상 (背景顏色) String color = confSec_Options.getString("background",""); Material mat = Material.getMaterial( color.toUpperCase() + "_CONCRETE"); if (mat == null) mat = Material.LIGHT_GRAY_CONCRETE; CreateButton(BACKGROUND, mat, t(player, "SHOP_SETTING.BACKGROUND"), t(player, "SHOP_SETTING.BACKGROUND_LORE")); - // 로테이션 에디터 + // 로테이션 에디터 (輪換編輯器) int currentRotation = confSec_Options.getInt("Rotation.Current", -1); String rotationString = currentRotation == -1 ? t(player, "ROTATION_EDITOR.DISABLED") : String.valueOf(currentRotation + 1); CreateButton(ROTATION_EDITOR, Material.CLOCK, t(player, "SHOP_SETTING.ROTATION_EDITOR") + rotationString, t(player, "SHOP_SETTING.ROTATION_EDITOR_LORE")); - // 영업시간 버튼 + // 영업시간 버튼 (營業時間按鈕) int curTime = (int) (player.getWorld().getTime()) / 1000 + 6; if (curTime > 24) curTime -= 24; if (data.get().contains("Options.shophours")) @@ -170,7 +170,7 @@ public Inventory getGui(Player player, String shopName) CreateButton(SHOP_HOUR, Material.CLOCK, t(player, "TIME.SHOPHOURS"), shopHourLore); } - // 랜덤스톡 버튼 + // 랜덤스톡 (隨機庫存) 버튼 (隨機庫存按鈕) ConfigurationSection flucConf = data.get().getConfigurationSection("Options.fluctuation"); if (flucConf != null) { @@ -205,7 +205,7 @@ public Inventory getGui(Player player, String shopName) inventory.setItem(FLUC, flucToggleBtn); } - // 재고 안정화 버튼 + // 재고 안정화 버튼 (庫存穩定按鈕) ConfigurationSection stockStableConf = data.get().getConfigurationSection("Options.stockStabilizing"); if (stockStableConf != null) { @@ -237,7 +237,7 @@ public Inventory getGui(Player player, String shopName) CreateButton(STABLE, Material.COMPARATOR, t(player, "STOCK_STABILIZING.SS"), stableLore); } - // 커맨드 버튼 + // 커맨드 버튼 (指令按鈕) boolean cmdEnabled = confSec_Options.contains("command.active") && confSec_Options.getBoolean("command.active"); ArrayList CmdToggleLore = new ArrayList<>(Arrays.asList( t(player, "SHOP_SETTING.COMMAND_TOGGLE_LORE"), @@ -291,7 +291,7 @@ public Inventory getGui(Player player, String shopName) CreateButton(CMD_SELL, sellCmdValid ? Material.GREEN_STAINED_GLASS_PANE : Material.BLACK_STAINED_GLASS_PANE, t(player, "SHOP_SETTING.COMMAND_SELL"), sellCmdLore); CreateButton(CMD_BUY, buyCmdValid ? Material.RED_STAINED_GLASS_PANE : Material.BLACK_STAINED_GLASS_PANE, t(player, "SHOP_SETTING.COMMAND_BUY"), buyCmdLore); - // 세금 + // 세금 (稅金) int globalTax = ConfigUtil.getCurrentTax(); if (data.get().contains("Options.SalesTax")) { @@ -314,7 +314,7 @@ public Inventory getGui(Player player, String shopName) CreateButton(TAX_TOGGLE, Material.IRON_INGOT, t(player, "TAX.SALES_TAX"), taxLore); } - // 플래그 버튼들 + // 플래그 버튼들 (旗標按鈕) CreateFlagButton(FLAG_SIGNSHOP, confSec_Options.contains("flag.signshop"), "signShop", t(player, "SHOP_SETTING.SIGN_SHOP_LORE")); CreateFlagButton(FLAG_LOCALSHOP, confSec_Options.contains("flag.localshop"), "localShop", t(player, "SHOP_SETTING.LOCAL_SHOP_LORE")); CreateFlagButton(FLAG_DELIVERY, confSec_Options.contains("flag.deliverycharge"), "deliveryCharge", t(player, "SHOP_SETTING.DELIVERY_CHARGE_LORE")); @@ -337,7 +337,7 @@ public Inventory getGui(Player player, String shopName) CreateCurrencyButton(CURRENCY_JP, currency.equalsIgnoreCase(Constants.S_JOBPOINT), t(player, "SHOP_SETTING.CURRENCY") + "JobPoint", t(player, "SHOP_SETTING.JOB_POINT_LORE")); CreateCurrencyButton(CURRENCY_PP, currency.equalsIgnoreCase(Constants.S_PLAYERPOINT), t(player, "SHOP_SETTING.CURRENCY") + "PlayerPoint", t(player, "SHOP_SETTING.PLAYER_POINT_LORE")); - // 로그 버튼 + // 로그 버튼 (日誌按鈕) String log_cur; String log_set; if (confSec_Options.contains("log.active") && confSec_Options.getBoolean("log.active")) @@ -367,7 +367,7 @@ public Inventory getGui(Player player, String shopName) logLore_3.add("§e" + t(player, "LMB") + ": " + (printToAdminActive ? t(player, "OFF") : t(player, "ON"))); CreateButton(LOG_PRINT_ADMIN, printToAdminActive ? Material.GREEN_STAINED_GLASS_PANE : Material.BLACK_STAINED_GLASS_PANE, t(player, "SHOP_SETTING.LOG_PRINT_ADMIN"), logLore_3); - // 거래 UI 설정 + // 거래 UI 설정 (交易UI設定) ArrayList tradeUILore = new ArrayList<>(); tradeUILore.add("§9" + t(null, "CUR_STATE") + ": " + (confSec_Options.contains("tradeUI") ? confSec_Options.get("tradeUI") : t(player,"NULL"))); tradeUILore.add(t(player, "SHOP_SETTING.TRADE_UI_LORE_2")); @@ -383,12 +383,12 @@ public void OnClickUpperInventory(InventoryClickEvent e) CustomConfig data = ShopUtil.shopConfigFiles.get(shopName); - // 닫기버튼 + // 닫기버튼 (關閉按鈕) if (e.getSlot() == CLOSE) { DynaShopAPI.openShopGui(player, shopName, 1); } - // 활성화 + // 활성화 (啟用) if (e.getSlot() == ENABLE_TOGGLE) { if (data.get().getBoolean("Options.enable", true)) @@ -400,7 +400,7 @@ public void OnClickUpperInventory(InventoryClickEvent e) } DynaShopAPI.openShopSettingGui(player, shopName); } - // 권한 + // 권한 (權限) else if (e.getSlot() == PERMISSION) { if (data.get().getString("Options.permission").isEmpty()) @@ -412,7 +412,7 @@ else if (e.getSlot() == PERMISSION) } DynaShopAPI.openShopSettingGui(player, shopName); } - // 최대 페이지 + // 최대 페이지 (最大頁數) else if (e.getSlot() == MAX_PAGE) { int oldvalue = data.get().getInt("Options.page"); @@ -433,12 +433,12 @@ else if (e.getSlot() == MAX_PAGE) } DynaShopAPI.openShopSettingGui(player, shopName); } - // 배경 색상 변경 + // 배경 색상 변경 (變更背景顏色) else if (e.getSlot() == BACKGROUND) { DynaShopAPI.openColorPicker(player, -1); } - // 로테이션 편집기 + // 로테이션 편집기 (輪換編輯器) (輪換編輯器) else if (e.getSlot() == ROTATION_EDITOR) { DynaShopAPI.OpenRotationEditor(player, shopName); @@ -506,7 +506,7 @@ else if (e.getSlot() == SHOP_HOUR || e.getSlot() == SHOP_HOUR_OPEN || e.getSlot( } } } - // 랜덤스톡 + // 랜덤스톡 (隨機庫存) else if (e.getSlot() == FLUC || e.getSlot() == FLUC_INTERVAL || e.getSlot() == FLUC_STRENGTH) { if (data.get().contains("Options.fluctuation")) @@ -565,7 +565,7 @@ else if(e.isRightClick()) } } } - // 스톡 안정화 + // 스톡 안정화 (庫存穩定) (庫存穩定) else if (e.getSlot() == STABLE || e.getSlot() == STABLE_INTERVAL || e.getSlot() == STABLE_STRENGTH) { if (data.get().contains("Options.stockStabilizing")) @@ -624,10 +624,10 @@ else if(e.isRightClick()) } } } - // 세금 + // 세금 (稅金) else if (e.getSlot() == TAX_TOGGLE || e.getSlot() == TAX_AMOUNT) { - // 전역,지역 토글 + // 전역,지역 토글 (全域/區域 切換) if (e.getSlot() == TAX_TOGGLE) { if (data.get().contains("Options.SalesTax")) @@ -640,7 +640,7 @@ else if (e.getSlot() == TAX_TOGGLE || e.getSlot() == TAX_AMOUNT) DynaShopAPI.openShopSettingGui(player, shopName); } - // 수치설정 + // 수치설정 (數值設定) else if (data.get().contains("Options.SalesTax")) { int edit = -1; @@ -654,7 +654,7 @@ else if (data.get().contains("Options.SalesTax")) } data.save(); } - // signshop + // signshop (招牌商店) else if (e.getSlot() == FLAG_SIGNSHOP) { if (data.get().contains("Options.flag.signshop")) @@ -666,7 +666,7 @@ else if (e.getSlot() == FLAG_SIGNSHOP) } DynaShopAPI.openShopSettingGui(player, shopName); } - // localshop + // localshop (本地商店) else if (e.getSlot() == FLAG_LOCALSHOP) { if (data.get().contains("Options.flag.localshop")) @@ -678,7 +678,7 @@ else if (e.getSlot() == FLAG_LOCALSHOP) } DynaShopAPI.openShopSettingGui(player, shopName); } - // deliverycharge + // deliverycharge (運費) else if (e.getSlot() == FLAG_DELIVERY) { if (data.get().contains("Options.flag.deliverycharge")) @@ -690,7 +690,7 @@ else if (e.getSlot() == FLAG_DELIVERY) } DynaShopAPI.openShopSettingGui(player, shopName); } - // showValueChange + // showValueChange (顯示價值變化) else if (e.getSlot() == FLAG_SHOW_VALUE_CHANGE) { if (data.get().contains("Options.flag.showvaluechange")) @@ -702,7 +702,7 @@ else if (e.getSlot() == FLAG_SHOW_VALUE_CHANGE) } DynaShopAPI.openShopSettingGui(player, shopName); } - // HIDE_STOCK + // HIDE_STOCK (隱藏庫存) else if (e.getSlot() == FLAG_HIDE_STOCK) { if (data.get().contains("Options.flag.hidestock")) @@ -714,7 +714,7 @@ else if (e.getSlot() == FLAG_HIDE_STOCK) } DynaShopAPI.openShopSettingGui(player, shopName); } - // HIDE_PRICING_TYPE + // HIDE_PRICING_TYPE (隱藏價格類型) else if (e.getSlot() == FLAG_HIDE_PRICING_TYPE) { if (data.get().contains("Options.flag.hidepricingtype")) @@ -726,7 +726,7 @@ else if (e.getSlot() == FLAG_HIDE_PRICING_TYPE) } DynaShopAPI.openShopSettingGui(player, shopName); } - // HIDE_SHOP_BALANCE + // HIDE_SHOP_BALANCE (隱藏商店餘額) else if (e.getSlot() == FLAG_HIDE_SHOP_BALANCE) { if (data.get().contains("Options.flag.hideshopbalance")) @@ -738,7 +738,7 @@ else if (e.getSlot() == FLAG_HIDE_SHOP_BALANCE) } DynaShopAPI.openShopSettingGui(player, shopName); } - // SHOW_MAX_STOCK + // SHOW_MAX_STOCK (顯示最大庫存) else if (e.getSlot() == FLAG_SHOW_MAX_STOCK) { if (data.get().contains("Options.flag.showmaxstock")) @@ -750,7 +750,7 @@ else if (e.getSlot() == FLAG_SHOW_MAX_STOCK) } DynaShopAPI.openShopSettingGui(player, shopName); } - // HIDDEN_IN_COMMAND + // HIDDEN_IN_COMMAND (在指令中隱藏) else if (e.getSlot() == FLAG_HIDDEN_IN_COMMAND) { if (data.get().contains("Options.flag.hiddenincommand")) @@ -762,7 +762,7 @@ else if (e.getSlot() == FLAG_HIDDEN_IN_COMMAND) } DynaShopAPI.openShopSettingGui(player, shopName); } - // log + // log (日誌) else if (e.getSlot() == LOG_TOGGLE) { if (e.isLeftClick()) @@ -796,7 +796,7 @@ else if (e.getSlot() == LOG_PRINT_ADMIN) DynaShopAPI.openShopSettingGui(player, shopName); } - // 명령어 + // 명령어 (指令) else if (e.getSlot() == CMD_TOGGLE) { boolean active = data.get().contains("Options.command.active") && data.get().getBoolean("Options.command.active"); @@ -849,7 +849,7 @@ else if(e.isLeftClick()) OnChat.WaitForInput(player); } } - // INTEGER_ONLY + // INTEGER_ONLY (僅整數) else if (e.getSlot() == FLAG_INT_ONLY) { if (data.get().contains("Options.flag.integeronly")) @@ -865,7 +865,7 @@ else if (e.getSlot() == FLAG_INT_ONLY) } DynaShopAPI.openShopSettingGui(player, shopName); } - // vault + // vault (金庫) else if (e.getSlot() == CURRENCY_VAULT) { if (!currency.equalsIgnoreCase(Constants.S_VAULT)) @@ -874,7 +874,7 @@ else if (e.getSlot() == CURRENCY_VAULT) } DynaShopAPI.openShopSettingGui(player, shopName); } - // exp + // exp (經驗) else if (e.getSlot() == CURRENCY_EXP) { if (!currency.equalsIgnoreCase(Constants.S_EXP)) @@ -884,7 +884,7 @@ else if (e.getSlot() == CURRENCY_EXP) } DynaShopAPI.openShopSettingGui(player, shopName); } - // jobpoint + // jobpoint (職業點數) else if (e.getSlot() == CURRENCY_JP) { if (!JobsHook.jobsRebornActive) @@ -899,7 +899,7 @@ else if (e.getSlot() == CURRENCY_JP) } DynaShopAPI.openShopSettingGui(player, shopName); } - // Player point + // Player point (玩家點数) else if (e.getSlot() == CURRENCY_PP) { if (!PlayerpointHook.isPPActive) diff --git a/src/main/java/me/sat7/dynamicshop/guis/StartPage.java b/src/main/java/me/sat7/dynamicshop/guis/StartPage.java index 81e0221..c0ecf0b 100644 --- a/src/main/java/me/sat7/dynamicshop/guis/StartPage.java +++ b/src/main/java/me/sat7/dynamicshop/guis/StartPage.java @@ -61,7 +61,7 @@ public Inventory getGui(Player player) inventory = Bukkit.createInventory(player, ccStartPage.get().getInt("Options.UiSlotCount"), ccStartPage.get().getString("Options.Title")); - //아이콘, 이름, 로어, 인덱스, 커맨드 + //아이콘, 이름, 로어, 인덱스, 커맨드 (圖示, 名稱, 描述, 索引, 指令) ConfigurationSection cs = ccStartPage.get().getConfigurationSection("Buttons"); for (String s : cs.getKeys(false)) { @@ -101,7 +101,7 @@ public Inventory getGui(Player player) if (cs.contains(s + ".itemStack")) { - ItemMeta tempMeta = (ItemMeta) cs.get(s + ".itemStack"); // 저장된 메타 적용 + ItemMeta tempMeta = (ItemMeta) cs.get(s + ".itemStack"); // 저장된 메타 적용 (套用已儲存的Meta) meta = tempMeta.clone(); } else @@ -149,7 +149,7 @@ public void OnClickUpperInventory(InventoryClickEvent e) { if (e.getCurrentItem() == null || e.getCurrentItem().getType() == Material.AIR) { - // 새 버튼 추가 + // 새 버튼 추가 (新增按鈕) if (player.hasPermission(P_ADMIN_SHOP_EDIT)) { StartPage.ccStartPage.get().set("Buttons." + e.getSlot() + ".displayName", "§3New Button"); @@ -177,10 +177,10 @@ public void OnClickUpperInventory(InventoryClickEvent e) } } } - // 우클릭 + // 우클릭 (右鍵點擊) else if (player.hasPermission(P_ADMIN_SHOP_EDIT)) { - // 편집 + // 편집 (編輯) if (e.isShiftClick()) { if (e.getCurrentItem() == null || e.getCurrentItem().getType() == Material.AIR) return; @@ -188,7 +188,7 @@ else if (player.hasPermission(P_ADMIN_SHOP_EDIT)) selectedIndex = e.getSlot(); DynaShopAPI.openStartPageSettingGui(player, selectedIndex); } - // 이동 + // 이동 (移動) else { if (selectedIndex == -1) diff --git a/src/main/java/me/sat7/dynamicshop/guis/StartPageSettings.java b/src/main/java/me/sat7/dynamicshop/guis/StartPageSettings.java index 7bcfc89..f272374 100644 --- a/src/main/java/me/sat7/dynamicshop/guis/StartPageSettings.java +++ b/src/main/java/me/sat7/dynamicshop/guis/StartPageSettings.java @@ -41,19 +41,19 @@ public Inventory getGui(Player player, int slotIndex) inventory = Bukkit.createInventory(player, 9, t(player, "START_PAGE.EDITOR_TITLE")); - CreateCloseButton(player, CLOSE); // 닫기 버튼 + CreateCloseButton(player, CLOSE); // 닫기 버튼 (關閉按鈕) - CreateButton(NAME, Material.BOOK, t(player, "START_PAGE.EDIT_NAME"), ""); // 이름 버튼 - CreateButton(LORE, Material.BOOK, t(player, "START_PAGE.EDIT_LORE"), ""); // 설명 버튼 + CreateButton(NAME, Material.BOOK, t(player, "START_PAGE.EDIT_NAME"), ""); // 이름 버튼 (名稱按鈕) + CreateButton(LORE, Material.BOOK, t(player, "START_PAGE.EDIT_LORE"), ""); // 설명 버튼 (說明按鈕) - // 아이콘 버튼 + // 아이콘 버튼 (圖示按鈕) CreateButton(ICON, Material.getMaterial(StartPage.ccStartPage.get().getString("Buttons." + slotIndex + ".icon")), t(player, "START_PAGE.EDIT_ICON"), ""); String cmdString = StartPage.ccStartPage.get().getString("Buttons." + slotIndex + ".action"); - CreateButton(CMD, Material.REDSTONE_TORCH, t(player, "START_PAGE.EDIT_ACTION"), cmdString == null || cmdString.isEmpty() ? null : "§7/" + cmdString); // 액션 버튼 - CreateButton(SHOP_SHORTCUT, Material.EMERALD, t(player, "START_PAGE.SHOP_SHORTCUT"), ""); // 상점 바로가기 생성 버튼 - CreateButton(DECO, Material.BLUE_STAINED_GLASS_PANE, t(player, "START_PAGE.CREATE_DECO"), ""); // 장식 버튼 - CreateButton(DELETE, Material.BONE, t(player, "START_PAGE.REMOVE"), t(player, "START_PAGE.REMOVE_LORE")); // 삭제 버튼 + CreateButton(CMD, Material.REDSTONE_TORCH, t(player, "START_PAGE.EDIT_ACTION"), cmdString == null || cmdString.isEmpty() ? null : "§7/" + cmdString); // 액션 버튼 (動作按鈕) + CreateButton(SHOP_SHORTCUT, Material.EMERALD, t(player, "START_PAGE.SHOP_SHORTCUT"), ""); // 상점 바로가기 생성 버튼 (建立商店捷徑按鈕) + CreateButton(DECO, Material.BLUE_STAINED_GLASS_PANE, t(player, "START_PAGE.CREATE_DECO"), ""); // 장식 버튼 (裝飾按鈕) + CreateButton(DELETE, Material.BONE, t(player, "START_PAGE.REMOVE"), t(player, "START_PAGE.REMOVE_LORE")); // 삭제 버튼 (刪除按鈕) return inventory; } @@ -64,12 +64,12 @@ public void OnClickUpperInventory(InventoryClickEvent e) Player player = (Player) e.getWhoClicked(); UUID uuid = player.getUniqueId(); - // 돌아가기 + // 돌아가기 (返回) if (e.getSlot() == CLOSE) { DynaShopAPI.openStartPage(player); } - // 버튼 삭제 + // 버튼 삭제 (刪除按鈕) else if (e.getSlot() == DELETE) { StartPage.ccStartPage.get().set("Buttons." + slotIndex, null); @@ -77,7 +77,7 @@ else if (e.getSlot() == DELETE) DynaShopAPI.openStartPage(player); } - //이름 + //이름 (名稱) else if (e.getSlot() == NAME) { player.sendMessage(DynamicShop.dsPrefix(player) + t(player, "START_PAGE.ENTER_NAME")); @@ -85,7 +85,7 @@ else if (e.getSlot() == NAME) UserUtil.userTempData.put(uuid,"waitforInput" + "btnName"); OnChat.WaitForInput(player); } - //설명 + //설명 (說明) else if (e.getSlot() == LORE) { player.sendMessage(DynamicShop.dsPrefix(player) + t(player, "START_PAGE.ENTER_LORE")); @@ -93,13 +93,13 @@ else if (e.getSlot() == LORE) UserUtil.userTempData.put(uuid,"waitforInput" + "btnLore"); OnChat.WaitForInput(player); } - //아이콘 + //아이콘 (圖示) else if (e.getSlot() == ICON) { UserUtil.userInteractItem.put(player.getUniqueId(), "startPage/" + slotIndex); DynaShopAPI.openItemPalette(player, 1, "", slotIndex, 1, ""); } - //액션 + //액션 (動作) else if (e.getSlot() == CMD) { player.sendMessage(DynamicShop.dsPrefix(player) + t(player, "START_PAGE.ENTER_ACTION")); @@ -107,12 +107,12 @@ else if (e.getSlot() == CMD) UserUtil.userTempData.put(uuid,"waitforInput" + "btnAction"); OnChat.WaitForInput(player); } - // 상점 숏컷 + // 상점 숏컷 (商店捷徑) else if (e.getSlot() == SHOP_SHORTCUT) { DynaShopAPI.openShopListUI(player, 1, slotIndex); } - // 장식 +// 장식 (裝飾) else if (e.getSlot() == DECO) { DynaShopAPI.openColorPicker(player, slotIndex); diff --git a/src/main/java/me/sat7/dynamicshop/guis/StockSimulator.java b/src/main/java/me/sat7/dynamicshop/guis/StockSimulator.java index fc3725c..d322c8c 100644 --- a/src/main/java/me/sat7/dynamicshop/guis/StockSimulator.java +++ b/src/main/java/me/sat7/dynamicshop/guis/StockSimulator.java @@ -113,12 +113,12 @@ public void OnClickUpperInventory(InventoryClickEvent e) { Player player = (Player) e.getWhoClicked(); - // 닫기 버튼 + // 닫기 버튼 (關閉按鈕) if (e.getSlot() == CLOSE) { DynaShopAPI.openShopSettingGui(player, shopName); } - // 샘플 아이템 변경 + // 샘플 아이템 변경 (變更範例物品) else if (e.getSlot() == ITEM_1 || e.getSlot() == ITEM_2 || e.getSlot() == ITEM_3 || e.getSlot() == ITEM_4 || e.getSlot() == ITEM_5) { if (e.isLeftClick()) @@ -129,7 +129,7 @@ else if (e.isRightClick()) sampleStartIdx = Clamp(sampleStartIdx, 0, shopItemCount - 5); CreateSampleDatas(sampleStartIdx); } - // 무작위 재고 + // 무작위 재고 (隨機庫存) else if (e.getSlot() == FLUC || e.getSlot() == FLUC_INTERVAL || e.getSlot() == FLUC_STRENGTH) { if (fluc) @@ -167,7 +167,7 @@ else if (e.getSlot() == FLUC || e.getSlot() == FLUC_INTERVAL || e.getSlot() == F UpdateBottomButtons(); } - // 스톡 안정화 + // 스톡 안정화 (庫存穩定) else if (e.getSlot() == STABLE || e.getSlot() == STABLE_INTERVAL || e.getSlot() == STABLE_STRENGTH) { if (stable) @@ -205,7 +205,7 @@ else if (e.getSlot() == STABLE || e.getSlot() == STABLE_INTERVAL || e.getSlot() UpdateBottomButtons(); } - // 시뮬레이션 실행 + // 시뮬레이션 실행 (執行模擬) else if (e.getSlot() == RUN) { if (e.isLeftClick()) @@ -235,14 +235,14 @@ private void CreateSampleDatas(int startIdx) continue; } - int i = Integer.parseInt(item); // options에 대해 적용하지 않기 위해. + int i = Integer.parseInt(item); // options에 대해 적용하지 않기 위해. (為了不套用到options) - if (!data.get().contains(item + ".value")) continue; // 장식용은 스킵 + if (!data.get().contains(item + ".value")) continue; // 장식용은 스킵 (跳過裝飾品) int stock = data.get().getInt(item + ".stock"); - if (stock < 1) continue; // 무한재고에 대해서는 스킵 + if (stock < 1) continue; // 무한재고에 대해서는 스킵 (跳過無限庫存) int oldMedian = data.get().getInt(item + ".median"); - if (oldMedian < 1) continue; // 고정가 상품에 대해서는 스킵 + if (oldMedian < 1) continue; // 고정가 상품에 대해서는 스킵 (跳過固定價格商品) SimulData simulData = new SimulData(); simulData.mat = data.get().getString(item + ".mat"); @@ -286,7 +286,7 @@ private void UpdateBottomButtons() for (int i = 47; i < 54; i++) inventory.setItem(i, null); - // 랜덤 + // 랜덤 (隨機) if (fluc) { ArrayList fluctuationLore = new ArrayList<>(Arrays.asList( @@ -318,7 +318,7 @@ private void UpdateBottomButtons() inventory.setItem(FLUC, flucToggleBtn); } - // 안정화 + // 안정화 (穩定) if (stable) { ArrayList stableLore = new ArrayList<>(Arrays.asList( @@ -359,12 +359,12 @@ private void RunSimulation() } final int[] time = new int[]{ - 48, 48 * 2, 48 * 3, //48 = 20분(마크 1일) - 144 * 2, 144 * 4, 144 * 6, // 144 = 1시간 + 48, 48 * 2, 48 * 3, //48 = 20분(마크 1일) (48 = 20分鐘(Minecraft 1天)) + 144 * 2, 144 * 4, 144 * 6, // 144 = 1시간 (144 = 1小時) 144 * 8, 144 * 10, 144 * 12, 144 * 14, 144 * 16, 144 * 18, 144 * 20, 144 * 22, 144 * 24, - 3456 * 2, 3456 * 3, 3456 * 4, // 3456 = 1일 + 3456 * 2, 3456 * 3, 3456 * 4, // 3456 = 1일 (3456 = 1天) 3456 * 5, 3456 * 6, 3456 * 7}; Random generator = new Random(); diff --git a/src/main/java/me/sat7/dynamicshop/guis/UIManager.java b/src/main/java/me/sat7/dynamicshop/guis/UIManager.java index bae7c59..485a8bb 100644 --- a/src/main/java/me/sat7/dynamicshop/guis/UIManager.java +++ b/src/main/java/me/sat7/dynamicshop/guis/UIManager.java @@ -35,7 +35,7 @@ public void OnOpen(InventoryOpenEvent e) @EventHandler public void OnClose(InventoryCloseEvent e) { - // 기존에 인벤토리가 열려있는 상태에서 다른것을 열면 close가 먼저 불림. + // 기존에 인벤토리가 열려있는 상태에서 다른것을 열면 close가 먼저 불림. (如果已經開啟一個介面,再開啟另一個介面時,會先觸發close事件。) Player player = (Player) e.getPlayer(); currentUI.remove(player); } @@ -52,7 +52,7 @@ public static void Open(Player player, Inventory inventory, InGameUI inGameUI) @Override public void run() { - player.openInventory(inventory); // 가장 먼저 불려야함. (버킷에서 새 인벤이 열릴때 기존의 것이 닫힘처리됨) + player.openInventory(inventory); // 가장 먼저 불려야함. (버킷에서 새 인벤이 열릴때 기존의 것이 닫힘처리됨) (必須最先被呼叫。(因為在Bukkit中,當新的介面開啟時,舊的介面會被處理為關閉)) currentUI.put(player, inGameUI); } diff --git a/src/main/java/me/sat7/dynamicshop/jobshook/JobsHook.java b/src/main/java/me/sat7/dynamicshop/jobshook/JobsHook.java index 1d3b36d..4729f7e 100644 --- a/src/main/java/me/sat7/dynamicshop/jobshook/JobsHook.java +++ b/src/main/java/me/sat7/dynamicshop/jobshook/JobsHook.java @@ -20,7 +20,7 @@ private JobsHook() } - // JobsReborn의 points 수정 + // JobsReborn의 points 수정 (修改JobsReborn的點數) public static boolean addJobsPoint(Player p, double amount) { if (!jobsRebornActive) @@ -30,7 +30,7 @@ public static boolean addJobsPoint(Player p, double amount) } PlayerPoints pp = JobsHook.getJobsPlayerPoints(p); - // 차감 + // 차감 (扣除) if (amount < 0.0) { if (pp.havePoints(amount * -1)) @@ -38,7 +38,7 @@ public static boolean addJobsPoint(Player p, double amount) pp.takePoints(amount * -1); return true; } - // 포인트 부족 + // 포인트 부족 (點數不足) else { p.sendMessage(DynamicShop.dsPrefix(p) + t(p, "MESSAGE.NOT_ENOUGH_POINT") @@ -46,7 +46,7 @@ public static boolean addJobsPoint(Player p, double amount) return false; } } - // 증가 + // 증가 (增加) else { pp.addPoints(amount); @@ -54,7 +54,7 @@ public static boolean addJobsPoint(Player p, double amount) } } - // JobsReborn. 플레이어의 잔액 확인 + // JobsReborn. 플레이어의 잔액 확인 (JobsReborn. 確認玩家餘額) public static double getCurJobPoints(Player p) { JobsPlayer jobsPlayer = Jobs.getPlayerManager().getJobsPlayer(p); diff --git a/src/main/java/me/sat7/dynamicshop/transactions/Buy.java b/src/main/java/me/sat7/dynamicshop/transactions/Buy.java index e41c3ba..e117fcd 100644 --- a/src/main/java/me/sat7/dynamicshop/transactions/Buy.java +++ b/src/main/java/me/sat7/dynamicshop/transactions/Buy.java @@ -58,7 +58,7 @@ else if (currency.equalsIgnoreCase(Constants.S_PLAYERPOINT)) playerBalance = econ.getBalance(player); } - // 플레이어 당 거래량 제한 확인 + // 플레이어 당 거래량 제한 확인 (確認每個玩家的交易限制) int tradeIdxInt = Integer.parseInt(tradeIdx); int tradeLimitPerPlayer = ShopUtil.GetBuyLimitPerPlayer(shopName, tradeIdxInt); int playerTradingVolume = UserUtil.GetPlayerTradingVolume(player, shopName, HashUtil.GetItemHash(itemStack)); @@ -92,7 +92,7 @@ else if (currency.equalsIgnoreCase(Constants.S_PLAYERPOINT)) tradeAmount++; } - // 실 구매 가능량이 0이다 = 돈이 없다. + // 실 구매 가능량이 0이다 = 돈이 없다. (實際可購買量為0 = 沒有錢) if (tradeAmount <= 0) { String message = ""; @@ -118,7 +118,7 @@ else if (currency.equalsIgnoreCase(Constants.S_EXP)) return; } - // 상점 재고 부족 + // 상점 재고 부족 (商店庫存不足) if (!infiniteStock && stockOld <= tradeAmount) { player.sendMessage(DynamicShop.dsPrefix(player) + t(player, "MESSAGE.OUT_OF_STOCK")); @@ -180,34 +180,34 @@ else if (currency.equalsIgnoreCase(Constants.S_EXP)) leftAmount -= giveAmount; } - // 플레이어 당 거래량 제한 아이템에 대한 처리. + // 플레이어 당 거래량 제한 아이템에 대한 처리. (處理每個玩家的交易限制物品) if (tradeLimitPerPlayer < Integer.MAX_VALUE) { UserUtil.OnPlayerTradeLimitedItem(player, shopName, HashUtil.GetItemHash(itemStack), tradeAmount, false); } - //로그 기록 + //로그 기록 (日誌記錄) LogUtil.addLog(shopName, itemStack.getType().toString(), tradeAmount, priceSum, currency, player.getName()); - // 메시지 출력 + // 메시지 출력 (輸出訊息) SendBuyMessage(currency, econ, player, tradeAmount, priceSum, itemStack); - // 플레이어에게 소리 재생 + // 플레이어에게 소리 재생 (向玩家播放音效) SoundUtil.playerSoundEffect(player, "buy"); - // 상점 계좌 잔액 수정 + // 상점 계좌 잔액 수정 (修改商店帳戶餘額) if (data.get().contains("Options.Balance")) { ShopUtil.addShopBalance(shopName, priceSum); } - // 커맨드 실행 + // 커맨드 실행 (執行指令) RunBuyCommand(data, player, shopName, itemStack, tradeAmount, priceSum); ShopUtil.shopDirty.put(shopName, true); DynaShopAPI.openItemTradeGui(player, shopName, tradeIdx); - // 이벤트 호출 + // 이벤트 호출 (呼叫事件) ShopBuySellEvent event = new ShopBuySellEvent(true, priceBuyOld, Calc.getCurrentPrice(shopName, tradeIdx, true), priceSellOld, DynaShopAPI.getSellPrice(shopName, itemStack), stockOld, DynaShopAPI.getStock(shopName, itemStack), DynaShopAPI.getMedian(shopName, itemStack), shopName, itemStack, player); Bukkit.getPluginManager().callEvent(event); } diff --git a/src/main/java/me/sat7/dynamicshop/transactions/Calc.java b/src/main/java/me/sat7/dynamicshop/transactions/Calc.java index 86f242f..3d49dac 100644 --- a/src/main/java/me/sat7/dynamicshop/transactions/Calc.java +++ b/src/main/java/me/sat7/dynamicshop/transactions/Calc.java @@ -12,7 +12,7 @@ private Calc() } - // 특정 아이탬의 현재 가치를 계산 (다이나믹 or 고정가) (세금 반영) + // 특정 아이탬의 현재 가치를 계산 (다이나믹 or 고정가) (세금 반영) (計算特定物品的目前價值(動態或固定價格)(已含稅)) public static double getCurrentPrice(String shopName, String idx, boolean buy) { return getCurrentPrice(shopName, idx, buy, false); @@ -57,14 +57,14 @@ public static double getCurrentPrice(String shopName, String idx, boolean buy, b price = max; } - // 할인 + // 할인 (折扣) if (data.contains(idx + ".discount")) { int discount = data.getInt(idx + ".discount"); price = price * (100 - discount) / 100; } - // 판매세 계산 (임의 지정된 판매가치가 없는 경우에만) + // 판매세 계산 (임의 지정된 판매가치가 없는 경우에만) (計算銷售稅(僅在沒有任意指定銷售價值時)) if (!buy && !data.contains(idx + ".value2")) { double tax = ((price / 100) * getTaxRate(shopName)); @@ -84,7 +84,7 @@ public static double getCurrentPrice(String shopName, String idx, boolean buy, b } } - // 특정 아이탬의 앞으로 n개의 가치합을 계산 (다이나믹 or 고정가) ([0] 세금 반영된 값, [1] 세금) + // 특정 아이탬의 앞으로 n개의 가치합을 계산 (다이나믹 or 고정가) ([0] 세금 반영된 값, [1] 세금) (計算特定物品未來n個的價值總和(動態或固定價格)([0]含稅值,[1]稅金)) public static double[] calcTotalCost(String shopName, String idx, int amount) { FileConfiguration data = ShopUtil.shopConfigFiles.get(shopName).get(); @@ -139,14 +139,14 @@ public static double[] calcTotalCost(String shopName, String idx, int amount) } } - // 할인 + // 할인 (折扣) if (data.contains(idx + ".discount")) { int discount = data.getInt(idx + ".discount"); total = total * (100 - discount) / 100; } - // 세금 적용 (판매가 별도지정시 세금계산 안함) + // 세금 적용 (판매가 별도지정시 세금계산 안함) (套用稅金(另外指定售價時不計算稅金)) double tax = 0; if (amount < 0 && !data.contains(idx + ".value2")) { @@ -169,7 +169,7 @@ public static double[] calcTotalCost(String shopName, String idx, int amount) return new double[]{total, tax}; } - // 상점의 세율 반환 + // 상점의 세율 반환 (傳回商店的稅率) public static int getTaxRate(String shopName) { CustomConfig data = ShopUtil.shopConfigFiles.get(shopName); diff --git a/src/main/java/me/sat7/dynamicshop/transactions/Sell.java b/src/main/java/me/sat7/dynamicshop/transactions/Sell.java index 8c7efda..6146fdc 100644 --- a/src/main/java/me/sat7/dynamicshop/transactions/Sell.java +++ b/src/main/java/me/sat7/dynamicshop/transactions/Sell.java @@ -47,7 +47,7 @@ public static double quickSellItem(Player player, ItemStack itemStack, String sh double deliveryCharge = ShopUtil.CalcShipping(shopName, player); double priceSum = -deliveryCharge; - // 실제 판매 가능량 확인 + // 실제 판매 가능량 확인 (確認實際可銷售數量) int tradeAmount; if (player != null) { @@ -71,7 +71,7 @@ public static double quickSellItem(Player player, ItemStack itemStack, String sh tradeAmount = Math.max(0, tradeAmount); } - // 판매할 아이탬이 없음 + // 판매할 아이탬이 없음 (沒有可銷售的物品) if (tradeAmount == 0) { if (player != null) @@ -81,7 +81,7 @@ public static double quickSellItem(Player player, ItemStack itemStack, String sh return 0; } - // 플레이어 당 거래량 제한 확인 + // 플레이어 당 거래량 제한 확인 (確認每個玩家的交易限制) int sellLimit = ShopUtil.GetSellLimitPerPlayer(shopName, tradeIdx); if (player != null && sellLimit != 0) { @@ -93,11 +93,11 @@ public static double quickSellItem(Player player, ItemStack itemStack, String sh } } - // 비용 계산 + // 비용 계산 (計算費用) double[] calcResult = Calc.calcTotalCost(shopName, String.valueOf(tradeIdx), -tradeAmount); priceSum += calcResult[0]; - // 계산된 비용에 대한 처리 시도 + // 계산된 비용에 대한 처리 시도 (嘗試處理計算出的費用) Economy econ = DynamicShop.getEconomy(); if (!CheckTransactionSuccess(currencyType, player, priceSum)) { @@ -105,7 +105,7 @@ public static double quickSellItem(Player player, ItemStack itemStack, String sh return 0; } - // 플레이어 인벤토리에서 아이템 제거 + // 플레이어 인벤토리에서 아이템 제거 (從玩家背包中移除物品) if (player != null) { if (isShiftClick) @@ -154,43 +154,43 @@ public static double quickSellItem(Player player, ItemStack itemStack, String sh player.updateInventory(); } - // 플레이어 당 거래량 제한 아이템에 대한 처리. + // 플레이어 당 거래량 제한 아이템에 대한 처리. (處理每個玩家的交易限制物品) if (player != null & sellLimit != Integer.MIN_VALUE) { UserUtil.OnPlayerTradeLimitedItem(player, shopName, HashUtil.GetItemHash(itemStack), tradeAmount, true); } - // 로그 기록 + // 로그 기록 (日誌記錄) LogUtil.addLog(shopName, itemStack.getType().toString(), -tradeAmount, priceSum, currencyType, player != null ? player.getName() : shopName); if (player != null) { - // 플레이어에게 메시지 출력 + // 플레이어에게 메시지 출력 (向玩家輸出訊息) SendSellMessage(currencyType, econ, player, tradeAmount, priceSum, itemStack); - // 플레이어에게 소리 재생 + // 플레이어에게 소리 재생 (向玩家播放音效) if (playSound) player.playSound(player.getLocation(), Sound.valueOf("ENTITY_EXPERIENCE_ORB_PICKUP"), 1, 1); } - // 상점 계좌 잔액 수정 + // 상점 계좌 잔액 수정 (修改商店帳戶餘額) if (data.get().contains("Options.Balance")) { ShopUtil.addShopBalance(shopName, priceSum * -1); } - // 상점 재고 증가 + // 상점 재고 증가 (增加商店庫存) if (stockOld > 0) { data.get().set(tradeIdx + ".stock", MathUtil.SafeAdd(stockOld, tradeAmount)); } - // 커맨드 실행 + // 커맨드 실행 (執行指令) RunSellCommand(data, player, shopName, itemStack, tradeAmount, priceSum, calcResult[1]); - // 더티 + // 더티 (Dirty) ShopUtil.shopDirty.put(shopName, true); - // 이벤트 호출 + // 이벤트 호출 (呼叫事件) if (player != null) { ShopBuySellEvent event = new ShopBuySellEvent(false, priceBuyOld, Calc.getCurrentPrice(shopName, String.valueOf(tradeIdx), true), @@ -213,14 +213,14 @@ public static void sell(String currency, Player player, String shopName, String double priceSellOld = DynaShopAPI.getSellPrice(shopName, itemStack); double priceBuyOld = Calc.getCurrentPrice(shopName, String.valueOf(tradeIdx), true); int stockOld = data.get().getInt(tradeIdx + ".stock"); - // 상점에 돈이 없음 + // 상점에 돈이 없음 (商店金額不足) if (ShopUtil.getShopBalance(shopName) != -1 && ShopUtil.getShopBalance(shopName) < Calc.calcTotalCost(shopName, tradeIdx, itemStack.getAmount())[0]) { player.sendMessage(DynamicShop.dsPrefix(player) + t(player, "MESSAGE.SHOP_BAL_LOW")); return; } - // 상점이 매입을 거절. + // 상점이 매입을 거절. (商店拒絕收購) int stock = data.get().getInt(tradeIdx + ".stock"); int maxStock = data.get().getInt(tradeIdx + ".maxStock", -1); if (maxStock != -1 && maxStock <= stock) @@ -229,7 +229,7 @@ public static void sell(String currency, Player player, String shopName, String return; } - // 실제 판매 가능량 확인 + // 실제 판매 가능량 확인 (確認實際可銷售數量) int tradeAmount = itemStack.getAmount(); int playerHas = GetPlayerItemCount(player, itemStack); if (tradeAmount > playerHas) @@ -237,7 +237,7 @@ public static void sell(String currency, Player player, String shopName, String tradeAmount = playerHas; } - // 판매할 아이탬이 없음 + // 판매할 아이탬이 없음 (沒有可銷售的物品) if (tradeAmount == 0) { player.sendMessage(DynamicShop.dsPrefix(player) + t(player, "MESSAGE.NO_ITEM_TO_SELL")); @@ -250,7 +250,7 @@ public static void sell(String currency, Player player, String shopName, String tradeAmount = Math.max(0, tradeAmount); } - // 플레이어 당 거래량 제한 확인 + // 플레이어 당 거래량 제한 확인 (確認每個玩家的交易限制) int tradeIdxInt = Integer.parseInt(tradeIdx); int tradeLimitPerPlayer = ShopUtil.GetSellLimitPerPlayer(shopName, tradeIdxInt); if (tradeLimitPerPlayer != 0) @@ -260,58 +260,58 @@ public static void sell(String currency, Player player, String shopName, String return; } - // 비용 계산 + // 비용 계산 (計算費用) double[] calcResult = Calc.calcTotalCost(shopName, tradeIdx, -tradeAmount); priceSum += calcResult[0]; - // 계산된 비용에 대한 처리 시도 + // 계산된 비용에 대한 처리 시도 (嘗試處理計算出的費用) Economy econ = DynamicShop.getEconomy(); if (!CheckTransactionSuccess(currency, player, priceSum)) return; - // 플레이어 인벤토리에서 아이템 제거 + // 플레이어 인벤토리에서 아이템 제거 (從玩家背包中移除物品) ItemStack delete = new ItemStack(itemStack); delete.setAmount(tradeAmount); player.getInventory().removeItem(delete); player.updateInventory(); - // 플레이어 당 거래량 제한 아이템에 대한 처리. + // 플레이어 당 거래량 제한 아이템에 대한 처리. (處理每個玩家的交易限制物品) if (tradeLimitPerPlayer != Integer.MIN_VALUE) { UserUtil.OnPlayerTradeLimitedItem(player, shopName, HashUtil.GetItemHash(itemStack), tradeAmount, true); } - // 로그 기록 + // 로그 기록 (日誌記錄) LogUtil.addLog(shopName, itemStack.getType().toString(), -tradeAmount, priceSum, currency, player.getName()); // 메시지 출력 SendSellMessage(currency, econ, player, tradeAmount, priceSum, itemStack); - // 플레이어에게 소리 재생 + // 플레이어에게 소리 재생 (向玩家播放音效) SoundUtil.playerSoundEffect(player, "sell"); - // 상점 계좌 잔액 수정 + // 상점 계좌 잔액 수정 (修改商店帳戶餘額) if (data.get().contains("Options.Balance")) { ShopUtil.addShopBalance(shopName, priceSum * -1); } - // 상점 재고 증가 + // 상점 재고 증가 (增加商店庫存) if (!infiniteStock) { data.get().set(tradeIdx + ".stock", MathUtil.SafeAdd(stockOld, tradeAmount)); } - // 커맨드 실행 + // 커맨드 실행 (執行指令) RunSellCommand(data, player, shopName, itemStack, tradeAmount, priceSum, calcResult[1]); - // 더티 + // 더티 (Dirty) ShopUtil.shopDirty.put(shopName, true); - // 이벤트 호출 + // 이벤트 호출 (呼叫事件) ShopBuySellEvent event = new ShopBuySellEvent(false, priceBuyOld, Calc.getCurrentPrice(shopName, tradeIdx, true), priceSellOld, DynaShopAPI.getSellPrice(shopName, itemStack), stockOld, DynaShopAPI.getStock(shopName, itemStack), DynaShopAPI.getMedian(shopName, itemStack), shopName, itemStack, player); Bukkit.getPluginManager().callEvent(event); - // UI 갱신 + // UI 갱신 (UI更新) DynaShopAPI.openItemTradeGui(player, shopName, tradeIdx); } diff --git a/src/main/java/me/sat7/dynamicshop/utilities/ConfigUtil.java b/src/main/java/me/sat7/dynamicshop/utilities/ConfigUtil.java index 6cc6374..58a7865 100644 --- a/src/main/java/me/sat7/dynamicshop/utilities/ConfigUtil.java +++ b/src/main/java/me/sat7/dynamicshop/utilities/ConfigUtil.java @@ -281,6 +281,11 @@ public static boolean GetEnableInventoryClickSearch_Shop() return config.getBoolean("UI.EnableInventoryClickSearch.Shop"); } + public static boolean GetDebugMode() + { + return config.getBoolean("DebugMode"); + } + // [ Log ] ========== public static boolean GetSaveLogs() diff --git a/src/main/java/me/sat7/dynamicshop/utilities/ItemsUtil.java b/src/main/java/me/sat7/dynamicshop/utilities/ItemsUtil.java index 0ffd079..9462d16 100644 --- a/src/main/java/me/sat7/dynamicshop/utilities/ItemsUtil.java +++ b/src/main/java/me/sat7/dynamicshop/utilities/ItemsUtil.java @@ -18,7 +18,7 @@ private ItemsUtil() } - // 지정된 이름,lore,수량의 아이탬 스택 생성및 반환 + // 지정된 이름,lore,수량의 아이탬 스택 생성및 반환 (建立並傳回具有指定名稱、lore和數量的物品堆疊) public static ItemStack createItemStack(Material material, ItemMeta _meta, String name, ArrayList lore, int amount) { ItemStack istack = new ItemStack(material, amount); @@ -31,7 +31,7 @@ public static ItemStack createItemStack(Material material, ItemMeta _meta, Strin return istack; } - // 아이탬 이름 정돈 + // 아이탬 이름 정돈 (整理物品名稱) public static String getBeautifiedName(Material mat) { return getBeautifiedName(mat.toString()); @@ -53,7 +53,7 @@ public static String getBeautifiedName(String matName) return finalStr.toString(); } - // 아이탬 정보 출력 + // 아이탬 정보 출력 (輸出物品資訊) public static void sendItemInfo(CommandSender sender, String shopName, int idx, String msgType) { if(sender instanceof Player) diff --git a/src/main/java/me/sat7/dynamicshop/utilities/LangUtil.java b/src/main/java/me/sat7/dynamicshop/utilities/LangUtil.java index 90cd64d..cbc0f5d 100644 --- a/src/main/java/me/sat7/dynamicshop/utilities/LangUtil.java +++ b/src/main/java/me/sat7/dynamicshop/utilities/LangUtil.java @@ -28,905 +28,17 @@ private LangUtil() public static void setupLangFile(String lang) { // 한국어 - { - ccLang.setup("Lang_V3_ko-KR", null); - - ccLang.get().addDefault("START_PAGE.EDITOR_TITLE", "§3아이콘 편집"); - ccLang.get().addDefault("START_PAGE.EDIT_NAME", "§f이름 바꾸기"); - ccLang.get().addDefault("START_PAGE.EDIT_LORE", "§f설명 바꾸기"); - ccLang.get().addDefault("START_PAGE.EDIT_ICON", "§f아이콘 바꾸기"); - ccLang.get().addDefault("START_PAGE.EDIT_ACTION", "§f실행 명령어 바꾸기"); - ccLang.get().addDefault("START_PAGE.SHOP_SHORTCUT", "§f상점으로 가는 버튼 만들기"); - ccLang.get().addDefault("START_PAGE.CREATE_DECO", "§f장식 버튼 만들기"); - ccLang.get().addDefault("START_PAGE.ENTER_SHOP_NAME", "상점 이름을 입력하세요."); - ccLang.get().addDefault("START_PAGE.DEFAULT_SHOP_LORE", "§f§n클릭: 상점으로 가기"); - ccLang.get().addDefault("START_PAGE.ITEM_MOVE_LORE", "§e우클릭: 이동"); - ccLang.get().addDefault("START_PAGE.ITEM_COPY_LORE", "§e우클릭: 복사"); - ccLang.get().addDefault("START_PAGE.ITEM_REMOVE_LORE", "§eShift 좌클릭: 삭제"); - ccLang.get().addDefault("START_PAGE.ITEM_EDIT_LORE", "§eShift우클릭: 편집"); - ccLang.get().addDefault("START_PAGE.REMOVE", "§f제거"); - ccLang.get().addDefault("START_PAGE.REMOVE_LORE", "§f이 버튼을 시작페이지에서 제거합니다."); - ccLang.get().addDefault("START_PAGE.ENTER_NAME", "버튼의 새 이름을 입력하세요."); - ccLang.get().addDefault("START_PAGE.ENTER_LORE", "버튼의 새 설명을 입력하세요."); - ccLang.get().addDefault("START_PAGE.ENTER_ICON", "버튼의 아이콘으로 사용할 아이탬 이름을 입력하세요. (영문. 대소문자 구분없음)"); - ccLang.get().addDefault("START_PAGE.ENTER_ACTION", "명령어를 '/' 제외하고 입력하세요. 버튼을 눌렀을때 이 명령어가 실행됩니다."); - ccLang.get().addDefault("START_PAGE.ENTER_COLOR", "장식 버튼의 색상을 입력하세요. (영문)"); - ccLang.get().addDefault("START_PAGE.SHOP_LIST_TITLE", "§3상점 목록"); - ccLang.get().addDefault("START_PAGE.SHOP_LIST.PAGE_TITLE", "§f{curPage}/{maxPage} 페이지"); - ccLang.get().addDefault("START_PAGE.SHOP_LIST.PAGE_LORE", "§e좌클릭: 이전 페이지\n§e우클릭: 다음 페이지"); - - ccLang.get().addDefault("COLOR_PICKER_TITLE", "§3색상 선택"); - - ccLang.get().addDefault("SHOP.TRADE_LORE", "§f§n클릭: 거래"); - ccLang.get().addDefault("SHOP.BUY_PRICE", "§f구매: {num}"); - ccLang.get().addDefault("SHOP.SELL_PRICE", "§f판매: {num}"); - ccLang.get().addDefault("SHOP.BUY_PRICE_DISCOUNTED", "§f구매: §8§m{num}§r §a{num2}"); - ccLang.get().addDefault("SHOP.SELL_PRICE_DISCOUNTED", "§f판매: §8§m{num}§r §c{num2}"); - ccLang.get().addDefault("SHOP.BUY_PRICE_PP", "§f구매: {num}PP"); - ccLang.get().addDefault("SHOP.SELL_PRICE_PP", "§f판매: {num}PP"); - ccLang.get().addDefault("SHOP.BUY_PRICE_EXP", "§f구매: {num}Exp"); - ccLang.get().addDefault("SHOP.SELL_PRICE_EXP", "§f판매: {num}Exp"); - ccLang.get().addDefault("SHOP.BUY_PRICE_DISCOUNTED_EXP", "§f구매: §8§m{num}Exp§r §a{num2}Exp"); - ccLang.get().addDefault("SHOP.SELL_PRICE_DISCOUNTED_EXP", "§f판매: §8§m{num}Exp§r §c{num2}Exp"); - ccLang.get().addDefault("SHOP.BUY_PRICE_DISCOUNTED_PP", "§f구매: §8§m{num}PP§r §a{num2}PP"); - ccLang.get().addDefault("SHOP.SELL_PRICE_DISCOUNTED_PP", "§f판매: §8§m{num}PP§r §c{num2}PP"); - ccLang.get().addDefault("SHOP.BUY_PRICE_JP", "§f구매: {num}JP"); - ccLang.get().addDefault("SHOP.SELL_PRICE_JP", "§f판매: {num}JP"); - ccLang.get().addDefault("SHOP.BUY_PRICE_DISCOUNTED_JP", "§f구매: §8§m{num}JP§r §a{num2}JP"); - ccLang.get().addDefault("SHOP.SELL_PRICE_DISCOUNTED_JP", "§f판매: §8§m{num}JP§r §c{num2}JP"); - ccLang.get().addDefault("SHOP.STOCK", "§8재고: {num}"); - ccLang.get().addDefault("SHOP.STOCK_2", "§8재고: {stock}/{max_stock}"); - ccLang.get().addDefault("SHOP.INF_STOCK", "§8무한"); - ccLang.get().addDefault("SHOP.STATIC_PRICE", "§8[고정 가격]"); - ccLang.get().addDefault("SHOP.STACKS", "§8{num} 스택"); - ccLang.get().addDefault("SHOP.ITEM_MOVE_LORE", "§e우클릭: 이동"); - ccLang.get().addDefault("SHOP.ITEM_COPY_LORE", "§e우클릭: 복사"); - ccLang.get().addDefault("SHOP.ITEM_EDIT_LORE", "§eShift우클릭: 편집"); - ccLang.get().addDefault("SHOP.DECO_DELETE_LORE", "§eShift우클릭: 삭제"); - ccLang.get().addDefault("SHOP.PAGE_TITLE", "§f{curPage}/{maxPage} 페이지"); - ccLang.get().addDefault("SHOP.PAGE_LORE_V2", "§f§n좌클릭: 이전 페이지\n§f§n우클릭: 다음 페이지\n§7인벤토리에서 아이템을 클릭하면 \n§7그 아이템이 있는 페이지로 이동합니다."); - ccLang.get().addDefault("SHOP.GO_TO_PAGE_EDITOR", "§eShift+우: 페이지 에디터"); - ccLang.get().addDefault("SHOP.ITEM_MOVE_SELECTED", "아이탬 선택됨. 비어있는 칸을 우클릭하면 이동합니다."); - ccLang.get().addDefault("SHOP.PERMISSION", "§f퍼미션:"); - ccLang.get().addDefault("SHOP.PERMISSION_ITEM", "§7 - {permission}"); - ccLang.get().addDefault("SHOP.FLAGS", "§e플래그:"); - ccLang.get().addDefault("SHOP.FLAGS_ITEM", "§e - {flag}"); - ccLang.get().addDefault("SHOP.SHOP_BAL_INF", "§f상점 계좌 무제한"); - ccLang.get().addDefault("SHOP.SHOP_BAL", "§f상점 계좌 잔액"); - ccLang.get().addDefault("SHOP.SHOP_LOCATION", "§f상점 위치: x {x}, y {y}, z {z}"); - ccLang.get().addDefault("SHOP.SHOP_LOCATION_B", "§f상점 위치: "); - ccLang.get().addDefault("SHOP.SHOP_INFO_DASH", "§7 - "); - ccLang.get().addDefault("SHOP.DISABLED", "§c비활성§8|§f"); - ccLang.get().addDefault("SHOP.INCOMPLETE_DATA", "불완전한 데이터"); - ccLang.get().addDefault("SHOP.INCOMPLETE_DATA_Lore", "이 아이템은 어드민이 아닌\n유저에게는 보이지 않습니다.\nIndex: "); - ccLang.get().addDefault("SHOP.TRADE_LIMIT_BUY", "§a구매량 제한 : {num} 남음"); - ccLang.get().addDefault("SHOP.TRADE_LIMIT_SELL", "§a판매량 제한 : {num} 남음"); - ccLang.get().addDefault("SHOP.TRADE_LIMIT_TIMER", "§a다음 리셋: {time}"); - ccLang.get().addDefault("SHOP.CLICK_TO_ADD", "§e클릭: 추가"); - - ccLang.get().addDefault("SHOP_SETTING_TITLE", "§3상점 설정"); - ccLang.get().addDefault("SHOP_SETTING.LOG_TOGGLE_LORE", "§e우클릭: 로그 뷰어"); - ccLang.get().addDefault("SHOP_SETTING.LOG_PRINT_CONSOLE", "§f로그를 콘솔에 출력"); - ccLang.get().addDefault("SHOP_SETTING.LOG_PRINT_ADMIN", "§f로그를 어드민에게 출력"); - ccLang.get().addDefault("SHOP_SETTING.MAX_PAGE", "§f최대 페이지"); - ccLang.get().addDefault("SHOP_SETTING.MAX_PAGE_LORE", "§f상점의 최대 페이지를 설정합니다"); - ccLang.get().addDefault("SHOP_SETTING.BACKGROUND", "§f배경 색상"); - ccLang.get().addDefault("SHOP_SETTING.BACKGROUND_LORE", "§e클릭: 변경"); - ccLang.get().addDefault("SHOP_SETTING.L_R_SHIFT", "§e좌: -1 우: +1 Shift: x5"); - ccLang.get().addDefault("SHOP_SETTING.FLAG", "§f플래그"); - ccLang.get().addDefault("SHOP_SETTING.SHOP_SETTINGS_LORE", "§e우클릭: 상점 편집"); - ccLang.get().addDefault("SHOP_SETTING.SIGN_SHOP_LORE", "§f표지판을 통해서만 접근할 수 있습니다."); - ccLang.get().addDefault("SHOP_SETTING.LOCAL_SHOP_LORE", "§f실제 상점 위치를 방문해야 합니다.\n§f상점의 위치를 설정해야만 합니다."); - ccLang.get().addDefault("SHOP_SETTING.DELIVERY_CHARGE_LORE", "§f배달비를 지불하고 localshop에서 원격으로 거래합니다."); - ccLang.get().addDefault("SHOP_SETTING.SELECTED", "§2선택됨"); - ccLang.get().addDefault("SHOP_SETTING.CURRENCY", "§f화폐 유형: "); - ccLang.get().addDefault("SHOP_SETTING.VAULT_LORE", "§f기본값 입니다."); - ccLang.get().addDefault("SHOP_SETTING.EXP_LORE", "§f플레이어의 경험치로 거래합니다."); - ccLang.get().addDefault("SHOP_SETTING.JOB_POINT_LORE", "§fJobs 플러그인의 job point로 거래합니다."); - ccLang.get().addDefault("SHOP_SETTING.PLAYER_POINT_LORE", "§fPlayerPoint 플러그인의 point로 거래합니다."); - ccLang.get().addDefault("SHOP_SETTING.SHOW_VALUE_CHANGE_LORE", "§f가격 변화량을 표시합니다."); - ccLang.get().addDefault("SHOP_SETTING.HIDE_STOCK", "§f재고 수량 표시를 숨깁니다."); - ccLang.get().addDefault("SHOP_SETTING.HIDE_PRICING_TYPE", "§f가격 유형 표기를 숨깁니다."); - ccLang.get().addDefault("SHOP_SETTING.HIDE_SHOP_BALANCE", "§f상점 계좌 잔액을 숨깁니다."); - ccLang.get().addDefault("SHOP_SETTING.SHOW_MAX_STOCK", "§f재고 상한을 표시합니다."); - ccLang.get().addDefault("SHOP_SETTING.HIDDEN_IN_COMMAND", "§f명령어 자동완성시 이 상점을 표시하지 않습니다."); - ccLang.get().addDefault("SHOP_SETTING.INTEGER_ONLY", "§f구매 가격이 올림 처리됩니다.\n§f판매 가격은 내림 처리됩니다."); - ccLang.get().addDefault("SHOP_SETTING.PERMISSION", "§f퍼미션"); - ccLang.get().addDefault("SHOP_SETTING.STATE", "§f상태"); - ccLang.get().addDefault("SHOP_SETTING.STATE_ENABLE", "§a활성"); - ccLang.get().addDefault("SHOP_SETTING.STATE_DISABLE", "§c비활성"); - ccLang.get().addDefault("SHOP_SETTING.ROTATION_EDITOR", "§f로테이션: "); - ccLang.get().addDefault("SHOP_SETTING.ROTATION_EDITOR_LORE", "§e클릭: 로테이션 에디터"); - ccLang.get().addDefault("SHOP_SETTING.COMMAND_TOGGLE", "§f커맨드 실행"); - ccLang.get().addDefault("SHOP_SETTING.COMMAND_TOGGLE_LORE", "§f상점 거래 발생시 서버 명령어를 실행합니다."); - ccLang.get().addDefault("SHOP_SETTING.COMMAND_SELL", "§f판매시 명령어"); - ccLang.get().addDefault("SHOP_SETTING.COMMAND_BUY", "§f구매시 명령어"); - ccLang.get().addDefault("SHOP_SETTING.COMMAND_LORE1", "§e좌클릭: 설정"); - ccLang.get().addDefault("SHOP_SETTING.COMMAND_LORE3", "§e씨프트 우클릭: 마지막 항목 삭제"); - ccLang.get().addDefault("SHOP_SETTING.TRADE_UI", "§f거래 UI 설정"); - ccLang.get().addDefault("SHOP_SETTING.TRADE_UI_LORE_2", "§e좌클릭: 편집\n§e우클릭: 초기화"); - - ccLang.get().addDefault("ROTATION_EDITOR_TITLE", "§3로테이션 에디터"); - ccLang.get().addDefault("ROTATION_EDITOR.ENABLED", "§a로테이션 켜짐"); - ccLang.get().addDefault("ROTATION_EDITOR.DISABLED", "§c로테이션 꺼짐"); - ccLang.get().addDefault("ROTATION_EDITOR.CLICK_TO_ENABLE", "§e좌클릭: 로테이션 켜기"); - ccLang.get().addDefault("ROTATION_EDITOR.CLICK_TO_DISABLE", "§e좌클릭: 로테이션 끄기"); - ccLang.get().addDefault("ROTATION_EDITOR.CURRENT_TIME", "§f현재 시간: "); - ccLang.get().addDefault("ROTATION_EDITOR.CURRENTLY_IN_USE", "§a[현재 적용중]"); - ccLang.get().addDefault("ROTATION_EDITOR.NEXT_ROTATION", "§f다음 로테이션: "); - ccLang.get().addDefault("ROTATION_EDITOR.PERIOD", "§f로테이션 주기"); - ccLang.get().addDefault("ROTATION_EDITOR.PERIOD_LORE_V2", "§e좌클릭: -1시간, 우클릭: +1시간, 씨프트: x10"); - ccLang.get().addDefault("ROTATION_EDITOR.TIMER", "§f타이머 조정"); - ccLang.get().addDefault("ROTATION_EDITOR.TIMER_LORE_V2", "§e좌클릭: -10분, 우클릭: +10분, 씨프트: x6"); - ccLang.get().addDefault("ROTATION_EDITOR.HOUR", "§f{0}시간"); - ccLang.get().addDefault("ROTATION_EDITOR.UNSAVED_CHANGES", "§c§o저장되지 않은 변경사항 있음"); - ccLang.get().addDefault("ROTATION_EDITOR.APPLY_CHANGES", "§f변경사항 적용"); - ccLang.get().addDefault("ROTATION_EDITOR.APPLY_CHANGES_LORE", "§e좌클릭: 변경사항 적용\n§e우클릭: 변경사항 초기화"); - ccLang.get().addDefault("ROTATION_EDITOR.APPLY_ROTATION", "§e좌클릭: 지금 적용"); - ccLang.get().addDefault("ROTATION_EDITOR.OPEN", "§e좌클릭: 열기"); - ccLang.get().addDefault("ROTATION_EDITOR.CREATE", "§e좌클릭: 빈 로테이션 만들기"); - ccLang.get().addDefault("ROTATION_EDITOR.COPY_AS_NEW", "§e우클릭: 현재 상점 복사하여 만들기"); - ccLang.get().addDefault("ROTATION_EDITOR.DELETE", "§e씨프트 우클릭: §c삭제"); - ccLang.get().addDefault("ROTATION_EDITOR.REAPPLY", "§e씨프트 좌클릭: 재적용"); - ccLang.get().addDefault("ROTATION_EDITOR.MOVE", "§e우클릭: 이동"); - - ccLang.get().addDefault("ITEM_SETTING_TITLE", "§3아이탬 셋팅"); - ccLang.get().addDefault("ITEM_SETTING.VALUE_BUY", "§f구매가치: "); - ccLang.get().addDefault("ITEM_SETTING.VALUE_SELL", "§f판매가치: "); - ccLang.get().addDefault("ITEM_SETTING.PRICE", "§f구매: "); - ccLang.get().addDefault("ITEM_SETTING.SELL_PRICE", "§f판매: "); - ccLang.get().addDefault("ITEM_SETTING.PRICE_MIN", "§f최소 가격: "); - ccLang.get().addDefault("ITEM_SETTING.PRICE_MAX", "§f최대 가격: "); - ccLang.get().addDefault("ITEM_SETTING.MEDIAN", "§f중앙값: "); - ccLang.get().addDefault("ITEM_SETTING.STOCK", "§f재고: "); - ccLang.get().addDefault("ITEM_SETTING.MAX_STOCK", "§f재고 상한: "); - ccLang.get().addDefault("ITEM_SETTING.MAX_STOCK_LORE", "§f재고량이 이보다 많아지면\n§f더이상 상점에 판매할 수 없게됩니다."); - ccLang.get().addDefault("ITEM_SETTING.INF_STOCK", "무한 재고"); - ccLang.get().addDefault("ITEM_SETTING.STATIC_PRICE", "고정 가격"); - ccLang.get().addDefault("ITEM_SETTING.UNLIMITED", "무제한"); - ccLang.get().addDefault("ITEM_SETTING.MEDIAN_HELP", "§f중앙값이 작을수록 가격이 급격이 변화합니다."); - ccLang.get().addDefault("ITEM_SETTING.TAX_IGNORED", "판매세 설정이 무시됩니다."); - ccLang.get().addDefault("ITEM_SETTING.RECOMMEND", "§f추천 값 적용"); - ccLang.get().addDefault("ITEM_SETTING.DISCOUNT", "§f할인"); - ccLang.get().addDefault("ITEM_SETTING.DISCOUNT_LORE", "§f할인율: {num}%\n§e좌클릭: +10, 우클릭: -10"); - ccLang.get().addDefault("ITEM_SETTING.DISCOUNT_LORE_2", "§f할인율: {num}%\n§e좌클릭: -10, 우클릭: +10"); - ccLang.get().addDefault("ITEM_SETTING.DONE", "§f완료"); - ccLang.get().addDefault("ITEM_SETTING.DONE_LORE", "§f완료!"); - ccLang.get().addDefault("ITEM_SETTING.ROUND_DOWN", "§f내림"); - ccLang.get().addDefault("ITEM_SETTING.SET_TO_MEDIAN", "§f중앙값에 맞춤"); - ccLang.get().addDefault("ITEM_SETTING.SET_TO_STOCK", "§f재고에 맞춤"); - ccLang.get().addDefault("ITEM_SETTING.SET_TO_VALUE", "§f가격에 맞춤"); - ccLang.get().addDefault("ITEM_SETTING.CLOSE", "§f닫기"); - ccLang.get().addDefault("ITEM_SETTING.CLOSE_LORE", "§f§n클릭: 닫기"); - ccLang.get().addDefault("ITEM_SETTING.REMOVE", "§c제거"); - ccLang.get().addDefault("ITEM_SETTING.REMOVE_LORE", "§f이 아이템을 상점에서 제거합니다."); - ccLang.get().addDefault("ITEM_SETTING.BUY", "§3§l구매: {num}"); - ccLang.get().addDefault("ITEM_SETTING.SELL", "§3§l판매: {num}"); - ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_SELL", "§f플레이어 당 판매량 제한"); - ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_SELL_LORE", "§f{num}\n§eLMB: -1, RMB: +1, Shift = x10"); - ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_BUY", "§f플레이어 당 구매량 제한"); - ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_BUY_LORE", "§f{num}\n§eLMB: -1, RMB: +1, Shift = x10"); - ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_INTERVAL", "§f거래량 제한 리셋 주기"); - ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_INTERVAL_LORE", "§f주기: {interval}\n§f다음 리셋: {time}\n§e좌클릭: -1시간, 우클릭: +1시간, 씨프트 = x12"); - ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_TIMER", "§f타이머 조정"); - ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_TIMER_LORE", "§f{num}\n§f다음 리셋: {time}\n§e좌클릭: -1시간, 우클릭: +1시간, 씨프트 = x12"); - - ccLang.get().addDefault("TRADE_TITLE", "§3아이템 거래"); - ccLang.get().addDefault("TRADE.TOGGLE_SELLABLE", "§e클릭: 판매전용 토글"); - ccLang.get().addDefault("TRADE.TOGGLE_BUYABLE", "§e클릭: 구매전용 토글"); - ccLang.get().addDefault("TRADE.BUY_ONLY_LORE", "§f구매만 가능한 아이템"); - ccLang.get().addDefault("TRADE.SELL_ONLY_LORE", "§f판매만 가능한 아이템"); - ccLang.get().addDefault("TRADE.BALANCE", "§3내 잔액"); - ccLang.get().addDefault("TRADE.PRICE", "§f구매: {num}"); - ccLang.get().addDefault("TRADE.SELL_PRICE", "§f판매: {num}"); - ccLang.get().addDefault("TRADE.PRICE_DISCOUNTED", "§f구매: §8§m{num}§r §a{num2}"); - ccLang.get().addDefault("TRADE.SELL_PRICE_DISCOUNTED", "§f판매: §8§m{num}§r §c{num2}"); - ccLang.get().addDefault("TRADE.PRICE_EXP", "§f구매: {num}EXP"); - ccLang.get().addDefault("TRADE.SELL_PRICE_EXP", "§f판매: {num}EXP"); - ccLang.get().addDefault("TRADE.PRICE_DISCOUNTED_EXP", "§f구매: §8§m{num}EXP§r §a{num2}EXP"); - ccLang.get().addDefault("TRADE.SELL_PRICE_DISCOUNTED_EXP", "§f판매: §8§m{num}EXP§r §c{num2}EXP"); - ccLang.get().addDefault("TRADE.PRICE_PP", "§f구매: {num}PP"); - ccLang.get().addDefault("TRADE.SELL_PRICE_PP", "§f판매: {num}PP"); - ccLang.get().addDefault("TRADE.PRICE_DISCOUNTED_PP", "§f구매: §8§m{num}PP§r §a{num2}PP"); - ccLang.get().addDefault("TRADE.SELL_PRICE_DISCOUNTED_PP", "§f판매: §8§m{num}PP§r §c{num2}PP"); - ccLang.get().addDefault("TRADE.PRICE_JP", "§f구매: {num}JP"); - ccLang.get().addDefault("TRADE.SELL_PRICE_JP", "§f판매: {num}JP"); - ccLang.get().addDefault("TRADE.PRICE_DISCOUNTED_JP", "§f구매: §8§m{num}JP§r §a{num2}JP"); - ccLang.get().addDefault("TRADE.SELL_PRICE_DISCOUNTED_JP", "§f판매: §8§m{num}JP§r §c{num2}JP"); - ccLang.get().addDefault("TRADE.BUY", "§c구매"); - ccLang.get().addDefault("TRADE.SELL", "§2판매"); - ccLang.get().addDefault("TRADE.STOCK", "§8재고: "); - ccLang.get().addDefault("TRADE.STACKS", "§8{num} 스택"); - ccLang.get().addDefault("TRADE.INF_STOCK", "§8무한 재고"); - ccLang.get().addDefault("TRADE.SHOP_BAL_INF", "§f상점 계좌 무제한"); - ccLang.get().addDefault("TRADE.SHOP_BAL", "§3상점 계좌 잔액 \n§f{num}"); - ccLang.get().addDefault("TRADE.CLICK_TO_BUY", "§c§n클릭: {amount}개 구매"); - ccLang.get().addDefault("TRADE.CLICK_TO_SELL", "§2§n클릭: {amount}개 판매"); - ccLang.get().addDefault("TRADE.PURCHASE_LIMIT_PER_PLAYER", "§a구매량 제한 : {num} 남음\n§a다음 리셋: {time}"); - ccLang.get().addDefault("TRADE.SALES_LIMIT_PER_PLAYER", "§a판매량 제한 : {num} 남음\n§a다음 리셋: {time}"); - - ccLang.get().addDefault("PAGE_EDITOR_TITLE", "§3페이지 편집"); - ccLang.get().addDefault("PAGE_EDITOR.PREV", "§f<<"); - ccLang.get().addDefault("PAGE_EDITOR.NEXT", "§f>>"); - ccLang.get().addDefault("PAGE_EDITOR.PAGE_SWAP_SUCCESS", "§f페이지가 교체 되었습니다."); - ccLang.get().addDefault("PAGE_EDITOR.PAGE_SWAP_FAIL", "§f페이지 교체 실패."); - ccLang.get().addDefault("PAGE_EDITOR.PAGE_SWAP_SELECTED", "§f페이지 선택되었습니다. 서로 교체 할 다른 페이지를 우클릭 하세요."); - ccLang.get().addDefault("PAGE_EDITOR.PAGE_LORE_PREMIUM", "§e좌클릭: 페이지 이동\n§e우클릭: 페이지 교체(스왑)\n§eShift+좌: 페이지 삽입\n§eShift+우: 페이지 삭제"); - ccLang.get().addDefault("PAGE_EDITOR.PRICE", "§f구매: {num}"); - ccLang.get().addDefault("PAGE_EDITOR.SELL_PRICE", "§f판매: {num}"); - ccLang.get().addDefault("PAGE_EDITOR.STOCK", "§8재고: {num}"); - ccLang.get().addDefault("PAGE_EDITOR.STACKS", "§8{num} 스택"); - ccLang.get().addDefault("PAGE_EDITOR.STATIC_PRICE", "§8[고정 가격]"); - ccLang.get().addDefault("PAGE_EDITOR.EMPTY", "§8(비어있음)"); - ccLang.get().addDefault("PAGE_EDITOR.EMPTY_SLOT_LORE", "§e좌,우클릭: 밀기\n§e+씨프트: 당기기"); - ccLang.get().addDefault("TRADE.QUANTITY_LORE", "§eShift+우: 수량 편집"); - ccLang.get().addDefault("TRADE.WAIT_FOR_INPUT", "거래 UI에 표시 될 수량을 입력하세요.\n예시: 1,2,4,8,16,32,64"); - - ccLang.get().addDefault("LOG_VIEWER_TITLE", "§3로그 뷰어"); - ccLang.get().addDefault("LOG_VIEWER.DATE", "§f날짜: "); - ccLang.get().addDefault("LOG_VIEWER.TIME", "§f시간: "); - ccLang.get().addDefault("LOG_VIEWER.CURRENCY", "§f화폐 유형: "); - ccLang.get().addDefault("LOG_VIEWER.PRICE", "§f가격: "); - ccLang.get().addDefault("LOG_VIEWER.EXPAND", "§f펼치기"); - ccLang.get().addDefault("LOG_VIEWER.COLLAPSE", "§f접기"); - ccLang.get().addDefault("LOG_VIEWER.PAGE_TITLE", "§f{curPage}/{maxPage} 페이지"); - ccLang.get().addDefault("LOG_VIEWER.PAGE_LORE", "§e좌클릭: 이전 페이지\n§e우클릭: 다음 페이지"); - ccLang.get().addDefault("LOG_VIEWER.FILE_LORE", "§e좌클릭: 열기\n§eShift+우: §c삭제"); - - - ccLang.get().addDefault("LOG.LOG", "§f로그"); - ccLang.get().addDefault("LOG.CLEAR", "§f로그 삭제됨"); - ccLang.get().addDefault("LOG.SAVE", "§f로그 저장됨"); - ccLang.get().addDefault("LOG.DELETE", "§4로그 삭제"); - ccLang.get().addDefault("LOG.SELL", "§f{player}(이)가 {shop}에 {item} {amount}개를 판매함"); - ccLang.get().addDefault("LOG.BUY", "§f{player}(이)가 {shop}에서 {item} {amount}개를 구매함"); - - ccLang.get().addDefault("STOCK_SIMULATOR_TITLE", "§3재고 시뮬레이터"); - ccLang.get().addDefault("STOCK_SIMULATOR.CHANGE_SAMPLE_LORE", "§e좌, 우클릭: 아이템 변경"); - ccLang.get().addDefault("STOCK_SIMULATOR.SIMULATOR_BUTTON_LORE", "§e우클릭: 시뮬레이터"); - ccLang.get().addDefault("STOCK_SIMULATOR.RUN_TITLE", "§f실행"); - ccLang.get().addDefault("STOCK_SIMULATOR.RUN_LORE", "§e좌클릭: 시뮬레이션 실행\n§e우클릭: 설정값을 상점에 적용합니다\n§f아이템은 영향받지 않습니다."); - ccLang.get().addDefault("STOCK_SIMULATOR.REAL_TIME", "§a(실제 시간)"); - ccLang.get().addDefault("STOCK_SIMULATOR.AFTER_S", "§a{0}초 후"); - ccLang.get().addDefault("STOCK_SIMULATOR.AFTER_M", "§a{0}분 후"); - ccLang.get().addDefault("STOCK_SIMULATOR.AFTER_H", "§a{0}시간 후"); - ccLang.get().addDefault("STOCK_SIMULATOR.AFTER_D", "§a{0}일 후"); - ccLang.get().addDefault("STOCK_SIMULATOR.L_R_SHIFT", "§e좌: -1 우: +1 Shift: x5"); - ccLang.get().addDefault("STOCK_SIMULATOR.PRICE", "§f구매: {num}"); - ccLang.get().addDefault("STOCK_SIMULATOR.MEDIAN", "§f중앙값: {num}"); - ccLang.get().addDefault("STOCK_SIMULATOR.STOCK", "§f재고: {num}"); - - ccLang.get().addDefault("PALETTE_TITLE", "§3판매할 아이템 선택"); - ccLang.get().addDefault("PALETTE_TITLE2", "§3아이템 선택"); - ccLang.get().addDefault("PALETTE.LORE_PREMIUM", "§e좌클릭: 추가\n§e씨프트 좌클릭: 설정 후 추가\n§e우클릭: 장식으로 추가\n§e씨프트 우클릭: '{item}' 를 검색"); - ccLang.get().addDefault("PALETTE.LORE2", "§e좌클릭: 선택\n§e씨프트 우클릭: '{item}' 를 검색"); - ccLang.get().addDefault("PALETTE.SEARCH", "§f찾기"); - ccLang.get().addDefault("PALETTE.ADD_ALL", "§f모두 추가"); - ccLang.get().addDefault("PALETTE.ADD_ALL_LORE", "§e좌클릭: 모두 추가\n§e씨프트 좌클릭: 모두 추가하고 권장 값 적용"); - ccLang.get().addDefault("PALETTE.PAGE_TITLE", "§f{curPage}/{maxPage} 페이지"); - ccLang.get().addDefault("PALETTE.PAGE_LORE", "§f§n좌클릭: 이전 페이지\n§f§n우클릭: 다음 페이지"); - ccLang.get().addDefault("PALETTE.FILTER_APPLIED", "§f필터 적용됨 : "); - ccLang.get().addDefault("PALETTE.FILTER_LORE", "§f좌클릭: 검색\n§f우클릭: 필터 초기화\n\n§7\"BLUE_WOOL\"을 찾으려는 경우:\n§7 b w\n§7 wool\n§7 blue wool"); - - ccLang.get().addDefault("QUICK_SELL_TITLE", "§3빠른 판매"); - ccLang.get().addDefault("QUICK_SELL.GUIDE_TITLE", "§3§l빠른 판매 도움말"); - ccLang.get().addDefault("QUICK_SELL.GUIDE_LORE", "§a판매할 아이템을 좌클릭 하세요.\n§a씨프트 좌클릭으로 같은 유형의 아이템을 모두 팝니다.\n§a우클릭으로 해당 아이템 상점으로 이동합니다."); - - ccLang.get().addDefault("ARROW.UP", "§a⬆"); - ccLang.get().addDefault("ARROW.DOWN", "§c⬇"); - ccLang.get().addDefault("ARROW.UP_2", "§c⬆"); - ccLang.get().addDefault("ARROW.DOWN_2", "§a⬇"); - - ccLang.get().addDefault("TIME.OPEN", "Open"); - ccLang.get().addDefault("TIME.CLOSE", "Close"); - ccLang.get().addDefault("TIME.OPEN_LORE", "§f문 여는 시간 설정"); - ccLang.get().addDefault("TIME.CLOSE_LORE", "§f문 닫는 시간 설정"); - ccLang.get().addDefault("TIME.SHOPHOURS", "§f영업시간"); - ccLang.get().addDefault("TIME.OPEN24", "24시간 오픈"); - ccLang.get().addDefault("TIME.SHOP_IS_CLOSED", "§f상점이 문을 닫았습니다. 개점: {time}시. 현재시간: {curTime}시"); - ccLang.get().addDefault("TIME.SET_SHOPHOURS", "영업시간 설정"); - ccLang.get().addDefault("TIME.CUR", "§f현재 시간: {time}시"); - - ccLang.get().addDefault("STOCK_STABILIZING.SS", "§f재고 안정화"); - ccLang.get().addDefault("STOCK_STABILIZING.L_R_SHIFT", "§e좌클릭: -0.1 우클릭: +0.1 Shift: x5"); - ccLang.get().addDefault("STOCK_STABILIZING.STRENGTH_LORE_A", "§f중앙값(median)의 n%"); - ccLang.get().addDefault("STOCK_STABILIZING.STRENGTH_LORE_B", "§f중앙값(median)과의 격차의 n%"); - - ccLang.get().addDefault("FLUCTUATION.FLUCTUATION", "§f무작위 재고 변동"); - ccLang.get().addDefault("FLUCTUATION.INTERVAL", "§f변화 간격"); - ccLang.get().addDefault("FLUCTUATION.INTERVAL_LORE", "§f1h = 1000틱 = 현실시간 50초"); - ccLang.get().addDefault("FLUCTUATION.STRENGTH", "§f변화 강도"); - ccLang.get().addDefault("FLUCTUATION.STRENGTH_LORE", "§f중앙값(median)의 n%"); - - ccLang.get().addDefault("TAX.SALES_TAX", "§f판매세"); - ccLang.get().addDefault("TAX.USE_GLOBAL", "전역설정 사용 ({tax}%)"); - ccLang.get().addDefault("TAX.USE_LOCAL", "별도 설정"); - - ccLang.get().addDefault("MESSAGE.SEARCH_ITEM", "§f찾으려는 아이템의 이름을 입력하세요."); - ccLang.get().addDefault("MESSAGE.SEARCH_CANCELED", "§f검색 취소됨."); - ccLang.get().addDefault("MESSAGE.INPUT_CANCELED", "§f입력 취소됨."); - ccLang.get().addDefault("MESSAGE.DELETE_CONFIRM", "§f정말로 페이지를 삭제할까요? 'delete' 를 입력하면 삭제합니다."); - ccLang.get().addDefault("MESSAGE.CANT_DELETE_LAST_PAGE", "§f마지막 남은 페이지를 삭제할 수 없습니다."); - ccLang.get().addDefault("MESSAGE.SHOP_BAL_LOW", "§f상점이 돈을 충분히 가지고 있지 않습니다."); - ccLang.get().addDefault("MESSAGE.SHOP_CREATED", "§f상점 생성됨!"); - ccLang.get().addDefault("MESSAGE.SHOP_DELETED", "§f상점 제거됨!"); - ccLang.get().addDefault("MESSAGE.OUT_OF_STOCK", "§f재고 없음!"); - ccLang.get().addDefault("MESSAGE.BUY_SUCCESS", "§f{item} {amount}개를 {price}에 구매함. 잔액: {bal}"); - ccLang.get().addDefault("MESSAGE.SELL_SUCCESS", "§f{item} {amount}개를 {price}에 판매함. 잔액: {bal}"); - ccLang.get().addDefault("MESSAGE.BUY_SUCCESS_EXP", "§f{item} {amount}개를 {price}경험치 포인트에 구매함. 잔액: {bal}"); - ccLang.get().addDefault("MESSAGE.SELL_SUCCESS_EXP", "§f{item} {amount}개를 {price}경험치 포인트에 판매함. 잔액: {bal}"); - ccLang.get().addDefault("MESSAGE.BUY_SUCCESS_JP", "§f{item} {amount}개를 {price}포인트에 구매함. 남은포인트: {bal}"); - ccLang.get().addDefault("MESSAGE.SELL_SUCCESS_JP", "§f{item} {amount}개를 {price}포인트에 판매함. 남은포인트: {bal}"); - ccLang.get().addDefault("MESSAGE.BUY_SUCCESS_PP", "§f{item} {amount}개를 {price}포인트에 구매함. 남은포인트: {bal}"); - ccLang.get().addDefault("MESSAGE.SELL_SUCCESS_PP", "§f{item} {amount}개를 {price}포인트에 판매함. 남은포인트: {bal}"); - ccLang.get().addDefault("MESSAGE.QSELL_NA", "§f해당 아이템을 취급하는 상점이 없습니다."); - ccLang.get().addDefault("MESSAGE.DELIVERY_CHARGE", "§f배달비: {fee}"); - ccLang.get().addDefault("MESSAGE.DELIVERY_CHARGE_NA", "§f다른 월드로 배달할 수 없습니다."); - ccLang.get().addDefault("MESSAGE.NOT_ENOUGH_MONEY", "§f돈이 부족합니다. 잔액: {bal}"); - ccLang.get().addDefault("MESSAGE.NOT_ENOUGH_POINT", "§f포인트가 부족합니다. 잔액: {bal}"); - ccLang.get().addDefault("MESSAGE.NOT_ENOUGH_PLAYER_POINT", "§f플레이어 포인트가 부족합니다. 잔액: {bal}"); - ccLang.get().addDefault("MESSAGE.NOT_ENOUGH_EXP_POINT", "§f경험치 포인트가 부족합니다. 잔액: {bal}"); - ccLang.get().addDefault("MESSAGE.NO_ITEM_TO_SELL", "§f판매 할 아이템이 없습니다."); - ccLang.get().addDefault("MESSAGE.NO_ITEM_TO_SELL_2", "§f판매 가능 한 아이템이 없습니다."); - ccLang.get().addDefault("MESSAGE.INVENTORY_FULL", "§4인벤토리에 빈 공간이 없습니다!"); - ccLang.get().addDefault("MESSAGE.IRREVERSIBLE", "§f이 행동은 되돌릴 수 없습니다!"); - ccLang.get().addDefault("MESSAGE.ITEM_ADDED", "아이템 추가됨!"); - ccLang.get().addDefault("MESSAGE.ITEM_UPDATED", "아이템 수정됨!"); - ccLang.get().addDefault("MESSAGE.ITEM_DELETED", "아이템 제거됨!"); - ccLang.get().addDefault("MESSAGE.CHANGES_APPLIED", "변경사항 적용됨. 새로운 값: "); - ccLang.get().addDefault("MESSAGE.CHANGES_APPLIED_2", "변경사항 적용됨"); - ccLang.get().addDefault("MESSAGE.RECOMMEND_APPLIED", "추천 값 적용됨. {playerNum}명 기준입니다. config파일에서 이 값을 바꿀 수 있습니다."); - ccLang.get().addDefault("MESSAGE.TRANSFER_SUCCESS", "송금 완료"); - ccLang.get().addDefault("MESSAGE.PURCHASE_REJECTED", "상점에 이 아이템이 너무 많습니다. 지금은 팔 수 없습니다."); - ccLang.get().addDefault("MESSAGE.CLICK_YOUR_ITEM_START_PAGE", "인벤토리의 아이템을 클릭하면 가장 좋은 조건의 상점으로 이동합니다.\n좌클릭: 구매 우클릭: 판매"); - ccLang.get().addDefault("MESSAGE.MOVE_TO_BEST_SHOP_BUY", "{item}을 가장 저렴하게 살 수 있는 상점으로 이동했습니다."); - ccLang.get().addDefault("MESSAGE.MOVE_TO_BEST_SHOP_SELL", "{item}을 가장 비싸게 팔 수 있는 상점으로 이동했습니다."); - ccLang.get().addDefault("MESSAGE.SHOP_IS_CLOSED_BY_ADMIN", "이 상점은 서버 관리자에 의해 닫혔습니다."); - ccLang.get().addDefault("MESSAGE.SHOP_DISABLED", "이 상점은 비황성화된 상태입니다. 어드민이 아닌 유저는 접근할 수 없습니다. 상점 설정에서 활성화 할 수 있습니다."); - ccLang.get().addDefault("MESSAGE.ROTATION_SHARED_DATA_MISSING", "§e[ ! ]§f'{0}/SharedData.yml' 에서 {1} 개의 아이템에 대한 정보를 찾을 수 없었습니다. 이 아이템들은 장식으로 추가되었습니다."); - ccLang.get().addDefault("MESSAGE.ENTER_COMMAND", "명령어를 '/' 제외하고 입력하세요."); - ccLang.get().addDefault("MESSAGE.ENTER_COMMAND_2", "'인덱스/명령어' 형태로 입력하세요."); - ccLang.get().addDefault("MESSAGE.SELL_COMMAND_CUR", "현재 적용중인 판매 명령어:"); - ccLang.get().addDefault("MESSAGE.BUY_COMMAND_CUR", "현재 적용중인 구매 명령어:"); - ccLang.get().addDefault("MESSAGE.Q_SEARCH_FAIL_CURRENCY", "해당 아이템은 여러 종류의 재화로 거래 중 입니다."); - - ccLang.get().addDefault("HELP.TITLE", "§f도움말: {command} --------------------"); - ccLang.get().addDefault("HELP.SHOP", "상점을 엽니다."); - ccLang.get().addDefault("HELP.CMD", "명령어 도움말 표시 토글."); - ccLang.get().addDefault("HELP.CREATE_SHOP", "상점을 새로 만듭니다."); - ccLang.get().addDefault("HELP.CREATE_SHOP_2", "퍼미션(나중에 바꿀 수 있습니다.)\n true: dshop.user.shop.상점이름\n false: 아무나 접근가능(기본값)\n 임의 입력: 해당 퍼미션 필요"); - ccLang.get().addDefault("HELP.DELETE_SHOP", "기존의 상점을 제거합니다."); - ccLang.get().addDefault("HELP.SHOP_ADD_HAND", "손에 들고 있는 아이템을 상점에 추가합니다."); - ccLang.get().addDefault("HELP.SHOP_ADD_ITEM", "상점에 아이템을 추가합니다."); - ccLang.get().addDefault("HELP.SHOP_EDIT", "상점에 있는 아이템을 수정합니다."); - ccLang.get().addDefault("HELP.PRICE", "§7가격은 다음과 같이 계산됩니다: median*value/stock"); - ccLang.get().addDefault("HELP.INF_STATIC", "§7median<0 == 고정가격 stock<0 == 무한재고"); - ccLang.get().addDefault("HELP.EDIT_ALL", "상점의 모든 아이템을 한번에 수정합니다."); - ccLang.get().addDefault("HELP.RELOAD", "플러그인을 재시작 합니다."); - ccLang.get().addDefault("HELP.RELOADED", "플러그인 리로드됨!"); - ccLang.get().addDefault("HELP.USAGE", "사용법"); - ccLang.get().addDefault("HELP.ITEM_ALREADY_EXIST", "§7§o{item}(은)는 이미 판매중임.\n {info}\n 명령어를 입력하면 값이 수정됩니다."); - ccLang.get().addDefault("HELP.ITEM_INFO", "§7§o{item}의 현재 설정:\n {info}"); - ccLang.get().addDefault("HELP.REMOVE_ITEM", "§f인자를 0으로 입력하면 이 아이템을 상점에서 §4제거§f합니다."); - ccLang.get().addDefault("HELP.QSELL", "§f빠르게 아이템을 판매합니다."); - ccLang.get().addDefault("HELP.DELETE_OLD_USER", "장기간 접속하지 않은 유저의 데이터를 삭제합니다."); - ccLang.get().addDefault("HELP.ACCOUNT", "상점의 계좌 잔액을 설정합니다. -1 = 무제한"); - ccLang.get().addDefault("HELP.SET_TO_REC_ALL", "§e상점의 모든 아이템 설정값을 권장값으로 §c초기화§e합니다."); - ccLang.get().addDefault("HELP.SHOP_ENABLE", "상점을 활성화 또는 비활성화 합니다."); - - ccLang.get().addDefault("ERR.NO_USER_ID", "§6플레이어 uuid를 찾을 수 없습니다. 상점 이용 불가능."); - ccLang.get().addDefault("ERR.ITEM_NOT_EXIST", "상점에 해당 아이템이 존재하지 않습니다."); - ccLang.get().addDefault("ERR.ITEM_FORBIDDEN", "사용할 수 없는 아이템 입니다."); - ccLang.get().addDefault("ERR.NO_PERMISSION", "§e권한이 없습니다."); - ccLang.get().addDefault("ERR.WRONG_USAGE", "잘못된 명령어 사용법. 도움말을 확인하세요."); - ccLang.get().addDefault("ERR.NO_EMPTY_SLOT", "상점에 빈 공간이 없습니다."); - ccLang.get().addDefault("ERR.WRONG_DATATYPE", "인자의 유형이 잘못 입력되었습니다."); - ccLang.get().addDefault("ERR.VALUE_ZERO", "인자값이 0보다 커야 합니다."); - ccLang.get().addDefault("ERR.WRONG_ITEM_NAME", "유효하지 않은 아이템 이름입니다."); - ccLang.get().addDefault("ERR.HAND_EMPTY", "아이템을 손에 들고 있어야 합니다."); - ccLang.get().addDefault("ERR.HAND_EMPTY2", "§c§o아이템을 손에 들고 있어야 합니다!"); - ccLang.get().addDefault("ERR.SHOP_NOT_FOUND", "§f해당 상점을 찾을 수 없습니다."); - ccLang.get().addDefault("ERR.SHOP_EXIST", "해당 이름을 가진 상점이 이미 존재합니다."); - ccLang.get().addDefault("ERR.SHOP_NOT_EXIST", "그런 이름을 가진 상점이 없습니다."); - ccLang.get().addDefault("ERR.SIGN_SHOP_REMOTE_ACCESS", "해당 상점은 표지판을 통해서만 접근할 수 있습니다."); - ccLang.get().addDefault("ERR.LOCAL_SHOP_REMOTE_ACCESS", "해당 상점은 직접 방문해야만 사용할 수 있습니다."); - ccLang.get().addDefault("ERR.MAX_LOWER_THAN_MIN", "최대 가격은 최소 가격보다 커야합니다."); - ccLang.get().addDefault("ERR.DEFAULT_VALUE_OUT_OF_RANGE", "기본 가격은 최소 가격과 최대 가격 사이의 값이어야 합니다."); - ccLang.get().addDefault("ERR.NO_RECOMMEND_DATA", "Worth.yml 파일에 이 아이템의 정보가 없습니다."); - ccLang.get().addDefault("ERR.JOBS_REBORN_NOT_FOUND", "Jobs reborn 플러그인을 찾을 수 없습니다."); - ccLang.get().addDefault("ERR.PLAYER_POINTS_NOT_FOUND", "Player points 플러그인을 찾을 수 없습니다."); - ccLang.get().addDefault("ERR.SHOP_HAS_INF_BAL", "{shop} 상점은 무한계좌 상점입니다."); - ccLang.get().addDefault("ERR.SHOP_DIFF_CURRENCY", "두 상점이 서로 다른 통화를 사용합니다."); - ccLang.get().addDefault("ERR.PLAYER_NOT_EXIST", "해당 플레이어를 찾을 수 없습니다."); - ccLang.get().addDefault("ERR.SHOP_LINK_FAIL", "상점 둘 중 하나는 실제 계좌이어야 합니다."); - ccLang.get().addDefault("ERR.SHOP_LINK_TARGET_ERR", "목표 상점은 실제 계좌를 가지고 있어야 합니다."); - ccLang.get().addDefault("ERR.NESTED_STRUCTURE", "계층 구조를 이루는것은 금지되어 있습니다. (ex. aa-bb, bb-cc)"); - ccLang.get().addDefault("ERR.CREATIVE", "§eCreative mode 에서 이 명령어를 사용할 수 없습니다. 권한이 없습니다."); - ccLang.get().addDefault("ERR.FILE_CREATE_FAIL", "§e파일 생성에 실패했습니다."); - ccLang.get().addDefault("ERR.INVALID_TRANSACTION", "이 거래는 더이상 유효하지 않습니다. 문제가 반복되면 서버 관리자에게 문의하세요."); - ccLang.get().addDefault("ERR.SIGN_WALL", "상점 표지판이 벽에 설치되야 합니다."); - - ccLang.get().addDefault("ERR.SHOP_NULL", "§e상점 이름이 지정되지 않았습니다."); - ccLang.get().addDefault("ERR.ITEMINFO_HAND_EMPTY", "아이템을 들고 있어야 합니다."); - ccLang.get().addDefault("HELP.ITEMINFO_USAGE", "§f아이템 정보를 보려면 손에 아이템을 들고 있어야 합니다."); - ccLang.get().addDefault("HELP.ITEMINFO_REALNAME", "§7실제 이름: §3{item_realname}"); - ccLang.get().addDefault("HELP.ITEMINFO_SIGN_NAME", "§7표지판용 이름: §3{item_signname}"); - ccLang.get().addDefault("ERR.SIGN_ITEM_INVALID", "아이템 이름이 잘못되었습니다. /ds iteminfo 를 사용하여 아이템 이름을 확인해 보세요."); - ccLang.get().addDefault("ERR.SIGN_ITEM_NOT_FOR_SALE", "상점에 없는 아이템 입니다."); - ccLang.get().addDefault("MESSAGE.SIGN_SHOP_CREATED", "§a표지판 상점 생성!"); - - ccLang.get().addDefault("ON", "켜짐"); - ccLang.get().addDefault("OFF", "꺼짐"); - ccLang.get().addDefault("SET", "설정"); - ccLang.get().addDefault("UNSET", "설정해제"); - ccLang.get().addDefault("NULL", "없음"); - ccLang.get().addDefault("NULL(OPEN)", "없음 (모두에게 열려있음)"); - ccLang.get().addDefault("CUR_STATE", "현재상태"); - ccLang.get().addDefault("CLICK", "클릭"); - ccLang.get().addDefault("LMB", "좌클릭"); - ccLang.get().addDefault("RMB", "우클릭"); - ccLang.get().addDefault("CLOSE", "§f닫기"); - ccLang.get().addDefault("CLOSE_LORE", "§f§n클릭: 닫기"); - - ccLang.get().addDefault("EXP_POINTS", "Exp"); - ccLang.get().addDefault("JOB_POINTS", "Job Points"); - ccLang.get().addDefault("PLAYER_POINTS", "Player Points"); - - ccLang.get().options().copyDefaults(true); - ccLang.save(); - } + ko_KR(); // 영어 - { - ccLang.setup("Lang_V3_en-US", null); - - ccLang.get().addDefault("START_PAGE.EDITOR_TITLE", "§3Edit icon"); - ccLang.get().addDefault("START_PAGE.EDIT_NAME", "§fRename"); - ccLang.get().addDefault("START_PAGE.EDIT_LORE", "§fChange lore"); - ccLang.get().addDefault("START_PAGE.EDIT_ICON", "§fChange icon"); - ccLang.get().addDefault("START_PAGE.EDIT_ACTION", "§fChange command"); - ccLang.get().addDefault("START_PAGE.SHOP_SHORTCUT", "§fCreate shop button"); - ccLang.get().addDefault("START_PAGE.CREATE_DECO", "§fCreate decorative button"); - ccLang.get().addDefault("START_PAGE.ENTER_SHOP_NAME", "Please enter shop name"); - ccLang.get().addDefault("START_PAGE.DEFAULT_SHOP_LORE", "§f§nClick: go to shop"); - ccLang.get().addDefault("START_PAGE.ITEM_MOVE_LORE", "§eRMB: Move"); - ccLang.get().addDefault("START_PAGE.ITEM_COPY_LORE", "§eRMB: Copy"); - ccLang.get().addDefault("START_PAGE.ITEM_REMOVE_LORE", "§eShift LMB: Remove"); - ccLang.get().addDefault("START_PAGE.ITEM_EDIT_LORE", "§eShift RMB: Edit"); - ccLang.get().addDefault("START_PAGE.REMOVE", "§fRemove"); - ccLang.get().addDefault("START_PAGE.REMOVE_LORE", "§fRemove this button from the start page."); - ccLang.get().addDefault("START_PAGE.ENTER_NAME", "Enter a new name for the button."); - ccLang.get().addDefault("START_PAGE.ENTER_LORE", "Enter a new description for the button."); - ccLang.get().addDefault("START_PAGE.ENTER_ICON", "Enter the name of the item to be used as the icon for the button. (English, case insensitive)"); - ccLang.get().addDefault("START_PAGE.ENTER_ACTION", "Enter the command without '/'. This command is executed when the button is pressed."); - ccLang.get().addDefault("START_PAGE.ENTER_COLOR", "Enter a color for the decorative button. (English)"); - ccLang.get().addDefault("START_PAGE.SHOP_LIST_TITLE", "§3Shop List"); - ccLang.get().addDefault("START_PAGE.SHOP_LIST.PAGE_TITLE", "§f{curPage}/{maxPage} Page"); - ccLang.get().addDefault("START_PAGE.SHOP_LIST.PAGE_LORE", "§eLMB: Previous page\n§eRMB: Next page"); - - ccLang.get().addDefault("COLOR_PICKER_TITLE", "§3Color Picker"); - - ccLang.get().addDefault("SHOP.TRADE_LORE", "§f§nClick: Trade"); - ccLang.get().addDefault("SHOP.BUY_PRICE", "§fBuy: {num}"); - ccLang.get().addDefault("SHOP.SELL_PRICE", "§fSell: {num}"); - ccLang.get().addDefault("SHOP.BUY_PRICE_DISCOUNTED", "§fBuy: §8§m{num}§r §a{num2}"); - ccLang.get().addDefault("SHOP.SELL_PRICE_DISCOUNTED", "§fSell: §8§m{num}§r §c{num2}"); - ccLang.get().addDefault("SHOP.BUY_PRICE_EXP", "§fBuy: {num}Exp"); - ccLang.get().addDefault("SHOP.SELL_PRICE_EXP", "§fSell: {num}Exp"); - ccLang.get().addDefault("SHOP.BUY_PRICE_DISCOUNTED_EXP", "§fBuy: §8§m{num}Exp§r §a{num2}Exp"); - ccLang.get().addDefault("SHOP.SELL_PRICE_DISCOUNTED_EXP", "§fSell: §8§m{num}Exp§r §c{num2}Exp"); - ccLang.get().addDefault("SHOP.BUY_PRICE_PP", "§fBuy: {num}PP"); - ccLang.get().addDefault("SHOP.SELL_PRICE_PP", "§fSell: {num}PP"); - ccLang.get().addDefault("SHOP.BUY_PRICE_DISCOUNTED_PP", "§fBuy: §8§m{num}PP§r §a{num2}PP"); - ccLang.get().addDefault("SHOP.SELL_PRICE_DISCOUNTED_PP", "§fSell: §8§m{num}PP§r §c{num2}PP"); - ccLang.get().addDefault("SHOP.BUY_PRICE_JP", "§fBuy: {num}JP"); - ccLang.get().addDefault("SHOP.SELL_PRICE_JP", "§fSell: {num}JP"); - ccLang.get().addDefault("SHOP.BUY_PRICE_DISCOUNTED_JP", "§fBuy: §8§m{num}JP§r §a{num2}JP"); - ccLang.get().addDefault("SHOP.SELL_PRICE_DISCOUNTED_JP", "§fSell: §8§m{num}JP§r §c{num2}JP"); - ccLang.get().addDefault("SHOP.STOCK", "§8Stock: {num}"); - ccLang.get().addDefault("SHOP.STOCK_2", "§8Stock: {stock}/{max_stock}"); - ccLang.get().addDefault("SHOP.INF_STOCK", "§8Infinite"); - ccLang.get().addDefault("SHOP.STATIC_PRICE", "§8[Fixed price]"); - ccLang.get().addDefault("SHOP.STACKS", "§8{num} Stacks"); - ccLang.get().addDefault("SHOP.ITEM_MOVE_LORE", "§eRMB: Move"); - ccLang.get().addDefault("SHOP.ITEM_COPY_LORE", "§eRMB: Copy"); - ccLang.get().addDefault("SHOP.ITEM_EDIT_LORE", "§eShiftRMB: Edit"); - ccLang.get().addDefault("SHOP.DECO_DELETE_LORE", "§eShiftRMB: Remove"); - ccLang.get().addDefault("SHOP.PAGE_TITLE", "§f{curPage}/{maxPage} Page"); - ccLang.get().addDefault("SHOP.PAGE_LORE_V2", "§f§nLMB: Previous page\n§f§nRMB: Next page\n§7Clicking on your item will\n§7take you to the page where\n§7that item is located."); - ccLang.get().addDefault("SHOP.GO_TO_PAGE_EDITOR", "§eShift RMB: Page Editor"); - ccLang.get().addDefault("SHOP.ITEM_MOVE_SELECTED", "Item selected. Right-click on an empty field to move it."); - ccLang.get().addDefault("SHOP.PERMISSION", "§fPermission:"); - ccLang.get().addDefault("SHOP.PERMISSION_ITEM", "§7 - {permission}"); - ccLang.get().addDefault("SHOP.FLAGS", "§eFlag:"); - ccLang.get().addDefault("SHOP.FLAGS_ITEM", "§e - {flag}"); - ccLang.get().addDefault("SHOP.SHOP_BAL_INF", "§fUnlimited"); - ccLang.get().addDefault("SHOP.SHOP_BAL", "§fShop account balance"); - ccLang.get().addDefault("SHOP.SHOP_LOCATION", "§fShop location: x {x}, y {y}, z {z}"); - ccLang.get().addDefault("SHOP.SHOP_LOCATION_B", "§fShop location: "); - ccLang.get().addDefault("SHOP.SHOP_INFO_DASH", "§7 - "); - ccLang.get().addDefault("SHOP.DISABLED", "§cDisabled§8|§f"); - ccLang.get().addDefault("SHOP.INCOMPLETE_DATA", "INCOMPLETE DATA"); - ccLang.get().addDefault("SHOP.INCOMPLETE_DATA_Lore", "This item is not visible\nto non-op users.\nIndex: "); - ccLang.get().addDefault("SHOP.TRADE_LIMIT_BUY", "§aPurchase limit: {num}left"); - ccLang.get().addDefault("SHOP.TRADE_LIMIT_SELL", "§aSales limit: {num}left"); - ccLang.get().addDefault("SHOP.TRADE_LIMIT_TIMER", "§aNext reset: {time}"); - ccLang.get().addDefault("SHOP.CLICK_TO_ADD", "§eClick: Add"); - - ccLang.get().addDefault("SHOP_SETTING_TITLE", "§3Shop Settings"); - ccLang.get().addDefault("SHOP_SETTING.LOG_TOGGLE_LORE", "§eRMB: Log Viewer"); - ccLang.get().addDefault("SHOP_SETTING.LOG_PRINT_CONSOLE", "§fPrint log to console"); - ccLang.get().addDefault("SHOP_SETTING.LOG_PRINT_ADMIN", "§fPrint log to admin"); - ccLang.get().addDefault("SHOP_SETTING.MAX_PAGE", "§fMax page"); - ccLang.get().addDefault("SHOP_SETTING.MAX_PAGE_LORE", "§fSets the maximum page for the shop."); - ccLang.get().addDefault("SHOP_SETTING.BACKGROUND", "§fBackground color"); - ccLang.get().addDefault("SHOP_SETTING.BACKGROUND_LORE", "§eClick: Change color"); - ccLang.get().addDefault("SHOP_SETTING.L_R_SHIFT", "§eLMB: -1 RMB: +1 Shift: x5"); - ccLang.get().addDefault("SHOP_SETTING.FLAG", "§fFlag"); - ccLang.get().addDefault("SHOP_SETTING.SHOP_SETTINGS_LORE", "§eRMB: Shop Settings"); - ccLang.get().addDefault("SHOP_SETTING.SIGN_SHOP_LORE", "§fOnly accessible via sign."); - ccLang.get().addDefault("SHOP_SETTING.LOCAL_SHOP_LORE", "§fMust visit actual store locations."); - ccLang.get().addDefault("SHOP_SETTING.DELIVERY_CHARGE_LORE", "§fYou can pay for delivery without \n§fhaving to go to the shop location to transact."); - ccLang.get().addDefault("SHOP_SETTING.SELECTED", "§2Selected"); - ccLang.get().addDefault("SHOP_SETTING.CURRENCY", "§fCurrency Type: "); - ccLang.get().addDefault("SHOP_SETTING.VAULT_LORE", "§fThis is the default."); - ccLang.get().addDefault("SHOP_SETTING.EXP_LORE", "§fTrade with the player's experience points."); - ccLang.get().addDefault("SHOP_SETTING.JOB_POINT_LORE", "§fTrade with job points. \n§fRequires 'Jobs Reborn' plugin"); - ccLang.get().addDefault("SHOP_SETTING.PLAYER_POINT_LORE", "§fTrade with player points. \n§fRequires 'Player point' plugin"); - ccLang.get().addDefault("SHOP_SETTING.SHOW_VALUE_CHANGE_LORE", "§fShows the amount of change in price."); - ccLang.get().addDefault("SHOP_SETTING.HIDE_STOCK", "§fHide stock."); - ccLang.get().addDefault("SHOP_SETTING.HIDE_PRICING_TYPE", "§fHide price type."); - ccLang.get().addDefault("SHOP_SETTING.HIDE_SHOP_BALANCE", "§fHide shop account balance."); - ccLang.get().addDefault("SHOP_SETTING.SHOW_MAX_STOCK", "§fShow max stock."); - ccLang.get().addDefault("SHOP_SETTING.HIDDEN_IN_COMMAND", "§fDon't show this store\n§fin command autocomplete."); - ccLang.get().addDefault("SHOP_SETTING.INTEGER_ONLY", "§fThe purchase price will be rounded up.\n§fThe sale price will be rounded down."); - ccLang.get().addDefault("SHOP_SETTING.PERMISSION", "§fPermission"); - ccLang.get().addDefault("SHOP_SETTING.STATE", "§fState"); - ccLang.get().addDefault("SHOP_SETTING.STATE_ENABLE", "§aEnable"); - ccLang.get().addDefault("SHOP_SETTING.STATE_DISABLE", "§cDisable"); - ccLang.get().addDefault("SHOP_SETTING.ROTATION_EDITOR", "§fRotation: "); - ccLang.get().addDefault("SHOP_SETTING.ROTATION_EDITOR_LORE", "§eClick: Rotation editor"); - ccLang.get().addDefault("SHOP_SETTING.COMMAND_TOGGLE", "§fCommand"); - ccLang.get().addDefault("SHOP_SETTING.COMMAND_TOGGLE_LORE", "§fExecutes server commands\n§fwhen a store transaction occurs."); - ccLang.get().addDefault("SHOP_SETTING.COMMAND_SELL", "§fSell Command"); - ccLang.get().addDefault("SHOP_SETTING.COMMAND_BUY", "§fBuy Command"); - ccLang.get().addDefault("SHOP_SETTING.COMMAND_LORE1", "§eLMB: Set"); - ccLang.get().addDefault("SHOP_SETTING.COMMAND_LORE3", "§eShift RMB: Delete last item"); - ccLang.get().addDefault("SHOP_SETTING.TRADE_UI", "§fEdit Trade UI"); - ccLang.get().addDefault("SHOP_SETTING.TRADE_UI_LORE_2", "§eLMB: Edit\n§eRMB: Reset"); - - ccLang.get().addDefault("ROTATION_EDITOR_TITLE", "§3Rotation Editor"); - ccLang.get().addDefault("ROTATION_EDITOR.ENABLED", "§aEnabled"); - ccLang.get().addDefault("ROTATION_EDITOR.DISABLED", "§cDisabled"); - ccLang.get().addDefault("ROTATION_EDITOR.CLICK_TO_ENABLE", "§eLMB: Enable"); - ccLang.get().addDefault("ROTATION_EDITOR.CLICK_TO_DISABLE", "§eLMB: Disable"); - ccLang.get().addDefault("ROTATION_EDITOR.CURRENT_TIME", "§fCurrent time: "); - ccLang.get().addDefault("ROTATION_EDITOR.CURRENTLY_IN_USE", "§a[Currently in use]"); - ccLang.get().addDefault("ROTATION_EDITOR.NEXT_ROTATION", "§fNext rotation: "); - ccLang.get().addDefault("ROTATION_EDITOR.PERIOD", "§fPeriod"); - ccLang.get().addDefault("ROTATION_EDITOR.PERIOD_LORE_V2", "§eLMB: -1h, RMB: +1h, Shift: x10"); - ccLang.get().addDefault("ROTATION_EDITOR.TIMER", "§fTimer adjustment"); - ccLang.get().addDefault("ROTATION_EDITOR.TIMER_LORE_V2", "§eLMB: -10m, RMB: +10m, Shift: x6"); - ccLang.get().addDefault("ROTATION_EDITOR.HOUR", "§f{0}hours"); - ccLang.get().addDefault("ROTATION_EDITOR.UNSAVED_CHANGES", "§c§oUnsaved changes"); - ccLang.get().addDefault("ROTATION_EDITOR.APPLY_CHANGES", "§fApply changes"); - ccLang.get().addDefault("ROTATION_EDITOR.APPLY_CHANGES_LORE", "§eLMB: Save changes\n§eRMB: Reset Changes"); - ccLang.get().addDefault("ROTATION_EDITOR.APPLY_ROTATION", "§eLMB: Apply now"); - ccLang.get().addDefault("ROTATION_EDITOR.OPEN", "§eLMB: Open"); - ccLang.get().addDefault("ROTATION_EDITOR.CREATE", "§eLMB: Create empty"); - ccLang.get().addDefault("ROTATION_EDITOR.COPY_AS_NEW", "§eRMB: Copy as new"); - ccLang.get().addDefault("ROTATION_EDITOR.DELETE", "§eShift RMB: §cDelete"); - ccLang.get().addDefault("ROTATION_EDITOR.REAPPLY", "§eShift LMB: Reapply"); - ccLang.get().addDefault("ROTATION_EDITOR.MOVE", "§eRMB: Move"); - - ccLang.get().addDefault("ITEM_SETTING_TITLE", "§3Item Settings"); - ccLang.get().addDefault("ITEM_SETTING.VALUE_BUY", "§fPurchase value: "); - ccLang.get().addDefault("ITEM_SETTING.VALUE_SELL", "§fSales value: "); - ccLang.get().addDefault("ITEM_SETTING.PRICE", "§fBuy: "); - ccLang.get().addDefault("ITEM_SETTING.SELL_PRICE", "§fSell: "); - ccLang.get().addDefault("ITEM_SETTING.PRICE_MIN", "§fMinimum price: "); - ccLang.get().addDefault("ITEM_SETTING.PRICE_MAX", "§fMaximum price: "); - ccLang.get().addDefault("ITEM_SETTING.MEDIAN", "§fMedian: "); - ccLang.get().addDefault("ITEM_SETTING.STOCK", "§fStock: "); - ccLang.get().addDefault("ITEM_SETTING.MAX_STOCK", "§fMax stock: "); - ccLang.get().addDefault("ITEM_SETTING.MAX_STOCK_LORE", "§fIf the stock exceeds this,\n§fthe shop will refuse to purchase."); - ccLang.get().addDefault("ITEM_SETTING.INF_STOCK", "Infinite stock"); - ccLang.get().addDefault("ITEM_SETTING.STATIC_PRICE", "Fixed price"); - ccLang.get().addDefault("ITEM_SETTING.UNLIMITED", "Unlimited"); - ccLang.get().addDefault("ITEM_SETTING.MEDIAN_HELP", "§fThe smaller the median,\n§fthe steeper the price change."); - ccLang.get().addDefault("ITEM_SETTING.TAX_IGNORED", "Sales tax settings are ignored."); - ccLang.get().addDefault("ITEM_SETTING.RECOMMEND", "§fApply recommended values"); - ccLang.get().addDefault("ITEM_SETTING.DISCOUNT", "§fDiscount"); - ccLang.get().addDefault("ITEM_SETTING.DISCOUNT_LORE", "§fDiscount rate: {num}%\n§eLMB: +10, RMB: -10"); - ccLang.get().addDefault("ITEM_SETTING.DISCOUNT_LORE_2", "§fDiscount rate: {num}%\n§eLMB: -10, RMB: +10"); - ccLang.get().addDefault("ITEM_SETTING.DONE", "§fDone"); - ccLang.get().addDefault("ITEM_SETTING.DONE_LORE", "§fDone!"); - ccLang.get().addDefault("ITEM_SETTING.ROUND_DOWN", "§fRound down"); - ccLang.get().addDefault("ITEM_SETTING.SET_TO_MEDIAN", "§fSet to median"); - ccLang.get().addDefault("ITEM_SETTING.SET_TO_STOCK", "§fSet to stock"); - ccLang.get().addDefault("ITEM_SETTING.SET_TO_VALUE", "§fSet to value"); - ccLang.get().addDefault("ITEM_SETTING.CLOSE", "§fClose"); - ccLang.get().addDefault("ITEM_SETTING.CLOSE_LORE", "§f§nClick: Close"); - ccLang.get().addDefault("ITEM_SETTING.REMOVE", "§cRemove"); - ccLang.get().addDefault("ITEM_SETTING.REMOVE_LORE", "§fRemove this item from the shop."); - ccLang.get().addDefault("ITEM_SETTING.BUY", "§3§lBuy: {num}"); - ccLang.get().addDefault("ITEM_SETTING.SELL", "§3§lSell: {num}"); - ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_SELL", "§fSales limit per player"); - ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_SELL_LORE", "§f{num}\n§eLMB: -1, RMB: +1, Shift = x10"); - ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_BUY", "§fPurchase limit per player"); - ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_BUY_LORE", "§f{num}\n§eLMB: -1, RMB: +1, Shift = x10"); - ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_INTERVAL", "§fTrading volume limit reset cycle"); - ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_INTERVAL_LORE", "§fInterval: {interval}\n§fNext reset: {time}\n§eLMB: -1h, RMB: +1h, Shift = x12"); - ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_TIMER", "§fAdjust Timer"); - ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_TIMER_LORE", "§f{num}\n§fNext reset: {time}\n§eLMB: -1h, RMB: +1h, Shift = x12"); - - ccLang.get().addDefault("TRADE_TITLE", "§3Trade"); - ccLang.get().addDefault("TRADE.TOGGLE_SELLABLE", "§eClick: Sale only toggle"); - ccLang.get().addDefault("TRADE.TOGGLE_BUYABLE", "§eClick: Purchase Only Toggle"); - ccLang.get().addDefault("TRADE.BUY_ONLY_LORE", "§fThis item cannot be sold."); - ccLang.get().addDefault("TRADE.SELL_ONLY_LORE", "§fThis item cannot be purchased."); - ccLang.get().addDefault("TRADE.BALANCE", "§3My balance"); - ccLang.get().addDefault("TRADE.PRICE", "§fBuy: {num}"); - ccLang.get().addDefault("TRADE.SELL_PRICE", "§fSell: {num}"); - ccLang.get().addDefault("TRADE.PRICE_DISCOUNTED", "§fBuy: §8§m{num}§r §a{num2}"); - ccLang.get().addDefault("TRADE.SELL_PRICE_DISCOUNTED", "§fSell: §8§m{num}§r §c{num2}"); - ccLang.get().addDefault("TRADE.PRICE_EXP", "§fBuy: {num}EXP"); - ccLang.get().addDefault("TRADE.SELL_PRICE_EXP", "§fSell: {num}EXP"); - ccLang.get().addDefault("TRADE.PRICE_DISCOUNTED_EXP", "§fBuy: §8§m{num}EXP§r §a{num2}EXP"); - ccLang.get().addDefault("TRADE.SELL_PRICE_DISCOUNTED_EXP", "§fSell: §8§m{num}EXP§r §c{num2}EXP"); - ccLang.get().addDefault("TRADE.PRICE_PP", "§fBuy: {num}PP"); - ccLang.get().addDefault("TRADE.SELL_PRICE_PP", "§fSell: {num}PP"); - ccLang.get().addDefault("TRADE.PRICE_DISCOUNTED_PP", "§fBuy: §8§m{num}PP§r §a{num2}PP"); - ccLang.get().addDefault("TRADE.SELL_PRICE_DISCOUNTED_PP", "§fSell: §8§m{num}PP§r §c{num2}PP"); - ccLang.get().addDefault("TRADE.PRICE_JP", "§fBuy: {num}JP"); - ccLang.get().addDefault("TRADE.SELL_PRICE_JP", "§fSell: {num}JP"); - ccLang.get().addDefault("TRADE.PRICE_DISCOUNTED_JP", "§fBuy: §8§m{num}JP§r §a{num2}JP"); - ccLang.get().addDefault("TRADE.SELL_PRICE_DISCOUNTED_JP", "§fSell: §8§m{num}JP§r §c{num2}JP"); - ccLang.get().addDefault("TRADE.BUY", "§cBuy"); - ccLang.get().addDefault("TRADE.SELL", "§2Sell"); - ccLang.get().addDefault("TRADE.STOCK", "§8Stock: "); - ccLang.get().addDefault("TRADE.STACKS", "§8{num} Stacks"); - ccLang.get().addDefault("TRADE.INF_STOCK", "§8Infinite"); - ccLang.get().addDefault("TRADE.SHOP_BAL_INF", "§fUnlimited"); - ccLang.get().addDefault("TRADE.SHOP_BAL", "§3Shop account balance \n§f{num}"); - ccLang.get().addDefault("TRADE.CLICK_TO_BUY", "§c§nClick: Buy {amount}"); - ccLang.get().addDefault("TRADE.CLICK_TO_SELL", "§2§nClick: Sell {amount}"); - ccLang.get().addDefault("TRADE.PURCHASE_LIMIT_PER_PLAYER", "§aPurchase limit: {num}left\n§aNext reset: {time}"); - ccLang.get().addDefault("TRADE.SALES_LIMIT_PER_PLAYER", "§aSales limit: {num}left\n§aNext reset: {time}"); - ccLang.get().addDefault("TRADE.QUANTITY_LORE", "§eShift RMB: Edit Quantity"); - ccLang.get().addDefault("TRADE.WAIT_FOR_INPUT", "Enter the quantity that will be displayed in the Trade UI.\nExample: 1,2,4,8,16,32,64"); - - ccLang.get().addDefault("PAGE_EDITOR_TITLE", "§3Page Editor"); - ccLang.get().addDefault("PAGE_EDITOR.PREV", "§f<<"); - ccLang.get().addDefault("PAGE_EDITOR.NEXT", "§f>>"); - ccLang.get().addDefault("PAGE_EDITOR.PAGE_SWAP_SUCCESS", "§fThe page has been replaced."); - ccLang.get().addDefault("PAGE_EDITOR.PAGE_SWAP_FAIL", "§fPage replacement failed."); - ccLang.get().addDefault("PAGE_EDITOR.PAGE_SWAP_SELECTED", "§fPage has been selected. Right-click on the other pages to be replaced."); - ccLang.get().addDefault("PAGE_EDITOR.PAGE_LORE_PREMIUM", "§eLMB: Open page\n§eRMB: Swap\n§eShift LMB: Insert\n§eShift RMB: Delete"); - ccLang.get().addDefault("PAGE_EDITOR.PRICE", "§fBuy: {num}"); - ccLang.get().addDefault("PAGE_EDITOR.SELL_PRICE", "§fSell: {num}"); - ccLang.get().addDefault("PAGE_EDITOR.STOCK", "§8Stock: {num}"); - ccLang.get().addDefault("PAGE_EDITOR.STACKS", "§8{num} Stakcs"); - ccLang.get().addDefault("PAGE_EDITOR.STATIC_PRICE", "§8[Fixed price]"); - ccLang.get().addDefault("PAGE_EDITOR.EMPTY", "§8(empty)"); - ccLang.get().addDefault("PAGE_EDITOR.EMPTY_SLOT_LORE", "§eLMB,RMB: Push\n§e+Shift: Pull"); - - ccLang.get().addDefault("LOG_VIEWER_TITLE", "§3Log Viewer"); - ccLang.get().addDefault("LOG_VIEWER.DATE", "§fDate: "); - ccLang.get().addDefault("LOG_VIEWER.TIME", "§fTime: "); - ccLang.get().addDefault("LOG_VIEWER.CURRENCY", "§fCurrency: "); - ccLang.get().addDefault("LOG_VIEWER.PRICE", "§fPrice: "); - ccLang.get().addDefault("LOG_VIEWER.EXPAND", "§fExpand"); - ccLang.get().addDefault("LOG_VIEWER.COLLAPSE", "§fCollapse"); - ccLang.get().addDefault("LOG_VIEWER.PAGE_TITLE", "§f{curPage}/{maxPage} Page"); - ccLang.get().addDefault("LOG_VIEWER.PAGE_LORE", "§eLMB: Prev\n§eRMB: Next"); - ccLang.get().addDefault("LOG_VIEWER.FILE_LORE", "§eLMB: Open\n§eShift RMB: §cDelete"); - - ccLang.get().addDefault("LOG.LOG", "§fLog"); - ccLang.get().addDefault("LOG.CLEAR", "§fLog deleted"); - ccLang.get().addDefault("LOG.SAVE", "§fLog saved"); - ccLang.get().addDefault("LOG.DELETE", "§4Delete log"); - ccLang.get().addDefault("LOG.SELL", "§f{player} sells {amount} {item} to {shop}"); - ccLang.get().addDefault("LOG.BUY", "§f{player} buys {amount} {item} from {shop}"); - - ccLang.get().addDefault("STOCK_SIMULATOR_TITLE", "§3Stock Simulator"); - ccLang.get().addDefault("STOCK_SIMULATOR.CHANGE_SAMPLE_LORE", "§eLMB, RMB: Change Item"); - ccLang.get().addDefault("STOCK_SIMULATOR.SIMULATOR_BUTTON_LORE", "§eRMB: Simulator"); - ccLang.get().addDefault("STOCK_SIMULATOR.RUN_TITLE", "§fRun"); - ccLang.get().addDefault("STOCK_SIMULATOR.RUN_LORE", "§eLMB: Run simulation\n§eRMB: Apply the settings to the shop\n§fItems are not affected."); - ccLang.get().addDefault("STOCK_SIMULATOR.REAL_TIME", "§a(real time)"); - ccLang.get().addDefault("STOCK_SIMULATOR.AFTER_S", "§aAfter {0} seconds"); - ccLang.get().addDefault("STOCK_SIMULATOR.AFTER_M", "§aAfter {0} minutes"); - ccLang.get().addDefault("STOCK_SIMULATOR.AFTER_H", "§aAfter {0} hours"); - ccLang.get().addDefault("STOCK_SIMULATOR.AFTER_D", "§aAfter {0} days"); - ccLang.get().addDefault("STOCK_SIMULATOR.L_R_SHIFT", "§eLMB: -1 RMB: +1 Shift: x5"); - ccLang.get().addDefault("STOCK_SIMULATOR.PRICE", "§fPurchase price: {num}"); - ccLang.get().addDefault("STOCK_SIMULATOR.MEDIAN", "§fMedian: {num}"); - ccLang.get().addDefault("STOCK_SIMULATOR.STOCK", "§fStock: {num}"); - - ccLang.get().addDefault("PALETTE_TITLE", "§3Select item to sell"); - ccLang.get().addDefault("PALETTE_TITLE2", "§3Select item"); - ccLang.get().addDefault("PALETTE.LORE_PREMIUM", "§eLMB: Add\n§eShift LMB: Add after setting\n§eRMB: Add as decoration\n§eShift RMB: Search '{item}'"); - ccLang.get().addDefault("PALETTE.LORE2", "§eLMB: Select\n§eShift RMB: Search '{item}'"); - ccLang.get().addDefault("PALETTE.SEARCH", "§fSearch"); - ccLang.get().addDefault("PALETTE.ADD_ALL", "§fAdd all"); - ccLang.get().addDefault("PALETTE.ADD_ALL_LORE", "§eLMB: Add all\n§eShift LMB: Add all and apply recommended values"); - ccLang.get().addDefault("PALETTE.PAGE_TITLE", "§f{curPage}/{maxPage} page"); - ccLang.get().addDefault("PALETTE.PAGE_LORE", "§f§nLMB: Prev\n§f§nRMB: Next"); - ccLang.get().addDefault("PALETTE.FILTER_APPLIED", "§fFilter Applied : "); - ccLang.get().addDefault("PALETTE.FILTER_LORE", "§eLMB: Search\n§eRMB: Clear filter\n\n§7Example for finding \"BLUE_WOOL\":\n§7 b w\n§7 wool\n§7 blue wool"); - - ccLang.get().addDefault("QUICK_SELL_TITLE", "§3Quick Sell"); - ccLang.get().addDefault("QUICK_SELL.GUIDE_TITLE", "§3§lQuick Sell Guide"); - ccLang.get().addDefault("QUICK_SELL.GUIDE_LORE", "§aLeft-click the item you want to sell.\n§aShift left click to sell all items of the same type.\n§aRight-click to go to the item shop."); - - ccLang.get().addDefault("ARROW.UP", "§a⬆"); - ccLang.get().addDefault("ARROW.DOWN", "§c⬇"); - ccLang.get().addDefault("ARROW.UP_2", "§c⬆"); - ccLang.get().addDefault("ARROW.DOWN_2", "§a⬇"); - - ccLang.get().addDefault("TIME.OPEN", "Open"); - ccLang.get().addDefault("TIME.CLOSE", "Close"); - ccLang.get().addDefault("TIME.OPEN_LORE", "§fSet opening time"); - ccLang.get().addDefault("TIME.CLOSE_LORE", "§fSet closing time"); - ccLang.get().addDefault("TIME.SHOPHOURS", "§fOpening hours"); - ccLang.get().addDefault("TIME.OPEN24", "Open 24 hours"); - ccLang.get().addDefault("TIME.SHOP_IS_CLOSED", "§fThe shop is closed. It opens at {time} o'clock. {curTime} o'clock now."); - ccLang.get().addDefault("TIME.SET_SHOPHOURS", "Set business hours"); - ccLang.get().addDefault("TIME.CUR", "§fCurrent time: {time}h"); - - ccLang.get().addDefault("STOCK_STABILIZING.SS", "§fStock stabilization"); - ccLang.get().addDefault("STOCK_STABILIZING.L_R_SHIFT", "§eLMB: -0.1 RMB: +0.1 Shift: x5"); - ccLang.get().addDefault("STOCK_STABILIZING.STRENGTH_LORE_A", "§fn% of median"); - ccLang.get().addDefault("STOCK_STABILIZING.STRENGTH_LORE_B", "§fn% of the gap with median"); - - ccLang.get().addDefault("FLUCTUATION.FLUCTUATION", "§fStock fluctuation"); - ccLang.get().addDefault("FLUCTUATION.INTERVAL", "§fInterval"); - ccLang.get().addDefault("FLUCTUATION.INTERVAL_LORE", "§f1h = 1000ticks = real time 50s"); - ccLang.get().addDefault("FLUCTUATION.STRENGTH", "§fStrength"); - ccLang.get().addDefault("FLUCTUATION.STRENGTH_LORE", "§fn% of median"); - - ccLang.get().addDefault("TAX.SALES_TAX", "§fSales tax"); - ccLang.get().addDefault("TAX.USE_GLOBAL", "Use global settings ({tax}%)"); - ccLang.get().addDefault("TAX.USE_LOCAL", "Set separately"); - - ccLang.get().addDefault("MESSAGE.SEARCH_ITEM", "§fEnter the name of the item you are looking for."); - ccLang.get().addDefault("MESSAGE.SEARCH_CANCELED", "§fSearch Canceled."); - ccLang.get().addDefault("MESSAGE.INPUT_CANCELED", "§fInput canceled."); - ccLang.get().addDefault("MESSAGE.DELETE_CONFIRM", "§fAre you sure you want to delete the page? Enter 'delete' to delete."); - ccLang.get().addDefault("MESSAGE.CANT_DELETE_LAST_PAGE", "§fThe last remaining page cannot be deleted."); - ccLang.get().addDefault("MESSAGE.SHOP_BAL_LOW", "§fThe shop doesn't have enough money."); - ccLang.get().addDefault("MESSAGE.SHOP_CREATED", "§fShop created!"); - ccLang.get().addDefault("MESSAGE.SHOP_DELETED", "§fShop deleted!"); - ccLang.get().addDefault("MESSAGE.OUT_OF_STOCK", "§fOut of stock!"); - ccLang.get().addDefault("MESSAGE.BUY_SUCCESS", "§fBought {item} x{amount} for {price}. Balance: {bal}"); - ccLang.get().addDefault("MESSAGE.SELL_SUCCESS", "§fSold {item} x{amount} for {price}. Balance: {bal}"); - ccLang.get().addDefault("MESSAGE.BUY_SUCCESS_EXP", "§fBought {item} x{amount} for {price}Exp Points. Balance: {bal}"); - ccLang.get().addDefault("MESSAGE.SELL_SUCCESS_EXP", "§fSold {item} x{amount} for {price}Exp Points. Balance: {bal}"); - ccLang.get().addDefault("MESSAGE.BUY_SUCCESS_JP", "§fBought {item} x{amount} for {price}points. Remaining points: {bal}"); - ccLang.get().addDefault("MESSAGE.SELL_SUCCESS_JP", "§fSold {item} x{amount} for {price}points. Remaining points: {bal}"); - ccLang.get().addDefault("MESSAGE.BUY_SUCCESS_PP", "§fBought {item} x{amount} for {price}points. Remaining points: {bal}"); - ccLang.get().addDefault("MESSAGE.SELL_SUCCESS_PP", "§fSold {item} x{amount} for {price}points. Remaining points: {bal}"); - ccLang.get().addDefault("MESSAGE.QSELL_NA", "§fThere is no shop that handles this item."); - ccLang.get().addDefault("MESSAGE.DELIVERY_CHARGE", "§fDelivery fee: {fee}"); - ccLang.get().addDefault("MESSAGE.DELIVERY_CHARGE_NA", "§fIt cannot be delivered to another world."); - ccLang.get().addDefault("MESSAGE.NOT_ENOUGH_MONEY", "§fNot enough money. balance: {bal}"); - ccLang.get().addDefault("MESSAGE.NOT_ENOUGH_POINT", "§fNot enough points. balance: {bal}"); - ccLang.get().addDefault("MESSAGE.NOT_ENOUGH_PLAYER_POINT", "§fNot enough player points. balance: {bal}"); - ccLang.get().addDefault("MESSAGE.NOT_ENOUGH_EXP_POINT", "§fNot enough Exp points. balance: {bal}"); - ccLang.get().addDefault("MESSAGE.NO_ITEM_TO_SELL", "§fThere are no items for sale."); - ccLang.get().addDefault("MESSAGE.NO_ITEM_TO_SELL_2", "§fThere are no items available for sale."); - ccLang.get().addDefault("MESSAGE.INVENTORY_FULL", "§4There are no empty spaces in your inventory!"); - ccLang.get().addDefault("MESSAGE.IRREVERSIBLE", "§fThis action is irreversible!"); - ccLang.get().addDefault("MESSAGE.ITEM_ADDED", "Item added!"); - ccLang.get().addDefault("MESSAGE.ITEM_UPDATED", "Item updated!"); - ccLang.get().addDefault("MESSAGE.ITEM_DELETED", "Item deleted!"); - ccLang.get().addDefault("MESSAGE.CHANGES_APPLIED", "Changes applied. New values:"); - ccLang.get().addDefault("MESSAGE.CHANGES_APPLIED_2", "Changes applied"); - ccLang.get().addDefault("MESSAGE.RECOMMEND_APPLIED", "Recommended value applied. It is based on {playerNum}players. You can change this value in the config file."); - ccLang.get().addDefault("MESSAGE.TRANSFER_SUCCESS", "Remittance completed"); - ccLang.get().addDefault("MESSAGE.PURCHASE_REJECTED", "There are too many of these items in the shop. Can't sell it now."); - ccLang.get().addDefault("MESSAGE.CLICK_YOUR_ITEM_START_PAGE", "Click on an item in your inventory to find the shop with the best deal.\nLMB: Buy RMB: Sell"); - ccLang.get().addDefault("MESSAGE.MOVE_TO_BEST_SHOP_BUY", "Moved to the shop where you can buy {item} at the lowest price."); - ccLang.get().addDefault("MESSAGE.MOVE_TO_BEST_SHOP_SELL", "Moved to the shop where you can sell {item} at the highest price."); - ccLang.get().addDefault("MESSAGE.SHOP_IS_CLOSED_BY_ADMIN", "This shop is currently closed by the server administrator."); - ccLang.get().addDefault("MESSAGE.SHOP_DISABLED", "This shop is currently disabled. Non-admin users cannot use it. You can enable it in the shop settings."); - ccLang.get().addDefault("MESSAGE.ROTATION_SHARED_DATA_MISSING", "§e[ ! ]§fThe required data could not be found in '{0}/SharedData.yml' for {1} items. These items have been added as decoration."); - ccLang.get().addDefault("MESSAGE.ENTER_COMMAND", "Enter the command without '/'."); - ccLang.get().addDefault("MESSAGE.ENTER_COMMAND_2", "Enter in the form of 'index/command'."); - ccLang.get().addDefault("MESSAGE.SELL_COMMAND_CUR", "Sell commands currently in effect:"); - ccLang.get().addDefault("MESSAGE.BUY_COMMAND_CUR", "Buy commands currently in effect:"); - ccLang.get().addDefault("MESSAGE.Q_SEARCH_FAIL_CURRENCY", "This item is being traded in several currencies."); - - ccLang.get().addDefault("HELP.TITLE", "§fHelp: {command} --------------------"); - ccLang.get().addDefault("HELP.SHOP", "Open shop"); - ccLang.get().addDefault("HELP.CMD", "Toggle display of command help."); - ccLang.get().addDefault("HELP.CREATE_SHOP", "Create a new shop."); - ccLang.get().addDefault("HELP.CREATE_SHOP_2", "Permissions (can be changed later)\n true: dshop.user.shop.shopName\n false: Anyone can access (default)\n Arbitrary value: Requires permission"); - ccLang.get().addDefault("HELP.DELETE_SHOP", "Remove existing stores."); - ccLang.get().addDefault("HELP.SHOP_ADD_HAND", "Adds the item in hand to the shop."); - ccLang.get().addDefault("HELP.SHOP_ADD_ITEM", "Add item to the shop."); - ccLang.get().addDefault("HELP.SHOP_EDIT", "Edit item in the store."); - ccLang.get().addDefault("HELP.PRICE", "§7Price calculation formula: median*value/stock"); - ccLang.get().addDefault("HELP.INF_STATIC", "§7median<0 == Fixed price stock<0 == Infinite stock"); - ccLang.get().addDefault("HELP.EDIT_ALL", "Modify all items in the shop at once."); - ccLang.get().addDefault("HELP.RELOAD", "Reload the plugin."); - ccLang.get().addDefault("HELP.RELOADED", "Plugin reloaded"); - ccLang.get().addDefault("HELP.USAGE", "Usage"); - ccLang.get().addDefault("HELP.ITEM_ALREADY_EXIST", "§7§o{item} is already on sale.\n {info}\n Entering a command modifies the value."); - ccLang.get().addDefault("HELP.ITEM_INFO", "§7§o{item}'s current settings:\n {info}"); - ccLang.get().addDefault("HELP.REMOVE_ITEM", "§fEntering an argument of 0 will §4remove§f this item from the store."); - ccLang.get().addDefault("HELP.QSELL", "§fSell items quickly."); - ccLang.get().addDefault("HELP.DELETE_OLD_USER", "Delete long-term inactive user data"); - ccLang.get().addDefault("HELP.ACCOUNT", "Sets the account balance of the shop. -1 = unlimited"); - ccLang.get().addDefault("HELP.SET_TO_REC_ALL", "§cResets§e all item settings in the store to the recommended values."); - ccLang.get().addDefault("HELP.SHOP_ENABLE", "Enables or disables the shop."); - - ccLang.get().addDefault("ERR.NO_USER_ID", "§6Player uuid not found. Shop unavailable."); - ccLang.get().addDefault("ERR.ITEM_NOT_EXIST", "The item does not exist in the store."); - ccLang.get().addDefault("ERR.ITEM_FORBIDDEN", "This is a prohibited item."); - ccLang.get().addDefault("ERR.NO_PERMISSION", "§eYou do not have permission."); - ccLang.get().addDefault("ERR.WRONG_USAGE", "Incorrect command usage."); - ccLang.get().addDefault("ERR.NO_EMPTY_SLOT", "There is no empty space in the shop."); - ccLang.get().addDefault("ERR.WRONG_DATATYPE", "Invalid argument type"); - ccLang.get().addDefault("ERR.VALUE_ZERO", "The argument value must be greater than 0."); - ccLang.get().addDefault("ERR.WRONG_ITEM_NAME", "Invalid item name."); - ccLang.get().addDefault("ERR.HAND_EMPTY", "You must hold the item in your hand."); - ccLang.get().addDefault("ERR.HAND_EMPTY2", "§c§oYou must have the item in your hand!"); - ccLang.get().addDefault("ERR.SHOP_NOT_FOUND", "§fThe shop could not be found."); - ccLang.get().addDefault("ERR.SHOP_EXIST", "A store with that name already exists."); - ccLang.get().addDefault("ERR.SHOP_NOT_EXIST", "No shop with that name."); - ccLang.get().addDefault("ERR.SIGN_SHOP_REMOTE_ACCESS", "The shop is only accessible via sign."); - ccLang.get().addDefault("ERR.LOCAL_SHOP_REMOTE_ACCESS", "The shop can only be used by visiting it in person."); - ccLang.get().addDefault("ERR.MAX_LOWER_THAN_MIN", "The maximum price must be greater than the minimum price."); - ccLang.get().addDefault("ERR.DEFAULT_VALUE_OUT_OF_RANGE", "The base price must be between the minimum price and the maximum price."); - ccLang.get().addDefault("ERR.NO_RECOMMEND_DATA", "There is no information for this item in the Worth.yml file."); - ccLang.get().addDefault("ERR.JOBS_REBORN_NOT_FOUND", "Could not find 'Jobs reborn'."); - ccLang.get().addDefault("ERR.PLAYER_POINTS_NOT_FOUND", "Could not find 'Player points'."); - ccLang.get().addDefault("ERR.SHOP_HAS_INF_BAL", "{shop} is an infinite account store."); - ccLang.get().addDefault("ERR.SHOP_DIFF_CURRENCY", "The two stores use different currencies."); - ccLang.get().addDefault("ERR.PLAYER_NOT_EXIST", "The player could not be found."); - ccLang.get().addDefault("ERR.SHOP_LINK_FAIL", "Either store must be a real account."); - ccLang.get().addDefault("ERR.SHOP_LINK_TARGET_ERR", "The target store must have a real account."); - ccLang.get().addDefault("ERR.NESTED_STRUCTURE", "It is forbidden to build hierarchies. (ex. aa-bb, bb-cc)"); - ccLang.get().addDefault("ERR.CREATIVE", "§eYou cannot use this command in Creative mode. You do not have permission."); - ccLang.get().addDefault("ERR.FILE_CREATE_FAIL", "§eFile creation failed"); - ccLang.get().addDefault("ERR.INVALID_TRANSACTION", "This transaction is no longer valid. If this problem recurs, contact your server administrator"); - ccLang.get().addDefault("ERR.SIGN_WALL", "Sign must be placed on wall."); - - ccLang.get().addDefault("ERR.SHOP_NULL", "§eShop name cannot be null."); - ccLang.get().addDefault("ERR.ITEMINFO_HAND_EMPTY", "You need to hold an item."); - ccLang.get().addDefault("HELP.ITEMINFO_USAGE", "§fHold an item in your hand to learn about it."); - ccLang.get().addDefault("HELP.ITEMINFO_REALNAME", "§7Real name: §3{item_realname}"); - ccLang.get().addDefault("HELP.ITEMINFO_SIGN_NAME", "§7Sign name: §3{item_signname}"); - ccLang.get().addDefault("ERR.SIGN_ITEM_INVALID", "Invalid item. Use /ds iteminfo to find the name of the item on the sign."); - ccLang.get().addDefault("ERR.SIGN_ITEM_NOT_FOR_SALE", "First you must add the item in the shop and then use it on the sign."); - ccLang.get().addDefault("MESSAGE.SIGN_SHOP_CREATED", "§aSign Shop created!"); - - ccLang.get().addDefault("ON", "ON"); - ccLang.get().addDefault("OFF", "OFF"); - ccLang.get().addDefault("SET", "SET"); - ccLang.get().addDefault("UNSET", "UNSET"); - ccLang.get().addDefault("NULL", "Null"); - ccLang.get().addDefault("NULL(OPEN)", "None (open to all)"); - ccLang.get().addDefault("CUR_STATE", "Current Status"); - ccLang.get().addDefault("CLICK", "Click"); - ccLang.get().addDefault("LMB", "LMB"); - ccLang.get().addDefault("RMB", "RMB"); - ccLang.get().addDefault("CLOSE", "§fClose"); - ccLang.get().addDefault("CLOSE_LORE", "§f§nClick: Close"); - - ccLang.get().addDefault("EXP_POINTS", "Exp Points"); - ccLang.get().addDefault("JOB_POINTS", "Job Points"); - ccLang.get().addDefault("PLAYER_POINTS", "Player Points"); - - ccLang.get().options().copyDefaults(true); - ccLang.save(); - } + en_US(); + + // 繁體中文 + zh_TW(); if (lang == null) lang = "en-US"; - if (!lang.equals("en-US") && !lang.equals("ko-KR")) + if (!lang.equals("en-US") && !lang.equals("ko-KR") && !lang.equalsIgnoreCase("zh-TW")) { ConfigurationSection conf = ccLang.get().getConfigurationSection(""); @@ -951,6 +63,1350 @@ public static void setupLangFile(String lang) ReloadNumberFormat(); } + private static void ko_KR() + { + ccLang.setup("Lang_V3_ko-KR", null); + + ccLang.get().addDefault("START_PAGE.EDITOR_TITLE", "§3아이콘 편집"); + ccLang.get().addDefault("START_PAGE.EDIT_NAME", "§f이름 바꾸기"); + ccLang.get().addDefault("START_PAGE.EDIT_LORE", "§f설명 바꾸기"); + ccLang.get().addDefault("START_PAGE.EDIT_ICON", "§f아이콘 바꾸기"); + ccLang.get().addDefault("START_PAGE.EDIT_ACTION", "§f실행 명령어 바꾸기"); + ccLang.get().addDefault("START_PAGE.SHOP_SHORTCUT", "§f상점으로 가는 버튼 만들기"); + ccLang.get().addDefault("START_PAGE.CREATE_DECO", "§f장식 버튼 만들기"); + ccLang.get().addDefault("START_PAGE.ENTER_SHOP_NAME", "상점 이름을 입력하세요."); + ccLang.get().addDefault("START_PAGE.DEFAULT_SHOP_LORE", "§f§n클릭: 상점으로 가기"); + ccLang.get().addDefault("START_PAGE.ITEM_MOVE_LORE", "§e우클릭: 이동"); + ccLang.get().addDefault("START_PAGE.ITEM_COPY_LORE", "§e우클릭: 복사"); + ccLang.get().addDefault("START_PAGE.ITEM_REMOVE_LORE", "§eShift 좌클릭: 삭제"); + ccLang.get().addDefault("START_PAGE.ITEM_EDIT_LORE", "§eShift우클릭: 편집"); + ccLang.get().addDefault("START_PAGE.REMOVE", "§f제거"); + ccLang.get().addDefault("START_PAGE.REMOVE_LORE", "§f이 버튼을 시작페이지에서 제거합니다."); + ccLang.get().addDefault("START_PAGE.ENTER_NAME", "버튼의 새 이름을 입력하세요."); + ccLang.get().addDefault("START_PAGE.ENTER_LORE", "버튼의 새 설명을 입력하세요."); + ccLang.get().addDefault("START_PAGE.ENTER_ICON", "버튼의 아이콘으로 사용할 아이탬 이름을 입력하세요. (영문. 대소문자 구분없음)"); + ccLang.get().addDefault("START_PAGE.ENTER_ACTION", "명령어를 '/' 제외하고 입력하세요. 버튼을 눌렀을때 이 명령어가 실행됩니다."); + ccLang.get().addDefault("START_PAGE.ENTER_COLOR", "장식 버튼의 색상을 입력하세요. (영문)"); + ccLang.get().addDefault("START_PAGE.SHOP_LIST_TITLE", "§3상점 목록"); + ccLang.get().addDefault("START_PAGE.SHOP_LIST.PAGE_TITLE", "§f{curPage}/{maxPage} 페이지"); + ccLang.get().addDefault("START_PAGE.SHOP_LIST.PAGE_LORE", "§e좌클릭: 이전 페이지\n§e우클릭: 다음 페이지"); + + ccLang.get().addDefault("COLOR_PICKER_TITLE", "§3색상 선택"); + + ccLang.get().addDefault("SHOP.TRADE_LORE", "§f§n클릭: 거래"); + ccLang.get().addDefault("SHOP.BUY_PRICE", "§f구매: {num}"); + ccLang.get().addDefault("SHOP.SELL_PRICE", "§f판매: {num}"); + ccLang.get().addDefault("SHOP.BUY_PRICE_DISCOUNTED", "§f구매: §8§m{num}§r §a{num2}"); + ccLang.get().addDefault("SHOP.SELL_PRICE_DISCOUNTED", "§f판매: §8§m{num}§r §c{num2}"); + ccLang.get().addDefault("SHOP.BUY_PRICE_PP", "§f구매: {num}PP"); + ccLang.get().addDefault("SHOP.SELL_PRICE_PP", "§f판매: {num}PP"); + ccLang.get().addDefault("SHOP.BUY_PRICE_EXP", "§f구매: {num}Exp"); + ccLang.get().addDefault("SHOP.SELL_PRICE_EXP", "§f판매: {num}Exp"); + ccLang.get().addDefault("SHOP.BUY_PRICE_DISCOUNTED_EXP", "§f구매: §8§m{num}Exp§r §a{num2}Exp"); + ccLang.get().addDefault("SHOP.SELL_PRICE_DISCOUNTED_EXP", "§f판매: §8§m{num}Exp§r §c{num2}Exp"); + ccLang.get().addDefault("SHOP.BUY_PRICE_DISCOUNTED_PP", "§f구매: §8§m{num}PP§r §a{num2}PP"); + ccLang.get().addDefault("SHOP.SELL_PRICE_DISCOUNTED_PP", "§f판매: §8§m{num}PP§r §c{num2}PP"); + ccLang.get().addDefault("SHOP.BUY_PRICE_JP", "§f구매: {num}JP"); + ccLang.get().addDefault("SHOP.SELL_PRICE_JP", "§f판매: {num}JP"); + ccLang.get().addDefault("SHOP.BUY_PRICE_DISCOUNTED_JP", "§f구매: §8§m{num}JP§r §a{num2}JP"); + ccLang.get().addDefault("SHOP.SELL_PRICE_DISCOUNTED_JP", "§f판매: §8§m{num}JP§r §c{num2}JP"); + ccLang.get().addDefault("SHOP.STOCK", "§8재고: {num}"); + ccLang.get().addDefault("SHOP.STOCK_2", "§8재고: {stock}/{max_stock}"); + ccLang.get().addDefault("SHOP.INF_STOCK", "§8무한"); + ccLang.get().addDefault("SHOP.STATIC_PRICE", "§8[고정 가격]"); + ccLang.get().addDefault("SHOP.STACKS", "§8{num} 스택"); + ccLang.get().addDefault("SHOP.ITEM_MOVE_LORE", "§e우클릭: 이동"); + ccLang.get().addDefault("SHOP.ITEM_COPY_LORE", "§e우클릭: 복사"); + ccLang.get().addDefault("SHOP.ITEM_EDIT_LORE", "§eShift우클릭: 편집"); + ccLang.get().addDefault("SHOP.DECO_DELETE_LORE", "§eShift우클릭: 삭제"); + ccLang.get().addDefault("SHOP.PAGE_TITLE", "§f{curPage}/{maxPage} 페이지"); + ccLang.get().addDefault("SHOP.PAGE_LORE_V2", "§f§n좌클릭: 이전 페이지\n§f§n우클릭: 다음 페이지\n§7인벤토리에서 아이템을 클릭하면 \n§7그 아이템이 있는 페이지로 이동합니다."); + ccLang.get().addDefault("SHOP.GO_TO_PAGE_EDITOR", "§eShift+우: 페이지 에디터"); + ccLang.get().addDefault("SHOP.ITEM_MOVE_SELECTED", "아이탬 선택됨. 비어있는 칸을 우클릭하면 이동합니다."); + ccLang.get().addDefault("SHOP.PERMISSION", "§f퍼미션:"); + ccLang.get().addDefault("SHOP.PERMISSION_ITEM", "§7 - {permission}"); + ccLang.get().addDefault("SHOP.FLAGS", "§e플래그:"); + ccLang.get().addDefault("SHOP.FLAGS_ITEM", "§e - {flag}"); + ccLang.get().addDefault("SHOP.SHOP_BAL_INF", "§f상점 계좌 무제한"); + ccLang.get().addDefault("SHOP.SHOP_BAL", "§f상점 계좌 잔액"); + ccLang.get().addDefault("SHOP.SHOP_LOCATION", "§f상점 위치: x {x}, y {y}, z {z}"); + ccLang.get().addDefault("SHOP.SHOP_LOCATION_B", "§f상점 위치: "); + ccLang.get().addDefault("SHOP.SHOP_INFO_DASH", "§7 - "); + ccLang.get().addDefault("SHOP.DISABLED", "§c비활성§8|§f"); + ccLang.get().addDefault("SHOP.INCOMPLETE_DATA", "불완전한 데이터"); + ccLang.get().addDefault("SHOP.INCOMPLETE_DATA_Lore", "이 아이템은 어드민이 아닌\n유저에게는 보이지 않습니다.\nIndex: "); + ccLang.get().addDefault("SHOP.TRADE_LIMIT_BUY", "§a구매량 제한 : {num} 남음"); + ccLang.get().addDefault("SHOP.TRADE_LIMIT_SELL", "§a판매량 제한 : {num} 남음"); + ccLang.get().addDefault("SHOP.TRADE_LIMIT_TIMER", "§a다음 리셋: {time}"); + ccLang.get().addDefault("SHOP.CLICK_TO_ADD", "§e클릭: 추가"); + + ccLang.get().addDefault("SHOP_SETTING_TITLE", "§3상점 설정"); + ccLang.get().addDefault("SHOP_SETTING.LOG_TOGGLE_LORE", "§e우클릭: 로그 뷰어"); + ccLang.get().addDefault("SHOP_SETTING.LOG_PRINT_CONSOLE", "§f로그를 콘솔에 출력"); + ccLang.get().addDefault("SHOP_SETTING.LOG_PRINT_ADMIN", "§f로그를 어드민에게 출력"); + ccLang.get().addDefault("SHOP_SETTING.MAX_PAGE", "§f최대 페이지"); + ccLang.get().addDefault("SHOP_SETTING.MAX_PAGE_LORE", "§f상점의 최대 페이지를 설정합니다"); + ccLang.get().addDefault("SHOP_SETTING.BACKGROUND", "§f배경 색상"); + ccLang.get().addDefault("SHOP_SETTING.BACKGROUND_LORE", "§e클릭: 변경"); + ccLang.get().addDefault("SHOP_SETTING.L_R_SHIFT", "§e좌: -1 우: +1 Shift: x5"); + ccLang.get().addDefault("SHOP_SETTING.FLAG", "§f플래그"); + ccLang.get().addDefault("SHOP_SETTING.SHOP_SETTINGS_LORE", "§e우클릭: 상점 편집"); + ccLang.get().addDefault("SHOP_SETTING.SIGN_SHOP_LORE", "§f표지판을 통해서만 접근할 수 있습니다."); + ccLang.get().addDefault("SHOP_SETTING.LOCAL_SHOP_LORE", "§f실제 상점 위치를 방문해야 합니다.\n§f상점의 위치를 설정해야만 합니다."); + ccLang.get().addDefault("SHOP_SETTING.DELIVERY_CHARGE_LORE", "§f배달비를 지불하고 localshop에서 원격으로 거래합니다."); + ccLang.get().addDefault("SHOP_SETTING.SELECTED", "§2선택됨"); + ccLang.get().addDefault("SHOP_SETTING.CURRENCY", "§f화폐 유형: "); + ccLang.get().addDefault("SHOP_SETTING.VAULT_LORE", "§f기본값 입니다."); + ccLang.get().addDefault("SHOP_SETTING.EXP_LORE", "§f플레이어의 경험치로 거래합니다."); + ccLang.get().addDefault("SHOP_SETTING.JOB_POINT_LORE", "§fJobs 플러그인의 job point로 거래합니다."); + ccLang.get().addDefault("SHOP_SETTING.PLAYER_POINT_LORE", "§fPlayerPoint 플러그인의 point로 거래합니다."); + ccLang.get().addDefault("SHOP_SETTING.SHOW_VALUE_CHANGE_LORE", "§f가격 변화량을 표시합니다."); + ccLang.get().addDefault("SHOP_SETTING.HIDE_STOCK", "§f재고 수량 표시를 숨깁니다."); + ccLang.get().addDefault("SHOP_SETTING.HIDE_PRICING_TYPE", "§f가격 유형 표기를 숨깁니다."); + ccLang.get().addDefault("SHOP_SETTING.HIDE_SHOP_BALANCE", "§f상점 계좌 잔액을 숨깁니다."); + ccLang.get().addDefault("SHOP_SETTING.SHOW_MAX_STOCK", "§f재고 상한을 표시합니다."); + ccLang.get().addDefault("SHOP_SETTING.HIDDEN_IN_COMMAND", "§f명령어 자동완성시 이 상점을 표시하지 않습니다."); + ccLang.get().addDefault("SHOP_SETTING.INTEGER_ONLY", "§f구매 가격이 올림 처리됩니다.\n§f판매 가격은 내림 처리됩니다."); + ccLang.get().addDefault("SHOP_SETTING.PERMISSION", "§f퍼미션"); + ccLang.get().addDefault("SHOP_SETTING.STATE", "§f상태"); + ccLang.get().addDefault("SHOP_SETTING.STATE_ENABLE", "§a활성"); + ccLang.get().addDefault("SHOP_SETTING.STATE_DISABLE", "§c비활성"); + ccLang.get().addDefault("SHOP_SETTING.ROTATION_EDITOR", "§f로테이션: "); + ccLang.get().addDefault("SHOP_SETTING.ROTATION_EDITOR_LORE", "§e클릭: 로테이션 에디터"); + ccLang.get().addDefault("SHOP_SETTING.COMMAND_TOGGLE", "§f커맨드 실행"); + ccLang.get().addDefault("SHOP_SETTING.COMMAND_TOGGLE_LORE", "§f상점 거래 발생시 서버 명령어를 실행합니다."); + ccLang.get().addDefault("SHOP_SETTING.COMMAND_SELL", "§f판매시 명령어"); + ccLang.get().addDefault("SHOP_SETTING.COMMAND_BUY", "§f구매시 명령어"); + ccLang.get().addDefault("SHOP_SETTING.COMMAND_LORE1", "§e좌클릭: 설정"); + ccLang.get().addDefault("SHOP_SETTING.COMMAND_LORE3", "§e씨프트 우클릭: 마지막 항목 삭제"); + ccLang.get().addDefault("SHOP_SETTING.TRADE_UI", "§f거래 UI 설정"); + ccLang.get().addDefault("SHOP_SETTING.TRADE_UI_LORE_2", "§e좌클릭: 편집\n§e우클릭: 초기화"); + + ccLang.get().addDefault("ROTATION_EDITOR_TITLE", "§3로테이션 에디터"); + ccLang.get().addDefault("ROTATION_EDITOR.ENABLED", "§a로테이션 켜짐"); + ccLang.get().addDefault("ROTATION_EDITOR.DISABLED", "§c로테이션 꺼짐"); + ccLang.get().addDefault("ROTATION_EDITOR.CLICK_TO_ENABLE", "§e좌클릭: 로테이션 켜기"); + ccLang.get().addDefault("ROTATION_EDITOR.CLICK_TO_DISABLE", "§e좌클릭: 로테이션 끄기"); + ccLang.get().addDefault("ROTATION_EDITOR.CURRENT_TIME", "§f현재 시간: "); + ccLang.get().addDefault("ROTATION_EDITOR.CURRENTLY_IN_USE", "§a[현재 적용중]"); + ccLang.get().addDefault("ROTATION_EDITOR.NEXT_ROTATION", "§f다음 로테이션: "); + ccLang.get().addDefault("ROTATION_EDITOR.PERIOD", "§f로테이션 주기"); + ccLang.get().addDefault("ROTATION_EDITOR.PERIOD_LORE_V2", "§e좌클릭: -1시간, 우클릭: +1시간, 씨프트: x10"); + ccLang.get().addDefault("ROTATION_EDITOR.TIMER", "§f타이머 조정"); + ccLang.get().addDefault("ROTATION_EDITOR.TIMER_LORE_V2", "§e좌클릭: -10분, 우클릭: +10분, 씨프트: x6"); + ccLang.get().addDefault("ROTATION_EDITOR.HOUR", "§f{0}시간"); + ccLang.get().addDefault("ROTATION_EDITOR.UNSAVED_CHANGES", "§c§o저장되지 않은 변경사항 있음"); + ccLang.get().addDefault("ROTATION_EDITOR.APPLY_CHANGES", "§f변경사항 적용"); + ccLang.get().addDefault("ROTATION_EDITOR.APPLY_CHANGES_LORE", "§e좌클릭: 변경사항 적용\n§e우클릭: 변경사항 초기화"); + ccLang.get().addDefault("ROTATION_EDITOR.APPLY_ROTATION", "§e좌클릭: 지금 적용"); + ccLang.get().addDefault("ROTATION_EDITOR.OPEN", "§e좌클릭: 열기"); + ccLang.get().addDefault("ROTATION_EDITOR.CREATE", "§e좌클릭: 빈 로테이션 만들기"); + ccLang.get().addDefault("ROTATION_EDITOR.COPY_AS_NEW", "§e우클릭: 현재 상점 복사하여 만들기"); + ccLang.get().addDefault("ROTATION_EDITOR.DELETE", "§e씨프트 우클릭: §c삭제"); + ccLang.get().addDefault("ROTATION_EDITOR.REAPPLY", "§e씨프트 좌클릭: 재적용"); + ccLang.get().addDefault("ROTATION_EDITOR.MOVE", "§e우클릭: 이동"); + + ccLang.get().addDefault("ITEM_SETTING_TITLE", "§3아이탬 셋팅"); + ccLang.get().addDefault("ITEM_SETTING.VALUE_BUY", "§f구매가치: "); + ccLang.get().addDefault("ITEM_SETTING.VALUE_SELL", "§f판매가치: "); + ccLang.get().addDefault("ITEM_SETTING.PRICE", "§f구매: "); + ccLang.get().addDefault("ITEM_SETTING.SELL_PRICE", "§f판매: "); + ccLang.get().addDefault("ITEM_SETTING.PRICE_MIN", "§f최소 가격: "); + ccLang.get().addDefault("ITEM_SETTING.PRICE_MAX", "§f최대 가격: "); + ccLang.get().addDefault("ITEM_SETTING.MEDIAN", "§f중앙값: "); + ccLang.get().addDefault("ITEM_SETTING.STOCK", "§f재고: "); + ccLang.get().addDefault("ITEM_SETTING.MAX_STOCK", "§f재고 상한: "); + ccLang.get().addDefault("ITEM_SETTING.MAX_STOCK_LORE", "§f재고량이 이보다 많아지면\n§f더이상 상점에 판매할 수 없게됩니다."); + ccLang.get().addDefault("ITEM_SETTING.INF_STOCK", "무한 재고"); + ccLang.get().addDefault("ITEM_SETTING.STATIC_PRICE", "고정 가격"); + ccLang.get().addDefault("ITEM_SETTING.UNLIMITED", "무제한"); + ccLang.get().addDefault("ITEM_SETTING.MEDIAN_HELP", "§f중앙값이 작을수록 가격이 급격이 변화합니다."); + ccLang.get().addDefault("ITEM_SETTING.TAX_IGNORED", "판매세 설정이 무시됩니다."); + ccLang.get().addDefault("ITEM_SETTING.RECOMMEND", "§f추천 값 적용"); + ccLang.get().addDefault("ITEM_SETTING.DISCOUNT", "§f할인"); + ccLang.get().addDefault("ITEM_SETTING.DISCOUNT_LORE", "§f할인율: {num}%\n§e좌클릭: +10, 우클릭: -10"); + ccLang.get().addDefault("ITEM_SETTING.DISCOUNT_LORE_2", "§f할인율: {num}%\n§e좌클릭: -10, 우클릭: +10"); + ccLang.get().addDefault("ITEM_SETTING.DONE", "§f완료"); + ccLang.get().addDefault("ITEM_SETTING.DONE_LORE", "§f완료!"); + ccLang.get().addDefault("ITEM_SETTING.ROUND_DOWN", "§f내림"); + ccLang.get().addDefault("ITEM_SETTING.SET_TO_MEDIAN", "§f중앙값에 맞춤"); + ccLang.get().addDefault("ITEM_SETTING.SET_TO_STOCK", "§f재고에 맞춤"); + ccLang.get().addDefault("ITEM_SETTING.SET_TO_VALUE", "§f가격에 맞춤"); + ccLang.get().addDefault("ITEM_SETTING.CLOSE", "§f닫기"); + ccLang.get().addDefault("ITEM_SETTING.CLOSE_LORE", "§f§n클릭: 닫기"); + ccLang.get().addDefault("ITEM_SETTING.REMOVE", "§c제거"); + ccLang.get().addDefault("ITEM_SETTING.REMOVE_LORE", "§f이 아이템을 상점에서 제거합니다."); + ccLang.get().addDefault("ITEM_SETTING.BUY", "§3§l구매: {num}"); + ccLang.get().addDefault("ITEM_SETTING.SELL", "§3§l판매: {num}"); + ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_SELL", "§f플레이어 당 판매량 제한"); + ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_SELL_LORE", "§f{num}\n§eLMB: -1, RMB: +1, Shift = x10"); + ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_BUY", "§f플레이어 당 구매량 제한"); + ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_BUY_LORE", "§f{num}\n§eLMB: -1, RMB: +1, Shift = x10"); + ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_INTERVAL", "§f거래량 제한 리셋 주기"); + ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_INTERVAL_LORE", "§f주기: {interval}\n§f다음 리셋: {time}\n§e좌클릭: -1시간, 우클릭: +1시간, 씨프트 = x12"); + ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_TIMER", "§f타이머 조정"); + ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_TIMER_LORE", "§f{num}\n§f다음 리셋: {time}\n§e좌클릭: -1시간, 우클릭: +1시간, 씨프트 = x12"); + + ccLang.get().addDefault("TRADE_TITLE", "§3아이템 거래"); + ccLang.get().addDefault("TRADE.TOGGLE_SELLABLE", "§e클릭: 판매전용 토글"); + ccLang.get().addDefault("TRADE.TOGGLE_BUYABLE", "§e클릭: 구매전용 토글"); + ccLang.get().addDefault("TRADE.BUY_ONLY_LORE", "§f구매만 가능한 아이템"); + ccLang.get().addDefault("TRADE.SELL_ONLY_LORE", "§f판매만 가능한 아이템"); + ccLang.get().addDefault("TRADE.BALANCE", "§3내 잔액"); + ccLang.get().addDefault("TRADE.PRICE", "§f구매: {num}"); + ccLang.get().addDefault("TRADE.SELL_PRICE", "§f판매: {num}"); + ccLang.get().addDefault("TRADE.PRICE_DISCOUNTED", "§f구매: §8§m{num}§r §a{num2}"); + ccLang.get().addDefault("TRADE.SELL_PRICE_DISCOUNTED", "§f판매: §8§m{num}§r §c{num2}"); + ccLang.get().addDefault("TRADE.PRICE_EXP", "§f구매: {num}EXP"); + ccLang.get().addDefault("TRADE.SELL_PRICE_EXP", "§f판매: {num}EXP"); + ccLang.get().addDefault("TRADE.PRICE_DISCOUNTED_EXP", "§f구매: §8§m{num}EXP§r §a{num2}EXP"); + ccLang.get().addDefault("TRADE.SELL_PRICE_DISCOUNTED_EXP", "§f판매: §8§m{num}EXP§r §c{num2}EXP"); + ccLang.get().addDefault("TRADE.PRICE_PP", "§f구매: {num}PP"); + ccLang.get().addDefault("TRADE.SELL_PRICE_PP", "§f판매: {num}PP"); + ccLang.get().addDefault("TRADE.PRICE_DISCOUNTED_PP", "§f구매: §8§m{num}PP§r §a{num2}PP"); + ccLang.get().addDefault("TRADE.SELL_PRICE_DISCOUNTED_PP", "§f판매: §8§m{num}PP§r §c{num2}PP"); + ccLang.get().addDefault("TRADE.PRICE_JP", "§f구매: {num}JP"); + ccLang.get().addDefault("TRADE.SELL_PRICE_JP", "§f판매: {num}JP"); + ccLang.get().addDefault("TRADE.PRICE_DISCOUNTED_JP", "§f구매: §8§m{num}JP§r §a{num2}JP"); + ccLang.get().addDefault("TRADE.SELL_PRICE_DISCOUNTED_JP", "§f판매: §8§m{num}JP§r §c{num2}JP"); + ccLang.get().addDefault("TRADE.BUY", "§c구매"); + ccLang.get().addDefault("TRADE.SELL", "§2판매"); + ccLang.get().addDefault("TRADE.STOCK", "§8재고: "); + ccLang.get().addDefault("TRADE.STACKS", "§8{num} 스택"); + ccLang.get().addDefault("TRADE.INF_STOCK", "§8무한 재고"); + ccLang.get().addDefault("TRADE.SHOP_BAL_INF", "§f상점 계좌 무제한"); + ccLang.get().addDefault("TRADE.SHOP_BAL", "§3상점 계좌 잔액 \n§f{num}"); + ccLang.get().addDefault("TRADE.CLICK_TO_BUY", "§c§n클릭: {amount}개 구매"); + ccLang.get().addDefault("TRADE.CLICK_TO_SELL", "§2§n클릭: {amount}개 판매"); + ccLang.get().addDefault("TRADE.PURCHASE_LIMIT_PER_PLAYER", "§a구매량 제한 : {num} 남음\n§a다음 리셋: {time}"); + ccLang.get().addDefault("TRADE.SALES_LIMIT_PER_PLAYER", "§a판매량 제한 : {num} 남음\n§a다음 리셋: {time}"); + + ccLang.get().addDefault("PAGE_EDITOR_TITLE", "§3페이지 편집"); + ccLang.get().addDefault("PAGE_EDITOR.PREV", "§f<<"); + ccLang.get().addDefault("PAGE_EDITOR.NEXT", "§f>>"); + ccLang.get().addDefault("PAGE_EDITOR.PAGE_SWAP_SUCCESS", "§f페이지가 교체 되었습니다."); + ccLang.get().addDefault("PAGE_EDITOR.PAGE_SWAP_FAIL", "§f페이지 교체 실패."); + ccLang.get().addDefault("PAGE_EDITOR.PAGE_SWAP_SELECTED", "§f페이지 선택되었습니다. 서로 교체 할 다른 페이지를 우클릭 하세요."); + ccLang.get().addDefault("PAGE_EDITOR.PAGE_LORE_PREMIUM", "§e좌클릭: 페이지 이동\n§e우클릭: 페이지 교체(스왑)\n§eShift+좌: 페이지 삽입\n§eShift+우: 페이지 삭제"); + ccLang.get().addDefault("PAGE_EDITOR.PRICE", "§f구매: {num}"); + ccLang.get().addDefault("PAGE_EDITOR.SELL_PRICE", "§f판매: {num}"); + ccLang.get().addDefault("PAGE_EDITOR.STOCK", "§8재고: {num}"); + ccLang.get().addDefault("PAGE_EDITOR.STACKS", "§8{num} 스택"); + ccLang.get().addDefault("PAGE_EDITOR.STATIC_PRICE", "§8[고정 가격]"); + ccLang.get().addDefault("PAGE_EDITOR.EMPTY", "§8(비어있음)"); + ccLang.get().addDefault("PAGE_EDITOR.EMPTY_SLOT_LORE", "§e좌,우클릭: 밀기\n§e+씨프트: 당기기"); + ccLang.get().addDefault("TRADE.QUANTITY_LORE", "§eShift+우: 수량 편집"); + ccLang.get().addDefault("TRADE.WAIT_FOR_INPUT", "거래 UI에 표시 될 수량을 입력하세요.\n예시: 1,2,4,8,16,32,64"); + + ccLang.get().addDefault("LOG_VIEWER_TITLE", "§3로그 뷰어"); + ccLang.get().addDefault("LOG_VIEWER.DATE", "§f날짜: "); + ccLang.get().addDefault("LOG_VIEWER.TIME", "§f시간: "); + ccLang.get().addDefault("LOG_VIEWER.CURRENCY", "§f화폐 유형: "); + ccLang.get().addDefault("LOG_VIEWER.PRICE", "§f가격: "); + ccLang.get().addDefault("LOG_VIEWER.EXPAND", "§f펼치기"); + ccLang.get().addDefault("LOG_VIEWER.COLLAPSE", "§f접기"); + ccLang.get().addDefault("LOG_VIEWER.PAGE_TITLE", "§f{curPage}/{maxPage} 페이지"); + ccLang.get().addDefault("LOG_VIEWER.PAGE_LORE", "§e좌클릭: 이전 페이지\n§e우클릭: 다음 페이지"); + ccLang.get().addDefault("LOG_VIEWER.FILE_LORE", "§e좌클릭: 열기\n§eShift+우: §c삭제"); + + + ccLang.get().addDefault("LOG.LOG", "§f로그"); + ccLang.get().addDefault("LOG.CLEAR", "§f로그 삭제됨"); + ccLang.get().addDefault("LOG.SAVE", "§f로그 저장됨"); + ccLang.get().addDefault("LOG.DELETE", "§4로그 삭제"); + ccLang.get().addDefault("LOG.SELL", "§f{player}(이)가 {shop}에 {item} {amount}개를 판매함"); + ccLang.get().addDefault("LOG.BUY", "§f{player}(이)가 {shop}에서 {item} {amount}개를 구매함"); + + ccLang.get().addDefault("STOCK_SIMULATOR_TITLE", "§3재고 시뮬레이터"); + ccLang.get().addDefault("STOCK_SIMULATOR.CHANGE_SAMPLE_LORE", "§e좌, 우클릭: 아이템 변경"); + ccLang.get().addDefault("STOCK_SIMULATOR.SIMULATOR_BUTTON_LORE", "§e우클릭: 시뮬레이터"); + ccLang.get().addDefault("STOCK_SIMULATOR.RUN_TITLE", "§f실행"); + ccLang.get().addDefault("STOCK_SIMULATOR.RUN_LORE", "§e좌클릭: 시뮬레이션 실행\n§e우클릭: 설정값을 상점에 적용합니다\n§f아이템은 영향받지 않습니다."); + ccLang.get().addDefault("STOCK_SIMULATOR.REAL_TIME", "§a(실제 시간)"); + ccLang.get().addDefault("STOCK_SIMULATOR.AFTER_S", "§a{0}초 후"); + ccLang.get().addDefault("STOCK_SIMULATOR.AFTER_M", "§a{0}분 후"); + ccLang.get().addDefault("STOCK_SIMULATOR.AFTER_H", "§a{0}시간 후"); + ccLang.get().addDefault("STOCK_SIMULATOR.AFTER_D", "§a{0}일 후"); + ccLang.get().addDefault("STOCK_SIMULATOR.L_R_SHIFT", "§e좌: -1 우: +1 Shift: x5"); + ccLang.get().addDefault("STOCK_SIMULATOR.PRICE", "§f구매: {num}"); + ccLang.get().addDefault("STOCK_SIMULATOR.MEDIAN", "§f중앙값: {num}"); + ccLang.get().addDefault("STOCK_SIMULATOR.STOCK", "§f재고: {num}"); + + ccLang.get().addDefault("PALETTE_TITLE", "§3판매할 아이템 선택"); + ccLang.get().addDefault("PALETTE_TITLE2", "§3아이템 선택"); + ccLang.get().addDefault("PALETTE.LORE_PREMIUM", "§e좌클릭: 추가\n§e씨프트 좌클릭: 설정 후 추가\n§e우클릭: 장식으로 추가\n§e씨프트 우클릭: '{item}' 를 검색"); + ccLang.get().addDefault("PALETTE.LORE2", "§e좌클릭: 선택\n§e씨프트 우클릭: '{item}' 를 검색"); + ccLang.get().addDefault("PALETTE.SEARCH", "§f찾기"); + ccLang.get().addDefault("PALETTE.ADD_ALL", "§f모두 추가"); + ccLang.get().addDefault("PALETTE.ADD_ALL_LORE", "§e좌클릭: 모두 추가\n§e씨프트 좌클릭: 모두 추가하고 권장 값 적용"); + ccLang.get().addDefault("PALETTE.PAGE_TITLE", "§f{curPage}/{maxPage} 페이지"); + ccLang.get().addDefault("PALETTE.PAGE_LORE", "§f§n좌클릭: 이전 페이지\n§f§n우클릭: 다음 페이지"); + ccLang.get().addDefault("PALETTE.FILTER_APPLIED", "§f필터 적용됨 : "); + ccLang.get().addDefault("PALETTE.FILTER_LORE", "§f좌클릭: 검색\n§f우클릭: 필터 초기화\n\n§7\"BLUE_WOOL\"을 찾으려는 경우:\n§7 b w\n§7 wool\n§7 blue wool"); + + ccLang.get().addDefault("QUICK_SELL_TITLE", "§3빠른 판매"); + ccLang.get().addDefault("QUICK_SELL.GUIDE_TITLE", "§3§l빠른 판매 도움말"); + ccLang.get().addDefault("QUICK_SELL.GUIDE_LORE", "§a판매할 아이템을 좌클릭 하세요.\n§a씨프트 좌클릭으로 같은 유형의 아이템을 모두 팝니다.\n§a우클릭으로 해당 아이템 상점으로 이동합니다."); + + ccLang.get().addDefault("ARROW.UP", "§a⬆"); + ccLang.get().addDefault("ARROW.DOWN", "§c⬇"); + ccLang.get().addDefault("ARROW.UP_2", "§c⬆"); + ccLang.get().addDefault("ARROW.DOWN_2", "§a⬇"); + + ccLang.get().addDefault("TIME.OPEN", "Open"); + ccLang.get().addDefault("TIME.CLOSE", "Close"); + ccLang.get().addDefault("TIME.OPEN_LORE", "§f문 여는 시간 설정"); + ccLang.get().addDefault("TIME.CLOSE_LORE", "§f문 닫는 시간 설정"); + ccLang.get().addDefault("TIME.SHOPHOURS", "§f영업시간"); + ccLang.get().addDefault("TIME.OPEN24", "24시간 오픈"); + ccLang.get().addDefault("TIME.SHOP_IS_CLOSED", "§f상점이 문을 닫았습니다. 개점: {time}시. 현재시간: {curTime}시"); + ccLang.get().addDefault("TIME.SET_SHOPHOURS", "영업시간 설정"); + ccLang.get().addDefault("TIME.CUR", "§f현재 시간: {time}시"); + + ccLang.get().addDefault("STOCK_STABILIZING.SS", "§f재고 안정화"); + ccLang.get().addDefault("STOCK_STABILIZING.L_R_SHIFT", "§e좌클릭: -0.1 우클릭: +0.1 Shift: x5"); + ccLang.get().addDefault("STOCK_STABILIZING.STRENGTH_LORE_A", "§f중앙값(median)의 n%"); + ccLang.get().addDefault("STOCK_STABILIZING.STRENGTH_LORE_B", "§f중앙값(median)과의 격차의 n%"); + + ccLang.get().addDefault("FLUCTUATION.FLUCTUATION", "§f무작위 재고 변동"); + ccLang.get().addDefault("FLUCTUATION.INTERVAL", "§f변화 간격"); + ccLang.get().addDefault("FLUCTUATION.INTERVAL_LORE", "§f1h = 1000틱 = 현실시간 50초"); + ccLang.get().addDefault("FLUCTUATION.STRENGTH", "§f변화 강도"); + ccLang.get().addDefault("FLUCTUATION.STRENGTH_LORE", "§f중앙값(median)의 n%"); + + ccLang.get().addDefault("TAX.SALES_TAX", "§f판매세"); + ccLang.get().addDefault("TAX.USE_GLOBAL", "전역설정 사용 ({tax}%)"); + ccLang.get().addDefault("TAX.USE_LOCAL", "별도 설정"); + + ccLang.get().addDefault("MESSAGE.SEARCH_ITEM", "§f찾으려는 아이템의 이름을 입력하세요."); + ccLang.get().addDefault("MESSAGE.SEARCH_CANCELED", "§f검색 취소됨."); + ccLang.get().addDefault("MESSAGE.INPUT_CANCELED", "§f입력 취소됨."); + ccLang.get().addDefault("MESSAGE.DELETE_CONFIRM", "§f정말로 페이지를 삭제할까요? 'delete' 를 입력하면 삭제합니다."); + ccLang.get().addDefault("MESSAGE.CANT_DELETE_LAST_PAGE", "§f마지막 남은 페이지를 삭제할 수 없습니다."); + ccLang.get().addDefault("MESSAGE.SHOP_BAL_LOW", "§f상점이 돈을 충분히 가지고 있지 않습니다."); + ccLang.get().addDefault("MESSAGE.SHOP_CREATED", "§f상점 생성됨!"); + ccLang.get().addDefault("MESSAGE.SHOP_DELETED", "§f상점 제거됨!"); + ccLang.get().addDefault("MESSAGE.OUT_OF_STOCK", "§f재고 없음!"); + ccLang.get().addDefault("MESSAGE.BUY_SUCCESS", "§f{item} {amount}개를 {price}에 구매함. 잔액: {bal}"); + ccLang.get().addDefault("MESSAGE.SELL_SUCCESS", "§f{item} {amount}개를 {price}에 판매함. 잔액: {bal}"); + ccLang.get().addDefault("MESSAGE.BUY_SUCCESS_EXP", "§f{item} {amount}개를 {price}경험치 포인트에 구매함. 잔액: {bal}"); + ccLang.get().addDefault("MESSAGE.SELL_SUCCESS_EXP", "§f{item} {amount}개를 {price}경험치 포인트에 판매함. 잔액: {bal}"); + ccLang.get().addDefault("MESSAGE.BUY_SUCCESS_JP", "§f{item} {amount}개를 {price}포인트에 구매함. 남은포인트: {bal}"); + ccLang.get().addDefault("MESSAGE.SELL_SUCCESS_JP", "§f{item} {amount}개를 {price}포인트에 판매함. 남은포인트: {bal}"); + ccLang.get().addDefault("MESSAGE.BUY_SUCCESS_PP", "§f{item} {amount}개를 {price}포인트에 구매함. 남은포인트: {bal}"); + ccLang.get().addDefault("MESSAGE.SELL_SUCCESS_PP", "§f{item} {amount}개를 {price}포인트에 판매함. 남은포인트: {bal}"); + ccLang.get().addDefault("MESSAGE.QSELL_NA", "§f해당 아이템을 취급하는 상점이 없습니다."); + ccLang.get().addDefault("MESSAGE.DELIVERY_CHARGE", "§f배달비: {fee}"); + ccLang.get().addDefault("MESSAGE.DELIVERY_CHARGE_NA", "§f다른 월드로 배달할 수 없습니다."); + ccLang.get().addDefault("MESSAGE.NOT_ENOUGH_MONEY", "§f돈이 부족합니다. 잔액: {bal}"); + ccLang.get().addDefault("MESSAGE.NOT_ENOUGH_POINT", "§f포인트가 부족합니다. 잔액: {bal}"); + ccLang.get().addDefault("MESSAGE.NOT_ENOUGH_PLAYER_POINT", "§f플레이어 포인트가 부족합니다. 잔액: {bal}"); + ccLang.get().addDefault("MESSAGE.NOT_ENOUGH_EXP_POINT", "§f경험치 포인트가 부족합니다. 잔액: {bal}"); + ccLang.get().addDefault("MESSAGE.NO_ITEM_TO_SELL", "§f판매 할 아이템이 없습니다."); + ccLang.get().addDefault("MESSAGE.NO_ITEM_TO_SELL_2", "§f판매 가능 한 아이템이 없습니다."); + ccLang.get().addDefault("MESSAGE.INVENTORY_FULL", "§4인벤토리에 빈 공간이 없습니다!"); + ccLang.get().addDefault("MESSAGE.IRREVERSIBLE", "§f이 행동은 되돌릴 수 없습니다!"); + ccLang.get().addDefault("MESSAGE.ITEM_ADDED", "아이템 추가됨!"); + ccLang.get().addDefault("MESSAGE.ITEM_UPDATED", "아이템 수정됨!"); + ccLang.get().addDefault("MESSAGE.ITEM_DELETED", "아이템 제거됨!"); + ccLang.get().addDefault("MESSAGE.CHANGES_APPLIED", "변경사항 적용됨. 새로운 값: "); + ccLang.get().addDefault("MESSAGE.CHANGES_APPLIED_2", "변경사항 적용됨"); + ccLang.get().addDefault("MESSAGE.RECOMMEND_APPLIED", "추천 값 적용됨. {playerNum}명 기준입니다. config파일에서 이 값을 바꿀 수 있습니다."); + ccLang.get().addDefault("MESSAGE.TRANSFER_SUCCESS", "송금 완료"); + ccLang.get().addDefault("MESSAGE.PURCHASE_REJECTED", "상점에 이 아이템이 너무 많습니다. 지금은 팔 수 없습니다."); + ccLang.get().addDefault("MESSAGE.CLICK_YOUR_ITEM_START_PAGE", "인벤토리의 아이템을 클릭하면 가장 좋은 조건의 상점으로 이동합니다.\n좌클릭: 구매 우클릭: 판매"); + ccLang.get().addDefault("MESSAGE.MOVE_TO_BEST_SHOP_BUY", "{item}을 가장 저렴하게 살 수 있는 상점으로 이동했습니다."); + ccLang.get().addDefault("MESSAGE.MOVE_TO_BEST_SHOP_SELL", "{item}을 가장 비싸게 팔 수 있는 상점으로 이동했습니다."); + ccLang.get().addDefault("MESSAGE.SHOP_IS_CLOSED_BY_ADMIN", "이 상점은 서버 관리자에 의해 닫혔습니다."); + ccLang.get().addDefault("MESSAGE.SHOP_DISABLED", "이 상점은 비황성화된 상태입니다. 어드민이 아닌 유저는 접근할 수 없습니다. 상점 설정에서 활성화 할 수 있습니다."); + ccLang.get().addDefault("MESSAGE.ROTATION_SHARED_DATA_MISSING", "§e[ ! ]§f'{0}/SharedData.yml' 에서 {1} 개의 아이템에 대한 정보를 찾을 수 없었습니다. 이 아이템들은 장식으로 추가되었습니다."); + ccLang.get().addDefault("MESSAGE.ENTER_COMMAND", "명령어를 '/' 제외하고 입력하세요."); + ccLang.get().addDefault("MESSAGE.ENTER_COMMAND_2", "'인덱스/명령어' 형태로 입력하세요."); + ccLang.get().addDefault("MESSAGE.SELL_COMMAND_CUR", "현재 적용중인 판매 명령어:"); + ccLang.get().addDefault("MESSAGE.BUY_COMMAND_CUR", "현재 적용중인 구매 명령어:"); + ccLang.get().addDefault("MESSAGE.Q_SEARCH_FAIL_CURRENCY", "해당 아이템은 여러 종류의 재화로 거래 중 입니다."); + + ccLang.get().addDefault("HELP.TITLE", "§f도움말: {command} --------------------"); + ccLang.get().addDefault("HELP.SHOP", "상점을 엽니다."); + ccLang.get().addDefault("HELP.CMD", "명령어 도움말 표시 토글."); + ccLang.get().addDefault("HELP.CREATE_SHOP", "상점을 새로 만듭니다."); + ccLang.get().addDefault("HELP.CREATE_SHOP_2", "퍼미션(나중에 바꿀 수 있습니다.)\n true: dshop.user.shop.상점이름\n false: 아무나 접근가능(기본값)\n 임의 입력: 해당 퍼미션 필요"); + ccLang.get().addDefault("HELP.DELETE_SHOP", "기존의 상점을 제거합니다."); + ccLang.get().addDefault("HELP.SHOP_ADD_HAND", "손에 들고 있는 아이템을 상점에 추가합니다."); + ccLang.get().addDefault("HELP.SHOP_ADD_ITEM", "상점에 아이템을 추가합니다."); + ccLang.get().addDefault("HELP.SHOP_EDIT", "상점에 있는 아이템을 수정합니다."); + ccLang.get().addDefault("HELP.PRICE", "§7가격은 다음과 같이 계산됩니다: median*value/stock"); + ccLang.get().addDefault("HELP.INF_STATIC", "§7median<0 == 고정가격 stock<0 == 무한재고"); + ccLang.get().addDefault("HELP.EDIT_ALL", "상점의 모든 아이템을 한번에 수정합니다."); + ccLang.get().addDefault("HELP.RELOAD", "플러그인을 재시작 합니다."); + ccLang.get().addDefault("HELP.RELOADED", "플러그인 리로드됨!"); + ccLang.get().addDefault("HELP.USAGE", "사용법"); + ccLang.get().addDefault("HELP.ITEM_ALREADY_EXIST", "§7§o{item}(은)는 이미 판매중임.\n {info}\n 명령어를 입력하면 값이 수정됩니다."); + ccLang.get().addDefault("HELP.ITEM_INFO", "§7§o{item}의 현재 설정:\n {info}"); + ccLang.get().addDefault("HELP.REMOVE_ITEM", "§f인자를 0으로 입력하면 이 아이템을 상점에서 §4제거§f합니다."); + ccLang.get().addDefault("HELP.QSELL", "§f빠르게 아이템을 판매합니다."); + ccLang.get().addDefault("HELP.DELETE_OLD_USER", "장기간 접속하지 않은 유저의 데이터를 삭제합니다."); + ccLang.get().addDefault("HELP.ACCOUNT", "상점의 계좌 잔액을 설정합니다. -1 = 무제한"); + ccLang.get().addDefault("HELP.SET_TO_REC_ALL", "§e상점의 모든 아이템 설정값을 권장값으로 §c초기화§e합니다."); + ccLang.get().addDefault("HELP.SHOP_ENABLE", "상점을 활성화 또는 비활성화 합니다."); + + ccLang.get().addDefault("ERR.NO_USER_ID", "§6플레이어 uuid를 찾을 수 없습니다. 상점 이용 불가능."); + ccLang.get().addDefault("ERR.ITEM_NOT_EXIST", "상점에 해당 아이템이 존재하지 않습니다."); + ccLang.get().addDefault("ERR.ITEM_FORBIDDEN", "사용할 수 없는 아이템 입니다."); + ccLang.get().addDefault("ERR.NO_PERMISSION", "§e권한이 없습니다."); + ccLang.get().addDefault("ERR.WRONG_USAGE", "잘못된 명령어 사용법. 도움말을 확인하세요."); + ccLang.get().addDefault("ERR.NO_EMPTY_SLOT", "상점에 빈 공간이 없습니다."); + ccLang.get().addDefault("ERR.WRONG_DATATYPE", "인자의 유형이 잘못 입력되었습니다."); + ccLang.get().addDefault("ERR.VALUE_ZERO", "인자값이 0보다 커야 합니다."); + ccLang.get().addDefault("ERR.WRONG_ITEM_NAME", "유효하지 않은 아이템 이름입니다."); + ccLang.get().addDefault("ERR.HAND_EMPTY", "아이템을 손에 들고 있어야 합니다."); + ccLang.get().addDefault("ERR.HAND_EMPTY2", "§c§o아이템을 손에 들고 있어야 합니다!"); + ccLang.get().addDefault("ERR.SHOP_NOT_FOUND", "§f해당 상점을 찾을 수 없습니다."); + ccLang.get().addDefault("ERR.SHOP_EXIST", "해당 이름을 가진 상점이 이미 존재합니다."); + ccLang.get().addDefault("ERR.SHOP_NOT_EXIST", "그런 이름을 가진 상점이 없습니다."); + ccLang.get().addDefault("ERR.SIGN_SHOP_REMOTE_ACCESS", "해당 상점은 표지판을 통해서만 접근할 수 있습니다."); + ccLang.get().addDefault("ERR.LOCAL_SHOP_REMOTE_ACCESS", "해당 상점은 직접 방문해야만 사용할 수 있습니다."); + ccLang.get().addDefault("ERR.MAX_LOWER_THAN_MIN", "최대 가격은 최소 가격보다 커야합니다."); + ccLang.get().addDefault("ERR.DEFAULT_VALUE_OUT_OF_RANGE", "기본 가격은 최소 가격과 최대 가격 사이의 값이어야 합니다."); + ccLang.get().addDefault("ERR.NO_RECOMMEND_DATA", "Worth.yml 파일에 이 아이템의 정보가 없습니다."); + ccLang.get().addDefault("ERR.JOBS_REBORN_NOT_FOUND", "Jobs reborn 플러그인을 찾을 수 없습니다."); + ccLang.get().addDefault("ERR.PLAYER_POINTS_NOT_FOUND", "Player points 플러그인을 찾을 수 없습니다."); + ccLang.get().addDefault("ERR.SHOP_HAS_INF_BAL", "{shop} 상점은 무한계좌 상점입니다."); + ccLang.get().addDefault("ERR.SHOP_DIFF_CURRENCY", "두 상점이 서로 다른 통화를 사용합니다."); + ccLang.get().addDefault("ERR.PLAYER_NOT_EXIST", "해당 플레이어를 찾을 수 없습니다."); + ccLang.get().addDefault("ERR.SHOP_LINK_FAIL", "상점 둘 중 하나는 실제 계좌이어야 합니다."); + ccLang.get().addDefault("ERR.SHOP_LINK_TARGET_ERR", "목표 상점은 실제 계좌를 가지고 있어야 합니다."); + ccLang.get().addDefault("ERR.NESTED_STRUCTURE", "계층 구조를 이루는것은 금지되어 있습니다. (ex. aa-bb, bb-cc)"); + ccLang.get().addDefault("ERR.CREATIVE", "§eCreative mode 에서 이 명령어를 사용할 수 없습니다. 권한이 없습니다."); + ccLang.get().addDefault("ERR.FILE_CREATE_FAIL", "§e파일 생성에 실패했습니다."); + ccLang.get().addDefault("ERR.INVALID_TRANSACTION", "이 거래는 더이상 유효하지 않습니다. 문제가 반복되면 서버 관리자에게 문의하세요."); + ccLang.get().addDefault("ERR.SIGN_WALL", "상점 표지판이 벽에 설치되야 합니다."); + + ccLang.get().addDefault("ERR.SHOP_NULL", "§e상점 이름이 지정되지 않았습니다."); + ccLang.get().addDefault("ERR.ITEMINFO_HAND_EMPTY", "아이템을 들고 있어야 합니다."); + ccLang.get().addDefault("HELP.ITEMINFO_USAGE", "§f아이템 정보를 보려면 손에 아이템을 들고 있어야 합니다."); + ccLang.get().addDefault("HELP.ITEMINFO_REALNAME", "§7실제 이름: §3{item_realname}"); + ccLang.get().addDefault("HELP.ITEMINFO_SIGN_NAME", "§7표지판용 이름: §3{item_signname}"); + ccLang.get().addDefault("ERR.SIGN_ITEM_INVALID", "아이템 이름이 잘못되었습니다. /ds iteminfo 를 사용하여 아이템 이름을 확인해 보세요."); + ccLang.get().addDefault("ERR.SIGN_ITEM_NOT_FOR_SALE", "상점에 없는 아이템 입니다."); + ccLang.get().addDefault("MESSAGE.SIGN_SHOP_CREATED", "§a표지판 상점 생성!"); + + ccLang.get().addDefault("ON", "켜짐"); + ccLang.get().addDefault("OFF", "꺼짐"); + ccLang.get().addDefault("SET", "설정"); + ccLang.get().addDefault("UNSET", "설정해제"); + ccLang.get().addDefault("NULL", "없음"); + ccLang.get().addDefault("NULL(OPEN)", "없음 (모두에게 열려있음)"); + ccLang.get().addDefault("CUR_STATE", "현재상태"); + ccLang.get().addDefault("CLICK", "클릭"); + ccLang.get().addDefault("LMB", "좌클릭"); + ccLang.get().addDefault("RMB", "우클릭"); + ccLang.get().addDefault("CLOSE", "§f닫기"); + ccLang.get().addDefault("CLOSE_LORE", "§f§n클릭: 닫기"); + + ccLang.get().addDefault("EXP_POINTS", "Exp"); + ccLang.get().addDefault("JOB_POINTS", "Job Points"); + ccLang.get().addDefault("PLAYER_POINTS", "Player Points"); + + ccLang.get().options().copyDefaults(true); + ccLang.save(); + } + + private static void zh_TW() + { + ccLang.setup("Lang_V3_zh-TW", null); + + ccLang.get().addDefault("START_PAGE.EDITOR_TITLE", "§3編輯圖示"); + ccLang.get().addDefault("START_PAGE.EDIT_NAME", "§f重新命名"); + ccLang.get().addDefault("START_PAGE.EDIT_LORE", "§f修改描述"); + ccLang.get().addDefault("START_PAGE.EDIT_ICON", "§f更換圖示"); + ccLang.get().addDefault("START_PAGE.EDIT_ACTION", "§f更改指令"); + ccLang.get().addDefault("START_PAGE.SHOP_SHORTCUT", "§f建立商店按鈕"); + ccLang.get().addDefault("START_PAGE.CREATE_DECO", "§f建立裝飾按鈕"); + ccLang.get().addDefault("START_PAGE.ENTER_SHOP_NAME", "請輸入商店名稱"); + ccLang.get().addDefault("START_PAGE.DEFAULT_SHOP_LORE", "§f§n點擊:前往商店"); + ccLang.get().addDefault("START_PAGE.ITEM_MOVE_LORE", "§e右鍵:移動"); + ccLang.get().addDefault("START_PAGE.ITEM_COPY_LORE", "§e右鍵:複製"); + ccLang.get().addDefault("START_PAGE.ITEM_REMOVE_LORE", "§eShift 左鍵:移除"); + ccLang.get().addDefault("START_PAGE.ITEM_EDIT_LORE", "§eShift 右鍵:編輯"); + ccLang.get().addDefault("START_PAGE.REMOVE", "§f移除"); + ccLang.get().addDefault("START_PAGE.REMOVE_LORE", "§f從開始頁面移除此按鈕。"); + ccLang.get().addDefault("START_PAGE.ENTER_NAME", "請輸入此按鈕的新名稱。"); + ccLang.get().addDefault("START_PAGE.ENTER_LORE", "請輸入此按鈕的新描述。"); + ccLang.get().addDefault("START_PAGE.ENTER_ICON", "請輸入要用作按鈕圖示的物品名稱。(英文,不區分大小寫)"); + ccLang.get().addDefault("START_PAGE.ENTER_ACTION", "請輸入指令(不含 /)。當按下按鈕時會執行此指令。"); + ccLang.get().addDefault("START_PAGE.ENTER_COLOR", "請輸入裝飾按鈕的顏色。(英文)"); + ccLang.get().addDefault("START_PAGE.SHOP_LIST_TITLE", "§3商店清單"); + ccLang.get().addDefault("START_PAGE.SHOP_LIST.PAGE_TITLE", "§f{curPage}/{maxPage} 頁"); + ccLang.get().addDefault("START_PAGE.SHOP_LIST.PAGE_LORE", "§e左鍵:上一頁\n§e右鍵:下一頁"); + + ccLang.get().addDefault("COLOR_PICKER_TITLE", "§3顏色選擇器"); + + ccLang.get().addDefault("SHOP.TRADE_LORE", "§f§n點擊:交易"); + ccLang.get().addDefault("SHOP.BUY_PRICE", "§f購買:{num}"); + ccLang.get().addDefault("SHOP.SELL_PRICE", "§f出售:{num}"); + ccLang.get().addDefault("SHOP.BUY_PRICE_DISCOUNTED", "§f購買:§8§m{num}§r §a{num2}"); + ccLang.get().addDefault("SHOP.SELL_PRICE_DISCOUNTED", "§f出售:§8§m{num}§r §c{num2}"); + ccLang.get().addDefault("SHOP.BUY_PRICE_EXP", "§f購買:{num} 經驗值"); + ccLang.get().addDefault("SHOP.SELL_PRICE_EXP", "§f出售:{num} 經驗值"); + ccLang.get().addDefault("SHOP.BUY_PRICE_DISCOUNTED_EXP", "§f購買:§8§m{num} 經驗值§r §a{num2} 經驗值"); + ccLang.get().addDefault("SHOP.SELL_PRICE_DISCOUNTED_EXP", "§f出售:§8§m{num} 經驗值§r §c{num2} 經驗值"); + ccLang.get().addDefault("SHOP.BUY_PRICE_PP", "§f購買:{num} 積分"); + ccLang.get().addDefault("SHOP.SELL_PRICE_PP", "§f出售:{num} 積分"); + ccLang.get().addDefault("SHOP.BUY_PRICE_DISCOUNTED_PP", "§f購買:§8§m{num} 積分§r §a{num2} 積分"); + ccLang.get().addDefault("SHOP.SELL_PRICE_DISCOUNTED_PP", "§f出售:§8§m{num} 積分§r §c{num2} 積分"); + ccLang.get().addDefault("SHOP.BUY_PRICE_JP", "§f購買:{num} 職業點數"); + ccLang.get().addDefault("SHOP.SELL_PRICE_JP", "§f出售:{num} 職業點數"); + ccLang.get().addDefault("SHOP.BUY_PRICE_DISCOUNTED_JP", "§f購買:§8§m{num} 職業點數§r §a{num2} 職業點數"); + ccLang.get().addDefault("SHOP.SELL_PRICE_DISCOUNTED_JP", "§f出售:§8§m{num} 職業點數§r §c{num2} 職業點數"); + ccLang.get().addDefault("SHOP.STOCK", "§8庫存:{num}"); + ccLang.get().addDefault("SHOP.STOCK_2", "§8庫存:{stock}/{max_stock}"); + ccLang.get().addDefault("SHOP.INF_STOCK", "§8無限"); + ccLang.get().addDefault("SHOP.STATIC_PRICE", "§8【固定價格】"); + ccLang.get().addDefault("SHOP.STACKS", "§8{num} 組"); + ccLang.get().addDefault("SHOP.ITEM_MOVE_LORE", "§e右鍵:移動"); + ccLang.get().addDefault("SHOP.ITEM_COPY_LORE", "§e右鍵:複製"); + ccLang.get().addDefault("SHOP.ITEM_EDIT_LORE", "§eShift右鍵:編輯"); + ccLang.get().addDefault("SHOP.DECO_DELETE_LORE", "§eShift右鍵:移除"); + ccLang.get().addDefault("SHOP.PAGE_TITLE", "§f{curPage}/{maxPage} 頁"); + ccLang.get().addDefault("SHOP.PAGE_LORE_V2", "§f§n左鍵:上一頁\n§f§n右鍵:下一頁\n§7點擊你的物品會\n§7跳轉到該物品所在頁面。"); + ccLang.get().addDefault("SHOP.GO_TO_PAGE_EDITOR", "§eShift 右鍵:頁面編輯器"); + ccLang.get().addDefault("SHOP.ITEM_MOVE_SELECTED", "已選擇物品。右鍵點擊空欄位以移動。"); + ccLang.get().addDefault("SHOP.PERMISSION", "§f權限:"); + ccLang.get().addDefault("SHOP.PERMISSION_ITEM", "§7 - {permission}"); + ccLang.get().addDefault("SHOP.FLAGS", "§e標記:"); + ccLang.get().addDefault("SHOP.FLAGS_ITEM", "§e - {flag}"); + ccLang.get().addDefault("SHOP.SHOP_BAL_INF", "§f無限"); + ccLang.get().addDefault("SHOP.SHOP_BAL", "§f商店帳戶餘額"); + ccLang.get().addDefault("SHOP.SHOP_LOCATION", "§f商店位置:x {x}, y {y}, z {z}"); + ccLang.get().addDefault("SHOP.SHOP_LOCATION_B", "§f商店位置:"); + ccLang.get().addDefault("SHOP.SHOP_INFO_DASH", "§7 - "); + ccLang.get().addDefault("SHOP.DISABLED", "§c已停用§8|§f"); + ccLang.get().addDefault("SHOP.INCOMPLETE_DATA", "資料不完整"); + ccLang.get().addDefault("SHOP.INCOMPLETE_DATA_Lore", "此物品對非 OP 玩家不可見\n索引:"); + ccLang.get().addDefault("SHOP.TRADE_LIMIT_BUY", "§a購買上限:剩餘 {num}"); + ccLang.get().addDefault("SHOP.TRADE_LIMIT_SELL", "§a販售上限:剩餘 {num}"); + ccLang.get().addDefault("SHOP.TRADE_LIMIT_TIMER", "§a下次重置:{time}"); + ccLang.get().addDefault("SHOP.CLICK_TO_ADD", "§e點擊:新增"); + + ccLang.get().addDefault("SHOP_SETTING_TITLE", "§3商店設定"); + ccLang.get().addDefault("SHOP_SETTING.LOG_TOGGLE_LORE", "§e右鍵:查看紀錄"); + ccLang.get().addDefault("SHOP_SETTING.LOG_PRINT_CONSOLE", "§f將紀錄輸出至主控台"); + ccLang.get().addDefault("SHOP_SETTING.LOG_PRINT_ADMIN", "§f將紀錄發送給管理員"); + ccLang.get().addDefault("SHOP_SETTING.MAX_PAGE", "§f最大頁數"); + ccLang.get().addDefault("SHOP_SETTING.MAX_PAGE_LORE", "§f設定商店最大頁數。"); + ccLang.get().addDefault("SHOP_SETTING.BACKGROUND", "§f背景顏色"); + ccLang.get().addDefault("SHOP_SETTING.BACKGROUND_LORE", "§e點擊:變更顏色"); + ccLang.get().addDefault("SHOP_SETTING.L_R_SHIFT", "§e左鍵:-1 右鍵:+1 Shift:x5"); + ccLang.get().addDefault("SHOP_SETTING.FLAG", "§f標記"); + ccLang.get().addDefault("SHOP_SETTING.SHOP_SETTINGS_LORE", "§e右鍵:商店設定"); + ccLang.get().addDefault("SHOP_SETTING.SIGN_SHOP_LORE", "§f僅可透過告示牌進入。"); + ccLang.get().addDefault("SHOP_SETTING.LOCAL_SHOP_LORE", "§f必須親訪實體商店位置。"); + ccLang.get().addDefault("SHOP_SETTING.DELIVERY_CHARGE_LORE", "§f您可以付費配送,\n§f無需親訪商店交易。"); + ccLang.get().addDefault("SHOP_SETTING.SELECTED", "§2已選擇"); + ccLang.get().addDefault("SHOP_SETTING.CURRENCY", "§f貨幣類型:"); + ccLang.get().addDefault("SHOP_SETTING.VAULT_LORE", "§f預設貨幣。"); + ccLang.get().addDefault("SHOP_SETTING.EXP_LORE", "§f以玩家經驗值交易。"); + ccLang.get().addDefault("SHOP_SETTING.JOB_POINT_LORE", "§f使用職業點數交易。\n§f需安裝 Jobs Reborn 插件"); + ccLang.get().addDefault("SHOP_SETTING.PLAYER_POINT_LORE", "§f使用玩家積分交易。\n§f需安裝 PlayerPoints 插件"); + ccLang.get().addDefault("SHOP_SETTING.SHOW_VALUE_CHANGE_LORE", "§f顯示價格變動幅度。"); + ccLang.get().addDefault("SHOP_SETTING.HIDE_STOCK", "§f隱藏庫存。"); + ccLang.get().addDefault("SHOP_SETTING.HIDE_PRICING_TYPE", "§f隱藏價格類型。"); + ccLang.get().addDefault("SHOP_SETTING.HIDE_SHOP_BALANCE", "§f隱藏商店帳戶餘額。"); + ccLang.get().addDefault("SHOP_SETTING.SHOW_MAX_STOCK", "§f顯示最大庫存。"); + ccLang.get().addDefault("SHOP_SETTING.HIDDEN_IN_COMMAND", "§f此商店不會\n§f出現在指令補全中。"); + ccLang.get().addDefault("SHOP_SETTING.INTEGER_ONLY", "§f購買價格將向上取整。\n§f販售價格將向下取整。"); + ccLang.get().addDefault("SHOP_SETTING.PERMISSION", "§f權限"); + ccLang.get().addDefault("SHOP_SETTING.STATE", "§f狀態"); + ccLang.get().addDefault("SHOP_SETTING.STATE_ENABLE", "§a啟用"); + ccLang.get().addDefault("SHOP_SETTING.STATE_DISABLE", "§c停用"); + ccLang.get().addDefault("SHOP_SETTING.ROTATION_EDITOR", "§f輪換:"); + ccLang.get().addDefault("SHOP_SETTING.ROTATION_EDITOR_LORE", "§e點擊:編輯輪換"); + ccLang.get().addDefault("SHOP_SETTING.COMMAND_TOGGLE", "§f伺服器指令"); + ccLang.get().addDefault("SHOP_SETTING.COMMAND_TOGGLE_LORE", "§f在商店交易時執行伺服器指令。"); + ccLang.get().addDefault("SHOP_SETTING.COMMAND_SELL", "§f販售時執行"); + ccLang.get().addDefault("SHOP_SETTING.COMMAND_BUY", "§f購買時執行"); + ccLang.get().addDefault("SHOP_SETTING.COMMAND_LORE1", "§e左鍵:設定"); + ccLang.get().addDefault("SHOP_SETTING.COMMAND_LORE3", "§eShift 右鍵:刪除最後一項"); + ccLang.get().addDefault("SHOP_SETTING.TRADE_UI", "§f編輯交易介面"); + ccLang.get().addDefault("SHOP_SETTING.TRADE_UI_LORE_2", "§e左鍵:編輯\n§e右鍵:重設"); + + ccLang.get().addDefault("ROTATION_EDITOR_TITLE", "§3輪換編輯器"); + ccLang.get().addDefault("ROTATION_EDITOR.ENABLED", "§a已啟用"); + ccLang.get().addDefault("ROTATION_EDITOR.DISABLED", "§c已停用"); + ccLang.get().addDefault("ROTATION_EDITOR.CLICK_TO_ENABLE", "§e左鍵:啟用"); + ccLang.get().addDefault("ROTATION_EDITOR.CLICK_TO_DISABLE", "§e左鍵:停用"); + ccLang.get().addDefault("ROTATION_EDITOR.CURRENT_TIME", "§f當前時間:"); + ccLang.get().addDefault("ROTATION_EDITOR.CURRENTLY_IN_USE", "§a【使用中】"); + ccLang.get().addDefault("ROTATION_EDITOR.NEXT_ROTATION", "§f下次輪換:"); + ccLang.get().addDefault("ROTATION_EDITOR.PERIOD", "§f週期"); + ccLang.get().addDefault("ROTATION_EDITOR.PERIOD_LORE_V2", "§e左鍵:-1小時,右鍵:+1小時,Shift:x10"); + ccLang.get().addDefault("ROTATION_EDITOR.TIMER", "§f計時器調整"); + ccLang.get().addDefault("ROTATION_EDITOR.TIMER_LORE_V2", "§e左鍵:-10分鐘,右鍵:+10分鐘,Shift:x6"); + ccLang.get().addDefault("ROTATION_EDITOR.HOUR", "§f{0} 小時"); + ccLang.get().addDefault("ROTATION_EDITOR.UNSAVED_CHANGES", "§c§o尚未儲存的變更"); + ccLang.get().addDefault("ROTATION_EDITOR.APPLY_CHANGES", "§f套用變更"); + ccLang.get().addDefault("ROTATION_EDITOR.APPLY_CHANGES_LORE", "§e左鍵:儲存變更\n§e右鍵:重設變更"); + ccLang.get().addDefault("ROTATION_EDITOR.APPLY_ROTATION", "§e左鍵:立即套用"); + ccLang.get().addDefault("ROTATION_EDITOR.OPEN", "§e左鍵:開啟"); + ccLang.get().addDefault("ROTATION_EDITOR.CREATE", "§e左鍵:建立空白"); + ccLang.get().addDefault("ROTATION_EDITOR.COPY_AS_NEW", "§e右鍵:複製為新項目"); + ccLang.get().addDefault("ROTATION_EDITOR.DELETE", "§eShift 右鍵:§c刪除"); + ccLang.get().addDefault("ROTATION_EDITOR.REAPPLY", "§eShift 左鍵:重新套用"); + ccLang.get().addDefault("ROTATION_EDITOR.MOVE", "§e右鍵:移動"); + + ccLang.get().addDefault("ITEM_SETTING_TITLE", "§3物品設定"); + ccLang.get().addDefault("ITEM_SETTING.VALUE_BUY", "§f購買價值:"); + ccLang.get().addDefault("ITEM_SETTING.VALUE_SELL", "§f販售價值:"); + ccLang.get().addDefault("ITEM_SETTING.PRICE", "§f購買價格:"); + ccLang.get().addDefault("ITEM_SETTING.SELL_PRICE", "§f販售價格:"); + ccLang.get().addDefault("ITEM_SETTING.PRICE_MIN", "§f最低價格:"); + ccLang.get().addDefault("ITEM_SETTING.PRICE_MAX", "§f最高價格:"); + ccLang.get().addDefault("ITEM_SETTING.MEDIAN", "§f中位數:"); + ccLang.get().addDefault("ITEM_SETTING.STOCK", "§f庫存:"); + ccLang.get().addDefault("ITEM_SETTING.MAX_STOCK", "§f最大庫存:"); + ccLang.get().addDefault("ITEM_SETTING.MAX_STOCK_LORE", "§f若庫存超過此上限,\n§f商店將拒絕收購。"); + ccLang.get().addDefault("ITEM_SETTING.INF_STOCK", "無限庫存"); + ccLang.get().addDefault("ITEM_SETTING.STATIC_PRICE", "固定價格"); + ccLang.get().addDefault("ITEM_SETTING.UNLIMITED", "無限制"); + ccLang.get().addDefault("ITEM_SETTING.MEDIAN_HELP", "§f中位數越小,\n§f價格變化越劇烈。"); + ccLang.get().addDefault("ITEM_SETTING.TAX_IGNORED", "已忽略銷售稅設定。"); + ccLang.get().addDefault("ITEM_SETTING.RECOMMEND", "§f套用建議數值"); + ccLang.get().addDefault("ITEM_SETTING.DISCOUNT", "§f折扣"); + ccLang.get().addDefault("ITEM_SETTING.DISCOUNT_LORE", "§f折扣率:{num}%\n§e左鍵:+10,右鍵:-10"); + ccLang.get().addDefault("ITEM_SETTING.DISCOUNT_LORE_2", "§f折扣率:{num}%\n§e左鍵:-10,右鍵:+10"); + ccLang.get().addDefault("ITEM_SETTING.DONE", "§f完成"); + ccLang.get().addDefault("ITEM_SETTING.DONE_LORE", "§f設定完成!"); + ccLang.get().addDefault("ITEM_SETTING.ROUND_DOWN", "§f向下取整"); + ccLang.get().addDefault("ITEM_SETTING.SET_TO_MEDIAN", "§f設為中位數"); + ccLang.get().addDefault("ITEM_SETTING.SET_TO_STOCK", "§f設為庫存數"); + ccLang.get().addDefault("ITEM_SETTING.SET_TO_VALUE", "§f設為數值"); + ccLang.get().addDefault("ITEM_SETTING.CLOSE", "§f關閉"); + ccLang.get().addDefault("ITEM_SETTING.CLOSE_LORE", "§f§n點擊:關閉"); + ccLang.get().addDefault("ITEM_SETTING.REMOVE", "§c移除"); + ccLang.get().addDefault("ITEM_SETTING.REMOVE_LORE", "§f從商店中移除此物品。"); + ccLang.get().addDefault("ITEM_SETTING.BUY", "§3§l購買:{num}"); + ccLang.get().addDefault("ITEM_SETTING.SELL", "§3§l販售:{num}"); + ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_SELL", "§f每位玩家販售上限"); + ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_SELL_LORE", "§f{num}\n§e左鍵:-1,右鍵:+1,Shift = x10"); + ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_BUY", "§f每位玩家購買上限"); + ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_BUY_LORE", "§f{num}\n§e左鍵:-1,右鍵:+1,Shift = x10"); + ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_INTERVAL", "§f交易量限制重設週期"); + ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_INTERVAL_LORE", "§f間隔時間:{interval}\n§f下次重置:{time}\n§e左鍵:-1 小時,右鍵:+1 小時,Shift = x12"); + ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_TIMER", "§f調整計時器"); + ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_TIMER_LORE", "§f{num}\n§f下次重置:{time}\n§e左鍵:-1 小時,右鍵:+1 小時,Shift = x12"); + + ccLang.get().addDefault("TRADE_TITLE", "§3交易"); + ccLang.get().addDefault("TRADE.TOGGLE_SELLABLE", "§e點擊:僅限販售切換"); + ccLang.get().addDefault("TRADE.TOGGLE_BUYABLE", "§e點擊:僅限購買切換"); + ccLang.get().addDefault("TRADE.BUY_ONLY_LORE", "§f此物品無法販售。"); + ccLang.get().addDefault("TRADE.SELL_ONLY_LORE", "§f此物品無法購買。"); + ccLang.get().addDefault("TRADE.BALANCE", "§3我的餘額"); + ccLang.get().addDefault("TRADE.PRICE", "§f購買:{num}"); + ccLang.get().addDefault("TRADE.SELL_PRICE", "§f販售:{num}"); + ccLang.get().addDefault("TRADE.PRICE_DISCOUNTED", "§f購買:§8§m{num}§r §a{num2}"); + ccLang.get().addDefault("TRADE.SELL_PRICE_DISCOUNTED", "§f販售:§8§m{num}§r §c{num2}"); + ccLang.get().addDefault("TRADE.PRICE_EXP", "§f購買:{num} 經驗值"); + ccLang.get().addDefault("TRADE.SELL_PRICE_EXP", "§f販售:{num} 經驗值"); + ccLang.get().addDefault("TRADE.PRICE_DISCOUNTED_EXP", "§f購買:§8§m{num} 經驗值§r §a{num2} 經驗值"); + ccLang.get().addDefault("TRADE.SELL_PRICE_DISCOUNTED_EXP", "§f販售:§8§m{num} 經驗值§r §c{num2} 經驗值"); + ccLang.get().addDefault("TRADE.PRICE_PP", "§f購買:{num} 積分"); + ccLang.get().addDefault("TRADE.SELL_PRICE_PP", "§f販售:{num} 積分"); + ccLang.get().addDefault("TRADE.PRICE_DISCOUNTED_PP", "§f購買:§8§m{num} 積分§r §a{num2} 積分"); + ccLang.get().addDefault("TRADE.SELL_PRICE_DISCOUNTED_PP", "§f販售:§8§m{num} 積分§r §c{num2} 積分"); + ccLang.get().addDefault("TRADE.PRICE_JP", "§f購買:{num} 職業點數"); + ccLang.get().addDefault("TRADE.SELL_PRICE_JP", "§f販售:{num} 職業點數"); + ccLang.get().addDefault("TRADE.PRICE_DISCOUNTED_JP", "§f購買:§8§m{num} 職業點數§r §a{num2} 職業點數"); + ccLang.get().addDefault("TRADE.SELL_PRICE_DISCOUNTED_JP", "§f販售:§8§m{num} 職業點數§r §c{num2} 職業點數"); + ccLang.get().addDefault("TRADE.BUY", "§c購買"); + ccLang.get().addDefault("TRADE.SELL", "§2販售"); + ccLang.get().addDefault("TRADE.STOCK", "§8庫存:"); + ccLang.get().addDefault("TRADE.STACKS", "§8{num} 組"); + ccLang.get().addDefault("TRADE.INF_STOCK", "§8無限"); + ccLang.get().addDefault("TRADE.SHOP_BAL_INF", "§f無限"); + ccLang.get().addDefault("TRADE.SHOP_BAL", "§3商店帳戶餘額 \n§f{num}"); + ccLang.get().addDefault("TRADE.CLICK_TO_BUY", "§c§n點擊:購買 {amount}"); + ccLang.get().addDefault("TRADE.CLICK_TO_SELL", "§2§n點擊:販售 {amount}"); + ccLang.get().addDefault("TRADE.PURCHASE_LIMIT_PER_PLAYER", "§a購買上限:剩餘 {num}\n§a下次重置:{time}"); + ccLang.get().addDefault("TRADE.SALES_LIMIT_PER_PLAYER", "§a販售上限:剩餘 {num}\n§a下次重置:{time}"); + ccLang.get().addDefault("TRADE.QUANTITY_LORE", "§eShift 右鍵:編輯數量"); + ccLang.get().addDefault("TRADE.WAIT_FOR_INPUT", "輸入要在交易介面中顯示的數量。\n範例:1,2,4,8,16,32,64"); + + ccLang.get().addDefault("PAGE_EDITOR_TITLE", "§3頁面編輯器"); + ccLang.get().addDefault("PAGE_EDITOR.PREV", "§f<<"); + ccLang.get().addDefault("PAGE_EDITOR.NEXT", "§f>>"); + ccLang.get().addDefault("PAGE_EDITOR.PAGE_SWAP_SUCCESS", "§f頁面已成功替換。"); + ccLang.get().addDefault("PAGE_EDITOR.PAGE_SWAP_FAIL", "§f頁面替換失敗。"); + ccLang.get().addDefault("PAGE_EDITOR.PAGE_SWAP_SELECTED", "§f頁面已選取。請右鍵點擊要替換的其他頁面。"); + ccLang.get().addDefault("PAGE_EDITOR.PAGE_LORE_PREMIUM", "§e左鍵:開啟頁面\n§e右鍵:替換\n§eShift 左鍵:插入\n§eShift 右鍵:刪除"); + ccLang.get().addDefault("PAGE_EDITOR.PRICE", "§f購買:{num}"); + ccLang.get().addDefault("PAGE_EDITOR.SELL_PRICE", "§f販售:{num}"); + ccLang.get().addDefault("PAGE_EDITOR.STOCK", "§8庫存:{num}"); + ccLang.get().addDefault("PAGE_EDITOR.STACKS", "§8{num} 組"); + ccLang.get().addDefault("PAGE_EDITOR.STATIC_PRICE", "§8【固定價格】"); + ccLang.get().addDefault("PAGE_EDITOR.EMPTY", "§8(空)"); + ccLang.get().addDefault("PAGE_EDITOR.EMPTY_SLOT_LORE", "§e左鍵/右鍵:推送\n§e+Shift:拉取"); + + ccLang.get().addDefault("LOG_VIEWER_TITLE", "§3紀錄檢視器"); + ccLang.get().addDefault("LOG_VIEWER.DATE", "§f日期:"); + ccLang.get().addDefault("LOG_VIEWER.TIME", "§f時間:"); + ccLang.get().addDefault("LOG_VIEWER.CURRENCY", "§f貨幣:"); + ccLang.get().addDefault("LOG_VIEWER.PRICE", "§f價格:"); + ccLang.get().addDefault("LOG_VIEWER.EXPAND", "§f展開"); + ccLang.get().addDefault("LOG_VIEWER.COLLAPSE", "§f收合"); + ccLang.get().addDefault("LOG_VIEWER.PAGE_TITLE", "§f{curPage}/{maxPage} 頁"); + ccLang.get().addDefault("LOG_VIEWER.PAGE_LORE", "§e左鍵:上一頁\n§e右鍵:下一頁"); + ccLang.get().addDefault("LOG_VIEWER.FILE_LORE", "§e左鍵:開啟\n§eShift 右鍵:§c刪除"); + + ccLang.get().addDefault("LOG.LOG", "§f紀錄"); + ccLang.get().addDefault("LOG.CLEAR", "§f紀錄已刪除"); + ccLang.get().addDefault("LOG.SAVE", "§f紀錄已儲存"); + ccLang.get().addDefault("LOG.DELETE", "§4刪除紀錄"); + ccLang.get().addDefault("LOG.SELL", "§f{player} 將 {amount} 個 {item} 販售給 {shop}"); + ccLang.get().addDefault("LOG.BUY", "§f{player} 從 {shop} 購買了 {amount} 個 {item}"); + + ccLang.get().addDefault("STOCK_SIMULATOR_TITLE", "§3庫存模擬器"); + ccLang.get().addDefault("STOCK_SIMULATOR.CHANGE_SAMPLE_LORE", "§e左鍵/右鍵:變更物品"); + ccLang.get().addDefault("STOCK_SIMULATOR.SIMULATOR_BUTTON_LORE", "§e右鍵:模擬器"); + ccLang.get().addDefault("STOCK_SIMULATOR.RUN_TITLE", "§f執行"); + ccLang.get().addDefault("STOCK_SIMULATOR.RUN_LORE", "§e左鍵:執行模擬\n§e右鍵:將設定套用至商店\n§f物品本身不受影響。"); + ccLang.get().addDefault("STOCK_SIMULATOR.REAL_TIME", "§a(即時)"); + ccLang.get().addDefault("STOCK_SIMULATOR.AFTER_S", "§a{0} 秒後"); + ccLang.get().addDefault("STOCK_SIMULATOR.AFTER_M", "§a{0} 分鐘後"); + ccLang.get().addDefault("STOCK_SIMULATOR.AFTER_H", "§a{0} 小時後"); + ccLang.get().addDefault("STOCK_SIMULATOR.AFTER_D", "§a{0} 天後"); + ccLang.get().addDefault("STOCK_SIMULATOR.L_R_SHIFT", "§e左鍵:-1 右鍵:+1 Shift:x5"); + ccLang.get().addDefault("STOCK_SIMULATOR.PRICE", "§f購買價格:{num}"); + ccLang.get().addDefault("STOCK_SIMULATOR.MEDIAN", "§f中位數:{num}"); + ccLang.get().addDefault("STOCK_SIMULATOR.STOCK", "§f庫存:{num}"); + + ccLang.get().addDefault("PALETTE_TITLE", "§3選擇要販售的物品"); + ccLang.get().addDefault("PALETTE_TITLE2", "§3選擇物品"); + ccLang.get().addDefault("PALETTE.LORE_PREMIUM", "§e左鍵:新增\n§eShift 左鍵:設定後新增\n§e右鍵:新增為裝飾物\n§eShift 右鍵:搜尋「{item}」"); + ccLang.get().addDefault("PALETTE.LORE2", "§e左鍵:選擇\n§eShift 右鍵:搜尋「{item}」"); + ccLang.get().addDefault("PALETTE.SEARCH", "§f搜尋"); + ccLang.get().addDefault("PALETTE.ADD_ALL", "§f全部新增"); + ccLang.get().addDefault("PALETTE.ADD_ALL_LORE", "§e左鍵:新增全部\n§eShift 左鍵:新增全部並套用建議數值"); + ccLang.get().addDefault("PALETTE.PAGE_TITLE", "§f{curPage}/{maxPage} 頁"); + ccLang.get().addDefault("PALETTE.PAGE_LORE", "§f§n左鍵:上一頁\n§f§n右鍵:下一頁"); + ccLang.get().addDefault("PALETTE.FILTER_APPLIED", "§f篩選器已套用:"); + ccLang.get().addDefault("PALETTE.FILTER_LORE", "§e左鍵:搜尋\n§e右鍵:清除篩選\n\n§7搜尋「BLUE_WOOL」範例:\n§7 b w\n§7 wool\n§7 blue wool"); + + ccLang.get().addDefault("QUICK_SELL_TITLE", "§3快速販售"); + ccLang.get().addDefault("QUICK_SELL.GUIDE_TITLE", "§3§l快速販售指南"); + ccLang.get().addDefault("QUICK_SELL.GUIDE_LORE", "§a左鍵點擊要販售的物品。\n§aShift 左鍵可販售所有相同類型的物品。\n§a右鍵可前往該物品的商店。"); + + ccLang.get().addDefault("ARROW.UP", "§a⬆"); + ccLang.get().addDefault("ARROW.DOWN", "§c⬇"); + ccLang.get().addDefault("ARROW.UP_2", "§c⬆"); + ccLang.get().addDefault("ARROW.DOWN_2", "§a⬇"); + + ccLang.get().addDefault("TIME.OPEN", "開門"); + ccLang.get().addDefault("TIME.CLOSE", "關門"); + ccLang.get().addDefault("TIME.OPEN_LORE", "§f設定開店時間"); + ccLang.get().addDefault("TIME.CLOSE_LORE", "§f設定關店時間"); + ccLang.get().addDefault("TIME.SHOPHOURS", "§f營業時間"); + ccLang.get().addDefault("TIME.OPEN24", "24 小時營業"); + ccLang.get().addDefault("TIME.SHOP_IS_CLOSED", "§f商店目前關閉,將於 {time} 點開啟。現在時間 {curTime} 點。"); + ccLang.get().addDefault("TIME.SET_SHOPHOURS", "設定營業時間"); + ccLang.get().addDefault("TIME.CUR", "§f目前時間:{time} 點"); + + ccLang.get().addDefault("STOCK_STABILIZING.SS", "§f庫存穩定化"); + ccLang.get().addDefault("STOCK_STABILIZING.L_R_SHIFT", "§e左鍵:-0.1 右鍵:+0.1 Shift:x5"); + ccLang.get().addDefault("STOCK_STABILIZING.STRENGTH_LORE_A", "§f中位數的 n%"); + ccLang.get().addDefault("STOCK_STABILIZING.STRENGTH_LORE_B", "§f與中位數差距的 n%"); + + ccLang.get().addDefault("FLUCTUATION.FLUCTUATION", "§f庫存波動"); + ccLang.get().addDefault("FLUCTUATION.INTERVAL", "§f間隔時間"); + ccLang.get().addDefault("FLUCTUATION.INTERVAL_LORE", "§f1 小時 = 1000 ticks = 實際時間 50 秒"); + ccLang.get().addDefault("FLUCTUATION.STRENGTH", "§f波動強度"); + ccLang.get().addDefault("FLUCTUATION.STRENGTH_LORE", "§f中位數的 n%"); + + ccLang.get().addDefault("TAX.SALES_TAX", "§f銷售稅"); + ccLang.get().addDefault("TAX.USE_GLOBAL", "使用全域設定({tax}%)"); + ccLang.get().addDefault("TAX.USE_LOCAL", "單獨設定"); + + ccLang.get().addDefault("MESSAGE.SEARCH_ITEM", "§f請輸入要搜尋的物品名稱。"); + ccLang.get().addDefault("MESSAGE.SEARCH_CANCELED", "§f搜尋已取消。"); + ccLang.get().addDefault("MESSAGE.INPUT_CANCELED", "§f輸入已取消。"); + ccLang.get().addDefault("MESSAGE.DELETE_CONFIRM", "§f確定要刪除此頁面嗎?請輸入 'delete' 以確認。"); + ccLang.get().addDefault("MESSAGE.CANT_DELETE_LAST_PAGE", "§f無法刪除僅剩的最後一頁。"); + ccLang.get().addDefault("MESSAGE.SHOP_BAL_LOW", "§f商店資金不足。"); + ccLang.get().addDefault("MESSAGE.SHOP_CREATED", "§f商店已建立!"); + ccLang.get().addDefault("MESSAGE.SHOP_DELETED", "§f商店已刪除!"); + ccLang.get().addDefault("MESSAGE.OUT_OF_STOCK", "§f缺貨!"); + ccLang.get().addDefault("MESSAGE.BUY_SUCCESS", "§f已購買 {item} x{amount},花費 {price}。餘額:{bal}"); + ccLang.get().addDefault("MESSAGE.SELL_SUCCESS", "§f已販售 {item} x{amount},收入 {price}。餘額:{bal}"); + ccLang.get().addDefault("MESSAGE.BUY_SUCCESS_EXP", "§f已購買 {item} x{amount},花費 {price} 經驗值。餘額:{bal}"); + ccLang.get().addDefault("MESSAGE.SELL_SUCCESS_EXP", "§f已販售 {item} x{amount},收入 {price} 經驗值。餘額:{bal}"); + ccLang.get().addDefault("MESSAGE.BUY_SUCCESS_JP", "§f已購買 {item} x{amount},花費 {price} 點數。剩餘:{bal}"); + ccLang.get().addDefault("MESSAGE.SELL_SUCCESS_JP", "§f已販售 {item} x{amount},收入 {price} 點數。剩餘:{bal}"); + ccLang.get().addDefault("MESSAGE.BUY_SUCCESS_PP", "§f已購買 {item} x{amount},花費 {price} 積分。剩餘:{bal}"); + ccLang.get().addDefault("MESSAGE.SELL_SUCCESS_PP", "§f已販售 {item} x{amount},收入 {price} 積分。剩餘:{bal}"); + ccLang.get().addDefault("MESSAGE.QSELL_NA", "§f沒有任何商店販售此物品。"); + ccLang.get().addDefault("MESSAGE.DELIVERY_CHARGE", "§f運費:{fee}"); + ccLang.get().addDefault("MESSAGE.DELIVERY_CHARGE_NA", "§f無法配送至其他世界。"); + ccLang.get().addDefault("MESSAGE.NOT_ENOUGH_MONEY", "§f金錢不足。餘額:{bal}"); + ccLang.get().addDefault("MESSAGE.NOT_ENOUGH_POINT", "§f點數不足。餘額:{bal}"); + ccLang.get().addDefault("MESSAGE.NOT_ENOUGH_PLAYER_POINT", "§f玩家積分不足。餘額:{bal}"); + ccLang.get().addDefault("MESSAGE.NOT_ENOUGH_EXP_POINT", "§f經驗值不足。餘額:{bal}"); + ccLang.get().addDefault("MESSAGE.NO_ITEM_TO_SELL", "§f目前沒有可販售的物品。"); + ccLang.get().addDefault("MESSAGE.NO_ITEM_TO_SELL_2", "§f無可販售的物品。"); + ccLang.get().addDefault("MESSAGE.INVENTORY_FULL", "§4你的物品欄已滿!"); + ccLang.get().addDefault("MESSAGE.IRREVERSIBLE", "§f此操作無法復原!"); + ccLang.get().addDefault("MESSAGE.ITEM_ADDED", "物品已新增!"); + ccLang.get().addDefault("MESSAGE.ITEM_UPDATED", "物品已更新!"); + ccLang.get().addDefault("MESSAGE.ITEM_DELETED", "物品已刪除!"); + ccLang.get().addDefault("MESSAGE.CHANGES_APPLIED", "變更已套用。新數值:"); + ccLang.get().addDefault("MESSAGE.CHANGES_APPLIED_2", "變更已套用"); + ccLang.get().addDefault("MESSAGE.RECOMMEND_APPLIED", "已套用建議值。此值基於 {playerNum} 名玩家,可於設定檔中更改。"); + ccLang.get().addDefault("MESSAGE.TRANSFER_SUCCESS", "匯款成功"); + ccLang.get().addDefault("MESSAGE.PURCHASE_REJECTED", "商店已擁有太多此物品,暫時無法販售。"); + ccLang.get().addDefault("MESSAGE.CLICK_YOUR_ITEM_START_PAGE", "點擊物品查看哪間商店提供最優惠的交易。\n左鍵:購買 右鍵:販售"); + ccLang.get().addDefault("MESSAGE.MOVE_TO_BEST_SHOP_BUY", "已跳轉至 {item} 最低購買價的商店。"); + ccLang.get().addDefault("MESSAGE.MOVE_TO_BEST_SHOP_SELL", "已跳轉至 {item} 最高販售價的商店。"); + ccLang.get().addDefault("MESSAGE.SHOP_IS_CLOSED_BY_ADMIN", "此商店已由伺服器管理員關閉。"); + ccLang.get().addDefault("MESSAGE.SHOP_DISABLED", "此商店目前已停用,非管理員無法使用。可於商店設定中重新啟用。"); + ccLang.get().addDefault("MESSAGE.ROTATION_SHARED_DATA_MISSING", "§e[ ! ]§f'{0}/SharedData.yml' 中找不到所需資料,共 {1} 個物品。這些物品已作為裝飾項新增。"); + ccLang.get().addDefault("MESSAGE.ENTER_COMMAND", "請輸入不含 '/' 的指令。"); + ccLang.get().addDefault("MESSAGE.ENTER_COMMAND_2", "請輸入格式為「索引/指令」。"); + ccLang.get().addDefault("MESSAGE.SELL_COMMAND_CUR", "目前作用中的販售指令:"); + ccLang.get().addDefault("MESSAGE.BUY_COMMAND_CUR", "目前作用中的購買指令:"); + ccLang.get().addDefault("MESSAGE.Q_SEARCH_FAIL_CURRENCY", "此物品正在使用多種貨幣進行交易。"); + + ccLang.get().addDefault("HELP.TITLE", "§f說明:{command} --------------------"); + ccLang.get().addDefault("HELP.SHOP", "開啟商店"); + ccLang.get().addDefault("HELP.CMD", "切換是否顯示指令說明"); + ccLang.get().addDefault("HELP.CREATE_SHOP", "建立新商店。"); + ccLang.get().addDefault("HELP.CREATE_SHOP_2", "權限設定(可日後更改):\n true:需 dshop.user.shop.shopName 權限\n false:所有人可存取(預設)\n 自訂值:需指定權限"); + ccLang.get().addDefault("HELP.DELETE_SHOP", "刪除現有商店。"); + ccLang.get().addDefault("HELP.SHOP_ADD_HAND", "將手上物品新增至商店。"); + ccLang.get().addDefault("HELP.SHOP_ADD_ITEM", "新增物品至商店。"); + ccLang.get().addDefault("HELP.SHOP_EDIT", "編輯商店內的物品。"); + ccLang.get().addDefault("HELP.PRICE", "§7價格計算公式:中位數 * 價值 ÷ 庫存"); + ccLang.get().addDefault("HELP.INF_STATIC", "§7中位數 < 0 為固定價格,庫存 < 0 為無限庫存"); + ccLang.get().addDefault("HELP.EDIT_ALL", "一次修改商店內所有物品。"); + ccLang.get().addDefault("HELP.RELOAD", "重新載入插件。"); + ccLang.get().addDefault("HELP.RELOADED", "插件已重新載入"); + ccLang.get().addDefault("HELP.USAGE", "使用方式"); + ccLang.get().addDefault("HELP.ITEM_ALREADY_EXIST", "§7§o{item} 已在販售中。\n {info}\n 輸入指令可修改其數值。"); + ccLang.get().addDefault("HELP.ITEM_INFO", "§7§o{item} 目前設定:\n {info}"); + ccLang.get().addDefault("HELP.REMOVE_ITEM", "§f輸入參數為 0 即§4刪除§f該物品。"); + ccLang.get().addDefault("HELP.QSELL", "§f快速販售物品。"); + ccLang.get().addDefault("HELP.DELETE_OLD_USER", "刪除長期未登入的使用者資料"); + ccLang.get().addDefault("HELP.ACCOUNT", "設定商店帳戶餘額,-1 為無上限"); + ccLang.get().addDefault("HELP.SET_TO_REC_ALL", "§c重設§e 商店內所有物品為建議值"); + ccLang.get().addDefault("HELP.SHOP_ENABLE", "啟用或停用商店"); + ccLang.get().addDefault("HELP.ITEMINFO_USAGE", "§f拿著物品可查看詳細資訊。"); + ccLang.get().addDefault("HELP.ITEMINFO_REALNAME", "§7實際名稱:§3{item_realname}"); + ccLang.get().addDefault("HELP.ITEMINFO_SIGN_NAME", "§7告示牌名稱:§3{item_signname}"); + + ccLang.get().addDefault("ERR.NO_USER_ID", "§6找不到玩家 UUID。無法使用商店。"); + ccLang.get().addDefault("ERR.ITEM_NOT_EXIST", "商店中沒有此物品。"); + ccLang.get().addDefault("ERR.ITEM_FORBIDDEN", "此為禁用物品。"); + ccLang.get().addDefault("ERR.NO_PERMISSION", "§e你沒有權限。"); + ccLang.get().addDefault("ERR.WRONG_USAGE", "指令使用方式錯誤。"); + ccLang.get().addDefault("ERR.NO_EMPTY_SLOT", "商店中沒有空位。"); + ccLang.get().addDefault("ERR.WRONG_DATATYPE", "無效的參數類型"); + ccLang.get().addDefault("ERR.VALUE_ZERO", "參數值必須大於 0。"); + ccLang.get().addDefault("ERR.WRONG_ITEM_NAME", "無效的物品名稱。"); + ccLang.get().addDefault("ERR.HAND_EMPTY", "請手持物品。"); + ccLang.get().addDefault("ERR.HAND_EMPTY2", "§c§o你必須手持物品!"); + ccLang.get().addDefault("ERR.SHOP_NOT_FOUND", "§f找不到該商店。"); + ccLang.get().addDefault("ERR.SHOP_EXIST", "此商店名稱已存在。"); + ccLang.get().addDefault("ERR.SHOP_NOT_EXIST", "找不到指定商店。"); + ccLang.get().addDefault("ERR.SIGN_SHOP_REMOTE_ACCESS", "此商店僅能透過告示牌使用。"); + ccLang.get().addDefault("ERR.LOCAL_SHOP_REMOTE_ACCESS", "此商店需親訪現場。"); + ccLang.get().addDefault("ERR.MAX_LOWER_THAN_MIN", "最大價格必須高於最小價格。"); + ccLang.get().addDefault("ERR.DEFAULT_VALUE_OUT_OF_RANGE", "預設價格必須介於最小與最大價格之間。"); + ccLang.get().addDefault("ERR.NO_RECOMMEND_DATA", "Worth.yml 中沒有此物品的資訊。"); + ccLang.get().addDefault("ERR.JOBS_REBORN_NOT_FOUND", "找不到 Jobs Reborn 插件。"); + ccLang.get().addDefault("ERR.PLAYER_POINTS_NOT_FOUND", "找不到 PlayerPoints 插件。"); + ccLang.get().addDefault("ERR.SHOP_HAS_INF_BAL", "{shop} 是無限餘額商店。"); + ccLang.get().addDefault("ERR.SHOP_DIFF_CURRENCY", "兩間商店使用不同貨幣。"); + ccLang.get().addDefault("ERR.PLAYER_NOT_EXIST", "找不到該玩家。"); + ccLang.get().addDefault("ERR.SHOP_LINK_FAIL", "兩間商店必須有一間為實體帳戶。"); + ccLang.get().addDefault("ERR.SHOP_LINK_TARGET_ERR", "目標商店必須是實體帳戶。"); + ccLang.get().addDefault("ERR.NESTED_STRUCTURE", "禁止巢狀結構。(例如 aa-bb、bb-cc)"); + ccLang.get().addDefault("ERR.CREATIVE", "§e創造模式中不可使用此指令。你沒有權限。"); + ccLang.get().addDefault("ERR.FILE_CREATE_FAIL", "§e檔案建立失敗"); + ccLang.get().addDefault("ERR.INVALID_TRANSACTION", "此交易已無效。若問題持續,請聯繫伺服器管理員。"); + ccLang.get().addDefault("ERR.SIGN_WALL", "告示牌必須放置於牆上。"); + ccLang.get().addDefault("ERR.SHOP_NULL", "§e商店名稱不能為空。"); + ccLang.get().addDefault("ERR.ITEMINFO_HAND_EMPTY", "你必須手持物品。"); + ccLang.get().addDefault("ERR.SIGN_ITEM_INVALID", "無效的物品。請使用 /ds iteminfo 查詢名稱。"); + ccLang.get().addDefault("ERR.SIGN_ITEM_NOT_FOR_SALE", "請先將物品新增至商店,才能放置告示牌。"); + ccLang.get().addDefault("MESSAGE.SIGN_SHOP_CREATED", "§a已建立告示牌商店!"); + + ccLang.get().addDefault("ON", "開啟"); + ccLang.get().addDefault("OFF", "關閉"); + ccLang.get().addDefault("SET", "設定"); + ccLang.get().addDefault("UNSET", "取消設定"); + ccLang.get().addDefault("NULL", "空值"); + ccLang.get().addDefault("NULL(OPEN)", "無(對所有人開放)"); + ccLang.get().addDefault("CUR_STATE", "當前狀態"); + ccLang.get().addDefault("CLICK", "點擊"); + ccLang.get().addDefault("LMB", "左鍵"); + ccLang.get().addDefault("RMB", "右鍵"); + ccLang.get().addDefault("CLOSE", "§f關閉"); + ccLang.get().addDefault("CLOSE_LORE", "§f§n點擊:關閉"); + + ccLang.get().addDefault("EXP_POINTS", "經驗值 (EXP)"); + ccLang.get().addDefault("JOB_POINTS", "職業點數 (Job Points)"); + ccLang.get().addDefault("PLAYER_POINTS", "玩家點數 (Player Points)"); + + ccLang.get().options().copyDefaults(true); + ccLang.save(); + } + + private static void en_US() + { + ccLang.setup("Lang_V3_en-US", null); + + ccLang.get().addDefault("START_PAGE.EDITOR_TITLE", "§3Edit icon"); + ccLang.get().addDefault("START_PAGE.EDIT_NAME", "§fRename"); + ccLang.get().addDefault("START_PAGE.EDIT_LORE", "§fChange lore"); + ccLang.get().addDefault("START_PAGE.EDIT_ICON", "§fChange icon"); + ccLang.get().addDefault("START_PAGE.EDIT_ACTION", "§fChange command"); + ccLang.get().addDefault("START_PAGE.SHOP_SHORTCUT", "§fCreate shop button"); + ccLang.get().addDefault("START_PAGE.CREATE_DECO", "§fCreate decorative button"); + ccLang.get().addDefault("START_PAGE.ENTER_SHOP_NAME", "Please enter shop name"); + ccLang.get().addDefault("START_PAGE.DEFAULT_SHOP_LORE", "§f§nClick: go to shop"); + ccLang.get().addDefault("START_PAGE.ITEM_MOVE_LORE", "§eRMB: Move"); + ccLang.get().addDefault("START_PAGE.ITEM_COPY_LORE", "§eRMB: Copy"); + ccLang.get().addDefault("START_PAGE.ITEM_REMOVE_LORE", "§eShift LMB: Remove"); + ccLang.get().addDefault("START_PAGE.ITEM_EDIT_LORE", "§eShift RMB: Edit"); + ccLang.get().addDefault("START_PAGE.REMOVE", "§fRemove"); + ccLang.get().addDefault("START_PAGE.REMOVE_LORE", "§fRemove this button from the start page."); + ccLang.get().addDefault("START_PAGE.ENTER_NAME", "Enter a new name for the button."); + ccLang.get().addDefault("START_PAGE.ENTER_LORE", "Enter a new description for the button."); + ccLang.get().addDefault("START_PAGE.ENTER_ICON", "Enter the name of the item to be used as the icon for the button. (English, case insensitive)"); + ccLang.get().addDefault("START_PAGE.ENTER_ACTION", "Enter the command without '/'. This command is executed when the button is pressed."); + ccLang.get().addDefault("START_PAGE.ENTER_COLOR", "Enter a color for the decorative button. (English)"); + ccLang.get().addDefault("START_PAGE.SHOP_LIST_TITLE", "§3Shop List"); + ccLang.get().addDefault("START_PAGE.SHOP_LIST.PAGE_TITLE", "§f{curPage}/{maxPage} Page"); + ccLang.get().addDefault("START_PAGE.SHOP_LIST.PAGE_LORE", "§eLMB: Previous page\n§eRMB: Next page"); + + ccLang.get().addDefault("COLOR_PICKER_TITLE", "§3Color Picker"); + + ccLang.get().addDefault("SHOP.TRADE_LORE", "§f§nClick: Trade"); + ccLang.get().addDefault("SHOP.BUY_PRICE", "§fBuy: {num}"); + ccLang.get().addDefault("SHOP.SELL_PRICE", "§fSell: {num}"); + ccLang.get().addDefault("SHOP.BUY_PRICE_DISCOUNTED", "§fBuy: §8§m{num}§r §a{num2}"); + ccLang.get().addDefault("SHOP.SELL_PRICE_DISCOUNTED", "§fSell: §8§m{num}§r §c{num2}"); + ccLang.get().addDefault("SHOP.BUY_PRICE_EXP", "§fBuy: {num}Exp"); + ccLang.get().addDefault("SHOP.SELL_PRICE_EXP", "§fSell: {num}Exp"); + ccLang.get().addDefault("SHOP.BUY_PRICE_DISCOUNTED_EXP", "§fBuy: §8§m{num}Exp§r §a{num2}Exp"); + ccLang.get().addDefault("SHOP.SELL_PRICE_DISCOUNTED_EXP", "§fSell: §8§m{num}Exp§r §c{num2}Exp"); + ccLang.get().addDefault("SHOP.BUY_PRICE_PP", "§fBuy: {num}PP"); + ccLang.get().addDefault("SHOP.SELL_PRICE_PP", "§fSell: {num}PP"); + ccLang.get().addDefault("SHOP.BUY_PRICE_DISCOUNTED_PP", "§fBuy: §8§m{num}PP§r §a{num2}PP"); + ccLang.get().addDefault("SHOP.SELL_PRICE_DISCOUNTED_PP", "§fSell: §8§m{num}PP§r §c{num2}PP"); + ccLang.get().addDefault("SHOP.BUY_PRICE_JP", "§fBuy: {num}JP"); + ccLang.get().addDefault("SHOP.SELL_PRICE_JP", "§fSell: {num}JP"); + ccLang.get().addDefault("SHOP.BUY_PRICE_DISCOUNTED_JP", "§fBuy: §8§m{num}JP§r §a{num2}JP"); + ccLang.get().addDefault("SHOP.SELL_PRICE_DISCOUNTED_JP", "§fSell: §8§m{num}JP§r §c{num2}JP"); + ccLang.get().addDefault("SHOP.STOCK", "§8Stock: {num}"); + ccLang.get().addDefault("SHOP.STOCK_2", "§8Stock: {stock}/{max_stock}"); + ccLang.get().addDefault("SHOP.INF_STOCK", "§8Infinite"); + ccLang.get().addDefault("SHOP.STATIC_PRICE", "§8[Fixed price]"); + ccLang.get().addDefault("SHOP.STACKS", "§8{num} Stacks"); + ccLang.get().addDefault("SHOP.ITEM_MOVE_LORE", "§eRMB: Move"); + ccLang.get().addDefault("SHOP.ITEM_COPY_LORE", "§eRMB: Copy"); + ccLang.get().addDefault("SHOP.ITEM_EDIT_LORE", "§eShiftRMB: Edit"); + ccLang.get().addDefault("SHOP.DECO_DELETE_LORE", "§eShiftRMB: Remove"); + ccLang.get().addDefault("SHOP.PAGE_TITLE", "§f{curPage}/{maxPage} Page"); + ccLang.get().addDefault("SHOP.PAGE_LORE_V2", "§f§nLMB: Previous page\n§f§nRMB: Next page\n§7Clicking on your item will\n§7take you to the page where\n§7that item is located."); + ccLang.get().addDefault("SHOP.GO_TO_PAGE_EDITOR", "§eShift RMB: Page Editor"); + ccLang.get().addDefault("SHOP.ITEM_MOVE_SELECTED", "Item selected. Right-click on an empty field to move it."); + ccLang.get().addDefault("SHOP.PERMISSION", "§fPermission:"); + ccLang.get().addDefault("SHOP.PERMISSION_ITEM", "§7 - {permission}"); + ccLang.get().addDefault("SHOP.FLAGS", "§eFlag:"); + ccLang.get().addDefault("SHOP.FLAGS_ITEM", "§e - {flag}"); + ccLang.get().addDefault("SHOP.SHOP_BAL_INF", "§fUnlimited"); + ccLang.get().addDefault("SHOP.SHOP_BAL", "§fShop account balance"); + ccLang.get().addDefault("SHOP.SHOP_LOCATION", "§fShop location: x {x}, y {y}, z {z}"); + ccLang.get().addDefault("SHOP.SHOP_LOCATION_B", "§fShop location: "); + ccLang.get().addDefault("SHOP.SHOP_INFO_DASH", "§7 - "); + ccLang.get().addDefault("SHOP.DISABLED", "§cDisabled§8|§f"); + ccLang.get().addDefault("SHOP.INCOMPLETE_DATA", "INCOMPLETE DATA"); + ccLang.get().addDefault("SHOP.INCOMPLETE_DATA_Lore", "This item is not visible\nto non-op users.\nIndex: "); + ccLang.get().addDefault("SHOP.TRADE_LIMIT_BUY", "§aPurchase limit: {num}left"); + ccLang.get().addDefault("SHOP.TRADE_LIMIT_SELL", "§aSales limit: {num}left"); + ccLang.get().addDefault("SHOP.TRADE_LIMIT_TIMER", "§aNext reset: {time}"); + ccLang.get().addDefault("SHOP.CLICK_TO_ADD", "§eClick: Add"); + + ccLang.get().addDefault("SHOP_SETTING_TITLE", "§3Shop Settings"); + ccLang.get().addDefault("SHOP_SETTING.LOG_TOGGLE_LORE", "§eRMB: Log Viewer"); + ccLang.get().addDefault("SHOP_SETTING.LOG_PRINT_CONSOLE", "§fPrint log to console"); + ccLang.get().addDefault("SHOP_SETTING.LOG_PRINT_ADMIN", "§fPrint log to admin"); + ccLang.get().addDefault("SHOP_SETTING.MAX_PAGE", "§fMax page"); + ccLang.get().addDefault("SHOP_SETTING.MAX_PAGE_LORE", "§fSets the maximum page for the shop."); + ccLang.get().addDefault("SHOP_SETTING.BACKGROUND", "§fBackground color"); + ccLang.get().addDefault("SHOP_SETTING.BACKGROUND_LORE", "§eClick: Change color"); + ccLang.get().addDefault("SHOP_SETTING.L_R_SHIFT", "§eLMB: -1 RMB: +1 Shift: x5"); + ccLang.get().addDefault("SHOP_SETTING.FLAG", "§fFlag"); + ccLang.get().addDefault("SHOP_SETTING.SHOP_SETTINGS_LORE", "§eRMB: Shop Settings"); + ccLang.get().addDefault("SHOP_SETTING.SIGN_SHOP_LORE", "§fOnly accessible via sign."); + ccLang.get().addDefault("SHOP_SETTING.LOCAL_SHOP_LORE", "§fMust visit actual store locations."); + ccLang.get().addDefault("SHOP_SETTING.DELIVERY_CHARGE_LORE", "§fYou can pay for delivery without \n§fhaving to go to the shop location to transact."); + ccLang.get().addDefault("SHOP_SETTING.SELECTED", "§2Selected"); + ccLang.get().addDefault("SHOP_SETTING.CURRENCY", "§fCurrency Type: "); + ccLang.get().addDefault("SHOP_SETTING.VAULT_LORE", "§fThis is the default."); + ccLang.get().addDefault("SHOP_SETTING.EXP_LORE", "§fTrade with the player's experience points."); + ccLang.get().addDefault("SHOP_SETTING.JOB_POINT_LORE", "§fTrade with job points. \n§fRequires 'Jobs Reborn' plugin"); + ccLang.get().addDefault("SHOP_SETTING.PLAYER_POINT_LORE", "§fTrade with player points. \n§fRequires 'Player point' plugin"); + ccLang.get().addDefault("SHOP_SETTING.SHOW_VALUE_CHANGE_LORE", "§fShows the amount of change in price."); + ccLang.get().addDefault("SHOP_SETTING.HIDE_STOCK", "§fHide stock."); + ccLang.get().addDefault("SHOP_SETTING.HIDE_PRICING_TYPE", "§fHide price type."); + ccLang.get().addDefault("SHOP_SETTING.HIDE_SHOP_BALANCE", "§fHide shop account balance."); + ccLang.get().addDefault("SHOP_SETTING.SHOW_MAX_STOCK", "§fShow max stock."); + ccLang.get().addDefault("SHOP_SETTING.HIDDEN_IN_COMMAND", "§fDon't show this store\n§fin command autocomplete."); + ccLang.get().addDefault("SHOP_SETTING.INTEGER_ONLY", "§fThe purchase price will be rounded up.\n§fThe sale price will be rounded down."); + ccLang.get().addDefault("SHOP_SETTING.PERMISSION", "§fPermission"); + ccLang.get().addDefault("SHOP_SETTING.STATE", "§fState"); + ccLang.get().addDefault("SHOP_SETTING.STATE_ENABLE", "§aEnable"); + ccLang.get().addDefault("SHOP_SETTING.STATE_DISABLE", "§cDisable"); + ccLang.get().addDefault("SHOP_SETTING.ROTATION_EDITOR", "§fRotation: "); + ccLang.get().addDefault("SHOP_SETTING.ROTATION_EDITOR_LORE", "§eClick: Rotation editor"); + ccLang.get().addDefault("SHOP_SETTING.COMMAND_TOGGLE", "§fCommand"); + ccLang.get().addDefault("SHOP_SETTING.COMMAND_TOGGLE_LORE", "§fExecutes server commands\n§fwhen a store transaction occurs."); + ccLang.get().addDefault("SHOP_SETTING.COMMAND_SELL", "§fSell Command"); + ccLang.get().addDefault("SHOP_SETTING.COMMAND_BUY", "§fBuy Command"); + ccLang.get().addDefault("SHOP_SETTING.COMMAND_LORE1", "§eLMB: Set"); + ccLang.get().addDefault("SHOP_SETTING.COMMAND_LORE3", "§eShift RMB: Delete last item"); + ccLang.get().addDefault("SHOP_SETTING.TRADE_UI", "§fEdit Trade UI"); + ccLang.get().addDefault("SHOP_SETTING.TRADE_UI_LORE_2", "§eLMB: Edit\n§eRMB: Reset"); + + ccLang.get().addDefault("ROTATION_EDITOR_TITLE", "§3Rotation Editor"); + ccLang.get().addDefault("ROTATION_EDITOR.ENABLED", "§aEnabled"); + ccLang.get().addDefault("ROTATION_EDITOR.DISABLED", "§cDisabled"); + ccLang.get().addDefault("ROTATION_EDITOR.CLICK_TO_ENABLE", "§eLMB: Enable"); + ccLang.get().addDefault("ROTATION_EDITOR.CLICK_TO_DISABLE", "§eLMB: Disable"); + ccLang.get().addDefault("ROTATION_EDITOR.CURRENT_TIME", "§fCurrent time: "); + ccLang.get().addDefault("ROTATION_EDITOR.CURRENTLY_IN_USE", "§a[Currently in use]"); + ccLang.get().addDefault("ROTATION_EDITOR.NEXT_ROTATION", "§fNext rotation: "); + ccLang.get().addDefault("ROTATION_EDITOR.PERIOD", "§fPeriod"); + ccLang.get().addDefault("ROTATION_EDITOR.PERIOD_LORE_V2", "§eLMB: -1h, RMB: +1h, Shift: x10"); + ccLang.get().addDefault("ROTATION_EDITOR.TIMER", "§fTimer adjustment"); + ccLang.get().addDefault("ROTATION_EDITOR.TIMER_LORE_V2", "§eLMB: -10m, RMB: +10m, Shift: x6"); + ccLang.get().addDefault("ROTATION_EDITOR.HOUR", "§f{0}hours"); + ccLang.get().addDefault("ROTATION_EDITOR.UNSAVED_CHANGES", "§c§oUnsaved changes"); + ccLang.get().addDefault("ROTATION_EDITOR.APPLY_CHANGES", "§fApply changes"); + ccLang.get().addDefault("ROTATION_EDITOR.APPLY_CHANGES_LORE", "§eLMB: Save changes\n§eRMB: Reset Changes"); + ccLang.get().addDefault("ROTATION_EDITOR.APPLY_ROTATION", "§eLMB: Apply now"); + ccLang.get().addDefault("ROTATION_EDITOR.OPEN", "§eLMB: Open"); + ccLang.get().addDefault("ROTATION_EDITOR.CREATE", "§eLMB: Create empty"); + ccLang.get().addDefault("ROTATION_EDITOR.COPY_AS_NEW", "§eRMB: Copy as new"); + ccLang.get().addDefault("ROTATION_EDITOR.DELETE", "§eShift RMB: §cDelete"); + ccLang.get().addDefault("ROTATION_EDITOR.REAPPLY", "§eShift LMB: Reapply"); + ccLang.get().addDefault("ROTATION_EDITOR.MOVE", "§eRMB: Move"); + + ccLang.get().addDefault("ITEM_SETTING_TITLE", "§3Item Settings"); + ccLang.get().addDefault("ITEM_SETTING.VALUE_BUY", "§fPurchase value: "); + ccLang.get().addDefault("ITEM_SETTING.VALUE_SELL", "§fSales value: "); + ccLang.get().addDefault("ITEM_SETTING.PRICE", "§fBuy: "); + ccLang.get().addDefault("ITEM_SETTING.SELL_PRICE", "§fSell: "); + ccLang.get().addDefault("ITEM_SETTING.PRICE_MIN", "§fMinimum price: "); + ccLang.get().addDefault("ITEM_SETTING.PRICE_MAX", "§fMaximum price: "); + ccLang.get().addDefault("ITEM_SETTING.MEDIAN", "§fMedian: "); + ccLang.get().addDefault("ITEM_SETTING.STOCK", "§fStock: "); + ccLang.get().addDefault("ITEM_SETTING.MAX_STOCK", "§fMax stock: "); + ccLang.get().addDefault("ITEM_SETTING.MAX_STOCK_LORE", "§fIf the stock exceeds this,\n§fthe shop will refuse to purchase."); + ccLang.get().addDefault("ITEM_SETTING.INF_STOCK", "Infinite stock"); + ccLang.get().addDefault("ITEM_SETTING.STATIC_PRICE", "Fixed price"); + ccLang.get().addDefault("ITEM_SETTING.UNLIMITED", "Unlimited"); + ccLang.get().addDefault("ITEM_SETTING.MEDIAN_HELP", "§fThe smaller the median,\n§fthe steeper the price change."); + ccLang.get().addDefault("ITEM_SETTING.TAX_IGNORED", "Sales tax settings are ignored."); + ccLang.get().addDefault("ITEM_SETTING.RECOMMEND", "§fApply recommended values"); + ccLang.get().addDefault("ITEM_SETTING.DISCOUNT", "§fDiscount"); + ccLang.get().addDefault("ITEM_SETTING.DISCOUNT_LORE", "§fDiscount rate: {num}%\n§eLMB: +10, RMB: -10"); + ccLang.get().addDefault("ITEM_SETTING.DISCOUNT_LORE_2", "§fDiscount rate: {num}%\n§eLMB: -10, RMB: +10"); + ccLang.get().addDefault("ITEM_SETTING.DONE", "§fDone"); + ccLang.get().addDefault("ITEM_SETTING.DONE_LORE", "§fDone!"); + ccLang.get().addDefault("ITEM_SETTING.ROUND_DOWN", "§fRound down"); + ccLang.get().addDefault("ITEM_SETTING.SET_TO_MEDIAN", "§fSet to median"); + ccLang.get().addDefault("ITEM_SETTING.SET_TO_STOCK", "§fSet to stock"); + ccLang.get().addDefault("ITEM_SETTING.SET_TO_VALUE", "§fSet to value"); + ccLang.get().addDefault("ITEM_SETTING.CLOSE", "§fClose"); + ccLang.get().addDefault("ITEM_SETTING.CLOSE_LORE", "§f§nClick: Close"); + ccLang.get().addDefault("ITEM_SETTING.REMOVE", "§cRemove"); + ccLang.get().addDefault("ITEM_SETTING.REMOVE_LORE", "§fRemove this item from the shop."); + ccLang.get().addDefault("ITEM_SETTING.BUY", "§3§lBuy: {num}"); + ccLang.get().addDefault("ITEM_SETTING.SELL", "§3§lSell: {num}"); + ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_SELL", "§fSales limit per player"); + ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_SELL_LORE", "§f{num}\n§eLMB: -1, RMB: +1, Shift = x10"); + ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_BUY", "§fPurchase limit per player"); + ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_BUY_LORE", "§f{num}\n§eLMB: -1, RMB: +1, Shift = x10"); + ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_INTERVAL", "§fTrading volume limit reset cycle"); + ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_INTERVAL_LORE", "§fInterval: {interval}\n§fNext reset: {time}\n§eLMB: -1h, RMB: +1h, Shift = x12"); + ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_TIMER", "§fAdjust Timer"); + ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_TIMER_LORE", "§f{num}\n§fNext reset: {time}\n§eLMB: -1h, RMB: +1h, Shift = x12"); + + ccLang.get().addDefault("TRADE_TITLE", "§3Trade"); + ccLang.get().addDefault("TRADE.TOGGLE_SELLABLE", "§eClick: Sale only toggle"); + ccLang.get().addDefault("TRADE.TOGGLE_BUYABLE", "§eClick: Purchase Only Toggle"); + ccLang.get().addDefault("TRADE.BUY_ONLY_LORE", "§fThis item cannot be sold."); + ccLang.get().addDefault("TRADE.SELL_ONLY_LORE", "§fThis item cannot be purchased."); + ccLang.get().addDefault("TRADE.BALANCE", "§3My balance"); + ccLang.get().addDefault("TRADE.PRICE", "§fBuy: {num}"); + ccLang.get().addDefault("TRADE.SELL_PRICE", "§fSell: {num}"); + ccLang.get().addDefault("TRADE.PRICE_DISCOUNTED", "§fBuy: §8§m{num}§r §a{num2}"); + ccLang.get().addDefault("TRADE.SELL_PRICE_DISCOUNTED", "§fSell: §8§m{num}§r §c{num2}"); + ccLang.get().addDefault("TRADE.PRICE_EXP", "§fBuy: {num}EXP"); + ccLang.get().addDefault("TRADE.SELL_PRICE_EXP", "§fSell: {num}EXP"); + ccLang.get().addDefault("TRADE.PRICE_DISCOUNTED_EXP", "§fBuy: §8§m{num}EXP§r §a{num2}EXP"); + ccLang.get().addDefault("TRADE.SELL_PRICE_DISCOUNTED_EXP", "§fSell: §8§m{num}EXP§r §c{num2}EXP"); + ccLang.get().addDefault("TRADE.PRICE_PP", "§fBuy: {num}PP"); + ccLang.get().addDefault("TRADE.SELL_PRICE_PP", "§fSell: {num}PP"); + ccLang.get().addDefault("TRADE.PRICE_DISCOUNTED_PP", "§fBuy: §8§m{num}PP§r §a{num2}PP"); + ccLang.get().addDefault("TRADE.SELL_PRICE_DISCOUNTED_PP", "§fSell: §8§m{num}PP§r §c{num2}PP"); + ccLang.get().addDefault("TRADE.PRICE_JP", "§fBuy: {num}JP"); + ccLang.get().addDefault("TRADE.SELL_PRICE_JP", "§fSell: {num}JP"); + ccLang.get().addDefault("TRADE.PRICE_DISCOUNTED_JP", "§fBuy: §8§m{num}JP§r §a{num2}JP"); + ccLang.get().addDefault("TRADE.SELL_PRICE_DISCOUNTED_JP", "§fSell: §8§m{num}JP§r §c{num2}JP"); + ccLang.get().addDefault("TRADE.BUY", "§cBuy"); + ccLang.get().addDefault("TRADE.SELL", "§2Sell"); + ccLang.get().addDefault("TRADE.STOCK", "§8Stock: "); + ccLang.get().addDefault("TRADE.STACKS", "§8{num} Stacks"); + ccLang.get().addDefault("TRADE.INF_STOCK", "§8Infinite"); + ccLang.get().addDefault("TRADE.SHOP_BAL_INF", "§fUnlimited"); + ccLang.get().addDefault("TRADE.SHOP_BAL", "§3Shop account balance \n§f{num}"); + ccLang.get().addDefault("TRADE.CLICK_TO_BUY", "§c§nClick: Buy {amount}"); + ccLang.get().addDefault("TRADE.CLICK_TO_SELL", "§2§nClick: Sell {amount}"); + ccLang.get().addDefault("TRADE.PURCHASE_LIMIT_PER_PLAYER", "§aPurchase limit: {num}left\n§aNext reset: {time}"); + ccLang.get().addDefault("TRADE.SALES_LIMIT_PER_PLAYER", "§aSales limit: {num}left\n§aNext reset: {time}"); + ccLang.get().addDefault("TRADE.QUANTITY_LORE", "§eShift RMB: Edit Quantity"); + ccLang.get().addDefault("TRADE.WAIT_FOR_INPUT", "Enter the quantity that will be displayed in the Trade UI.\nExample: 1,2,4,8,16,32,64"); + + ccLang.get().addDefault("PAGE_EDITOR_TITLE", "§3Page Editor"); + ccLang.get().addDefault("PAGE_EDITOR.PREV", "§f<<"); + ccLang.get().addDefault("PAGE_EDITOR.NEXT", "§f>>"); + ccLang.get().addDefault("PAGE_EDITOR.PAGE_SWAP_SUCCESS", "§fThe page has been replaced."); + ccLang.get().addDefault("PAGE_EDITOR.PAGE_SWAP_FAIL", "§fPage replacement failed."); + ccLang.get().addDefault("PAGE_EDITOR.PAGE_SWAP_SELECTED", "§fPage has been selected. Right-click on the other pages to be replaced."); + ccLang.get().addDefault("PAGE_EDITOR.PAGE_LORE_PREMIUM", "§eLMB: Open page\n§eRMB: Swap\n§eShift LMB: Insert\n§eShift RMB: Delete"); + ccLang.get().addDefault("PAGE_EDITOR.PRICE", "§fBuy: {num}"); + ccLang.get().addDefault("PAGE_EDITOR.SELL_PRICE", "§fSell: {num}"); + ccLang.get().addDefault("PAGE_EDITOR.STOCK", "§8Stock: {num}"); + ccLang.get().addDefault("PAGE_EDITOR.STACKS", "§8{num} Stakcs"); + ccLang.get().addDefault("PAGE_EDITOR.STATIC_PRICE", "§8[Fixed price]"); + ccLang.get().addDefault("PAGE_EDITOR.EMPTY", "§8(empty)"); + ccLang.get().addDefault("PAGE_EDITOR.EMPTY_SLOT_LORE", "§eLMB,RMB: Push\n§e+Shift: Pull"); + + ccLang.get().addDefault("LOG_VIEWER_TITLE", "§3Log Viewer"); + ccLang.get().addDefault("LOG_VIEWER.DATE", "§fDate: "); + ccLang.get().addDefault("LOG_VIEWER.TIME", "§fTime: "); + ccLang.get().addDefault("LOG_VIEWER.CURRENCY", "§fCurrency: "); + ccLang.get().addDefault("LOG_VIEWER.PRICE", "§fPrice: "); + ccLang.get().addDefault("LOG_VIEWER.EXPAND", "§fExpand"); + ccLang.get().addDefault("LOG_VIEWER.COLLAPSE", "§fCollapse"); + ccLang.get().addDefault("LOG_VIEWER.PAGE_TITLE", "§f{curPage}/{maxPage} Page"); + ccLang.get().addDefault("LOG_VIEWER.PAGE_LORE", "§eLMB: Prev\n§eRMB: Next"); + ccLang.get().addDefault("LOG_VIEWER.FILE_LORE", "§eLMB: Open\n§eShift RMB: §cDelete"); + + ccLang.get().addDefault("LOG.LOG", "§fLog"); + ccLang.get().addDefault("LOG.CLEAR", "§fLog deleted"); + ccLang.get().addDefault("LOG.SAVE", "§fLog saved"); + ccLang.get().addDefault("LOG.DELETE", "§4Delete log"); + ccLang.get().addDefault("LOG.SELL", "§f{player} sells {amount} {item} to {shop}"); + ccLang.get().addDefault("LOG.BUY", "§f{player} buys {amount} {item} from {shop}"); + + ccLang.get().addDefault("STOCK_SIMULATOR_TITLE", "§3Stock Simulator"); + ccLang.get().addDefault("STOCK_SIMULATOR.CHANGE_SAMPLE_LORE", "§eLMB, RMB: Change Item"); + ccLang.get().addDefault("STOCK_SIMULATOR.SIMULATOR_BUTTON_LORE", "§eRMB: Simulator"); + ccLang.get().addDefault("STOCK_SIMULATOR.RUN_TITLE", "§fRun"); + ccLang.get().addDefault("STOCK_SIMULATOR.RUN_LORE", "§eLMB: Run simulation\n§eRMB: Apply the settings to the shop\n§fItems are not affected."); + ccLang.get().addDefault("STOCK_SIMULATOR.REAL_TIME", "§a(real time)"); + ccLang.get().addDefault("STOCK_SIMULATOR.AFTER_S", "§aAfter {0} seconds"); + ccLang.get().addDefault("STOCK_SIMULATOR.AFTER_M", "§aAfter {0} minutes"); + ccLang.get().addDefault("STOCK_SIMULATOR.AFTER_H", "§aAfter {0} hours"); + ccLang.get().addDefault("STOCK_SIMULATOR.AFTER_D", "§aAfter {0} days"); + ccLang.get().addDefault("STOCK_SIMULATOR.L_R_SHIFT", "§eLMB: -1 RMB: +1 Shift: x5"); + ccLang.get().addDefault("STOCK_SIMULATOR.PRICE", "§fPurchase price: {num}"); + ccLang.get().addDefault("STOCK_SIMULATOR.MEDIAN", "§fMedian: {num}"); + ccLang.get().addDefault("STOCK_SIMULATOR.STOCK", "§fStock: {num}"); + + ccLang.get().addDefault("PALETTE_TITLE", "§3Select item to sell"); + ccLang.get().addDefault("PALETTE_TITLE2", "§3Select item"); + ccLang.get().addDefault("PALETTE.LORE_PREMIUM", "§eLMB: Add\n§eShift LMB: Add after setting\n§eRMB: Add as decoration\n§eShift RMB: Search '{item}'"); + ccLang.get().addDefault("PALETTE.LORE2", "§eLMB: Select\n§eShift RMB: Search '{item}'"); + ccLang.get().addDefault("PALETTE.SEARCH", "§fSearch"); + ccLang.get().addDefault("PALETTE.ADD_ALL", "§fAdd all"); + ccLang.get().addDefault("PALETTE.ADD_ALL_LORE", "§eLMB: Add all\n§eShift LMB: Add all and apply recommended values"); + ccLang.get().addDefault("PALETTE.PAGE_TITLE", "§f{curPage}/{maxPage} page"); + ccLang.get().addDefault("PALETTE.PAGE_LORE", "§f§nLMB: Prev\n§f§nRMB: Next"); + ccLang.get().addDefault("PALETTE.FILTER_APPLIED", "§fFilter Applied : "); + ccLang.get().addDefault("PALETTE.FILTER_LORE", "§eLMB: Search\n§eRMB: Clear filter\n\n§7Example for finding \"BLUE_WOOL\":\n§7 b w\n§7 wool\n§7 blue wool"); + + ccLang.get().addDefault("QUICK_SELL_TITLE", "§3Quick Sell"); + ccLang.get().addDefault("QUICK_SELL.GUIDE_TITLE", "§3§lQuick Sell Guide"); + ccLang.get().addDefault("QUICK_SELL.GUIDE_LORE", "§aLeft-click the item you want to sell.\n§aShift left click to sell all items of the same type.\n§aRight-click to go to the item shop."); + + ccLang.get().addDefault("ARROW.UP", "§a⬆"); + ccLang.get().addDefault("ARROW.DOWN", "§c⬇"); + ccLang.get().addDefault("ARROW.UP_2", "§c⬆"); + ccLang.get().addDefault("ARROW.DOWN_2", "§a⬇"); + + ccLang.get().addDefault("TIME.OPEN", "Open"); + ccLang.get().addDefault("TIME.CLOSE", "Close"); + ccLang.get().addDefault("TIME.OPEN_LORE", "§fSet opening time"); + ccLang.get().addDefault("TIME.CLOSE_LORE", "§fSet closing time"); + ccLang.get().addDefault("TIME.SHOPHOURS", "§fOpening hours"); + ccLang.get().addDefault("TIME.OPEN24", "Open 24 hours"); + ccLang.get().addDefault("TIME.SHOP_IS_CLOSED", "§fThe shop is closed. It opens at {time} o'clock. {curTime} o'clock now."); + ccLang.get().addDefault("TIME.SET_SHOPHOURS", "Set business hours"); + ccLang.get().addDefault("TIME.CUR", "§fCurrent time: {time}h"); + + ccLang.get().addDefault("STOCK_STABILIZING.SS", "§fStock stabilization"); + ccLang.get().addDefault("STOCK_STABILIZING.L_R_SHIFT", "§eLMB: -0.1 RMB: +0.1 Shift: x5"); + ccLang.get().addDefault("STOCK_STABILIZING.STRENGTH_LORE_A", "§fn% of median"); + ccLang.get().addDefault("STOCK_STABILIZING.STRENGTH_LORE_B", "§fn% of the gap with median"); + + ccLang.get().addDefault("FLUCTUATION.FLUCTUATION", "§fStock fluctuation"); + ccLang.get().addDefault("FLUCTUATION.INTERVAL", "§fInterval"); + ccLang.get().addDefault("FLUCTUATION.INTERVAL_LORE", "§f1h = 1000ticks = real time 50s"); + ccLang.get().addDefault("FLUCTUATION.STRENGTH", "§fStrength"); + ccLang.get().addDefault("FLUCTUATION.STRENGTH_LORE", "§fn% of median"); + + ccLang.get().addDefault("TAX.SALES_TAX", "§fSales tax"); + ccLang.get().addDefault("TAX.USE_GLOBAL", "Use global settings ({tax}%)"); + ccLang.get().addDefault("TAX.USE_LOCAL", "Set separately"); + + ccLang.get().addDefault("MESSAGE.SEARCH_ITEM", "§fEnter the name of the item you are looking for."); + ccLang.get().addDefault("MESSAGE.SEARCH_CANCELED", "§fSearch Canceled."); + ccLang.get().addDefault("MESSAGE.INPUT_CANCELED", "§fInput canceled."); + ccLang.get().addDefault("MESSAGE.DELETE_CONFIRM", "§fAre you sure you want to delete the page? Enter 'delete' to delete."); + ccLang.get().addDefault("MESSAGE.CANT_DELETE_LAST_PAGE", "§fThe last remaining page cannot be deleted."); + ccLang.get().addDefault("MESSAGE.SHOP_BAL_LOW", "§fThe shop doesn't have enough money."); + ccLang.get().addDefault("MESSAGE.SHOP_CREATED", "§fShop created!"); + ccLang.get().addDefault("MESSAGE.SHOP_DELETED", "§fShop deleted!"); + ccLang.get().addDefault("MESSAGE.OUT_OF_STOCK", "§fOut of stock!"); + ccLang.get().addDefault("MESSAGE.BUY_SUCCESS", "§fBought {item} x{amount} for {price}. Balance: {bal}"); + ccLang.get().addDefault("MESSAGE.SELL_SUCCESS", "§fSold {item} x{amount} for {price}. Balance: {bal}"); + ccLang.get().addDefault("MESSAGE.BUY_SUCCESS_EXP", "§fBought {item} x{amount} for {price}Exp Points. Balance: {bal}"); + ccLang.get().addDefault("MESSAGE.SELL_SUCCESS_EXP", "§fSold {item} x{amount} for {price}Exp Points. Balance: {bal}"); + ccLang.get().addDefault("MESSAGE.BUY_SUCCESS_JP", "§fBought {item} x{amount} for {price}points. Remaining points: {bal}"); + ccLang.get().addDefault("MESSAGE.SELL_SUCCESS_JP", "§fSold {item} x{amount} for {price}points. Remaining points: {bal}"); + ccLang.get().addDefault("MESSAGE.BUY_SUCCESS_PP", "§fBought {item} x{amount} for {price}points. Remaining points: {bal}"); + ccLang.get().addDefault("MESSAGE.SELL_SUCCESS_PP", "§fSold {item} x{amount} for {price}points. Remaining points: {bal}"); + ccLang.get().addDefault("MESSAGE.QSELL_NA", "§fThere is no shop that handles this item."); + ccLang.get().addDefault("MESSAGE.DELIVERY_CHARGE", "§fDelivery fee: {fee}"); + ccLang.get().addDefault("MESSAGE.DELIVERY_CHARGE_NA", "§fIt cannot be delivered to another world."); + ccLang.get().addDefault("MESSAGE.NOT_ENOUGH_MONEY", "§fNot enough money. balance: {bal}"); + ccLang.get().addDefault("MESSAGE.NOT_ENOUGH_POINT", "§fNot enough points. balance: {bal}"); + ccLang.get().addDefault("MESSAGE.NOT_ENOUGH_PLAYER_POINT", "§fNot enough player points. balance: {bal}"); + ccLang.get().addDefault("MESSAGE.NOT_ENOUGH_EXP_POINT", "§fNot enough Exp points. balance: {bal}"); + ccLang.get().addDefault("MESSAGE.NO_ITEM_TO_SELL", "§fThere are no items for sale."); + ccLang.get().addDefault("MESSAGE.NO_ITEM_TO_SELL_2", "§fThere are no items available for sale."); + ccLang.get().addDefault("MESSAGE.INVENTORY_FULL", "§4There are no empty spaces in your inventory!"); + ccLang.get().addDefault("MESSAGE.IRREVERSIBLE", "§fThis action is irreversible!"); + ccLang.get().addDefault("MESSAGE.ITEM_ADDED", "Item added!"); + ccLang.get().addDefault("MESSAGE.ITEM_UPDATED", "Item updated!"); + ccLang.get().addDefault("MESSAGE.ITEM_DELETED", "Item deleted!"); + ccLang.get().addDefault("MESSAGE.CHANGES_APPLIED", "Changes applied. New values:"); + ccLang.get().addDefault("MESSAGE.CHANGES_APPLIED_2", "Changes applied"); + ccLang.get().addDefault("MESSAGE.RECOMMEND_APPLIED", "Recommended value applied. It is based on {playerNum}players. You can change this value in the config file."); + ccLang.get().addDefault("MESSAGE.TRANSFER_SUCCESS", "Remittance completed"); + ccLang.get().addDefault("MESSAGE.PURCHASE_REJECTED", "There are too many of these items in the shop. Can't sell it now."); + ccLang.get().addDefault("MESSAGE.CLICK_YOUR_ITEM_START_PAGE", "Click on an item in your inventory to find the shop with the best deal.\nLMB: Buy RMB: Sell"); + ccLang.get().addDefault("MESSAGE.MOVE_TO_BEST_SHOP_BUY", "Moved to the shop where you can buy {item} at the lowest price."); + ccLang.get().addDefault("MESSAGE.MOVE_TO_BEST_SHOP_SELL", "Moved to the shop where you can sell {item} at the highest price."); + ccLang.get().addDefault("MESSAGE.SHOP_IS_CLOSED_BY_ADMIN", "This shop is currently closed by the server administrator."); + ccLang.get().addDefault("MESSAGE.SHOP_DISABLED", "This shop is currently disabled. Non-admin users cannot use it. You can enable it in the shop settings."); + ccLang.get().addDefault("MESSAGE.ROTATION_SHARED_DATA_MISSING", "§e[ ! ]§fThe required data could not be found in '{0}/SharedData.yml' for {1} items. These items have been added as decoration."); + ccLang.get().addDefault("MESSAGE.ENTER_COMMAND", "Enter the command without '/'."); + ccLang.get().addDefault("MESSAGE.ENTER_COMMAND_2", "Enter in the form of 'index/command'."); + ccLang.get().addDefault("MESSAGE.SELL_COMMAND_CUR", "Sell commands currently in effect:"); + ccLang.get().addDefault("MESSAGE.BUY_COMMAND_CUR", "Buy commands currently in effect:"); + ccLang.get().addDefault("MESSAGE.Q_SEARCH_FAIL_CURRENCY", "This item is being traded in several currencies."); + + ccLang.get().addDefault("HELP.TITLE", "§fHelp: {command} --------------------"); + ccLang.get().addDefault("HELP.SHOP", "Open shop"); + ccLang.get().addDefault("HELP.CMD", "Toggle display of command help."); + ccLang.get().addDefault("HELP.CREATE_SHOP", "Create a new shop."); + ccLang.get().addDefault("HELP.CREATE_SHOP_2", "Permissions (can be changed later)\n true: dshop.user.shop.shopName\n false: Anyone can access (default)\n Arbitrary value: Requires permission"); + ccLang.get().addDefault("HELP.DELETE_SHOP", "Remove existing stores."); + ccLang.get().addDefault("HELP.SHOP_ADD_HAND", "Adds the item in hand to the shop."); + ccLang.get().addDefault("HELP.SHOP_ADD_ITEM", "Add item to the shop."); + ccLang.get().addDefault("HELP.SHOP_EDIT", "Edit item in the store."); + ccLang.get().addDefault("HELP.PRICE", "§7Price calculation formula: median*value/stock"); + ccLang.get().addDefault("HELP.INF_STATIC", "§7median<0 == Fixed price stock<0 == Infinite stock"); + ccLang.get().addDefault("HELP.EDIT_ALL", "Modify all items in the shop at once."); + ccLang.get().addDefault("HELP.RELOAD", "Reload the plugin."); + ccLang.get().addDefault("HELP.RELOADED", "Plugin reloaded"); + ccLang.get().addDefault("HELP.USAGE", "Usage"); + ccLang.get().addDefault("HELP.ITEM_ALREADY_EXIST", "§7§o{item} is already on sale.\n {info}\n Entering a command modifies the value."); + ccLang.get().addDefault("HELP.ITEM_INFO", "§7§o{item}'s current settings:\n {info}"); + ccLang.get().addDefault("HELP.REMOVE_ITEM", "§fEntering an argument of 0 will §4remove§f this item from the store."); + ccLang.get().addDefault("HELP.QSELL", "§fSell items quickly."); + ccLang.get().addDefault("HELP.DELETE_OLD_USER", "Delete long-term inactive user data"); + ccLang.get().addDefault("HELP.ACCOUNT", "Sets the account balance of the shop. -1 = unlimited"); + ccLang.get().addDefault("HELP.SET_TO_REC_ALL", "§cResets§e all item settings in the store to the recommended values."); + ccLang.get().addDefault("HELP.SHOP_ENABLE", "Enables or disables the shop."); + + ccLang.get().addDefault("ERR.NO_USER_ID", "§6Player uuid not found. Shop unavailable."); + ccLang.get().addDefault("ERR.ITEM_NOT_EXIST", "The item does not exist in the store."); + ccLang.get().addDefault("ERR.ITEM_FORBIDDEN", "This is a prohibited item."); + ccLang.get().addDefault("ERR.NO_PERMISSION", "§eYou do not have permission."); + ccLang.get().addDefault("ERR.WRONG_USAGE", "Incorrect command usage."); + ccLang.get().addDefault("ERR.NO_EMPTY_SLOT", "There is no empty space in the shop."); + ccLang.get().addDefault("ERR.WRONG_DATATYPE", "Invalid argument type"); + ccLang.get().addDefault("ERR.VALUE_ZERO", "The argument value must be greater than 0."); + ccLang.get().addDefault("ERR.WRONG_ITEM_NAME", "Invalid item name."); + ccLang.get().addDefault("ERR.HAND_EMPTY", "You must hold the item in your hand."); + ccLang.get().addDefault("ERR.HAND_EMPTY2", "§c§oYou must have the item in your hand!"); + ccLang.get().addDefault("ERR.SHOP_NOT_FOUND", "§fThe shop could not be found."); + ccLang.get().addDefault("ERR.SHOP_EXIST", "A store with that name already exists."); + ccLang.get().addDefault("ERR.SHOP_NOT_EXIST", "No shop with that name."); + ccLang.get().addDefault("ERR.SIGN_SHOP_REMOTE_ACCESS", "The shop is only accessible via sign."); + ccLang.get().addDefault("ERR.LOCAL_SHOP_REMOTE_ACCESS", "The shop can only be used by visiting it in person."); + ccLang.get().addDefault("ERR.MAX_LOWER_THAN_MIN", "The maximum price must be greater than the minimum price."); + ccLang.get().addDefault("ERR.DEFAULT_VALUE_OUT_OF_RANGE", "The base price must be between the minimum price and the maximum price."); + ccLang.get().addDefault("ERR.NO_RECOMMEND_DATA", "There is no information for this item in the Worth.yml file."); + ccLang.get().addDefault("ERR.JOBS_REBORN_NOT_FOUND", "Could not find 'Jobs reborn'."); + ccLang.get().addDefault("ERR.PLAYER_POINTS_NOT_FOUND", "Could not find 'Player points'."); + ccLang.get().addDefault("ERR.SHOP_HAS_INF_BAL", "{shop} is an infinite account store."); + ccLang.get().addDefault("ERR.SHOP_DIFF_CURRENCY", "The two stores use different currencies."); + ccLang.get().addDefault("ERR.PLAYER_NOT_EXIST", "The player could not be found."); + ccLang.get().addDefault("ERR.SHOP_LINK_FAIL", "Either store must be a real account."); + ccLang.get().addDefault("ERR.SHOP_LINK_TARGET_ERR", "The target store must have a real account."); + ccLang.get().addDefault("ERR.NESTED_STRUCTURE", "It is forbidden to build hierarchies. (ex. aa-bb, bb-cc)"); + ccLang.get().addDefault("ERR.CREATIVE", "§eYou cannot use this command in Creative mode. You do not have permission."); + ccLang.get().addDefault("ERR.FILE_CREATE_FAIL", "§eFile creation failed"); + ccLang.get().addDefault("ERR.INVALID_TRANSACTION", "This transaction is no longer valid. If this problem recurs, contact your server administrator"); + ccLang.get().addDefault("ERR.SIGN_WALL", "Sign must be placed on wall."); + + ccLang.get().addDefault("ERR.SHOP_NULL", "§eShop name cannot be null."); + ccLang.get().addDefault("ERR.ITEMINFO_HAND_EMPTY", "You need to hold an item."); + ccLang.get().addDefault("HELP.ITEMINFO_USAGE", "§fHold an item in your hand to learn about it."); + ccLang.get().addDefault("HELP.ITEMINFO_REALNAME", "§7Real name: §3{item_realname}"); + ccLang.get().addDefault("HELP.ITEMINFO_SIGN_NAME", "§7Sign name: §3{item_signname}"); + ccLang.get().addDefault("ERR.SIGN_ITEM_INVALID", "Invalid item. Use /ds iteminfo to find the name of the item on the sign."); + ccLang.get().addDefault("ERR.SIGN_ITEM_NOT_FOR_SALE", "First you must add the item in the shop and then use it on the sign."); + ccLang.get().addDefault("MESSAGE.SIGN_SHOP_CREATED", "§aSign Shop created!"); + + ccLang.get().addDefault("ON", "ON"); + ccLang.get().addDefault("OFF", "OFF"); + ccLang.get().addDefault("SET", "SET"); + ccLang.get().addDefault("UNSET", "UNSET"); + ccLang.get().addDefault("NULL", "Null"); + ccLang.get().addDefault("NULL(OPEN)", "None (open to all)"); + ccLang.get().addDefault("CUR_STATE", "Current Status"); + ccLang.get().addDefault("CLICK", "Click"); + ccLang.get().addDefault("LMB", "LMB"); + ccLang.get().addDefault("RMB", "RMB"); + ccLang.get().addDefault("CLOSE", "§fClose"); + ccLang.get().addDefault("CLOSE_LORE", "§f§nClick: Close"); + + ccLang.get().addDefault("EXP_POINTS", "Exp Points"); + ccLang.get().addDefault("JOB_POINTS", "Job Points"); + ccLang.get().addDefault("PLAYER_POINTS", "Player Points"); + + ccLang.get().options().copyDefaults(true); + ccLang.save(); + } + public static final Pattern HEX_PATTERN = Pattern.compile("(#[A-Fa-f0-9]{6})"); public static String t(Player player, String key) diff --git a/src/main/java/me/sat7/dynamicshop/utilities/LogUtil.java b/src/main/java/me/sat7/dynamicshop/utilities/LogUtil.java index 557878e..d747d64 100644 --- a/src/main/java/me/sat7/dynamicshop/utilities/LogUtil.java +++ b/src/main/java/me/sat7/dynamicshop/utilities/LogUtil.java @@ -26,17 +26,17 @@ private LogUtil() } - // <로그파일 경로 + 이름, 로그데이타> - public static final ConcurrentHashMap> log = new ConcurrentHashMap<>(); // 아직 파일에 저장되지 않은 로그들 // todo 서버가 꺼질때 저장해야함. + // <로그파일 경로 + 이름, 로그데이타> (<日誌檔案路徑 + 名稱, 日誌資料>) + public static final ConcurrentHashMap> log = new ConcurrentHashMap<>(); // 아직 파일에 저장되지 않은 로그들 // todo 서버가 꺼질때 저장해야함. (尚未儲存到檔案的日誌 // todo 伺服器關閉時需要儲存) - // 거래 로그 기록 + // 거래 로그 기록 (交易日誌紀錄) public static void addLog(String shopName, String itemName, int amount, double value, String curr, String player) { if (ConfigUtil.GetSaveLogs()) { CustomConfig data = ShopUtil.shopConfigFiles.get(shopName); - if (data.get().contains("Options.log") && data.get().getBoolean("Options.log")) // 옛날엔 이렇게 저장했음. + if (data.get().contains("Options.log") && data.get().getBoolean("Options.log")) // 옛날엔 이렇게 저장했음. (過去是這樣儲存的) { data.get().set("Options.log.active", true); } diff --git a/src/main/java/me/sat7/dynamicshop/utilities/SoundUtil.java b/src/main/java/me/sat7/dynamicshop/utilities/SoundUtil.java index 600d4f1..df7b91c 100644 --- a/src/main/java/me/sat7/dynamicshop/utilities/SoundUtil.java +++ b/src/main/java/me/sat7/dynamicshop/utilities/SoundUtil.java @@ -16,7 +16,7 @@ private SoundUtil() } - // 소리 재생 + // 소리 재생 (播放音效) public static void playerSoundEffect(Player player, String key) { try diff --git a/src/main/java/me/sat7/dynamicshop/utilities/TabCompleteUtil.java b/src/main/java/me/sat7/dynamicshop/utilities/TabCompleteUtil.java index ee05100..2c999ef 100644 --- a/src/main/java/me/sat7/dynamicshop/utilities/TabCompleteUtil.java +++ b/src/main/java/me/sat7/dynamicshop/utilities/TabCompleteUtil.java @@ -211,7 +211,7 @@ else if (cmd.getName().equalsIgnoreCase("shop") && args.length == 1) { int i = Integer.parseInt(s); if (!data.get().contains(s + ".value")) - continue; // 장식용임 + continue; // 장식용임 (裝飾用) temp.add(s + "/" + data.get().getString(s + ".mat")); } catch (Exception ignored) { @@ -574,11 +574,14 @@ else if (args.length == 5) } else if (args[0].equalsIgnoreCase("deleteOldUser")) { Help.showHelp("delete_old_user", (Player) sender, args); + } else { + Help.showHelp("main", (Player) sender, args); } return autoCompleteList; } - } catch (Exception e) + } + catch (Exception e) { return null; } diff --git a/src/main/java/me/sat7/dynamicshop/utilities/UserUtil.java b/src/main/java/me/sat7/dynamicshop/utilities/UserUtil.java index 0d56567..44f0754 100644 --- a/src/main/java/me/sat7/dynamicshop/utilities/UserUtil.java +++ b/src/main/java/me/sat7/dynamicshop/utilities/UserUtil.java @@ -12,7 +12,7 @@ public final class UserUtil { - public static CustomConfig ccUser = new CustomConfig(); // 가급적 save 호출 피할 것. onDisable 에서 처리함. + public static CustomConfig ccUser = new CustomConfig(); // 가급적 save 호출 피할 것. onDisable 에서 처리함. (盡量避免呼叫save。在onDisable中處理) public static final HashMap userTempData = new HashMap<>(); public static final HashMap userInteractItem = new HashMap<>(); @@ -36,7 +36,7 @@ private static void BackwardCompatibility() ConfigurationSection cs = ccUser.get().getConfigurationSection(s); if (cs != null) { - // 구버전에 있던 데이터를 삭제함. + // 구버전에 있던 데이터를 삭제함. (刪除舊版本中的資料) cs.set("tmpString", null); cs.set("interactItem", null); } @@ -104,9 +104,9 @@ public static void OnPluginDisable() // ---------------------------------------------------------------------- - // 구매 & 판매 수량 제한 - // - 상점의 데이터는 [상점+idx] 로 관리. - // - 유저의 데이터는 [상점+hash] 로 관리. + // 구매 & 판매 수량 제한 (購買 & 販賣 數量限制) + // - 상점의 데이터는 [상점+idx] 로 관리. (- 商店的資料以 [商店+idx] 方式管理) + // - 유저의 데이터는 [상점+hash] 로 관리. (- 使用者的資料以 [商店+hash] 方式管理) public static final HashMap>> tradingVolume = new HashMap<>(); public static void LoadTradeLimitDataFromYML() diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 2a4033d..c900131 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -32,4 +32,5 @@ Log.LogCullAgeMinutes: 7200 Log.LogCullTimeMinutes: 120 ShopYmlBackup.Enable: true ShopYmlBackup.IntervalMinutes: 60 -ShopYmlBackup.CullAgeMinutes: 300 \ No newline at end of file +ShopYmlBackup.CullAgeMinutes: 300 +DebugMode: false \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 7dd5050..0bc8bfd 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -4,7 +4,7 @@ main: me.sat7.dynamicshop.DynamicShop depend: [Vault] softdepend: [PlaceholderAPI, Jobs, LocaleLib, PlayerPoints] api-version: 1.16 -authors: [sat7, jpenilla, Multitallented, Chris6ix, KevinDaGame, FlorianKoerner, Kapitowa, LincolnJota] +authors: [sat7, jpenilla, Multitallented, Chris6ix, KevinDaGame, FlorianKoerner, Kapitowa, LincolnJota, CreamGod45] description: Full GUI shop with dynamic prices commands: DynamicShop: @@ -15,6 +15,57 @@ commands: sell: description: "Sell items" permissions: + dshop.admin.creative: + description: Allows users to use creative mode commands. + default: op + dshop.admin.remoteaccess: + description: Allows remote access to the shop. + default: op + dshop.admin.deleteOldUser: + description: Allows deletion of old user data. + default: op + dshop.admin.setdefaultshop: + description: Allows setting the default shop. + default: op + dshop.admin.settax: + description: Allows setting taxes for the shop. + default: op + dshop.admin.reload: + description: Allows reloading the plugin. + default: op + dshop.admin.createsign: + description: Allows creating shop signs. + default: op + dshop.admin.destroysign: + description: Allows destroying shop signs. + default: op + dshop.admin.createshop: + description: Allows creating a new shop. + default: op + dshop.admin.deleteshop: + description: Allows deleting a shop. + default: op + dshop.admin.mergeshop: + description: Allows merging shops. + default: op + dshop.admin.renameshop: + description: Allows renaming a shop. + default: op + dshop.admin.copyshop: + description: Allows copying a shop. + default: op + dshop.admin.shopedit: + description: Allows editing a shop. + default: op + dshop.admin.openshop: + description: Allows opening a shop. + default: op + dshop.admin.editall: + description: Allows editing all shops. + default: op + dshop.admin.iteminfo: + description: Allows viewing item information. + default: op dshop.use: description: Allows use of the /ds command default: true