SpawnPointSystem.cs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. using Content.Server.GameTicking;
  2. using Content.Server.Spawners.Components;
  3. using Content.Server.Station.Systems;
  4. using Robust.Shared.Map;
  5. using Robust.Shared.Random;
  6. namespace Content.Server.Spawners.EntitySystems;
  7. public sealed class SpawnPointSystem : EntitySystem
  8. {
  9. [Dependency] private readonly GameTicker _gameTicker = default!;
  10. [Dependency] private readonly IRobustRandom _random = default!;
  11. [Dependency] private readonly StationSystem _stationSystem = default!;
  12. [Dependency] private readonly StationSpawningSystem _stationSpawning = default!;
  13. public override void Initialize()
  14. {
  15. SubscribeLocalEvent<PlayerSpawningEvent>(OnPlayerSpawning);
  16. }
  17. private void OnPlayerSpawning(PlayerSpawningEvent args)
  18. {
  19. if (args.SpawnResult != null)
  20. return;
  21. // TODO: Cache all this if it ends up important.
  22. var points = EntityQueryEnumerator<SpawnPointComponent, TransformComponent>();
  23. var possiblePositions = new List<EntityCoordinates>();
  24. while ( points.MoveNext(out var uid, out var spawnPoint, out var xform))
  25. {
  26. if (args.Station != null && _stationSystem.GetOwningStation(uid, xform) != args.Station)
  27. continue;
  28. if (_gameTicker.RunLevel == GameRunLevel.InRound && spawnPoint.SpawnType == SpawnPointType.LateJoin)
  29. {
  30. possiblePositions.Add(xform.Coordinates);
  31. }
  32. if (_gameTicker.RunLevel != GameRunLevel.InRound &&
  33. spawnPoint.SpawnType == SpawnPointType.Job &&
  34. (args.Job == null || spawnPoint.Job == args.Job))
  35. {
  36. possiblePositions.Add(xform.Coordinates);
  37. }
  38. }
  39. if (possiblePositions.Count == 0)
  40. {
  41. // Ok we've still not returned, but we need to put them /somewhere/.
  42. // TODO: Refactor gameticker spawning code so we don't have to do this!
  43. var points2 = EntityQueryEnumerator<SpawnPointComponent, TransformComponent>();
  44. if (points2.MoveNext(out var spawnPoint, out var xform))
  45. {
  46. possiblePositions.Add(xform.Coordinates);
  47. }
  48. else
  49. {
  50. Log.Error("No spawn points were available!");
  51. return;
  52. }
  53. }
  54. var spawnLoc = _random.Pick(possiblePositions);
  55. args.SpawnResult = _stationSpawning.SpawnPlayerMob(
  56. spawnLoc,
  57. args.Job,
  58. args.HumanoidCharacterProfile,
  59. args.Station);
  60. }
  61. }