mirror of
https://github.com/space-syndicate/space-station-14.git
synced 2026-10-09 10:21:18 +03:00
* 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>
58 lines
1.7 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|