fish-station/Content.Server/Spawners/EntitySystems/SpawnPointSystem.cs

88 lines
3.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Content.Server.GameTicking;
using Content.Server.Spawners.Components;
using Content.Server.Station.Systems;
using Robust.Shared.Map;
using Robust.Shared.Random;
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!;
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;
if (_gameTicker.RunLevel == GameRunLevel.InRound && spawnPoint.SpawnType == SpawnPointType.LateJoin && args.LateJoin) // Sunrise-edit
{
possiblePositions.Add(xform.Coordinates);
}
if ((_gameTicker.RunLevel != GameRunLevel.InRound || args.LateJoin is false) && // Sunrise-edit
spawnPoint.SpawnType == SpawnPointType.Job &&
(args.Job == null || spawnPoint.Job?.ID == args.Job.Prototype))
{
possiblePositions.Add(xform.Coordinates);
}
}
// Sunrise-start
// Чтобы роли у которых нет спавнеров появились в +- подходящем месте а не были закинуты в каюту капитана.
if (possiblePositions.Count == 0)
{
var points3 = EntityQueryEnumerator<SpawnPointComponent, TransformComponent>();
while (points3.MoveNext(out var uid, out var spawnPoint, out var xform))
{
if (spawnPoint.SpawnType != SpawnPointType.LateJoin)
continue;
if (_stationSystem.GetOwningStation(uid, xform) == args.Station)
possiblePositions.Add(xform.Coordinates);
}
}
// Sunrise-end
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);
}
}