package net.knarcraft.stargate.config; import net.knarcraft.stargate.Stargate; import net.knarcraft.stargate.portal.Portal; import net.knarcraft.stargate.portal.PortalSignDrawer; import net.knarcraft.stargate.portal.property.gate.Gate; import net.knarcraft.stargate.utility.PermissionHelper; import net.milkbowl.vault.economy.Economy; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.RegisteredServiceProvider; import org.bukkit.plugin.ServicesManager; import java.util.Map; import java.util.UUID; /** * The economy config keeps track of economy config values and performs economy actions such as payment for using a gate */ public final class EconomyConfig { private boolean economyEnabled = false; private Economy economy = null; private Plugin vault = null; private int useCost = 0; private int createCost = 0; private int destroyCost = 0; private boolean toOwner = false; private boolean chargeFreeDestination = true; private boolean freeGatesColored = false; /** * Instantiates a new economy config * * @param configOptions
The loaded config options to read
*/ public EconomyConfig(MapThe gate use cost
*/ public int getDefaultUseCost() { return useCost; } /** * Gets whether economy is enabled * * @returnWhether economy is enabled
*/ public boolean isEconomyEnabled() { return economyEnabled; } /** * Gets the economy object to use for transactions * * @returnAn economy object, or null if economy is disabled or not initialized
*/ public Economy getEconomy() { return economy; } /** * Gets an instance of the Vault plugin * * @returnAn instance of the Vault plugin, or null if Vault is not loaded
*/ public Plugin getVault() { return vault; } /** * Disables economy support by clearing relevant values */ public void disableEconomy() { this.economy = null; this.vault = null; } /** * Gets whether free portals should be marked with a different coloring * * @returnWhether free portals should be colored
*/ public boolean drawFreePortalsColored() { return freeGatesColored; } /** * Whether a gate whose destination is a free gate is still charged * *If teleporting from a free portal, it's free regardless of destination. If chargeFreeDestination is disabled, * it's also free to teleport back to the free portal. If chargeFreeDestination is enabled, it's only free to * teleport back if teleporting from another free portal.
* * @returnWhether to charge for free destinations
*/ public boolean chargeFreeDestination() { return chargeFreeDestination; } /** * Gets whether payments should be sent to the owner of the used portal * * @returnWhether to send payments to the portal owner
*/ public boolean sendPaymentToOwner() { return toOwner; } /** * Sets the cost of using a gate without a specified cost * *The use cost cannot be negative.
* * @param useCostThe gate use cost
*/ public void setDefaultUseCost(int useCost) { if (useCost < 0) { throw new IllegalArgumentException("Using a gate cannot cost a negative amount"); } this.useCost = useCost; } /** * Gets the cost of creating a gate without a specified cost * * @returnThe gate creation cost
*/ public int getDefaultCreateCost() { return createCost; } /** * Sets the cost of creating a gate without a specified cost * *The gate create cost cannot be negative
* * @param createCostThe gate creation cost
*/ public void setDefaultCreateCost(int createCost) { this.createCost = createCost; } /** * Gets the cost of destroying a gate without a specified cost * * @returnThe gate destruction cost
*/ public int getDefaultDestroyCost() { return destroyCost; } /** * Sets the cost of destroying a gate without a specified cost * * @param destroyCostThe gate destruction cost
*/ public void setDefaultDestroyCost(int destroyCost) { this.destroyCost = destroyCost; } /** * Charges the player for an action, if required * * @param playerThe player to take money from
* @param costThe cost of the transaction
* @returnTrue if the player was charged successfully
*/ public boolean chargePlayerIfNecessary(Player player, int cost) { if (skipPayment(cost)) { return true; } //Charge player return chargePlayer(player, cost); } /** * Checks whether the given player can afford the given fee * * @param playerThe player to check
* @param costThe fee to pay
* @returnTrue if the player can afford to pay the fee
*/ public boolean canAffordFee(Player player, int cost) { return economy.getBalance(player) > cost; } /** * Charges the player for an action, if required * * @param playerThe player to take money from
* @param targetThe target to pay
* @param costThe cost of the transaction
* @returnTrue if the player was charged successfully
*/ public boolean chargePlayerIfNecessary(Player player, UUID target, int cost) { if (skipPayment(cost)) { return true; } //Charge player return chargePlayer(player, target, cost); } /** * Gets a formatted string for an amount, adding the name of the currency * * @param amountThe amount to display
* @returnA formatted text string describing the amount
*/ public String format(int amount) { if (economyEnabled) { return economy.format(amount); } else { return ""; } } /** * Sets up economy by initializing vault and the vault economy provider * * @param pluginManagerThe plugin manager to get plugins from
* @returnTrue if economy was enabled
*/ public boolean setupEconomy(PluginManager pluginManager) { if (!economyEnabled) { return false; } //Check if vault is loaded Plugin vault = pluginManager.getPlugin("Vault"); if (vault != null && vault.isEnabled()) { ServicesManager servicesManager = Stargate.getInstance().getServer().getServicesManager(); RegisteredServiceProviderTrue if the user has turned on economy and economy is available
*/ public boolean useEconomy() { return economyEnabled && economy != null; } /** * Checks whether a payment transaction should be skipped * * @param costThe cost of the transaction
* @returnTrue if the transaction should be skipped
*/ private boolean skipPayment(int cost) { return cost == 0 || !useEconomy(); } /** * Determines the cost of using a gate * * @param playerThe player trying to use the gate
* @param sourceThe source/entry portal
* @param destinationThe destination portal
* @returnThe cost of using the portal
*/ public int getUseCost(Player player, Portal source, Portal destination) { //No payment required if (!useEconomy() || source.getOptions().isFree()) { return 0; } //Not charging for free destinations if (destination != null && !chargeFreeDestination && destination.getOptions().isFree()) { return 0; } //Cost is 0 if the player owns this gate and funds go to the owner if (source.getGate().getToOwner() && source.isOwner(player)) { return 0; } //Player gets free gate use if (PermissionHelper.hasPermission(player, "stargate.free.use")) { return 0; } return source.getGate().getUseCost(); } /** * Gets the cost of creating the given gate * * @param playerThe player creating the gate
* @param gateThe gate type used
* @returnThe cost of creating the gate
*/ public int getCreateCost(Player player, Gate gate) { if (isFree(player, "create")) { return 0; } else { return gate.getCreateCost(); } } /** * Gets the cost of destroying the given gate * * @param playerThe player creating the gate
* @param gateThe gate type used
* @returnThe cost of destroying the gate
*/ public int getDestroyCost(Player player, Gate gate) { if (isFree(player, "destroy")) { return 0; } else { return gate.getDestroyCost(); } } /** * Loads all config values related to economy * * @param configOptionsThe loaded config options to get values from
*/ private void loadEconomyConfig(MapThe player to check
* @param permissionNodeThe free.permissionNode necessary to allow free gate {action}
* @return */ private boolean isFree(Player player, String permissionNode) { return !useEconomy() || PermissionHelper.hasPermission(player, "stargate.free." + permissionNode); } /** * Charges a player * * @param playerThe player to charge
* @param amountThe amount to charge
* @returnTrue if the payment succeeded, or if no payment was necessary
*/ private boolean chargePlayer(Player player, double amount) { if (economyEnabled && economy != null) { if (!economy.has(player, amount)) { return false; } economy.withdrawPlayer(player, amount); } return true; } /** * Charges a player, giving the charge to a target * * @param playerThe player to charge
* @param targetThe UUID of the player to pay
* @param amountThe amount to charge
* @returnTrue if the payment succeeded, or if no payment was necessary
*/ private boolean chargePlayer(Player player, UUID target, double amount) { if (economyEnabled && player.getUniqueId().compareTo(target) != 0 && economy != null) { if (!economy.has(player, amount)) { return false; } //Take money from the user and give to the owner economy.withdrawPlayer(player, amount); economy.depositPlayer(Bukkit.getOfflinePlayer(target), amount); } return true; } }