From 521bf7faadfae2af740c3c08235aaeb7966a33c7 Mon Sep 17 00:00:00 2001 From: 7sat <49030779+7sat@users.noreply.github.com> Date: Tue, 7 Mar 2023 22:17:41 +0900 Subject: [PATCH] Discounts, various improvements and fixes [New Features] 1. Add item discount rate setting. 2. Add 'discount' to 'editAll' command. [improvement] 1. Improved so that changing the store name is also reflected on the start page. 2. Improved shop selection UI in the start page button editor. 3. Separate text keys for JobPoint and PlayerPoint. [bug fix] 1. (Premium) Fixed a problem where the unique name, description, and page count data of the rotation store did not respond correctly to the '/ds reload' command. 2. Fixed an issue where the stock-related text was displayed even when the 'hideStock' flag was enabled. Other minor fixes and improvements. --- pom.xml | 2 +- .../java/me/sat7/dynamicshop/DynaShopAPI.java | 4 +- .../java/me/sat7/dynamicshop/DynamicShop.java | 2 +- .../me/sat7/dynamicshop/commands/Reload.java | 3 +- .../sat7/dynamicshop/commands/RenameShop.java | 27 +++++- .../dynamicshop/commands/shop/EditAll.java | 23 ++++- .../me/sat7/dynamicshop/guis/ItemPalette.java | 4 +- .../sat7/dynamicshop/guis/ItemSettings.java | 83 ++++++++++++------- .../me/sat7/dynamicshop/guis/ItemTrade.java | 60 ++++++++++---- .../java/me/sat7/dynamicshop/guis/Shop.java | 34 +++++++- .../me/sat7/dynamicshop/guis/ShopList.java | 31 ++++++- .../me/sat7/dynamicshop/models/DSItem.java | 4 +- .../sat7/dynamicshop/transactions/Calc.java | 14 ++++ .../sat7/dynamicshop/transactions/Sell.java | 9 +- .../sat7/dynamicshop/utilities/LangUtil.java | 44 ++++++++++ .../dynamicshop/utilities/LayoutUtil.java | 14 ++-- .../sat7/dynamicshop/utilities/ShopUtil.java | 38 ++++++--- .../utilities/TabCompleteUtil.java | 4 +- 18 files changed, 313 insertions(+), 87 deletions(-) diff --git a/pom.xml b/pom.xml index 3d9fab1..f7e3f3c 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ me.sat7 DynamicShop - 3.11.2 + 3.12.0 jar DynamicShop diff --git a/src/main/java/me/sat7/dynamicshop/DynaShopAPI.java b/src/main/java/me/sat7/dynamicshop/DynaShopAPI.java index 30fed58..366adf7 100644 --- a/src/main/java/me/sat7/dynamicshop/DynaShopAPI.java +++ b/src/main/java/me/sat7/dynamicshop/DynaShopAPI.java @@ -103,9 +103,9 @@ public static void openItemPalette(Player player, int uiSubType, String shopName } // 아이탬 셋팅창 - public static void openItemSettingGui(Player player, String shopName, int shopSlotIndex, int tab, ItemStack itemStack, double buyValue, double sellValue, double minPrice, double maxPrice, int median, int stock, int maxStock) + public static void openItemSettingGui(Player player, String shopName, int shopSlotIndex, int tab, ItemStack itemStack, double buyValue, double sellValue, double minPrice, double maxPrice, int median, int stock, int maxStock, int discount) { - DSItem dsItem = new DSItem(itemStack, buyValue, sellValue, minPrice, maxPrice, median, stock, maxStock); + DSItem dsItem = new DSItem(itemStack, buyValue, sellValue, minPrice, maxPrice, median, stock, maxStock, discount); openItemSettingGui(player, shopName, shopSlotIndex, tab, dsItem); } diff --git a/src/main/java/me/sat7/dynamicshop/DynamicShop.java b/src/main/java/me/sat7/dynamicshop/DynamicShop.java index 7a6b84b..40ab480 100644 --- a/src/main/java/me/sat7/dynamicshop/DynamicShop.java +++ b/src/main/java/me/sat7/dynamicshop/DynamicShop.java @@ -452,7 +452,7 @@ private void InitConfig() ConfigUtil.Load(); - LangUtil.setupLangFile(ConfigUtil.GetLanguage()); + LangUtil.setupLangFile(ConfigUtil.GetLanguage()); // ConfigUtil.Load() 보다 밑에 있어야함. LayoutUtil.Setup(); setupUserFile(); diff --git a/src/main/java/me/sat7/dynamicshop/commands/Reload.java b/src/main/java/me/sat7/dynamicshop/commands/Reload.java index dd8b72b..019a75f 100644 --- a/src/main/java/me/sat7/dynamicshop/commands/Reload.java +++ b/src/main/java/me/sat7/dynamicshop/commands/Reload.java @@ -51,6 +51,7 @@ public void RunCMD(String[] args, CommandSender sender) SoundUtil.setupSoundFile(); ConfigUtil.Load(); + DynamicShop.plugin.PeriodicRepetitiveTask(); DynamicShop.plugin.startSaveLogsTask(); @@ -60,7 +61,7 @@ public void RunCMD(String[] args, CommandSender sender) QuickSell.quickSellGui.reload(); QuickSell.SetupQuickSellGUIFile(); - LangUtil.setupLangFile(ConfigUtil.GetLanguage()); + LangUtil.setupLangFile(ConfigUtil.GetLanguage()); // ConfigUtil.Load() 보다 밑에 있어야함. sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "HELP.RELOADED")); } diff --git a/src/main/java/me/sat7/dynamicshop/commands/RenameShop.java b/src/main/java/me/sat7/dynamicshop/commands/RenameShop.java index fbf8673..021c6eb 100644 --- a/src/main/java/me/sat7/dynamicshop/commands/RenameShop.java +++ b/src/main/java/me/sat7/dynamicshop/commands/RenameShop.java @@ -1,6 +1,8 @@ package me.sat7.dynamicshop.commands; +import me.sat7.dynamicshop.guis.StartPage; import org.bukkit.command.CommandSender; +import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import me.sat7.dynamicshop.DynamicShop; @@ -30,7 +32,7 @@ public void SendHelpMessage(Player player) @Override public void RunCMD(String[] args, CommandSender sender) { - if(!CheckValid(args, sender)) + if (!CheckValid(args, sender)) return; if (ShopUtil.shopConfigFiles.containsKey(args[1])) @@ -44,7 +46,28 @@ public void RunCMD(String[] args, CommandSender sender) String newName = args[2].replace("/", ""); ShopUtil.renameShop(args[1], newName); sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "MESSAGE.CHANGES_APPLIED") + newName); - } else + + ConfigurationSection cs = StartPage.ccStartPage.get().getConfigurationSection("Buttons"); + if (cs != null) + { + for (String c : cs.getKeys(false)) + { + String actionString = cs.getString(c + ".action"); + if (actionString == null || !actionString.contains(args[1]) || !actionString.contains("ds shop")) + continue; + + cs.set(c + ".action", actionString.replace(args[1], args[2])); + + String nameString = cs.getString(c + ".displayName"); + if (nameString == null || !nameString.contains(args[1])) + continue; + + cs.set(c + ".displayName", nameString.replace(args[1], args[2])); + } + StartPage.ccStartPage.save(); + } + } + else { sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "ERR.SHOP_NOT_FOUND")); } 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 353afd4..9e10e91 100644 --- a/src/main/java/me/sat7/dynamicshop/commands/shop/EditAll.java +++ b/src/main/java/me/sat7/dynamicshop/commands/shop/EditAll.java @@ -24,7 +24,7 @@ public EditAll() public void SendHelpMessage(Player player) { player.sendMessage(DynamicShop.dsPrefix(player) + t(player, "HELP.TITLE").replace("{command}", "editall")); - player.sendMessage(" - " + t(player, "HELP.USAGE") + ": ... editall <= | + | - | * | /> "); + player.sendMessage(" - " + t(player, "HELP.USAGE") + ": ... editall <= | + | - | * | /> "); player.sendMessage(" - " + t(player, "HELP.EDIT_ALL")); player.sendMessage(""); @@ -52,7 +52,7 @@ public void RunCMD(String[] args, CommandSender sender) try { dataType = args[3]; - if (!dataType.equals("stock") && !dataType.equals("median") && !dataType.equals("purchaseValue") && !dataType.equals("salesValue") && !dataType.equals("valueMin") && !dataType.equals("valueMax") && !dataType.equals("maxStock")) + if (!dataType.equals("stock") && !dataType.equals("median") && !dataType.equals("purchaseValue") && !dataType.equals("salesValue") && !dataType.equals("valueMin") && !dataType.equals("valueMax") && !dataType.equals("maxStock") && !dataType.equals("discount")) { sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "ERR.WRONG_DATATYPE")); return; @@ -72,6 +72,12 @@ public void RunCMD(String[] args, CommandSender sender) if (!args[5].equals("stock") && !args[5].equals("median") && !args[5].equals("purchaseValue") && !args[5].equals("salesValue") && !args[5].equals("valueMin") && !args[5].equals("valueMax") && !args[5].equals("maxStock")) newValue = Double.parseDouble(args[5]); + + if (args[3].equals("discount") && args[5].length() > 3) + { + sender.sendMessage(DynamicShop.dsPrefix(sender) + t(sender, "ERR.WRONG_DATATYPE")); + return; + } } catch (Exception e) { @@ -115,6 +121,9 @@ public void RunCMD(String[] args, CommandSender sender) case "maxStock": newValue = shopData.get().getInt(s + ".maxStock", -1); break; + case "discount": + newValue = shopData.get().getInt(s + ".discount", 0); + break; } if (newValue < 0) @@ -149,7 +158,7 @@ else if (mod.equalsIgnoreCase("*")) result = 0.01; } - if (dataType.equals("stock") || dataType.equals("median") || dataType.equals("maxStock")) + if (dataType.equals("stock") || dataType.equals("median") || dataType.equals("maxStock") || dataType.equals("discount")) { int intResult = (int)result; shopData.get().set(s + "." + dataType, intResult); @@ -172,6 +181,14 @@ else if (mod.equalsIgnoreCase("*")) { shopData.get().set(s + ".maxStock", null); } + if (shopData.get().getDouble(s + ".discount") > 90) + { + shopData.get().set(s + ".discount", 90); + } + if (shopData.get().getDouble(s + ".discount") <= 0) + { + shopData.get().set(s + ".discount", null); + } Double value2 = shopData.get().getDouble(s + ".value2"); if (value2 < 0 || value2.equals(shopData.get().getDouble(s + ".value"))) diff --git a/src/main/java/me/sat7/dynamicshop/guis/ItemPalette.java b/src/main/java/me/sat7/dynamicshop/guis/ItemPalette.java index be2f42b..3c1190e 100644 --- a/src/main/java/me/sat7/dynamicshop/guis/ItemPalette.java +++ b/src/main/java/me/sat7/dynamicshop/guis/ItemPalette.java @@ -432,7 +432,7 @@ private void OnClickItem(boolean isLeft, boolean isRight, boolean isShift, ItemS { if (isShift) { - DynaShopAPI.openItemSettingGui(player, shopName, shopSlotIndex,0, itemStack, 10, 10, 0.01, -1, 10000, 10000, -1); + DynaShopAPI.openItemSettingGui(player, shopName, shopSlotIndex,0, itemStack, 10, 10, 0.01, -1, 10000, 10000, -1, 0); } else { int targetSlotIdx = ShopUtil.findEmptyShopSlot(shopName, shopSlotIndex, true); @@ -491,7 +491,7 @@ private void OnClickUserItem(boolean isLeft, boolean isRight, ItemStack item) { if (isLeft) { - DynaShopAPI.openItemSettingGui(player, shopName, shopSlotIndex, 0, item, 10, 10, 0.01, -1, 10000, 10000, -1); + DynaShopAPI.openItemSettingGui(player, shopName, shopSlotIndex, 0, item, 10, 10, 0.01, -1, 10000, 10000, -1, 0); } else if (isRight) { ShopUtil.addItemToShop(shopName, shopSlotIndex, item, -1, -1, -1, -1, -1, -1); diff --git a/src/main/java/me/sat7/dynamicshop/guis/ItemSettings.java b/src/main/java/me/sat7/dynamicshop/guis/ItemSettings.java index 2298bc0..7c82c2f 100644 --- a/src/main/java/me/sat7/dynamicshop/guis/ItemSettings.java +++ b/src/main/java/me/sat7/dynamicshop/guis/ItemSettings.java @@ -31,9 +31,10 @@ public ItemSettings() private final int SAMPLE_ITEM = 0; private final int DONE = 8; - private final int CLOSE = 27; - private final int RECOMMEND = 31; - private final int REMOVE = 35; + private final int CLOSE = 45; + private final int DISCOUNT = 47; + private final int RECOMMEND = 49; + private final int REMOVE = 53; private final int BUY_VALUE = 1; private final int SELL_VALUE = 2; @@ -45,12 +46,12 @@ public ItemSettings() private final int TAB_START = BUY_VALUE; private final int TAB_END = MAX_STOCK; - private final int RESET = 13; - private final int ROUND_DOWN = 20; - private final int DIVIDE = 21; - private final int SHIFT = 22; - private final int MULTIPLY = 23; - private final int SET_TO_OTHER = 24; + private final int RESET = 22; + private final int ROUND_DOWN = 29; + private final int DIVIDE = 30; + private final int SHIFT = 31; + private final int MULTIPLY = 32; + private final int SET_TO_OTHER = 33; private Player player; private String shopName; @@ -65,6 +66,7 @@ public ItemSettings() private int median; private int stock; private int maxStock; + private int discount; private boolean oldSbSame; @@ -76,7 +78,7 @@ public Inventory getGui(Player player, String shopName, int shopSlotIndex, int t this.dsItem = dsItem; this.currentTab = Clamp(tab, TAB_START, TAB_END); - inventory = Bukkit.createInventory(player, 36, t(player, "ITEM_SETTING_TITLE") + "§7 | §8" + shopName); + inventory = Bukkit.createInventory(player, 54, t(player, "ITEM_SETTING_TITLE") + "§7 | §8" + shopName); String buyValueStr = t(null, "ITEM_SETTING.VALUE_BUY") + n(dsItem.getBuyValue()); String sellValueStr = t(null, "ITEM_SETTING.VALUE_SELL") + n(dsItem.getSellValue()); @@ -204,26 +206,26 @@ public Inventory getGui(Player player, String shopName, int shopSlotIndex, int t if (currentTab <= MAX_VALUE) { - CreateButton(9, white, "-100", editBtnLore); - CreateButton(10, white, "-10", editBtnLore); - CreateButton(11, white, "-1", editBtnLore); - CreateButton(12, white, "-0.1", editBtnLore); - CreateButton(14, white, "+0.1", editBtnLore); - CreateButton(15, white, "+1", editBtnLore); - CreateButton(16, white, "+10", editBtnLore); - CreateButton(17, white, "+100", editBtnLore); + CreateButton(18, white, "-100", editBtnLore); + CreateButton(19, white, "-10", editBtnLore); + CreateButton(20, white, "-1", editBtnLore); + CreateButton(21, white, "-0.1", editBtnLore); + CreateButton(23, white, "+0.1", editBtnLore); + CreateButton(24, white, "+1", editBtnLore); + CreateButton(25, white, "+10", editBtnLore); + CreateButton(26, white, "+100", editBtnLore); if (currentTab >= SELL_VALUE) CreateButton(SET_TO_OTHER, yellow, t(null, "ITEM_SETTING.SET_TO_VALUE"), editBtnLore); } else { - CreateButton(9, white, "-1000", editBtnLore); - CreateButton(10, white, "-100", editBtnLore); - CreateButton(11, white, "-10", editBtnLore); - CreateButton(12, white, "-1", editBtnLore); - CreateButton(14, white, "+1", editBtnLore); - CreateButton(15, white, "+10", editBtnLore); - CreateButton(16, white, "+100", editBtnLore); - CreateButton(17, white, "+1000", editBtnLore); + CreateButton(18, white, "-1000", editBtnLore); + CreateButton(19, white, "-100", editBtnLore); + CreateButton(20, white, "-10", editBtnLore); + CreateButton(21, white, "-1", editBtnLore); + CreateButton(23, white, "+1", editBtnLore); + CreateButton(24, white, "+10", editBtnLore); + CreateButton(25, white, "+100", editBtnLore); + CreateButton(26, white, "+1000", editBtnLore); if (currentTab == MEDIAN) CreateButton(SET_TO_OTHER, yellow, t(null, "ITEM_SETTING.SET_TO_STOCK"), editBtnLore); else if (currentTab == STOCK) CreateButton(SET_TO_OTHER, yellow, t(null, "ITEM_SETTING.SET_TO_MEDIAN"), editBtnLore); @@ -263,6 +265,12 @@ public Inventory getGui(Player player, String shopName, int shopSlotIndex, int t + "§7 " + dsItem.getStock() + stockChanged + sugMid; } + discount = dsItem.getDiscount(); + Material discountMat = discount == 0 ? Material.IRON_NUGGET : Material.GOLD_NUGGET; + int discountMatAmount = discount/10; + if (discountMatAmount < 1) + discountMatAmount = 1; + CreateButton(DISCOUNT, discountMat, t(player, "ITEM_SETTING.DISCOUNT"), t(player, "ITEM_SETTING.DISCOUNT_LORE").replace("{num}", discount+""), discountMatAmount); 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")); // 닫기 버튼 @@ -294,9 +302,10 @@ public void OnClickUpperInventory(InventoryClickEvent e) if (e.getSlot() == CLOSE) DynaShopAPI.openShopGui(player, shopName, shopSlotIndex / 45 + 1); else if (e.getSlot() == REMOVE) RemoveItem(); else if (e.getSlot() == RECOMMEND) SetToRecommend(); + else if (e.getSlot() == DISCOUNT) OnDiscountButtonClick(e.isLeftClick()); else if (e.getSlot() >= TAB_START && e.getSlot() <= TAB_END) ChangeTab(e.getSlot()); else if (e.getSlot() == RESET) Reset(); - else if (e.getSlot() >= 9 && e.getSlot() < 18) PlusMinus(e.isShiftClick(), e.getCurrentItem()); // RESET 이 13인것에 주의 + else if (e.getSlot() >= 18 && e.getSlot() < 27) PlusMinus(e.isShiftClick(), e.getCurrentItem()); // 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(); @@ -338,6 +347,7 @@ private void SaveSetting() if (-1 != existSlot) { ShopUtil.editShopItem(shopName, existSlot, buyValue, sellValue, minValue, maxValue, median, stock, maxStock); + ShopUtil.setDiscount(shopName,existSlot, discount); DynaShopAPI.openShopGui(player, shopName, existSlot / 45 + 1); SoundUtil.playerSoundEffect(player, "addItem"); } else @@ -350,6 +360,7 @@ private void SaveSetting() if (idx != -1) { ShopUtil.addItemToShop(shopName, idx, inventory.getItem(SAMPLE_ITEM), buyValue, sellValue, minValue, maxValue, median, stock, maxStock); + ShopUtil.setDiscount(shopName,existSlot, discount); DynaShopAPI.openShopGui(player, shopName, shopSlotIndex / 45 + 1); SoundUtil.playerSoundEffect(player, "addItem"); } @@ -364,6 +375,16 @@ private void RemoveItem() SoundUtil.playerSoundEffect(player, "deleteItem"); } + private void OnDiscountButtonClick(boolean isLeftClick) + { + if (isLeftClick) + discount += 10; + else + discount -= 10; + + RefreshWindow(); + } + private void SetToRecommend() { double worth = TryGetWorth(dsItem.getItemStack().getType().name()); @@ -378,7 +399,7 @@ private void SetToRecommend() player.sendMessage(DynamicShop.dsPrefix(player) + t(player, "MESSAGE.RECOMMEND_APPLIED").replace("{playerNum}", ConfigUtil.GetNumberOfPlayer() + "")); DynaShopAPI.openItemSettingGui(player, shopName, shopSlotIndex, currentTab, inventory.getItem(SAMPLE_ITEM), - worth, worth, minValue, maxValue, sugMid, sugMid, maxStock); + worth, worth, minValue, maxValue, sugMid, sugMid, maxStock, discount); } } @@ -612,12 +633,16 @@ private void ValueValidation() stock = -1; if (maxStock < -1) maxStock = -1; + if (discount < 0) + discount = 0; + if (discount > 90) + discount = 90; } private void RefreshWindow() { ValueValidation(); - DynaShopAPI.openItemSettingGui(player, shopName, shopSlotIndex, currentTab, inventory.getItem(SAMPLE_ITEM), buyValue, sellValue, minValue, maxValue, median, stock, maxStock); + DynaShopAPI.openItemSettingGui(player, shopName, shopSlotIndex, currentTab, inventory.getItem(SAMPLE_ITEM), buyValue, sellValue, minValue, maxValue, median, stock, maxStock, discount); SoundUtil.playerSoundEffect(player, "editItem"); } } diff --git a/src/main/java/me/sat7/dynamicshop/guis/ItemTrade.java b/src/main/java/me/sat7/dynamicshop/guis/ItemTrade.java index f10b387..36d3021 100644 --- a/src/main/java/me/sat7/dynamicshop/guis/ItemTrade.java +++ b/src/main/java/me/sat7/dynamicshop/guis/ItemTrade.java @@ -270,14 +270,44 @@ private void CreateTradeButtons(boolean sell) double price = Calc.calcTotalCost(shopName, tradeIdx, sell ? -amount : amount)[0]; String lore; String priceText; + + String currencyKey = ""; + if (shopData.contains("Options.flag.jobpoint")) + { + currencyKey = "_JP"; + } + else if (shopData.contains("Options.flag.playerpoint")) + { + currencyKey = "_PP"; + } + if (sell) { lore = l("TRADE_VIEW.SELL"); - priceText = t(player, "TRADE.SELL_PRICE").replace("{num}", n(price)); - } else + + if (shopData.contains(tradeIdx + ".discount")) + { + String original = n(price * 100 / (double) (100 - shopData.getInt(tradeIdx + ".discount"))); + priceText = t(player, "TRADE.SELL_PRICE_DISCOUNTED" + currencyKey).replace("{num}", original).replace("{num2}", n(price)); + } + else + { + priceText = t(player, "TRADE.SELL_PRICE" + currencyKey).replace("{num}", n(price)); + } + } + else { lore = l("TRADE_VIEW.BUY"); - priceText = t(player, "TRADE.PRICE").replace("{num}", n(price)); + + if (shopData.contains(tradeIdx + ".discount")) + { + String original = n(price * 100 / (double) (100 - shopData.getInt(tradeIdx + ".discount"))); + priceText = t(player, "TRADE.PRICE_DISCOUNTED" + currencyKey).replace("{num}", original).replace("{num2}", n(price)); + } + else + { + priceText = t(player, "TRADE.PRICE" + currencyKey).replace("{num}", n(price)); + } } if (!sell) @@ -299,23 +329,23 @@ private void CreateTradeButtons(boolean sell) { stockText = n(stock); } - } - String maxStockText; - if (shopData.contains("Options.flag.showmaxstock") && maxStock != -1) - { - if (ConfigUtil.GetDisplayStockAsStack()) + String maxStockText; + if (shopData.contains("Options.flag.showmaxstock") && maxStock != -1) { - maxStockText = t(player, "TRADE.STACKS").replace("{num}", n(maxStock / 64)); + if (ConfigUtil.GetDisplayStockAsStack()) + { + maxStockText = t(player, "TRADE.STACKS").replace("{num}", n(maxStock / 64)); + } else + { + maxStockText = n(maxStock); + } + + stockText = t(player, "SHOP.STOCK_2").replace("{stock}", stockText).replace("{max_stock}", maxStockText); } else { - maxStockText = n(maxStock); + stockText = t(player, "SHOP.STOCK").replace("{num}", stockText); } - - stockText = t(player, "SHOP.STOCK_2").replace("{stock}", stockText).replace("{max_stock}", maxStockText); - } else - { - stockText = t(player, "SHOP.STOCK").replace("{num}", stockText); } String deliveryChargeText = ""; diff --git a/src/main/java/me/sat7/dynamicshop/guis/Shop.java b/src/main/java/me/sat7/dynamicshop/guis/Shop.java index f2f982b..51d85f4 100644 --- a/src/main/java/me/sat7/dynamicshop/guis/Shop.java +++ b/src/main/java/me/sat7/dynamicshop/guis/Shop.java @@ -217,17 +217,44 @@ private void ShowItems() boolean showValueChange = shopData.contains("Options.flag.showvaluechange"); + String currencyKey = ""; + if (DynaShopAPI.isJobsPointShop(shopName)) + { + currencyKey = "_JP"; + } + else if (DynaShopAPI.isPlayerPointShop(shopName)) + { + currencyKey = "_PP"; + } + String buyText = ""; String sellText = ""; if (!tradeType.equalsIgnoreCase("SellOnly")) { - buyText = t(player, "SHOP.BUY_PRICE").replace("{num}", n(buyPrice)); + if(shopData.contains(s + ".discount")) + { + String original = n(buyPrice * 100 / (double) (100 - shopData.getInt(s + ".discount"))); + buyText = t(player, "SHOP.BUY_PRICE_DISCOUNTED" + currencyKey).replace("{num}", original).replace("{num2}", n(buyPrice)); + } + else + { + buyText = t(player, "SHOP.BUY_PRICE" + currencyKey).replace("{num}", n(buyPrice)); + } buyText += showValueChange ? " " + valueChanged_Buy : ""; } if (!tradeType.equalsIgnoreCase("BuyOnly")) { - sellText = t(player, "SHOP.SELL_PRICE").replace("{num}", n(sellPrice)); + if(shopData.contains(s + ".discount")) + { + String original = n(sellPrice * 100 / (double) (100 - shopData.getInt(s + ".discount"))); + sellText = t(player, "SHOP.SELL_PRICE_DISCOUNTED" + currencyKey).replace("{num}", original).replace("{num2}", n(sellPrice)); + } + else + { + sellText = t(player, "SHOP.SELL_PRICE" + currencyKey).replace("{num}", n(sellPrice)); + } + sellText += showValueChange ? " " + valueChanged_Sell : ""; } @@ -548,11 +575,12 @@ else if (e.isRightClick() && player.hasPermission(P_ADMIN_SHOP_EDIT)) int median = shopData.getInt(idx + ".median"); int stock = shopData.getInt(idx + ".stock"); int maxStock = shopData.getInt(idx + ".maxStock", -1); + int discount = shopData.getInt(idx + ".discount", 0); ItemStack iStack = new ItemStack(e.getCurrentItem().getType()); iStack.setItemMeta((ItemMeta) shopData.get(idx + ".itemStack")); - DynaShopAPI.openItemSettingGui(player, shopName, idx, 0, iStack, buyValue, sellValue, valueMin, valueMax, median, stock, maxStock); + DynaShopAPI.openItemSettingGui(player, shopName, idx, 0, iStack, buyValue, sellValue, valueMin, valueMax, median, stock, maxStock, discount); } else { ShopUtil.removeItemFromShop(shopName, idx); diff --git a/src/main/java/me/sat7/dynamicshop/guis/ShopList.java b/src/main/java/me/sat7/dynamicshop/guis/ShopList.java index 176fb24..7ae344a 100644 --- a/src/main/java/me/sat7/dynamicshop/guis/ShopList.java +++ b/src/main/java/me/sat7/dynamicshop/guis/ShopList.java @@ -5,10 +5,13 @@ import me.sat7.dynamicshop.utilities.ShopUtil; import org.bukkit.Bukkit; import org.bukkit.Material; +import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.Inventory; +import java.util.ArrayList; + import static me.sat7.dynamicshop.utilities.LangUtil.t; public class ShopList extends InGameUI @@ -33,11 +36,12 @@ public Inventory getGui(Player player, int page, int slotIndex) this.page = MathUtil.Clamp(page, 1, maxPage); this.slotIndex = slotIndex; + CreateExistShopList(); CreateShopButtons(); CreateCloseButton(player, CLOSE); CreateButton(PAGE, GetPageButtonIconMat(), - t(player, "START_PAGE.SHOP_LIST.PAGE_TITLE").replace("{curPage}", String.valueOf(this.page)).replace("{maxPage}", String.valueOf(this.maxPage)), - t(player, "START_PAGE.SHOP_LIST.PAGE_LORE")); + t(player, "START_PAGE.SHOP_LIST.PAGE_TITLE").replace("{curPage}", String.valueOf(this.page)).replace("{maxPage}", String.valueOf(this.maxPage)), + t(player, "START_PAGE.SHOP_LIST.PAGE_LORE")); return inventory; } @@ -65,7 +69,8 @@ public void OnClickUpperInventory(InventoryClickEvent e) } DynaShopAPI.openShopListUI(player, page, slotIndex); - } else if (e.getCurrentItem() != null && e.getCurrentItem().getType() == Material.CHEST) + } else if (e.getCurrentItem() != null && + (e.getCurrentItem().getType() == Material.GREEN_STAINED_GLASS || e.getCurrentItem().getType() == Material.GRAY_STAINED_GLASS)) { String shopName = e.getCurrentItem().getItemMeta().getDisplayName(); StartPage.ccStartPage.get().set("Buttons." + slotIndex + ".displayName", "§3" + shopName); @@ -88,11 +93,29 @@ private void CreateShopButtons() if (idx >= (page - 1) * 45) { - CreateButton(slotIdx, Material.CHEST, shopName, ""); + CreateButton(slotIdx, existShopList.contains(shopName) ? Material.GREEN_STAINED_GLASS : Material.GRAY_STAINED_GLASS, shopName, ""); slotIdx++; } idx++; } } + + ArrayList existShopList = new ArrayList<>(); + private void CreateExistShopList() + { + existShopList.clear(); + ConfigurationSection cs = StartPage.ccStartPage.get().getConfigurationSection("Buttons"); + if (cs != null) + { + for (String c : cs.getKeys(false)) + { + String actionString = cs.getString(c + ".action"); + if (actionString == null || !actionString.contains("ds shop")) + continue; + + existShopList.add(actionString.replace("ds shop ", "")); + } + } + } } diff --git a/src/main/java/me/sat7/dynamicshop/models/DSItem.java b/src/main/java/me/sat7/dynamicshop/models/DSItem.java index 720c20d..bee094d 100644 --- a/src/main/java/me/sat7/dynamicshop/models/DSItem.java +++ b/src/main/java/me/sat7/dynamicshop/models/DSItem.java @@ -17,8 +17,9 @@ public class DSItem private int median; private int stock; private int maxStock; + private int discount; - public DSItem(ItemStack itemStack, double buyValue, double sellValue, double minPrice, double maxPrice, int median, int stock, int maxStock) + public DSItem(ItemStack itemStack, double buyValue, double sellValue, double minPrice, double maxPrice, int median, int stock, int maxStock, int discount) { setItemStack(itemStack); setBuyValue(Math.round(buyValue * 100) / 100.0); @@ -28,5 +29,6 @@ public DSItem(ItemStack itemStack, double buyValue, double sellValue, double min setMedian(median); setStock(stock); setMaxStock(maxStock); + setDiscount(discount); } } diff --git a/src/main/java/me/sat7/dynamicshop/transactions/Calc.java b/src/main/java/me/sat7/dynamicshop/transactions/Calc.java index f16fae0..2713634 100644 --- a/src/main/java/me/sat7/dynamicshop/transactions/Calc.java +++ b/src/main/java/me/sat7/dynamicshop/transactions/Calc.java @@ -57,6 +57,13 @@ 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")) { @@ -132,6 +139,13 @@ 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")) diff --git a/src/main/java/me/sat7/dynamicshop/transactions/Sell.java b/src/main/java/me/sat7/dynamicshop/transactions/Sell.java index 9e121e5..2c5e42c 100644 --- a/src/main/java/me/sat7/dynamicshop/transactions/Sell.java +++ b/src/main/java/me/sat7/dynamicshop/transactions/Sell.java @@ -135,8 +135,7 @@ else if (data.get().contains("Options.flag.playerpoint")) priceSum += calcResult[0]; Economy econ = DynamicShop.getEconomy(); - EconomyResponse r = null; - if (!CheckTransactionSuccess(currencyType, r, player, priceSum)) + if (!CheckTransactionSuccess(currencyType, player, priceSum)) return 0; //로그 기록 @@ -217,8 +216,7 @@ public static void sell(ItemTrade.CURRENCY currency, Player player, String shopN priceSum += calcResult[0]; Economy econ = DynamicShop.getEconomy(); - EconomyResponse r = null; - if (!CheckTransactionSuccess(currency, r, player, priceSum)) + if (!CheckTransactionSuccess(currency, player, priceSum)) return; //로그 기록 @@ -252,10 +250,11 @@ public static void sell(ItemTrade.CURRENCY currency, Player player, String shopN Bukkit.getPluginManager().callEvent(event); } - private static boolean CheckTransactionSuccess(ItemTrade.CURRENCY currencyType, EconomyResponse r, Player player, double priceSum) + private static boolean CheckTransactionSuccess(ItemTrade.CURRENCY currencyType, Player player, double priceSum) { if (currencyType == ItemTrade.CURRENCY.VAULT) { + EconomyResponse r = null; if (player != null) r = DynamicShop.getEconomy().depositPlayer(player, priceSum); diff --git a/src/main/java/me/sat7/dynamicshop/utilities/LangUtil.java b/src/main/java/me/sat7/dynamicshop/utilities/LangUtil.java index 67d98fa..2cfa178 100644 --- a/src/main/java/me/sat7/dynamicshop/utilities/LangUtil.java +++ b/src/main/java/me/sat7/dynamicshop/utilities/LangUtil.java @@ -60,6 +60,16 @@ public static void setupLangFile(String lang) 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_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무한"); @@ -161,6 +171,8 @@ public static void setupLangFile(String lang) 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.DONE", "§f완료"); ccLang.get().addDefault("ITEM_SETTING.DONE_LORE", "§f완료!"); ccLang.get().addDefault("ITEM_SETTING.ROUND_DOWN", "§f내림"); @@ -182,6 +194,16 @@ public static void setupLangFile(String lang) 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_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재고: "); @@ -451,6 +473,16 @@ public static void setupLangFile(String lang) 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_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"); @@ -552,6 +584,8 @@ public static void setupLangFile(String lang) 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.DONE", "§fDone"); ccLang.get().addDefault("ITEM_SETTING.DONE_LORE", "§fDone!"); ccLang.get().addDefault("ITEM_SETTING.ROUND_DOWN", "§fRound down"); @@ -573,6 +607,16 @@ public static void setupLangFile(String lang) 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_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: "); diff --git a/src/main/java/me/sat7/dynamicshop/utilities/LayoutUtil.java b/src/main/java/me/sat7/dynamicshop/utilities/LayoutUtil.java index 29fd283..efc9da5 100644 --- a/src/main/java/me/sat7/dynamicshop/utilities/LayoutUtil.java +++ b/src/main/java/me/sat7/dynamicshop/utilities/LayoutUtil.java @@ -16,16 +16,16 @@ public static void Setup() ccLayout.setup("Layout", null); ccLayout.get().options().header( "{Tag} : A predefined placeholder. Available for each item only." + - "\n{\\nTag} : Line breaks when this item is displayed." + - "\nSHOP.INFO: §f{ShopLore}{\\nPermission}{\\nTax}{\\nShopBalance}{\\nShopHour}{\\nShopPosition}" + - "\nSHOP.ITEM_INFO: §f{Sell}{\\nBuy}{\\nStock}{\\nPricingType}{\\nItemMetaLore}{\\nTradeLore}" + - "\nTRADE_VIEW.BUY: §f{Price}{\\nStock}{\\nDeliveryCharge}{\\nTradeLore}" + - "\nTRADE_VIEW.SELL: §f{Price}{\\nStock}{\\nDeliveryCharge}{\\nTradeLore}" + - "\nTRADE_VIEW.BALANCE: §f{PlayerBalance}{\\nShopBalance}" + "\n{\\nTag} : Line breaks when this item is displayed." + + "\nSHOP.INFO: §f{ShopLore}{\\nPermission}{\\nTax}{\\nShopBalance}{\\nShopHour}{\\nShopPosition}" + + "\nSHOP.ITEM_INFO: §f{\\nItemMetaLore}{\\nSell}{\\nBuy}{\\nStock}{\\nPricingType}\n{\\nTradeLore}" + + "\nTRADE_VIEW.BUY: §f{Price}{\\nStock}{\\nDeliveryCharge}\n{\\nTradeLore}" + + "\nTRADE_VIEW.SELL: §f{Price}{\\nStock}{\\nDeliveryCharge}\n{\\nTradeLore}" + + "\nTRADE_VIEW.BALANCE: §f{PlayerBalance}{\\nShopBalance}" ); ccLayout.get().addDefault("SHOP.INFO", "§f{ShopLore}{\\nPermission}{\\nTax}{\\nShopBalance}{\\nShopHour}{\\nShopPosition}"); - ccLayout.get().addDefault("SHOP.ITEM_INFO", "§f{Sell}{\\nBuy}{\\nStock}{\\nPricingType}\n{\\nItemMetaLore}{\\nTradeLore}"); + ccLayout.get().addDefault("SHOP.ITEM_INFO", "§f{\\nItemMetaLore}{\\nSell}{\\nBuy}{\\nStock}{\\nPricingType}\n{\\nTradeLore}"); ccLayout.get().addDefault("TRADE_VIEW.BUY", "§f{Price}{\\nStock}{\\nDeliveryCharge}\n{\\nTradeLore}"); ccLayout.get().addDefault("TRADE_VIEW.SELL", "§f{Price}{\\nStock}{\\nDeliveryCharge}\n{\\nTradeLore}"); ccLayout.get().addDefault("TRADE_VIEW.BALANCE", "§f{PlayerBalance}{\\nShopBalance}"); diff --git a/src/main/java/me/sat7/dynamicshop/utilities/ShopUtil.java b/src/main/java/me/sat7/dynamicshop/utilities/ShopUtil.java index f3e99b7..37428e0 100644 --- a/src/main/java/me/sat7/dynamicshop/utilities/ShopUtil.java +++ b/src/main/java/me/sat7/dynamicshop/utilities/ShopUtil.java @@ -260,6 +260,24 @@ public static void editShopItem(String shopName, int idx, double buyValue, doubl data.save(); } + public static void setDiscount(String shopName, int idx, int discount) + { + CustomConfig data = shopConfigFiles.get(shopName); + if (data == null) + return; + + if (discount == 0) + { + data.get().set(idx + ".discount", null); + } + else + { + data.get().set(idx + ".discount", discount); + } + + data.save(); + } + // 상점에서 아이탬 제거 public static void removeItemFromShop(String shopName, int idx) { @@ -360,15 +378,15 @@ public static boolean SwapPage(String shopName, int pageA, int pageB) } tempA.forEach((key, value) -> - { - key += (pageB - pageA) * 45; - data.get().set(String.valueOf(key), value); - }); + { + key += (pageB - pageA) * 45; + data.get().set(String.valueOf(key), value); + }); tempB.forEach((key, value) -> - { - key += (pageA - pageB) * 45; - data.get().set(String.valueOf(key), value); - }); + { + key += (pageA - pageB) * 45; + data.get().set(String.valueOf(key), value); + }); tempA.clear(); tempB.clear(); @@ -526,8 +544,8 @@ public static double getShopBalance(String shopName) } catch (Exception e) { DynamicShop.console.sendMessage(Constants.DYNAMIC_SHOP_PREFIX + - shopName + ", " + linkedShop + "/ " + - t(null, "ERR.SHOP_LINK_TARGET_ERR")); + shopName + ", " + linkedShop + "/ " + + t(null, "ERR.SHOP_LINK_TARGET_ERR")); data.get().set("Options.Balance", null); data.save(); diff --git a/src/main/java/me/sat7/dynamicshop/utilities/TabCompleteUtil.java b/src/main/java/me/sat7/dynamicshop/utilities/TabCompleteUtil.java index 0154967..e8cfc6a 100644 --- a/src/main/java/me/sat7/dynamicshop/utilities/TabCompleteUtil.java +++ b/src/main/java/me/sat7/dynamicshop/utilities/TabCompleteUtil.java @@ -228,6 +228,7 @@ public static List onTabCompleteBody(DynamicShop dynamicShop, CommandSen temp.add("stock"); temp.add("median"); temp.add("maxStock"); + temp.add("discount"); AddToAutoCompleteIfValid(args[3]); } else if (args.length == 5) @@ -241,7 +242,7 @@ public static List onTabCompleteBody(DynamicShop dynamicShop, CommandSen AddToAutoCompleteIfValid(args[4]); } else if (args.length == 6) { - if (args[4].equals("=")) + if (args[4].equals("=") && !args[3].equals("discount")) { temp.add("purchaseValue"); temp.add("salesValue"); @@ -250,6 +251,7 @@ public static List onTabCompleteBody(DynamicShop dynamicShop, CommandSen temp.add("stock"); temp.add("median"); temp.add("maxStock"); + temp.add("discount"); AddToAutoCompleteIfValid(args[5]); }