diff --git a/src/main/java/de/diddiz/LogBlock/listeners/LecternLogging.java b/src/main/java/de/diddiz/LogBlock/listeners/LecternLogging.java index 16e7627..df26b2b 100644 --- a/src/main/java/de/diddiz/LogBlock/listeners/LecternLogging.java +++ b/src/main/java/de/diddiz/LogBlock/listeners/LecternLogging.java @@ -1,18 +1,24 @@ package de.diddiz.LogBlock.listeners; import static de.diddiz.LogBlock.config.Config.getWorldConfig; +import static de.diddiz.LogBlock.config.Config.isLogging; import de.diddiz.LogBlock.Actor; import de.diddiz.LogBlock.LogBlock; import de.diddiz.LogBlock.Logging; import de.diddiz.LogBlock.config.WorldConfig; +import org.bukkit.Bukkit; import org.bukkit.Material; -import org.bukkit.block.BlockState; +import org.bukkit.Tag; +import org.bukkit.block.Block; import org.bukkit.block.Lectern; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; -import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerTakeLecternBookEvent; +import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; public class LecternLogging extends LoggingListener { @@ -21,25 +27,31 @@ public class LecternLogging extends LoggingListener { } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onBlockPlace(BlockPlaceEvent event) { - final WorldConfig wcfg = getWorldConfig(event.getPlayer().getWorld()); - if (wcfg != null && wcfg.isLogging(Logging.LECTERNBOOKCHANGE)) { - final BlockState before = event.getBlockReplacedState(); - final BlockState after = event.getBlockPlaced().getState(); - if (before.getType() == Material.LECTERN && after.getType() == Material.LECTERN) { - Lectern lecternBefore = (Lectern) before.getBlock().getState(); - ItemStack book = lecternBefore.getSnapshotInventory().getItem(0); - try { - lecternBefore.getSnapshotInventory().setItem(0, null); - } catch (NullPointerException e) { - //ignored - } - lecternBefore.setBlockData(before.getBlockData()); - consumer.queueBlockReplace(Actor.actorFromEntity(event.getPlayer()), lecternBefore, after); - try { - lecternBefore.getSnapshotInventory().setItem(0, book); - } catch (NullPointerException e) { - //ignored + public void onPlayerInteract(PlayerInteractEvent event) { + final Block clicked = event.getClickedBlock(); + if (event.getAction() != Action.RIGHT_CLICK_BLOCK || event.getHand() != EquipmentSlot.HAND || !event.hasBlock() || clicked == null) { + return; + } + final Player player = event.getPlayer(); + if (!isLogging(player.getWorld(), Logging.LECTERNBOOKCHANGE)) { + return; + } + final Material type = clicked.getType(); + if (type == Material.LECTERN) { + ItemStack mainHand = player.getInventory().getItemInMainHand(); + if (mainHand != null && mainHand.getType() != Material.AIR && Tag.ITEMS_LECTERN_BOOKS.isTagged(mainHand.getType()) && clicked.getState() instanceof Lectern lectern) { + ItemStack currentInLectern = lectern.getSnapshotInventory().getItem(0); + if (currentInLectern == null || currentInLectern.getType() == Material.AIR) { + ItemStack stack = mainHand.clone(); + stack.setAmount(1); + Lectern newLectern = (Lectern) clicked.getState(); + newLectern.getSnapshotInventory().setItem(0, stack); + org.bukkit.block.data.type.Lectern blockDataOld = (org.bukkit.block.data.type.Lectern) newLectern.getBlockData(); + org.bukkit.block.data.type.Lectern blockDataWithBook = (org.bukkit.block.data.type.Lectern) Bukkit.createBlockData("lectern[has_book=true]"); + blockDataWithBook.setFacing(blockDataOld.getFacing()); + blockDataWithBook.setPowered(blockDataOld.isPowered()); + newLectern.setBlockData(blockDataWithBook); + consumer.queueBlockReplace(Actor.actorFromEntity(event.getPlayer()), lectern, newLectern); } } }