using Content.Server.Mech.Components; using Content.Shared.Interaction; using Content.Shared.Tag; using Content.Shared.Tools.Components; using Content.Shared.Tools.Systems; using Robust.Server.Containers; using Robust.Shared.Containers; namespace Content.Server.Mech.Systems; /// /// Handles and the insertion /// and removal of parts from the assembly. /// public sealed class MechAssemblySystem : EntitySystem { [Dependency] private readonly ContainerSystem _container = default!; [Dependency] private readonly TagSystem _tag = default!; [Dependency] private readonly SharedToolSystem _toolSystem = default!; /// public override void Initialize() { SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnInteractUsing); } private void OnInit(EntityUid uid, MechAssemblyComponent component, ComponentInit args) { component.PartsContainer = _container.EnsureContainer(uid, "mech-assembly-container"); } private void OnInteractUsing(EntityUid uid, MechAssemblyComponent component, InteractUsingEvent args) { if (_toolSystem.HasQuality(args.Used, component.QualityNeeded)) { foreach (var tag in component.RequiredParts.Keys) { component.RequiredParts[tag] = false; } _container.EmptyContainer(component.PartsContainer); return; } if (!TryComp(args.Used, out var tagComp)) return; foreach (var (tag, val) in component.RequiredParts) { if (!val && _tag.HasTag(tagComp, tag)) { component.RequiredParts[tag] = true; _container.Insert(args.Used, component.PartsContainer); break; } } //check to see if we have all the parts foreach (var val in component.RequiredParts.Values) { if (!val) return; } Spawn(component.FinishedPrototype, Transform(uid).Coordinates); EntityManager.DeleteEntity(uid); } }