From fc0211e4e0264f2e1cc1191ed52e012fed78b060 Mon Sep 17 00:00:00 2001 From: TotallyLemon <79545393+TotallyLemon@users.noreply.github.com> Date: Mon, 7 Aug 2023 19:26:24 -0500 Subject: [PATCH] RPED can now add parts to in-progress machine frames (#16633) * RPED construction * Requested Changes --- .../Components/PartExchangerComponent.cs | 2 +- .../Construction/PartExchangerSystem.cs | 94 +++++++++++++++---- 2 files changed, 77 insertions(+), 19 deletions(-) diff --git a/Content.Server/Construction/Components/PartExchangerComponent.cs b/Content.Server/Construction/Components/PartExchangerComponent.cs index fb7d3a89c6..168c9e880c 100644 --- a/Content.Server/Construction/Components/PartExchangerComponent.cs +++ b/Content.Server/Construction/Components/PartExchangerComponent.cs @@ -1,4 +1,4 @@ -using System.Threading; +using System.Threading; using Robust.Shared.Audio; namespace Content.Server.Construction.Components; diff --git a/Content.Server/Construction/PartExchangerSystem.cs b/Content.Server/Construction/PartExchangerSystem.cs index cfd97390a5..f03d70d6e1 100644 --- a/Content.Server/Construction/PartExchangerSystem.cs +++ b/Content.Server/Construction/PartExchangerSystem.cs @@ -10,6 +10,7 @@ using Content.Shared.Popups; using Robust.Shared.Containers; using Robust.Shared.Utility; using Content.Shared.Wires; +using Robust.Shared.Collections; namespace Content.Server.Construction; @@ -35,35 +36,45 @@ public sealed class PartExchangerSystem : EntitySystem if (args.Cancelled || args.Handled || args.Args.Target == null) return; - if (!TryComp(args.Args.Target.Value, out var machine)) - return; - if (!TryComp(uid, out var storage) || storage.Storage == null) return; //the parts are stored in here + var machinePartQuery = GetEntityQuery(); + var machineParts = new List(); + + foreach (var item in storage.Storage.ContainedEntities) //get parts in RPED + { + if (machinePartQuery.TryGetComponent(item, out var part)) + machineParts.Add(part); + } + + TryExchangeMachineParts(args.Args.Target.Value, storage, machineParts); + TryConstructMachineParts(args.Args.Target.Value, storage, machineParts); + + args.Handled = true; + } + + private void TryExchangeMachineParts(EntityUid uid, ServerStorageComponent storage, List machineParts) + { + if (!TryComp(uid, out var machine) || storage.Storage == null) + return; + + var machinePartQuery = GetEntityQuery(); var board = machine.BoardContainer.ContainedEntities.FirstOrNull(); if (board == null || !TryComp(board, out var macBoardComp)) return; - var machineParts = new List(); - - foreach (var ent in storage.Storage.ContainedEntities) //get parts in RPED + foreach (var item in new ValueList(machine.PartContainer.ContainedEntities)) //clone so don't modify during enumeration { - if (TryComp(ent, out var part)) - machineParts.Add(part); - } - foreach (var ent in new List(machine.PartContainer.ContainedEntities)) //clone so don't modify during enumeration - { - if (TryComp(ent, out var part)) + if (machinePartQuery.TryGetComponent(item, out var part)) { machineParts.Add(part); - _container.RemoveEntity(args.Args.Target.Value, ent); + _container.RemoveEntity(uid, item); } } - //order by highest rating - machineParts = machineParts.OrderByDescending(p => p.Rating).ToList(); + machineParts.Sort((x, y) => y.Rating.CompareTo(x.Rating)); var updatedParts = new List(); foreach (var (type, amount) in macBoardComp.Requirements) @@ -83,9 +94,56 @@ public sealed class PartExchangerSystem : EntitySystem storage.Storage.Insert(unused.Owner); _storage.Insert(uid, unused.Owner, null, false); } - _construction.RefreshParts(args.Args.Target.Value, machine); + _construction.RefreshParts(uid, machine); + } + + private void TryConstructMachineParts(EntityUid uid, ServerStorageComponent storage, List machineParts) + { + if (!TryComp(uid, out var machine) || storage.Storage == null) + return; + + var machinePartQuery = GetEntityQuery(); + var board = machine.BoardContainer.ContainedEntities.FirstOrNull(); + + if (!machine.HasBoard || !TryComp(board, out var macBoardComp)) + return; + + foreach (var item in new ValueList(machine.PartContainer.ContainedEntities)) //clone so don't modify during enumeration + { + if (machinePartQuery.TryGetComponent(item, out var part)) + { + machineParts.Add(part); + _container.RemoveEntity(uid, item); + machine.Progress[part.PartType]--; + } + } + + machineParts.Sort((x, y) => y.Rating.CompareTo(x.Rating)); + + var updatedParts = new List(); + foreach (var (type, amount) in macBoardComp.Requirements) + { + var target = machineParts.Where(p => p.PartType == type).Take(amount); + updatedParts.AddRange(target); + } + foreach (var part in updatedParts) + { + if (!machine.Requirements.ContainsKey(part.PartType)) + continue; + + machine.PartContainer.Insert(part.Owner, EntityManager); + machine.Progress[part.PartType]++; + machineParts.Remove(part); + } + + //put the unused parts back into rped. (this also does the "swapping") + foreach (var unused in machineParts) + { + storage.Storage.Insert(unused.Owner); + _storage.Insert(uid, unused.Owner, null, false); + } + - args.Handled = true; } private void OnAfterInteract(EntityUid uid, PartExchangerComponent component, AfterInteractEvent args) @@ -96,7 +154,7 @@ public sealed class PartExchangerSystem : EntitySystem if (args.Target == null) return; - if (!HasComp(args.Target)) + if (!HasComp(args.Target) && !HasComp(args.Target)) return; if (TryComp(args.Target, out var panel) && !panel.Open)