acdream/memory/project_animation_runtime.md

1.2 KiB

Animation Runtime Crib

Live entity lifecycle invariant

CreateObject creates a live entity and a real DeleteObject destroys it. ObjDescEvent (0xF625) is neither: it changes appearance on the existing object.

For an appearance update, preserve:

  • WorldEntity object identity and local Id
  • AnimatedEntity, AnimationSequencer, frame/range/rate state
  • movement-controller and animation-manager bindings
  • physics host, collision registration, dead reckoning, and selection state

Replace only resolved MeshRefs, palette override, part overrides, and visual bounds, then invalidate the entity-classification cache. The paperdoll may clone the updated appearance separately.

Retail oracle chain:

SmartBox::HandleObjDescEventSmartBox::UpdateVisualDescACCObjectMaint::SetVisualDescCPhysicsObj::DoObjDescChangesFromDefaultCPartArray::DoObjDescChanges.

Regression history: treating 0xF625 as despawn/respawn severed the player controller from the active animation state, so unequipping armor froze character animation and made animation-dependent door interaction appear frozen. Fixed as issue #203 on 2026-07-11 and user-gated in a Release client.