Versions and loaders - SocketSVC Docs
SocketSVC Docs

Versions and loaders

Minecraft version catalog, loader adaptation, source assembly, adding and withdrawing versions

這一頁還沒有翻譯,以下顯示英文原文。

Supported Minecraft Java Edition versions: 1.21.11, 26.1, 26.1.1, 26.1.2, 26.2, 26.3, the same for the client mod and the server mod. The approach is "shared code + version adaptation + a separate JAR per version", not a single JAR guessing the version at runtime: every Minecraft version × loader has its own JAR. When installing, pick the exact same version and loader as the game, and install only one SocketSVC client JAR.

Support matrix

MinecraftJavaFabric/QuiltNeoForgeForge
1.21.1121✓✓✓
26.125✓✓ (beta loader)✓
26.1.125✓✓ (beta loader)✓
26.1.225✓✓✓
26.225✓✓✓
26.325✓✓✓

This table summarises gradle/socketsvc.properties, which is authoritative. It is an explicitly verified matrix and never implicitly claims compatibility with future versions.

  • Checked 2026-10-18: NeoForge 26.3 has a stable release (26.3.0.92) and Forge has released 26.3 (66.0.13, none marked recommended yet). NeoForge 26.1 and 26.1.1 still only have -beta versions on maven.neoforged.net, and NeoForge has moved on to 26.1.2, so those two stay beta.
  • Quilt uses the Fabric JAR: Quilt Loader runs Fabric API mods, and QSL has no 26.x release, so no separate Quilt JAR is built.
  • Supported versions, each loader's version and the feature versions of all three sides (client/server/proxy) all come from the version catalog.
  • The Paper plugin is compiled against Paper API 1.21.11-R0.1-SNAPSHOT.

Client and server compatibility are verified separately

Client support for 26.x does not mean the server has been verified on the same Paper version; server compatibility must be tested separately. At runtime the server must also meet the Java requirement of the Paper version it runs.

Version catalog

All of these settings live in gradle/socketsvc.properties:

SettingPurpose
client.version/server.version/proxy.versionFeature version of each side, bumped and released independently
minecraft.supported/minecraft.defaultOfficially supported list and the version used when none is given
fabric.loader/fabric.loom/neoforge.moddev/forge.gradle/paper.apiShared toolchain versions
Per-version java/platform/renamesThat version's Java, the Java implementation family it uses, and its ordered API transformation rules
Per-version fabric.api/fabric.permissions/modmenu/flashbackFabric-side dependencies; omitting flashback skips that integration
Per-version neoforge/forgeThat version's loader version; omit it to not build or publish that loader. A NeoForge version containing -beta is published as beta automatically

platform currently accepts legacy and modern; adding another implementation family also requires updating the settings validation and the related tests.

Build environment and output

Building requires JDK 25; 1.21.11 additionally needs JDK 21 as its compile/test toolchain. The Gradle daemon runs on 25; each project's bytecode and Mixin compatibility level come from the version catalog; Paper and proxy compile to Java 21. For build commands see development setup.

  • Without minecraftVersion, minecraft.default is used, currently 1.21.11.
  • An unknown version fails during the settings phase; it never silently falls back to another version.
  • If a version has no <MC>.neoforge/<MC>.forge, that loader's project is not included.
  • buildAll, buildAllClients and buildAllServers read the version catalog directly and run a separate Gradle build per version in sequence, always building every supported version regardless of -PminecraftVersion.
ArtifactLocation
Clientclient/<loader>/build/<MC>/libs/socketsvc-client-<loader>-<client.version>+mc<MC>.jar
Server modserver/<loader>/build/<MC>/libs/socketsvc-server-<loader>-<server.version>+mc<MC>.jar

JARs not to use

NeoForge/Forge also produce a -slim.jar (libraries not bundled); do not publish or install it. The old client/build/<MC>/libs path is no longer updated; do not use leftover JARs from it.

For IDE work, set -PminecraftVersion=26.2 in the Gradle arguments, reload Gradle and run generateMainCompatibilitySources (see IDE and dev runs). Build different versions one after another in the same checkout; parallel builds across versions should use separate checkouts so the Loom/ModDevGradle/ForgeGradle working directories do not interfere.

Names and source assembly

Shared source code uses Mojang's official names.

  • Fabric: per the Fabric 26.1 migration notes, Yarn is no longer provided from 26.1 on, and Java 25 with the non-remapping Loom plugin is required. Fabric for 1.21.11 uses the remapping Loom plugin and its release artifact is still remapped; 26.x produces official-name JARs directly.
  • NeoForge/Forge: use official names at runtime on every supported version (for Forge 1.21.11 the installer renames the game; confirmed against Forge 1.21.11 mods actually published on Modrinth), so there is no reobf step. Forge's Mixin configs are declared in the JAR manifest (MixinConfigs), NeoForge's in neoforge.mods.toml.
  • Metadata: fabric.mod.json, mods.toml and the Mixin Java level are expanded from the version catalog; you cannot claim support by simply widening the Minecraft range in the metadata.

Source assembly is handled by socketsvc.sources in gradle/minecraft.gradle: it merges common/minecraft, <side>/common and the loader project's src/<kind>/java in that order, layering src/<platform>/<kind>/java on top of each directory; for identical relative paths the later one overrides the earlier, and the transformation rules are applied last.

Generation uses the same rules for main and test, so the tests really target each version's game API. Audio, WebSocket, handshake contents, settings data and UI behaviour are shared; nothing uses reflection to guess the game version or loader, and no full copy of the code exists per version or per loader.

NeoForge/Forge packaging

NeoForge/Forge load every JAR as a Java module and do not allow two modules to export the same package (e.g. mp3spi and vorbisspi both use javazoom.spi). Pure Java libraries are therefore relocated with shadow to com.socketsvc.shaded, and JNI libraries that cannot be relocated (opus4j/rnnoise4j) are embedded with Jar-in-Jar; Fabric still uses nested JARs.

Maintenance entry points

LocationContents
gradle/socketsvc.propertiesFeature versions of the three sides, supported list, default version, toolchains, and per-version Java/platform/transformation rules/Fabric API/permissions API/Mod Menu/Flashback/NeoForge/Forge versions
gradle/minecraft.gradleShared by all loader projects: catalog reading, artifact naming, source assembly and transformation, metadata expansion, bytecode verification
gradle/client-*.gradle, gradle/server-*.gradleDependencies, packaging and artifact verification per side and loader; client-libraries.gradle/server-libraries.gradle are the runtime library lists shared by all loaders
gradle/forge.gradle, gradle/modular-jar.gradleForgeGradle setup, and NeoForge/Forge relocation and Jar-in-Jar packaging
settings.gradle.ktsValidates the version catalog and includes loader projects per version; the 1.21.11 Fabric projects use legacy.gradle.kts (remapping Loom) instead
client/common/src, server/common/srcLoader-independent code based on Mojang's official names; edit here, not build/generated
<side>/<loader>/srcLoader entry points and platform implementations (ClientPlatform/ServerModPlatform)
gradle/compat/*.jsonUpstream pure renames/access-path changes, applied in the order listed in the version catalog; files can restrict which file names a rule applies to
src/modern/<kind>/javaThe few classes that need a different implementation; they replace the side's shared class with the same relative path

Network compatibility between loaders

The handshake payloads (socketsvc:handshake, socketsvc:handshake_request) are raw bytes on every loader, identical to Paper's plugin messaging, so any client loader can connect to Paper or to any loader's server mod.

LoaderRegistration
FabricCustomPacketPayload
NeoForgeCustomPacketPayload (optional())
ForgeEventNetworkChannel registering an optional raw channel

When changing the payload format, verify all three loaders and Paper together.

Adding a release version

Verify dependencies. Check Mojang's release versions and each loader's Maven metadata to confirm the actual compatible versions of Java, Fabric API, fabric-permissions-api, Mod Menu, NeoForge and Forge.

Complete the version catalog. Add a full version row and a minecraft.supported entry. Versions with the same API can reuse platform and renames; omit a loader's key if it does not support the version yet. Do not substitute floating dependencies or a widened Minecraft range for verification.

Compile to find differences. Run python scripts/build_matrix.py <version> to get the real compile errors. Pure renames go into a new gradle/compat/*.json; rules are ordered text replacements, not a Java parser, so restrict them with files when necessary and check the generated output. Only use a Java overlay with the same relative path when behaviour differs, to avoid copying the whole client.

Check Mixins. When the nametag rendering path changes, check the bytecode, update the hook and its tests; do not lower Mixin required or defaultRequire to hide failures.

Run the full matrix. scripts/build_matrix.py reads the version catalog directly, so adding a version does not require editing any build script.

Publish after in-game acceptance. After real in-game acceptance (see validation levels below), publish the corresponding JARs (see publishing). Only bump client.version/server.version for the side that changed; the Minecraft version and loader are added automatically to artifact names, metadata and Modrinth version numbers.

Withdrawing a version or loader

  • Remove the version from minecraft.supported, or delete only that version's <MC>.neoforge/<MC>.forge key; if it is the default version, update minecraft.default as well.
  • Before removing rules that seem unused, confirm no other version references them.
  • Do not overwrite a published JAR with the same name.

For release notes before withdrawal and version lifecycle rules, see version retirement and release records.

Validation levels

build enforces client/server JUnit, Mixin, native audio regression and artifact verification; for what each task actually checks, see validation and releases. Behaviour tests for the relay, authentication, hot reload and speaker API live in :server:paper:test; the server mod uses the same common/core implementation.

JUnit and Mixin reports are under <side>/<loader>/build/<version>/reports/tests/. CI runs the same gates on Linux with one job per Minecraft version and keeps the artifacts and test reports.

Automated checks are not in-game acceptance

These automated checks are not equivalent to real multiplayer voice acceptance. NeoForge/Forge clients currently only have compile and packaging verification, with no automated in-game load test.

Before a release, still confirm on every game version and loader:

  • Joining/leaving servers and reconnecting
  • Two-player voice / mute / deafen
  • Settings / device selection / keybinds (including opening settings from the main menu)
  • F1 hiding the HUD
  • Nametags with scoreboards / sneaking / occlusion
  • The server mod's /ssvc-server status|reload and permission nodes
  • Real devices and audio on Windows/Linux/macOS