1
0

TreeBranchesSystem.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. using Content.Server.DoAfter;
  2. using Content.Shared.TreeBranch;
  3. using Content.Shared.DoAfter;
  4. using Robust.Server.GameObjects;
  5. using Robust.Shared.Random;
  6. using Robust.Shared.Timing;
  7. using Content.Shared.Popups;
  8. using Content.Shared.Hands.EntitySystems;
  9. using Content.Shared.Verbs;
  10. using Content.Shared.Examine;
  11. namespace Content.Server.TreeBranch;
  12. public sealed partial class TreeBranchesSystem : EntitySystem
  13. {
  14. [Dependency] private readonly IRobustRandom Random = default!;
  15. [Dependency] private readonly IGameTiming _gameTiming = default!;
  16. [Dependency] private readonly SharedPopupSystem _popup = default!;
  17. [Dependency] private readonly DoAfterSystem _doAfter = default!;
  18. [Dependency] private readonly SharedHandsSystem _hands = default!;
  19. public override void Initialize()
  20. {
  21. base.Initialize();
  22. SubscribeLocalEvent<TreeBranchesComponent, MapInitEvent>(OnMapInit);
  23. SubscribeLocalEvent<TreeBranchesComponent, CollectBranchDoAfterEvent>(OnDoAfter);
  24. SubscribeLocalEvent<TreeBranchesComponent, GetVerbsEvent<AlternativeVerb>>(OnGetVerbs);
  25. SubscribeLocalEvent<TreeBranchesComponent, ExaminedEvent>(OnExamined);
  26. }
  27. private void OnMapInit(EntityUid uid, TreeBranchesComponent component, MapInitEvent args)
  28. {
  29. component.CurrentBranches = Random.Next(0, component.MaxBranches);
  30. }
  31. public override void Update(float frameTime)
  32. {
  33. base.Update(frameTime);
  34. var query = EntityQueryEnumerator<TreeBranchesComponent>();
  35. while (query.MoveNext(out var uid, out var component))
  36. {
  37. var currentTime = _gameTiming.CurTime;
  38. if (currentTime >= component.LastGrowthTime + TimeSpan.FromSeconds(component.GrowthTime))
  39. {
  40. if (component.CurrentBranches < component.MaxBranches)
  41. {
  42. component.CurrentBranches++;
  43. component.LastGrowthTime = currentTime;
  44. }
  45. }
  46. }
  47. }
  48. private void OnGetVerbs(EntityUid uid, TreeBranchesComponent component, ref GetVerbsEvent<AlternativeVerb> args)
  49. {
  50. if (!args.CanAccess || !args.CanInteract || component.CurrentBranches <= 0)
  51. return;
  52. var user = args.User;
  53. var verb = new AlternativeVerb
  54. {
  55. Text = "Collect Branch",
  56. Act = () => StartCollectingBranch(uid, component, user)
  57. };
  58. args.Verbs.Add(verb);
  59. }
  60. private void StartCollectingBranch(EntityUid treeUid, TreeBranchesComponent component, EntityUid user)
  61. {
  62. var doAfterArgs = new DoAfterArgs(EntityManager,
  63. user,
  64. component.CollectionTime,
  65. new CollectBranchDoAfterEvent(),
  66. treeUid)
  67. {
  68. BreakOnMove = true,
  69. BreakOnDamage = true,
  70. NeedHand = true
  71. };
  72. _doAfter.TryStartDoAfter(doAfterArgs);
  73. }
  74. private void OnDoAfter(EntityUid uid, TreeBranchesComponent component, ref CollectBranchDoAfterEvent args)
  75. {
  76. if (args.Cancelled || args.Handled)
  77. return;
  78. component.CurrentBranches--;
  79. var spawnPos = Transform(uid).MapPosition;
  80. var branch = Spawn("LeafedStick", spawnPos);
  81. _hands.TryPickupAnyHand(args.Args.User, branch);
  82. _popup.PopupEntity("You successfully collect a branch.", uid, args.Args.User);
  83. args.Handled = true;
  84. }
  85. private void OnExamined(EntityUid uid, TreeBranchesComponent component, ExaminedEvent args)
  86. {
  87. if (!args.IsInDetailsRange)
  88. return;
  89. var branchCount = component.CurrentBranches;
  90. if (branchCount > 0)
  91. {
  92. var message = branchCount == 1
  93. ? "There is 1 branch you could make use of."
  94. : $"There are {branchCount} branches you could make use of.";
  95. args.PushMarkup(message);
  96. }
  97. }
  98. }