LightningArcShooterSystem.cs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. using Content.Server.Lightning;
  2. using Content.Server.Tesla.Components;
  3. using Robust.Shared.Random;
  4. using Robust.Shared.Timing;
  5. namespace Content.Server.Tesla.EntitySystems;
  6. /// <summary>
  7. /// Fires electric arcs at surrounding objects.
  8. /// </summary>
  9. public sealed class LightningArcShooterSystem : EntitySystem
  10. {
  11. [Dependency] private readonly IGameTiming _gameTiming = default!;
  12. [Dependency] private readonly LightningSystem _lightning = default!;
  13. [Dependency] private readonly IRobustRandom _random = default!;
  14. public override void Initialize()
  15. {
  16. base.Initialize();
  17. SubscribeLocalEvent<LightningArcShooterComponent, MapInitEvent>(OnShooterMapInit);
  18. }
  19. private void OnShooterMapInit(EntityUid uid, LightningArcShooterComponent component, ref MapInitEvent args)
  20. {
  21. component.NextShootTime = _gameTiming.CurTime + TimeSpan.FromSeconds(component.ShootMaxInterval);
  22. }
  23. public override void Update(float frameTime)
  24. {
  25. base.Update(frameTime);
  26. var query = EntityQueryEnumerator<LightningArcShooterComponent>();
  27. while (query.MoveNext(out var uid, out var arcShooter))
  28. {
  29. if (arcShooter.NextShootTime > _gameTiming.CurTime)
  30. continue;
  31. ArcShoot(uid, arcShooter);
  32. var delay = TimeSpan.FromSeconds(_random.NextFloat(arcShooter.ShootMinInterval, arcShooter.ShootMaxInterval));
  33. arcShooter.NextShootTime += delay;
  34. }
  35. }
  36. private void ArcShoot(EntityUid uid, LightningArcShooterComponent component)
  37. {
  38. var arcs = _random.Next(1, component.MaxLightningArc);
  39. _lightning.ShootRandomLightnings(uid, component.ShootRange, arcs, component.LightningPrototype, component.ArcDepth);
  40. }
  41. }