package com.nisovin.magicspells.shop; import java.util.HashMap; import java.util.Set; import net.milkbowl.vault.economy.Economy; import org.bukkit.Bukkit; import org.bukkit.configuration.Configuration; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.RegisteredServiceProvider; import com.nisovin.magicspells.util.ExperienceUtils; public class CurrencyHandler { private HashMap<String,String> currencies = new HashMap<String,String>(); private String defaultCurrency; private Economy economy; public CurrencyHandler(Configuration config) { ConfigurationSection sec = config.getConfigurationSection("currencies"); if (sec == null) { defaultCurrency = "money"; currencies.put("money", "vault"); } else { Set<String> keys = sec.getKeys(false); for (String key : keys) { if (defaultCurrency == null) { defaultCurrency = key; } currencies.put(key.toLowerCase(), sec.getString(key).toLowerCase()); } if (defaultCurrency == null) { defaultCurrency = "money"; currencies.put("money", "vault"); } } // set up vault hook if (currencies.containsValue("vault") && Bukkit.getPluginManager().isPluginEnabled("Vault")) { RegisteredServiceProvider<Economy> provider = Bukkit.getServer().getServicesManager().getRegistration(Economy.class); if (provider != null) { economy = provider.getProvider(); } } } public boolean has(Player player, double amount) { return has(player, amount, defaultCurrency); } public boolean has(Player player, double amount, String currency) { String c = currency == null ? null : currencies.get(currency.toLowerCase()); if (c == null) c = currencies.get(defaultCurrency); if (c == null) { return false; } else if (c.equalsIgnoreCase("vault") && economy != null) { return economy.has(player.getName(), amount); } else if (c.equalsIgnoreCase("levels")) { return player.getLevel() >= (int)amount; } else if (c.equalsIgnoreCase("experience") || c.equalsIgnoreCase("xp")) { return ExperienceUtils.hasExp(player, (int)amount); } else if (c.matches("^[0-9]+$")) { return inventoryContains(player.getInventory(), new ItemStack(Integer.parseInt(c), (int)amount)); } else if (c.matches("^[0-9]+:[0-9]+$")) { String[] s = c.split(":"); int type = Integer.parseInt(s[0]); short data = Short.parseShort(s[1]); return inventoryContains(player.getInventory(), new ItemStack(type, (int)amount, data)); } else { return false; } } public void remove(Player player, double amount) { remove(player, amount, defaultCurrency); } @SuppressWarnings("deprecation") public void remove(Player player, double amount, String currency) { String c = currency == null ? null : currencies.get(currency.toLowerCase()); if (c == null) c = currencies.get(defaultCurrency); if (c == null) { } else if (c.equalsIgnoreCase("vault") && economy != null) { economy.withdrawPlayer(player.getName(), amount); } else if (c.equalsIgnoreCase("levels")) { player.setLevel(player.getLevel() - (int)amount); } else if (c.equalsIgnoreCase("experience") || c.equalsIgnoreCase("xp")) { ExperienceUtils.changeExp(player, -(int)amount); } else if (c.matches("^[0-9]+$")) { removeFromInventory(player.getInventory(), new ItemStack(Integer.parseInt(c), (int)amount)); player.updateInventory(); } else if (c.matches("^[0-9]+:[0-9]+$")) { String[] s = c.split(":"); int type = Integer.parseInt(s[0]); short data = Short.parseShort(s[1]); removeFromInventory(player.getInventory(), new ItemStack(type, (int)amount, data)); player.updateInventory(); } } public boolean isValidCurrency(String currency) { return ((currency == null) ? false : currencies.containsKey(currency)); } private boolean inventoryContains(Inventory inventory, ItemStack item) { int count = 0; ItemStack[] items = inventory.getContents(); for (int i = 0; i < items.length; i++) { if (items[i] != null && items[i].getType() == item.getType() && items[i].getDurability() == item.getDurability()) { count += items[i].getAmount(); } if (count >= item.getAmount()) { return true; } } return false; } private void removeFromInventory(Inventory inventory, ItemStack item) { int amt = item.getAmount(); ItemStack[] items = inventory.getContents(); for (int i = 0; i < items.length; i++) { if (items[i] != null && items[i].getType() == item.getType() && items[i].getDurability() == item.getDurability()) { if (items[i].getAmount() > amt) { items[i].setAmount(items[i].getAmount() - amt); break; } else if (items[i].getAmount() == amt) { items[i] = null; break; } else { amt -= items[i].getAmount(); items[i] = null; } } } inventory.setContents(items); } }