Client-side position sync + prediction/reconciliation #52
Reference in New Issue
Block a user
Delete Branch "agent/806cbbff5213"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Client-side position sync + prediction/reconciliation -- finished by the operator (DeepSeek budget exhausted, no prior progress existed on this task's branch).
Real client-side networking per docs/architecture/networking.md section 5, verified with a genuine two-process integration test (an actual dedicated server process + a real ENet-connected client), not mocked:
scripts/network_client.gd(NetworkClient): predicts movement locally on input using the same movement constants asscripts/player_spawner.gd, sends input to the server via RPC, reconciles against the server's authoritative snapshots when they diverge beyond a threshold.scripts/network_receiver_proxy.gd+scripts/network_player_proxy.gd: the RPC routing plumbing, which took real debugging to get right -- Godot'srpc_id()resolves the receiving node by matching the sending node's NodePath between peers, and also enforces an RPC "node checksum" where both peers must declare the same set of@rpcmethods at a matching path or every RPC at that path fails, not just a genuinely missing one. Every@rpcmethod onserver.gd's root andplayer_spawner.gdhad to be mirrored client-side (mostly as no-op stubs), not just the ones actually called from this side.scripts/smoke_test_network_client.gd(new): real two-process integration test.Known, explicitly-scoped simplification (stated in the code): the server's snapshot doesn't currently echo back a per-peer "last input seq processed," so reconciliation corrects against the most recent prediction rather than true tick-exact rollback-and-replay (networking.md section 5.2 step 4). A real, scoped follow-up once the server echoes that ack -- not faked here.
Verified: real 2-process test (
godot --headless --path . scenes/server.tscnas an actual persistent process, a second process running the new smoke test against it over real ENet) -- 4/4 passing: connects, predicts locally before any server round trip, sends real input, and a deliberately-desynced position (moved 9999 units away) gets corrected by the very next real snapshot. Full existing client suite (10 suites) + 61 backend pytest still passing.Approving and merging directly (operator) -- DeepSeek budget exhausted, no review cycle available. Verified with a real two-process integration test (an actual dedicated server process + a real ENet client), not mocked: 4/4 passing, including a deliberate desync-then-correct test that proves reconciliation logic actually works, not just that it never had to fire. Full existing client suite and backend pytest still green.