Game server

Provides communication within a single age instance by relaying Plasma messages over the network.

The game server also provides the “game manager” (GameMgr), a different mechanism used for some multiplayer activities, like Ayoheek, marker games, and the hood garden age puzzle. The game manager is implemented by MOSS and Cyan’s server software, but is notably absent from DIRTSAND — H’uru has moved away from using the game manager to reduce complexity on the server side. Instead, H’uru clients support alternative implementations for all mechanics that originally relied on the game manager. Between 2015 and 2022, H’uru clients didn’t support the game manager at all, but this support is being gradually reintroduced for compatibility with non-H’uru clients. The OpenUru client continues to use the game manager, with essentially no changes compared to the original open-sourced client code.

There can theoretically be multiple game server instances, but in practice all MOULa servers use a single game server for all age instances.

Messages

Game server messages

#

Cli2Game

Game2Cli

#

0

PingRequest

PingReply

0

1

JoinAgeRequest

JoinAgeReply

1

2

PropagateBuffer

PropagateBuffer

2

3

GameMgrMsg

GameMgrMsg

3

Cli2Game_PingRequest

  • Message type = 0

  • Ping time: 4-byte unsigned int.

See Ping messages for details.

Game2Cli_PingReply

  • Message type = 0

  • Ping time: 4-byte unsigned int.

See Ping messages for details.

Cli2Game_JoinAgeRequest

  • Message type = 1

  • Transaction ID: 4-byte unsigned int.

  • MCP ID: 4-byte unsigned int. Identifies the age instance to join. This value must be obtained from an Auth2Cli_AgeReply.

  • Account ID: 16-byte UUID. ID of the account that owns the avatar joining the age.

  • Player vault node ID: 4-byte unsigned int. KI number of the avatar joining the age.

Request to join the given age instance using the specified avatar. Sent by the client as part of the linking process, immediately after connecting to the game server.

Game2Cli_JoinAgeReply

  • Message type = 1

  • Transaction ID: 4-byte unsigned int.

  • Result: 4-byte ENetError.

Reply to a JoinAgeRequest. Upon receiving this message, if the result is successful, the client fetches the entire tree of vault nodes under the age instance’s Age node (whose node ID was previously sent to the client in the Auth2Cli_AgeReply) and then begins loading the age.

Cli2Game_PropagateBuffer

  • Message type = 2

  • Class index: 4-byte unsigned int. plCreatable class index of the message stored in the following buffer. Must be one of plNetMessage’s subclasses.

  • Buffer length: 4-byte unsigned int. Byte length of the following buffer field. Can be at most 1 MiB.

  • Buffer: Variable-length byte array. The serialized message, in the format produced by plNetMessage::PokeBuffer and understood by plNetMessage::PeekBuffer. The class index in the serialized buffer must match the one in the class index field.

Transmits a serialized plNetMessage from the client to the server. See Game network messages for details on the different kinds of messages that are sent this way.

Game2Cli_PropagateBuffer

Identical message type and format as Cli2Game_PropagateBuffer, but sent from the server to the client.

Nested message protocols

The low-level game server messages wrap multiple higher-level protocols. Because of their complexity, each of these nested protocols is documented separately.