Sync from GitHub main #1
@@ -0,0 +1,74 @@
|
||||
# Commonwealth Online Protocol V2
|
||||
|
||||
Protocol V2 is the transition layer between the current TCP JSON relay and the planned GameNetworkingSockets transport. The gameplay schema and validation rules are intended to survive the transport change.
|
||||
|
||||
## Session states
|
||||
|
||||
A TCP connection starts as **pending**. Pending connections receive a `welcome` packet but do not count against active player capacity and cannot own world/NPC authority.
|
||||
|
||||
A V2 client activates with:
|
||||
|
||||
```json
|
||||
{"type":"hello","protocolVersion":2}
|
||||
```
|
||||
|
||||
The server replies with `sessionReady`. During the client transition, legacy clients are temporarily activated by their first valid gameplay packet. This compatibility behavior is temporary and tracked by issue #3.
|
||||
|
||||
## Framing and limits
|
||||
|
||||
- Current transport: UTF-8 newline-delimited JSON over TCP
|
||||
- Maximum line size: 64 KiB
|
||||
- Handshake timeout: 10 seconds
|
||||
- Active idle timeout: 60 seconds
|
||||
- Packet rate: 120 packets/second per client, with sustained-window escalation
|
||||
- Connection attempts: 8 per source IP per 10 seconds
|
||||
- JSON `NaN`/`Infinity` values are rejected
|
||||
- Outbound JSON is serialized with non-finite values disabled
|
||||
|
||||
## Interest management
|
||||
|
||||
Player transforms are no longer blindly broadcast to every connected player.
|
||||
|
||||
Peers are relevant when:
|
||||
|
||||
1. Their normalized `cellId` values match, or
|
||||
2. They have the same non-empty `worldspaceId` and are within 8192 world units in the XY plane.
|
||||
|
||||
If an older client has not provided enough scope data yet, the server falls back to relaying for compatibility rather than hiding peers.
|
||||
|
||||
NPC snapshots are filtered per recipient using the same interest rule.
|
||||
|
||||
## Authority
|
||||
|
||||
Only **active** sessions can own world/NPC authority. A TCP probe or idle pending socket cannot become host.
|
||||
|
||||
The current global host is transitional. Per-cell/worldspace authority with epochs is tracked by issue #5.
|
||||
|
||||
## Transform validation
|
||||
|
||||
Required transform fields:
|
||||
|
||||
- `x`, `y`, `z`, `angleZ`: finite and bounded
|
||||
- `cellId`: non-zero hex FormID
|
||||
- `worldspaceId`: optional hex FormID
|
||||
|
||||
Optional V2-ready animation fields are normalized when present:
|
||||
|
||||
- `animationDirection`
|
||||
- `aimPitch`
|
||||
- `turnDelta`
|
||||
|
||||
Client capture/application work for those fields is tracked by issue #4.
|
||||
|
||||
## Combat
|
||||
|
||||
`combatHit` remains a targeted reliable-style gameplay event on the current transport. The relay now rejects malformed/non-finite values, duplicate or out-of-order sender sequences, self-targeting, disconnected targets, and targets outside the sender's interest scope.
|
||||
|
||||
Server-authoritative movement correction and stronger combat validation are tracked by issue #6.
|
||||
|
||||
## Transport migration
|
||||
|
||||
GameNetworkingSockets migration is tracked by issue #2. The intended split is:
|
||||
|
||||
- Unreliable/sequenced: transforms and NPC snapshots
|
||||
- Reliable: session/control, actions, equipment, combat, world state, and authority changes
|
||||
Reference in New Issue
Block a user