diff --git a/src/main/java/de/diddiz/LogBlock/BlockChange.java b/src/main/java/de/diddiz/LogBlock/BlockChange.java index ecd5a0c..16b2a7e 100644 --- a/src/main/java/de/diddiz/LogBlock/BlockChange.java +++ b/src/main/java/de/diddiz/LogBlock/BlockChange.java @@ -13,6 +13,7 @@ import org.bukkit.block.data.Openable; import org.bukkit.block.data.Powerable; import org.bukkit.block.data.type.Comparator; import org.bukkit.block.data.type.DaylightDetector; +import org.bukkit.block.data.type.Lectern; import org.bukkit.block.data.type.NoteBlock; import org.bukkit.block.data.type.Repeater; import org.bukkit.block.data.type.Sign; @@ -141,6 +142,8 @@ public class BlockChange implements LookupCacheElement { msg.append("set ").append(type.getMaterial().name()).append(" to ").append(((Comparator) type).getMode()); } else if (type.getMaterial() == Material.DAYLIGHT_DETECTOR) { msg.append("set ").append(type.getMaterial().name()).append(" to ").append(((DaylightDetector) type).isInverted() ? "inverted" : "normal"); + } else if (type instanceof Lectern) { + msg.append("changed the book on a ").append(type.getMaterial().name()).append(" to").append(replacedDetails.length() == 0 ? "empty" : replacedDetails); } else if (type instanceof Powerable) { msg.append("stepped on ").append(type.getMaterial().name()); } else if (type.getMaterial() == Material.TRIPWIRE) { diff --git a/src/main/java/de/diddiz/LogBlock/LogBlock.java b/src/main/java/de/diddiz/LogBlock/LogBlock.java index e57afe4..4f3fbaa 100644 --- a/src/main/java/de/diddiz/LogBlock/LogBlock.java +++ b/src/main/java/de/diddiz/LogBlock/LogBlock.java @@ -189,6 +189,9 @@ public class LogBlock extends JavaPlugin { if (isLogging(Logging.DRAGONEGGTELEPORT)) { pm.registerEvents(new DragonEggLogging(this), this); } + if (isLogging(Logging.LECTERNBOOKCHANGE)) { + pm.registerEvents(new LecternLogging(this), this); + } if (Config.isLoggingAnyEntities()) { if (!WorldEditHelper.hasFullWorldEdit()) { getLogger().severe("No compatible WorldEdit found, entity logging will not work!"); diff --git a/src/main/java/de/diddiz/LogBlock/Logging.java b/src/main/java/de/diddiz/LogBlock/Logging.java index 683a53d..6259fe3 100644 --- a/src/main/java/de/diddiz/LogBlock/Logging.java +++ b/src/main/java/de/diddiz/LogBlock/Logging.java @@ -8,7 +8,8 @@ public enum Logging { PRESUREPLATEINTERACT, TRIPWIREINTERACT, CREATURECROPTRAMPLE, CROPTRAMPLE, NATURALSTRUCTUREGROW, GRASSGROWTH, MYCELIUMSPREAD, VINEGROWTH, MUSHROOMSPREAD, WITHER(true), WITHER_SKULL(true), BONEMEALSTRUCTUREGROW, WORLDEDIT, TNTMINECARTEXPLOSION(true), - ENDERCRYSTALEXPLOSION(true), BEDEXPLOSION(true), DRAGONEGGTELEPORT(true), DAYLIGHTDETECTORINTERACT; + ENDERCRYSTALEXPLOSION(true), BEDEXPLOSION(true), DRAGONEGGTELEPORT(true), DAYLIGHTDETECTORINTERACT, + LECTERNBOOKCHANGE(true); public static final int length = Logging.values().length; private final boolean defaultEnabled; diff --git a/src/main/java/de/diddiz/LogBlock/blockstate/BlockStateCodecLectern.java b/src/main/java/de/diddiz/LogBlock/blockstate/BlockStateCodecLectern.java new file mode 100644 index 0000000..14e2a95 --- /dev/null +++ b/src/main/java/de/diddiz/LogBlock/blockstate/BlockStateCodecLectern.java @@ -0,0 +1,50 @@ +package de.diddiz.LogBlock.blockstate; + +import org.bukkit.Material; +import org.bukkit.block.BlockState; +import org.bukkit.block.Lectern; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.inventory.ItemStack; + +public class BlockStateCodecLectern implements BlockStateCodec { + @Override + public Material[] getApplicableMaterials() { + return new Material[] { Material.LECTERN }; + } + + @Override + public YamlConfiguration serialize(BlockState state) { + if (state instanceof Lectern) { + Lectern lectern = (Lectern) state; + ItemStack book = lectern.getSnapshotInventory().getItem(0); + if (book != null && book.getType() != Material.AIR) { + YamlConfiguration conf = new YamlConfiguration(); + conf.set("book", book); + return conf; + } + } + return null; + } + + @Override + public void deserialize(BlockState state, YamlConfiguration conf) { + if (state instanceof Lectern) { + Lectern lectern = (Lectern) state; + ItemStack book = null; + if (conf != null) { + book = conf.getItemStack("book"); + } + lectern.getSnapshotInventory().setItem(0, book); + } + } + + @Override + public String toString(YamlConfiguration conf) { + if (conf != null) { + StringBuilder sb = new StringBuilder(); + sb.append("[").append("book").append("]"); + return sb.toString(); + } + return null; + } +} diff --git a/src/main/java/de/diddiz/LogBlock/blockstate/BlockStateCodecs.java b/src/main/java/de/diddiz/LogBlock/blockstate/BlockStateCodecs.java index de44693..403d8d1 100644 --- a/src/main/java/de/diddiz/LogBlock/blockstate/BlockStateCodecs.java +++ b/src/main/java/de/diddiz/LogBlock/blockstate/BlockStateCodecs.java @@ -25,6 +25,7 @@ public class BlockStateCodecs { registerCodec(new BlockStateCodecSkull()); registerCodec(new BlockStateCodecBanner()); registerCodec(new BlockStateCodecSpawner()); + registerCodec(new BlockStateCodecLectern()); } public static boolean hasCodec(Material material) { diff --git a/src/main/java/de/diddiz/LogBlock/listeners/BlockPlaceLogging.java b/src/main/java/de/diddiz/LogBlock/listeners/BlockPlaceLogging.java index 24b90a2..cf1bd4b 100644 --- a/src/main/java/de/diddiz/LogBlock/listeners/BlockPlaceLogging.java +++ b/src/main/java/de/diddiz/LogBlock/listeners/BlockPlaceLogging.java @@ -29,7 +29,9 @@ public class BlockPlaceLogging extends LoggingListener { final BlockState before = event.getBlockReplacedState(); final BlockState after = event.getBlockPlaced().getState(); final Actor actor = Actor.actorFromEntity(event.getPlayer()); - + if (before.getType() == Material.LECTERN && after.getType() == Material.LECTERN && !Config.isLogging(event.getBlock().getWorld(), Logging.LECTERNBOOKCHANGE)) { + return; + } LoggingUtil.smartLogBlockPlace(consumer, actor, before, after); } } diff --git a/src/main/java/de/diddiz/LogBlock/listeners/LecternLogging.java b/src/main/java/de/diddiz/LogBlock/listeners/LecternLogging.java new file mode 100644 index 0000000..491d4b2 --- /dev/null +++ b/src/main/java/de/diddiz/LogBlock/listeners/LecternLogging.java @@ -0,0 +1,30 @@ +package de.diddiz.LogBlock.listeners; + +import static de.diddiz.LogBlock.config.Config.getWorldConfig; + +import de.diddiz.LogBlock.Actor; +import de.diddiz.LogBlock.LogBlock; +import de.diddiz.LogBlock.Logging; +import de.diddiz.LogBlock.config.WorldConfig; +import org.bukkit.block.Lectern; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerTakeLecternBookEvent; + +public class LecternLogging extends LoggingListener { + public LecternLogging(LogBlock lb) { + super(lb); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onPlayerTakeLecternBook(PlayerTakeLecternBookEvent event) { + final WorldConfig wcfg = getWorldConfig(event.getPlayer().getWorld()); + if (wcfg != null && wcfg.isLogging(Logging.LECTERNBOOKCHANGE)) { + Lectern oldState = event.getLectern(); + Lectern newState = (Lectern) oldState.getBlock().getState(); + newState.getSnapshotInventory().setItem(0, null); + + consumer.queueBlockReplace(Actor.actorFromEntity(event.getPlayer()), oldState, newState); + } + } +}