diff --git a/pom.xml b/pom.xml
index 53666b9..d83cbb7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -89,6 +89,9 @@
1.6
1.6
+
+ **/de/diddiz/worldedit/*.java
+
diff --git a/src/main/java/de/diddiz/LogBlock/Actor.java b/src/main/java/de/diddiz/LogBlock/Actor.java
new file mode 100644
index 0000000..ab12a30
--- /dev/null
+++ b/src/main/java/de/diddiz/LogBlock/Actor.java
@@ -0,0 +1,85 @@
+package de.diddiz.LogBlock;
+
+import static de.diddiz.util.BukkitUtils.entityName;
+import org.bukkit.entity.Entity;
+import org.bukkit.entity.EntityType;
+import org.bukkit.entity.Player;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+public class Actor {
+
+ @Override
+ public int hashCode() {
+ int hash = 5;
+ hash = 79 * hash + (this.UUID != null ? this.UUID.hashCode() : 0);
+ return hash;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ final Actor other = (Actor) obj;
+ if ((this.UUID == null) ? (other.UUID != null) : !this.UUID.equals(other.UUID)) {
+ return false;
+ }
+ return true;
+ }
+
+ final String name;
+ final String UUID;
+
+ public Actor(String name, String UUID) {
+ this.name = name;
+ this.UUID = UUID;
+
+ }
+
+ public Actor(String name) {
+ this(name, generateUUID(name));
+ }
+
+ public Actor(ResultSet rs) throws SQLException {
+ this(rs.getString("playername"),rs.getString("UUID"));
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getUUID() {
+ return UUID;
+ }
+
+ public static Actor actorFromEntity(Entity entity) {
+ if (entity instanceof Player) {
+ return new Actor(entityName(entity),entity.getUniqueId().toString());
+ } else {
+ return new Actor(entityName(entity));
+ }
+ }
+
+ public static Actor actorFromEntity(EntityType entity) {
+ return new Actor(entity.getName());
+ }
+
+ public static boolean isValidUUID(String uuid) {
+ try {
+ java.util.UUID.fromString(uuid);
+ return true;
+ } catch (IllegalArgumentException e) {
+ return false;
+ }
+ }
+
+ public static String generateUUID(String name) {
+ return "log_" + name;
+
+ }
+}
diff --git a/src/main/java/de/diddiz/LogBlock/BlockChange.java b/src/main/java/de/diddiz/LogBlock/BlockChange.java
index ae5ce7b..6e823a0 100644
--- a/src/main/java/de/diddiz/LogBlock/BlockChange.java
+++ b/src/main/java/de/diddiz/LogBlock/BlockChange.java
@@ -14,28 +14,31 @@ public class BlockChange implements LookupCacheElement
{
public final long id, date;
public final Location loc;
+ public final Actor actor;
public final String playerName;
public final int replaced, type;
public final byte data;
public final String signtext;
public final ChestAccess ca;
- public BlockChange(long date, Location loc, String playerName, int replaced, int type, byte data, String signtext, ChestAccess ca) {
+ public BlockChange(long date, Location loc, Actor actor, int replaced, int type, byte data, String signtext, ChestAccess ca) {
id = 0;
this.date = date;
this.loc = loc;
- this.playerName = playerName;
+ this.actor = actor;
this.replaced = replaced;
this.type = type;
this.data = data;
this.signtext = signtext;
this.ca = ca;
+ this.playerName = actor == null ? null : actor.getName();
}
public BlockChange(ResultSet rs, QueryParams p) throws SQLException {
id = p.needId ? rs.getInt("id") : 0;
date = p.needDate ? rs.getTimestamp("date").getTime() : 0;
loc = p.needCoords ? new Location(p.world, rs.getInt("x"), rs.getInt("y"), rs.getInt("z")) : null;
+ actor = p.needPlayer ? new Actor(rs) : null;
playerName = p.needPlayer ? rs.getString("playername") : null;
replaced = p.needType ? rs.getInt("replaced") : 0;
type = p.needType ? rs.getInt("type") : 0;
@@ -49,8 +52,8 @@ public class BlockChange implements LookupCacheElement
final StringBuilder msg = new StringBuilder();
if (date > 0)
msg.append(Config.formatter.format(date)).append(" ");
- if (playerName != null)
- msg.append(playerName).append(" ");
+ if (actor != null)
+ msg.append(actor.getName()).append(" ");
if (signtext != null) {
final String action = type == 0 ? "destroyed " : "created ";
if (!signtext.contains("\0"))
diff --git a/src/main/java/de/diddiz/LogBlock/ChatMessage.java b/src/main/java/de/diddiz/LogBlock/ChatMessage.java
index 00272d5..a060317 100644
--- a/src/main/java/de/diddiz/LogBlock/ChatMessage.java
+++ b/src/main/java/de/diddiz/LogBlock/ChatMessage.java
@@ -8,17 +8,20 @@ public class ChatMessage implements LookupCacheElement
{
final long id, date;
final String playerName, message;
+ final Actor player;
- public ChatMessage(String playerName, String message) {
+ public ChatMessage(Actor player, String message) {
id = 0;
date = System.currentTimeMillis() / 1000;
- this.playerName = playerName;
+ this.player = player;
this.message = message;
+ this.playerName = player == null ? null : player.getName();
}
public ChatMessage(ResultSet rs, QueryParams p) throws SQLException {
id = p.needId ? rs.getInt("id") : 0;
date = p.needDate ? rs.getTimestamp("date").getTime() : 0;
+ player = p.needPlayer ? new Actor(rs) : null;
playerName = p.needPlayer ? rs.getString("playername") : null;
message = p.needMessage ? rs.getString("message") : null;
}
@@ -30,6 +33,6 @@ public class ChatMessage implements LookupCacheElement
@Override
public String getMessage() {
- return (playerName != null ? "<" + playerName + "> " : "") + (message != null ? message : "");
+ return (player != null ? "<" + player.getName() + "> " : "") + (message != null ? message : "");
}
}
diff --git a/src/main/java/de/diddiz/LogBlock/Consumer.java b/src/main/java/de/diddiz/LogBlock/Consumer.java
index 2c37205..464d01d 100644
--- a/src/main/java/de/diddiz/LogBlock/Consumer.java
+++ b/src/main/java/de/diddiz/LogBlock/Consumer.java
@@ -29,9 +29,9 @@ import static org.bukkit.Bukkit.getLogger;
public class Consumer extends TimerTask
{
private final Queue queue = new LinkedBlockingQueue();
- private final Set failedPlayers = new HashSet();
+ private final Set failedPlayers = new HashSet();
private final LogBlock logblock;
- private final Map playerIds = new HashMap();
+ private final Map playerIds = new HashMap();
private final Lock lock = new ReentrantLock();
Consumer(LogBlock logblock) {
@@ -45,8 +45,8 @@ public class Consumer extends TimerTask
/**
* Logs any block change. Don't try to combine broken and placed blocks. Queue two block changes or use the queueBLockReplace methods.
*/
- public void queueBlock(String playerName, Location loc, int typeBefore, int typeAfter, byte data) {
- queueBlock(playerName, loc, typeBefore, typeAfter, data, null, null);
+ public void queueBlock(Actor actor, Location loc, int typeBefore, int typeAfter, byte data) {
+ queueBlock(actor, loc, typeBefore, typeAfter, data, null, null);
}
/**
@@ -55,15 +55,15 @@ public class Consumer extends TimerTask
* @param before
* Blockstate of the block before actually being destroyed.
*/
- public void queueBlockBreak(String playerName, BlockState before) {
- queueBlockBreak(playerName, new Location(before.getWorld(), before.getX(), before.getY(), before.getZ()), before.getTypeId(), before.getRawData());
+ public void queueBlockBreak(Actor actor, BlockState before) {
+ queueBlockBreak(actor, new Location(before.getWorld(), before.getX(), before.getY(), before.getZ()), before.getTypeId(), before.getRawData());
}
/**
* Logs a block break. The block type afterwards is assumed to be o (air).
*/
- public void queueBlockBreak(String playerName, Location loc, int typeBefore, byte dataBefore) {
- queueBlock(playerName, loc, typeBefore, 0, dataBefore);
+ public void queueBlockBreak(Actor actor, Location loc, int typeBefore, byte dataBefore) {
+ queueBlock(actor, loc, typeBefore, 0, dataBefore);
}
/**
@@ -72,15 +72,15 @@ public class Consumer extends TimerTask
* @param after
* Blockstate of the block after actually being placed.
*/
- public void queueBlockPlace(String playerName, BlockState after) {
- queueBlockPlace(playerName, new Location(after.getWorld(), after.getX(), after.getY(), after.getZ()), after.getBlock().getTypeId(), after.getBlock().getData());
+ public void queueBlockPlace(Actor actor, BlockState after) {
+ queueBlockPlace(actor, new Location(after.getWorld(), after.getX(), after.getY(), after.getZ()), after.getBlock().getTypeId(), after.getBlock().getData());
}
/**
* Logs a block place. The block type before is assumed to be o (air).
*/
- public void queueBlockPlace(String playerName, Location loc, int type, byte data) {
- queueBlock(playerName, loc, 0, type, data);
+ public void queueBlockPlace(Actor actor, Location loc, int type, byte data) {
+ queueBlock(actor, loc, 0, type, data);
}
/**
@@ -89,32 +89,32 @@ public class Consumer extends TimerTask
* @param after
* Blockstate of the block after actually being placed.
*/
- public void queueBlockReplace(String playerName, BlockState before, BlockState after) {
- queueBlockReplace(playerName, new Location(before.getWorld(), before.getX(), before.getY(), before.getZ()), before.getTypeId(), before.getRawData(), after.getTypeId(), after.getRawData());
+ public void queueBlockReplace(Actor actor, BlockState before, BlockState after) {
+ queueBlockReplace(actor, new Location(before.getWorld(), before.getX(), before.getY(), before.getZ()), before.getTypeId(), before.getRawData(), after.getTypeId(), after.getRawData());
}
/**
* @param before
* Blockstate of the block before actually being destroyed.
*/
- public void queueBlockReplace(String playerName, BlockState before, int typeAfter, byte dataAfter) {
- queueBlockReplace(playerName, new Location(before.getWorld(), before.getX(), before.getY(), before.getZ()), before.getTypeId(), before.getRawData(), typeAfter, dataAfter);
+ public void queueBlockReplace(Actor actor, BlockState before, int typeAfter, byte dataAfter) {
+ queueBlockReplace(actor, new Location(before.getWorld(), before.getX(), before.getY(), before.getZ()), before.getTypeId(), before.getRawData(), typeAfter, dataAfter);
}
/**
* @param after
* Blockstate of the block after actually being placed.
*/
- public void queueBlockReplace(String playerName, int typeBefore, byte dataBefore, BlockState after) {
- queueBlockReplace(playerName, new Location(after.getWorld(), after.getX(), after.getY(), after.getZ()), typeBefore, dataBefore, after.getTypeId(), after.getRawData());
+ public void queueBlockReplace(Actor actor, int typeBefore, byte dataBefore, BlockState after) {
+ queueBlockReplace(actor, new Location(after.getWorld(), after.getX(), after.getY(), after.getZ()), typeBefore, dataBefore, after.getTypeId(), after.getRawData());
}
- public void queueBlockReplace(String playerName, Location loc, int typeBefore, byte dataBefore, int typeAfter, byte dataAfter) {
+ public void queueBlockReplace(Actor actor, Location loc, int typeBefore, byte dataBefore, int typeAfter, byte dataAfter) {
if (dataBefore == 0 && (typeBefore != typeAfter))
- queueBlock(playerName, loc, typeBefore, typeAfter, dataAfter);
+ queueBlock(actor, loc, typeBefore, typeAfter, dataAfter);
else {
- queueBlockBreak(playerName, loc, typeBefore, dataBefore);
- queueBlockPlace(playerName, loc, typeAfter, dataAfter);
+ queueBlockBreak(actor, loc, typeBefore, dataBefore);
+ queueBlockPlace(actor, loc, typeAfter, dataAfter);
}
}
@@ -122,18 +122,18 @@ public class Consumer extends TimerTask
* @param container
* The respective container. Must be an instance of an InventoryHolder.
*/
- public void queueChestAccess(String playerName, BlockState container, short itemType, short itemAmount, short itemData) {
+ public void queueChestAccess(Actor actor, BlockState container, short itemType, short itemAmount, short itemData) {
if (!(container instanceof InventoryHolder))
return;
- queueChestAccess(playerName, new Location(container.getWorld(), container.getX(), container.getY(), container.getZ()), container.getTypeId(), itemType, itemAmount, itemData);
+ queueChestAccess(actor, new Location(container.getWorld(), container.getX(), container.getY(), container.getZ()), container.getTypeId(), itemType, itemAmount, itemData);
}
/**
* @param type
* Type id of the container.
*/
- public void queueChestAccess(String playerName, Location loc, int type, short itemType, short itemAmount, short itemData) {
- queueBlock(playerName, loc, type, type, (byte)0, null, new ChestAccess(itemType, itemAmount, itemData));
+ public void queueChestAccess(Actor actor, Location loc, int type, short itemType, short itemAmount, short itemData) {
+ queueBlock(actor, loc, type, type, (byte)0, null, new ChestAccess(itemType, itemAmount, itemData));
}
/**
@@ -142,20 +142,20 @@ public class Consumer extends TimerTask
* @param container
* Must be an instance of InventoryHolder
*/
- public void queueContainerBreak(String playerName, BlockState container) {
+ public void queueContainerBreak(Actor actor, BlockState container) {
if (!(container instanceof InventoryHolder))
return;
- queueContainerBreak(playerName, new Location(container.getWorld(), container.getX(), container.getY(), container.getZ()), container.getTypeId(), container.getRawData(), ((InventoryHolder)container).getInventory());
+ queueContainerBreak(actor, new Location(container.getWorld(), container.getX(), container.getY(), container.getZ()), container.getTypeId(), container.getRawData(), ((InventoryHolder)container).getInventory());
}
/**
* Logs a container block break. The block type before is assumed to be o (air). All content is assumed to be taken.
*/
- public void queueContainerBreak(String playerName, Location loc, int type, byte data, Inventory inv) {
+ public void queueContainerBreak(Actor actor, Location loc, int type, byte data, Inventory inv) {
final ItemStack[] items = compressInventory(inv.getContents());
for (final ItemStack item : items)
- queueChestAccess(playerName, loc, type, (short)item.getTypeId(), (short)(item.getAmount() * -1), rawData(item));
- queueBlockBreak(playerName, loc, type, data);
+ queueChestAccess(actor, loc, type, (short)item.getTypeId(), (short)(item.getAmount() * -1), rawData(item));
+ queueBlockBreak(actor, loc, type, data);
}
/**
@@ -170,7 +170,7 @@ public class Consumer extends TimerTask
int weapon = 0;
if (killer instanceof Player && ((Player)killer).getItemInHand() != null)
weapon = ((Player)killer).getItemInHand().getTypeId();
- queueKill(victim.getLocation(), entityName(killer), entityName(victim), weapon);
+ queueKill(victim.getLocation(), Actor.actorFromEntity(killer), Actor.actorFromEntity(victim), weapon);
}
/**
@@ -180,10 +180,10 @@ public class Consumer extends TimerTask
* @param victim
* Can't be null
*/
- public void queueKill(String killer, Entity victim) {
+ public void queueKill(Actor killer, Entity victim) {
if (killer == null || victim == null)
return;
- queueKill(victim.getLocation(), killer, entityName(victim), 0);
+ queueKill(victim.getLocation(), killer, Actor.actorFromEntity(victim), 0);
}
/**
@@ -198,24 +198,24 @@ public class Consumer extends TimerTask
* @deprecated Use {@link #queueKill(Location,String,String,int)} instead
*/
@Deprecated
- public void queueKill(World world, String killerName, String victimName, int weapon) {
- queueKill(new Location(world, 0, 0, 0), killerName, victimName, weapon);
+ public void queueKill(World world, Actor killer, Actor victim, int weapon) {
+ queueKill(new Location(world, 0, 0, 0), killer, victim, weapon);
}
/**
* @param location
* Location of the victim.
- * @param killerName
- * Name of the killer. Can be null.
- * @param victimName
- * Name of the victim. Can't be null.
+ * @param killer
+ * Killer Actor. Can be null.
+ * @param victim
+ * Victim Actor. Can't be null.
* @param weapon
* Item id of the weapon. 0 for no weapon.
*/
- public void queueKill(Location location, String killerName, String victimName, int weapon) {
- if (victimName == null || !isLogged(location.getWorld()))
+ public void queueKill(Location location, Actor killer, Actor victim, int weapon) {
+ if (victim == null || !isLogged(location.getWorld()))
return;
- queue.add(new KillRow(location, killerName == null ? null : killerName.replaceAll("[^a-zA-Z0-9_]", ""), victimName.replaceAll("[^a-zA-Z0-9_]", ""), weapon));
+ queue.add(new KillRow(location, killer == null ? null : killer, victim, weapon));
}
/**
@@ -224,14 +224,14 @@ public class Consumer extends TimerTask
* @param lines
* The four lines on the sign.
*/
- public void queueSignBreak(String playerName, Location loc, int type, byte data, String[] lines) {
+ public void queueSignBreak(Actor actor, Location loc, int type, byte data, String[] lines) {
if (type != 63 && type != 68 || lines == null || lines.length != 4)
return;
- queueBlock(playerName, loc, type, 0, data, lines[0] + "\0" + lines[1] + "\0" + lines[2] + "\0" + lines[3], null);
+ queueBlock(actor, loc, type, 0, data, lines[0] + "\0" + lines[1] + "\0" + lines[2] + "\0" + lines[3], null);
}
- public void queueSignBreak(String playerName, Sign sign) {
- queueSignBreak(playerName, new Location(sign.getWorld(), sign.getX(), sign.getY(), sign.getZ()), sign.getTypeId(), sign.getRawData(), sign.getLines());
+ public void queueSignBreak(Actor actor, Sign sign) {
+ queueSignBreak(actor, new Location(sign.getWorld(), sign.getX(), sign.getY(), sign.getZ()), sign.getTypeId(), sign.getRawData(), sign.getLines());
}
/**
@@ -240,17 +240,17 @@ public class Consumer extends TimerTask
* @param lines
* The four lines on the sign.
*/
- public void queueSignPlace(String playerName, Location loc, int type, byte data, String[] lines) {
+ public void queueSignPlace(Actor actor, Location loc, int type, byte data, String[] lines) {
if (type != 63 && type != 68 || lines == null || lines.length != 4)
return;
- queueBlock(playerName, loc, 0, type, data, lines[0] + "\0" + lines[1] + "\0" + lines[2] + "\0" + lines[3], null);
+ queueBlock(actor, loc, 0, type, data, lines[0] + "\0" + lines[1] + "\0" + lines[2] + "\0" + lines[3], null);
}
- public void queueSignPlace(String playerName, Sign sign) {
- queueSignPlace(playerName, new Location(sign.getWorld(), sign.getX(), sign.getY(), sign.getZ()), sign.getTypeId(), sign.getRawData(), sign.getLines());
+ public void queueSignPlace(Actor actor, Sign sign) {
+ queueSignPlace(actor, new Location(sign.getWorld(), sign.getX(), sign.getY(), sign.getZ()), sign.getTypeId(), sign.getRawData(), sign.getLines());
}
- public void queueChat(String player, String message) {
+ public void queueChat(Actor player, String message) {
for (String ignored : Config.ignoredChat) {
if (message.startsWith(ignored)) {
return;
@@ -289,12 +289,12 @@ public class Consumer extends TimerTask
final Row r = queue.poll();
if (r == null)
continue;
- for (final String player : r.getPlayers()) {
- if (!playerIds.containsKey(player)) {
- if (!addPlayer(state, player)) {
- if (!failedPlayers.contains(player)) {
- failedPlayers.add(player);
- getLogger().warning("[Consumer] Failed to add player " + player);
+ for (final Actor actor : r.getActors()) {
+ if (!playerIds.containsKey(actor)) {
+ if (!addPlayer(state, actor)) {
+ if (!failedPlayers.contains(actor)) {
+ failedPlayers.add(actor);
+ getLogger().warning("[Consumer] Failed to add player " + actor.getName());
}
continue process;
}
@@ -339,7 +339,7 @@ public class Consumer extends TimerTask
public void writeToFile() throws FileNotFoundException {
final long time = System.currentTimeMillis();
- final Set insertedPlayers = new HashSet();
+ final Set insertedPlayers = new HashSet();
int counter = 0;
new File("plugins/LogBlock/import/").mkdirs();
PrintWriter writer = new PrintWriter(new File("plugins/LogBlock/import/queue-" + time + "-0.sql"));
@@ -347,11 +347,11 @@ public class Consumer extends TimerTask
final Row r = queue.poll();
if (r == null)
continue;
- for (final String player : r.getPlayers())
- if (!playerIds.containsKey(player) && !insertedPlayers.contains(player)) {
+ for (final Actor actor : r.getActors())
+ if (!playerIds.containsKey(actor) && !insertedPlayers.contains(actor)) {
// Odd query contruction is to work around innodb auto increment behaviour - bug #492
- writer.println("INSERT IGNORE INTO `lb-players` (playername) SELECT '" + player + "' FROM `lb-players` WHERE NOT EXISTS (SELECT NULL FROM `lb-players` WHERE playername = '" + player + "') LIMIT 1;");
- insertedPlayers.add(player);
+ writer.println("INSERT IGNORE INTO `lb-players` (playername,UUID) SELECT '" + actor.getName() + "','" + actor.getUUID() + "' FROM `lb-players` WHERE NOT EXISTS (SELECT NULL FROM `lb-players` WHERE UUID = '" + actor.getUUID() + "') LIMIT 1;");
+ insertedPlayers.add(actor);
}
for (final String insert : r.getInserts())
writer.println(insert);
@@ -378,26 +378,28 @@ public class Consumer extends TimerTask
return true;
}
- private boolean addPlayer(Statement state, String playerName) throws SQLException {
+ private boolean addPlayer(Statement state, Actor actor) throws SQLException {
// Odd query contruction is to work around innodb auto increment behaviour - bug #492
- state.execute("INSERT IGNORE INTO `lb-players` (playername) SELECT '" + playerName + "' FROM `lb-players` WHERE NOT EXISTS (SELECT NULL FROM `lb-players` WHERE playername = '" + playerName + "') LIMIT 1;");
- final ResultSet rs = state.executeQuery("SELECT playerid FROM `lb-players` WHERE playername = '" + playerName + "'");
+ String name = actor.getName();
+ String uuid = actor.getUUID();
+ state.execute("INSERT IGNORE INTO `lb-players` (playername,UUID) SELECT '" + name + "','" + uuid + "' FROM `lb-players` WHERE NOT EXISTS (SELECT NULL FROM `lb-players` WHERE UUID = '" + uuid + "') LIMIT 1;");
+ final ResultSet rs = state.executeQuery("SELECT playerid FROM `lb-players` WHERE UUID = '" + uuid + "'");
if (rs.next())
- playerIds.put(playerName, rs.getInt(1));
+ playerIds.put(actor, rs.getInt(1));
rs.close();
- return playerIds.containsKey(playerName);
+ return playerIds.containsKey(actor);
}
- private void queueBlock(String playerName, Location loc, int typeBefore, int typeAfter, byte data, String signtext, ChestAccess ca) {
+ private void queueBlock(Actor actor, Location loc, int typeBefore, int typeAfter, byte data, String signtext, ChestAccess ca) {
if (Config.fireCustomEvents) {
// Create and call the event
- BlockChangePreLogEvent event = new BlockChangePreLogEvent(playerName, loc, typeBefore, typeAfter, data, signtext, ca);
+ BlockChangePreLogEvent event = new BlockChangePreLogEvent(actor, loc, typeBefore, typeAfter, data, signtext, ca);
logblock.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) return;
// Update variables
- playerName = event.getOwner();
+ actor = event.getOwnerActor();
loc = event.getLocation();
typeBefore = event.getTypeBefore();
typeAfter = event.getTypeAfter();
@@ -406,31 +408,37 @@ public class Consumer extends TimerTask
ca = event.getChestAccess();
}
// Do this last so LogBlock still has final say in what is being added
- if (playerName == null || loc == null || typeBefore < 0 || typeAfter < 0 || (Config.safetyIdCheck && (typeBefore > 255 || typeAfter > 255)) || hiddenPlayers.contains(playerName.toLowerCase()) || !isLogged(loc.getWorld()) || typeBefore != typeAfter && hiddenBlocks.contains(typeBefore) && hiddenBlocks.contains(typeAfter)) return;
- queue.add(new BlockRow(loc, playerName.replaceAll("[^a-zA-Z0-9_]", ""), typeBefore, typeAfter, data, signtext, ca));
+ if (actor == null || loc == null || typeBefore < 0 || typeAfter < 0 || (Config.safetyIdCheck && (typeBefore > 255 || typeAfter > 255)) || hiddenPlayers.contains(actor.getName().toLowerCase()) || !isLogged(loc.getWorld()) || typeBefore != typeAfter && hiddenBlocks.contains(typeBefore) && hiddenBlocks.contains(typeAfter)) return;
+ queue.add(new BlockRow(loc, actor, typeBefore, typeAfter, data, signtext, ca));
}
- private String playerID(String playerName) {
- if (playerName == null)
+ private String playerID(Actor actor) {
+ if (actor == null)
return "NULL";
- final Integer id = playerIds.get(playerName);
+ final Integer id = playerIds.get(actor);
if (id != null)
return id.toString();
- return "(SELECT playerid FROM `lb-players` WHERE playername = '" + playerName + "')";
+ return "(SELECT playerid FROM `lb-players` WHERE UUID = '" + actor.getUUID() + "')";
}
- private Integer playerIDAsInt(String playerName) {
- if (playerName == null) {
+ private Integer playerIDAsInt(Actor actor) {
+ if (actor == null) {
return null;
}
- return playerIds.get(playerName);
+ return playerIds.get(actor);
}
private static interface Row
{
String[] getInserts();
+ /**
+ *
+ * @deprecated - Names are not guaranteed to be unique. Use {@link #getActors() }
+ */
String[] getPlayers();
+
+ Actor[] getActors();
}
private interface PreparedStatementRow extends Row
@@ -445,15 +453,15 @@ public class Consumer extends TimerTask
{
private Connection connection;
- public BlockRow(Location loc, String playerName, int replaced, int type, byte data, String signtext, ChestAccess ca) {
- super(System.currentTimeMillis() / 1000, loc, playerName, replaced, type, data, signtext, ca);
+ public BlockRow(Location loc, Actor actor, int replaced, int type, byte data, String signtext, ChestAccess ca) {
+ super(System.currentTimeMillis() / 1000, loc, actor, replaced, type, data, signtext, ca);
}
@Override
public String[] getInserts() {
final String table = getWorldConfig(loc.getWorld()).table;
final String[] inserts = new String[ca != null || signtext != null ? 2 : 1];
- inserts[0] = "INSERT INTO `" + table + "` (date, playerid, replaced, type, data, x, y, z) VALUES (FROM_UNIXTIME(" + date + "), " + playerID(playerName) + ", " + replaced + ", " + type + ", " + data + ", '" + loc.getBlockX() + "', " + loc.getBlockY() + ", '" + loc.getBlockZ() + "');";
+ inserts[0] = "INSERT INTO `" + table + "` (date, playerid, replaced, type, data, x, y, z) VALUES (FROM_UNIXTIME(" + date + "), " + playerID(actor) + ", " + replaced + ", " + type + ", " + data + ", '" + loc.getBlockX() + "', " + loc.getBlockY() + ", '" + loc.getBlockZ() + "');";
if (signtext != null) {
inserts[1] = "INSERT INTO `" + table + "-sign` (id, signtext) values (LAST_INSERT_ID(), '" + signtext.replace("\\", "\\\\").replace("'", "\\'") + "');";
}
@@ -464,7 +472,12 @@ public class Consumer extends TimerTask
@Override
public String[] getPlayers() {
- return new String[]{playerName};
+ return new String[]{actor.getName()};
+ }
+
+ @Override
+ public Actor[] getActors() {
+ return new Actor[]{actor};
}
@Override
@@ -479,7 +492,7 @@ public class Consumer extends TimerTask
PreparedStatement ps1 = null;
PreparedStatement ps = null;
try {
- ps1 = connection.prepareStatement("INSERT INTO `" + table + "` (date, playerid, replaced, type, data, x, y, z) VALUES(FROM_UNIXTIME(?), " + playerID(playerName) + ", ?, ?, ?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS);
+ ps1 = connection.prepareStatement("INSERT INTO `" + table + "` (date, playerid, replaced, type, data, x, y, z) VALUES(FROM_UNIXTIME(?), " + playerID(actor) + ", ?, ?, ?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS);
ps1.setLong(1, date );
ps1.setInt(2, replaced);
ps1.setInt(3, type);
@@ -546,11 +559,11 @@ public class Consumer extends TimerTask
private class KillRow implements Row
{
final long date;
- final String killer, victim;
+ final Actor killer, victim;
final int weapon;
final Location loc;
- KillRow(Location loc, String attacker, String defender, int weapon) {
+ KillRow(Location loc, Actor attacker, Actor defender, int weapon) {
date = System.currentTimeMillis() / 1000;
this.loc = loc;
killer = attacker;
@@ -565,7 +578,12 @@ public class Consumer extends TimerTask
@Override
public String[] getPlayers() {
- return new String[]{killer, victim};
+ return new String[]{killer.getName(), victim.getName()};
+ }
+
+ @Override
+ public Actor[] getActors() {
+ return new Actor[]{killer,victim};
}
}
@@ -573,18 +591,23 @@ public class Consumer extends TimerTask
{
private Connection connection;
- ChatRow(String player, String message) {
+ ChatRow(Actor player, String message) {
super(player, message);
}
@Override
public String[] getInserts() {
- return new String[]{"INSERT INTO `lb-chat` (date, playerid, message) VALUES (FROM_UNIXTIME(" + date + "), " + playerID(playerName) + ", '" + message.replace("\\", "\\\\").replace("'", "\\'") + "');"};
+ return new String[]{"INSERT INTO `lb-chat` (date, playerid, message) VALUES (FROM_UNIXTIME(" + date + "), " + playerID(player) + ", '" + message.replace("\\", "\\\\").replace("'", "\\'") + "');"};
}
@Override
public String[] getPlayers() {
- return new String[]{playerName};
+ return new String[]{player.getName()};
+ }
+
+ @Override
+ public Actor[] getActors() {
+ return new Actor[]{player};
}
@Override
@@ -598,9 +621,9 @@ public class Consumer extends TimerTask
Integer id;
String sql = "INSERT INTO `lb-chat` (date, playerid, message) VALUES (FROM_UNIXTIME(?), ";
- if ((id = playerIDAsInt(playerName)) == null) {
+ if ((id = playerIDAsInt(player)) == null) {
noID = true;
- sql += playerID(playerName) + ", ";
+ sql += playerID(player) + ", ";
} else {
sql += "?, ";
}
@@ -635,45 +658,55 @@ public class Consumer extends TimerTask
private class PlayerJoinRow implements Row
{
- private final String playerName;
+ private final Actor player;
private final long lastLogin;
private final String ip;
PlayerJoinRow(Player player) {
- playerName = player.getName();
+ this.player = Actor.actorFromEntity(player);
lastLogin = System.currentTimeMillis() / 1000;
ip = player.getAddress().toString().replace("'", "\\'");
}
@Override
public String[] getInserts() {
- return new String[]{"UPDATE `lb-players` SET lastlogin = FROM_UNIXTIME(" + lastLogin + "), firstlogin = IF(firstlogin = 0, FROM_UNIXTIME(" + lastLogin + "), firstlogin), ip = '" + ip + "' WHERE " + (playerIds.containsKey(playerName) ? "playerid = " + playerIds.get(playerName) : "playerName = '" + playerName + "'") + ";"};
+ return new String[]{"UPDATE `lb-players` SET lastlogin = FROM_UNIXTIME(" + lastLogin + "), firstlogin = IF(firstlogin = 0, FROM_UNIXTIME(" + lastLogin + "), firstlogin), ip = '" + ip + "', playername = '" + player.getName() + "' WHERE UUID = '" + player.getUUID() + "';"};
}
@Override
public String[] getPlayers() {
- return new String[]{playerName};
+ return new String[]{player.getName()};
+ }
+
+ @Override
+ public Actor[] getActors() {
+ return new Actor[]{player};
}
}
private class PlayerLeaveRow implements Row
- {
- private final String playerName;
+ {;
private final long leaveTime;
+ private final Actor actor;
PlayerLeaveRow(Player player) {
- playerName = player.getName();
leaveTime = System.currentTimeMillis() / 1000;
+ actor = Actor.actorFromEntity(player);
}
@Override
public String[] getInserts() {
- return new String[]{"UPDATE `lb-players` SET onlinetime = onlinetime + TIMESTAMPDIFF(SECOND, lastlogin, FROM_UNIXTIME('" + leaveTime + "')) WHERE lastlogin > 0 && " + (playerIds.containsKey(playerName) ? "playerid = " + playerIds.get(playerName) : "playerName = '" + playerName + "'") + ";"};
+ return new String[]{"UPDATE `lb-players` SET onlinetime = onlinetime + TIMESTAMPDIFF(SECOND, lastlogin, FROM_UNIXTIME('" + leaveTime + "')), playername = '" + actor.getName() + "' WHERE lastlogin > 0 && UUID = '" + actor.getUUID() + "';"};
}
@Override
public String[] getPlayers() {
- return new String[]{playerName};
+ return new String[]{actor.getName()};
+ }
+
+ @Override
+ public Actor[] getActors() {
+ return new Actor[]{actor};
}
}
}
diff --git a/src/main/java/de/diddiz/LogBlock/LogBlock.java b/src/main/java/de/diddiz/LogBlock/LogBlock.java
index 86df1b0..46b1a3b 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.LogBlockEditSessionFactory;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
@@ -109,9 +109,9 @@ public class LogBlock extends JavaPlugin
}
if (noDb)
return;
- if (pm.getPlugin("WorldEdit") != null) {
- LogBlockEditSessionFactory.initialize(this);
- }
+// if (pm.getPlugin("WorldEdit") != null) {
+// LogBlockEditSessionFactory.initialize(this);
+// }
commandsHandler = new CommandsHandler(this);
getCommand("lb").setExecutor(commandsHandler);
if (enableAutoClearLog && autoClearLogDelay > 0)
diff --git a/src/main/java/de/diddiz/LogBlock/QueryParams.java b/src/main/java/de/diddiz/LogBlock/QueryParams.java
index 4de1977..cd07aab 100644
--- a/src/main/java/de/diddiz/LogBlock/QueryParams.java
+++ b/src/main/java/de/diddiz/LogBlock/QueryParams.java
@@ -69,7 +69,7 @@ public final class QueryParams implements Cloneable
if (needDate)
select += "date, ";
if (needPlayer)
- select += "playername, ";
+ select += "playername, UUID,";
if (needMessage)
select += "message, ";
select = select.substring(0, select.length() - 2);
@@ -110,7 +110,7 @@ public final class QueryParams implements Cloneable
return select + " " + from + getWhere() + "ORDER BY date " + order + ", id " + order + " " + getLimit();
} else if (sum == SummarizationMode.PLAYERS)
- return "SELECT playername, SUM(kills) AS kills, SUM(killed) AS killed FROM ((SELECT killer AS playerid, count(*) AS kills, 0 as killed FROM `" + getTable() + "-kills` INNER JOIN `lb-players` as killers ON (killer=killers.playerid) INNER JOIN `lb-players` as victims ON (victim=victims.playerid) " + getWhere(BlockChangeType.KILLS) + "GROUP BY killer) UNION (SELECT victim AS playerid, 0 as kills, count(*) AS killed FROM `" + getTable() + "-kills` INNER JOIN `lb-players` as killers ON (killer=killers.playerid) INNER JOIN `lb-players` as victims ON (victim=victims.playerid) " + getWhere(BlockChangeType.KILLS) + "GROUP BY victim)) AS t INNER JOIN `lb-players` USING (playerid) GROUP BY playerid ORDER BY SUM(kills) + SUM(killed) " + order + " " + getLimit();
+ return "SELECT playername, UUID, SUM(kills) AS kills, SUM(killed) AS killed FROM ((SELECT killer AS playerid, count(*) AS kills, 0 as killed FROM `" + getTable() + "-kills` INNER JOIN `lb-players` as killers ON (killer=killers.playerid) INNER JOIN `lb-players` as victims ON (victim=victims.playerid) " + getWhere(BlockChangeType.KILLS) + "GROUP BY killer) UNION (SELECT victim AS playerid, 0 as kills, count(*) AS killed FROM `" + getTable() + "-kills` INNER JOIN `lb-players` as killers ON (killer=killers.playerid) INNER JOIN `lb-players` as victims ON (victim=victims.playerid) " + getWhere(BlockChangeType.KILLS) + "GROUP BY victim)) AS t INNER JOIN `lb-players` USING (playerid) GROUP BY playerid ORDER BY SUM(kills) + SUM(killed) " + order + " " + getLimit();
}
if (sum == SummarizationMode.NONE) {
String select = "SELECT ";
@@ -126,7 +126,7 @@ public final class QueryParams implements Cloneable
if (needData)
select += "data, ";
if (needPlayer)
- select += "playername, ";
+ select += "playername, UUID, ";
if (needCoords)
select += "x, y, z, ";
if (needSignText)
diff --git a/src/main/java/de/diddiz/LogBlock/SummedBlockChanges.java b/src/main/java/de/diddiz/LogBlock/SummedBlockChanges.java
index 089c2db..5e7cd61 100644
--- a/src/main/java/de/diddiz/LogBlock/SummedBlockChanges.java
+++ b/src/main/java/de/diddiz/LogBlock/SummedBlockChanges.java
@@ -12,11 +12,14 @@ public class SummedBlockChanges implements LookupCacheElement
private final String group;
private final int created, destroyed;
private final float spaceFactor;
+ private final Actor actor;
public SummedBlockChanges(ResultSet rs, QueryParams p, float spaceFactor) throws SQLException {
- group = p.sum == SummarizationMode.PLAYERS ? rs.getString(1) : materialName(rs.getInt(1));
- created = rs.getInt(2);
- destroyed = rs.getInt(3);
+ // Actor currently useless here as we don't yet output UUID in results anywhere
+ actor = p.sum == SummarizationMode.PLAYERS ? new Actor(rs) : null;
+ group = actor == null ? materialName(rs.getInt("type")) : actor.getName();
+ created = rs.getInt("created");
+ destroyed = rs.getInt("destroyed");
this.spaceFactor = spaceFactor;
}
diff --git a/src/main/java/de/diddiz/LogBlock/SummedKills.java b/src/main/java/de/diddiz/LogBlock/SummedKills.java
old mode 100755
new mode 100644
index 3dba238..5e3d702
--- a/src/main/java/de/diddiz/LogBlock/SummedKills.java
+++ b/src/main/java/de/diddiz/LogBlock/SummedKills.java
@@ -1,22 +1,20 @@
package de.diddiz.LogBlock;
-import static de.diddiz.util.MaterialName.materialName;
import static de.diddiz.util.Utils.spaces;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.bukkit.Location;
-import de.diddiz.LogBlock.QueryParams.SummarizationMode;
public class SummedKills implements LookupCacheElement
{
- private final String playerName;
+ private final Actor player;
private final int kills, killed;
private final float spaceFactor;
public SummedKills(ResultSet rs, QueryParams p, float spaceFactor) throws SQLException {
- playerName = rs.getString(1);
- kills = rs.getInt(2);
- killed = rs.getInt(3);
+ player = new Actor(rs);
+ kills = rs.getInt("kills");
+ killed = rs.getInt("killed");
this.spaceFactor = spaceFactor;
}
@@ -27,6 +25,6 @@ public class SummedKills implements LookupCacheElement
@Override
public String getMessage() {
- return kills + spaces((int)((6 - String.valueOf(kills).length()) / spaceFactor)) + killed + spaces((int)((7 - String.valueOf(killed).length()) / spaceFactor)) + playerName;
+ return kills + spaces((int)((6 - String.valueOf(kills).length()) / spaceFactor)) + killed + spaces((int)((7 - String.valueOf(killed).length()) / spaceFactor)) + player.getName();
}
}
diff --git a/src/main/java/de/diddiz/LogBlock/Updater.java b/src/main/java/de/diddiz/LogBlock/Updater.java
index 6c334dc..5f85a15 100644
--- a/src/main/java/de/diddiz/LogBlock/Updater.java
+++ b/src/main/java/de/diddiz/LogBlock/Updater.java
@@ -13,15 +13,24 @@ import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map.Entry;
import static de.diddiz.LogBlock.config.Config.getLoggedWorlds;
import static de.diddiz.LogBlock.config.Config.isLogging;
import static de.diddiz.util.BukkitUtils.friendlyWorldname;
+import de.diddiz.util.UUIDFetcher;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+import java.util.logging.Logger;
import static org.bukkit.Bukkit.getLogger;
class Updater
{
private final LogBlock logblock;
+ final int UUID_CONVERT_BATCH_SIZE = 100;
Updater(LogBlock logblock) {
this.logblock = logblock;
@@ -256,6 +265,77 @@ class Updater
config.set("version", "1.81");
}
+ if (config.getString("version").compareTo("1.90") < 0) {
+ getLogger().info("Updating tables to 1.9 ...");
+ getLogger().info("Importing UUIDs for large databases may take some time");
+ final Connection conn = logblock.getConnection();
+ try {
+ conn.setAutoCommit(true);
+ final Statement st = conn.createStatement();
+ st.execute("ALTER TABLE `lb-players` ADD `UUID` VARCHAR(36) NOT NULL");
+ } catch (final SQLException ex) {
+ // Error 1060 is MySQL error "column already exists". We want to continue with import if we get that error
+ if (ex.getErrorCode() != 1060) {
+ Bukkit.getLogger().log(Level.SEVERE, "[Updater] Error: ", ex);
+ return false;
+ }
+ }
+ try {
+ ResultSet rs;
+ conn.setAutoCommit(true);
+ final Statement st = conn.createStatement();
+ // Start by assuming anything with no onlinetime is not a player
+ st.execute("UPDATE `lb-players` SET UUID = CONCAT ('log_',playername) WHERE onlinetime=0 AND LENGTH(UUID) = 0");
+ // Tell people how many are needing converted
+ rs = st.executeQuery("SELECT COUNT(playername) FROM `lb-players` WHERE LENGTH(UUID)=0");
+ rs.next();
+ String total = Integer.toString(rs.getInt(1));
+ getLogger().info(total + " players to convert");
+ int done = 0;
+
+ conn.setAutoCommit(false);
+ Map players = new HashMap();
+ List names = new ArrayList(UUID_CONVERT_BATCH_SIZE);
+ Map response;
+ rs = st.executeQuery("SELECT playerid,playername FROM `lb-players` WHERE LENGTH(UUID)=0 LIMIT " + Integer.toString(UUID_CONVERT_BATCH_SIZE));
+ while (rs.next()) {
+ do {
+ players.put(rs.getString(2),rs.getInt(1));
+ names.add(rs.getString(2));
+ } while (rs.next());
+ if (names.size()>0) {
+ String theUUID;
+ response = UUIDFetcher.getUUIDs(names);
+ for (Map.Entry entry : players.entrySet()) {
+ if (response.get(entry.getKey()) == null) {
+ theUUID = "noimport_" + entry.getKey();
+ getLogger().warning(entry.getKey() + " not found - giving UUID of " + theUUID);
+ } else {
+ theUUID = response.get(entry.getKey()).toString();
+ }
+ String thePID = entry.getValue().toString();
+ st.execute("UPDATE `lb-players` SET UUID = '" + theUUID + "' WHERE playerid = " + thePID);
+ done++;
+ }
+ conn.commit();
+ players.clear();
+ names.clear();
+ getLogger().info("Processed " + Integer.toString(done) + " out of " + total);
+ rs = st.executeQuery("SELECT playerid,playername FROM `lb-players` WHERE LENGTH(UUID)=0 LIMIT " + Integer.toString(UUID_CONVERT_BATCH_SIZE));
+ }
+ }
+ st.close();
+ conn.close();
+
+ } catch (final SQLException ex) {
+ Bukkit.getLogger().log(Level.SEVERE, "[Updater] Error: ", ex);
+ return false;
+ } catch (Exception ex) {
+ Bukkit.getLogger().log(Level.SEVERE, "[UUID importer]", ex);
+ return false;
+ }
+ config.set("version", "1.90");
+ }
logblock.saveConfig();
return true;
}
@@ -267,11 +347,11 @@ class Updater
final Statement state = conn.createStatement();
final DatabaseMetaData dbm = conn.getMetaData();
conn.setAutoCommit(true);
- createTable(dbm, state, "lb-players", "(playerid INT UNSIGNED NOT NULL AUTO_INCREMENT, playername varchar(32) NOT NULL, firstlogin DATETIME NOT NULL, lastlogin DATETIME NOT NULL, onlinetime INT UNSIGNED NOT NULL, ip varchar(255) NOT NULL, PRIMARY KEY (playerid), UNIQUE (playername))");
+ createTable(dbm, state, "lb-players", "(playerid INT UNSIGNED NOT NULL AUTO_INCREMENT, UUID varchar(36) NOT NULL, playername varchar(32) NOT NULL, firstlogin DATETIME NOT NULL, lastlogin DATETIME NOT NULL, onlinetime INT UNSIGNED NOT NULL, ip varchar(255) NOT NULL, PRIMARY KEY (playerid), UNIQUE (UUID))");
// Players table must not be empty or inserts won't work - bug #492
final ResultSet rs = state.executeQuery("SELECT NULL FROM `lb-players` LIMIT 1;");
if (!rs.next())
- state.execute("INSERT IGNORE INTO `lb-players` (playername) VALUES ('dummy_record')");
+ state.execute("INSERT IGNORE INTO `lb-players` (UUID,playername) VALUES ('log_dummy_record','dummy_record')");
if (isLogging(Logging.CHAT))
createTable(dbm, state, "lb-chat", "(id INT UNSIGNED NOT NULL AUTO_INCREMENT, date DATETIME NOT NULL, playerid INT UNSIGNED NOT NULL, message VARCHAR(255) NOT NULL, PRIMARY KEY (id), KEY playerid (playerid), FULLTEXT message (message)) ENGINE=MyISAM DEFAULT CHARSET utf8");
for (final WorldConfig wcfg : getLoggedWorlds()) {
diff --git a/src/main/java/de/diddiz/LogBlock/WorldEditor.java b/src/main/java/de/diddiz/LogBlock/WorldEditor.java
index 4c52f1c..fb5553f 100644
--- a/src/main/java/de/diddiz/LogBlock/WorldEditor.java
+++ b/src/main/java/de/diddiz/LogBlock/WorldEditor.java
@@ -147,8 +147,8 @@ public class WorldEditor implements Runnable
private class Edit extends BlockChange
{
- public Edit(long time, Location loc, String playerName, int replaced, int type, byte data, String signtext, ChestAccess ca) {
- super(time, loc, playerName, replaced, type, data, signtext, ca);
+ public Edit(long time, Location loc, Actor actor, int replaced, int type, byte data, String signtext, ChestAccess ca) {
+ super(time, loc, actor, replaced, type, data, signtext, ca);
}
PerformResult perform() throws WorldEditorException {
diff --git a/src/main/java/de/diddiz/LogBlock/events/BlockChangePreLogEvent.java b/src/main/java/de/diddiz/LogBlock/events/BlockChangePreLogEvent.java
index fa7c668..e2b8f6c 100644
--- a/src/main/java/de/diddiz/LogBlock/events/BlockChangePreLogEvent.java
+++ b/src/main/java/de/diddiz/LogBlock/events/BlockChangePreLogEvent.java
@@ -1,4 +1,5 @@
package de.diddiz.LogBlock.events;
+import de.diddiz.LogBlock.Actor;
import de.diddiz.LogBlock.ChestAccess;
import org.apache.commons.lang.Validate;
import org.bukkit.Location;
@@ -13,7 +14,7 @@ public class BlockChangePreLogEvent extends PreLogEvent {
private String signText;
private ChestAccess chestAccess;
- public BlockChangePreLogEvent(String owner, Location location, int typeBefore, int typeAfter, byte data,
+ public BlockChangePreLogEvent(Actor owner, Location location, int typeBefore, int typeAfter, byte data,
String signText, ChestAccess chestAccess) {
super(owner);
diff --git a/src/main/java/de/diddiz/LogBlock/events/PreLogEvent.java b/src/main/java/de/diddiz/LogBlock/events/PreLogEvent.java
index 3c12e6b..49c8598 100644
--- a/src/main/java/de/diddiz/LogBlock/events/PreLogEvent.java
+++ b/src/main/java/de/diddiz/LogBlock/events/PreLogEvent.java
@@ -1,24 +1,36 @@
package de.diddiz.LogBlock.events;
+import de.diddiz.LogBlock.Actor;
import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
public abstract class PreLogEvent extends Event implements Cancellable {
protected boolean cancelled = false;
- protected String owner;
+ protected Actor owner;
- public PreLogEvent(String owner) {
+ public PreLogEvent(Actor owner) {
- this.owner = owner.replaceAll("[^a-zA-Z0-9_]", "");
+ this.owner = owner;
}
/**
* Returns the player/monster/cause involved in this event
*
* @return Player/monster/cause who is involved in this event
+ * @deprecated {@link #getOwnerActor() } returns an object encapsulating
+ * name and uuid. Names are not guaranteed to be unique.
*/
public String getOwner() {
+ return owner.getName();
+ }
+
+ /**
+ * Returns the player/monster/cause involved in this event
+ *
+ * @return Player/monster/cause who is involved in this event
+ */
+ public Actor getOwnerActor() {
return owner;
}
@@ -27,9 +39,9 @@ public abstract class PreLogEvent extends Event implements Cancellable {
*
* @param owner The player/monster/cause who is involved in this event
*/
- public void setOwner(String owner) {
+ public void setOwner(Actor owner) {
- this.owner = owner.replaceAll("[^a-zA-Z0-9_]", "");
+ this.owner = owner;
}
public boolean isCancelled() {
diff --git a/src/main/java/de/diddiz/LogBlock/listeners/BlockBreakLogging.java b/src/main/java/de/diddiz/LogBlock/listeners/BlockBreakLogging.java
index d9dc725..22dad56 100644
--- a/src/main/java/de/diddiz/LogBlock/listeners/BlockBreakLogging.java
+++ b/src/main/java/de/diddiz/LogBlock/listeners/BlockBreakLogging.java
@@ -1,5 +1,6 @@
package de.diddiz.LogBlock.listeners;
+import de.diddiz.LogBlock.Actor;
import static de.diddiz.LogBlock.config.Config.getWorldConfig;
import static de.diddiz.LogBlock.config.Config.isLogging;
import static de.diddiz.util.LoggingUtil.smartLogBlockBreak;
@@ -29,33 +30,33 @@ public class BlockBreakLogging extends LoggingListener
WorldConfig wcfg = getWorldConfig(event.getBlock().getWorld());
if (wcfg == null) return;
- final String playerName = event.getPlayer().getName();
+ final Actor actor = Actor.actorFromEntity(event.getPlayer());
final Block origin = event.getBlock();
final int typeId = origin.getTypeId();
final Material type = origin.getType();
if (wcfg.isLogging(Logging.SIGNTEXT) && (typeId == 63 || typeId == 68)) {
- consumer.queueSignBreak(playerName, (Sign) origin.getState());
+ consumer.queueSignBreak(actor, (Sign) origin.getState());
} else if (wcfg.isLogging(Logging.CHESTACCESS) && BukkitUtils.getContainerBlocks().contains(type)) {
- consumer.queueContainerBreak(playerName, origin.getState());
+ consumer.queueContainerBreak(actor, origin.getState());
} else if (type == Material.ICE) {
// When in creative mode ice doesn't form water
if (event.getPlayer().getGameMode().equals(GameMode.CREATIVE)) {
- consumer.queueBlockBreak(playerName, origin.getState());
+ consumer.queueBlockBreak(actor, origin.getState());
} else {
- consumer.queueBlockReplace(playerName, origin.getState(), 9, (byte) 0);
+ consumer.queueBlockReplace(actor, origin.getState(), 9, (byte) 0);
}
} else {
- smartLogBlockBreak(consumer, playerName, origin);
+ smartLogBlockBreak(consumer, actor, origin);
}
- smartLogFallables(consumer, playerName, origin);
+ smartLogFallables(consumer, actor, origin);
}
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerBucketFill(PlayerBucketFillEvent event) {
if (isLogging(event.getBlockClicked().getWorld(), Logging.BLOCKBREAK)) {
- consumer.queueBlockBreak(event.getPlayer().getName(), event.getBlockClicked().getState());
+ consumer.queueBlockBreak(Actor.actorFromEntity(event.getPlayer()), event.getBlockClicked().getState());
}
}
}
diff --git a/src/main/java/de/diddiz/LogBlock/listeners/BlockBurnLogging.java b/src/main/java/de/diddiz/LogBlock/listeners/BlockBurnLogging.java
index 7119ab4..471eac4 100644
--- a/src/main/java/de/diddiz/LogBlock/listeners/BlockBurnLogging.java
+++ b/src/main/java/de/diddiz/LogBlock/listeners/BlockBurnLogging.java
@@ -1,13 +1,14 @@
package de.diddiz.LogBlock.listeners;
+import de.diddiz.LogBlock.Actor;
+import de.diddiz.LogBlock.LogBlock;
+import de.diddiz.LogBlock.Logging;
import static de.diddiz.LogBlock.config.Config.isLogging;
import static de.diddiz.util.LoggingUtil.smartLogBlockBreak;
import static de.diddiz.util.LoggingUtil.smartLogFallables;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.block.BlockBurnEvent;
-import de.diddiz.LogBlock.LogBlock;
-import de.diddiz.LogBlock.Logging;
public class BlockBurnLogging extends LoggingListener
{
@@ -18,8 +19,8 @@ public class BlockBurnLogging extends LoggingListener
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onBlockBurn(BlockBurnEvent event) {
if (isLogging(event.getBlock().getWorld(), Logging.FIRE)) {
- smartLogBlockBreak(consumer, "Fire", event.getBlock());
- smartLogFallables(consumer, "Fire", event.getBlock());
+ smartLogBlockBreak(consumer, new Actor("Fire"), event.getBlock());
+ smartLogFallables(consumer, new Actor("Fire"), event.getBlock());
}
}
}
diff --git a/src/main/java/de/diddiz/LogBlock/listeners/BlockPlaceLogging.java b/src/main/java/de/diddiz/LogBlock/listeners/BlockPlaceLogging.java
index cc65377..58ae7fb 100644
--- a/src/main/java/de/diddiz/LogBlock/listeners/BlockPlaceLogging.java
+++ b/src/main/java/de/diddiz/LogBlock/listeners/BlockPlaceLogging.java
@@ -1,5 +1,6 @@
package de.diddiz.LogBlock.listeners;
+import de.diddiz.LogBlock.Actor;
import static de.diddiz.LogBlock.config.Config.getWorldConfig;
import static de.diddiz.LogBlock.config.Config.isLogging;
@@ -29,14 +30,14 @@ public class BlockPlaceLogging extends LoggingListener
final Material type = event.getBlock().getType();
final BlockState before = event.getBlockReplacedState();
final BlockState after = event.getBlockPlaced().getState();
- final String playerName = event.getPlayer().getName();
+ final Actor actor = Actor.actorFromEntity(event.getPlayer());
//Handle falling blocks
if (BukkitUtils.getRelativeTopFallables().contains(type)) {
// Catch placed blocks overwriting something
if (before.getType() != Material.AIR) {
- consumer.queueBlockBreak(playerName, before);
+ consumer.queueBlockBreak(actor, before);
}
Location loc = event.getBlock().getLocation();
@@ -55,9 +56,9 @@ public class BlockPlaceLogging extends LoggingListener
// Run this check to avoid false positives
if (!BukkitUtils.getFallingEntityKillers().contains(finalLoc.getBlock().getType())) {
if (finalLoc.getBlock().getType() == Material.AIR || finalLoc.equals(event.getBlock().getLocation())) {
- consumer.queueBlockPlace(playerName, finalLoc, type.getId(), event.getBlock().getData());
+ consumer.queueBlockPlace(actor, finalLoc, type.getId(), event.getBlock().getData());
} else {
- consumer.queueBlockReplace(playerName, finalLoc, finalLoc.getBlock().getTypeId(), finalLoc.getBlock().getData(), type.getId(), event.getBlock().getData());
+ consumer.queueBlockReplace(actor, finalLoc, finalLoc.getBlock().getTypeId(), finalLoc.getBlock().getData(), type.getId(), event.getBlock().getData());
}
}
}
@@ -73,9 +74,9 @@ public class BlockPlaceLogging extends LoggingListener
@Override
public void run() {
if (before.getTypeId() == 0)
- consumer.queueBlockPlace(playerName, after);
+ consumer.queueBlockPlace(actor, after);
else
- consumer.queueBlockReplace(playerName, before, after);
+ consumer.queueBlockReplace(actor, before, after);
}
}, 1L);
}
@@ -84,6 +85,6 @@ public class BlockPlaceLogging extends LoggingListener
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerBucketEmpty(PlayerBucketEmptyEvent event) {
if (isLogging(event.getPlayer().getWorld(), Logging.BLOCKPLACE))
- consumer.queueBlockPlace(event.getPlayer().getName(), event.getBlockClicked().getRelative(event.getBlockFace()).getLocation(), event.getBucket() == Material.WATER_BUCKET ? 9 : 11, (byte)0);
+ consumer.queueBlockPlace(Actor.actorFromEntity(event.getPlayer()), event.getBlockClicked().getRelative(event.getBlockFace()).getLocation(), event.getBucket() == Material.WATER_BUCKET ? 9 : 11, (byte)0);
}
}
diff --git a/src/main/java/de/diddiz/LogBlock/listeners/BlockSpreadLogging.java b/src/main/java/de/diddiz/LogBlock/listeners/BlockSpreadLogging.java
index b1d0f38..1cac2d0 100644
--- a/src/main/java/de/diddiz/LogBlock/listeners/BlockSpreadLogging.java
+++ b/src/main/java/de/diddiz/LogBlock/listeners/BlockSpreadLogging.java
@@ -1,15 +1,15 @@
package de.diddiz.LogBlock.listeners;
+import de.diddiz.LogBlock.Actor;
import de.diddiz.LogBlock.LogBlock;
import de.diddiz.LogBlock.Logging;
+import static de.diddiz.LogBlock.config.Config.isLogging;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.block.BlockSpreadEvent;
-import static de.diddiz.LogBlock.config.Config.isLogging;
-
public class BlockSpreadLogging extends LoggingListener
{
@@ -47,6 +47,6 @@ public class BlockSpreadLogging extends LoggingListener
return;
}
- consumer.queueBlockReplace(name, event.getBlock().getState(), event.getNewState());
+ consumer.queueBlockReplace(new Actor(name), event.getBlock().getState(), event.getNewState());
}
}
diff --git a/src/main/java/de/diddiz/LogBlock/listeners/ChatLogging.java b/src/main/java/de/diddiz/LogBlock/listeners/ChatLogging.java
index 9f24db3..80078c5 100644
--- a/src/main/java/de/diddiz/LogBlock/listeners/ChatLogging.java
+++ b/src/main/java/de/diddiz/LogBlock/listeners/ChatLogging.java
@@ -1,13 +1,14 @@
package de.diddiz.LogBlock.listeners;
+import de.diddiz.LogBlock.Actor;
+import de.diddiz.LogBlock.LogBlock;
+import de.diddiz.LogBlock.Logging;
import static de.diddiz.LogBlock.config.Config.isLogging;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.event.server.ServerCommandEvent;
-import de.diddiz.LogBlock.LogBlock;
-import de.diddiz.LogBlock.Logging;
public class ChatLogging extends LoggingListener
{
@@ -18,17 +19,17 @@ public class ChatLogging extends LoggingListener
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) {
if (isLogging(event.getPlayer().getWorld(), Logging.CHAT))
- consumer.queueChat(event.getPlayer().getName(), event.getMessage());
+ consumer.queueChat(Actor.actorFromEntity(event.getPlayer()), event.getMessage());
}
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerChat(AsyncPlayerChatEvent event) {
if (isLogging(event.getPlayer().getWorld(), Logging.CHAT))
- consumer.queueChat(event.getPlayer().getName(), event.getMessage());
+ consumer.queueChat(Actor.actorFromEntity(event.getPlayer()), event.getMessage());
}
@EventHandler(priority = EventPriority.MONITOR)
public void onServerCommand(ServerCommandEvent event) {
- consumer.queueChat("Console", "/" + event.getCommand());
+ consumer.queueChat(new Actor("Console"), "/" + event.getCommand());
}
}
diff --git a/src/main/java/de/diddiz/LogBlock/listeners/ChestAccessLogging.java b/src/main/java/de/diddiz/LogBlock/listeners/ChestAccessLogging.java
index 2be244f..9354556 100644
--- a/src/main/java/de/diddiz/LogBlock/listeners/ChestAccessLogging.java
+++ b/src/main/java/de/diddiz/LogBlock/listeners/ChestAccessLogging.java
@@ -1,5 +1,6 @@
package de.diddiz.LogBlock.listeners;
+import de.diddiz.LogBlock.Actor;
import static de.diddiz.LogBlock.config.Config.isLogging;
import static de.diddiz.util.BukkitUtils.compareInventories;
import static de.diddiz.util.BukkitUtils.compressInventory;
@@ -43,7 +44,7 @@ public class ChestAccessLogging extends LoggingListener
final ItemStack[] diff = compareInventories(before, after);
final Location loc = getInventoryHolderLocation(holder);
for (final ItemStack item : diff) {
- consumer.queueChestAccess(player.getName(), loc, loc.getWorld().getBlockTypeIdAt(loc), (short)item.getTypeId(), (short)item.getAmount(), rawData(item));
+ consumer.queueChestAccess(Actor.actorFromEntity(player), loc, loc.getWorld().getBlockTypeIdAt(loc), (short)item.getTypeId(), (short)item.getAmount(), rawData(item));
}
containers.remove(player);
}
diff --git a/src/main/java/de/diddiz/LogBlock/listeners/CreatureInteractLogging.java b/src/main/java/de/diddiz/LogBlock/listeners/CreatureInteractLogging.java
index c7a5f03..940359e 100644
--- a/src/main/java/de/diddiz/LogBlock/listeners/CreatureInteractLogging.java
+++ b/src/main/java/de/diddiz/LogBlock/listeners/CreatureInteractLogging.java
@@ -1,7 +1,9 @@
package de.diddiz.LogBlock.listeners;
+import de.diddiz.LogBlock.Actor;
import de.diddiz.LogBlock.LogBlock;
import de.diddiz.LogBlock.Logging;
+import static de.diddiz.LogBlock.config.Config.getWorldConfig;
import de.diddiz.LogBlock.config.WorldConfig;
import de.diddiz.util.BukkitUtils;
import org.bukkit.Location;
@@ -14,8 +16,6 @@ import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.entity.EntityInteractEvent;
-import static de.diddiz.LogBlock.config.Config.getWorldConfig;
-
public class CreatureInteractLogging extends LoggingListener
{
public CreatureInteractLogging(LogBlock lb) {
@@ -42,11 +42,11 @@ public class CreatureInteractLogging extends LoggingListener
case SOIL:
if (wcfg.isLogging(Logging.CREATURECROPTRAMPLE)) {
// 3 = Dirt ID
- consumer.queueBlock(entityType.getName(), loc, typeId, 3, blockData);
+ consumer.queueBlock(Actor.actorFromEntity(entityType), loc, typeId, 3, blockData);
// Log the crop on top as being broken
Block trampledCrop = clicked.getRelative(BlockFace.UP);
if (BukkitUtils.getCropBlocks().contains(trampledCrop.getType())) {
- consumer.queueBlockBreak("CreatureTrample", trampledCrop.getState());
+ consumer.queueBlockBreak(new Actor("CreatureTrample"), trampledCrop.getState());
}
}
break;
diff --git a/src/main/java/de/diddiz/LogBlock/listeners/EndermenLogging.java b/src/main/java/de/diddiz/LogBlock/listeners/EndermenLogging.java
index 4adcd10..1f4bc21 100644
--- a/src/main/java/de/diddiz/LogBlock/listeners/EndermenLogging.java
+++ b/src/main/java/de/diddiz/LogBlock/listeners/EndermenLogging.java
@@ -1,12 +1,13 @@
package de.diddiz.LogBlock.listeners;
+import de.diddiz.LogBlock.Actor;
+import de.diddiz.LogBlock.LogBlock;
+import de.diddiz.LogBlock.Logging;
import static de.diddiz.LogBlock.config.Config.isLogging;
import org.bukkit.entity.Enderman;
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;
public class EndermenLogging extends LoggingListener
{
@@ -17,6 +18,6 @@ public class EndermenLogging extends LoggingListener
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onEntityChangeBlock(EntityChangeBlockEvent event) {
if (event.getEntity() instanceof Enderman && isLogging(event.getBlock().getWorld(), Logging.ENDERMEN))
- consumer.queueBlockReplace("Enderman", event.getBlock().getState(), event.getTo().getId(), (byte)0); // Figure out how to get the data of the placed block;
+ consumer.queueBlockReplace(new Actor("Enderman"), event.getBlock().getState(), event.getTo().getId(), (byte)0); // Figure out how to get the data of the placed block;
}
}
diff --git a/src/main/java/de/diddiz/LogBlock/listeners/ExplosionLogging.java b/src/main/java/de/diddiz/LogBlock/listeners/ExplosionLogging.java
index f663b32..c2d6bac 100644
--- a/src/main/java/de/diddiz/LogBlock/listeners/ExplosionLogging.java
+++ b/src/main/java/de/diddiz/LogBlock/listeners/ExplosionLogging.java
@@ -1,8 +1,13 @@
package de.diddiz.LogBlock.listeners;
+import de.diddiz.LogBlock.Actor;
import de.diddiz.LogBlock.LogBlock;
import de.diddiz.LogBlock.Logging;
+import static de.diddiz.LogBlock.config.Config.getWorldConfig;
+import static de.diddiz.LogBlock.config.Config.logCreeperExplosionsAsPlayerWhoTriggeredThese;
import de.diddiz.LogBlock.config.WorldConfig;
+import static de.diddiz.util.BukkitUtils.getContainerBlocks;
+import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.Sign;
import org.bukkit.entity.Creeper;
@@ -10,19 +15,14 @@ import org.bukkit.entity.EnderDragon;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Fireball;
import org.bukkit.entity.Ghast;
-import org.bukkit.entity.minecart.ExplosiveMinecart;
import org.bukkit.entity.Player;
import org.bukkit.entity.TNTPrimed;
import org.bukkit.entity.Wither;
import org.bukkit.entity.WitherSkull;
+import org.bukkit.entity.minecart.ExplosiveMinecart;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.entity.EntityExplodeEvent;
-import org.bukkit.Material;
-
-import static de.diddiz.LogBlock.config.Config.getWorldConfig;
-import static de.diddiz.LogBlock.config.Config.logCreeperExplosionsAsPlayerWhoTriggeredThese;
-import static de.diddiz.util.BukkitUtils.getContainerBlocks;
public class ExplosionLogging extends LoggingListener
{
@@ -34,7 +34,7 @@ public class ExplosionLogging extends LoggingListener
public void onEntityExplode(EntityExplodeEvent event) {
final WorldConfig wcfg = getWorldConfig(event.getLocation().getWorld());
if (wcfg != null) {
- String name = "Explosion";
+ Actor actor = new Actor("Explosion");
Entity source = event.getEntity();
if (source == null) {
if (!wcfg.isLogging(Logging.MISCEXPLOSION))
@@ -42,19 +42,19 @@ public class ExplosionLogging extends LoggingListener
} else if (source instanceof TNTPrimed) {
if (!wcfg.isLogging(Logging.TNTEXPLOSION))
return;
- name = "TNT";
+ actor = new Actor("TNT");
} else if (source instanceof ExplosiveMinecart) {
if (!wcfg.isLogging(Logging.TNTMINECARTEXPLOSION))
return;
- name = "TNTMinecart";
+ actor = new Actor("TNTMinecart");
} else if (source instanceof Creeper) {
if (!wcfg.isLogging(Logging.CREEPEREXPLOSION))
return;
if (logCreeperExplosionsAsPlayerWhoTriggeredThese) {
final Entity target = ((Creeper) source).getTarget();
- name = target instanceof Player ? ((Player)target).getName() : "Creeper";
+ actor = target instanceof Player ? Actor.actorFromEntity(target) : new Actor("Creeper");
} else
- name = "Creeper";
+ new Actor("Creeper");
} else if (source instanceof Fireball) {
Fireball fireball = (Fireball) source;
Entity shooter = fireball.getShooter();
@@ -65,25 +65,25 @@ public class ExplosionLogging extends LoggingListener
if (!wcfg.isLogging(Logging.GHASTFIREBALLEXPLOSION)) {
return;
}
- name = "Ghast";
+ actor = Actor.actorFromEntity(shooter);
} else if (shooter instanceof Wither) {
if (!wcfg.isLogging(Logging.WITHER)) {
return;
}
- name = "Wither";
+ actor = Actor.actorFromEntity(shooter);
}
} else if (source instanceof EnderDragon) {
if (!wcfg.isLogging(Logging.ENDERDRAGON))
return;
- name = "EnderDragon";
+ actor = Actor.actorFromEntity(source);
} else if (source instanceof Wither) {
if(!wcfg.isLogging(Logging.WITHER))
return;
- name = "Wither";
+ actor = Actor.actorFromEntity(source);
} else if (source instanceof WitherSkull) {
if(!wcfg.isLogging(Logging.WITHER_SKULL))
return;
- name = "WitherSkull";
+ actor = Actor.actorFromEntity(source);
} else {
if (!wcfg.isLogging(Logging.MISCEXPLOSION))
return;
@@ -91,11 +91,11 @@ public class ExplosionLogging extends LoggingListener
for (final Block block : event.blockList()) {
final int type = block.getTypeId();
if (wcfg.isLogging(Logging.SIGNTEXT) & (type == 63 || type == 68))
- consumer.queueSignBreak(name, (Sign)block.getState());
+ consumer.queueSignBreak(actor, (Sign)block.getState());
else if (wcfg.isLogging(Logging.CHESTACCESS) && (getContainerBlocks().contains(Material.getMaterial(type))))
- consumer.queueContainerBreak(name, block.getState());
+ consumer.queueContainerBreak(actor, block.getState());
else
- consumer.queueBlockBreak(name, block.getState());
+ consumer.queueBlockBreak(actor, block.getState());
}
}
}
diff --git a/src/main/java/de/diddiz/LogBlock/listeners/FluidFlowLogging.java b/src/main/java/de/diddiz/LogBlock/listeners/FluidFlowLogging.java
index 5df6411..d64bfb6 100644
--- a/src/main/java/de/diddiz/LogBlock/listeners/FluidFlowLogging.java
+++ b/src/main/java/de/diddiz/LogBlock/listeners/FluidFlowLogging.java
@@ -1,6 +1,10 @@
package de.diddiz.LogBlock.listeners;
+import de.diddiz.LogBlock.Actor;
+import de.diddiz.LogBlock.LogBlock;
+import de.diddiz.LogBlock.Logging;
import static de.diddiz.LogBlock.config.Config.getWorldConfig;
+import de.diddiz.LogBlock.config.WorldConfig;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
@@ -9,9 +13,6 @@ import org.bukkit.block.BlockFace;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.block.BlockFromToEvent;
-import de.diddiz.LogBlock.LogBlock;
-import de.diddiz.LogBlock.Logging;
-import de.diddiz.LogBlock.config.WorldConfig;
public class FluidFlowLogging extends LoggingListener
{
@@ -32,37 +33,37 @@ public class FluidFlowLogging extends LoggingListener
if (typeFrom == 10 || typeFrom == 11) {
if (canFlow && wcfg.isLogging(Logging.LAVAFLOW)) {
if (isSurroundedByWater(to) && event.getBlock().getData() <= 2)
- consumer.queueBlockReplace("LavaFlow", to.getState(), 4, (byte)0);
+ consumer.queueBlockReplace(new Actor("LavaFlow"), to.getState(), 4, (byte)0);
else if (typeTo == 0) {
- consumer.queueBlockPlace("LavaFlow", to.getLocation(), 10, (byte)(event.getBlock().getData() + 1));
+ consumer.queueBlockPlace(new Actor("LavaFlow"), to.getLocation(), 10, (byte)(event.getBlock().getData() + 1));
} else {
- consumer.queueBlockReplace("LavaFlow", to.getState(), 10, (byte)(event.getBlock().getData() + 1));
+ consumer.queueBlockReplace(new Actor("LavaFlow"), to.getState(), 10, (byte)(event.getBlock().getData() + 1));
}
} else if (typeTo == 8 || typeTo == 9) {
if (event.getFace() == BlockFace.DOWN) {
- consumer.queueBlockReplace("LavaFlow", to.getState(), 1, (byte)0);
+ consumer.queueBlockReplace(new Actor("LavaFlow"), to.getState(), 1, (byte)0);
} else {
- consumer.queueBlockReplace("LavaFlow", to.getState(), 4, (byte)0);
+ consumer.queueBlockReplace(new Actor("LavaFlow"), to.getState(), 4, (byte)0);
}
}
} else if ((typeFrom == 8 || typeFrom == 9) && wcfg.isLogging(Logging.WATERFLOW)) {
if (typeTo == 0) {
- consumer.queueBlockPlace("WaterFlow", to.getLocation(), 8, (byte)(event.getBlock().getData() + 1));
+ consumer.queueBlockPlace(new Actor("WaterFlow"), to.getLocation(), 8, (byte)(event.getBlock().getData() + 1));
} else if (nonFluidProofBlocks.contains(typeTo)) {
- consumer.queueBlockReplace("WaterFlow", to.getState(), 8, (byte)(event.getBlock().getData() + 1));
+ consumer.queueBlockReplace(new Actor("WaterFlow"), to.getState(), 8, (byte)(event.getBlock().getData() + 1));
}
else if (typeTo == 10 || typeTo == 11) {
if (to.getData() == 0) {
- consumer.queueBlockReplace("WaterFlow", to.getState(), 49, (byte)0);
+ consumer.queueBlockReplace(new Actor("WaterFlow"), to.getState(), 49, (byte)0);
} else if (event.getFace() == BlockFace.DOWN) {
- consumer.queueBlockReplace("LavaFlow", to.getState(), 1, (byte)0);
+ consumer.queueBlockReplace(new Actor("LavaFlow"), to.getState(), 1, (byte)0);
}
}
if (typeTo == 0 || nonFluidProofBlocks.contains(typeTo)) {
for (final BlockFace face : new BlockFace[]{BlockFace.DOWN, BlockFace.NORTH, BlockFace.WEST, BlockFace.EAST, BlockFace.SOUTH}) {
final Block lower = to.getRelative(face);
if (lower.getTypeId() == 10 || lower.getTypeId() == 11) {
- consumer.queueBlockReplace("WaterFlow", lower.getState(), lower.getData() == 0 ? 49 : 4, (byte)0);
+ consumer.queueBlockReplace(new Actor("WaterFlow"), lower.getState(), lower.getData() == 0 ? 49 : 4, (byte)0);
}
}
}
diff --git a/src/main/java/de/diddiz/LogBlock/listeners/InteractLogging.java b/src/main/java/de/diddiz/LogBlock/listeners/InteractLogging.java
index 4c96dc2..086cb33 100644
--- a/src/main/java/de/diddiz/LogBlock/listeners/InteractLogging.java
+++ b/src/main/java/de/diddiz/LogBlock/listeners/InteractLogging.java
@@ -1,5 +1,6 @@
package de.diddiz.LogBlock.listeners;
+import de.diddiz.LogBlock.Actor;
import static de.diddiz.LogBlock.config.Config.getWorldConfig;
import de.diddiz.util.BukkitUtils;
@@ -15,6 +16,7 @@ import org.bukkit.event.player.PlayerInteractEvent;
import de.diddiz.LogBlock.LogBlock;
import de.diddiz.LogBlock.Logging;
import de.diddiz.LogBlock.config.WorldConfig;
+import org.bukkit.entity.EntityType;
public class InteractLogging extends LoggingListener
{
@@ -39,31 +41,31 @@ public class InteractLogging extends LoggingListener
case WOOD_BUTTON:
case STONE_BUTTON:
if (wcfg.isLogging(Logging.SWITCHINTERACT) && event.getAction() == Action.RIGHT_CLICK_BLOCK)
- consumer.queueBlock(player.getName(), loc, typeId, typeId, blockData);
+ consumer.queueBlock(Actor.actorFromEntity(player), loc, typeId, typeId, blockData);
break;
case FENCE_GATE:
case WOODEN_DOOR:
case TRAP_DOOR:
if (wcfg.isLogging(Logging.DOORINTERACT) && event.getAction() == Action.RIGHT_CLICK_BLOCK)
- consumer.queueBlock(player.getName(), loc, typeId, typeId, blockData);
+ consumer.queueBlock(Actor.actorFromEntity(player), loc, typeId, typeId, blockData);
break;
case CAKE_BLOCK:
if (wcfg.isLogging(Logging.CAKEEAT) && event.getAction() == Action.RIGHT_CLICK_BLOCK && player.getFoodLevel() < 20)
- consumer.queueBlock(player.getName(), loc, typeId, typeId, blockData);
+ consumer.queueBlock(Actor.actorFromEntity(player), loc, typeId, typeId, blockData);
break;
case NOTE_BLOCK:
if (wcfg.isLogging(Logging.NOTEBLOCKINTERACT) && event.getAction() == Action.RIGHT_CLICK_BLOCK)
- consumer.queueBlock(player.getName(), loc, typeId, typeId, blockData);
+ consumer.queueBlock(Actor.actorFromEntity(player), loc, typeId, typeId, blockData);
break;
case DIODE_BLOCK_OFF:
case DIODE_BLOCK_ON:
if (wcfg.isLogging(Logging.DIODEINTERACT) && event.getAction() == Action.RIGHT_CLICK_BLOCK)
- consumer.queueBlock(player.getName(), loc, typeId, typeId, blockData);
+ consumer.queueBlock(Actor.actorFromEntity(player), loc, typeId, typeId, blockData);
break;
case REDSTONE_COMPARATOR_OFF:
case REDSTONE_COMPARATOR_ON:
if (wcfg.isLogging(Logging.COMPARATORINTERACT) && event.getAction() == Action.RIGHT_CLICK_BLOCK) {
- consumer.queueBlock(player.getName(), loc, typeId, typeId, blockData);
+ consumer.queueBlock(Actor.actorFromEntity(player), loc, typeId, typeId, blockData);
}
break;
case WOOD_PLATE:
@@ -71,22 +73,22 @@ public class InteractLogging extends LoggingListener
case IRON_PLATE:
case GOLD_PLATE:
if (wcfg.isLogging(Logging.PRESUREPLATEINTERACT) && event.getAction() == Action.PHYSICAL) {
- consumer.queueBlock(player.getName(), loc, typeId, typeId, blockData);
+ consumer.queueBlock(Actor.actorFromEntity(player), loc, typeId, typeId, blockData);
}
break;
case TRIPWIRE:
if (wcfg.isLogging(Logging.TRIPWIREINTERACT) && event.getAction() == Action.PHYSICAL) {
- consumer.queueBlock(player.getName(), loc, typeId, typeId, blockData);
+ consumer.queueBlock(Actor.actorFromEntity(player), loc, typeId, typeId, blockData);
}
break;
case SOIL:
if (wcfg.isLogging(Logging.CROPTRAMPLE) && event.getAction() == Action.PHYSICAL) {
// 3 = Dirt ID
- consumer.queueBlock(player.getName(), loc, typeId, 3, blockData);
+ consumer.queueBlock(Actor.actorFromEntity(player), loc, typeId, 3, blockData);
// Log the crop on top as being broken
Block trampledCrop = clicked.getRelative(BlockFace.UP);
if (BukkitUtils.getCropBlocks().contains(trampledCrop.getType())) {
- consumer.queueBlockBreak(player.getName(), trampledCrop.getState());
+ consumer.queueBlockBreak(Actor.actorFromEntity(player), trampledCrop.getState());
}
}
break;
diff --git a/src/main/java/de/diddiz/LogBlock/listeners/KillLogging.java b/src/main/java/de/diddiz/LogBlock/listeners/KillLogging.java
index 491ba34..0a8a7b7 100644
--- a/src/main/java/de/diddiz/LogBlock/listeners/KillLogging.java
+++ b/src/main/java/de/diddiz/LogBlock/listeners/KillLogging.java
@@ -1,8 +1,12 @@
package de.diddiz.LogBlock.listeners;
+import de.diddiz.LogBlock.Actor;
+import de.diddiz.LogBlock.LogBlock;
+import de.diddiz.LogBlock.Logging;
+import de.diddiz.LogBlock.config.Config.LogKillsLevel;
import static de.diddiz.LogBlock.config.Config.isLogging;
-import static de.diddiz.LogBlock.config.Config.logKillsLevel;
import static de.diddiz.LogBlock.config.Config.logEnvironmentalKills;
+import static de.diddiz.LogBlock.config.Config.logKillsLevel;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Monster;
@@ -12,9 +16,6 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDeathEvent;
-import de.diddiz.LogBlock.LogBlock;
-import de.diddiz.LogBlock.Logging;
-import de.diddiz.LogBlock.config.Config.LogKillsLevel;
public class KillLogging extends LoggingListener
@@ -42,7 +43,7 @@ public class KillLogging extends LoggingListener
return;
else if (logKillsLevel == LogKillsLevel.MONSTERS && !((victim instanceof Player || victim instanceof Monster)))
return;
- consumer.queueKill(event.getCause().toString(),victim);
+ consumer.queueKill(new Actor(event.getCause().toString()),victim);
}
}
}
diff --git a/src/main/java/de/diddiz/LogBlock/listeners/LeavesDecayLogging.java b/src/main/java/de/diddiz/LogBlock/listeners/LeavesDecayLogging.java
index 204749d..253eaa5 100644
--- a/src/main/java/de/diddiz/LogBlock/listeners/LeavesDecayLogging.java
+++ b/src/main/java/de/diddiz/LogBlock/listeners/LeavesDecayLogging.java
@@ -1,13 +1,14 @@
package de.diddiz.LogBlock.listeners;
+import de.diddiz.LogBlock.Actor;
+import de.diddiz.LogBlock.LogBlock;
+import de.diddiz.LogBlock.Logging;
import static de.diddiz.LogBlock.config.Config.isLogging;
import static de.diddiz.util.LoggingUtil.smartLogBlockBreak;
import static de.diddiz.util.LoggingUtil.smartLogFallables;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.block.LeavesDecayEvent;
-import de.diddiz.LogBlock.LogBlock;
-import de.diddiz.LogBlock.Logging;
public class LeavesDecayLogging extends LoggingListener
{
@@ -18,8 +19,8 @@ public class LeavesDecayLogging extends LoggingListener
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onLeavesDecay(LeavesDecayEvent event) {
if (isLogging(event.getBlock().getWorld(), Logging.LEAVESDECAY)) {
- smartLogBlockBreak(consumer, "LeavesDecay", event.getBlock());
- smartLogFallables(consumer, "LeavesDecay", event.getBlock());
+ smartLogBlockBreak(consumer, new Actor("LeavesDecay"), event.getBlock());
+ smartLogFallables(consumer, new Actor("LeavesDecay"), event.getBlock());
}
}
}
diff --git a/src/main/java/de/diddiz/LogBlock/listeners/LockedChestDecayLogging.java b/src/main/java/de/diddiz/LogBlock/listeners/LockedChestDecayLogging.java
index 5d3b113..5f1c766 100644
--- a/src/main/java/de/diddiz/LogBlock/listeners/LockedChestDecayLogging.java
+++ b/src/main/java/de/diddiz/LogBlock/listeners/LockedChestDecayLogging.java
@@ -1,11 +1,12 @@
package de.diddiz.LogBlock.listeners;
+import de.diddiz.LogBlock.Actor;
+import de.diddiz.LogBlock.LogBlock;
+import de.diddiz.LogBlock.Logging;
import static de.diddiz.LogBlock.config.Config.isLogging;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.block.BlockFadeEvent;
-import de.diddiz.LogBlock.LogBlock;
-import de.diddiz.LogBlock.Logging;
public class LockedChestDecayLogging extends LoggingListener
{
@@ -18,7 +19,7 @@ public class LockedChestDecayLogging extends LoggingListener
if (isLogging(event.getBlock().getWorld(), Logging.LOCKEDCHESTDECAY)) {
final int type = event.getBlock().getTypeId();
if (type == 95)
- consumer.queueBlockReplace("LockedChestDecay", event.getBlock().getState(), event.getNewState());
+ consumer.queueBlockReplace(new Actor("LockedChestDecay"), event.getBlock().getState(), event.getNewState());
}
}
}
diff --git a/src/main/java/de/diddiz/LogBlock/listeners/SignChangeLogging.java b/src/main/java/de/diddiz/LogBlock/listeners/SignChangeLogging.java
index 8d4389d..0b2e823 100644
--- a/src/main/java/de/diddiz/LogBlock/listeners/SignChangeLogging.java
+++ b/src/main/java/de/diddiz/LogBlock/listeners/SignChangeLogging.java
@@ -1,11 +1,13 @@
package de.diddiz.LogBlock.listeners;
+import de.diddiz.LogBlock.Actor;
+import de.diddiz.LogBlock.LogBlock;
+import de.diddiz.LogBlock.Logging;
import static de.diddiz.LogBlock.config.Config.isLogging;
+import org.bukkit.entity.Entity;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.block.SignChangeEvent;
-import de.diddiz.LogBlock.LogBlock;
-import de.diddiz.LogBlock.Logging;
public class SignChangeLogging extends LoggingListener
{
@@ -16,6 +18,6 @@ public class SignChangeLogging extends LoggingListener
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onSignChange(SignChangeEvent event) {
if (isLogging(event.getBlock().getWorld(), Logging.SIGNTEXT))
- consumer.queueSignPlace(event.getPlayer().getName(), event.getBlock().getLocation(), event.getBlock().getTypeId(), event.getBlock().getData(), event.getLines());
+ consumer.queueSignPlace(Actor.actorFromEntity(event.getPlayer()), event.getBlock().getLocation(), event.getBlock().getTypeId(), event.getBlock().getData(), event.getLines());
}
}
diff --git a/src/main/java/de/diddiz/LogBlock/listeners/SnowFadeLogging.java b/src/main/java/de/diddiz/LogBlock/listeners/SnowFadeLogging.java
index 042d992..e15c638 100644
--- a/src/main/java/de/diddiz/LogBlock/listeners/SnowFadeLogging.java
+++ b/src/main/java/de/diddiz/LogBlock/listeners/SnowFadeLogging.java
@@ -1,11 +1,12 @@
package de.diddiz.LogBlock.listeners;
+import de.diddiz.LogBlock.Actor;
+import de.diddiz.LogBlock.LogBlock;
+import de.diddiz.LogBlock.Logging;
import static de.diddiz.LogBlock.config.Config.isLogging;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.block.BlockFadeEvent;
-import de.diddiz.LogBlock.LogBlock;
-import de.diddiz.LogBlock.Logging;
public class SnowFadeLogging extends LoggingListener
{
@@ -18,7 +19,7 @@ public class SnowFadeLogging extends LoggingListener
if (isLogging(event.getBlock().getWorld(), Logging.SNOWFADE)) {
final int type = event.getBlock().getTypeId();
if (type == 78 || type == 79)
- consumer.queueBlockReplace("SnowFade", event.getBlock().getState(), event.getNewState());
+ consumer.queueBlockReplace(new Actor("SnowFade"), event.getBlock().getState(), event.getNewState());
}
}
}
diff --git a/src/main/java/de/diddiz/LogBlock/listeners/SnowFormLogging.java b/src/main/java/de/diddiz/LogBlock/listeners/SnowFormLogging.java
index 51bd2f1..f911a56 100644
--- a/src/main/java/de/diddiz/LogBlock/listeners/SnowFormLogging.java
+++ b/src/main/java/de/diddiz/LogBlock/listeners/SnowFormLogging.java
@@ -1,12 +1,13 @@
package de.diddiz.LogBlock.listeners;
+import de.diddiz.LogBlock.Actor;
+import de.diddiz.LogBlock.LogBlock;
+import de.diddiz.LogBlock.Logging;
import static de.diddiz.LogBlock.config.Config.isLogging;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.block.BlockFormEvent;
import org.bukkit.event.block.LeavesDecayEvent;
-import de.diddiz.LogBlock.LogBlock;
-import de.diddiz.LogBlock.Logging;
public class SnowFormLogging extends LoggingListener
{
@@ -14,18 +15,18 @@ public class SnowFormLogging extends LoggingListener
super(lb);
}
- @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
- public void onLeavesDecay(LeavesDecayEvent event) {
- if (isLogging(event.getBlock().getWorld(), Logging.SNOWFORM))
- consumer.queueBlockBreak("LeavesDecay", event.getBlock().getState());
- }
+// @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
+// public void onLeavesDecay(LeavesDecayEvent event) {
+// if (isLogging(event.getBlock().getWorld(), Logging.SNOWFORM))
+// consumer.queueBlockBreak("LeavesDecay", event.getBlock().getState());
+// }
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onBlockForm(BlockFormEvent event) {
if (isLogging(event.getBlock().getWorld(), Logging.SNOWFORM)) {
final int type = event.getNewState().getTypeId();
if (type == 78 || type == 79)
- consumer.queueBlockReplace("SnowForm", event.getBlock().getState(), event.getNewState());
+ consumer.queueBlockReplace(new Actor("SnowForm"), event.getBlock().getState(), event.getNewState());
}
}
}
diff --git a/src/main/java/de/diddiz/LogBlock/listeners/StructureGrowLogging.java b/src/main/java/de/diddiz/LogBlock/listeners/StructureGrowLogging.java
index fc57cde..786acfe 100644
--- a/src/main/java/de/diddiz/LogBlock/listeners/StructureGrowLogging.java
+++ b/src/main/java/de/diddiz/LogBlock/listeners/StructureGrowLogging.java
@@ -1,13 +1,14 @@
package de.diddiz.LogBlock.listeners;
+import de.diddiz.LogBlock.Actor;
+import de.diddiz.LogBlock.LogBlock;
+import de.diddiz.LogBlock.Logging;
import static de.diddiz.LogBlock.config.Config.getWorldConfig;
+import de.diddiz.LogBlock.config.WorldConfig;
import org.bukkit.block.BlockState;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.world.StructureGrowEvent;
-import de.diddiz.LogBlock.LogBlock;
-import de.diddiz.LogBlock.Logging;
-import de.diddiz.LogBlock.config.WorldConfig;
public class StructureGrowLogging extends LoggingListener
{
@@ -19,18 +20,18 @@ public class StructureGrowLogging extends LoggingListener
public void onStructureGrow(StructureGrowEvent event) {
final WorldConfig wcfg = getWorldConfig(event.getWorld());
if (wcfg != null) {
- final String playerName;
+ final Actor actor;
if (event.getPlayer() != null) {
if (!wcfg.isLogging(Logging.BONEMEALSTRUCTUREGROW))
return;
- playerName = event.getPlayer().getName();
+ actor = Actor.actorFromEntity(event.getPlayer());
} else {
if (!wcfg.isLogging(Logging.NATURALSTRUCTUREGROW))
return;
- playerName = "NaturalGrow";
+ actor = new Actor("NaturalGrow");
}
for (final BlockState state : event.getBlocks())
- consumer.queueBlockReplace(playerName, state.getBlock().getState(), state);
+ consumer.queueBlockReplace(actor, state.getBlock().getState(), state);
}
}
}
diff --git a/src/main/java/de/diddiz/LogBlock/listeners/WitherLogging.java b/src/main/java/de/diddiz/LogBlock/listeners/WitherLogging.java
index 260ff09..ec5dad2 100644
--- a/src/main/java/de/diddiz/LogBlock/listeners/WitherLogging.java
+++ b/src/main/java/de/diddiz/LogBlock/listeners/WitherLogging.java
@@ -1,5 +1,6 @@
package de.diddiz.LogBlock.listeners;
+import de.diddiz.LogBlock.Actor;
import de.diddiz.LogBlock.LogBlock;
import de.diddiz.LogBlock.Logging;
import org.bukkit.entity.Wither;
@@ -18,6 +19,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(), event.getData()); // Wither walked through a block.
+ consumer.queueBlockReplace(Actor.actorFromEntity(event.getEntity()), event.getBlock().getState(), event.getTo().getId(), event.getData()); // Wither walked through a block.
}
}
diff --git a/src/main/java/de/diddiz/util/LoggingUtil.java b/src/main/java/de/diddiz/util/LoggingUtil.java
index be6c0c3..8dca8be 100644
--- a/src/main/java/de/diddiz/util/LoggingUtil.java
+++ b/src/main/java/de/diddiz/util/LoggingUtil.java
@@ -1,6 +1,10 @@
package de.diddiz.util;
+import de.diddiz.LogBlock.Actor;
+import de.diddiz.LogBlock.Consumer;
+import de.diddiz.LogBlock.Logging;
import static de.diddiz.LogBlock.config.Config.getWorldConfig;
+import de.diddiz.LogBlock.config.WorldConfig;
import java.util.List;
import org.bukkit.Location;
import org.bukkit.Material;
@@ -17,13 +21,10 @@ import org.bukkit.material.RedstoneTorch;
import org.bukkit.material.Torch;
import org.bukkit.material.TrapDoor;
import org.bukkit.material.TripwireHook;
-import de.diddiz.LogBlock.Consumer;
-import de.diddiz.LogBlock.Logging;
-import de.diddiz.LogBlock.config.WorldConfig;
public class LoggingUtil {
- public static void smartLogFallables(Consumer consumer, String playerName, Block origin) {
+ public static void smartLogFallables(Consumer consumer, Actor actor, Block origin) {
WorldConfig wcfg = getWorldConfig(origin.getWorld());
if (wcfg == null) return;
@@ -35,7 +36,7 @@ public class LoggingUtil {
while (BukkitUtils.getRelativeTopFallables().contains(checkBlock.getType())) {
// Record this block as falling
- consumer.queueBlockBreak(playerName, checkBlock.getState());
+ consumer.queueBlockBreak(actor, checkBlock.getState());
// Guess where the block is going (This could be thrown of by explosions, but it is better than nothing)
Location loc = origin.getLocation();
@@ -52,9 +53,9 @@ public class LoggingUtil {
if (!BukkitUtils.getFallingEntityKillers().contains(finalLoc.getBlock().getType())) {
finalLoc.add(0, up, 0); // Add this here after checking for block breakers
if (finalLoc.getBlock().getType() == Material.AIR || BukkitUtils.getRelativeTopFallables().contains(finalLoc.getBlock().getType())) {
- consumer.queueBlockPlace(playerName, finalLoc, checkBlock.getTypeId(), checkBlock.getData());
+ consumer.queueBlockPlace(actor, finalLoc, checkBlock.getTypeId(), checkBlock.getData());
} else {
- consumer.queueBlockReplace(playerName, finalLoc, finalLoc.getBlock().getTypeId(), finalLoc.getBlock().getData(), checkBlock.getTypeId(), checkBlock.getData());
+ consumer.queueBlockReplace(actor, finalLoc, finalLoc.getBlock().getTypeId(), finalLoc.getBlock().getData(), checkBlock.getTypeId(), checkBlock.getData());
}
up++;
}
@@ -64,7 +65,7 @@ public class LoggingUtil {
}
}
- public static void smartLogBlockBreak(Consumer consumer, String playerName, Block origin) {
+ public static void smartLogBlockBreak(Consumer consumer, Actor actor, Block origin) {
WorldConfig wcfg = getWorldConfig(origin.getWorld());
if (wcfg == null) return;
@@ -72,7 +73,7 @@ public class LoggingUtil {
Block checkBlock = origin.getRelative(BlockFace.UP);
if (BukkitUtils.getRelativeTopBreakabls().contains(checkBlock.getType())) {
if (wcfg.isLogging(Logging.SIGNTEXT) && checkBlock.getType() == Material.SIGN_POST) {
- consumer.queueSignBreak(playerName, (Sign) checkBlock.getState());
+ consumer.queueSignBreak(actor, (Sign) checkBlock.getState());
} else if (checkBlock.getType() == Material.IRON_DOOR_BLOCK || checkBlock.getType() == Material.WOODEN_DOOR) {
Block doorBlock = checkBlock;
// If the doorBlock is the top half a door the player simply punched a door
@@ -81,9 +82,9 @@ public class LoggingUtil {
doorBlock = doorBlock.getRelative(BlockFace.UP);
// Fall back check just in case the top half wasn't a door
if (doorBlock.getType() == Material.IRON_DOOR_BLOCK || doorBlock.getType() == Material.WOODEN_DOOR) {
- consumer.queueBlockBreak(playerName, doorBlock.getState());
+ consumer.queueBlockBreak(actor, doorBlock.getState());
}
- consumer.queueBlockBreak(playerName, checkBlock.getState());
+ consumer.queueBlockBreak(actor, checkBlock.getState());
}
} else if (checkBlock.getType() == Material.DOUBLE_PLANT) {
Block plantBlock = checkBlock;
@@ -93,12 +94,12 @@ public class LoggingUtil {
plantBlock = plantBlock.getRelative(BlockFace.UP);
// Fall back check just in case the top half wasn't a plant
if (plantBlock.getType() == Material.DOUBLE_PLANT) {
- consumer.queueBlockBreak(playerName, plantBlock.getState());
+ consumer.queueBlockBreak(actor, plantBlock.getState());
}
- consumer.queueBlockBreak(playerName, checkBlock.getState());
+ consumer.queueBlockBreak(actor, checkBlock.getState());
}
} else {
- consumer.queueBlockBreak(playerName, checkBlock.getState());
+ consumer.queueBlockBreak(actor, checkBlock.getState());
}
}
@@ -112,56 +113,56 @@ public class LoggingUtil {
case REDSTONE_TORCH_ON:
case REDSTONE_TORCH_OFF:
if (blockState.getBlock().getRelative(((RedstoneTorch) data).getAttachedFace()).equals(origin)) {
- consumer.queueBlockBreak(playerName, blockState);
+ consumer.queueBlockBreak(actor, blockState);
}
break;
case TORCH:
if (blockState.getBlock().getRelative(((Torch) data).getAttachedFace()).equals(origin)) {
- consumer.queueBlockBreak(playerName, blockState);
+ consumer.queueBlockBreak(actor, blockState);
}
break;
case COCOA:
if (blockState.getBlock().getRelative(((CocoaPlant) data).getAttachedFace().getOppositeFace()).equals(origin)) {
- consumer.queueBlockBreak(playerName, blockState);
+ consumer.queueBlockBreak(actor, blockState);
}
break;
case LADDER:
if (blockState.getBlock().getRelative(((Ladder) data).getAttachedFace()).equals(origin)) {
- consumer.queueBlockBreak(playerName, blockState);
+ consumer.queueBlockBreak(actor, blockState);
}
break;
case LEVER:
if (blockState.getBlock().getRelative(((Lever) data).getAttachedFace()).equals(origin)) {
- consumer.queueBlockBreak(playerName, blockState);
+ consumer.queueBlockBreak(actor, blockState);
}
break;
case TRIPWIRE_HOOK:
if (blockState.getBlock().getRelative(((TripwireHook) data).getAttachedFace()).equals(origin)) {
- consumer.queueBlockBreak(playerName, blockState);
+ consumer.queueBlockBreak(actor, blockState);
}
break;
case WOOD_BUTTON:
case STONE_BUTTON:
if (blockState.getBlock().getRelative(((Button) data).getAttachedFace()).equals(origin)) {
- consumer.queueBlockBreak(playerName, blockState);
+ consumer.queueBlockBreak(actor, blockState);
}
break;
case WALL_SIGN:
if (blockState.getBlock().getRelative(((org.bukkit.material.Sign) data).getAttachedFace()).equals(origin)) {
if (wcfg.isLogging(Logging.SIGNTEXT)) {
- consumer.queueSignBreak(playerName, (Sign) blockState);
+ consumer.queueSignBreak(actor, (Sign) blockState);
} else {
- consumer.queueBlockBreak(playerName, blockState);
+ consumer.queueBlockBreak(actor, blockState);
}
}
break;
case TRAP_DOOR:
if (blockState.getBlock().getRelative(((TrapDoor) data).getAttachedFace()).equals(origin)) {
- consumer.queueBlockBreak(playerName, blockState);
+ consumer.queueBlockBreak(actor, blockState);
}
break;
default:
- consumer.queueBlockBreak(playerName, blockState);
+ consumer.queueBlockBreak(actor, blockState);
break;
}
}
@@ -179,7 +180,7 @@ public class LoggingUtil {
}
if (doorBlock.getType() == Material.IRON_DOOR_BLOCK || doorBlock.getType() == Material.WOODEN_DOOR) {
- consumer.queueBlockBreak(playerName, doorBlock.getState());
+ consumer.queueBlockBreak(actor, doorBlock.getState());
}
} else if (origin.getType() == Material.DOUBLE_PLANT) { // Special double plant check
Block plantBlock = origin;
@@ -192,11 +193,11 @@ public class LoggingUtil {
}
if (plantBlock.getType() == Material.DOUBLE_PLANT) {
- consumer.queueBlockBreak(playerName, plantBlock.getState());
+ consumer.queueBlockBreak(actor, plantBlock.getState());
}
}
// Do this down here so that the block is added after blocks sitting on it
- consumer.queueBlockBreak(playerName, origin.getState());
+ consumer.queueBlockBreak(actor, origin.getState());
}
}
diff --git a/src/main/java/de/diddiz/util/UUIDFetcher.java b/src/main/java/de/diddiz/util/UUIDFetcher.java
new file mode 100644
index 0000000..a699c95
--- /dev/null
+++ b/src/main/java/de/diddiz/util/UUIDFetcher.java
@@ -0,0 +1,79 @@
+package de.diddiz.util;
+
+import org.json.simple.JSONArray;
+import org.json.simple.JSONObject;
+import org.json.simple.parser.JSONParser;
+
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.nio.ByteBuffer;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+// Adapted from https://gist.github.com/evilmidget38/26d70114b834f71fb3b4
+
+public class UUIDFetcher {
+
+ private static final String PROFILE_URL = "https://api.mojang.com/profiles/minecraft";
+ private static final JSONParser jsonParser = new JSONParser();
+
+ public static Map getUUIDs(List names) throws Exception {
+ Map uuidMap = new HashMap();
+ HttpURLConnection connection = createConnection();
+ String body = JSONArray.toJSONString(names);
+ writeBody(connection, body);
+ JSONArray array = (JSONArray) jsonParser.parse(new InputStreamReader(connection.getInputStream()));
+ for (Object profile : array) {
+ JSONObject jsonProfile = (JSONObject) profile;
+ String id = (String) jsonProfile.get("id");
+ String name = (String) jsonProfile.get("name");
+ UUID uuid = UUIDFetcher.getUUID(id);
+ uuidMap.put(name, uuid);
+ }
+ return uuidMap;
+ }
+
+ private static void writeBody(HttpURLConnection connection, String body) throws Exception {
+ OutputStream stream = connection.getOutputStream();
+ stream.write(body.getBytes());
+ stream.flush();
+ stream.close();
+ }
+
+ private static HttpURLConnection createConnection() throws Exception {
+ URL url = new URL(PROFILE_URL);
+ HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+ connection.setRequestMethod("POST");
+ connection.setRequestProperty("Content-Type", "application/json");
+ connection.setUseCaches(false);
+ connection.setDoInput(true);
+ connection.setDoOutput(true);
+ return connection;
+ }
+
+ private static UUID getUUID(String id) {
+ return UUID.fromString(id.substring(0, 8) + "-" + id.substring(8, 12) + "-" + id.substring(12, 16) + "-" + id.substring(16, 20) + "-" + id.substring(20, 32));
+ }
+
+ public static byte[] toBytes(UUID uuid) {
+ ByteBuffer byteBuffer = ByteBuffer.wrap(new byte[16]);
+ byteBuffer.putLong(uuid.getMostSignificantBits());
+ byteBuffer.putLong(uuid.getLeastSignificantBits());
+ return byteBuffer.array();
+ }
+
+ public static UUID fromBytes(byte[] array) {
+ if (array.length != 16) {
+ throw new IllegalArgumentException("Illegal byte array length: " + array.length);
+ }
+ ByteBuffer byteBuffer = ByteBuffer.wrap(array);
+ long mostSignificant = byteBuffer.getLong();
+ long leastSignificant = byteBuffer.getLong();
+ return new UUID(mostSignificant, leastSignificant);
+ }
+
+}
diff --git a/src/main/java/de/diddiz/worldedit/LogBlockEditSession.java b/src/main/java/de/diddiz/worldedit/LogBlockEditSession.java
index f87c786..ecd4156 100644
--- a/src/main/java/de/diddiz/worldedit/LogBlockEditSession.java
+++ b/src/main/java/de/diddiz/worldedit/LogBlockEditSession.java
@@ -57,7 +57,7 @@ public class LogBlockEditSession extends EditSession {
// 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);
+ plugin.getConsumer().queueSignBreak(player, (Sign) stateBefore);
if (block.getType() != Material.AIR.getId()) {
plugin.getConsumer().queueBlockPlace(player.getName(), location, block.getType(), (byte) block.getData());
}
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index dce6cb3..665ae0c 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -1,5 +1,5 @@
name: ${project.name}
-version: '1.81'
+version: '1.9'
author: DiddiZ
authors: [md_5, ammar2, frymaster]
website: http://dev.bukkit.org/server-mods/logblock/