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

@@ -80,9 +80,8 @@ namespace Content.Server.GameTicking
[ViewVariables] private readonly List<GameRule> _gameRules = new List<GameRule>();
[ViewVariables] private readonly List<ManifestEntry> _manifest = new List<ManifestEntry>();
// Value is whether they're ready.
[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;
@@ -239,7 +238,7 @@ namespace Content.Server.GameTicking
List<IPlayerSession> 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<T>() 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<MsgTickerJoinLobby>(), 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<MsgTickerJoinGame>(), session.ConnectedClient);
}
private MsgTickerLobbyReady GetReadyStatus()
private MsgTickerLobbyReady GetPlayerStatus()
{
var msg = _netManager.CreateNetMessage<MsgTickerLobbyReady>();
msg.PlayerReady = new Dictionary<NetSessionId, bool>();
msg.PlayerStatus = new Dictionary<NetSessionId, PlayerStatus>();
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<MsgTickerLobbyReady>();
msg.PlayerReady = new Dictionary<NetSessionId, bool>();
msg.PlayerReady.Add(player.SessionId, ready);
msg.PlayerStatus = new Dictionary<NetSessionId, PlayerStatus>
{
{ 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<MsgTickerLobbyStatus>();
msg.IsRoundStarted = RunLevel != GameRunLevel.PreRoundLobby;
msg.StartTime = _roundStartTimeUtc;
msg.YouAreReady = ready;
msg.YouAreReady = status == PlayerStatus.Ready;
msg.Paused = Paused;
return msg;
}