package dk.thoerup.bukkit.hoeruputils; import java.util.HashMap; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.Chest; import org.bukkit.block.DoubleChest; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.inventory.InventoryOpenEvent; import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.Plugin; public class SnitchingChest implements Listener, CommandExecutor{ class ItemCount extends TreeMap { private static final long serialVersionUID = 1L; }; HashMap contentMap = new HashMap(); HashMap chestMap = new HashMap(); Plugin plugin; public SnitchingChest(Plugin plugin) { this.plugin = plugin; loadChests(); } @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { if (! (sender instanceof Player) ) { sender.sendMessage("this is not a console command!"); return true; } Player player = (Player) sender; Block b = player.getTargetBlock(null, 30); Location loc = b.getLocation(); if (b.getTypeId() != 54) { player.sendMessage("[SnitchingChest] Please look at the chest you want to be a snitch"); return true; } Location loc2 = getNeighborChest(loc); String owner = chestMap.get(loc); if (owner != null) { if (owner.equals(player.getName())) { player.sendMessage("[SnitchingChest] Removing surveillance from chest"); chestMap.remove(loc); if (loc2 != null) { chestMap.remove(loc2); } saveChests(); } else { player.sendMessage("[SnitchingChest] Chest is already under surveillance"); } return true; } chestMap.put(loc, player.getName() ); if (loc2 != null) { chestMap.put(loc2, player.getName() ); } player.sendMessage("[SnitchingChest] Chest is now under surveillance"); saveChests(); return true; } @EventHandler public void onBlockBreak(BlockBreakEvent event) { Location loc = event.getBlock().getLocation(); String owner = chestMap.get(loc); if (owner != null) { if (owner.equals(event.getPlayer().getName())) { chestMap.remove(loc); saveChests(); event.getPlayer().sendMessage("[SnitchingChest] The destroyed chest was under surveillance"); } else { event.setCancelled(true); event.getPlayer().sendMessage("You can't destroy that chest"); } } } void loadChests() { } void saveChests() { } Location getNeighborChest(Location loc) { World world = loc.getWorld(); Location target = new Location(world, loc.getX()+1, loc.getY(), loc.getZ() ); if (world.getBlockAt(target).getType() == Material.CHEST ) return target; target = new Location(world, loc.getX()-1, loc.getY(), loc.getZ() ); if (world.getBlockAt(target).getType() == Material.CHEST ) return target; target = new Location(world, loc.getX(), loc.getY(), loc.getZ() +1); if (world.getBlockAt(target).getType() == Material.CHEST ) return target; target = new Location(world, loc.getX(), loc.getY(), loc.getZ() -1); if (world.getBlockAt(target).getType() == Material.CHEST ) return target; return null; } Location getChestLocation(InventoryHolder holder) { Location loc; if ( holder instanceof Chest) { loc = ( (Chest)holder).getLocation(); } else { loc = ( (DoubleChest)holder).getLocation(); } return loc; } @EventHandler public void onChestOpen(InventoryOpenEvent event) { if (! (event.getPlayer() instanceof Player)) { return; } InventoryHolder holder = event.getInventory().getHolder(); if (holder instanceof Chest || holder instanceof DoubleChest) { Location loc = getChestLocation(holder); String owner = chestMap.get( loc ); if (owner == null) { return; //chest not surveyed by this plugin } Player player = (Player) event.getPlayer(); if (player.getName().equals(owner)) { return; //chest is owned by it's own player } ItemCount contents = countItems( event.getInventory().getContents() ); contentMap.put(player.getName(), contents ); } } @EventHandler public void onChestClose(InventoryCloseEvent event) { if (! (event.getPlayer() instanceof Player)) { return; } InventoryHolder holder = event.getInventory().getHolder(); if (holder instanceof Chest || holder instanceof DoubleChest) { Location loc = getChestLocation(holder); Player player = (Player) event.getPlayer(); ItemCount savedContent = contentMap.get( player.getName() ); if (savedContent == null) { return; } contentMap.remove( player.getName() ); ItemCount content = countItems( event.getInventory().getContents() ); Set combinedKeyset = new TreeSet(); combinedKeyset.addAll( savedContent.keySet() ); combinedKeyset.addAll( content.keySet() ); for (Integer item : combinedKeyset ) { Integer savedcount = savedContent.get(item); Integer count = content.get(item); if (savedcount == null) savedcount = 0; if (count == null) count = 0; int diff = Math.abs( savedcount - count); if (count > savedcount) { String msg = player.getName() + " added " + diff + " units of " + item ; plugin.getLogger().info(msg); } if (count < savedcount) { String msg = player.getName() + " removed " + diff + " units of " + item " from "; plugin.getLogger().info(msg); } } } } ItemCount countItems(ItemStack[] input) { ItemCount output = new ItemCount(); for (int i=0; i