SpawnerSystem.cs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. using System.Threading;
  2. using Content.Server.Spawners.Components;
  3. using Robust.Shared.Random;
  4. using Content.Shared.Friends.Components; // Shitmed Change
  5. using Content.Shared._Shitmed.Spawners.EntitySystems; // Shitmed Change
  6. namespace Content.Server.Spawners.EntitySystems;
  7. public sealed class SpawnerSystem : EntitySystem
  8. {
  9. [Dependency] private readonly IRobustRandom _random = default!;
  10. public override void Initialize()
  11. {
  12. base.Initialize();
  13. SubscribeLocalEvent<TimedSpawnerComponent, ComponentInit>(OnSpawnerInit);
  14. SubscribeLocalEvent<TimedSpawnerComponent, ComponentShutdown>(OnTimedSpawnerShutdown);
  15. }
  16. private void OnSpawnerInit(EntityUid uid, TimedSpawnerComponent component, ComponentInit args)
  17. {
  18. component.TokenSource?.Cancel();
  19. component.TokenSource = new CancellationTokenSource();
  20. uid.SpawnRepeatingTimer(TimeSpan.FromSeconds(component.IntervalSeconds), () => OnTimerFired(uid, component), component.TokenSource.Token);
  21. }
  22. private void OnTimerFired(EntityUid uid, TimedSpawnerComponent component)
  23. {
  24. if (!_random.Prob(component.Chance))
  25. return;
  26. var number = _random.Next(component.MinimumEntitiesSpawned, component.MaximumEntitiesSpawned);
  27. var coordinates = Transform(uid).Coordinates;
  28. for (var i = 0; i < number; i++)
  29. {
  30. var entity = _random.Pick(component.Prototypes);
  31. // Shitmed Change Start
  32. var spawnedEnt = SpawnAtPosition(entity, coordinates);
  33. var ev = new SpawnerSpawnedEvent(spawnedEnt, HasComp<PettableFriendComponent>(spawnedEnt));
  34. RaiseLocalEvent(uid, ev);
  35. // Shitmed Change End
  36. }
  37. }
  38. private void OnTimedSpawnerShutdown(EntityUid uid, TimedSpawnerComponent component, ComponentShutdown args)
  39. {
  40. component.TokenSource?.Cancel();
  41. }
  42. }