Implemented BukkitContrib for chest logging.

This commit is contained in:
Robin Kupper
2011-05-25 02:20:37 +02:00
parent 009b4b2595
commit ec37a4e249
5 changed files with 30 additions and 70 deletions

View File

@@ -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<Integer, Container> containers = new HashMap<Integer, Container>();
private final HashMap<Integer, ItemStack[]> containers = new HashMap<Integer, ItemStack[]>();
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()));
}
}
}

View File

@@ -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)

View File

@@ -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;

View File

@@ -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())

View File

@@ -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