more ui translations

This commit is contained in:
alexcrea 2026-08-19 15:03:26 +02:00
parent 8523607657
commit 185a5bc8a2
Signed by: alexcrea
GPG key ID: E59DF23EE2A2266C
27 changed files with 910 additions and 442 deletions

View file

@ -15,9 +15,12 @@ import xyz.alexcrea.cuanvil.lang.Message;
public abstract class AbstractAskGui extends ChestGui { public abstract class AbstractAskGui extends ChestGui {
protected PatternPane pane; protected PatternPane pane;
AbstractAskGui(int rows,
AbstractAskGui(
int rows,
@NotNull Message name, @NotNull String param, @NotNull Message name, @NotNull String param,
Gui backOnCancel){ Gui backOnCancel
) {
super(rows, name.textHolder(param), CustomAnvil.instance); super(rows, name.textHolder(param), CustomAnvil.instance);
Pattern pattern = getGuiPattern(); Pattern pattern = getGuiPattern();

View file

@ -23,10 +23,12 @@ import java.util.logging.Level;
public class ConfirmActionGui extends AbstractAskGui { public class ConfirmActionGui extends AbstractAskGui {
public ConfirmActionGui(@NotNull Message title, @NotNull String titleParam, public ConfirmActionGui(
@NotNull Message title, @NotNull String titleParam,
@Nullable Message actionDescription, @NotNull String actionParam, @Nullable Message actionDescription, @NotNull String actionParam,
Gui backOnCancel, Gui backOnConfirm, Supplier<Boolean> onConfirm, Gui backOnCancel, Gui backOnConfirm, Supplier<Boolean> onConfirm,
boolean permanent) { boolean permanent
) {
super(3, title, titleParam, backOnCancel); super(3, title, titleParam, backOnCancel);
// Save item // Save item
@ -71,9 +73,11 @@ public class ConfirmActionGui extends AbstractAskGui {
pane.bindItem('I', new GuiItem(infoItem, GuiGlobalActions.stayInPlace, CustomAnvil.instance)); pane.bindItem('I', new GuiItem(infoItem, GuiGlobalActions.stayInPlace, CustomAnvil.instance));
} }
public ConfirmActionGui(@NotNull Message title, @NotNull String titleParam, public ConfirmActionGui(
@NotNull Message title, @NotNull String titleParam,
@Nullable Message actionDescription, @NotNull String actionParam, @Nullable Message actionDescription, @NotNull String actionParam,
Gui backOnCancel, Gui backOnConfirm, Supplier<Boolean> onConfirm){ Gui backOnCancel, Gui backOnConfirm, Supplier<Boolean> onConfirm
){
this(title, titleParam, actionDescription, actionParam, backOnCancel, backOnConfirm, onConfirm, true); this(title, titleParam, actionDescription, actionParam, backOnCancel, backOnConfirm, onConfirm, true);
} }

View file

@ -22,6 +22,7 @@ import java.util.function.BiConsumer;
public class SelectItemTypeGui extends AbstractAskGui { public class SelectItemTypeGui extends AbstractAskGui {
private ItemStack selectedItem; private ItemStack selectedItem;
public SelectItemTypeGui(@NotNull Message title, public SelectItemTypeGui(@NotNull Message title,
@NotNull String titleParam, @NotNull String titleParam,
@NotNull Message actionDescription, @NotNull Message actionDescription,

View file

@ -109,6 +109,7 @@ public abstract class AbstractEnchantConfigGui<T extends SettingGui.SettingGuiFa
protected List<String> getCreateItemLore() { protected List<String> getCreateItemLore() {
return Collections.emptyList(); return Collections.emptyList();
} }
@Override @Override
protected Consumer<InventoryClickEvent> getCreateClickConsumer() { protected Consumer<InventoryClickEvent> getCreateClickConsumer() {
return null; return null;

View file

@ -14,7 +14,6 @@ import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import xyz.alexcrea.cuanvil.config.ConfigHolder; import xyz.alexcrea.cuanvil.config.ConfigHolder;
import xyz.alexcrea.cuanvil.dependency.MinecraftVersionUtil;
import xyz.alexcrea.cuanvil.dependency.packet.PacketManager; import xyz.alexcrea.cuanvil.dependency.packet.PacketManager;
import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui; import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui;
import xyz.alexcrea.cuanvil.gui.config.MainConfigGui; 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.GuiGlobalActions;
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems; import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems;
import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant; 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.ArrayList;
import java.util.Arrays;
import java.util.Collections;
/** /**
* Global config to edit basic basic settings. * Global config to edit basic basic settings.
@ -42,11 +42,12 @@ public class BasicConfigGui extends ChestGui implements ValueUpdatableGui {
} }
private final PacketManager packetManager; private final PacketManager packetManager;
/** /**
* Constructor of this Global gui for basic settings. * Constructor of this Global gui for basic settings.
*/ */
public BasicConfigGui(PacketManager packetManager) { public BasicConfigGui(PacketManager packetManager) {
super(4, "§8Basic Config", CustomAnvil.instance); super(4, MsgUI.INSTANCE.getBASIC_TITLE().textHolder(), CustomAnvil.instance);
if(INSTANCE == null) INSTANCE = this; if(INSTANCE == null) INSTANCE = this;
this.packetManager = packetManager; this.packetManager = packetManager;
@ -101,61 +102,60 @@ public class BasicConfigGui extends ChestGui implements ValueUpdatableGui {
*/ */
protected void prepareValues() { protected void prepareValues() {
// cap anvil cost // 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, ConfigHolder.DEFAULT_CONFIG,
ConfigOptions.CAP_ANVIL_COST, ConfigOptions.DEFAULT_CAP_ANVIL_COST, ConfigOptions.CAP_ANVIL_COST, ConfigOptions.DEFAULT_CAP_ANVIL_COST,
"§7All anvil cost will be capped to §aMax Anvil Cost§7 if enabled.", null, MsgUI.INSTANCE.getBASIC_CAP_ANVIL_COST_DESCRIPTION()
"§7In other words:", );
"§7For any anvil cost greater than §aMax Anvil Cost§7, Cost will be set to §aMax Anvil Cost§7.");
// cap anvil cost not needed // cap anvil cost not needed
ItemStack item = new ItemStack(Material.BARRIER); ItemStack item = new ItemStack(Material.BARRIER);
ItemMeta meta = item.getItemMeta(); ItemMeta meta = item.getItemMeta();
assert meta != null; assert meta != null;
meta.setDisplayName("§cCap Anvil Cost ?"); ComponentUtil.INSTANCE.setMessageName(meta, MsgUI.INSTANCE.getBASIC_CAP_ANVIL_COST_DISABLED_TITLE());
meta.setLore(Collections.singletonList("§7This config only work if §cLimit Repair Cost§7 is disabled.")); ComponentUtil.INSTANCE.applyLore(MsgUI.INSTANCE.getBASIC_CAP_ANVIL_COST_DISABLED_DESCRIPTION().formatted(), meta);
item.setItemMeta(meta); item.setItemMeta(meta);
this.noCapRepairItem = new GuiItem(item, GuiGlobalActions.stayInPlace, CustomAnvil.instance); this.noCapRepairItem = new GuiItem(item, GuiGlobalActions.stayInPlace, CustomAnvil.instance);
// repair cost item // repair cost item
IntRange range = ConfigOptions.MAX_ANVIL_COST_RANGE; 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, ConfigOptions.MAX_ANVIL_COST, ConfigHolder.DEFAULT_CONFIG,
Arrays.asList( MsgUI.INSTANCE.getBASIC_MAX_ANVIL_COST_DESCRIPTION(),
"§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"
),
range.getFirst(), range.getLast(), range.getFirst(), range.getLast(),
ConfigOptions.DEFAULT_MAX_ANVIL_COST, ConfigOptions.DEFAULT_MAX_ANVIL_COST,
1, 5, 10); 1, 5, 10
);
// max anvil cost not needed // max anvil cost not needed
item = new ItemStack(Material.BARRIER); item = new ItemStack(Material.BARRIER);
meta = item.getItemMeta(); meta = item.getItemMeta();
assert meta != null; assert meta != null;
meta.setDisplayName("§cMax Anvil Cost"); ComponentUtil.INSTANCE.setMessageName(meta, MsgUI.INSTANCE.getBASIC_MAX_ANVIL_COST_DISABLED_TITLE());
meta.setLore(Collections.singletonList("§7This config only work if §cLimit Repair Cost§7 is disabled.")); ComponentUtil.INSTANCE.applyLore(MsgUI.INSTANCE.getBASIC_MAX_ANVIL_COST_DISABLED_DESCRIPTION().formatted(), meta);
item.setItemMeta(meta); item.setItemMeta(meta);
this.noMaxCostItem = new GuiItem(item, GuiGlobalActions.stayInPlace, CustomAnvil.instance); this.noMaxCostItem = new GuiItem(item, GuiGlobalActions.stayInPlace, CustomAnvil.instance);
// remove repair limit item // 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, ConfigHolder.DEFAULT_CONFIG,
ConfigOptions.REMOVE_ANVIL_COST_LIMIT, ConfigOptions.DEFAULT_REMOVE_ANVIL_COST_LIMIT, ConfigOptions.REMOVE_ANVIL_COST_LIMIT, ConfigOptions.DEFAULT_REMOVE_ANVIL_COST_LIMIT,
"§7Whether the anvil's cost limit should be removed entirely.", null, MsgUI.INSTANCE.getBASIC_REMOVE_COST_LIMIT_DESCRIPTION()
"§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.");
// replace too expensive item // 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, ConfigHolder.DEFAULT_CONFIG,
ConfigOptions.REPLACE_TOO_EXPENSIVE, ConfigOptions.DEFAULT_REPLACE_TOO_EXPENSIVE, ConfigOptions.REPLACE_TOO_EXPENSIVE, ConfigOptions.DEFAULT_REPLACE_TOO_EXPENSIVE,
getReplaceToExpensiveLore()); null, getReplaceToExpensiveLore()
);
// ------------ // ------------
// Cost config // Cost config
@ -163,132 +163,118 @@ public class BasicConfigGui extends ChestGui implements ValueUpdatableGui {
// item repair cost // item repair cost
range = ConfigOptions.REPAIR_COST_RANGE; 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, ConfigOptions.ITEM_REPAIR_COST, ConfigHolder.DEFAULT_CONFIG,
Arrays.asList( MsgUI.INSTANCE.getBASIC_ITEM_REPAIR_COST_DESCRIPTION(),
"§7XP Level amount added to the anvil when the item",
"§7is repaired by another item of the same type."
),
range.getFirst(), range.getLast(), range.getFirst(), range.getLast(),
ConfigOptions.DEFAULT_ITEM_REPAIR_COST, ConfigOptions.DEFAULT_ITEM_REPAIR_COST,
1, 5, 10, 50, 100); 1, 5, 10, 50, 100
);
// unit repair cost // 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, ConfigOptions.UNIT_REPAIR_COST, ConfigHolder.DEFAULT_CONFIG,
Arrays.asList( MsgUI.INSTANCE.getBASIC_UNIT_REPAIR_COST_DESCRIPTION(),
"§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."
),
range.getFirst(), range.getLast(), range.getFirst(), range.getLast(),
ConfigOptions.DEFAULT_UNIT_REPAIR_COST, ConfigOptions.DEFAULT_UNIT_REPAIR_COST,
1, 5, 10, 50, 100); 1, 5, 10, 50, 100
);
// item rename cost // item rename cost
range = ConfigOptions.ITEM_RENAME_COST_RANGE; 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, ConfigOptions.ITEM_RENAME_COST, ConfigHolder.DEFAULT_CONFIG,
Arrays.asList( MsgUI.INSTANCE.getBASIC_ITEM_RENAME_COST_DESCRIPTION(),
"§7XP Level amount added to the anvil when the item is renamed."
),
range.getFirst(), range.getLast(), range.getFirst(), range.getLast(),
ConfigOptions.DEFAULT_ITEM_RENAME_COST, ConfigOptions.DEFAULT_ITEM_RENAME_COST,
1, 5, 10, 50, 100); 1, 5, 10, 50, 100
);
// sacrifice illegal enchant cost // sacrifice illegal enchant cost
range = ConfigOptions.SACRIFICE_ILLEGAL_COST_RANGE; 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, ConfigOptions.SACRIFICE_ILLEGAL_COST, ConfigHolder.DEFAULT_CONFIG,
Arrays.asList( MsgUI.INSTANCE.getBASIC_SACRIFICE_ILLEGAL_COST_DESCRIPTION(),
"§7XP Level amount added to the anvil when a sacrifice enchantment",
"§7conflict With one of the left item enchantment"
),
range.getFirst(), range.getLast(), range.getFirst(), range.getLast(),
ConfigOptions.DEFAULT_SACRIFICE_ILLEGAL_COST, ConfigOptions.DEFAULT_SACRIFICE_ILLEGAL_COST,
1, 5, 10, 50, 100); 1, 5, 10, 50, 100
);
// ------------- // -------------
// Color config // Color config
// ------------- // -------------
// Allow us of color code // 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, ConfigHolder.DEFAULT_CONFIG,
ConfigOptions.ALLOW_COLOR_CODE, ConfigOptions.DEFAULT_ALLOW_COLOR_CODE, ConfigOptions.ALLOW_COLOR_CODE, ConfigOptions.DEFAULT_ALLOW_COLOR_CODE,
"§7Whether players can use color code.", null, MsgUI.INSTANCE.getBASIC_COLOR_CODE_LIMIT_DESCRIPTION()
"§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.");
// Allow us of hexadecimal color // 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, ConfigHolder.DEFAULT_CONFIG,
ConfigOptions.ALLOW_HEXADECIMAL_COLOR, ConfigOptions.DEFAULT_ALLOW_HEXADECIMAL_COLOR, ConfigOptions.ALLOW_HEXADECIMAL_COLOR, ConfigOptions.DEFAULT_ALLOW_HEXADECIMAL_COLOR,
"§7Whether players can use hexadecimal color.", null, MsgUI.INSTANCE.getBASIC_COLOR_HEX_LIMIT_DESCRIPTION()
"§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.");
// Permission needed for color // 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, ConfigHolder.DEFAULT_CONFIG,
ConfigOptions.PERMISSION_NEEDED_FOR_COLOR, ConfigOptions.DEFAULT_PERMISSION_NEEDED_FOR_COLOR, ConfigOptions.PERMISSION_NEEDED_FOR_COLOR, ConfigOptions.DEFAULT_PERMISSION_NEEDED_FOR_COLOR,
"§7Whether players should have permission to be able to use colors.", null, MsgUI.INSTANCE.getBASIC_COLOR_PERMISSION_DESCRIPTION()
"§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.");
// Permission needed for color not necessary // Permission needed for color not necessary
item = new ItemStack(Material.BARRIER); item = new ItemStack(Material.BARRIER);
meta = item.getItemMeta(); meta = item.getItemMeta();
assert meta != null; assert meta != null;
meta.setDisplayName("§cNeed Permission To Use Color ?"); ComponentUtil.INSTANCE.setMessageName(meta, MsgUI.INSTANCE.getBASIC_COLOR_PERMISSION_DISABLED_TITLE());
meta.setLore(Arrays.asList("§7This config can do something only if one of the following config is enabled:", ComponentUtil.INSTANCE.applyLore(MsgUI.INSTANCE.getBASIC_COLOR_PERMISSION_DISABLED_DESCRIPTION().formatted(), meta);
"§7- §aAllow Use Of Color Code",
"§7- §aAllow Use Of Hexadecimal Color"));
item.setItemMeta(meta); item.setItemMeta(meta);
this.noPermissionNeededItem = new GuiItem(item, GuiGlobalActions.stayInPlace, CustomAnvil.instance); this.noPermissionNeededItem = new GuiItem(item, GuiGlobalActions.stayInPlace, CustomAnvil.instance);
// Cost of using color // Cost of using color
range = ConfigOptions.USE_OF_COLOR_COST_RANGE; 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, ConfigOptions.USE_OF_COLOR_COST, ConfigHolder.DEFAULT_CONFIG,
Arrays.asList( MsgUI.INSTANCE.getBASIC_COLOR_COST_DESCRIPTION(),
"§7XP level cost when using color code or hexadecimal color using the anvil.",
"§7conflict With one of the left item enchantment"
),
range.getFirst(), range.getLast(), range.getFirst(), range.getLast(),
ConfigOptions.DEFAULT_USE_OF_COLOR_COST, ConfigOptions.DEFAULT_USE_OF_COLOR_COST,
1, 5, 10, 50, 100); 1, 5, 10, 50, 100
);
// Permission needed for color not necessary // Permission needed for color not necessary
item = new ItemStack(Material.BARRIER); item = new ItemStack(Material.BARRIER);
meta = item.getItemMeta(); meta = item.getItemMeta();
assert meta != null; assert meta != null;
meta.setDisplayName("§cCost Of Using Color"); ComponentUtil.INSTANCE.setMessageName(meta, MsgUI.INSTANCE.getBASIC_COLOR_COST_DISABLED_TITLE());
meta.setLore(Arrays.asList("§7This config can do something only if one of the following config is enabled:", ComponentUtil.INSTANCE.applyLore(MsgUI.INSTANCE.getBASIC_COLOR_COST_DISABLED_DESCRIPTION().formatted(), meta);
"§7- §aAllow Use Of Color Code",
"§7- §aAllow Use Of Hexadecimal Color"));
item.setItemMeta(meta); item.setItemMeta(meta);
this.noColorCostItem = new GuiItem(item, GuiGlobalActions.stayInPlace, CustomAnvil.instance); this.noColorCostItem = new GuiItem(item, GuiGlobalActions.stayInPlace, CustomAnvil.instance);
} }
@NotNull @NotNull
private String[] getReplaceToExpensiveLore() { private Message[] getReplaceToExpensiveLore() {
ArrayList<String> lore = new ArrayList<>(); ArrayList<Message> lore = new ArrayList<>();
lore.add("§7Whenever anvil cost is above §e39§7 should display the true price and not §cToo Expensive§7."); lore.add(MsgUI.INSTANCE.getBASIC_REPLACE_TOO_EXPENSIVE_DESCRIPTION());
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.");
if(!this.packetManager.getCanSetInstantBuild()){ if(!this.packetManager.getCanSetInstantBuild())
lore.add(""); lore.add(MsgUI.INSTANCE.getBASIC_REPLACE_TOO_EXPENSIVE_DESCRIPTION_NO_NMS());
lore.add("§4/!\\§cCaution§4/!\\ §cYou need ProtocoLib installed and working or a paper server.");
lore.add("§cCurrently ProtocoLib is not detected.");
}
String[] loreAsArray = new String[lore.size()]; Message[] loreAsArray = new Message[lore.size()];
return lore.toArray(loreAsArray); return lore.toArray(loreAsArray);
} }
@ -298,8 +284,13 @@ public class BasicConfigGui extends ChestGui implements ValueUpdatableGui {
GuiItem capAnvilCostItem; GuiItem capAnvilCostItem;
GuiItem maxAnvilCostItem; GuiItem maxAnvilCostItem;
if(!this.removeAnvilCostLimit.getConfiguredValue()) { if(!this.removeAnvilCostLimit.getConfiguredValue()) {
capAnvilCostItem = this.capAnvilCost.getItem("Cap Anvil Cost"); capAnvilCostItem = this.capAnvilCost.getItem(
maxAnvilCostItem = this.maxAnvilCost.getItem(Material.EXPERIENCE_BOTTLE, "Max Anvil Cost"); MsgUI.INSTANCE.getBASIC_CAP_ANVIL_COST_ITEM()
);
maxAnvilCostItem = this.maxAnvilCost.getItem(
Material.EXPERIENCE_BOTTLE,
MsgUI.INSTANCE.getBASIC_MAX_ANVIL_COST_ITEM()
);
} else { } else {
capAnvilCostItem = this.noCapRepairItem; capAnvilCostItem = this.noCapRepairItem;
maxAnvilCostItem = this.noMaxCostItem; maxAnvilCostItem = this.noMaxCostItem;
@ -309,7 +300,9 @@ public class BasicConfigGui extends ChestGui implements ValueUpdatableGui {
pane.bindItem('C', maxAnvilCostItem); pane.bindItem('C', maxAnvilCostItem);
// remove repair limit item // 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); pane.bindItem('R', removeRepairLimitItem);
// replace too expensive item // replace too expensive item
@ -334,7 +327,11 @@ public class BasicConfigGui extends ChestGui implements ValueUpdatableGui {
pane.bindItem('S', illegalCostItem); pane.bindItem('S', illegalCostItem);
// work penalty type // 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); pane.bindItem('W', workPenaltyType);
// allow color code // allow color code
@ -352,14 +349,16 @@ public class BasicConfigGui extends ChestGui implements ValueUpdatableGui {
pane.bindItem('p', permissionNeededItem); pane.bindItem('p', permissionNeededItem);
// using color cost // 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); pane.bindItem('P', useColorCostItem);
} else { } else {
pane.bindItem('p', this.noPermissionNeededItem); pane.bindItem('p', this.noPermissionNeededItem);
pane.bindItem('P', this.noColorCostItem); pane.bindItem('P', this.noColorCostItem);
} }
update(); update();
} }

View file

@ -61,7 +61,7 @@ public class CustomRecipeConfigGui extends MappedGuiListConfigGui<AnvilCustomRec
ItemMeta meta = displayedItem.getItemMeta(); ItemMeta meta = displayedItem.getItemMeta();
assert meta != null; assert meta != null;
meta.setDisplayName("§e" + CasedStringUtil.snakeToUpperSpacedCase(recipe.toString()) + " §fCustom recipe");//TODO MESSAGE meta.setDisplayName("<yellow>" + CasedStringUtil.snakeToUpperSpacedCase(recipe.toString()) + " <white>Custom recipe");//TODO MESSAGE
meta.addItemFlags(ItemFlag.values()); meta.addItemFlags(ItemFlag.values());
meta.setLore(getRecipeLore(recipe)); meta.setLore(getRecipeLore(recipe));

View file

@ -2,6 +2,7 @@ package xyz.alexcrea.cuanvil.gui.config.global;
import com.github.stefvanschie.inventoryframework.gui.GuiItem; import com.github.stefvanschie.inventoryframework.gui.GuiItem;
import com.github.stefvanschie.inventoryframework.gui.type.util.Gui; import com.github.stefvanschie.inventoryframework.gui.type.util.Gui;
import net.kyori.adventure.text.Component;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta; 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.ValueUpdatableGui;
import xyz.alexcrea.cuanvil.gui.config.settings.EnchantCostSettingsGui; import xyz.alexcrea.cuanvil.gui.config.settings.EnchantCostSettingsGui;
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems; import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems;
import xyz.alexcrea.cuanvil.lang.Message;
import xyz.alexcrea.cuanvil.lang.MsgUI; import xyz.alexcrea.cuanvil.lang.MsgUI;
import xyz.alexcrea.cuanvil.util.CasedStringUtil; import xyz.alexcrea.cuanvil.util.CasedStringUtil;
import xyz.alexcrea.cuanvil.util.ComponentUtil;
import java.awt.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@ -59,13 +63,10 @@ public class EnchantCostConfigGui extends AbstractEnchantConfigGui<EnchantCostSe
String key = enchant.getKey().toString().toLowerCase(Locale.ENGLISH); String key = enchant.getKey().toString().toLowerCase(Locale.ENGLISH);
String prettyKey = CasedStringUtil.snakeToUpperSpacedCase(key.replace(":", "_")); String prettyKey = CasedStringUtil.snakeToUpperSpacedCase(key.replace(":", "_"));
//TODO MESSAGE return new EnchantCostSettingsGui.EnchantCostSettingFactory(
return new EnchantCostSettingsGui.EnchantCostSettingFactory(prettyKey + " Cost", parent, MsgUI.INSTANCE.getENCHANTMENT_LEVEL_COST_ELEMENT_TITLE(), parent,
ENCHANT_VALUES_ROOT + '.' + key, ConfigHolder.DEFAULT_CONFIG, ENCHANT_VALUES_ROOT + '.' + key, ConfigHolder.DEFAULT_CONFIG,
Arrays.asList( MsgUI.INSTANCE.getENCHANTMENT_LEVEL_COST_ELEMENT_DESCRIPTION(), prettyKey,
"§7How many level should " + prettyKey,
"§7cost when applied by book or by another item."
),
enchant, 0, 255, enchant, 0, 255,
1, 10, 50); 1, 10, 50);
} }
@ -75,26 +76,26 @@ public class EnchantCostConfigGui extends AbstractEnchantConfigGui<EnchantCostSe
// Get item properties // Get item properties
int itemCost = factory.getConfiguredValue(); int itemCost = factory.getConfiguredValue();
int bookCost = factory.getConfiguredBookValue(); int bookCost = factory.getConfiguredBookValue();
String itemName = "§a" + factory.getTitle(); Message itemName = factory.getTitle();
// Create item // Create item
ItemStack item = new ItemStack(Material.ENCHANTED_BOOK); ItemStack item = new ItemStack(Material.ENCHANTED_BOOK);
ItemMeta itemMeta = item.getItemMeta(); ItemMeta itemMeta = item.getItemMeta();
assert itemMeta != null; assert itemMeta != null;
// Prepare lore // Prepare lore
List<String> lore = new ArrayList<>(); List<Component> lore = new ArrayList<>();
lore.add("§7Item Cost: §e" + itemCost); lore.addAll(MsgUI.INSTANCE.getENCHANTMENT_LEVEL_COST_ELEMENT_ITEM_COST().formatted(itemCost));
lore.add("§7Book Cost: §e" + bookCost); lore.addAll(MsgUI.INSTANCE.getENCHANTMENT_LEVEL_COST_ELEMENT_BOOK_COST().formatted(bookCost));
List<String> displayLore = factory.getDisplayLore(); List<Message> displayLore = factory.getDisplayLore();
if (!displayLore.isEmpty()) { if (displayLore != null) {
lore.add(""); lore.add(Component.empty());
lore.addAll(displayLore); lore.addAll(ComponentUtil.INSTANCE.asComponents(displayLore, factory.getParam()));
} }
// Edit name and lore // Edit name and lore
itemMeta.setDisplayName(itemName); ComponentUtil.INSTANCE.setMessageName(itemMeta, itemName, factory.getParam());
itemMeta.setLore(lore); ComponentUtil.INSTANCE.applyLore(lore, itemMeta);
item.setItemMeta(itemMeta); item.setItemMeta(itemMeta);

View file

@ -54,11 +54,10 @@ public class EnchantLimitConfigGui extends AbstractEnchantConfigGui<IntSettingsG
var defaultValue = enchant.defaultMaxLevel(); var defaultValue = enchant.defaultMaxLevel();
return new IntSettingsGui.IntSettingFactory(prettyKey + " Limit", parent, return new IntSettingsGui.IntSettingFactory(
MsgUI.INSTANCE.getENCHANTMENT_LEVEL_LIMIT_ELEMENT_TITLE(), parent,
SECTION_NAME + '.' + key, ConfigHolder.DEFAULT_CONFIG, SECTION_NAME + '.' + key, ConfigHolder.DEFAULT_CONFIG,
Collections.singletonList( MsgUI.INSTANCE.getENCHANTMENT_LEVEL_LIMIT_ELEMENT_DESCRIPTION(), prettyKey,
"§7Maximum applied level of " + prettyKey
),
-1, 255, -1, -1, 255, -1,
1, 5, 10, 50, 100){ 1, 5, 10, 50, 100){
@ -88,7 +87,9 @@ public class EnchantLimitConfigGui extends AbstractEnchantConfigGui<IntSettingsG
public GuiItem itemFromFactory(CAEnchantment enchantment, IntSettingsGui.IntSettingFactory inventoryFactory) { public GuiItem itemFromFactory(CAEnchantment enchantment, IntSettingsGui.IntSettingFactory inventoryFactory) {
return inventoryFactory.getItem( return inventoryFactory.getItem(
Material.ENCHANTED_BOOK, Material.ENCHANTED_BOOK,
inventoryFactory.getTitle()); inventoryFactory.getTitle(),
inventoryFactory.getParam()
);
} }
} }

View file

@ -53,17 +53,10 @@ public class EnchantMergeLimitConfigGui extends AbstractEnchantConfigGui<IntSett
String key = enchant.getKey().toString().toLowerCase(Locale.ROOT); String key = enchant.getKey().toString().toLowerCase(Locale.ROOT);
String prettyKey = CasedStringUtil.snakeToUpperSpacedCase(key.replace(":", "_")); String prettyKey = CasedStringUtil.snakeToUpperSpacedCase(key.replace(":", "_"));
//TODO MESSAGE return new IntSettingsGui.IntSettingFactory(
return new IntSettingsGui.IntSettingFactory(prettyKey + " Merge Limit", parent, MsgUI.INSTANCE.getENCHANTMENT_MERGE_LIMIT_ELEMENT_TITLE(), parent,
SECTION_NAME + '.' + key, ConfigHolder.DEFAULT_CONFIG, SECTION_NAME + '.' + key, ConfigHolder.DEFAULT_CONFIG,
Arrays.asList( MsgUI.INSTANCE.getENCHANTMENT_MERGE_LIMIT_ELEMENT_DESCRIPTION(), prettyKey,
"§7Maximum merge level for for " + prettyKey,
"",
"§7For example, if set to §e2§7, §alvl1 §7+ §alvl1 §7of will give a §alvl2",
"§7But §alvl2 §7+ §alvl2 §7will not give a §clv3§7.",
"§7Will still not merge above max enchantment level",
"§e-1 §7(default) will set the merge limit to enchantment's maximum level"
),
-1, 255, -1, -1, 255, -1,
1, 5, 10, 50, 100) { 1, 5, 10, 50, 100) {
@ -78,6 +71,8 @@ public class EnchantMergeLimitConfigGui extends AbstractEnchantConfigGui<IntSett
public GuiItem itemFromFactory(CAEnchantment enchantment, IntSettingsGui.IntSettingFactory inventoryFactory) { public GuiItem itemFromFactory(CAEnchantment enchantment, IntSettingsGui.IntSettingFactory inventoryFactory) {
return inventoryFactory.getItem( return inventoryFactory.getItem(
Material.ENCHANTED_BOOK, Material.ENCHANTED_BOOK,
inventoryFactory.getTitle()); inventoryFactory.getTitle(),
inventoryFactory.getParam()
);
} }
} }

View file

@ -50,7 +50,7 @@ public class UnitRepairElementListGui extends SettingGuiListConfigGui<Namespaced
// SettingGuiListConfigGui methods // SettingGuiListConfigGui methods
@Override @Override
protected List<String> getCreateItemLore() { protected List<String> getCreateItemLore() {
return Arrays.asList( return Arrays.asList(//TODO MESSAGE
"§7Select a new item to be repairable.", "§7Select a new item to be repairable.",
"§7You will be asked the material to use." "§7You will be asked the material to use."
); );
@ -107,7 +107,7 @@ public class UnitRepairElementListGui extends SettingGuiListConfigGui<Namespaced
@Override @Override
protected String createItemName() { protected String createItemName() {
return "§aAdd a new item reparable by " + this.materialName; return "§aAdd a new item reparable by " + this.materialName; //TODO MESSAGE ?
} }
@Override @Override
@ -115,14 +115,12 @@ public class UnitRepairElementListGui extends SettingGuiListConfigGui<Namespaced
String materialDisplayName = CasedStringUtil.snakeToUpperSpacedCase(materialName.getKey()); String materialDisplayName = CasedStringUtil.snakeToUpperSpacedCase(materialName.getKey());
return new DoubleSettingGui.DoubleSettingFactory( return new DoubleSettingGui.DoubleSettingFactory(
"§0%§8" + materialDisplayName + " Repair", MsgUI.INSTANCE.getUNIT_REPAIR_ELEMENT_VALUE_TITLE(),
this, this,
ConfigHolder.UNIT_REPAIR_HOLDER, ConfigHolder.UNIT_REPAIR_HOLDER,
this.parentMaterial.toString().toLowerCase() + "." + materialName, this.parentMaterial.toString().toLowerCase() + "." + materialName,
Arrays.asList( MsgUI.INSTANCE.getUNIT_REPAIR_ELEMENT_VALUE_DESCRIPTION(),
"§7Click here to change how many §e% §7of §a" + materialDisplayName, materialDisplayName, this.materialName,
"§7Should get repaired by §e" + this.materialName
),
2, 2,
true, true, true, true,
0, 0,
@ -134,8 +132,12 @@ public class UnitRepairElementListGui extends SettingGuiListConfigGui<Namespaced
@Override @Override
protected GuiItem itemFromFactory(NamespacedKey materialName, DoubleSettingGui.DoubleSettingFactory factory) { protected GuiItem itemFromFactory(NamespacedKey materialName, DoubleSettingGui.DoubleSettingFactory factory) {
return factory.getItem(materialFromName(materialName), return factory.getItem(
"§7%§a" + CasedStringUtil.snakeToUpperSpacedCase(materialName.getKey()) + " §erepaired by §a" + this.materialName); materialFromName(materialName),
MsgUI.INSTANCE.getUNIT_REPAIR_ITEM(),
CasedStringUtil.snakeToUpperSpacedCase(materialName.getKey()),
this.materialName
);
} }
@Override @Override

View file

@ -23,7 +23,9 @@ import xyz.alexcrea.cuanvil.lang.MsgUI;
import xyz.alexcrea.cuanvil.recipe.AnvilCustomRecipe; import xyz.alexcrea.cuanvil.recipe.AnvilCustomRecipe;
import xyz.alexcrea.cuanvil.recipe.CustomAnvilRecipeManager; import xyz.alexcrea.cuanvil.recipe.CustomAnvilRecipeManager;
import xyz.alexcrea.cuanvil.util.CasedStringUtil; import xyz.alexcrea.cuanvil.util.CasedStringUtil;
import xyz.alexcrea.cuanvil.util.ComponentUtil;
import java.awt.*;
import java.util.Collections; import java.util.Collections;
import java.util.function.Supplier; import java.util.function.Supplier;
@ -74,65 +76,79 @@ public class CustomRecipeSubSettingGui extends MappedToListSubSettingGui {
ItemMeta deleteMeta = deleteItem.getItemMeta(); ItemMeta deleteMeta = deleteItem.getItemMeta();
assert deleteMeta != null; assert deleteMeta != null;
deleteMeta.setDisplayName("§4DELETE RECIPE");//TODO MESSAGE ComponentUtil.INSTANCE.setMessageName(deleteMeta, MsgUI.INSTANCE.getCUSTOM_RECIPE_ELEMENT_DELETE_BUTTON_NAME());
deleteMeta.setLore(Collections.singletonList("§cCaution with this button !"));//TODO MESSAGE ComponentUtil.INSTANCE.applyLore(MsgUI.INSTANCE.getCUSTOM_RECIPE_ELEMENT_DELETE_BUTTON_LORE().formatted(), deleteMeta);
deleteItem.setItemMeta(deleteMeta); deleteItem.setItemMeta(deleteMeta);
this.pane.bindItem('D', new GuiItem(deleteItem, GuiGlobalActions.openGuiAction(createDeleteGui()), CustomAnvil.instance)); this.pane.bindItem('D', new GuiItem(deleteItem, GuiGlobalActions.openGuiAction(createDeleteGui()), CustomAnvil.instance));
// Displayed item will be updated later // Displayed item will be updated later
IntRange costRange = AnvilCustomRecipe.Companion.getXP_COST_CONFIG_RANGE(); IntRange costRange = AnvilCustomRecipe.Companion.getXP_COST_CONFIG_RANGE();
this.exactCountFactory = new BoolSettingsGui.BoolSettingFactory("§8Exact count ?", this,//TODO MESSAGE this.exactCountFactory = new BoolSettingsGui.BoolSettingFactory(
MsgUI.INSTANCE.getCUSTOM_RECIPE_ELEMENT_EXACT_COUNT_TITLE(), this,
ConfigHolder.CUSTOM_RECIPE_HOLDER, ConfigHolder.CUSTOM_RECIPE_HOLDER,
this.anvilRecipe + "." + AnvilCustomRecipe.EXACT_COUNT_CONFIG, AnvilCustomRecipe.DEFAULT_EXACT_COUNT_CONFIG); this.anvilRecipe + "." + AnvilCustomRecipe.EXACT_COUNT_CONFIG, AnvilCustomRecipe.DEFAULT_EXACT_COUNT_CONFIG,
null
);
this.removeExactLinearXpFactory = new BoolSettingsGui.BoolSettingFactory("§8Remove exact linear xp ?", this,//TODO MESSAGE this.removeExactLinearXpFactory = new BoolSettingsGui.BoolSettingFactory(
MsgUI.INSTANCE.getCUSTOM_RECIPE_ELEMENT_LINEAR_XP_TITLE(), this,
ConfigHolder.CUSTOM_RECIPE_HOLDER, ConfigHolder.CUSTOM_RECIPE_HOLDER,
this.anvilRecipe + "." + AnvilCustomRecipe.REMOVE_EXACT_XP_CONFIG, AnvilCustomRecipe.DEFAULT_REMOVE_EXACT_XP_CONFIG); this.anvilRecipe + "." + AnvilCustomRecipe.REMOVE_EXACT_XP_CONFIG, AnvilCustomRecipe.DEFAULT_REMOVE_EXACT_XP_CONFIG,
null
);
ItemStack item = new ItemStack(Material.BARRIER); ItemStack item = new ItemStack(Material.BARRIER);
ItemMeta meta = item.getItemMeta(); ItemMeta meta = item.getItemMeta();
assert meta != null; assert meta != null;
meta.setDisplayName("§cRemove exact linear xp ?");//TODO MESSAGE ComponentUtil.INSTANCE.setMessageName(meta, MsgUI.INSTANCE.getCUSTOM_RECIPE_ELEMENT_LINEAR_XP_NAME());
meta.setLore(Collections.singletonList("§7Not usable if linear cost is 0"));//TODO MESSAGE ComponentUtil.INSTANCE.applyLore(MsgUI.INSTANCE.getCUSTOM_RECIPE_ELEMENT_LINEAR_XP_LORE().formatted(), meta);
item.setItemMeta(meta); item.setItemMeta(meta);
this.noRemoveExactLinearXp = new GuiItem(item, GuiGlobalActions.stayInPlace, CustomAnvil.instance); this.noRemoveExactLinearXp = new GuiItem(item, GuiGlobalActions.stayInPlace, CustomAnvil.instance);
this.levelCostFactory = new IntSettingsGui.IntSettingFactory("§8Recipe Level Cost", this,//TODO MESSAGE this.levelCostFactory = new IntSettingsGui.IntSettingFactory(
MsgUI.INSTANCE.getCUSTOM_RECIPE_ELEMENT_COST_LEVEL_XP(), this,
this.anvilRecipe + "." + AnvilCustomRecipe.XP_LEVEL_COST_CONFIG, this.anvilRecipe + "." + AnvilCustomRecipe.XP_LEVEL_COST_CONFIG,
ConfigHolder.CUSTOM_RECIPE_HOLDER, ConfigHolder.CUSTOM_RECIPE_HOLDER,
null, null,
costRange.getFirst(), costRange.getLast(), AnvilCustomRecipe.DEFAULT_XP_LEVEL_COST_CONFIG, 1, 5, 10); costRange.getFirst(), costRange.getLast(), AnvilCustomRecipe.DEFAULT_XP_LEVEL_COST_CONFIG, 1, 5, 10
);
this.linearXpCostFactory = new IntSettingsGui.IntSettingFactory("§8Recipe Linear Xp Cost", this,//TODO MESSAGE this.linearXpCostFactory = new IntSettingsGui.IntSettingFactory(
MsgUI.INSTANCE.getCUSTOM_RECIPE_ELEMENT_COST_LINEAR_XP(), this,
this.anvilRecipe + "." + AnvilCustomRecipe.LINEAR_XP_COST_CONFIG, this.anvilRecipe + "." + AnvilCustomRecipe.LINEAR_XP_COST_CONFIG,
ConfigHolder.CUSTOM_RECIPE_HOLDER, ConfigHolder.CUSTOM_RECIPE_HOLDER,
null, null,
0, Integer.MAX_VALUE, AnvilCustomRecipe.DEFAULT_LINEAR_XP_COST_CONFIG, 1, 10, 100, 1000, 10000); 0, Integer.MAX_VALUE, AnvilCustomRecipe.DEFAULT_LINEAR_XP_COST_CONFIG, 1, 10, 100, 1000, 10000
);
// Right part of the gui // Right part of the gui
this.leftItemFactory = new ItemSettingGui.ItemSettingFactory("§eRecipe Left §8Item", this, this.leftItemFactory = new ItemSettingGui.ItemSettingFactory(
MsgUI.INSTANCE.getCUSTOM_RECIPE_ELEMENT_ITEM_LEFT_TITLE(), this,
this.anvilRecipe + "." + AnvilCustomRecipe.LEFT_ITEM_CONFIG, this.anvilRecipe + "." + AnvilCustomRecipe.LEFT_ITEM_CONFIG,
ConfigHolder.CUSTOM_RECIPE_HOLDER, ConfigHolder.CUSTOM_RECIPE_HOLDER,
AnvilCustomRecipe.Companion.getDEFAULT_LEFT_ITEM_CONFIG(), AnvilCustomRecipe.Companion.getDEFAULT_LEFT_ITEM_CONFIG(),
"§7Set the left item of the custom craft", MsgUI.INSTANCE.getCUSTOM_RECIPE_ELEMENT_ITEM_LEFT_DESCRIPTION()
"§7■ + □ = □");//TODO MESSAGE );
this.rightItemFactory = new ItemSettingGui.ItemSettingFactory("§eRecipe Right §8Item", this, this.rightItemFactory = new ItemSettingGui.ItemSettingFactory(
MsgUI.INSTANCE.getCUSTOM_RECIPE_ELEMENT_ITEM_RIGHT_TITLE(), this,
this.anvilRecipe + "." + AnvilCustomRecipe.RIGHT_ITEM_CONFIG, this.anvilRecipe + "." + AnvilCustomRecipe.RIGHT_ITEM_CONFIG,
ConfigHolder.CUSTOM_RECIPE_HOLDER, ConfigHolder.CUSTOM_RECIPE_HOLDER,
AnvilCustomRecipe.Companion.getDEFAULT_RIGHT_ITEM_CONFIG(), AnvilCustomRecipe.Companion.getDEFAULT_RIGHT_ITEM_CONFIG(),
"§7Set the right item of the custom craft", MsgUI.INSTANCE.getCUSTOM_RECIPE_ELEMENT_ITEM_RIGHT_DESCRIPTION()
"§7□ + ■ = □");//TODO MESSAGE );
this.resultItemFactory = new ItemSettingGui.ItemSettingFactory("§aRecipe Result §8Item", this, this.resultItemFactory = new ItemSettingGui.ItemSettingFactory(
MsgUI.INSTANCE.getCUSTOM_RECIPE_ELEMENT_ITEM_RESULT_TITLE(), this,
this.anvilRecipe + "." + AnvilCustomRecipe.RESULT_ITEM_CONFIG, this.anvilRecipe + "." + AnvilCustomRecipe.RESULT_ITEM_CONFIG,
ConfigHolder.CUSTOM_RECIPE_HOLDER, ConfigHolder.CUSTOM_RECIPE_HOLDER,
AnvilCustomRecipe.Companion.getDEFAULT_RESULT_ITEM_CONFIG(), AnvilCustomRecipe.Companion.getDEFAULT_RESULT_ITEM_CONFIG(),
"§7Set the result item of the custom craft", MsgUI.INSTANCE.getCUSTOM_RECIPE_ELEMENT_ITEM_RESULT_DESCRIPTION()
"§7□ + □ = ■");//TODO MESSAGE );
// Now we update the items // Now we update the items
updateLocal(); updateLocal();

View file

@ -26,6 +26,7 @@ import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems;
import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant; import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant;
import xyz.alexcrea.cuanvil.lang.MsgUI; import xyz.alexcrea.cuanvil.lang.MsgUI;
import xyz.alexcrea.cuanvil.util.CasedStringUtil; import xyz.alexcrea.cuanvil.util.CasedStringUtil;
import xyz.alexcrea.cuanvil.util.ComponentUtil;
import xyz.alexcrea.cuanvil.util.MetricsUtil; import xyz.alexcrea.cuanvil.util.MetricsUtil;
import java.util.*; import java.util.*;
@ -71,8 +72,8 @@ public class EnchantConflictSubSettingGui extends MappedToListSubSettingGui impl
ItemMeta deleteMeta = deleteItem.getItemMeta(); ItemMeta deleteMeta = deleteItem.getItemMeta();
assert deleteMeta != null; assert deleteMeta != null;
deleteMeta.setDisplayName("§4DELETE CONFLICT");//TODO MESSAGE ComponentUtil.INSTANCE.setMessageName(deleteMeta, MsgUI.INSTANCE.getENCHANTMENT_CONFLICT_ELEMENT_DELETE_BUTTON_NAME());
deleteMeta.setLore(Collections.singletonList("§cCaution with this button !"));//TODO MESSAGE ComponentUtil.INSTANCE.applyLore(MsgUI.INSTANCE.getENCHANTMENT_CONFLICT_ELEMENT_DELETE_BUTTON_LORE().formatted(), deleteMeta);
deleteItem.setItemMeta(deleteMeta); deleteItem.setItemMeta(deleteMeta);
this.pane.bindItem('D', new GuiItem(deleteItem, GuiGlobalActions.openGuiAction(createDeleteGui()), CustomAnvil.instance)); this.pane.bindItem('D', new GuiItem(deleteItem, GuiGlobalActions.openGuiAction(createDeleteGui()), CustomAnvil.instance));
@ -97,12 +98,9 @@ public class EnchantConflictSubSettingGui extends MappedToListSubSettingGui impl
}, CustomAnvil.instance); }, CustomAnvil.instance);
this.minBeforeActiveSettingFactory = new IntSettingsGui.IntSettingFactory( this.minBeforeActiveSettingFactory = new IntSettingsGui.IntSettingFactory(
"§8Minimum enchantment count",//TODO MESSAGE MsgUI.INSTANCE.getENCHANTMENT_CONFLICT_ELEMENT_MIN_BEFORE_COUNT_TITLE(),
this, this.enchantConflict + ".maxEnchantmentBeforeConflict", ConfigHolder.CONFLICT_HOLDER, this, this.enchantConflict + ".maxEnchantmentBeforeConflict", ConfigHolder.CONFLICT_HOLDER,
Arrays.asList( MsgUI.INSTANCE.getENCHANTMENT_CONFLICT_ELEMENT_MIN_BEFORE_COUNT_DESCRIPTION(),
"§7Minimum enchantment count set to X mean only X enchantment can be put",
"§7on an item before the conflict is active."
),
0, 255, 0, 1 0, 255, 0, 1
); );
@ -210,8 +208,10 @@ public class EnchantConflictSubSettingGui extends MappedToListSubSettingGui impl
this.groupSettingItem.setItem(groupItem); // Just in case this.groupSettingItem.setItem(groupItem); // Just in case
this.pane.bindItem('M', this.minBeforeActiveSettingFactory.getItem(Material.COMMAND_BLOCK, this.pane.bindItem('M', this.minBeforeActiveSettingFactory.getItem(
"Minimum Enchantment Count"));//TODO MESSAGE Material.COMMAND_BLOCK,
MsgUI.INSTANCE.getENCHANTMENT_CONFLICT_ELEMENT_MIN_BEFORE_COUNT_ITEM()
));
update(); update();
} }

View file

@ -11,14 +11,13 @@ import org.jetbrains.annotations.NotNull;
import xyz.alexcrea.cuanvil.config.ConfigHolder; import xyz.alexcrea.cuanvil.config.ConfigHolder;
import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui; import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui;
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems; import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems;
import xyz.alexcrea.cuanvil.lang.Message;
/** /**
* An instance gui used to edit a setting. * An instance gui used to edit a setting.
*/ */
public abstract class AbstractSettingGui extends ChestGui implements SettingGui { public abstract class AbstractSettingGui extends ChestGui implements SettingGui {
public static final String CLICK_LORE = "§7Click Here to change the value";
private PatternPane pane; private PatternPane pane;
/** /**
@ -40,8 +39,8 @@ public abstract class AbstractSettingGui extends ChestGui implements SettingGui
* @param title Title of this gui. * @param title Title of this gui.
* @param parent Parent gui to go back when completed. * @param parent Parent gui to go back when completed.
*/ */
protected AbstractSettingGui(int rows, @NotNull String title, ValueUpdatableGui parent) { protected AbstractSettingGui(int rows, @NotNull Message title, ValueUpdatableGui parent) {
this(rows, StringHolder.of(title), parent); this(rows, title.textHolder(), parent);
} }
protected GuiItem saveItem; protected GuiItem saveItem;

View file

@ -5,16 +5,21 @@ import com.github.stefvanschie.inventoryframework.gui.type.util.Gui;
import com.github.stefvanschie.inventoryframework.pane.PatternPane; import com.github.stefvanschie.inventoryframework.pane.PatternPane;
import com.github.stefvanschie.inventoryframework.pane.util.Pattern; import com.github.stefvanschie.inventoryframework.pane.util.Pattern;
import io.delilaheve.CustomAnvil; import io.delilaheve.CustomAnvil;
import net.kyori.adventure.text.Component;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import xyz.alexcrea.cuanvil.config.ConfigHolder; import xyz.alexcrea.cuanvil.config.ConfigHolder;
import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui; import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui;
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems; import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems;
import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant; 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.CasedStringUtil;
import xyz.alexcrea.cuanvil.util.ComponentUtil;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@ -105,20 +110,21 @@ public class BoolSettingsGui extends AbstractSettingGui {
} }
// create & set Value item // create & set Value item
ArrayList<String> valueLore = new ArrayList<>(); ArrayList<Component> valueLore = new ArrayList<>();
if(!holder.displayLore.isEmpty()){ if(holder.displayLore != null){
valueLore.addAll(holder.displayLore); valueLore.addAll(ComponentUtil.INSTANCE.asComponents(holder.displayLore));
valueLore.add(""); valueLore.add(Component.empty());
} }
valueLore.add(AbstractSettingGui.CLICK_LORE); valueLore.addAll(MsgUI.INSTANCE.getSHARED_CLICK_TO_CHANGE().formatted());
ItemStack valueItemStack = new ItemStack(displayedMat); ItemStack valueItemStack = new ItemStack(displayedMat);
ItemMeta valueMeta = valueItemStack.getItemMeta(); ItemMeta valueMeta = valueItemStack.getItemMeta();
assert valueMeta != null; assert valueMeta != null;
valueMeta.setDisplayName(displayedName); valueMeta.setDisplayName(displayedName);//TODO MESSAGE ?
valueMeta.setLore(valueLore); ComponentUtil.INSTANCE.applyLore(valueLore, valueMeta);
valueItemStack.setItemMeta(valueMeta); valueItemStack.setItemMeta(valueMeta);
GuiItem resultItem = new GuiItem(valueItemStack, inverseNowConsumer(), CustomAnvil.instance); GuiItem resultItem = new GuiItem(valueItemStack, inverseNowConsumer(), CustomAnvil.instance);
pane.bindItem('v', resultItem); pane.bindItem('v', resultItem);
@ -166,13 +172,15 @@ public class BoolSettingsGui extends AbstractSettingGui {
*/ */
public static class BoolSettingFactory extends SettingGuiFactory { public static class BoolSettingFactory extends SettingGuiFactory {
@NotNull @NotNull
String title; Message title;
@NotNull @NotNull
ValueUpdatableGui parent; ValueUpdatableGui parent;
boolean defaultVal; boolean defaultVal;
@NotNull @Nullable
List<String> displayLore; List<Message> displayLore;
@Nullable
Object param;
/** /**
* Constructor for a boolean setting gui factory. * Constructor for a boolean setting gui factory.
@ -185,22 +193,25 @@ public class BoolSettingsGui extends AbstractSettingGui {
* @param displayLore Gui display item lore. * @param displayLore Gui display item lore.
*/ */
public BoolSettingFactory( public BoolSettingFactory(
@NotNull String title, @NotNull ValueUpdatableGui parent, @NotNull Message title, @NotNull ValueUpdatableGui parent,
@NotNull ConfigHolder config, @NotNull String configPath, @NotNull ConfigHolder config, @NotNull String configPath,
boolean defaultVal, String... displayLore) { boolean defaultVal,
@Nullable Object param, @Nullable Message... displayLore) {
super(configPath, config); super(configPath, config);
this.title = title; this.title = title;
this.parent = parent; this.parent = parent;
this.defaultVal = defaultVal; 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. * @return Get setting's gui title.
*/ */
@NotNull @NotNull
public String getTitle() { public Message getTitle() {
return title; 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. * The item will have its value written in the lore part of the item.
* *
* @param name Name 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. * @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 // Get item properties
boolean value = getConfiguredValue(); boolean value = getConfiguredValue();
Material itemMat; Material itemMat;
StringBuilder itemName = new StringBuilder("§e"); Component itemName = name.formattedConcatenated(params);
String finalValue; String finalValue;
if (value) { if (value) {
itemMat = Material.GREEN_TERRACOTTA; itemMat = Material.GREEN_TERRACOTTA;
finalValue = "§aYes"; finalValue = "<green>Yes";//TODO MESSAGE
} else { } else {
itemMat = Material.RED_TERRACOTTA; itemMat = Material.RED_TERRACOTTA;
finalValue = "§cNo"; finalValue = "<red>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 // Get item properties
String configPath = GuiGlobalItems.getConfigNameFromPath(getConfigPath()); String configPath = GuiGlobalItems.getConfigNameFromPath(getConfigPath());
return getItem(CasedStringUtil.detectToUpperSpacedCase(configPath)); return getItem(MsgUI.INSTANCE.getSHARED_YELLOW_GET_ITEM(), CasedStringUtil.detectToUpperSpacedCase(configPath));
} }
} }

View file

@ -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.PatternPane;
import com.github.stefvanschie.inventoryframework.pane.util.Pattern; import com.github.stefvanschie.inventoryframework.pane.util.Pattern;
import io.delilaheve.CustomAnvil; import io.delilaheve.CustomAnvil;
import net.kyori.adventure.text.Component;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.event.inventory.InventoryClickEvent; 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.GuiGlobalActions;
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems; import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems;
import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant; 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.CasedStringUtil;
import xyz.alexcrea.cuanvil.util.ComponentUtil;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
@ -166,7 +170,7 @@ public class DoubleSettingGui extends AbstractSettingGui {
ItemMeta resultMeta = resultPaper.getItemMeta(); ItemMeta resultMeta = resultPaper.getItemMeta();
assert resultMeta != null; assert resultMeta != null;
resultMeta.setDisplayName("§fValue: §e" + displayValue(now)); resultMeta.setDisplayName("<white>Value: <yellow>" + displayValue(now));
resultPaper.setItemMeta(resultMeta); resultPaper.setItemMeta(resultMeta);
GuiItem resultItem = new GuiItem(resultPaper, GuiGlobalActions.stayInPlace, CustomAnvil.instance); 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){ private GuiItem getSetValueItem(Material mat, BigDecimal planned, String numberPrefix){
// Create set item lore // Create set item lore
ArrayList<String> setLoreItem = new ArrayList<>(); ArrayList<Component> setLoreItem = new ArrayList<>();
if(!holder.displayLore.isEmpty()){ if(holder.displayLore != null){
setLoreItem.addAll(holder.displayLore); setLoreItem.addAll(holder.displayLore.formatted(holder.param, holder.param2));
setLoreItem.add(""); setLoreItem.add(Component.empty());
} }
setLoreItem.add(AbstractSettingGui.CLICK_LORE); setLoreItem.addAll(MsgUI.INSTANCE.getSHARED_CLICK_TO_CHANGE().formatted());
// Create & return set value item // Create & return set value item
ItemStack item = new ItemStack(mat); ItemStack item = new ItemStack(mat);
@ -199,7 +203,7 @@ public class DoubleSettingGui extends AbstractSettingGui {
meta.setDisplayName("§e" + displayValue(now) + " §f-> §e" + displayValue(planned) meta.setDisplayName("§e" + displayValue(now) + " §f-> §e" + displayValue(planned)
+ " §r(" + numberPrefix + (displayValue(planned.subtract(now).abs()) + "§r)")); + " §r(" + numberPrefix + (displayValue(planned.subtract(now).abs()) + "§r)"));
meta.setLore(setLoreItem); ComponentUtil.INSTANCE.applyLore(setLoreItem, meta);
item.setItemMeta(meta); item.setItemMeta(meta);
return new GuiItem(item, updateNowConsumer(planned), CustomAnvil.instance); return new GuiItem(item, updateNowConsumer(planned), CustomAnvil.instance);
@ -357,7 +361,7 @@ public class DoubleSettingGui extends AbstractSettingGui {
*/ */
public static class DoubleSettingFactory extends SettingGuiFactory { public static class DoubleSettingFactory extends SettingGuiFactory {
@NotNull @NotNull
String title; Message title;
@NotNull @NotNull
ValueUpdatableGui parent; ValueUpdatableGui parent;
@ -369,8 +373,12 @@ public class DoubleSettingGui extends AbstractSettingGui {
BigDecimal defaultVal; BigDecimal defaultVal;
BigDecimal[] steps; BigDecimal[] steps;
@NotNull @Nullable
List<String> displayLore; Message displayLore;
@Nullable
Object param;
@Nullable
Object param2;
/** /**
* Constructor for a double setting gui factory. * 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. * If step only contain 1 value, no step item should be displayed.
*/ */
public DoubleSettingFactory( public DoubleSettingFactory(
@NotNull String title, @NotNull ValueUpdatableGui parent, @NotNull Message title, @NotNull ValueUpdatableGui parent,
@NotNull ConfigHolder config, @NotNull ConfigHolder config,
@NotNull String configPath, @NotNull String configPath,
@Nullable List<String> displayLore, @Nullable Message displayLore,
@Nullable Object param, @Nullable Object param2,
int scale, boolean asPercentage, boolean nullOnZero, int scale, boolean asPercentage, boolean nullOnZero,
double min, double max, double defaultVal, double... steps) { double min, double max, double defaultVal, double... steps) {
super(configPath, config); super(configPath, config);
@ -413,18 +422,16 @@ public class DoubleSettingGui extends AbstractSettingGui {
this.steps[i] = BigDecimal.valueOf(steps[i]).setScale(scale, RoundingMode.HALF_UP); 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 * @return Get setting's gui title
*/ */
@NotNull @NotNull
public String getTitle() { public Message getTitle() {
return title; 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 // Get item properties
BigDecimal value = getConfiguredValue(); BigDecimal value = getConfiguredValue();
StringBuilder itemName = new StringBuilder("§a").append(name);
return GuiGlobalItems.createGuiItemFromProperties(this, itemMat, itemName, var itemName = name.formattedConcatenated(params);
"§e" + displayValue(value, this.asPercentage),
this.displayLore, true); return GuiGlobalItems.createGuiItemFromProperties(
this, itemMat, itemName,
"<yellow>" + displayValue(value, this.asPercentage), //TODO MESSAGE ? maybe ?
Collections.singletonList(this.displayLore), true,
this.param, this.param2
);
} }
public GuiItem getItem(Material itemMat){ public GuiItem getItem(Material itemMat){
// Get item properties // Get item properties
String configPath = GuiGlobalItems.getConfigNameFromPath(getConfigPath()); String configPath = GuiGlobalItems.getConfigNameFromPath(getConfigPath());
return getItem(itemMat, CasedStringUtil.detectToUpperSpacedCase(configPath)); return getItem(itemMat, MsgUI.INSTANCE.getSHARED_GREEN_GET_ITEM(), CasedStringUtil.detectToUpperSpacedCase(configPath));
} }
} }

View file

@ -19,6 +19,9 @@ import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui;
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalActions; import xyz.alexcrea.cuanvil.gui.util.GuiGlobalActions;
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems; import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems;
import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant; 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.Arrays;
import java.util.Collections; import java.util.Collections;
@ -150,7 +153,7 @@ public class EnchantCostSettingsGui extends IntSettingsGui {
assert meta != null; assert meta != null;
meta.setDisplayName("§e" + nowBook + " §f-> §e" + planned + " §r(§c-" + (nowBook - planned) + "§r)"); 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); item.setItemMeta(meta);
minusItem = new GuiItem(item, updateNowBookConsumer(planned), CustomAnvil.instance); minusItem = new GuiItem(item, updateNowBookConsumer(planned), CustomAnvil.instance);
@ -167,8 +170,8 @@ public class EnchantCostSettingsGui extends IntSettingsGui {
ItemMeta meta = item.getItemMeta(); ItemMeta meta = item.getItemMeta();
assert meta != null; assert meta != null;
meta.setDisplayName("§e" + nowBook + " §f-> §e" + planned + " §r(§a+" + (planned - nowBook) + "§r)"); meta.setDisplayName("§e" + nowBook + " §f-> §e" + planned + " §r(§a+" + (planned - nowBook) + "§r)");//TODO MESSAGE
meta.setLore(Collections.singletonList(AbstractSettingGui.CLICK_LORE)); ComponentUtil.INSTANCE.applyLore(MsgUI.INSTANCE.getSHARED_CLICK_TO_CHANGE().formatted(), meta);
item.setItemMeta(meta); item.setItemMeta(meta);
plusItem = new GuiItem(item, updateNowBookConsumer(planned), CustomAnvil.instance); plusItem = new GuiItem(item, updateNowBookConsumer(planned), CustomAnvil.instance);
@ -182,9 +185,9 @@ public class EnchantCostSettingsGui extends IntSettingsGui {
ItemMeta nowMeta = nowPaper.getItemMeta(); ItemMeta nowMeta = nowPaper.getItemMeta();
assert nowMeta != null; assert nowMeta != null;
nowMeta.setDisplayName("§fValue: §e" + nowBook); nowMeta.setDisplayName("<white>Value: <yellow>" + nowBook);//TODO MESSAGE
if (!holder.displayLore.isEmpty()) { if (holder.displayLore != null) {
nowMeta.setLore(holder.displayLore); ComponentUtil.INSTANCE.applyLore(ComponentUtil.INSTANCE.asComponents(holder.displayLore, holder.param), nowMeta);
} }
nowPaper.setItemMeta(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. * If step only contain 1 value, no step item should be displayed.
*/ */
public EnchantCostSettingFactory( public EnchantCostSettingFactory(
@NotNull String title, ValueUpdatableGui parent, @NotNull Message title, ValueUpdatableGui parent,
@NotNull String configPath, @NotNull ConfigHolder config, @NotNull String configPath, @NotNull ConfigHolder config,
@Nullable List<String> displayLore, @Nullable Message displayLore, @Nullable Object param,
@NotNull CAEnchantment enchantment, @NotNull CAEnchantment enchantment,
int min, int max, int... steps) { int min, int max, int... steps) {
super(title, parent, super(title, parent,
configPath, config, configPath, config,
displayLore, displayLore, param,
min, max, enchantment.defaultRarity().getItemValue(), min, max, enchantment.defaultRarity().getItemValue(),
steps); steps);
@ -302,7 +305,8 @@ public class EnchantCostSettingsGui extends IntSettingsGui {
return new EnchantCostSettingsGui(this, nowItem); return new EnchantCostSettingsGui(this, nowItem);
} }
public List<String> getDisplayLore() { @Nullable
public List<Message> getDisplayLore() {
return this.displayLore; return this.displayLore;
} }
} }

View file

@ -15,6 +15,7 @@ import xyz.alexcrea.cuanvil.config.ConfigHolder;
import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui; import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui;
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems; import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems;
import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant; import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant;
import xyz.alexcrea.cuanvil.lang.Message;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@ -137,7 +138,7 @@ public class EnumSettingGui<T extends Enum<T> & EnumSettingGui.ConfigurableEnum>
*/ */
public abstract static class EnumSettingFactory<T extends Enum<T> & ConfigurableEnum> extends SettingGuiFactory { public abstract static class EnumSettingFactory<T extends Enum<T> & ConfigurableEnum> extends SettingGuiFactory {
@NotNull @NotNull
String title; Message title;
@NotNull @NotNull
ValueUpdatableGui parent; ValueUpdatableGui parent;
@ -150,7 +151,7 @@ public class EnumSettingGui<T extends Enum<T> & EnumSettingGui.ConfigurableEnum>
* @param config Configuration holder of this setting. * @param config Configuration holder of this setting.
*/ */
protected EnumSettingFactory( protected EnumSettingFactory(
@NotNull String title, @NotNull ValueUpdatableGui parent, @NotNull Message title, @NotNull ValueUpdatableGui parent,
@NotNull String configPath, @NotNull ConfigHolder config) { @NotNull String configPath, @NotNull ConfigHolder config) {
super(configPath, config); super(configPath, config);
this.title = title; this.title = title;
@ -161,7 +162,7 @@ public class EnumSettingGui<T extends Enum<T> & EnumSettingGui.ConfigurableEnum>
* @return Get setting's gui title. * @return Get setting's gui title.
*/ */
@NotNull @NotNull
public String getTitle() { public Message getTitle() {
return title; return title;
} }

View file

@ -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.PatternPane;
import com.github.stefvanschie.inventoryframework.pane.util.Pattern; import com.github.stefvanschie.inventoryframework.pane.util.Pattern;
import io.delilaheve.CustomAnvil; 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.Material;
import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.ItemStack; 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.GuiGlobalActions;
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems; import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems;
import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant; 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.CasedStringUtil;
import xyz.alexcrea.cuanvil.util.ComponentUtil;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@ -71,8 +77,8 @@ public class IntSettingsGui extends AbstractSettingGui {
ItemMeta meta = item.getItemMeta(); ItemMeta meta = item.getItemMeta();
assert meta != null; assert meta != null;
meta.setDisplayName("§eReset to default value"); meta.setDisplayName("§eReset to default value");//TODO MESSAGE
meta.setLore(Collections.singletonList("§7Default value is §e" + meta.setLore(Collections.singletonList("§7Default value is §e" +//TODO MESSAGE
holder.valueDisplayName(ValueDisplayType.RESET, holder.defaultVal))); holder.valueDisplayName(ValueDisplayType.RESET, holder.defaultVal)));
item.setItemMeta(meta); item.setItemMeta(meta);
returnToDefault = new GuiItem(item, event -> { returnToDefault = new GuiItem(item, event -> {
@ -114,8 +120,9 @@ public class IntSettingsGui extends AbstractSettingGui {
ItemMeta resultMeta = resultPaper.getItemMeta(); ItemMeta resultMeta = resultPaper.getItemMeta();
assert resultMeta != null; assert resultMeta != null;
resultMeta.setDisplayName("§fValue: §e" + holder.valueDisplayName(ValueDisplayType.CURRENT, now)); resultMeta.setDisplayName("<white>Value: <yellow>" + holder.valueDisplayName(ValueDisplayType.CURRENT, now));//TODO MESSAGE
resultMeta.setLore(holder.displayLore); if(holder.displayLore != null)
ComponentUtil.INSTANCE.applyLore(ComponentUtil.INSTANCE.asComponents(holder.displayLore, holder.param), resultMeta);
resultPaper.setItemMeta(resultMeta); resultPaper.setItemMeta(resultMeta);
@ -142,9 +149,9 @@ public class IntSettingsGui extends AbstractSettingGui {
var nowDisplay = holder.valueDisplayName(type, now); var nowDisplay = holder.valueDisplayName(type, now);
var plannedDisplay = holder.valueDisplayName(type, planned); var plannedDisplay = holder.valueDisplayName(type, planned);
var deltaDisplay = holder.deltaDisplay(type, now, 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); item.setItemMeta(meta);
return new GuiItem(item, updateNowConsumer(planned), CustomAnvil.instance); return new GuiItem(item, updateNowConsumer(planned), CustomAnvil.instance);
} }
@ -278,7 +285,7 @@ public class IntSettingsGui extends AbstractSettingGui {
public static class IntSettingFactory extends SettingGuiFactory { public static class IntSettingFactory extends SettingGuiFactory {
@NotNull @NotNull
String title; Message title;
@NotNull @NotNull
ValueUpdatableGui parent; ValueUpdatableGui parent;
int min; int min;
@ -286,8 +293,11 @@ public class IntSettingsGui extends AbstractSettingGui {
int defaultVal; int defaultVal;
int[] steps; int[] steps;
@NotNull @Nullable
List<String> displayLore; List<Message> displayLore;
@Nullable
Object param;
/** /**
* Constructor for an int setting gui factory. * 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. * If step only contain 1 value, no step item should be displayed.
*/ */
public IntSettingFactory( public IntSettingFactory(
@NotNull String title, @NotNull ValueUpdatableGui parent, @NotNull Message title, @NotNull ValueUpdatableGui parent,
@NotNull String configPath, @NotNull ConfigHolder config, @NotNull String configPath, @NotNull ConfigHolder config,
@Nullable List<String> displayLore, @Nullable Message displayLore, @Nullable Object param,
int min, int max, int defaultVal, int... steps) { int min, int max, int defaultVal, int... steps) {
super(configPath, config); super(configPath, config);
this.title = title; this.title = title;
@ -317,19 +327,15 @@ public class IntSettingsGui extends AbstractSettingGui {
this.max = max; this.max = max;
this.defaultVal = defaultVal; this.defaultVal = defaultVal;
this.steps = steps; this.steps = steps;
this.displayLore = displayLore == null ? null : Collections.singletonList(displayLore);
if (displayLore == null) { this.param = param;
this.displayLore = Collections.emptyList();
} else {
this.displayLore = displayLore;
}
} }
/** /**
* @return Get setting's gui title * @return Get setting's gui title
*/ */
@NotNull @NotNull
public String getTitle() { public Message getTitle() {
return title; return title;
} }
@ -355,19 +361,24 @@ public class IntSettingsGui extends AbstractSettingGui {
* *
* @param itemMat Displayed material of the item. * @param itemMat Displayed material of the item.
* @param name Name 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. * @return A formatted GuiItem that will create and open a GUI for the int setting.
*/ */
public GuiItem getItem( public GuiItem getItem(
@NotNull Material itemMat, @NotNull Material itemMat,
@NotNull String name @NotNull Message name,
Object... params
) { ) {
// Get item properties // Get item properties
int value = getConfiguredValue(); int value = getConfiguredValue();
StringBuilder itemName = new StringBuilder("§a").append(name); var itemName = name.formattedConcatenated(params);
return GuiGlobalItems.createGuiItemFromProperties(this, itemMat, itemName, return GuiGlobalItems.createGuiItemFromProperties(
"§e" + value, this, itemMat, itemName,
this.displayLore, true); "<yellow>" + value, //TODO MESSAGE ? maybe ?
this.displayLore, true,
this.param
);
} }
/** /**
@ -383,7 +394,7 @@ public class IntSettingsGui extends AbstractSettingGui {
@NotNull Material itemMat @NotNull Material itemMat
) { ) {
String configPath = GuiGlobalItems.getConfigNameFromPath(getConfigPath()); 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) { protected String valueDisplayName(ValueDisplayType type, int value) {
@ -396,6 +407,9 @@ public class IntSettingsGui extends AbstractSettingGui {
else return "§a+" + delta; else return "§a+" + delta;
} }
public @Nullable Object getParam() {
return param;
}
} }
public enum ValueDisplayType { public enum ValueDisplayType {

View file

@ -17,8 +17,11 @@ import xyz.alexcrea.cuanvil.config.ConfigHolder;
import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui; import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui;
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems; import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems;
import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant; import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant;
import xyz.alexcrea.cuanvil.lang.Message;
import xyz.alexcrea.cuanvil.util.CasedStringUtil; import xyz.alexcrea.cuanvil.util.CasedStringUtil;
import xyz.alexcrea.cuanvil.util.ComponentUtil;
import java.awt.*;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@ -168,13 +171,13 @@ public class ItemSettingGui extends AbstractSettingGui {
*/ */
public static class ItemSettingFactory extends SettingGuiFactory { public static class ItemSettingFactory extends SettingGuiFactory {
@NotNull @NotNull
String title; Message title;
@NotNull @NotNull
ValueUpdatableGui parent; ValueUpdatableGui parent;
@Nullable @Nullable
ItemStack defaultVal; ItemStack defaultVal;
@NotNull @NotNull
List<String> displayLore; List<Message> displayLore;
/** /**
* Constructor for an item setting gui factory. * Constructor for an item setting gui factory.
@ -187,10 +190,10 @@ public class ItemSettingGui extends AbstractSettingGui {
* @param displayLore Gui display item lore. * @param displayLore Gui display item lore.
*/ */
public ItemSettingFactory( public ItemSettingFactory(
@NotNull String title, @NotNull ValueUpdatableGui parent, @NotNull Message title, @NotNull ValueUpdatableGui parent,
@NotNull String configPath, @NotNull ConfigHolder config, @NotNull String configPath, @NotNull ConfigHolder config,
@Nullable ItemStack defaultVal, @Nullable ItemStack defaultVal,
String... displayLore) { Message... displayLore) {
super(configPath, config); super(configPath, config);
this.title = title; this.title = title;
this.parent = parent; this.parent = parent;
@ -203,7 +206,7 @@ public class ItemSettingGui extends AbstractSettingGui {
* @return Get setting's gui title. * @return Get setting's gui title.
*/ */
@NotNull @NotNull
public String getTitle() { public Message getTitle() {
return title; return title;
} }
@ -215,7 +218,7 @@ public class ItemSettingGui extends AbstractSettingGui {
} }
@NotNull @NotNull
public List<String> getDisplayLore() { public List<Message> getDisplayLore() {
return this.displayLore; return this.displayLore;
} }
@ -245,8 +248,9 @@ public class ItemSettingGui extends AbstractSettingGui {
ItemMeta meta = item.getItemMeta(); ItemMeta meta = item.getItemMeta();
assert meta != null; assert meta != null;
//TODO MESSAGE name ?
meta.setDisplayName("§a" + name); meta.setDisplayName("§a" + name);
meta.setLore(getDisplayLore()); ComponentUtil.INSTANCE.applyLore(ComponentUtil.INSTANCE.asComponents(getDisplayLore()), meta);
meta.addItemFlags(ItemFlag.values()); meta.addItemFlags(ItemFlag.values());
item.setItemMeta(meta); item.setItemMeta(meta);

View file

@ -15,27 +15,21 @@ import xyz.alexcrea.cuanvil.anvil.AnvilUseType;
import xyz.alexcrea.cuanvil.config.ConfigHolder; import xyz.alexcrea.cuanvil.config.ConfigHolder;
import xyz.alexcrea.cuanvil.config.WorkPenaltyType; import xyz.alexcrea.cuanvil.config.WorkPenaltyType;
import xyz.alexcrea.cuanvil.gui.config.global.BasicConfigGui; 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.lang.MsgUI;
import xyz.alexcrea.cuanvil.util.ComponentUtil;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.EnumMap; import java.util.EnumMap;
import java.util.List;
import java.util.Map; import java.util.Map;
public class WorkPenaltyTypeSettingGui extends AbstractSettingGui { 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 WorkPenaltyType currentType;
private final @NotNull Map<AnvilUseType, WorkPenaltyType.WorkPenaltyPart> items; private final @NotNull Map<AnvilUseType, WorkPenaltyType.WorkPenaltyPart> items;
public WorkPenaltyTypeSettingGui(@NotNull BasicConfigGui parent) { 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.currentType = ConfigOptions.INSTANCE.getWorkPenaltyType();
this.items = new EnumMap<>(this.currentType.getPartMap()); this.items = new EnumMap<>(this.currentType.getPartMap());
@ -47,23 +41,22 @@ public class WorkPenaltyTypeSettingGui extends AbstractSettingGui {
public static GuiItem getDisplayItem(@NotNull BasicConfigGui parent, public static GuiItem getDisplayItem(@NotNull BasicConfigGui parent,
@NotNull Material itemMat, @NotNull Material itemMat,
@NotNull String name) { @NotNull Message name) {
List<String> displayLore = new ArrayList<>(); var item = new ItemStack(itemMat);
displayLore.add("§7Work penalty increase the price for every anvil use."); var meta = item.getItemMeta();
displayLore.add("§7This config allow you to choose the comportment of work penalty."); assert meta != null;
displayLore.add(INCREASING_EXPLANATION);
displayLore.add(ADDING_EXPLANATION);
displayLore.add("");
displayLore.add("§7About shared/exclusive penalty:");
displayLore.add(SHARED_EXPLANATION);
displayLore.add(EXCLUSIVE_EXPLANATION);
ItemStack item = new ItemStack(itemMat); var lore = new ArrayList<Message>();
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(); ComponentUtil.INSTANCE.setMessageName(meta, name);
meta.setDisplayName(name); ComponentUtil.INSTANCE.applyLore(ComponentUtil.INSTANCE.asComponents(lore), meta);
meta.setLore(displayLore);
item.setItemMeta(meta); item.setItemMeta(meta);
@ -111,6 +104,7 @@ public class WorkPenaltyTypeSettingGui extends AbstractSettingGui {
char exclusiveAdditive = typeVals.charAt(4); char exclusiveAdditive = typeVals.charAt(4);
WorkPenaltyType.WorkPenaltyPart part = items.get(type); WorkPenaltyType.WorkPenaltyPart part = items.get(type);
//TODO MESSAGE
String increasingStr = (part.penaltyIncrease() ? "§a" : "§c") + "Increasing"; String increasingStr = (part.penaltyIncrease() ? "§a" : "§c") + "Increasing";
String additiveStr = (part.penaltyAdditive() ? "§a" : "§c") + "Additive"; String additiveStr = (part.penaltyAdditive() ? "§a" : "§c") + "Additive";
String exclusiveIncreasingStr = (part.exclusivePenaltyIncrease() ? "§a" : "§c") + "Increasing"; String exclusiveIncreasingStr = (part.exclusivePenaltyIncrease() ? "§a" : "§c") + "Increasing";
@ -124,6 +118,7 @@ public class WorkPenaltyTypeSettingGui extends AbstractSettingGui {
displayLore.add("§eExclusive§7: " + exclusiveAdditiveStr + " §7| " + exclusiveIncreasingStr); displayLore.add("§eExclusive§7: " + exclusiveAdditiveStr + " §7| " + exclusiveIncreasingStr);
ItemMeta meta = displayItem.getItemMeta(); ItemMeta meta = displayItem.getItemMeta();
assert meta != null;
meta.setDisplayName("§e" + type.getDisplayName()); meta.setDisplayName("§e" + type.getDisplayName());
meta.setLore(displayLore); meta.setLore(displayLore);
displayItem.setItemMeta(meta); displayItem.setItemMeta(meta);
@ -137,9 +132,14 @@ public class WorkPenaltyTypeSettingGui extends AbstractSettingGui {
ItemStack incrementItem = new ItemStack(part.penaltyIncrease() ? Material.GREEN_TERRACOTTA : Material.RED_TERRACOTTA); ItemStack incrementItem = new ItemStack(part.penaltyIncrease() ? Material.GREEN_TERRACOTTA : Material.RED_TERRACOTTA);
meta = incrementItem.getItemMeta(); meta = incrementItem.getItemMeta();
assert meta != null;
meta.setDisplayName(increasingStr); meta.setDisplayName(increasingStr);
meta.setLore(List.of(INCREASING_EXPLANATION));
meta.setLore(List.of(SHARED_EXPLANATION)); var lore = new ArrayList<Message>();
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); incrementItem.setItemMeta(meta);
pane.bindItem(increment, new GuiItem(incrementItem, (event) -> { 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); ItemStack additiveItem = new ItemStack(part.penaltyAdditive() ? Material.GREEN_TERRACOTTA : Material.RED_TERRACOTTA);
meta = additiveItem.getItemMeta(); meta = additiveItem.getItemMeta();
assert meta != null;
meta.setDisplayName(additiveStr); 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); additiveItem.setItemMeta(meta);
pane.bindItem(additive, new GuiItem(additiveItem, (event) -> { 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); ItemStack exclusiveIncrementItem = new ItemStack(part.exclusivePenaltyIncrease() ? Material.GREEN_TERRACOTTA : Material.RED_TERRACOTTA);
meta = exclusiveIncrementItem.getItemMeta(); meta = exclusiveIncrementItem.getItemMeta();
assert meta != null;
meta.setDisplayName(exclusiveIncreasingStr); 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); exclusiveIncrementItem.setItemMeta(meta);
pane.bindItem(exclusiveIncrement, new GuiItem(exclusiveIncrementItem, (event) -> { 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); ItemStack exclusiveAdditiveItem = new ItemStack(part.exclusivePenaltyAdditive() ? Material.GREEN_TERRACOTTA : Material.RED_TERRACOTTA);
meta = exclusiveAdditiveItem.getItemMeta(); meta = exclusiveAdditiveItem.getItemMeta();
assert meta != null;
meta.setDisplayName(exclusiveAdditiveStr); 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); exclusiveAdditiveItem.setItemMeta(meta);
pane.bindItem(exclusiveAdditive, new GuiItem(exclusiveAdditiveItem, (event) -> { pane.bindItem(exclusiveAdditive, new GuiItem(exclusiveAdditiveItem, (event) -> {

View file

@ -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.gui.type.util.Gui;
import com.github.stefvanschie.inventoryframework.pane.PatternPane; import com.github.stefvanschie.inventoryframework.pane.PatternPane;
import io.delilaheve.CustomAnvil; import io.delilaheve.CustomAnvil;
import net.kyori.adventure.text.Component;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.HumanEntity; import org.bukkit.entity.HumanEntity;
import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull; 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.ValueUpdatableGui;
import xyz.alexcrea.cuanvil.gui.config.settings.SettingGui; 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.ArrayList;
import java.util.Collections; import java.util.Collections;
@ -184,9 +190,6 @@ public class GuiGlobalItems {
return new GuiItem(item, GuiGlobalActions.openSettingGuiAction(factory), CustomAnvil.instance); 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. * Create an arbitrary GuiItem from a unique setting and item's property.
* *
@ -201,17 +204,23 @@ public class GuiGlobalItems {
public static GuiItem createGuiItemFromProperties( public static GuiItem createGuiItemFromProperties(
@NotNull SettingGui.SettingGuiFactory factory, @NotNull SettingGui.SettingGuiFactory factory,
@NotNull Material itemMat, @NotNull Material itemMat,
@NotNull StringBuilder itemName, @NotNull Component itemName,
@NotNull Object value, @NotNull Object value,//TODO ????
@NotNull List<String> displayLore, @Nullable List<Message> displayLore,
boolean displayValuePrefix boolean displayValuePrefix,
@Nullable Object... params
) { ) {
// Prepare lore // Prepare lore
ArrayList<String> lore = new ArrayList<>(); var loreHeader = (displayValuePrefix ?
lore.add((displayValuePrefix ? SETTING_ITEM_LORE_PREFIX : "") + value); MsgUI.INSTANCE.getGLOBAL_ITEM_ITEM_LORE_PREFIX() :
if(!displayLore.isEmpty()){ MsgUI.INSTANCE.getGLOBAL_ITEM_ITEM_LORE_PREFIX_ALONE());
lore.add("");
lore.addAll(displayLore); List<Component> lore = loreHeader.formatted(value);
if(displayLore != null){
lore.add(Component.empty());
for(Message message : displayLore) {
lore.addAll(message.formatted(params));
}
} }
// Create & initialise item // Create & initialise item
@ -219,8 +228,8 @@ public class GuiGlobalItems {
ItemMeta itemMeta = item.getItemMeta(); ItemMeta itemMeta = item.getItemMeta();
assert itemMeta != null; assert itemMeta != null;
itemMeta.setDisplayName(itemName.toString()); PlatformUtil.INSTANCE.setComponentDisplayName(itemMeta, itemName, null);
itemMeta.setLore(lore); ComponentUtil.INSTANCE.applyLore(lore, itemMeta);
itemMeta.addItemFlags(ItemFlag.values()); itemMeta.addItemFlags(ItemFlag.values());
item.setItemMeta(itemMeta); item.setItemMeta(itemMeta);

View file

@ -109,7 +109,7 @@ class DebugToggleExecutor: CASubCommand {
Text(MsgCommand.SHARED_HOVER_COPY.legacy()) Text(MsgCommand.SHARED_HOVER_COPY.legacy())
) )
sender.spigot().sendMessage(message); sender.spigot().sendMessage(message)
} else { } else {
sender.sendMessage(stb.toString()) sender.sendMessage(stb.toString())
} }
@ -137,7 +137,14 @@ class DebugToggleExecutor: CASubCommand {
if(Lang.has(message.key)) validCount++ if(Lang.has(message.key)) validCount++
val valid = (100.0 * validCount) / registeredKeys.size 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) { private fun detailedLangDebug(sender: CommandSender) {
@ -179,7 +186,7 @@ class DebugToggleExecutor: CASubCommand {
Text(MsgCommand.SHARED_HOVER_COPY.legacy()) Text(MsgCommand.SHARED_HOVER_COPY.legacy())
) )
sender.spigot().sendMessage(message); sender.spigot().sendMessage(message)
} else { } else {
sender.sendMessage("No additional issue found") sender.sendMessage("No additional issue found")
} }
@ -198,7 +205,6 @@ class DebugToggleExecutor: CASubCommand {
var index = 0 var index = 0
while(true) { while(true) {
index = text.indexOf('%', index) 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++ index++
continue continue
@ -218,23 +224,29 @@ class DebugToggleExecutor: CASubCommand {
for(textParam in textParams) { for(textParam in textParams) {
var found = false var found = false
for(param in message.params) { for(param in message.params) {
if(param.isEmpty()) continue if(param == null) continue
if(textParam.startsWith(param)) { if(textParam.startsWith(param)) {
found = true found = true
usedParam.add(param) usedParam.add(param)
break break
} }
} }
if(found) break
if(!found) {
hadIssue = true hadIssue = true
stb.append("Did not found param %$textParam in register list for ${message.key}\n") stb.append("Did not found param %$textParam in register list for ${message.key}\n")
} }
}
for(param in message.params) { for(param in message.params) {
if(usedParam.contains(param)) continue if(param == null) continue
if("unused".contentEquals(param)) continue var found = false
for(used in usedParam) {
if(!used.startsWith(param)) continue
found = true
break
}
if(found) continue
hadIssue = true hadIssue = true
stb.append("Param %$param is not used for key ${message.key}\n") stb.append("Param %$param is not used for key ${message.key}\n")
} }

View file

@ -219,8 +219,8 @@ class DiagnosticExecutor : CASubCommand {
} }
private fun pluginListDiag(sender: CommandSender, stb: StringBuilder) { private fun pluginListDiag(sender: CommandSender, stb: StringBuilder) {
val enabledPlugins: MutableList<Plugin?> = ArrayList<Plugin?>() val enabledPlugins: MutableList<Plugin?> = ArrayList()
val disabledPlugins: MutableList<Plugin?> = ArrayList<Plugin?>() val disabledPlugins: MutableList<Plugin?> = ArrayList()
for (plugin in Bukkit.getPluginManager().plugins) { for (plugin in Bukkit.getPluginManager().plugins) {
if (plugin.isEnabled) { if (plugin.isEnabled) {
enabledPlugins.add(plugin) enabledPlugins.add(plugin)

View file

@ -12,9 +12,10 @@ import xyz.alexcrea.cuanvil.util.ComponentUtil.serializePlain
import xyz.alexcrea.cuanvil.util.MiniMessageUtil import xyz.alexcrea.cuanvil.util.MiniMessageUtil
import java.util.Collections import java.util.Collections
import java.util.logging.Level import java.util.logging.Level
import kotlin.math.max
import kotlin.math.min 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 { companion object {
private val values = ArrayList<Message>() private val values = ArrayList<Message>()
@ -28,30 +29,61 @@ open class Message(val key: String, vararg val params: String, register: Boolean
if(register) values.add(this) 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 // replace all placeholder thingy %key -> value
if(params.size != values.size) { if(params.size != values.size) {
CustomAnvil.log("Wrong number of argument for parameter for key $key (${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)) { for(i in 0 until min(params.size, values.size)) {
val key = params[i] val key = params[i] ?: continue
val replacement = values[i].toString() val value = values[i]
if(replacement.isEmpty()) continue //May not be good but can be changed if cause an issue 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 var current = 0
while(true) { while(true) {
current = stb.indexOf('%', current) + 1 current = stb.indexOf('%', current)
if(current <= 0 || current + key.length > stb.length) break // may be able to be removed if bound checked in startsWith ? 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 if(!stb.startsWith(key, current, false)) continue
stb.replace(current - 1, current + key.length, replacement) stb.replace(current - 1, current + key.length, replacement)
current = current - 1 + replacement.length 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) val translated = Lang.getTranslated(key)
if(params.isEmpty() && this.params.isEmpty()) return translated 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() return stb.toString()
} }
private fun unformattedMultiline(section: ConfigurationSection, vararg params: Any): String { private fun unformattedMultiline(section: ConfigurationSection, vararg params: Any?): String {
val stb = StringBuilder() val stb = StringBuilder()
for(key in section.getKeys(false)) { 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() return stb.toString()
} }
fun unformatted(vararg params: Any): String { fun unformatted(vararg params: Any?): String {
val section = Lang.getSection(key) val section = Lang.getSection(key)
if(section != null) return unformattedMultiline(section, *params) if(section != null) return unformattedMultiline(section, *params)
return unformattedMonoline(*params) return unformattedMonoline(*params)
} }
private fun formattedMultiline(section: ConfigurationSection, vararg params: Any): List<Component> { private fun formattedMultiline(section: ConfigurationSection, vararg params: Any?): MutableList<Component> {
val result = ArrayList<Component>() val result = ArrayList<Component>()
for(key in section.getKeys(false)) { 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())) 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 result
} }
// return a list of AT LEAST 1 element. calling first is safe // return a list of AT LEAST 1 element. calling first is safe
fun formatted(vararg params: Any): List<Component> { fun formatted(vararg params: Any?): MutableList<Component> {
val section = Lang.getSection(key) val section = Lang.getSection(key)
if(section != null) return formattedMultiline(section, *params) if(section != null) return formattedMultiline(section, *params)
val translated = unformattedMonoline(*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) val formated = formatted(*params)
var result = formated.first() var result = formated.first()
@ -118,11 +150,11 @@ open class Message(val key: String, vararg val params: String, register: Boolean
return result return result
} }
fun textHolder(vararg params: Any): TextHolder { fun textHolder(vararg params: Any?): TextHolder {
return ComponentHolder.of(formattedConcatenated(*params)) return ComponentHolder.of(formattedConcatenated(*params))
} }
fun legacy(vararg params: Any): String { fun legacy(vararg params: Any?): String {
val formated = formatted(*params) val formated = formatted(*params)
val stb = StringBuilder() val stb = StringBuilder()
@ -133,7 +165,7 @@ open class Message(val key: String, vararg val params: String, register: Boolean
return stb.toString() return stb.toString()
} }
open fun log(vararg params: Any) { open fun log(vararg params: Any?) {
val texts = formatted(*params) val texts = formatted(*params)
for(component in texts) { 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) 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) val texts = formatted(*params)
for(component in texts) { for(component in texts) {
@ -159,7 +191,7 @@ 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) val texts = formatted(*params)
for(component in texts) { 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) val texts = formatted(*params)
for(component in texts) { for(component in texts) {

View file

@ -6,6 +6,12 @@ object MsgUI {
val SHARED_CONFIG_NO_EDIT_PERM = Message("shared.no-permission") val SHARED_CONFIG_NO_EDIT_PERM = Message("shared.no-permission")
val SHARED_TYPED_CONFIG_TITLE = Message("shared.typed-config-title", "type") 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_FAILED = Message("confirm-action.fail")
val CONFIRM_ACTION_ARE_YOU_SURE = Message("confirm-action.is-user-sure") 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_CANCELLED_NEW = Message("element-list.cancelled-new", "type")
val ELEMENT_LIST_DUPLICATED_NEW = Message("element-list.duplicated-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_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_TITLE = Message("unit-repair.new.title", null)
val UNIT_REPAIR_NEW_DESCRIPTION = Message("unit-repair.new.description") 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_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_CANNOT_REPAIR = Message("unit-repair.element.new.cannot-damage")
val UNIT_REPAIR_NEW_ELEMENT_SAME_TYPE = Message("unit-repair.element.new.same-type") 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_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_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_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_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_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_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_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_NAME = Message("material-group.element.delete.button.name")
val MATERIAL_GROUP_ELEMENT_DELETE_BUTTON_LORE = Message("material-group.element.delete.button.lore") 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_TITLE = Message("material-select.new.confirm.title", "name")
val MATERIAL_SELECT_CONFIRM_DESCRIPTION = Message("material-select.new.confirm.description", "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")
} }

View file

@ -31,7 +31,7 @@ object ComponentUtil {
destination.sendMessage(this.serializeLegacy()) destination.sendMessage(this.serializeLegacy())
} }
fun List<Component>.send(destination: CommandSender) { fun Collection<Component>.send(destination: CommandSender) {
for(component in this) for(component in this)
component.send(destination) component.send(destination)
} }
@ -41,8 +41,25 @@ object ComponentUtil {
meta.lore = this.map {obj -> obj.serializeLegacy()} 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)) this.setComponentDisplayName(message.formattedConcatenated(*params))
} }
fun List<Message>.asComponents(vararg params: Any?): List<Component> {
val result = ArrayList<Component>()
for(message in this) {
result.addAll(message.formatted(*params))
}
return result
}
fun Array<Message>.asComponents(vararg params: Any?): List<Component> {
val result = ArrayList<Component>()
for(message in this) {
result.addAll(message.formatted(*params))
}
return result
}
} }

View file

@ -1,8 +1,7 @@
name: English name: English
last-updated: 2.1.0 last-updated: 2.1.0
warning: warning.load:
load:
legacy: legacy:
old-name: old-name:
1: "An old version of this plugin was detected" 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" 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" 2: "As native nms is not supported for spigot starting 26.1"
update.available: "An update may be available: %version" update.available: "An update may be available: %version"
anvil:
warning.anvil:
generic: "<white>[<yellow>CustomAnvil<white>] <red>Error while handling the anvil." generic: "<white>[<yellow>CustomAnvil<white>] <red>Error while handling the anvil."
error: error.load:
load:
legacy.failed: "error trying to check for legacy system" legacy.failed: "error trying to check for legacy system"
update.check-fail: "error trying to fetch latest update" update.check-fail: "error trying to fetch latest update"
command-register: "error trying to register commands" command-register: "error trying to register commands"
@ -27,16 +26,15 @@ error:
enchant-system: "error initializing enchantment system" enchant-system: "error initializing enchantment system"
non-default-config: "Plugin has an issue while trying to load non default config... exiting..." non-default-config: "Plugin has an issue while trying to load non default config... exiting..."
reload: error.reload:
resource: resource:
fail: "Resource %path Could not be loaded or reloaded." fail: "Resource %path Could not be loaded or reloaded."
hard-fail: "Disabling plugin." hard-fail: "Disabling plugin."
confirm-action: error.confirm-action:
generic: "Could not process confirmation supplier." generic: "Could not process confirmation supplier."
command: command.shared:
shared:
no-diag-permission: "<red>You do not have permission to diagnostic this server" no-diag-permission: "<red>You do not have permission to diagnostic this server"
hover-copy: "<gray>Click to copy" hover-copy: "<gray>Click to copy"
unknown-subcmd: "Unknown subcommand %command" unknown-subcmd: "Unknown subcommand %command"
@ -44,13 +42,13 @@ command:
warning: warning:
missing-subcmd: "Need to specify a subcommand. for example %example1 or %example2" missing-subcmd: "Need to specify a subcommand. for example %example1 or %example2"
root: command.root:
warning: warning:
unknown-sub: "<red>Invalid subcommand. run <yellow>`%command help` <red>to see available commands" unknown-sub: "<red>Invalid subcommand. run <yellow>`%command help` <red>to see available commands"
error: error:
generic: "<red>Error running this command" generic: "<red>Error running this command"
debug: command.debug:
description: "Used to toggle debug logs and retrieve them" description: "Used to toggle debug logs and retrieve them"
log-cleared: "Log Cleared" log-cleared: "Log Cleared"
toggled: "Debug toggled to %type" toggled: "Debug toggled to %type"
@ -64,12 +62,12 @@ command:
invalid-type: "Invalid debug type \"%type\"" invalid-type: "Invalid debug type \"%type\""
no-log: "No log to show ? make sure you tried with debug log toggled (%command)" no-log: "No log to show ? make sure you tried with debug log toggled (%command)"
diagnostic: command.diagnostic:
description: "Basic diagnostic of this plugin" description: "Basic diagnostic of this plugin"
had-error: "<red>There was an error running the diagnostic" had-error: "<red>There was an error running the diagnostic"
copy: "<green>Click to copy diagnostic data" copy: "<green>Click to copy diagnostic data"
config: command.config:
description: "Used to edit the configuration of the plugin" description: "Used to edit the configuration of the plugin"
folia-issue: folia-issue:
1: "<red>It look like you are using Folia. Sadly Custom Anvil do not support Config gui for Folia." 1: "<red>It look like you are using Folia. Sadly Custom Anvil do not support Config gui for Folia."
@ -84,7 +82,7 @@ command:
legacy-name: "<red>/ca gui has been moved to /ca config" legacy-name: "<red>/ca gui has been moved to /ca config"
cannot_configure: "Cannot configure the item in hand" cannot_configure: "Cannot configure the item in hand"
enchant: command.enchant:
description: "Allows to set enchantment to holden item" description: "Allows to set enchantment to holden item"
warning: warning:
missing_parameter: "Missing enchantment parameter" missing_parameter: "Missing enchantment parameter"
@ -94,38 +92,46 @@ command:
removed: "%name removed" removed: "%name removed"
set: "%name set to level %level" set: "%name set to level %level"
help: command.help:
description: "Help command" description: "Help command"
header: "List of available commands:" header: "List of available commands:"
reload: command.reload:
description: "Reload the configuration of this plugin" description: "Reload the configuration of this plugin"
start: "<yellow>Reloading config..." start: "<yellow>Reloading config..."
success: "<green>Config reloaded !" success: "<green>Config reloaded !"
fail: "<red>Config was not able to be reloaded..." fail: "<red>Config was not able to be reloaded..."
hard-fail: "<red>Hard fail, plugin disabled" hard-fail: "<red>Hard fail, plugin disabled"
config-ui:
shared: config-ui.shared:
no-permission: "<red>You do not have permission to edit the config" no-permission: "<red>You do not have permission to edit the config"
typed-config-title: "<yellow>%type <white>Config" typed-config-title: "<yellow>%type <white>Config"
click-to-change: "<gray>Click Here to change the value"
green-get-item: "<green>%name"
yellow-get-item: "<yellow>%name"
confirm-action: config-ui.global-item:
item-lore-prefix: "<gray>value: %value"
item-lore-prefix-alone: "%value"
config-ui.confirm-action:
fail: "<red>Action could not be completed." fail: "<red>Action could not be completed."
is-user-sure: "<yellow>Are you sure ?" is-user-sure: "<yellow>Are you sure ?"
select-item-type: config-ui.select-item-type:
place-here: "<yellow>Place an item here" place-here: "<yellow>Place an item here"
element-list: config-ui.element-list:
instruction-new: instruction-new:
1: "<yellow>Write the %type name you want to create in the chat." 1: "<yellow>Write the %type name you want to create in the chat."
2: "<yellow>Or write <red>cancel <yellow>to go back to %type config menu" 2: "<yellow>Or write <red>cancel <yellow>to go back to %type config menu"
cancelled-new: "%type creation cancelled..." cancelled-new: "%type creation cancelled..."
duplicated-new: "<red>Please enter a %type name that do not already exist..." duplicated-new: "<red>Please enter a %type name that do not already exist..."
unit-repair: config-ui.unit-repair:
title: "Unit Repair Config <reset>(%page/%max_page)" title: "Unit Repair Config <reset>(%page/%max_page)"
item: "<gray>\\%<green>%name <yellow>repaired by <green>%unit"
new: new:
title: "Select unit repair item." title: "Select unit repair item."
description: description:
@ -133,6 +139,11 @@ config-ui:
2: "<gray>You like to be an unit repair item" 2: "<gray>You like to be an unit repair item"
element: element:
title: "<yellow>%type <red>Unit repair <reset>(%page/%max_page)" title: "<yellow>%type <red>Unit repair <reset>(%page/%max_page)"
value:
title: "<black>\\%<dark_gray>%name Repair"
description:
1: "<gray>Click here to change how many <yellow>\\% <gray>of <green>%name"
2: "<gray>Should get repaired by <yellow>%unit"
new: new:
title: "Select item to be repaired." title: "Select item to be repaired."
description: description:
@ -141,23 +152,71 @@ config-ui:
cannot-damage: "<red>This item can't be damaged, so it can't be repaired." cannot-damage: "<red>This item can't be damaged, so it can't be repaired."
same-type: "<red>Item can't repair something of the same type." same-type: "<red>Item can't repair something of the same type."
custom-recipe: config-ui.custom-recipe:
title: "Custom Recipe Config <reset>(%page/%max_page)" title: "Custom Recipe Config <reset>(%page/%max_page)"
element: element:
exact-count: "<dark_gray>Exact count ?"
linear-xp:
title: "<dark_gray>Remove exact linear xp ?"
name: "<red>Remove exact linear xp ?"
lore: "<gray>Not usable if linear cost is 0"
recipe-cost:
level: "<dark_gray>recipe Level Cost"
xp: "<dark_gray>Recipe Linear Xp Cost"
item:
left:
title: "<yellow>Recipe Left <dark_gray>Item"
description:
1: "<gray>Set the left item of the custom craft"
2: "<gray>■ + □ = □"
right:
title: "<yellow>Recipe Right <dark_gray>Item"
description:
1: "<gray>Set the right item of the custom craft"
2: "<gray>□ + ■ = □"
result:
title: "<green>Recipe Result <dark_gray>Item"
description:
1: "<gray>Set the result item of the custom craft"
2: "<gray>□ + □ = ■"
delete: delete:
title: "<red>Delete <yellow>%type<red>?" title: "<red>Delete <yellow>%type<red>?"
description: "<gray>Confirm that you want to delete this recipe." description: "<gray>Confirm that you want to delete this recipe."
button:
name: "<dark_red>DELETE RECIPE"
lore: "<red>Caution with this button !"
enchant-level-cost: config-ui.enchant-level-cost:
title: "<dark_gray>Enchantment Level Limit <reset>(%page/%max_page)" title: "<dark_gray>Enchantment Level Limit <reset>(%page/%max_page)"
element:
title: "<green>%name Cost"
description:
1: "<gray>How many level should %name"
2: "<gray>cost when applied by book or by another item."
enchant-level-limit: item-cost: "<gray>Item Cost: <yellow>%cost"
book-cost: "<gray>Book Cost: <yellow>%cost"
config-ui.enchant-level-limit:
title: "<dark_gray>Enchantment Level Limit <reset>(%page/%max_page)" title: "<dark_gray>Enchantment Level Limit <reset>(%page/%max_page)"
element:
title: "<green>%name Limit"
description:
1: "<gray>Maximum applied level of %name"
enchant-merge-limit: config-ui.enchant-merge-limit:
title: "<dark_gray>Enchantment Maximum Merge Level <reset>(%page/%max_page)" title: "<dark_gray>Enchantment Maximum Merge Level <reset>(%page/%max_page)"
element:
title: "<green>%name Merge Limit"
description:
1: "<gray>Maximum merge level for for %name"
2: ""
3: "<gray>For example, if set to <yellow>2<gray>, <green>lvl1 <gray>+ <green>lvl1 <gray>of will give a <green>lvl2"
4: "<gray>But <green>lvl2 <gray>+ <green>lvl2 <gray>will not give a <red>lv3<gray>."
5: "<gray>Will still not merge above max enchantment level"
6: "<yellow>-1 <gray>(default) will set the merge limit to enchantment's maximum level"
enchant-conflict: config-ui.enchant-conflict:
title: "Conflict Config <reset>(%page/%max_page)" title: "Conflict Config <reset>(%page/%max_page)"
element: element:
selected-enchantments: "<yellow>%group<dark_purple>" # likely need page and max page selected-enchantments: "<yellow>%group<dark_purple>" # likely need page and max page
@ -165,8 +224,17 @@ config-ui:
delete: delete:
title: "<red>Delete <yellow>%type<red>?" title: "<red>Delete <yellow>%type<red>?"
description: "<gray>Confirm that you want to delete this conflict." description: "<gray>Confirm that you want to delete this conflict."
button:
name: "<dark_red>DELETE CONFLICT"
lore: "<red>Caution with this button !"
min-before-count:
item: "<green>Minimum Enchantment Count"
title: "<dark_gray>Minimum enchantment count"
description:
1: "<gray>Minimum enchantment count set to X mean only X enchantment can be put"
2: "<gray>on an item before the conflict is active."
material-group: config-ui.material-group:
title: "Group Config <reset>(%page/%max_page)" title: "Group Config <reset>(%page/%max_page)"
element: element:
selected-materials: "<yellow>%group <red>Materials" selected-materials: "<yellow>%group <red>Materials"
@ -178,8 +246,134 @@ config-ui:
name: "<dark_red>DELETE GROUP" name: "<dark_red>DELETE GROUP"
lore: "<red>Caution with this button !" lore: "<red>Caution with this button !"
material-select: config-ui.material-select:
new: new:
confirm: confirm:
title: "Remove %name" title: "Remove %name"
description: "<dark_gray>Confirm Remove %name from this list." description: "<dark_gray>Confirm Remove %name from this list."
config-ui.basic-config:
title: "<dark_gray>Basic Config"
config-ui.basic-config.cap-anvil-cost:
item: "<yellow>Cap Anvil Cost"
title: "<dark_gray>Cap Anvil Cost ?"
description:
1: "<gray>All anvil cost will be capped to <green>Max Anvil Cost<gray> if enabled."
2: "<gray>In other words:"
3: "<gray>For any anvil cost greater than <green>Max Anvil Cost<gray>, Cost will be set to <green>Max Anvil Cost<gray>."
disabled:
title: "<red>Cap Anvil Cost ?"
description: "<gray>This config only work if <red>Limit Repair Cost<gray> is disabled."
config-ui.basic-config.max-anvil-cost:
item: "<green>Max Anvil Cost"
title: "<dark_gray>Max Anvil Cost"
description:
1: "<gray>Max cost the Anvil can get to."
2: "<gray>Valid values include <yellow>0 <gray>to <yellow>1000<gray>."
3: "<gray>Cost will be displayed as <red>Too Expensive<gray>:"
4: "<gray>- If Cost is above <yellow>39"
5: "<gray>- And <yellow>Replace Too Expensive<gray> is disabled"
disabled:
title: "<red>Max Anvil Cost"
description: "<gray>This config only work if <red>Limit Repair Cost<gray> is disabled."
config-ui.basic-config.remove-cost-limit:
item: "<yellow>Remove Anvil Cost Limit"
title: "<dark_gray>Remove Anvil Cost Limit ?"
description:
1: "<gray>Whether the anvil's cost limit should be removed entirely."
2: "<gray>The anvil will still visually display <red>Too Expensive<gray> if <yellow>Replace Too Expensive<gray> is disabled."
3: "<gray>However, the action will be completable if xp requirement is meet."
config-ui.basic-config.remove-too-expensive:
title: "<dark_gray>Replace Too Expensive ?"
description:
1: "<gray>Whenever anvil cost is above <yellow>39<gray> should display the true price and not <red>Too Expensive<gray>."
2: "<gray>However, when bypassing <red>Too Expensive<gray>, anvil price will be displayed as <green>Green<gray>."
3: "<gray>Even if cost is displayed as <green>Green<gray>:"
4: "<gray>If the player do not have the required xp level, the action will not be completable."
description-no-nms:
1: ""
2: "<dark_red>/!\\<red>Caution<dark_red>/!\\ <red>You need ProtocoLib installed and working, or a paper server."
3: "<red>Currently ProtocoLib is not detected."
config-ui.basic-config.item-repair-cost:
title: "<dark_gray>Item Repair Cost"
description:
1: "<gray>XP Level amount added to the anvil when the item"
2: "<gray>is repaired by another item of the same type."
config-ui.basic-config.item-rename-cost:
title: "<dark_gray>Rename Cost"
description:
1: "<gray>XP Level amount added to the anvil when the item is renamed."
config-ui.basic-config.unit-repair-cost:
title: "<dark_gray>Unit Repair Cost"
description:
1: "<gray>XP Level amount added to the anvil when the item is repaired by an <yello<>unit<gray>."
2: "<gray>For example: a Diamond on a Diamond Sword."
3: "<gray>What's considered unit for what can be edited on the unit repair configuration."
config-ui.basic-config.sacrifice-illegal-cost:
title: "<dark_gray>Sacrifice Illegal Enchant Cost"
description:
1: "<gray>XP Level amount added to the anvil when a sacrifice enchantment"
2: "<gray>conflict With one of the left item enchantment"
config-ui.basic-config.color-code:
title: "<dark_gray>Allow Use Of Color Code ?"
description:
1: "<gray>Whether players can use color code."
2: "<gray>Color code a formatted like <green>&a<gray> and is used in the rename field of the anvil."
3: "<gray>Player may need permission to use color code if <yellow>Player need permission to use color<gray> is enabled."
config-ui.basic-config.color-hex:
title: "<dark_gray>Allow Use Of Hexadecimal Color ?"
description:
1: "<gray>Whether players can use hexadecimal color."
2: "<gray>Color code a formatted like <gray>#012345 <gray>and is used in the rename field of the anvil."
3: "<gray>Player may need permission to use color code if <yellow>Permission Needed For Color<gray> is enabled."
config-ui.basic-config.color-permission:
title: "<dark_gray>Need Permission To Use Color ?"
description:
1: "<gray>Whether players should have permission to be able to use colors."
2: "<gray>Give player <yellow>ca.color.code <gray>Permission to allow use of color code."
3: "<gray>Give player <yellow>ca.color.hex <gray>Permission to allow use of hexadecimal color."
disabled:
title: "<red>Need Permission To Use Color ?"
description:
1: "<gray>This config can do something only if one of the following config is enabled:"
2: "<gray>- <green>Allow Use Of Color Code"
3: "<gray>- <green>Allow Use Of Hexadecimal Color"
config-ui.basic-config.color-cost:
item: "<green>Cost Of Using Color"
title: "<dark_gray>Cost Of Using Color"
description:
1: "<gray>XP level cost when using color code or hexadecimal color using the anvil."
2: "<gray>conflict With one of the left item enchantment"
disabled:
title: "<red>Cost Of Using Color"
description:
1: "<gray>This config can do something only if one of the following config is enabled:"
2: "<gray>- <green>Allow Use Of Color Code"
3: "<gray>- <green>Allow Use Of Hexadecimal Color"
config-ui.basic-config.work-penalty:
title: "<dark_gray>Work Penalty Type"
item: "<green>Work Penalty Type"
lore:
1: "<gray>Work penalty increase the price for every anvil use."
2: "<gray>This config allow you to choose the comportment of work penalty."
lore-break:
1: ""
2: "<gray>About shared/exclusive penalty:"
explanation:
increasing: "<yellow>Increasing<gray>: will penalty be increased (in item)"
additive: "<yellow>Additive<gray>: will penalty be added to the cost"
shared: "<yellow>Shared<gray>: Vanilla, shared penalty. it will be kept from before the plugin installation."
exclusive: "<yellow>Exclusive<gray>: Custom, per anvil use type penalty. it will be lost after plugin uninstallation"