Merge stable into master: Hotfix the randomly occurring DeleteAllThenGhost test failures (#33593)

This commit is contained in:
Myra
2024-11-27 09:05:31 +00:00
committed by GitHub

View File

@@ -2,7 +2,6 @@ using System.Diagnostics.CodeAnalysis;
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<MindRoleComponent, ComponentShutdown>(OnComponentShutdown);
}
private void SetRequirementOverride(string value)
@@ -209,7 +209,6 @@ public abstract class SharedRoleSystem : EntitySystem
}
antagonist |= roleComp.Antag | roleComp.ExclusiveAntag;
_entityManager.DeleteEntity(role);
delete.Add(role);
found = true;
}
@@ -219,7 +218,7 @@ public abstract class SharedRoleSystem : EntitySystem
foreach (var role in delete)
{
mind.Comp.MindRoles.Remove(role);
_entityManager.DeleteEntity(role);
}
if (mind.Comp.OwnedEntity != null)
@@ -235,6 +234,17 @@ public abstract class SharedRoleSystem : EntitySystem
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<MindRoleComponent> 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);
}
/// <summary>
/// Finds and removes all mind roles of a specific type
/// </summary>