Version Build Back to README



๐Ÿ“ฆ 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 in src/main/java and lands in every jar, drop any jar into a proxy's plugins/ 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).