26.1.x keeps the feature surface CoreProtect uses from 1.21, so this adapter + * currently reuses the 1.21 implementation while version detection and adapter + * selection move to the new release-number format. + */ +public final class Bukkit_v26 extends Bukkit_v1_21 { +} diff --git a/src/main/java/net/coreprotect/config/ConfigHandler.java b/src/main/java/net/coreprotect/config/ConfigHandler.java index 0275d0d61..319e2cf73 100644 --- a/src/main/java/net/coreprotect/config/ConfigHandler.java +++ b/src/main/java/net/coreprotect/config/ConfigHandler.java @@ -51,9 +51,10 @@ public enum CacheType { public static final String EDITION_NAME = VersionUtils.getPluginName(); public static final String COMMUNITY_EDITION = "Community Edition"; public static final String JAVA_VERSION = "11.0"; + public static final String JAVA_VERSION_26 = "25.0"; public static final String MINECRAFT_VERSION = "1.16"; public static final String PATCH_VERSION = "23.1"; - public static final String LATEST_VERSION = "1.21.11"; + public static final String LATEST_VERSION = "26.1.1"; public static String path = "plugins/CoreProtect/"; public static String sqlite = "database.db"; public static String host = "127.0.0.1"; diff --git a/src/main/java/net/coreprotect/paper/PaperAdapter.java b/src/main/java/net/coreprotect/paper/PaperAdapter.java index e9d00311f..6e1b6f3e4 100644 --- a/src/main/java/net/coreprotect/paper/PaperAdapter.java +++ b/src/main/java/net/coreprotect/paper/PaperAdapter.java @@ -27,6 +27,7 @@ public class PaperAdapter implements PaperInterface { public static final int PAPER_V1_19 = BukkitAdapter.BUKKIT_V1_19; public static final int PAPER_V1_20 = BukkitAdapter.BUKKIT_V1_20; public static final int PAPER_V1_21 = BukkitAdapter.BUKKIT_V1_21; + public static final int PAPER_V26 = BukkitAdapter.BUKKIT_V26; public static void loadAdapter() { int paperVersion = ConfigHandler.SERVER_VERSION; @@ -51,9 +52,12 @@ public static void loadAdapter() { break; case PAPER_V1_20: case PAPER_V1_21: - default: PaperAdapter.ADAPTER = new Paper_v1_20(); break; + case PAPER_V26: + default: + PaperAdapter.ADAPTER = new Paper_v26(); + break; } } diff --git a/src/main/java/net/coreprotect/paper/Paper_v26.java b/src/main/java/net/coreprotect/paper/Paper_v26.java new file mode 100644 index 000000000..95c3ff136 --- /dev/null +++ b/src/main/java/net/coreprotect/paper/Paper_v26.java @@ -0,0 +1,10 @@ +package net.coreprotect.paper; + +/** + * Paper adapter for 26.x. + * + *
Paper 26.1.x remains compatible with the Paper-specific APIs currently used + * by CoreProtect, so this adapter reuses the 1.20+ implementation path. + */ +public final class Paper_v26 extends Paper_v1_20 { +} diff --git a/src/main/java/net/coreprotect/services/VersionCheckService.java b/src/main/java/net/coreprotect/services/VersionCheckService.java index 68aeb64fc..3d048aebd 100644 --- a/src/main/java/net/coreprotect/services/VersionCheckService.java +++ b/src/main/java/net/coreprotect/services/VersionCheckService.java @@ -1,5 +1,8 @@ package net.coreprotect.services; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + import org.bukkit.Bukkit; import net.coreprotect.config.ConfigHandler; @@ -14,6 +17,8 @@ */ public class VersionCheckService { + private static final Pattern MINECRAFT_VERSION_PATTERN = Pattern.compile("(\\d+)\\.(\\d+)(?:\\.(\\d+))?"); + private VersionCheckService() { throw new IllegalStateException("Utility class"); } @@ -26,21 +31,24 @@ private VersionCheckService() { public static boolean performVersionChecks() { try { // Check Minecraft version compatibility - String[] bukkitVersion = Bukkit.getServer().getBukkitVersion().split("[-.]"); - if (VersionUtils.newVersion(bukkitVersion[0] + "." + bukkitVersion[1], ConfigHandler.MINECRAFT_VERSION)) { + String bukkitVersion = Bukkit.getServer().getBukkitVersion(); + String minecraftVersion = parseMinecraftVersion(bukkitVersion); + if (minecraftVersion == null || VersionUtils.newVersion(minecraftVersion, ConfigHandler.MINECRAFT_VERSION)) { Chat.console(Phrase.build(Phrase.VERSION_REQUIRED, "Minecraft", ConfigHandler.MINECRAFT_VERSION)); return false; } - if (VersionUtils.newVersion(ConfigHandler.LATEST_VERSION, bukkitVersion[0] + "." + bukkitVersion[1] + (bukkitVersion.length > 2 && bukkitVersion[2].matches("\\d+") ? "." + bukkitVersion[2] : "")) && VersionUtils.isCommunityEdition()) { - Chat.console(Phrase.build(Phrase.VERSION_INCOMPATIBLE, "Minecraft", bukkitVersion[0] + "." + bukkitVersion[1] + (bukkitVersion.length > 2 ? "." + bukkitVersion[2] : ""))); + if (VersionUtils.newVersion(ConfigHandler.LATEST_VERSION, minecraftVersion) && VersionUtils.isCommunityEdition()) { + Chat.console(Phrase.build(Phrase.VERSION_INCOMPATIBLE, "Minecraft", minecraftVersion)); return false; } + String requiredJavaVersion = parseCompatibilityVersion(minecraftVersion) >= 26 ? ConfigHandler.JAVA_VERSION_26 : ConfigHandler.JAVA_VERSION; + // Check Java version compatibility String[] javaVersion = (System.getProperty("java.version").replaceAll("[^0-9.]", "") + ".0").split("\\."); - if (VersionUtils.newVersion(javaVersion[0] + "." + javaVersion[1], ConfigHandler.JAVA_VERSION)) { - Chat.console(Phrase.build(Phrase.VERSION_REQUIRED, "Java", ConfigHandler.JAVA_VERSION)); + if (VersionUtils.newVersion(javaVersion[0] + "." + javaVersion[1], requiredJavaVersion)) { + Chat.console(Phrase.build(Phrase.VERSION_REQUIRED, "Java", requiredJavaVersion)); return false; } @@ -59,8 +67,8 @@ public static boolean performVersionChecks() { return false; } - // Store Minecraft server version for later use - ConfigHandler.SERVER_VERSION = Integer.parseInt(bukkitVersion[1]); + // Support both legacy 1.x versioning and the new year-based 26.x/26.1.x format. + ConfigHandler.SERVER_VERSION = parseCompatibilityVersion(minecraftVersion); } catch (Exception e) { e.printStackTrace(); @@ -69,4 +77,31 @@ public static boolean performVersionChecks() { return true; } + + private static String parseMinecraftVersion(String bukkitVersion) { + Matcher matcher = MINECRAFT_VERSION_PATTERN.matcher(bukkitVersion); + if (!matcher.find()) { + return null; + } + + StringBuilder version = new StringBuilder(matcher.group(1)).append('.').append(matcher.group(2)); + if (matcher.group(3) != null) { + version.append('.').append(matcher.group(3)); + } + + return version.toString(); + } + + private static int parseCompatibilityVersion(String minecraftVersion) { + String[] versionParts = minecraftVersion.split("\\."); + if (versionParts.length < 2) { + throw new IllegalArgumentException("Unsupported Minecraft version: " + minecraftVersion); + } + + if ("1".equals(versionParts[0])) { + return Integer.parseInt(versionParts[1]); + } + + return Integer.parseInt(versionParts[0]); + } } diff --git a/src/main/java/net/coreprotect/spigot/SpigotAdapter.java b/src/main/java/net/coreprotect/spigot/SpigotAdapter.java index 669bc0b6d..85b105b45 100644 --- a/src/main/java/net/coreprotect/spigot/SpigotAdapter.java +++ b/src/main/java/net/coreprotect/spigot/SpigotAdapter.java @@ -22,6 +22,7 @@ public class SpigotAdapter implements SpigotInterface { public static final int SPIGOT_V1_19 = BukkitAdapter.BUKKIT_V1_19; public static final int SPIGOT_V1_20 = BukkitAdapter.BUKKIT_V1_20; public static final int SPIGOT_V1_21 = BukkitAdapter.BUKKIT_V1_21; + public static final int SPIGOT_V26 = BukkitAdapter.BUKKIT_V26; public static void loadAdapter() { int spigotVersion = ConfigHandler.SERVER_VERSION; @@ -42,6 +43,7 @@ public static void loadAdapter() { case SPIGOT_V1_19: case SPIGOT_V1_20: case SPIGOT_V1_21: + case SPIGOT_V26: default: SpigotAdapter.ADAPTER = new SpigotHandler(); break;