From fa1e1b777a9da062d10d7c3c1906520e4d39eba8 Mon Sep 17 00:00:00 2001 From: Dark Arc Date: Thu, 3 Apr 2014 23:22:26 -0400 Subject: [PATCH 1/2] Updated for WorldEdit 6.0 --- pom.xml | 4 +- .../java/de/diddiz/LogBlock/LogBlock.java | 4 +- .../LogBlock/listeners/ExplosionLogging.java | 3 +- .../diddiz/worldedit/LogBlockEditSession.java | 78 ---------------- .../worldedit/LogBlockEditSessionFactory.java | 39 -------- .../worldedit/WorldEditLoggingHook.java | 89 +++++++++++++++++++ 6 files changed, 95 insertions(+), 122 deletions(-) delete mode 100644 src/main/java/de/diddiz/worldedit/LogBlockEditSession.java delete mode 100644 src/main/java/de/diddiz/worldedit/LogBlockEditSessionFactory.java create mode 100644 src/main/java/de/diddiz/worldedit/WorldEditLoggingHook.java diff --git a/pom.xml b/pom.xml index 53666b9..f204b4f 100644 --- a/pom.xml +++ b/pom.xml @@ -42,7 +42,7 @@ org.bukkit bukkit - 1.7.2-R0.1-SNAPSHOT + 1.7.5-R0.1-SNAPSHOT ${project.groupId} @@ -54,7 +54,7 @@ com.sk89q worldedit - 5.5 + 6.0.0-SNAPSHOT diff --git a/src/main/java/de/diddiz/LogBlock/LogBlock.java b/src/main/java/de/diddiz/LogBlock/LogBlock.java index 86df1b0..da3a40e 100644 --- a/src/main/java/de/diddiz/LogBlock/LogBlock.java +++ b/src/main/java/de/diddiz/LogBlock/LogBlock.java @@ -24,7 +24,7 @@ import de.diddiz.LogBlock.listeners.StructureGrowLogging; import de.diddiz.LogBlock.listeners.ToolListener; import de.diddiz.LogBlock.listeners.WitherLogging; import de.diddiz.util.MySQLConnectionPool; -import de.diddiz.worldedit.LogBlockEditSessionFactory; +import de.diddiz.worldedit.WorldEditLoggingHook; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -110,7 +110,7 @@ public class LogBlock extends JavaPlugin if (noDb) return; if (pm.getPlugin("WorldEdit") != null) { - LogBlockEditSessionFactory.initialize(this); + new WorldEditLoggingHook(this).hook(); } commandsHandler = new CommandsHandler(this); getCommand("lb").setExecutor(commandsHandler); diff --git a/src/main/java/de/diddiz/LogBlock/listeners/ExplosionLogging.java b/src/main/java/de/diddiz/LogBlock/listeners/ExplosionLogging.java index f663b32..52c2267 100644 --- a/src/main/java/de/diddiz/LogBlock/listeners/ExplosionLogging.java +++ b/src/main/java/de/diddiz/LogBlock/listeners/ExplosionLogging.java @@ -19,6 +19,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.Material; +import org.bukkit.projectiles.ProjectileSource; import static de.diddiz.LogBlock.config.Config.getWorldConfig; import static de.diddiz.LogBlock.config.Config.logCreeperExplosionsAsPlayerWhoTriggeredThese; @@ -57,7 +58,7 @@ public class ExplosionLogging extends LoggingListener name = "Creeper"; } else if (source instanceof Fireball) { Fireball fireball = (Fireball) source; - Entity shooter = fireball.getShooter(); + ProjectileSource shooter = fireball.getShooter(); if (shooter == null) { return; } diff --git a/src/main/java/de/diddiz/worldedit/LogBlockEditSession.java b/src/main/java/de/diddiz/worldedit/LogBlockEditSession.java deleted file mode 100644 index f87c786..0000000 --- a/src/main/java/de/diddiz/worldedit/LogBlockEditSession.java +++ /dev/null @@ -1,78 +0,0 @@ -package de.diddiz.worldedit; - -import com.sk89q.worldedit.EditSession; -import com.sk89q.worldedit.LocalPlayer; -import com.sk89q.worldedit.LocalWorld; -import com.sk89q.worldedit.Vector; -import com.sk89q.worldedit.bags.BlockBag; -import com.sk89q.worldedit.blocks.BaseBlock; -import com.sk89q.worldedit.bukkit.BukkitWorld; -import de.diddiz.LogBlock.LogBlock; -import de.diddiz.LogBlock.Logging; -import de.diddiz.LogBlock.config.Config; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.BlockState; -import org.bukkit.block.Sign; - -public class LogBlockEditSession extends EditSession { - - private LocalPlayer player; - private LogBlock plugin; - - /** - * {@inheritDoc} - */ - public LogBlockEditSession(LocalWorld world, int maxBlocks, LocalPlayer player, LogBlock lb) { - super(world, maxBlocks); - this.player = player; - this.plugin = lb; - } - - /** - * {@inheritDoc} - */ - public LogBlockEditSession(LocalWorld world, int maxBlocks, BlockBag blockBag, LocalPlayer player, LogBlock lb) { - super(world, maxBlocks, blockBag); - this.player = player; - this.plugin = lb; - } - - @Override - public boolean rawSetBlock(Vector pt, BaseBlock block) { - if (!(player.getWorld() instanceof BukkitWorld) || !(Config.isLogging(player.getWorld().getName(), Logging.WORLDEDIT))) { - return super.rawSetBlock(pt, block); - } - - int typeBefore = ((BukkitWorld) player.getWorld()).getWorld().getBlockTypeIdAt(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()); - byte dataBefore = ((BukkitWorld) player.getWorld()).getWorld().getBlockAt(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()).getData(); - // If we're dealing with a sign, store the block state to read the text off - BlockState stateBefore = null; - if (typeBefore == Material.SIGN_POST.getId() || typeBefore == Material.SIGN.getId()) { - stateBefore = ((BukkitWorld) player.getWorld()).getWorld().getBlockAt(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()).getState(); - } - boolean success = super.rawSetBlock(pt, block); - if (success) { - Location location = new Location(((BukkitWorld) player.getWorld()).getWorld(), pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()); - - // Check to see if we've broken a sign - if (Config.isLogging(location.getWorld().getName(), Logging.SIGNTEXT) && (typeBefore == Material.SIGN_POST.getId() || typeBefore == Material.SIGN.getId())) { - plugin.getConsumer().queueSignBreak(player.getName(), (Sign) stateBefore); - if (block.getType() != Material.AIR.getId()) { - plugin.getConsumer().queueBlockPlace(player.getName(), location, block.getType(), (byte) block.getData()); - } - } else { - if (dataBefore != 0) { - plugin.getConsumer().queueBlockBreak(player.getName(), location, typeBefore, dataBefore); - if (block.getType() != Material.AIR.getId()) { - plugin.getConsumer().queueBlockPlace(player.getName(), location, block.getType(), (byte) block.getData()); - } - } else { - plugin.getConsumer().queueBlock(player.getName(), location, typeBefore, block.getType(), (byte) block.getData()); - } - } - } - return success; - } - -} diff --git a/src/main/java/de/diddiz/worldedit/LogBlockEditSessionFactory.java b/src/main/java/de/diddiz/worldedit/LogBlockEditSessionFactory.java deleted file mode 100644 index 50bf4b9..0000000 --- a/src/main/java/de/diddiz/worldedit/LogBlockEditSessionFactory.java +++ /dev/null @@ -1,39 +0,0 @@ -package de.diddiz.worldedit; - -import com.sk89q.worldedit.EditSession; -import com.sk89q.worldedit.EditSessionFactory; -import com.sk89q.worldedit.LocalPlayer; -import com.sk89q.worldedit.LocalWorld; -import com.sk89q.worldedit.WorldEdit; -import com.sk89q.worldedit.bags.BlockBag; -import de.diddiz.LogBlock.LogBlock; - -public class LogBlockEditSessionFactory extends EditSessionFactory { - - private LogBlock plugin; - - public LogBlockEditSessionFactory(LogBlock lb) { - this.plugin = lb; - } - - @Override - public EditSession getEditSession(LocalWorld world, int maxBlocks, LocalPlayer player) { - return new LogBlockEditSession(world, maxBlocks, player, plugin); - } - - @Override - public EditSession getEditSession(LocalWorld world, int maxBlocks, BlockBag blockBag, LocalPlayer player) { - return new LogBlockEditSession(world, maxBlocks, blockBag, player, plugin); - } - - public static void initialize(LogBlock logBlock) { - try { - // Check to see if the world edit version is compatible - Class.forName("com.sk89q.worldedit.EditSessionFactory").getDeclaredMethod("getEditSession", LocalWorld.class, int.class, BlockBag.class, LocalPlayer.class); - WorldEdit.getInstance().setEditSessionFactory(new LogBlockEditSessionFactory(logBlock)); - } catch (Throwable ignored) { - - } - } - -} diff --git a/src/main/java/de/diddiz/worldedit/WorldEditLoggingHook.java b/src/main/java/de/diddiz/worldedit/WorldEditLoggingHook.java new file mode 100644 index 0000000..ed3ab74 --- /dev/null +++ b/src/main/java/de/diddiz/worldedit/WorldEditLoggingHook.java @@ -0,0 +1,89 @@ +package de.diddiz.worldedit; + +import com.sk89q.worldedit.EditSession; +import com.sk89q.worldedit.Vector; +import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.blocks.BaseBlock; +import com.sk89q.worldedit.entity.Player; +import com.sk89q.worldedit.event.extent.EditSessionEvent; +import com.sk89q.worldedit.extension.platform.Actor; +import com.sk89q.worldedit.extent.logging.AbstractLoggingExtent; +import com.sk89q.worldedit.util.eventbus.Subscribe; +import de.diddiz.LogBlock.LogBlock; +import de.diddiz.LogBlock.Logging; +import de.diddiz.LogBlock.config.Config; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockState; +import org.bukkit.block.Sign; + +public class WorldEditLoggingHook { + + private LogBlock plugin; + + public WorldEditLoggingHook(LogBlock plugin) { + this.plugin = plugin; + } + + public void hook() { + WorldEdit.getInstance().getEventBus().register(new Object() { + @Subscribe + public void wrapForLogging(final EditSessionEvent event) { + final Actor actor = event.getActor(); + if (actor == null || !(actor instanceof Player)) return; + + // Check to ensure the world should be logged + String worldName = event.getWorld().getName(); + // If config becomes reloadable, this check should be moved + if (!(Config.isLogging(worldName, Logging.WORLDEDIT))) { + return; + } + + final org.bukkit.World bukkitWorld = Bukkit.getWorld(worldName); + if (bukkitWorld == null) { + return; + } + + event.setExtent(new AbstractLoggingExtent(event.getExtent()) { + @Override + protected void onBlockChange(Vector pt, BaseBlock block) { + + if (event.getStage() != EditSession.Stage.BEFORE_CHANGE) { + return; + } + + Location location = new Location(bukkitWorld, pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()); + + Block origin = location.getBlock(); + int typeBefore = origin.getTypeId(); + byte dataBefore = origin.getData(); + // If we're dealing with a sign, store the block state to read the text off + BlockState stateBefore = null; + if (typeBefore == Material.SIGN_POST.getId() || typeBefore == Material.SIGN.getId()) { + stateBefore = origin.getState(); + } + + // Check to see if we've broken a sign + if (Config.isLogging(location.getWorld().getName(), Logging.SIGNTEXT) && (typeBefore == Material.SIGN_POST.getId() || typeBefore == Material.SIGN.getId())) { + plugin.getConsumer().queueSignBreak(actor.getName(), (Sign) stateBefore); + if (block.getType() != Material.AIR.getId()) { + plugin.getConsumer().queueBlockPlace(actor.getName(), location, block.getType(), (byte) block.getData()); + } + } else { + if (dataBefore != 0) { + plugin.getConsumer().queueBlockBreak(actor.getName(), location, typeBefore, dataBefore); + if (block.getType() != Material.AIR.getId()) { + plugin.getConsumer().queueBlockPlace(actor.getName(), location, block.getType(), (byte) block.getData()); + } + } else { + plugin.getConsumer().queueBlock(actor.getName(), location, typeBefore, block.getType(), (byte) block.getData()); + } + } + } + }); + } + }); + } +} From d48d04227933d688a462bb926bb44019fa9ba399 Mon Sep 17 00:00:00 2001 From: Philip Cass Date: Sat, 21 Feb 2015 18:20:47 +0000 Subject: [PATCH 2/2] Directly use the UUID of the player responsible for event, if possible Directly get the Bukkit World object of the event, if possible Move Worldedit World -> Bukkit World conversion to a separate method --- src/main/java/de/diddiz/LogBlock/Actor.java | 8 +++- .../worldedit/WorldEditLoggingHook.java | 39 +++++++++++++------ 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/src/main/java/de/diddiz/LogBlock/Actor.java b/src/main/java/de/diddiz/LogBlock/Actor.java index ab12a30..3cbb962 100644 --- a/src/main/java/de/diddiz/LogBlock/Actor.java +++ b/src/main/java/de/diddiz/LogBlock/Actor.java @@ -40,6 +40,12 @@ public class Actor { this.UUID = UUID; } + + public Actor(String name, java.util.UUID UUID) { + this.name = name; + this.UUID = UUID.toString(); + + } public Actor(String name) { this(name, generateUUID(name)); @@ -59,7 +65,7 @@ public class Actor { public static Actor actorFromEntity(Entity entity) { if (entity instanceof Player) { - return new Actor(entityName(entity),entity.getUniqueId().toString()); + return new Actor(entityName(entity),entity.getUniqueId()); } else { return new Actor(entityName(entity)); } diff --git a/src/main/java/de/diddiz/worldedit/WorldEditLoggingHook.java b/src/main/java/de/diddiz/worldedit/WorldEditLoggingHook.java index 0ecdf5a..7acc140 100644 --- a/src/main/java/de/diddiz/worldedit/WorldEditLoggingHook.java +++ b/src/main/java/de/diddiz/worldedit/WorldEditLoggingHook.java @@ -4,7 +4,7 @@ import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.blocks.BaseBlock; -import com.sk89q.worldedit.entity.Player; +import com.sk89q.worldedit.bukkit.BukkitWorld; import com.sk89q.worldedit.event.extent.EditSessionEvent; //...so they ALSO have a class called Actor... need to fully-qualify when we use ours import com.sk89q.worldedit.extension.platform.Actor; @@ -13,9 +13,11 @@ import com.sk89q.worldedit.util.eventbus.Subscribe; import de.diddiz.LogBlock.LogBlock; import de.diddiz.LogBlock.Logging; import de.diddiz.LogBlock.config.Config; +import java.util.logging.Level; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.BlockState; import org.bukkit.block.Sign; @@ -31,11 +33,21 @@ public class WorldEditLoggingHook { // Convert WE Actor to LB Actor private de.diddiz.LogBlock.Actor AtoA(Actor weActor) { if (weActor.isPlayer()) { - return de.diddiz.LogBlock.Actor.actorFromEntity(plugin.getServer().getPlayer(weActor.getName())); + return new de.diddiz.LogBlock.Actor(weActor.getName(),weActor.getUniqueId()); } return new de.diddiz.LogBlock.Actor(weActor.getName()); } + private World adapt(com.sk89q.worldedit.world.World weWorld) { + if (weWorld == null) { + throw new NullPointerException("[Logblock-Worldedit] The provided world was null."); + } + if (weWorld instanceof BukkitWorld) return ((BukkitWorld) weWorld).getWorld(); + World world = Bukkit.getServer().getWorld(weWorld.getName()); + if (world == null) throw new IllegalArgumentException("Can't find a Bukkit world for " + weWorld); + return world; + } + public void hook() { WorldEdit.getInstance().getEventBus().register(new Object() { @Subscribe @@ -45,17 +57,21 @@ public class WorldEditLoggingHook { final de.diddiz.LogBlock.Actor lbActor = AtoA(actor); // Check to ensure the world should be logged - String worldName = event.getWorld().getName(); + final World world; + final com.sk89q.worldedit.world.World k = event.getWorld(); + try { + world = adapt(k); + } catch (RuntimeException ex) { + plugin.getLogger().warning("Failed to register logging for WorldEdit!"); + plugin.getLogger().log(Level.WARNING, ex.getMessage(),ex); + return; + } + // If config becomes reloadable, this check should be moved - if (!(Config.isLogging(worldName, Logging.WORLDEDIT))) { + if (!(Config.isLogging(world, Logging.WORLDEDIT))) { return; } - - final org.bukkit.World bukkitWorld = Bukkit.getWorld(worldName); - if (bukkitWorld == null) { - return; - } - + event.setExtent(new AbstractLoggingExtent(event.getExtent()) { @Override protected void onBlockChange(Vector pt, BaseBlock block) { @@ -64,8 +80,7 @@ public class WorldEditLoggingHook { return; } - Location location = new Location(bukkitWorld, pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()); - + Location location = new Location(world, pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()); Block origin = location.getBlock(); int typeBefore = origin.getTypeId(); byte dataBefore = origin.getData();