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