Skip to content

Networking and metadata

In single player your server half runs inside the game, against the same rules, so a resource behaves the same way in both modes.

A client resource sends with EmitToServer (server handlers only), EmitToAll (every other client and the server) or EmitTo(entity) (the client owning a player or vehicle, plus the server). A server resource broadcasts with EmitToAll or targets one entity’s owner with EmitTo. Receive events with On(name, handler).

Events travel inside OMX’s own multiplayer protocol and its rate limits; a resource never defines a packet type. The server checks event namespaces, who sent each event, and its target. Sending needs network.events.

The typed helpers send one value, serialised into the closed NetworkValue format:

// Client
Network.EmitToServer("register", new RegisterDriver("76"));
Network.On<DutyAssignment>("assignment", assignment => Show(assignment));
// Server: the extra argument resolves the sending player.
Network.On<RegisterDriver>("register", (player, request) => Register(player, request), Players.Get);

A raw event carries at most 16 arguments. Strings and byte arrays are limited to 4096 characters or bytes each.

Every player and vehicle has key/value metadata (entity.Meta) in three scopes:

Scope Who owns it Who receives it
Local This side Nobody. Changes apply immediately.
Synced The authority Every client, reliably, including players who join later.
StreamSynced The authority The entity’s owner and clients whose vehicle is within the server’s metadataStreamingRange.
var route = new MetadataKey<RouteDefinition>("route");
vehicle.Meta.Set(route, assignment, MetadataScope.StreamSynced);

A server resource writes replicated metadata on any entity. A client resource can only ask for changes on its own player or vehicle; the change appears, and Meta.Changed fires, once the authority accepts it. A stream-synced key appears and disappears for a client as it crosses the streaming range. Replicated writes need network.metadata.

Keys and event names have the form resource-id:name. Your own names can be written short (route); OMX adds your resource id. Any resource can read every key, but only writes within its own namespace. On a server, AllowedResources lists which namespaces clients may use.