verify pass 3: FML token correction + BungeeGuard/cmd-providers from live source
archive.org Wayback was network-blocked; pivoted to live GitHub. Key fix: FML host token is \0FML\0 (not \0FML2/3\0 — those are FMLNETVERSION ints on the fml:handshake channel); modern Forge uses \0FORGE/\0FORGEn. Confirmed BungeeGuard backend token check (lucko source), 4 cmd suggestion providers, 26.2 interval_select worldgen-only, corrected 1.14 villager metadata layout. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+8
-3
@@ -92,8 +92,8 @@ Forge appends a NUL-delimited marker to signal that the connecting client has Fo
|
||||
| Era | Marker (literal) | Forge versions |
|
||||
|-----|-----------------|----------------|
|
||||
| FML / Legacy (1.7–1.12.2) | `\0FML\0` | Forge for MC 1.7.x – 1.12.x |
|
||||
| FML2 (1.13+) | `\0FML2\0` | Forge for MC 1.13+ <!-- UNCONFIRMED: "\0FML2\0" token name comes from Forge internals; neither BungeeCord nor Velocity source in /tmp/mcproto-refs uses or defines this string. Velocity notes "1.13+ uses a slightly different token" (HandshakeSessionHandler.java:176) but does not handle it. --> |
|
||||
| Modern (1.20.2+) | `\0FORGE` or `\0FORGEn` | NeoForge / Forge 1.20.2+ <!-- UNCONFIRMED: version number suffix `n` observed in Velocity ModernForgeConnectionType.getModernToken(); exact token for NeoForge-only (FML3) not confirmed from available sources. Velocity ModernForgeConstants.java defines MODERN_FORGE_TOKEN = "FORGE" and gates it on protocol ≥ 1.20.2 (HandshakeSessionHandler.java:166–167). --> |
|
||||
| FML2 (1.13–1.19) | `\0FML\0` (same wire token, different channel) | Forge for MC 1.13–1.19.x — the "FML2" label comes from `NetworkConstants.FMLNETVERSION=2` in early-1.13 Forge builds; the handshake host token remains `\0FML\0` (Velocity `LegacyForgeConstants.HANDSHAKE_HOSTNAME_TOKEN = "\0FML\0"`, confirmed from `PaperMC/Velocity` `LegacyForgeConstants.java`, fetched 2026-06-19). The FML2 vs FML3 version number is negotiated over the `fml:handshake` login-plugin channel, not the host field. <!-- UNCONFIRMED: the exact MC version boundary at which Forge switched from FMLNETVERSION=2 to 3; 1.18.x/1.19.x NetworkConstants shows FMLNETVERSION=3 confirming "FML3" era, but which release first used version 2 is not verified from sources checked. --> |
|
||||
| Modern (1.20.2+) | `\0FORGE` or `\0FORGEn` | NeoForge / Forge 1.20.2+ — confirmed from Velocity: `ModernForgeConstants.MODERN_FORGE_TOKEN = "FORGE"` (string literal); `ModernForgeConnectionType.getModernToken()` returns `"\0FORGE"` (no version suffix) or `"\0FORGE" + natVersion` (e.g. `"\0FORGE3"`) when a version number is present in the host. This path is gated on protocol ≥ 1.20.2 per `HandshakeSessionHandler.java:166–167`. Source: `PaperMC/Velocity` `ModernForgeConstants.java` + `ModernForgeConnectionType.java` (fetched 2026-06-19). |
|
||||
|
||||
BungeeCord source defines only `\0FML\0` as `FML_HANDSHAKE_TOKEN` (`ForgeConstants.java:20`). The comment in `InitialHandler.java:351-354` reads:
|
||||
|
||||
@@ -209,7 +209,8 @@ flowchart LR
|
||||
| 1.7.2 | Handshake packet introduced in this form; fields stable since |
|
||||
| 1.7–1.12.2 | Forge appends `\0FML\0` for modded clients |
|
||||
| 1.8+ | BungeeCord ip_forward writes `host\0ip\0uuid[\0props]` to backends |
|
||||
| 1.13+ | Forge marker changes to a different token (exact string unconfirmed from proxy sources; see table above) |
|
||||
| 1.13–1.19.x | Forge host-field token remains `\0FML\0`; FML version number (2 or 3) negotiated over `fml:handshake` login-plugin channel |
|
||||
| 1.20.2+ | Modern Forge / NeoForge switches to `\0FORGE` or `\0FORGEn` host-field token (Velocity `ModernForgeConnectionType`) |
|
||||
| 1.20.5 (protocol 766) | Intent value `3` (Transfer) added |
|
||||
|
||||
---
|
||||
@@ -222,6 +223,10 @@ flowchart LR
|
||||
| `BungeeCord/proxy/…/connection/InitialHandler.java:801-803` | UUID stripped of dashes |
|
||||
| `BungeeCord/proxy/…/ServerConnector.java:114-123` | Authoritative ip_forward write path |
|
||||
| `BungeeCord/proxy/…/forge/ForgeConstants.java:20` | `FML_HANDSHAKE_TOKEN = "\0FML\0"` |
|
||||
| `PaperMC/Velocity/proxy/…/forge/legacy/LegacyForgeConstants.java` | `HANDSHAKE_HOSTNAME_TOKEN = "\0FML\0"` for 1.8–1.12.2 legacy Forge |
|
||||
| `PaperMC/Velocity/proxy/…/forge/modern/ModernForgeConstants.java` | `MODERN_FORGE_TOKEN = "FORGE"` (modern, 1.20.2+) |
|
||||
| `PaperMC/Velocity/proxy/…/forge/modern/ModernForgeConnectionType.java` | `getModernToken()` → `"\0FORGE"` or `"\0FORGEn"` |
|
||||
| `MinecraftForge/src/…/network/NetworkConstants.java` (1.18.x–1.19.x) | `FMLNETVERSION=3`, `NETVERSION="FML3"` — version negotiated over channel, not host field |
|
||||
| `node-minecraft-protocol/src/client/setProtocol.js:21-26` | Client-side field names; `tagHost` extension point |
|
||||
| `node-minecraft-protocol/src/client/tcp_dns.js:21-33` | SRV resolution overwrites host/port before connect |
|
||||
| `minecraft-data/data/pc/1.8/protocol.json` | `packet_set_protocol` field schema (`varint`, `string`, `u16`, `varint`) |
|
||||
|
||||
Reference in New Issue
Block a user