Log data for blocks from worldedit properly. Fixes #329

This commit is contained in:
Ammar Askar
2013-01-20 12:34:13 +05:00
parent f451d0cc0b
commit 9326c54dab
3 changed files with 53 additions and 14 deletions

View File

@@ -89,7 +89,7 @@ public class LogBlock extends JavaPlugin
if (noDb) if (noDb)
return; return;
if (pm.getPlugin("WorldEdit") != null) { if (pm.getPlugin("WorldEdit") != null) {
LogBlockEditSessionFactory.initialize(); LogBlockEditSessionFactory.initialize(this);
} }
commandsHandler = new CommandsHandler(this); commandsHandler = new CommandsHandler(this);
getCommand("lb").setExecutor(commandsHandler); getCommand("lb").setExecutor(commandsHandler);

View File

@@ -10,39 +10,67 @@ import com.sk89q.worldedit.bukkit.BukkitWorld;
import de.diddiz.LogBlock.LogBlock; import de.diddiz.LogBlock.LogBlock;
import de.diddiz.LogBlock.Logging; import de.diddiz.LogBlock.Logging;
import de.diddiz.LogBlock.config.Config; import de.diddiz.LogBlock.config.Config;
import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.BlockState;
import org.bukkit.block.Sign;
public class LogBlockEditSession extends EditSession { public class LogBlockEditSession extends EditSession {
private LocalPlayer player; private LocalPlayer player;
private LogBlock plugin;
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */
public LogBlockEditSession(LocalWorld world, int maxBlocks, LocalPlayer player) { public LogBlockEditSession(LocalWorld world, int maxBlocks, LocalPlayer player, LogBlock lb) {
super(world, maxBlocks); super(world, maxBlocks);
this.player = player; this.player = player;
this.plugin = lb;
} }
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */
public LogBlockEditSession(LocalWorld world, int maxBlocks, BlockBag blockBag, LocalPlayer player) { public LogBlockEditSession(LocalWorld world, int maxBlocks, BlockBag blockBag, LocalPlayer player, LogBlock lb) {
super(world, maxBlocks, blockBag); super(world, maxBlocks, blockBag);
this.player = player; this.player = player;
this.plugin = lb;
} }
@Override @Override
public boolean rawSetBlock(Vector pt, BaseBlock block) { public boolean rawSetBlock(Vector pt, BaseBlock block) {
if (!(player.getWorld() instanceof BukkitWorld)) { if (!(player.getWorld() instanceof BukkitWorld) || !(Config.isLogging(player.getWorld().getName(), Logging.WORLDEDIT))) {
return super.rawSetBlock(pt, block); return super.rawSetBlock(pt, block);
} }
int typeBefore = ((BukkitWorld) player.getWorld()).getWorld().getBlockTypeIdAt(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()); 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); boolean success = super.rawSetBlock(pt, block);
if (success && Config.isLogging(player.getWorld().getName(), Logging.WORLDEDIT)) { if (success) {
Location location = new Location(Bukkit.getWorld(player.getWorld().getName()), pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()); Location location = new Location(((BukkitWorld) player.getWorld()).getWorld(), pt.getBlockX(), pt.getBlockY(), pt.getBlockZ());
LogBlock.getInstance().getConsumer().queueBlock(player.getName(), location, typeBefore, location.getBlock().getTypeId(), location.getBlock().getData());
// 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; return success;
} }

View File

@@ -1,26 +1,37 @@
package de.diddiz.worldedit; package de.diddiz.worldedit;
import com.sk89q.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 com.sk89q.worldedit.bags.BlockBag;
import de.diddiz.LogBlock.LogBlock;
public class LogBlockEditSessionFactory extends EditSessionFactory { public class LogBlockEditSessionFactory extends EditSessionFactory {
private LogBlock plugin;
public LogBlockEditSessionFactory(LogBlock lb) {
this.plugin = lb;
}
@Override @Override
public EditSession getEditSession(LocalWorld world, int maxBlocks, LocalPlayer player) { public EditSession getEditSession(LocalWorld world, int maxBlocks, LocalPlayer player) {
return new LogBlockEditSession(world, maxBlocks, player); return new LogBlockEditSession(world, maxBlocks, player, plugin);
} }
@Override @Override
public EditSession getEditSession(LocalWorld world, int maxBlocks, BlockBag blockBag, LocalPlayer player) { public EditSession getEditSession(LocalWorld world, int maxBlocks, BlockBag blockBag, LocalPlayer player) {
return new LogBlockEditSession(world, maxBlocks, blockBag, player); return new LogBlockEditSession(world, maxBlocks, blockBag, player, plugin);
} }
public static void initialize() { public static void initialize(LogBlock logBlock) {
try { try {
// Check to see if the world edit version is compatible // 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); Class.forName("com.sk89q.worldedit.EditSessionFactory").getDeclaredMethod("getEditSession", LocalWorld.class, int.class, BlockBag.class, LocalPlayer.class);
WorldEdit.getInstance().setEditSessionFactory(new LogBlockEditSessionFactory()); WorldEdit.getInstance().setEditSessionFactory(new LogBlockEditSessionFactory(logBlock));
} catch (Throwable t) { } catch (Throwable ignored) {
} }
} }