Skip to content

Enhanced Client

Moongate accepts the Enhanced Client (EC) next to the classic client. Support is partial: this page says how to connect one, what was seen working with a real client and what was not tried yet. The last test used client 4.0.117 (wire version 67.0.117.0) on 2026-10-02.

The EC always encrypts its connection, so the server must accept encrypted logins. Set the encryption policy and the client’s wire version in config/moongate.toml:

[network.encryption]
mode = "Optional"
client_version = "67.0.117.0"
  • Optional accepts the encrypted EC and plaintext classic clients on the same listeners. Required accepts only encrypted clients. There is no automatic mode.
  • client_version is the wire version: the version of the client executable with 60 added to the first number. An executable with file version 4.0.117.x is 67.0.117.0. The last number does not change the keys.
  • The server uses one version for decryption. An encrypted classic client of another version is refused while this profile is set.

Restart the server after the change. The startup log names the profile:

Client encryption: Optional; client 67.0.117.0; login XOR; game Twofish / MD5-XOR

and a login from the EC reads:

Login client connected with version 67.0.117.0 (Enhanced)

See UO client encryption for every mode and the validation rules.

Seen with a real client:

Step Notes
Encrypted login and server list The login server accepts the hardware information (0xD9) the EC sends right after the account login.
Character creation 0x8D. The face and shirt style the EC sends are not kept, and it has no pants colour choice.
Entering the world A created character enters at once, as after choosing one from the list.
Walking

Built for the EC and covered by automated tests, but not yet seen with a real client:

Feature Notes
Speech 0xAD is read leniently: an odd language code, a missing terminator or a badly encoded character no longer disconnect the client.
Containers The EC shows a container as a grid. Every item has its own slot (0 to 124), kept in the database; a drop takes the slot the client asks for, or the next free one. See Packets.
Profile request 0xB8, sent by the EC after entering the world, is answered with the profile of its own character.
Login burst The packets the EC sends while the server is still loading the character wait, up to 1024 for a session, instead of disconnecting the client.
Particle effects An effect with a particle id goes to the EC as 0xC7; every other client gets the plain 0xC0. See Packets.
  • Everything the classic client lacks too: see the feature checklist.
  • The character profile window.
  • The old Kingdom Reborn AES/E3 negotiation.
  • Anything not listed above has not been tried with the EC.

The EC sends packets the classic client never sends, and some known packets in another shape. The server closes a connection that sends something it does not accept, and the log says what it was:

Rejected packet from session 2, opcode 0xAD, name UnicodeSpeechRequestPacket, 20 bytes: AD0014...
Opcode 0xB9 is not registered as an incoming packet; 11 bytes buffered after opcode.
Rejected login packet from session 1, opcode 0xD9
Session 2 sent more than 1024 packets while a handler was running
  • Rejected packet on the game server: the packet is known but its content was refused, or it has no handler. The line shows the first 64 bytes.
  • sent more than 1024 packets while a handler was running, followed by a Rejected packet: the content was fine, but too many packets were waiting behind a handler that reads the database.
  • is not registered as an incoming packet: the opcode is unknown to the server.
  • Rejected login packet: the login server has no handler for that opcode, or refused the packet’s content.

Open an issue with the line: the bytes are what is needed to add the packet.

Made with ❤️ by Tom

Buy me a coffee