From 684cabf3e617130169be04b84e53a7980127c72e Mon Sep 17 00:00:00 2001 From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Mon, 9 Oct 2023 19:07:31 +1100 Subject: [PATCH] Use metadata query in ToPrettyString() (#4478) --- .../GameObjects/ClientEntityManager.cs | 8 ++--- .../GameObjects/ServerEntityManager.cs | 18 ++++++----- Robust.Shared/GameObjects/EntityManager.cs | 32 +++++++++---------- .../GameObjects/EntitySystem.Proxy.cs | 13 +++++--- .../GameObjects/IEntityManager.Components.cs | 2 +- Robust.Shared/GameObjects/IEntityManager.cs | 4 +-- Robust.UnitTesting/RobustUnitTest.cs | 6 ++++ .../Server/Maps/MapLoaderTest.cs | 1 - 8 files changed, 45 insertions(+), 39 deletions(-) diff --git a/Robust.Client/GameObjects/ClientEntityManager.cs b/Robust.Client/GameObjects/ClientEntityManager.cs index 0cfae26da..64b457d8b 100644 --- a/Robust.Client/GameObjects/ClientEntityManager.cs +++ b/Robust.Client/GameObjects/ClientEntityManager.cs @@ -93,14 +93,10 @@ namespace Robust.Client.GameObjects base.Dirty(uid, component, meta); } - [return: NotNullIfNotNull("uid")] - public override EntityStringRepresentation? ToPrettyString(EntityUid? uid) + public override EntityStringRepresentation ToPrettyString(EntityUid uid, MetaDataComponent? metaDataComponent = null) { - if (uid == null) - return null; - if (_playerManager.LocalPlayer?.ControlledEntity == uid) - return base.ToPrettyString(uid).Value with { Session = _playerManager.LocalPlayer.Session }; + return base.ToPrettyString(uid) with { Session = _playerManager.LocalPlayer.Session }; return base.ToPrettyString(uid); } diff --git a/Robust.Server/GameObjects/ServerEntityManager.cs b/Robust.Server/GameObjects/ServerEntityManager.cs index 90edd629b..52a7f3843 100644 --- a/Robust.Server/GameObjects/ServerEntityManager.cs +++ b/Robust.Server/GameObjects/ServerEntityManager.cs @@ -42,6 +42,7 @@ namespace Robust.Server.GameObjects #endif private ISawmill _netEntSawmill = default!; + private EntityQuery _actorQuery; public override void Initialize() { @@ -53,6 +54,12 @@ namespace Robust.Server.GameObjects base.Initialize(); } + public override void Startup() + { + base.Startup(); + _actorQuery = GetEntityQuery(); + } + EntityUid IServerEntityManagerInternal.AllocEntity(EntityPrototype? prototype) { return AllocEntity(prototype, out _); @@ -109,15 +116,10 @@ namespace Robust.Server.GameObjects } } - [return: NotNullIfNotNull("uid")] - public override EntityStringRepresentation? ToPrettyString(EntityUid? uid) + public override EntityStringRepresentation ToPrettyString(EntityUid uid, MetaDataComponent? metadata = null) { - if (uid == null) - return null; - - TryGetComponent(uid, out ActorComponent? actor); - - return base.ToPrettyString(uid).Value with { Session = actor?.PlayerSession }; + _actorQuery.TryGetComponent(uid, out ActorComponent? actor); + return base.ToPrettyString(uid) with { Session = actor?.PlayerSession }; } #region IEntityNetworkManager impl diff --git a/Robust.Shared/GameObjects/EntityManager.cs b/Robust.Shared/GameObjects/EntityManager.cs index 70da74cd3..f3b7ecbbb 100644 --- a/Robust.Shared/GameObjects/EntityManager.cs +++ b/Robust.Shared/GameObjects/EntityManager.cs @@ -751,36 +751,34 @@ namespace Robust.Shared.GameObjects /// [return: NotNullIfNotNull("uid")] - public virtual EntityStringRepresentation? ToPrettyString(EntityUid? uid) + public EntityStringRepresentation? ToPrettyString(EntityUid? uid, MetaDataComponent? metadata = null) { - // We want to retrieve the MetaData component even if it is deleted. - if (uid == null) - return null; + return uid == null ? null : ToPrettyString(uid.Value, metadata); + } - if (!_entTraitArray[CompIdx.ArrayIndex()].TryGetValue(uid.Value, out var component)) - return new EntityStringRepresentation(uid.Value, true); + /// + public virtual EntityStringRepresentation ToPrettyString(EntityUid uid, MetaDataComponent? metadata = null) + { + if (!MetaQuery.Resolve(uid, ref metadata, false)) + return new EntityStringRepresentation(uid, true); - var metadata = (MetaDataComponent) component; - - return ToPrettyString(uid.Value, metadata); + return new EntityStringRepresentation(uid, metadata.EntityDeleted, metadata.EntityName, metadata.EntityPrototype?.ID); } /// [return: NotNullIfNotNull("netEntity")] public EntityStringRepresentation? ToPrettyString(NetEntity? netEntity) { - return ToPrettyString(GetEntity(netEntity)); + return netEntity == null ? null : ToPrettyString(netEntity.Value); } - public EntityStringRepresentation ToPrettyString(EntityUid uid) - => ToPrettyString((EntityUid?) uid).Value; - + /// public EntityStringRepresentation ToPrettyString(NetEntity netEntity) - => ToPrettyString((NetEntity?) netEntity).Value; - - private EntityStringRepresentation ToPrettyString(EntityUid uid, MetaDataComponent metadata) { - return new EntityStringRepresentation(uid, metadata.EntityDeleted, metadata.EntityName, metadata.EntityPrototype?.ID); + if (!TryGetEntityData(netEntity, out var uid, out var meta)) + return new EntityStringRepresentation(EntityUid.Invalid, true); + + return ToPrettyString(uid.Value, meta); } #endregion Entity Management diff --git a/Robust.Shared/GameObjects/EntitySystem.Proxy.cs b/Robust.Shared/GameObjects/EntitySystem.Proxy.cs index 8f58a8b26..009de712f 100644 --- a/Robust.Shared/GameObjects/EntitySystem.Proxy.cs +++ b/Robust.Shared/GameObjects/EntitySystem.Proxy.cs @@ -399,9 +399,9 @@ public partial class EntitySystem /// [MethodImpl(MethodImplOptions.AggressiveInlining)] [return: NotNullIfNotNull("uid")] - protected EntityStringRepresentation? ToPrettyString(EntityUid? uid) + protected EntityStringRepresentation? ToPrettyString(EntityUid? uid, MetaDataComponent? metadata = null) { - return EntityManager.ToPrettyString(uid); + return EntityManager.ToPrettyString(uid, metadata); } /// @@ -412,15 +412,20 @@ public partial class EntitySystem return EntityManager.ToPrettyString(netEntity); } + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + protected EntityStringRepresentation ToPrettyString(EntityUid uid, MetaDataComponent? metadata) + => EntityManager.ToPrettyString(uid, metadata); + /// [MethodImpl(MethodImplOptions.AggressiveInlining)] protected EntityStringRepresentation ToPrettyString(EntityUid uid) - => ToPrettyString((EntityUid?) uid).Value; + => EntityManager.ToPrettyString(uid); /// [MethodImpl(MethodImplOptions.AggressiveInlining)] protected EntityStringRepresentation ToPrettyString(NetEntity netEntity) - => ToPrettyString((NetEntity?) netEntity).Value; + => EntityManager.ToPrettyString(netEntity); #endregion diff --git a/Robust.Shared/GameObjects/IEntityManager.Components.cs b/Robust.Shared/GameObjects/IEntityManager.Components.cs index 527f3988e..92432937b 100644 --- a/Robust.Shared/GameObjects/IEntityManager.Components.cs +++ b/Robust.Shared/GameObjects/IEntityManager.Components.cs @@ -221,7 +221,7 @@ namespace Robust.Shared.GameObjects /// Entity to modify. /// The output component after being ensured. /// Component to add. - /// The component in question + /// True if the component already existed bool EnsureComponent(EntityUid uid, out T component) where T : Component, new(); /// diff --git a/Robust.Shared/GameObjects/IEntityManager.cs b/Robust.Shared/GameObjects/IEntityManager.cs index 96515b565..3d8a0942e 100644 --- a/Robust.Shared/GameObjects/IEntityManager.cs +++ b/Robust.Shared/GameObjects/IEntityManager.cs @@ -127,7 +127,7 @@ namespace Robust.Shared.GameObjects /// /// Returns a string representation of an entity with various information regarding it. /// - EntityStringRepresentation ToPrettyString(EntityUid uid); + EntityStringRepresentation ToPrettyString(EntityUid uid, MetaDataComponent? metadata = null); /// /// Returns a string representation of an entity with various information regarding it. @@ -138,7 +138,7 @@ namespace Robust.Shared.GameObjects /// Returns a string representation of an entity with various information regarding it. /// [return: NotNullIfNotNull("uid")] - EntityStringRepresentation? ToPrettyString(EntityUid? uid); + EntityStringRepresentation? ToPrettyString(EntityUid? uid, MetaDataComponent? metadata = null); /// /// Returns a string representation of an entity with various information regarding it. diff --git a/Robust.UnitTesting/RobustUnitTest.cs b/Robust.UnitTesting/RobustUnitTest.cs index 9dddfbb40..6066f4f5b 100644 --- a/Robust.UnitTesting/RobustUnitTest.cs +++ b/Robust.UnitTesting/RobustUnitTest.cs @@ -128,6 +128,7 @@ namespace Robust.UnitTesting // Required components for the engine to work // Why are we still here? Just to suffer? Why can't we just use [RegisterComponent] magic? + // TODO End Suffering. var compFactory = deps.Resolve(); if (!compFactory.AllRegisteredTypes.Contains(typeof(EyeComponent))) @@ -225,6 +226,11 @@ namespace Robust.UnitTesting compFactory.RegisterClass(); } + if (!compFactory.AllRegisteredTypes.Contains(typeof(ActorComponent))) + { + compFactory.RegisterClass(); + } + // So by default EntityManager does its own EntitySystemManager initialize during Startup. // We want to bypass this and load our own systems hence we will manually initialize it here. entMan.Initialize(); diff --git a/Robust.UnitTesting/Server/Maps/MapLoaderTest.cs b/Robust.UnitTesting/Server/Maps/MapLoaderTest.cs index 6a1478587..9c7f6f946 100644 --- a/Robust.UnitTesting/Server/Maps/MapLoaderTest.cs +++ b/Robust.UnitTesting/Server/Maps/MapLoaderTest.cs @@ -61,7 +61,6 @@ entities: var compFactory = IoCManager.Resolve(); compFactory.RegisterClass(); compFactory.RegisterClass(); - compFactory.RegisterClass(); compFactory.RegisterClass(); compFactory.GenerateNetIds(); IoCManager.Resolve().Initialize();