SharpenSystem.cs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. using Content.Server.DoAfter;
  2. using Content.Shared.Crafting;
  3. using Content.Shared.Interaction;
  4. using Content.Shared.DoAfter;
  5. using Robust.Server.GameObjects;
  6. using Robust.Shared.Prototypes;
  7. using Content.Server.Kitchen.Components;
  8. using Content.Shared.Verbs;
  9. namespace Content.Server.Crafting;
  10. public sealed partial class SharpenSystem : EntitySystem
  11. {
  12. [Dependency] private readonly DoAfterSystem _doAfter = default!;
  13. [Dependency] private readonly IPrototypeManager _prototype = default!;
  14. public override void Initialize()
  15. {
  16. base.Initialize();
  17. SubscribeLocalEvent<SharpenableComponent, InteractUsingEvent>(OnInteractUsing);
  18. SubscribeLocalEvent<SharpenableComponent, SharpenDoAfterEvent>(OnDoAfter);
  19. SubscribeLocalEvent<SharpenableComponent, GetVerbsEvent<AlternativeVerb>>(OnGetVerbs);
  20. }
  21. private void OnGetVerbs(EntityUid uid, SharpenableComponent component, ref GetVerbsEvent<AlternativeVerb> args)
  22. {
  23. if (!args.CanAccess || !args.CanInteract || !component.CanSharpenByHand)
  24. return;
  25. var user = args.User;
  26. var verb = new AlternativeVerb
  27. {
  28. Text = "Sharpen",
  29. Act = () => StartSharpeningByHand(uid, component, user)
  30. };
  31. args.Verbs.Add(verb);
  32. }
  33. // Sharpening by hand, if possible, takes twice as much time
  34. private void StartSharpeningByHand(EntityUid uid, SharpenableComponent component, EntityUid user)
  35. {
  36. var doAfterArgs = new DoAfterArgs(EntityManager, user, component.SharpenTime * 2, new SharpenDoAfterEvent(), uid)
  37. {
  38. BreakOnMove = true,
  39. BreakOnDamage = true,
  40. NeedHand = true
  41. };
  42. _doAfter.TryStartDoAfter(doAfterArgs);
  43. }
  44. private void OnInteractUsing(EntityUid uid, SharpenableComponent component, InteractUsingEvent args)
  45. {
  46. if (args.Handled)
  47. return;
  48. if (!HasComp<SharpComponent>(args.Used))
  49. return;
  50. var doAfterArgs = new DoAfterArgs(EntityManager, args.User, component.SharpenTime, new SharpenDoAfterEvent(), uid, used: args.Used)
  51. {
  52. BreakOnMove = true,
  53. BreakOnDamage = true,
  54. NeedHand = true
  55. };
  56. _doAfter.TryStartDoAfter(doAfterArgs);
  57. args.Handled = true;
  58. }
  59. private void OnDoAfter(EntityUid uid, SharpenableComponent component, ref SharpenDoAfterEvent args)
  60. {
  61. if (args.Cancelled || args.Handled)
  62. return;
  63. var sharpenedStick = Spawn(component.ResultPrototype, Transform(uid).MapPosition);
  64. QueueDel(uid);
  65. args.Handled = true;
  66. }
  67. }