diff --git a/context/multiplayer.md b/context/multiplayer.md index 4430182..cafe616 100644 --- a/context/multiplayer.md +++ b/context/multiplayer.md @@ -6,7 +6,7 @@ source_sections: "PROGRESS_LOG.md §7 (Phase 7), §8 (P6); docs/HARD_PROBLEMS.md related_topics: [wintesla-port, combat-damage, locomotion, decomp-reference] key_terms: [master, replicant, EGG, dead-reckon] open_questions: - - "pod-LAN config (real IPs); peer SimulationState/DropZoneLocation replication (authentic peer warp spheres); console-death replication freeze (pending recurrence to diagnose)" + - "pod-LAN config (real IPs); peer warp DropZoneLocation-anchoring [T3] (world-anchored peer sphere already visible, 160b78e); console-death replication freeze (pending recurrence to diagnose)" --- # Multiplayer @@ -342,10 +342,13 @@ transition, HUD all landed since P6): console egg → mesh → RunningMission on defect that hid it for the whole effort was NOT the warp code — it was a general **texture-scroll precision-collapse bug** in `L4D3D::SetTextureScrolling` (offset = `scrollDelta × absolute_time` → unbounded → UV precision loss → radial "spokes"), fixed with `fmodf`; that also - cleans the scrolling beam grit. See [[reconstruction-gotchas]] §13. REMAINING: the AUTHENTIC peer - path (see OTHERS' spheres) still needs player SimulationState/DropZoneLocation replication — until - then the local-player sphere stands in; and confirm the COLLAPSE (death-side) warp fires on every - MP death path (the force-damage test logged EXPAND reliably, COLLAPSE less so). + cleans the scrolling beam grit. See [[reconstruction-gotchas]] §13. PEER WARP IS WIRED + VISIBLE + (`160b78e`): an observer sees a peer's un-wreck warp via the world-anchored `BTStartWarpEffect` + (mechdmg.cpp:1074, `ReplicantInstance`-gated; `simulationState` rides every record header). + REMAINING [T3, non-gating]: the peer sphere is anchored to the peer's WORLD position, not the + peer's authentic `DropZoneLocation` (that attribute isn't replicated) — a fidelity refinement. + Also confirm the COLLAPSE (death-side) warp fires on every MP death path (force-damage test logged + EXPAND reliably, COLLAPSE less so). NOTE the respawn-cycle SIM path is separate + done: `DropZoneReply` (FUN_004bffd0) → `Mech::Reset` (@0049fb74) + the level-2 "translocated" cockpit alarm; `CreatePlayerVehicle` (FUN_004bfcac, disassembled — make+link only, matches RP analog). The sphere is a pure RENDER-side watcher on the diff --git a/context/translocation-warp.md b/context/translocation-warp.md index 09faead..c119b58 100644 --- a/context/translocation-warp.md +++ b/context/translocation-warp.md @@ -6,7 +6,7 @@ source_sections: "multiplayer.md (lifecycle + trigger wiring, task #52); referen related_topics: [rendering, multiplayer, combat-damage, reconstruction-gotchas, asset-formats, bgf-format] key_terms: [material-ramp] open_questions: - - "AUTHENTIC peer path (seeing OTHERS' spheres) needs player SimulationState/DropZoneLocation replication; until then the LOCAL-player sphere stands in." + - "Peer warp IS wired + visible -- observer sees a peer's un-wreck warp (world-anchored BTStartWarpEffect, 160b78e). Remaining nuance [T3]: anchor to the peer's authentic DropZoneLocation (not replicated) vs the peer's world position." - "In the 2-node force-damage test only the EXPAND (respawn) warp logs reliably; confirm the COLLAPSE (death-side) fires on every MP death path." --- @@ -118,9 +118,13 @@ it impossible to ignore. Generalized in [[reconstruction-gotchas]] §13. ## Trigger wiring (summary; full detail in [[multiplayer]]) [T2] Local player's own death → `BTStartWarpCollapsePOV()` (btplayer.cpp `VehicleDeadMessageHandler`, `deathCount==-1`, guarded `this==GetMissionPlayer()`). Respawn `DropZoneReply` → `BTStartWarpExpandPOV()` -(local-guarded). `BTWarpForceUnmask()` on mission-end / no-DropZones. Observer replicant un-wreck fires -the world-anchored `BTStartWarpEffect(x,y,z)` (mechdmg.cpp). The peer path is a stand-in until player -`SimulationState`/`DropZoneLocation` replication exists. +(local-guarded). `BTWarpForceUnmask()` on mission-end / no-DropZones. **Peer warp IS wired + visible +(`160b78e`):** an observer sees a peer's death/respawn warp — the replicant un-wreck fires the +world-anchored `BTStartWarpEffect(x,y,z)` at the peer's position (mechdmg.cpp:1074, gated to +`ReplicantInstance`; `simulationState` rides every update-record header so the observer tracks the +peer's state). The ONLY remaining nuance [T3, non-gating]: the observer's peer sphere is anchored to +the peer's WORLD position rather than the peer's authentic `DropZoneLocation` (that attribute isn't +replicated) — a fidelity refinement, not a missing effect. ## How it was solved (method) + verification [T2] 1. **Dump the real asset** (`dump_tsphere.py`) — established it's a bicone with cylindrical UVs, ending