Fixup playerspawn stuff (#31546)
* Fixup playerspawn stuff - Also removed arrivals forcing, this should just turn containerspawnpoint off. * fix this one * test fix * really fix
This commit is contained in:
@@ -248,14 +248,14 @@ namespace Content.IntegrationTests.Tests
|
|||||||
var jobs = new HashSet<ProtoId<JobPrototype>>(comp.SetupAvailableJobs.Keys);
|
var jobs = new HashSet<ProtoId<JobPrototype>>(comp.SetupAvailableJobs.Keys);
|
||||||
|
|
||||||
var spawnPoints = entManager.EntityQuery<SpawnPointComponent>()
|
var spawnPoints = entManager.EntityQuery<SpawnPointComponent>()
|
||||||
.Where(x => x.SpawnType == SpawnPointType.Job)
|
.Where(x => x.SpawnType == SpawnPointType.Job && x.Job != null)
|
||||||
.Select(x => x.Job!.Value);
|
.Select(x => x.Job.Value);
|
||||||
|
|
||||||
jobs.ExceptWith(spawnPoints);
|
jobs.ExceptWith(spawnPoints);
|
||||||
|
|
||||||
spawnPoints = entManager.EntityQuery<ContainerSpawnPointComponent>()
|
spawnPoints = entManager.EntityQuery<ContainerSpawnPointComponent>()
|
||||||
.Where(x => x.SpawnType == SpawnPointType.Job)
|
.Where(x => x.SpawnType is SpawnPointType.Job or SpawnPointType.Unset && x.Job != null)
|
||||||
.Select(x => x.Job!.Value);
|
.Select(x => x.Job.Value);
|
||||||
|
|
||||||
jobs.ExceptWith(spawnPoints);
|
jobs.ExceptWith(spawnPoints);
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ using Content.Server.Screens.Components;
|
|||||||
using Content.Server.Shuttles.Components;
|
using Content.Server.Shuttles.Components;
|
||||||
using Content.Server.Shuttles.Events;
|
using Content.Server.Shuttles.Events;
|
||||||
using Content.Server.Spawners.Components;
|
using Content.Server.Spawners.Components;
|
||||||
|
using Content.Server.Spawners.EntitySystems;
|
||||||
using Content.Server.Station.Components;
|
using Content.Server.Station.Components;
|
||||||
using Content.Server.Station.Events;
|
using Content.Server.Station.Events;
|
||||||
using Content.Server.Station.Systems;
|
using Content.Server.Station.Systems;
|
||||||
@@ -69,11 +70,6 @@ public sealed class ArrivalsSystem : EntitySystem
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public bool Enabled { get; private set; }
|
public bool Enabled { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Flags if all players must arrive via the Arrivals system, or if they can spawn in other ways.
|
|
||||||
/// </summary>
|
|
||||||
public bool Forced { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Flags if all players spawning at the departure terminal have godmode until they leave the terminal.
|
/// Flags if all players spawning at the departure terminal have godmode until they leave the terminal.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -95,6 +91,8 @@ public sealed class ArrivalsSystem : EntitySystem
|
|||||||
{
|
{
|
||||||
base.Initialize();
|
base.Initialize();
|
||||||
|
|
||||||
|
SubscribeLocalEvent<PlayerSpawningEvent>(HandlePlayerSpawning, before: new []{ typeof(ContainerSpawnPointSystem), typeof(SpawnPointSystem)});
|
||||||
|
|
||||||
SubscribeLocalEvent<StationArrivalsComponent, StationPostInitEvent>(OnStationPostInit);
|
SubscribeLocalEvent<StationArrivalsComponent, StationPostInitEvent>(OnStationPostInit);
|
||||||
|
|
||||||
SubscribeLocalEvent<ArrivalsShuttleComponent, ComponentStartup>(OnShuttleStartup);
|
SubscribeLocalEvent<ArrivalsShuttleComponent, ComponentStartup>(OnShuttleStartup);
|
||||||
@@ -112,11 +110,9 @@ public sealed class ArrivalsSystem : EntitySystem
|
|||||||
|
|
||||||
// Don't invoke immediately as it will get set in the natural course of things.
|
// Don't invoke immediately as it will get set in the natural course of things.
|
||||||
Enabled = _cfgManager.GetCVar(CCVars.ArrivalsShuttles);
|
Enabled = _cfgManager.GetCVar(CCVars.ArrivalsShuttles);
|
||||||
Forced = _cfgManager.GetCVar(CCVars.ForceArrivals);
|
|
||||||
ArrivalsGodmode = _cfgManager.GetCVar(CCVars.GodmodeArrivals);
|
ArrivalsGodmode = _cfgManager.GetCVar(CCVars.GodmodeArrivals);
|
||||||
|
|
||||||
_cfgManager.OnValueChanged(CCVars.ArrivalsShuttles, SetArrivals);
|
_cfgManager.OnValueChanged(CCVars.ArrivalsShuttles, SetArrivals);
|
||||||
_cfgManager.OnValueChanged(CCVars.ForceArrivals, b => Forced = b);
|
|
||||||
_cfgManager.OnValueChanged(CCVars.GodmodeArrivals, b => ArrivalsGodmode = b);
|
_cfgManager.OnValueChanged(CCVars.GodmodeArrivals, b => ArrivalsGodmode = b);
|
||||||
|
|
||||||
// Command so admins can set these for funsies
|
// Command so admins can set these for funsies
|
||||||
@@ -339,7 +335,7 @@ public sealed class ArrivalsSystem : EntitySystem
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// Only works on latejoin even if enabled.
|
// Only works on latejoin even if enabled.
|
||||||
if (!Enabled || !Forced && _ticker.RunLevel != GameRunLevel.InRound)
|
if (!Enabled || _ticker.RunLevel != GameRunLevel.InRound)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!HasComp<StationArrivalsComponent>(ev.Station))
|
if (!HasComp<StationArrivalsComponent>(ev.Station))
|
||||||
|
|||||||
@@ -15,6 +15,12 @@ public sealed class ContainerSpawnPointSystem : EntitySystem
|
|||||||
[Dependency] private readonly StationSystem _station = default!;
|
[Dependency] private readonly StationSystem _station = default!;
|
||||||
[Dependency] private readonly StationSpawningSystem _stationSpawning = default!;
|
[Dependency] private readonly StationSpawningSystem _stationSpawning = default!;
|
||||||
|
|
||||||
|
public override void Initialize()
|
||||||
|
{
|
||||||
|
base.Initialize();
|
||||||
|
SubscribeLocalEvent<PlayerSpawningEvent>(HandlePlayerSpawning, before: new []{ typeof(SpawnPointSystem) });
|
||||||
|
}
|
||||||
|
|
||||||
public void HandlePlayerSpawning(PlayerSpawningEvent args)
|
public void HandlePlayerSpawning(PlayerSpawningEvent args)
|
||||||
{
|
{
|
||||||
if (args.SpawnResult != null)
|
if (args.SpawnResult != null)
|
||||||
|
|||||||
@@ -56,27 +56,11 @@ public sealed class StationSpawningSystem : SharedStationSpawningSystem
|
|||||||
|
|
||||||
private bool _randomizeCharacters;
|
private bool _randomizeCharacters;
|
||||||
|
|
||||||
private Dictionary<SpawnPriorityPreference, Action<PlayerSpawningEvent>> _spawnerCallbacks = new();
|
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
base.Initialize();
|
base.Initialize();
|
||||||
Subs.CVar(_configurationManager, CCVars.ICRandomCharacters, e => _randomizeCharacters = e, true);
|
Subs.CVar(_configurationManager, CCVars.ICRandomCharacters, e => _randomizeCharacters = e, true);
|
||||||
|
|
||||||
_spawnerCallbacks = new Dictionary<SpawnPriorityPreference, Action<PlayerSpawningEvent>>()
|
|
||||||
{
|
|
||||||
{ SpawnPriorityPreference.Arrivals, _arrivalsSystem.HandlePlayerSpawning },
|
|
||||||
{
|
|
||||||
SpawnPriorityPreference.Cryosleep, ev =>
|
|
||||||
{
|
|
||||||
if (_arrivalsSystem.Forced)
|
|
||||||
_arrivalsSystem.HandlePlayerSpawning(ev);
|
|
||||||
else
|
|
||||||
_containerSpawnPointSystem.HandlePlayerSpawning(ev);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -98,33 +82,7 @@ public sealed class StationSpawningSystem : SharedStationSpawningSystem
|
|||||||
|
|
||||||
var ev = new PlayerSpawningEvent(job, profile, station);
|
var ev = new PlayerSpawningEvent(job, profile, station);
|
||||||
|
|
||||||
if (station != null && profile != null)
|
|
||||||
{
|
|
||||||
// Try to call the character's preferred spawner first.
|
|
||||||
if (_spawnerCallbacks.TryGetValue(profile.SpawnPriority, out var preferredSpawner))
|
|
||||||
{
|
|
||||||
preferredSpawner(ev);
|
|
||||||
|
|
||||||
foreach (var (key, remainingSpawner) in _spawnerCallbacks)
|
|
||||||
{
|
|
||||||
if (key == profile.SpawnPriority)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
remainingSpawner(ev);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Call all of them in the typical order.
|
|
||||||
foreach (var typicalSpawner in _spawnerCallbacks.Values)
|
|
||||||
{
|
|
||||||
typicalSpawner(ev);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
RaiseLocalEvent(ev);
|
RaiseLocalEvent(ev);
|
||||||
|
|
||||||
DebugTools.Assert(ev.SpawnResult is { Valid: true } or null);
|
DebugTools.Assert(ev.SpawnResult is { Valid: true } or null);
|
||||||
|
|
||||||
return ev.SpawnResult;
|
return ev.SpawnResult;
|
||||||
|
|||||||
@@ -1478,12 +1478,6 @@ namespace Content.Shared.CCVar
|
|||||||
public static readonly CVarDef<bool> ArrivalsReturns =
|
public static readonly CVarDef<bool> ArrivalsReturns =
|
||||||
CVarDef.Create("shuttle.arrivals_returns", false, CVar.SERVERONLY);
|
CVarDef.Create("shuttle.arrivals_returns", false, CVar.SERVERONLY);
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Should all players be forced to spawn at departures, even on roundstart, even if their loadout says they spawn in cryo?
|
|
||||||
/// </summary>
|
|
||||||
public static readonly CVarDef<bool> ForceArrivals =
|
|
||||||
CVarDef.Create("shuttle.force_arrivals", false, CVar.SERVERONLY);
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Should all players who spawn at arrivals have godmode until they leave the map?
|
/// Should all players who spawn at arrivals have godmode until they leave the map?
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -242,7 +242,6 @@
|
|||||||
suffix: Job spawn
|
suffix: Job spawn
|
||||||
components:
|
components:
|
||||||
- type: ContainerSpawnPoint
|
- type: ContainerSpawnPoint
|
||||||
spawnType: Job
|
|
||||||
containerId: station_ai_mind_slot
|
containerId: station_ai_mind_slot
|
||||||
job: StationAi
|
job: StationAi
|
||||||
- type: Sprite
|
- type: Sprite
|
||||||
|
|||||||
Reference in New Issue
Block a user