diff --git a/src/de/diddiz/LogBlock/Config.java b/src/de/diddiz/LogBlock/Config.java index d793f03..50621b9 100644 --- a/src/de/diddiz/LogBlock/Config.java +++ b/src/de/diddiz/LogBlock/Config.java @@ -10,6 +10,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import java.util.zip.DataFormatException; import org.bukkit.Material; @@ -24,7 +25,7 @@ public class Config public final boolean useBukkitScheduler; public final int keepLogDays; public final boolean dumpDeletedLog; - public boolean logBlockCreations, logBlockDestroyings, logSignTexts, logExplosions, logFire, logLeavesDecay, logLavaFlow, logChestAccess, logButtonsAndLevers, logKills, logChat; + public boolean logBlockPlacings, logBlockBreaks, logSignTexts, logExplosions, logFire, logLeavesDecay, logLavaFlow, logWaterFlow, logChestAccess, logButtonsAndLevers, logKills, logChat; public final boolean logCreeperExplosionsAsPlayerWhoTriggeredThese; public final LogKillsLevel logKillsLevel; public final Set dontRollback, replaceAnyway; @@ -200,10 +201,10 @@ public class Config for (final String world : worldNames) worlds.put(world.hashCode(), new WorldConfig(new File("plugins/LogBlock/" + friendlyWorldname(world) + ".yml"))); for (final WorldConfig wcfg : worlds.values()) { - if (wcfg.logBlockCreations) - logBlockCreations = true; - if (wcfg.logBlockDestroyings) - logBlockDestroyings = true; + if (wcfg.logBlockPlacings) + logBlockPlacings = true; + if (wcfg.logBlockBreaks) + logBlockBreaks = true; if (wcfg.logSignTexts) logSignTexts = true; if (wcfg.logExplosions) @@ -214,6 +215,8 @@ public class Config logLeavesDecay = true; if (wcfg.logLavaFlow) logLavaFlow = true; + if (wcfg.logWaterFlow) + logWaterFlow = true; if (wcfg.logChestAccess) logChestAccess = true; if (wcfg.logButtonsAndLevers) @@ -230,45 +233,39 @@ public class Config class WorldConfig { public final String table; - public final boolean logBlockCreations, logBlockDestroyings, logSignTexts, logExplosions, logFire, logLeavesDecay, logLavaFlow, logChestAccess, logButtonsAndLevers, logKills, logChat; + public final boolean logBlockPlacings, logBlockBreaks, logSignTexts, logExplosions, logFire, logLeavesDecay, logLavaFlow, logWaterFlow, logChestAccess, logButtonsAndLevers, logKills, logChat; public WorldConfig(File file) { + final Map def = new HashMap(); + def.put("table", "lb-" + file.getName().substring(0, file.getName().length() - 4)); + def.put("logBlockCreations", true); + def.put("logBlockDestroyings", true); + def.put("logSignTexts", true); + def.put("logExplosions", true); + def.put("logFire", true); + def.put("logLeavesDecay", false); + def.put("logLavaFlow", false); + def.put("logWaterFlow", false); + def.put("logChestAccess", false); + def.put("logButtonsAndLevers", false); + def.put("logKills", false); + def.put("logChat", false); final Configuration config = new Configuration(file); config.load(); final List keys = config.getKeys(null); - if (!keys.contains("table")) - config.setProperty("table", "lb-" + file.getName().substring(0, file.getName().length() - 4)); - if (!keys.contains("logBlockCreations")) - config.setProperty("logBlockCreations", true); - if (!keys.contains("logBlockDestroyings")) - config.setProperty("logBlockDestroyings", true); - if (!keys.contains("logSignTexts")) - config.setProperty("logSignTexts", false); - if (!keys.contains("logExplosions")) - config.setProperty("logExplosions", false); - if (!keys.contains("logFire")) - config.setProperty("logFire", false); - if (!keys.contains("logLeavesDecay")) - config.setProperty("logLeavesDecay", false); - if (!keys.contains("logLavaFlow")) - config.setProperty("logLavaFlow", false); - if (!keys.contains("logChestAccess")) - config.setProperty("logChestAccess", false); - if (!keys.contains("logButtonsAndLevers")) - config.setProperty("logButtonsAndLevers", false); - if (!keys.contains("logKills")) - config.setProperty("logKills", false); - if (!keys.contains("logChat")) - config.setProperty("logChat", false); + for (final Entry e : def.entrySet()) + if (!keys.contains(e.getKey())) + config.setProperty(e.getKey(), e.getValue()); config.save(); table = config.getString("table"); - logBlockCreations = config.getBoolean("logBlockCreations", true); - logBlockDestroyings = config.getBoolean("logBlockDestroyings", true); + logBlockPlacings = config.getBoolean("logBlockCreations", true); + logBlockBreaks = config.getBoolean("logBlockDestroyings", true); logSignTexts = config.getBoolean("logSignTexts", false); logExplosions = config.getBoolean("logExplosions", false); logFire = config.getBoolean("logFire", false); logLeavesDecay = config.getBoolean("logLeavesDecay", false); logLavaFlow = config.getBoolean("logLavaFlow", false); + logWaterFlow = config.getBoolean("logWaterFlow", false); logChestAccess = config.getBoolean("logChestAccess", false); logButtonsAndLevers = config.getBoolean("logButtonsAndLevers", false); logKills = config.getBoolean("logKills", false); diff --git a/src/de/diddiz/LogBlock/LBBlockListener.java b/src/de/diddiz/LogBlock/LBBlockListener.java index 10d1e04..01a2a0c 100644 --- a/src/de/diddiz/LogBlock/LBBlockListener.java +++ b/src/de/diddiz/LogBlock/LBBlockListener.java @@ -4,9 +4,13 @@ import java.io.File; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import org.bukkit.Location; +import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.BlockState; import org.bukkit.block.Sign; @@ -25,6 +29,7 @@ class LBBlockListener extends BlockListener private final Consumer consumer; private final Map worlds; private final List errors = new ArrayList(20); + private final Set nonFluidProofBlocks = new HashSet(Arrays.asList(27, 28, 31, 32, 37, 38, 39, 40, 50, 51, 55, 59, 66, 69, 70, 75, 76, 78, 93, 94)); LBBlockListener(LogBlock logblock) { consumer = logblock.getConsumer(); @@ -34,7 +39,7 @@ class LBBlockListener extends BlockListener @Override public void onBlockBreak(BlockBreakEvent event) { final WorldConfig wcfg = worlds.get(event.getBlock().getWorld().getName().hashCode()); - if (!event.isCancelled() && wcfg != null && wcfg.logBlockDestroyings) { + if (!event.isCancelled() && wcfg != null && wcfg.logBlockBreaks) { final int type = event.getBlock().getTypeId(); if (type == 0) { final Location loc = event.getBlock().getLocation(); @@ -59,24 +64,38 @@ class LBBlockListener extends BlockListener @Override public void onBlockFromTo(BlockFromToEvent event) { final WorldConfig wcfg = worlds.get(event.getBlock().getWorld().getName().hashCode()); - if (!event.isCancelled() && wcfg != null && wcfg.logLavaFlow) { + if (!event.isCancelled() && wcfg != null) { final int typeFrom = event.getBlock().getTypeId(); final int typeTo = event.getToBlock().getTypeId(); - if (typeFrom == 10 || typeFrom == 11) - if (typeTo == 0 || typeTo == 78) + if (typeFrom == 10 || typeFrom == 11) { + if (typeTo == 0) { + if (wcfg.logLavaFlow) + consumer.queueBlockPlace("LavaFlow", event.getToBlock().getLocation(), 10, (byte)(event.getBlock().getData() + 1)); + } else if (nonFluidProofBlocks.contains(typeTo)) consumer.queueBlockReplace("LavaFlow", event.getToBlock().getState(), 10, (byte)(event.getBlock().getData() + 1)); else if (typeTo == 8 || typeTo == 9) if (event.getFace() == BlockFace.DOWN) consumer.queueBlockReplace("LavaFlow", event.getToBlock().getState(), 10, (byte)0); else consumer.queueBlockReplace("LavaFlow", event.getToBlock().getState(), 4, (byte)0); + } else if (typeFrom == 8 || typeFrom == 9) + if (typeTo == 0 || nonFluidProofBlocks.contains(typeTo)) { + if (typeTo == 0) { + if (wcfg.logWaterFlow) + consumer.queueBlockPlace("WaterFlow", event.getToBlock().getLocation(), 8, (byte)(event.getBlock().getData() + 1)); + } else + consumer.queueBlockReplace("WaterFlow", event.getToBlock().getState(), 8, (byte)(event.getBlock().getData() + 1)); + final Block lower = event.getToBlock().getRelative(BlockFace.DOWN); + if (lower.getTypeId() == 10 || lower.getTypeId() == 11) + consumer.queueBlockReplace("WaterFlow", lower.getState(), lower.getData() == 0 ? 49 : 4, (byte)0); + } } } @Override public void onBlockPlace(BlockPlaceEvent event) { final WorldConfig wcfg = worlds.get(event.getBlock().getWorld().getName().hashCode()); - if (!event.isCancelled() && wcfg != null && wcfg.logBlockCreations) { + if (!event.isCancelled() && wcfg != null && wcfg.logBlockPlacings) { final int type = event.getBlock().getTypeId(); BlockState before = event.getBlockReplacedState(); final BlockState after = event.getBlockPlaced().getState(); diff --git a/src/de/diddiz/LogBlock/LBPlayerListener.java b/src/de/diddiz/LogBlock/LBPlayerListener.java index 2df65a8..5e93d68 100644 --- a/src/de/diddiz/LogBlock/LBPlayerListener.java +++ b/src/de/diddiz/LogBlock/LBPlayerListener.java @@ -21,14 +21,14 @@ class LBPlayerListener extends PlayerListener @Override public void onPlayerBucketEmpty(PlayerBucketEmptyEvent event) { final WorldConfig wcfg = worlds.get(event.getPlayer().getWorld().getName().hashCode()); - if (!event.isCancelled() && wcfg != null && wcfg.logBlockCreations) + if (!event.isCancelled() && wcfg != null && wcfg.logBlockPlacings) consumer.queueBlockPlace(event.getPlayer().getName(), event.getBlockClicked().getRelative(event.getBlockFace()).getLocation(), event.getBucket() == Material.WATER_BUCKET ? 9 : 11, (byte)0); } @Override public void onPlayerBucketFill(PlayerBucketFillEvent event) { final WorldConfig wcfg = worlds.get(event.getPlayer().getWorld().getName().hashCode()); - if (!event.isCancelled() && wcfg != null && wcfg.logBlockDestroyings) + if (!event.isCancelled() && wcfg != null && wcfg.logBlockBreaks) consumer.queueBlockBreak(event.getPlayer().getName(), event.getBlockClicked().getState()); } diff --git a/src/de/diddiz/LogBlock/LogBlock.java b/src/de/diddiz/LogBlock/LogBlock.java index 4315948..61b0fcd 100644 --- a/src/de/diddiz/LogBlock/LogBlock.java +++ b/src/de/diddiz/LogBlock/LogBlock.java @@ -157,13 +157,14 @@ public class LogBlock extends JavaPlugin final LBPlayerListener lbPlayerListener = new LBPlayerListener(this); final LBEntityListener lbEntityListener = new LBEntityListener(this); pm.registerEvent(Type.PLAYER_INTERACT, new LBToolListener(this), Priority.Normal, this); - if (config.logBlockCreations) { + if (config.logBlockPlacings) { pm.registerEvent(Type.BLOCK_PLACE, lbBlockListener, Priority.Monitor, this); pm.registerEvent(Type.PLAYER_BUCKET_EMPTY, lbPlayerListener, Priority.Monitor, this); } - if (config.logBlockDestroyings) { + if (config.logBlockBreaks) { pm.registerEvent(Type.BLOCK_BREAK, lbBlockListener, Priority.Monitor, this); pm.registerEvent(Type.PLAYER_BUCKET_FILL, lbPlayerListener, Priority.Monitor, this); + pm.registerEvent(Type.BLOCK_FROMTO, lbBlockListener, Priority.Monitor, this); } if (config.logSignTexts) pm.registerEvent(Type.SIGN_CHANGE, lbBlockListener, Priority.Monitor, this); @@ -178,8 +179,6 @@ public class LogBlock extends JavaPlugin pm.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.logButtonsAndLevers) pm.registerEvent(Type.PLAYER_INTERACT, lbPlayerListener, Priority.Monitor, this); if (config.logKills) @@ -202,7 +201,7 @@ public class LogBlock extends JavaPlugin timer.scheduleAtFixedRate(consumer, config.delayBetweenRuns * 1000, config.delayBetweenRuns * 1000); log.info("[LogBlock] Scheduled consumer with timer."); } - log.info("Logblock v" + getDescription().getVersion() + " by DiddiZ enabled."); + log.info("LogBlock v" + getDescription().getVersion() + " by DiddiZ enabled."); } @Override