From ec37a4e249326497e9f75fe039b1e64a5f95538f Mon Sep 17 00:00:00 2001 From: Robin Kupper Date: Wed, 25 May 2011 02:20:37 +0200 Subject: [PATCH] Implemented BukkitContrib for chest logging. --- .../LogBlock/LBChestAccessListener.java | 84 +++++-------------- src/de/diddiz/LogBlock/LogBlock.java | 10 +-- src/de/diddiz/LogBlock/WorldEditor.java | 1 + src/de/diddiz/util/Utils.java | 3 +- src/plugin.yml | 2 +- 5 files changed, 30 insertions(+), 70 deletions(-) diff --git a/src/de/diddiz/LogBlock/LBChestAccessListener.java b/src/de/diddiz/LogBlock/LBChestAccessListener.java index 8848685..2324527 100644 --- a/src/de/diddiz/LogBlock/LBChestAccessListener.java +++ b/src/de/diddiz/LogBlock/LBChestAccessListener.java @@ -4,83 +4,41 @@ import java.util.HashMap; import org.bukkit.Location; import org.bukkit.block.BlockState; import org.bukkit.block.ContainerBlock; -import org.bukkit.event.block.Action; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerListener; -import org.bukkit.event.player.PlayerMoveEvent; -import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemStack; +import org.bukkitcontrib.event.inventory.InventoryCloseEvent; +import org.bukkitcontrib.event.inventory.InventoryListener; +import org.bukkitcontrib.event.inventory.InventoryOpenEvent; import de.diddiz.util.BukkitUtils; -class LBChestAccessListener extends PlayerListener +class LBChestAccessListener extends InventoryListener { private final Consumer consumer; - private final HashMap containers = new HashMap(); + private final HashMap containers = new HashMap(); LBChestAccessListener(LogBlock logblock) { consumer = logblock.getConsumer(); } - private void logChestAccess(String playerName) { - final Container container = containers.get(playerName.hashCode()); - final Location loc = container.getLocation(); - final ItemStack[] after = BukkitUtils.compressInventory(((ContainerBlock)loc.getWorld().getBlockAt(loc).getState()).getInventory().getContents()); - final ItemStack[] diff = BukkitUtils.compareInventories(container.getContent(), after); - for (final ItemStack item : diff) - consumer.queueChestAccess(playerName, loc, container.getTypeId(), (short)item.getTypeId(), (short)item.getAmount(), BukkitUtils.rawData(item)); - containers.remove(playerName.hashCode()); + @Override + public void onInventoryClose(InventoryCloseEvent event) { + if (!event.isCancelled() && event.getLocation() != null && containers.containsKey(event.getPlayer().getName().hashCode())) { + final String playerName = event.getPlayer().getName(); + final Location loc = event.getLocation(); + final ItemStack[] before = containers.get(playerName.hashCode()); + final ItemStack[] after = BukkitUtils.compressInventory(event.getInventory().getContents()); + final ItemStack[] diff = BukkitUtils.compareInventories(before, after); + for (final ItemStack item : diff) + consumer.queueChestAccess(playerName, loc, loc.getWorld().getBlockTypeIdAt(loc), (short)item.getTypeId(), (short)item.getAmount(), BukkitUtils.rawData(item)); + containers.remove(playerName.hashCode()); + } } @Override - public void onPlayerInteract(PlayerInteractEvent event) { - if (containers.containsKey(event.getPlayer().getName().hashCode())) - logChestAccess(event.getPlayer().getName()); - if (!event.isCancelled() && event.getAction() == Action.RIGHT_CLICK_BLOCK) { - final BlockState state = event.getClickedBlock().getState(); + public void onInventoryOpen(InventoryOpenEvent event) { + if (!event.isCancelled() && event.getLocation() != null) { + final BlockState state = event.getLocation().getWorld().getBlockAt(event.getLocation()).getState(); if (state instanceof ContainerBlock) - containers.put(event.getPlayer().getName().hashCode(), new Container(state)); - } - } - - @Override - public void onPlayerMove(PlayerMoveEvent event) { - final Container container = containers.get(event.getPlayer().getName().hashCode()); - if (container != null && !container.isSliding()) - logChestAccess(event.getPlayer().getName()); - } - - @Override - public void onPlayerQuit(PlayerQuitEvent event) { - if (containers.containsKey(event.getPlayer().getName().hashCode())) - logChestAccess(event.getPlayer().getName()); - } - - private static class Container - { - private final ItemStack[] content; - private final BlockState state; - private final long start; - - Container(BlockState state) { - this.state = state; - content = BukkitUtils.compressInventory(((ContainerBlock)state).getInventory().getContents()); - start = System.currentTimeMillis(); - } - - ItemStack[] getContent() { - return content; - } - - Location getLocation() { - return new Location(state.getWorld(), state.getX(), state.getY(), state.getZ()); - } - - int getTypeId() { - return state.getTypeId(); - } - - boolean isSliding() { - return System.currentTimeMillis() - start < 500; + containers.put(event.getPlayer().getName().hashCode(), BukkitUtils.compressInventory(((ContainerBlock)state).getInventory().getContents())); } } } diff --git a/src/de/diddiz/LogBlock/LogBlock.java b/src/de/diddiz/LogBlock/LogBlock.java index b2f94f1..821adb0 100644 --- a/src/de/diddiz/LogBlock/LogBlock.java +++ b/src/de/diddiz/LogBlock/LogBlock.java @@ -136,11 +136,11 @@ public class LogBlock extends JavaPlugin pm.registerEvent(Type.ENTITY_EXPLODE, lbEntityListener, Priority.Monitor, this); if (config.logLeavesDecay) pm.registerEvent(Type.LEAVES_DECAY, lbBlockListener, Priority.Monitor, this); - if (config.logChestAccess) { - final LBChestAccessListener chestAccessListener = new LBChestAccessListener(this); - pm.registerEvent(Type.PLAYER_INTERACT, chestAccessListener, Priority.Monitor, this); - pm.registerEvent(Type.PLAYER_MOVE, chestAccessListener, Priority.Monitor, this); - } + if (config.logChestAccess) + if (getServer().getPluginManager().getPlugin("BukkitContrib") != null) + getServer().getPluginManager().registerEvent(Type.CUSTOM_EVENT, new LBChestAccessListener(this), Priority.Monitor, this); + else + log.warning("[LogBlock] BukkitContrib not found. Can't log chest accesses."); if (config.logLavaFlow) pm.registerEvent(Type.BLOCK_FROMTO, lbBlockListener, Priority.Monitor, this); if (config.logKills) diff --git a/src/de/diddiz/LogBlock/WorldEditor.java b/src/de/diddiz/LogBlock/WorldEditor.java index 0ea0324..01fdd00 100644 --- a/src/de/diddiz/LogBlock/WorldEditor.java +++ b/src/de/diddiz/LogBlock/WorldEditor.java @@ -119,6 +119,7 @@ public class WorldEditor implements Runnable this.itemData = itemData; } + // TODO Fix doors and beds private PerformResult perform() { if (config.dontRollback.contains(replaced)) return PerformResult.BLACKLISTED; diff --git a/src/de/diddiz/util/Utils.java b/src/de/diddiz/util/Utils.java index 150e842..9f7ae9e 100644 --- a/src/de/diddiz/util/Utils.java +++ b/src/de/diddiz/util/Utils.java @@ -3,6 +3,7 @@ package de.diddiz.util; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; +import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; @@ -11,7 +12,7 @@ import java.text.SimpleDateFormat; public class Utils { - public static void download(URL u, File file) throws Exception { + public static void download(URL u, File file) throws IOException { if (!file.getParentFile().exists()) file.getParentFile().mkdir(); if (file.exists()) diff --git a/src/plugin.yml b/src/plugin.yml index 860b43f..53d7d2b 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -1,5 +1,5 @@ name: LogBlock -version: '1.00rc1' +version: '1.00rc2' author: DiddiZ, bootswithdefer website: http://www.diddiz.de/minecraft/ main: de.diddiz.LogBlock.LogBlock