CatStation/Content.Server/Spawners/EntitySystems/SpawnerSystem.cs
Xale 8efb13db22
TimedSpawner can spawn objects in containers (#46212)
* TimedSpawner can spawn objects in containers

* Hatch ducks and chickens into containers

* Update Content.Server/Spawners/EntitySystems/SpawnerSystem.cs

---------

Co-authored-by: Pok <113675512+Pok27@users.noreply.github.com>
2026-10-01 18:20:10 +00:00

58 lines
1.7 KiB
C#

using Content.Server.Spawners.Components;
using Robust.Shared.Random;
using Robust.Shared.Timing;
namespace Content.Server.Spawners.EntitySystems;
public sealed partial class SpawnerSystem : EntitySystem
{
[Dependency] private IGameTiming _timing = default!;
[Dependency] private IRobustRandom _random = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<TimedSpawnerComponent, MapInitEvent>(OnMapInit);
}
public override void Update(float frameTime)
{
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)
{
if (!_random.Prob(component.Chance))
return;
var number = _random.Next(component.MinimumEntitiesSpawned, component.MaximumEntitiesSpawned);
var coordinates = Transform(uid).Coordinates;
for (var i = 0; i < number; i++)
{
var entity = _random.Pick(component.Prototypes);
if (component.AllowContainerPlacement)
SpawnNextToOrDrop(entity, uid);
else
SpawnAtPosition(entity, coordinates);
}
}
}