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
|
|
@ -324,4 +324,42 @@ public sealed class EntityScriptActivatorTests
|
|||
system.Tick(0.01f);
|
||||
Assert.Equal(0, system.ActiveEmitterCount);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void OnRemoveLegacyOwner_StopsPreMaterializationF754ServerGuidAlias()
|
||||
{
|
||||
const uint serverGuid = 0x7000CAFEu;
|
||||
const uint localId = 0x00100001u;
|
||||
var script = BuildScript((60.0, new CreateParticleHook { EmitterInfoId = 100u }));
|
||||
var p = BuildPipeline((0xAAu, script));
|
||||
var activator = new EntityScriptActivator(p.Runner, p.Sink, StaticResolver(0xAAu));
|
||||
|
||||
// This is the current AD-32 pre-materialization F754 path: no local ID
|
||||
// exists yet, so the direct PES is temporarily owned by server GUID.
|
||||
Assert.True(activator.PlayLegacyPending(serverGuid, 0xAAu, Vector3.Zero));
|
||||
Assert.Equal(1, p.Runner.ActiveScriptCount);
|
||||
Assert.Equal(1, activator.LegacyPendingOwnerCount);
|
||||
|
||||
activator.OnRemoveLegacyOwner(serverGuid, localId);
|
||||
|
||||
Assert.Equal(0, p.Runner.ActiveScriptCount);
|
||||
Assert.Equal(0, activator.LegacyPendingOwnerCount);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ClearLegacyPendingOwners_StopsF754AliasesWithoutLiveRecords()
|
||||
{
|
||||
var script = BuildScript((60.0, new CreateParticleHook { EmitterInfoId = 100u }));
|
||||
var p = BuildPipeline((0xAAu, script));
|
||||
var activator = new EntityScriptActivator(p.Runner, p.Sink, StaticResolver(0xAAu));
|
||||
Assert.True(activator.PlayLegacyPending(0x70000001u, 0xAAu, Vector3.Zero));
|
||||
Assert.True(activator.PlayLegacyPending(0x70000002u, 0xAAu, Vector3.Zero));
|
||||
Assert.Equal(2, p.Runner.ActiveScriptCount);
|
||||
Assert.Equal(2, activator.LegacyPendingOwnerCount);
|
||||
|
||||
activator.ClearLegacyPendingOwners();
|
||||
|
||||
Assert.Equal(0, p.Runner.ActiveScriptCount);
|
||||
Assert.Equal(0, activator.LegacyPendingOwnerCount);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue