fix #173: remote jump arcs get the retail collision-velocity response

An observed character jumping into a dungeon ceiling hovered at the
roof until its ballistic arc decayed, landing visibly late (user
report, 0x0007). The remote DR tick sweeps collision (position pinned
at the ceiling — no clip-through) but retail's post-transition velocity
response, CPhysicsObj::handle_all_collisions (pc:282699-282715:
v -= (1+elasticity)*dot(v,n)*n), was only ported for the LOCAL player
(L.3a). The remote body kept its +Z launch velocity and re-integrated
it into the roof every tick — the position was clamped but the
timeline was pure ballistics.

Retail runs handle_all_collisions after every SetPositionInternal for
every physics object, remotes included. Mirror the local reflection
block in the remote sweep's post-resolve path: same formula, same
AD-25 airborne-before-AND-after suppression (corridor slides and
landings don't reflect; the landing snap's Velocity.Z <= 0 gate stays
intact), same Inelastic zero-out for future missiles. AD-25 register
row extended to cover both sites.

Suites green: Core 2533 / App 713 / UI 425 / Net 385.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-07-05 15:34:25 +02:00
parent 6ab269894a
commit 012d5c7bf7
3 changed files with 90 additions and 1 deletions

View file

@ -46,6 +46,46 @@ Copy this block when adding a new issue:
---
## #173 — Observed character jumping into a ceiling hovers at the roof until the arc decays (no collision-velocity response on remotes)
**Status:** 🟡 FIX SHIPPED 2026-07-05 (this commit) — pending user visual gate (watch a second client jump into the 0x0007 dungeon roof; it should bounce down immediately like the local player).
**Severity:** MEDIUM (remote-motion fidelity indoors; lands visibly late)
**Filed:** 2026-07-05
**Component:** physics — remote dead-reckoning collision response
**Description (user, 0x0007 dungeon):** watching another character jump into
the dungeon roof, the observed char sticks to the ceiling until the jump arc
would naturally have come down — "like we are calculating the entire jump
instead of actually checking the collision" — and lands later than retail,
with the animation pinned at the roof. The LOCAL player's own jump bounces
off the roof immediately.
**Root cause (code-confirmed):** the remote DR tick integrates the
VectorUpdate launch ballistically and DOES sweep collision
(`ResolveWithTransition`, GameWindow remote block) — the sweep pins the
POSITION at the ceiling — but the retail post-transition velocity response
(`CPhysicsObj::handle_all_collisions`, pc:282699-282715: reflect
`v = (1+elasticity)·dot(v,n)·n`) was only ever ported for the LOCAL player
(L.3a, `PlayerMovementController` ~:940). The remote body kept its +Z launch
velocity, re-integrated it into the roof every tick, and only descended once
gravity burned the arc off. Retail runs handle_all_collisions after every
SetPositionInternal for every physics object — remotes included.
**Fix (this commit):** mirror the local L.3a reflection block in the remote
sweep's post-resolve path (same formula, same AD-25 airborne-before-AND-after
suppression so corridor slides and landings don't reflect, same Inelastic
zero-out). Register AD-25 extended to cover both sites.
**Files:** `src/AcDream.App/Rendering/GameWindow.cs` (remote sweep, #173
block after `rm.Body.Position = resolveResult.Position`).
**Acceptance:** from acdream, watch a second client jump into a dungeon
ceiling: the observed char deflects off the roof immediately and lands at
retail timing; grounded remote movement (corridor wall slides, NPC chases)
unchanged.
---
## #172 — Town-network portal platform blocks instead of stepping up (CCylSphere family was never ported)
**Status:** 🟡 FIX SHIPPED 2026-07-05 (this commit) — pending user visual gate (walk up onto the Holtburg portal platform, then the 0x0007 dungeon run).