From f38f729ed4a920c3230f793a3f8afef4fc7f296f Mon Sep 17 00:00:00 2001 From: Robin Kupper Date: Thu, 26 May 2011 16:58:07 +0200 Subject: [PATCH] Fixed clearlog, added hiddenPlayers and implemented 2 block items rollback (doors nad beds) --- src/de/diddiz/LogBlock/CommandsHandler.java | 74 ++++++++++---------- src/de/diddiz/LogBlock/Config.java | 6 ++ src/de/diddiz/LogBlock/Consumer.java | 4 +- src/de/diddiz/LogBlock/LBBlockListener.java | 46 ++++++------ src/de/diddiz/LogBlock/LBEntityListener.java | 32 ++++----- src/de/diddiz/LogBlock/LBPlayerListener.java | 12 ++-- src/de/diddiz/LogBlock/LBToolListener.java | 25 ++++--- src/de/diddiz/LogBlock/LogBlock.java | 18 +++-- src/de/diddiz/LogBlock/QueryParams.java | 6 ++ src/de/diddiz/LogBlock/WorldEditor.java | 24 +++++++ 10 files changed, 148 insertions(+), 99 deletions(-) diff --git a/src/de/diddiz/LogBlock/CommandsHandler.java b/src/de/diddiz/LogBlock/CommandsHandler.java index c5860fc..6aa2ce1 100644 --- a/src/de/diddiz/LogBlock/CommandsHandler.java +++ b/src/de/diddiz/LogBlock/CommandsHandler.java @@ -511,46 +511,46 @@ public class CommandsHandler implements CommandExecutor public void run() { try { final File dumpFolder = new File(logblock.getDataFolder(), "dumb"); + final SimpleDateFormat formatter = new SimpleDateFormat("yyMMddHHmmss"); int deleted; - for (final String table : config.tables.values()) { - rs = state.executeQuery("SELECT count(*) FROM `" + table + "` " + params.getWhere()); - rs.next(); - if ((deleted = rs.getInt(1)) > 0) { - if (config.askClearLogs && sender instanceof Player && questioner != null) { - sender.sendMessage(ChatColor.DARK_AQUA + "Searching " + params.getTitle() + ":"); - sender.sendMessage(ChatColor.GREEN.toString() + deleted + " blocks found."); - if (!questioner.askQuestion((Player)sender, "Are you sure you want to continue?", "yes", "no").equals("yes")) { - sender.sendMessage(ChatColor.RED + "ClearLog aborted"); - return; - } + final String table = params.getTable(); + rs = state.executeQuery("SELECT count(*) FROM `" + table + "` " + params.getWhere()); + rs.next(); + if ((deleted = rs.getInt(1)) > 0) { + if (config.askClearLogs && sender instanceof Player && questioner != null) { + sender.sendMessage(ChatColor.DARK_AQUA + "Searching " + params.getTitle() + ":"); + sender.sendMessage(ChatColor.GREEN.toString() + deleted + " blocks found."); + if (!questioner.askQuestion((Player)sender, "Are you sure you want to continue?", "yes", "no").equals("yes")) { + sender.sendMessage(ChatColor.RED + "ClearLog aborted"); + return; } - if (config.dumpDeletedLog) - try { - state.execute("SELECT * FROM `" + table + "` " + params.getWhere() + "INTO OUTFILE '" + new File(dumpFolder, table + " " + params.getTitle() + ".csv").getAbsolutePath().replace("\\", "\\\\") + "' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n'"); - } catch (final SQLException ex) { - sender.sendMessage(ChatColor.RED + "Error while dumping log. Make sure your MySQL user has access to the LogBlock folder, or disable clearlog.dumpDeletedLog"); - log.log(Level.SEVERE, "[LogBlock ClearLog] Exception while dumping", ex); - return; - } - state.execute("DELETE FROM `" + table + "` " + params.getWhere()); - sender.sendMessage(ChatColor.GREEN + "Cleared out table " + table + ". Deleted " + deleted + " entries."); - } - rs = state.executeQuery("SELECT COUNT(*) FROM `" + table + "-sign` LEFT JOIN `" + table + "` USING (id) WHERE `" + table + "`.id IS NULL"); - rs.next(); - if ((deleted = rs.getInt(1)) > 0) { - if (config.dumpDeletedLog) - state.execute("SELECT id, signtext FROM `" + table + "-sign` LEFT JOIN `" + table + "` USING (id) WHERE `" + table + "`.id IS NULL INTO OUTFILE '" + new File(dumpFolder, table + "-sign " + params.getTitle() + ".csv").getAbsolutePath().replace("\\", "\\\\") + "' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n'"); - state.execute("DELETE `" + table + "-sign` FROM `" + table + "-sign` LEFT JOIN `" + table + "` USING (id) WHERE `" + table + "`.id IS NULL;"); - sender.sendMessage(ChatColor.GREEN + "Cleared out table " + table + "-sign. Deleted " + deleted + " entries."); - } - rs = state.executeQuery("SELECT COUNT(*) FROM `" + table + "-chest` LEFT JOIN `" + table + "` USING (id) WHERE `" + table + "`.id IS NULL"); - rs.next(); - if ((deleted = rs.getInt(1)) > 0) { - if (config.dumpDeletedLog) - state.execute("SELECT id, itemtype, itemamount, itemdata, FROM `" + table + "-chest` LEFT JOIN `" + table + "` USING (id) WHERE `" + table + "`.id IS NULL INTO OUTFILE '" + new File(dumpFolder, table + "-chest " + params.getTitle() + ".csv").getAbsolutePath().replace("\\", "\\\\") + "' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n'"); - state.execute("DELETE `" + table + "-chest` FROM `" + table + "-chest` LEFT JOIN `" + table + "` USING (id) WHERE `" + table + "`.id IS NULL;"); - sender.sendMessage(ChatColor.GREEN + "Cleared out table " + table + "-chest. Deleted " + deleted + " entries."); } + if (config.dumpDeletedLog) + try { + state.execute("SELECT * FROM `" + table + "` " + params.getWhere() + "INTO OUTFILE '" + new File(dumpFolder, formatter.format(System.currentTimeMillis()) + " " + table + " " + params.getTitle() + ".csv").getAbsolutePath().replace("\\", "\\\\") + "' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n'"); + } catch (final SQLException ex) { + sender.sendMessage(ChatColor.RED + "Error while dumping log. Make sure your MySQL user has access to the LogBlock folder, or disable clearlog.dumpDeletedLog"); + log.log(Level.SEVERE, "[LogBlock ClearLog] Exception while dumping", ex); + return; + } + state.execute("DELETE FROM `" + table + "` " + params.getWhere()); + sender.sendMessage(ChatColor.GREEN + "Cleared out table " + table + ". Deleted " + deleted + " entries."); + } + rs = state.executeQuery("SELECT COUNT(*) FROM `" + table + "-sign` LEFT JOIN `" + table + "` USING (id) WHERE `" + table + "`.id IS NULL"); + rs.next(); + if ((deleted = rs.getInt(1)) > 0) { + if (config.dumpDeletedLog) + state.execute("SELECT id, signtext FROM `" + table + "-sign` LEFT JOIN `" + table + "` USING (id) WHERE `" + table + "`.id IS NULL INTO OUTFILE '" + new File(dumpFolder, formatter.format(System.currentTimeMillis()) + " " + table + "-sign " + params.getTitle() + ".csv").getAbsolutePath().replace("\\", "\\\\") + "' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n'"); + state.execute("DELETE `" + table + "-sign` FROM `" + table + "-sign` LEFT JOIN `" + table + "` USING (id) WHERE `" + table + "`.id IS NULL;"); + sender.sendMessage(ChatColor.GREEN + "Cleared out table " + table + "-sign. Deleted " + deleted + " entries."); + } + rs = state.executeQuery("SELECT COUNT(*) FROM `" + table + "-chest` LEFT JOIN `" + table + "` USING (id) WHERE `" + table + "`.id IS NULL"); + rs.next(); + if ((deleted = rs.getInt(1)) > 0) { + if (config.dumpDeletedLog) + state.execute("SELECT id, itemtype, itemamount, itemdata FROM `" + table + "-chest` LEFT JOIN `" + table + "` USING (id) WHERE `" + table + "`.id IS NULL INTO OUTFILE '" + new File(dumpFolder, formatter.format(System.currentTimeMillis()) + " " + table + "-chest " + params.getTitle() + ".csv").getAbsolutePath().replace("\\", "\\\\") + "' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n'"); + state.execute("DELETE `" + table + "-chest` FROM `" + table + "-chest` LEFT JOIN `" + table + "` USING (id) WHERE `" + table + "`.id IS NULL;"); + sender.sendMessage(ChatColor.GREEN + "Cleared out table " + table + "-chest. Deleted " + deleted + " entries."); } } catch (final SQLException ex) { sender.sendMessage(ChatColor.RED + "SQL exception"); diff --git a/src/de/diddiz/LogBlock/Config.java b/src/de/diddiz/LogBlock/Config.java index 5619df7..89a0849 100644 --- a/src/de/diddiz/LogBlock/Config.java +++ b/src/de/diddiz/LogBlock/Config.java @@ -45,6 +45,7 @@ public class Config public final boolean askRollbacks; public final boolean askRedos; public final boolean askClearLogs; + public final Set hiddenPlayers; public static enum LogKillsLevel { PLAYERS, MONSTERS, ANIMALS @@ -117,6 +118,8 @@ public class Config config.setProperty("logging.logKills", false); if (!subkeys.contains("logKillsLevel")) config.setProperty("logging.logKillsLevel", "PLAYERS"); + if (!subkeys.contains("hiddenPlayers")) + config.setProperty("logging.hiddenPlayers", Arrays.asList(new String[]{"Nessie", "Bigfoot", "Chewbacca"})); subkeys = config.getKeys("rollback"); if (subkeys == null) subkeys = new ArrayList(); @@ -176,6 +179,9 @@ public class Config } catch (final IllegalArgumentException ex) { throw new Exception("lookup.toolblockID doesn't appear to be a valid log level. Allowed are 'PLAYERS', 'MONSTERS' and 'ANIMALS'"); } + hiddenPlayers = new HashSet(); + for (final String playerName : config.getStringList("hiddenPlayers", new ArrayList())) + hiddenPlayers.add(playerName.hashCode()); dontRollback = new HashSet(config.getIntList("rollback.dontRollback", null)); replaceAnyway = new HashSet(config.getIntList("rollback.replaceAnyway", null)); try { diff --git a/src/de/diddiz/LogBlock/Consumer.java b/src/de/diddiz/LogBlock/Consumer.java index 31c8115..5c2deda 100644 --- a/src/de/diddiz/LogBlock/Consumer.java +++ b/src/de/diddiz/LogBlock/Consumer.java @@ -6,6 +6,7 @@ import java.sql.SQLException; import java.sql.Statement; import java.util.HashMap; import java.util.HashSet; +import java.util.Set; import java.util.TimerTask; import java.util.concurrent.LinkedBlockingQueue; import java.util.logging.Level; @@ -25,7 +26,7 @@ public class Consumer extends TimerTask { private final LinkedBlockingQueue bqueue = new LinkedBlockingQueue(); private final Config config; - private final HashSet hiddenplayers = new HashSet(); + private final Set hiddenplayers; private final LinkedBlockingQueue kqueue = new LinkedBlockingQueue(); private final HashMap lastAttackedEntity = new HashMap(); private final HashMap lastAttackTime = new HashMap(); @@ -37,6 +38,7 @@ public class Consumer extends TimerTask this.logblock = logblock; log = logblock.getServer().getLogger(); config = logblock.getConfig(); + hiddenplayers = config.hiddenPlayers; readPlayers(); } diff --git a/src/de/diddiz/LogBlock/LBBlockListener.java b/src/de/diddiz/LogBlock/LBBlockListener.java index d364285..5162dd5 100644 --- a/src/de/diddiz/LogBlock/LBBlockListener.java +++ b/src/de/diddiz/LogBlock/LBBlockListener.java @@ -14,8 +14,8 @@ import org.bukkit.event.block.SignChangeEvent; class LBBlockListener extends BlockListener { private final Consumer consumer; - private final boolean logSignTexts; private final boolean logChestAccess; + private final boolean logSignTexts; LBBlockListener(LogBlock logblock) { consumer = logblock.getConsumer(); @@ -23,6 +23,25 @@ class LBBlockListener extends BlockListener logChestAccess = logblock.getConfig().logChestAccess; } + @Override + public void onBlockBreak(BlockBreakEvent event) { + if (!event.isCancelled()) { + final int type = event.getBlock().getTypeId(); + if (logSignTexts && (type == 63 || type == 68)) + consumer.queueSignBreak(event.getPlayer().getName(), (Sign)event.getBlock().getState()); + else if (logChestAccess && (type == 23 || type == 54 || type == 61)) + consumer.queueContainerBreak(event.getPlayer().getName(), event.getBlock().getState()); + else + consumer.queueBlockBreak(event.getPlayer().getName(), event.getBlock().getState()); + } + } + + @Override + public void onBlockBurn(BlockBurnEvent event) { + if (!event.isCancelled()) + consumer.queueBlockBreak("Fire", event.getBlock().getState()); + } + @Override public void onBlockFromTo(BlockFromToEvent event) { if (!event.isCancelled()) { @@ -55,16 +74,9 @@ class LBBlockListener extends BlockListener } @Override - public void onBlockBreak(BlockBreakEvent event) { - if (!event.isCancelled()) { - final int type = event.getBlock().getTypeId(); - if (logSignTexts && (type == 63 || type == 68)) - consumer.queueSignBreak(event.getPlayer().getName(), (Sign)event.getBlock().getState()); - else if (logChestAccess && (type == 23 || type == 54 || type == 61)) - consumer.queueContainerBreak(event.getPlayer().getName(), event.getBlock().getState()); - else - consumer.queueBlockBreak(event.getPlayer().getName(), event.getBlock().getState()); - } + public void onLeavesDecay(LeavesDecayEvent event) { + if (!event.isCancelled()) + consumer.queueBlockBreak("LeavesDecay", event.getBlock().getState()); } @Override @@ -72,16 +84,4 @@ class LBBlockListener extends BlockListener if (!event.isCancelled()) consumer.queueSignPlace(event.getPlayer().getName(), event.getBlock().getLocation(), event.getBlock().getTypeId(), event.getBlock().getData(), event.getLines()); } - - @Override - public void onBlockBurn(BlockBurnEvent event) { - if (!event.isCancelled()) - consumer.queueBlockBreak("Fire", event.getBlock().getState()); - } - - @Override - public void onLeavesDecay(LeavesDecayEvent event) { - if (!event.isCancelled()) - consumer.queueBlockBreak("LeavesDecay", event.getBlock().getState()); - } } diff --git a/src/de/diddiz/LogBlock/LBEntityListener.java b/src/de/diddiz/LogBlock/LBEntityListener.java index f2dda32..85315b9 100644 --- a/src/de/diddiz/LogBlock/LBEntityListener.java +++ b/src/de/diddiz/LogBlock/LBEntityListener.java @@ -17,10 +17,10 @@ import org.bukkit.event.entity.EntityListener; class LBEntityListener extends EntityListener { private final Consumer consumer; - private final boolean logSignTexts; private final boolean logChestAccess; private final boolean logCreeperExplosionsAsPlayer; private final Config.LogKillsLevel logKillsLevel; + private final boolean logSignTexts; LBEntityListener(LogBlock logblock) { consumer = logblock.getConsumer(); @@ -30,6 +30,21 @@ class LBEntityListener extends EntityListener logKillsLevel = logblock.getConfig().logKillsLevel; } + @Override + public void onEntityDamage(EntityDamageEvent event) { + if (event.isCancelled() || !(event instanceof EntityDamageByEntityEvent) || !(event.getEntity() instanceof LivingEntity)) + return; + final LivingEntity victim = (LivingEntity)event.getEntity(); + final Entity killer = ((EntityDamageByEntityEvent)event).getDamager(); + if (victim.getHealth() - event.getDamage() > 0 || victim.getHealth() <= 0) + return; + if (logKillsLevel == Config.LogKillsLevel.PLAYERS && !(victim instanceof Player && killer instanceof Player)) + return; + else if (logKillsLevel == Config.LogKillsLevel.MONSTERS && !((victim instanceof Player || victim instanceof Monster) && killer instanceof Player || killer instanceof Monster)) + return; + consumer.queueKill(killer, victim); + } + @Override public void onEntityExplode(EntityExplodeEvent event) { if (!event.isCancelled()) { @@ -60,19 +75,4 @@ class LBEntityListener extends EntityListener } } } - - @Override - public void onEntityDamage(EntityDamageEvent event) { - if (event.isCancelled() || !(event instanceof EntityDamageByEntityEvent) || !(event.getEntity() instanceof LivingEntity)) - return; - final LivingEntity victim = (LivingEntity)event.getEntity(); - final Entity killer = ((EntityDamageByEntityEvent)event).getDamager(); - if (victim.getHealth() - event.getDamage() > 0 || victim.getHealth() <= 0) - return; - if (logKillsLevel == Config.LogKillsLevel.PLAYERS && !(victim instanceof Player && killer instanceof Player)) - return; - else if (logKillsLevel == Config.LogKillsLevel.MONSTERS && !((victim instanceof Player || victim instanceof Monster) && killer instanceof Player || killer instanceof Monster)) - return; - consumer.queueKill(killer, victim); - } } diff --git a/src/de/diddiz/LogBlock/LBPlayerListener.java b/src/de/diddiz/LogBlock/LBPlayerListener.java index 5802146..625b252 100644 --- a/src/de/diddiz/LogBlock/LBPlayerListener.java +++ b/src/de/diddiz/LogBlock/LBPlayerListener.java @@ -13,12 +13,6 @@ class LBPlayerListener extends PlayerListener consumer = logblock.getConsumer(); } - @Override - public void onPlayerBucketFill(PlayerBucketFillEvent event) { - if (!event.isCancelled()) - consumer.queueBlockBreak(event.getPlayer().getName(), event.getBlockClicked().getState()); - } - @Override public void onPlayerBucketEmpty(PlayerBucketEmptyEvent event) { if (event.getBucket() == Material.WATER_BUCKET) @@ -26,4 +20,10 @@ class LBPlayerListener extends PlayerListener else if (event.getBucket() == Material.LAVA_BUCKET) consumer.queueBlockPlace(event.getPlayer().getName(), event.getBlockClicked().getFace(event.getBlockFace()).getLocation(), 11, (byte)0); } + + @Override + public void onPlayerBucketFill(PlayerBucketFillEvent event) { + if (!event.isCancelled()) + consumer.queueBlockBreak(event.getPlayer().getName(), event.getBlockClicked().getState()); + } } diff --git a/src/de/diddiz/LogBlock/LBToolListener.java b/src/de/diddiz/LogBlock/LBToolListener.java index f0324dd..e129820 100644 --- a/src/de/diddiz/LogBlock/LBToolListener.java +++ b/src/de/diddiz/LogBlock/LBToolListener.java @@ -1,5 +1,6 @@ package de.diddiz.LogBlock; +import java.util.Map; import org.bukkit.ChatColor; import org.bukkit.entity.Player; import org.bukkit.event.block.Action; @@ -8,26 +9,29 @@ import org.bukkit.event.player.PlayerListener; class LBToolListener extends PlayerListener { - private final LogBlock logblock; - private final Config config; private final CommandsHandler handler; + private final LogBlock logblock; + private final int toolID; + private final int toolblockID; + private final Map tables; LBToolListener(LogBlock logblock) { this.logblock = logblock; - config = logblock.getConfig(); handler = logblock.getCommandsHandler(); + toolID = logblock.getConfig().toolID; + toolblockID = logblock.getConfig().toolblockID; + tables = logblock.getConfig().tables; } @Override public void onPlayerInteract(PlayerInteractEvent event) { if (!event.isCancelled()) { final Player player = event.getPlayer(); - if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getMaterial().getId() == config.toolID && logblock.hasPermission(player, "logblock.tool") && logblock.getSession(player.getName()).toolEnabled) { - if (config.tables.get(player.getWorld().getName().hashCode()) != null) { + if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getMaterial().getId() == toolID && logblock.hasPermission(player, "logblock.tool") && logblock.getSession(player.getName()).toolEnabled) { + if (tables.get(player.getWorld().getName().hashCode()) != null) { try { final QueryParams params = logblock.getSession(player.getName()).toolQuery; - params.loc = event.getClickedBlock().getLocation(); - params.world = player.getWorld(); + params.setLocation(event.getClickedBlock().getLocation()); handler.new CommandLookup(player, params); } catch (final Exception ex) { player.sendMessage(ChatColor.RED + ex.getMessage()); @@ -36,12 +40,11 @@ class LBToolListener extends PlayerListener event.setCancelled(true); } else player.sendMessage("This world isn't logged"); - } else if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getMaterial().getId() == config.toolblockID && logblock.hasPermission(player, "logblock.toolblock") && logblock.getSession(player.getName()).toolBlockEnabled) - if (config.tables.get(player.getWorld().getName().hashCode()) != null) { + } else if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getMaterial().getId() == toolblockID && logblock.hasPermission(player, "logblock.toolblock") && logblock.getSession(player.getName()).toolBlockEnabled) + if (tables.get(player.getWorld().getName().hashCode()) != null) { try { final QueryParams params = logblock.getSession(player.getName()).toolQuery; - params.loc = event.getClickedBlock().getFace(event.getBlockFace()).getLocation(); - params.world = player.getWorld(); + params.setLocation(event.getClickedBlock().getLocation()); handler.new CommandLookup(player, params); } catch (final Exception ex) { player.sendMessage(ChatColor.RED + ex.getMessage()); diff --git a/src/de/diddiz/LogBlock/LogBlock.java b/src/de/diddiz/LogBlock/LogBlock.java index 19e73a6..b2e8230 100644 --- a/src/de/diddiz/LogBlock/LogBlock.java +++ b/src/de/diddiz/LogBlock/LogBlock.java @@ -13,6 +13,7 @@ import java.util.Map; import java.util.Timer; import java.util.logging.Level; import java.util.logging.Logger; +import org.bukkit.World; import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; import org.bukkit.entity.Player; @@ -110,11 +111,15 @@ public class LogBlock extends JavaPlugin final QueryParams params = new QueryParams(this); params.minutes = config.keepLogDays * -1440; params.bct = BlockChangeType.ALL; - try { - commandsHandler.new CommandClearLog(new ConsoleCommandSender(getServer()), params); - } catch (final Exception ex) { - log.severe("Failed to schedule ClearLog: " + ex.getMessage()); - } + for (final World world : getServer().getWorlds()) + if (config.tables.containsKey(world.getName().hashCode())) { + params.world = world; + try { + commandsHandler.new CommandClearLog(new ConsoleCommandSender(getServer()), params); + } catch (final Exception ex) { + log.severe("Failed to schedule ClearLog: " + ex.getMessage()); + } + } } final LBBlockListener lbBlockListener = new LBBlockListener(this); final LBPlayerListener lbPlayerListener = new LBPlayerListener(this); @@ -186,6 +191,7 @@ public class LogBlock extends JavaPlugin return false; try { final DatabaseMetaData dbm = conn.getMetaData(); + conn.setAutoCommit(true); state = conn.createStatement(); if (!dbm.getTables(null, null, "lb-players", null).next()) { log.log(Level.INFO, "[LogBlock] Crating table lb-players."); @@ -206,6 +212,8 @@ public class LogBlock extends JavaPlugin if (!dbm.getTables(null, null, table + "-sign", null).next()) return false; } + if (dbm.getTables(null, null, table + "-chest", null).next() && state.executeQuery("SELECT * FROM `" + table + "-chest` LIMIT 1").getMetaData().getColumnCount() != 4) // Chest table update + state.execute("DROP TABLE `" + table + "-chest`"); if (!dbm.getTables(null, null, table + "-chest", null).next()) { log.log(Level.INFO, "[LogBlock] Crating table " + table + "-chest."); state.execute("CREATE TABLE `" + table + "-chest` (id INT NOT NULL, itemtype SMALLINT UNSIGNED NOT NULL, itemamount SMALLINT NOT NULL, itemdata TINYINT UNSIGNED NOT NULL, PRIMARY KEY (id))"); diff --git a/src/de/diddiz/LogBlock/QueryParams.java b/src/de/diddiz/LogBlock/QueryParams.java index ae05456..aaf38a0 100644 --- a/src/de/diddiz/LogBlock/QueryParams.java +++ b/src/de/diddiz/LogBlock/QueryParams.java @@ -340,11 +340,17 @@ public class QueryParams implements Cloneable session.lastQuery = clone(); } + public void setLocation(Location loc) { + this.loc = loc; + world = loc.getWorld(); + } + public void setPlayer(String playerName) { players.clear(); players.add(playerName); } + @Override protected QueryParams clone() { try { return (QueryParams)super.clone(); diff --git a/src/de/diddiz/LogBlock/WorldEditor.java b/src/de/diddiz/LogBlock/WorldEditor.java index 01fdd00..28576ba 100644 --- a/src/de/diddiz/LogBlock/WorldEditor.java +++ b/src/de/diddiz/LogBlock/WorldEditor.java @@ -4,11 +4,13 @@ import java.util.concurrent.LinkedBlockingQueue; import java.util.logging.Logger; import org.bukkit.World; import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; import org.bukkit.block.BlockState; import org.bukkit.block.ContainerBlock; import org.bukkit.block.Sign; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; +import org.bukkit.material.Bed; import de.diddiz.util.BukkitUtils; public class WorldEditor implements Runnable @@ -163,6 +165,28 @@ public class WorldEditor implements Runnable sign.setLine(i, lines[i]); if (!sign.update()) return PerformResult.ERROR; + } else if (curtype == 26) { + final Bed bed = (Bed)block.getState().getData(); + final Block secBlock; + if (!bed.isHeadOfBed()) + secBlock = block.getFace(bed.getFacing()); + else + secBlock = block.getFace(bed.getFacing().getOppositeFace()); + if (secBlock.getTypeId() != 0) + return PerformResult.SUCCESS; + if (!secBlock.setTypeIdAndData(26, (byte)(bed.getData() ^ 8), true)) + return PerformResult.ERROR; + } else if (curtype == 64 || curtype == 71) { + final Block secBlock; + final byte blockData = block.getData(); + if ((blockData & 8) == 8) + secBlock = block.getFace(BlockFace.DOWN); + else + secBlock = block.getFace(BlockFace.UP); + if (secBlock.getTypeId() != 0) + return PerformResult.SUCCESS; + if (!secBlock.setTypeIdAndData(curtype, (byte)(blockData ^ 8), true)) + return PerformResult.ERROR; } return PerformResult.SUCCESS; } catch (final Exception ex) {