refactor(world): extract live projection mechanics

Move appearance rebinding, collision construction, default-pose resolution, local shadow ownership, and exact leave-world presentation into focused owners. Preserve retail parent ordering with staged validation, committed recovery, recursive attached-subtree withdrawal, and retryable exact teardown across parent, pickup, position, unwield, and pose-loss edges.

Co-Authored-By: OpenAI Codex <codex@openai.com>
This commit is contained in:
Erik 2026-07-21 16:17:03 +02:00
parent c87bac31a0
commit 69a2ca0c6d
26 changed files with 4172 additions and 430 deletions

View file

@ -27,9 +27,12 @@ public sealed class ParentAttachmentStateTests
Assert.True(relations.TryGetProjection(childGuid, out ParentAttachmentRelation projection));
Assert.Equal(parentGuid, projection.ParentGuid);
Assert.True(inbound.TryGetSnapshot(childGuid, out WorldSession.EntitySpawn child));
Assert.NotNull(child.Position);
Assert.Null(child.ParentGuid);
Assert.Equal((ushort)5, child.PositionSequence);
Assert.True(Commit(relations, inbound, projection, out child));
Assert.Null(child.Position);
Assert.Equal(parentGuid, child.ParentGuid);
Assert.Equal((ushort)5, child.PositionSequence);
}
[Fact]
@ -50,9 +53,24 @@ public sealed class ParentAttachmentStateTests
update => gate.TryAcceptPositionChannelEvent(3, update.ChildPositionSequence));
Assert.True(relations.TryGetProjection(childGuid, out ParentAttachmentRelation projection));
Assert.Equal((ushort)5, projection.ChildPositionSequence);
Assert.Equal((uint)2, projection.PlacementId);
Assert.True(relations.CommitProjection(projection));
relations.MarkProjected(
projection,
ParentProjectionCandidateKind.Recovery);
relations.Resolve(
childGuid,
_ => true,
guid => guid == parentGuid ? (ushort)9 : null,
update => gate.TryAcceptPositionChannelEvent(3, update.ChildPositionSequence));
Assert.True(relations.TryGetStagedProjection(childGuid, out projection));
Assert.Equal((ushort)6, projection.ChildPositionSequence);
Assert.Equal((uint)3, projection.PlacementId);
relations.MarkProjected(childGuid);
Assert.True(relations.CommitProjection(projection));
relations.MarkProjected(
projection,
ParentProjectionCandidateKind.Recovery);
Assert.True(relations.RestoreLastAccepted(childGuid));
Assert.True(relations.TryGetProjection(childGuid, out projection));
Assert.Equal((ushort)6, projection.ChildPositionSequence);
@ -136,6 +154,7 @@ public sealed class ParentAttachmentStateTests
Assert.Equal(parentGuid, projection.ParentGuid);
Assert.Equal((ushort)10, projection.ParentInstanceSequence);
Assert.Equal((ushort)5, projection.ChildPositionSequence);
Assert.True(Commit(relations, inbound, projection, out _));
Assert.True(inbound.TryGetSnapshot(childGuid, out WorldSession.EntitySpawn child));
Assert.Equal(parentGuid, child.ParentGuid);
}
@ -257,6 +276,20 @@ public sealed class ParentAttachmentStateTests
: null,
update => inbound.TryApplyParent(update, out _));
private static bool Commit(
ParentAttachmentState relations,
InboundPhysicsStateController inbound,
ParentAttachmentRelation relation,
out WorldSession.EntitySpawn accepted) =>
inbound.TryCommitParent(
relation.ChildGuid,
relation.ParentGuid,
relation.ParentLocation,
relation.PlacementId,
relation.ChildPositionSequence,
out accepted)
&& relations.CommitProjection(relation);
private static WorldSession.EntitySpawn Spawn(
uint guid,
ushort instance,