Reduce GameWindow.OnUpdate to one typed orchestration call and remove transitive window callbacks from teardown, liveness, teleport placement, live presentation, auto-entry, and entity packet routing. Preserve the frozen retail object/network order while making the production owner graph explicit and testable.
49 lines
1.7 KiB
C#
49 lines
1.7 KiB
C#
using AcDream.App.World;
|
|
using AcDream.Core.Physics;
|
|
using AcDream.Core.World;
|
|
|
|
namespace AcDream.App.Physics;
|
|
|
|
/// <summary>Synchronizes a resolved remote placement in the current live origin.</summary>
|
|
internal sealed class RemoteShadowPlacementSynchronizer
|
|
{
|
|
private readonly RemotePhysicsUpdater _remotePhysics;
|
|
private readonly LiveWorldOriginState _origin;
|
|
|
|
public RemoteShadowPlacementSynchronizer(
|
|
RemotePhysicsUpdater remotePhysics,
|
|
LiveWorldOriginState origin)
|
|
{
|
|
_remotePhysics = remotePhysics
|
|
?? throw new ArgumentNullException(nameof(remotePhysics));
|
|
_origin = origin ?? throw new ArgumentNullException(nameof(origin));
|
|
}
|
|
|
|
public void Sync(WorldEntity entity, PhysicsBody body, uint cellId) =>
|
|
_remotePhysics.SyncRemoteShadowToBody(
|
|
entity.Id,
|
|
body,
|
|
_origin.CenterX,
|
|
_origin.CenterY,
|
|
cellId);
|
|
}
|
|
|
|
/// <summary>Bridges remote placement ownership to live presentation state.</summary>
|
|
internal sealed class RemoteTeleportPlacementPresentation
|
|
{
|
|
private readonly LiveEntityPresentationController _presentation;
|
|
|
|
public RemoteTeleportPlacementPresentation(
|
|
LiveEntityPresentationController presentation) =>
|
|
_presentation = presentation
|
|
?? throw new ArgumentNullException(nameof(presentation));
|
|
|
|
public void Complete(uint serverGuid, ushort generation, bool deferShadowRestore) =>
|
|
_presentation.CompleteAuthoritativePlacement(
|
|
serverGuid,
|
|
generation,
|
|
deferShadowRestore);
|
|
|
|
public void Begin(uint serverGuid, ushort generation) =>
|
|
_presentation.BeginAuthoritativePlacement(serverGuid, generation);
|
|
}
|