From 861681f92a757f2fc76181dc54fa6f6d8336d9e2 Mon Sep 17 00:00:00 2001 From: minoneer Date: Tue, 29 Dec 2020 12:39:04 +0100 Subject: [PATCH] Add lectern support for versions 1.14 and higher closes #6 --- pom.xml | 2 +- .../bukkit/bookexploit/BookExploitFix.java | 25 ++++++++ .../bukkit/bookexploit/LecternListener.java | 58 +++++++++++++++++++ 3 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 src/main/java/me/minoneer/bukkit/bookexploit/LecternListener.java diff --git a/pom.xml b/pom.xml index e4d0892..ee6ce60 100644 --- a/pom.xml +++ b/pom.xml @@ -118,7 +118,7 @@ org.spigotmc spigot-api - 1.13.2-R0.1-SNAPSHOT + 1.14.4-R0.1-SNAPSHOT org.jetbrains diff --git a/src/main/java/me/minoneer/bukkit/bookexploit/BookExploitFix.java b/src/main/java/me/minoneer/bukkit/bookexploit/BookExploitFix.java index bc89406..29222bf 100644 --- a/src/main/java/me/minoneer/bukkit/bookexploit/BookExploitFix.java +++ b/src/main/java/me/minoneer/bukkit/bookexploit/BookExploitFix.java @@ -6,6 +6,8 @@ import java.util.Objects; import java.util.logging.Level; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public final class BookExploitFix extends JavaPlugin { @@ -24,6 +26,8 @@ public void onEnable() { registerEvents(config, filter); + registerLecternEvents(config, filter); + enableProtocolLib(config, filter); getLogger().log(Level.INFO, "{0} by minoneer activated", getDescription().getFullName()); @@ -51,6 +55,27 @@ private void enableProtocolLib(ConfigHandler config, BookFilter filter) { } } + private void registerLecternEvents(ConfigHandler config, BookFilter filter) { + final boolean enableLectern; + final Pattern versionPattern = Pattern.compile("(\\d+)\\.(\\d+)\\.(\\d+).*"); + String bukkitVersion = getServer().getBukkitVersion(); + final Matcher matcher = versionPattern.matcher(bukkitVersion); + if (matcher.find()) { + final int major = Integer.parseInt(matcher.group(1)); + final int minor = Integer.parseInt(matcher.group(2)); + enableLectern = major > 1 || (major == 1 && minor >= 14); + } else { + enableLectern = false; + getLogger().severe("Unable to parse server version " + bukkitVersion + + ", lectern support will not be enabled."); + } + + if (enableLectern) { + getLogger().info("Detected server version 1.14 or higher, enabling lectern support"); + getServer().getPluginManager().registerEvents(new LecternListener(config, filter, getLogger()), this); + } + } + @Nullable public static String limitLoggingString(@Nullable final String input) { if (input == null) { diff --git a/src/main/java/me/minoneer/bukkit/bookexploit/LecternListener.java b/src/main/java/me/minoneer/bukkit/bookexploit/LecternListener.java new file mode 100644 index 0000000..d4d6aac --- /dev/null +++ b/src/main/java/me/minoneer/bukkit/bookexploit/LecternListener.java @@ -0,0 +1,58 @@ +package me.minoneer.bukkit.bookexploit; + +import org.bukkit.Material; +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.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; + +import java.util.logging.Level; +import java.util.logging.Logger; + +public final class LecternListener implements Listener { + + private final ConfigHandler config; + private final BookFilter bookFilter; + private final Logger logger; + + public LecternListener(final ConfigHandler config, final BookFilter bookFilter, final Logger logger) { + this.config = config; + this.bookFilter = bookFilter; + this.logger = logger; + } + + @EventHandler(priority = EventPriority.LOW) + public void onLecternRead(@NotNull final PlayerInteractEvent event) { + final Player player = event.getPlayer(); + if (!config.checkReading()) { + return; + } + if (event.getAction() != Action.RIGHT_CLICK_BLOCK) { + return; + } + Block clickedBlock = event.getClickedBlock(); + if (clickedBlock == null || clickedBlock.getType() != Material.LECTERN) { + return; + } + + Lectern lectern = (Lectern) clickedBlock.getState(); + final ItemStack toFilter = lectern.getInventory().getItem(0); + final ItemStack filtered = bookFilter.filterBook(toFilter); + + if (filtered != null) { + logger.log(Level.WARNING, "Player {0} {1} tried to read a lectern book with illegal click events!", + new Object[]{player.getName(), player.getUniqueId()}); + lectern.getInventory().setItem(0, filtered); + + if (config.getPlayerMessage() != null) { + player.sendMessage(config.getPlayerMessage()); + } + } + } +}