diff --git a/src/main/java/xyz/alexcrea/cuanvil/api/UnitRepairApi.java b/src/main/java/xyz/alexcrea/cuanvil/api/UnitRepairApi.java index bc50c162..f5df41bc 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/api/UnitRepairApi.java +++ b/src/main/java/xyz/alexcrea/cuanvil/api/UnitRepairApi.java @@ -3,18 +3,16 @@ package xyz.alexcrea.cuanvil.api; import io.delilaheve.CustomAnvil; import kotlin.Triple; import org.bukkit.Material; +import org.bukkit.NamespacedKey; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; import org.jetbrains.annotations.NotNull; import xyz.alexcrea.cuanvil.config.ConfigHolder; import xyz.alexcrea.cuanvil.dependency.DependencyManager; import xyz.alexcrea.cuanvil.gui.config.global.UnitRepairConfigGui; -import xyz.alexcrea.cuanvil.gui.config.list.MappedGuiListConfigGui; import xyz.alexcrea.cuanvil.gui.config.list.UnitRepairElementListGui; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import java.util.*; /** * Custom Anvil api for unit repair. @@ -22,7 +20,8 @@ import java.util.List; @SuppressWarnings("unused") public class UnitRepairApi { - private UnitRepairApi(){} + private UnitRepairApi() { + } private static Object saveChangeTask = null; @@ -35,7 +34,20 @@ public class UnitRepairApi { * @param repairable The item to be repaired. * @return true if successful. */ - public static boolean addUnitRepair(@NotNull Material unit, @NotNull Material repairable){ + public static boolean addUnitRepair(@NotNull Material unit, @NotNull Material repairable) { + return addUnitRepair(unit, repairable, 0.25, false); + } + + /** + * Write and add a custom anvil unit repair recipe. + * Will not write the recipe if it already exists or was deleted. + * Set the value to minecraft default value (0.25 = 25%) + * + * @param unit The unit material used to repair the bellow item. + * @param repairable The item to be repaired. + * @return true if successful. + */ + public static boolean addUnitRepair(@NotNull NamespacedKey unit, @NotNull NamespacedKey repairable) { return addUnitRepair(unit, repairable, 0.25, false); } @@ -48,7 +60,7 @@ public class UnitRepairApi { * @param value The amount to be repaired by every unit. (1% = 0.01) * @return true if successful. */ - public static boolean addUnitRepair(@NotNull Material unit, @NotNull Material repairable, double value){ + public static boolean addUnitRepair(@NotNull Material unit, @NotNull Material repairable, double value) { return addUnitRepair(unit, repairable, value, false); } @@ -62,12 +74,26 @@ public class UnitRepairApi { * @param overrideDeleted If we should write even if the recipe was previously deleted. * @return true if successful. */ - public static boolean addUnitRepair(@NotNull Material unit, @NotNull Material repairable, double value, boolean overrideDeleted){ - FileConfiguration config = ConfigHolder.UNIT_REPAIR_HOLDER.getConfig(); - String path = unit.name().toLowerCase() + "." + repairable.name().toLowerCase(); + public static boolean addUnitRepair(@NotNull Material unit, @NotNull Material repairable, double value, boolean overrideDeleted) { + return addUnitRepair(unit.getKey(), repairable.getKey(), value, overrideDeleted); + } - if(!overrideDeleted && ConfigHolder.UNIT_REPAIR_HOLDER.isDeleted(path)) return false; - if(config.contains(path)) return false; + /** + * Write and add a custom anvil unit repair recipe. + * Will not write the recipe if it already exists. + * + * @param unit The unit material used to repair the bellow item. + * @param repairable The item to be repaired. + * @param value The amount to be repaired by every unit. (1% = 0.01) + * @param overrideDeleted If we should write even if the recipe was previously deleted. + * @return true if successful. + */ + public static boolean addUnitRepair(@NotNull NamespacedKey unit, @NotNull NamespacedKey repairable, double value, boolean overrideDeleted) { + FileConfiguration config = ConfigHolder.UNIT_REPAIR_HOLDER.getConfig(); + String path = unit.toString().toLowerCase() + "." + repairable.toString().toLowerCase(); + + if (!overrideDeleted && ConfigHolder.UNIT_REPAIR_HOLDER.isDeleted(path)) return false; + if (config.contains(path)) return false; // Set unit repair return setUnitRepair(unit, repairable, value); @@ -82,11 +108,24 @@ public class UnitRepairApi { * @param value The amount to be repaired by every unit. (1% = 0.01) * @return true if successful. */ - public static boolean setUnitRepair(@NotNull Material unit, @NotNull Material repairable, double value){ + public static boolean setUnitRepair(@NotNull Material unit, @NotNull Material repairable, double value) { + return setUnitRepair(unit.getKey(), repairable.getKey(), value); + } + + /** + * Write and add a custom anvil unit repair recipe. + * Do not check if it previously existed or exist. + * + * @param unit The unit material used to repair the bellow item. + * @param repairable The item to be repaired. + * @param value The amount to be repaired by every unit. (1% = 0.01) + * @return true if successful. + */ + public static boolean setUnitRepair(@NotNull NamespacedKey unit, @NotNull NamespacedKey repairable, double value) { FileConfiguration config = ConfigHolder.UNIT_REPAIR_HOLDER.getConfig(); - String repairableName = repairable.name().toLowerCase(); - String path = unit.name().toLowerCase() + "." + repairableName; + String repairableName = repairable.toString().toLowerCase(); + String path = unit.toString().toLowerCase() + "." + repairableName; // Add to config then prepare save config.set(path, value); @@ -94,10 +133,10 @@ public class UnitRepairApi { // Add to gui UnitRepairConfigGui repairConfigGui = UnitRepairConfigGui.getCurrentInstance(); - if(repairConfigGui != null) { + if (repairConfigGui != null) { UnitRepairElementListGui elementGui = repairConfigGui.getInstanceOrCreate(unit).getStored(); - if(elementGui != null) elementGui.updateValueForGeneric(repairableName, true); + if (elementGui != null) elementGui.updateValueForGeneric(repairable, true); repairConfigGui.updateValueForGeneric(unit, true); } @@ -111,48 +150,56 @@ public class UnitRepairApi { * @param repairable The item used to be repaired. * @return true if successful. */ - public static boolean removeUnitRepair(@NotNull Material unit, @NotNull Material repairable){ + public static boolean removeUnitRepair(@NotNull Material unit, @NotNull Material repairable) { + return removeUnitRepair(unit.getKey(), repairable.getKey()); + } + + /** + * Remove a custom anvil unit repair recipe. + * + * @param unit The unit material used to repair the bellow item. + * @param repairable The item used to be repaired. + * @return true if successful. + */ + public static boolean removeUnitRepair(@NotNull NamespacedKey unit, @NotNull NamespacedKey repairable) { // Delete every possible variation and save to file - String unitName = unit.name(); - String repairableName = repairable.name(); FileConfiguration config = ConfigHolder.UNIT_REPAIR_HOLDER.getConfig(); - config.set(unitName.toLowerCase() + "." + repairableName.toUpperCase(), null); - config.set(unitName.toUpperCase() + "." + repairableName.toLowerCase(), null); - config.set(unitName.toUpperCase() + "." + repairableName.toUpperCase(), null); - config.set(unitName.toLowerCase() + "." + repairableName.toLowerCase(), null); + config.set(unit.getKey() + "." + repairable.getKey(), null); + config.set(unit.getKey() + "." + repairable, null); + config.set(unit + "." + repairable.getKey(), null); + config.set(unit + "." + repairable, null); // Test if it was the last value of this section boolean lastValue = false; - if(config.isConfigurationSection(unitName.toLowerCase())) { - ConfigurationSection section = config.getConfigurationSection(unitName.toLowerCase()); + if (config.isConfigurationSection(unit.toString())) { + ConfigurationSection section = config.getConfigurationSection(unit.toString()); - if(section != null && section.getKeys(false).isEmpty()) { + if (section != null && section.getKeys(false).isEmpty()) { lastValue = true; - config.set(unitName.toLowerCase(), null); + config.set(unit.toString(), null); } - } else if (config.isConfigurationSection(unitName.toUpperCase())) { - ConfigurationSection section = config.getConfigurationSection(unitName.toUpperCase()); - if(section != null && section.getKeys(false).isEmpty()) { + } else if (config.isConfigurationSection(unit.getKey())) { + ConfigurationSection section = config.getConfigurationSection(unit.getKey()); + if (section != null && section.getKeys(false).isEmpty()) { lastValue = true; - config.set(unitName.toUpperCase(), null); + config.set(unit.getKey(), null); } } else lastValue = true; - // We only need to "delete" as the lower case to be counted as deleted - ConfigHolder.UNIT_REPAIR_HOLDER.delete(unitName.toLowerCase() + "." + repairableName.toLowerCase()); + ConfigHolder.UNIT_REPAIR_HOLDER.delete(unit.toString().toLowerCase() + "." + repairable.toString().toLowerCase()); prepareSaveTask(); // Remove from gui UnitRepairConfigGui repairConfigGui = UnitRepairConfigGui.getCurrentInstance(); - if(repairConfigGui != null) { + if (repairConfigGui != null) { UnitRepairElementListGui elementGui = repairConfigGui.getInstanceOrCreate(unit).getStored(); - if(elementGui != null) elementGui.removeGeneric(repairableName); - if(lastValue){ + if (elementGui != null) elementGui.removeGeneric(repairable); + if (lastValue) { repairConfigGui.removeGeneric(unit); } } @@ -164,9 +211,9 @@ public class UnitRepairApi { * Prepare a task to save custom unit repair recipe configuration. */ private static void prepareSaveTask() { - if(saveChangeTask != null) return; + if (saveChangeTask != null) return; - saveChangeTask = DependencyManager.scheduler.scheduleGlobally(CustomAnvil.instance, ()->{ + saveChangeTask = DependencyManager.scheduler.scheduleGlobally(CustomAnvil.instance, () -> { ConfigHolder.UNIT_REPAIR_HOLDER.saveToDisk(true); saveChangeTask = null; }); @@ -174,6 +221,7 @@ public class UnitRepairApi { /** * Get every unit repair recipes. + * * @return An immutable collection of unit repair recipes. *

* Each element of the provided triple represent a part of the recipe @@ -182,29 +230,32 @@ public class UnitRepairApi { *

  • Second object is the item to be repaired. *
  • Last object is the amount to be repaired by every unit. (1% = 0.01) * + * @deprecated some may be missing. use {@link #getModernUnitRepairs()} + * */ + @Deprecated @NotNull - public static List> getUnitRepairs(){ + public static List> getUnitRepairs() { List> mutableList = new ArrayList<>(); FileConfiguration config = ConfigHolder.UNIT_REPAIR_HOLDER.getConfig(); for (String unitKey : config.getKeys(false)) { // Test if config section exist - if(!config.isConfigurationSection(unitKey)) continue; + if (!config.isConfigurationSection(unitKey)) continue; // Test if unit is a material Material unit = Material.getMaterial(unitKey.toUpperCase()); - if(unit == null) continue; + if (unit == null) continue; // Iterate over reparable items ConfigurationSection section = config.getConfigurationSection(unitKey); for (String repairableKey : section.getKeys(false)) { // Test if value section exist - if(!section.isDouble(repairableKey)) continue; + if (!section.isDouble(repairableKey)) continue; // Test if repairable is valid a material Material repairable = Material.getMaterial(repairableKey.toUpperCase()); - if(repairable == null) continue; + if (repairable == null) continue; // Add the values mutableList.add(new Triple<>(unit, repairable, section.getDouble(repairableKey))); @@ -215,4 +266,53 @@ public class UnitRepairApi { return Collections.unmodifiableList(mutableList); } + /** + * Get every unit repair recipes. + * + * @return An immutable collection of unit repair recipes. + *

    + *

  • First map contain a key the unit material used to repair the bellow item and value the second map + *
  • Second map contain as key the item to be repaired and as value the amount to be repaired by every unit. (1% = 0.01) + * + */ + @NotNull + public static Map> getModernUnitRepairs() { + Map> mutableList = new HashMap<>(); + + FileConfiguration config = ConfigHolder.UNIT_REPAIR_HOLDER.getConfig(); + for (String unitKey : config.getKeys(false)) { + // Test if config section exist + if (!config.isConfigurationSection(unitKey)) continue; + + // Test if unit is a material + NamespacedKey unit = NamespacedKey.fromString(unitKey.toLowerCase()); + if (unit == null) continue; + + Map map; + if (!mutableList.containsKey(unit)) { + map = new HashMap<>(); + mutableList.put(unit, map); + } else { + map = mutableList.get(unit); + } + + // Iterate over reparable items + ConfigurationSection section = config.getConfigurationSection(unitKey); + for (String repairableKey : section.getKeys(false)) { + // Test if value section exist + if (!section.isDouble(repairableKey)) continue; + + // Test if repairable is valid a material + NamespacedKey repairable = NamespacedKey.fromString(repairableKey.toLowerCase()); + if (repairable == null) continue; + + // Add the values + map.put(repairable, section.getDouble(repairableKey)); + + } + } + + return mutableList; + } + } diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/GroupConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/GroupConfigGui.java index fa53174c..7f85278e 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/GroupConfigGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/GroupConfigGui.java @@ -1,6 +1,7 @@ package xyz.alexcrea.cuanvil.gui.config.global; import com.github.stefvanschie.inventoryframework.gui.GuiItem; +import com.github.stefvanschie.inventoryframework.gui.type.util.Gui; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; @@ -43,6 +44,10 @@ public class GroupConfigGui extends MappedGuiListConfigGui @@ -103,4 +105,29 @@ public class ItemConfigGui extends ChestGui { return enchantConflictGui; } + + private GroupConfigGui getGroupConfigGui(NamespacedKey material) { + if (groupConfigGui == null) { + groupConfigGui = new GroupConfigGui(this); + groupConfigGui.setFilter(group -> + group.contain(material) + ); + groupConfigGui.init(); + } + + return groupConfigGui; + } + + /*private UnitRepairConfigGui getUnitRepairConfigGui(NamespacedKey material) { + if (unitRepairConfigGui == null) { + unitRepairConfigGui = new UnitRepairConfigGui(this); + unitRepairConfigGui.setFilter(otherMat -> + group.contain(material) //TODO check material & what inside + ); + unitRepairConfigGui.init(); + } + + return unitRepairConfigGui; + }*/ + } diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/UnitRepairConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/UnitRepairConfigGui.java index c3e8bcb0..cc4a981f 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/UnitRepairConfigGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/UnitRepairConfigGui.java @@ -1,9 +1,10 @@ package xyz.alexcrea.cuanvil.gui.config.global; import com.github.stefvanschie.inventoryframework.gui.GuiItem; +import com.github.stefvanschie.inventoryframework.gui.type.util.Gui; import io.delilaheve.CustomAnvil; import org.bukkit.Material; -import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.NamespacedKey; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.jetbrains.annotations.NotNull; @@ -13,24 +14,25 @@ import xyz.alexcrea.cuanvil.gui.config.ask.SelectItemTypeGui; import xyz.alexcrea.cuanvil.gui.config.list.MappedGuiListConfigGui; import xyz.alexcrea.cuanvil.gui.config.list.UnitRepairElementListGui; import xyz.alexcrea.cuanvil.util.CasedStringUtil; +import xyz.alexcrea.cuanvil.util.MaterialUtil; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.HashSet; public class UnitRepairConfigGui extends - MappedGuiListConfigGui> { + MappedGuiListConfigGui> { private static UnitRepairConfigGui INSTANCE; @Nullable - public static UnitRepairConfigGui getCurrentInstance(){ + public static UnitRepairConfigGui getCurrentInstance() { return INSTANCE; } @NotNull - public static UnitRepairConfigGui getInstance(){ - if(INSTANCE == null) INSTANCE = new UnitRepairConfigGui(); + public static UnitRepairConfigGui getInstance() { + if (INSTANCE == null) INSTANCE = new UnitRepairConfigGui(); return INSTANCE; } @@ -41,8 +43,12 @@ public class UnitRepairConfigGui extends init(); } + public UnitRepairConfigGui(Gui parent) { + super("Unit Repair Config", parent); + } + @Override - protected LazyElement newInstanceOfGui(Material material, GuiItem item) { + protected LazyElement newInstanceOfGui(NamespacedKey material, GuiItem item) { return new LazyElement<>(item, () -> { UnitRepairElementListGui element = new UnitRepairElementListGui(material, this); element.init(); @@ -51,23 +57,34 @@ public class UnitRepairConfigGui extends } @Override - protected ItemStack createItemForGeneric(Material material) { - ConfigurationSection materialSection = ConfigHolder.UNIT_REPAIR_HOLDER.getConfig().getConfigurationSection(material.name().toLowerCase()); - String materialName = CasedStringUtil.snakeToUpperSpacedCase(material.name().toLowerCase()); + protected ItemStack createItemForGeneric(@NotNull NamespacedKey material) { + var unitConfig = ConfigHolder.UNIT_REPAIR_HOLDER.getConfig(); + var section = unitConfig.getConfigurationSection(material.toString().toLowerCase()); + var legacySection = unitConfig.getConfigurationSection(material.toString().toLowerCase()); - if(material.isAir()){ - material = Material.BARRIER; + String materialName = CasedStringUtil.snakeToUpperSpacedCase(material.getKey().toLowerCase()); + + var display = MaterialUtil.INSTANCE.getMatFromKey(material); + + if (display == null || display.isAir()) { + display = Material.BARRIER; } - int reparableItemCount = materialSection == null ? 0 : materialSection.getKeys(false).size(); // Probably an expensive call but... why not + var reparable = new HashSet(); + if (section != null) + reparable.addAll(section.getKeys(false)); + if (legacySection != null) + reparable.addAll(legacySection.getKeys(false)); - ItemStack item = new ItemStack(material); + var reparableItemCount = reparable.size(); + + ItemStack item = new ItemStack(display); ItemMeta meta = item.getItemMeta(); assert meta != null; - meta.setDisplayName("§eRepaired by " +materialName); + meta.setDisplayName("§eRepaired by " + materialName); meta.setLore(Arrays.asList( - "§7There is currently §e" +reparableItemCount+ " §7reparable item with "+materialName, + "§7There is currently §e" + reparableItemCount + " §7reparable item with " + materialName, "§7Click here to open the menu to edit reparable item by " + materialName )); @@ -77,13 +94,16 @@ public class UnitRepairConfigGui extends } @Override - protected Collection getEveryInstanceOfGeneric() { - ArrayList materials = new ArrayList<>(); + protected Collection getEveryInstanceOfGeneric() { + var materials = new HashSet(); + var config = ConfigHolder.UNIT_REPAIR_HOLDER.getConfig(); - for (String matName : ConfigHolder.UNIT_REPAIR_HOLDER.getConfig().getKeys(false)) { - Material mat = Material.getMaterial(matName.toUpperCase()); - if(mat != null){ - materials.add(mat); + for (String matName : config.getKeys(false)) { + if(!config.isConfigurationSection(matName)) continue; + + NamespacedKey material = NamespacedKey.fromString(matName.toLowerCase()); + if (material != null) { + materials.add(material); } } return materials; @@ -113,7 +133,7 @@ public class UnitRepairConfigGui extends "§7You like to be an unit repair item", this, (itemStack, player) -> { - Material type = itemStack.getType(); + NamespacedKey type = MaterialUtil.INSTANCE.getCustomType(itemStack); // Add new material updateValueForGeneric(type, true); @@ -126,9 +146,9 @@ public class UnitRepairConfigGui extends } @NotNull - public LazyElement getInstanceOrCreate(Material mat){ + public LazyElement getInstanceOrCreate(NamespacedKey mat) { LazyElement element = this.elementGuiMap.get(mat); - if(element == null){ + if (element == null) { updateValueForGeneric(mat, false); element = this.elementGuiMap.get(mat); @@ -141,8 +161,10 @@ public class UnitRepairConfigGui extends protected String genericDisplayedName() { return "this function Should not be used."; } + @Override // Not used in this implementation. - protected Material createAndSaveNewEmptyGeneric(String name) { + protected NamespacedKey createAndSaveNewEmptyGeneric(String name) { return null; } + } diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/UnitRepairElementListGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/UnitRepairElementListGui.java index c9f2ada2..9b879fdc 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/UnitRepairElementListGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/UnitRepairElementListGui.java @@ -3,12 +3,14 @@ package xyz.alexcrea.cuanvil.gui.config.list; import com.github.stefvanschie.inventoryframework.gui.GuiItem; import com.github.stefvanschie.inventoryframework.gui.type.util.Gui; import org.bukkit.Material; +import org.bukkit.NamespacedKey; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.HumanEntity; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.meta.Damageable; import org.bukkit.inventory.meta.ItemMeta; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import xyz.alexcrea.cuanvil.config.ConfigHolder; import xyz.alexcrea.cuanvil.gui.config.ask.SelectItemTypeGui; import xyz.alexcrea.cuanvil.gui.config.global.UnitRepairConfigGui; @@ -17,26 +19,25 @@ import xyz.alexcrea.cuanvil.gui.config.settings.DoubleSettingGui; import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems; import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant; import xyz.alexcrea.cuanvil.util.CasedStringUtil; +import xyz.alexcrea.cuanvil.util.MaterialUtil; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; +import java.util.*; import java.util.function.Consumer; -public class UnitRepairElementListGui extends SettingGuiListConfigGui implements ElementMappedToListGui { +public class UnitRepairElementListGui extends SettingGuiListConfigGui implements ElementMappedToListGui { - private final Material parentMaterial; + private final NamespacedKey parentMaterial; private final UnitRepairConfigGui parentGui; private final String materialName; private boolean shouldWork = true; - public UnitRepairElementListGui(@NotNull Material parentMaterial, + + public UnitRepairElementListGui(@NotNull NamespacedKey parentMaterial, @NotNull UnitRepairConfigGui parentGui) { - super("§e" + CasedStringUtil.snakeToUpperSpacedCase(parentMaterial.name().toLowerCase()) + " §rUnit repair"); + super("§e" + CasedStringUtil.snakeToUpperSpacedCase(parentMaterial.getKey().toLowerCase()) + " §rUnit repair"); this.parentMaterial = parentMaterial; this.parentGui = parentGui; - this.materialName = CasedStringUtil.snakeToUpperSpacedCase(parentMaterial.name().toLowerCase()); + this.materialName = CasedStringUtil.snakeToUpperSpacedCase(parentMaterial.getKey().toLowerCase()); GuiGlobalItems.addBackItem(this.backgroundPane, parentGui); } @@ -54,7 +55,7 @@ public class UnitRepairElementListGui extends SettingGuiListConfigGui getCreateClickConsumer() { return event -> { event.setCancelled(true); - if(!this.shouldWork){ + if (!this.shouldWork) { return; } event.setCancelled(true); @@ -66,28 +67,28 @@ public class UnitRepairElementListGui extends SettingGuiListConfigGui { ItemMeta meta = itemStack.getItemMeta(); - Material type = itemStack.getType(); + NamespacedKey type = MaterialUtil.INSTANCE.getCustomType(itemStack); - if(!(meta instanceof Damageable) || (type.getMaxDurability() <= 0)) { + if (!(meta instanceof Damageable)) { player.sendMessage("§cThis item can't be damaged, so it can't be repaired."); return; } - if(type == this.parentMaterial){ + if (type.equals(this.parentMaterial)) { player.sendMessage("§cItem can't repair something of the same type."); return; } - String materialName = type.name().toLowerCase(); + String materialName = type.toString(); // Add new material - ConfigHolder.UNIT_REPAIR_HOLDER.getConfig().set(parentMaterial.name().toLowerCase() + "." + materialName,0.25); + ConfigHolder.UNIT_REPAIR_HOLDER.getConfig().set(parentMaterial.toString().toLowerCase() + "." + materialName, 0.25); if (GuiSharedConstant.TEMPORARY_DO_SAVE_TO_DISK_EVERY_CHANGE) { ConfigHolder.UNIT_REPAIR_HOLDER.saveToDisk(GuiSharedConstant.TEMPORARY_DO_BACKUP_EVERY_SAVE); } // Update gui - updateValueForGeneric(materialName, true); + updateValueForGeneric(type, true); this.parentGui.updateValueForGeneric(this.parentMaterial, true); @@ -106,17 +107,17 @@ public class UnitRepairElementListGui extends SettingGuiListConfigGui getEveryInstanceOfGeneric() { - ArrayList keys = new ArrayList<>(); - if(!this.shouldWork){ + protected Collection getEveryInstanceOfGeneric() { + Set keys = new HashSet<>(); + if (!this.shouldWork) { return keys; } - ConfigurationSection materialSection = ConfigHolder.UNIT_REPAIR_HOLDER.getConfig().getConfigurationSection(parentMaterial.name().toLowerCase()); - if(materialSection == null){ - return keys; - } - keys.addAll(materialSection.getKeys(false)); + ConfigurationSection legacySection = ConfigHolder.UNIT_REPAIR_HOLDER.getConfig().getConfigurationSection(parentMaterial.getKey().toLowerCase()); + ConfigurationSection materialSection = ConfigHolder.UNIT_REPAIR_HOLDER.getConfig().getConfigurationSection(parentMaterial.toString().toLowerCase()); + + addAllKeys(legacySection, keys); + addAllKeys(materialSection, keys); + return keys; } - private Material materialFromName(String materialName){ - Material mat = Material.getMaterial(materialName.toUpperCase()); - if(mat == null || mat.isAir()) return Material.BARRIER; + private void addAllKeys(@Nullable ConfigurationSection section, @NotNull Set keys) { + if (section == null) return; + for (var key : section.getKeys(false)) { + var material = NamespacedKey.fromString(key); + if (material == null) continue; + + keys.add(material); + } + } + + private Material materialFromName(NamespacedKey material) { + Material mat = MaterialUtil.INSTANCE.getMatFromKey(material); + if (mat == null || mat.isAir()) return Material.BARRIER; return mat; } @@ -163,7 +175,8 @@ public class UnitRepairElementListGui extends SettingGuiListConfigGui 0) return result + + // Get default + val userDefault = config.getDouble(UNIT_REPAIR_DEFAULT_PATH, DEFAULT_DEFAULT_UNIT_REPAIR) + if (userDefault <= 0) + return DEFAULT_DEFAULT_UNIT_REPAIR + return userDefault } - /** - * Get the item % repaired by this configuration section of a unit repair. - * null if not found. - * If value is set to less than or equal to 0 then it will be set to default - */ - private fun getRepairAmount(item: ItemStack, section: ConfigurationSection, default: Double): Double? { - val itemName = item.customType.key.lowercase() - val repairValue = if (section.isDouble(itemName)) { - section.getDouble(itemName) - } else if (section.isDouble(itemName.uppercase())) { - section.getDouble(itemName.uppercase()) - } else { - return null - } - if (repairValue <= 0) - return default - return repairValue + private fun findRepairValue( + self: ItemStack, + other: ItemStack, + config: FileConfiguration + ): Double? { + val material = other.customType + val selfType = self.customType + + val result = checkSection(config, material.toString(), selfType) + if (result != null) return result + + return checkSection(config, material.key, selfType) + } + + fun checkSection( + config: FileConfiguration, + path: String, + material: NamespacedKey + ): Double? { + val section = config.getConfigurationSection(path) ?: return null + + if (section.isDouble(material.toString())) + return section.getDouble(material.toString()) + if (section.isDouble(material.key)) + return section.getDouble(material.key) + + return null } } \ No newline at end of file