docs(render): AD-117 item 1 retired — the render-only destination-cell move is retail's own zero-sphere find_cell_list

CObjCell::find_cell_list (0x0052b4e0) with num_sphere == 0 adds only the
current cell — interior CELLARRAY::add_cell at 0x0052b563, outdoor
CLandCell::add_all_outside_cells (0x00533630, the arg2 <= 0 branch:
adjust_to_outside + gid_to_lcoord + add_outside_cell) — and skips the
portal transit walk (`arg4 != 0 && arg2 != 0` at 0x0052b576). So a shapeless
object's transition cell array is its destination cell alone, exactly what
RefreshPositionRows publishes. Not an adaptation; the register row keeps
its three residual readings, the S3 packet drops the capture request, and
the registry/test comments cite the verified function.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-09-03 01:18:50 +02:00
parent 3597c90446
commit 4b0b29e4cd
7 changed files with 21 additions and 17 deletions

View file

@ -2460,10 +2460,15 @@ public sealed class ShadowObjectRegistry
// (0x00514ae0) adds the CShadowObj unconditionally (pc:282856) and
// gates only AddPartsShadow on part_array != 0, so a shapeless
// visual object keeps a cell array it travels with. Its transition
// carries no sphere, so that array is its destination cell alone
// (num_cells == 1 → AddPartsShadow without clip planes). AD-117
// records the single-cell reading until a cdb trace pins the
// zero-sphere transition's exact cell list.
// carries no sphere, and CObjCell::find_cell_list (0x0052b4e0) with
// num_sphere == 0 adds ONLY the current cell — pc 0x0052b563
// `CELLARRAY::add_cell(objcell_id)` for an interior position,
// CLandCell::add_all_outside_cells (0x00533630, the `arg2 <= 0`
// branch: adjust_to_outside + gid_to_lcoord + add_outside_cell) for
// an outdoor one — and skips the portal transit walk entirely
// (`if (arg4 != 0 && arg2 != 0)` at 0x0052b576). So the array is the
// destination cell alone (num_cells == 1 → AddPartsShadow without
// clip planes). Verified statically 2026-09-03; no capture needed.
if (!_entityToCells.ContainsKey(entityId)
&& !_suspendedEntityCells.ContainsKey(entityId)
&& seedCellId != 0u