diff --git a/Content.Shared/Roles/SharedRoleSystem.cs b/Content.Shared/Roles/SharedRoleSystem.cs index 00271693abe..d5820ac0392 100644 --- a/Content.Shared/Roles/SharedRoleSystem.cs +++ b/Content.Shared/Roles/SharedRoleSystem.cs @@ -2,7 +2,6 @@ using Content.Shared.Administration.Logs; using Content.Shared.CCVar; using Content.Shared.Database; -using Content.Shared.GameTicking; using Content.Shared.Mind; using Content.Shared.Roles.Jobs; using Robust.Shared.Audio; @@ -20,7 +19,6 @@ public abstract class SharedRoleSystem : EntitySystem [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly IConfigurationManager _cfg = default!; [Dependency] private readonly IEntityManager _entityManager = default!; - [Dependency] private readonly SharedGameTicker _gameTicker = default!; [Dependency] private readonly IPrototypeManager _prototypes = default!; private JobRequirementOverridePrototype? _requirementOverride; @@ -28,6 +26,8 @@ public abstract class SharedRoleSystem : EntitySystem public override void Initialize() { Subs.CVar(_cfg, CCVars.GameRoleTimerOverride, SetRequirementOverride, true); + + SubscribeLocalEvent(OnComponentShutdown); } private void SetRequirementOverride(string value) @@ -209,7 +209,6 @@ public bool MindRemoveRole(Entity mind) where T : IComponent } antagonist |= roleComp.Antag | roleComp.ExclusiveAntag; - _entityManager.DeleteEntity(role); delete.Add(role); found = true; } @@ -219,7 +218,7 @@ public bool MindRemoveRole(Entity mind) where T : IComponent foreach (var role in delete) { - mind.Comp.MindRoles.Remove(role); + _entityManager.DeleteEntity(role); } if (mind.Comp.OwnedEntity != null) @@ -235,6 +234,17 @@ public bool MindRemoveRole(Entity mind) where T : IComponent return true; } + // Removing the mind role's reference on component shutdown + // to make sure the reference gets removed even if the mind role entity was deleted by outside code + private void OnComponentShutdown(Entity ent, ref ComponentShutdown args) + { + //TODO: Just ensure that the tests don't spawn unassociated mind role entities + if (ent.Comp.Mind.Comp is null) + return; + + ent.Comp.Mind.Comp.MindRoles.Remove(ent.Owner); + } + /// /// Finds and removes all mind roles of a specific type ///