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