package de.iani.treasurechest; import java.util.ArrayList; import java.util.Random; import java.util.UUID; import java.util.logging.Level; import net.milkbowl.vault.economy.Economy; import org.bukkit.ChatColor; import org.bukkit.Effect; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.command.CommandSender; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.RegisteredServiceProvider; import org.bukkit.plugin.java.JavaPlugin; import de.iani.playerUUIDCache.CachedPlayer; import de.iani.playerUUIDCache.PlayerUUIDCache; public class TreasureChest extends JavaPlugin implements TreasureChestAPI { private PriceChestData data; private Location chestLocation; private Random random; // private PlayerUUIDTools uuidTools; private boolean hasEconomy; private Economy economy; private PlayerUUIDCache playerUUIDCache; @Override public void onEnable() { random = new Random(); setupEconomy(); // uuidTools = new PlayerUUIDTools(this); playerUUIDCache = (PlayerUUIDCache) getServer().getPluginManager().getPlugin("PlayerUUIDCache"); readConfig(); // chestLocation = new Location(getServer().getWorlds().get(0), 308, 127, -879); data = new PriceChestData(this); getCommand("pricechest").setExecutor(new PriceChestCommandExecutor(this)); getServer().getPluginManager().registerEvents(new ChestInventoryListener(this), this); getServer().getPluginManager().registerEvents(new PlayerEventListener(this), this); getServer().getScheduler().runTaskTimer(this, new Runnable() { @Override public void run() { createParticles(); } }, 1, 1); getServer().getScheduler().runTaskTimer(this, new Runnable() { @Override public void run() { doGC(); } }, 8456, 140000); } public PlayerUUIDCache getPlayerUUIDCache() { return playerUUIDCache; } @Override public boolean addItem(String player, ItemStack displayItem, ItemStack[] items, int money) { if (!getServer().isPrimaryThread()) { return false; } CachedPlayer id = playerUUIDCache.getPlayerFromNameOrUUID(player, true); if (id == null) { return false; } return addItem(id.getUUID(), displayItem, items, money); } @Override public boolean addItem(OfflinePlayer player, ItemStack displayItem, ItemStack[] items, int money) { if (!getServer().isPrimaryThread()) { return false; } return addItem(player.getUniqueId(), displayItem, items, money); } private boolean addItem(UUID player, ItemStack displayItem, ItemStack[] items, int money) { if (displayItem == null || displayItem.getAmount() == 0 || displayItem.getType() == Material.AIR) { return false; } ArrayList<ItemStack> copied = new ArrayList<>(); for (ItemStack is : items) { if (is != null && is.getAmount() > 0 && is.getType() != Material.AIR) { copied.add(is); } } items = copied.toArray(new ItemStack[copied.size()]); PlayerTreasureChestContent content = getData().getChestContent(player); content.addItem(new TreasureChestItem(displayItem, items, money)); return true; } protected void doGC() { data.doGC(); } private void readConfig() { // saveDefaultConfig(); FileConfiguration config = getConfig(); ConfigurationSection section = config.getConfigurationSection("chestLocation"); if (section != null) { String worldName = section.getString("world"); int x = section.getInt("x"); int y = section.getInt("y"); int z = section.getInt("z"); if (worldName != null) { World world = getServer().getWorld(worldName); if (world != null) { chestLocation = new Location(world, x, y, z); } } } } public void saveConfig() { FileConfiguration config = getConfig(); if (chestLocation == null || chestLocation.getWorld() == null) { config.set("chestLocation", null); } else { ConfigurationSection section = config.getConfigurationSection("chestLocation"); if (section == null) { section = config.createSection("chestLocation"); } section.set("world", chestLocation.getWorld().getName()); section.set("x", chestLocation.getBlockX()); section.set("y", chestLocation.getBlockY()); section.set("z", chestLocation.getBlockZ()); } super.saveConfig(); } // public PlayerUUIDTools getUUIDTools() // { // return uuidTools; // } public PriceChestData getData() { return data; } public Location getChestLocation() { return chestLocation; } protected void createParticles() { if (random.nextInt(10) == 0 && chestLocation != null) { Location playerLocation = new Location(null, 0, 0, 0); for (Player player : getServer().getOnlinePlayers()) { player.getLocation(playerLocation); if (playerLocation.getWorld() == chestLocation.getWorld()) { double dx = playerLocation.getX() - chestLocation.getX(); double dy = playerLocation.getY() - chestLocation.getY(); double dz = playerLocation.getZ() - chestLocation.getZ(); double dsquared = dx * dx + dy * dy + dz * dz; if (dsquared < 16 * 16) { if (!data.getChestContent(player.getUniqueId()).isEmpty()) { player.playEffect(chestLocation, Effect.MOBSPAWNER_FLAMES, null); } } } } } } public void sendMessage(CommandSender p, String text) { sendMessage(p, text, false); } public void sendMessage(CommandSender p, String text, boolean error) { p.sendMessage(ChatColor.BLUE + "[TC] " + (error ? ChatColor.DARK_RED : ChatColor.YELLOW) + text); } public void setChestLocation(Location location) { chestLocation = location; saveConfig(); } private void setupEconomy() { try { RegisteredServiceProvider<Economy> economyProvider = getServer().getServicesManager().getRegistration(net.milkbowl.vault.economy.Economy.class); if (economyProvider != null) { economy = economyProvider.getProvider(); hasEconomy = true; } else { getLogger().severe("Kein Economy-Plugin! Es können keine Preisgelder ausgezahlt werden!"); } } catch (Throwable e) { getLogger().severe("Vault nicht gefunden! Es können keine Preisgelder ausgezahlt werden!"); } } public boolean hasEconomy() { return hasEconomy; } public void giveMoney(Player player, int amount) { if (hasEconomy) { try { economy.depositPlayer(player, amount); } catch (Throwable e) { getLogger().log(Level.SEVERE, "Error paying money", e); } } } public String formatMoney(int amount) { if (hasEconomy) { try { return economy.format(amount); } catch (Throwable e) { getLogger().log(Level.SEVERE, "Error formating money", e); } } return Integer.toString(amount); } public static String capitalize(String s, boolean replaceUnderscores) { char[] cap = s.toCharArray(); boolean lastSpace = true; for (int i = 0; i < cap.length; i++) { if (cap[i] == '_') { if (replaceUnderscores) { cap[i] = ' '; } lastSpace = true; } else if (cap[i] >= '0' && cap[i] <= '9') { lastSpace = true; } else { if (lastSpace) { cap[i] = Character.toUpperCase(cap[i]); } else { cap[i] = Character.toLowerCase(cap[i]); } lastSpace = false; } } return new String(cap); } }