diff --git a/pom.xml b/pom.xml index 0bf5588..a473b3a 100644 --- a/pom.xml +++ b/pom.xml @@ -6,14 +6,13 @@ net.apunch blacksmith - 1.16-SNAPSHOT + 1.18.1-SNAPSHOT Blacksmith Blacksmith Character for the CitizensAPI UTF-8 - 1.15.2-R0.1-SNAPSHOT 2.0.26-SNAPSHOT 1.7.3 0.975.7-SNAPSHOT @@ -26,18 +25,18 @@ papermc-repo https://papermc.io/repo/repository/maven-public/ - + spigot-repo https://hub.spigotmc.org/nexus/content/repositories/snapshots/ - - - citizens-repo - http://repo.citizensnpcs.co/ - - - vault-repo - http://nexus.hc.to/content/repositories/pub_releases - + + + citizens-repo + http://repo.citizensnpcs.co/ + + + vault-repo + http://nexus.hc.to/content/repositories/pub_releases + @@ -58,28 +57,22 @@ org.spigotmc spigot-api - 1.16.5-R0.1-SNAPSHOT + 1.18.1-R0.1-SNAPSHOT provided - - org.bukkit - bukkit - ${bukkit.version} - provided - net.milkbowl.vault Vault ${vault.version} provided - - regalowl.hyperconomy - hyperconomy - ${hyperconomy.version} + + regalowl.hyperconomy + hyperconomy + ${hyperconomy.version} system ${project.basedir}/lib/HyperConomy.jar - + @@ -100,8 +93,8 @@ maven-compiler-plugin 3.7.0 - 1.6 - 1.6 + 17 + 17 diff --git a/src/main/java/net/apunch/blacksmith/BlacksmithPlugin.java b/src/main/java/net/apunch/blacksmith/BlacksmithPlugin.java index 84f9c4e..1dcf952 100644 --- a/src/main/java/net/apunch/blacksmith/BlacksmithPlugin.java +++ b/src/main/java/net/apunch/blacksmith/BlacksmithPlugin.java @@ -1,296 +1,199 @@ package net.apunch.blacksmith; -import java.util.ArrayList; -import java.util.logging.Level; - import net.apunch.blacksmith.util.Settings; import net.apunch.blacksmith.util.Settings.Setting; - import net.citizensnpcs.api.CitizensAPI; -import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.util.DataKey; - import net.milkbowl.vault.economy.Economy; - import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Material; -import org.bukkit.OfflinePlayer; +import org.bukkit.NamespacedKey; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.Damageable; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.RegisteredServiceProvider; import org.bukkit.plugin.java.JavaPlugin; - +import org.jetbrains.annotations.NotNull; import regalowl.hyperconomy.HyperAPI; import regalowl.hyperconomy.HyperConomy; import regalowl.hyperconomy.bukkit.BukkitConnector; import regalowl.hyperconomy.inventory.HItemStack; import regalowl.hyperconomy.tradeobject.TradeObject; +import java.util.ArrayList; +import java.util.Objects; +import java.util.logging.Level; + public class BlacksmithPlugin extends JavaPlugin { - public BlacksmithPlugin plugin; - private Settings config; - private Economy economy; - private HyperAPI hyperAPI; - private BukkitConnector bukCon; - private boolean useHyperAPI = false; - //private boolean hasCititrader = false; // CitiTrader dependency outdated and broken + private Settings config; + private Economy economy; + private HyperAPI hyperAPI; + private BukkitConnector bukCon; + private boolean useHyperAPI = false; - @Override - public void onDisable() { - // config.save(); + @Override + public void onDisable() { + // config.save(); - getLogger().log(Level.INFO, " v" + getDescription().getVersion() + " disabled."); - } + getLogger().log(Level.INFO, " v" + getDescription().getVersion() + " disabled."); + } - @Override - public void onEnable() { - 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 = bukCon.getHC(); - this.hyperAPI = (HyperAPI) hc.getAPI(); - } - getLogger().log(Level.INFO, "Setting Up Vault now...."); - /* CitiTrader dependency outdated and broken - // Check for Cititrader - if(getServer().getPluginManager().getPlugin("CitiTrader") != null) { - hasCititrader = true; - } - */ - - boolean canload = SetupVault(); - if (!canload) - { - getLogger().log(Level.INFO, "Vault Failed...."); - getServer().getPluginManager().disablePlugin(this); - return; - } - CitizensAPI.getTraitFactory().registerTrait(net.citizensnpcs.api.trait.TraitInfo.create(BlacksmithTrait.class).withName("blacksmith")); + @Override + public void onEnable() { + 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(); + } + getLogger().log(Level.INFO, "Setting Up Vault now...."); + boolean canLoad = SetupVault(); + if (!canLoad) { + getLogger().log(Level.INFO, "Vault Failed...."); + getServer().getPluginManager().disablePlugin(this); + return; + } + CitizensAPI.getTraitFactory().registerTrait(net.citizensnpcs.api.trait.TraitInfo.create(BlacksmithTrait.class).withName("blacksmith")); - - getLogger().log(Level.INFO, " v" + getDescription().getVersion() + " enabled."); - } + getLogger().log(Level.INFO, " v" + getDescription().getVersion() + " enabled."); + } private boolean SetupVault() { - // Setup Vault - RegisteredServiceProvider economyProvider = getServer().getServicesManager().getRegistration( - Economy.class); - if (economyProvider != null) - { - economy = economyProvider.getProvider(); - return true; - } - else { - // Disable if no economy plugin was found - getServer().getLogger().log(Level.SEVERE, "Failed to load an economy plugin. Disabling..."); - return false; - } - } + // Setup Vault + RegisteredServiceProvider economyProvider = getServer().getServicesManager().getRegistration( + Economy.class); + if (economyProvider != null) { + economy = economyProvider.getProvider(); + return true; + } else { + // Disable if no economy plugin was found + getServer().getLogger().log(Level.SEVERE, "Failed to load an economy plugin. Disabling..."); + return false; + } + } - @Override - public boolean onCommand(final CommandSender sender, final Command command, final String label, final String[] args) { + @Override + public boolean onCommand(final CommandSender sender, final @NotNull Command command, final @NotNull String label, final String[] args) { config.load(); sender.sendMessage(ChatColor.GREEN + "Blacksmith config reloaded!"); return true; } - /* CitiTrader dependency outdated and broken - // Return if we have cititrader - public boolean hasCititrader() { - return this.hasCititrader; - } - */ - - public BlacksmithTrait getBlacksmith(NPC npc){ + public boolean isTool(ItemStack item) { + return switch (item.getType()) { + case WOODEN_PICKAXE, WOODEN_SHOVEL, WOODEN_HOE, WOODEN_SWORD, WOODEN_AXE, STONE_PICKAXE, STONE_SHOVEL, STONE_HOE, STONE_SWORD, STONE_AXE, GOLDEN_PICKAXE, GOLDEN_SHOVEL, GOLDEN_HOE, GOLDEN_SWORD, GOLDEN_AXE, IRON_PICKAXE, IRON_SHOVEL, IRON_HOE, IRON_SWORD, IRON_AXE, DIAMOND_PICKAXE, DIAMOND_SHOVEL, DIAMOND_HOE, DIAMOND_SWORD, DIAMOND_AXE, NETHERITE_SWORD, NETHERITE_SHOVEL, NETHERITE_PICKAXE, NETHERITE_AXE, NETHERITE_HOE, BOW, FLINT_AND_STEEL, FISHING_ROD, SHEARS -> true; + default -> false; + }; + } - if (npc !=null && npc.hasTrait(BlacksmithTrait.class)){ - return npc.getTrait(BlacksmithTrait.class); - } + public boolean isArmor(ItemStack item) { + return switch (item.getType()) { + case LEATHER_HELMET, LEATHER_CHESTPLATE, LEATHER_LEGGINGS, LEATHER_BOOTS, CHAINMAIL_HELMET, CHAINMAIL_CHESTPLATE, CHAINMAIL_LEGGINGS, CHAINMAIL_BOOTS, GOLDEN_HELMET, GOLDEN_CHESTPLATE, GOLDEN_LEGGINGS, GOLDEN_BOOTS, IRON_HELMET, IRON_CHESTPLATE, IRON_LEGGINGS, IRON_BOOTS, DIAMOND_HELMET, DIAMOND_CHESTPLATE, DIAMOND_LEGGINGS, DIAMOND_BOOTS, NETHERITE_HELMET, NETHERITE_CHESTPLATE, NETHERITE_LEGGINGS, NETHERITE_BOOTS -> true; + default -> false; + }; + } - return null; - } + public boolean doesPlayerHaveEnough(Player player) { + return economy.getBalance(player) - getCost(player.getInventory().getItemInMainHand(), player) >= 0; + } + public String formatCost(Player player) { + double cost = getCost(player.getInventory().getItemInMainHand(), player); + return economy.format(cost); + } - public boolean isTool(ItemStack item) { - switch (item.getType()) { - case WOODEN_PICKAXE: - case WOODEN_SHOVEL: - case WOODEN_HOE: - case WOODEN_SWORD: - case WOODEN_AXE: - case STONE_PICKAXE: - case STONE_SHOVEL: - case STONE_HOE: - case STONE_SWORD: - case STONE_AXE: - case GOLDEN_PICKAXE: - case GOLDEN_SHOVEL: - case GOLDEN_HOE: - case GOLDEN_SWORD: - case GOLDEN_AXE: - case IRON_PICKAXE: - case IRON_SHOVEL: - case IRON_HOE: - case IRON_SWORD: - case IRON_AXE: - case DIAMOND_PICKAXE: - case DIAMOND_SHOVEL: - case DIAMOND_HOE: - case DIAMOND_SWORD: - case DIAMOND_AXE: - case NETHERITE_SWORD: - case NETHERITE_SHOVEL: - case NETHERITE_PICKAXE: - case NETHERITE_AXE: - case NETHERITE_HOE: - case BOW: - case FLINT_AND_STEEL: - case FISHING_ROD: - case SHEARS: - return true; - default: - return false; - } - } + public void withdraw(Player player) { + economy.withdrawPlayer(player, getCost(player.getInventory().getItemInMainHand(), player)); + } - public boolean isArmor(ItemStack item) { - switch (item.getType()) { - case LEATHER_HELMET: - case LEATHER_CHESTPLATE: - case LEATHER_LEGGINGS: - case LEATHER_BOOTS: - case CHAINMAIL_HELMET: - case CHAINMAIL_CHESTPLATE: - case CHAINMAIL_LEGGINGS: - case CHAINMAIL_BOOTS: - case GOLDEN_HELMET: - case GOLDEN_CHESTPLATE: - case GOLDEN_LEGGINGS: - case GOLDEN_BOOTS: - case IRON_HELMET: - case IRON_CHESTPLATE: - case IRON_LEGGINGS: - case IRON_BOOTS: - case DIAMOND_HELMET: - case DIAMOND_CHESTPLATE: - case DIAMOND_LEGGINGS: - case DIAMOND_BOOTS: - case NETHERITE_HELMET: - case NETHERITE_CHESTPLATE: - case NETHERITE_LEGGINGS: - case NETHERITE_BOOTS: - return true; - default: - return false; - } - } - - public boolean doesPlayerHaveEnough(Player player) { - return economy.getBalance((OfflinePlayer) player) - getCost(player.getInventory().getItemInMainHand(), player) >= 0; - } - - public String formatCost(Player player) { - double cost = getCost(player.getInventory().getItemInMainHand(), player); - return economy.format(cost); - } - - public void withdraw(Player player) { - economy.withdrawPlayer(((OfflinePlayer) player), getCost(player.getInventory().getItemInMainHand(), player)); - } - /* CitiTrader dependency outdated and broken. - public void deposit(NPC npc, Player player) { -// if(hasCititrader) { -// if(npc.hasTrait(WalletTrait.class)) { -// npc.getTrait(WalletTrait.class).deposit(getCost(player.getItemInHand())); -// } -// } + 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('_', '-')); } - */ - 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(); - // 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); - item2.removeEnchantment(Enchantment.getByName(enchant.getEnchantment().getEnchantmentName ())); - } - - ArrayList leathers = new ArrayList(); - leathers.add(Material.LEATHER_BOOTS); - leathers.add(Material.LEATHER_CHESTPLATE); - leathers.add(Material.LEATHER_HELMET); - leathers.add(Material.LEATHER_LEGGINGS); - - HItemStack hi3 = null; - if (leathers.contains(player.getInventory().getItemInMainHand().getType())){ - hi3 = bukCon.getBukkitCommon().getSerializableItemStack(new ItemStack(player.getInventory().getItemInMainHand().getType())); - } - - TradeObject to = this.hyperAPI.getHyperObject(hi, "default"); - if (to==null) { - to = hyperAPI.getHyperObject(hi3, "default"); - if (to==null) { - HItemStack hi4 = bukCon.getBukkitCommon().getSerializableItemStack(new ItemStack(player.getInventory().getItemInMainHand().getType())); - to = this.hyperAPI.getHyperObject(hi4, "default"); - } - hyperPrice = hyperPrice+to.getSellPrice(1); - - } else { - hyperPrice = to.getSellPrice(1); - } - double hyperPricePerDurability = hyperPrice / item.getType().getMaxDurability(); - price += (item.getDurability() * hyperPricePerDurability); - - double enchantmentModifier = Setting.ENCHANTMENT_MODIFIER.asDouble(); - for (Enchantment enchantment : item2.getEnchantments().keySet()) { - if (root.keyExists("enchantment-modifiers." + enchantment.getName().toLowerCase().replace('_', '-'))) - enchantmentModifier = root.getDouble("enchantment-modifiers." - + enchantment.getName().toLowerCase().replace('_', '-')); - price += enchantmentModifier * item2.getEnchantmentLevel(enchantment); - } - - - return price; - } + 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)); + } - else { - if (root.keyExists("price-per-durability-point." + item.getType().name().toLowerCase().replace('_', '-'))) - price += item.getDurability() * root.getDouble("price-per-durability-point." + item.getType().name().toLowerCase().replace('_', '-')); - else price += (item.getDurability() * Setting.PRICE_PER_DURABILITY_POINT.asDouble()); - } + ArrayList leathers = new ArrayList<>(); + leathers.add(Material.LEATHER_BOOTS); + leathers.add(Material.LEATHER_CHESTPLATE); + leathers.add(Material.LEATHER_HELMET); + leathers.add(Material.LEATHER_LEGGINGS); - double enchantmentModifier = Setting.ENCHANTMENT_MODIFIER.asDouble(); - for (Enchantment enchantment : item.getEnchantments().keySet()) { - if (root.keyExists("enchantment-modifiers." + enchantment.getName().toLowerCase().replace('_', '-'))) - enchantmentModifier = root.getDouble("enchantment-modifiers." - + enchantment.getName().toLowerCase().replace('_', '-')); - price += enchantmentModifier * item.getEnchantmentLevel(enchantment); - } - return price; - } + HItemStack hi3 = null; + if (leathers.contains(player.getInventory().getItemInMainHand().getType())) { + hi3 = bukCon.getBukkitCommon().getSerializableItemStack(new ItemStack(player.getInventory().getItemInMainHand().getType())); + } + + TradeObject to = this.hyperAPI.getHyperObject(hi, "default"); + if (to == null) { + to = hyperAPI.getHyperObject(hi3, "default"); + if (to == null) { + HItemStack hi4 = bukCon.getBukkitCommon().getSerializableItemStack(new ItemStack(player.getInventory().getItemInMainHand().getType())); + to = this.hyperAPI.getHyperObject(hi4, "default"); + } + hyperPrice = hyperPrice + to.getSellPrice(1); + + } else { + hyperPrice = to.getSellPrice(1); + } + double hyperPricePerDurability = hyperPrice / item.getType().getMaxDurability(); + price += (((Damageable) item).getDamage() * hyperPricePerDurability); + + double enchantmentModifier = Setting.ENCHANTMENT_MODIFIER.asDouble(); + for (Enchantment enchantment : item2.getEnchantments().keySet()) { + if (root.keyExists("enchantment-modifiers." + enchantment.getKey().asString().toLowerCase().replace('_', '-'))) { + enchantmentModifier = root.getDouble("enchantment-modifiers." + + enchantment.getKey().asString().toLowerCase().replace('_', '-')); + } + price += enchantmentModifier * item2.getEnchantmentLevel(enchantment); + } + + + return price; + } else { + if (root.keyExists("price-per-durability-point." + item.getType().name().toLowerCase().replace('_', '-'))) { + price += ((Damageable) item).getDamage() * root.getDouble("price-per-durability-point." + item.getType().name().toLowerCase().replace('_', '-')); + } else { + price += (((Damageable) item).getDamage() * Setting.PRICE_PER_DURABILITY_POINT.asDouble()); + } + } + + double enchantmentModifier = Setting.ENCHANTMENT_MODIFIER.asDouble(); + for (Enchantment enchantment : item.getEnchantments().keySet()) { + if (root.keyExists("enchantment-modifiers." + enchantment.getKey().asString().toLowerCase().replace('_', '-'))) { + enchantmentModifier = root.getDouble("enchantment-modifiers." + + enchantment.getKey().asString().toLowerCase().replace('_', '-')); + } + price += enchantmentModifier * item.getEnchantmentLevel(enchantment); + } + return price; + } } diff --git a/src/main/java/net/apunch/blacksmith/BlacksmithTrait.java b/src/main/java/net/apunch/blacksmith/BlacksmithTrait.java index 6e07245..ba1ec5d 100644 --- a/src/main/java/net/apunch/blacksmith/BlacksmithTrait.java +++ b/src/main/java/net/apunch/blacksmith/BlacksmithTrait.java @@ -1,344 +1,366 @@ package net.apunch.blacksmith; +import net.apunch.blacksmith.util.Settings.Setting; +import net.citizensnpcs.api.npc.NPC; +import net.citizensnpcs.api.trait.Trait; +import net.citizensnpcs.api.util.DataKey; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.Damageable; + import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Random; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.inventory.ItemStack; - -import net.apunch.blacksmith.util.Settings.Setting; - -import net.citizensnpcs.api.npc.NPC; -import net.citizensnpcs.api.trait.Trait; -import net.citizensnpcs.api.util.DataKey; - public class BlacksmithTrait extends Trait { - private static final String[] enchantments = new String[Enchantment.values().length]; + private static final String[] enchantments = new String[Enchantment.values().length]; - private final BlacksmithPlugin plugin; - private final List reforgeableItems = new ArrayList(); - private final Map cooldowns = new HashMap(); - private ReforgeSession session; + private final BlacksmithPlugin plugin; + private final List reforgeAbleItems = new ArrayList<>(); + private final Map coolDowns = new HashMap<>(); + private ReforgeSession session; - // Defaults - private String busyWithPlayerMsg = Setting.BUSY_WITH_PLAYER_MESSAGE.asString(); - private String busyReforgingMsg = Setting.BUSY_WITH_REFORGE_MESSAGE.asString(); - private String costMsg = Setting.COST_MESSAGE.asString(); - private String invalidItemMsg = Setting.INVALID_ITEM_MESSAGE.asString(); - private String startReforgeMsg = Setting.START_REFORGE_MESSAGE.asString(); - private String successMsg = Setting.SUCCESS_MESSAGE.asString(); - private String failMsg = Setting.FAIL_MESSAGE.asString(); - private String insufficientFundsMsg = Setting.INSUFFICIENT_FUNDS_MESSAGE.asString(); - private String cooldownUnexpiredMsg = Setting.COOLDOWN_UNEXPIRED_MESSAGE.asString(); - private String itemChangedMsg = Setting.ITEM_UNEXPECTEDLY_CHANGED_MESSAGE.asString(); - private int minReforgeDelay = Setting.MIN_REFORGE_DELAY.asInt(); - private int maxReforgeDelay = Setting.MAX_REFORGE_DELAY.asInt(); - private int reforgeCooldown = Setting.REFORGE_COOLDOWN.asInt(); - private int failChance = Setting.FAIL_CHANCE.asInt(); - private int extraEnchantmentChance = Setting.EXTRA_ENCHANTMENT_CHANCE.asInt(); - private int maxEnchantments = Setting.MAX_ENCHANTMENTS.asInt(); - private boolean dropItem = Setting.DROP_ITEM.asBoolean(); - private boolean disablecooldown = Setting.DISABLE_COOLDOWN.asBoolean(); - private boolean disabledelay = Setting.DISABLE_DELAY.asBoolean(); + // Defaults + private String busyWithPlayerMsg = Setting.BUSY_WITH_PLAYER_MESSAGE.asString(); + private String busyReforgingMsg = Setting.BUSY_WITH_REFORGE_MESSAGE.asString(); + private String costMsg = Setting.COST_MESSAGE.asString(); + private String invalidItemMsg = Setting.INVALID_ITEM_MESSAGE.asString(); + private String startReforgeMsg = Setting.START_REFORGE_MESSAGE.asString(); + private String successMsg = Setting.SUCCESS_MESSAGE.asString(); + private String failMsg = Setting.FAIL_MESSAGE.asString(); + private String insufficientFundsMsg = Setting.INSUFFICIENT_FUNDS_MESSAGE.asString(); + private String coolDownUnexpiredMessage = Setting.COOLDOWN_UNEXPIRED_MESSAGE.asString(); + private String itemChangedMsg = Setting.ITEM_UNEXPECTEDLY_CHANGED_MESSAGE.asString(); + private int minReforgeDelay = Setting.MIN_REFORGE_DELAY.asInt(); + private int maxReforgeDelay = Setting.MAX_REFORGE_DELAY.asInt(); + private int reforgeCoolDown = Setting.REFORGE_COOLDOWN.asInt(); + private int failChance = Setting.FAIL_CHANCE.asInt(); + private int extraEnchantmentChance = Setting.EXTRA_ENCHANTMENT_CHANCE.asInt(); + private int maxEnchantments = Setting.MAX_ENCHANTMENTS.asInt(); + private boolean dropItem = Setting.DROP_ITEM.asBoolean(); + private boolean disableCoolDown = Setting.DISABLE_COOLDOWN.asBoolean(); + private boolean disableDelay = Setting.DISABLE_DELAY.asBoolean(); - public BlacksmithTrait() { - super("blacksmith"); - plugin = (BlacksmithPlugin) Bukkit.getServer().getPluginManager().getPlugin("Blacksmith"); - int i = 0; - for (Enchantment enchantment : Enchantment.values()) - enchantments[i++] = enchantment.getName(); - } + public BlacksmithTrait() { + super("blacksmith"); + plugin = (BlacksmithPlugin) Bukkit.getServer().getPluginManager().getPlugin("Blacksmith"); + int i = 0; + for (Enchantment enchantment : Enchantment.values()) { + enchantments[i++] = enchantment.getKey().asString(); + } + } - @Override - public void load(DataKey key) { - for (DataKey sub : key.getRelative("reforgeable-items").getIntegerSubKeys()) - if (Material.getMaterial(sub.getString("").toUpperCase().replace('-', '_')) != null) - reforgeableItems.add(Material.getMaterial(sub.getString("").toUpperCase().replace('-', '_'))); + @Override + public void load(DataKey key) { + for (DataKey sub : key.getRelative("reforgeable-items").getIntegerSubKeys()) { + if (Material.getMaterial(sub.getString("").toUpperCase().replace('-', '_')) != null) { + reforgeAbleItems.add(Material.getMaterial(sub.getString("").toUpperCase().replace('-', '_'))); + } + } - // Override defaults if they exist - if (key.keyExists("messages.busy-with-player")) - busyWithPlayerMsg = key.getString("messages.busy-with-player"); - if (key.keyExists("messages.busy-with-reforge")) - busyReforgingMsg = key.getString("messages.busy-with-reforge"); - if (key.keyExists("messages.cost")) - costMsg = key.getString("messages.cost"); - if (key.keyExists("messages.invalid-item")) - invalidItemMsg = key.getString("messages.invalid-item"); - if (key.keyExists("messages.start-reforge")) - startReforgeMsg = key.getString("messages.start-reforge"); - if (key.keyExists("messages.successful-reforge")) - successMsg = key.getString("messages.successful-reforge"); - if (key.keyExists("messages.fail-reforge")) - failMsg = key.getString("messages.fail-reforge"); - if (key.keyExists("messages.insufficient-funds")) - insufficientFundsMsg = key.getString("messages.insufficient-funds"); - if (key.keyExists("messages.cooldown-not-expired")) - cooldownUnexpiredMsg = key.getString("messages.cooldown-not-expired"); - if (key.keyExists("messages.item-changed-during-reforge")) - itemChangedMsg = key.getString("messages.item-changed-during-reforge"); - if (key.keyExists("delays-in-seconds.minimum")) - minReforgeDelay = key.getInt("delays-in-seconds.minimum"); - if (key.keyExists("delays-in-seconds.maximum")) - maxReforgeDelay = key.getInt("delays-in-seconds.maximum"); - if (key.keyExists("delays-in-seconds.reforge-cooldown")) - reforgeCooldown = key.getInt("delays-in-seconds.reforge-cooldown"); - if (key.keyExists("percent-chance-to-fail-reforge")) - failChance = key.getInt("percent-chance-to-fail-reforge"); - if (key.keyExists("maximum-enchantments")) - maxEnchantments = key.getInt("maximum-enchantments"); - if (key.keyExists("extra-enchantments-chance")) - extraEnchantmentChance = key.getInt("extra-enchantment-chance"); - if (key.keyExists("dropitem")) - dropItem = key.getBoolean("dropitem"); - if (key.keyExists("disable-cooldown")) - disablecooldown = key.getBoolean("disable-cooldown"); - if (key.keyExists("disable-delay")) - disabledelay = key.getBoolean("disable-delay"); - } + // Override defaults if they exist + if (key.keyExists("messages.busy-with-player")) { + busyWithPlayerMsg = key.getString("messages.busy-with-player"); + } + if (key.keyExists("messages.busy-with-reforge")) { + busyReforgingMsg = key.getString("messages.busy-with-reforge"); + } + if (key.keyExists("messages.cost")) { + costMsg = key.getString("messages.cost"); + } + if (key.keyExists("messages.invalid-item")) { + invalidItemMsg = key.getString("messages.invalid-item"); + } + if (key.keyExists("messages.start-reforge")) { + startReforgeMsg = key.getString("messages.start-reforge"); + } + if (key.keyExists("messages.successful-reforge")) { + successMsg = key.getString("messages.successful-reforge"); + } + if (key.keyExists("messages.fail-reforge")) { + failMsg = key.getString("messages.fail-reforge"); + } + if (key.keyExists("messages.insufficient-funds")) { + insufficientFundsMsg = key.getString("messages.insufficient-funds"); + } + if (key.keyExists("messages.cooldown-not-expired")) { + coolDownUnexpiredMessage = key.getString("messages.cooldown-not-expired"); + } + if (key.keyExists("messages.item-changed-during-reforge")) { + itemChangedMsg = key.getString("messages.item-changed-during-reforge"); + } + if (key.keyExists("delays-in-seconds.minimum")) { + minReforgeDelay = key.getInt("delays-in-seconds.minimum"); + } + if (key.keyExists("delays-in-seconds.maximum")) { + maxReforgeDelay = key.getInt("delays-in-seconds.maximum"); + } + if (key.keyExists("delays-in-seconds.reforge-cooldown")) { + reforgeCoolDown = key.getInt("delays-in-seconds.reforge-cooldown"); + } + if (key.keyExists("percent-chance-to-fail-reforge")) { + failChance = key.getInt("percent-chance-to-fail-reforge"); + } + if (key.keyExists("maximum-enchantments")) { + maxEnchantments = key.getInt("maximum-enchantments"); + } + if (key.keyExists("extra-enchantments-chance")) { + extraEnchantmentChance = key.getInt("extra-enchantment-chance"); + } + if (key.keyExists("dropitem")) { + dropItem = key.getBoolean("dropitem"); + } + if (key.keyExists("disable-cooldown")) { + disableCoolDown = key.getBoolean("disable-cooldown"); + } + if (key.keyExists("disable-delay")) { + disableDelay = key.getBoolean("disable-delay"); + } + } - @EventHandler - public void onRightClick(net.citizensnpcs.api.event.NPCRightClickEvent event) { - if(this.npc!=event.getNPC()) return; + @EventHandler + public void onRightClick(net.citizensnpcs.api.event.NPCRightClickEvent event) { + if (this.npc != event.getNPC()) { + return; + } - Player player = event.getClicker(); - if ((disablecooldown & (cooldowns.get(player.getName()) != (null)))) - { - cooldowns.remove(player.getName()); - } - if (!player.hasPermission("blacksmith.reforge")) - return; + Player player = event.getClicker(); + if ((disableCoolDown & (coolDowns.get(player.getName()) != (null)))) { + coolDowns.remove(player.getName()); + } + if (!player.hasPermission("blacksmith.reforge")) { + return; + } - if (cooldowns.get(player.getName()) != null) { - if (!Calendar.getInstance().after(cooldowns.get(player.getName()))) { - player.sendMessage(cooldownUnexpiredMsg); - return; - } - cooldowns.remove(player.getName()); - } + if (coolDowns.get(player.getName()) != null) { + if (!Calendar.getInstance().after(coolDowns.get(player.getName()))) { + player.sendMessage(coolDownUnexpiredMessage); + return; + } + coolDowns.remove(player.getName()); + } - ItemStack hand = player.getInventory().getItemInMainHand(); + ItemStack hand = player.getInventory().getItemInMainHand(); - if(session!=null){ - //timeout - if ( System.currentTimeMillis() > _sessionstart + 10*1000 || this.npc.getEntity().getLocation().distance(session.player.getLocation()) > 20 ){ - session = null; - } - } + if (session != null) { + //timeout + if (System.currentTimeMillis() > _sessionstart + 10 * 1000 || this.npc.getEntity().getLocation().distance(session.player.getLocation()) > 20) { + session = null; + } + } - if (session != null) { - if (!session.isInSession(player)) { + if (session != null) { + if (!session.isInSession(player)) { - player.sendMessage( busyWithPlayerMsg); - return; + player.sendMessage(busyWithPlayerMsg); + return; - } + } - if (session.isRunning()) { - player.sendMessage( busyReforgingMsg); - return; - } - if (session.handleClick()) - session = null; - else - reforge(npc, player); - } else { - if ((!plugin.isTool(hand) && !plugin.isArmor(hand)) - || (!reforgeableItems.isEmpty() && !reforgeableItems.contains(hand.getType()))) { - player.sendMessage( invalidItemMsg); - return; - } - - String cost = plugin.formatCost(player); - - _sessionstart = System.currentTimeMillis(); - session = new ReforgeSession(player, npc); - player.sendMessage(costMsg.replace("", cost).replace("", - hand.getType().name().toLowerCase().replace('_', ' '))); + if (session.isRunning()) { + player.sendMessage(busyReforgingMsg); + return; + } + if (session.handleClick()) { + session = null; + } else { + reforge(npc, player); + } + } else { + if ((!plugin.isTool(hand) && !plugin.isArmor(hand)) + || (!reforgeAbleItems.isEmpty() && !reforgeAbleItems.contains(hand.getType()))) { + player.sendMessage(invalidItemMsg); + return; + } - } - } + String cost = plugin.formatCost(player); - private long _sessionstart = System.currentTimeMillis(); + _sessionstart = System.currentTimeMillis(); + session = new ReforgeSession(player, npc); + player.sendMessage(costMsg.replace("", cost).replace("", + hand.getType().name().toLowerCase().replace('_', ' '))); - @Override - public void save(DataKey key) { - for (int i = 0; i < reforgeableItems.size(); i++) - key.getRelative("reforgeable-items").setString(String.valueOf(i), - reforgeableItems.get(i).name().toLowerCase().replace('_', '-')); + } + } - key.setString("messages.busy-with-player", busyWithPlayerMsg); - key.setString("messages.busy-with-reforge", busyReforgingMsg); - key.setString("messages.cost", costMsg); - key.setString("messages.invalid-item", invalidItemMsg); - key.setString("messages.start-reforge", startReforgeMsg); - key.setString("messages.successful-reforge", successMsg); - key.setString("messages.fail-reforge", failMsg); - key.setString("messages.insufficient-funds", insufficientFundsMsg); - key.setString("messages.cooldown-not-expired", cooldownUnexpiredMsg); - key.setString("messages.item-changed-during-reforge", itemChangedMsg); - key.setInt("delays-in-seconds.minimum", minReforgeDelay); - key.setInt("delays-in-seconds.maximum", maxReforgeDelay); - key.setInt("delays-in-seconds.reforge-cooldown", reforgeCooldown); - key.setInt("percent-chance-to-fail-reforge", failChance); - key.setInt("percent-chance-for-extra-enchantment", extraEnchantmentChance); - key.setInt("maximum-enchantments", maxEnchantments); - key.setBoolean("drop-item", dropItem); - key.setBoolean("disable-delay", disabledelay); - key.setBoolean("disable-cooldown", disablecooldown); - } + private long _sessionstart = System.currentTimeMillis(); - private void reforge(NPC npc, Player player) { - player.sendMessage( startReforgeMsg); - - //plugin.deposit(npc, player); // CitiTrader dependency outdated and broken - - plugin.withdraw(player); - session.beginReforge(); - if (npc.getEntity() instanceof Player) - ((Player) npc.getEntity()).getInventory().setItemInMainHand(player.getInventory().getItemInMainHand()); - else - ((LivingEntity) npc.getEntity()).getEquipment().setItemInMainHand(player.getInventory().getItemInMainHand()); - player.getInventory().setItemInMainHand(null); - } + @Override + public void save(DataKey key) { + for (int i = 0; i < reforgeAbleItems.size(); i++) { + key.getRelative("reforgeable-items").setString(String.valueOf(i), + reforgeAbleItems.get(i).name().toLowerCase().replace('_', '-')); + } - private class ReforgeSession implements Runnable { - private final Player player; - private final NPC npc; - private final ItemStack reforge; - private int taskId; + key.setString("messages.busy-with-player", busyWithPlayerMsg); + key.setString("messages.busy-with-reforge", busyReforgingMsg); + key.setString("messages.cost", costMsg); + key.setString("messages.invalid-item", invalidItemMsg); + key.setString("messages.start-reforge", startReforgeMsg); + key.setString("messages.successful-reforge", successMsg); + key.setString("messages.fail-reforge", failMsg); + key.setString("messages.insufficient-funds", insufficientFundsMsg); + key.setString("messages.cooldown-not-expired", coolDownUnexpiredMessage); + key.setString("messages.item-changed-during-reforge", itemChangedMsg); + key.setInt("delays-in-seconds.minimum", minReforgeDelay); + key.setInt("delays-in-seconds.maximum", maxReforgeDelay); + key.setInt("delays-in-seconds.reforge-cooldown", reforgeCoolDown); + key.setInt("percent-chance-to-fail-reforge", failChance); + key.setInt("percent-chance-for-extra-enchantment", extraEnchantmentChance); + key.setInt("maximum-enchantments", maxEnchantments); + key.setBoolean("drop-item", dropItem); + key.setBoolean("disable-delay", disableDelay); + key.setBoolean("disable-cooldown", disableCoolDown); + } - private ReforgeSession(Player player, NPC npc) { - this.player = player; - this.npc = npc; - reforge = player.getInventory().getItemInMainHand(); - } + private void reforge(NPC npc, Player player) { + player.sendMessage(startReforgeMsg); - @Override - public void run() { - player.sendMessage( reforgeItemInHand() ? successMsg : failMsg); - if (npc.getEntity() instanceof Player) - ((Player) npc.getEntity()).getInventory().setItemInMainHand(null); - else - ((LivingEntity) npc.getEntity()).getEquipment().setItemInMainHand(null); - if (!disabledelay) - { - if (dropItem) - player.getWorld().dropItemNaturally(npc.getEntity().getLocation(), reforge); - else { - player.getInventory().addItem(reforge); - /* - oldmethode ? - for (ItemStack stack : player.getInventory().addItem(reforge).values()) - player.getWorld().dropItemNaturally(npc.getEntity().getLocation(), stack); - */ - } - } - else - { - player.getInventory().setItemInMainHand(reforge); - } - session = null; - // Start cooldown - Calendar wait = Calendar.getInstance(); - wait.add(Calendar.SECOND, reforgeCooldown); - cooldowns.put(player.getName(), wait); - } + //plugin.deposit(npc, player); // CitiTrader dependency outdated and broken - private boolean reforgeItemInHand() { - Random random = new Random(); - if (random.nextInt(100) < failChance) { - for (Enchantment enchantment : reforge.getEnchantments().keySet()) { - // Remove or downgrade enchantments - if (random.nextBoolean()) - reforge.removeEnchantment(enchantment); - else { - if (reforge.getEnchantmentLevel(enchantment) > 1) { - reforge.removeEnchantment(enchantment); - reforge.addEnchantment(enchantment, 1); - } - } - } - // Damage the item - short durability = (short) (reforge.getDurability() + reforge.getDurability() * random.nextInt(8)); - short maxDurability = reforge.getType().getMaxDurability(); - if (durability <= 0) - durability = (short) (maxDurability / 3); - else if (reforge.getDurability() + durability > maxDurability) - durability = (short) (maxDurability - random.nextInt(maxDurability - 25)); - reforge.setDurability(durability); - return false; - } + plugin.withdraw(player); + session.beginReforge(); + if (npc.getEntity() instanceof Player) { + ((Player) npc.getEntity()).getInventory().setItemInMainHand(player.getInventory().getItemInMainHand()); + } else { + Objects.requireNonNull(((LivingEntity) npc.getEntity()).getEquipment()).setItemInMainHand(player.getInventory().getItemInMainHand()); + } + player.getInventory().setItemInMainHand(null); + } - reforge.setDurability((short) 0); + private class ReforgeSession implements Runnable { + private final Player player; + private final NPC npc; + private final ItemStack reforge; + private int taskId; - // Add random enchantments + private ReforgeSession(Player player, NPC npc) { + this.player = player; + this.npc = npc; + reforge = player.getInventory().getItemInMainHand(); + } + + @Override + public void run() { + player.sendMessage(reforgeItemInHand() ? successMsg : failMsg); + if (npc.getEntity() instanceof Player) { + ((Player) npc.getEntity()).getInventory().setItemInMainHand(null); + } else { + Objects.requireNonNull(((LivingEntity) npc.getEntity()).getEquipment()).setItemInMainHand(null); + } + if (!disableDelay) { + if (dropItem) { + player.getWorld().dropItemNaturally(npc.getEntity().getLocation(), reforge); + } else { + player.getInventory().addItem(reforge); + } + } else { + player.getInventory().setItemInMainHand(reforge); + } + session = null; + // Start cooldown + Calendar wait = Calendar.getInstance(); + wait.add(Calendar.SECOND, reforgeCoolDown); + coolDowns.put(player.getName(), wait); + } + + private boolean reforgeItemInHand() { + Random random = new Random(); + if (random.nextInt(100) < failChance) { + for (Enchantment enchantment : reforge.getEnchantments().keySet()) { + // Remove or downgrade enchantments + if (random.nextBoolean()) { + reforge.removeEnchantment(enchantment); + } else { + if (reforge.getEnchantmentLevel(enchantment) > 1) { + reforge.removeEnchantment(enchantment); + reforge.addEnchantment(enchantment, 1); + } + } + } + // Damage the item + short durability = (short) (((Damageable) reforge).getDamage() + ((Damageable) reforge).getDamage() * + random.nextInt(8)); + short maxDurability = reforge.getType().getMaxDurability(); + if (durability <= 0) { + durability = (short) (maxDurability / 3); + } else if (((Damageable) reforge).getDamage() + durability > maxDurability) { + durability = (short) (maxDurability - random.nextInt(maxDurability - 25)); + } + ((Damageable) reforge).setDamage(durability); + return false; + } + + ((Damageable) reforge).setDamage((short) 0); + + // Add random enchantments - // If durability is full, chance is multiplied by 4. Seems unbalanced, so disabled for now. + // If durability is full, chance is multiplied by 4. Seems unbalanced, so disabled for now. /*if (reforge.getDurability() == 0) chance *= 4; else */ - int roll = random.nextInt(100); - if (roll < extraEnchantmentChance && reforge.getEnchantments().keySet().size() < maxEnchantments){ + int roll = random.nextInt(100); + if (roll < extraEnchantmentChance && reforge.getEnchantments().keySet().size() < maxEnchantments) { - Enchantment enchantment = Enchantment.getByName(enchantments[random.nextInt(enchantments.length)]); - if (enchantment.canEnchantItem(reforge)) reforge.addEnchantment(enchantment, random.nextInt(enchantment.getMaxLevel() - enchantment.getStartLevel()) + enchantment.getStartLevel()); + Enchantment enchantment = Enchantment.getByKey(NamespacedKey.fromString(enchantments[random.nextInt(enchantments.length)])); + if (Objects.requireNonNull(enchantment).canEnchantItem(reforge)) { + reforge.addEnchantment(enchantment, random.nextInt(enchantment.getMaxLevel() - enchantment.getStartLevel()) + enchantment.getStartLevel()); + } - } + } - return true; - } + return true; + } - // Return if the session should end - private boolean handleClick() { - // Prevent player from switching items during session - if (!reforge.equals(player.getInventory().getItemInMainHand())) { - player.sendMessage( itemChangedMsg); - return true; - } - if (!plugin.doesPlayerHaveEnough(player)) { - player.sendMessage( insufficientFundsMsg); - return true; - } - return false; - } + // Return if the session should end + private boolean handleClick() { + // Prevent player from switching items during session + if (!reforge.equals(player.getInventory().getItemInMainHand())) { + player.sendMessage(itemChangedMsg); + return true; + } + if (!plugin.doesPlayerHaveEnough(player)) { + player.sendMessage(insufficientFundsMsg); + return true; + } + return false; + } - private boolean isRunning() { - return plugin.getServer().getScheduler().isQueued(taskId); - } + private boolean isRunning() { + return plugin.getServer().getScheduler().isQueued(taskId); + } - private boolean isInSession(Player other) { - return player.getName().equals(other.getName()); - } + private boolean isInSession(Player other) { + return player.getName().equals(other.getName()); + } - private void beginReforge() { - if (!disablecooldown) - { - taskId = plugin - .getServer() - .getScheduler() - .scheduleSyncDelayedTask(plugin, this, - (new Random().nextInt(maxReforgeDelay) + minReforgeDelay) * 20); - } - else - { - taskId = plugin - .getServer() - .getScheduler() - .scheduleSyncDelayedTask(plugin, this,0); - } - } - } + private void beginReforge() { + if (!disableCoolDown) { + taskId = plugin + .getServer() + .getScheduler() + .scheduleSyncDelayedTask(plugin, this, + (new Random().nextInt(maxReforgeDelay) + minReforgeDelay) * 20L); + } else { + taskId = plugin + .getServer() + .getScheduler() + .scheduleSyncDelayedTask(plugin, this, 0); + } + } + } } diff --git a/src/main/java/net/apunch/blacksmith/util/Settings.java b/src/main/java/net/apunch/blacksmith/util/Settings.java index d693efd..4688779 100644 --- a/src/main/java/net/apunch/blacksmith/util/Settings.java +++ b/src/main/java/net/apunch/blacksmith/util/Settings.java @@ -1,12 +1,11 @@ package net.apunch.blacksmith.util; -import java.io.File; - import net.apunch.blacksmith.BlacksmithPlugin; - import net.citizensnpcs.api.util.DataKey; import net.citizensnpcs.api.util.YamlStorage; +import java.io.File; + public class Settings { private final YamlStorage config; @@ -17,11 +16,13 @@ public class Settings { public void load() { config.load(); DataKey root = config.getKey(""); - for (Setting setting : Setting.values()) - if (!root.keyExists(setting.path)) + for (Setting setting : Setting.values()) { + if (!root.keyExists(setting.path)) { root.setRaw(setting.path, setting.get()); - else + } else { setting.set(root.getRaw(setting.path)); + } + } config.save(); } @@ -62,7 +63,7 @@ public class Settings { START_REFORGE_MESSAGE("defaults.messages.start-reforge", "§eOk, let's see what I can do..."), SUCCESS_MESSAGE("defaults.messages.successful-reforge", "There you go! All better!"); - private String path; + private final String path; private Object value; Setting(String path, Object value) { @@ -75,10 +76,12 @@ public class Settings { } public double asDouble() { - if (value instanceof String) - return Double.valueOf((String) value); - if (value instanceof Integer) + if (value instanceof String) { + return Double.parseDouble((String) value); + } + if (value instanceof Integer) { return (Integer) value; + } return (Double) value; } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index f440657..d177232 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,13 +1,18 @@ name: Blacksmith -author: aPunch, jrbudda, HurricanKai -version: 1.16 +author: EpicKnarvik97, aPunch, jrbudda, HurricanKai +authors: [ EpicKnarvik97, aPunch, jrbudda, HurricanKai ] +version: 1.18.1 main: net.apunch.blacksmith.BlacksmithPlugin -depend: [Citizens, Vault] -softdepend: [HyperConomy] +depend: [ Citizens, Vault ] +softdepend: [ HyperConomy ] -api-version: 1.16 +api-version: 1.18 commands: blacksmithreload: permission: blacksmith.reload description: reloads the config file for Blacksmith +permissions: + blacksmith.reload: + description: Allows the player to run the /reload command + default: op \ No newline at end of file