| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- 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<DisassembleOnAltVerbComponent, GetVerbsEvent<AlternativeVerb>>(AddDisassembleVerb);
- }
- private void AddDisassembleVerb(EntityUid uid, DisassembleOnAltVerbComponent component, GetVerbsEvent<AlternativeVerb> 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<SharedDoAfterSystem>(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);
- }
- }
- }
|