Fixes a borg error that was causing random test failures (#20297)

This commit is contained in:
Leon Friedrich
2023-09-18 13:06:56 +12:00
committed by GitHub
parent fefc2ea245
commit df3ff0cee4

View File

@@ -3,6 +3,7 @@ using Content.Shared.Hands.Components;
using Content.Shared.Interaction.Components; using Content.Shared.Interaction.Components;
using Content.Shared.Silicons.Borgs.Components; using Content.Shared.Silicons.Borgs.Components;
using Robust.Shared.Containers; using Robust.Shared.Containers;
using Robust.Shared.Utility;
namespace Content.Server.Silicons.Borgs; namespace Content.Server.Silicons.Borgs;
@@ -65,14 +66,22 @@ public sealed partial class BorgSystem
Dirty(component.ModuleSwapActionEntity!.Value, action); Dirty(component.ModuleSwapActionEntity!.Value, action);
} }
SelectModule(chassis, uid, moduleComp: component); if (!TryComp(chassis, out BorgChassisComponent? chassisComp))
return;
if (chassisComp.SelectedModule == null)
SelectModule(chassis, uid, chassisComp, component);
} }
private void OnSelectableUninstalled(EntityUid uid, SelectableBorgModuleComponent component, ref BorgModuleUninstalledEvent args) private void OnSelectableUninstalled(EntityUid uid, SelectableBorgModuleComponent component, ref BorgModuleUninstalledEvent args)
{ {
var chassis = args.ChassisEnt; var chassis = args.ChassisEnt;
_actions.RemoveProvidedActions(chassis, uid); _actions.RemoveProvidedActions(chassis, uid);
UnselectModule(chassis, uid, moduleComp: component); if (!TryComp(chassis, out BorgChassisComponent? chassisComp))
return;
if (chassisComp.SelectedModule == uid)
UnselectModule(chassis, chassisComp);
} }
private void OnSelectableAction(EntityUid uid, SelectableBorgModuleComponent component, BorgModuleActionSelectedEvent args) private void OnSelectableAction(EntityUid uid, SelectableBorgModuleComponent component, BorgModuleActionSelectedEvent args)
@@ -81,16 +90,14 @@ public sealed partial class BorgSystem
if (!TryComp<BorgChassisComponent>(chassis, out var chassisComp)) if (!TryComp<BorgChassisComponent>(chassis, out var chassisComp))
return; return;
args.Handled = true;
if (chassisComp.SelectedModule == uid) if (chassisComp.SelectedModule == uid)
{ {
UnselectModule(chassis, chassisComp.SelectedModule, chassisComp); UnselectModule(chassis, chassisComp);
args.Handled = true;
return; return;
} }
UnselectModule(chassis, chassisComp.SelectedModule, chassisComp);
SelectModule(chassis, uid, chassisComp, component); SelectModule(chassis, uid, chassisComp, component);
args.Handled = true;
} }
/// <summary> /// <summary>
@@ -99,22 +106,40 @@ public sealed partial class BorgSystem
public void SelectModule(EntityUid chassis, public void SelectModule(EntityUid chassis,
EntityUid moduleUid, EntityUid moduleUid,
BorgChassisComponent? chassisComp = null, BorgChassisComponent? chassisComp = null,
SelectableBorgModuleComponent? moduleComp = null) SelectableBorgModuleComponent? selectable = null,
BorgModuleComponent? moduleComp = null)
{ {
if (Terminating(chassis) || Deleted(chassis)) if (LifeStage(chassis) >= EntityLifeStage.Terminating)
return; return;
if (!Resolve(chassis, ref chassisComp)) if (!Resolve(chassis, ref chassisComp))
return; return;
if (!Resolve(moduleUid, ref moduleComp) || !moduleComp.Installed || moduleComp.InstalledEntity != chassis)
{
Log.Error($"{ToPrettyString(chassis)} attempted to select uninstalled module {ToPrettyString(moduleUid)}");
return;
}
if (selectable == null && !HasComp<SelectableBorgModuleComponent>(moduleUid))
{
Log.Error($"{ToPrettyString(chassis)} attempted to select invalid module {ToPrettyString(moduleUid)}");
return;
}
if (!chassisComp.ModuleContainer.Contains(moduleUid))
{
Log.Error($"{ToPrettyString(chassis)} does not contain the installed module {ToPrettyString(moduleUid)}");
return;
}
if (chassisComp.SelectedModule != null) if (chassisComp.SelectedModule != null)
return; return;
if (chassisComp.SelectedModule == moduleUid) if (chassisComp.SelectedModule == moduleUid)
return; return;
if (!Resolve(moduleUid, ref moduleComp, false)) UnselectModule(chassis, chassisComp);
return;
var ev = new BorgModuleSelectedEvent(chassis); var ev = new BorgModuleSelectedEvent(chassis);
RaiseLocalEvent(moduleUid, ref ev); RaiseLocalEvent(moduleUid, ref ev);
@@ -124,28 +149,19 @@ public sealed partial class BorgSystem
/// <summary> /// <summary>
/// Unselects a module, removing its provided abilities /// Unselects a module, removing its provided abilities
/// </summary> /// </summary>
public void UnselectModule(EntityUid chassis, public void UnselectModule(EntityUid chassis, BorgChassisComponent? chassisComp = null)
EntityUid? moduleUid,
BorgChassisComponent? chassisComp = null,
SelectableBorgModuleComponent? moduleComp = null)
{ {
if (Terminating(chassis) || Deleted(chassis)) if (LifeStage(chassis) >= EntityLifeStage.Terminating)
return; return;
if (!Resolve(chassis, ref chassisComp)) if (!Resolve(chassis, ref chassisComp))
return; return;
if (moduleUid == null) if (chassisComp.SelectedModule == null)
return;
if (chassisComp.SelectedModule != moduleUid)
return;
if (!Resolve(moduleUid.Value, ref moduleComp, false))
return; return;
var ev = new BorgModuleUnselectedEvent(chassis); var ev = new BorgModuleUnselectedEvent(chassis);
RaiseLocalEvent(moduleUid.Value, ref ev); RaiseLocalEvent(chassisComp.SelectedModule.Value, ref ev);
chassisComp.SelectedModule = null; chassisComp.SelectedModule = null;
} }
@@ -214,9 +230,20 @@ public sealed partial class BorgSystem
if (!TryComp<HandsComponent>(chassis, out var hands)) if (!TryComp<HandsComponent>(chassis, out var hands))
return; return;
if (LifeStage(uid) >= EntityLifeStage.Terminating)
{
foreach (var (hand, item) in component.ProvidedItems)
{
QueueDel(item);
_hands.RemoveHand(chassis, hand, hands);
}
component.ProvidedItems.Clear();
return;
}
foreach (var (handId, item) in component.ProvidedItems) foreach (var (handId, item) in component.ProvidedItems)
{ {
if (!Deleted(item) && !Terminating(item)) if (LifeStage(item) <= EntityLifeStage.MapInitialized)
{ {
RemComp<UnremoveableComponent>(item); RemComp<UnremoveableComponent>(item);
component.ProvidedContainer.Insert(item, EntityManager); component.ProvidedContainer.Insert(item, EntityManager);