DisassembleOnAltVerbSystem.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. using Content.Server.Engineering.Components;
  2. using Content.Shared.DoAfter;
  3. using Content.Shared.Hands.EntitySystems;
  4. using Content.Shared.Verbs;
  5. using JetBrains.Annotations;
  6. namespace Content.Server.Engineering.EntitySystems
  7. {
  8. [UsedImplicitly]
  9. public sealed class DisassembleOnAltVerbSystem : EntitySystem
  10. {
  11. [Dependency] private readonly SharedHandsSystem _handsSystem = default!;
  12. public override void Initialize()
  13. {
  14. base.Initialize();
  15. SubscribeLocalEvent<DisassembleOnAltVerbComponent, GetVerbsEvent<AlternativeVerb>>(AddDisassembleVerb);
  16. }
  17. private void AddDisassembleVerb(EntityUid uid, DisassembleOnAltVerbComponent component, GetVerbsEvent<AlternativeVerb> args)
  18. {
  19. if (!args.CanInteract || !args.CanAccess || args.Hands == null)
  20. return;
  21. AlternativeVerb verb = new()
  22. {
  23. Act = () =>
  24. {
  25. AttemptDisassemble(uid, args.User, args.Target, component);
  26. },
  27. Text = Loc.GetString("disassemble-system-verb-disassemble"),
  28. Priority = 2
  29. };
  30. args.Verbs.Add(verb);
  31. }
  32. public async void AttemptDisassemble(EntityUid uid, EntityUid user, EntityUid target, DisassembleOnAltVerbComponent? component = null)
  33. {
  34. if (!Resolve(uid, ref component))
  35. return;
  36. if (string.IsNullOrEmpty(component.Prototype))
  37. return;
  38. if (component.DoAfterTime > 0 && TryGet<SharedDoAfterSystem>(out var doAfterSystem))
  39. {
  40. var doAfterArgs = new DoAfterArgs(EntityManager, user, component.DoAfterTime, new AwaitedDoAfterEvent(), null)
  41. {
  42. BreakOnMove = true,
  43. };
  44. var result = await doAfterSystem.WaitDoAfter(doAfterArgs);
  45. if (result != DoAfterStatus.Finished)
  46. return;
  47. }
  48. if (component.Deleted || Deleted(uid))
  49. return;
  50. if (!TryComp(uid, out TransformComponent? transformComp))
  51. return;
  52. var entity = EntityManager.SpawnEntity(component.Prototype, transformComp.Coordinates);
  53. _handsSystem.TryPickup(user, entity);
  54. EntityManager.DeleteEntity(uid);
  55. }
  56. }
  57. }