using Content.Server.Engineering.Components; using Content.Shared.DoAfter; using Content.Shared.Hands.EntitySystems; using Content.Shared.Verbs; using JetBrains.Annotations; namespace Content.Server.Engineering.EntitySystems { [UsedImplicitly] public sealed class DisassembleOnAltVerbSystem : EntitySystem { [Dependency] private readonly SharedHandsSystem _handsSystem = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent>(AddDisassembleVerb); } private void AddDisassembleVerb(EntityUid uid, DisassembleOnAltVerbComponent component, GetVerbsEvent args) { if (!args.CanInteract || !args.CanAccess || args.Hands == null) return; AlternativeVerb verb = new() { Act = () => { AttemptDisassemble(uid, args.User, args.Target, component); }, Text = Loc.GetString("disassemble-system-verb-disassemble"), Priority = 2 }; args.Verbs.Add(verb); } public async void AttemptDisassemble(EntityUid uid, EntityUid user, EntityUid target, DisassembleOnAltVerbComponent? component = null) { if (!Resolve(uid, ref component)) return; if (string.IsNullOrEmpty(component.Prototype)) return; if (component.DoAfterTime > 0 && TryGet(out var doAfterSystem)) { var doAfterArgs = new DoAfterArgs(EntityManager, user, component.DoAfterTime, new AwaitedDoAfterEvent(), null) { BreakOnMove = true, }; var result = await doAfterSystem.WaitDoAfter(doAfterArgs); if (result != DoAfterStatus.Finished) return; } if (component.Deleted || Deleted(uid)) return; if (!TryComp(uid, out TransformComponent? transformComp)) return; var entity = EntityManager.SpawnEntity(component.Prototype, transformComp.Coordinates); _handsSystem.TryPickup(user, entity); EntityManager.DeleteEntity(uid); } } }