refactor(world): separate live lifetime from spatial buckets
Introduce LiveEntityRuntime as the canonical owner of each accepted server-object incarnation, stable local identity, timestamped state, parent relations, runtime components, and exactly-once teardown. Split logical registration from rebucketing so pending landblocks, equipment attachment, pickup re-entry, and GUID replacement reuse the same entity and effect owners. Keep canonical materialized and visible target/radar views distinct, preserve retail leave_world versus exit_world semantics, gate root simulation while cell-less, and track transitional pre-Create F754 owners through delete and session reset. Remove stale-spawn rehydration and make GpuWorldState spatial-only for live objects. Add lifecycle, generation, pending, unload, attachment, event-publication, local-ID, rollback, and effect-cleanup coverage; update architecture, milestones, memory, and the divergence register. Co-Authored-By: Codex <noreply@openai.com>
This commit is contained in:
parent
8a5d77f7f4
commit
8dd996053d
24 changed files with 2449 additions and 631 deletions
|
|
@ -255,14 +255,21 @@ Ownership by phase:
|
|||
|
||||
## GameEntity: The Unified Entity (target refactor)
|
||||
|
||||
Currently, entity state is scattered across:
|
||||
- `WorldEntity` (position, rotation, mesh refs)
|
||||
- `AnimatedEntity` (animation frame, setup, sequencer)
|
||||
- `_entitiesByServerGuid` dict (server GUID lookup)
|
||||
- `GpuWorldState._loaded[lb].Entities` (per-landblock lists)
|
||||
- `_playerController` (player-specific movement)
|
||||
`LiveEntityRuntime` is now the shipped bridge to this target. It owns one
|
||||
`LiveEntityRecord` per accepted server-object incarnation, ServerGuid-to-local-id
|
||||
translation, accepted snapshots/timestamp gates, animation and remote-motion
|
||||
components, parent-event state, and exact logical teardown. `GpuWorldState`
|
||||
owns spatial buckets only: register/rebucket/unregister are separate operations,
|
||||
and landblock reloads reuse the same `WorldEntity` without replaying renderer or
|
||||
script creation. Its canonical materialized view remains stable across pending
|
||||
landblocks, while a separate visible-only view feeds radar, picking, status, and
|
||||
targeting. Pickup/parent leave-world clears cell membership and pauses root
|
||||
movement/animation without destroying retained owners. `GameWindow` retains
|
||||
storage-free typed views while its large feature loops are extracted.
|
||||
|
||||
This should become ONE class:
|
||||
The remaining aggregation is primarily `_playerController`'s player-specific
|
||||
movement plus the separate `WorldEntity`/animation/physics component types.
|
||||
Those should become ONE class:
|
||||
|
||||
```csharp
|
||||
public sealed class GameEntity
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue