From 491b82c4a573732533ad6a6575a7ecfa5e37fbe6 Mon Sep 17 00:00:00 2001 From: Callmore <22885888+Callmore@users.noreply.github.com> Date: Tue, 22 Oct 2024 00:10:02 +0100 Subject: [PATCH] alright cool health bar is real also roles i guess hope it works --- .../UserInterface/SSSStatusUIController.cs | 216 ++++++++++++++++-- .../UserInterface/Widgets/SSSStatusGui.xaml | 14 +- .../SuspicionRuleSystem.Rules.cs | 8 +- .../SuspicionRuleSystem.Spawning.cs | 36 ++- .../SuspicionRuleSystem.Utility.cs | 3 +- .../SuspicionGameRule/SuspicionRuleSystem.cs | 5 +- Content.Server/_SSS/SuspicionRadarSystem.cs | 5 +- .../Components/SuspicionRadarComponent.cs | 2 +- .../Components/SuspicionRoleComponent.cs | 4 +- .../Components/SuspicionRuleComponent.cs | 32 ++- .../_SSS}/SuspicionPlayerComponent.cs | 2 +- 11 files changed, 287 insertions(+), 40 deletions(-) rename {Content.Server => Content.Shared}/_SSS/SuspicionGameRule/Components/SuspicionRadarComponent.cs (71%) rename {Content.Server => Content.Shared}/_SSS/SuspicionGameRule/Components/SuspicionRoleComponent.cs (83%) rename {Content.Server => Content.Shared}/_SSS/SuspicionGameRule/Components/SuspicionRuleComponent.cs (81%) rename {Content.Server/_SSS/SuspicionGameRule/Components => Content.Shared/_SSS}/SuspicionPlayerComponent.cs (95%) diff --git a/Content.Client/_SSS/UserInterface/SSSStatusUIController.cs b/Content.Client/_SSS/UserInterface/SSSStatusUIController.cs index 9ee760a014..e0ad0f814e 100644 --- a/Content.Client/_SSS/UserInterface/SSSStatusUIController.cs +++ b/Content.Client/_SSS/UserInterface/SSSStatusUIController.cs @@ -1,57 +1,245 @@ using Content.Client._SSS.UserInterface.Widgets; +using Content.Client.GameTicking.Managers; +using Content.Client.Mind; +using Content.Client.Resources; +using Content.Client.Roles; +using Content.Shared._SSS.SuspicionGameRule.Components; using Content.Shared.Damage; using Content.Shared.Mobs; using Content.Shared.Mobs.Components; using Content.Shared.Mobs.Systems; +using Robust.Client.Graphics; +using Robust.Client.Player; +using Robust.Client.ResourceManagement; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controllers; +using Robust.Shared.Timing; namespace Content.Client._SSS.UserInterface; public sealed class SSSStatusUIController : UIController, IOnSystemChanged { + [Dependency] private readonly IGameTiming _gameTiming = default!; + [Dependency] private readonly IResourceCache _resourceCache = default!; + [Dependency] private readonly IPlayerManager _playerManager = default!; private ISawmill _log = default!; - [UISystemDependency] private readonly MobThresholdSystem _mobThreshold = default!; + [UISystemDependency] private readonly MobThresholdSystem? _mobThreshold; + [UISystemDependency] private readonly ClientGameTicker? _clientGameTicker; + [UISystemDependency] private readonly RoleSystem? _role; + [UISystemDependency] private readonly MindSystem? _mind; + + private StyleBoxTexture _roleStyleBox = default!; public override void Initialize() { base.Initialize(); - // SubscribeLocalEvent(DoSomething); - _log = Logger.GetSawmill("StatusUI"); + SubscribeNetworkEvent(UpdateTimerEnd); + SubscribeNetworkEvent(PreroundStarted); + SubscribeNetworkEvent(UpdateRoleDisplay); + SubscribeNetworkEvent(UpdatePlayerSpawn); + _log.Info($"{nameof(SSSStatusUIController)} loaded."); + + var styleBox = new StyleBoxTexture() + { + Texture = _resourceCache.GetTexture("/Textures/Interface/Nano/button.svg.96dpi.png"), + }; + styleBox.SetPatchMargin(StyleBox.Margin.All, 10); + + _roleStyleBox = styleBox; } - private SSSStatusGui? StatusUI => UIManager.GetActiveUIWidgetOrNull(); + private TimeSpan _lastEndTime; + private TimeSpan _lastDrawnSeconds; - public void UpdateHealth(Entity ent) + private (string, Color)? _queuedRole = null; + private (string, float, float)? _queuedHealth = null; + + public override void FrameUpdate(FrameEventArgs args) { - var ui = StatusUI; + base.FrameUpdate(args); - if (ui == null) + // I LOVE THIS HACK I LOVE THIS HACK I LOVE THIS HACK I LOVE THIS HACK + SetRoleFromQueued(); + SetHealthBarFromQueued(); + + // TODO: limit this to only update when the timer is not the same + if (_clientGameTicker is null) return; - if (!EntityManager.TryGetComponent(ent, out var mobThresholds)) + if (_lastEndTime == TimeSpan.MinValue) return; + var drawTime = _lastEndTime.Subtract(_clientGameTicker.RoundDuration()); + if ((int)drawTime.TotalSeconds != (int)_lastDrawnSeconds.TotalSeconds) + { + UpdateTimer(drawTime); + _lastDrawnSeconds = drawTime; + } + } + + private SSSStatusGui? StatusUI => UIManager.GetActiveUIWidgetOrNull(); + + public void UpdateHealth(Entity ent) + { + if (!EntityManager.TryGetComponent(ent, out var mobState)) return; if (mobState.CurrentState == MobState.Dead) { - ui.HealthNumber.Text = "DEAD"; - ui.HealthBar.Value = 0; + SetHealthBarCustom("DEAD", 0, 100); return; } + if (!EntityManager.TryGetComponent(ent, out var mobThresholds)) + return; + + if (_mobThreshold is null) + return; + var maxHp = _mobThreshold.GetThresholdForState(ent, MobState.Critical, mobThresholds); - var hp = Math.Max(Math.Ceiling((maxHp - ent.Comp.TotalDamage).Float()), 0); + var hp = Math.Max(Math.Ceiling((maxHp - ent.Comp.TotalDamage).Double()), 0); + // var hp = Math.Max((maxHp - ent.Comp.TotalDamage).Float(), 0); + + SetHealthBar((float)hp, maxHp.Float()); + } + + private void SetHealthBarCustom(string text, float value, float maxValue) + { + var ui = StatusUI; + + if (ui == null) + { + _queuedHealth = (text, value, maxValue); + return; + } + + ui.HealthNumber.Text = text; + ui.HealthBar.MaxValue = maxValue; + ui.HealthBar.Value = value; + } + + private bool SetHealthBarFromQueued() + { + if (_queuedHealth is null) + return false; + + var ui = StatusUI; + if (ui is null) + return false; + + var (text, value, maxValue) = _queuedHealth.Value; + + ui.HealthNumber.Text = text; + ui.HealthBar.MaxValue = maxValue; + ui.HealthBar.Value = value; + _queuedHealth = null; + + return true; + } + + private void SetHealthBar(float hp, float maxHp) + { + SetHealthBarCustom($"\u2665 {hp}", hp, maxHp); + } + + private void UpdateTimer(TimeSpan ts) + { + var ui = StatusUI; + + if (ui == null) + return; + + if (ts < TimeSpan.Zero) + { + ts = TimeSpan.Zero; + } + + // nice job c#, TimeSpan.ToString doesn't support having no leading zeros + ui.TimerText.Text = $"{ts.Minutes}:{ts.Seconds:00}"; + } + + public void UpdateTimerEnd(SuspicionRuleTimerUpdate ev, EntitySessionEventArgs args) + { + _log.Info($"WHAT AT {ev.EndTime}"); + _lastEndTime = ev.EndTime; + } + + public void PreroundStarted(SuspicionRulePreroundStarted ev, EntitySessionEventArgs args) + { + _lastEndTime = ev.PreroundEndTime; + SetRoleCustom("Preround", Color.DarkGray); + } + + private void SetRoleCustom(string role, Color color) + { + var ui = StatusUI; + + if (ui is null) + { + _queuedRole = (role, color); + return; + } + + ui.RoleBG.PanelOverride = new StyleBoxTexture(_roleStyleBox) { Modulate = color }; + ui.RoleText.Text = role; + } + + private bool SetRoleFromQueued() + { + if (_queuedRole is null) + return false; + + var ui = StatusUI; + if (ui is null) + return false; + + var (role, color) = _queuedRole.Value; + + ui.RoleBG.PanelOverride = new StyleBoxTexture(_roleStyleBox) { Modulate = color }; + ui.RoleText.Text = role; + _queuedRole = null; + + return true; + } + + private void SetRoleToPreround() + { + SetRoleCustom("Preround", Color.DarkGray); + } + + private void SetRoleToObserbing() + { + SetRoleCustom("Obserbing", Color.DarkGray); + } + + public void UpdateRoleDisplay(SuspicionRuleUpdateRole ev, EntitySessionEventArgs args) + { + // ui.RoleBG.PanelOverride = new StyleBoxTexture(_roleStyleBox) { Modulate = Color.FromName(ev.NewRole.GetRoleColor()) }; + // ui.RoleText.Text = ev.NewRole.ToString(); + SetRoleCustom(ev.NewRole.ToString(), Color.FromName(ev.NewRole.GetRoleColor())); + } + + public void UpdatePlayerSpawn(SuspicionRulePlayerSpawn ev, EntitySessionEventArgs args) + { + if (ev.GameState == SuspicionGameState.Preparing) + { + SetRoleToPreround(); + + if (EntityManager.TryGetComponent(_playerManager.LocalEntity!.Value, out var damagable)) + UpdateHealth((_playerManager.LocalEntity!.Value, damagable)); + } + else + { + SetRoleToObserbing(); + SetHealthBar(0, 100); + } - ui.HealthNumber.Text = $"\u2665 {hp}"; - ui.HealthBar.MaxValue = maxHp.Float(); - ui.HealthBar.Value = (float)hp; + _lastEndTime = ev.EndTime; } public void OnSystemLoaded(DamageableSystem system) diff --git a/Content.Client/_SSS/UserInterface/Widgets/SSSStatusGui.xaml b/Content.Client/_SSS/UserInterface/Widgets/SSSStatusGui.xaml index 6678594270..02a40d8f45 100644 --- a/Content.Client/_SSS/UserInterface/Widgets/SSSStatusGui.xaml +++ b/Content.Client/_SSS/UserInterface/Widgets/SSSStatusGui.xaml @@ -16,19 +16,15 @@ - - - - - + + - - + + diff --git a/Content.Server/_SSS/SuspicionGameRule/SuspicionRuleSystem.Rules.cs b/Content.Server/_SSS/SuspicionGameRule/SuspicionRuleSystem.Rules.cs index 9360bfce9d..c56faafb02 100644 --- a/Content.Server/_SSS/SuspicionGameRule/SuspicionRuleSystem.Rules.cs +++ b/Content.Server/_SSS/SuspicionGameRule/SuspicionRuleSystem.Rules.cs @@ -1,8 +1,9 @@ using System.Linq; using Content.Server._SSS.GridMarker; -using Content.Server._SSS.SuspicionGameRule.Components; using Content.Server.Communications; using Content.Server.Ghost; +using Content.Shared._SSS; +using Content.Shared._SSS.SuspicionGameRule.Components; using Content.Shared.Chat; using Content.Shared.Damage; using Content.Shared.Damage.Prototypes; @@ -11,13 +12,10 @@ using Content.Shared.GameTicking.Components; using Content.Shared.Ghost; using Content.Shared.Hands.Components; -using Content.Shared.Implants.Components; using Content.Shared.Mobs; using Content.Shared.Mobs.Components; using Content.Shared.Overlays; using Content.Shared.Popups; -using Content.Shared.Store.Components; -using Robust.Shared.Network; namespace Content.Server._SSS.SuspicionGameRule; @@ -64,6 +62,8 @@ private void OnMobStateChanged(EntityUid uid, SuspicionPlayerComponent component sus.EndAt += TimeSpan.FromSeconds(sus.TimeAddedPerKill); sus.AnnouncedTimeLeft.Clear(); + RaiseNetworkEvent(new SuspicionRuleTimerUpdate(_gameTicker.RoundDuration() + sus.EndAt)); + var allTraitors = FindAllOfType(SuspicionRole.Traitor); // Ok this is fucking horrible foreach (var traitor in allTraitors) diff --git a/Content.Server/_SSS/SuspicionGameRule/SuspicionRuleSystem.Spawning.cs b/Content.Server/_SSS/SuspicionGameRule/SuspicionRuleSystem.Spawning.cs index 6bb2ca4ffa..561cdf9719 100644 --- a/Content.Server/_SSS/SuspicionGameRule/SuspicionRuleSystem.Spawning.cs +++ b/Content.Server/_SSS/SuspicionGameRule/SuspicionRuleSystem.Spawning.cs @@ -1,5 +1,4 @@ using System.Linq; -using Content.Server._SSS.SuspicionGameRule.Components; using Content.Server.Administration.Commands; using Content.Server.Atmos.Components; using Content.Server.GameTicking; @@ -9,6 +8,8 @@ using Content.Server.Roles; using Content.Server.Temperature.Components; using Content.Server.Traits.Assorted; +using Content.Shared._SSS; +using Content.Shared._SSS.SuspicionGameRule.Components; using Content.Shared.Access; using Content.Shared.Access.Components; using Content.Shared.Atmos.Rotting; @@ -26,6 +27,8 @@ namespace Content.Server._SSS.SuspicionGameRule; public sealed partial class SuspicionRuleSystem { + [Dependency] private readonly GameTicker _gameTicker = default!; + [ValidatePrototypeId] private const string MarkerPrototype = "SSSGridMarker"; @@ -112,6 +115,8 @@ private void StartRound(EntityUid uid, SuspicionRuleComponent component, GameRul Loc.GetString("traitor-briefing"), Color.Red, _traitorStartSound); + + RaiseNetworkEvent(new SuspicionRuleUpdateRole(SuspicionRole.Traitor), ownedEntity.Value); } for (var i = traitorCount; i < traitorCount + detectiveCount; i++) @@ -136,6 +141,7 @@ private void StartRound(EntityUid uid, SuspicionRuleComponent component, GameRul Loc.GetString("detective-briefing"), Color.Blue, briefingSound:null); + RaiseNetworkEvent(new SuspicionRuleUpdateRole(SuspicionRole.Detective), ownedEntity.Value); } // Anyone who isn't a traitor will get the innocent role. @@ -154,9 +160,14 @@ private void StartRound(EntityUid uid, SuspicionRuleComponent component, GameRul Loc.GetString("innocent-briefing"), briefingColor: Color.Green, briefingSound:null); + + RaiseNetworkEvent(new SuspicionRuleUpdateRole(SuspicionRole.Innocent), ownedEntity.Value); } _chatManager.DispatchServerAnnouncement($"The round has started. There are {traitorCount} traitors among us."); + + // SIMYON WHY + RaiseNetworkEvent(new SuspicionRuleTimerUpdate(_gameTicker.RoundDuration() + component.EndAt)); } private void OnBeforeSpawn(PlayerBeforeSpawnEvent ev) @@ -166,6 +177,7 @@ private void OnBeforeSpawn(PlayerBeforeSpawnEvent ev) .Select(p => new ProtoId(p.ID)) .ToArray(); + var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out var sus, out var gameRule)) { @@ -178,9 +190,31 @@ private void OnBeforeSpawn(PlayerBeforeSpawnEvent ev) _chatManager.DispatchServerMessage(ev.Player, "Sorry, the game has already started. You have been made an observer."); GameTicker.SpawnObserver(ev.Player); // Players can't join mid-round. ev.Handled = true; + if (sus.GameState == SuspicionGameState.InProgress) + { + RaiseNetworkEvent(new SuspicionRulePlayerSpawn() + { + GameState = SuspicionGameState.InProgress, + EndTime = _gameTicker.RoundDuration() + sus.EndAt, + }, ev.Player); + } + else if (sus.GameState == SuspicionGameState.PostRound) + { + RaiseNetworkEvent(new SuspicionRulePlayerSpawn() + { + GameState = SuspicionGameState.PostRound, + EndTime = TimeSpan.MinValue, + }, ev.Player); + } return; } + RaiseNetworkEvent(new SuspicionRulePlayerSpawn() + { + GameState = SuspicionGameState.Preparing, + EndTime = TimeSpan.FromSeconds(sus.PreparingDuration), + }, ev.Player); + var newMind = _mindSystem.CreateMind(ev.Player.UserId, ev.Profile.Name); _mindSystem.SetUserId(newMind, ev.Player.UserId); diff --git a/Content.Server/_SSS/SuspicionGameRule/SuspicionRuleSystem.Utility.cs b/Content.Server/_SSS/SuspicionGameRule/SuspicionRuleSystem.Utility.cs index c95fea4ee7..5f56d83774 100644 --- a/Content.Server/_SSS/SuspicionGameRule/SuspicionRuleSystem.Utility.cs +++ b/Content.Server/_SSS/SuspicionGameRule/SuspicionRuleSystem.Utility.cs @@ -1,4 +1,4 @@ -using Content.Server._SSS.SuspicionGameRule.Components; +using Content.Shared._SSS.SuspicionGameRule.Components; using Content.Shared.Chat; using Content.Shared.FixedPoint; using Content.Shared.Humanoid; @@ -7,7 +7,6 @@ using Content.Shared.Mind.Components; using Content.Shared.Roles; using Content.Shared.Store.Components; -using Robust.Server.Containers; using Robust.Shared.Map; using Robust.Shared.Physics.Components; diff --git a/Content.Server/_SSS/SuspicionGameRule/SuspicionRuleSystem.cs b/Content.Server/_SSS/SuspicionGameRule/SuspicionRuleSystem.cs index 1fdaa5fd73..4f1561425f 100644 --- a/Content.Server/_SSS/SuspicionGameRule/SuspicionRuleSystem.cs +++ b/Content.Server/_SSS/SuspicionGameRule/SuspicionRuleSystem.cs @@ -1,5 +1,4 @@ using System.Linq; -using Content.Server._SSS.SuspicionGameRule.Components; using Content.Server.Access.Systems; using Content.Server.Administration.Systems; using Content.Server.Antag; @@ -17,6 +16,8 @@ using Content.Server.RoundEnd; using Content.Server.Station.Systems; using Content.Server.Store.Systems; +using Content.Shared._SSS; +using Content.Shared._SSS.SuspicionGameRule.Components; using Content.Shared.Damage; using Content.Shared.Examine; using Content.Shared.GameTicking.Components; @@ -126,6 +127,8 @@ protected override void Started(EntityUid uid, SuspicionRuleComponent component, Timer.Spawn(TimeSpan.FromSeconds(component.PreparingDuration - 5), () => _chatManager.DispatchServerAnnouncement("The round will start in 5 seconds.")); Timer.Spawn(TimeSpan.FromSeconds(component.PreparingDuration), () => StartRound(uid, component, gameRule)); Log.Debug("Starting a game of Suspicion."); + + RaiseNetworkEvent(new SuspicionRulePreroundStarted(TimeSpan.FromSeconds(component.PreparingDuration))); } public override void Update(float frameTime) diff --git a/Content.Server/_SSS/SuspicionRadarSystem.cs b/Content.Server/_SSS/SuspicionRadarSystem.cs index 33709b0737..095b08ed7e 100644 --- a/Content.Server/_SSS/SuspicionRadarSystem.cs +++ b/Content.Server/_SSS/SuspicionRadarSystem.cs @@ -1,7 +1,8 @@ -using Content.Server._SSS.SuspicionGameRule.Components; -using Content.Server.Mind; +using Content.Server.Mind; using Content.Server.Roles; +using Content.Shared._SSS; using Content.Shared._SSS.RadarOverlay; +using Content.Shared._SSS.SuspicionGameRule.Components; using Content.Shared.Implants.Components; using Content.Shared.Mobs; using Content.Shared.Mobs.Systems; diff --git a/Content.Server/_SSS/SuspicionGameRule/Components/SuspicionRadarComponent.cs b/Content.Shared/_SSS/SuspicionGameRule/Components/SuspicionRadarComponent.cs similarity index 71% rename from Content.Server/_SSS/SuspicionGameRule/Components/SuspicionRadarComponent.cs rename to Content.Shared/_SSS/SuspicionGameRule/Components/SuspicionRadarComponent.cs index ab54b20b35..7ea237d4a0 100644 --- a/Content.Server/_SSS/SuspicionGameRule/Components/SuspicionRadarComponent.cs +++ b/Content.Shared/_SSS/SuspicionGameRule/Components/SuspicionRadarComponent.cs @@ -1,4 +1,4 @@ -namespace Content.Server._SSS.SuspicionGameRule.Components; +namespace Content.Shared._SSS.SuspicionGameRule.Components; [RegisterComponent] public sealed partial class SuspicionRadarComponent : Component diff --git a/Content.Server/_SSS/SuspicionGameRule/Components/SuspicionRoleComponent.cs b/Content.Shared/_SSS/SuspicionGameRule/Components/SuspicionRoleComponent.cs similarity index 83% rename from Content.Server/_SSS/SuspicionGameRule/Components/SuspicionRoleComponent.cs rename to Content.Shared/_SSS/SuspicionGameRule/Components/SuspicionRoleComponent.cs index 39290aa13c..fb6d4ce15a 100644 --- a/Content.Server/_SSS/SuspicionGameRule/Components/SuspicionRoleComponent.cs +++ b/Content.Shared/_SSS/SuspicionGameRule/Components/SuspicionRoleComponent.cs @@ -1,6 +1,7 @@ using Content.Shared.Roles; +using Robust.Shared.Serialization; -namespace Content.Server._SSS.SuspicionGameRule.Components; +namespace Content.Shared._SSS.SuspicionGameRule.Components; [RegisterComponent] public sealed partial class SuspicionRoleComponent : BaseMindRoleComponent @@ -23,6 +24,7 @@ public static string GetRoleColor(this SuspicionRole role) } } +[Serializable, NetSerializable] public enum SuspicionRole { Pending, diff --git a/Content.Server/_SSS/SuspicionGameRule/Components/SuspicionRuleComponent.cs b/Content.Shared/_SSS/SuspicionGameRule/Components/SuspicionRuleComponent.cs similarity index 81% rename from Content.Server/_SSS/SuspicionGameRule/Components/SuspicionRuleComponent.cs rename to Content.Shared/_SSS/SuspicionGameRule/Components/SuspicionRuleComponent.cs index 4cf80242a1..b30f0cee71 100644 --- a/Content.Server/_SSS/SuspicionGameRule/Components/SuspicionRuleComponent.cs +++ b/Content.Shared/_SSS/SuspicionGameRule/Components/SuspicionRuleComponent.cs @@ -1,13 +1,12 @@ using Content.Shared.NPC.Prototypes; -using Content.Shared.Radio; using Content.Shared.Roles; -using Robust.Shared.Map; using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -namespace Content.Server._SSS.SuspicionGameRule.Components; +namespace Content.Shared._SSS.SuspicionGameRule.Components; -[RegisterComponent, Access(typeof(SuspicionRuleSystem))] +[RegisterComponent] public sealed partial class SuspicionRuleComponent : Component { #region State management @@ -108,3 +107,28 @@ public enum SuspicionGameState /// PostRound } + +[Serializable, NetSerializable] +public sealed class SuspicionRuleTimerUpdate(TimeSpan endTime) : EntityEventArgs +{ + public TimeSpan EndTime = endTime; +} + +[Serializable, NetSerializable] +public sealed class SuspicionRulePreroundStarted(TimeSpan preroundEndTime) : EntityEventArgs +{ + public TimeSpan PreroundEndTime = preroundEndTime; +} + +[Serializable, NetSerializable] +public sealed class SuspicionRuleUpdateRole(SuspicionRole newRole) : EntityEventArgs +{ + public readonly SuspicionRole NewRole = newRole; +} + +[Serializable, NetSerializable] +public sealed class SuspicionRulePlayerSpawn : EntityEventArgs +{ + public SuspicionGameState GameState; + public TimeSpan EndTime; +} diff --git a/Content.Server/_SSS/SuspicionGameRule/Components/SuspicionPlayerComponent.cs b/Content.Shared/_SSS/SuspicionPlayerComponent.cs similarity index 95% rename from Content.Server/_SSS/SuspicionGameRule/Components/SuspicionPlayerComponent.cs rename to Content.Shared/_SSS/SuspicionPlayerComponent.cs index aaf87622b1..c98b262997 100644 --- a/Content.Server/_SSS/SuspicionGameRule/Components/SuspicionPlayerComponent.cs +++ b/Content.Shared/_SSS/SuspicionPlayerComponent.cs @@ -1,4 +1,4 @@ -namespace Content.Server._SSS; +namespace Content.Shared._SSS; /// /// Main component that marks a player "active" in a round of SSS.