From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Mon, 18 Sep 2023 01:06:56 +0000 (+1200) Subject: Fixes a borg error that was causing random test failures (#20297) X-Git-Url: https://git.smokeofanarchy.ru/gitweb.cgi?a=commitdiff_plain;h=df3ff0cee4dc191fd8f04ff921cd83254488db00;p=space-station-14.git Fixes a borg error that was causing random test failures (#20297) --- diff --git a/Content.Server/Silicons/Borgs/BorgSystem.Modules.cs b/Content.Server/Silicons/Borgs/BorgSystem.Modules.cs index 51987fb721..b0b1437dbe 100644 --- a/Content.Server/Silicons/Borgs/BorgSystem.Modules.cs +++ b/Content.Server/Silicons/Borgs/BorgSystem.Modules.cs @@ -3,6 +3,7 @@ using Content.Shared.Hands.Components; using Content.Shared.Interaction.Components; using Content.Shared.Silicons.Borgs.Components; using Robust.Shared.Containers; +using Robust.Shared.Utility; namespace Content.Server.Silicons.Borgs; @@ -65,14 +66,22 @@ public sealed partial class BorgSystem 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) { var chassis = args.ChassisEnt; _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) @@ -81,16 +90,14 @@ public sealed partial class BorgSystem if (!TryComp(chassis, out var chassisComp)) return; + args.Handled = true; if (chassisComp.SelectedModule == uid) { - UnselectModule(chassis, chassisComp.SelectedModule, chassisComp); - args.Handled = true; + UnselectModule(chassis, chassisComp); return; } - UnselectModule(chassis, chassisComp.SelectedModule, chassisComp); SelectModule(chassis, uid, chassisComp, component); - args.Handled = true; } /// @@ -99,22 +106,40 @@ public sealed partial class BorgSystem public void SelectModule(EntityUid chassis, EntityUid moduleUid, BorgChassisComponent? chassisComp = null, - SelectableBorgModuleComponent? moduleComp = null) + SelectableBorgModuleComponent? selectable = null, + BorgModuleComponent? moduleComp = null) { - if (Terminating(chassis) || Deleted(chassis)) + if (LifeStage(chassis) >= EntityLifeStage.Terminating) return; if (!Resolve(chassis, ref chassisComp)) 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(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) return; if (chassisComp.SelectedModule == moduleUid) return; - if (!Resolve(moduleUid, ref moduleComp, false)) - return; + UnselectModule(chassis, chassisComp); var ev = new BorgModuleSelectedEvent(chassis); RaiseLocalEvent(moduleUid, ref ev); @@ -124,28 +149,19 @@ public sealed partial class BorgSystem /// /// Unselects a module, removing its provided abilities /// - public void UnselectModule(EntityUid chassis, - EntityUid? moduleUid, - BorgChassisComponent? chassisComp = null, - SelectableBorgModuleComponent? moduleComp = null) + public void UnselectModule(EntityUid chassis, BorgChassisComponent? chassisComp = null) { - if (Terminating(chassis) || Deleted(chassis)) + if (LifeStage(chassis) >= EntityLifeStage.Terminating) return; if (!Resolve(chassis, ref chassisComp)) return; - if (moduleUid == null) - return; - - if (chassisComp.SelectedModule != moduleUid) - return; - - if (!Resolve(moduleUid.Value, ref moduleComp, false)) + if (chassisComp.SelectedModule == null) return; var ev = new BorgModuleUnselectedEvent(chassis); - RaiseLocalEvent(moduleUid.Value, ref ev); + RaiseLocalEvent(chassisComp.SelectedModule.Value, ref ev); chassisComp.SelectedModule = null; } @@ -214,9 +230,20 @@ public sealed partial class BorgSystem if (!TryComp(chassis, out var hands)) 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) { - if (!Deleted(item) && !Terminating(item)) + if (LifeStage(item) <= EntityLifeStage.MapInitialized) { RemComp(item); component.ProvidedContainer.Insert(item, EntityManager);