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.Location;
|
||||||
import org.bukkit.block.BlockState;
|
import org.bukkit.block.BlockState;
|
||||||
import org.bukkit.block.ContainerBlock;
|
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.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;
|
import de.diddiz.util.BukkitUtils;
|
||||||
|
|
||||||
class LBChestAccessListener extends PlayerListener
|
class LBChestAccessListener extends InventoryListener
|
||||||
{
|
{
|
||||||
private final Consumer consumer;
|
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) {
|
LBChestAccessListener(LogBlock logblock) {
|
||||||
consumer = logblock.getConsumer();
|
consumer = logblock.getConsumer();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void logChestAccess(String playerName) {
|
@Override
|
||||||
final Container container = containers.get(playerName.hashCode());
|
public void onInventoryClose(InventoryCloseEvent event) {
|
||||||
final Location loc = container.getLocation();
|
if (!event.isCancelled() && event.getLocation() != null && containers.containsKey(event.getPlayer().getName().hashCode())) {
|
||||||
final ItemStack[] after = BukkitUtils.compressInventory(((ContainerBlock)loc.getWorld().getBlockAt(loc).getState()).getInventory().getContents());
|
final String playerName = event.getPlayer().getName();
|
||||||
final ItemStack[] diff = BukkitUtils.compareInventories(container.getContent(), after);
|
final Location loc = event.getLocation();
|
||||||
for (final ItemStack item : diff)
|
final ItemStack[] before = containers.get(playerName.hashCode());
|
||||||
consumer.queueChestAccess(playerName, loc, container.getTypeId(), (short)item.getTypeId(), (short)item.getAmount(), BukkitUtils.rawData(item));
|
final ItemStack[] after = BukkitUtils.compressInventory(event.getInventory().getContents());
|
||||||
containers.remove(playerName.hashCode());
|
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
|
@Override
|
||||||
public void onPlayerInteract(PlayerInteractEvent event) {
|
public void onInventoryOpen(InventoryOpenEvent event) {
|
||||||
if (containers.containsKey(event.getPlayer().getName().hashCode()))
|
if (!event.isCancelled() && event.getLocation() != null) {
|
||||||
logChestAccess(event.getPlayer().getName());
|
final BlockState state = event.getLocation().getWorld().getBlockAt(event.getLocation()).getState();
|
||||||
if (!event.isCancelled() && event.getAction() == Action.RIGHT_CLICK_BLOCK) {
|
|
||||||
final BlockState state = event.getClickedBlock().getState();
|
|
||||||
if (state instanceof ContainerBlock)
|
if (state instanceof ContainerBlock)
|
||||||
containers.put(event.getPlayer().getName().hashCode(), new Container(state));
|
containers.put(event.getPlayer().getName().hashCode(), BukkitUtils.compressInventory(((ContainerBlock)state).getInventory().getContents()));
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -136,11 +136,11 @@ public class LogBlock extends JavaPlugin
|
|||||||
pm.registerEvent(Type.ENTITY_EXPLODE, lbEntityListener, Priority.Monitor, this);
|
pm.registerEvent(Type.ENTITY_EXPLODE, lbEntityListener, Priority.Monitor, this);
|
||||||
if (config.logLeavesDecay)
|
if (config.logLeavesDecay)
|
||||||
pm.registerEvent(Type.LEAVES_DECAY, lbBlockListener, Priority.Monitor, this);
|
pm.registerEvent(Type.LEAVES_DECAY, lbBlockListener, Priority.Monitor, this);
|
||||||
if (config.logChestAccess) {
|
if (config.logChestAccess)
|
||||||
final LBChestAccessListener chestAccessListener = new LBChestAccessListener(this);
|
if (getServer().getPluginManager().getPlugin("BukkitContrib") != null)
|
||||||
pm.registerEvent(Type.PLAYER_INTERACT, chestAccessListener, Priority.Monitor, this);
|
getServer().getPluginManager().registerEvent(Type.CUSTOM_EVENT, new LBChestAccessListener(this), Priority.Monitor, this);
|
||||||
pm.registerEvent(Type.PLAYER_MOVE, chestAccessListener, Priority.Monitor, this);
|
else
|
||||||
}
|
log.warning("[LogBlock] BukkitContrib not found. Can't log chest accesses.");
|
||||||
if (config.logLavaFlow)
|
if (config.logLavaFlow)
|
||||||
pm.registerEvent(Type.BLOCK_FROMTO, lbBlockListener, Priority.Monitor, this);
|
pm.registerEvent(Type.BLOCK_FROMTO, lbBlockListener, Priority.Monitor, this);
|
||||||
if (config.logKills)
|
if (config.logKills)
|
||||||
|
@@ -119,6 +119,7 @@ public class WorldEditor implements Runnable
|
|||||||
this.itemData = itemData;
|
this.itemData = itemData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO Fix doors and beds
|
||||||
private PerformResult perform() {
|
private PerformResult perform() {
|
||||||
if (config.dontRollback.contains(replaced))
|
if (config.dontRollback.contains(replaced))
|
||||||
return PerformResult.BLACKLISTED;
|
return PerformResult.BLACKLISTED;
|
||||||
|
@@ -3,6 +3,7 @@ package de.diddiz.util;
|
|||||||
import java.io.BufferedOutputStream;
|
import java.io.BufferedOutputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
@@ -11,7 +12,7 @@ import java.text.SimpleDateFormat;
|
|||||||
|
|
||||||
public class Utils
|
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())
|
if (!file.getParentFile().exists())
|
||||||
file.getParentFile().mkdir();
|
file.getParentFile().mkdir();
|
||||||
if (file.exists())
|
if (file.exists())
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
name: LogBlock
|
name: LogBlock
|
||||||
version: '1.00rc1'
|
version: '1.00rc2'
|
||||||
author: DiddiZ, bootswithdefer
|
author: DiddiZ, bootswithdefer
|
||||||
website: http://www.diddiz.de/minecraft/
|
website: http://www.diddiz.de/minecraft/
|
||||||
main: de.diddiz.LogBlock.LogBlock
|
main: de.diddiz.LogBlock.LogBlock
|
||||||
|
Reference in New Issue
Block a user