From 185a5bc8a2f8642903361d04064e43bb1c33a73e Mon Sep 17 00:00:00 2001 From: alexcrea Date: Wed, 19 Aug 2026 15:03:26 +0200 Subject: [PATCH] more ui translations --- .../gui/config/ask/AbstractAskGui.java | 9 +- .../gui/config/ask/ConfirmActionGui.java | 18 +- .../gui/config/ask/SelectItemTypeGui.java | 9 +- .../global/AbstractEnchantConfigGui.java | 13 +- .../gui/config/global/BasicConfigGui.java | 195 +++++++------- .../config/global/CustomRecipeConfigGui.java | 2 +- .../config/global/EnchantCostConfigGui.java | 33 +-- .../config/global/EnchantLimitConfigGui.java | 11 +- .../global/EnchantMergeLimitConfigGui.java | 19 +- .../config/list/UnitRepairElementListGui.java | 42 +-- .../elements/CustomRecipeSubSettingGui.java | 58 ++-- .../EnchantConflictSubSettingGui.java | 18 +- .../config/settings/AbstractSettingGui.java | 7 +- .../gui/config/settings/BoolSettingsGui.java | 64 +++-- .../gui/config/settings/DoubleSettingGui.java | 63 +++-- .../settings/EnchantCostSettingsGui.java | 24 +- .../gui/config/settings/EnumSettingGui.java | 7 +- .../gui/config/settings/IntSettingsGui.java | 80 +++--- .../gui/config/settings/ItemSettingGui.java | 18 +- .../settings/WorkPenaltyTypeSettingGui.java | 89 ++++--- .../cuanvil/gui/util/GuiGlobalItems.java | 37 ++- .../cuanvil/command/DebugToggleExecutor.kt | 38 ++- .../cuanvil/command/DiagnosticExecutor.kt | 4 +- .../xyz/alexcrea/cuanvil/lang/Message.kt | 84 ++++-- .../kotlin/xyz/alexcrea/cuanvil/lang/MsgUI.kt | 137 ++++++++-- .../alexcrea/cuanvil/util/ComponentUtil.kt | 21 +- src/main/resources/lang/en.yml | 252 ++++++++++++++++-- 27 files changed, 910 insertions(+), 442 deletions(-) diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/ask/AbstractAskGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/ask/AbstractAskGui.java index 75cdf236..d7913020 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/ask/AbstractAskGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/ask/AbstractAskGui.java @@ -15,9 +15,12 @@ import xyz.alexcrea.cuanvil.lang.Message; public abstract class AbstractAskGui extends ChestGui { protected PatternPane pane; - AbstractAskGui(int rows, - @NotNull Message name, @NotNull String param, - Gui backOnCancel){ + + AbstractAskGui( + int rows, + @NotNull Message name, @NotNull String param, + Gui backOnCancel + ) { super(rows, name.textHolder(param), CustomAnvil.instance); Pattern pattern = getGuiPattern(); diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/ask/ConfirmActionGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/ask/ConfirmActionGui.java index b570e1d5..d98cc399 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/ask/ConfirmActionGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/ask/ConfirmActionGui.java @@ -23,10 +23,12 @@ import java.util.logging.Level; public class ConfirmActionGui extends AbstractAskGui { - public ConfirmActionGui(@NotNull Message title, @NotNull String titleParam, - @Nullable Message actionDescription, @NotNull String actionParam, - Gui backOnCancel, Gui backOnConfirm, Supplier onConfirm, - boolean permanent) { + public ConfirmActionGui( + @NotNull Message title, @NotNull String titleParam, + @Nullable Message actionDescription, @NotNull String actionParam, + Gui backOnCancel, Gui backOnConfirm, Supplier onConfirm, + boolean permanent + ) { super(3, title, titleParam, backOnCancel); // Save item @@ -71,9 +73,11 @@ public class ConfirmActionGui extends AbstractAskGui { pane.bindItem('I', new GuiItem(infoItem, GuiGlobalActions.stayInPlace, CustomAnvil.instance)); } - public ConfirmActionGui(@NotNull Message title, @NotNull String titleParam, - @Nullable Message actionDescription, @NotNull String actionParam, - Gui backOnCancel, Gui backOnConfirm, Supplier onConfirm){ + public ConfirmActionGui( + @NotNull Message title, @NotNull String titleParam, + @Nullable Message actionDescription, @NotNull String actionParam, + Gui backOnCancel, Gui backOnConfirm, Supplier onConfirm + ){ this(title, titleParam, actionDescription, actionParam, backOnCancel, backOnConfirm, onConfirm, true); } diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/ask/SelectItemTypeGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/ask/SelectItemTypeGui.java index fc96c282..c3f52388 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/ask/SelectItemTypeGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/ask/SelectItemTypeGui.java @@ -22,6 +22,7 @@ import java.util.function.BiConsumer; public class SelectItemTypeGui extends AbstractAskGui { private ItemStack selectedItem; + public SelectItemTypeGui(@NotNull Message title, @NotNull String titleParam, @NotNull Message actionDescription, @@ -37,7 +38,7 @@ public class SelectItemTypeGui extends AbstractAskGui { event.setCancelled(true); HumanEntity player = event.getWhoClicked(); - if (!player.hasPermission(CustomAnvil.editConfigPermission)) { + if(!player.hasPermission(CustomAnvil.editConfigPermission)) { player.closeInventory(); MsgUI.INSTANCE.getSHARED_CONFIG_NO_EDIT_PERM().send(player); return; @@ -59,9 +60,9 @@ public class SelectItemTypeGui extends AbstractAskGui { if(MaterialUtil.INSTANCE.isAir(cursor)) return; ItemStack finalItem; - if(materialOnly){ + if(materialOnly) { finalItem = setDisplayMeta(new ItemStack(cursor.getType()), actionDescription, descriptionParam); - }else{ + } else { finalItem = cursor.clone(); } this.selectedItem = finalItem.clone(); @@ -85,7 +86,7 @@ public class SelectItemTypeGui extends AbstractAskGui { @NotNull ItemStack item, @NotNull Message actionDescription, @NotNull String param - ){ + ) { ItemMeta meta = item.getItemMeta(); assert meta != null; diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/AbstractEnchantConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/AbstractEnchantConfigGui.java index 198f2149..f2ee0529 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/AbstractEnchantConfigGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/AbstractEnchantConfigGui.java @@ -21,7 +21,7 @@ import java.util.function.Consumer; * * @param Type of the factory of the type of setting the gui should edit. */ -public abstract class AbstractEnchantConfigGui extends SettingGuiListConfigGui{ +public abstract class AbstractEnchantConfigGui extends SettingGuiListConfigGui { /** * Constructor for a gui displaying available enchantment to edit a enchantment setting. @@ -47,7 +47,7 @@ public abstract class AbstractEnchantConfigGui getCreateItemLore() { return Collections.emptyList(); } + @Override protected Consumer getCreateClickConsumer() { return null; diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/BasicConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/BasicConfigGui.java index 51936c7e..149a4aa0 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/BasicConfigGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/BasicConfigGui.java @@ -14,7 +14,6 @@ import org.bukkit.inventory.meta.ItemMeta; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import xyz.alexcrea.cuanvil.config.ConfigHolder; -import xyz.alexcrea.cuanvil.dependency.MinecraftVersionUtil; import xyz.alexcrea.cuanvil.dependency.packet.PacketManager; import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui; import xyz.alexcrea.cuanvil.gui.config.MainConfigGui; @@ -24,10 +23,11 @@ import xyz.alexcrea.cuanvil.gui.config.settings.WorkPenaltyTypeSettingGui; import xyz.alexcrea.cuanvil.gui.util.GuiGlobalActions; import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems; import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant; +import xyz.alexcrea.cuanvil.lang.Message; +import xyz.alexcrea.cuanvil.lang.MsgUI; +import xyz.alexcrea.cuanvil.util.ComponentUtil; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; /** * Global config to edit basic basic settings. @@ -42,11 +42,12 @@ public class BasicConfigGui extends ChestGui implements ValueUpdatableGui { } private final PacketManager packetManager; + /** * Constructor of this Global gui for basic settings. */ public BasicConfigGui(PacketManager packetManager) { - super(4, "§8Basic Config", CustomAnvil.instance); + super(4, MsgUI.INSTANCE.getBASIC_TITLE().textHolder(), CustomAnvil.instance); if(INSTANCE == null) INSTANCE = this; this.packetManager = packetManager; @@ -101,61 +102,60 @@ public class BasicConfigGui extends ChestGui implements ValueUpdatableGui { */ protected void prepareValues() { // cap anvil cost - this.capAnvilCost = new BoolSettingsGui.BoolSettingFactory("§8Cap Anvil Cost ?", this, + this.capAnvilCost = new BoolSettingsGui.BoolSettingFactory( + MsgUI.INSTANCE.getBASIC_CAP_ANVIL_COST_TITLE(), this, ConfigHolder.DEFAULT_CONFIG, ConfigOptions.CAP_ANVIL_COST, ConfigOptions.DEFAULT_CAP_ANVIL_COST, - "§7All anvil cost will be capped to §aMax Anvil Cost§7 if enabled.", - "§7In other words:", - "§7For any anvil cost greater than §aMax Anvil Cost§7, Cost will be set to §aMax Anvil Cost§7."); + null, MsgUI.INSTANCE.getBASIC_CAP_ANVIL_COST_DESCRIPTION() + ); // cap anvil cost not needed ItemStack item = new ItemStack(Material.BARRIER); ItemMeta meta = item.getItemMeta(); assert meta != null; - meta.setDisplayName("§cCap Anvil Cost ?"); - meta.setLore(Collections.singletonList("§7This config only work if §cLimit Repair Cost§7 is disabled.")); + ComponentUtil.INSTANCE.setMessageName(meta, MsgUI.INSTANCE.getBASIC_CAP_ANVIL_COST_DISABLED_TITLE()); + ComponentUtil.INSTANCE.applyLore(MsgUI.INSTANCE.getBASIC_CAP_ANVIL_COST_DISABLED_DESCRIPTION().formatted(), meta); + item.setItemMeta(meta); this.noCapRepairItem = new GuiItem(item, GuiGlobalActions.stayInPlace, CustomAnvil.instance); // repair cost item IntRange range = ConfigOptions.MAX_ANVIL_COST_RANGE; - this.maxAnvilCost = new IntSettingsGui.IntSettingFactory("§8Max Anvil Cost", this, + this.maxAnvilCost = new IntSettingsGui.IntSettingFactory( + MsgUI.INSTANCE.getBASIC_MAX_ANVIL_COST_TITLE(), this, ConfigOptions.MAX_ANVIL_COST, ConfigHolder.DEFAULT_CONFIG, - Arrays.asList( - "§7Max cost the Anvil can get to.", - "§7Valid values include §e0 §7to §e1000§7.", - "§7Cost will be displayed as §cToo Expensive§7:", - "§7- If Cost is above §e39", - "§7- And §eReplace Too Expensive§7 is disabled" - ), + MsgUI.INSTANCE.getBASIC_MAX_ANVIL_COST_DESCRIPTION(), range.getFirst(), range.getLast(), ConfigOptions.DEFAULT_MAX_ANVIL_COST, - 1, 5, 10); + 1, 5, 10 + ); // max anvil cost not needed item = new ItemStack(Material.BARRIER); meta = item.getItemMeta(); assert meta != null; - meta.setDisplayName("§cMax Anvil Cost"); - meta.setLore(Collections.singletonList("§7This config only work if §cLimit Repair Cost§7 is disabled.")); + ComponentUtil.INSTANCE.setMessageName(meta, MsgUI.INSTANCE.getBASIC_MAX_ANVIL_COST_DISABLED_TITLE()); + ComponentUtil.INSTANCE.applyLore(MsgUI.INSTANCE.getBASIC_MAX_ANVIL_COST_DISABLED_DESCRIPTION().formatted(), meta); item.setItemMeta(meta); this.noMaxCostItem = new GuiItem(item, GuiGlobalActions.stayInPlace, CustomAnvil.instance); // remove repair limit item - this.removeAnvilCostLimit = new BoolSettingsGui.BoolSettingFactory("§8Remove Anvil Cost Limit ?", this, + this.removeAnvilCostLimit = new BoolSettingsGui.BoolSettingFactory( + MsgUI.INSTANCE.getBASIC_REMOVE_COST_LIMIT_TITLE(), this, ConfigHolder.DEFAULT_CONFIG, ConfigOptions.REMOVE_ANVIL_COST_LIMIT, ConfigOptions.DEFAULT_REMOVE_ANVIL_COST_LIMIT, - "§7Whether the anvil's cost limit should be removed entirely.", - "§7The anvil will still visually display §cToo Expensive§7 if §eReplace Too Expensive§7 is disabled.", - "§7However, the action will be completable if xp requirement is meet."); + null, MsgUI.INSTANCE.getBASIC_REMOVE_COST_LIMIT_DESCRIPTION() + ); // replace too expensive item - this.replaceTooExpensive = new BoolSettingsGui.BoolSettingFactory("§8Replace Too Expensive ?", this, + this.replaceTooExpensive = new BoolSettingsGui.BoolSettingFactory( + MsgUI.INSTANCE.getBASIC_REPLACE_TOO_EXPENSIVE_TITLE(), this, ConfigHolder.DEFAULT_CONFIG, ConfigOptions.REPLACE_TOO_EXPENSIVE, ConfigOptions.DEFAULT_REPLACE_TOO_EXPENSIVE, - getReplaceToExpensiveLore()); + null, getReplaceToExpensiveLore() + ); // ------------ // Cost config @@ -163,132 +163,118 @@ public class BasicConfigGui extends ChestGui implements ValueUpdatableGui { // item repair cost range = ConfigOptions.REPAIR_COST_RANGE; - this.itemRepairCost = new IntSettingsGui.IntSettingFactory("§8Item Repair Cost", this, + this.itemRepairCost = new IntSettingsGui.IntSettingFactory( + MsgUI.INSTANCE.getBASIC_ITEM_REPAIR_COST_TITLE(), this, ConfigOptions.ITEM_REPAIR_COST, ConfigHolder.DEFAULT_CONFIG, - Arrays.asList( - "§7XP Level amount added to the anvil when the item", - "§7is repaired by another item of the same type." - ), + MsgUI.INSTANCE.getBASIC_ITEM_REPAIR_COST_DESCRIPTION(), range.getFirst(), range.getLast(), ConfigOptions.DEFAULT_ITEM_REPAIR_COST, - 1, 5, 10, 50, 100); + 1, 5, 10, 50, 100 + ); // unit repair cost - this.unitRepairCost = new IntSettingsGui.IntSettingFactory("§8Unit Repair Cost", this, + this.unitRepairCost = new IntSettingsGui.IntSettingFactory( + MsgUI.INSTANCE.getBASIC_UNIT_REPAIR_COST_TITLE(), this, ConfigOptions.UNIT_REPAIR_COST, ConfigHolder.DEFAULT_CONFIG, - Arrays.asList( - "§7XP Level amount added to the anvil when the item is repaired by an §eunit§7.", - "§7For example: a Diamond on a Diamond Sword.", - "§7What's considered unit for what can be edited on the unit repair configuration." - ), + MsgUI.INSTANCE.getBASIC_UNIT_REPAIR_COST_DESCRIPTION(), range.getFirst(), range.getLast(), ConfigOptions.DEFAULT_UNIT_REPAIR_COST, - 1, 5, 10, 50, 100); + 1, 5, 10, 50, 100 + ); // item rename cost range = ConfigOptions.ITEM_RENAME_COST_RANGE; - this.itemRenameCost = new IntSettingsGui.IntSettingFactory("§8Rename Cost", this, + this.itemRenameCost = new IntSettingsGui.IntSettingFactory( + MsgUI.INSTANCE.getBASIC_ITEM_RENAME_COST_TITLE(), this, ConfigOptions.ITEM_RENAME_COST, ConfigHolder.DEFAULT_CONFIG, - Arrays.asList( - "§7XP Level amount added to the anvil when the item is renamed." - ), + MsgUI.INSTANCE.getBASIC_ITEM_RENAME_COST_DESCRIPTION(), range.getFirst(), range.getLast(), ConfigOptions.DEFAULT_ITEM_RENAME_COST, - 1, 5, 10, 50, 100); + 1, 5, 10, 50, 100 + ); // sacrifice illegal enchant cost range = ConfigOptions.SACRIFICE_ILLEGAL_COST_RANGE; - this.sacrificeIllegalEnchantCost = new IntSettingsGui.IntSettingFactory("§8Sacrifice Illegal Enchant Cost", this, + this.sacrificeIllegalEnchantCost = new IntSettingsGui.IntSettingFactory( + MsgUI.INSTANCE.getBASIC_SACRIFICE_ILLEGAL_COST_TITLE(), this, ConfigOptions.SACRIFICE_ILLEGAL_COST, ConfigHolder.DEFAULT_CONFIG, - Arrays.asList( - "§7XP Level amount added to the anvil when a sacrifice enchantment", - "§7conflict With one of the left item enchantment" - ), + MsgUI.INSTANCE.getBASIC_SACRIFICE_ILLEGAL_COST_DESCRIPTION(), range.getFirst(), range.getLast(), ConfigOptions.DEFAULT_SACRIFICE_ILLEGAL_COST, - 1, 5, 10, 50, 100); + 1, 5, 10, 50, 100 + ); // ------------- // Color config // ------------- // Allow us of color code - this.allowColorCode = new BoolSettingsGui.BoolSettingFactory("§8Allow Use Of Color Code ?", this, + this.allowColorCode = new BoolSettingsGui.BoolSettingFactory( + MsgUI.INSTANCE.getBASIC_COLOR_CODE_LIMIT_TITLE(), this, ConfigHolder.DEFAULT_CONFIG, ConfigOptions.ALLOW_COLOR_CODE, ConfigOptions.DEFAULT_ALLOW_COLOR_CODE, - "§7Whether players can use color code.", - "§7Color code a formatted like §a&a§7 and is used in the rename field of the anvil.", - "§7Player may need permission to use color code if §ePlayer need permission to use color§7 is enabled."); + null, MsgUI.INSTANCE.getBASIC_COLOR_CODE_LIMIT_DESCRIPTION() + ); // Allow us of hexadecimal color - this.allowHexColor = new BoolSettingsGui.BoolSettingFactory("§8Allow Use Of Hexadecimal Color ?", this, + this.allowHexColor = new BoolSettingsGui.BoolSettingFactory( + MsgUI.INSTANCE.getBASIC_COLOR_HEX_LIMIT_TITLE(), this, ConfigHolder.DEFAULT_CONFIG, ConfigOptions.ALLOW_HEXADECIMAL_COLOR, ConfigOptions.DEFAULT_ALLOW_HEXADECIMAL_COLOR, - "§7Whether players can use hexadecimal color.", - "§7Color code a formatted like §2#012345 §7and is used in the rename field of the anvil.", - "§7Player may need permission to use color code if §ePermission Needed For Color§7 is enabled."); + null, MsgUI.INSTANCE.getBASIC_COLOR_HEX_LIMIT_DESCRIPTION() + ); // Permission needed for color - this.permissionNeededForColor = new BoolSettingsGui.BoolSettingFactory("§8Need Permission To Use Color ?", this, + this.permissionNeededForColor = new BoolSettingsGui.BoolSettingFactory( + MsgUI.INSTANCE.getBASIC_COLOR_PERMISSION_TITLE(), this, ConfigHolder.DEFAULT_CONFIG, ConfigOptions.PERMISSION_NEEDED_FOR_COLOR, ConfigOptions.DEFAULT_PERMISSION_NEEDED_FOR_COLOR, - "§7Whether players should have permission to be able to use colors.", - "§7Give player §eca.color.code§7 Permission to allow use of color code.", - "§7Give player §eca.color.hex§7 Permission to allow use of hexadecimal color."); + null, MsgUI.INSTANCE.getBASIC_COLOR_PERMISSION_DESCRIPTION() + ); // Permission needed for color not necessary item = new ItemStack(Material.BARRIER); meta = item.getItemMeta(); assert meta != null; - meta.setDisplayName("§cNeed Permission To Use Color ?"); - meta.setLore(Arrays.asList("§7This config can do something only if one of the following config is enabled:", - "§7- §aAllow Use Of Color Code", - "§7- §aAllow Use Of Hexadecimal Color")); + ComponentUtil.INSTANCE.setMessageName(meta, MsgUI.INSTANCE.getBASIC_COLOR_PERMISSION_DISABLED_TITLE()); + ComponentUtil.INSTANCE.applyLore(MsgUI.INSTANCE.getBASIC_COLOR_PERMISSION_DISABLED_DESCRIPTION().formatted(), meta); item.setItemMeta(meta); this.noPermissionNeededItem = new GuiItem(item, GuiGlobalActions.stayInPlace, CustomAnvil.instance); // Cost of using color range = ConfigOptions.USE_OF_COLOR_COST_RANGE; - this.useOfColorCost = new IntSettingsGui.IntSettingFactory("§8Cost Of Using Color", this, + this.useOfColorCost = new IntSettingsGui.IntSettingFactory( + MsgUI.INSTANCE.getBASIC_COLOR_COST_TITLE(), this, ConfigOptions.USE_OF_COLOR_COST, ConfigHolder.DEFAULT_CONFIG, - Arrays.asList( - "§7XP level cost when using color code or hexadecimal color using the anvil.", - "§7conflict With one of the left item enchantment" - ), + MsgUI.INSTANCE.getBASIC_COLOR_COST_DESCRIPTION(), range.getFirst(), range.getLast(), ConfigOptions.DEFAULT_USE_OF_COLOR_COST, - 1, 5, 10, 50, 100); + 1, 5, 10, 50, 100 + ); // Permission needed for color not necessary item = new ItemStack(Material.BARRIER); meta = item.getItemMeta(); assert meta != null; - meta.setDisplayName("§cCost Of Using Color"); - meta.setLore(Arrays.asList("§7This config can do something only if one of the following config is enabled:", - "§7- §aAllow Use Of Color Code", - "§7- §aAllow Use Of Hexadecimal Color")); + ComponentUtil.INSTANCE.setMessageName(meta, MsgUI.INSTANCE.getBASIC_COLOR_COST_DISABLED_TITLE()); + ComponentUtil.INSTANCE.applyLore(MsgUI.INSTANCE.getBASIC_COLOR_COST_DISABLED_DESCRIPTION().formatted(), meta); + item.setItemMeta(meta); this.noColorCostItem = new GuiItem(item, GuiGlobalActions.stayInPlace, CustomAnvil.instance); } @NotNull - private String[] getReplaceToExpensiveLore() { - ArrayList lore = new ArrayList<>(); - lore.add("§7Whenever anvil cost is above §e39§7 should display the true price and not §cToo Expensive§7."); - lore.add("§7However, when bypassing §cToo Expensive§7, anvil price will be displayed as §aGreen§7."); - lore.add("§7Even if cost is displayed as §aGreen§7:"); - lore.add("§7If the player do not have the required xp level, the action will not be completable."); + private Message[] getReplaceToExpensiveLore() { + ArrayList lore = new ArrayList<>(); + lore.add(MsgUI.INSTANCE.getBASIC_REPLACE_TOO_EXPENSIVE_DESCRIPTION()); - if(!this.packetManager.getCanSetInstantBuild()){ - lore.add(""); - lore.add("§4/!\\§cCaution§4/!\\ §cYou need ProtocoLib installed and working or a paper server."); - lore.add("§cCurrently ProtocoLib is not detected."); - } + if(!this.packetManager.getCanSetInstantBuild()) + lore.add(MsgUI.INSTANCE.getBASIC_REPLACE_TOO_EXPENSIVE_DESCRIPTION_NO_NMS()); - String[] loreAsArray = new String[lore.size()]; + Message[] loreAsArray = new Message[lore.size()]; return lore.toArray(loreAsArray); } @@ -297,9 +283,14 @@ public class BasicConfigGui extends ChestGui implements ValueUpdatableGui { // limit and cap anvil cost item GuiItem capAnvilCostItem; GuiItem maxAnvilCostItem; - if (!this.removeAnvilCostLimit.getConfiguredValue()) { - capAnvilCostItem = this.capAnvilCost.getItem("Cap Anvil Cost"); - maxAnvilCostItem = this.maxAnvilCost.getItem(Material.EXPERIENCE_BOTTLE, "Max Anvil Cost"); + if(!this.removeAnvilCostLimit.getConfiguredValue()) { + capAnvilCostItem = this.capAnvilCost.getItem( + MsgUI.INSTANCE.getBASIC_CAP_ANVIL_COST_ITEM() + ); + maxAnvilCostItem = this.maxAnvilCost.getItem( + Material.EXPERIENCE_BOTTLE, + MsgUI.INSTANCE.getBASIC_MAX_ANVIL_COST_ITEM() + ); } else { capAnvilCostItem = this.noCapRepairItem; maxAnvilCostItem = this.noMaxCostItem; @@ -309,7 +300,9 @@ public class BasicConfigGui extends ChestGui implements ValueUpdatableGui { pane.bindItem('C', maxAnvilCostItem); // remove repair limit item - GuiItem removeRepairLimitItem = this.removeAnvilCostLimit.getItem("Remove Anvil Cost Limit"); + GuiItem removeRepairLimitItem = this.removeAnvilCostLimit.getItem( + MsgUI.INSTANCE.getBASIC_REMOVE_COST_LIMIT_ITEM() + ); pane.bindItem('R', removeRepairLimitItem); // replace too expensive item @@ -334,7 +327,11 @@ public class BasicConfigGui extends ChestGui implements ValueUpdatableGui { pane.bindItem('S', illegalCostItem); // work penalty type - GuiItem workPenaltyType = WorkPenaltyTypeSettingGui.getDisplayItem(this, Material.DAMAGED_ANVIL, "§aWork Penalty Type"); + GuiItem workPenaltyType = WorkPenaltyTypeSettingGui.getDisplayItem( + this, + Material.DAMAGED_ANVIL, + MsgUI.INSTANCE.getBASIC_WORK_PENALTY_ITEM() + ); pane.bindItem('W', workPenaltyType); // allow color code @@ -346,20 +343,22 @@ public class BasicConfigGui extends ChestGui implements ValueUpdatableGui { pane.bindItem('h', allowHexColorItem); // True if player could place color - if(ConfigOptions.INSTANCE.getRenameColorPossible()){ + if(ConfigOptions.INSTANCE.getRenameColorPossible()) { // use permission for color GuiItem permissionNeededItem = this.permissionNeededForColor.getItem(); pane.bindItem('p', permissionNeededItem); // using color cost - GuiItem useColorCostItem = this.useOfColorCost.getItem(Material.EXPERIENCE_BOTTLE, "Use color"); + GuiItem useColorCostItem = this.useOfColorCost.getItem( + Material.EXPERIENCE_BOTTLE, + MsgUI.INSTANCE.getBASIC_COLOR_COST_ITEM() + ); pane.bindItem('P', useColorCostItem); - }else{ + } else { pane.bindItem('p', this.noPermissionNeededItem); pane.bindItem('P', this.noColorCostItem); } - update(); } diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/CustomRecipeConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/CustomRecipeConfigGui.java index 060ff35a..c0c32471 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/CustomRecipeConfigGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/CustomRecipeConfigGui.java @@ -61,7 +61,7 @@ public class CustomRecipeConfigGui extends MappedGuiListConfigGui" + CasedStringUtil.snakeToUpperSpacedCase(recipe.toString()) + " Custom recipe");//TODO MESSAGE meta.addItemFlags(ItemFlag.values()); meta.setLore(getRecipeLore(recipe)); diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantCostConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantCostConfigGui.java index a531798a..c9938fd5 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantCostConfigGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantCostConfigGui.java @@ -2,6 +2,7 @@ package xyz.alexcrea.cuanvil.gui.config.global; import com.github.stefvanschie.inventoryframework.gui.GuiItem; import com.github.stefvanschie.inventoryframework.gui.type.util.Gui; +import net.kyori.adventure.text.Component; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; @@ -11,9 +12,12 @@ import xyz.alexcrea.cuanvil.enchant.CAEnchantment; import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui; import xyz.alexcrea.cuanvil.gui.config.settings.EnchantCostSettingsGui; import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems; +import xyz.alexcrea.cuanvil.lang.Message; import xyz.alexcrea.cuanvil.lang.MsgUI; import xyz.alexcrea.cuanvil.util.CasedStringUtil; +import xyz.alexcrea.cuanvil.util.ComponentUtil; +import java.awt.*; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -59,13 +63,10 @@ public class EnchantCostConfigGui extends AbstractEnchantConfigGui lore = new ArrayList<>(); - lore.add("§7Item Cost: §e" + itemCost); - lore.add("§7Book Cost: §e" + bookCost); + List lore = new ArrayList<>(); + lore.addAll(MsgUI.INSTANCE.getENCHANTMENT_LEVEL_COST_ELEMENT_ITEM_COST().formatted(itemCost)); + lore.addAll(MsgUI.INSTANCE.getENCHANTMENT_LEVEL_COST_ELEMENT_BOOK_COST().formatted(bookCost)); - List displayLore = factory.getDisplayLore(); - if (!displayLore.isEmpty()) { - lore.add(""); - lore.addAll(displayLore); + List displayLore = factory.getDisplayLore(); + if (displayLore != null) { + lore.add(Component.empty()); + lore.addAll(ComponentUtil.INSTANCE.asComponents(displayLore, factory.getParam())); } // Edit name and lore - itemMeta.setDisplayName(itemName); - itemMeta.setLore(lore); + ComponentUtil.INSTANCE.setMessageName(itemMeta, itemName, factory.getParam()); + ComponentUtil.INSTANCE.applyLore(lore, itemMeta); item.setItemMeta(itemMeta); diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantLimitConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantLimitConfigGui.java index 4ed529cf..e1a2759e 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantLimitConfigGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantLimitConfigGui.java @@ -54,11 +54,10 @@ public class EnchantLimitConfigGui extends AbstractEnchantConfigGui getCreateItemLore() { - return Arrays.asList( + return Arrays.asList(//TODO MESSAGE "§7Select a new item to be repairable.", "§7You will be asked the material to use." ); @@ -60,7 +60,7 @@ public class UnitRepairElementListGui extends SettingGuiListConfigGui getCreateClickConsumer() { return event -> { event.setCancelled(true); - if (!this.shouldWork) { + if(!this.shouldWork) { return; } event.setCancelled(true); @@ -73,11 +73,11 @@ public class UnitRepairElementListGui extends SettingGuiListConfigGui getEveryInstanceOfGeneric() { Set keys = new HashSet<>(); - if (!this.shouldWork) { + if(!this.shouldWork) { return keys; } @@ -155,10 +157,10 @@ public class UnitRepairElementListGui extends SettingGuiListConfigGui keys) { - if (section == null) return; - for (var key : section.getKeys(false)) { + if(section == null) return; + for(var key : section.getKeys(false)) { var material = NamespacedKey.fromString(key); - if (material == null) continue; + if(material == null) continue; keys.add(material); } @@ -166,7 +168,7 @@ public class UnitRepairElementListGui extends SettingGuiListConfigGui valueLore = new ArrayList<>(); - if(!holder.displayLore.isEmpty()){ - valueLore.addAll(holder.displayLore); - valueLore.add(""); + ArrayList valueLore = new ArrayList<>(); + if(holder.displayLore != null){ + valueLore.addAll(ComponentUtil.INSTANCE.asComponents(holder.displayLore)); + valueLore.add(Component.empty()); } - valueLore.add(AbstractSettingGui.CLICK_LORE); + valueLore.addAll(MsgUI.INSTANCE.getSHARED_CLICK_TO_CHANGE().formatted()); ItemStack valueItemStack = new ItemStack(displayedMat); ItemMeta valueMeta = valueItemStack.getItemMeta(); assert valueMeta != null; - valueMeta.setDisplayName(displayedName); - valueMeta.setLore(valueLore); + valueMeta.setDisplayName(displayedName);//TODO MESSAGE ? + ComponentUtil.INSTANCE.applyLore(valueLore, valueMeta); valueItemStack.setItemMeta(valueMeta); + GuiItem resultItem = new GuiItem(valueItemStack, inverseNowConsumer(), CustomAnvil.instance); pane.bindItem('v', resultItem); @@ -166,13 +172,15 @@ public class BoolSettingsGui extends AbstractSettingGui { */ public static class BoolSettingFactory extends SettingGuiFactory { @NotNull - String title; + Message title; @NotNull ValueUpdatableGui parent; boolean defaultVal; - @NotNull - List displayLore; + @Nullable + List displayLore; + @Nullable + Object param; /** * Constructor for a boolean setting gui factory. @@ -185,22 +193,25 @@ public class BoolSettingsGui extends AbstractSettingGui { * @param displayLore Gui display item lore. */ public BoolSettingFactory( - @NotNull String title, @NotNull ValueUpdatableGui parent, + @NotNull Message title, @NotNull ValueUpdatableGui parent, @NotNull ConfigHolder config, @NotNull String configPath, - boolean defaultVal, String... displayLore) { + boolean defaultVal, + @Nullable Object param, @Nullable Message... displayLore) { super(configPath, config); this.title = title; this.parent = parent; this.defaultVal = defaultVal; - this.displayLore = Arrays.asList(displayLore); + + this.displayLore = displayLore == null ? null : Arrays.asList(displayLore); + this.param = param; } /** * @return Get setting's gui title. */ @NotNull - public String getTitle() { + public Message getTitle() { return title; } @@ -225,25 +236,36 @@ public class BoolSettingsGui extends AbstractSettingGui { * The item will have its value written in the lore part of the item. * * @param name Name of the item. + * @param params parameters for the given name. * @return A formatted GuiItem that will create and open a GUI for the boolean setting. */ - public GuiItem getItem(String name){ + public GuiItem getItem( + @NotNull Message name, + Object... params + ){ // Get item properties boolean value = getConfiguredValue(); Material itemMat; - StringBuilder itemName = new StringBuilder("§e"); + Component itemName = name.formattedConcatenated(params); + String finalValue; if (value) { itemMat = Material.GREEN_TERRACOTTA; - finalValue = "§aYes"; + finalValue = "Yes";//TODO MESSAGE } else { itemMat = Material.RED_TERRACOTTA; - finalValue = "§cNo"; + finalValue = "No";//TODO MESSAGE } - itemName.append(name); - return GuiGlobalItems.createGuiItemFromProperties(this, itemMat, itemName, finalValue, this.displayLore, false); + return GuiGlobalItems.createGuiItemFromProperties( + this, + itemMat, itemName, + finalValue, + this.displayLore, + false, + this.param + ); } /** @@ -258,7 +280,7 @@ public class BoolSettingsGui extends AbstractSettingGui { // Get item properties String configPath = GuiGlobalItems.getConfigNameFromPath(getConfigPath()); - return getItem(CasedStringUtil.detectToUpperSpacedCase(configPath)); + return getItem(MsgUI.INSTANCE.getSHARED_YELLOW_GET_ITEM(), CasedStringUtil.detectToUpperSpacedCase(configPath)); } } diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/DoubleSettingGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/DoubleSettingGui.java index c0dcff60..1d14a566 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/DoubleSettingGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/DoubleSettingGui.java @@ -5,6 +5,7 @@ import com.github.stefvanschie.inventoryframework.gui.type.util.Gui; import com.github.stefvanschie.inventoryframework.pane.PatternPane; import com.github.stefvanschie.inventoryframework.pane.util.Pattern; import io.delilaheve.CustomAnvil; +import net.kyori.adventure.text.Component; import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.event.inventory.InventoryClickEvent; @@ -17,7 +18,10 @@ import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui; import xyz.alexcrea.cuanvil.gui.util.GuiGlobalActions; import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems; import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant; +import xyz.alexcrea.cuanvil.lang.Message; +import xyz.alexcrea.cuanvil.lang.MsgUI; import xyz.alexcrea.cuanvil.util.CasedStringUtil; +import xyz.alexcrea.cuanvil.util.ComponentUtil; import java.math.BigDecimal; import java.math.RoundingMode; @@ -166,7 +170,7 @@ public class DoubleSettingGui extends AbstractSettingGui { ItemMeta resultMeta = resultPaper.getItemMeta(); assert resultMeta != null; - resultMeta.setDisplayName("§fValue: §e" + displayValue(now)); + resultMeta.setDisplayName("Value: " + displayValue(now)); resultPaper.setItemMeta(resultMeta); GuiItem resultItem = new GuiItem(resultPaper, GuiGlobalActions.stayInPlace, CustomAnvil.instance); @@ -185,12 +189,12 @@ public class DoubleSettingGui extends AbstractSettingGui { private GuiItem getSetValueItem(Material mat, BigDecimal planned, String numberPrefix){ // Create set item lore - ArrayList setLoreItem = new ArrayList<>(); - if(!holder.displayLore.isEmpty()){ - setLoreItem.addAll(holder.displayLore); - setLoreItem.add(""); + ArrayList setLoreItem = new ArrayList<>(); + if(holder.displayLore != null){ + setLoreItem.addAll(holder.displayLore.formatted(holder.param, holder.param2)); + setLoreItem.add(Component.empty()); } - setLoreItem.add(AbstractSettingGui.CLICK_LORE); + setLoreItem.addAll(MsgUI.INSTANCE.getSHARED_CLICK_TO_CHANGE().formatted()); // Create & return set value item ItemStack item = new ItemStack(mat); @@ -199,7 +203,7 @@ public class DoubleSettingGui extends AbstractSettingGui { meta.setDisplayName("§e" + displayValue(now) + " §f-> §e" + displayValue(planned) + " §r(" + numberPrefix + (displayValue(planned.subtract(now).abs()) + "§r)")); - meta.setLore(setLoreItem); + ComponentUtil.INSTANCE.applyLore(setLoreItem, meta); item.setItemMeta(meta); return new GuiItem(item, updateNowConsumer(planned), CustomAnvil.instance); @@ -357,7 +361,7 @@ public class DoubleSettingGui extends AbstractSettingGui { */ public static class DoubleSettingFactory extends SettingGuiFactory { @NotNull - String title; + Message title; @NotNull ValueUpdatableGui parent; @@ -369,8 +373,12 @@ public class DoubleSettingGui extends AbstractSettingGui { BigDecimal defaultVal; BigDecimal[] steps; - @NotNull - List displayLore; + @Nullable + Message displayLore; + @Nullable + Object param; + @Nullable + Object param2; /** * Constructor for a double setting gui factory. @@ -392,10 +400,11 @@ public class DoubleSettingGui extends AbstractSettingGui { * If step only contain 1 value, no step item should be displayed. */ public DoubleSettingFactory( - @NotNull String title, @NotNull ValueUpdatableGui parent, + @NotNull Message title, @NotNull ValueUpdatableGui parent, @NotNull ConfigHolder config, @NotNull String configPath, - @Nullable List displayLore, + @Nullable Message displayLore, + @Nullable Object param, @Nullable Object param2, int scale, boolean asPercentage, boolean nullOnZero, double min, double max, double defaultVal, double... steps) { super(configPath, config); @@ -413,18 +422,16 @@ public class DoubleSettingGui extends AbstractSettingGui { this.steps[i] = BigDecimal.valueOf(steps[i]).setScale(scale, RoundingMode.HALF_UP); } - if(displayLore == null){ - this.displayLore = Collections.emptyList(); - }else { - this.displayLore = displayLore; - } + this.displayLore = displayLore; + this.param = param; + this.param2 = param2; } /** * @return Get setting's gui title */ @NotNull - public String getTitle() { + public Message getTitle() { return title; } @@ -448,21 +455,29 @@ public class DoubleSettingGui extends AbstractSettingGui { } - public GuiItem getItem(Material itemMat, String name){ + public GuiItem getItem( + @NotNull Material itemMat, + @NotNull Message name, + Object... params + ){ // Get item properties BigDecimal value = getConfiguredValue(); - StringBuilder itemName = new StringBuilder("§a").append(name); - return GuiGlobalItems.createGuiItemFromProperties(this, itemMat, itemName, - "§e" + displayValue(value, this.asPercentage), - this.displayLore, true); + var itemName = name.formattedConcatenated(params); + + return GuiGlobalItems.createGuiItemFromProperties( + this, itemMat, itemName, + "" + displayValue(value, this.asPercentage), //TODO MESSAGE ? maybe ? + Collections.singletonList(this.displayLore), true, + this.param, this.param2 + ); } public GuiItem getItem(Material itemMat){ // Get item properties String configPath = GuiGlobalItems.getConfigNameFromPath(getConfigPath()); - return getItem(itemMat, CasedStringUtil.detectToUpperSpacedCase(configPath)); + return getItem(itemMat, MsgUI.INSTANCE.getSHARED_GREEN_GET_ITEM(), CasedStringUtil.detectToUpperSpacedCase(configPath)); } } diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/EnchantCostSettingsGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/EnchantCostSettingsGui.java index 0d4bc89a..1e880512 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/EnchantCostSettingsGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/EnchantCostSettingsGui.java @@ -19,6 +19,9 @@ import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui; import xyz.alexcrea.cuanvil.gui.util.GuiGlobalActions; import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems; import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant; +import xyz.alexcrea.cuanvil.lang.Message; +import xyz.alexcrea.cuanvil.lang.MsgUI; +import xyz.alexcrea.cuanvil.util.ComponentUtil; import java.util.Arrays; import java.util.Collections; @@ -150,7 +153,7 @@ public class EnchantCostSettingsGui extends IntSettingsGui { assert meta != null; meta.setDisplayName("§e" + nowBook + " §f-> §e" + planned + " §r(§c-" + (nowBook - planned) + "§r)"); - meta.setLore(Collections.singletonList(AbstractSettingGui.CLICK_LORE)); + ComponentUtil.INSTANCE.applyLore(MsgUI.INSTANCE.getSHARED_CLICK_TO_CHANGE().formatted(), meta); item.setItemMeta(meta); minusItem = new GuiItem(item, updateNowBookConsumer(planned), CustomAnvil.instance); @@ -167,8 +170,8 @@ public class EnchantCostSettingsGui extends IntSettingsGui { ItemMeta meta = item.getItemMeta(); assert meta != null; - meta.setDisplayName("§e" + nowBook + " §f-> §e" + planned + " §r(§a+" + (planned - nowBook) + "§r)"); - meta.setLore(Collections.singletonList(AbstractSettingGui.CLICK_LORE)); + meta.setDisplayName("§e" + nowBook + " §f-> §e" + planned + " §r(§a+" + (planned - nowBook) + "§r)");//TODO MESSAGE + ComponentUtil.INSTANCE.applyLore(MsgUI.INSTANCE.getSHARED_CLICK_TO_CHANGE().formatted(), meta); item.setItemMeta(meta); plusItem = new GuiItem(item, updateNowBookConsumer(planned), CustomAnvil.instance); @@ -182,9 +185,9 @@ public class EnchantCostSettingsGui extends IntSettingsGui { ItemMeta nowMeta = nowPaper.getItemMeta(); assert nowMeta != null; - nowMeta.setDisplayName("§fValue: §e" + nowBook); - if (!holder.displayLore.isEmpty()) { - nowMeta.setLore(holder.displayLore); + nowMeta.setDisplayName("Value: " + nowBook);//TODO MESSAGE + if (holder.displayLore != null) { + ComponentUtil.INSTANCE.applyLore(ComponentUtil.INSTANCE.asComponents(holder.displayLore, holder.param), nowMeta); } nowPaper.setItemMeta(nowMeta); @@ -263,15 +266,15 @@ public class EnchantCostSettingsGui extends IntSettingsGui { * If step only contain 1 value, no step item should be displayed. */ public EnchantCostSettingFactory( - @NotNull String title, ValueUpdatableGui parent, + @NotNull Message title, ValueUpdatableGui parent, @NotNull String configPath, @NotNull ConfigHolder config, - @Nullable List displayLore, + @Nullable Message displayLore, @Nullable Object param, @NotNull CAEnchantment enchantment, int min, int max, int... steps) { super(title, parent, configPath, config, - displayLore, + displayLore, param, min, max, enchantment.defaultRarity().getItemValue(), steps); @@ -302,7 +305,8 @@ public class EnchantCostSettingsGui extends IntSettingsGui { return new EnchantCostSettingsGui(this, nowItem); } - public List getDisplayLore() { + @Nullable + public List getDisplayLore() { return this.displayLore; } } diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/EnumSettingGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/EnumSettingGui.java index 5bf4c24e..9ff90d8a 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/EnumSettingGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/EnumSettingGui.java @@ -15,6 +15,7 @@ import xyz.alexcrea.cuanvil.config.ConfigHolder; import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui; import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems; import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant; +import xyz.alexcrea.cuanvil.lang.Message; import java.util.Collections; import java.util.List; @@ -137,7 +138,7 @@ public class EnumSettingGui & EnumSettingGui.ConfigurableEnum> */ public abstract static class EnumSettingFactory & ConfigurableEnum> extends SettingGuiFactory { @NotNull - String title; + Message title; @NotNull ValueUpdatableGui parent; @@ -150,7 +151,7 @@ public class EnumSettingGui & EnumSettingGui.ConfigurableEnum> * @param config Configuration holder of this setting. */ protected EnumSettingFactory( - @NotNull String title, @NotNull ValueUpdatableGui parent, + @NotNull Message title, @NotNull ValueUpdatableGui parent, @NotNull String configPath, @NotNull ConfigHolder config) { super(configPath, config); this.title = title; @@ -161,7 +162,7 @@ public class EnumSettingGui & EnumSettingGui.ConfigurableEnum> * @return Get setting's gui title. */ @NotNull - public String getTitle() { + public Message getTitle() { return title; } diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/IntSettingsGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/IntSettingsGui.java index c32d22ca..13cf72e5 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/IntSettingsGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/IntSettingsGui.java @@ -5,6 +5,9 @@ import com.github.stefvanschie.inventoryframework.gui.type.util.Gui; import com.github.stefvanschie.inventoryframework.pane.PatternPane; import com.github.stefvanschie.inventoryframework.pane.util.Pattern; import io.delilaheve.CustomAnvil; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.TextColor; +import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.ItemStack; @@ -16,7 +19,10 @@ import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui; import xyz.alexcrea.cuanvil.gui.util.GuiGlobalActions; import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems; import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant; +import xyz.alexcrea.cuanvil.lang.Message; +import xyz.alexcrea.cuanvil.lang.MsgUI; import xyz.alexcrea.cuanvil.util.CasedStringUtil; +import xyz.alexcrea.cuanvil.util.ComponentUtil; import java.util.Collections; import java.util.List; @@ -71,8 +77,8 @@ public class IntSettingsGui extends AbstractSettingGui { ItemMeta meta = item.getItemMeta(); assert meta != null; - meta.setDisplayName("§eReset to default value"); - meta.setLore(Collections.singletonList("§7Default value is §e" + + meta.setDisplayName("§eReset to default value");//TODO MESSAGE + meta.setLore(Collections.singletonList("§7Default value is §e" +//TODO MESSAGE holder.valueDisplayName(ValueDisplayType.RESET, holder.defaultVal))); item.setItemMeta(meta); returnToDefault = new GuiItem(item, event -> { @@ -91,7 +97,7 @@ public class IntSettingsGui extends AbstractSettingGui { // minus item GuiItem minusItem; - if (now > holder.min) { + if(now > holder.min) { int planned = Math.max(holder.min, now - step); minusItem = valueEditItem(Material.RED_TERRACOTTA, ValueDisplayType.REMOVE, planned); } else { @@ -101,7 +107,7 @@ public class IntSettingsGui extends AbstractSettingGui { //plus item GuiItem plusItem; - if (now < holder.max) { + if(now < holder.max) { int planned = Math.min(holder.max, now + step); plusItem = valueEditItem(Material.GREEN_TERRACOTTA, ValueDisplayType.ADD, planned); } else { @@ -114,8 +120,9 @@ public class IntSettingsGui extends AbstractSettingGui { ItemMeta resultMeta = resultPaper.getItemMeta(); assert resultMeta != null; - resultMeta.setDisplayName("§fValue: §e" + holder.valueDisplayName(ValueDisplayType.CURRENT, now)); - resultMeta.setLore(holder.displayLore); + resultMeta.setDisplayName("Value: " + holder.valueDisplayName(ValueDisplayType.CURRENT, now));//TODO MESSAGE + if(holder.displayLore != null) + ComponentUtil.INSTANCE.applyLore(ComponentUtil.INSTANCE.asComponents(holder.displayLore, holder.param), resultMeta); resultPaper.setItemMeta(resultMeta); @@ -125,7 +132,7 @@ public class IntSettingsGui extends AbstractSettingGui { // reset to default GuiItem returnToDefault; - if (now != holder.defaultVal) { + if(now != holder.defaultVal) { returnToDefault = this.returnToDefault; } else { returnToDefault = GuiGlobalItems.backgroundItem(); @@ -142,9 +149,9 @@ public class IntSettingsGui extends AbstractSettingGui { var nowDisplay = holder.valueDisplayName(type, now); var plannedDisplay = holder.valueDisplayName(type, planned); var deltaDisplay = holder.deltaDisplay(type, now, planned); - meta.setDisplayName("§e" + nowDisplay + " §f-> §e" + plannedDisplay + " §r(§c" + deltaDisplay + "§r)"); + meta.setDisplayName("§e" + nowDisplay + " §f-> §e" + plannedDisplay + " §r(§c" + deltaDisplay + "§r)");//TODO MESSAGE - meta.setLore(Collections.singletonList(AbstractSettingGui.CLICK_LORE)); + ComponentUtil.INSTANCE.applyLore(MsgUI.INSTANCE.getSHARED_CLICK_TO_CHANGE().formatted(), meta); item.setItemMeta(meta); return new GuiItem(item, updateNowConsumer(planned), CustomAnvil.instance); } @@ -170,7 +177,7 @@ public class IntSettingsGui extends AbstractSettingGui { GuiItem background = GuiGlobalItems.backgroundItem(); PatternPane pane = getPane(); - for (char i = 'a'; i < (getMidStepChar() - 'a') * 2 + 1; i++) { + for(char i = 'a'; i < (getMidStepChar() - 'a') * 2 + 1; i++) { pane.bindItem(i, background); } // Then update legit step values @@ -181,7 +188,7 @@ public class IntSettingsGui extends AbstractSettingGui { * Update steps items value. */ protected void updateStepValue() { - if (holder.steps.length <= 1) return; + if(holder.steps.length <= 1) return; // We assume steps have a length of 2k+1 cause its more pretty char val = getMidStepChar(); // Offset to start (not the best way to do it) @@ -189,7 +196,7 @@ public class IntSettingsGui extends AbstractSettingGui { // Then place items PatternPane pane = getPane(); - for (int i = 0; i < holder.steps.length; i++) { + for(int i = 0; i < holder.steps.length; i++) { pane.bindItem(val + i, stepGuiItem(i)); } @@ -218,7 +225,7 @@ public class IntSettingsGui extends AbstractSettingGui { StringBuilder stepName = new StringBuilder("§"); List stepLore; Consumer clickEvent; - if (stepValue == step) { + if(stepValue == step) { stepMat = Material.GREEN_STAINED_GLASS_PANE; stepName.append('a'); stepLore = Collections.singletonList("§7Value is changing by " + stepValue); @@ -261,7 +268,7 @@ public class IntSettingsGui extends AbstractSettingGui { public boolean onSave() { holder.config.getConfig().set(holder.configPath, now); - if (GuiSharedConstant.TEMPORARY_DO_SAVE_TO_DISK_EVERY_CHANGE) { + if(GuiSharedConstant.TEMPORARY_DO_SAVE_TO_DISK_EVERY_CHANGE) { return holder.config.saveToDisk(GuiSharedConstant.TEMPORARY_DO_BACKUP_EVERY_SAVE); } return true; @@ -278,7 +285,7 @@ public class IntSettingsGui extends AbstractSettingGui { public static class IntSettingFactory extends SettingGuiFactory { @NotNull - String title; + Message title; @NotNull ValueUpdatableGui parent; int min; @@ -286,8 +293,11 @@ public class IntSettingsGui extends AbstractSettingGui { int defaultVal; int[] steps; - @NotNull - List displayLore; + @Nullable + List displayLore; + + @Nullable + Object param; /** * Constructor for an int setting gui factory. @@ -306,9 +316,9 @@ public class IntSettingsGui extends AbstractSettingGui { * If step only contain 1 value, no step item should be displayed. */ public IntSettingFactory( - @NotNull String title, @NotNull ValueUpdatableGui parent, + @NotNull Message title, @NotNull ValueUpdatableGui parent, @NotNull String configPath, @NotNull ConfigHolder config, - @Nullable List displayLore, + @Nullable Message displayLore, @Nullable Object param, int min, int max, int defaultVal, int... steps) { super(configPath, config); this.title = title; @@ -317,19 +327,15 @@ public class IntSettingsGui extends AbstractSettingGui { this.max = max; this.defaultVal = defaultVal; this.steps = steps; - - if (displayLore == null) { - this.displayLore = Collections.emptyList(); - } else { - this.displayLore = displayLore; - } + this.displayLore = displayLore == null ? null : Collections.singletonList(displayLore); + this.param = param; } /** * @return Get setting's gui title */ @NotNull - public String getTitle() { + public Message getTitle() { return title; } @@ -355,19 +361,24 @@ public class IntSettingsGui extends AbstractSettingGui { * * @param itemMat Displayed material of the item. * @param name Name of the item. + * @param params parameters for the given name. * @return A formatted GuiItem that will create and open a GUI for the int setting. */ public GuiItem getItem( @NotNull Material itemMat, - @NotNull String name + @NotNull Message name, + Object... params ) { // Get item properties int value = getConfiguredValue(); - StringBuilder itemName = new StringBuilder("§a").append(name); + var itemName = name.formattedConcatenated(params); - return GuiGlobalItems.createGuiItemFromProperties(this, itemMat, itemName, - "§e" + value, - this.displayLore, true); + return GuiGlobalItems.createGuiItemFromProperties( + this, itemMat, itemName, + "" + value, //TODO MESSAGE ? maybe ? + this.displayLore, true, + this.param + ); } /** @@ -383,7 +394,7 @@ public class IntSettingsGui extends AbstractSettingGui { @NotNull Material itemMat ) { String configPath = GuiGlobalItems.getConfigNameFromPath(getConfigPath()); - return getItem(itemMat, CasedStringUtil.detectToUpperSpacedCase(configPath)); + return getItem(itemMat, MsgUI.INSTANCE.getSHARED_GREEN_GET_ITEM(), CasedStringUtil.detectToUpperSpacedCase(configPath)); } protected String valueDisplayName(ValueDisplayType type, int value) { @@ -392,10 +403,13 @@ public class IntSettingsGui extends AbstractSettingGui { protected String deltaDisplay(ValueDisplayType type, int now, int planned) { var delta = planned - now; - if (delta < 0) return "§c" + delta; + if(delta < 0) return "§c" + delta; else return "§a+" + delta; } + public @Nullable Object getParam() { + return param; + } } public enum ValueDisplayType { diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/ItemSettingGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/ItemSettingGui.java index 3df2af8c..81de4586 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/ItemSettingGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/ItemSettingGui.java @@ -17,8 +17,11 @@ import xyz.alexcrea.cuanvil.config.ConfigHolder; import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui; import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems; import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant; +import xyz.alexcrea.cuanvil.lang.Message; import xyz.alexcrea.cuanvil.util.CasedStringUtil; +import xyz.alexcrea.cuanvil.util.ComponentUtil; +import java.awt.*; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -168,13 +171,13 @@ public class ItemSettingGui extends AbstractSettingGui { */ public static class ItemSettingFactory extends SettingGuiFactory { @NotNull - String title; + Message title; @NotNull ValueUpdatableGui parent; @Nullable ItemStack defaultVal; @NotNull - List displayLore; + List displayLore; /** * Constructor for an item setting gui factory. @@ -187,10 +190,10 @@ public class ItemSettingGui extends AbstractSettingGui { * @param displayLore Gui display item lore. */ public ItemSettingFactory( - @NotNull String title, @NotNull ValueUpdatableGui parent, + @NotNull Message title, @NotNull ValueUpdatableGui parent, @NotNull String configPath, @NotNull ConfigHolder config, @Nullable ItemStack defaultVal, - String... displayLore) { + Message... displayLore) { super(configPath, config); this.title = title; this.parent = parent; @@ -203,7 +206,7 @@ public class ItemSettingGui extends AbstractSettingGui { * @return Get setting's gui title. */ @NotNull - public String getTitle() { + public Message getTitle() { return title; } @@ -215,7 +218,7 @@ public class ItemSettingGui extends AbstractSettingGui { } @NotNull - public List getDisplayLore() { + public List getDisplayLore() { return this.displayLore; } @@ -245,8 +248,9 @@ public class ItemSettingGui extends AbstractSettingGui { ItemMeta meta = item.getItemMeta(); assert meta != null; + //TODO MESSAGE name ? meta.setDisplayName("§a" + name); - meta.setLore(getDisplayLore()); + ComponentUtil.INSTANCE.applyLore(ComponentUtil.INSTANCE.asComponents(getDisplayLore()), meta); meta.addItemFlags(ItemFlag.values()); item.setItemMeta(meta); diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/WorkPenaltyTypeSettingGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/WorkPenaltyTypeSettingGui.java index 8cc3d2ce..439376aa 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/WorkPenaltyTypeSettingGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/WorkPenaltyTypeSettingGui.java @@ -15,55 +15,48 @@ import xyz.alexcrea.cuanvil.anvil.AnvilUseType; import xyz.alexcrea.cuanvil.config.ConfigHolder; import xyz.alexcrea.cuanvil.config.WorkPenaltyType; import xyz.alexcrea.cuanvil.gui.config.global.BasicConfigGui; -import xyz.alexcrea.cuanvil.gui.util.GuiGlobalActions; +import xyz.alexcrea.cuanvil.lang.Message; import xyz.alexcrea.cuanvil.lang.MsgUI; +import xyz.alexcrea.cuanvil.util.ComponentUtil; import java.util.ArrayList; import java.util.EnumMap; -import java.util.List; import java.util.Map; public class WorkPenaltyTypeSettingGui extends AbstractSettingGui { - private static final String INCREASING_EXPLANATION = "§eIncreasing§7: will penalty be increased (in item)"; - private static final String ADDING_EXPLANATION = "§eAdditive§7: will penalty be added to the cost"; - - private static final String SHARED_EXPLANATION = "§eShared§7: Vanilla, shared penalty. it will be kept from before the plugin installation."; - private static final String EXCLUSIVE_EXPLANATION = "§eExclusive§7: Custom, per anvil use type penalty. it will be lost after plugin uninstallation"; - private final @NotNull WorkPenaltyType currentType; private final @NotNull Map items; public WorkPenaltyTypeSettingGui(@NotNull BasicConfigGui parent) { - super(4, "§8Work Penalty Type", parent); + super(4, MsgUI.INSTANCE.getBASIC_WORK_PENALTY_TITLE(), parent); this.currentType = ConfigOptions.INSTANCE.getWorkPenaltyType(); this.items = new EnumMap<>(this.currentType.getPartMap()); - for (AnvilUseType type : useTypes.keySet()) { + for(AnvilUseType type : useTypes.keySet()) { updateGuiForType(type); } } public static GuiItem getDisplayItem(@NotNull BasicConfigGui parent, @NotNull Material itemMat, - @NotNull String name) { - List displayLore = new ArrayList<>(); + @NotNull Message name) { + var item = new ItemStack(itemMat); - displayLore.add("§7Work penalty increase the price for every anvil use."); - displayLore.add("§7This config allow you to choose the comportment of work penalty."); - displayLore.add(INCREASING_EXPLANATION); - displayLore.add(ADDING_EXPLANATION); - displayLore.add(""); - displayLore.add("§7About shared/exclusive penalty:"); - displayLore.add(SHARED_EXPLANATION); - displayLore.add(EXCLUSIVE_EXPLANATION); + var meta = item.getItemMeta(); + assert meta != null; - ItemStack item = new ItemStack(itemMat); + var lore = new ArrayList(); + lore.add(MsgUI.INSTANCE.getBASIC_WORK_PENALTY_LORE()); + lore.add(MsgUI.INSTANCE.getBASIC_WORK_PENALTY_EXPLAIN_INCREASING()); + lore.add(MsgUI.INSTANCE.getBASIC_WORK_PENALTY_EXPLAIN_ADDITIVE()); + lore.add(MsgUI.INSTANCE.getBASIC_WORK_PENALTY_LORE_BREAK()); + lore.add(MsgUI.INSTANCE.getBASIC_WORK_PENALTY_EXPLAIN_SHARED()); + lore.add(MsgUI.INSTANCE.getBASIC_WORK_PENALTY_EXPLAIN_EXCLUSIVE()); - ItemMeta meta = item.getItemMeta(); - meta.setDisplayName(name); - meta.setLore(displayLore); + ComponentUtil.INSTANCE.setMessageName(meta, name); + ComponentUtil.INSTANCE.applyLore(ComponentUtil.INSTANCE.asComponents(lore), meta); item.setItemMeta(meta); @@ -72,7 +65,7 @@ public class WorkPenaltyTypeSettingGui extends AbstractSettingGui { HumanEntity player = event.getWhoClicked(); // Do not allow to open inventory if player do not have edit configuration permission - if (!player.hasPermission(CustomAnvil.editConfigPermission)) { + if(!player.hasPermission(CustomAnvil.editConfigPermission)) { player.closeInventory(); MsgUI.INSTANCE.getSHARED_CONFIG_NO_EDIT_PERM().send(player); return; @@ -111,6 +104,7 @@ public class WorkPenaltyTypeSettingGui extends AbstractSettingGui { char exclusiveAdditive = typeVals.charAt(4); WorkPenaltyType.WorkPenaltyPart part = items.get(type); + //TODO MESSAGE String increasingStr = (part.penaltyIncrease() ? "§a" : "§c") + "Increasing"; String additiveStr = (part.penaltyAdditive() ? "§a" : "§c") + "Additive"; String exclusiveIncreasingStr = (part.exclusivePenaltyIncrease() ? "§a" : "§c") + "Increasing"; @@ -124,6 +118,7 @@ public class WorkPenaltyTypeSettingGui extends AbstractSettingGui { displayLore.add("§eExclusive§7: " + exclusiveAdditiveStr + " §7| " + exclusiveIncreasingStr); ItemMeta meta = displayItem.getItemMeta(); + assert meta != null; meta.setDisplayName("§e" + type.getDisplayName()); meta.setLore(displayLore); displayItem.setItemMeta(meta); @@ -137,9 +132,14 @@ public class WorkPenaltyTypeSettingGui extends AbstractSettingGui { ItemStack incrementItem = new ItemStack(part.penaltyIncrease() ? Material.GREEN_TERRACOTTA : Material.RED_TERRACOTTA); meta = incrementItem.getItemMeta(); + assert meta != null; meta.setDisplayName(increasingStr); - meta.setLore(List.of(INCREASING_EXPLANATION)); - meta.setLore(List.of(SHARED_EXPLANATION)); + + var lore = new ArrayList(); + lore.add(MsgUI.INSTANCE.getBASIC_WORK_PENALTY_EXPLAIN_INCREASING()); + lore.add(MsgUI.INSTANCE.getBASIC_WORK_PENALTY_EXPLAIN_SHARED()); + + ComponentUtil.INSTANCE.applyLore(ComponentUtil.INSTANCE.asComponents(lore), meta); incrementItem.setItemMeta(meta); pane.bindItem(increment, new GuiItem(incrementItem, (event) -> { @@ -157,9 +157,14 @@ public class WorkPenaltyTypeSettingGui extends AbstractSettingGui { ItemStack additiveItem = new ItemStack(part.penaltyAdditive() ? Material.GREEN_TERRACOTTA : Material.RED_TERRACOTTA); meta = additiveItem.getItemMeta(); + assert meta != null; meta.setDisplayName(additiveStr); - meta.setLore(List.of(ADDING_EXPLANATION)); - meta.setLore(List.of(SHARED_EXPLANATION)); + + lore.clear(); + lore.add(MsgUI.INSTANCE.getBASIC_WORK_PENALTY_EXPLAIN_ADDITIVE()); + lore.add(MsgUI.INSTANCE.getBASIC_WORK_PENALTY_EXPLAIN_SHARED()); + + ComponentUtil.INSTANCE.applyLore(ComponentUtil.INSTANCE.asComponents(lore), meta); additiveItem.setItemMeta(meta); pane.bindItem(additive, new GuiItem(additiveItem, (event) -> { @@ -177,9 +182,14 @@ public class WorkPenaltyTypeSettingGui extends AbstractSettingGui { ItemStack exclusiveIncrementItem = new ItemStack(part.exclusivePenaltyIncrease() ? Material.GREEN_TERRACOTTA : Material.RED_TERRACOTTA); meta = exclusiveIncrementItem.getItemMeta(); + assert meta != null; meta.setDisplayName(exclusiveIncreasingStr); - meta.setLore(List.of(INCREASING_EXPLANATION)); - meta.setLore(List.of(EXCLUSIVE_EXPLANATION)); + + lore.clear(); + lore.add(MsgUI.INSTANCE.getBASIC_WORK_PENALTY_EXPLAIN_INCREASING()); + lore.add(MsgUI.INSTANCE.getBASIC_WORK_PENALTY_EXPLAIN_EXCLUSIVE()); + + ComponentUtil.INSTANCE.applyLore(ComponentUtil.INSTANCE.asComponents(lore), meta); exclusiveIncrementItem.setItemMeta(meta); pane.bindItem(exclusiveIncrement, new GuiItem(exclusiveIncrementItem, (event) -> { @@ -197,9 +207,14 @@ public class WorkPenaltyTypeSettingGui extends AbstractSettingGui { ItemStack exclusiveAdditiveItem = new ItemStack(part.exclusivePenaltyAdditive() ? Material.GREEN_TERRACOTTA : Material.RED_TERRACOTTA); meta = exclusiveAdditiveItem.getItemMeta(); + assert meta != null; meta.setDisplayName(exclusiveAdditiveStr); - meta.setLore(List.of(ADDING_EXPLANATION)); - meta.setLore(List.of(EXCLUSIVE_EXPLANATION)); + + lore.clear(); + lore.add(MsgUI.INSTANCE.getBASIC_WORK_PENALTY_EXPLAIN_ADDITIVE()); + lore.add(MsgUI.INSTANCE.getBASIC_WORK_PENALTY_EXPLAIN_EXCLUSIVE()); + + ComponentUtil.INSTANCE.applyLore(ComponentUtil.INSTANCE.asComponents(lore), meta); exclusiveAdditiveItem.setItemMeta(meta); pane.bindItem(exclusiveAdditive, new GuiItem(exclusiveAdditiveItem, (event) -> { @@ -224,9 +239,9 @@ public class WorkPenaltyTypeSettingGui extends AbstractSettingGui { FileConfiguration config = configHolder.getConfig(); partEnum.forEach((key, value) -> { - String partPath = key.getPath(); + String partPath = key.getPath(); - if (key.getDefaultPenalty().equals(value)) { + if(key.getDefaultPenalty().equals(value)) { config.set(partPath, null); return; } @@ -242,8 +257,8 @@ public class WorkPenaltyTypeSettingGui extends AbstractSettingGui { @Override public boolean hadChange() { - for (AnvilUseType type : items.keySet()) { - if (!currentType.getPenaltyInfo(type).equals(items.get(type))) { + for(AnvilUseType type : items.keySet()) { + if(!currentType.getPenaltyInfo(type).equals(items.get(type))) { return true; } } diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/util/GuiGlobalItems.java b/src/main/java/xyz/alexcrea/cuanvil/gui/util/GuiGlobalItems.java index 79f1462e..d0d7cd4f 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/util/GuiGlobalItems.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/util/GuiGlobalItems.java @@ -4,14 +4,20 @@ import com.github.stefvanschie.inventoryframework.gui.GuiItem; import com.github.stefvanschie.inventoryframework.gui.type.util.Gui; import com.github.stefvanschie.inventoryframework.pane.PatternPane; import io.delilaheve.CustomAnvil; +import net.kyori.adventure.text.Component; import org.bukkit.Material; import org.bukkit.entity.HumanEntity; import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import xyz.alexcrea.cuanvil.dependency.util.PlatformUtil; import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui; import xyz.alexcrea.cuanvil.gui.config.settings.SettingGui; +import xyz.alexcrea.cuanvil.lang.Message; +import xyz.alexcrea.cuanvil.lang.MsgUI; +import xyz.alexcrea.cuanvil.util.ComponentUtil; import java.util.ArrayList; import java.util.Collections; @@ -184,9 +190,6 @@ public class GuiGlobalItems { return new GuiItem(item, GuiGlobalActions.openSettingGuiAction(factory), CustomAnvil.instance); } - // Prefix of the one line lore that will be added to setting's item. - public static final String SETTING_ITEM_LORE_PREFIX = "§7value: "; - /** * Create an arbitrary GuiItem from a unique setting and item's property. * @@ -201,17 +204,23 @@ public class GuiGlobalItems { public static GuiItem createGuiItemFromProperties( @NotNull SettingGui.SettingGuiFactory factory, @NotNull Material itemMat, - @NotNull StringBuilder itemName, - @NotNull Object value, - @NotNull List displayLore, - boolean displayValuePrefix + @NotNull Component itemName, + @NotNull Object value,//TODO ???? + @Nullable List displayLore, + boolean displayValuePrefix, + @Nullable Object... params ) { // Prepare lore - ArrayList lore = new ArrayList<>(); - lore.add((displayValuePrefix ? SETTING_ITEM_LORE_PREFIX : "") + value); - if(!displayLore.isEmpty()){ - lore.add(""); - lore.addAll(displayLore); + var loreHeader = (displayValuePrefix ? + MsgUI.INSTANCE.getGLOBAL_ITEM_ITEM_LORE_PREFIX() : + MsgUI.INSTANCE.getGLOBAL_ITEM_ITEM_LORE_PREFIX_ALONE()); + + List lore = loreHeader.formatted(value); + if(displayLore != null){ + lore.add(Component.empty()); + for(Message message : displayLore) { + lore.addAll(message.formatted(params)); + } } // Create & initialise item @@ -219,8 +228,8 @@ public class GuiGlobalItems { ItemMeta itemMeta = item.getItemMeta(); assert itemMeta != null; - itemMeta.setDisplayName(itemName.toString()); - itemMeta.setLore(lore); + PlatformUtil.INSTANCE.setComponentDisplayName(itemMeta, itemName, null); + ComponentUtil.INSTANCE.applyLore(lore, itemMeta); itemMeta.addItemFlags(ItemFlag.values()); item.setItemMeta(itemMeta); diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/command/DebugToggleExecutor.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/command/DebugToggleExecutor.kt index d42c8d22..17ae3796 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/command/DebugToggleExecutor.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/command/DebugToggleExecutor.kt @@ -109,7 +109,7 @@ class DebugToggleExecutor: CASubCommand { Text(MsgCommand.SHARED_HOVER_COPY.legacy()) ) - sender.spigot().sendMessage(message); + sender.spigot().sendMessage(message) } else { sender.sendMessage(stb.toString()) } @@ -137,7 +137,14 @@ class DebugToggleExecutor: CASubCommand { if(Lang.has(message.key)) validCount++ val valid = (100.0 * validCount) / registeredKeys.size - sender.sendMessage("Translated (${Lang.currentLang()}): ${"%.1f".format(Locale.ROOT, valid)}% ($validCount/${registeredKeys.size})") + sender.sendMessage( + "Translated (${Lang.currentLang()}): ${ + "%.1f".format( + Locale.ROOT, + valid + ) + }% ($validCount/${registeredKeys.size})" + ) } private fun detailedLangDebug(sender: CommandSender) { @@ -179,7 +186,7 @@ class DebugToggleExecutor: CASubCommand { Text(MsgCommand.SHARED_HOVER_COPY.legacy()) ) - sender.spigot().sendMessage(message); + sender.spigot().sendMessage(message) } else { sender.sendMessage("No additional issue found") } @@ -190,7 +197,7 @@ class DebugToggleExecutor: CASubCommand { val texts = if(section == null) listOf(Lang.getTranslated(message.key)) else - section.getValues(false).map { it.value.toString() } + section.getValues(false).map {it.value.toString()} val textParams = ArrayList() @@ -198,8 +205,7 @@ class DebugToggleExecutor: CASubCommand { var index = 0 while(true) { index = text.indexOf('%', index) - //TODO add \% to "ignore" % as param inside param finder - if(index > 0 && text[index-1] == '\\') { + if(index > 0 && text[index - 1] == '\\') { index++ continue } @@ -218,23 +224,29 @@ class DebugToggleExecutor: CASubCommand { for(textParam in textParams) { var found = false for(param in message.params) { - if(param.isEmpty()) continue + if(param == null) continue if(textParam.startsWith(param)) { found = true usedParam.add(param) break } } + if(found) break - if(!found) { - hadIssue = true - stb.append("Did not found param %$textParam in register list for ${message.key}\n") - } + hadIssue = true + stb.append("Did not found param %$textParam in register list for ${message.key}\n") } for(param in message.params) { - if(usedParam.contains(param)) continue - if("unused".contentEquals(param)) continue + if(param == null) continue + var found = false + for(used in usedParam) { + if(!used.startsWith(param)) continue + found = true + break + } + + if(found) continue hadIssue = true stb.append("Param %$param is not used for key ${message.key}\n") } diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/command/DiagnosticExecutor.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/command/DiagnosticExecutor.kt index 0644a6fa..07f03ab0 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/command/DiagnosticExecutor.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/command/DiagnosticExecutor.kt @@ -219,8 +219,8 @@ class DiagnosticExecutor : CASubCommand { } private fun pluginListDiag(sender: CommandSender, stb: StringBuilder) { - val enabledPlugins: MutableList = ArrayList() - val disabledPlugins: MutableList = ArrayList() + val enabledPlugins: MutableList = ArrayList() + val disabledPlugins: MutableList = ArrayList() for (plugin in Bukkit.getPluginManager().plugins) { if (plugin.isEnabled) { enabledPlugins.add(plugin) diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/lang/Message.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/lang/Message.kt index 64d9242d..82a43ba5 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/lang/Message.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/lang/Message.kt @@ -12,9 +12,10 @@ import xyz.alexcrea.cuanvil.util.ComponentUtil.serializePlain import xyz.alexcrea.cuanvil.util.MiniMessageUtil import java.util.Collections import java.util.logging.Level +import kotlin.math.max import kotlin.math.min -open class Message(val key: String, vararg val params: String, register: Boolean = true) { +open class Message(val key: String, vararg val params: String?, register: Boolean = true) { companion object { private val values = ArrayList() @@ -28,30 +29,61 @@ open class Message(val key: String, vararg val params: String, register: Boolean if(register) values.add(this) } - protected fun replaceParameters(stb: StringBuilder, vararg values: Any) { + protected fun replaceParameters(stb: StringBuilder, vararg values: Any?) { // replace all placeholder thingy %key -> value if(params.size != values.size) { CustomAnvil.log("Wrong number of argument for parameter for key $key (${params.size}/${values.size})") + for(i in 0 until max(params.size, values.size)) { + val key = if(i >= params.size) "NOT KEY" + else params[i] + val value = if(i >= values.size) "NOT VALUE" + else values[i] + + CustomAnvil.log("Parameter ${i + 1} is $key with value $value") + } } + var foundBackslashPercent = false for(i in 0 until min(params.size, values.size)) { - val key = params[i] - val replacement = values[i].toString() - if(replacement.isEmpty()) continue //May not be good but can be changed if cause an issue + val key = params[i] ?: continue + val value = values[i] + if(value == null) { + CustomAnvil.log("Passed a null value for key ${this.key} for Parameter $key (${i + 1})") + continue + } + + val replacement = value.toString() + if(replacement.isEmpty()) continue //May not be good but can be changed if cause an issue //TODO REPLACE WITH NULL var current = 0 while(true) { - current = stb.indexOf('%', current) + 1 - if(current <= 0 || current + key.length > stb.length) break // may be able to be removed if bound checked in startsWith ? + current = stb.indexOf('%', current) + if(current > 0 && stb[current - 1] == '\\') { + foundBackslashPercent = true + continue + } + if(++current <= 0 || current + key.length > stb.length) break // may be able to be removed if bound checked in startsWith ? if(!stb.startsWith(key, current, false)) continue stb.replace(current - 1, current + key.length, replacement) current = current - 1 + replacement.length } } + + if(foundBackslashPercent) { + // Remove the \% to \ + var current = 0 + while(true) { + current = stb.indexOf("\\%", current) + if(current < 0) break + + stb.replace(current, current + 2, "%") + current++ + } + } } - private fun unformattedMonoline(vararg params: Any): String { + private fun unformattedMonoline(vararg params: Any?): String { val translated = Lang.getTranslated(key) if(params.isEmpty() && this.params.isEmpty()) return translated @@ -60,7 +92,7 @@ open class Message(val key: String, vararg val params: String, register: Boolean return stb.toString() } - private fun unformattedMultiline(section: ConfigurationSection, vararg params: Any): String { + private fun unformattedMultiline(section: ConfigurationSection, vararg params: Any?): String { val stb = StringBuilder() for(key in section.getKeys(false)) { @@ -74,14 +106,14 @@ open class Message(val key: String, vararg val params: String, register: Boolean return stb.toString() } - fun unformatted(vararg params: Any): String { + fun unformatted(vararg params: Any?): String { val section = Lang.getSection(key) if(section != null) return unformattedMultiline(section, *params) return unformattedMonoline(*params) } - private fun formattedMultiline(section: ConfigurationSection, vararg params: Any): List { + private fun formattedMultiline(section: ConfigurationSection, vararg params: Any?): MutableList { val result = ArrayList() for(key in section.getKeys(false)) { @@ -93,21 +125,21 @@ open class Message(val key: String, vararg val params: String, register: Boolean result.add(MiniMessageUtil.mm.deserialize(stb.toString())) } - if(result.isEmpty()) return listOf(Component.text(key)) + if(result.isEmpty()) return mutableListOf(Component.text(key)) return result } // return a list of AT LEAST 1 element. calling first is safe - fun formatted(vararg params: Any): List { + fun formatted(vararg params: Any?): MutableList { val section = Lang.getSection(key) if(section != null) return formattedMultiline(section, *params) val translated = unformattedMonoline(*params) - return listOf(MiniMessageUtil.mm.deserialize(translated)) + return mutableListOf(MiniMessageUtil.mm.deserialize(translated)) } - fun formattedConcatenated(vararg params: Any): Component { + fun formattedConcatenated(vararg params: Any?): Component { val formated = formatted(*params) var result = formated.first() @@ -118,11 +150,11 @@ open class Message(val key: String, vararg val params: String, register: Boolean return result } - fun textHolder(vararg params: Any): TextHolder { + fun textHolder(vararg params: Any?): TextHolder { return ComponentHolder.of(formattedConcatenated(*params)) } - fun legacy(vararg params: Any): String { + fun legacy(vararg params: Any?): String { val formated = formatted(*params) val stb = StringBuilder() @@ -133,7 +165,7 @@ open class Message(val key: String, vararg val params: String, register: Boolean return stb.toString() } - open fun log(vararg params: Any) { + open fun log(vararg params: Any?) { val texts = formatted(*params) for(component in texts) { @@ -141,14 +173,14 @@ open class Message(val key: String, vararg val params: String, register: Boolean } } - open fun send(destination: CommandSender, vararg params: Any) { + open fun send(destination: CommandSender, vararg params: Any?) { formatted(*params).send(destination) } } -class WarningMessage(key: String, vararg params: String) : Message("warning.$key", *params) { +class WarningMessage(key: String, vararg params: String): Message("warning.$key", *params) { - override fun log(vararg params: Any) { + override fun log(vararg params: Any?) { val texts = formatted(*params) for(component in texts) { @@ -157,9 +189,9 @@ class WarningMessage(key: String, vararg params: String) : Message("warning.$key } } -class ErrorMessage(key: String, vararg params: String) : Message("error.$key", *params) { +class ErrorMessage(key: String, vararg params: String): Message("error.$key", *params) { - override fun log(vararg params: Any) { + override fun log(vararg params: Any?) { val texts = formatted(*params) for(component in texts) { @@ -167,7 +199,7 @@ class ErrorMessage(key: String, vararg params: String) : Message("error.$key", * } } - fun log(e: Throwable, vararg params: Any, level: Level = Level.SEVERE, track: Boolean = true) { + fun log(e: Throwable, vararg params: Any?, level: Level = Level.SEVERE, track: Boolean = true) { val texts = formatted(*params) for(component in texts) { @@ -176,5 +208,5 @@ class ErrorMessage(key: String, vararg params: String) : Message("error.$key", * } } -class CommandMessage(key: String, vararg params: String) : Message("command.$key", *params) -class UIMessage(key: String, vararg params: String) : Message("config-ui.$key", *params) \ No newline at end of file +class CommandMessage(key: String, vararg params: String): Message("command.$key", *params) +class UIMessage(key: String, vararg params: String): Message("config-ui.$key", *params) \ No newline at end of file diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/lang/MsgUI.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/lang/MsgUI.kt index 1a876e6e..a5734d44 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/lang/MsgUI.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/lang/MsgUI.kt @@ -6,6 +6,12 @@ object MsgUI { val SHARED_CONFIG_NO_EDIT_PERM = Message("shared.no-permission") val SHARED_TYPED_CONFIG_TITLE = Message("shared.typed-config-title", "type") + val SHARED_CLICK_TO_CHANGE = Message("shared.click-to-change") + val SHARED_GREEN_GET_ITEM = Message("shared.green-get-item", "name") + val SHARED_YELLOW_GET_ITEM = Message("shared.yellow-get-item", "name") + + val GLOBAL_ITEM_ITEM_LORE_PREFIX = Message("global-item.item-lore-prefix", "value") + val GLOBAL_ITEM_ITEM_LORE_PREFIX_ALONE = Message("global-item.item-lore-prefix-alone", "value") val CONFIRM_ACTION_FAILED = Message("confirm-action.fail") val CONFIRM_ACTION_ARE_YOU_SURE = Message("confirm-action.is-user-sure") @@ -16,44 +22,145 @@ object MsgUI { val ELEMENT_LIST_CANCELLED_NEW = Message("element-list.cancelled-new", "type") val ELEMENT_LIST_DUPLICATED_NEW = Message("element-list.duplicated-new", "type") - val UNIT_REPAIR_TITLE = Message("unit-repair.title", "unused", "page", "max_page") + val UNIT_REPAIR_TITLE = Message("unit-repair.title", null, "page", "max_page") + val UNIT_REPAIR_ITEM = Message("unit-repair.item", "name", "unit") val UNIT_REPAIR_ELEMENT_TITLE = Message("unit-repair.element.title", "type", "page", "max_page") - val UNIT_REPAIR_NEW_TITLE = Message("unit-repair.new.title") - val UNIT_REPAIR_NEW_DESCRIPTION = Message("unit-repair.new.description") + val UNIT_REPAIR_NEW_TITLE = Message("unit-repair.new.title", null) + val UNIT_REPAIR_NEW_DESCRIPTION = Message("unit-repair.new.description", null) - val UNIT_REPAIR_NEW_ELEMENT_TITLE = Message("unit-repair.element.new.title", "unused") + val UNIT_REPAIR_ELEMENT_VALUE_TITLE = Message("unit-repair.element.value.title", "name", null) + val UNIT_REPAIR_ELEMENT_VALUE_DESCRIPTION = Message("unit-repair.element.value.description", "name", "unit") + + val UNIT_REPAIR_NEW_ELEMENT_TITLE = Message("unit-repair.element.new.title", null) val UNIT_REPAIR_NEW_ELEMENT_DESCRIPTION = Message("unit-repair.element.new.description", "name") val UNIT_REPAIR_NEW_ELEMENT_CANNOT_REPAIR = Message("unit-repair.element.new.cannot-damage") val UNIT_REPAIR_NEW_ELEMENT_SAME_TYPE = Message("unit-repair.element.new.same-type") - val CUSTOM_RECIPE_TITLE = Message("custom-recipe.title", "unused", "page", "max_page") + val CUSTOM_RECIPE_TITLE = Message("custom-recipe.title", null, "page", "max_page") + + val CUSTOM_RECIPE_ELEMENT_EXACT_COUNT_TITLE = Message("custom-recipe.element.exact-count") + val CUSTOM_RECIPE_ELEMENT_LINEAR_XP_TITLE = Message("custom-recipe.element.linear-xp.title") + val CUSTOM_RECIPE_ELEMENT_LINEAR_XP_NAME = Message("custom-recipe.element.linear-xp.name") + val CUSTOM_RECIPE_ELEMENT_LINEAR_XP_LORE = Message("custom-recipe.element.linear-xp.lore") + val CUSTOM_RECIPE_ELEMENT_COST_LEVEL_XP = Message("custom-recipe.element.recipe-cost.level") + val CUSTOM_RECIPE_ELEMENT_COST_LINEAR_XP = Message("custom-recipe.element.recipe-cost.xp") + + val CUSTOM_RECIPE_ELEMENT_ITEM_LEFT_TITLE = Message("custom-recipe.element.item.left.title") + val CUSTOM_RECIPE_ELEMENT_ITEM_LEFT_DESCRIPTION = Message("custom-recipe.element.item.left.description") + val CUSTOM_RECIPE_ELEMENT_ITEM_RIGHT_TITLE = Message("custom-recipe.element.item.right.title") + val CUSTOM_RECIPE_ELEMENT_ITEM_RIGHT_DESCRIPTION = Message("custom-recipe.element.item.right.description") + val CUSTOM_RECIPE_ELEMENT_ITEM_RESULT_TITLE = Message("custom-recipe.element.item.result.title") + val CUSTOM_RECIPE_ELEMENT_ITEM_RESULT_DESCRIPTION = Message("custom-recipe.element.item.result.description") val CUSTOM_RECIPE_ELEMENT_DELETE_TITLE = Message("custom-recipe.element.delete.title", "type") - val CUSTOM_RECIPE_ELEMENT_DELETE_DESCRIPTION = Message("custom-recipe.element.delete.description", "unused") + val CUSTOM_RECIPE_ELEMENT_DELETE_DESCRIPTION = Message("custom-recipe.element.delete.description", null) + val CUSTOM_RECIPE_ELEMENT_DELETE_BUTTON_NAME = Message("custom-recipe.element.delete.button.name") + val CUSTOM_RECIPE_ELEMENT_DELETE_BUTTON_LORE = Message("custom-recipe.element.delete.button.lore") - val ENCHANTMENT_LEVEL_COST_TITLE = Message("enchant-level-cost.title", "unused", "page", "max_page") + val ENCHANTMENT_LEVEL_COST_TITLE = Message("enchant-level-cost.title", null, "page", "max_page") + val ENCHANTMENT_LEVEL_COST_ELEMENT_TITLE = Message("enchant-level-cost.element.title", "name") + val ENCHANTMENT_LEVEL_COST_ELEMENT_DESCRIPTION = Message("enchant-level-cost.element.description", "name") + val ENCHANTMENT_LEVEL_COST_ELEMENT_ITEM_COST = Message("enchant-level-cost.element.item-cost") + val ENCHANTMENT_LEVEL_COST_ELEMENT_BOOK_COST = Message("enchant-level-cost.element.book-cost") - val ENCHANTMENT_LEVEL_LIMIT_TITLE = Message("enchant-level-limit.title", "unused", "page", "max_page") + val ENCHANTMENT_LEVEL_LIMIT_TITLE = Message("enchant-level-limit.title", null, "page", "max_page") + val ENCHANTMENT_LEVEL_LIMIT_ELEMENT_TITLE = Message("enchant-level-limit.element.title", "name") + val ENCHANTMENT_LEVEL_LIMIT_ELEMENT_DESCRIPTION = Message("enchant-level-limit.element.description", "name") - val ENCHANTMENT_MERGE_LIMIT_TITLE = Message("enchant-merge-limit.title", "unused", "page", "max_page") + val ENCHANTMENT_MERGE_LIMIT_TITLE = Message("enchant-merge-limit.title", null, "page", "max_page") + val ENCHANTMENT_MERGE_LIMIT_ELEMENT_TITLE = Message("enchant-merge-limit.element.title", "name") + val ENCHANTMENT_MERGE_LIMIT_ELEMENT_DESCRIPTION = Message("enchant-merge-limit.element.description", "name") - val ENCHANTMENT_CONFLICT_TITLE = Message("enchant-conflict.title", "unused", "page", "max_page") + val ENCHANTMENT_CONFLICT_TITLE = Message("enchant-conflict.title", null, "page", "max_page") val ENCHANTMENT_CONFLICT_ELEMENT_ENCHANTMENTS = Message("enchant-conflict.element.selected-enchantments", "group") val ENCHANTMENT_CONFLICT_ELEMENT_SUB_GROUPS = Message("enchant-conflict.element.selected-sub-groups", "group") val ENCHANTMENT_CONFLICT_ELEMENT_DELETE_TITLE = Message("enchant-conflict.element.delete.title", "type") - val ENCHANTMENT_CONFLICT_ELEMENT_DELETE_DESCRIPTION = Message("enchant-conflict.element.delete.description", "unused") + val ENCHANTMENT_CONFLICT_ELEMENT_DELETE_DESCRIPTION = Message("enchant-conflict.element.delete.description", null) + val ENCHANTMENT_CONFLICT_ELEMENT_DELETE_BUTTON_NAME = Message("enchant-conflict.element.delete.button.name") + val ENCHANTMENT_CONFLICT_ELEMENT_DELETE_BUTTON_LORE = Message("enchant-conflict.element.delete.button.lore") + val ENCHANTMENT_CONFLICT_ELEMENT_MIN_BEFORE_COUNT_TITLE = Message("enchant-conflict.element.min-before-count.title") + val ENCHANTMENT_CONFLICT_ELEMENT_MIN_BEFORE_COUNT_DESCRIPTION = Message("enchant-conflict.element.min-before-count.description") + val ENCHANTMENT_CONFLICT_ELEMENT_MIN_BEFORE_COUNT_ITEM = Message("enchant-conflict.element.min-before-count.item") - val MATERIAL_GROUP_TITLE = Message("material-group.title", "unused", "page", "max_page") + val MATERIAL_GROUP_TITLE = Message("material-group.title", null, "page", "max_page") val MATERIAL_GROUP_ELEMENT_SELECTED_MATERIALS = Message("material-group.element.selected-materials", "group") val MATERIAL_GROUP_ELEMENT_SELECTED_SUB_GROUPS = Message("material-group.element.selected-sub-groups", "group") val MATERIAL_GROUP_ELEMENT_DELETE_TITLE = Message("material-group.element.delete.title", "type") - val MATERIAL_GROUP_ELEMENT_DELETE_DESCRIPTION = Message("material-group.element.delete.description", "unused") + val MATERIAL_GROUP_ELEMENT_DELETE_DESCRIPTION = Message("material-group.element.delete.description", null) val MATERIAL_GROUP_ELEMENT_DELETE_BUTTON_NAME = Message("material-group.element.delete.button.name") val MATERIAL_GROUP_ELEMENT_DELETE_BUTTON_LORE = Message("material-group.element.delete.button.lore") - val MATERIAL_SELECT_CONFIRM_TITLE = Message("material-select.new.confirm.title","name") - val MATERIAL_SELECT_CONFIRM_DESCRIPTION = Message("material-select.new.confirm.description","name") + val MATERIAL_SELECT_CONFIRM_TITLE = Message("material-select.new.confirm.title", "name") + val MATERIAL_SELECT_CONFIRM_DESCRIPTION = Message("material-select.new.confirm.description", "name") + + /* + * ------------------ + * Basic Config Gui + * ------------------ + */ + val BASIC_TITLE = Message("basic-config.title") + + val BASIC_CAP_ANVIL_COST_TITLE = Message("basic-config.cap-anvil-cost.title") + val BASIC_CAP_ANVIL_COST_DESCRIPTION = Message("basic-config.cap-anvil-cost.description") + val BASIC_CAP_ANVIL_COST_ITEM = Message("basic-config.cap-anvil-cost-cost.item") + val BASIC_CAP_ANVIL_COST_DISABLED_TITLE = Message("basic-config.cap-anvil-cost.disabled.title") + val BASIC_CAP_ANVIL_COST_DISABLED_DESCRIPTION = Message("basic-config.cap-anvil-cost.disabled.description") + + val BASIC_MAX_ANVIL_COST_TITLE = Message("basic-config.max-anvil-cost.title") + val BASIC_MAX_ANVIL_COST_DESCRIPTION = Message("basic-config.max-anvil-cost.description") + val BASIC_MAX_ANVIL_COST_ITEM = Message("basic-config.max-anvil-cost.item") + val BASIC_MAX_ANVIL_COST_DISABLED_TITLE = Message("basic-config.max-anvil-cost.disabled.title") + val BASIC_MAX_ANVIL_COST_DISABLED_DESCRIPTION = Message("basic-config.max-anvil-cost.disabled.description") + + val BASIC_REMOVE_COST_LIMIT_TITLE = Message("basic-config.remove-cost-limit.title") + val BASIC_REMOVE_COST_LIMIT_DESCRIPTION = Message("basic-config.remove-cost-limit.description") + val BASIC_REMOVE_COST_LIMIT_ITEM = Message("basic-config.remove-cost-limit.item") + + val BASIC_REPLACE_TOO_EXPENSIVE_TITLE = Message("basic-config.remove-too-expensive.title") + val BASIC_REPLACE_TOO_EXPENSIVE_DESCRIPTION = Message("basic-config.remove-too-expensive.description") + val BASIC_REPLACE_TOO_EXPENSIVE_DESCRIPTION_NO_NMS = Message("basic-config.remove-too-expensive.description-no-nms") + + val BASIC_ITEM_REPAIR_COST_TITLE = Message("basic-config.item-repair-cost.title") + val BASIC_ITEM_REPAIR_COST_DESCRIPTION = Message("basic-config.item-repair-cost.description") + + val BASIC_ITEM_RENAME_COST_TITLE = Message("basic-config.item-rename-cost.title") + val BASIC_ITEM_RENAME_COST_DESCRIPTION = Message("basic-config.item-rename-cost.description") + + val BASIC_UNIT_REPAIR_COST_TITLE = Message("basic-config.unit-repair-cost.title") + val BASIC_UNIT_REPAIR_COST_DESCRIPTION = Message("basic-config.unit-repair-cost.description") + + val BASIC_SACRIFICE_ILLEGAL_COST_TITLE = Message("basic-config.sacrifice-illegal-cost.title") + val BASIC_SACRIFICE_ILLEGAL_COST_DESCRIPTION = Message("basic-config.sacrifice-illegal-cost.description") + + + val BASIC_COLOR_CODE_LIMIT_TITLE = Message("basic-config.color-code.title") + val BASIC_COLOR_CODE_LIMIT_DESCRIPTION = Message("basic-config.color-code.description") + + val BASIC_COLOR_HEX_LIMIT_TITLE = Message("basic-config.color-hex.title") + val BASIC_COLOR_HEX_LIMIT_DESCRIPTION = Message("basic-config.color-hex.description") + + val BASIC_COLOR_PERMISSION_TITLE = Message("basic-config.color-permission.title") + val BASIC_COLOR_PERMISSION_DESCRIPTION = Message("basic-config.color-permission.description") + val BASIC_COLOR_PERMISSION_DISABLED_TITLE = Message("basic-config.color-permission.disabled.title") + val BASIC_COLOR_PERMISSION_DISABLED_DESCRIPTION = Message("basic-config.color-permission.disabled.description") + + val BASIC_COLOR_COST_TITLE = Message("basic-config.color-cost.title") + val BASIC_COLOR_COST_DESCRIPTION = Message("basic-config.color-cost.description") + val BASIC_COLOR_COST_ITEM = Message("basic-config.color-cost.item") + val BASIC_COLOR_COST_DISABLED_TITLE = Message("basic-config.color-cost.disabled.title") + val BASIC_COLOR_COST_DISABLED_DESCRIPTION = Message("basic-config.color-cost.disabled.description") + + val BASIC_WORK_PENALTY_TITLE = Message("basic-config.work-penalty.title") + val BASIC_WORK_PENALTY_ITEM = Message("basic-config.work-penalty.item") + val BASIC_WORK_PENALTY_LORE = Message("basic-config.work-penalty.lore") + val BASIC_WORK_PENALTY_LORE_BREAK = Message("basic-config.work-penalty.lore-break") + val BASIC_WORK_PENALTY_EXPLAIN_INCREASING = Message("basic-config.work-penalty.explanation.increasing") + val BASIC_WORK_PENALTY_EXPLAIN_ADDITIVE = Message("basic-config.work-penalty.explanation.additive") + val BASIC_WORK_PENALTY_EXPLAIN_SHARED = Message("basic-config.work-penalty.explanation.shared") + val BASIC_WORK_PENALTY_EXPLAIN_EXCLUSIVE = Message("basic-config.work-penalty.explanation.exclusive") + + } \ No newline at end of file diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/util/ComponentUtil.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/util/ComponentUtil.kt index 261e085a..a9171131 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/util/ComponentUtil.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/util/ComponentUtil.kt @@ -31,7 +31,7 @@ object ComponentUtil { destination.sendMessage(this.serializeLegacy()) } - fun List.send(destination: CommandSender) { + fun Collection.send(destination: CommandSender) { for(component in this) component.send(destination) } @@ -41,8 +41,25 @@ object ComponentUtil { meta.lore = this.map {obj -> obj.serializeLegacy()} } - fun ItemMeta.setMessageName(message: Message, vararg params: Any) { + fun ItemMeta.setMessageName(message: Message, vararg params: Any?) { this.setComponentDisplayName(message.formattedConcatenated(*params)) } + fun List.asComponents(vararg params: Any?): List { + val result = ArrayList() + for(message in this) { + result.addAll(message.formatted(*params)) + } + return result + } + + fun Array.asComponents(vararg params: Any?): List { + val result = ArrayList() + for(message in this) { + result.addAll(message.formatted(*params)) + } + return result + } + + } \ No newline at end of file diff --git a/src/main/resources/lang/en.yml b/src/main/resources/lang/en.yml index 87527ea1..4f90bb34 100644 --- a/src/main/resources/lang/en.yml +++ b/src/main/resources/lang/en.yml @@ -1,8 +1,7 @@ name: English last-updated: 2.1.0 -warning: - load: +warning.load: legacy: old-name: 1: "An old version of this plugin was detected" @@ -14,11 +13,11 @@ warning: 1: "If replace too expensive is not working this is likely because of spigot" 2: "As native nms is not supported for spigot starting 26.1" update.available: "An update may be available: %version" - anvil: + +warning.anvil: generic: "[CustomAnvil] Error while handling the anvil." -error: - load: +error.load: legacy.failed: "error trying to check for legacy system" update.check-fail: "error trying to fetch latest update" command-register: "error trying to register commands" @@ -27,16 +26,15 @@ error: enchant-system: "error initializing enchantment system" non-default-config: "Plugin has an issue while trying to load non default config... exiting..." - reload: +error.reload: resource: fail: "Resource %path Could not be loaded or reloaded." hard-fail: "Disabling plugin." - confirm-action: +error.confirm-action: generic: "Could not process confirmation supplier." -command: - shared: +command.shared: no-diag-permission: "You do not have permission to diagnostic this server" hover-copy: "Click to copy" unknown-subcmd: "Unknown subcommand %command" @@ -44,13 +42,13 @@ command: warning: missing-subcmd: "Need to specify a subcommand. for example %example1 or %example2" - root: +command.root: warning: unknown-sub: "Invalid subcommand. run `%command help` to see available commands" error: generic: "Error running this command" - debug: +command.debug: description: "Used to toggle debug logs and retrieve them" log-cleared: "Log Cleared" toggled: "Debug toggled to %type" @@ -64,12 +62,12 @@ command: invalid-type: "Invalid debug type \"%type\"" no-log: "No log to show ? make sure you tried with debug log toggled (%command)" - diagnostic: +command.diagnostic: description: "Basic diagnostic of this plugin" had-error: "There was an error running the diagnostic" copy: "Click to copy diagnostic data" - config: +command.config: description: "Used to edit the configuration of the plugin" folia-issue: 1: "It look like you are using Folia. Sadly Custom Anvil do not support Config gui for Folia." @@ -84,7 +82,7 @@ command: legacy-name: "/ca gui has been moved to /ca config" cannot_configure: "Cannot configure the item in hand" - enchant: +command.enchant: description: "Allows to set enchantment to holden item" warning: missing_parameter: "Missing enchantment parameter" @@ -94,38 +92,46 @@ command: removed: "%name removed" set: "%name set to level %level" - help: +command.help: description: "Help command" header: "List of available commands:" - reload: +command.reload: description: "Reload the configuration of this plugin" start: "Reloading config..." success: "Config reloaded !" fail: "Config was not able to be reloaded..." hard-fail: "Hard fail, plugin disabled" -config-ui: - shared: + +config-ui.shared: no-permission: "You do not have permission to edit the config" typed-config-title: "%type Config" + click-to-change: "Click Here to change the value" + green-get-item: "%name" + yellow-get-item: "%name" - confirm-action: +config-ui.global-item: + item-lore-prefix: "value: %value" + item-lore-prefix-alone: "%value" + +config-ui.confirm-action: fail: "Action could not be completed." is-user-sure: "Are you sure ?" - select-item-type: +config-ui.select-item-type: place-here: "Place an item here" - element-list: +config-ui.element-list: instruction-new: 1: "Write the %type name you want to create in the chat." 2: "Or write cancel to go back to %type config menu" cancelled-new: "%type creation cancelled..." duplicated-new: "Please enter a %type name that do not already exist..." - unit-repair: +config-ui.unit-repair: title: "Unit Repair Config (%page/%max_page)" + item: "\\%%name repaired by %unit" new: title: "Select unit repair item." description: @@ -133,6 +139,11 @@ config-ui: 2: "You like to be an unit repair item" element: title: "%type Unit repair (%page/%max_page)" + value: + title: "\\%%name Repair" + description: + 1: "Click here to change how many \\% of %name" + 2: "Should get repaired by %unit" new: title: "Select item to be repaired." description: @@ -141,23 +152,71 @@ config-ui: cannot-damage: "This item can't be damaged, so it can't be repaired." same-type: "Item can't repair something of the same type." - custom-recipe: +config-ui.custom-recipe: title: "Custom Recipe Config (%page/%max_page)" element: + exact-count: "Exact count ?" + linear-xp: + title: "Remove exact linear xp ?" + name: "Remove exact linear xp ?" + lore: "Not usable if linear cost is 0" + recipe-cost: + level: "recipe Level Cost" + xp: "Recipe Linear Xp Cost" + item: + left: + title: "Recipe Left Item" + description: + 1: "Set the left item of the custom craft" + 2: "■ + □ = □" + right: + title: "Recipe Right Item" + description: + 1: "Set the right item of the custom craft" + 2: "□ + ■ = □" + result: + title: "Recipe Result Item" + description: + 1: "Set the result item of the custom craft" + 2: "□ + □ = ■" delete: title: "Delete %type?" description: "Confirm that you want to delete this recipe." + button: + name: "DELETE RECIPE" + lore: "Caution with this button !" - enchant-level-cost: +config-ui.enchant-level-cost: title: "Enchantment Level Limit (%page/%max_page)" + element: + title: "%name Cost" + description: + 1: "How many level should %name" + 2: "cost when applied by book or by another item." - enchant-level-limit: + item-cost: "Item Cost: %cost" + book-cost: "Book Cost: %cost" + +config-ui.enchant-level-limit: title: "Enchantment Level Limit (%page/%max_page)" + element: + title: "%name Limit" + description: + 1: "Maximum applied level of %name" - enchant-merge-limit: +config-ui.enchant-merge-limit: title: "Enchantment Maximum Merge Level (%page/%max_page)" + element: + title: "%name Merge Limit" + description: + 1: "Maximum merge level for for %name" + 2: "" + 3: "For example, if set to 2, lvl1 + lvl1 of will give a lvl2" + 4: "But lvl2 + lvl2 will not give a lv3." + 5: "Will still not merge above max enchantment level" + 6: "-1 (default) will set the merge limit to enchantment's maximum level" - enchant-conflict: +config-ui.enchant-conflict: title: "Conflict Config (%page/%max_page)" element: selected-enchantments: "%group" # likely need page and max page @@ -165,8 +224,17 @@ config-ui: delete: title: "Delete %type?" description: "Confirm that you want to delete this conflict." + button: + name: "DELETE CONFLICT" + lore: "Caution with this button !" + min-before-count: + item: "Minimum Enchantment Count" + title: "Minimum enchantment count" + description: + 1: "Minimum enchantment count set to X mean only X enchantment can be put" + 2: "on an item before the conflict is active." - material-group: +config-ui.material-group: title: "Group Config (%page/%max_page)" element: selected-materials: "%group Materials" @@ -178,8 +246,134 @@ config-ui: name: "DELETE GROUP" lore: "Caution with this button !" - material-select: +config-ui.material-select: new: confirm: title: "Remove %name" description: "Confirm Remove %name from this list." + +config-ui.basic-config: + title: "Basic Config" + +config-ui.basic-config.cap-anvil-cost: + item: "Cap Anvil Cost" + title: "Cap Anvil Cost ?" + description: + 1: "All anvil cost will be capped to Max Anvil Cost if enabled." + 2: "In other words:" + 3: "For any anvil cost greater than Max Anvil Cost, Cost will be set to Max Anvil Cost." + disabled: + title: "Cap Anvil Cost ?" + description: "This config only work if Limit Repair Cost is disabled." + +config-ui.basic-config.max-anvil-cost: + item: "Max Anvil Cost" + title: "Max Anvil Cost" + description: + 1: "Max cost the Anvil can get to." + 2: "Valid values include 0 to 1000." + 3: "Cost will be displayed as Too Expensive:" + 4: "- If Cost is above 39" + 5: "- And Replace Too Expensive is disabled" + disabled: + title: "Max Anvil Cost" + description: "This config only work if Limit Repair Cost is disabled." + +config-ui.basic-config.remove-cost-limit: + item: "Remove Anvil Cost Limit" + title: "Remove Anvil Cost Limit ?" + description: + 1: "Whether the anvil's cost limit should be removed entirely." + 2: "The anvil will still visually display Too Expensive if Replace Too Expensive is disabled." + 3: "However, the action will be completable if xp requirement is meet." + +config-ui.basic-config.remove-too-expensive: + title: "Replace Too Expensive ?" + description: + 1: "Whenever anvil cost is above 39 should display the true price and not Too Expensive." + 2: "However, when bypassing Too Expensive, anvil price will be displayed as Green." + 3: "Even if cost is displayed as Green:" + 4: "If the player do not have the required xp level, the action will not be completable." + description-no-nms: + 1: "" + 2: "/!\\Caution/!\\ You need ProtocoLib installed and working, or a paper server." + 3: "Currently ProtocoLib is not detected." + +config-ui.basic-config.item-repair-cost: + title: "Item Repair Cost" + description: + 1: "XP Level amount added to the anvil when the item" + 2: "is repaired by another item of the same type." + +config-ui.basic-config.item-rename-cost: + title: "Rename Cost" + description: + 1: "XP Level amount added to the anvil when the item is renamed." + +config-ui.basic-config.unit-repair-cost: + title: "Unit Repair Cost" + description: + 1: "XP Level amount added to the anvil when the item is repaired by an unit." + 2: "For example: a Diamond on a Diamond Sword." + 3: "What's considered unit for what can be edited on the unit repair configuration." + +config-ui.basic-config.sacrifice-illegal-cost: + title: "Sacrifice Illegal Enchant Cost" + description: + 1: "XP Level amount added to the anvil when a sacrifice enchantment" + 2: "conflict With one of the left item enchantment" + +config-ui.basic-config.color-code: + title: "Allow Use Of Color Code ?" + description: + 1: "Whether players can use color code." + 2: "Color code a formatted like &a and is used in the rename field of the anvil." + 3: "Player may need permission to use color code if Player need permission to use color is enabled." + +config-ui.basic-config.color-hex: + title: "Allow Use Of Hexadecimal Color ?" + description: + 1: "Whether players can use hexadecimal color." + 2: "Color code a formatted like #012345 and is used in the rename field of the anvil." + 3: "Player may need permission to use color code if Permission Needed For Color is enabled." + +config-ui.basic-config.color-permission: + title: "Need Permission To Use Color ?" + description: + 1: "Whether players should have permission to be able to use colors." + 2: "Give player ca.color.code Permission to allow use of color code." + 3: "Give player ca.color.hex Permission to allow use of hexadecimal color." + disabled: + title: "Need Permission To Use Color ?" + description: + 1: "This config can do something only if one of the following config is enabled:" + 2: "- Allow Use Of Color Code" + 3: "- Allow Use Of Hexadecimal Color" + +config-ui.basic-config.color-cost: + item: "Cost Of Using Color" + title: "Cost Of Using Color" + description: + 1: "XP level cost when using color code or hexadecimal color using the anvil." + 2: "conflict With one of the left item enchantment" + disabled: + title: "Cost Of Using Color" + description: + 1: "This config can do something only if one of the following config is enabled:" + 2: "- Allow Use Of Color Code" + 3: "- Allow Use Of Hexadecimal Color" + +config-ui.basic-config.work-penalty: + title: "Work Penalty Type" + item: "Work Penalty Type" + lore: + 1: "Work penalty increase the price for every anvil use." + 2: "This config allow you to choose the comportment of work penalty." + lore-break: + 1: "" + 2: "About shared/exclusive penalty:" + explanation: + increasing: "Increasing: will penalty be increased (in item)" + additive: "Additive: will penalty be added to the cost" + shared: "Shared: Vanilla, shared penalty. it will be kept from before the plugin installation." + exclusive: "Exclusive: Custom, per anvil use type penalty. it will be lost after plugin uninstallation" \ No newline at end of file