SolutionInjectWhileEmbeddedSystem.cs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. using Content.Server.Chemistry.Components;
  2. using Content.Shared.Chemistry.Events;
  3. using Content.Shared.Projectiles;
  4. using Robust.Shared.Timing;
  5. namespace Content.Server.Chemistry.EntitySystems;
  6. /// <summary>
  7. /// System for handling injecting into an entity while a projectile is embedded.
  8. /// </summary>
  9. public sealed class SolutionInjectWhileEmbeddedSystem : EntitySystem
  10. {
  11. [Dependency] private readonly IGameTiming _gameTiming = default!;
  12. public override void Initialize()
  13. {
  14. base.Initialize();
  15. SubscribeLocalEvent<SolutionInjectWhileEmbeddedComponent, MapInitEvent>(OnMapInit);
  16. }
  17. private void OnMapInit(Entity<SolutionInjectWhileEmbeddedComponent> ent, ref MapInitEvent args)
  18. {
  19. ent.Comp.NextUpdate = _gameTiming.CurTime + ent.Comp.UpdateInterval;
  20. }
  21. public override void Update(float frameTime)
  22. {
  23. base.Update(frameTime);
  24. var query = EntityQueryEnumerator<SolutionInjectWhileEmbeddedComponent, EmbeddableProjectileComponent>();
  25. while (query.MoveNext(out var uid, out var injectComponent, out var projectileComponent))
  26. {
  27. if (_gameTiming.CurTime < injectComponent.NextUpdate)
  28. continue;
  29. injectComponent.NextUpdate += injectComponent.UpdateInterval;
  30. if(projectileComponent.EmbeddedIntoUid == null)
  31. continue;
  32. var ev = new InjectOverTimeEvent(projectileComponent.EmbeddedIntoUid.Value);
  33. RaiseLocalEvent(uid, ref ev);
  34. }
  35. }
  36. }