From 17dd3af3c7d3ce91d974325d2bf69e79736d1a2d Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sat, 14 May 2022 14:55:42 +1000 Subject: [PATCH] ECS metadata pausing (#2800) --- Robust.Server/Maps/MapLoader.cs | 5 +- .../Components/MetaDataComponent.cs | 3 +- .../Transform/TransformComponent.cs | 19 +++--- .../GameObjects/EntitySystem.Proxy.cs | 2 +- .../GameObjects/Systems/MetaDataSystem.cs | 10 +++ Robust.Shared/Map/MapManager.Pause.cs | 23 ++++--- Robust.UnitTesting/RobustUnitTest.cs | 1 + .../GameObjects/Components/Transform_Test.cs | 62 +++++++++---------- .../Server/RobustServerSimulation.cs | 1 + 9 files changed, 74 insertions(+), 52 deletions(-) diff --git a/Robust.Server/Maps/MapLoader.cs b/Robust.Server/Maps/MapLoader.cs index 45ab5eb78..b5f84d230 100644 --- a/Robust.Server/Maps/MapLoader.cs +++ b/Robust.Server/Maps/MapLoader.cs @@ -118,6 +118,7 @@ namespace Robust.Server.Maps { var isPaused = _mapManager.IsMapPaused(mapId); var query = _serverEntityManager.GetEntityQuery(); + var metaSystem = _serverEntityManager.EntitySysManager.GetEntitySystem(); if (context.MapIsPostInit) { @@ -133,7 +134,7 @@ namespace Robust.Server.Maps var meta = query.GetComponent(entity); _serverEntityManager.RunMapInit(entity, meta); if (isPaused) - meta.EntityPaused = true; + metaSystem.SetEntityPaused(entity, true, meta); } } else if (isPaused) @@ -141,7 +142,7 @@ namespace Robust.Server.Maps foreach (var entity in context.Entities) { var meta = query.GetComponent(entity); - meta.EntityPaused = true; + metaSystem.SetEntityPaused(entity, true, meta); } } } diff --git a/Robust.Shared/GameObjects/Components/MetaDataComponent.cs b/Robust.Shared/GameObjects/Components/MetaDataComponent.cs index daf68f154..fd4060d71 100644 --- a/Robust.Shared/GameObjects/Components/MetaDataComponent.cs +++ b/Robust.Shared/GameObjects/Components/MetaDataComponent.cs @@ -53,7 +53,7 @@ namespace Robust.Shared.GameObjects [DataField("name")] internal string? _entityName; [DataField("desc")] internal string? _entityDescription; internal EntityPrototype? _entityPrototype; - private bool _entityPaused; + internal bool _entityPaused; // Every entity starts at tick 1, because they are conceptually created in the time between 0->1 [ViewVariables] @@ -146,6 +146,7 @@ namespace Robust.Shared.GameObjects public bool EntityPaused { get => _entityPaused; + [Obsolete("Call MetaDataSystem to change this.")] set { if (_entityPaused == value) diff --git a/Robust.Shared/GameObjects/Components/Transform/TransformComponent.cs b/Robust.Shared/GameObjects/Components/Transform/TransformComponent.cs index 82446b574..949b703ba 100644 --- a/Robust.Shared/GameObjects/Components/Transform/TransformComponent.cs +++ b/Robust.Shared/GameObjects/Components/Transform/TransformComponent.cs @@ -683,19 +683,23 @@ namespace Robust.Shared.GameObjects if (newMapId == MapID) return; - var oldMapId = MapID; - //Set Paused state var mapPaused = _mapManager.IsMapPaused(newMapId); var metaEnts = _entMan.GetEntityQuery(); var metaData = metaEnts.GetComponent(Owner); - metaData.EntityPaused = mapPaused; + var metaSystem = _entMan.EntitySysManager.GetEntitySystem(); + metaSystem.SetEntityPaused(Owner, mapPaused, metaData); MapID = newMapId; - UpdateChildMapIdsRecursive(MapID, mapPaused, xformQuery, metaEnts); + UpdateChildMapIdsRecursive(MapID, mapPaused, xformQuery, metaEnts, metaSystem); } - private void UpdateChildMapIdsRecursive(MapId newMapId, bool mapPaused, EntityQuery xformQuery, EntityQuery metaQuery) + private void UpdateChildMapIdsRecursive( + MapId newMapId, + bool mapPaused, + EntityQuery xformQuery, + EntityQuery metaQuery, + MetaDataSystem system) { var childEnumerator = ChildEnumerator; @@ -703,16 +707,15 @@ namespace Robust.Shared.GameObjects { //Set Paused state var metaData = metaQuery.GetComponent(child.Value); - metaData.EntityPaused = mapPaused; + system.SetEntityPaused(child.Value, mapPaused, metaData); var concrete = xformQuery.GetComponent(child.Value); - var old = concrete.MapID; concrete.MapID = newMapId; if (concrete.ChildCount != 0) { - concrete.UpdateChildMapIdsRecursive(newMapId, mapPaused, xformQuery, metaQuery); + concrete.UpdateChildMapIdsRecursive(newMapId, mapPaused, xformQuery, metaQuery, system); } } } diff --git a/Robust.Shared/GameObjects/EntitySystem.Proxy.cs b/Robust.Shared/GameObjects/EntitySystem.Proxy.cs index aac67a674..07795c345 100644 --- a/Robust.Shared/GameObjects/EntitySystem.Proxy.cs +++ b/Robust.Shared/GameObjects/EntitySystem.Proxy.cs @@ -249,7 +249,7 @@ public partial class EntitySystem if (!Resolve(uid, ref metaData, false)) throw CompNotFound(uid); - metaData.EntityPaused = paused; + EntityManager.EntitySysManager.GetEntitySystem().SetEntityPaused(uid, paused, metaData); } /// diff --git a/Robust.Shared/GameObjects/Systems/MetaDataSystem.cs b/Robust.Shared/GameObjects/Systems/MetaDataSystem.cs index 7dcb5bedb..bca91d8e2 100644 --- a/Robust.Shared/GameObjects/Systems/MetaDataSystem.cs +++ b/Robust.Shared/GameObjects/Systems/MetaDataSystem.cs @@ -31,6 +31,16 @@ public sealed class MetaDataSystem : EntitySystem component._entityPrototype = _proto.Index(state.PrototypeId); } + public void SetEntityPaused(EntityUid uid, bool value, MetaDataComponent? metadata = null) + { + if (!Resolve(uid, ref metadata)) return; + + if (metadata._entityPaused == value) return; + + metadata._entityPaused = value; + RaiseLocalEvent(uid, new EntityPausedEvent(uid, value)); + } + public void AddFlag(EntityUid uid, MetaDataFlags flags, MetaDataComponent? component = null) { if (!Resolve(uid, ref component)) return; diff --git a/Robust.Shared/Map/MapManager.Pause.cs b/Robust.Shared/Map/MapManager.Pause.cs index 9c159eba8..adb691023 100644 --- a/Robust.Shared/Map/MapManager.Pause.cs +++ b/Robust.Shared/Map/MapManager.Pause.cs @@ -29,19 +29,22 @@ namespace Robust.Shared.Map var mapEnt = GetMapEntityId(mapId); var xformQuery = EntityManager.GetEntityQuery(); var metaQuery = EntityManager.GetEntityQuery(); + var metaSystem = EntityManager.EntitySysManager.GetEntitySystem(); - RecursiveSetPaused(mapEnt, paused, in xformQuery, in metaQuery); + RecursiveSetPaused(mapEnt, paused, in xformQuery, in metaQuery, in metaSystem); } private static void RecursiveSetPaused(EntityUid entity, bool paused, in EntityQuery xformQuery, - in EntityQuery metaQuery) + in EntityQuery metaQuery, + in MetaDataSystem system) { - metaQuery.GetComponent(entity).EntityPaused = paused; + system.SetEntityPaused(entity, paused, metaQuery.GetComponent(entity)); + var childEnumerator = xformQuery.GetComponent(entity).ChildEnumerator; - foreach (var child in xformQuery.GetComponent(entity)._children) + while (childEnumerator.MoveNext(out var child)) { - RecursiveSetPaused(child, paused, in xformQuery, in metaQuery); + RecursiveSetPaused(child.Value, paused, in xformQuery, in metaQuery, in system); } } @@ -58,16 +61,18 @@ namespace Robust.Shared.Map var mapComp = EntityManager.GetComponent(mapEnt); var xformQuery = EntityManager.GetEntityQuery(); var metaQuery = EntityManager.GetEntityQuery(); + var metaSystem = EntityManager.EntitySysManager.GetEntitySystem(); mapComp.MapPreInit = false; mapComp.MapPaused = false; - RecursiveDoMapInit(mapEnt, in xformQuery, in metaQuery); + RecursiveDoMapInit(mapEnt, in xformQuery, in metaQuery, in metaSystem); } private void RecursiveDoMapInit(EntityUid entity, in EntityQuery xformQuery, - in EntityQuery metaQuery) + in EntityQuery metaQuery, + in MetaDataSystem system) { // RunMapInit can modify the TransformTree // ToArray caches deleted euids, we check here if they still exist. @@ -75,11 +80,11 @@ namespace Robust.Shared.Map return; EntityManager.RunMapInit(entity, meta); - meta.EntityPaused = false; + system.SetEntityPaused(entity, false, meta); foreach (var child in xformQuery.GetComponent(entity)._children.ToArray()) { - RecursiveDoMapInit(child, in xformQuery, in metaQuery); + RecursiveDoMapInit(child, in xformQuery, in metaQuery, in system); } } diff --git a/Robust.UnitTesting/RobustUnitTest.cs b/Robust.UnitTesting/RobustUnitTest.cs index 6b3eeb75e..f255b5647 100644 --- a/Robust.UnitTesting/RobustUnitTest.cs +++ b/Robust.UnitTesting/RobustUnitTest.cs @@ -79,6 +79,7 @@ namespace Robust.UnitTesting systems.LoadExtraSystemType(); systems.LoadExtraSystemType(); systems.LoadExtraSystemType(); + systems.LoadExtraSystemType(); var entMan = IoCManager.Resolve(); var mapMan = IoCManager.Resolve(); diff --git a/Robust.UnitTesting/Server/GameObjects/Components/Transform_Test.cs b/Robust.UnitTesting/Server/GameObjects/Components/Transform_Test.cs index 92eb16c22..9f1aacfdd 100644 --- a/Robust.UnitTesting/Server/GameObjects/Components/Transform_Test.cs +++ b/Robust.UnitTesting/Server/GameObjects/Components/Transform_Test.cs @@ -90,8 +90,8 @@ namespace Robust.UnitTesting.Server.GameObjects.Components var parent = EntityManager.SpawnEntity("dummy", InitialPos); var child = EntityManager.SpawnEntity("dummy", InitialPos); - var parentTrans = IoCManager.Resolve().GetComponent(parent); - var childTrans = IoCManager.Resolve().GetComponent(child); + var parentTrans = EntityManager.GetComponent(parent); + var childTrans = EntityManager.GetComponent(child); // that are not on the same map parentTrans.Coordinates = new EntityCoordinates(GridA.GridEntityId, (5, 5)); @@ -139,8 +139,8 @@ namespace Robust.UnitTesting.Server.GameObjects.Components // Arrange var parent = EntityManager.SpawnEntity("dummy", InitialPos); var child = EntityManager.SpawnEntity("dummy", InitialPos); - var parentTrans = IoCManager.Resolve().GetComponent(parent); - var childTrans = IoCManager.Resolve().GetComponent(child); + var parentTrans = EntityManager.GetComponent(parent); + var childTrans = EntityManager.GetComponent(child); parentTrans.WorldPosition = new Vector2(5, 5); childTrans.WorldPosition = new Vector2(6, 6); @@ -163,9 +163,9 @@ namespace Robust.UnitTesting.Server.GameObjects.Components var parent = EntityManager.SpawnEntity("dummy", InitialPos); var childOne = EntityManager.SpawnEntity("dummy", InitialPos); var childTwo = EntityManager.SpawnEntity("dummy", InitialPos); - var parentTrans = IoCManager.Resolve().GetComponent(parent); - var childOneTrans = IoCManager.Resolve().GetComponent(childOne); - var childTwoTrans = IoCManager.Resolve().GetComponent(childTwo); + var parentTrans = EntityManager.GetComponent(parent); + var childOneTrans = EntityManager.GetComponent(childOne); + var childTwoTrans = EntityManager.GetComponent(childTwo); parentTrans.WorldPosition = new Vector2(1, 1); childOneTrans.WorldPosition = new Vector2(2, 2); childTwoTrans.WorldPosition = new Vector2(3, 3); @@ -196,8 +196,8 @@ namespace Robust.UnitTesting.Server.GameObjects.Components // Arrange var parent = EntityManager.SpawnEntity("dummy", InitialPos); var child = EntityManager.SpawnEntity("dummy", InitialPos); - var parentTrans = IoCManager.Resolve().GetComponent(parent); - var childTrans = IoCManager.Resolve().GetComponent(child); + var parentTrans = EntityManager.GetComponent(parent); + var childTrans = EntityManager.GetComponent(child); parentTrans.WorldPosition = new Vector2(0, 0); childTrans.WorldPosition = new Vector2(2, 0); childTrans.AttachParent(parentTrans); @@ -223,8 +223,8 @@ namespace Robust.UnitTesting.Server.GameObjects.Components // Arrange var parent = EntityManager.SpawnEntity("dummy", InitialPos); var child = EntityManager.SpawnEntity("dummy", InitialPos); - var parentTrans = IoCManager.Resolve().GetComponent(parent); - var childTrans = IoCManager.Resolve().GetComponent(child); + var parentTrans = EntityManager.GetComponent(parent); + var childTrans = EntityManager.GetComponent(child); parentTrans.WorldPosition = new Vector2(1, 1); childTrans.WorldPosition = new Vector2(2, 1); childTrans.AttachParent(parentTrans); @@ -253,10 +253,10 @@ namespace Robust.UnitTesting.Server.GameObjects.Components var node3 = EntityManager.SpawnEntity("dummy", InitialPos); var node4 = EntityManager.SpawnEntity("dummy", InitialPos); - var node1Trans = IoCManager.Resolve().GetComponent(node1); - var node2Trans = IoCManager.Resolve().GetComponent(node2); - var node3Trans = IoCManager.Resolve().GetComponent(node3); - var node4Trans = IoCManager.Resolve().GetComponent(node4); + var node1Trans = EntityManager.GetComponent(node1); + var node2Trans = EntityManager.GetComponent(node2); + var node3Trans = EntityManager.GetComponent(node3); + var node4Trans = EntityManager.GetComponent(node4); node1Trans.WorldPosition = new Vector2(0, 0); node2Trans.WorldPosition = new Vector2(1, 1); @@ -291,9 +291,9 @@ namespace Robust.UnitTesting.Server.GameObjects.Components var node2 = EntityManager.SpawnEntity("dummy", InitialPos); var node3 = EntityManager.SpawnEntity("dummy", InitialPos); - var node1Trans = IoCManager.Resolve().GetComponent(node1); - var node2Trans = IoCManager.Resolve().GetComponent(node2); - var node3Trans = IoCManager.Resolve().GetComponent(node3); + var node1Trans = EntityManager.GetComponent(node1); + var node2Trans = EntityManager.GetComponent(node2); + var node3Trans = EntityManager.GetComponent(node3); node1Trans.WorldPosition = new Vector2(0, 0); node2Trans.WorldPosition = new Vector2(1, 1); @@ -336,9 +336,9 @@ namespace Robust.UnitTesting.Server.GameObjects.Components var node2 = EntityManager.SpawnEntity("dummy", InitialPos); var node3 = EntityManager.SpawnEntity("dummy", InitialPos); - var node1Trans = IoCManager.Resolve().GetComponent(node1); - var node2Trans = IoCManager.Resolve().GetComponent(node2); - var node3Trans = IoCManager.Resolve().GetComponent(node3); + var node1Trans = EntityManager.GetComponent(node1); + var node2Trans = EntityManager.GetComponent(node2); + var node3Trans = EntityManager.GetComponent(node3); node1Trans.WorldPosition = new Vector2(0, 0); node2Trans.WorldPosition = new Vector2(1, 1); @@ -384,10 +384,10 @@ namespace Robust.UnitTesting.Server.GameObjects.Components var node3 = EntityManager.SpawnEntity("dummy", InitialPos); var node4 = EntityManager.SpawnEntity("dummy", InitialPos); - var node1Trans = IoCManager.Resolve().GetComponent(node1); - var node2Trans = IoCManager.Resolve().GetComponent(node2); - var node3Trans = IoCManager.Resolve().GetComponent(node3); - var node4Trans = IoCManager.Resolve().GetComponent(node4); + var node1Trans = EntityManager.GetComponent(node1); + var node2Trans = EntityManager.GetComponent(node2); + var node3Trans = EntityManager.GetComponent(node3); + var node4Trans = EntityManager.GetComponent(node4); node1Trans.WorldPosition = new Vector2(0, 0); node2Trans.WorldPosition = new Vector2(1, 1); @@ -431,9 +431,9 @@ namespace Robust.UnitTesting.Server.GameObjects.Components var node2 = EntityManager.SpawnEntity("dummy", InitialPos); var node3 = EntityManager.SpawnEntity("dummy", InitialPos); - var node1Trans = IoCManager.Resolve().GetComponent(node1); - var node2Trans = IoCManager.Resolve().GetComponent(node2); - var node3Trans = IoCManager.Resolve().GetComponent(node3); + var node1Trans = EntityManager.GetComponent(node1); + var node2Trans = EntityManager.GetComponent(node2); + var node3Trans = EntityManager.GetComponent(node3); node2Trans.AttachParent(node1Trans); node3Trans.AttachParent(node2Trans); @@ -460,9 +460,9 @@ namespace Robust.UnitTesting.Server.GameObjects.Components var node2 = EntityManager.SpawnEntity("dummy", InitialPos); var node3 = EntityManager.SpawnEntity("dummy", InitialPos); - var node1Trans = IoCManager.Resolve().GetComponent(node1); - var node2Trans = IoCManager.Resolve().GetComponent(node2); - var node3Trans = IoCManager.Resolve().GetComponent(node3); + var node1Trans = EntityManager.GetComponent(node1); + var node2Trans = EntityManager.GetComponent(node2); + var node3Trans = EntityManager.GetComponent(node3); node2Trans.AttachParent(node1Trans); node3Trans.AttachParent(node2Trans); diff --git a/Robust.UnitTesting/Server/RobustServerSimulation.cs b/Robust.UnitTesting/Server/RobustServerSimulation.cs index 0d7578f91..06aeecfe1 100644 --- a/Robust.UnitTesting/Server/RobustServerSimulation.cs +++ b/Robust.UnitTesting/Server/RobustServerSimulation.cs @@ -257,6 +257,7 @@ namespace Robust.UnitTesting.Server entitySystemMan.LoadExtraSystemType(); entitySystemMan.LoadExtraSystemType(); entitySystemMan.LoadExtraSystemType(); + entitySystemMan.LoadExtraSystemType(); _systemDelegate?.Invoke(entitySystemMan);