]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
fix: make IdentityComp.IdentityEntitySlot optional (#39357)
authorPerry Fraser <perryprog@users.noreply.github.com>
Tue, 21 Oct 2025 15:33:59 +0000 (11:33 -0400)
committerGitHub <noreply@github.com>
Tue, 21 Oct 2025 15:33:59 +0000 (15:33 +0000)
* 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>
Content.Shared/IdentityManagement/Components/IdentityComponent.cs
Content.Shared/IdentityManagement/Identity.cs
Content.Shared/IdentityManagement/IdentitySystem.cs

index 86c07b307f33ce5e9d729a237860f81797379dd8..4646ccc835b07bb95668c2f951fe9127c1571347 100644 (file)
@@ -14,8 +14,12 @@ namespace Content.Shared.IdentityManagement.Components;
 [RegisterComponent, NetworkedComponent]
 public sealed partial class IdentityComponent : Component
 {
+    /// <summary>
+    /// The slot which carries around the entity representing the carrier's
+    /// perceived identity. May be null if the component is not initialized.
+    /// </summary>
     [ViewVariables]
-    public ContainerSlot IdentityEntitySlot = default!;
+    public ContainerSlot? IdentityEntitySlot;
 }
 
 /// <summary>
@@ -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;
index 836adfcdf851c3e0e17bd2df0a7b5d5d24709251..ac71194279a349c73533efff64fa00b154e5a89e 100644 (file)
@@ -13,7 +13,13 @@ public static class Identity
     /// <summary>
     ///     Returns the name that should be used for this entity for identity purposes.
     /// </summary>
-    public static string Name(EntityUid uid, IEntityManager ent, EntityUid? viewer=null)
+    /// <remarks>
+    /// 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.
+    /// </remarks>
+    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<IdentityComponent>(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
     /// <param name="viewer">
     ///     If this entity can see through identities, this method will always return the actual target entity.
     /// </param>
+    /// <inheritdoc cref="Name" path="remarks" />
     public static EntityUid Entity(EntityUid uid, IEntityManager ent, EntityUid? viewer = null)
     {
         if (!ent.TryGetComponent<IdentityComponent>(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)
index 7c559df629b7b8a42902d5a1015fb535d7e064b2..6b11085715c319b6334900deb56765d603f65f20 100644 (file)
@@ -78,11 +78,17 @@ public sealed class IdentitySystem : EntitySystem
     // Creates an identity entity, and store it in the identity container
     private void OnMapInit(Entity<IdentityComponent> 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<IdentityComponent> ent, ref ComponentInit args)
@@ -132,7 +138,7 @@ public sealed class IdentitySystem : EntitySystem
     /// </summary>
     private void UpdateIdentityInfo(Entity<IdentityComponent> ent)
     {
-        if (ent.Comp.IdentityEntitySlot.ContainedEntity is not { } ident)
+        if (ent.Comp.IdentityEntitySlot?.ContainedEntity is not { } ident)
             return;
 
         var representation = GetIdentityRepresentation(ent.Owner);