using Content.Shared.DoAfter; using Content.Shared.Interaction; using Content.Shared.Popups; using Content.Shared.Whitelist; using Content.Shared.Wires; using Robust.Shared.Audio.Systems; using Robust.Shared.Network; namespace Content.Shared._DV.Construction; /// /// Handles upgrading machines using upgrade kits. /// public sealed class UpgradeKitSystem : EntitySystem { [Dependency] private readonly EntityWhitelistSystem _whitelist = default!; [Dependency] private readonly INetManager _net = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly SharedWiresSystem _wires = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnAfterInteract); SubscribeLocalEvent(OnDoAfter); } private void OnAfterInteract(Entity ent, ref AfterInteractEvent args) { if (args.Handled || !args.CanReach || args.Target is not {} target) return; args.Handled = true; var user = args.User; if (!CanUpgrade(ent, target, user)) return; if (!_wires.IsPanelOpen(target)) { _popup.PopupClient(Loc.GetString("construction-step-condition-wire-panel-open"), target, user); return; } ent.Comp.SoundStream = _audio.PlayPredicted(ent.Comp.UpgradeSound, ent, user)?.Entity; Dirty(ent); var ev = new UpgradeKitDoAfterEvent(); _doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, user, ent.Comp.Delay, ev, ent, target, ent)); } private void OnDoAfter(Entity ent, ref UpgradeKitDoAfterEvent args) { ent.Comp.SoundStream = _audio.Stop(ent.Comp.SoundStream); if (args.Cancelled) return; if (args.Handled || args.Args.Target is not {} target) return; args.Handled = true; var user = args.Args.User; if (!CanUpgrade(ent, target, user)) return; // do the upgrading now EntityManager.AddComponents(target, ent.Comp.Components); if (_net.IsServer) QueueDel(ent); } /// /// Check the upgrade kit's whitelist and blacklist, showing a popup if it is invalid. /// public bool CanUpgrade(Entity ent, EntityUid target, EntityUid user) { if (_whitelist.IsWhitelistFail(ent.Comp.Whitelist, target) || _whitelist.IsWhitelistPass(ent.Comp.Blacklist, target)) { _popup.PopupClient(Loc.GetString("upgrade-kit-invalid-target"), target, user); return false; } return true; } }