feat(physics): P5 commit 2 - arm the ConstraintManager leash on accepted positions (#167)
Wire ConstraintManager.ConstrainTo at every current acdream inbound-position acceptance seam, matching retail SmartBox::HandleReceivedPosition (0x00453fd0): - Remote (player + NPC): LiveEntityNetworkUpdateController arms right after the hard-teleport branch (remotePlacementRequired) returns - reaching that point already means MoveOrTeleport did NOT hard-place - anchored to the object's own live IPhysicsObjHost.Position. - Local player teleport: PlayerMovementController.SetPositionCore now runs UnConstrain (retail teleport_hook 0x00514ed0, previously a no-op because nothing armed the leash) then re-arms anchored to the just-snapped position, composing with the existing StopCompletelyAtPhysicsObjectBoundary velocity zero rather than duplicating it. CommitPreparedPosition mirrors the same pair for the deferred player-mode-entry commit path. - Local player ForcePosition: PlayerMovementController.BlipPosition arms with NO preceding UnConstrain (retail BlipPlayer/SetPositionSimple survives motion/velocity/stick, and the leash is no different). Push PhysicsBody.IsFullyConstrained from PositionManager.IsFullyConstrained at the SAME per-tick chokepoint each pump already runs AdjustOffset (PlayerMovementController.Update, RuntimeRemotePhysicsUpdater.Tick/TickHidden) so TS-35's read gate in jump_is_allowed sees live state instead of a stub that is never written. Tests: local-player arm/teardown/rearm/taper/jump-refusal (Runtime.Tests, PlayerMovementControllerTests), remote-tick IsFullyConstrained push (Runtime.Tests, RuntimePhysicsStateTests). Full Core/Runtime/App suites green with no regressions.
This commit is contained in:
parent
378d0b6ca0
commit
7719d25bc5
5 changed files with 330 additions and 3 deletions
|
|
@ -268,6 +268,13 @@ internal sealed class RuntimeRemotePhysicsUpdater
|
|||
terrainNormalNpc,
|
||||
inContact: rm.Body.InContact);
|
||||
npcHost.PositionManager.AdjustOffset(pmDelta, dt);
|
||||
// #167 (Campaign P P5): push the read side of TS-35's
|
||||
// jump_is_allowed gate. Retail reads IsFullyConstrained through
|
||||
// CPhysicsObj/PositionManager/ConstraintManager directly; acdream's
|
||||
// MotionInterpreter only has a PhysicsBody, so the per-tick pump
|
||||
// (the single owner of this write, matching the taper call just
|
||||
// above) is the seam that keeps the stub property current.
|
||||
rm.Body.IsFullyConstrained = npcHost.PositionManager.IsFullyConstrained();
|
||||
ApplyPositionManagerDelta(rm.Body, pmDelta);
|
||||
}
|
||||
else
|
||||
|
|
@ -679,6 +686,11 @@ internal sealed class RuntimeRemotePhysicsUpdater
|
|||
positionDelta,
|
||||
inContact: rm.Body.InContact);
|
||||
rm.Host?.PositionManager.AdjustOffset(positionDelta, dt);
|
||||
// #167 (Campaign P P5): see the identical push in Tick's grounded
|
||||
// npcHost branch — Hidden objects still keep their PositionManager
|
||||
// (and therefore their leash) alive per retail.
|
||||
if (rm.Host is { } hiddenHost)
|
||||
rm.Body.IsFullyConstrained = hiddenHost.PositionManager.IsFullyConstrained();
|
||||
ApplyPositionManagerDelta(rm.Body, positionDelta);
|
||||
|
||||
// Hidden suppresses CPartArray::Update, but process_hooks remains the
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue