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
This commit is contained in:
		| @@ -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; | ||||
|   | ||||
| @@ -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: <setting> [new value/material or enchantment] [] | ||||
|  | ||||
|         if (args.length == 1) { | ||||
|             List<String> 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 <p>The global setting to get tab-completions for</p> | ||||
|      * @param args          <p>The arguments given by the user</p> | ||||
|      * @return <p>The tab-completions to show to the user</p> | ||||
|      */ | ||||
|     private List<String> 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 | ||||
|      * | ||||
|   | ||||
| @@ -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)); | ||||
|   | ||||
| @@ -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 <p>The new enchantment cost</p> | ||||
|      */ | ||||
|     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 <p>The new price per durability point price</p> | ||||
|      */ | ||||
|     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 <p>The new base price</p> | ||||
|      */ | ||||
|     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<String, String> 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 | ||||
|   | ||||
| @@ -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 { | ||||
|   | ||||
| @@ -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<Enchantment> 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); | ||||
|             } | ||||
|   | ||||
| @@ -13,6 +13,17 @@ public final class InputParsingHelper { | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Gets whether the input is an "empty" value treated as null | ||||
|      * | ||||
|      * @param input <p>The input to check</p> | ||||
|      * @return <p>True if the value is empty</p> | ||||
|      */ | ||||
|     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 | ||||
|      * | ||||
|   | ||||
| @@ -62,7 +62,7 @@ public final class TabCompleteValuesHelper { | ||||
|     private static List<String> getAllEnchantments() { | ||||
|         List<String> enchantments = new ArrayList<>(); | ||||
|         for (Enchantment enchantment : Enchantment.values()) { | ||||
|             enchantments.add(enchantment.toString()); | ||||
|             enchantments.add(enchantment.getKey().getKey()); | ||||
|         } | ||||
|         return enchantments; | ||||
|     } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user