* Loadouts redux * Loadout window mockup * More workout * rent * validation * Developments * bcs * More cleanup * Rebuild working * Fix model and loading * obsession * efcore * We got a stew goin * Cleanup * Optional + SeniorEngineering fix * Fixes * Update science.yml * add add * Automatic naming * Update nukeops * Coming together * Right now * stargate * rejig the UI * weh * Loadouts tweaks * Merge conflicts + ordering fix * yerba mate * chocolat * More updates * Add multi-selection support * test h * fikss * a * add tech assistant and hazard suit * huh * Latest changes * add medical loadouts * and science * finish security loadouts * cargo * service done * added wildcards * add command * Move restrictions * Finalising * Fix existing work * Localise next batch * clothing fix * Fix storage names * review * the scooping room * Test fixes * Xamlify * Xamlify this too * Update Resources/Prototypes/Loadouts/Jobs/Medical/paramedic.yml Co-authored-by: Mr. 27 <45323883+Dutch-VanDerLinde@users.noreply.github.com> * Update Resources/Prototypes/Loadouts/loadout_groups.yml Co-authored-by: Mr. 27 <45323883+Dutch-VanDerLinde@users.noreply.github.com> * Update Resources/Prototypes/Loadouts/Jobs/Civilian/clown.yml Co-authored-by: Mr. 27 <45323883+Dutch-VanDerLinde@users.noreply.github.com> * Update Resources/Prototypes/Loadouts/Jobs/Civilian/clown.yml Co-authored-by: Mr. 27 <45323883+Dutch-VanDerLinde@users.noreply.github.com> * Update Resources/Prototypes/Loadouts/loadout_groups.yml Co-authored-by: Mr. 27 <45323883+Dutch-VanDerLinde@users.noreply.github.com> * Update Resources/Prototypes/Loadouts/Jobs/Security/detective.yml Co-authored-by: Mr. 27 <45323883+Dutch-VanDerLinde@users.noreply.github.com> * Update Resources/Prototypes/Loadouts/loadout_groups.yml Co-authored-by: Mr. 27 <45323883+Dutch-VanDerLinde@users.noreply.github.com> * ben * Margins --------- Co-authored-by: Firewatch <54725557+musicmanvr@users.noreply.github.com> Co-authored-by: Mr. 27 <koolthunder019@gmail.com> Co-authored-by: Mr. 27 <45323883+Dutch-VanDerLinde@users.noreply.github.com>
74 lines
2.5 KiB
C#
74 lines
2.5 KiB
C#
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)
|
|
{
|
|
possiblePositions.Add(xform.Coordinates);
|
|
}
|
|
|
|
if (_gameTicker.RunLevel != GameRunLevel.InRound &&
|
|
spawnPoint.SpawnType == SpawnPointType.Job &&
|
|
(args.Job == null || spawnPoint.Job?.ID == args.Job.Prototype))
|
|
{
|
|
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);
|
|
}
|
|
}
|