Fix chest logging for double chests and maybe other block types.

This commit is contained in:
md_5
2012-06-24 10:44:31 +10:00
parent 18d4ab9f66
commit 54ea789ab9
2 changed files with 31 additions and 5 deletions

View File

@@ -2,16 +2,20 @@ package de.diddiz.LogBlock.listeners;
import static de.diddiz.util.BukkitUtils.compareInventories; import static de.diddiz.util.BukkitUtils.compareInventories;
import static de.diddiz.util.BukkitUtils.compressInventory; import static de.diddiz.util.BukkitUtils.compressInventory;
import static de.diddiz.util.BukkitUtils.getInventoryHolderType;
import static de.diddiz.util.BukkitUtils.getInventoryHolderLocation;
import static de.diddiz.util.BukkitUtils.rawData; import static de.diddiz.util.BukkitUtils.rawData;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.block.BlockState; import org.bukkit.block.BlockState;
import org.bukkit.block.DoubleChest;
import org.bukkit.entity.HumanEntity; import org.bukkit.entity.HumanEntity;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.inventory.InventoryOpenEvent; import org.bukkit.event.inventory.InventoryOpenEvent;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import de.diddiz.LogBlock.LogBlock; import de.diddiz.LogBlock.LogBlock;
@@ -25,13 +29,14 @@ public class ChestAccessLogging extends LoggingListener
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onInventoryClose(InventoryCloseEvent event) { public void onInventoryClose(InventoryCloseEvent event) {
if (event.getInventory().getHolder() instanceof BlockState) { InventoryHolder holder = event.getInventory().getHolder();
if (holder instanceof BlockState || holder instanceof DoubleChest) {
final HumanEntity player = event.getPlayer(); final HumanEntity player = event.getPlayer();
final ItemStack[] before = containers.get(player); final ItemStack[] before = containers.get(player);
if (before != null) { if (before != null) {
final ItemStack[] after = compressInventory(event.getInventory().getContents()); final ItemStack[] after = compressInventory(event.getInventory().getContents());
final ItemStack[] diff = compareInventories(before, after); final ItemStack[] diff = compareInventories(before, after);
final Location loc = ((BlockState)event.getInventory().getHolder()).getLocation(); final Location loc = getInventoryHolderLocation(holder);
for (final ItemStack item : diff) { for (final ItemStack item : diff) {
consumer.queueChestAccess(player.getName(), loc, loc.getWorld().getBlockTypeIdAt(loc), (short)item.getTypeId(), (short)item.getAmount(), rawData(item)); consumer.queueChestAccess(player.getName(), loc, loc.getWorld().getBlockTypeIdAt(loc), (short)item.getTypeId(), (short)item.getAmount(), rawData(item));
} }
@@ -42,9 +47,9 @@ public class ChestAccessLogging extends LoggingListener
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onInventoryOpen(InventoryOpenEvent event) { public void onInventoryOpen(InventoryOpenEvent event) {
if (event.getInventory().getHolder() instanceof BlockState) { InventoryHolder holder = event.getInventory().getHolder();
BlockState block = (BlockState)event.getInventory().getHolder(); if (holder instanceof BlockState || holder instanceof DoubleChest) {
if (block.getTypeId() != 58) { if (getInventoryHolderType(holder) != 58) {
containers.put(event.getPlayer(), compressInventory(event.getInventory().getContents())); containers.put(event.getPlayer(), compressInventory(event.getInventory().getContents()));
} }
} }

View File

@@ -13,6 +13,7 @@ import org.bukkit.Chunk;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.block.BlockState; import org.bukkit.block.BlockState;
import org.bukkit.block.DoubleChest;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.entity.TNTPrimed; import org.bukkit.entity.TNTPrimed;
@@ -35,6 +36,26 @@ public class BukkitUtils
blockEquivalents.add(new HashSet<Integer>(Arrays.asList(93, 94))); blockEquivalents.add(new HashSet<Integer>(Arrays.asList(93, 94)));
} }
public static int getInventoryHolderType(InventoryHolder holder) {
if (holder instanceof BlockState) {
return ((BlockState)holder).getTypeId();
} else if (holder instanceof DoubleChest) {
return ((DoubleChest)holder).getLocation().getBlock().getTypeId();
} else {
return -1;
}
}
public static Location getInventoryHolderLocation(InventoryHolder holder) {
if (holder instanceof BlockState) {
return ((BlockState)holder).getLocation();
} else if (holder instanceof DoubleChest) {
return ((DoubleChest)holder).getLocation();
} else {
return null;
}
}
public static ItemStack[] compareInventories(ItemStack[] items1, ItemStack[] items2) { public static ItemStack[] compareInventories(ItemStack[] items1, ItemStack[] items2) {
final ItemStackComparator comperator = new ItemStackComparator(); final ItemStackComparator comperator = new ItemStackComparator();
final ArrayList<ItemStack> diff = new ArrayList<ItemStack>(); final ArrayList<ItemStack> diff = new ArrayList<ItemStack>();