X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fcl_client.qc;h=97bffaacc43b9dc22f706b11ce019f1d73bbd76d;hb=7558eada9b5835073350eccca3f128d22ef67a43;hp=8151aa5f128caf2e16ff6acff4a8f34109da729d;hpb=70e0121c311b23e870c263ef672e9778cb519c3e;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc index 8151aa5f1..97bffaacc 100644 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@ -1414,6 +1414,27 @@ void FixClientCvars(entity e) */ } +float PlayerInIDList(entity p, string idlist) +{ + float n, i; + string s; + + // NOTE: we do NOT check crypto_keyfp here, an unsigned ID is fine too for this + if not(p.crypto_idfp) + return 0; + + // this function allows abbreviated player IDs too! + n = tokenize_console(idlist); + for(i = 0; i < n; ++i) + { + s = argv(i); + if(s == substring(p.crypto_idfp, 0, strlen(s))) + return 1; + } + + return 0; +} + /* ============= ClientConnect @@ -1469,9 +1490,37 @@ void ClientConnect (void) //if(g_domination) // dom_player_join_team(self); + // identify the right forced team + if(PlayerInIDList(self, cvar_string("g_forced_team_red"))) + self.team_forced = COLOR_TEAM1; + else if(PlayerInIDList(self, cvar_string("g_forced_team_blue"))) + self.team_forced = COLOR_TEAM2; + else if(PlayerInIDList(self, cvar_string("g_forced_team_yellow"))) + self.team_forced = COLOR_TEAM3; + else if(PlayerInIDList(self, cvar_string("g_forced_team_pink"))) + self.team_forced = COLOR_TEAM4; + else if(cvar_string("g_forced_team_otherwise") == "red") + self.team_forced = COLOR_TEAM1; + else if(cvar_string("g_forced_team_otherwise") == "blue") + self.team_forced = COLOR_TEAM2; + else if(cvar_string("g_forced_team_otherwise") == "yellow") + self.team_forced = COLOR_TEAM3; + else if(cvar_string("g_forced_team_otherwise") == "pink") + self.team_forced = COLOR_TEAM4; + else if(cvar_string("g_forced_team_otherwise") == "spectate") + self.team_forced = -1; + else if(cvar_string("g_forced_team_otherwise") == "spectator") + self.team_forced = -1; + else + self.team_forced = 0; + + if(!teams_matter) + if(self.team_forced > 0) + self.team_forced = 0; + JoinBestTeam(self, FALSE, FALSE); // if the team number is valid, keep it - if((cvar("sv_spectate") == 1 && !g_lms) || cvar("g_campaign")) { + if((cvar("sv_spectate") == 1 && !g_lms) || cvar("g_campaign") || self.team_forced < 0) { self.classname = "observer"; } else { if(teams_matter) @@ -2339,7 +2388,7 @@ void ShowRespawnCountdown() void LeaveSpectatorMode() { if(isJoinAllowed()) { - if(!teams_matter || cvar("g_campaign") || cvar("g_balance_teams") || (self.wasplayer && cvar("g_changeteam_banned"))) { + if(!teams_matter || cvar("g_campaign") || cvar("g_balance_teams") || (self.wasplayer && cvar("g_changeteam_banned")) || self.team_forced > 0) { self.classname = "player"; if(cvar("g_campaign") || cvar("g_balance_teams") || cvar("g_balance_teams_force")) @@ -2380,6 +2429,9 @@ void LeaveSpectatorMode() * @return bool TRUE if the player is allowed to join, false otherwise */ float isJoinAllowed() { + if(self.team_forced < 0) + return FALSE; // forced spectators can never join + if (!cvar("g_maxplayers")) return TRUE;