Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.13.2-R0.1-SNAPSHOT</version>
<version>1.14.4-R0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.jetbrains</groupId>
Expand Down
25 changes: 25 additions & 0 deletions src/main/java/me/minoneer/bukkit/bookexploit/BookExploitFix.java
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

Expand All @@ -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());
Expand Down Expand Up @@ -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) {
Expand Down
58 changes: 58 additions & 0 deletions src/main/java/me/minoneer/bukkit/bookexploit/LecternListener.java
Original file line number Diff line number Diff line change
@@ -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());
}
}
}
}