forked from LogBlock/LogBlock
Implemented BukkitContrib for chest logging.
This commit is contained in:
@@ -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()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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())
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user