FultonSystem.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. using System.Numerics;
  2. using Content.Shared.Salvage.Fulton;
  3. using Robust.Shared.Containers;
  4. using Robust.Shared.Map;
  5. using Robust.Shared.Random;
  6. namespace Content.Server.Salvage;
  7. /// <summary>
  8. /// Transports attached entities to the linked beacon after a timer has elapsed.
  9. /// </summary>
  10. public sealed class FultonSystem : SharedFultonSystem
  11. {
  12. [Dependency] private readonly IRobustRandom _random = default!;
  13. public override void Initialize()
  14. {
  15. base.Initialize();
  16. SubscribeLocalEvent<FultonedComponent, ComponentStartup>(OnFultonedStartup);
  17. SubscribeLocalEvent<FultonedComponent, ComponentShutdown>(OnFultonedShutdown);
  18. }
  19. private void OnFultonedShutdown(EntityUid uid, FultonedComponent component, ComponentShutdown args)
  20. {
  21. Del(component.Effect);
  22. component.Effect = EntityUid.Invalid;
  23. }
  24. private void OnFultonedStartup(EntityUid uid, FultonedComponent component, ComponentStartup args)
  25. {
  26. if (Exists(component.Effect))
  27. return;
  28. component.Effect = Spawn(EffectProto, new EntityCoordinates(uid, EffectOffset));
  29. Dirty(uid, component);
  30. }
  31. public override void Update(float frameTime)
  32. {
  33. base.Update(frameTime);
  34. var query = EntityQueryEnumerator<FultonedComponent>();
  35. var curTime = Timing.CurTime;
  36. while (query.MoveNext(out var uid, out var comp))
  37. {
  38. if (comp.NextFulton > curTime)
  39. continue;
  40. Fulton(uid, comp);
  41. }
  42. }
  43. private void Fulton(EntityUid uid, FultonedComponent component)
  44. {
  45. if (!Deleted(component.Beacon) &&
  46. TryComp(component.Beacon, out TransformComponent? beaconXform) &&
  47. !Container.IsEntityOrParentInContainer(component.Beacon.Value, xform: beaconXform) &&
  48. CanFulton(uid))
  49. {
  50. var xform = Transform(uid);
  51. var metadata = MetaData(uid);
  52. var oldCoords = xform.Coordinates;
  53. var offset = _random.NextVector2(1.5f);
  54. var localPos = Vector2.Transform(
  55. TransformSystem.GetWorldPosition(beaconXform),
  56. TransformSystem.GetInvWorldMatrix(beaconXform.ParentUid)) + offset;
  57. TransformSystem.SetCoordinates(uid, new EntityCoordinates(beaconXform.ParentUid, localPos));
  58. RaiseNetworkEvent(new FultonAnimationMessage()
  59. {
  60. Entity = GetNetEntity(uid, metadata),
  61. Coordinates = GetNetCoordinates(oldCoords),
  62. });
  63. }
  64. Audio.PlayPvs(component.Sound, uid);
  65. RemCompDeferred<FultonedComponent>(uid);
  66. }
  67. }