harden(runtime): close canonical entity object lifetime
Retain exact teardown receipts before terminal callbacks, preserve ordered re-entrant entity/object publication, publish committed facts across projection failures, and make direct disposal converge every canonical owner. Add a complete ownership ledger plus adversarial direct/graphical parity, callback, GUID reuse, reset, and resource-churn gates. Co-authored-by: Codex <codex@openai.com>
This commit is contained in:
parent
84954c8b77
commit
119b7c1151
9 changed files with 992 additions and 95 deletions
|
|
@ -50,6 +50,8 @@ public sealed class RuntimeEntityRecord
|
|||
public uint CanonicalLandblockId { get; internal set; }
|
||||
public uint RawPhysicsState { get; internal set; }
|
||||
public PhysicsStateFlags FinalPhysicsState { get; internal set; }
|
||||
public ulong SpatialAuthorityVersion { get; private set; }
|
||||
public ulong PhysicsStateMutationVersion { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Incarnation-stable retail <c>CPhysicsObj::update_time</c> owner.
|
||||
|
|
@ -72,6 +74,8 @@ public sealed class RuntimeEntityRecord
|
|||
public ulong VectorAuthorityVersion { get; private set; }
|
||||
public ulong VelocityAuthorityVersion { get; private set; }
|
||||
public ulong MovementAuthorityVersion { get; private set; }
|
||||
public ulong MovementCommitVersion { get; private set; } = 1UL;
|
||||
public ulong ParentCommitVersion { get; private set; }
|
||||
public ulong ObjDescAuthorityVersion { get; private set; }
|
||||
public ulong CreateIntegrationVersion { get; private set; } = 1UL;
|
||||
public bool DeleteAcceptedForTeardown { get; internal set; }
|
||||
|
|
@ -94,6 +98,7 @@ public sealed class RuntimeEntityRecord
|
|||
internal RetailPhysicsStateTransition ApplyRawPhysicsState(uint rawState)
|
||||
{
|
||||
StateAuthorityVersion++;
|
||||
PhysicsStateMutationVersion++;
|
||||
RawPhysicsState = rawState;
|
||||
RetailPhysicsStateTransition transition = RetailPhysicsStateTransitions.Apply(
|
||||
FinalPhysicsState,
|
||||
|
|
@ -123,6 +128,10 @@ public sealed class RuntimeEntityRecord
|
|||
VelocityAuthorityVersion++;
|
||||
}
|
||||
|
||||
internal void AdvanceMovementCommit() => MovementCommitVersion++;
|
||||
|
||||
internal void AdvanceParentCommit() => ParentCommitVersion++;
|
||||
|
||||
internal void AdvanceObjDescAuthority() => ObjDescAuthorityVersion++;
|
||||
|
||||
internal void AdvanceCreateAuthority()
|
||||
|
|
@ -138,6 +147,7 @@ public sealed class RuntimeEntityRecord
|
|||
|
||||
internal void SetChildNoDraw(bool noDraw)
|
||||
{
|
||||
PhysicsStateMutationVersion++;
|
||||
FinalPhysicsState = noDraw
|
||||
? FinalPhysicsState | PhysicsStateFlags.NoDraw
|
||||
: FinalPhysicsState & ~PhysicsStateFlags.NoDraw;
|
||||
|
|
@ -149,12 +159,22 @@ public sealed class RuntimeEntityRecord
|
|||
{
|
||||
if (refreshPosition && Snapshot.Position is { } position)
|
||||
{
|
||||
FullCellId = position.LandblockId;
|
||||
CanonicalLandblockId = (FullCellId & 0xFFFF0000u) | 0xFFFFu;
|
||||
SetFullCell(
|
||||
position.LandblockId,
|
||||
(position.LandblockId & 0xFFFF0000u) | 0xFFFFu);
|
||||
}
|
||||
|
||||
RawPhysicsState = Snapshot.Physics?.RawState
|
||||
?? Snapshot.PhysicsState
|
||||
?? 0u;
|
||||
}
|
||||
|
||||
internal void SetFullCell(
|
||||
uint fullCellId,
|
||||
uint canonicalLandblockId)
|
||||
{
|
||||
SpatialAuthorityVersion++;
|
||||
FullCellId = fullCellId;
|
||||
CanonicalLandblockId = canonicalLandblockId;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue