From: Rudolf Polzer Date: Thu, 11 Nov 2010 13:12:01 +0000 (+0100) Subject: forcing teams by player ID (usign cvars g_forced_team_*) X-Git-Tag: xonotic-v0.1.0preview~146^2~3 X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=commitdiff_plain;h=1194c6af3ef2abc72d7aaced018398ca43f860e4;hp=98b778e3efdd3f118d3e9bc463d4250e31f083d2 forcing teams by player ID (usign cvars g_forced_team_*) --- diff --git a/defaultXonotic.cfg b/defaultXonotic.cfg index 19d728abe3..12e66aa764 100644 --- a/defaultXonotic.cfg +++ b/defaultXonotic.cfg @@ -2012,6 +2012,14 @@ mod_q3shader_default_polygonfactor 0 // allow fullbright set sv_allow_fullbright 0 "when set, clients may use r_fullbright on this server without getting a night vision effect overlay" +// auto-teams (team selection by player ID) +// any player not listed is forced to spectate +set g_forced_team_red "" "list of player IDs for red team" +set g_forced_team_blue "" "list of player IDs for blue team" +set g_forced_team_yellow "" "list of player IDs for yellow team" +set g_forced_team_pink "" "list of player IDs for pink team" +set g_forced_team_otherwise "default" "action if a non listed player joins (can be default for default action, spectate for forcing to spectate, or red, blue, yellow, pink)" + // other config files exec balanceXonotic.cfg exec ctfscoring-ai.cfg diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc index 1438d317c7..750590a842 100644 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@ -1408,6 +1408,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 @@ -1463,9 +1484,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) @@ -2379,6 +2428,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; diff --git a/qcsrc/server/defs.qh b/qcsrc/server/defs.qh index 74797441c3..4e5a6bfced 100644 --- a/qcsrc/server/defs.qh +++ b/qcsrc/server/defs.qh @@ -662,3 +662,5 @@ string deathmessage; float allowed_to_spawn; // boolean variable used by the clan arena code to determine if a player can spawn (after the round has ended) float serverflags; + +.float team_forced; // can be a team number to force a team, or 0 for default action, or -1 for forced spectator diff --git a/qcsrc/server/g_world.qc b/qcsrc/server/g_world.qc index c5abb52f59..9e911be07d 100644 --- a/qcsrc/server/g_world.qc +++ b/qcsrc/server/g_world.qc @@ -301,6 +301,12 @@ void cvar_changes_init() BADCVAR("developer"); BADPREFIX("developer_"); + // these can contain player IDs, so better hide + BADCVAR("g_forced_team_red"); + BADCVAR("g_forced_team_blue"); + BADCVAR("g_forced_team_yellow"); + BADCVAR("g_forced_team_pink"); + // mapinfo BADCVAR("timelimit"); BADCVAR("fraglimit"); @@ -437,6 +443,12 @@ void cvar_changes_init() BADCVAR("sv_vote_master_password"); BADCVAR("sv_vote_simple_majority_factor"); BADCVAR("timelimit_override"); + + if(cvar("g_minstagib")) + { + BADCVAR("g_grappling_hook"); + BADCVAR("g_jetpack"); + } #undef BADPREFIX #undef BADCVAR diff --git a/qcsrc/server/teamplay.qc b/qcsrc/server/teamplay.qc index 1232e3c8eb..d9d71bc098 100644 --- a/qcsrc/server/teamplay.qc +++ b/qcsrc/server/teamplay.qc @@ -711,6 +711,16 @@ void CheckAllowedTeams (entity for_whom) c1 = -1; } } + + // if player has a forced team, ONLY allow that one + if(self.team_forced == COLOR_TEAM1 && c1 >= 0) + c2 = c3 = c4 = -1; + else if(self.team_forced == COLOR_TEAM2 && c2 >= 0) + c1 = c3 = c4 = -1; + else if(self.team_forced == COLOR_TEAM3 && c3 >= 0) + c1 = c2 = c4 = -1; + else if(self.team_forced == COLOR_TEAM4 && c4 >= 0) + c1 = c2 = c3 = -1; } float PlayerValue(entity p)