From 8e65359103b6cc20691d2e960e7025b9f804dafb Mon Sep 17 00:00:00 2001 From: Mario Date: Thu, 24 Dec 2015 08:59:38 +1000 Subject: [PATCH] Clean up nJoinAllowed a little --- qcsrc/server/cl_client.qc | 35 +++++++++++++++++------------------ qcsrc/server/command/cmd.qc | 2 +- qcsrc/server/defs.qh | 2 +- qcsrc/server/scores.qc | 2 +- 4 files changed, 20 insertions(+), 21 deletions(-) diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc index 967bc684b..6c3e2ec0c 100644 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@ -1867,7 +1867,7 @@ void LeaveSpectatorMode() {SELFPARAM(); if(self.caplayer) return; - if(nJoinAllowed(self)) + if(nJoinAllowed(self, self)) { if(!teamplay || autocvar_g_campaign || autocvar_g_balance_teams || (self.wasplayer && autocvar_g_changeteam_banned) || self.team_forced > 0) { @@ -1901,40 +1901,39 @@ void LeaveSpectatorMode() * it checks whether the number of currently playing players exceeds g_maxplayers. * @return int number of free slots for players, 0 if none */ -float nJoinAllowed(entity ignore) -{SELFPARAM(); +bool nJoinAllowed(entity this, entity ignore) +{ if(!ignore) // this is called that way when checking if anyone may be able to join (to build qcstatus) // so report 0 free slots if restricted { if(autocvar_g_forced_team_otherwise == "spectate") - return 0; + return false; if(autocvar_g_forced_team_otherwise == "spectator") - return 0; + return false; } - if(self.team_forced < 0) - return 0; // forced spectators can never join + if(this.team_forced < 0) + return false; // forced spectators can never join // TODO simplify this - entity e; - float totalClients = 0; - FOR_EACH_CLIENT(e) - if(e != ignore) - totalClients += 1; + int totalClients = 0; + int currentlyPlaying = 0; + FOREACH_CLIENT(true, LAMBDA( + if(it != ignore) + ++totalClients; + if(IS_REAL_CLIENT(it)) + if(IS_PLAYER(it) || it.caplayer) + ++currentlyPlaying; + )); if (!autocvar_g_maxplayers) return maxclients - totalClients; - float currentlyPlaying = 0; - FOR_EACH_REALCLIENT(e) - if(IS_PLAYER(e) || e.caplayer) - currentlyPlaying += 1; - if(currentlyPlaying < autocvar_g_maxplayers) return min(maxclients - totalClients, autocvar_g_maxplayers - currentlyPlaying); - return 0; + return false; } /** diff --git a/qcsrc/server/command/cmd.qc b/qcsrc/server/command/cmd.qc index a743a618c..4494c104d 100644 --- a/qcsrc/server/command/cmd.qc +++ b/qcsrc/server/command/cmd.qc @@ -174,7 +174,7 @@ void ClientCommand_join(float request) if (!IS_PLAYER(self) && !lockteams && !gameover) { if (self.caplayer) return; - if (nJoinAllowed(self)) + if (nJoinAllowed(self, self)) { if (autocvar_g_campaign) campaign_bots_may_start = 1; self.classname = STR_PLAYER; diff --git a/qcsrc/server/defs.qh b/qcsrc/server/defs.qh index ecc5b3cb1..6fa9b03f6 100644 --- a/qcsrc/server/defs.qh +++ b/qcsrc/server/defs.qh @@ -179,7 +179,7 @@ float game_completion_ratio; // 0 at start, 1 near end .float alivetime; // time of being alive .float motd_actived_time; // used for both motd and campaign_message -float nJoinAllowed(entity ignore); +bool nJoinAllowed(entity this, entity ignore); .float spawnshieldtime; .float item_spawnshieldtime; diff --git a/qcsrc/server/scores.qc b/qcsrc/server/scores.qc index e29d1723b..1b20101d9 100644 --- a/qcsrc/server/scores.qc +++ b/qcsrc/server/scores.qc @@ -409,7 +409,7 @@ void WinningConditionHelper() s = GetGametype(); s = strcat(s, ":", autocvar_g_xonoticversion); s = strcat(s, ":P", ftos(cvar_purechanges_count)); - s = strcat(s, ":S", ftos(nJoinAllowed(world))); + s = strcat(s, ":S", ftos(nJoinAllowed(self, world))); s = strcat(s, ":F", ftos(serverflags)); s = strcat(s, ":M", modname); s = strcat(s, "::", GetPlayerScoreString(world, (fullstatus ? 1 : 2))); -- 2.39.2