diff --git a/src/main/java/de/diddiz/LogBlock/CommandsHandler.java b/src/main/java/de/diddiz/LogBlock/CommandsHandler.java index a27ba72..4f7f41c 100755 --- a/src/main/java/de/diddiz/LogBlock/CommandsHandler.java +++ b/src/main/java/de/diddiz/LogBlock/CommandsHandler.java @@ -1,25 +1,22 @@ package de.diddiz.LogBlock; -import static de.diddiz.LogBlock.Session.getSession; -import static de.diddiz.LogBlock.config.Config.askClearLogAfterRollback; -import static de.diddiz.LogBlock.config.Config.askClearLogs; -import static de.diddiz.LogBlock.config.Config.askRedos; -import static de.diddiz.LogBlock.config.Config.askRollbacks; -import static de.diddiz.LogBlock.config.Config.defaultTime; -import static de.diddiz.LogBlock.config.Config.dumpDeletedLog; -import static de.diddiz.LogBlock.config.Config.getWorldConfig; -import static de.diddiz.LogBlock.config.Config.linesLimit; -import static de.diddiz.LogBlock.config.Config.linesPerPage; -import static de.diddiz.LogBlock.config.Config.rollbackMaxArea; -import static de.diddiz.LogBlock.config.Config.rollbackMaxTime; -import static de.diddiz.LogBlock.config.Config.toolsByName; -import static de.diddiz.LogBlock.config.Config.toolsByType; -import static de.diddiz.util.BukkitUtils.giveTool; -import static de.diddiz.util.BukkitUtils.saveSpawnHeight; -import static de.diddiz.util.Utils.isInt; -import static de.diddiz.util.Utils.listing; -import static org.bukkit.Bukkit.getLogger; -import static org.bukkit.Bukkit.getServer; +import de.diddiz.LogBlock.QueryParams.BlockChangeType; +import de.diddiz.LogBlock.QueryParams.Order; +import de.diddiz.LogBlock.QueryParams.SummarizationMode; +import de.diddiz.LogBlock.config.Config; +import de.diddiz.LogBlock.config.WorldConfig; +import de.diddiz.LogBlockQuestioner.LogBlockQuestioner; +import de.diddiz.util.Block; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.scheduler.BukkitScheduler; + import java.io.Closeable; import java.io.File; import java.io.FileWriter; @@ -32,22 +29,15 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.logging.Level; -import org.bukkit.ChatColor; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.scheduler.BukkitScheduler; -import de.diddiz.LogBlock.QueryParams.BlockChangeType; -import de.diddiz.LogBlock.QueryParams.Order; -import de.diddiz.LogBlock.QueryParams.SummarizationMode; -import de.diddiz.LogBlock.config.Config; -import de.diddiz.LogBlock.config.WorldConfig; -import de.diddiz.LogBlockQuestioner.LogBlockQuestioner; -import de.diddiz.util.Block; + +import static de.diddiz.LogBlock.Session.getSession; +import static de.diddiz.LogBlock.config.Config.*; +import static de.diddiz.util.BukkitUtils.giveTool; +import static de.diddiz.util.BukkitUtils.saveSpawnHeight; +import static de.diddiz.util.Utils.isInt; +import static de.diddiz.util.Utils.listing; +import static org.bukkit.Bukkit.getLogger; +import static org.bukkit.Bukkit.getServer; public class CommandsHandler implements CommandExecutor { @@ -616,10 +606,14 @@ public class CommandsHandler implements CommandExecutor if (!params.silent) sender.sendMessage(ChatColor.DARK_AQUA + "Searching " + params.getTitle() + ":"); rs = state.executeQuery(params.getQuery()); - final WorldEditor editor = new WorldEditor(logblock, params.world); + final WorldEditor editor = new WorldEditor(logblock, params.world); + while (rs.next()) editor.queueEdit(rs.getInt("x"), rs.getInt("y"), rs.getInt("z"), rs.getInt("replaced"), rs.getInt("type"), rs.getByte("data"), rs.getString("signtext"), rs.getShort("itemtype"), rs.getShort("itemamount"), rs.getByte("itemdata")); final int changes = editor.getSize(); + if (changes > 10000) { + editor.setSender(sender); + } if (!params.silent) sender.sendMessage(ChatColor.GREEN.toString() + changes + " blocks found."); if (changes == 0) { diff --git a/src/main/java/de/diddiz/LogBlock/WorldEditor.java b/src/main/java/de/diddiz/LogBlock/WorldEditor.java index 53a84a9..90e04d8 100644 --- a/src/main/java/de/diddiz/LogBlock/WorldEditor.java +++ b/src/main/java/de/diddiz/LogBlock/WorldEditor.java @@ -1,11 +1,19 @@ package de.diddiz.LogBlock; -import static de.diddiz.LogBlock.config.Config.dontRollback; -import static de.diddiz.LogBlock.config.Config.replaceAnyway; -import static de.diddiz.util.BukkitUtils.equalTypes; -import static de.diddiz.util.BukkitUtils.modifyContainer; -import static de.diddiz.util.MaterialName.materialName; -import static org.bukkit.Bukkit.getLogger; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.BlockState; +import org.bukkit.block.Sign; +import org.bukkit.command.CommandSender; +import org.bukkit.inventory.InventoryHolder; +import org.bukkit.inventory.ItemStack; +import org.bukkit.material.Bed; +import org.bukkit.material.PistonBaseMaterial; +import org.bukkit.material.PistonExtensionMaterial; + import java.io.File; import java.io.PrintWriter; import java.text.SimpleDateFormat; @@ -14,23 +22,24 @@ import java.util.List; import java.util.Queue; import java.util.concurrent.LinkedBlockingQueue; import java.util.logging.Level; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.BlockState; -import org.bukkit.block.Sign; -import org.bukkit.inventory.InventoryHolder; -import org.bukkit.inventory.ItemStack; -import org.bukkit.material.Bed; -import org.bukkit.material.PistonBaseMaterial; -import org.bukkit.material.PistonExtensionMaterial; + +import static de.diddiz.LogBlock.config.Config.dontRollback; +import static de.diddiz.LogBlock.config.Config.replaceAnyway; +import static de.diddiz.util.BukkitUtils.equalTypes; +import static de.diddiz.util.BukkitUtils.modifyContainer; +import static de.diddiz.util.MaterialName.materialName; +import static org.bukkit.Bukkit.getLogger; public class WorldEditor implements Runnable { private final LogBlock logblock; private final Queue edits = new LinkedBlockingQueue(); private final World world; + + /** + * The player responsible for editing the world, used to report progress + */ + private CommandSender sender; private int taskID; private int successes = 0, blacklistCollisions = 0; private long elapsedTime = 0; @@ -57,6 +66,11 @@ public class WorldEditor implements Runnable return blacklistCollisions; } + + public void setSender(CommandSender sender) { + this.sender = sender; + } + public void queueEdit(int x, int y, int z, int replaced, int type, byte data, String signtext, short itemType, short itemAmount, byte itemData) { edits.add(new Edit(0, new Location(world, x, y, z), null, replaced, type, data, signtext, new ChestAccess(itemType, itemAmount, itemData))); } @@ -82,6 +96,7 @@ public class WorldEditor implements Runnable public synchronized void run() { final List errorList = new ArrayList(); int counter = 0; + float size = edits.size(); while (!edits.isEmpty() && counter < 100) { try { switch (edits.poll().perform()) { @@ -98,6 +113,13 @@ public class WorldEditor implements Runnable getLogger().log(Level.WARNING, "[WorldEditor] Exeption: ", ex); } counter++; + if (sender != null) { + float percentage = ((size - edits.size()) / size) * 100.0F; + if (percentage % 20 == 0) { + sender.sendMessage(ChatColor.GOLD + "[LogBlock]" + ChatColor.YELLOW + " Rollback progress: " + percentage + "%" + + " Blocks edited: " + counter); + } + } } if (edits.isEmpty()) { logblock.getServer().getScheduler().cancelTask(taskID); diff --git a/src/main/java/de/diddiz/LogBlock/listeners/WitherLogging.java b/src/main/java/de/diddiz/LogBlock/listeners/WitherLogging.java index 9312080..260ff09 100644 --- a/src/main/java/de/diddiz/LogBlock/listeners/WitherLogging.java +++ b/src/main/java/de/diddiz/LogBlock/listeners/WitherLogging.java @@ -1,12 +1,13 @@ package de.diddiz.LogBlock.listeners; -import static de.diddiz.LogBlock.config.Config.isLogging; +import de.diddiz.LogBlock.LogBlock; +import de.diddiz.LogBlock.Logging; import org.bukkit.entity.Wither; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.entity.EntityChangeBlockEvent; -import de.diddiz.LogBlock.LogBlock; -import de.diddiz.LogBlock.Logging; + +import static de.diddiz.LogBlock.config.Config.isLogging; public class WitherLogging extends LoggingListener { @@ -17,6 +18,6 @@ public class WitherLogging extends LoggingListener @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onEntityChangeBlock(EntityChangeBlockEvent event) { if (event.getEntity() instanceof Wither && isLogging(event.getBlock().getWorld(), Logging.WITHER)) - consumer.queueBlockReplace("Wither", event.getBlock().getState(), event.getTo().getId(), (byte)0); // Wither walked through a block. + consumer.queueBlockReplace("Wither", event.getBlock().getState(), event.getTo().getId(), event.getData()); // Wither walked through a block. } }