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/enchant/CAEnchantment.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantment.java
index ea657ace..1d1aca46 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantment.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantment.java
@@ -9,6 +9,7 @@ import org.jetbrains.annotations.Nullable;
import xyz.alexcrea.cuanvil.enchant.bulk.BulkCleanEnchantOperation;
import xyz.alexcrea.cuanvil.enchant.bulk.BulkGetEnchantOperation;
import xyz.alexcrea.cuanvil.group.EnchantConflictGroup;
+import xyz.alexcrea.cuanvil.util.CasedStringUtil;
import java.util.Collection;
import java.util.HashMap;
@@ -45,6 +46,14 @@ public interface CAEnchantment {
@NotNull
String getName();
+ /**
+ * Get the enchantment name prettified (upper spaced case)
+ * @return Prettier enchantment name
+ */
+ default String getPrettyName() {
+ return CasedStringUtil.snakeToUpperSpacedCase(getName());
+ }
+
/**
* Get the default maximum level of this enchantment.
* @return The default maximum level of this enchantment.
diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/MainConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/MainConfigGui.java
index cc4fddc5..57cc35bc 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/MainConfigGui.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/MainConfigGui.java
@@ -2,6 +2,7 @@ package xyz.alexcrea.cuanvil.gui.config;
import com.github.stefvanschie.inventoryframework.gui.GuiItem;
import com.github.stefvanschie.inventoryframework.gui.type.ChestGui;
+import com.github.stefvanschie.inventoryframework.gui.type.util.Gui;
import com.github.stefvanschie.inventoryframework.pane.PatternPane;
import com.github.stefvanschie.inventoryframework.pane.util.Pattern;
import io.delilaheve.CustomAnvil;
@@ -39,116 +40,142 @@ public class MainConfigGui extends ChestGui {
GuiGlobalItems.addBackgroundItem(pane);
// Basic config item
- ItemStack basicConfigItemstack = new ItemStack(Material.COMMAND_BLOCK);
- ItemMeta basicConfigMeta = basicConfigItemstack.getItemMeta();
- assert basicConfigMeta != null;
-
- basicConfigMeta.setDisplayName("§aBasic Config Menu");
- basicConfigMeta.setLore(Collections.singletonList("§7Click here to open basic config menu"));
- basicConfigItemstack.setItemMeta(basicConfigMeta);
-
- GuiItem basicConfigItem = GuiGlobalItems.goToGuiItem(basicConfigItemstack, new BasicConfigGui(packetManager));
+ var basicConfigItem = basicConfigItem(new BasicConfigGui(packetManager));
pane.bindItem('1', basicConfigItem);
// enchant level limit item
- ItemStack enchantLimitItemstack = new ItemStack(Material.ENCHANTED_BOOK);
- ItemMeta enchantLimitMeta = enchantLimitItemstack.getItemMeta();
- assert enchantLimitMeta != null;
-
- enchantLimitMeta.setDisplayName("§aEnchantment Level Limit");
- enchantLimitMeta.setLore(Collections.singletonList("§7Click here to open enchantment level limit menu"));
- enchantLimitItemstack.setItemMeta(enchantLimitMeta);
-
- GuiItem enchantLimitItem = GuiGlobalItems.goToGuiItem(enchantLimitItemstack, new EnchantLimitConfigGui());
+ var enchantLimitItem = enchantLimitItem(new EnchantLimitConfigGui());
pane.bindItem('2', enchantLimitItem);
// enchant level limit item
- ItemStack enchantMergeLimitItemstack = new ItemStack(Material.ENCHANTED_BOOK);
- ItemMeta enchantMergeLimitMeta = enchantMergeLimitItemstack.getItemMeta();
- assert enchantMergeLimitMeta != null;
-
- enchantMergeLimitMeta.setDisplayName("§aEnchantment Merge Limit");
- enchantMergeLimitMeta.setLore(Collections.singletonList("§7Click here to open enchantment merge limit menu"));
- enchantMergeLimitItemstack.setItemMeta(enchantMergeLimitMeta);
-
- GuiItem enchantMergeLimitItem = GuiGlobalItems.goToGuiItem(enchantMergeLimitItemstack, new EnchantMergeLimitConfigGui());
+ var enchantMergeLimitItem = enchantMergeLimitItem(new EnchantMergeLimitConfigGui());
pane.bindItem('3', enchantMergeLimitItem);
// enchant cost item
- ItemStack enchantCostItemstack = new ItemStack(Material.EXPERIENCE_BOTTLE);
- ItemMeta enchantCostMeta = enchantCostItemstack.getItemMeta();
- assert enchantCostMeta != null;
-
- enchantCostMeta.setDisplayName("§aEnchantment Cost");
- enchantCostMeta.setLore(Collections.singletonList("§7Click here to open enchantment costs menu"));
- enchantCostItemstack.setItemMeta(enchantCostMeta);
-
- GuiItem enchantCostItem = GuiGlobalItems.goToGuiItem(enchantCostItemstack, new EnchantCostConfigGui());
+ var enchantCostItem = enchantCostItem(new EnchantCostConfigGui());
pane.bindItem('4', enchantCostItem);
// Enchantment Conflicts item
- ItemStack enchantConflictItemstack = new ItemStack(Material.OAK_FENCE);
- ItemMeta enchantConflictMeta = enchantConflictItemstack.getItemMeta();
- assert enchantConflictMeta != null;
-
- enchantConflictMeta.setDisplayName("§aEnchantment Conflict");
- enchantConflictMeta.setLore(Collections.singletonList("§7Click here to open enchantment conflict menu"));
- enchantConflictItemstack.setItemMeta(enchantConflictMeta);
-
- GuiItem enchantConflictItem = GuiGlobalItems.goToGuiItem(enchantConflictItemstack, EnchantConflictGui.getInstance());
+ var enchantConflictItem = enchantConflictItem(EnchantConflictGui.getInstance());
pane.bindItem('5', enchantConflictItem);
// Group config items
- ItemStack groupItemstack = new ItemStack(Material.CHEST);
- ItemMeta groupMeta = groupItemstack.getItemMeta();
- assert groupMeta != null;
-
- groupMeta.setDisplayName("§aItem Groups");
- groupMeta.setLore(Collections.singletonList("§7Click here to open item group menu"));
- groupItemstack.setItemMeta(groupMeta);
-
- GuiItem groupConfigItem = GuiGlobalItems.goToGuiItem(groupItemstack, GroupConfigGui.getInstance());
-
+ var groupConfigItem = groupConfigItem(GroupConfigGui.getInstance());
pane.bindItem('6', groupConfigItem);
// Unit repair item
- ItemStack unirRepairItemstack = new ItemStack(Material.DIAMOND);
- ItemMeta unitRepairMeta = unirRepairItemstack.getItemMeta();
- assert unitRepairMeta != null;
-
- unitRepairMeta.setDisplayName("§aUnit Repair");
- unitRepairMeta.setLore(Collections.singletonList("§7Click here to open anvil unit repair menu"));
- unirRepairItemstack.setItemMeta(unitRepairMeta);
-
- GuiItem unitRepairItem = GuiGlobalItems.goToGuiItem(unirRepairItemstack, UnitRepairConfigGui.getInstance());
+ var unitRepairItem = unitRepairItem(UnitRepairConfigGui.getInstance());
pane.bindItem('7', unitRepairItem);
// Custom recipe item
- ItemStack customRecipeItemstack = new ItemStack(Material.CRAFTING_TABLE);
- ItemMeta customRecipeMeta = customRecipeItemstack.getItemMeta();
- assert customRecipeMeta != null;
-
- customRecipeMeta.setDisplayName("§aCustom recipes");
- customRecipeMeta.setLore(Collections.singletonList("§7Click here to open anvil custom recipe menu"));
- customRecipeItemstack.setItemMeta(customRecipeMeta);
-
- GuiItem customRecipeItem = GuiGlobalItems.goToGuiItem(customRecipeItemstack, CustomRecipeConfigGui.getInstance());
+ var customRecipeItem = customRecipeItem(CustomRecipeConfigGui.getInstance());
pane.bindItem('8', customRecipeItem);
// quit item
- ItemStack quitItemstack = new ItemStack(Material.BARRIER);
- ItemMeta quitMeta = quitItemstack.getItemMeta();
- assert quitMeta != null;
+ pane.bindItem('Q', quitItem());
+ }
- quitMeta.setDisplayName("§cQuit");
- quitItemstack.setItemMeta(quitMeta);
+ public static GuiItem basicConfigItem(Gui target) {
+ var item = new ItemStack(Material.COMMAND_BLOCK);
+ var meta = item.getItemMeta();
+ assert meta != null;
- GuiItem quitItem = new GuiItem(quitItemstack, event -> {
+ meta.setDisplayName("§aBasic Config Menu");
+ meta.setLore(Collections.singletonList("§7Click here to open basic config menu"));
+ item.setItemMeta(meta);
+ return GuiGlobalItems.goToGuiItem(item, target);
+ }
+
+ public static GuiItem enchantLimitItem(Gui target) {
+ var item = new ItemStack(Material.ENCHANTED_BOOK);
+ var meta = item.getItemMeta();
+ assert meta != null;
+
+ meta.setDisplayName("§aEnchantment Level Limit");
+ meta.setLore(Collections.singletonList("§7Click here to open enchantment level limit menu"));
+ item.setItemMeta(meta);
+ return GuiGlobalItems.goToGuiItem(item, target);
+ }
+
+ public static GuiItem enchantMergeLimitItem(Gui target) {
+ ItemStack item = new ItemStack(Material.ENCHANTED_BOOK);
+ ItemMeta meta = item.getItemMeta();
+ assert meta != null;
+
+ meta.setDisplayName("§aEnchantment Merge Limit");
+ meta.setLore(Collections.singletonList("§7Click here to open enchantment merge limit menu"));
+ item.setItemMeta(meta);
+ return GuiGlobalItems.goToGuiItem(item, target);
+ }
+
+ public static GuiItem enchantCostItem(Gui target) {
+ ItemStack item = new ItemStack(Material.EXPERIENCE_BOTTLE);
+ ItemMeta meta = item.getItemMeta();
+ assert meta != null;
+
+ meta.setDisplayName("§aEnchantment Cost");
+ meta.setLore(Collections.singletonList("§7Click here to open enchantment costs menu"));
+ item.setItemMeta(meta);
+ return GuiGlobalItems.goToGuiItem(item, target);
+ }
+
+ public static GuiItem enchantConflictItem(Gui target) {
+ var item = new ItemStack(Material.OAK_FENCE);
+ var meta = item.getItemMeta();
+ assert meta != null;
+
+ meta.setDisplayName("§aEnchantment Conflict");
+ meta.setLore(Collections.singletonList("§7Click here to open enchantment conflict menu"));
+ item.setItemMeta(meta);
+ return GuiGlobalItems.goToGuiItem(item, target);
+ }
+
+ public static GuiItem groupConfigItem(Gui target) {
+ var item = new ItemStack(Material.CHEST);
+ var meta = item.getItemMeta();
+ assert meta != null;
+
+ meta.setDisplayName("§aItem Groups");
+ meta.setLore(Collections.singletonList("§7Click here to open item group menu"));
+ item.setItemMeta(meta);
+ return GuiGlobalItems.goToGuiItem(item, target);
+ }
+
+ public static GuiItem unitRepairItem(Gui target) {
+ var item = new ItemStack(Material.DIAMOND);
+ var meta = item.getItemMeta();
+ assert meta != null;
+
+ meta.setDisplayName("§aUnit Repair");
+ meta.setLore(Collections.singletonList("§7Click here to open anvil unit repair menu"));
+ item.setItemMeta(meta);
+
+ return GuiGlobalItems.goToGuiItem(item, target);
+ }
+
+ public static GuiItem customRecipeItem(Gui target) {
+ var item = new ItemStack(Material.CRAFTING_TABLE);
+ var meta = item.getItemMeta();
+ assert meta != null;
+
+ meta.setDisplayName("§aCustom recipes");
+ meta.setLore(Collections.singletonList("§7Click here to open anvil custom recipe menu"));
+ item.setItemMeta(meta);
+ return GuiGlobalItems.goToGuiItem(item, target);
+ }
+
+ public static GuiItem quitItem() {
+ var item = new ItemStack(Material.BARRIER);
+ var meta = item.getItemMeta();
+ assert meta != null;
+
+ meta.setDisplayName("§cQuit");
+ item.setItemMeta(meta);
+
+ return new GuiItem(item, event -> {
event.setCancelled(true);
event.getWhoClicked().closeInventory();
}, CustomAnvil.instance);
- pane.bindItem('Q', quitItem);
-
}
}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/AbstractEnchantConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/AbstractEnchantConfigGui.java
index 6bd7ea34..5583b382 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/AbstractEnchantConfigGui.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/AbstractEnchantConfigGui.java
@@ -1,11 +1,11 @@
package xyz.alexcrea.cuanvil.gui.config.global;
import com.github.stefvanschie.inventoryframework.gui.GuiItem;
+import com.github.stefvanschie.inventoryframework.gui.type.util.Gui;
import com.github.stefvanschie.inventoryframework.pane.util.Pattern;
import org.bukkit.event.inventory.InventoryClickEvent;
import xyz.alexcrea.cuanvil.enchant.CAEnchantment;
import xyz.alexcrea.cuanvil.enchant.CAEnchantmentRegistry;
-import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui;
import xyz.alexcrea.cuanvil.gui.config.list.SettingGuiListConfigGui;
import xyz.alexcrea.cuanvil.gui.config.settings.SettingGui;
import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant;
@@ -31,13 +31,17 @@ public abstract class AbstractEnchantConfigGui getEveryDisplayableInstanceOfGeneric() {
+ protected Collection getEveryInstanceOfGeneric() {
return CAEnchantmentRegistry.getInstance().getNameSortedEnchantments();
}
@@ -73,7 +77,7 @@ public abstract class AbstractEnchantConfigGui getEveryDisplayableInstanceOfGeneric() {
+ protected Collection getEveryInstanceOfGeneric() {
return ConfigHolder.CUSTOM_RECIPE_HOLDER.getRecipeManager().getRecipeList();
}
}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantConfigGui.java
new file mode 100644
index 00000000..817aa7ac
--- /dev/null
+++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantConfigGui.java
@@ -0,0 +1,196 @@
+package xyz.alexcrea.cuanvil.gui.config.global;
+
+import com.github.stefvanschie.inventoryframework.gui.GuiItem;
+import com.github.stefvanschie.inventoryframework.gui.type.ChestGui;
+import com.github.stefvanschie.inventoryframework.gui.type.util.Gui;
+import com.github.stefvanschie.inventoryframework.pane.PatternPane;
+import com.github.stefvanschie.inventoryframework.pane.util.Pattern;
+import io.delilaheve.CustomAnvil;
+import org.bukkit.Material;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.ItemMeta;
+import org.jetbrains.annotations.Contract;
+import org.jetbrains.annotations.NotNull;
+import xyz.alexcrea.cuanvil.api.EnchantmentApi;
+import xyz.alexcrea.cuanvil.config.ConfigHolder;
+import xyz.alexcrea.cuanvil.enchant.CAEnchantment;
+import xyz.alexcrea.cuanvil.group.EnchantConflictGroup;
+import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui;
+import xyz.alexcrea.cuanvil.gui.config.MainConfigGui;
+import xyz.alexcrea.cuanvil.gui.util.GuiGlobalActions;
+import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems;
+
+import java.util.HashMap;
+import java.util.Set;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+
+public class EnchantConfigGui extends ChestGui implements ValueUpdatableGui {
+
+ private final Set enchantments;
+ private final PatternPane pane;
+
+ private EnchantLimitConfigGui enchantLimitConfigGui;
+ private EnchantMergeLimitConfigGui enchantMergeLimitConfigGui;
+ private EnchantCostConfigGui enchantCostConfigGui;
+
+ private EnchantConflictGui enchantConflictGui;
+ private GroupConfigGui groupConfigGui;
+
+ public EnchantConfigGui(@NotNull Set enchantments) {
+ super(3,
+ "Configuring Enchantments",
+ CustomAnvil.instance);
+ this.enchantments = enchantments;
+
+ Pattern pattern = new Pattern(
+ "0000D0000",
+ "023405600",
+ "Q00000000"
+ );
+ pane = new PatternPane(0, 0, 9, 3, pattern);
+ addPane(pane);
+
+ GuiGlobalItems.addBackgroundItem(pane);
+
+ ItemStack displayItemstack = new ItemStack(Material.ENCHANTED_BOOK);
+ ItemMeta displayMeta = displayItemstack.getItemMeta();
+ assert displayMeta != null;
+
+ displayMeta.setDisplayName("§aConfiguring Enchantments:");
+ displayItemstack.setItemMeta(displayMeta);
+
+ // Set enchantments
+ HashMap enchantmentMap = new HashMap<>();
+ for (CAEnchantment enchantment : enchantments) {
+ enchantmentMap.put(enchantment, 1);
+ }
+ EnchantmentApi.setEnchantments(displayItemstack, enchantmentMap);
+
+ pane.bindItem('D', new GuiItem(displayItemstack, GuiGlobalActions.stayInPlace, CustomAnvil.instance));
+
+ updateGuiValues();
+
+ // Enchantment Conflicts item
+ var enchantConflictItem = MainConfigGui.enchantConflictItem(getEnchantConflictGui());
+ pane.bindItem('5', enchantConflictItem);
+
+ // Group config items
+ var groupConfigItem = MainConfigGui.groupConfigItem(getGroupConfigGui());
+ pane.bindItem('6', groupConfigItem);
+
+ // quit item
+ pane.bindItem('Q', MainConfigGui.quitItem());
+ }
+
+ private GuiItem enchantLimitConfigGui() {
+ if (enchantLimitConfigGui == null) {
+ enchantLimitConfigGui = new EnchantLimitConfigGui(this);
+ enchantLimitConfigGui.setFilter(enchantments::contains);
+ enchantLimitConfigGui.init();
+ }
+
+ // Bypass
+ if(enchantments.size() == 1) {
+ var enchant = enchantments.iterator().next();
+ var factory = EnchantLimitConfigGui.createFactory(enchant, this);
+
+ return enchantLimitConfigGui.itemFromFactory(enchant, factory);
+ }
+
+ return MainConfigGui.enchantLimitItem(enchantLimitConfigGui);
+ }
+
+ private GuiItem enchantMergeLimitConfigGui() {
+ if (enchantMergeLimitConfigGui == null) {
+ enchantMergeLimitConfigGui = new EnchantMergeLimitConfigGui(this);
+ enchantMergeLimitConfigGui.setFilter(enchantments::contains);
+ enchantMergeLimitConfigGui.init();
+ }
+
+ // Bypass
+ if(enchantments.size() == 1) {
+ var enchant = enchantments.iterator().next();
+ var factory = EnchantMergeLimitConfigGui.createFactory(enchant, this);
+
+ return enchantMergeLimitConfigGui.itemFromFactory(enchant, factory);
+ }
+
+ return MainConfigGui.enchantMergeLimitItem(enchantMergeLimitConfigGui);
+ }
+
+ private GuiItem enchantCostConfigGui() {
+ if (enchantCostConfigGui == null) {
+ enchantCostConfigGui = new EnchantCostConfigGui(this);
+ enchantCostConfigGui.setFilter(enchantments::contains);
+ enchantCostConfigGui.init();
+ }
+
+ // Bypass
+ if(enchantments.size() == 1) {
+ var enchant = enchantments.iterator().next();
+ var factory = EnchantCostConfigGui.createFactory(enchant, this);
+
+ return enchantCostConfigGui.itemFromFactory(enchant, factory);
+ }
+
+ return MainConfigGui.enchantCostItem(enchantCostConfigGui);
+ }
+
+ @NotNull
+ @Contract(pure = true)
+ private Predicate getGroupFilter() {
+ return group -> group.getEnchants()
+ .stream()
+ .anyMatch(enchantments::contains);
+ }
+
+ private EnchantConflictGui getEnchantConflictGui() {
+ if (enchantConflictGui == null) {
+ enchantConflictGui = new EnchantConflictGui(this);
+ enchantConflictGui.setFilter(getGroupFilter());
+ enchantConflictGui.init();
+ }
+
+ return enchantConflictGui;
+ }
+
+ private GroupConfigGui getGroupConfigGui() {
+ if (groupConfigGui == null) {
+ groupConfigGui = new GroupConfigGui(this);
+
+ // Get all the conflict related to this enchantment
+ var groups = ConfigHolder.CONFLICT_HOLDER
+ .getConflictManager()
+ .getConflictList()
+ .stream()
+ .filter(getGroupFilter())
+ .map(EnchantConflictGroup::getCantConflictGroup)
+ .collect(Collectors.toSet());
+
+ groupConfigGui.setFilter(group ->
+ groups.stream().anyMatch(other -> other.isReferencing(group))
+ );
+ groupConfigGui.init();
+ }
+
+ return groupConfigGui;
+ }
+
+ @Override
+ public void updateGuiValues() {
+ // enchant level limit item
+ pane.bindItem('2', enchantLimitConfigGui());
+
+ // enchant level limit item
+ pane.bindItem('3', enchantMergeLimitConfigGui());
+
+ // enchant cost item
+ pane.bindItem('4', enchantCostConfigGui());
+ }
+
+ @Override
+ public Gui getConnectedGui() {
+ return this;
+ }
+}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantConflictGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantConflictGui.java
index 912e6cb3..3c28e7c5 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantConflictGui.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantConflictGui.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.file.FileConfiguration;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
@@ -24,26 +25,30 @@ public class EnchantConflictGui extends MappedGuiListConfigGui getEveryDisplayableInstanceOfGeneric() {
+ protected Collection getEveryInstanceOfGeneric() {
return ConfigHolder.CONFLICT_HOLDER.getConflictManager().getConflictList();
}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantCostConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantCostConfigGui.java
index a6145368..677ca54d 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantCostConfigGui.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantCostConfigGui.java
@@ -1,14 +1,14 @@
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.Material;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.Nullable;
import xyz.alexcrea.cuanvil.config.ConfigHolder;
import xyz.alexcrea.cuanvil.enchant.CAEnchantment;
-import xyz.alexcrea.cuanvil.enchant.EnchantmentProperties;
-import xyz.alexcrea.cuanvil.enchant.EnchantmentRarity;
+import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui;
import xyz.alexcrea.cuanvil.gui.config.settings.EnchantCostSettingsGui;
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems;
import xyz.alexcrea.cuanvil.util.CasedStringUtil;
@@ -18,13 +18,13 @@ import java.util.Arrays;
import java.util.List;
import java.util.Locale;
+import static io.delilaheve.util.ConfigOptions.ENCHANT_VALUES_ROOT;
+
/**
* Global Config gui for enchantment cost settings.
*/
public class EnchantCostConfigGui extends AbstractEnchantConfigGui {
- private static final String SECTION_NAME = "enchant_values";
-
private static EnchantCostConfigGui INSTANCE = null;
@Nullable
@@ -37,18 +37,29 @@ public class EnchantCostConfigGui extends AbstractEnchantConfigGui displayLore = factory.getDisplayLore();
- if(!displayLore.isEmpty()){
+ if (!displayLore.isEmpty()) {
lore.add("");
lore.addAll(displayLore);
}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantLimitConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantLimitConfigGui.java
index e9edbebf..1d5c9ec5 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantLimitConfigGui.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantLimitConfigGui.java
@@ -1,11 +1,13 @@
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.util.ConfigOptions;
import org.bukkit.Material;
import org.jetbrains.annotations.Nullable;
import xyz.alexcrea.cuanvil.config.ConfigHolder;
import xyz.alexcrea.cuanvil.enchant.CAEnchantment;
+import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui;
import xyz.alexcrea.cuanvil.gui.config.settings.IntSettingsGui;
import xyz.alexcrea.cuanvil.util.CasedStringUtil;
@@ -36,14 +38,22 @@ public class EnchantLimitConfigGui extends AbstractEnchantConfigGui getEveryDisplayableInstanceOfGeneric() {
+ protected Collection getEveryInstanceOfGeneric() {
ArrayList includeGroups = new ArrayList<>();
for (AbstractMaterialGroup group : ConfigHolder.ITEM_GROUP_HOLDER.getItemGroupsManager().getGroupMap().values()) {
diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/ItemConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/ItemConfigGui.java
new file mode 100644
index 00000000..35ad5bf1
--- /dev/null
+++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/ItemConfigGui.java
@@ -0,0 +1,132 @@
+package xyz.alexcrea.cuanvil.gui.config.global;
+
+import com.github.stefvanschie.inventoryframework.gui.GuiItem;
+import com.github.stefvanschie.inventoryframework.gui.type.ChestGui;
+import com.github.stefvanschie.inventoryframework.pane.PatternPane;
+import com.github.stefvanschie.inventoryframework.pane.util.Pattern;
+import io.delilaheve.CustomAnvil;
+import org.bukkit.Material;
+import org.bukkit.NamespacedKey;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.ItemMeta;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import xyz.alexcrea.cuanvil.config.ConfigHolder;
+import xyz.alexcrea.cuanvil.gui.config.MainConfigGui;
+import xyz.alexcrea.cuanvil.gui.util.GuiGlobalActions;
+import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems;
+import xyz.alexcrea.cuanvil.util.CasedStringUtil;
+import xyz.alexcrea.cuanvil.util.MaterialUtil;
+import xyz.alexcrea.cuanvil.util.UnitRepairUtil;
+
+public class ItemConfigGui extends ChestGui {
+
+ private EnchantConflictGui enchantConflictGui;
+ private GroupConfigGui groupConfigGui;
+ private UnitRepairConfigGui unitRepairConfigGui;
+ private CustomRecipeConfigGui customRecipeConfigGui;
+
+ public ItemConfigGui(@NotNull Material display, @NotNull NamespacedKey material) {
+ super(3,
+ CasedStringUtil.snakeToUpperSpacedCase(
+ material.getKey().toLowerCase()
+ ) + " Config",
+ CustomAnvil.instance);
+
+ Pattern pattern = new Pattern(
+ "0000D0000",
+ "056000780",
+ "Q00000000"
+ );
+ PatternPane pane = new PatternPane(0, 0, 9, 3, pattern);
+ addPane(pane);
+
+ GuiGlobalItems.addBackgroundItem(pane);
+
+ ItemStack displayItemstack = new ItemStack(display);
+ ItemMeta displayMeta = displayItemstack.getItemMeta();
+ assert displayMeta != null;
+
+ displayMeta.setDisplayName("§aConfiguring " + material);
+ displayItemstack.setItemMeta(displayMeta);
+ pane.bindItem('D', new GuiItem(displayItemstack, GuiGlobalActions.stayInPlace, CustomAnvil.instance));
+
+ // Enchantment Conflicts item
+ GuiItem enchantConflictItem = MainConfigGui.enchantConflictItem(getEnchantConflictGui(material));
+ pane.bindItem('5', enchantConflictItem);
+
+ // Group config items
+ GuiItem groupConfigItem = MainConfigGui.groupConfigItem(getGroupConfigGui(material));
+ pane.bindItem('6', groupConfigItem);
+
+ // Unit repair item
+ GuiItem unitRepairItem = MainConfigGui.unitRepairItem(getUnitRepairConfigGui(material));
+ pane.bindItem('7', unitRepairItem);
+
+ // Custom recipe item
+ GuiItem customRecipeItem = MainConfigGui.customRecipeItem(getCustomRecipeConfigGui(material));
+ pane.bindItem('8', customRecipeItem);
+
+ // quit item
+ pane.bindItem('Q', MainConfigGui.quitItem());
+ }
+
+ private EnchantConflictGui getEnchantConflictGui(@NotNull NamespacedKey material) {
+ if (enchantConflictGui == null) {
+ enchantConflictGui = new EnchantConflictGui(this);
+ enchantConflictGui.setFilter(group ->
+ group.getCantConflictGroup().contain(material)
+ );
+ enchantConflictGui.init();
+ }
+
+ return enchantConflictGui;
+ }
+
+ private GroupConfigGui getGroupConfigGui(@NotNull NamespacedKey material) {
+ if (groupConfigGui == null) {
+ groupConfigGui = new GroupConfigGui(this);
+ groupConfigGui.setFilter(group ->
+ group.contain(material)
+ );
+ groupConfigGui.init();
+ }
+
+ return groupConfigGui;
+ }
+
+ private UnitRepairConfigGui getUnitRepairConfigGui(@NotNull NamespacedKey material) {
+ if (unitRepairConfigGui == null) {
+ unitRepairConfigGui = new UnitRepairConfigGui(this);
+ unitRepairConfigGui.setFilter(otherMat ->
+ otherMat.equals(material) || UnitRepairUtil.INSTANCE.findRawRepairValue(
+ material, otherMat, ConfigHolder.UNIT_REPAIR_HOLDER.getConfig()) != null
+ );
+ unitRepairConfigGui.init();
+ }
+
+ return unitRepairConfigGui;
+ }
+
+ private CustomRecipeConfigGui getCustomRecipeConfigGui(@NotNull NamespacedKey material) {
+ if (customRecipeConfigGui == null) {
+ customRecipeConfigGui = new CustomRecipeConfigGui(this);
+ customRecipeConfigGui.setFilter(recipe -> {
+ if (isMaterial(recipe.getLeftItem(), material)) return true;
+ if (isMaterial(recipe.getRightItem(), material)) return true;
+ return isMaterial(recipe.getResultItem(), material);
+ }
+ );
+ customRecipeConfigGui.init();
+ }
+
+ return customRecipeConfigGui;
+ }
+
+ private boolean isMaterial(@Nullable ItemStack item, @NotNull NamespacedKey material) {
+ if (item == null) return false;
+
+ return material.equals(MaterialUtil.INSTANCE.getCustomType(item));
+ }
+
+}
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 0e366ae6..54c4ce13 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.getKey().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 getEveryDisplayableInstanceOfGeneric() {
- 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/ElementListConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/ElementListConfigGui.java
index f3cc0b46..19d31d9f 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/ElementListConfigGui.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/ElementListConfigGui.java
@@ -23,18 +23,22 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.UUID;
+import java.util.function.Predicate;
-public abstract class ElementListConfigGui< T > extends ChestGui implements ValueUpdatableGui {
-
- private final String namePrefix;
-
- protected PatternPane backgroundPane;
+public abstract class ElementListConfigGui extends ChestGui implements ValueUpdatableGui {
public static final int LIST_FILLER_START_X = 1;
public static final int LIST_FILLER_START_Y = 1;
public static final int LIST_FILLER_LENGTH = 7;
public static final int LIST_FILLER_HEIGHT = 4;
+ private final String namePrefix;
+
+ protected PatternPane backgroundPane;
+
+ private Predicate filter = (t) -> true;
+ private boolean hasDefaultFilter = true;
+
protected ElementListConfigGui(@NotNull String title, Gui parent) {
super(6, title, CustomAnvil.instance);
this.namePrefix = title;
@@ -46,7 +50,12 @@ public abstract class ElementListConfigGui< T > extends ChestGui implements Valu
}
- protected Pattern getBackgroundPattern(){
+ public void setFilter(Predicate filter) {
+ this.filter = filter;
+ this.hasDefaultFilter = false;
+ }
+
+ protected Pattern getBackgroundPattern() {
return new Pattern(
GuiSharedConstant.UPPER_FILLER_FULL_PLANE,
GuiSharedConstant.EMPTY_FILLER_FULL_LINE,
@@ -61,7 +70,7 @@ public abstract class ElementListConfigGui< T > extends ChestGui implements Valu
protected ArrayList pages;
protected HashMap pageMap;
- public void init() { // Why I'm using an init function ? //TODO determine why is it using a init function and not used on constructor.
+ public void init() {
GuiGlobalItems.addBackgroundItem(this.backgroundPane);
this.backgroundPane.bindItem('1', GuiSharedConstant.SECONDARY_BACKGROUND_ITEM);
addPane(this.backgroundPane);
@@ -81,7 +90,7 @@ public abstract class ElementListConfigGui< T > extends ChestGui implements Valu
protected GuiItem goLeftItem;
protected GuiItem goRightItem;
- protected void prepareStaticValues(){
+ protected void prepareStaticValues() {
// Left item creation for consumer & bind
this.goLeftItem = new GuiItem(new ItemStack(Material.RED_STAINED_GLASS_PANE), event -> {
HumanEntity viewer = event.getWhoClicked();
@@ -112,17 +121,23 @@ public abstract class ElementListConfigGui< T > extends ChestGui implements Valu
viewer.setItemOnCursor(cursor);
}, CustomAnvil.instance);
- GuiItem createNew = prepareCreateNewItem();
- if(createNew != null){
+ GuiItem createNew;
+ if(hasDefaultFilter)
+ createNew = prepareCreateNewItem();
+ else
+ createNew = GuiSharedConstant.SECONDARY_BACKGROUND_ITEM;
+
+ if (createNew != null) {
this.backgroundPane.bindItem('C', createNew);
}
}
- protected void reloadValues(){
+
+ protected void reloadValues() {
this.firstPage.clear();
this.pages.clear();
this.pages.add(this.firstPage);
- for (T generic : getEveryDisplayableInstanceOfGeneric()) {
+ for (T generic : getDisplayableInstanceOfGeneric()) {
updateValueForGeneric(generic, false);
}
@@ -247,7 +262,7 @@ public abstract class ElementListConfigGui< T > extends ChestGui implements Valu
// set title
StringBuilder title = new StringBuilder(this.namePrefix);
int pagesSize = this.pages.size();
- if(pagesSize > 1){
+ if (pagesSize > 1) {
title.append(" (").append(pageID + 1).append('/').append(pagesSize).append(')');
}
setTitle(title.toString());
@@ -288,7 +303,7 @@ public abstract class ElementListConfigGui< T > extends ChestGui implements Valu
public void removeGeneric(T generic) {
GuiItem item = findGuiItemForRemoval(generic);
- if(item == null) return;
+ if (item == null) return;
removeFromPage(item);
update();
@@ -300,7 +315,11 @@ public abstract class ElementListConfigGui< T > extends ChestGui implements Valu
protected abstract void updateGeneric(T generic, ItemStack usedItem);
- protected abstract Collection getEveryDisplayableInstanceOfGeneric();
+ protected abstract Collection getEveryInstanceOfGeneric();
+
+ protected Collection getDisplayableInstanceOfGeneric() {
+ return getEveryInstanceOfGeneric().stream().filter(filter).toList();
+ }
@Override
public void updateGuiValues() {
diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/MappedElementListConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/MappedElementListConfigGui.java
index 31ab7184..9b6c6100 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/MappedElementListConfigGui.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/MappedElementListConfigGui.java
@@ -1,6 +1,7 @@
package xyz.alexcrea.cuanvil.gui.config.list;
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.entity.HumanEntity;
@@ -14,27 +15,32 @@ import java.util.Arrays;
import java.util.HashMap;
import java.util.function.Consumer;
-public abstract class MappedElementListConfigGui< T, S > extends ElementListConfigGui< T > {
+public abstract class MappedElementListConfigGui extends ElementListConfigGui {
protected final HashMap elementGuiMap;
- protected MappedElementListConfigGui(@NotNull String title) {
- super(title, MainConfigGui.getInstance());
+
+ protected MappedElementListConfigGui(@NotNull String title, @NotNull Gui parent) {
+ super(title, parent);
this.elementGuiMap = new HashMap<>();
}
+ protected MappedElementListConfigGui(@NotNull String title) {
+ this(title, MainConfigGui.getInstance());
+ }
+
@Override
- protected GuiItem prepareCreateNewItem(){
+ protected GuiItem prepareCreateNewItem() {
// Create new conflict item
ItemStack createItem = new ItemStack(Material.PAPER);
ItemMeta createMeta = createItem.getItemMeta();
assert createMeta != null;
- createMeta.setDisplayName("§aCreate new "+genericDisplayedName());
+ createMeta.setDisplayName("§aCreate new " + genericDisplayedName());
createMeta.setLore(Arrays.asList(
- "§7Create a new "+genericDisplayedName()+".",
- "§7You will be asked to name the "+genericDisplayedName()+" in chat.",
- "§7Then, you should edit the "+genericDisplayedName()+" config as you need"
+ "§7Create a new " + genericDisplayedName() + ".",
+ "§7You will be asked to name the " + genericDisplayedName() + " in chat.",
+ "§7Then, you should edit the " + genericDisplayedName() + " config as you need"
));
createItem.setItemMeta(createMeta);
@@ -51,8 +57,8 @@ public abstract class MappedElementListConfigGui< T, S > extends ElementListConf
}
player.closeInventory();
- player.sendMessage("§eWrite the "+genericDisplayedName()+" name you want to create in the chat.\n" +
- "§eOr write §ccancel §eto go back to "+genericDisplayedName()+" config menu");
+ player.sendMessage("§eWrite the " + genericDisplayedName() + " name you want to create in the chat.\n" +
+ "§eOr write §ccancel §eto go back to " + genericDisplayedName() + " config menu");
CustomAnvil.Companion.getChatListener().setListenedCallback(player, prepareCreateItemConsumer(player));
diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/MappedGuiListConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/MappedGuiListConfigGui.java
index 3aa18e0b..8180694e 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/MappedGuiListConfigGui.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/MappedGuiListConfigGui.java
@@ -1,6 +1,7 @@
package xyz.alexcrea.cuanvil.gui.config.list;
import com.github.stefvanschie.inventoryframework.gui.GuiItem;
+import com.github.stefvanschie.inventoryframework.gui.type.util.Gui;
import io.delilaheve.CustomAnvil;
import org.bukkit.entity.HumanEntity;
import org.bukkit.event.inventory.InventoryClickEvent;
@@ -14,19 +15,22 @@ import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Consumer;
import java.util.function.Supplier;
-public abstract class MappedGuiListConfigGui< T, S extends MappedGuiListConfigGui.LazyElement>>
- extends MappedElementListConfigGui< T, S > {
+public abstract class MappedGuiListConfigGui>
+ extends MappedElementListConfigGui {
protected MappedGuiListConfigGui(@NotNull String title) {
super(title);
+ }
+ protected MappedGuiListConfigGui(@NotNull String title, @NotNull Gui parent) {
+ super(title, parent);
}
@Override
public void reloadValues() {
this.elementGuiMap.forEach((conflict, element) -> {
ElementMappedToListGui gui = element.getStored();
- if(gui != null) gui.cleanAndBeUnusable();
+ if (gui != null) gui.cleanAndBeUnusable();
});
this.elementGuiMap.clear();
@@ -49,7 +53,7 @@ public abstract class MappedGuiListConfigGui< T, S extends MappedGuiListConfigGu
@Override
protected void updateElement(T generic, S element) {
ElementMappedToListGui gui = element.getStored();
- if(gui != null) gui.updateLocal();
+ if (gui != null) gui.updateLocal();
}
@Override
@@ -58,7 +62,7 @@ public abstract class MappedGuiListConfigGui< T, S extends MappedGuiListConfigGu
}
@Override
- protected Consumer prepareCreateItemConsumer(HumanEntity player){
+ protected Consumer prepareCreateItemConsumer(HumanEntity player) {
AtomicReference> selfRef = new AtomicReference<>();
Consumer selfCallback = (message) -> {
if (message == null) return;
@@ -71,7 +75,7 @@ public abstract class MappedGuiListConfigGui< T, S extends MappedGuiListConfigGu
message = message.toLowerCase(Locale.ROOT);
if ("cancel".equalsIgnoreCase(message)) {
- player.sendMessage(genericDisplayedName()+" creation cancelled...");
+ player.sendMessage(genericDisplayedName() + " creation cancelled...");
show(player);
return;
}
@@ -80,9 +84,9 @@ public abstract class MappedGuiListConfigGui< T, S extends MappedGuiListConfigGu
// Try to find if it already exists in a for loop
// Not the most efficient on large number of conflict, but it should not run often.
- for (T generic : getEveryDisplayableInstanceOfGeneric()) {
+ for (T generic : getDisplayableInstanceOfGeneric()) {
if (generic.toString().equalsIgnoreCase(message)) {
- player.sendMessage("§cPlease enter a "+genericDisplayedName()+" name that do not already exist...");
+ player.sendMessage("§cPlease enter a " + genericDisplayedName() + " name that do not already exist...");
// wait next message.
CustomAnvil.Companion.getChatListener().setListenedCallback(player, selfRef.get());
return;
@@ -90,7 +94,7 @@ public abstract class MappedGuiListConfigGui< T, S extends MappedGuiListConfigGu
}
T generic = createAndSaveNewEmptyGeneric(message);
- if(generic == null) {// we don't know what to do. so we back up by opening this gui.
+ if (generic == null) {// we don't know what to do. so we back up by opening this gui.
this.show(player);
return;
}
@@ -117,6 +121,7 @@ public abstract class MappedGuiListConfigGui< T, S extends MappedGuiListConfigGu
private final GuiItem parentItem;
private final LazyValue> lazyOpenConsumer;
+
public LazyElement(GuiItem parentItem, Supplier valueSupplier) {
super(valueSupplier);
this.parentItem = parentItem;
@@ -131,7 +136,7 @@ public abstract class MappedGuiListConfigGui< T, S extends MappedGuiListConfigGu
}
@NotNull
- public Consumer openAction(){
+ public Consumer openAction() {
return event -> lazyOpenConsumer.get().accept(event);
}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/SettingGuiListConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/SettingGuiListConfigGui.java
index f0e7cb0e..cb55ed08 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/SettingGuiListConfigGui.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/SettingGuiListConfigGui.java
@@ -15,10 +15,11 @@ import java.util.HashMap;
import java.util.List;
import java.util.function.Consumer;
-public abstract class SettingGuiListConfigGui< T, S extends SettingGui.SettingGuiFactory> extends ElementListConfigGui< T >{
+public abstract class SettingGuiListConfigGui extends ElementListConfigGui {
protected HashMap guiItemMap;
protected HashMap factoryMap;
+
protected SettingGuiListConfigGui(@NotNull String title, Gui parent) {
super(title, parent);
this.guiItemMap = new HashMap<>();
@@ -44,7 +45,7 @@ public abstract class SettingGuiListConfigGui< T, S extends SettingGui.SettingGu
@Override
public void updateValueForGeneric(T generic, boolean shouldUpdate) {
- if(!this.factoryMap.containsKey(generic)){
+ if (!this.factoryMap.containsKey(generic)) {
// Create new item & factory
S factory = createFactory(generic);
GuiItem newItem = itemFromFactory(generic, factory);
@@ -52,7 +53,7 @@ public abstract class SettingGuiListConfigGui< T, S extends SettingGui.SettingGu
addToPage(newItem);
this.guiItemMap.put(generic, newItem);
this.factoryMap.put(generic, factory);
- }else{
+ } else {
S factory = this.factoryMap.get(generic);
// Update old item
GuiItem oldItem = this.guiItemMap.get(generic);
@@ -61,7 +62,7 @@ public abstract class SettingGuiListConfigGui< T, S extends SettingGui.SettingGu
updateGuiItem(oldItem, newItem);
}
- if(shouldUpdate){
+ if (shouldUpdate) {
update();
}
}
@@ -74,7 +75,7 @@ public abstract class SettingGuiListConfigGui< T, S extends SettingGui.SettingGu
super.reloadValues();
}
- private void updateGuiItem(GuiItem oldITem, GuiItem newItem){
+ private void updateGuiItem(GuiItem oldITem, GuiItem newItem) {
oldITem.setItem(newItem.getItem());
oldITem.setProperties(newItem.getProperties());
oldITem.setVisible(newItem.isVisible());
@@ -86,17 +87,22 @@ public abstract class SettingGuiListConfigGui< T, S extends SettingGui.SettingGu
}
@Override // Not used
- protected void updateGeneric(T generic, ItemStack usedItem) {}
+ protected void updateGeneric(T generic, ItemStack usedItem) {
+ }
+
@Override // Not used
protected ItemStack createItemForGeneric(T generic) {
return null;
}
protected abstract List getCreateItemLore();
+
protected abstract Consumer getCreateClickConsumer();
+
protected abstract String createItemName();
protected abstract S createFactory(T generic);
+
protected abstract GuiItem itemFromFactory(T generic, S factory);
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 35f8ebb9..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 getEveryDisplayableInstanceOfGeneric() {
- 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 getEveryDisplayableInstanceOfGeneric() {
+ protected Collection getEveryInstanceOfGeneric() {
Stream toDisplayStream;
if(this.displayUnselected){
toDisplayStream = CAEnchantmentRegistry.getInstance().getNameSortedEnchantments().stream();
diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/IntSettingsGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/IntSettingsGui.java
index 73121a64..c32d22ca 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/IntSettingsGui.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/IntSettingsGui.java
@@ -318,9 +318,9 @@ public class IntSettingsGui extends AbstractSettingGui {
this.defaultVal = defaultVal;
this.steps = steps;
- if(displayLore == null){
+ if (displayLore == null) {
this.displayLore = Collections.emptyList();
- }else {
+ } else {
this.displayLore = displayLore;
}
}
@@ -392,7 +392,7 @@ public class IntSettingsGui extends AbstractSettingGui {
protected String deltaDisplay(ValueDisplayType type, int now, int planned) {
var delta = planned - now;
- if(delta < 0) return "§c" + delta;
+ if (delta < 0) return "§c" + delta;
else return "§a+" + delta;
}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/MaterialSelectSettingGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/MaterialSelectSettingGui.java
index fc519ff1..1869ad34 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/MaterialSelectSettingGui.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/MaterialSelectSettingGui.java
@@ -217,7 +217,7 @@ public class MaterialSelectSettingGui extends MappedElementListConfigGui getEveryDisplayableInstanceOfGeneric() {
+ protected Collection getEveryInstanceOfGeneric() {
return this.defaultMaterials;
}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/update/minecraft/Update_1_21.java b/src/main/java/xyz/alexcrea/cuanvil/update/minecraft/Update_1_21.java
index 3aa60730..bbe35589 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/update/minecraft/Update_1_21.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/update/minecraft/Update_1_21.java
@@ -1,6 +1,5 @@
package xyz.alexcrea.cuanvil.update.minecraft;
-import io.delilaheve.CustomAnvil;
import xyz.alexcrea.cuanvil.config.ConfigHolder;
import xyz.alexcrea.cuanvil.update.UpdateUtils;
import xyz.alexcrea.cuanvil.update.Version;
diff --git a/src/main/java/xyz/alexcrea/cuanvil/update/minecraft/Update_1_21_11.java b/src/main/java/xyz/alexcrea/cuanvil/update/minecraft/Update_1_21_11.java
index d6395966..6dd8b5ba 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/update/minecraft/Update_1_21_11.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/update/minecraft/Update_1_21_11.java
@@ -38,26 +38,26 @@ public class Update_1_21_11 extends MCUpdate{
addAbsentToList(conflictConfig, "restriction_fire_aspect.notAffectedGroups", "spears");
// Unit repair for spears
- unitConfig.set("gold_ingot.golden_spear", 0.25);
- unitConfig.set("copper_ingot.copper_spear", 0.25);
- unitConfig.set("iron_ingot.iron_spear", 0.25);
- unitConfig.set("diamond.diamond_spear", 0.25);
- unitConfig.set("netherite_ingot.netherite_spear", 0.25);
+ unitConfig.set("minecraft:gold_ingot.minecraft:golden_spear", 0.25);
+ unitConfig.set("minecraft:copper_ingot.minecraft:copper_spear", 0.25);
+ unitConfig.set("minecraft:iron_ingot.minecraft:iron_spear", 0.25);
+ unitConfig.set("minecraft:diamond.minecraft:diamond_spear", 0.25);
+ unitConfig.set("minecraft:netherite_ingot.minecraft:netherite_spear", 0.25);
- unitConfig.set("cobblestone.stone_spear", 0.25);
- unitConfig.set("cobbled_deepslate.stone_spear", 0.25);
+ unitConfig.set("minecraft:cobblestone.stone_spear", 0.25);
+ unitConfig.set("minecraft:cobbled_deepslate.stone_spear", 0.25);
- unitConfig.set("oak_planks.wooden_spear", 0.25);
- unitConfig.set("spruce_planks.wooden_spear", 0.25);
- unitConfig.set("birch_planks.wooden_spear", 0.25);
- unitConfig.set("jungle_planks.wooden_spear", 0.25);
- unitConfig.set("acacia_planks.wooden_spear", 0.25);
- unitConfig.set("dark_oak_planks.wooden_spear", 0.25);
- unitConfig.set("mangrove_planks.wooden_spear", 0.25);
- unitConfig.set("cherry_planks.wooden_spear", 0.25);
- unitConfig.set("bamboo_planks.wooden_spear", 0.25);
- unitConfig.set("crimson_planks.wooden_spear", 0.25);
- unitConfig.set("warped_planks.wooden_spear", 0.25);
+ unitConfig.set("minecraft:oak_planks.minecraft:wooden_spear", 0.25);
+ unitConfig.set("minecraft:spruce_planks.minecraft:wooden_spear", 0.25);
+ unitConfig.set("minecraft:birch_planks.minecraft:wooden_spear", 0.25);
+ unitConfig.set("minecraft:jungle_planks.minecraft:wooden_spear", 0.25);
+ unitConfig.set("minecraft:acacia_planks.minecraft:wooden_spear", 0.25);
+ unitConfig.set("minecraft:dark_oak_planks.minecraft:wooden_spear", 0.25);
+ unitConfig.set("minecraft:mangrove_planks.minecraft:wooden_spear", 0.25);
+ unitConfig.set("minecraft:cherry_planks.minecraft:wooden_spear", 0.25);
+ unitConfig.set("minecraft:bamboo_planks.minecraft:wooden_spear", 0.25);
+ unitConfig.set("minecraft:crimson_planks.minecraft:wooden_spear", 0.25);
+ unitConfig.set("minecraft:warped_planks.minecraft:wooden_spear", 0.25);
// Create lunge enchant value and group
baseConfig.set("enchant_limits.minecraft:lunge", 3);
diff --git a/src/main/java/xyz/alexcrea/cuanvil/update/minecraft/Update_1_21_9.java b/src/main/java/xyz/alexcrea/cuanvil/update/minecraft/Update_1_21_9.java
index d289b9bf..ec464ba1 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/update/minecraft/Update_1_21_9.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/update/minecraft/Update_1_21_9.java
@@ -49,16 +49,16 @@ public class Update_1_21_9 extends MCUpdate{
public static void addCopperUnitRepair(FileConfiguration unitConfig) {
// Add unit repair
- unitConfig.set("copper_ingot.copper_helmet", 0.25);
- unitConfig.set("copper_ingot.copper_chestplate", 0.25);
- unitConfig.set("copper_ingot.copper_leggings", 0.25);
- unitConfig.set("copper_ingot.copper_boots", 0.25);
+ unitConfig.set("minecraft:copper_ingot.minecraft:copper_helmet", 0.25);
+ unitConfig.set("minecraft:copper_ingot.minecraft:copper_chestplate", 0.25);
+ unitConfig.set("minecraft:copper_ingot.minecraft:copper_leggings", 0.25);
+ unitConfig.set("minecraft:copper_ingot.minecraft:copper_boots", 0.25);
- unitConfig.set("copper_ingot.copper_pickaxe", 0.25);
- unitConfig.set("copper_ingot.copper_shovel", 0.25);
- unitConfig.set("copper_ingot.copper_hoe", 0.25);
- unitConfig.set("copper_ingot.copper_axe", 0.25);
- unitConfig.set("copper_ingot.copper_sword", 0.25);
+ unitConfig.set("minecraft:copper_ingot.minecraft:copper_pickaxe", 0.25);
+ unitConfig.set("minecraft:copper_ingot.minecraft:copper_shovel", 0.25);
+ unitConfig.set("minecraft:copper_ingot.minecraft:copper_hoe", 0.25);
+ unitConfig.set("minecraft:copper_ingot.minecraft:copper_axe", 0.25);
+ unitConfig.set("minecraft:copper_ingot.minecraft:copper_sword", 0.25);
}
}
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/command/CustomAnvilCommand.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/command/CustomAnvilCommand.kt
index 8bd1d827..648dbc1d 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/command/CustomAnvilCommand.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/command/CustomAnvilCommand.kt
@@ -20,6 +20,7 @@ class CustomAnvilCommand(plugin: CustomAnvil) : CommandExecutor, TabCompleter {
private val helpCommand = HelpExecutor()
private val commands = ImmutableMap.of(
"gui", editConfigCommand,
+ "config", editConfigCommand,
"reload", ReloadExecutor(),
"diagnostic", DiagnosticExecutor(),
"debug", DebugToggleExecutor(),
@@ -42,12 +43,16 @@ class CustomAnvilCommand(plugin: CustomAnvil) : CommandExecutor, TabCompleter {
): Boolean {
// Find sub command to execute based on the provided command name
val subcmd: CASubCommand?
+ val subcmdStr: String
+
val newargs: Array
if(args.isEmpty()) {
+ subcmdStr = "config"
subcmd = editConfigCommand
newargs = args
}else {
- subcmd = commands[args[0].lowercase()]
+ subcmdStr = args[0].lowercase()
+ subcmd = commands[subcmdStr]
newargs = args.copyOfRange(1, args.size)
}
@@ -57,7 +62,7 @@ class CustomAnvilCommand(plugin: CustomAnvil) : CommandExecutor, TabCompleter {
}
try {
- return subcmd.executeCommand(sender, cmd, cmdstr, newargs)
+ return subcmd.executeCommand(sender, cmd, subcmdStr, newargs)
} catch (e: Throwable) {
MetricsUtil.trackError(e)
sender.sendMessage("§cError running this command")
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/command/EditConfigExecutor.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/command/EditConfigExecutor.kt
index d26db8c2..b11bfb4a 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/command/EditConfigExecutor.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/command/EditConfigExecutor.kt
@@ -4,35 +4,18 @@ import io.delilaheve.CustomAnvil
import org.bukkit.command.Command
import org.bukkit.command.CommandSender
import org.bukkit.entity.HumanEntity
+import xyz.alexcrea.cuanvil.api.EnchantmentApi
import xyz.alexcrea.cuanvil.dependency.util.PlatformUtil
+import xyz.alexcrea.cuanvil.enchant.CAEnchantment
+import xyz.alexcrea.cuanvil.enchant.CAEnchantmentRegistry
import xyz.alexcrea.cuanvil.gui.config.MainConfigGui
+import xyz.alexcrea.cuanvil.gui.config.global.EnchantConfigGui
+import xyz.alexcrea.cuanvil.gui.config.global.ItemConfigGui
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalActions
+import xyz.alexcrea.cuanvil.util.MaterialUtil.customType
+import xyz.alexcrea.cuanvil.util.MaterialUtil.isAir
-class EditConfigExecutor: CASubCommand() {
-
- override fun executeCommand(sender: CommandSender,
- cmd: Command,
- cmdstr: String,
- args: Array): Boolean {
- if (sender !is HumanEntity) return false
-
- if (!allowed(sender)) {
- sender.sendMessage(GuiGlobalActions.NO_EDIT_PERM)
- return false
- }
- if(PlatformUtil.isFolia){
- sender.sendMessage("§cIt look like you are using Folia. Sadly Custom Anvil do not support Config gui for Folia.")
- sender.sendMessage("§eIt is may come in a future version.")
- sender.sendMessage("")
- sender.sendMessage("§eCurrently you need to edit manually the config or copy from another server (spigot or better)")
- sender.sendMessage("§eThen /ca reload after config file is edited")
- return false
- }
-
- MainConfigGui.getInstance().show(sender)
-
- return true
- }
+class EditConfigExecutor : CASubCommand() {
override fun allowed(sender: CommandSender): Boolean {
return sender.hasPermission(CustomAnvil.editConfigPermission)
@@ -42,4 +25,109 @@ class EditConfigExecutor: CASubCommand() {
return "Gui to edit the plugin's config"
}
+ override fun executeCommand(
+ sender: CommandSender,
+ cmd: Command,
+ cmdstr: String,
+ args: Array
+ ): Boolean {
+ if (sender !is HumanEntity) return false
+
+ if (!allowed(sender)) {
+ sender.sendMessage(GuiGlobalActions.NO_EDIT_PERM)
+ return false
+ }
+ if (PlatformUtil.isFolia) {
+ sender.sendMessage("§cIt look like you are using Folia. Sadly Custom Anvil do not support Config gui for Folia.")
+ sender.sendMessage("§eIt is may come in a future version.")
+ sender.sendMessage("")
+ sender.sendMessage("§eCurrently you need to edit manually the config or copy from another server (spigot or better)")
+ sender.sendMessage("§eThen /ca reload after config file is edited")
+ return false
+ }
+
+ if ("gui".equals(cmdstr, ignoreCase = true)) {
+ sender.sendMessage("§c/ca gui has been moved to /ca config")
+ }
+
+ if (args.isEmpty())
+ processOpen(sender)
+ else when (args[0].lowercase()) {
+ "open" -> processOpen(sender)
+ "enchant" -> processEnchant(sender, args)
+ "item" -> processItem(sender)
+ else -> sender.sendMessage("Unknown subcommand \"${args[0]}\"")
+ }
+
+ return true
+ }
+
+ private fun processEnchant(sender: HumanEntity, args: Array) {
+ val enchantToFilter: Set
+ if (args.size <= 1) {
+ val item = sender.inventory.itemInMainHand
+
+ enchantToFilter = EnchantmentApi.getEnchantments(item).keys
+ if (enchantToFilter.isEmpty()) {
+ sender.sendMessage("No enchantment found in the item you are holding")
+ return
+ }
+ } else {
+ enchantToFilter = HashSet(EnchantmentApi.getListByName(args[1].lowercase()))
+
+ if (enchantToFilter.isEmpty()) {
+ sender.sendMessage("No enchantment found with the name \"${args[1]}\"")
+ return
+ }
+ }
+
+ EnchantConfigGui(enchantToFilter).show(sender)
+
+ }
+
+ private fun processItem(sender: HumanEntity) {
+ val item = sender.inventory.itemInMainHand
+ if (item.isAir) {
+ sender.sendMessage("Cannot configure the item in hand")
+ return
+ }
+
+ ItemConfigGui(item.type, item.customType).show(sender)
+ }
+
+ private fun processOpen(sender: HumanEntity) {
+ MainConfigGui.getInstance().show(sender)
+ }
+
+ // ---------------
+ // Tab completer
+ // ---------------
+
+ private fun allEnchantmentsByName(): Collection {
+ val names = mutableSetOf()
+ for (enchantment in CAEnchantmentRegistry.getInstance().values()) {
+ names.add(enchantment.name)
+ names.add(enchantment.key.toString())
+ }
+
+ return names
+ }
+
+ override fun tabCompleter(sender: CommandSender, args: Array, list: MutableList) {
+ list.addAll(
+ when (args.size) {
+ 1 -> listOf("item", "enchant", "open")
+ 2 -> {
+ when (args[0].lowercase()) {
+ "enchant" -> allEnchantmentsByName()
+ else -> listOf()
+ }
+ }
+
+ else -> listOf()
+ }
+ )
+
+ }
+
}
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/util/MaterialUtil.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/util/MaterialUtil.kt
index 6b55662f..dc1e25a9 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/util/MaterialUtil.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/util/MaterialUtil.kt
@@ -6,6 +6,7 @@ import org.bukkit.NamespacedKey
import org.bukkit.inventory.ItemStack
import xyz.alexcrea.cuanvil.dependency.DependencyManager
import xyz.alexcrea.cuanvil.dependency.plugins.EcoItemDependencyUtil
+import javax.annotation.Nullable
object MaterialUtil {
@@ -35,11 +36,13 @@ object MaterialUtil {
return this.type.key
}
+ @Nullable
private fun bukkitMaterialFromKey(key: NamespacedKey): Material? {
//TODO on paper only transition Registry.MATERIAL.get(key)
return Material.matchMaterial(key.toString())
}
+ @Nullable
fun getMatFromKey(key: NamespacedKey): Material? {
if(DependencyManager.ecoEnchantCompatibility != null) {
val result = EcoItemDependencyUtil.ecoItemMaterialFromKey(key)
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/util/UnitRepairUtil.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/util/UnitRepairUtil.kt
index 8463e27e..5d059870 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/util/UnitRepairUtil.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/util/UnitRepairUtil.kt
@@ -1,6 +1,8 @@
package xyz.alexcrea.cuanvil.util
+import org.bukkit.NamespacedKey
import org.bukkit.configuration.ConfigurationSection
+import org.bukkit.configuration.file.FileConfiguration
import org.bukkit.inventory.ItemStack
import xyz.alexcrea.cuanvil.config.ConfigHolder
import xyz.alexcrea.cuanvil.util.MaterialUtil.customType
@@ -11,7 +13,7 @@ object UnitRepairUtil {
private const val DEFAULT_DEFAULT_UNIT_REPAIR = 0.25
// Path to user default unit repair value
- private const val UNIT_REPAIR_DEFAULT_PATH = "default_repair_amount"
+ public const val UNIT_REPAIR_DEFAULT_PATH = "default_repair_amount"
/**
* Get the % of repair by unit [other] will do to this [ItemStack].
@@ -22,40 +24,56 @@ object UnitRepairUtil {
): Double? {
if (other == null) return null
val config = ConfigHolder.UNIT_REPAIR_HOLDER.config
- // Get configuration section if exist
- val otherName = other.customType.key.lowercase()
- var section = config.getConfigurationSection(otherName)
- if (section == null) {
- section = config.getConfigurationSection(otherName.uppercase())
- if (section == null) return null
- }
- // Get repair amount
- var userDefault = config.getDouble(UNIT_REPAIR_DEFAULT_PATH, DEFAULT_DEFAULT_UNIT_REPAIR)
- if (userDefault <= 0) {
- userDefault = DEFAULT_DEFAULT_UNIT_REPAIR
- }
+ val result = findRawRepairValue(this, other, config) ?: return null
- return getRepairAmount(this, section, userDefault)
+ if(result > 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 findRawRepairValue(
+ 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 findRawRepairValue(
+ self: NamespacedKey,
+ other: NamespacedKey,
+ config: FileConfiguration
+ ): Double? {
+ val result = checkSection(config, other.toString(), self)
+ if (result != null) return result
+
+ return checkSection(config, other.key, self)
+ }
+
+ 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