From 34fce6feddb47622d0b9c5ddf8737440e7b14234 Mon Sep 17 00:00:00 2001 From: Xitee <59659167+Xitee1@users.noreply.github.com> Date: Sun, 19 Apr 2026 10:07:26 +0200 Subject: [PATCH] Fix version parsing for Paper 26+ and null fallback Bukkit.getBukkitVersion() on Paper 26.1.2 no longer matches the legacy "-R-SNAPSHOT" format, so the substring-based parser produced a StringIndexOutOfBoundsException. Replace it with a regex that extracts only the leading numeric version, tolerating arbitrary suffixes. The catch-block fallback referenced v1_13, but the constants were declared after the static block, leaving them null at fallback time and causing a NullPointerException on the isAbove_1_13 initializer. Move the version constants above the static block so the fallback actually yields a usable Version. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../de/xite/scoreboard/utils/Version.java | 41 +++++++++++-------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/src/main/java/de/xite/scoreboard/utils/Version.java b/src/main/java/de/xite/scoreboard/utils/Version.java index cb8de67..e80987a 100644 --- a/src/main/java/de/xite/scoreboard/utils/Version.java +++ b/src/main/java/de/xite/scoreboard/utils/Version.java @@ -5,6 +5,8 @@ import org.jetbrains.annotations.NotNull; import java.util.logging.Logger; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class Version implements Comparable { private final String version; @@ -15,13 +17,33 @@ public Version(@NotNull String version) { this.version = version; } + public static final Version v1_8 = new Version("1.8"); + public static final Version v1_9 = new Version("1.9"); + public static final Version v1_10 = new Version("1.10"); + public static final Version v1_11 = new Version("1.11"); + public static final Version v1_12 = new Version("1.12"); + public static final Version v1_13 = new Version("1.13"); + public static final Version v1_14 = new Version("1.14"); + public static final Version v1_15 = new Version("1.15"); + public static final Version v1_16 = new Version("1.16"); + public static final Version v1_17 = new Version("1.17"); + public static final Version v1_18 = new Version("1.18"); + public static final Version v1_20_3 = new Version("1.20.3"); + public static final Version CURRENT; static { Logger logger = PowerBoard.pl.getLogger(); Version v; + String s = Bukkit.getBukkitVersion(); try { - String s = Bukkit.getBukkitVersion(); - String version = s.substring(0, s.lastIndexOf("-R")).replace("_", "."); + // Extracts the leading numeric version, tolerating arbitrary suffixes: + // "1.21.4-R0.1-SNAPSHOT" -> "1.21.4" + // "26.1.2-build.12-alpha" -> "26.1.2" + // "26.1.2.build.12-alpha" -> "26.1.2" + Matcher m = Pattern.compile("^([0-9]+(?:\\.[0-9]+)*)").matcher(s.replace("_", ".")); + if(!m.find()) + throw new IllegalArgumentException("No leading version number in '" + s + "'"); + String version = m.group(1); if(PowerBoard.debug) { logger.info(" "); @@ -32,24 +54,11 @@ public Version(@NotNull String version) { v = new Version(version); } catch (Exception e) { e.printStackTrace(); - logger.severe("Could not extract MC version! Defaulting to 1.13."); + logger.severe("Could not extract MC version from '" + s + "'! Defaulting to 1.13."); v = Version.v1_13; } CURRENT = v; } - - public static final Version v1_8 = new Version("1.8"); - public static final Version v1_9 = new Version("1.9"); - public static final Version v1_10 = new Version("1.10"); - public static final Version v1_11 = new Version("1.11"); - public static final Version v1_12 = new Version("1.12"); - public static final Version v1_13 = new Version("1.13"); - public static final Version v1_14 = new Version("1.14"); - public static final Version v1_15 = new Version("1.15"); - public static final Version v1_16 = new Version("1.16"); - public static final Version v1_17 = new Version("1.17"); - public static final Version v1_18 = new Version("1.18"); - public static final Version v1_20_3 = new Version("1.20.3"); private static boolean isAbove_1_13 = Version.CURRENT.isAtLeast(Version.v1_13); private static boolean isAbove_1_20_3 = Version.CURRENT.isAtLeast(Version.v1_20_3);