package net.knarcraft.blacksmith.manager; import net.knarcraft.blacksmith.BlacksmithPlugin; import net.knarcraft.blacksmith.config.blacksmith.GlobalBlacksmithSettings; import net.knarcraft.blacksmith.util.ItemHelper; import net.milkbowl.vault.economy.Economy; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.RegisteredServiceProvider; import org.bukkit.plugin.ServicesManager; import org.jetbrains.annotations.NotNull; import java.util.logging.Level; import java.util.logging.Logger; /** * A class which deals with everything economy */ public class EconomyManager { private static Economy economy; private EconomyManager() { } /** * Sets up Vault economy support * * @param servicesManager

The services manager to use for finding a Vault provider

* @param logger

The logger to use for logging

* @return

True if Vault was successfully set up

*/ public static boolean setUp(@NotNull ServicesManager servicesManager, @NotNull Logger logger) { //If already set up, there is nothing to do if (economy != null) { return true; } return setupVault(servicesManager, logger); } /** * Gets whether the given player cannot pay for re-forging their held item * * @param player

The player holding an item

* @return

Whether the player cannot pay for the reforge

*/ public static boolean cannotPayForHeldItemReforge(@NotNull Player player) { return economy.getBalance(player) - getHeldItemCost(player) < 0; } /** * Gets whether the given player cannot pay for salvaging an item * * @param player

The player holding an item

* @return

Whether the player cannot pay for the salvage

*/ public static boolean cannotPayForSalvage(@NotNull Player player) { return economy.getBalance(player) - BlacksmithPlugin.getInstance().getGlobalScrapperSettings().getCost() < 0; } /** * Gets the human-readable cost of the given player's held item * * @param player

The player holding an item

* @return

The formatted cost

*/ @NotNull public static String formatBlacksmithCost(@NotNull Player player) { double cost = getHeldItemCost(player); return economy.format(cost); } /** * Gets the human-readable cost of salvaging an item * * @return

The formatted cost

*/ @NotNull public static String formatScrapperCost() { double cost = BlacksmithPlugin.getInstance().getGlobalScrapperSettings().getCost(); return economy.format(cost); } /** * Withdraws the reforging cost from the given player * *

The cost is automatically calculated from the item in the player's main hand.

* * @param player

The player to withdraw from

*/ public static void withdrawBlacksmith(@NotNull Player player) { double cost = getHeldItemCost(player); if (cost > 0) { economy.withdrawPlayer(player, cost); } } /** * Withdraws the salvaging cost from the given player * * @param player

The player to withdraw from

*/ public static void withdrawScrapper(Player player) { double cost = BlacksmithPlugin.getInstance().getGlobalScrapperSettings().getCost(); if (cost > 0) { economy.withdrawPlayer(player, cost); } } /** * Gets the cost of the item in the given player's main hand * * @param player

The player to calculate the cost for

* @return

The calculated cost

*/ private static double getHeldItemCost(@NotNull Player player) { return getCost(player.getInventory().getItemInMainHand()); } /** * Gets the cost of repairing the given item * * @param item

The item to be repaired

* @return

The cost of the repair

*/ private static double getCost(@NotNull ItemStack item) { GlobalBlacksmithSettings globalBlacksmithSettings = BlacksmithPlugin.getInstance().getGlobalBlacksmithSettings(); Material material = item.getType(); //Calculate the base price double price = globalBlacksmithSettings.getBasePrice(material); // Adjust price based on durability double pricePerDurabilityPoint = globalBlacksmithSettings.getPricePerDurabilityPoint(material); if (globalBlacksmithSettings.getUseNaturalCost()) { //Cost increases with damage price += ((double) ItemHelper.getDamage(item)) * pricePerDurabilityPoint; } else { //Cost decreases with damage price += ((double) ItemHelper.getDurability(item)) * pricePerDurabilityPoint; } //Increase price for any enchantments price += getEnchantmentCost(item); //Override the cost for anvils if (ItemHelper.isAnvil(material, true)) { price = globalBlacksmithSettings.getAnvilCost(material); } return price; } /** * Gets the cost resulting from all enchantments on the given item * * @param item

The item to calculate enchantment cost for

* @return

The resulting enchantment cost

*/ private static double getEnchantmentCost(@NotNull ItemStack item) { GlobalBlacksmithSettings settings = BlacksmithPlugin.getInstance().getGlobalBlacksmithSettings(); double price = 0; for (Enchantment enchantment : item.getEnchantments().keySet()) { price += settings.getEnchantmentCost(enchantment) * item.getEnchantmentLevel(enchantment); } return price; } /** * Sets up Vault for economy * * @param servicesManager

The services manager to use for finding a Vault provider

* @param logger

The logger to use for logging

* @return

True if Vault was successfully set up

*/ private static boolean setupVault(@NotNull ServicesManager servicesManager, @NotNull Logger logger) { // Setup Vault RegisteredServiceProvider economyProvider = servicesManager.getRegistration(Economy.class); if (economyProvider != null) { economy = economyProvider.getProvider(); return true; } else { // Disable if no economy plugin was found logger.log(Level.SEVERE, "Failed to load an economy plugin. Disabling..."); return false; } } }