๐ฆ Building AuthCore for every version (1.16.x โ 26.1-26.2)
Minecraft changed the rules at 26.1: Mojang released the game unobfuscated (readable Mojang names in the shipped jar, parameter names included) and Fabric's intermediary no longer exists for that era. The Fabric project announced that yarn is discontinued and mods must migrate to Mojang names.
That is why AuthCore ships one jar per version range and loader, 7 jars (3 ranges ร
Fabric/Forge/NeoForge), all built from the same source tree (src/main/java, Mojang
names everywhere):
| Jar | Built at | Loader | Names | Minecraft | Java level |
|---|---|---|---|---|---|
authcore-1.16-1.18-fabric-<v>.jar |
1.18.2 | Fabric | Mojang (mojmap) | 1.16.0 โ 1.18.2 | 17 |
authcore-1.16-1.18-forge-<v>.jar |
1.18.2 | Forge | Mojang (mojmap) | 1.16.0 โ 1.18.2 | 17 |
authcore-1.19-1.21-fabric-<v>.jar |
1.21.11 | Fabric | Mojang (mojmap) | 1.19.0 โ 1.21.11 | 21 |
authcore-1.19-1.21-forge-<v>.jar |
1.21.11 | Forge | Mojang (mojmap) | 1.19.0 โ 1.21.11 | 21 |
authcore-1.19-1.21-neoforge-<v>.jar |
1.21.11 | NeoForge | Mojang (mojmap) | 1.19.0 โ 1.21.11 | 21 |
authcore-26.1-26.2-fabric-<v>.jar |
26.2 | Fabric | Mojang (unobfuscated) | 26.1 โ 26.2 | 25 |
authcore-26.1-26.2-neoforge-<v>.jar |
26.2 | NeoForge | Mojang (unobfuscated) | 26.1 โ 26.2 | 25 |
Mappings are Mojang (mojmap) for every line, the old yarn line is gone. The 26.1-26.2 jar ships unobfuscated (Mojang names in the game jar itself, so no remap is needed), while the 1.16โ1.21 jars are remapped to intermediary for the game runtime. Because the game uses either intermediary (โค1.21.11) or Mojang names (โฅ26.1), the two name-spaces cannot coexist in one compiled jar, installing the right jar per server version is expected behaviour for every mod today.
๐งฉ Bonus: each jar also acts as a BungeeCord / Velocity plugin (
bungee.yml+velocity-plugin.json+net.ded3ec.proxy.*). The proxy role is version-independent, so it is compiled once insrc/main/javaand lands in every jar, drop any jar into a proxy'splugins/folder and it auto-detects (config:config/authcore-proxy.properties).
Source layout
src/
โโโ fabric/ fabric entrypoint (FabricEntry.java)
โโโ neoforge/ neoforge entrypoint (NeoForgeEntry.java)
โโโ main/ ACTIVE merged tree - server + client companion + proxy plugin in ONE jar
โโโ java/ all code (Mojang names; version-specific code gated by Stonecutter
โ conditionals, e.g. /*? if < 26 {*/; forge entrypoints included)
โโโ resources/ fabric.mod.json + mods.toml + neoforge.mods.toml + mixin configs
+ bungee.yml + velocity-plugin.json + assets (lang files, icon)
Building
The build is a Stonecraft 1.10 + Stonecutter 0.9 workspace: settings.gradle.kts
registers one variant per (Minecraft, loader), :1.18.2-fabric, :1.18.2-forge,
:1.21.11-fabric, :1.21.11-forge, :1.21.11-neoforge, :26.2-fabric, :26.2-neoforge
(the active version is 1.21.11-fabric), all configured by the central
build.gradle.kts (Kotlin DSL). Per-version game/loader dependencies live in
versions/dependencies/<mc>.properties.
# Default build - the active Stonecutter version (1.21.11-fabric):
./gradlew build
# -> versions/1.21.11-fabric/build/libs/authcore-1.19-1.21-fabric-1.0.0.jar
# Every variant at once (Stonecutter chiseled build - all seven jars):
./gradlew chiseledBuild
# One specific variant:
./gradlew :26.2-fabric:build
# -> versions/26.2-fabric/build/libs/authcore-26.1-26.2-fabric-1.0.0.jar
./gradlew :26.2-neoforge:build
# -> versions/26.2-neoforge/build/libs/authcore-26.1-26.2-neoforge-1.0.0.jar
./gradlew :1.21.11-forge:build
# -> versions/1.21.11-forge/build/libs/authcore-1.19-1.21-forge-1.0.0.jar
# Collect a built jar into the root build/libs (release pipeline / harness):
./gradlew :1.18.2-fabric:collectJars
Missing JDK toolchains are auto-downloaded by the foojay resolver (17 for the 1.16โ1.18 group, 21 for 1.19โ1.21, 25 for 26.1-26.2).
Version-specific code (Stonecutter conditionals)
There is one source tree, no more mirrored classic / modern copies. Version-specific
code is gated inline with Stonecutter preprocessor comments, e.g. the inventory mixins use
ClickType below 26 and the 26.1-26.2 ContainerInput API above:
/*? if < 26 {*/
actionType == ClickType.THROW
/*?} else {*/
actionType == ContainerInput.THROW
/*?}*/
- Loader conditionals are registered automatically by Stonecraft:
fabric,forge,neoforge,forgeLike. - 26.1-26.2 API differences already handled via conditionals:
displayClientMessage(Component, boolean)โsendSystemMessage(Component, boolean)ClickTypeโContainerInput(same constants)MinecraftClientโMinecraft;ClientPlayNetworkHandlerโClientPacketListener- Screen model:
render(GuiGraphics)โextractRenderState(GuiGraphicsExtractor)+extractBackground(...);setScreenโsetScreenAndShow;drawCenteredStringโgraphics.centeredText(...) - Reflection string class names updated to Mojang paths (e.g.
net.minecraft.client.multiplayer.TransferState)
How to find 26.2 API ground truth
The 26.2 game jar is unobfuscated, so javap gives exact answers, point it at the 26.2
merged game jar from the Gradle cache:
javap -cp <path-to-26.2-minecraft-merged.jar> \
net.minecraft.client.gui.screens.Screen
๐ Verified on real servers
tools/host-tests boots real Fabric / Forge / NeoForge servers in Docker on every range
endpoint and checks that each jar actually works (mod loaded, mixins applied, banner printed,
config files created, /authcore console commands succeed). The range-group matrix lives in
tools/host-tests/versions.json:
| Group | Jars (built at) | Loaders | Verify endpoints | JBR |
|---|---|---|---|---|
| G1 | authcore-1.16-1.18-* (1.18.2) |
fabric, forge | 1.16.5, 1.17.1, 1.18.2 | 17 |
| G2 | authcore-1.19-1.21-* (1.21.11) |
fabric, forge, neoforge | 1.19.4, 1.20.6, 1.21.11 | 21 |
| G3 | authcore-26.1-26.2-* (26.2) |
fabric, neoforge | 26.1.2, 26.2 | 25 |
Verified matrix, all PASS (2026-08-10): every loader jar of the 1.16-1.18 group on 1.16.5 / 1.17.1 / 1.18.2, the 1.19-1.21 group on 1.19.4 / 1.20.6 / 1.21.11, and the 26.1-26.2 group on 26.1.2 / 26.2 (8/8 endpoints ร 7/7 loader build targets).
Run it yourself (requires Docker + PowerShell 7):
.\tools\host-tests\run-host-tests.ps1 -Build -Smoke # fast loop: boot each build target only
.\tools\host-tests\run-host-tests.ps1 # full matrix
Options: -Groups / -VerifyOverride / -Version / -Jar / -Smoke / -Build /
-Parallel (default 6) / -NoLiveLogs / -KeepReports / -Memory / -Cpus /
-TimeoutSec / -JbrMajor / -WorkDir / -ReportDir / -NetworkMode / -JvmArgs.
The harness streams live container logs, caches server images, prunes old report runs and
writes tools/host-tests/reports/latest.* (markdown + html + json).