A backend can now be a Minecraft: Java server, reached through a
Geyser instance the proxy treats as an ordinary Bedrock backend. Bedrock
players are sent to it alongside the Bedrock ones and keep their identity, their permissions and
their player data. Install
EndlinkGuard's geyser/ build into that Geyser's
extensions/ folder; nothing in Endlink's config needs setting.
Moving to or from a Java backend reconnects the player to the proxy rather than handing them
over, and that cannot be worked around. A Bedrock client reads its block-id scheme from the
StartGame it logs in with and can never be told otherwise while it is playing: Bedrock servers hash
block ids from the block state, Geyser numbers them by palette position. A seamless handoff across
that boundary delivers chunks the client cannot decode, and the player stands in an empty or
scrambled world with nothing in any log to explain it.
So Endlink learns each backend's scheme from its first StartGame, remembers it, and moves players
across that boundary by transferring them to its own address, putting them where they asked.
They never leave the proxy - same listener, same verification, same permissions, and backends stay
unreachable from outside. They see a loading screen. Switches between backends of the same kind are
untouched and stay seamless.
Also fixed
- A palette-indexed backend's block registry is left alone. The cross-backend palette was
merging every other backend's custom blocks into it and zeroing its checksum. Where block ids are
palette indices that renumbers the world out from under the client - wrong blocks everywhere,
unknown blocks past the end - and clearing the checksum removed the client's own mismatch check,
so it corrupted the world silently instead of failing cleanly. It was also pushing such a
backend's blocks into every other backend's registry. - Sub-chunk requests are withheld from a backend that does not implement them. A client taught
to request terrain that way by a Bedrock backend goes on doing it after a switch, and Geyser
treats those requests as a protocol violation and drops the player mid-game. Inferred
automatically;backend.<name>.dropSubChunkRequestsremains for a backend nobody has visited yet.
New setting
publicAddress - the address players are sent back to when a move needs a reconnect. Empty uses
the address each player connected with, which is right for almost every install.
Tested live: a network of two Bedrock backends and two Java ones, switching in every direction,
with the player's real IP reaching the Java server.