| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- using Content.Server.GameTicking;
- using Content.Server.Spawners.Components;
- using Content.Server.Station.Systems;
- using Robust.Shared.Map;
- using Robust.Shared.Random;
- using Robust.Shared.Prototypes;
- namespace Content.Server.Spawners.EntitySystems;
- public sealed class SpawnPointSystem : EntitySystem
- {
- [Dependency] private readonly GameTicker _gameTicker = default!;
- [Dependency] private readonly IRobustRandom _random = default!;
- [Dependency] private readonly StationSystem _stationSystem = default!;
- [Dependency] private readonly StationSpawningSystem _stationSpawning = default!;
- [Dependency] private readonly IPrototypeManager _prototypeManager = default!;
- public override void Initialize()
- {
- SubscribeLocalEvent<PlayerSpawningEvent>(OnPlayerSpawning);
- }
- private void OnPlayerSpawning(PlayerSpawningEvent args)
- {
- if (args.SpawnResult != null)
- return;
- // TODO: Cache all this if it ends up important.
- var points = EntityQueryEnumerator<SpawnPointComponent, TransformComponent>();
- var possiblePositions = new List<EntityCoordinates>();
- while (points.MoveNext(out var uid, out var spawnPoint, out var xform))
- {
- if (args.Station != null && _stationSystem.GetOwningStation(uid, xform) != args.Station)
- continue;
- // Try to get the actual JobPrototype data from the ID (args.Job)
- if (args.Job != null && _prototypeManager.TryIndex(args.Job.Value, out var jobPrototype))
- {
- if (jobPrototype != null && jobPrototype.Faction == spawnPoint.Faction)
- {
- possiblePositions.Add(xform.Coordinates);
- }
- }
- if (_gameTicker.RunLevel == GameRunLevel.InRound && spawnPoint.SpawnType == SpawnPointType.LateJoin)
- {
- possiblePositions.Add(xform.Coordinates);
- }
- if (_gameTicker.RunLevel != GameRunLevel.InRound &&
- spawnPoint.SpawnType == SpawnPointType.Job &&
- (args.Job == null || spawnPoint.Job == args.Job))
- {
- possiblePositions.Add(xform.Coordinates);
- }
- }
- if (possiblePositions.Count == 0)
- {
- // Ok we've still not returned, but we need to put them /somewhere/.
- // TODO: Refactor gameticker spawning code so we don't have to do this!
- var points2 = EntityQueryEnumerator<SpawnPointComponent, TransformComponent>();
- if (points2.MoveNext(out var spawnPoint, out var xform))
- {
- possiblePositions.Add(xform.Coordinates);
- }
- else
- {
- Log.Error("No spawn points were available!");
- return;
- }
- }
- var spawnLoc = _random.Pick(possiblePositions);
- args.SpawnResult = _stationSpawning.SpawnPlayerMob(
- spawnLoc,
- args.Job,
- args.HumanoidCharacterProfile,
- args.Station);
- }
- }
|