acdream/src/AcDream.Core/Physics/RetailObjectManagerTail.cs
Erik f961d70023 feat(physics): port retail complete object frame pipeline
Restore the named-retail object update order across local, remote, static, projectile, animation, shadow, teleport, and effect lifetimes. Separate authoritative root commits from spatial rebucketing, preserve per-owner hook/FIFO ordering, and remove update-path allocations with exact lifecycle and residency gates.

Add deterministic conformance, adversarial lifetime, GUID-reuse, pending-cell, quaternion, timestamp, and allocation coverage. Release build is warning-free and all 6,446 tests pass with five intentional skips; retail, architecture, and adversarial reviews are clean.

Co-authored-by: OpenAI Codex <codex@openai.com>
2026-07-20 09:10:31 +02:00

62 lines
2 KiB
C#

namespace AcDream.Core.Physics;
/// <summary>
/// Executes the manager tail of retail
/// <c>CPhysicsObj::UpdateObjectInternal</c> (<c>0x005156B0</c>).
/// </summary>
/// <remarks>
/// The order is observable. In particular, animation completion hooks have
/// already run when this tail begins, so MoveTo may react to a completion in
/// the same object quantum. A null callback represents an absent retail
/// manager; it is not a separate execution path.
/// </remarks>
public static class RetailObjectManagerTail
{
/// <summary>
/// Allocation-free production overload for the concrete retail manager
/// owners. DetectionManager is not ported, so its ordered slot is empty.
/// </summary>
public static void Run(
Motion.TargetManager? target,
Motion.MovementManager? movement,
Motion.MotionTableManager? partArray,
Motion.PositionManager? position)
{
target?.HandleTargetting();
movement?.UseTime();
partArray?.UseTime();
position?.UseTime();
}
/// <summary>
/// Allocation-free local-player overload. Its target action and PartArray
/// completion action are cached ownership seams; the other managers are
/// passed as concrete objects rather than allocating bound delegates per
/// quantum.
/// </summary>
public static void Run(
Action? handleTargeting,
Motion.MovementManager? movement,
Action? partArrayHandleMovement,
Motion.PositionManager? position)
{
handleTargeting?.Invoke();
movement?.UseTime();
partArrayHandleMovement?.Invoke();
position?.UseTime();
}
public static void Run(
Action? checkDetection,
Action? handleTargeting,
Action? movementUseTime,
Action? partArrayHandleMovement,
Action? positionUseTime)
{
checkDetection?.Invoke();
handleTargeting?.Invoke();
movementUseTime?.Invoke();
partArrayHandleMovement?.Invoke();
positionUseTime?.Invoke();
}
}