Support Minecraft 26.1.2 and 26.2

Adds the v26_1_R1 binding, which covers both versions. 26.x servers are
not obfuscated and need Java 25, so the build moves to Gradle 9.5.1 and
paperweight-userdev 2.0.0-beta.21, and the binding compiles against the
26.1.2 dev bundle with a Java 25 toolchain while everything else stays on
Java 21.

On 26.x every world is a dimension inside the main level, so the binding
provides DimensionWorldStorage:
- world folders resolve to <level>/dimensions/<namespace>/<key>
- data packs go to the level's datapacks folder
- Iris data in a pre-26.1 world folder is moved into the dimension
  before Paper imports the world and deletes the old folder
- "main=true" swaps the world in as the level's overworld instead of
  changing level-name

Also:
- INMS compares 1.x and 26.x versions in release order
- data pack formats 101 (26.1.2) and 107 (26.2), declared with
  min_format/max_format from format 82 on
- dimension types get the fields 26.1 added
- the Java safeguard accepts Java 25

Model used: Claude Opus 5.5
This commit is contained in:
piexel committed 2026-10-11 16:48:05 +02:00
1 parent e1514503f6
commit 8a18b6ff8b
17 files changed
+1726 -59

No files matched your search

+9 -6
View File
@@ -34,7 +34,7 @@ plugins {
}
group = "com.volmit"
version = "3.9.2-1.20.1-1.21.11"
version = "3.9.2-1.20.1-26.2"
apply<ApiGenerator>()
@@ -64,6 +64,7 @@ val color = "truecolor"
val errorReporting = "true" == findProperty("errorReporting")
val nmsBindings = mapOf(
"v26_1_R1" to "26.1.2.build.74-stable",
"v1_21_R7" to "1.21.11-R0.1-SNAPSHOT",
"v1_21_R6" to "1.21.10-R0.1-SNAPSHOT",
"v1_21_R5" to "1.21.8-R0.1-SNAPSHOT",
@@ -76,7 +77,9 @@ val nmsBindings = mapOf(
"v1_20_R2" to "1.20.2-R0.1-SNAPSHOT",
"v1_20_R1" to "1.20.1-R0.1-SNAPSHOT",
)
val jvmVersion = mapOf<String, Int>()
val jvmVersion = mapOf("v26_1_R1" to 25)
// From 26.1 on the server is not obfuscated, so these bindings compile against Paper's dev bundle as-is.
val userDevBindings = setOf("v26_1_R1")
nmsBindings.forEach { (key, value) ->
project(":nms:$key") {
apply<JavaPlugin>()
@@ -84,7 +87,7 @@ nmsBindings.forEach { (key, value) ->
nmsBinding {
jvm = jvmVersion.getOrDefault(key, 21)
version = value
type = NMSBinding.Type.DIRECT
type = if (key in userDevBindings) NMSBinding.Type.USER_DEV else NMSBinding.Type.DIRECT
}
dependencies {
@@ -96,7 +99,7 @@ nmsBindings.forEach { (key, value) ->
tasks.register<RunServer>("runServer-$key") {
group = "servers"
minecraftVersion(value.split("-")[0])
minecraftVersion(value.substringBefore("-").substringBefore(".build"))
minHeapSize = serverMinHeap
maxHeapSize = serverMaxHeap
pluginJars(tasks.jar.flatMap { it.archiveFile })
@@ -115,7 +118,7 @@ val included: Configuration by configurations.creating
val jarJar: Configuration by configurations.creating
dependencies {
for (key in nmsBindings.keys) {
included(project(":nms:$key", "reobf"))
included(project(":nms:$key", if (key in userDevBindings) "runtimeElements" else "reobf"))
}
included(project(":core", "shadow"))
jarJar(project(":core:agent"))
@@ -190,7 +193,7 @@ allprojects {
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(21))
languageVersion.set(JavaLanguageVersion.of(jvmVersion.getOrDefault(name, 21)))
}
}