StrawCollectorSystem.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. using Content.Shared.Interaction;
  2. using Content.Shared.DoAfter;
  3. using Content.Server.DoAfter;
  4. using Content.Shared.Maps;
  5. using Content.Shared.Popups;
  6. using Robust.Shared.Map;
  7. using Robust.Shared.Map.Components;
  8. using Robust.Shared.Random;
  9. using Content.Shared.Gathering;
  10. namespace Content.Server.Gathering;
  11. public sealed partial class StrawCollectorSystem : EntitySystem
  12. {
  13. [Dependency] private readonly SharedTransformSystem _transform = default!;
  14. [Dependency] private readonly SharedMapSystem _map = default!;
  15. [Dependency] private readonly ITileDefinitionManager _tileManager = default!;
  16. [Dependency] private readonly DoAfterSystem _doAfter = default!;
  17. [Dependency] private readonly SharedPopupSystem _popup = default!;
  18. [Dependency] private readonly IRobustRandom _random = default!;
  19. // Grass tiles that can be cut
  20. private readonly HashSet<string> _grassTiles = new()
  21. {
  22. "FloorGrass",
  23. "FloorGrassJungle",
  24. "FloorGrassDark",
  25. "FloorGrassLight",
  26. "FloorPlanetGrass",
  27. };
  28. public override void Initialize()
  29. {
  30. base.Initialize();
  31. SubscribeLocalEvent<StrawCollectorComponent, AfterInteractEvent>(OnAfterInteract);
  32. SubscribeLocalEvent<StrawCollectorComponent, StrawCollectDoAfterEvent>(OnDoAfter);
  33. }
  34. private void OnAfterInteract(Entity<StrawCollectorComponent> ent, ref AfterInteractEvent args)
  35. {
  36. if (args.Handled || args.Target != null || !args.CanReach)
  37. return;
  38. var comp = ent.Comp;
  39. var user = args.User;
  40. var clickLocation = args.ClickLocation;
  41. var gridUid = _transform.GetGrid(clickLocation);
  42. if (!gridUid.HasValue || !TryComp<MapGridComponent>(gridUid.Value, out var grid))
  43. return;
  44. var snapPos = grid.TileIndicesFor(clickLocation);
  45. var tileRef = _map.GetTileRef(gridUid.Value, grid, snapPos);
  46. var tileDef = (ContentTileDefinition)_tileManager[tileRef.Tile.TypeId];
  47. if (!_grassTiles.Contains(tileDef.ID))
  48. {
  49. return;
  50. }
  51. var delay = TimeSpan.FromSeconds(comp.CollectTime);
  52. var netGridUid = GetNetEntity(gridUid.Value);
  53. var doAfterArgs = new DoAfterArgs(EntityManager, user, delay, new StrawCollectDoAfterEvent(netGridUid, snapPos), ent)
  54. {
  55. BreakOnMove = true,
  56. BreakOnDamage = true,
  57. NeedHand = true
  58. };
  59. if (_doAfter.TryStartDoAfter(doAfterArgs))
  60. {
  61. _popup.PopupEntity("You begin cutting the grass.", ent, user);
  62. args.Handled = true;
  63. }
  64. }
  65. private void OnDoAfter(Entity<StrawCollectorComponent> ent, ref StrawCollectDoAfterEvent args)
  66. {
  67. if (args.Cancelled || args.Handled)
  68. return;
  69. var gridUid = GetEntity(args.GridUid);
  70. if (!TryComp<MapGridComponent>(gridUid, out var grid))
  71. return;
  72. var snapPos = args.SnapPos;
  73. var tileRef = _map.GetTileRef(gridUid, grid, snapPos);
  74. var tileDef = (ContentTileDefinition)_tileManager[tileRef.Tile.TypeId];
  75. if (!_grassTiles.Contains(tileDef.ID))
  76. {
  77. return; // Tile has changed, abort
  78. }
  79. var dirtTile = _tileManager["FloorDirt"];
  80. _map.SetTile(gridUid, grid, snapPos, new Tile(dirtTile.TileId));
  81. var comp = ent.Comp;
  82. var strawCount = _random.Next(comp.MinAmount, comp.MaxAmount + 1);
  83. var coordinates = grid.GridTileToLocal(snapPos);
  84. for (int i = 0; i < strawCount; i++)
  85. {
  86. Spawn("MaterialStraw1", coordinates);
  87. }
  88. _popup.PopupEntity($"You finish cutting the grass.", ent, args.User);
  89. args.Handled = true;
  90. }
  91. }