diff --git a/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs b/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs
index 80e51089e3..5f7da63818 100644
--- a/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs
+++ b/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs
@@ -27,7 +27,6 @@ using Content.Shared.Roles;
using Robust.Server.GameObjects;
using Robust.Server.Maps;
using Robust.Server.Player;
-using Robust.Shared.Configuration;
using Robust.Shared.Map;
using Robust.Shared.Player;
using Robust.Shared.Prototypes;
@@ -40,7 +39,6 @@ public sealed class NukeopsRuleSystem : GameRuleSystem
{
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly IRobustRandom _random = default!;
- [Dependency] private readonly IConfigurationManager _cfg = default!;
[Dependency] private readonly IServerPreferencesManager _prefs = default!;
[Dependency] private readonly IChatManager _chatManager = default!;
[Dependency] private readonly IMapManager _mapManager = default!;
@@ -144,8 +142,9 @@ public sealed class NukeopsRuleSystem : GameRuleSystem
///
/// Players who played as an operative at some point in the round.
+ /// Stores the session as well as the entity name
///
- private readonly HashSet _operativePlayers = new();
+ private readonly Dictionary _operativePlayers = new();
public override void Initialize()
@@ -172,8 +171,9 @@ public sealed class NukeopsRuleSystem : GameRuleSystem
return;
var session = mindComponent.Mind?.Session;
+ var name = MetaData(uid).EntityName;
if (session != null)
- _operativePlayers.Add(session);
+ _operativePlayers.Add(name, session);
}
private void OnComponentRemove(EntityUid uid, NukeOperativeComponent component, ComponentRemove args)
@@ -331,7 +331,7 @@ public sealed class NukeopsRuleSystem : GameRuleSystem
_winConditions.Add(WinCondition.SomeNukiesAlive);
var diskAtCentCom = false;
- foreach (var (comp, transform) in EntityManager.EntityQuery())
+ foreach (var (_, transform) in EntityManager.EntityQuery())
{
var diskMapId = transform.MapID;
diskAtCentCom = _shuttleSystem.CentComMap == diskMapId;
@@ -373,9 +373,10 @@ public sealed class NukeopsRuleSystem : GameRuleSystem
}
ev.AddLine(Loc.GetString("nukeops-list-start"));
- foreach (var nukeop in _operativePlayers)
+ foreach (var (name, session) in _operativePlayers)
{
- ev.AddLine($"- {nukeop.Name}");
+ var listing = Loc.GetString("nukeops-list-name", ("name", name), ("user", session.Name));
+ ev.AddLine(listing);
}
}
@@ -545,7 +546,10 @@ public sealed class NukeopsRuleSystem : GameRuleSystem
{
ev.PlayerPool.Remove(session);
GameTicker.PlayerJoinGame(session);
- _operativePlayers.Add(session);
+ var name = session.AttachedEntity == null
+ ? string.Empty
+ : MetaData(session.AttachedEntity.Value).EntityName;
+ _operativePlayers.Add(name, session);
}
}
@@ -580,8 +584,12 @@ public sealed class NukeopsRuleSystem : GameRuleSystem
if (!mind.TryGetSession(out var playerSession))
return;
+ if (_operativePlayers.ContainsValue(playerSession))
+ return;
- _operativePlayers.Add(playerSession);
+ var name = MetaData(uid).EntityName;
+
+ _operativePlayers.Add(name, playerSession);
if (_ticker.RunLevel != GameRunLevel.InRound)
return;
@@ -614,8 +622,7 @@ public sealed class NukeopsRuleSystem : GameRuleSystem
var mapId = _mapManager.CreateMap();
- var outpostGrids = _map.LoadMap(mapId, path.ToString());
- if (outpostGrids.Count == 0)
+ if (!_map.TryLoad(mapId, path.ToString(), out var outpostGrids) || outpostGrids.Count == 0)
{
Logger.ErrorS("nukies", $"Error loading map {path} for nukies!");
return false;
@@ -625,10 +632,13 @@ public sealed class NukeopsRuleSystem : GameRuleSystem
_nukieOutpost = outpostGrids[0];
// Listen I just don't want it to overlap.
- var shuttleId = _map.LoadGrid(mapId, shuttlePath.ToString(), new MapLoadOptions()
+ if (!_map.TryLoad(mapId, shuttlePath.ToString(), out var grids, new MapLoadOptions {Offset = Vector2.One*1000f}) || !grids.Any())
{
- Offset = Vector2.One * 1000f,
- });
+ Logger.ErrorS("nukies", $"Error loading grid {shuttlePath} for nukies!");
+ return false;
+ }
+
+ var shuttleId = grids.First();
// Naughty, someone saved the shuttle as a map.
if (Deleted(shuttleId))
@@ -691,7 +701,7 @@ public sealed class NukeopsRuleSystem : GameRuleSystem
_stationSpawningSystem.EquipStartingGear(mob, gearPrototype, profile);
_faction.RemoveFaction(mob, "NanoTrasen", false);
- _faction.AddFaction(mob, "Syndicate", true);
+ _faction.AddFaction(mob, "Syndicate");
}
private void SpawnOperatives(int spawnCount, List sessions, bool addSpawnPoints)
@@ -786,7 +796,6 @@ public sealed class NukeopsRuleSystem : GameRuleSystem
return;
_nukeopsRuleConfig = nukeOpsConfig;
-
var minPlayers = nukeOpsConfig.MinPlayers;
if (!ev.Forced && ev.Players.Length < minPlayers)
{
@@ -841,8 +850,10 @@ public sealed class NukeopsRuleSystem : GameRuleSystem
var query = EntityQuery(true);
foreach (var (_, mindComp) in query)
{
- if (mindComp.Mind != null && mindComp.Mind.TryGetSession(out var session) == true)
- _operativePlayers.Add(session);
+ if (mindComp.Mind == null || !mindComp.Mind.TryGetSession(out var session))
+ continue;
+ var name = MetaData(mindComp.Owner).EntityName;
+ _operativePlayers.Add(name, session);
}
if (GameTicker.RunLevel == GameRunLevel.InRound)
diff --git a/Resources/Locale/en-US/game-ticking/game-presets/preset-nukeops.ftl b/Resources/Locale/en-US/game-ticking/game-presets/preset-nukeops.ftl
index 3451329ae0..09ee01a8f4 100644
--- a/Resources/Locale/en-US/game-ticking/game-presets/preset-nukeops.ftl
+++ b/Resources/Locale/en-US/game-ticking/game-presets/preset-nukeops.ftl
@@ -5,11 +5,11 @@ nukeops-welcome =
You are a nuclear operative. Your goal is to blow up {$station}, and ensure that it is nothing but a pile of rubble. Your bosses, the Syndicate, have provided you with the tools you'll need for the task.
Death to Nanotrasen!
-nukeops-opsmajor = Syndicate major victory!
-nukeops-opsminor = Syndicate minor victory!
-nukeops-neutral = Neutral outcome!
-nukeops-crewminor = Crew minor victory!
-nukeops-crewmajor = Crew major victory!
+nukeops-opsmajor = [color=crimson]Syndicate major victory![/color]
+nukeops-opsminor = [color=crimson]Syndicate minor victory![/color]
+nukeops-neutral = [color=yellow]Neutral outcome![/color]
+nukeops-crewminor = [color=green]Crew minor victory![/color]
+nukeops-crewmajor = [color=green]Crew major victory![/color]
nukeops-cond-nukeexplodedoncorrectstation = The nuclear operatives managed to blow up the station.
nukeops-cond-nukeexplodedonnukieoutpost = The nuclear operative outpost was destroyed by a nuclear blast.
@@ -23,7 +23,8 @@ nukeops-cond-allnukiesdead = All nuclear operatives have died.
nukeops-cond-somenukiesalive = Some nuclear operatives died.
nukeops-cond-allnukiesalive = No nuclear operatives died.
-nukeops-list-start = The nuke ops were:
+nukeops-list-start = The operatives were:
+nukeops-list-name = - [color=White]{$name}[/color] ([color=gray]{$user}[/color])
nukeops-not-enough-ready-players = Not enough players readied up for the game! There were {$readyPlayersCount} players readied up out of {$minimumPlayers} needed. Can't start Nukeops.
nukeops-no-one-ready = No players readied up! Can't start Nukeops.