SharedGravityAnomalySystem.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. using System.Linq;
  2. using Content.Shared.Anomaly.Components;
  3. using Content.Shared.Anomaly.Effects.Components;
  4. using Content.Shared.Ghost;
  5. using Content.Shared.Throwing;
  6. using Robust.Shared.Map;
  7. using Content.Shared.Physics;
  8. using Robust.Shared.Map.Components;
  9. using Robust.Shared.Physics.Components;
  10. namespace Content.Shared.Anomaly.Effects;
  11. public abstract class SharedGravityAnomalySystem : EntitySystem
  12. {
  13. [Dependency] private readonly EntityLookupSystem _lookup = default!;
  14. [Dependency] private readonly ThrowingSystem _throwing = default!;
  15. [Dependency] private readonly SharedTransformSystem _xform = default!;
  16. [Dependency] private readonly SharedMapSystem _mapSystem = default!;
  17. /// <inheritdoc/>
  18. public override void Initialize()
  19. {
  20. SubscribeLocalEvent<GravityAnomalyComponent, AnomalyPulseEvent>(OnAnomalyPulse);
  21. SubscribeLocalEvent<GravityAnomalyComponent, AnomalySupercriticalEvent>(OnSupercritical);
  22. }
  23. private void OnAnomalyPulse(EntityUid uid, GravityAnomalyComponent component, ref AnomalyPulseEvent args)
  24. {
  25. var xform = Transform(uid);
  26. var range = component.MaxThrowRange * args.Severity * args.PowerModifier;
  27. var strength = component.MaxThrowStrength * args.Severity * args.PowerModifier;
  28. var lookup = _lookup.GetEntitiesInRange(uid, range, LookupFlags.Dynamic | LookupFlags.Sundries);
  29. var xformQuery = GetEntityQuery<TransformComponent>();
  30. var worldPos = _xform.GetWorldPosition(xform, xformQuery);
  31. var physQuery = GetEntityQuery<PhysicsComponent>();
  32. foreach (var ent in lookup)
  33. {
  34. if (physQuery.TryGetComponent(ent, out var phys)
  35. && (phys.CollisionMask & (int) CollisionGroup.GhostImpassable) != 0)
  36. continue;
  37. var foo = _xform.GetWorldPosition(ent, xformQuery) - worldPos;
  38. _throwing.TryThrow(ent, foo * 10, strength, uid, 0);
  39. }
  40. }
  41. private void OnSupercritical(EntityUid uid, GravityAnomalyComponent component, ref AnomalySupercriticalEvent args)
  42. {
  43. var xform = Transform(uid);
  44. if (!TryComp(xform.GridUid, out MapGridComponent? grid))
  45. return;
  46. var worldPos = _xform.GetWorldPosition(xform);
  47. var tileref = _mapSystem.GetTilesIntersecting(
  48. xform.GridUid.Value,
  49. grid,
  50. new Circle(worldPos, component.SpaceRange))
  51. .ToArray();
  52. var tiles = tileref.Select(t => (t.GridIndices, Tile.Empty)).ToList();
  53. _mapSystem.SetTiles(xform.GridUid.Value, grid, tiles);
  54. var range = component.MaxThrowRange * 2 * args.PowerModifier;
  55. var strength = component.MaxThrowStrength * 2 * args.PowerModifier;
  56. var lookup = _lookup.GetEntitiesInRange(uid, range, LookupFlags.Dynamic | LookupFlags.Sundries);
  57. var xformQuery = GetEntityQuery<TransformComponent>();
  58. var physQuery = GetEntityQuery<PhysicsComponent>();
  59. foreach (var ent in lookup)
  60. {
  61. if (physQuery.TryGetComponent(ent, out var phys)
  62. && (phys.CollisionMask & (int) CollisionGroup.GhostImpassable) != 0)
  63. continue;
  64. var foo = _xform.GetWorldPosition(ent, xformQuery) - worldPos;
  65. _throwing.TryThrow(ent, foo * 5, strength, uid, 0);
  66. }
  67. }
  68. }