fix(motion): restore retail object manager order

Process animation completion at the retail process_hooks boundary, then run targeting, movement, PartArray completion, and PositionManager in the named UpdateObjectInternal order for local, remote, hidden, and position-less animated objects. Retire TS-42 with deterministic conformance coverage.\n\nCo-authored-by: OpenAI Codex <codex@openai.com>
This commit is contained in:
Erik 2026-07-19 21:40:14 +02:00
parent 0f996db747
commit c5ab99081c
17 changed files with 493 additions and 98 deletions

View file

@ -127,6 +127,29 @@ public sealed class RetailLocalPlayerFrameControllerTests
Assert.Equal(1f / 60f, timeAfterOneTick);
}
[Fact]
public void TargetManager_ObservesPostTransitionPlayerPosition()
{
PlayerMovementController controller = CreateController();
Vector3 initial = controller.Position;
Vector3 positionSeenByTargetManager = new(float.NaN);
var local = new RetailLocalPlayerFrameController(
canPresentPlayer: () => true,
getController: () => controller,
captureInput: () => new MovementInput(Forward: true),
resolveLocalEntityId: () => 7u,
handleTargeting: () => positionSeenByTargetManager = controller.Position,
isHidden: () => false,
project: (_, _, _) => { },
sendPreNetwork: (_, _, _) => { },
sendPostNetwork: (_, _) => { });
local.AdvanceBeforeNetwork(PhysicsBody.MaxQuantum);
Assert.NotEqual(initial, controller.Position);
Assert.Equal(controller.Position, positionSeenByTargetManager);
}
private static PlayerMovementController CreateController()
{
var engine = new PhysicsEngine();