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.