Observers are now shown in the Lobby as Observers (#1834)

* Observers are now shown in the Lobby as Observers

* Weviews adwessed
This commit is contained in:
Exp
2020-08-21 11:24:06 +02:00
committed by GitHub
parent 8fe211bf88
commit 02b5632dac
5 changed files with 60 additions and 38 deletions

View File

@@ -30,7 +30,7 @@ namespace Content.Client.GameTicking
[ViewVariables] public string ServerInfoBlob { get; private set; } [ViewVariables] public string ServerInfoBlob { get; private set; }
[ViewVariables] public DateTime StartTime { get; private set; } [ViewVariables] public DateTime StartTime { get; private set; }
[ViewVariables] public bool Paused { get; private set; } [ViewVariables] public bool Paused { get; private set; }
[ViewVariables] public Dictionary<NetSessionId, bool> Ready { get; private set; } [ViewVariables] public Dictionary<NetSessionId, PlayerStatus> Status { get; private set; }
public event Action InfoBlobUpdated; public event Action InfoBlobUpdated;
public event Action LobbyStatusUpdated; public event Action LobbyStatusUpdated;
@@ -54,7 +54,7 @@ namespace Content.Client.GameTicking
}); });
_netManager.RegisterNetMessage<MsgTickerLateJoinStatus>(nameof(MsgTickerLateJoinStatus), LateJoinStatus); _netManager.RegisterNetMessage<MsgTickerLateJoinStatus>(nameof(MsgTickerLateJoinStatus), LateJoinStatus);
Ready = new Dictionary<NetSessionId, bool>(); Status = new Dictionary<NetSessionId, PlayerStatus>();
_initialized = true; _initialized = true;
} }
@@ -77,7 +77,7 @@ namespace Content.Client.GameTicking
AreWeReady = message.YouAreReady; AreWeReady = message.YouAreReady;
Paused = message.Paused; Paused = message.Paused;
if (IsGameStarted) if (IsGameStarted)
Ready.Clear(); Status.Clear();
LobbyStatusUpdated?.Invoke(); LobbyStatusUpdated?.Invoke();
} }
@@ -103,9 +103,9 @@ namespace Content.Client.GameTicking
private void LobbyReady(MsgTickerLobbyReady message) private void LobbyReady(MsgTickerLobbyReady message)
{ {
// Merge the Dictionaries // 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(); LobbyReadyUpdated?.Invoke();
} }

View File

@@ -1,6 +1,7 @@
using Robust.Shared.Network; using Robust.Shared.Network;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using static Content.Shared.SharedGameTicker;
namespace Content.Client.Interfaces namespace Content.Client.Interfaces
{ {
@@ -12,7 +13,7 @@ namespace Content.Client.Interfaces
bool DisallowedLateJoin { get; } bool DisallowedLateJoin { get; }
DateTime StartTime { get; } DateTime StartTime { get; }
bool Paused { get; } bool Paused { get; }
Dictionary<NetSessionId, bool> Ready { get; } Dictionary<NetSessionId, PlayerStatus> Status { get; }
void Initialize(); void Initialize();
event Action InfoBlobUpdated; event Action InfoBlobUpdated;

View File

@@ -18,6 +18,7 @@ using Robust.Shared.Localization;
using Robust.Shared.Prototypes; using Robust.Shared.Prototypes;
using Robust.Shared.Timing; using Robust.Shared.Timing;
using Robust.Shared.ViewVariables; using Robust.Shared.ViewVariables;
using static Content.Shared.SharedGameTicker;
namespace Content.Client.State namespace Content.Client.State
{ {
@@ -112,7 +113,7 @@ namespace Content.Client.State
_clientGameTicker.LobbyReadyUpdated -= LobbyReadyUpdated; _clientGameTicker.LobbyReadyUpdated -= LobbyReadyUpdated;
_clientGameTicker.LobbyLateJoinStatusUpdated -= LobbyLateJoinStatusUpdated; _clientGameTicker.LobbyLateJoinStatusUpdated -= LobbyLateJoinStatusUpdated;
_clientGameTicker.Ready.Clear(); _clientGameTicker.Status.Clear();
_lobby.Dispose(); _lobby.Dispose();
_characterSetup.Dispose(); _characterSetup.Dispose();
@@ -158,11 +159,14 @@ namespace Content.Client.State
private void PlayerManagerOnPlayerListUpdated(object sender, EventArgs e) private void PlayerManagerOnPlayerListUpdated(object sender, EventArgs e)
{ {
// Remove disconnected sessions from the Ready Dict // 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 _)) 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(); UpdatePlayerList();
@@ -218,12 +222,19 @@ namespace Content.Client.State
// Don't show ready state if we're ingame // Don't show ready state if we're ingame
if (!_clientGameTicker.IsGameStarted) if (!_clientGameTicker.IsGameStarted)
{ {
var ready = false; var status = PlayerStatus.NotReady;
if (session.SessionId == _playerManager.LocalPlayer.SessionId) if (session.SessionId == _playerManager.LocalPlayer.SessionId)
ready = _clientGameTicker.AreWeReady; status = _clientGameTicker.AreWeReady ? PlayerStatus.Ready : PlayerStatus.NotReady;
else else
_clientGameTicker.Ready.TryGetValue(session.SessionId, out ready); _clientGameTicker.Status.TryGetValue(session.SessionId, out status);
readyState = ready ? Loc.GetString("Ready") : Loc.GetString("Not Ready");
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); _lobby.PlayerReadyList.AddItem(readyState, null, false);
} }

View File

@@ -80,9 +80,8 @@ namespace Content.Server.GameTicking
[ViewVariables] private readonly List<GameRule> _gameRules = new List<GameRule>(); [ViewVariables] private readonly List<GameRule> _gameRules = new List<GameRule>();
[ViewVariables] private readonly List<ManifestEntry> _manifest = new List<ManifestEntry>(); [ViewVariables] private readonly List<ManifestEntry> _manifest = new List<ManifestEntry>();
// Value is whether they're ready.
[ViewVariables] [ViewVariables]
private readonly Dictionary<IPlayerSession, bool> _playersInLobby = new Dictionary<IPlayerSession, bool>(); private readonly Dictionary<IPlayerSession, PlayerStatus> _playersInLobby = new Dictionary<IPlayerSession, PlayerStatus>();
[ViewVariables] private bool _initialized; [ViewVariables] private bool _initialized;
@@ -239,7 +238,7 @@ namespace Content.Server.GameTicking
List<IPlayerSession> readyPlayers; List<IPlayerSession> readyPlayers;
if (LobbyEnabled) 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 else
{ {
@@ -386,6 +385,8 @@ namespace Content.Server.GameTicking
if (!_playersInLobby.ContainsKey(player)) return; if (!_playersInLobby.ContainsKey(player)) return;
_spawnObserver(player); _spawnObserver(player);
_playersInLobby[player] = PlayerStatus.Observer;
_netManager.ServerSendToAll(GetStatusSingle(player, PlayerStatus.Observer));
} }
public void MakeJoinGame(IPlayerSession player, string jobId = null) public void MakeJoinGame(IPlayerSession player, string jobId = null)
@@ -399,9 +400,10 @@ namespace Content.Server.GameTicking
{ {
if (!_playersInLobby.ContainsKey(player)) return; 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.ServerSendMessage(_getStatusMsg(player), player.ConnectedClient);
_netManager.ServerSendToAll(GetReadySingle(player, ready)); _netManager.ServerSendToAll(GetStatusSingle(player, status));
} }
public T AddGameRule<T>() where T : GameRule, new() public T AddGameRule<T>() where T : GameRule, new()
@@ -893,13 +895,13 @@ namespace Content.Server.GameTicking
private void _playerJoinLobby(IPlayerSession session) private void _playerJoinLobby(IPlayerSession session)
{ {
_playersInLobby.Add(session, false); _playersInLobby.Add(session, PlayerStatus.NotReady);
_prefsManager.OnClientConnected(session); _prefsManager.OnClientConnected(session);
_netManager.ServerSendMessage(_netManager.CreateNetMessage<MsgTickerJoinLobby>(), session.ConnectedClient); _netManager.ServerSendMessage(_netManager.CreateNetMessage<MsgTickerJoinLobby>(), session.ConnectedClient);
_netManager.ServerSendMessage(_getStatusMsg(session), session.ConnectedClient); _netManager.ServerSendMessage(_getStatusMsg(session), session.ConnectedClient);
_netManager.ServerSendMessage(GetInfoMsg(), session.ConnectedClient); _netManager.ServerSendMessage(GetInfoMsg(), session.ConnectedClient);
_netManager.ServerSendMessage(GetReadyStatus(), session.ConnectedClient); _netManager.ServerSendMessage(GetPlayerStatus(), session.ConnectedClient);
} }
private void _playerJoinGame(IPlayerSession session) private void _playerJoinGame(IPlayerSession session)
@@ -911,33 +913,35 @@ namespace Content.Server.GameTicking
_netManager.ServerSendMessage(_netManager.CreateNetMessage<MsgTickerJoinGame>(), session.ConnectedClient); _netManager.ServerSendMessage(_netManager.CreateNetMessage<MsgTickerJoinGame>(), session.ConnectedClient);
} }
private MsgTickerLobbyReady GetReadyStatus() private MsgTickerLobbyReady GetPlayerStatus()
{ {
var msg = _netManager.CreateNetMessage<MsgTickerLobbyReady>(); var msg = _netManager.CreateNetMessage<MsgTickerLobbyReady>();
msg.PlayerReady = new Dictionary<NetSessionId, bool>(); msg.PlayerStatus = new Dictionary<NetSessionId, PlayerStatus>();
foreach (var player in _playersInLobby.Keys) foreach (var player in _playersInLobby.Keys)
{ {
_playersInLobby.TryGetValue(player, out var ready); _playersInLobby.TryGetValue(player, out var status);
msg.PlayerReady.Add(player.SessionId, ready); msg.PlayerStatus.Add(player.SessionId, status);
} }
return msg; return msg;
} }
private MsgTickerLobbyReady GetReadySingle(IPlayerSession player, bool ready) private MsgTickerLobbyReady GetStatusSingle(IPlayerSession player, PlayerStatus status)
{ {
var msg = _netManager.CreateNetMessage<MsgTickerLobbyReady>(); var msg = _netManager.CreateNetMessage<MsgTickerLobbyReady>();
msg.PlayerReady = new Dictionary<NetSessionId, bool>(); msg.PlayerStatus = new Dictionary<NetSessionId, PlayerStatus>
msg.PlayerReady.Add(player.SessionId, ready); {
{ player.SessionId, status }
};
return msg; return msg;
} }
private MsgTickerLobbyStatus _getStatusMsg(IPlayerSession session) private MsgTickerLobbyStatus _getStatusMsg(IPlayerSession session)
{ {
_playersInLobby.TryGetValue(session, out var ready); _playersInLobby.TryGetValue(session, out var status);
var msg = _netManager.CreateNetMessage<MsgTickerLobbyStatus>(); var msg = _netManager.CreateNetMessage<MsgTickerLobbyStatus>();
msg.IsRoundStarted = RunLevel != GameRunLevel.PreRoundLobby; msg.IsRoundStarted = RunLevel != GameRunLevel.PreRoundLobby;
msg.StartTime = _roundStartTimeUtc; msg.StartTime = _roundStartTimeUtc;
msg.YouAreReady = ready; msg.YouAreReady = status == PlayerStatus.Ready;
msg.Paused = Paused; msg.Paused = Paused;
return msg; return msg;
} }

View File

@@ -191,13 +191,13 @@ namespace Content.Shared
#endregion #endregion
/// <summary> /// <summary>
/// The Players Ready (SessionID:ready) /// The Status of the Player in the lobby (ready, observer, ...)
/// </summary> /// </summary>
public Dictionary<NetSessionId, bool> PlayerReady { get; set; } public Dictionary<NetSessionId, PlayerStatus> PlayerStatus { get; set; }
public override void ReadFromBuffer(NetIncomingMessage buffer) public override void ReadFromBuffer(NetIncomingMessage buffer)
{ {
PlayerReady = new Dictionary<NetSessionId, bool>(); PlayerStatus = new Dictionary<NetSessionId, PlayerStatus>();
var length = buffer.ReadInt32(); var length = buffer.ReadInt32();
for (int i = 0; i < length; i++) for (int i = 0; i < length; i++)
{ {
@@ -208,16 +208,16 @@ namespace Content.Shared
{ {
serializer.DeserializeDirect(stream, out sessionID); serializer.DeserializeDirect(stream, out sessionID);
} }
var ready = buffer.ReadBoolean(); var status = (PlayerStatus)buffer.ReadByte();
PlayerReady.Add(sessionID, ready); PlayerStatus.Add(sessionID, status);
} }
} }
public override void WriteToBuffer(NetOutgoingMessage buffer) public override void WriteToBuffer(NetOutgoingMessage buffer)
{ {
var serializer = IoCManager.Resolve<IRobustSerializer>(); var serializer = IoCManager.Resolve<IRobustSerializer>();
buffer.Write(PlayerReady.Count); buffer.Write(PlayerStatus.Count);
foreach (var p in PlayerReady) foreach (var p in PlayerStatus)
{ {
using (var stream = new MemoryStream()) using (var stream = new MemoryStream())
{ {
@@ -226,7 +226,7 @@ namespace Content.Shared
stream.TryGetBuffer(out var segment); stream.TryGetBuffer(out var segment);
buffer.Write(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 PlayerICName;
public string Role; public string Role;
public bool Antag; public bool Antag;
} }
protected class MsgRoundEndMessage : NetMessage protected class MsgRoundEndMessage : NetMessage
@@ -308,6 +307,13 @@ namespace Content.Shared
} }
} }
public enum PlayerStatus : byte
{
NotReady = 0,
Ready,
Observer,
}
} }
} }