CompostInteractionSystem.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. using Content.Shared.Interaction;
  2. using Content.Shared.DoAfter;
  3. using Content.Server.DoAfter;
  4. using Content.Server.Botany.Components;
  5. using Content.Shared.Farming;
  6. using Content.Shared.Popups;
  7. namespace Content.Server.Farming;
  8. public sealed partial class CompostInteractionSystem : EntitySystem
  9. {
  10. [Dependency] private readonly DoAfterSystem _doAfter = default!;
  11. [Dependency] private readonly SharedPopupSystem _popup = default!;
  12. public override void Initialize()
  13. {
  14. base.Initialize();
  15. SubscribeLocalEvent<CompostableFieldComponent, AfterInteractUsingEvent>(OnAfterInteractUsing);
  16. SubscribeLocalEvent<CompostableFieldComponent, CompostDoAfterEvent>(OnDoAfter);
  17. }
  18. private void OnAfterInteractUsing(Entity<CompostableFieldComponent> field, ref AfterInteractUsingEvent args)
  19. {
  20. if (args.Handled || !args.CanReach)
  21. return;
  22. var usedItem = args.Used;
  23. if (!HasComp<CompostComponent>(usedItem))
  24. return;
  25. var comp = field.Comp;
  26. var user = args.User;
  27. var netUsedItem = GetNetEntity(usedItem);
  28. var doAfterArgs = new DoAfterArgs(EntityManager, user, comp.CompostTime,
  29. new CompostDoAfterEvent(netUsedItem), field, usedItem)
  30. {
  31. BreakOnMove = true,
  32. BreakOnDamage = true,
  33. NeedHand = true
  34. };
  35. if (_doAfter.TryStartDoAfter(doAfterArgs))
  36. {
  37. _popup.PopupEntity("You begin applying compost to the field.", field, user);
  38. args.Handled = true;
  39. }
  40. }
  41. private void OnDoAfter(Entity<CompostableFieldComponent> field, ref CompostDoAfterEvent args)
  42. {
  43. if (args.Cancelled || args.Handled)
  44. return;
  45. if (!TryComp<PlantHolderComponent>(field, out var plantHolder))
  46. return;
  47. var usedEntity = GetEntity(args.Used);
  48. if (TryComp<CompostComponent>(usedEntity, out var compostComp))
  49. {
  50. plantHolder.NutritionLevel += compostComp.NutritionValue;
  51. }
  52. QueueDel(usedEntity);
  53. _popup.PopupEntity("You finish applying compost to the field.", field, args.User);
  54. args.Handled = true;
  55. }
  56. }