package me.gtacraft.plugins.chests.listener; import com.google.common.collect.Lists; import me.gtacraft.economy.EconomyAPI; import me.gtacraft.plugins.chests.ChestManager; import me.gtacraft.plugins.chests.GTAChests; import me.gtacraft.plugins.chests.parser.ItemData; import me.gtacraft.plugins.gtarespawn.GTARespawn; import me.vaqxine.VNPC.lib.RegionType; import org.bukkit.*; import org.bukkit.block.*; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.inventory.InventoryOpenEvent; import org.bukkit.event.world.ChunkLoadEvent; import org.bukkit.inventory.CraftingInventory; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import java.util.ArrayList; import java.util.HashSet; import java.util.List; /** * Created by Connor on 7/3/14. Designed for the GTA-Chests project. */ public class GTAChestsListener implements Listener { public GTAChestsListener() { Bukkit.getServer().getPluginManager().registerEvents(this, GTAChests.getInstance()); } private static List<Class<?>> blocked = new ArrayList<>(); static { blocked.add(Beacon.class); blocked.add(Hopper.class); blocked.add(Furnace.class); blocked.add(Dropper.class); blocked.add(Dispenser.class); blocked.add(BrewingStand.class); } @EventHandler public void onChestOpen(InventoryOpenEvent event) { if (event.getInventory() instanceof CraftingInventory) { event.setCancelled(true); return; } //block stupidness Player player = (Player)event.getPlayer(); if (event.getInventory().getName().equals("container.enderchest")) { if (!(event.getPlayer().hasPermission("gtachests.enderchest"))) { player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&c&l(!) &cYou cannot use ender chests!")); player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&eWant access to ender chests?")); player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&ePurchase a rank at &nhttp://store.gtacraft.me/&r&e for access")); event.setCancelled(true); } return; } for (Class<?> validate : blocked) { if (validate.isInstance(event.getInventory().getHolder())) { event.setCancelled(true); return; } } if (event.getInventory().getHolder() instanceof Chest) { if (cleanChunk(event.getPlayer().getLocation().getChunk())) return; Chest chest = (Chest)event.getInventory().getHolder(); if (chest.getBlock().getType().equals(Material.TRAPPED_CHEST)) { event.setCancelled(true); return; } if (!(ChestManager.contains(chest.getLocation()))) { //construct ChestManager.add(chest.getLocation()); //perform modifiers double dist = GTARespawn.distanceToClosest(chest.getLocation()); double pMod = (dist/100.0)+(event.getPlayer().hasPermission("gtachests.betterloot") ? 2.5 : 0); int maxTries = (int)(dist/20); //fill fill(chest.getLocation(), chest.getInventory(), pMod, maxTries); } //is chest } else if (event.getInventory().getHolder() instanceof DoubleChest) { if (cleanChunk(event.getPlayer().getLocation().getChunk())) return; DoubleChest chest = (DoubleChest)event.getInventory().getHolder(); if (chest.getLocation().getBlock().getType().equals(Material.ENDER_CHEST)) { if (!(event.getPlayer().hasPermission("gtachests.enderchest"))) { player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&c&l(!) &cYou cannot use ender chests!")); player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&eWant access to ender chests?")); player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&ePurchase a rank at &nhttp://store.gtacraft.me/&r&e for access")); event.setCancelled(true); } return; } if (chest.getLocation().getBlock().getType().equals(Material.TRAPPED_CHEST)) { event.setCancelled(true); return; } if (!(ChestManager.contains(chest.getLocation()))) { //construct ChestManager.add(chest.getLocation()); //perform modifiers double dist = GTARespawn.distanceToClosest(chest.getLocation()); double pMod = (dist/100.0)+(event.getPlayer().hasPermission("gtachests.betterloot") ? 2.5 : 0); int maxTries = (int)(dist/20); //fill fill(chest.getLocation(), chest.getInventory(), pMod, maxTries); } //is double } // ;( } @EventHandler public void onInventoryClose(InventoryCloseEvent event) { Player player = (Player)event.getPlayer(); if (event.getInventory().getName().equals("container.enderchest")) { //filter cash List<ItemStack> removeAll = Lists.newArrayList(); for (ItemStack stack : event.getInventory().getContents()) { if (stack == null) continue; if (stack.getType().equals(Material.EMERALD)) { double value = 1; if (stack.getItemMeta() != null && stack.getItemMeta().getDisplayName() != null) { value = Double.parseDouble(ChatColor.stripColor(stack.getItemMeta().getDisplayName()).replace("$", "")); } value = value*stack.getAmount(); removeAll.add(stack); if (value > 50000 || value < 0) continue; double has = EconomyAPI.getUserBalance(player.getUniqueId()); has+=value; EconomyAPI.setUserBalance(player.getUniqueId(), has); player.sendMessage(ChatColor.GREEN+""+ChatColor.BOLD+"+ $"+value); player.playSound(player.getLocation(), Sound.ORB_PICKUP, 1, (float)(Math.random()*2)); } } event.getInventory().removeItem(removeAll.toArray(new ItemStack[0])); } } private HashSet<Chunk> scanned = new HashSet<>(); public boolean cleanChunk(Chunk c) { if (scanned.contains(c)) return false; scanned.add(c); if (c.getTileEntities().length <= 0) return false; int remove = 0; List<BlockState> chests = Lists.newArrayList(); for (int x = 0; x < c.getTileEntities().length; x++) { BlockState at = c.getTileEntities()[x]; if (at instanceof Chest || at instanceof DoubleChest) { if (at.getBlock().getType().equals(Material.ENDER_CHEST)) continue; remove++; chests.add(at); } } remove = (remove-6); if (remove < 0) return false; for (BlockState s : chests) { remove--; if (remove > 0) { s.getBlock().setType(Material.AIR); GTAChests.log.debug("Removing chest at: "+s.getBlock().getX()+", "+s.getBlock().getY()+", "+s.getBlock().getZ(), getClass()); } } return true; } private void fill(Location loc, Inventory inv, double percentModifier, int maxTriesModifier) { RegionType rt = RegionType.getRegionType(loc); GTAChests.log.debug("Fill chest in region " +(rt == null ? "null" : rt.toString())+" at (" +loc.getWorld().getName()+"," +loc.getBlockX()+"," +loc.getBlockY()+"," +loc.getBlockZ()+")", getClass()); for (int i = 0; i < GTAChests.getInstance().getRange().roll(); i++) { ItemData select = null; int x = 0; while (select == null && (x < (10+maxTriesModifier))) { if (rt == null) select = GTAChests.getInstance().getGlobalData().get((int)(Math.random() * GTAChests.getInstance().getGlobalData().size())); else select = GTAChests.getInstance().getItemsByRegion().get(rt).get((int) (Math.random() * GTAChests.getInstance().getItemsByRegion().get(rt).size())); if (!select.getChance().didWin(percentModifier)) select = null; ++x; } if (select != null) inv.setItem(i, select.rebuild()); } } }