Skip to content

Commit 58e919a

Browse files
authored
Add lectern support for versions 1.14 and higher (#9)
closes #6
1 parent 41ce8b1 commit 58e919a

3 files changed

Lines changed: 84 additions & 1 deletion

File tree

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@
118118
<dependency>
119119
<groupId>org.spigotmc</groupId>
120120
<artifactId>spigot-api</artifactId>
121-
<version>1.13.2-R0.1-SNAPSHOT</version>
121+
<version>1.14.4-R0.1-SNAPSHOT</version>
122122
</dependency>
123123
<dependency>
124124
<groupId>org.jetbrains</groupId>

src/main/java/me/minoneer/bukkit/bookexploit/BookExploitFix.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
import java.util.Objects;
88
import java.util.logging.Level;
9+
import java.util.regex.Matcher;
10+
import java.util.regex.Pattern;
911

1012
public final class BookExploitFix extends JavaPlugin {
1113

@@ -24,6 +26,8 @@ public void onEnable() {
2426

2527
registerEvents(config, filter);
2628

29+
registerLecternEvents(config, filter);
30+
2731
enableProtocolLib(config, filter);
2832

2933
getLogger().log(Level.INFO, "{0} by minoneer activated", getDescription().getFullName());
@@ -51,6 +55,27 @@ private void enableProtocolLib(ConfigHandler config, BookFilter filter) {
5155
}
5256
}
5357

58+
private void registerLecternEvents(ConfigHandler config, BookFilter filter) {
59+
final boolean enableLectern;
60+
final Pattern versionPattern = Pattern.compile("(\\d+)\\.(\\d+)\\.(\\d+).*");
61+
String bukkitVersion = getServer().getBukkitVersion();
62+
final Matcher matcher = versionPattern.matcher(bukkitVersion);
63+
if (matcher.find()) {
64+
final int major = Integer.parseInt(matcher.group(1));
65+
final int minor = Integer.parseInt(matcher.group(2));
66+
enableLectern = major > 1 || (major == 1 && minor >= 14);
67+
} else {
68+
enableLectern = false;
69+
getLogger().severe("Unable to parse server version " + bukkitVersion +
70+
", lectern support will not be enabled.");
71+
}
72+
73+
if (enableLectern) {
74+
getLogger().info("Detected server version 1.14 or higher, enabling lectern support");
75+
getServer().getPluginManager().registerEvents(new LecternListener(config, filter, getLogger()), this);
76+
}
77+
}
78+
5479
@Nullable
5580
public static String limitLoggingString(@Nullable final String input) {
5681
if (input == null) {
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package me.minoneer.bukkit.bookexploit;
2+
3+
import org.bukkit.Material;
4+
import org.bukkit.block.Block;
5+
import org.bukkit.block.Lectern;
6+
import org.bukkit.entity.Player;
7+
import org.bukkit.event.EventHandler;
8+
import org.bukkit.event.EventPriority;
9+
import org.bukkit.event.Listener;
10+
import org.bukkit.event.block.Action;
11+
import org.bukkit.event.player.PlayerInteractEvent;
12+
import org.bukkit.inventory.ItemStack;
13+
import org.jetbrains.annotations.NotNull;
14+
15+
import java.util.logging.Level;
16+
import java.util.logging.Logger;
17+
18+
public final class LecternListener implements Listener {
19+
20+
private final ConfigHandler config;
21+
private final BookFilter bookFilter;
22+
private final Logger logger;
23+
24+
public LecternListener(final ConfigHandler config, final BookFilter bookFilter, final Logger logger) {
25+
this.config = config;
26+
this.bookFilter = bookFilter;
27+
this.logger = logger;
28+
}
29+
30+
@EventHandler(priority = EventPriority.LOW)
31+
public void onLecternRead(@NotNull final PlayerInteractEvent event) {
32+
final Player player = event.getPlayer();
33+
if (!config.checkReading()) {
34+
return;
35+
}
36+
if (event.getAction() != Action.RIGHT_CLICK_BLOCK) {
37+
return;
38+
}
39+
Block clickedBlock = event.getClickedBlock();
40+
if (clickedBlock == null || clickedBlock.getType() != Material.LECTERN) {
41+
return;
42+
}
43+
44+
Lectern lectern = (Lectern) clickedBlock.getState();
45+
final ItemStack toFilter = lectern.getInventory().getItem(0);
46+
final ItemStack filtered = bookFilter.filterBook(toFilter);
47+
48+
if (filtered != null) {
49+
logger.log(Level.WARNING, "Player {0} {1} tried to read a lectern book with illegal click events!",
50+
new Object[]{player.getName(), player.getUniqueId()});
51+
lectern.getInventory().setItem(0, filtered);
52+
53+
if (config.getPlayerMessage() != null) {
54+
player.sendMessage(config.getPlayerMessage());
55+
}
56+
}
57+
}
58+
}

0 commit comments

Comments
 (0)