fix(vfx): bind effects after canonical placement
C3c created graphical effect, projectile, and static-animation sidecars before Runtime finished the entity's first SetPosition. One-shot F754/F755 packets could be discarded, projectiles could adopt a cell-less body, and animated statics could compete for body ownership. Keep effects behind an exact-incarnation presentation barrier, retry projectile/static binding on the committed visibility edge, and keep effect cells synchronized with canonical rebuckets. User verified spell, recall, arrow, projectile, portal, and static presentation; 90 focused App tests and the Release build pass.
This commit is contained in:
parent
1fc529cdcb
commit
f24532adf3
11 changed files with 417 additions and 50 deletions
|
|
@ -2190,16 +2190,23 @@ public sealed class LiveEntityRuntimeTests
|
|||
spatial.AddLandblock(EmptyLandblock(0x0102FFFFu));
|
||||
var runtime = LiveEntityRuntimeFixture.Create(spatial, new RecordingResources());
|
||||
runtime.RegisterLiveEntity(Spawn(guid, 1, 1, 0x01010022u));
|
||||
runtime.MaterializeLiveEntity(guid, 0x01010022u, id => Entity(id, guid));
|
||||
WorldEntity entity = runtime.MaterializeLiveEntity(
|
||||
guid,
|
||||
0x01010022u,
|
||||
id => Entity(id, guid))!;
|
||||
|
||||
runtime.RebucketLiveEntity(guid, 0x0102FFFFu);
|
||||
|
||||
Assert.True(runtime.TryGetRecord(guid, out LiveEntityRecord record));
|
||||
Assert.Equal(0x01010022u, record.FullCellId);
|
||||
Assert.Equal(0x0102FFFFu, record.CanonicalLandblockId);
|
||||
Assert.Equal(0x01010022u, entity.ParentCellId);
|
||||
Assert.Equal(0x01010022u, entity.EffectCellId);
|
||||
|
||||
runtime.RebucketLiveEntity(guid, 0x01020033u);
|
||||
Assert.Equal(0x01020033u, record.FullCellId);
|
||||
Assert.Equal(0x01020033u, entity.ParentCellId);
|
||||
Assert.Equal(0x01020033u, entity.EffectCellId);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue