Networking Compatibility
Anomaly client and server must use the same application protocol. Public v1 uses protocol v5; peers using a different protocol version are rejected during connection before gameplay state is exchanged.
Authenticated join
Section titled “Authenticated join”- Client identity initialization must be Ready.
- Client and server complete the fixed authentication handshake.
- The client verifies or explicitly trusts the server fingerprint.
- The server validates the accepted client identity leaf and any contiguous rotation lineage.
- Directional transport keys and replay state become active.
- The server sends an authenticated facility snapshot before client map generation and sends its local enrollment ID and other authenticated state.
- Optional content begins its separate consent transaction.
Non-asset initial state does not wait for content approval. Declining optional content keeps the connection; failed transfer or activation revokes the content grant and disconnects.
Custom-message policy
Section titled “Custom-message policy”Each custom message implements IAnomalyMessage through AuthenticatedClientToServerMessage or AuthenticatedServerToClientMessage. Its contract declares:
- Direction: client-to-server or server-to-client.
- Authentication phase: authenticated session.
- A per-type maximum payload size.
- A declared transport channel.
The runtime checks direction, phase, payload ceiling, deployed channel capacity, replay counter, strict decoding, and trailing bytes before dispatch. Counter exhaustion disconnects before reuse. Inbound packet/byte limiting occurs before deserialization, and invalid-envelope logs are sampled.
Register the same message type and serialization contract with AnomalyMessageRegistry in both runtimes before sending. Client mods use Anomaly.Client.Api.Networking.AnomalyMessaging; server companions use Anomaly.Server.Api.Networking.ClientMessaging with native LabAPI Player wrappers. Broadcast recipients and event subscribers are isolated; one exception does not suppress later recipients or internal routing.
Transport size
Section titled “Transport size”Do not assume all LiteNetLib channels share one MTU. Anomaly queries the deployed transport’s maximum for the selected channel and fails closed if the encoded message does not fit without fragmentation.
Use custom messages for small bounded state. Use the consent-bound content flow for allowed PNG/OGG files.
Enrollment identity
Section titled “Enrollment identity”The server sends an authenticated EnrollmentIdentityMessage. Client.EnrollmentId is populated only for the active connection and cleared on disconnect. It can still be null when ClientEvents.Ready fires or Client.IsClientReady becomes true; those report the client scene-ready signal, not enrollment disclosure. anomaly.whoami displays and copies it.
The value is derived locally by each server and is not the non-secret identity_public fingerprint shown by the Launcher.
Password status
Section titled “Password status”Remote password authentication is unavailable. RequirePassword=true rejects remote clients.
Continue to Asset Lifecycle.