refactor(physics): delete legacy PhysicsEngine.Resolve/ResolvePlacement/HasCellSurface (C5a, AP-1/AD-1)
Member-wise deletion of the three legacy resolver members named in docs/research/2026-08-05-c5a-contract.md: PhysicsEngine.Resolve, PhysicsEngine.HasCellSurface, and PhysicsEngine.ResolvePlacement. An exhaustive receiver census over src/ found zero production callers of any of the three — every production placement writer already reaches the canonical PhysicsEngine.SetPosition transaction exclusively through RuntimeSetPositionState (three call sites total). The deletion is purely member-wise: IsSpawnCellReady and AdjustPosition, which shared the same source region as the deleted members, are preserved byte-identical — every remaining production caller of either (including PhysicsCameraCollisionProbe, AdjustPosition's sole surviving production caller) is unaffected. Companion changes: - PlayerMovementController's 3-argument SetPosition test overload is renamed to SeedPlacementForTest (internal) and CommitPreparedPosition is deleted; 83 call sites across 19 test files were mechanically renamed to match. - Seven pinned test dispositions from the contract are executed: 3.1 (PhysicsEngineTests.cs: 11 legacy-resolver tests deleted, 6 ResolveWithTransition tests kept), 3.2/3.3/3.4 (re-point to canonical SetPosition, with TransitionScratchDifferentialTests.cs additionally gaining positive IsCommitted assertions after each bitwise comparison so the differential proves a placement actually committed, not just that two possibly-uncommitted results match), 3.5 (Runtime rename), and 3.6 (PlayerMovementPlacementTransactionTests.cs rewritten — its xmldoc now states plainly that the render-root publish moved to RuntimeSetPositionState.cs, but the sticky-release relocation claim was false and is retracted; this disposition's coverage loss is the sticky release path, not silently absorbed elsewhere). - Stale `PhysicsEngine.Resolve`/`Resolve` doc citations in CellTransit.cs, PlayerMovementController.cs, and HeadlessSessionWorldProjection.cs are corrected to name the surviving canonical entry points by symbol (SetPosition, AdjustSetPosition/AdjustPosition, ResolveWithTransition) rather than fragile line numbers. Retires AP-1 and AD-1 in docs/architecture/retail-divergence-register.md: both rows described production zero-delta placement routing remaining on the legacy resolver pending the Slice 4B2/4B route cutover; that resolver no longer exists, so the condition each row tracked is now structurally false rather than merely narrowed. AP-145 (routed through the prior commit) and this commit's AP-1/AD-1 together bring the section counts to 101 AP / 47 AD active rows. Builds on the AP-145 fix (previous commit) — this commit's staged tree was independently rebuilt and its four suites independently rerun on top of that commit before this commit was created, in addition to the combined rebuild/rerun below. Full-solution build: 0 errors (21 pre-existing warnings, all unrelated). Suite results (combined tree): Core 4270/4271 passed (1 skip; the single DatSoundCacheTests concurrent-decode-dedup failure is a known load-sensitive race, confirmed passing standalone and unrelated to this change), Runtime 1176/1176, Headless 86/86, App 4132/4135 (3 skips). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
f8e55ba5e4
commit
6921a02744
34 changed files with 508 additions and 946 deletions
|
|
@ -94,7 +94,7 @@ public sealed class LocalPlayerImmediatePositionTests
|
|||
worldOffsetX: 0f,
|
||||
worldOffsetY: 0f);
|
||||
var player = new PlayerMovementController(engine);
|
||||
player.SetPosition(
|
||||
player.SeedPlacementForTest(
|
||||
new Vector3(96f, 97f, 50f),
|
||||
0xA9B40001u,
|
||||
new Vector3(96f, 97f, 50f));
|
||||
|
|
|
|||
|
|
@ -442,7 +442,7 @@ public sealed class PlayerMouseLookMovementTests
|
|||
worldOffsetY: 0f);
|
||||
|
||||
var controller = new PlayerMovementController(engine);
|
||||
controller.SetPosition(new Vector3(96f, 96f, 50f), 0x0001u);
|
||||
controller.SeedPlacementForTest(new Vector3(96f, 96f, 50f), 0x0001u, new Vector3(96f, 96f, 50f));
|
||||
return controller;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ public class PlayerMovementControllerTests
|
|||
{
|
||||
var engine = MakeFlatEngine();
|
||||
var controller = new PlayerMovementController(engine);
|
||||
controller.SetPosition(new Vector3(96f, 96f, 50f), 0x0001);
|
||||
controller.SeedPlacementForTest(new Vector3(96f, 96f, 50f), 0x0001, new Vector3(96f, 96f, 50f));
|
||||
|
||||
var result = controller.Update(0.016f, new MovementInput());
|
||||
|
||||
|
|
@ -89,7 +89,7 @@ public class PlayerMovementControllerTests
|
|||
var engine = MakeFlatEngine();
|
||||
var controller = new PlayerMovementController(engine);
|
||||
var rest = new Vector3(96f, 96f, 50f);
|
||||
controller.SetPosition(rest, 0x0001);
|
||||
controller.SeedPlacementForTest(rest, 0x0001, rest);
|
||||
|
||||
// Settle one frame so the resolver establishes its rest state, then
|
||||
// capture the baseline the body must hold.
|
||||
|
|
@ -126,7 +126,7 @@ public class PlayerMovementControllerTests
|
|||
{
|
||||
var engine = MakeFlatEngine();
|
||||
var controller = new PlayerMovementController(engine);
|
||||
controller.SetPosition(new Vector3(96f, 96f, 50f), 0x0001);
|
||||
controller.SeedPlacementForTest(new Vector3(96f, 96f, 50f), 0x0001, new Vector3(96f, 96f, 50f));
|
||||
controller.Yaw = 0f;
|
||||
|
||||
// Walk forward ~0.5 s, then release.
|
||||
|
|
@ -157,7 +157,7 @@ public class PlayerMovementControllerTests
|
|||
{
|
||||
var engine = MakeFlatEngine();
|
||||
var controller = new PlayerMovementController(engine);
|
||||
controller.SetPosition(new Vector3(96f, 96f, 50f), 0x0001);
|
||||
controller.SeedPlacementForTest(new Vector3(96f, 96f, 50f), 0x0001, new Vector3(96f, 96f, 50f));
|
||||
controller.Yaw = 0f; // facing +X
|
||||
|
||||
// L.5 physics-tick gate (235de33, 2026-04-30): Update() integrates
|
||||
|
|
@ -181,7 +181,7 @@ public class PlayerMovementControllerTests
|
|||
{
|
||||
var controller = new PlayerMovementController(MakeFlatEngine());
|
||||
var start = new Vector3(96f, 96f, 50f);
|
||||
controller.SetPosition(start, 0x0001);
|
||||
controller.SeedPlacementForTest(start, 0x0001, start);
|
||||
controller.Yaw = 0f;
|
||||
controller.AttachAnimationRootMotionSource((_, _) => { });
|
||||
|
||||
|
|
@ -199,7 +199,7 @@ public class PlayerMovementControllerTests
|
|||
{
|
||||
var controller = new PlayerMovementController(MakeFlatEngine());
|
||||
var start = new Vector3(96f, 96f, 50f);
|
||||
controller.SetPosition(start, 0x0001);
|
||||
controller.SeedPlacementForTest(start, 0x0001, start);
|
||||
controller.Yaw = 0f;
|
||||
controller.ObjectScale = 2f;
|
||||
controller.AttachAnimationRootMotionSource((_, frame) =>
|
||||
|
|
@ -220,7 +220,7 @@ public class PlayerMovementControllerTests
|
|||
{
|
||||
var controller = new PlayerMovementController(MakeFlatEngine());
|
||||
var start = new Vector3(96f, 96f, 50f);
|
||||
controller.SetPosition(start, 0x0001);
|
||||
controller.SeedPlacementForTest(start, 0x0001, start);
|
||||
controller.Yaw = 0f;
|
||||
int advances = 0;
|
||||
controller.AttachAnimationRootMotionSource((_, frame) =>
|
||||
|
|
@ -247,7 +247,7 @@ public class PlayerMovementControllerTests
|
|||
{
|
||||
var controller = new PlayerMovementController(MakeFlatEngine());
|
||||
var start = new Vector3(96f, 96f, 50f);
|
||||
controller.SetPosition(start, 0x0001);
|
||||
controller.SeedPlacementForTest(start, 0x0001, start);
|
||||
controller.Yaw = 0f; // body local +Y faces world +X
|
||||
controller.AttachAnimationRootMotionSource((_, frame) =>
|
||||
{
|
||||
|
|
@ -273,7 +273,7 @@ public class PlayerMovementControllerTests
|
|||
public void Update_AttachedAnimationFrame_PreservesCompleteNonCommutingOrientation()
|
||||
{
|
||||
var controller = new PlayerMovementController(MakeFlatEngine());
|
||||
controller.SetPosition(new Vector3(96f, 96f, 50f), 0x0001);
|
||||
controller.SeedPlacementForTest(new Vector3(96f, 96f, 50f), 0x0001, new Vector3(96f, 96f, 50f));
|
||||
Quaternion initial = Quaternion.CreateFromAxisAngle(Vector3.UnitX, 1.1f);
|
||||
Quaternion delta = Quaternion.CreateFromAxisAngle(Vector3.UnitY, -0.9f);
|
||||
controller.SetBodyOrientation(initial);
|
||||
|
|
@ -297,7 +297,7 @@ public class PlayerMovementControllerTests
|
|||
{
|
||||
var controller = new PlayerMovementController(MakeFlatEngine());
|
||||
var start = new Vector3(96f, 96f, 50f);
|
||||
controller.SetPosition(start, 0x0001);
|
||||
controller.SeedPlacementForTest(start, 0x0001, start);
|
||||
controller.Yaw = 0f;
|
||||
int sample = 0;
|
||||
controller.AttachAnimationRootMotionSource((_, frame) =>
|
||||
|
|
@ -331,7 +331,7 @@ public class PlayerMovementControllerTests
|
|||
{
|
||||
var controller = new PlayerMovementController(MakeFlatEngine());
|
||||
var start = new Vector3(96f, 96f, 50f);
|
||||
controller.SetPosition(start, 0x0001);
|
||||
controller.SeedPlacementForTest(start, 0x0001, start);
|
||||
int advances = 0;
|
||||
controller.AttachAnimationRootMotionSource((_, frame) =>
|
||||
{
|
||||
|
|
@ -356,8 +356,8 @@ public class PlayerMovementControllerTests
|
|||
var combined = new PlayerMovementController(MakeFlatEngine());
|
||||
var split = new PlayerMovementController(MakeFlatEngine());
|
||||
var start = new Vector3(96f, 96f, 50f);
|
||||
combined.SetPosition(start, 0x0001);
|
||||
split.SetPosition(start, 0x0001);
|
||||
combined.SeedPlacementForTest(start, 0x0001, start);
|
||||
split.SeedPlacementForTest(start, 0x0001, start);
|
||||
int combinedHooks = 0;
|
||||
int splitHooks = 0;
|
||||
|
||||
|
|
@ -391,7 +391,7 @@ public class PlayerMovementControllerTests
|
|||
public void TickHidden_DoesNotAdvancePartArrayButStillProcessesHooks()
|
||||
{
|
||||
var controller = new PlayerMovementController(MakeFlatEngine());
|
||||
controller.SetPosition(new Vector3(96f, 96f, 50f), 0x0001);
|
||||
controller.SeedPlacementForTest(new Vector3(96f, 96f, 50f), 0x0001, new Vector3(96f, 96f, 50f));
|
||||
int advances = 0;
|
||||
int hookPasses = 0;
|
||||
controller.AttachAnimationRootMotionSource(
|
||||
|
|
@ -412,7 +412,7 @@ public class PlayerMovementControllerTests
|
|||
public void InvalidElapsed_VisibleFrameIsPurePresentationRead()
|
||||
{
|
||||
var controller = new PlayerMovementController(MakeFlatEngine());
|
||||
controller.SetPosition(new Vector3(96f, 96f, 50f), 0x0001);
|
||||
controller.SeedPlacementForTest(new Vector3(96f, 96f, 50f), 0x0001, new Vector3(96f, 96f, 50f));
|
||||
float initialTime = controller.SimTimeSeconds;
|
||||
float initialYaw = controller.Yaw;
|
||||
Vector3 initialPosition = controller.Position;
|
||||
|
|
@ -452,7 +452,7 @@ public class PlayerMovementControllerTests
|
|||
public void InvalidElapsed_HiddenFrameDoesNotAdvanceClockOrManagerTail()
|
||||
{
|
||||
var controller = new PlayerMovementController(MakeFlatEngine());
|
||||
controller.SetPosition(new Vector3(96f, 96f, 50f), 0x0001);
|
||||
controller.SeedPlacementForTest(new Vector3(96f, 96f, 50f), 0x0001, new Vector3(96f, 96f, 50f));
|
||||
float initialTime = controller.SimTimeSeconds;
|
||||
int targetPasses = 0;
|
||||
|
||||
|
|
@ -475,7 +475,7 @@ public class PlayerMovementControllerTests
|
|||
public void Update_AirbornePartArrayFrame_SuppressesOriginButPreservesOrientation()
|
||||
{
|
||||
var controller = new PlayerMovementController(MakeFlatEngine());
|
||||
controller.SetPosition(new Vector3(96f, 96f, 50f), 0x0001);
|
||||
controller.SeedPlacementForTest(new Vector3(96f, 96f, 50f), 0x0001, new Vector3(96f, 96f, 50f));
|
||||
controller.Update(1f, new MovementInput(Jump: true));
|
||||
|
||||
Vector3 beforeRelease = controller.Position;
|
||||
|
|
@ -506,7 +506,7 @@ public class PlayerMovementControllerTests
|
|||
public void Update_AttachedAnimationTurn_IsNotAppliedByASecondYawIntegrator()
|
||||
{
|
||||
var controller = new PlayerMovementController(MakeFlatEngine());
|
||||
controller.SetPosition(new Vector3(96f, 96f, 50f), 0x0001);
|
||||
controller.SeedPlacementForTest(new Vector3(96f, 96f, 50f), 0x0001, new Vector3(96f, 96f, 50f));
|
||||
controller.Yaw = 0f;
|
||||
controller.AttachAnimationRootMotionSource((dt, frame) =>
|
||||
{
|
||||
|
|
@ -531,7 +531,7 @@ public class PlayerMovementControllerTests
|
|||
var engine = MakeFlatEngine();
|
||||
var controller = new PlayerMovementController(engine);
|
||||
var start = new Vector3(96f, 96f, 50f);
|
||||
controller.SetPosition(start, 0x0001);
|
||||
controller.SeedPlacementForTest(start, 0x0001, start);
|
||||
controller.Yaw = 0f;
|
||||
|
||||
var firstTick = controller.Update(ObjectTick, new MovementInput(Forward: true));
|
||||
|
|
@ -554,14 +554,14 @@ public class PlayerMovementControllerTests
|
|||
{
|
||||
var engine = MakeFlatEngine();
|
||||
var controller = new PlayerMovementController(engine);
|
||||
controller.SetPosition(new Vector3(96f, 96f, 50f), 0x0001);
|
||||
controller.SeedPlacementForTest(new Vector3(96f, 96f, 50f), 0x0001, new Vector3(96f, 96f, 50f));
|
||||
controller.Yaw = 0f;
|
||||
|
||||
controller.Update(ObjectTick, new MovementInput(Forward: true));
|
||||
controller.Update(PhysicsBody.MinQuantum * 0.5f, new MovementInput(Forward: true));
|
||||
|
||||
var snapped = new Vector3(120f, 80f, 50f);
|
||||
controller.SetPosition(snapped, 0x0001);
|
||||
controller.SeedPlacementForTest(snapped, 0x0001, snapped);
|
||||
var result = controller.Update(PhysicsBody.MinQuantum * 0.5f, new MovementInput());
|
||||
|
||||
Assert.Equal(snapped, result.Position);
|
||||
|
|
@ -572,7 +572,7 @@ public class PlayerMovementControllerTests
|
|||
public void CommitCanonicalForcePositionFrame_ReconcilesPoseWithoutStoppingActiveMotion()
|
||||
{
|
||||
var controller = new PlayerMovementController(MakeFlatEngine());
|
||||
controller.SetPosition(new Vector3(96f, 96f, 50f), 0x0001);
|
||||
controller.SeedPlacementForTest(new Vector3(96f, 96f, 50f), 0x0001, new Vector3(96f, 96f, 50f));
|
||||
controller.Yaw = 0f;
|
||||
controller.Update(ObjectTick, new MovementInput(Forward: true));
|
||||
Vector3 velocity = controller.BodyVelocity;
|
||||
|
|
@ -616,7 +616,7 @@ public class PlayerMovementControllerTests
|
|||
var world = new Vector3(12f, 12f, 50f);
|
||||
var wireLocal = new Vector3(12f, 12f, 50f);
|
||||
|
||||
controller.SetPosition(world, 0xA9B40031u, wireLocal);
|
||||
controller.SeedPlacementForTest(world, 0xA9B40031u, wireLocal);
|
||||
|
||||
Assert.Equal(0xA9B40001u, controller.CellId);
|
||||
Assert.Equal(controller.CellId, controller.CellPosition.ObjCellId);
|
||||
|
|
@ -628,7 +628,7 @@ public class PlayerMovementControllerTests
|
|||
{
|
||||
var engine = MakeFlatEngine();
|
||||
var controller = new PlayerMovementController(engine);
|
||||
controller.SetPosition(new Vector3(96f, 96f, 50f), 0x0001);
|
||||
controller.SeedPlacementForTest(new Vector3(96f, 96f, 50f), 0x0001, new Vector3(96f, 96f, 50f));
|
||||
controller.Yaw = 0f;
|
||||
int animationAdvances = 0;
|
||||
int hookPasses = 0;
|
||||
|
|
@ -656,7 +656,7 @@ public class PlayerMovementControllerTests
|
|||
{
|
||||
var engine = MakeFlatEngine();
|
||||
var controller = new PlayerMovementController(engine);
|
||||
controller.SetPosition(new Vector3(96f, 96f, 50f), 0x0001);
|
||||
controller.SeedPlacementForTest(new Vector3(96f, 96f, 50f), 0x0001, new Vector3(96f, 96f, 50f));
|
||||
controller.Yaw = 0f;
|
||||
|
||||
var result = controller.Update(
|
||||
|
|
@ -680,14 +680,14 @@ public class PlayerMovementControllerTests
|
|||
{
|
||||
var engine = MakeFlatEngine();
|
||||
var controller = new PlayerMovementController(engine);
|
||||
controller.SetPosition(new Vector3(96f, 96f, 50f), 0x0001);
|
||||
controller.SeedPlacementForTest(new Vector3(96f, 96f, 50f), 0x0001, new Vector3(96f, 96f, 50f));
|
||||
controller.Yaw = 0f;
|
||||
|
||||
var walkInput = new MovementInput { Forward = true };
|
||||
var walkResult = controller.Update(1.0f, walkInput);
|
||||
float walkDist = walkResult.Position.X - 96f;
|
||||
|
||||
controller.SetPosition(new Vector3(96f, 96f, 50f), 0x0001);
|
||||
controller.SeedPlacementForTest(new Vector3(96f, 96f, 50f), 0x0001, new Vector3(96f, 96f, 50f));
|
||||
|
||||
var runInput = new MovementInput { Forward = true, Run = true };
|
||||
var runResult = controller.Update(1.0f, runInput);
|
||||
|
|
@ -701,7 +701,7 @@ public class PlayerMovementControllerTests
|
|||
{
|
||||
var engine = MakeFlatEngine();
|
||||
var controller = new PlayerMovementController(engine);
|
||||
controller.SetPosition(new Vector3(96f, 96f, 50f), 0x0001);
|
||||
controller.SeedPlacementForTest(new Vector3(96f, 96f, 50f), 0x0001, new Vector3(96f, 96f, 50f));
|
||||
float initialYaw = controller.Yaw;
|
||||
|
||||
var input = new MovementInput { TurnRight = true };
|
||||
|
|
@ -715,7 +715,7 @@ public class PlayerMovementControllerTests
|
|||
{
|
||||
var engine = MakeFlatEngine();
|
||||
var controller = new PlayerMovementController(engine);
|
||||
controller.SetPosition(new Vector3(96f, 96f, 50f), 0x0001);
|
||||
controller.SeedPlacementForTest(new Vector3(96f, 96f, 50f), 0x0001, new Vector3(96f, 96f, 50f));
|
||||
|
||||
// First frame: idle (no input).
|
||||
controller.Update(0.016f, new MovementInput());
|
||||
|
|
@ -732,7 +732,7 @@ public class PlayerMovementControllerTests
|
|||
{
|
||||
var engine = MakeFlatEngine();
|
||||
var controller = new PlayerMovementController(engine);
|
||||
controller.SetPosition(new Vector3(96f, 96f, 50f), 0x0001);
|
||||
controller.SeedPlacementForTest(new Vector3(96f, 96f, 50f), 0x0001, new Vector3(96f, 96f, 50f));
|
||||
|
||||
// Charged jump: hold for a full charge (1s dt), then release to fire.
|
||||
// A full charge gives enough Vz that the player clears the 0.05-unit
|
||||
|
|
@ -749,7 +749,7 @@ public class PlayerMovementControllerTests
|
|||
{
|
||||
var engine = MakeFlatEngine();
|
||||
var controller = new PlayerMovementController(engine);
|
||||
controller.SetPosition(new Vector3(96f, 96f, 50f), 0x0001);
|
||||
controller.SeedPlacementForTest(new Vector3(96f, 96f, 50f), 0x0001, new Vector3(96f, 96f, 50f));
|
||||
|
||||
Assert.True(controller.CanSendPositionEvent);
|
||||
|
||||
|
|
@ -765,7 +765,7 @@ public class PlayerMovementControllerTests
|
|||
{
|
||||
var engine = MakeFlatEngine();
|
||||
var controller = new PlayerMovementController(engine);
|
||||
controller.SetPosition(new Vector3(96f, 96f, 50f), 0x0001);
|
||||
controller.SeedPlacementForTest(new Vector3(96f, 96f, 50f), 0x0001, new Vector3(96f, 96f, 50f));
|
||||
|
||||
Assert.Equal(default, controller.JumpCharge);
|
||||
|
||||
|
|
@ -783,7 +783,7 @@ public class PlayerMovementControllerTests
|
|||
{
|
||||
var engine = MakeFlatEngine();
|
||||
var controller = new PlayerMovementController(engine);
|
||||
controller.SetPosition(new Vector3(96f, 96f, 50f), 0x0001);
|
||||
controller.SeedPlacementForTest(new Vector3(96f, 96f, 50f), 0x0001, new Vector3(96f, 96f, 50f));
|
||||
|
||||
// Charged jump: hold for a full charge, then release.
|
||||
controller.Update(1.0f, new MovementInput(Jump: true)); // full charge
|
||||
|
|
@ -829,7 +829,7 @@ public class PlayerMovementControllerTests
|
|||
// One step at walk speed will cross into the low region where terrain drops
|
||||
// ~28 units — more than StepUpHeight=5, triggering the ledge-fall.
|
||||
var controller = new PlayerMovementController(engine);
|
||||
controller.SetPosition(new Vector3(118f, 96f, 50f), 0x0001);
|
||||
controller.SeedPlacementForTest(new Vector3(118f, 96f, 50f), 0x0001, new Vector3(118f, 96f, 50f));
|
||||
controller.Yaw = 0f; // facing +X
|
||||
|
||||
// Single step — should trigger airborne state because terrain drops sharply.
|
||||
|
|
@ -915,7 +915,7 @@ public class PlayerMovementControllerTests
|
|||
{
|
||||
var (controller, _) = MakeControllerWithHost();
|
||||
|
||||
controller.SetPosition(new Vector3(96f, 96f, 50f), 0x0001); // low16 < 0x0100 -> outdoor
|
||||
controller.SeedPlacementForTest(new Vector3(96f, 96f, 50f), 0x0001, new Vector3(96f, 96f, 50f)); // low16 < 0x0100 -> outdoor
|
||||
|
||||
ConstraintManager cm = controller.PositionManager!.Constraint!;
|
||||
Assert.True(cm.IsConstrained);
|
||||
|
|
@ -935,9 +935,9 @@ public class PlayerMovementControllerTests
|
|||
{
|
||||
var (controller, _) = MakeControllerWithHost();
|
||||
|
||||
controller.SetPosition(
|
||||
controller.SeedPlacementForTest(
|
||||
new Vector3(10f, 10f, 5f),
|
||||
0x01000105u); // low16 = 0x0105 >= 0x0100 -> indoor (verbatim, no outdoor canonicalization)
|
||||
0x01000105u, new Vector3(10f, 10f, 5f)); // low16 = 0x0105 >= 0x0100 -> indoor (verbatim, no outdoor canonicalization)
|
||||
|
||||
ConstraintManager cm = controller.PositionManager!.Constraint!;
|
||||
Assert.Equal(5.0f, cm.ConstraintDistanceStart);
|
||||
|
|
@ -948,7 +948,7 @@ public class PlayerMovementControllerTests
|
|||
public void SetPosition_Teleport_TearsDownAndRearmsAPreviouslyFullyConstrainedLeash()
|
||||
{
|
||||
var (controller, _) = MakeControllerWithHost();
|
||||
controller.SetPosition(new Vector3(96f, 96f, 50f), 0x0001);
|
||||
controller.SeedPlacementForTest(new Vector3(96f, 96f, 50f), 0x0001, new Vector3(96f, 96f, 50f));
|
||||
ConstraintManager cm = controller.PositionManager!.Constraint!;
|
||||
|
||||
// Synthetically over-strain the leash with a tight band (production
|
||||
|
|
@ -958,7 +958,7 @@ public class PlayerMovementControllerTests
|
|||
cm.AdjustOffset(new MotionDeltaFrame { Origin = new Vector3(5f, 0f, 0f) }, quantum: 0.1);
|
||||
Assert.True(controller.PositionManager.IsFullyConstrained());
|
||||
|
||||
controller.SetPosition(new Vector3(150f, 150f, 50f), 0x0001);
|
||||
controller.SeedPlacementForTest(new Vector3(150f, 150f, 50f), 0x0001, new Vector3(150f, 150f, 50f));
|
||||
|
||||
// retail teleport_hook's UnConstrain, followed by the fresh re-arm at
|
||||
// the new position, clears the stale over-strained state.
|
||||
|
|
@ -971,7 +971,7 @@ public class PlayerMovementControllerTests
|
|||
{
|
||||
var (controller, _) = MakeControllerWithHost();
|
||||
var initial = new Vector3(96f, 96f, 50f);
|
||||
controller.SetPosition(initial, 0x0001);
|
||||
controller.SeedPlacementForTest(initial, 0x0001, initial);
|
||||
controller.Update(ObjectTick, new MovementInput(Forward: true));
|
||||
Vector3 velocityBeforeCommit = controller.BodyVelocity;
|
||||
Assert.NotEqual(Vector3.Zero, velocityBeforeCommit); // sanity: actually moving
|
||||
|
|
@ -1002,7 +1002,7 @@ public class PlayerMovementControllerTests
|
|||
public void Update_ConstraintArmedInBand_TapersALargeRootMotionOffsetOnTheSecondTick()
|
||||
{
|
||||
var (controller, _) = MakeControllerWithHost();
|
||||
controller.SetPosition(new Vector3(96f, 96f, 50f), 0x0001);
|
||||
controller.SeedPlacementForTest(new Vector3(96f, 96f, 50f), 0x0001, new Vector3(96f, 96f, 50f));
|
||||
ConstraintManager cm = controller.PositionManager!.Constraint!;
|
||||
cm.ConstrainTo(controller.CellPosition, startDistance: 1f, maxDistance: 10f);
|
||||
|
||||
|
|
@ -1034,7 +1034,7 @@ public class PlayerMovementControllerTests
|
|||
public void Update_ConstraintOverstrained_PushesIsFullyConstrainedOntoBodyAndBlocksJump()
|
||||
{
|
||||
var (controller, _) = MakeControllerWithHost();
|
||||
controller.SetPosition(new Vector3(96f, 96f, 50f), 0x0001);
|
||||
controller.SeedPlacementForTest(new Vector3(96f, 96f, 50f), 0x0001, new Vector3(96f, 96f, 50f));
|
||||
ConstraintManager cm = controller.PositionManager!.Constraint!;
|
||||
cm.ConstrainTo(controller.CellPosition, startDistance: 1f, maxDistance: 2f);
|
||||
|
||||
|
|
@ -1069,7 +1069,7 @@ public class PlayerMovementControllerTests
|
|||
{
|
||||
var controller = new PlayerMovementController(MakeFlatEngine());
|
||||
var start = new Vector3(96f, 96f, 50f);
|
||||
controller.SetPosition(start, 0x0001);
|
||||
controller.SeedPlacementForTest(start, 0x0001, start);
|
||||
controller.Yaw = 0f;
|
||||
// Fixed per-tick local-forward delta, matching
|
||||
// Update_AttachedAnimationRootDelta_DrivesGroundedBodyAtObjectScale's
|
||||
|
|
@ -1145,7 +1145,7 @@ public class PlayerMovementControllerTests
|
|||
default));
|
||||
Assert.Throws<InvalidOperationException>(() => candidate.TickHidden(
|
||||
1f / 60f));
|
||||
Assert.Throws<InvalidOperationException>(() => candidate.SetPosition(
|
||||
Assert.Throws<InvalidOperationException>(() => candidate.SeedPlacementForTest(
|
||||
Vector3.One,
|
||||
0xA9B40021u,
|
||||
Vector3.One));
|
||||
|
|
@ -1155,7 +1155,12 @@ public class PlayerMovementControllerTests
|
|||
candidate.CaptureMovementResult(mouseLookEvent: false));
|
||||
Assert.Throws<InvalidOperationException>(() =>
|
||||
candidate.NoteMovementSent(1f));
|
||||
Assert.Throws<InvalidOperationException>(candidate.CommitPreparedPosition);
|
||||
// C5a (2026-08-05): CommitPreparedPosition is deleted (zero production
|
||||
// callers); ArmConstraintLeashAtCommittedPlacement is its production
|
||||
// replacement and carries the SAME EnsurePublishedForRuntimeOperation
|
||||
// guard at its own entry, so this re-points rather than drops.
|
||||
Assert.Throws<InvalidOperationException>(
|
||||
candidate.ArmConstraintLeashAtCommittedPlacement);
|
||||
Assert.Throws<InvalidOperationException>(() =>
|
||||
candidate.ApplyPhysicsState(PhysicsStateFlags.Frozen));
|
||||
Assert.Throws<InvalidOperationException>(() => candidate.LocalEntityId = 2u);
|
||||
|
|
@ -1194,7 +1199,7 @@ public class PlayerMovementControllerTests
|
|||
{
|
||||
var engine = MakeFlatEngine();
|
||||
var controller = new PlayerMovementController(engine);
|
||||
controller.SetPosition(new Vector3(96f, 96f, 50f), 0x0001);
|
||||
controller.SeedPlacementForTest(new Vector3(96f, 96f, 50f), 0x0001, new Vector3(96f, 96f, 50f));
|
||||
controller.Yaw = 0f;
|
||||
controller.Motion.DefaultSink = new FakeAnimationDispatchSink();
|
||||
// No root-motion displacement contributed -- isolates the residual
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ public sealed class PlayerOutboundPositionTests
|
|||
// The render origin remains A9B1, so a point 22.56 m into A9B2 is
|
||||
// represented at world Y=214.56. The wire frame must remain the
|
||||
// carried A9B2-local 22.56, never the render-space 214.56.
|
||||
controller.SetPosition(
|
||||
controller.SeedPlacementForTest(
|
||||
new Vector3(116.07f, 214.56f, 83.76f),
|
||||
0xA9B20021u,
|
||||
new Vector3(116.07f, 22.56f, 83.76f));
|
||||
|
|
@ -42,7 +42,7 @@ public sealed class PlayerOutboundPositionTests
|
|||
public void OutboundPosition_PreservesCompleteAuthoritativeQuaternion()
|
||||
{
|
||||
var controller = new PlayerMovementController(new PhysicsEngine());
|
||||
controller.SetPosition(
|
||||
controller.SeedPlacementForTest(
|
||||
new Vector3(116.07f, 214.56f, 83.76f),
|
||||
0xA9B20021u,
|
||||
new Vector3(116.07f, 22.56f, 83.76f));
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ public sealed class RuntimeLocalPlayerMovementStateTests
|
|||
{
|
||||
LocalEntityId = 0x50000001u,
|
||||
};
|
||||
controller.SetPosition(
|
||||
controller.SeedPlacementForTest(
|
||||
new Vector3(11f, 12f, 13f),
|
||||
0xA9B40001u,
|
||||
new Vector3(11f, 12f, 13f));
|
||||
|
|
@ -140,8 +140,8 @@ public sealed class RuntimeLocalPlayerMovementStateTests
|
|||
second.Controller = secondController;
|
||||
|
||||
first.Execute(RuntimeMovementCommand.ToggleRunLock);
|
||||
firstController.SetPosition(Vector3.One, 0xA9B40001u, Vector3.One);
|
||||
secondController.SetPosition(
|
||||
firstController.SeedPlacementForTest(Vector3.One, 0xA9B40001u, Vector3.One);
|
||||
secondController.SeedPlacementForTest(
|
||||
new Vector3(2f),
|
||||
0xA9B50001u,
|
||||
new Vector3(2f));
|
||||
|
|
|
|||
|
|
@ -2970,7 +2970,7 @@ public sealed class RuntimeLocalPlayerPhysicsPublicationStateTests
|
|||
1f / 60f));
|
||||
Assert.Throws<InvalidOperationException>(() =>
|
||||
controller.SuspendObjectUpdate(1f / 60f));
|
||||
Assert.Throws<InvalidOperationException>(() => controller.SetPosition(
|
||||
Assert.Throws<InvalidOperationException>(() => controller.SeedPlacementForTest(
|
||||
Vector3.One,
|
||||
Cell,
|
||||
Vector3.One));
|
||||
|
|
@ -3003,8 +3003,12 @@ public sealed class RuntimeLocalPlayerPhysicsPublicationStateTests
|
|||
controller.PrepareForAttackRequest());
|
||||
Assert.Throws<InvalidOperationException>(() =>
|
||||
controller.RequestPosture(MotionCommand.Ready));
|
||||
// C5a (2026-08-05): CommitPreparedPosition is deleted (zero production
|
||||
// callers); ArmConstraintLeashAtCommittedPlacement is its production
|
||||
// replacement and carries the SAME EnsurePublishedForRuntimeOperation
|
||||
// guard at its own entry, so this re-points rather than drops.
|
||||
Assert.Throws<InvalidOperationException>(() =>
|
||||
controller.CommitPreparedPosition());
|
||||
controller.ArmConstraintLeashAtCommittedPlacement());
|
||||
Assert.Throws<InvalidOperationException>(() =>
|
||||
controller.PreparePositionForCommit(Vector3.One, Cell, Vector3.One));
|
||||
Assert.Throws<InvalidOperationException>(() =>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue