From ea16656fcb732c5b86ff992e0ed76627324a83d9 Mon Sep 17 00:00:00 2001 From: Brokkonaut Date: Fri, 9 Nov 2018 02:37:48 +0100 Subject: [PATCH] Log armor stands, item frames and paintings --- .../java/de/diddiz/LogBlock/LogBlock.java | 3 +- .../listeners/AdvancedEntityLogging.java | 162 ++++++++++++++++++ src/main/java/de/diddiz/util/Utils.java | 20 ++- .../diddiz/worldedit/AdvancedKillLogging.java | 76 -------- 4 files changed, 175 insertions(+), 86 deletions(-) create mode 100644 src/main/java/de/diddiz/LogBlock/listeners/AdvancedEntityLogging.java delete mode 100644 src/main/java/de/diddiz/worldedit/AdvancedKillLogging.java diff --git a/src/main/java/de/diddiz/LogBlock/LogBlock.java b/src/main/java/de/diddiz/LogBlock/LogBlock.java index 65bf474..5c8f105 100644 --- a/src/main/java/de/diddiz/LogBlock/LogBlock.java +++ b/src/main/java/de/diddiz/LogBlock/LogBlock.java @@ -5,7 +5,6 @@ import de.diddiz.LogBlock.listeners.*; import de.diddiz.LogBlock.questioner.Questioner; import de.diddiz.util.BukkitUtils; import de.diddiz.util.MySQLConnectionPool; -import de.diddiz.worldedit.AdvancedKillLogging; import de.diddiz.worldedit.WorldEditHelper; import de.diddiz.worldedit.WorldEditLoggingHook; import org.bukkit.ChatColor; @@ -189,7 +188,7 @@ public class LogBlock extends JavaPlugin { if (isLogging(Logging.DRAGONEGGTELEPORT)) { pm.registerEvents(new DragonEggLogging(this), this); } - pm.registerEvents(new AdvancedKillLogging(this), this); + pm.registerEvents(new AdvancedEntityLogging(this), this); } @Override diff --git a/src/main/java/de/diddiz/LogBlock/listeners/AdvancedEntityLogging.java b/src/main/java/de/diddiz/LogBlock/listeners/AdvancedEntityLogging.java new file mode 100644 index 0000000..1517320 --- /dev/null +++ b/src/main/java/de/diddiz/LogBlock/listeners/AdvancedEntityLogging.java @@ -0,0 +1,162 @@ +package de.diddiz.LogBlock.listeners; + +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Animals; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Golem; +import org.bukkit.entity.Hanging; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.entity.Villager; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.entity.CreatureSpawnEvent; +import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.EntityDeathEvent; +import org.bukkit.event.hanging.HangingBreakByEntityEvent; +import org.bukkit.event.hanging.HangingBreakEvent; +import org.bukkit.event.hanging.HangingPlaceEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.ItemStack; +import org.bukkit.scheduler.BukkitRunnable; + +import de.diddiz.LogBlock.Actor; +import de.diddiz.LogBlock.EntityChange; +import de.diddiz.LogBlock.LogBlock; +import de.diddiz.worldedit.WorldEditHelper; + +public class AdvancedEntityLogging extends LoggingListener { + + private Player lastSpawner; + private Class lastSpawning; + private boolean lastSpawnerEgg; + + public AdvancedEntityLogging(LogBlock lb) { + super(lb); + new BukkitRunnable() { + @Override + public void run() { + resetLastSpawner(); + } + }.runTaskTimer(lb, 1, 1); + } + + private void resetLastSpawner() { + lastSpawner = null; + lastSpawning = null; + lastSpawnerEgg = false; + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onEntityDeath(EntityDeathEvent event) { + LivingEntity entity = event.getEntity(); + if (!(entity instanceof Animals) && !(entity instanceof Villager) && !(entity instanceof Golem) && !(entity instanceof ArmorStand)) { + return; + } + Actor actor; + EntityDamageEvent lastDamage = entity.getLastDamageCause(); + if (lastDamage instanceof EntityDamageByEntityEvent) { + actor = Actor.actorFromEntity(((EntityDamageByEntityEvent) lastDamage).getDamager()); + } else { + actor = new Actor(lastDamage.getCause().toString()); + } + queueEntitySpawnOrKill(entity, actor, EntityChange.EntityChangeType.KILL); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onPlayerInteract(PlayerInteractEvent event) { + if (event.getAction() == Action.RIGHT_CLICK_BLOCK) { + ItemStack inHand = event.getItem(); + if (inHand != null) { + Material mat = inHand.getType(); + if (mat == Material.ARMOR_STAND) { + lastSpawner = event.getPlayer(); + lastSpawning = ArmorStand.class; + lastSpawnerEgg = false; + } else if (mat.name().endsWith("_SPAWN_EGG")) { + lastSpawner = event.getPlayer(); + lastSpawning = null; + lastSpawnerEgg = true; + } + } + } + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { + ItemStack inHand = event.getHand() == EquipmentSlot.HAND ? event.getPlayer().getInventory().getItemInMainHand() : event.getPlayer().getInventory().getItemInOffHand(); + if (inHand != null) { + Material mat = inHand.getType(); + if (mat.name().endsWith("_SPAWN_EGG")) { + lastSpawner = event.getPlayer(); + lastSpawning = null; + lastSpawnerEgg = true; + } + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onEntitySpawn(CreatureSpawnEvent event) { + if (!event.isCancelled()) { + if (event.getSpawnReason() == SpawnReason.CUSTOM) { + return; + } + LivingEntity entity = event.getEntity(); + if (!(entity instanceof Animals) && !(entity instanceof Villager) && !(entity instanceof Golem) && !(entity instanceof ArmorStand)) { + return; + } + Actor actor = null; + if (lastSpawner != null) { + if (lastSpawnerEgg && event.getSpawnReason() == SpawnReason.SPAWNER_EGG) { + actor = Actor.actorFromEntity(lastSpawner); + } else if (lastSpawning != null && lastSpawning.isAssignableFrom(entity.getClass())) { + actor = Actor.actorFromEntity(lastSpawner); + } + } + if (actor == null) { + actor = new Actor(event.getSpawnReason().toString()); + } + queueEntitySpawnOrKill(entity, actor, EntityChange.EntityChangeType.CREATE); + } + resetLastSpawner(); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onHangingBreak(HangingBreakEvent event) { + Entity entity = event.getEntity(); + Actor actor; + if (event instanceof HangingBreakByEntityEvent) { + actor = Actor.actorFromEntity(((HangingBreakByEntityEvent) event).getRemover()); + } else { + actor = new Actor(event.getCause().toString()); + } + queueEntitySpawnOrKill(entity, actor, EntityChange.EntityChangeType.KILL); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onHangingPlace(HangingPlaceEvent event) { + Hanging entity = event.getEntity(); + Actor actor = Actor.actorFromEntity(event.getPlayer()); + queueEntitySpawnOrKill(entity, actor, EntityChange.EntityChangeType.CREATE); + } + + protected void queueEntitySpawnOrKill(Entity entity, Actor actor, EntityChange.EntityChangeType changeType) { + Location location = entity.getLocation(); + YamlConfiguration data = new YamlConfiguration(); + data.set("x", location.getX()); + data.set("y", location.getY()); + data.set("z", location.getZ()); + data.set("yaw", location.getYaw()); + data.set("pitch", location.getPitch()); + data.set("worldedit", WorldEditHelper.serializeEntity(entity)); + consumer.queueEntityModification(actor, entity.getUniqueId(), entity.getType(), location, changeType, data); + } +} diff --git a/src/main/java/de/diddiz/util/Utils.java b/src/main/java/de/diddiz/util/Utils.java index ee16bc4..baf0379 100644 --- a/src/main/java/de/diddiz/util/Utils.java +++ b/src/main/java/de/diddiz/util/Utils.java @@ -294,20 +294,24 @@ public class Utils { if (e != null) { return e; } - chunk.load(); - e = Bukkit.getEntity(uuid); - if (e != null) { - return e; + if (!chunk.isLoaded()) { + chunk.load(); + e = Bukkit.getEntity(uuid); + if (e != null) { + return e; + } } int chunkx = chunk.getX(); int chunkz = chunk.getZ(); for (int i = 0; i < 8; i++) { int x = i < 3 ? chunkx - 1 : (i < 5 ? chunkx : chunkx + 1); int z = i == 0 || i == 3 || i == 5 ? chunkz - 1 : (i == 1 || i == 6 ? chunkz : chunkz + 1); - chunk.getWorld().loadChunk(x, z); - e = Bukkit.getEntity(uuid); - if (e != null) { - return e; + if (!chunk.getWorld().isChunkLoaded(x, z)) { + chunk.getWorld().loadChunk(x, z); + e = Bukkit.getEntity(uuid); + if (e != null) { + return e; + } } } return null; diff --git a/src/main/java/de/diddiz/worldedit/AdvancedKillLogging.java b/src/main/java/de/diddiz/worldedit/AdvancedKillLogging.java deleted file mode 100644 index ed2a94a..0000000 --- a/src/main/java/de/diddiz/worldedit/AdvancedKillLogging.java +++ /dev/null @@ -1,76 +0,0 @@ -package de.diddiz.worldedit; - -import org.bukkit.Location; -import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.entity.Animals; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Villager; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.entity.CreatureSpawnEvent; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.EntityDeathEvent; -import org.bukkit.event.entity.EntitySpawnEvent; -import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; - -import de.diddiz.LogBlock.Actor; -import de.diddiz.LogBlock.EntityChange; -import de.diddiz.LogBlock.LogBlock; -import de.diddiz.LogBlock.listeners.LoggingListener; - -public class AdvancedKillLogging extends LoggingListener { - - public AdvancedKillLogging(LogBlock lb) { - super(lb); - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onEntityDeath(EntityDeathEvent event) { - LivingEntity entity = event.getEntity(); - if (!(entity instanceof Animals) && !(entity instanceof Villager)) { - return; - } - Actor actor; - EntityDamageEvent lastDamage = entity.getLastDamageCause(); - if (lastDamage instanceof EntityDamageByEntityEvent) { - actor = Actor.actorFromEntity(((EntityDamageByEntityEvent) lastDamage).getDamager()); - } else { - actor = new Actor(lastDamage.getCause().toString()); - } - Location location = entity.getLocation(); - YamlConfiguration data = new YamlConfiguration(); - data.set("x", location.getX()); - data.set("y", location.getY()); - data.set("z", location.getZ()); - data.set("yaw", location.getYaw()); - data.set("pitch", location.getPitch()); - - data.set("worldedit", WorldEditHelper.serializeEntity(entity)); - - consumer.queueEntityModification(actor, entity.getUniqueId(), entity.getType(), location, EntityChange.EntityChangeType.KILL, data); - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onEntitySpawn(CreatureSpawnEvent event) { - if (event.getSpawnReason() == SpawnReason.CUSTOM) { - return; - } - LivingEntity entity = event.getEntity(); - if (!(entity instanceof Animals) && !(entity instanceof Villager)) { - return; - } - Actor actor = new Actor(event.getSpawnReason().toString()); - Location location = entity.getLocation(); - YamlConfiguration data = new YamlConfiguration(); - data.set("x", location.getX()); - data.set("y", location.getY()); - data.set("z", location.getZ()); - data.set("yaw", location.getYaw()); - data.set("pitch", location.getPitch()); - - data.set("worldedit", WorldEditHelper.serializeEntity(entity)); - - consumer.queueEntityModification(actor, entity.getUniqueId(), entity.getType(), location, EntityChange.EntityChangeType.CREATE, data); - } -}