Implements material wildcards for costs #14
All checks were successful
EpicKnarvik97/Blacksmith/pipeline/head This commit looks good
All checks were successful
EpicKnarvik97/Blacksmith/pipeline/head This commit looks good
This commit is contained in:
@ -5,6 +5,7 @@ import net.citizensnpcs.api.util.YamlStorage;
|
||||
import net.knarcraft.blacksmith.BlacksmithPlugin;
|
||||
import net.knarcraft.blacksmith.util.ConfigHelper;
|
||||
import net.knarcraft.blacksmith.util.InputParsingHelper;
|
||||
import net.knarcraft.blacksmith.util.ItemHelper;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.enchantments.Enchantment;
|
||||
|
||||
@ -307,48 +308,98 @@ public class GlobalSettings {
|
||||
}
|
||||
|
||||
//Load all base prices
|
||||
DataKey basePriceNode = root.getRelative(GlobalSetting.BASE_PRICE.getParent());
|
||||
Map<String, String> relevantKeys = getRelevantKeys(basePriceNode);
|
||||
for (String key : relevantKeys.keySet()) {
|
||||
String materialName = relevantKeys.get(key);
|
||||
Material material = InputParsingHelper.matchMaterial(materialName);
|
||||
if (material != null) {
|
||||
materialBasePrices.put(material, basePriceNode.getDouble(key));
|
||||
} else {
|
||||
BlacksmithPlugin.getInstance().getLogger().log(Level.WARNING,
|
||||
"Unable to find a material matching " + materialName);
|
||||
}
|
||||
}
|
||||
loadBasePrices(root);
|
||||
|
||||
//Load all per-durability-point prices
|
||||
DataKey basePerDurabilityPriceNode = root.getRelative(GlobalSetting.PRICE_PER_DURABILITY_POINT.getParent());
|
||||
relevantKeys = getRelevantKeys(basePerDurabilityPriceNode);
|
||||
for (String key : relevantKeys.keySet()) {
|
||||
String materialName = relevantKeys.get(key);
|
||||
Material material = InputParsingHelper.matchMaterial(materialName);
|
||||
if (material != null) {
|
||||
materialPricePerDurabilityPoints.put(material, basePerDurabilityPriceNode.getDouble(key));
|
||||
} else {
|
||||
BlacksmithPlugin.getInstance().getLogger().log(Level.WARNING,
|
||||
"Unable to find a material matching " + materialName);
|
||||
}
|
||||
}
|
||||
loadPricesPerDurabilityPoint(root);
|
||||
|
||||
//Load all enchantment prices
|
||||
DataKey enchantmentCostNode = root.getRelative(GlobalSetting.ENCHANTMENT_COST.getParent());
|
||||
relevantKeys = getRelevantKeys(basePerDurabilityPriceNode);
|
||||
Map<String, String> relevantKeys = getRelevantKeys(enchantmentCostNode);
|
||||
for (String key : relevantKeys.keySet()) {
|
||||
String enchantmentName = relevantKeys.get(key);
|
||||
Enchantment enchantment = InputParsingHelper.matchEnchantment(enchantmentName);
|
||||
if (enchantment != null) {
|
||||
enchantmentCosts.put(enchantment, enchantmentCostNode.getDouble(key));
|
||||
setItemPrice(enchantmentCosts, enchantmentName, enchantment, enchantmentCostNode.getDouble(key));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads all prices per durability point for all materials
|
||||
*
|
||||
* @param root <p>The configuration root node to search from</p>
|
||||
*/
|
||||
private void loadPricesPerDurabilityPoint(DataKey root) {
|
||||
DataKey basePerDurabilityPriceNode = root.getRelative(GlobalSetting.PRICE_PER_DURABILITY_POINT.getParent());
|
||||
Map<String, String> relevantKeys = getRelevantKeys(basePerDurabilityPriceNode);
|
||||
|
||||
for (String key : relevantKeys.keySet()) {
|
||||
String materialName = relevantKeys.get(key);
|
||||
double price = basePerDurabilityPriceNode.getDouble(key);
|
||||
if (materialName.contains("*")) {
|
||||
//Treat *CHESTPLATE as a regular expression to match all chest-plates
|
||||
setMatchedMaterialPrices(materialPricePerDurabilityPoints, materialName, price);
|
||||
} else {
|
||||
BlacksmithPlugin.getInstance().getLogger().log(Level.WARNING,
|
||||
"Unable to find an enchantment matching " + enchantmentName);
|
||||
Material material = InputParsingHelper.matchMaterial(materialName);
|
||||
setItemPrice(materialPricePerDurabilityPoints, materialName, material, price);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads base prices for all materials
|
||||
*
|
||||
* @param root <p>The configuration root node to search from</p>
|
||||
*/
|
||||
private void loadBasePrices(DataKey root) {
|
||||
DataKey basePriceNode = root.getRelative(GlobalSetting.BASE_PRICE.getParent());
|
||||
Map<String, String> relevantKeys = getRelevantKeys(basePriceNode);
|
||||
|
||||
for (String key : relevantKeys.keySet()) {
|
||||
String materialName = relevantKeys.get(key);
|
||||
double price = basePriceNode.getDouble(key);
|
||||
if (materialName.contains("*")) {
|
||||
//Treat *CHESTPLATE as a regular expression to match all chest-plates
|
||||
setMatchedMaterialPrices(materialBasePrices, materialName, price);
|
||||
} else {
|
||||
Material material = InputParsingHelper.matchMaterial(materialName);
|
||||
setItemPrice(materialBasePrices, materialName, material, price);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the price for any materials matching the given wildcard material name
|
||||
*
|
||||
* @param prices <p>The map to store the prices in</p>
|
||||
* @param materialName <p>The material name to match</p>
|
||||
* @param price <p>The price to set for the matched materials</p>
|
||||
*/
|
||||
private void setMatchedMaterialPrices(Map<Material, Double> prices, String materialName, double price) {
|
||||
String search = InputParsingHelper.regExIfy(materialName);
|
||||
for (Material material : ItemHelper.getAllReforgeAbleMaterials()) {
|
||||
if (material.name().matches(search)) {
|
||||
setItemPrice(prices, material.name(), material, price);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the price for the given material
|
||||
*
|
||||
* @param prices <p>The map to store the price in</p>
|
||||
* @param itemName <p>The name of the material to add a price for</p>
|
||||
* @param item <p>The material parsed from the name</p>
|
||||
* @param price <p>The price to set</p>
|
||||
*/
|
||||
private <K> void setItemPrice(Map<K, Double> prices, String itemName, K item, double price) {
|
||||
if (item != null) {
|
||||
prices.put(item, price);
|
||||
} else {
|
||||
BlacksmithPlugin.getInstance().getLogger().log(Level.WARNING,
|
||||
"Unable to find a material/enchantment matching " + itemName);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a map between relevant keys and their normalized name
|
||||
*
|
||||
|
Reference in New Issue
Block a user