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>
85 lines
2.7 KiB
C#
85 lines
2.7 KiB
C#
using System.Numerics;
|
|
using AcDream.App.World;
|
|
using AcDream.Core.Physics;
|
|
|
|
namespace AcDream.App.Physics;
|
|
|
|
/// <summary>
|
|
/// Commits the placement half of retail <c>CPhysicsObj::MoveOrTeleport</c>
|
|
/// Branch A (<c>0x00516330</c>). The caller runs
|
|
/// <see cref="RemoteTeleportHook"/> first, then this exact frame/cell snap,
|
|
/// before considering contact-driven interpolation.
|
|
/// </summary>
|
|
internal static class RemoteTeleportPlacement
|
|
{
|
|
internal static bool Apply(
|
|
ILiveEntityRemotePlacementRuntime remote,
|
|
PhysicsBody body,
|
|
ResolveResult placement,
|
|
Vector3 cellLocalPosition,
|
|
Quaternion orientation,
|
|
double gameTime,
|
|
bool previousContact,
|
|
bool previousOnWalkable,
|
|
Func<bool>? isCurrent = null,
|
|
Func<bool>? isVelocityCurrent = null)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(remote);
|
|
ArgumentNullException.ThrowIfNull(body);
|
|
if (!placement.Ok
|
|
|| !IsFinite(placement.Position)
|
|
|| !IsFinite(cellLocalPosition)
|
|
|| !PositionFrameValidation.IsValid(
|
|
placement.CellId,
|
|
cellLocalPosition,
|
|
orientation)
|
|
|| !double.IsFinite(gameTime))
|
|
{
|
|
throw new ArgumentOutOfRangeException(
|
|
nameof(placement),
|
|
"A remote teleport placement requires an accepted finite frame, clock, and nonzero cell.");
|
|
}
|
|
|
|
body.Orientation = orientation;
|
|
body.SnapToCell(placement.CellId, placement.Position, cellLocalPosition);
|
|
body.LastUpdateTime = gameTime;
|
|
|
|
body.ContactPlaneValid = placement.InContact;
|
|
if (placement.InContact)
|
|
{
|
|
body.ContactPlane = placement.ContactPlane;
|
|
body.ContactPlaneCellId = placement.ContactPlaneCellId;
|
|
body.ContactPlaneIsWater = placement.ContactPlaneIsWater;
|
|
}
|
|
else
|
|
{
|
|
body.ContactPlaneCellId = 0u;
|
|
body.ContactPlaneIsWater = false;
|
|
}
|
|
|
|
if (!PhysicsObjUpdate.CommitSetPositionTransition(
|
|
body,
|
|
placement.InContact,
|
|
placement.OnWalkable,
|
|
placement.CollisionNormalValid,
|
|
placement.CollisionNormal,
|
|
previousContact,
|
|
previousOnWalkable,
|
|
remote.HitGround,
|
|
remote.LeaveGround,
|
|
isCurrent,
|
|
isVelocityCurrent))
|
|
{
|
|
return false;
|
|
}
|
|
if (isVelocityCurrent?.Invoke() != false)
|
|
remote.Airborne = !body.OnWalkable;
|
|
return isCurrent?.Invoke() ?? true;
|
|
}
|
|
|
|
private static bool IsFinite(Vector3 value) =>
|
|
float.IsFinite(value.X)
|
|
&& float.IsFinite(value.Y)
|
|
&& float.IsFinite(value.Z);
|
|
|
|
}
|