From cc7d66f270d27e3576411ee7f15c93056e17bafa Mon Sep 17 00:00:00 2001 From: EpicKnarvik97 Date: Mon, 24 Oct 2022 13:57:58 +0200 Subject: [PATCH] Fixes several bugs and problems Fixes getting the name of enchantments Fixes inconsistencies in material and enchantment name-checking Allows using "null" or "-1" to unset per-material or per-enchantment configuration options Fixes a bug where basePrice was set to a material name instead of the price for the material being displayed Adds missing tab-completion for material/enchantment costs Prevents inconsistencies in deciding if a value is null --- .../command/BlackSmithConfigCommand.java | 29 +++++++---- .../command/BlackSmithConfigTabCompleter.java | 31 ++++++++++++ .../command/BlackSmithEditCommand.java | 5 +- .../blacksmith/config/GlobalSettings.java | 48 ++++++++++++------- .../blacksmith/config/NPCSettings.java | 5 +- .../blacksmith/trait/ReforgeSession.java | 6 +-- .../blacksmith/util/InputParsingHelper.java | 11 +++++ .../util/TabCompleteValuesHelper.java | 2 +- 8 files changed, 102 insertions(+), 35 deletions(-) diff --git a/src/main/java/net/knarcraft/blacksmith/command/BlackSmithConfigCommand.java b/src/main/java/net/knarcraft/blacksmith/command/BlackSmithConfigCommand.java index b2e32d0..e67ce25 100644 --- a/src/main/java/net/knarcraft/blacksmith/command/BlackSmithConfigCommand.java +++ b/src/main/java/net/knarcraft/blacksmith/command/BlackSmithConfigCommand.java @@ -11,7 +11,6 @@ import net.knarcraft.blacksmith.util.InputParsingHelper; import net.knarcraft.blacksmith.util.TypeValidationHelper; import net.md_5.bungee.api.ChatColor; import org.bukkit.Material; -import org.bukkit.NamespacedKey; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; @@ -81,7 +80,14 @@ public class BlackSmithConfigCommand implements CommandExecutor { } //Change the value of the specified setting - return changeValue(args, detectedGlobalSetting, detectedNPCSetting, settings, sender); + if ((detectedGlobalSetting != null && + TypeValidationHelper.isValid(detectedGlobalSetting.getValueType(), args[1], sender)) || + (detectedNPCSetting != null && + TypeValidationHelper.isValid(detectedNPCSetting.getValueType(), args[1], sender))) { + return changeValue(args, detectedGlobalSetting, detectedNPCSetting, settings, sender); + } else { + return false; + } } /** @@ -166,7 +172,7 @@ public class BlackSmithConfigCommand implements CommandExecutor { private boolean displaySpecialCaseValue(String selector, CommandSender sender, GlobalSetting setting, GlobalSettings settings) { if (setting == GlobalSetting.BASE_PRICE || setting == GlobalSetting.PRICE_PER_DURABILITY_POINT) { - Material material = Material.matchMaterial(selector); + Material material = InputParsingHelper.matchMaterial(selector); if (material == null) { return false; } @@ -176,16 +182,17 @@ public class BlackSmithConfigCommand implements CommandExecutor { } else { currentValue = String.valueOf(settings.getPricePerDurabilityPoint(material)); } - displaySuccessMessage(sender, TranslatableMessage.getItemCurrentValueMessage(setting.getCommandName(), ItemType.MATERIAL, - material.name(), currentValue)); + displaySuccessMessage(sender, TranslatableMessage.getItemCurrentValueMessage(setting.getCommandName(), + ItemType.MATERIAL, material.name(), currentValue)); return true; } else if (setting == GlobalSetting.ENCHANTMENT_COST) { - Enchantment enchantment = Enchantment.getByKey(NamespacedKey.minecraft(selector)); + Enchantment enchantment = InputParsingHelper.matchEnchantment(selector); if (enchantment == null) { return false; } - displaySuccessMessage(sender, TranslatableMessage.getItemCurrentValueMessage(setting.getCommandName(), ItemType.ENCHANTMENT, - enchantment.toString(), String.valueOf(settings.getEnchantmentCost(enchantment)))); + displaySuccessMessage(sender, TranslatableMessage.getItemCurrentValueMessage(setting.getCommandName(), + ItemType.ENCHANTMENT, enchantment.getKey().getKey(), + String.valueOf(settings.getEnchantmentCost(enchantment)))); return true; } else { return false; @@ -215,7 +222,9 @@ public class BlackSmithConfigCommand implements CommandExecutor { */ private boolean updateSpecialCase(GlobalSettings settings, GlobalSetting detectedGlobalSetting, String[] args, CommandSender sender) { - if (!TypeValidationHelper.isValid(SettingValueType.POSITIVE_DOUBLE, args[2], sender)) { + if (InputParsingHelper.isEmpty(args[2])) { + args[2] = "-1"; + } else if (!TypeValidationHelper.isValid(SettingValueType.POSITIVE_DOUBLE, args[2], sender)) { return true; } double newPrice = Double.parseDouble(args[2]); @@ -242,7 +251,7 @@ public class BlackSmithConfigCommand implements CommandExecutor { return false; } itemType = ItemType.ENCHANTMENT; - itemChanged = enchantment.toString(); + itemChanged = enchantment.getKey().getKey(); settings.setEnchantmentCost(enchantment, newPrice); } else { return false; diff --git a/src/main/java/net/knarcraft/blacksmith/command/BlackSmithConfigTabCompleter.java b/src/main/java/net/knarcraft/blacksmith/command/BlackSmithConfigTabCompleter.java index b89344d..af883e2 100644 --- a/src/main/java/net/knarcraft/blacksmith/command/BlackSmithConfigTabCompleter.java +++ b/src/main/java/net/knarcraft/blacksmith/command/BlackSmithConfigTabCompleter.java @@ -3,6 +3,7 @@ package net.knarcraft.blacksmith.command; import net.knarcraft.blacksmith.config.GlobalSetting; import net.knarcraft.blacksmith.config.NPCSetting; import net.knarcraft.blacksmith.config.SettingValueType; +import net.knarcraft.blacksmith.util.InputParsingHelper; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.TabCompleter; @@ -28,6 +29,8 @@ public class BlackSmithConfigTabCompleter implements TabCompleter { return new ArrayList<>(); } + //Arguments: [new value/material or enchantment] [] + if (args.length == 1) { List availableCommands = new ArrayList<>(); availableCommands.add("reload"); @@ -40,10 +43,38 @@ public class BlackSmithConfigTabCompleter implements TabCompleter { return filterMatchingContains(availableCommands, args[0]); } else if (args.length == 2) { return tabCompleteCommandValues(args[0], args[1]); + } else if (args.length == 3) { + //Get per-material tab completions, or return nothing if an invalid setting was specified + for (GlobalSetting globalSetting : GlobalSetting.values()) { + if (globalSetting.getCommandName().equalsIgnoreCase(args[0])) { + return getPerTypeTabCompletions(globalSetting, args); + } + } + return new ArrayList<>(); } return null; } + /** + * Gets tab-completions for a selected material or enchantment + * + * @param globalSetting

The global setting to get tab-completions for

+ * @param args

The arguments given by the user

+ * @return

The tab-completions to show to the user

+ */ + private List getPerTypeTabCompletions(GlobalSetting globalSetting, String[] args) { + //Display possible tab-completions only if a valid enchantment or material is provided + if (((globalSetting == GlobalSetting.BASE_PRICE || + globalSetting == GlobalSetting.PRICE_PER_DURABILITY_POINT) && + InputParsingHelper.matchMaterial(args[1]) != null) || + (globalSetting == GlobalSetting.ENCHANTMENT_COST && + InputParsingHelper.matchEnchantment(args[1]) != null)) { + return filterMatchingContains(getTabCompletions(globalSetting.getValueType()), args[2]); + } else { + return new ArrayList<>(); + } + } + /** * Tab completes the values available for the given command * diff --git a/src/main/java/net/knarcraft/blacksmith/command/BlackSmithEditCommand.java b/src/main/java/net/knarcraft/blacksmith/command/BlackSmithEditCommand.java index 02eff55..cfd9e6e 100644 --- a/src/main/java/net/knarcraft/blacksmith/command/BlackSmithEditCommand.java +++ b/src/main/java/net/knarcraft/blacksmith/command/BlackSmithEditCommand.java @@ -9,6 +9,7 @@ import net.knarcraft.blacksmith.formatting.StringFormatter; import net.knarcraft.blacksmith.formatting.TranslatableMessage; import net.knarcraft.blacksmith.formatting.Translator; import net.knarcraft.blacksmith.trait.BlacksmithTrait; +import net.knarcraft.blacksmith.util.InputParsingHelper; import net.knarcraft.blacksmith.util.TypeValidationHelper; import net.md_5.bungee.api.ChatColor; import org.bukkit.command.Command; @@ -72,7 +73,7 @@ public class BlackSmithEditCommand implements CommandExecutor { displayNPCSetting(blacksmithTrait, npcSetting, sender); } else { //If an empty value or null, clear the value instead of changing it - if (newValue.equalsIgnoreCase("null") || newValue.equals("\"\"") || newValue.trim().isEmpty()) { + if (InputParsingHelper.isEmpty(newValue)) { newValue = null; } else { //Abort if an invalid value is given @@ -101,7 +102,7 @@ public class BlackSmithEditCommand implements CommandExecutor { */ private void displayNPCSetting(BlacksmithTrait blacksmithTrait, NPCSetting npcSetting, CommandSender sender) { String rawValue = String.valueOf(blacksmithTrait.getSettings().getRawValue(npcSetting)); - if (rawValue == null || rawValue.trim().isEmpty() || rawValue.equalsIgnoreCase("null")) { + if (InputParsingHelper.isEmpty(rawValue)) { //Display the default value, if no custom value has been specified rawValue = String.valueOf(BlacksmithPlugin.getInstance().getSettings().getRawValue(npcSetting)); displaySuccessMessage(sender, getCurrentValueMessage(npcSetting.getCommandName(), rawValue)); diff --git a/src/main/java/net/knarcraft/blacksmith/config/GlobalSettings.java b/src/main/java/net/knarcraft/blacksmith/config/GlobalSettings.java index 74c5c61..5ff0e06 100644 --- a/src/main/java/net/knarcraft/blacksmith/config/GlobalSettings.java +++ b/src/main/java/net/knarcraft/blacksmith/config/GlobalSettings.java @@ -4,8 +4,8 @@ import net.citizensnpcs.api.util.DataKey; import net.citizensnpcs.api.util.YamlStorage; import net.knarcraft.blacksmith.BlacksmithPlugin; import net.knarcraft.blacksmith.util.ConfigHelper; +import net.knarcraft.blacksmith.util.InputParsingHelper; import org.bukkit.Material; -import org.bukkit.NamespacedKey; import org.bukkit.enchantments.Enchantment; import java.io.File; @@ -112,13 +112,17 @@ public class GlobalSettings { * @param newEnchantmentCost

The new enchantment cost

*/ public void setEnchantmentCost(Enchantment enchantment, double newEnchantmentCost) { - if (newEnchantmentCost < 0) { - throw new IllegalArgumentException("Enchantment cost cannot be negative!"); - } if (enchantment == null) { + if (newEnchantmentCost < 0) { + throw new IllegalArgumentException("Enchantment cost cannot be negative!"); + } globalSettings.put(GlobalSetting.ENCHANTMENT_COST, newEnchantmentCost); } else { - enchantmentCosts.put(enchantment, newEnchantmentCost); + if (newEnchantmentCost < 0) { + enchantmentCosts.put(enchantment, null); + } else { + enchantmentCosts.put(enchantment, newEnchantmentCost); + } } save(); } @@ -130,13 +134,18 @@ public class GlobalSettings { * @param newPrice

The new price per durability point price

*/ public void setPricePerDurabilityPoint(Material material, double newPrice) { - if (newPrice < 0) { - throw new IllegalArgumentException("Price per durability point cannot be negative!"); - } if (material == null) { + if (newPrice < 0) { + throw new IllegalArgumentException("Price per durability point cannot be negative!"); + } globalSettings.put(GlobalSetting.PRICE_PER_DURABILITY_POINT, newPrice); } else { - materialPricePerDurabilityPoints.put(material, newPrice); + //Use a negative price to unset the per-item value + if (newPrice < 0) { + materialPricePerDurabilityPoints.put(material, null); + } else { + materialPricePerDurabilityPoints.put(material, newPrice); + } } save(); } @@ -148,13 +157,18 @@ public class GlobalSettings { * @param newBasePrice

The new base price

*/ public void setBasePrice(Material material, double newBasePrice) { - if (newBasePrice < 0) { - throw new IllegalArgumentException("Base price cannot be negative!"); - } if (material == null) { + if (newBasePrice < 0) { + throw new IllegalArgumentException("Base price cannot be negative!"); + } globalSettings.put(GlobalSetting.BASE_PRICE, newBasePrice); } else { - materialBasePrices.put(material, newBasePrice); + //Use a negative price to unset the per-item value + if (newBasePrice < 0) { + materialBasePrices.put(material, null); + } else { + materialBasePrices.put(material, newBasePrice); + } } save(); } @@ -292,7 +306,7 @@ public class GlobalSettings { Map relevantKeys = getRelevantKeys(basePriceNode); for (String key : relevantKeys.keySet()) { String materialName = relevantKeys.get(key); - Material material = Material.matchMaterial(materialName); + Material material = InputParsingHelper.matchMaterial(materialName); if (material != null) { materialBasePrices.put(material, basePriceNode.getDouble(key)); } else { @@ -306,7 +320,7 @@ public class GlobalSettings { relevantKeys = getRelevantKeys(basePerDurabilityPriceNode); for (String key : relevantKeys.keySet()) { String materialName = relevantKeys.get(key); - Material material = Material.matchMaterial(materialName); + Material material = InputParsingHelper.matchMaterial(materialName); if (material != null) { materialPricePerDurabilityPoints.put(material, basePerDurabilityPriceNode.getDouble(key)); } else { @@ -320,7 +334,7 @@ public class GlobalSettings { relevantKeys = getRelevantKeys(basePerDurabilityPriceNode); for (String key : relevantKeys.keySet()) { String enchantmentName = relevantKeys.get(key); - Enchantment enchantment = Enchantment.getByKey(NamespacedKey.minecraft(enchantmentName)); + Enchantment enchantment = InputParsingHelper.matchEnchantment(enchantmentName); if (enchantment != null) { enchantmentCosts.put(enchantment, enchantmentCostNode.getDouble(key)); } else { @@ -407,7 +421,7 @@ public class GlobalSettings { //Load all enchantment prices DataKey enchantmentCostNode = root.getRelative(GlobalSetting.ENCHANTMENT_COST.getParent()); for (Enchantment enchantment : enchantmentCosts.keySet()) { - enchantmentCostNode.setRaw(unNormalizeName(enchantment.getKey().toString()), enchantmentCosts.get(enchantment)); + enchantmentCostNode.setRaw(unNormalizeName(enchantment.getKey().getKey()), enchantmentCosts.get(enchantment)); } //Perform the actual save to disk diff --git a/src/main/java/net/knarcraft/blacksmith/config/NPCSettings.java b/src/main/java/net/knarcraft/blacksmith/config/NPCSettings.java index cb5bd08..e3f7ed8 100644 --- a/src/main/java/net/knarcraft/blacksmith/config/NPCSettings.java +++ b/src/main/java/net/knarcraft/blacksmith/config/NPCSettings.java @@ -4,6 +4,7 @@ import net.citizensnpcs.api.util.DataKey; import net.knarcraft.blacksmith.BlacksmithPlugin; import net.knarcraft.blacksmith.trait.BlacksmithTrait; import net.knarcraft.blacksmith.util.ConfigHelper; +import net.knarcraft.blacksmith.util.InputParsingHelper; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; @@ -361,10 +362,10 @@ public class NPCSettings { newReforgeAbleItems = (String) replaceReforgeAblePresets(newReforgeAbleItems); for (String item : newReforgeAbleItems.split(",")) { - if (item == null || item.trim().isEmpty() || item.equalsIgnoreCase("null")) { + if (InputParsingHelper.isEmpty(item)) { continue; } - Material material = Material.matchMaterial(item.replace('-', '_')); + Material material = InputParsingHelper.matchMaterial(item); if (material != null && BlacksmithTrait.isRepairable(new ItemStack(material, 1))) { this.reforgeAbleItems.add(material); } else { diff --git a/src/main/java/net/knarcraft/blacksmith/trait/ReforgeSession.java b/src/main/java/net/knarcraft/blacksmith/trait/ReforgeSession.java index 3937ecc..5160600 100644 --- a/src/main/java/net/knarcraft/blacksmith/trait/ReforgeSession.java +++ b/src/main/java/net/knarcraft/blacksmith/trait/ReforgeSession.java @@ -4,8 +4,8 @@ import net.citizensnpcs.api.npc.NPC; import net.knarcraft.blacksmith.BlacksmithPlugin; import net.knarcraft.blacksmith.config.NPCSettings; import net.knarcraft.blacksmith.manager.EconomyManager; +import net.knarcraft.blacksmith.util.InputParsingHelper; import net.knarcraft.blacksmith.util.ItemHelper; -import org.bukkit.NamespacedKey; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; @@ -57,7 +57,7 @@ public class ReforgeSession implements Runnable { if (enchantments[0] == null) { int i = 0; for (Enchantment enchantment : Enchantment.values()) { - enchantments[i++] = enchantment.getKey().toString(); + enchantments[i++] = enchantment.getKey().getKey(); } } } @@ -140,7 +140,7 @@ public class ReforgeSession implements Runnable { //Find usable enchantments first List usableEnchantments = new ArrayList<>(); for (String enchantmentName : enchantments) { - Enchantment enchantment = Enchantment.getByKey(NamespacedKey.fromString(enchantmentName)); + Enchantment enchantment = InputParsingHelper.matchEnchantment(enchantmentName); if (enchantment != null && enchantment.canEnchantItem(itemToReforge)) { usableEnchantments.add(enchantment); } diff --git a/src/main/java/net/knarcraft/blacksmith/util/InputParsingHelper.java b/src/main/java/net/knarcraft/blacksmith/util/InputParsingHelper.java index cc27bc0..9411146 100644 --- a/src/main/java/net/knarcraft/blacksmith/util/InputParsingHelper.java +++ b/src/main/java/net/knarcraft/blacksmith/util/InputParsingHelper.java @@ -13,6 +13,17 @@ public final class InputParsingHelper { } + /** + * Gets whether the input is an "empty" value treated as null + * + * @param input

The input to check

+ * @return

True if the value is empty

+ */ + public static boolean isEmpty(String input) { + return input == null || input.equalsIgnoreCase("null") || input.equals("\"\"") || + input.trim().isEmpty() || input.equals("-1"); + } + /** * Tries to find the material matching the given input string * diff --git a/src/main/java/net/knarcraft/blacksmith/util/TabCompleteValuesHelper.java b/src/main/java/net/knarcraft/blacksmith/util/TabCompleteValuesHelper.java index 8acee92..82c5c51 100644 --- a/src/main/java/net/knarcraft/blacksmith/util/TabCompleteValuesHelper.java +++ b/src/main/java/net/knarcraft/blacksmith/util/TabCompleteValuesHelper.java @@ -62,7 +62,7 @@ public final class TabCompleteValuesHelper { private static List getAllEnchantments() { List enchantments = new ArrayList<>(); for (Enchantment enchantment : Enchantment.values()) { - enchantments.add(enchantment.toString()); + enchantments.add(enchantment.getKey().getKey()); } return enchantments; }