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);