Skip to content

Commit 06cd7ec

Browse files
committed
v2.1.2
1 parent 1e8982e commit 06cd7ec

7 files changed

Lines changed: 114 additions & 23 deletions

File tree

build.gradle

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ plugins {
77

88
repositories {
99
mavenCentral()
10+
mavenLocal() // temporary for XSeries
1011
maven {
1112
url = uri('https://hub.spigotmc.org/nexus/content/repositories/snapshots/')
1213
}
@@ -37,9 +38,9 @@ repositories {
3738
}
3839

3940
dependencies {
40-
implementation 'de.tr7zw:item-nbt-api:2.15.5'
41+
implementation 'de.tr7zw:item-nbt-api:2.15.7'
4142
implementation 'com.github.Redempt:Crunch:2.0.3'
42-
implementation 'com.github.cryptomorin:XSeries:13.6.0'
43+
implementation 'com.github.cryptomorin:XSeries:14.0.0' // must build from source as of may 10th 2026
4344
implementation 'com.github.Revxrsal.Lamp:common:3.3.6'
4445
implementation 'com.github.Revxrsal.Lamp:bukkit:3.3.6'
4546
implementation 'org.bstats:bstats-bukkit:3.2.1'
@@ -54,7 +55,7 @@ dependencies {
5455
}
5556

5657
group = 'me.byteful.plugin'
57-
version = '2.1.1'
58+
version = '2.1.2'
5859
description = 'LevelTools'
5960
java.sourceCompatibility = JavaVersion.VERSION_17
6061

@@ -101,3 +102,5 @@ processResources {
101102
compileJava { // Preserve parameter names in the bytecode
102103
options.compilerArgs += ["-parameters"]
103104
}
105+
106+
tasks.build.dependsOn += shadowJar

gradlew

100644100755
File mode changed.

src/main/java/me/byteful/plugin/leveltools/LevelToolsPlaceholders.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@
1313

1414
import java.util.Locale;
1515

16-
import static me.byteful.plugin.leveltools.util.LevelToolsUtil.MID_VERSION;
17-
1816
public class LevelToolsPlaceholders extends PlaceholderExpansion {
1917
@Override
2018
public @NotNull String getIdentifier() {
@@ -48,7 +46,7 @@ public boolean persist() {
4846
}
4947

5048
final ItemStack hand =
51-
MID_VERSION <= 8
49+
!LevelToolsUtil.supportsDualWielding()
5250
? player.getItemInHand()
5351
: player.getInventory().getItemInMainHand();
5452

src/main/java/me/byteful/plugin/leveltools/LevelToolsPlugin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ private void registerListeners() {
166166
final PluginManager pm = Bukkit.getPluginManager();
167167
pm.registerEvents(new BlockPlacementListener(blockDataManager, scheduler), this);
168168
pm.registerEvents(new TriggerListener(profileManager, triggerRegistry, blockDataManager), this);
169-
if (LevelToolsUtil.MID_VERSION <= 8) {
169+
if (LevelToolsUtil.requiresLegacyAnvilListener()) {
170170
pm.registerEvents(new LegacyAnvilListener(), this);
171171
} else {
172172
pm.registerEvents(new AnvilListener(), this);

src/main/java/me/byteful/plugin/leveltools/api/trigger/impl/FarmingTrigger.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public boolean canHandle(@NotNull TriggerContext context) {
5656
}
5757

5858
if (context.getOriginalEventAs(BlockBreakEvent.class) != null) {
59-
if (LevelToolsUtil.MID_VERSION <= 12) {
59+
if (!LevelToolsUtil.supportsBlockData()) {
6060
MaterialData data = block.getState().getData();
6161

6262
if (data instanceof Crops) {

src/main/java/me/byteful/plugin/leveltools/listeners/TriggerListener.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ public void onPlayerFish(PlayerFishEvent event) {
9494
ItemStack item;
9595
TriggerSlot slot;
9696

97-
if (LevelToolsUtil.MID_VERSION <= 8 || event.getHand() == null) {
97+
if (!LevelToolsUtil.supportsDualWielding() || event.getHand() == null) {
9898
item = event.getPlayer().getItemInHand();
9999
slot = TriggerSlot.HAND;
100100
} else {
@@ -114,7 +114,7 @@ public void onPlayerInteract(PlayerInteractEvent event) {
114114

115115
Action action = event.getAction();
116116
Block clickedBlock = event.getClickedBlock();
117-
TriggerSlot slot = LevelToolsUtil.MID_VERSION <= 8 || event.getHand() == null
117+
TriggerSlot slot = !LevelToolsUtil.supportsDualWielding() || event.getHand() == null
118118
? TriggerSlot.HAND
119119
: TriggerSlot.fromBukkit(event.getHand());
120120
ItemStack item = event.getItem();
@@ -138,7 +138,9 @@ public void onPlayerItemConsume(PlayerItemConsumeEvent event) {
138138
return;
139139
}
140140

141-
TriggerSlot slot = LevelToolsUtil.MID_VERSION <= 8 ? TriggerSlot.HAND : TriggerSlot.fromBukkit(event.getHand());
141+
TriggerSlot slot = !LevelToolsUtil.supportsDualWielding()
142+
? TriggerSlot.HAND
143+
: TriggerSlot.fromBukkit(event.getHand());
142144
ItemStack consumedItem = event.getItem();
143145
handleTrigger(TriggerIds.CONSUME, player, consumedItem, slot, consumedItem, event);
144146
}

src/main/java/me/byteful/plugin/leveltools/util/LevelToolsUtil.java

Lines changed: 100 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,15 @@
4040

4141
public final class LevelToolsUtil {
4242
public static final int MID_VERSION;
43+
private static final Pattern MINECRAFT_VERSION_PATTERN =
44+
Pattern.compile("^(\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))?(?:[-+].*)?$");
4345
private static final String LORE_PREFIX = "§§";
4446
private static final boolean IS_PAPER = hasClass("com.destroystokyo.paper.PaperConfig") || hasClass("io.papermc.paper.configuration.Configuration");
47+
private static final MinecraftVersion MINECRAFT_VERSION;
4548

4649
static {
47-
// Code from https://github.com/boxbeam/RedLib/blob/master/src/redempt/redlib/java
48-
final Pattern pattern = Pattern.compile("1\\.([0-9]+)");
49-
final Matcher matcher = pattern.matcher(Bukkit.getBukkitVersion());
50-
matcher.find();
51-
MID_VERSION = Integer.parseInt(matcher.group(1));
50+
MINECRAFT_VERSION = parseMinecraftVersion(Bukkit.getBukkitVersion());
51+
MID_VERSION = MINECRAFT_VERSION.getCompatibilityMajor();
5252
}
5353

5454
private static boolean hasClass(String name) {
@@ -86,13 +86,13 @@ public static ItemProfile getItemProfile(Material material) {
8686
}
8787

8888
public static ItemStack getHand(Player player) {
89-
return MID_VERSION >= 9
89+
return supportsDualWielding()
9090
? player.getInventory().getItemInMainHand().clone()
9191
: player.getItemInHand().clone();
9292
}
9393

9494
public static void setHand(Player player, ItemStack stack) {
95-
if (MID_VERSION >= 9) {
95+
if (supportsDualWielding()) {
9696
player.getInventory().setItemInMainHand(stack);
9797
} else {
9898
player.setItemInHand(stack);
@@ -106,7 +106,7 @@ public static void setItemInSlot(@NotNull Player player, @Nullable TriggerSlot s
106106
}
107107

108108
if (slot == TriggerSlot.OFF_HAND) {
109-
if (MID_VERSION >= 9) {
109+
if (supportsDualWielding()) {
110110
player.getInventory().setItemInOffHand(stack);
111111
} else {
112112
setHand(player, stack);
@@ -156,8 +156,8 @@ public static int roundDown(double value) {
156156
}
157157

158158
public static LevelToolsItem createLevelToolsItem(ItemStack stack) {
159-
if (MID_VERSION >= 14) {
160-
if (MID_VERSION < 18) {
159+
if (supportsPersistentDataContainer()) {
160+
if (shouldCheckLegacyNbtData()) {
161161
final NBTItem nbt = new NBTItem(stack);
162162
if (nbt.getKeys().stream().anyMatch(s -> s.startsWith("levelTools"))) {
163163
return new NBTLevelToolsItem(
@@ -177,6 +177,62 @@ public static String getServerVersion() {
177177
return split[split.length - 1].trim().replace(")", "");
178178
}
179179

180+
public static boolean requiresLegacyAnvilListener() {
181+
return isMinecraftVersionBefore(1, 9);
182+
}
183+
184+
public static boolean supportsDualWielding() {
185+
return isMinecraftVersionAtLeast(1, 9);
186+
}
187+
188+
public static boolean supportsTranslatableItemDisplayNames() {
189+
return isMinecraftVersionAtLeast(1, 13);
190+
}
191+
192+
public static boolean supportsBlockData() {
193+
return isMinecraftVersionAtLeast(1, 13);
194+
}
195+
196+
public static boolean supportsPersistentDataContainer() {
197+
return isMinecraftVersionAtLeast(1, 14);
198+
}
199+
200+
public static boolean shouldCheckLegacyNbtData() {
201+
return supportsPersistentDataContainer() && isMinecraftVersionBefore(1, 18);
202+
}
203+
204+
public static boolean supportsSpigotActionBar() {
205+
return isMinecraftVersionAtLeast(1, 13);
206+
}
207+
208+
private static boolean isMinecraftVersionAtLeast(int major, int minor) {
209+
return MINECRAFT_VERSION.compareTo(new MinecraftVersion(major, minor, 0)) >= 0;
210+
}
211+
212+
private static boolean isMinecraftVersionBefore(int major, int minor) {
213+
return MINECRAFT_VERSION.compareTo(new MinecraftVersion(major, minor, 0)) < 0;
214+
}
215+
216+
static MinecraftVersion parseMinecraftVersion(@NotNull String version) {
217+
final Matcher matcher = MINECRAFT_VERSION_PATTERN.matcher(version.trim());
218+
if (!matcher.matches()) {
219+
throw new IllegalStateException("Unable to parse Bukkit Minecraft version: " + version);
220+
}
221+
222+
return new MinecraftVersion(
223+
Integer.parseInt(matcher.group(1)),
224+
parseVersionPart(matcher.group(2)),
225+
parseVersionPart(matcher.group(3))
226+
);
227+
}
228+
229+
private static int parseVersionPart(@Nullable String value) {
230+
if (value == null) {
231+
return 0;
232+
}
233+
return Integer.parseInt(value);
234+
}
235+
180236
public static ItemStack buildItemStack(
181237
ItemStack stack, Map<Enchantment, Integer> enchantments, int level, double xp, double maxXp) {
182238
DisplayProfile displayProfile = getDisplayProfileForMaterial(stack.getType());
@@ -202,7 +258,9 @@ public static ItemStack buildItemStack(
202258
.replace("{xp_formatted}", formatMoney(xp))
203259
.replace("{progress_bar}", progressBar));
204260

205-
if (nameDisplay.getText().contains("{item}") && MID_VERSION >= 13 && IS_PAPER) {
261+
if (nameDisplay.getText().contains("{item}")
262+
&& supportsTranslatableItemDisplayNames()
263+
&& IS_PAPER) {
206264
AdventureHelper.setDisplayNameWithTranslatable(meta, text, stack);
207265
} else {
208266
meta.setDisplayName(text);
@@ -342,7 +400,7 @@ public static void handleReward(LevelToolsItem tool, Player player) {
342400
}
343401

344402
public static void sendActionBar(Player player, String msg) {
345-
if (MID_VERSION > 12) {
403+
if (supportsSpigotActionBar()) {
346404
player.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(msg));
347405
} else {
348406
ActionBar.sendActionBar(player, msg);
@@ -365,4 +423,34 @@ private static boolean isFolia() {
365423
return false;
366424
}
367425
}
426+
427+
static final class MinecraftVersion implements Comparable<MinecraftVersion> {
428+
private final int major;
429+
private final int minor;
430+
private final int patch;
431+
432+
private MinecraftVersion(int major, int minor, int patch) {
433+
this.major = major;
434+
this.minor = minor;
435+
this.patch = patch;
436+
}
437+
438+
private int getCompatibilityMajor() {
439+
if (major == 1) {
440+
return minor;
441+
}
442+
return major;
443+
}
444+
445+
@Override
446+
public int compareTo(@NotNull MinecraftVersion other) {
447+
if (major != other.major) {
448+
return Integer.compare(major, other.major);
449+
}
450+
if (minor != other.minor) {
451+
return Integer.compare(minor, other.minor);
452+
}
453+
return Integer.compare(patch, other.patch);
454+
}
455+
}
368456
}

0 commit comments

Comments
 (0)