diff --git a/docs/ISSUES.md b/docs/ISSUES.md index 98ac7d8d..68ddcf65 100644 --- a/docs/ISSUES.md +++ b/docs/ISSUES.md @@ -3709,52 +3709,45 @@ stable now; this is a draw-order/depth oscillation localized to the door surface --- -## #111 — Indoor login from an ACE-mutated restore starts outdoor-classified (transparent interior until door-press) - -**Status:** OPEN -**Severity:** MEDIUM (UX; no wedge — always controllable, heals on door-press) -**Filed:** 2026-06-10 (split out of #107's gate runs) -**Component:** physics / player snap (grounding) + membership lateral recovery - -**Symptom (user-gated ×3, wedge-107-gate3/4/5 logs):** logging in indoors, the -interior renders transparent (walls see-through, own char invisible) until the -player presses into the DOORWAY, which promotes membership into the proper room -and everything renders. Collision works throughout. "It feels like I'm logging -in a step up" — correct: ACE restores the player ~1 m above the floor (or 1.8 m -below, in the cellar volume). - -**Mechanism (fully evidenced):** ACE does not persist our reported (cell, pos) -pair — `GameActionAutonomousPosition.Handle` → `SetRequestedLocation` feeds -ACE's SERVER-SIDE physics player, and the logout save is ACE's physics state: -same XY as ours verbatim, but ACE's own Z + cell (observed: claim 0x172 z=95.0; -claim 0x147 z=92.226 cellar; claim 0x14F z=94.85 — stacked volumes under/over -the room 0x171 the user actually stood in at z=94.0). Our entry snap -(PhysicsEngine.Resolve + retail AdjustPosition, #107) validates the claim at -the RESTORED point — geometrically valid for the lofted/sunk point — but never -GROUNDS and re-validates: the first movement drops the player to the floor -where the stacked claim no longer contains them → the pick (correctly -portal-local, P1-validated) cannot laterally recover the 2-hop room → demote -to outdoor INSIDE the building → render (downstream of membership) draws the -outdoor flood → transparent interior until the doorway portal promotes. - -**Fix direction (retail-anchored):** retail `SetPositionInternal` does NOT -commit the raw restored position — after AdjustPosition it runs -`CheckPositionInternal → CTransition::find_valid_position` (:283426, :280070), -settling the sphere onto valid floor BEFORE committing, then stores the -SETTLED position. Port shape: at the snap, ground the position (floor under -the point within the claim's visible graph), re-run AdjustPosition at the -settled foot-center (for the gate-5 case: z 95.0→94.0, then 0x172's stab list -corrects to 0x171), commit the corrected pair. ⚠️ Open sub-question: the -gate-5 snap committed the lofted pair VERBATIM (z=95.0, cell unchanged) even -though Resolve's indoor floor-snap should have grounded to the closest floor — -instrument which early-out fired (suspects: `physics is null` landblock-lookup -miss at snap time; step-height reject; bestCell null). Logs: -wedge-107-gate3/4/5-indoor-login.log; scans in Issue107SpawnDiagnosticTests. - --- # Recently closed +## #111 — ACE-mutated indoor restores: transparent interior / wrong placement at login — [DONE 2026-06-10 · 5f1eb7c + 5706e0e + 2735695] + +**Status:** DONE (user-gated: clean indoor logins at two different buildings — +"it worked", "looked great"; further self-testing across houses ongoing) +**Closed:** 2026-06-10 (late) +**Commits:** `5f1eb7c` (claim-authoritative snap + [snap] apparatus) → +`5706e0e` (ground via physics walkable polygons) → `2735695` (entity snap parity) +**Component:** physics / player snap + +**The peel (each layer caught live by the [snap] apparatus):** +1. **bestCell clobber** (`5f1eb7c`): the legacy Resolve floor-pick scanned every + CellSurface in the landblock (123 at Holtburg) and broke same-height ties by + iteration order — it clobbered ACE's CLEAN validated claim 0xA9B40171 with + 0xA9B4013F, seeding the poison loop (our heartbeats reported the clobbered + cell; ACE persisted it; the next login inherited it). Fix: a VALIDATED indoor + claim is authoritative (retail SetPositionInternal commits the AdjustPosition + cell and only settles Z); the snap grounds onto the claim's own floor. +2. **Triangle-soup grounding** (`5706e0e`): CellSurface includes ceiling/roof TOP + faces — first-hit grounded onto 0x171's 99.475 ceiling (then poisoned ACE's + save with the roof height); nearest-to-reference self-confirmed the poison. + Fix: ground via the PHYSICS walkable polygons (normal.Z ≥ PhysicsGlobals.FloorZ, + retail find_walkable's filter) — `WalkableFloorZNearest`, cell-local plane drop. + Verified eating the poisoned restore: claim (0x171, z=99.475) → grounded 94.000. +3. **Entity snap asymmetry** (`2735695`): login entry snapped only the CONTROLLER; + the renderer kept the entity at the restored height ("spawned 2 m in the air" + over a fully-correct interior). Fix: entity.SetPosition + ParentCellId at entry, + parity with the teleport-arrival path. + +The ACE-side behavior (server persists ITS physics state, not our reports — +`SetRequestedLocation` feeds ACE's server-side player) is by design and now fully +survivable: every restore shape observed tonight (clean / adjacent-room / +cross-building / cellar-sunk / roof-lofted) lands correctly placed or loudly +corrected ([spawn-adjust]/[snap] lines). The [snap] diagnostic stays (one line +per login/teleport). + ## #107 — Indoor-login spawn wedge — [DONE 2026-06-10 · 1090189] **Status:** DONE (live-verified incl. ACE's own poisoned teleport; final indoor