MortarSystem.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using System.Numerics;
  2. using Content.Server.Popups;
  3. using Content.Shared._RMC14.Mortar;
  4. using Robust.Server.Containers;
  5. using Robust.Shared.Map;
  6. using Robust.Shared.Random;
  7. using Robust.Shared.Timing;
  8. using static Content.Shared.Popups.PopupType;
  9. namespace Content.Server._RMC14.Mortar;
  10. public sealed class MortarSystem : SharedMortarSystem
  11. {
  12. [Dependency] private readonly ContainerSystem _container = default!;
  13. [Dependency] private readonly PopupSystem _popup = default!;
  14. [Dependency] private readonly IRobustRandom _random = default!;
  15. [Dependency] private readonly IGameTiming _timing = default!;
  16. [Dependency] private readonly SharedTransformSystem _transform = default!;
  17. protected override bool CanLoadPopup(
  18. Entity<MortarComponent> mortar,
  19. Entity<MortarShellComponent> shell,
  20. EntityUid user,
  21. out TimeSpan travelTime,
  22. out MapCoordinates coordinates)
  23. {
  24. travelTime = default;
  25. coordinates = default;
  26. if (!mortar.Comp.Deployed)
  27. {
  28. _popup.PopupEntity(Loc.GetString("rmc-mortar-not-deployed", ("mortar", mortar)), user, user, SmallCaution);
  29. return false;
  30. }
  31. var time = _timing.CurTime;
  32. if (time < mortar.Comp.LastFiredAt + mortar.Comp.FireDelay)
  33. {
  34. _popup.PopupEntity(Loc.GetString("rmc-mortar-fire-cooldown", ("mortar", mortar)), user, user, SmallCaution);
  35. return false;
  36. }
  37. var target = mortar.Comp.Target + mortar.Comp.Offset + mortar.Comp.Dial;
  38. if (target == Vector2i.Zero)
  39. {
  40. _popup.PopupEntity(Loc.GetString("rmc-mortar-not-aimed", ("mortar", mortar)), user, user, SmallCaution);
  41. return false;
  42. }
  43. var mortarCoordinates = _transform.GetMapCoordinates(mortar);
  44. coordinates = new MapCoordinates(Vector2.Zero, mortarCoordinates.MapId);
  45. coordinates = coordinates.Offset(target);
  46. travelTime = shell.Comp.TravelDelay;
  47. if ((mortarCoordinates.Position - coordinates.Position).Length() < mortar.Comp.MinimumRange)
  48. {
  49. _popup.PopupEntity(Loc.GetString("rmc-mortar-target-too-close"), user, user, SmallCaution);
  50. return false;
  51. }
  52. if ((mortarCoordinates.Position - coordinates.Position).Length() > mortar.Comp.MaximumRange)
  53. {
  54. _popup.PopupEntity(Loc.GetString("rmc-mortar-target-too-far"), user, user, SmallCaution);
  55. return false;
  56. }
  57. if (mortar.Comp.FireRandomOffset is { Length: > 0 } fireRandomOffset)
  58. {
  59. var xDeviation = _random.Pick(fireRandomOffset);
  60. var yDeviation = _random.Pick(fireRandomOffset);
  61. coordinates = coordinates.Offset(new Vector2(xDeviation, yDeviation));
  62. }
  63. if (_container.TryGetContainer(mortar, mortar.Comp.ContainerId, out var container) &&
  64. !_container.CanInsert(shell, container))
  65. {
  66. _popup.PopupClient(Loc.GetString("rmc-mortar-cant-insert", ("shell", shell), ("mortar", mortar)), user, user, SmallCaution);
  67. return false;
  68. }
  69. return true;
  70. }
  71. }