diff --git a/src/main/java/de/diddiz/LogBlock/listeners/BlockBreakLogging.java b/src/main/java/de/diddiz/LogBlock/listeners/BlockBreakLogging.java index e89d0a6..e316fd8 100644 --- a/src/main/java/de/diddiz/LogBlock/listeners/BlockBreakLogging.java +++ b/src/main/java/de/diddiz/LogBlock/listeners/BlockBreakLogging.java @@ -11,6 +11,8 @@ import org.bukkit.GameMode; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.Sign; +import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.Waterlogged; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.block.BlockBreakEvent; @@ -59,7 +61,17 @@ public class BlockBreakLogging extends LoggingListener { @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onPlayerBucketFill(PlayerBucketFillEvent event) { if (isLogging(event.getBlockClicked().getWorld(), Logging.BLOCKBREAK)) { - consumer.queueBlockBreak(Actor.actorFromEntity(event.getPlayer()), event.getBlockClicked().getState()); + BlockData clickedBlockData = event.getBlockClicked().getBlockData(); + if (clickedBlockData instanceof Waterlogged) { + Waterlogged clickedWaterlogged = (Waterlogged) clickedBlockData; + if (clickedWaterlogged.isWaterlogged()) { + Waterlogged clickedWaterloggedWithoutWater = (Waterlogged) clickedWaterlogged.clone(); + clickedWaterloggedWithoutWater.setWaterlogged(false); + consumer.queueBlockReplace(Actor.actorFromEntity(event.getPlayer()), event.getBlockClicked().getLocation(), clickedWaterlogged, clickedWaterloggedWithoutWater); + } + } else { + consumer.queueBlockBreak(Actor.actorFromEntity(event.getPlayer()), event.getBlockClicked().getState()); + } } } } diff --git a/src/main/java/de/diddiz/LogBlock/listeners/BlockPlaceLogging.java b/src/main/java/de/diddiz/LogBlock/listeners/BlockPlaceLogging.java index 9d7b5be..178990d 100644 --- a/src/main/java/de/diddiz/LogBlock/listeners/BlockPlaceLogging.java +++ b/src/main/java/de/diddiz/LogBlock/listeners/BlockPlaceLogging.java @@ -6,9 +6,11 @@ import de.diddiz.LogBlock.Logging; import de.diddiz.LogBlock.config.Config; import de.diddiz.util.LoggingUtil; -import org.bukkit.Bukkit; import org.bukkit.Material; +import org.bukkit.block.Block; import org.bukkit.block.BlockState; +import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.Waterlogged; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.block.BlockPlaceEvent; @@ -35,7 +37,23 @@ 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(Actor.actorFromEntity(event.getPlayer()), event.getBlockClicked().getRelative(event.getBlockFace()).getLocation(), Bukkit.createBlockData(event.getBucket() == Material.LAVA_BUCKET ? Material.LAVA : Material.WATER)); + Material placedMaterial = event.getBucket() == Material.LAVA_BUCKET ? Material.LAVA : Material.WATER; + BlockData clickedBlockData = event.getBlockClicked().getBlockData(); + if (placedMaterial == Material.WATER && clickedBlockData instanceof Waterlogged) { + Waterlogged clickedWaterlogged = (Waterlogged) clickedBlockData; + if (!clickedWaterlogged.isWaterlogged()) { + Waterlogged clickedWaterloggedWithWater = (Waterlogged) clickedWaterlogged.clone(); + clickedWaterloggedWithWater.setWaterlogged(true); + consumer.queueBlockReplace(Actor.actorFromEntity(event.getPlayer()), event.getBlockClicked().getLocation(), clickedWaterlogged, clickedWaterloggedWithWater); + } + } else { + Block placedAt = event.getBlockClicked().getRelative(event.getBlockFace()); + if (placedAt.isEmpty()) { + consumer.queueBlockPlace(Actor.actorFromEntity(event.getPlayer()), placedAt.getLocation(), placedMaterial.createBlockData()); + } else { + consumer.queueBlockReplace(Actor.actorFromEntity(event.getPlayer()), event.getBlockClicked().getLocation(), placedAt.getBlockData(), placedMaterial.createBlockData()); + } + } } } } diff --git a/src/main/java/de/diddiz/LogBlock/listeners/FluidFlowLogging.java b/src/main/java/de/diddiz/LogBlock/listeners/FluidFlowLogging.java index 4adf63a..d56c9a2 100644 --- a/src/main/java/de/diddiz/LogBlock/listeners/FluidFlowLogging.java +++ b/src/main/java/de/diddiz/LogBlock/listeners/FluidFlowLogging.java @@ -12,6 +12,7 @@ import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.data.BlockData; import org.bukkit.block.data.Levelled; +import org.bukkit.block.data.Waterlogged; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.block.BlockFromToEvent; @@ -27,9 +28,14 @@ public class FluidFlowLogging extends LoggingListener { @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onBlockFromTo(BlockFromToEvent event) { final WorldConfig wcfg = getWorldConfig(event.getBlock().getWorld()); - if (wcfg != null) { + if (wcfg != null && (wcfg.isLogging(Logging.WATERFLOW) || wcfg.isLogging(Logging.LAVAFLOW))) { final BlockData blockDataFrom = event.getBlock().getBlockData(); - final Material typeFrom = blockDataFrom.getMaterial(); + Material typeFrom = blockDataFrom.getMaterial(); + boolean fromWaterlogged = false; + if (blockDataFrom instanceof Waterlogged) { + typeFrom = Material.WATER; + fromWaterlogged = true; + } Block source = Config.logFluidFlowAsPlayerWhoTriggeredIt ? event.getBlock() : null; final Block to = event.getToBlock(); @@ -57,9 +63,9 @@ public class FluidFlowLogging extends LoggingListener { } } } else if ((typeFrom == Material.WATER) && wcfg.isLogging(Logging.WATERFLOW)) { - Levelled levelledFrom = (Levelled) blockDataFrom; - Levelled newBlock = (Levelled) blockDataFrom.clone(); - newBlock.setLevel(levelledFrom.getLevel() + 1); + Levelled levelledFrom = fromWaterlogged ? null : (Levelled) blockDataFrom; + Levelled newBlock = (Levelled) Material.WATER.createBlockData(); + newBlock.setLevel(fromWaterlogged ? 1 : levelledFrom.getLevel() + 1); if (BukkitUtils.isEmpty(typeTo)) { consumer.queueBlockPlace(new Actor("WaterFlow", source), to.getLocation(), newBlock); } else if (BukkitUtils.getNonFluidProofBlocks().contains(typeTo)) {