Disable job buttons when they aren't available or late join is disallowed (#2251)

* Disable job buttons when they aren't available

In real time too, the technology is overwhelming

* Jobs are all unavailable when late join is disallowed.

* Better ToggleDisallowLateJoin command parsing

* Add togglelatejoin to groups.

Co-authored-by: Víctor Aguilera Puerto <zddm@outlook.es>
This commit is contained in:
DrSmugleaf
2020-10-16 11:22:58 +02:00
committed by GitHub
parent be096f7ebf
commit 435fb2630e
8 changed files with 118 additions and 2 deletions

View File

@@ -196,5 +196,11 @@ namespace Content.Server.GameTicking
{
_spawnedPositions[jobId] = _spawnedPositions.GetValueOrDefault(jobId, 0) + 1;
}
private void UpdateJobsAvailable()
{
var lobbyPlayers = _playersInLobby.Keys.Select(p => p.ConnectedClient).ToList();
_netManager.ServerSendToMany(GetJobsAvailable(), lobbyPlayers);
}
}
}

View File

@@ -143,6 +143,7 @@ namespace Content.Server.GameTicking
_netManager.RegisterNetMessage<MsgRoundEndMessage>(nameof(MsgRoundEndMessage));
_netManager.RegisterNetMessage<MsgRequestWindowAttention>(nameof(MsgRequestWindowAttention));
_netManager.RegisterNetMessage<MsgTickerLateJoinStatus>(nameof(MsgTickerLateJoinStatus));
_netManager.RegisterNetMessage<MsgTickerJobsAvailable>(nameof(MsgTickerJobsAvailable));
SetStartPreset(_configurationManager.GetCVar(CCVars.GameLobbyDefaultPreset));
@@ -307,6 +308,7 @@ namespace Content.Server.GameTicking
_sendStatusToAll();
ReqWindowAttentionAll();
UpdateLateJoinStatus();
UpdateJobsAvailable();
}
private void UpdateLateJoinStatus()
@@ -420,6 +422,7 @@ namespace Content.Server.GameTicking
{
DisallowLateJoin = disallowLateJoin;
UpdateLateJoinStatus();
UpdateJobsAvailable();
}
public T AddGameRule<T>() where T : GameRule, new()
@@ -817,6 +820,7 @@ namespace Content.Server.GameTicking
var character = GetPlayerProfile(session);
SpawnPlayer(session, character, jobId, lateJoin);
UpdateJobsAvailable();
}
private void SpawnPlayer(IPlayerSession session,
@@ -915,6 +919,7 @@ namespace Content.Server.GameTicking
_netManager.ServerSendMessage(_getStatusMsg(session), session.ConnectedClient);
_netManager.ServerSendMessage(GetInfoMsg(), session.ConnectedClient);
_netManager.ServerSendMessage(GetPlayerStatus(), session.ConnectedClient);
_netManager.ServerSendMessage(GetJobsAvailable(), session.ConnectedClient);
}
private void _playerJoinGame(IPlayerSession session)
@@ -938,6 +943,22 @@ namespace Content.Server.GameTicking
return msg;
}
private MsgTickerJobsAvailable GetJobsAvailable()
{
var message = _netManager.CreateNetMessage<MsgTickerJobsAvailable>();
// If late join is disallowed, return no available jobs.
if (DisallowLateJoin)
return message;
message.JobsAvailable = GetAvailablePositions()
.Where(e => e.Value > 0)
.Select(e => e.Key)
.ToArray();
return message;
}
private MsgTickerLobbyReady GetStatusSingle(IPlayerSession player, PlayerStatus status)
{
var msg = _netManager.CreateNetMessage<MsgTickerLobbyReady>();

View File

@@ -262,7 +262,15 @@ namespace Content.Server.GameTicking
var ticker = IoCManager.Resolve<IGameTicker>();
ticker.ToggleDisallowLateJoin(bool.Parse(args[0]));
if (bool.TryParse(args[0], out var result))
{
ticker.ToggleDisallowLateJoin(bool.Parse(args[0]));
shell.SendText(player, result ? "Late joining has been disabled." : "Late joining has been enabled.");
}
else
{
shell.SendText(player, "Invalid argument.");
}
}
}