diff --git a/Robust.Client/GameObjects/EntitySystems/TransformSystem.cs b/Robust.Client/GameObjects/EntitySystems/TransformSystem.cs index a6bdec229d..8ff58ef2ee 100644 --- a/Robust.Client/GameObjects/EntitySystems/TransformSystem.cs +++ b/Robust.Client/GameObjects/EntitySystems/TransformSystem.cs @@ -16,7 +16,7 @@ namespace Robust.Client.GameObjects.EntitySystems /// Handles interpolation of transform positions. /// [UsedImplicitly] - internal sealed class TransformSystem : EntitySystem + internal sealed class TransformSystem : SharedTransformSystem { // Max distance per tick how far an entity can move before it is considered teleporting. // TODO: Make these values somehow dependent on server TPS. diff --git a/Robust.Shared/GameObjects/Components/Transform/TransformComponent.cs b/Robust.Shared/GameObjects/Components/Transform/TransformComponent.cs index b08688480f..cdfbfc3723 100644 --- a/Robust.Shared/GameObjects/Components/Transform/TransformComponent.cs +++ b/Robust.Shared/GameObjects/Components/Transform/TransformComponent.cs @@ -5,6 +5,7 @@ using Robust.Shared.Animations; using Robust.Shared.Containers; using Robust.Shared.GameObjects.Components.Map; using Robust.Shared.GameObjects.EntitySystemMessages; +using Robust.Shared.GameObjects.Systems; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Interfaces.GameObjects.Components; using Robust.Shared.Interfaces.Map; @@ -722,8 +723,9 @@ namespace Robust.Shared.GameObjects.Components.Transform var oldPos = Coordinates; SetPosition(newState.LocalPosition); - Owner.EntityManager.EventBus.RaiseEvent( - EventSource.Local, new MoveEvent(Owner, oldPos, Coordinates)); + var ev = new MoveEvent(Owner, oldPos, Coordinates); + EntitySystem.Get().DeferMoveEvent(ev); + rebuildMatrices = true; } @@ -873,6 +875,7 @@ namespace Robust.Shared.GameObjects.Components.Transform public IEntity Sender { get; } public EntityCoordinates OldPosition { get; } public EntityCoordinates NewPosition { get; } + public bool Handled { get; set; } } public class RotateEvent : EntitySystemMessage diff --git a/Robust.Shared/GameObjects/Systems/SharedTransformSystem.cs b/Robust.Shared/GameObjects/Systems/SharedTransformSystem.cs new file mode 100644 index 0000000000..b82b22afe7 --- /dev/null +++ b/Robust.Shared/GameObjects/Systems/SharedTransformSystem.cs @@ -0,0 +1,34 @@ +using System.Collections.Generic; +using System.Linq; +using Robust.Shared.GameObjects.Components.Map; +using Robust.Shared.GameObjects.Components.Transform; + +namespace Robust.Shared.GameObjects.Systems +{ + internal class SharedTransformSystem : EntitySystem + { + private readonly List _deferredMoveEvents = new(); + + public void DeferMoveEvent(MoveEvent moveEvent) + { + _deferredMoveEvents.Add(moveEvent); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + var events = _deferredMoveEvents + .OrderBy(e => e.Sender.HasComponent()) + .ToArray(); + + foreach (var ev in events) + { + ev.Sender.EntityManager.EventBus.RaiseEvent(EventSource.Local, ev); + ev.Handled = true; + } + + _deferredMoveEvents.RemoveAll(e => e.Handled); + } + } +} diff --git a/Robust.UnitTesting/Client/GameObjects/Components/Transform_Test.cs b/Robust.UnitTesting/Client/GameObjects/Components/Transform_Test.cs index aa2dd5a55e..7ba1e120ba 100644 --- a/Robust.UnitTesting/Client/GameObjects/Components/Transform_Test.cs +++ b/Robust.UnitTesting/Client/GameObjects/Components/Transform_Test.cs @@ -1,10 +1,10 @@ using System.IO; +using Moq; using NUnit.Framework; using Robust.Client.Interfaces.GameObjects; -using Robust.Shared.GameObjects; using Robust.Shared.GameObjects.Components.Transform; +using Robust.Shared.GameObjects.Systems; using Robust.Shared.Interfaces.GameObjects; -using Robust.Shared.Interfaces.GameObjects.Components; using Robust.Shared.Interfaces.Map; using Robust.Shared.IoC; using Robust.Shared.Map; @@ -35,6 +35,17 @@ namespace Robust.UnitTesting.Client.GameObjects.Components private MapId MapB; private IMapGrid GridB = default!; + protected override void OverrideIoC() + { + base.OverrideIoC(); + + var mock = new Mock(); + var system = new SharedTransformSystem(); + mock.Setup(m => m.GetEntitySystem()).Returns(system); + + IoCManager.RegisterInstance(mock.Object, true); + } + [OneTimeSetUp] public void Setup() {