fix(runtime): restore interaction completion ownership

Preserve prepublication local motion completion, require the PartArray enter-world lifecycle port, and balance deferred Use busy ownership across dispatch and cancellation. Reconcile the completed GameWindow connected gates and add regression coverage.

Co-authored-by: Codex <codex@openai.com>
This commit is contained in:
Erik 2026-07-23 05:51:51 +02:00
parent 5c955c36ec
commit f9736ece6c
26 changed files with 675 additions and 68 deletions

View file

@ -0,0 +1,22 @@
namespace AcDream.App.World;
/// <summary>
/// Strongly typed retail PartArray world-entry boundary.
/// </summary>
/// <remarks>
/// <c>CPhysicsObj::set_hidden @ 0x00514C60</c> invokes
/// <c>CPartArray::HandleEnterWorld @ 0x00517D70</c> on both Hidden edges.
/// This dedicated port prevents that mandatory lifecycle callback from being
/// confused with neighboring <see cref="Action{T}"/> presentation callbacks.
/// </remarks>
public sealed class LiveEntityPartArrayEnterWorldPort
{
private readonly Action<uint> _handleEnterWorld;
public LiveEntityPartArrayEnterWorldPort(Action<uint> handleEnterWorld) =>
_handleEnterWorld = handleEnterWorld
?? throw new ArgumentNullException(nameof(handleEnterWorld));
public void HandleEnterWorld(uint localEntityId) =>
_handleEnterWorld(localEntityId);
}