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:
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user