From 5a0a984aa8f278f602cd5689d3eaf6f6cfb3f30c Mon Sep 17 00:00:00 2001 From: Perry Fraser Date: Tue, 21 Oct 2025 11:33:59 -0400 Subject: [PATCH] fix: make IdentityComp.IdentityEntitySlot optional (#39357) * fix: make IdentityComp.IdentityEntitySlot optional * Revert "fix: make IdentityComp.IdentityEntitySlot optional" This reverts commit fa25263be916ed142bf2cff9871fca3e64c6da2b. * fix conflicts --------- Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --- .../Components/IdentityComponent.cs | 8 ++++++-- Content.Shared/IdentityManagement/Identity.cs | 13 ++++++++++--- Content.Shared/IdentityManagement/IdentitySystem.cs | 10 ++++++++-- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/Content.Shared/IdentityManagement/Components/IdentityComponent.cs b/Content.Shared/IdentityManagement/Components/IdentityComponent.cs index 86c07b307f..4646ccc835 100644 --- a/Content.Shared/IdentityManagement/Components/IdentityComponent.cs +++ b/Content.Shared/IdentityManagement/Components/IdentityComponent.cs @@ -14,8 +14,12 @@ namespace Content.Shared.IdentityManagement.Components; [RegisterComponent, NetworkedComponent] public sealed partial class IdentityComponent : Component { + /// + /// The slot which carries around the entity representing the carrier's + /// perceived identity. May be null if the component is not initialized. + /// [ViewVariables] - public ContainerSlot IdentityEntitySlot = default!; + public ContainerSlot? IdentityEntitySlot; } /// @@ -32,7 +36,7 @@ public sealed class IdentityRepresentation public string? PresumedName; public string? PresumedJob; - public IdentityRepresentation(string trueName, Gender trueGender, string ageString, string? presumedName=null, string? presumedJob=null) + public IdentityRepresentation(string trueName, Gender trueGender, string ageString, string? presumedName = null, string? presumedJob = null) { TrueName = trueName; TrueGender = trueGender; diff --git a/Content.Shared/IdentityManagement/Identity.cs b/Content.Shared/IdentityManagement/Identity.cs index 836adfcdf8..ac71194279 100644 --- a/Content.Shared/IdentityManagement/Identity.cs +++ b/Content.Shared/IdentityManagement/Identity.cs @@ -13,7 +13,13 @@ public static class Identity /// /// Returns the name that should be used for this entity for identity purposes. /// - public static string Name(EntityUid uid, IEntityManager ent, EntityUid? viewer=null) + /// + /// This will return the true identity of the entity if called before the + /// identity component has been initialized — this may occur for example if + /// the client raises an event in response to an entity entering PVS for + /// the first time. + /// + public static string Name(EntityUid uid, IEntityManager ent, EntityUid? viewer = null) { if (!uid.IsValid()) return string.Empty; @@ -27,7 +33,7 @@ public static class Identity if (!ent.TryGetComponent(uid, out var identity)) return uidName; - var ident = identity.IdentityEntitySlot.ContainedEntity; + var ident = identity.IdentityEntitySlot?.ContainedEntity; if (ident is null) return uidName; @@ -52,6 +58,7 @@ public static class Identity /// /// If this entity can see through identities, this method will always return the actual target entity. /// + /// public static EntityUid Entity(EntityUid uid, IEntityManager ent, EntityUid? viewer = null) { if (!ent.TryGetComponent(uid, out var identity)) @@ -60,7 +67,7 @@ public static class Identity if (viewer != null && CanSeeThroughIdentity(uid, viewer.Value, ent)) return uid; - return identity.IdentityEntitySlot.ContainedEntity ?? uid; + return identity.IdentityEntitySlot?.ContainedEntity ?? uid; } public static bool CanSeeThroughIdentity(EntityUid uid, EntityUid viewer, IEntityManager ent) diff --git a/Content.Shared/IdentityManagement/IdentitySystem.cs b/Content.Shared/IdentityManagement/IdentitySystem.cs index 7c559df629..6b11085715 100644 --- a/Content.Shared/IdentityManagement/IdentitySystem.cs +++ b/Content.Shared/IdentityManagement/IdentitySystem.cs @@ -78,11 +78,17 @@ public sealed class IdentitySystem : EntitySystem // Creates an identity entity, and store it in the identity container private void OnMapInit(Entity ent, ref MapInitEvent args) { + if (ent.Comp.IdentityEntitySlot is not { } slot) + { + Log.Error($"Uninitialized IdentityEntitySlot for {ToPrettyString(ent.Owner)}."); + return; + } + var ident = Spawn(null, Transform(ent).Coordinates); _metaData.SetEntityName(ident, "identity"); QueueIdentityUpdate(ent); - _container.Insert(ident, ent.Comp.IdentityEntitySlot); + _container.Insert(ident, slot); } private void OnComponentInit(Entity ent, ref ComponentInit args) @@ -132,7 +138,7 @@ public sealed class IdentitySystem : EntitySystem /// private void UpdateIdentityInfo(Entity ent) { - if (ent.Comp.IdentityEntitySlot.ContainedEntity is not { } ident) + if (ent.Comp.IdentityEntitySlot?.ContainedEntity is not { } ident) return; var representation = GetIdentityRepresentation(ent.Owner);