From 02b5632dac574dd2032812cf7dba07790fea80bc Mon Sep 17 00:00:00 2001 From: Exp Date: Fri, 21 Aug 2020 11:24:06 +0200 Subject: [PATCH] Observers are now shown in the Lobby as Observers (#1834) * Observers are now shown in the Lobby as Observers * Weviews adwessed --- .../GameTicking/ClientGameTicker.cs | 10 +++--- .../Interfaces/IClientGameTicker.cs | 3 +- Content.Client/State/LobbyState.cs | 25 +++++++++---- Content.Server/GameTicking/GameTicker.cs | 36 ++++++++++--------- Content.Shared/SharedGameTicker.cs | 24 ++++++++----- 5 files changed, 60 insertions(+), 38 deletions(-) diff --git a/Content.Client/GameTicking/ClientGameTicker.cs b/Content.Client/GameTicking/ClientGameTicker.cs index 1ae8bcd8a7..3eeda60421 100644 --- a/Content.Client/GameTicking/ClientGameTicker.cs +++ b/Content.Client/GameTicking/ClientGameTicker.cs @@ -30,7 +30,7 @@ namespace Content.Client.GameTicking [ViewVariables] public string ServerInfoBlob { get; private set; } [ViewVariables] public DateTime StartTime { get; private set; } [ViewVariables] public bool Paused { get; private set; } - [ViewVariables] public Dictionary Ready { get; private set; } + [ViewVariables] public Dictionary Status { get; private set; } public event Action InfoBlobUpdated; public event Action LobbyStatusUpdated; @@ -54,7 +54,7 @@ namespace Content.Client.GameTicking }); _netManager.RegisterNetMessage(nameof(MsgTickerLateJoinStatus), LateJoinStatus); - Ready = new Dictionary(); + Status = new Dictionary(); _initialized = true; } @@ -77,7 +77,7 @@ namespace Content.Client.GameTicking AreWeReady = message.YouAreReady; Paused = message.Paused; if (IsGameStarted) - Ready.Clear(); + Status.Clear(); LobbyStatusUpdated?.Invoke(); } @@ -103,9 +103,9 @@ namespace Content.Client.GameTicking private void LobbyReady(MsgTickerLobbyReady message) { // Merge the Dictionaries - foreach (var p in message.PlayerReady) + foreach (var p in message.PlayerStatus) { - Ready[p.Key] = p.Value; + Status[p.Key] = p.Value; } LobbyReadyUpdated?.Invoke(); } diff --git a/Content.Client/Interfaces/IClientGameTicker.cs b/Content.Client/Interfaces/IClientGameTicker.cs index e1e584e2f3..45e9a05faf 100644 --- a/Content.Client/Interfaces/IClientGameTicker.cs +++ b/Content.Client/Interfaces/IClientGameTicker.cs @@ -1,6 +1,7 @@ using Robust.Shared.Network; using System; using System.Collections.Generic; +using static Content.Shared.SharedGameTicker; namespace Content.Client.Interfaces { @@ -12,7 +13,7 @@ namespace Content.Client.Interfaces bool DisallowedLateJoin { get; } DateTime StartTime { get; } bool Paused { get; } - Dictionary Ready { get; } + Dictionary Status { get; } void Initialize(); event Action InfoBlobUpdated; diff --git a/Content.Client/State/LobbyState.cs b/Content.Client/State/LobbyState.cs index 2580dadb64..d3f756a0c8 100644 --- a/Content.Client/State/LobbyState.cs +++ b/Content.Client/State/LobbyState.cs @@ -18,6 +18,7 @@ using Robust.Shared.Localization; using Robust.Shared.Prototypes; using Robust.Shared.Timing; using Robust.Shared.ViewVariables; +using static Content.Shared.SharedGameTicker; namespace Content.Client.State { @@ -112,7 +113,7 @@ namespace Content.Client.State _clientGameTicker.LobbyReadyUpdated -= LobbyReadyUpdated; _clientGameTicker.LobbyLateJoinStatusUpdated -= LobbyLateJoinStatusUpdated; - _clientGameTicker.Ready.Clear(); + _clientGameTicker.Status.Clear(); _lobby.Dispose(); _characterSetup.Dispose(); @@ -158,11 +159,14 @@ namespace Content.Client.State private void PlayerManagerOnPlayerListUpdated(object sender, EventArgs e) { // Remove disconnected sessions from the Ready Dict - foreach (var p in _clientGameTicker.Ready) + foreach (var p in _clientGameTicker.Status) { if (!_playerManager.SessionsDict.TryGetValue(p.Key, out _)) { - _clientGameTicker.Ready.Remove(p.Key); + // This is a shitty fix. Observers can rejoin because they are already in the game. + // So we don't delete them, but keep them if they decide to rejoin + if (p.Value != PlayerStatus.Observer) + _clientGameTicker.Status.Remove(p.Key); } } UpdatePlayerList(); @@ -218,12 +222,19 @@ namespace Content.Client.State // Don't show ready state if we're ingame if (!_clientGameTicker.IsGameStarted) { - var ready = false; + var status = PlayerStatus.NotReady; if (session.SessionId == _playerManager.LocalPlayer.SessionId) - ready = _clientGameTicker.AreWeReady; + status = _clientGameTicker.AreWeReady ? PlayerStatus.Ready : PlayerStatus.NotReady; else - _clientGameTicker.Ready.TryGetValue(session.SessionId, out ready); - readyState = ready ? Loc.GetString("Ready") : Loc.GetString("Not Ready"); + _clientGameTicker.Status.TryGetValue(session.SessionId, out status); + + readyState = status switch + { + PlayerStatus.NotReady => Loc.GetString("Not Ready"), + PlayerStatus.Ready => Loc.GetString("Ready"), + PlayerStatus.Observer => Loc.GetString("Observer"), + _ => "", + }; } _lobby.PlayerReadyList.AddItem(readyState, null, false); } diff --git a/Content.Server/GameTicking/GameTicker.cs b/Content.Server/GameTicking/GameTicker.cs index 0df79eb51c..785ec372a0 100644 --- a/Content.Server/GameTicking/GameTicker.cs +++ b/Content.Server/GameTicking/GameTicker.cs @@ -80,9 +80,8 @@ namespace Content.Server.GameTicking [ViewVariables] private readonly List _gameRules = new List(); [ViewVariables] private readonly List _manifest = new List(); - // Value is whether they're ready. [ViewVariables] - private readonly Dictionary _playersInLobby = new Dictionary(); + private readonly Dictionary _playersInLobby = new Dictionary(); [ViewVariables] private bool _initialized; @@ -239,7 +238,7 @@ namespace Content.Server.GameTicking List readyPlayers; if (LobbyEnabled) { - readyPlayers = _playersInLobby.Where(p => p.Value).Select(p => p.Key).ToList(); + readyPlayers = _playersInLobby.Where(p => p.Value == PlayerStatus.Ready).Select(p => p.Key).ToList(); } else { @@ -386,6 +385,8 @@ namespace Content.Server.GameTicking if (!_playersInLobby.ContainsKey(player)) return; _spawnObserver(player); + _playersInLobby[player] = PlayerStatus.Observer; + _netManager.ServerSendToAll(GetStatusSingle(player, PlayerStatus.Observer)); } public void MakeJoinGame(IPlayerSession player, string jobId = null) @@ -399,9 +400,10 @@ namespace Content.Server.GameTicking { if (!_playersInLobby.ContainsKey(player)) return; - _playersInLobby[player] = ready; + var status = ready ? PlayerStatus.Ready : PlayerStatus.NotReady; + _playersInLobby[player] = ready ? PlayerStatus.Ready : PlayerStatus.NotReady; _netManager.ServerSendMessage(_getStatusMsg(player), player.ConnectedClient); - _netManager.ServerSendToAll(GetReadySingle(player, ready)); + _netManager.ServerSendToAll(GetStatusSingle(player, status)); } public T AddGameRule() where T : GameRule, new() @@ -893,13 +895,13 @@ namespace Content.Server.GameTicking private void _playerJoinLobby(IPlayerSession session) { - _playersInLobby.Add(session, false); + _playersInLobby.Add(session, PlayerStatus.NotReady); _prefsManager.OnClientConnected(session); _netManager.ServerSendMessage(_netManager.CreateNetMessage(), session.ConnectedClient); _netManager.ServerSendMessage(_getStatusMsg(session), session.ConnectedClient); _netManager.ServerSendMessage(GetInfoMsg(), session.ConnectedClient); - _netManager.ServerSendMessage(GetReadyStatus(), session.ConnectedClient); + _netManager.ServerSendMessage(GetPlayerStatus(), session.ConnectedClient); } private void _playerJoinGame(IPlayerSession session) @@ -911,33 +913,35 @@ namespace Content.Server.GameTicking _netManager.ServerSendMessage(_netManager.CreateNetMessage(), session.ConnectedClient); } - private MsgTickerLobbyReady GetReadyStatus() + private MsgTickerLobbyReady GetPlayerStatus() { var msg = _netManager.CreateNetMessage(); - msg.PlayerReady = new Dictionary(); + msg.PlayerStatus = new Dictionary(); foreach (var player in _playersInLobby.Keys) { - _playersInLobby.TryGetValue(player, out var ready); - msg.PlayerReady.Add(player.SessionId, ready); + _playersInLobby.TryGetValue(player, out var status); + msg.PlayerStatus.Add(player.SessionId, status); } return msg; } - private MsgTickerLobbyReady GetReadySingle(IPlayerSession player, bool ready) + private MsgTickerLobbyReady GetStatusSingle(IPlayerSession player, PlayerStatus status) { var msg = _netManager.CreateNetMessage(); - msg.PlayerReady = new Dictionary(); - msg.PlayerReady.Add(player.SessionId, ready); + msg.PlayerStatus = new Dictionary + { + { player.SessionId, status } + }; return msg; } private MsgTickerLobbyStatus _getStatusMsg(IPlayerSession session) { - _playersInLobby.TryGetValue(session, out var ready); + _playersInLobby.TryGetValue(session, out var status); var msg = _netManager.CreateNetMessage(); msg.IsRoundStarted = RunLevel != GameRunLevel.PreRoundLobby; msg.StartTime = _roundStartTimeUtc; - msg.YouAreReady = ready; + msg.YouAreReady = status == PlayerStatus.Ready; msg.Paused = Paused; return msg; } diff --git a/Content.Shared/SharedGameTicker.cs b/Content.Shared/SharedGameTicker.cs index d29cc0f84e..077f4c71b0 100644 --- a/Content.Shared/SharedGameTicker.cs +++ b/Content.Shared/SharedGameTicker.cs @@ -191,13 +191,13 @@ namespace Content.Shared #endregion /// - /// The Players Ready (SessionID:ready) + /// The Status of the Player in the lobby (ready, observer, ...) /// - public Dictionary PlayerReady { get; set; } + public Dictionary PlayerStatus { get; set; } public override void ReadFromBuffer(NetIncomingMessage buffer) { - PlayerReady = new Dictionary(); + PlayerStatus = new Dictionary(); var length = buffer.ReadInt32(); for (int i = 0; i < length; i++) { @@ -208,16 +208,16 @@ namespace Content.Shared { serializer.DeserializeDirect(stream, out sessionID); } - var ready = buffer.ReadBoolean(); - PlayerReady.Add(sessionID, ready); + var status = (PlayerStatus)buffer.ReadByte(); + PlayerStatus.Add(sessionID, status); } } public override void WriteToBuffer(NetOutgoingMessage buffer) { var serializer = IoCManager.Resolve(); - buffer.Write(PlayerReady.Count); - foreach (var p in PlayerReady) + buffer.Write(PlayerStatus.Count); + foreach (var p in PlayerStatus) { using (var stream = new MemoryStream()) { @@ -226,7 +226,7 @@ namespace Content.Shared stream.TryGetBuffer(out var segment); buffer.Write(segment); } - buffer.Write(p.Value); + buffer.Write((byte)p.Value); } } } @@ -238,7 +238,6 @@ namespace Content.Shared public string PlayerICName; public string Role; public bool Antag; - } protected class MsgRoundEndMessage : NetMessage @@ -308,6 +307,13 @@ namespace Content.Shared } } + + public enum PlayerStatus : byte + { + NotReady = 0, + Ready, + Observer, + } } }