Convert TimedSpawnerComponent to use an Update loop (#37785)
Convert TimedSpawnerComponent to use an Update loop
This commit is contained in:
@@ -1,25 +1,41 @@
|
||||
using System.Threading;
|
||||
using Content.Server.Spawners.Components;
|
||||
using Robust.Shared.Random;
|
||||
using Robust.Shared.Timing;
|
||||
|
||||
namespace Content.Server.Spawners.EntitySystems;
|
||||
|
||||
public sealed class SpawnerSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly IGameTiming _timing = default!;
|
||||
[Dependency] private readonly IRobustRandom _random = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
SubscribeLocalEvent<TimedSpawnerComponent, ComponentInit>(OnSpawnerInit);
|
||||
SubscribeLocalEvent<TimedSpawnerComponent, ComponentShutdown>(OnTimedSpawnerShutdown);
|
||||
|
||||
SubscribeLocalEvent<TimedSpawnerComponent, MapInitEvent>(OnMapInit);
|
||||
}
|
||||
|
||||
private void OnSpawnerInit(EntityUid uid, TimedSpawnerComponent component, ComponentInit args)
|
||||
public override void Update(float frameTime)
|
||||
{
|
||||
component.TokenSource?.Cancel();
|
||||
component.TokenSource = new CancellationTokenSource();
|
||||
uid.SpawnRepeatingTimer(TimeSpan.FromSeconds(component.IntervalSeconds), () => OnTimerFired(uid, component), component.TokenSource.Token);
|
||||
base.Update(frameTime);
|
||||
|
||||
var curTime = _timing.CurTime;
|
||||
var query = EntityQueryEnumerator<TimedSpawnerComponent>();
|
||||
while (query.MoveNext(out var uid, out var timedSpawner))
|
||||
{
|
||||
if (timedSpawner.NextFire > curTime)
|
||||
continue;
|
||||
|
||||
OnTimerFired(uid, timedSpawner);
|
||||
|
||||
timedSpawner.NextFire += timedSpawner.IntervalSeconds;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnMapInit(Entity<TimedSpawnerComponent> ent, ref MapInitEvent args)
|
||||
{
|
||||
ent.Comp.NextFire = _timing.CurTime + ent.Comp.IntervalSeconds;
|
||||
}
|
||||
|
||||
private void OnTimerFired(EntityUid uid, TimedSpawnerComponent component)
|
||||
@@ -36,9 +52,4 @@ public sealed class SpawnerSystem : EntitySystem
|
||||
SpawnAtPosition(entity, coordinates);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnTimedSpawnerShutdown(EntityUid uid, TimedSpawnerComponent component, ComponentShutdown args)
|
||||
{
|
||||
component.TokenSource?.Cancel();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user