GoliathTentacleSystem.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. using Content.Shared.Directions;
  2. using Content.Shared.Maps;
  3. using Content.Shared.Physics;
  4. using Content.Shared.Popups;
  5. using Content.Shared.Stunnable;
  6. using Robust.Shared.Map;
  7. using Robust.Shared.Map.Components;
  8. using Robust.Shared.Network;
  9. using Robust.Shared.Random;
  10. namespace Content.Shared.Abilities.Goliath;
  11. public sealed class GoliathTentacleSystem : EntitySystem
  12. {
  13. [Dependency] private readonly IRobustRandom _random = default!;
  14. [Dependency] private readonly INetManager _net = default!;
  15. [Dependency] private readonly SharedMapSystem _map = default!;
  16. [Dependency] private readonly SharedStunSystem _stun = default!;
  17. [Dependency] private readonly SharedTransformSystem _transform = default!;
  18. [Dependency] private readonly TurfSystem _turf = default!;
  19. [Dependency] private readonly SharedPopupSystem _popup = default!;
  20. /// <inheritdoc/>
  21. public override void Initialize()
  22. {
  23. SubscribeLocalEvent<GoliathSummonTentacleAction>(OnSummonAction);
  24. }
  25. private void OnSummonAction(GoliathSummonTentacleAction args)
  26. {
  27. if (args.Handled || args.Coords is not { } coords)
  28. return;
  29. // TODO: animation
  30. _popup.PopupPredicted(Loc.GetString("tentacle-ability-use-popup", ("entity", args.Performer)), args.Performer, args.Performer, type: PopupType.SmallCaution);
  31. _stun.TryStun(args.Performer, TimeSpan.FromSeconds(0.8f), false);
  32. List<EntityCoordinates> spawnPos = new();
  33. spawnPos.Add(coords);
  34. var dirs = new List<Direction>();
  35. dirs.AddRange(args.OffsetDirections);
  36. for (var i = 0; i < 3; i++)
  37. {
  38. var dir = _random.PickAndTake(dirs);
  39. spawnPos.Add(coords.Offset(dir));
  40. }
  41. if (_transform.GetGrid(coords) is not { } grid || !TryComp<MapGridComponent>(grid, out var gridComp))
  42. return;
  43. foreach (var pos in spawnPos)
  44. {
  45. if (!_map.TryGetTileRef(grid, gridComp, pos, out var tileRef) ||
  46. tileRef.IsSpace() ||
  47. _turf.IsTileBlocked(tileRef, CollisionGroup.Impassable))
  48. {
  49. continue;
  50. }
  51. if (_net.IsServer)
  52. Spawn(args.EntityId, pos);
  53. }
  54. args.Handled = true;
  55. }
  56. }