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:
metalgearsloth
2024-08-29 15:27:47 +10:00
committed by GitHub
parent 2fd57c2d4a
commit f0615ec3c8
6 changed files with 14 additions and 61 deletions

View File

@@ -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);

View File

@@ -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))

View File

@@ -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)

View File

@@ -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;

View File

@@ -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>

View File

@@ -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