From a395f206bd18f0ba883eb043196c72a2e6ec62ae Mon Sep 17 00:00:00 2001 From: Brokkonaut Date: Thu, 3 Nov 2022 05:56:30 +0100 Subject: [PATCH] Log respawn anchor explosions --- src/main/java/de/diddiz/LogBlock/Logging.java | 1 + .../LogBlock/listeners/ExplosionLogging.java | 74 ++++++++++++++++--- 2 files changed, 63 insertions(+), 12 deletions(-) diff --git a/src/main/java/de/diddiz/LogBlock/Logging.java b/src/main/java/de/diddiz/LogBlock/Logging.java index af6d966..2e8e033 100644 --- a/src/main/java/de/diddiz/LogBlock/Logging.java +++ b/src/main/java/de/diddiz/LogBlock/Logging.java @@ -51,6 +51,7 @@ public enum Logging { OXIDIZATION, SCULKSPREAD(true), SHULKER_BOX_CONTENT, + RESPAWNANCHOREXPLOSION(true), PLAYER_COMMANDS, COMMANDBLOCK_COMMANDS, CONSOLE_COMMANDS; diff --git a/src/main/java/de/diddiz/LogBlock/listeners/ExplosionLogging.java b/src/main/java/de/diddiz/LogBlock/listeners/ExplosionLogging.java index 9695e96..20fd01d 100644 --- a/src/main/java/de/diddiz/LogBlock/listeners/ExplosionLogging.java +++ b/src/main/java/de/diddiz/LogBlock/listeners/ExplosionLogging.java @@ -10,6 +10,7 @@ import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; +import org.bukkit.block.data.type.RespawnAnchor; import org.bukkit.entity.*; import org.bukkit.entity.minecart.ExplosiveMinecart; import org.bukkit.event.EventHandler; @@ -18,6 +19,7 @@ import org.bukkit.event.block.Action; import org.bukkit.event.block.BlockExplodeEvent; import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; import org.bukkit.projectiles.ProjectileSource; import org.bukkit.scheduler.BukkitRunnable; @@ -31,6 +33,8 @@ public class ExplosionLogging extends LoggingListener { private UUID lastBedInteractionPlayer; private Location lastBedInteractionLocation; + private UUID lastRespawnAnchorInteractionPlayer; + private Location lastRespawnAnchorInteractionLocation; public ExplosionLogging(LogBlock lb) { super(lb); @@ -124,20 +128,48 @@ public class ExplosionLogging extends LoggingListener { @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onPlayerInteract(PlayerInteractEvent event) { - if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.hasBlock() && BukkitUtils.isBed(event.getClickedBlock().getType())) { + if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.hasBlock()) { Block block = event.getClickedBlock(); - if (!Config.isLogging(block.getWorld(), Logging.BEDEXPLOSION)) { - return; - } - lastBedInteractionPlayer = event.getPlayer().getUniqueId(); - lastBedInteractionLocation = block.getLocation(); - new BukkitRunnable() { - @Override - public void run() { - lastBedInteractionPlayer = null; - lastBedInteractionLocation = null; + if (BukkitUtils.isBed(block.getType()) && !block.getWorld().isBedWorks()) { + if (!Config.isLogging(block.getWorld(), Logging.BEDEXPLOSION)) { + return; } - }.runTask(LogBlock.getInstance()); + lastBedInteractionPlayer = event.getPlayer().getUniqueId(); + lastBedInteractionLocation = block.getLocation(); + new BukkitRunnable() { + @Override + public void run() { + lastBedInteractionPlayer = null; + lastBedInteractionLocation = null; + } + }.runTask(LogBlock.getInstance()); + } else if (block.getType() == Material.RESPAWN_ANCHOR && block.getBlockData() instanceof RespawnAnchor data) { + if (!Config.isLogging(block.getWorld(), Logging.RESPAWNANCHOREXPLOSION)) { + return; + } + ItemStack inHand = event.getItem(); + int charges = data.getCharges(); + if (charges < data.getMaximumCharges() && inHand != null && inHand.getType() == Material.GLOWSTONE) { + // charge + Actor actor = Actor.actorFromEntity(event.getPlayer()); + RespawnAnchor blockNew = (RespawnAnchor) data.clone(); + blockNew.setCharges(charges + 1); + consumer.queueBlockReplace(actor, block.getState(), blockNew); + } else if (charges > 0 && !block.getWorld().isRespawnAnchorWorks()) { + // explode + Actor actor = Actor.actorFromEntity(event.getPlayer()); + consumer.queueBlockBreak(actor, block.getState()); + lastRespawnAnchorInteractionPlayer = event.getPlayer().getUniqueId(); + lastRespawnAnchorInteractionLocation = block.getLocation(); + new BukkitRunnable() { + @Override + public void run() { + lastRespawnAnchorInteractionPlayer = null; + lastRespawnAnchorInteractionLocation = null; + } + }.runTask(LogBlock.getInstance()); + } + } } } @@ -150,6 +182,13 @@ public class ExplosionLogging extends LoggingListener { bedCause = Bukkit.getPlayer(lastBedInteractionPlayer); } } + Player respawnAnchorCause = null; + if (lastRespawnAnchorInteractionPlayer != null && lastRespawnAnchorInteractionLocation != null) { + Location block = event.getBlock().getLocation(); + if (lastRespawnAnchorInteractionLocation.equals(block)) { + respawnAnchorCause = Bukkit.getPlayer(lastRespawnAnchorInteractionPlayer); + } + } for (final Block block : event.blockList()) { final WorldConfig wcfg = getWorldConfig(block.getLocation().getWorld()); @@ -162,6 +201,17 @@ public class ExplosionLogging extends LoggingListener { } if (Config.logBedExplosionsAsPlayerWhoTriggeredThese) { actor = Actor.actorFromEntity(bedCause); + } else { + actor = new Actor("BedExplosion"); + } + } else if (respawnAnchorCause != null) { + if (!wcfg.isLogging(Logging.RESPAWNANCHOREXPLOSION)) { + return; + } + if (Config.logBedExplosionsAsPlayerWhoTriggeredThese) { + actor = Actor.actorFromEntity(respawnAnchorCause); + } else { + actor = new Actor("RespawnAnchorExplosion"); } } else if (!wcfg.isLogging(Logging.MISCEXPLOSION)) { return;