diff --git a/src/main/java/net/apunch/blacksmith/BlacksmithPlugin.java b/src/main/java/net/apunch/blacksmith/BlacksmithPlugin.java index ef09a3a..5339256 100644 --- a/src/main/java/net/apunch/blacksmith/BlacksmithPlugin.java +++ b/src/main/java/net/apunch/blacksmith/BlacksmithPlugin.java @@ -29,19 +29,32 @@ import java.util.ArrayList; import java.util.Objects; import java.util.logging.Level; +/** + * Blacksmith's main class + */ public class BlacksmithPlugin extends JavaPlugin { private static BlacksmithPlugin instance; private Settings config; private Economy economy; private HyperAPI hyperAPI; - private BukkitConnector bukCon; + private BukkitConnector bukkitConnector; private boolean useHyperAPI = false; + /** + * Gets an instance of the Blacksmith plugin + * + * @return
An instance of the blacksmith plugin
+ */ public static BlacksmithPlugin getInstance() { return instance; } + /** + * Gets settings for the blacksmith plugin + * + * @returnSettings for the blacksmith plugin
+ */ public Settings getSettings() { return config; } @@ -56,33 +69,52 @@ public class BlacksmithPlugin extends JavaPlugin { @Override public void onEnable() { instance = this; + + //Load settings config = new Settings(this); config.load(); - /* Setup Hyperconomy (Soft-Depend only, so this is completely optional!) - Hyperconomy uses your favorite Vault-compatible economy system - and calculates prices for items based on supply and demand on the fly. - This is only used to get the cost of a repair.*/ - if (Bukkit.getPluginManager().getPlugin("HyperConomy") != null) { - getServer().getLogger().log(Level.INFO, "Found HyperConomy! Using that for calculating prices, base-prices and price-per-durability-point in the Blacksmith config.yml will NOT be used!"); - this.useHyperAPI = true; - Plugin hcPlugin = getServer().getPluginManager().getPlugin("HyperConomy"); - bukCon = (BukkitConnector) hcPlugin; - HyperConomy hc = Objects.requireNonNull(bukCon).getHC(); - this.hyperAPI = (HyperAPI) hc.getAPI(); - } + //Load HyperConomy if available + setupHyperConomy(); + getLogger().log(Level.INFO, "Setting Up Vault now...."); - boolean canLoad = SetupVault(); + boolean canLoad = setupVault(); if (!canLoad) { - getLogger().log(Level.INFO, "Vault Failed...."); + getLogger().log(Level.SEVERE, "Vault Integration Failed...."); getServer().getPluginManager().disablePlugin(this); return; } - CitizensAPI.getTraitFactory().registerTrait(net.citizensnpcs.api.trait.TraitInfo.create(BlacksmithTrait.class).withName("blacksmith")); + //Register the blacksmith trait with Citizens + CitizensAPI.getTraitFactory().registerTrait( + net.citizensnpcs.api.trait.TraitInfo.create(BlacksmithTrait.class).withName("blacksmith")); getLogger().log(Level.INFO, " v" + getDescription().getVersion() + " enabled."); } - private boolean SetupVault() { + /** + * Sets up HyperConomy + * + *Setup HyperConomy (Soft-Depend only, so this is completely optional!). HyperConomy uses your favorite + * Vault-compatible economy system and calculates prices for items based on supply and demand on the fly. + * This is only used to get the cost of a repair.
+ */ + private void setupHyperConomy() { + if (Bukkit.getPluginManager().getPlugin("HyperConomy") != null) { + getServer().getLogger().log(Level.INFO, "Found HyperConomy! Using that for calculating prices, " + + "base-prices and price-per-durability-point in the Blacksmith config.yml will NOT be used!"); + this.useHyperAPI = true; + Plugin hyperConomyPlugin = getServer().getPluginManager().getPlugin("HyperConomy"); + bukkitConnector = (BukkitConnector) hyperConomyPlugin; + HyperConomy hyperConomy = Objects.requireNonNull(bukkitConnector).getHC(); + this.hyperAPI = (HyperAPI) hyperConomy.getAPI(); + } + } + + /** + * Sets up Vault for economy + * + * @returnTrue if Vault was successfully set up
+ */ + private boolean setupVault() { // Setup Vault RegisteredServiceProviderThe item to check if is tool or not
+ * @returnTrue if the given item is a type of tool
+ */ public boolean isTool(ItemStack item) { return switch (item.getType()) { case WOODEN_PICKAXE, WOODEN_SHOVEL, WOODEN_HOE, WOODEN_SWORD, WOODEN_AXE, STONE_PICKAXE, STONE_SHOVEL, @@ -115,6 +155,12 @@ public class BlacksmithPlugin extends JavaPlugin { }; } + /** + * Gets whether the given item is a type of armor + * + * @param itemThe item to check if is armor or not
+ * @returnTrue if the given item is a type of armor
+ */ public static boolean isArmor(ItemStack item) { return switch (item.getType()) { case LEATHER_HELMET, LEATHER_CHESTPLATE, LEATHER_LEGGINGS, LEATHER_BOOTS, CHAINMAIL_HELMET, @@ -139,93 +185,124 @@ public class BlacksmithPlugin extends JavaPlugin { economy.withdrawPlayer(player, getCost(player.getInventory().getItemInMainHand(), player)); } - private double getCost(ItemStack item, Player player) { - DataKey root = config.getConfig().getKey(""); - double price = Setting.BASE_PRICE.asDouble(); - if (root.keyExists("base-prices." + item.getType().name().toLowerCase().replace('_', '-'))) { - price = root.getDouble("base-prices." + item.getType().name().toLowerCase().replace('_', '-')); - } - - // Adjust price based on durability and enchantments - if (this.useHyperAPI) { - // If using hyperconomy, price is calculated like so: - // New Item Price + Enchantments Price (from hyperconomy) / maxDurability = price per durability point - // Total price would then be base_price + price per durablity point * current durability - double hyperPrice = 0; - HItemStack hi = hyperAPI.getHyperPlayer(player.getName()).getItemInHand(); - ItemStack item2 = player.getInventory().getItemInMainHand().clone(); - - for (TradeObject enchant : hyperAPI.getEnchantmentHyperObjects(hi, player.getName())) { - hyperPrice = hyperPrice + enchant.getBuyPrice(1); - Enchantment enchantment = Enchantment.getByKey(NamespacedKey.minecraft(enchant.getEnchantment().getEnchantmentName())); - item2.removeEnchantment(Objects.requireNonNull(enchantment)); - } - - ArrayListThe item to get the durability of
* @returnThe durability of the item
*/ - static short getDurability(ItemStack itemStack) { + public static short getDurability(ItemStack itemStack) { Damageable damageable = (Damageable) itemStack.getItemMeta(); return (short) (itemStack.getType().getMaxDurability() - damageable.getDamage()); } + /** + * Gets the damage done to the given item + * + * @param itemStackThe damage done to the item
+ * @returnThe damage done to the item
+ */ + public static short getDamage(ItemStack itemStack) { + Damageable damageable = (Damageable) itemStack.getItemMeta(); + return (short) damageable.getDamage(); + } + + private double getCost(ItemStack item, Player player) { + DataKey root = config.getConfig().getKey(""); + String itemName = item.getType().name().toLowerCase().replace('_', '-'); + double price; + if (root.keyExists("base-prices." + itemName)) { + price = root.getDouble("base-prices." + itemName); + } else { + price = Setting.BASE_PRICE.asDouble(); + } + + // Adjust price based on durability and enchantments + if (this.useHyperAPI) { + return getHyperAPICost(player, item, root, price); + } else { + double pricePerDurabilityPoint; + if (root.keyExists("price-per-durability-point." + itemName)) { + pricePerDurabilityPoint = root.getDouble("price-per-durability-point." + itemName); + } else { + pricePerDurabilityPoint = Setting.PRICE_PER_DURABILITY_POINT.asDouble(); + } + if (config.getNaturalCost()) { + //Cost increases with damage + price += ((double) getDamage(item)) * pricePerDurabilityPoint; + } else { + //Cost decreases with damage + price += ((double) getDurability(item)) * pricePerDurabilityPoint; + } + } + + //Add the enchantment modifier for each enchantment on the item + double enchantmentModifier = Setting.ENCHANTMENT_MODIFIER.asDouble(); + for (Enchantment enchantment : item.getEnchantments().keySet()) { + String enchantmentKey = "enchantment-modifiers." + + enchantment.getKey().asString().toLowerCase().replace('_', '-'); + if (root.keyExists(enchantmentKey)) { + price += root.getDouble(enchantmentKey) * item.getEnchantmentLevel(enchantment); + } else { + price += enchantmentModifier * item.getEnchantmentLevel(enchantment); + } + } + return price; + } + + private double getHyperAPICost(Player player, ItemStack item, DataKey root, double price) { + // If using hyperConomy, price is calculated like so: + // New Item Price + Enchantments Price (from hyperConomy) / maxDurability = price per durability point + // Total price would then be base_price + price per durability point * current durability + double hyperPrice = 0; + HItemStack hi = hyperAPI.getHyperPlayer(player.getName()).getItemInHand(); + ItemStack item2 = player.getInventory().getItemInMainHand().clone(); + + for (TradeObject enchant : hyperAPI.getEnchantmentHyperObjects(hi, player.getName())) { + hyperPrice = hyperPrice + enchant.getBuyPrice(1); + Enchantment enchantment = Enchantment.getByKey( + NamespacedKey.minecraft(enchant.getEnchantment().getEnchantmentName())); + item2.removeEnchantment(Objects.requireNonNull(enchantment)); + } + + ArrayListThe full config path for this setting
+ * @param valueThe default value of this setting
+ */ Setting(String path, Object value) { this.path = path; this.value = value; + String[] pathParts = path.split("\\."); + this.childPath = String.join(".", Arrays.copyOfRange(pathParts, 1, pathParts.length)); } + /** + * Gets the full config path for this setting + * + * @returnThe full config path for this setting
+ */ public String getPath() { return path; } - public boolean asBoolean() { - return (Boolean) value; + /** + * Gets the config path without the root node + * + * @returnThe config path without the root node
+ */ + public String getChildPath() { + return childPath; } + /** + * Gets this setting as a boolean + * + *This will throw an exception if used for a non-boolean value
+ * + * @returnThis setting as a boolean
+ */ + public boolean asBoolean() { + if (value instanceof String) { + return Boolean.parseBoolean((String) value); + } else { + return (Boolean) value; + } + } + + /** + * Gets this setting as a double + * + *This will throw an exception if used for a non-double setting
+ * + * @returnThis setting as a double
+ */ public double asDouble() { if (value instanceof String) { return Double.parseDouble((String) value); + } else if (value instanceof Integer) { + return (Integer) value; + } else { + return (Double) value; } - if (value instanceof Integer) { + } + + /** + * Gets this setting as an integer + * + *This will throw an exception if used for a non-integer setting
+ * + * @returnThis setting as an integer
+ */ + public int asInt() { + if (value instanceof String) { + return Integer.parseInt((String) value); + } else { return (Integer) value; } - return (Double) value; - } - - public int asInt() { - return (Integer) value; } + /** + * Gets this setting as a string + * + * @returnThis setting as a string
+ */ public String asString() { return value.toString(); } + /** + * Gets the value of this setting + * + * @returnThe value of this setting
+ */ Object get() { return value; } + /** + * Sets the value of this setting + * + * @param valueThe new value of this setting
+ */ void set(Object value) { this.value = value; } + } diff --git a/src/main/java/net/apunch/blacksmith/util/Settings.java b/src/main/java/net/apunch/blacksmith/util/Settings.java index 96fe758..daee2c5 100644 --- a/src/main/java/net/apunch/blacksmith/util/Settings.java +++ b/src/main/java/net/apunch/blacksmith/util/Settings.java @@ -6,6 +6,9 @@ import net.citizensnpcs.api.util.YamlStorage; import java.io.File; +/** + * A class which keeps track of all Blacksmith settings/config values + */ public class Settings { private String busyWithPlayerMessage = Setting.BUSY_WITH_PLAYER_MESSAGE.asString(); @@ -27,187 +30,328 @@ public class Settings { private boolean dropItem = Setting.DROP_ITEM.asBoolean(); private boolean disableCoolDown = Setting.DISABLE_COOL_DOWN.asBoolean(); private boolean disableDelay = Setting.DISABLE_DELAY.asBoolean(); + private boolean naturalCost = Setting.NATURAL_COST.asBoolean(); private final YamlStorage config; + /** + * Instantiates a new "Settings" + * + * @param pluginA reference to the blacksmith plugin
+ */ public Settings(BlacksmithPlugin plugin) { - config = new YamlStorage(new File(plugin.getDataFolder() + File.separator + "config.yml"), "Blacksmith Configuration"); + config = new YamlStorage(new File(plugin.getDataFolder() + File.separator + "config.yml"), + "Blacksmith Configuration\nWarning: The values under defaults are the values set for a blacksmith" + + "upon creation. To change any values for existing NPCs, edit the citizens NPC file."); } + /** + * Loads all configuration values from the config file + */ public void load() { + //Load the config from disk config.load(); DataKey root = config.getKey(""); for (Setting setting : Setting.values()) { if (!root.keyExists(setting.getPath())) { + //If the setting does not exist in the config file, add it root.setRaw(setting.getPath(), setting.get()); } else { + //Set the setting to the value found in the path setting.set(root.getRaw(setting.getPath())); } } - + //Save any modified values to disk config.save(); } + /** + * Gets the configuration used for saving/loading from disk + * + * @returnThe configuration
+ */ public YamlStorage getConfig() { return config; } + /** + * Loads variables from the given data key + * + * @param keyThe data key to load variables from
+ */ public void loadVariables(DataKey key) { // Override defaults if they exist - if (key.keyExists("messages.busy-with-player")) { - busyWithPlayerMessage = key.getString("messages.busy-with-player"); + if (key.keyExists(Setting.BUSY_WITH_PLAYER_MESSAGE.getChildPath())) { + busyWithPlayerMessage = key.getString(Setting.BUSY_WITH_PLAYER_MESSAGE.getChildPath()); } - if (key.keyExists("messages.busy-with-reforge")) { - busyReforgingMessage = key.getString("messages.busy-with-reforge"); + if (key.keyExists(Setting.BUSY_WITH_REFORGE_MESSAGE.getChildPath())) { + busyReforgingMessage = key.getString(Setting.BUSY_WITH_REFORGE_MESSAGE.getChildPath()); } - if (key.keyExists("messages.cost")) { - costMessage = key.getString("messages.cost"); + if (key.keyExists(Setting.COST_MESSAGE.getChildPath())) { + costMessage = key.getString(Setting.COST_MESSAGE.getChildPath()); } - if (key.keyExists("messages.invalid-item")) { - invalidItemMessage = key.getString("messages.invalid-item"); + if (key.keyExists(Setting.INVALID_ITEM_MESSAGE.getChildPath())) { + invalidItemMessage = key.getString(Setting.INVALID_ITEM_MESSAGE.getChildPath()); } - if (key.keyExists("messages.start-reforge")) { - startReforgeMessage = key.getString("messages.start-reforge"); + if (key.keyExists(Setting.START_REFORGE_MESSAGE.getChildPath())) { + startReforgeMessage = key.getString(Setting.START_REFORGE_MESSAGE.getChildPath()); } - if (key.keyExists("messages.successful-reforge")) { - successMessage = key.getString("messages.successful-reforge"); + if (key.keyExists(Setting.SUCCESS_MESSAGE.getChildPath())) { + successMessage = key.getString(Setting.SUCCESS_MESSAGE.getChildPath()); } - if (key.keyExists("messages.fail-reforge")) { - failMessage = key.getString("messages.fail-reforge"); + if (key.keyExists(Setting.FAIL_MESSAGE.getChildPath())) { + failMessage = key.getString(Setting.FAIL_MESSAGE.getChildPath()); } - if (key.keyExists("messages.insufficient-funds")) { - insufficientFundsMessage = key.getString("messages.insufficient-funds"); + if (key.keyExists(Setting.INSUFFICIENT_FUNDS_MESSAGE.getChildPath())) { + insufficientFundsMessage = key.getString(Setting.INSUFFICIENT_FUNDS_MESSAGE.getChildPath()); } - if (key.keyExists("messages.cooldown-not-expired")) { - coolDownUnexpiredMessage = key.getString("messages.cooldown-not-expired"); + if (key.keyExists(Setting.COOL_DOWN_UNEXPIRED_MESSAGE.getChildPath())) { + coolDownUnexpiredMessage = key.getString(Setting.COOL_DOWN_UNEXPIRED_MESSAGE.getChildPath()); } - if (key.keyExists("messages.item-changed-during-reforge")) { - itemChangedMessage = key.getString("messages.item-changed-during-reforge"); + if (key.keyExists(Setting.ITEM_UNEXPECTEDLY_CHANGED_MESSAGE.getChildPath())) { + itemChangedMessage = key.getString(Setting.ITEM_UNEXPECTEDLY_CHANGED_MESSAGE.getChildPath()); } - if (key.keyExists("delays-in-seconds.minimum")) { - minReforgeDelay = key.getInt("delays-in-seconds.minimum"); + if (key.keyExists(Setting.MIN_REFORGE_DELAY.getChildPath())) { + minReforgeDelay = key.getInt(Setting.MIN_REFORGE_DELAY.getChildPath()); } - if (key.keyExists("delays-in-seconds.maximum")) { - maxReforgeDelay = key.getInt("delays-in-seconds.maximum"); + if (key.keyExists(Setting.MAX_REFORGE_DELAY.getChildPath())) { + maxReforgeDelay = key.getInt(Setting.MAX_REFORGE_DELAY.getChildPath()); } - if (key.keyExists("delays-in-seconds.reforge-cooldown")) { - reforgeCoolDown = key.getInt("delays-in-seconds.reforge-cooldown"); + if (key.keyExists(Setting.REFORGE_COOL_DOWN.getChildPath())) { + reforgeCoolDown = key.getInt(Setting.REFORGE_COOL_DOWN.getChildPath()); } - if (key.keyExists("percent-chance-to-fail-reforge")) { - failChance = key.getInt("percent-chance-to-fail-reforge"); + if (key.keyExists(Setting.FAIL_CHANCE.getChildPath())) { + failChance = key.getInt(Setting.FAIL_CHANCE.getChildPath()); } - if (key.keyExists("maximum-enchantments")) { - maxEnchantments = key.getInt("maximum-enchantments"); + if (key.keyExists(Setting.MAX_ENCHANTMENTS.getChildPath())) { + maxEnchantments = key.getInt(Setting.MAX_ENCHANTMENTS.getChildPath()); } - if (key.keyExists("extra-enchantments-chance")) { - extraEnchantmentChance = key.getInt("extra-enchantment-chance"); + if (key.keyExists(Setting.EXTRA_ENCHANTMENT_CHANCE.getChildPath())) { + extraEnchantmentChance = key.getInt(Setting.EXTRA_ENCHANTMENT_CHANCE.getChildPath()); } - if (key.keyExists("dropitem")) { - dropItem = key.getBoolean("dropitem"); + if (key.keyExists(Setting.DROP_ITEM.getChildPath())) { + dropItem = key.getBoolean(Setting.DROP_ITEM.getChildPath()); } - if (key.keyExists("disable-cooldown")) { - disableCoolDown = key.getBoolean("disable-cooldown"); + if (key.keyExists(Setting.DISABLE_COOL_DOWN.getChildPath())) { + disableCoolDown = key.getBoolean(Setting.DISABLE_COOL_DOWN.getChildPath()); } - if (key.keyExists("disable-delay")) { - disableDelay = key.getBoolean("disable-delay"); + if (key.keyExists(Setting.DISABLE_DELAY.getChildPath())) { + disableDelay = key.getBoolean(Setting.DISABLE_DELAY.getChildPath()); + } + if (key.keyExists(Setting.NATURAL_COST.getChildPath())) { + naturalCost = key.getBoolean(Setting.NATURAL_COST.getChildPath()); } } + /** + * Saves variables to the given data key + * + * @param keyThe data key to save variables to
+ */ public void saveVariables(DataKey key) { - key.setString("messages.busy-with-player", getBusyWithPlayerMessage()); - key.setString("messages.busy-with-reforge", getBusyReforgingMessage()); - key.setString("messages.cost", getCostMessage()); - key.setString("messages.invalid-item", getInvalidItemMessage()); - key.setString("messages.start-reforge", getStartReforgeMessage()); - key.setString("messages.successful-reforge", getSuccessMessage()); - key.setString("messages.fail-reforge", getFailMessage()); - key.setString("messages.insufficient-funds", getInsufficientFundsMessage()); - key.setString("messages.cooldown-not-expired", getCoolDownUnexpiredMessage()); - key.setString("messages.item-changed-during-reforge", getItemChangedMessage()); - key.setInt("delays-in-seconds.minimum", getMinReforgeDelay()); - key.setInt("delays-in-seconds.maximum", getMaxReforgeDelay()); - key.setInt("delays-in-seconds.reforge-cooldown", getReforgeCoolDown()); - key.setInt("percent-chance-to-fail-reforge", getFailChance()); - key.setInt("percent-chance-for-extra-enchantment", getExtraEnchantmentChance()); - key.setInt("maximum-enchantments", getMaxEnchantments()); - key.setBoolean("drop-item", getDropItem()); - key.setBoolean("disable-delay", getDisableDelay()); - key.setBoolean("disable-cooldown", getDisableCoolDown()); + //This saves variables to the specific NPC. + key.setString(Setting.BUSY_WITH_PLAYER_MESSAGE.getChildPath(), getBusyWithPlayerMessage()); + key.setString(Setting.BUSY_WITH_REFORGE_MESSAGE.getChildPath(), getBusyReforgingMessage()); + key.setString(Setting.COST_MESSAGE.getChildPath(), getCostMessage()); + key.setString(Setting.INVALID_ITEM_MESSAGE.getChildPath(), getInvalidItemMessage()); + key.setString(Setting.START_REFORGE_MESSAGE.getChildPath(), getStartReforgeMessage()); + key.setString(Setting.SUCCESS_MESSAGE.getChildPath(), getSuccessMessage()); + key.setString(Setting.FAIL_MESSAGE.getChildPath(), getFailMessage()); + key.setString(Setting.INSUFFICIENT_FUNDS_MESSAGE.getChildPath(), getInsufficientFundsMessage()); + key.setString(Setting.COOL_DOWN_UNEXPIRED_MESSAGE.getChildPath(), getCoolDownUnexpiredMessage()); + key.setString(Setting.ITEM_UNEXPECTEDLY_CHANGED_MESSAGE.getChildPath(), getItemChangedMessage()); + key.setInt(Setting.MIN_REFORGE_DELAY.getChildPath(), getMinReforgeDelay()); + key.setInt(Setting.MAX_REFORGE_DELAY.getChildPath(), getMaxReforgeDelay()); + key.setInt(Setting.REFORGE_COOL_DOWN.getChildPath(), getReforgeCoolDown()); + key.setInt(Setting.FAIL_CHANCE.getChildPath(), getFailChance()); + key.setInt(Setting.EXTRA_ENCHANTMENT_CHANCE.getChildPath(), getExtraEnchantmentChance()); + key.setInt(Setting.MAX_ENCHANTMENTS.getChildPath(), getMaxEnchantments()); + key.setBoolean(Setting.DROP_ITEM.getChildPath(), getDropItem()); + key.setBoolean(Setting.DISABLE_DELAY.getChildPath(), getDisableDelay()); + key.setBoolean(Setting.DISABLE_COOL_DOWN.getChildPath(), getDisableCoolDown()); + key.setBoolean(Setting.DISABLE_COOL_DOWN.getChildPath(), getDisableCoolDown()); + key.setBoolean(Setting.NATURAL_COST.getChildPath(), getNaturalCost()); } + /** + * Gets the message to display when the blacksmith is busy with another player + * + * @returnThe busy with player message
+ */ public String getBusyWithPlayerMessage() { return busyWithPlayerMessage; } + /** + * Gets the message to display when the blacksmith is busy with reforging an item + * + * @returnThe busy reforging message
+ */ public String getBusyReforgingMessage() { return busyReforgingMessage; } + /** + * Gets the message to use for displaying an item's cost + * + * @returnThe message to use for displaying item cost
+ */ public String getCostMessage() { return costMessage; } + /** + * Gets the message to display when a blacksmith has been given an invalid item + * + * @returnThe invalid item message
+ */ public String getInvalidItemMessage() { return invalidItemMessage; } + /** + * Gets the message to display when a blacksmith starts reforging an item + * + * @returnThe start reforge message
+ */ public String getStartReforgeMessage() { return startReforgeMessage; } + /** + * Gets the message to display when a blacksmith has successfully repaired an item + * + * @returnThe reforge success message
+ */ public String getSuccessMessage() { return successMessage; } + /** + * Gets the message to display when a blacksmith has failed to repair an item + * + * @returnThe reforge fail message
+ */ public String getFailMessage() { return failMessage; } + /** + * Gets the message to display when a player cannot afford re-forging an item + * + * @returnThe insufficient funds message
+ */ public String getInsufficientFundsMessage() { return insufficientFundsMessage; } + /** + * Gets the message to display when a blacksmith is still affected by a cool-down + * + * @returnThe cool down unexpired message
+ */ public String getCoolDownUnexpiredMessage() { return coolDownUnexpiredMessage; } + /** + * Gets the message to display when a player has changed the item they're trying to reforge + * + * @returnThe item changed message
+ */ public String getItemChangedMessage() { return itemChangedMessage; } + /** + * Gets the minimum delay used to wait for a re-forge to finish. + * + * @returnThe minimum reforge delay
+ */ public int getMinReforgeDelay() { return minReforgeDelay; } + /** + * Gets the maximum delay used to wait for a re-forge to finish + * + * @returnThe maximum reforge delay
+ */ public int getMaxReforgeDelay() { return maxReforgeDelay; } + /** + * Gets the cool-down between each reforge + * + * @returnThe reforge cool-down
+ */ public int getReforgeCoolDown() { return reforgeCoolDown; } + /** + * Gets the chance to fail a re-forge + * + * @returnThe fail chance
+ */ public int getFailChance() { return failChance; } + /** + * Gets the chance for adding an extra enchantment to an item + * + * @returnThe extra enchantment chance
+ */ public int getExtraEnchantmentChance() { return extraEnchantmentChance; } + /** + * Gets the max number of enchantment to add to an item + * + * @returnThe maximum enchantments
+ */ public int getMaxEnchantments() { return maxEnchantments; } + /** + * Gets whether an item should be dropped on the ground instead of being given to the player + * + * @returnWhether to drop reforged items on the ground
+ */ public boolean getDropItem() { return dropItem; } + /** + * Gets whether to disable the reforge-cool-down + * + * @returnWhether to disable the reforge-cool-down
+ */ public boolean getDisableCoolDown() { return disableCoolDown; } + /** + * Gets whether to disable the delay between starting reforging and the re-forge finishing + * + * @returnWhether to disable the reforge delay
+ */ public boolean getDisableDelay() { return disableDelay; } + /** + * Gets whether to use a natural cost calculation + * + *The natural cost makes repairs more expensive the more damaged an item is, rather than the opposite.
+ * + * @returnWhether to use a natural cost calculation
+ */ + public boolean getNaturalCost() { + return naturalCost; + } + } \ No newline at end of file