current state
This commit is contained in:
+17
-3
@@ -58,7 +58,7 @@ Currently carries the chunk manifest for the 3×3 neighbourhood around the playe
|
||||
|
||||
The `entity_checksum` lets the client detect a lost `EntityPacket` without a dedicated
|
||||
ACK: if the checksum differs from the one computed over the last received entity update,
|
||||
the client knows to retransmit an `ActionPacket` (sequence preserved, no-op action) to
|
||||
the client knows to retransmit an `ActionPacket` (`target_tick = 0`, no-op action) to
|
||||
prompt the server to re-send the current entity state.
|
||||
|
||||
---
|
||||
@@ -71,13 +71,27 @@ Sent by the client on player action or on a chunk cache miss.
|
||||
|--------|------|--------------|-----------------|--------------------------------|
|
||||
| 0 | 6 | Header | `header` | packet_type = 1 |
|
||||
| 6 | 8 | u64 | `auth_token` | Token of the current session |
|
||||
| 14 | 4 | u32 | `sequence` | Monotonically increasing |
|
||||
| 14 | 4 | u32 | `target_tick` | Tick the action is scheduled for (see below); 0 = keep-alive/ack only |
|
||||
| 18 | 54 | ChunkEntry | `cache[9]` | Versions client currently holds |
|
||||
| 72 | 2 | PlayerAction | `player_action` | Derived from user input |
|
||||
| 74 | ? | ActionData | `action_data` | Dependent on PlayerAction |
|
||||
|
||||
**Minimum: 74 bytes** (no ActionData)
|
||||
|
||||
**Tick-addressed scheduling.** Actions are scheduled onto the server's tick timeline
|
||||
instead of being consumed in arrival order. `target_tick` selects the movement window
|
||||
(`target_tick / TICKS_PER_MOVE`, rounded up) the action executes in:
|
||||
|
||||
- A second action addressed to the same window **replaces** the first — this is how the
|
||||
client retracts (NOOP) or changes a scheduled step until its window executes, and how
|
||||
retransmits dedupe for free.
|
||||
- A **late** action (window already passed on arrival) moves to the next window, but
|
||||
only if that slot is empty: late actions fill gaps, they never override newer intent.
|
||||
- Only the next `ACTION_WINDOW_HORIZON` windows are addressable; anything beyond is
|
||||
dropped. Combined with one-action-per-window execution this bounds server memory and
|
||||
movement speed regardless of client behavior.
|
||||
- `target_tick = 0` carries no scheduling intent (keep-alive / cache-ack packets).
|
||||
|
||||
**ChunkEntry (6 bytes)**
|
||||
|
||||
| Offset | Size | Type | Field |
|
||||
@@ -302,7 +316,7 @@ whatever is still missing. No deduplication logic is required.
|
||||
the client simply waits one tick (~100 ms).
|
||||
|
||||
**Lost EntityPacket** — detected via the `entity_checksum` in the next `StatePacket`.
|
||||
The client retransmits a no-op `ActionPacket` (same sequence number, no-op action,
|
||||
The client retransmits a no-op `ActionPacket` (`target_tick = 0`, no-op action,
|
||||
current cache state); the server treats this as a normal diff request and re-sends the
|
||||
full entity update for the tick.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user