From 43d3691f950395011093d01bd313ec4de21c59be Mon Sep 17 00:00:00 2001 From: div0 Date: Fri, 27 Feb 2009 18:30:19 +0000 Subject: [PATCH] lots of teamplay cleanups, should fix "color 3 3; cmd join" server crash exploit git-svn-id: svn://svn.icculus.org/nexuiz/trunk@6012 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/server/bots.qc | 4 ++-- data/qcsrc/server/cl_client.qc | 28 +++++++++++---------------- data/qcsrc/server/clientcommands.qc | 4 ++-- data/qcsrc/server/domination.qc | 2 +- data/qcsrc/server/g_damage.qc | 2 +- data/qcsrc/server/g_world.qc | 3 ++- data/qcsrc/server/gamecommand.qc | 4 ++-- data/qcsrc/server/havocbot_roles.qc | 4 ++-- data/qcsrc/server/sv_main.qc | 8 +++++++- data/qcsrc/server/teamplay.qc | 14 +++++++------- data/qcsrc/server/w_rocketlauncher.qc | 4 ++-- 11 files changed, 39 insertions(+), 38 deletions(-) diff --git a/data/qcsrc/server/bots.qc b/data/qcsrc/server/bots.qc index 14ec20abe..310bcdf5f 100644 --- a/data/qcsrc/server/bots.qc +++ b/data/qcsrc/server/bots.qc @@ -1627,11 +1627,11 @@ float bot_shouldattack(entity e) { if (e == self) return FALSE; - if (teamplay) + if (teams_matter) if (e.team != 0) return FALSE; } - if(!teamplay) + if(!teams_matter) if(bot_ignore_bots) if(clienttype(e) == CLIENTTYPE_BOT) return FALSE; diff --git a/data/qcsrc/server/cl_client.qc b/data/qcsrc/server/cl_client.qc index d28af4a57..5e661354a 100644 --- a/data/qcsrc/server/cl_client.qc +++ b/data/qcsrc/server/cl_client.qc @@ -1091,7 +1091,7 @@ void ClientKill (void) void DoTeamChange(float destteam) { float t, c0; - if(!cvar("teamplay")) + if(!teams_matter) { if(destteam >= 0) SetPlayerColors(self, destteam); @@ -1174,6 +1174,7 @@ void DecodeLevelParms (void); void ClientConnect (void) { local string s; + float t; if(self.flags & FL_CLIENT) { @@ -1207,16 +1208,17 @@ void ClientConnect (void) //if(g_domination) // dom_player_join_team(self); + JoinBestTeam(self, FALSE, TRUE); + if((cvar("sv_spectate") == 1 && !g_lms) || cvar("g_campaign")) { self.classname = "observer"; } else { - if(cvar("teamplay")) + if(teams_matter) { if(cvar("g_balance_teams") || cvar("g_balance_teams_force")) { self.classname = "player"; campaign_bots_may_start = 1; - JoinBestTeam(self, FALSE, TRUE); } else { @@ -1280,18 +1282,10 @@ void ClientConnect (void) GetCvars(0); // set cvar for team scoreboard - if (teams_matter) - { - local float t; - t = cvar("teamplay"); - // we have to stuff the correct teamplay value because if this is a listen server, this changes the teamplay mode of the server itself, which is bad - stuffcmd(self, strcat("set teamplay ", ftos(t), "\n")); - } - else - stuffcmd(self, "set teamplay 0\n"); + stuffcmd(self, strcat("set teamplay ", ftos(teamplay), "\n")); // notify about available teams - if(teamplay) + if(teams_matter) { CheckAllowedTeams(self); t = 0; if(c1 >= 0) t |= 1; if(c2 >= 0) t |= 2; if(c3 >= 0) t |= 4; if(c4 >= 0) t |= 8; @@ -1491,10 +1485,10 @@ float TeamBubble_customizeentityforclient() void UpdateTeamBubble() { - if (!self.modelindex || !cvar("teamplay")) + if (!self.modelindex || !teams_matter) return; // spawn a teambubble entity if needed - if (!self.teambubbleentity && cvar("teamplay")) + if (!self.teambubbleentity && teams_matter) { self.teambubbleentity = spawn(); self.teambubbleentity.owner = self; @@ -1519,7 +1513,7 @@ void UpdateTeamBubble() local float c; c = self.clientcolors & 15; // LordHavoc: only bothering to support white, green, red, yellow, blue - if (teamplay == 0) self.colormod = '0 0 0'; + if (!teams_matter) self.colormod = '0 0 0'; else if (c == 0) self.colormod = '1.00 1.00 1.00'; else if (c == 3) self.colormod = '0.10 1.73 0.10'; else if (c == 4) self.colormod = '1.73 0.10 0.10'; @@ -1919,7 +1913,7 @@ void ShowRespawnCountdown() void LeaveSpectatorMode() { if(isJoinAllowed()) { - if(!cvar("teamplay") || cvar("g_campaign") || cvar("g_balance_teams")) { + if(!teams_matter || cvar("g_campaign") || cvar("g_balance_teams")) { self.classname = "player"; if(cvar("g_campaign") || cvar("g_balance_teams") || cvar("g_balance_teams_force")) JoinBestTeam(self, FALSE, TRUE); diff --git a/data/qcsrc/server/clientcommands.qc b/data/qcsrc/server/clientcommands.qc index 7e65495b7..ebfa10ed5 100644 --- a/data/qcsrc/server/clientcommands.qc +++ b/data/qcsrc/server/clientcommands.qc @@ -138,7 +138,7 @@ void SV_ParseClientCommand(string s) { PutClientInServer(); } else if(cvar("g_campaign") || cvar("g_balance_teams") || cvar("g_balance_teams_force")) { //JoinBestTeam(self, FALSE, TRUE); - } else if(cvar("teamplay") && !cvar("sv_spectate")) { + } else if(teams_matter && !cvar("sv_spectate")) { self.classname = "observer"; stuffcmd(self,"menu_showteamselect\n"); } @@ -205,7 +205,7 @@ void SV_ParseClientCommand(string s) { } else if( argv(0) == "selectteam" ) { if not(self.flags & FL_CLIENT) return; - if( !cvar("teamplay") ) { + if( !teams_matter ) { sprint( self, "selecteam can only be used in teamgames\n"); } else if(cvar("g_campaign")) { //JoinBestTeam(self, 0); diff --git a/data/qcsrc/server/domination.qc b/data/qcsrc/server/domination.qc index 6bceb40bc..b619d7b60 100644 --- a/data/qcsrc/server/domination.qc +++ b/data/qcsrc/server/domination.qc @@ -605,7 +605,7 @@ void dom_init() InitializeEntity(world, dom_delayedinit, INITPRIO_GAMETYPE); // teamplay is always on in domination, defaults to hurt self but not teammates - //if(!cvar("teamplay")) + //if(!teams_matter) // cvar_set("teamplay", "3"); }; diff --git a/data/qcsrc/server/g_damage.qc b/data/qcsrc/server/g_damage.qc index b694c0953..c86bdb30d 100644 --- a/data/qcsrc/server/g_damage.qc +++ b/data/qcsrc/server/g_damage.qc @@ -296,7 +296,7 @@ void Obituary (entity attacker, entity inflictor, entity targ, float deathtype) } else if (attacker.classname == "player" || attacker.classname == "gib") { - if(teamplay && attacker.team == targ.team) + if(teams_matter && attacker.team == targ.team) { if(sv_gentle) { centerprint(attacker, strcat(DAMAGE_CENTERPRINT_SPACER, "^1Moron! You went against a team mate!")); diff --git a/data/qcsrc/server/g_world.qc b/data/qcsrc/server/g_world.qc index d70f9e90b..3364c398e 100644 --- a/data/qcsrc/server/g_world.qc +++ b/data/qcsrc/server/g_world.qc @@ -196,6 +196,7 @@ void cvar_changes_init() BADPREFIX("userbind"); BADPREFIX("v_"); BADPREFIX("vid_"); + BADPREFIX("crosshair"); BADCVAR("mod_q3bsp_lightmapmergepower"); BADCVAR("mod_q3bsp_nolightmaps"); @@ -1166,7 +1167,7 @@ void DumpStats(float final) } } - if(teamplay) + if(teams_matter) { s = strcat(":labels:teamscores:", GetTeamScoreString(0, 0)); if(to_console) diff --git a/data/qcsrc/server/gamecommand.qc b/data/qcsrc/server/gamecommand.qc index f56ee8ec7..7aa455782 100644 --- a/data/qcsrc/server/gamecommand.qc +++ b/data/qcsrc/server/gamecommand.qc @@ -725,7 +725,7 @@ void GameCommand(string command) } if (argv(0) == "lockteams") { - if(teamplay) + if(teams_matter) { lockteams = 1; bprint("^1The teams are now locked.\n"); @@ -736,7 +736,7 @@ void GameCommand(string command) } if (argv(0) == "unlockteams") { - if(teamplay) + if(teams_matter) { lockteams = 0; bprint("^1The teams are now unlocked.\n"); diff --git a/data/qcsrc/server/havocbot_roles.qc b/data/qcsrc/server/havocbot_roles.qc index 11cfcbe00..d46f83b8f 100644 --- a/data/qcsrc/server/havocbot_roles.qc +++ b/data/qcsrc/server/havocbot_roles.qc @@ -128,7 +128,7 @@ void havocbot_goalrating_items(float ratingscale, vector org, float sradius) } } - if(teamplay) + if(teams_matter) { discard = FALSE; @@ -246,7 +246,7 @@ void havocbot_goalrating_enemyplayers(float ratingscale, vector org, float sradi { local entity head; local float t, noteam; - noteam = ((self.team == 0) || (teamplay == 0)); // fteqcc sucks + noteam = ((self.team == 0) || !teams_matter); // fteqcc sucks FOR_EACH_PLAYER(head) { diff --git a/data/qcsrc/server/sv_main.qc b/data/qcsrc/server/sv_main.qc index 51c44bd0f..ac1c770c8 100644 --- a/data/qcsrc/server/sv_main.qc +++ b/data/qcsrc/server/sv_main.qc @@ -154,6 +154,12 @@ void StartFrame (void) sv_stopspeed = cvar ("sv_stopspeed"); teamplay = cvar ("teamplay"); + + if(teams_matter && !teamplay) + teamplay = 3; + if(!teams_matter && teamplay) + teamplay = 0; + skill = cvar("skill"); Spawnqueue_Check(); @@ -195,7 +201,7 @@ void StartFrame (void) void SV_OnEntityPreSpawnFunction() { if(self.gametypefilter != "") - if not(isGametypeInFilter(game, teamplay, self.gametypefilter)) + if not(isGametypeInFilter(game, teams_matter, self.gametypefilter)) { remove(self); return; diff --git a/data/qcsrc/server/teamplay.qc b/data/qcsrc/server/teamplay.qc index cf8e53680..2d201f2ab 100644 --- a/data/qcsrc/server/teamplay.qc +++ b/data/qcsrc/server/teamplay.qc @@ -12,7 +12,7 @@ float IsTeamBalanceForced() { if(intermission_running) return 0; // no rebalancing whatsoever please - if(!cvar("teamplay")) + if(!teams_matter) return 0; if(cvar("g_campaign")) return 0; @@ -486,7 +486,7 @@ void SetPlayerColors(entity pl, float _color) shirt = _color & 0xF0; - if(teamplay) { + if(teams_matter) { setcolor(pl, 16*pants + pants); } else { setcolor(pl, shirt + pants); @@ -824,7 +824,7 @@ float JoinBestTeam(entity pl, float only_return_best, float forcebestteam) float smallest, selectedteam; // don't join a team if we're not playing a team game - if(!cvar("teamplay") && !g_domination && !g_ctf && !g_keyhunt) + if(!teams_matter) return 0; // find out what teams are available @@ -905,7 +905,7 @@ void SV_ChangeTeam(float _color) float scolor, dcolor, steam, dteam, dbotcount, scount, dcount; // in normal deathmatch we can just apply the color and we're done - if(!cvar("teamplay")) { + if(!teams_matter) { SetPlayerColors(self, _color); return; } @@ -945,7 +945,7 @@ void SV_ChangeTeam(float _color) return; } - if(cvar("teamplay")) + if(teams_matter) { if(cvar("g_campaign") || cvar("g_changeteam_banned")) { @@ -1014,7 +1014,7 @@ void SV_ChangeTeam(float _color) // bprint("allow change teams from ", ftos(steam), " to ", ftos(dteam), "\n"); - if(cvar("teamplay") && self.classname == "player" && steam != dteam) + if(teams_matter && self.classname == "player" && steam != dteam) { // reduce frags during a team change TeamchangeFrags(self); @@ -1022,7 +1022,7 @@ void SV_ChangeTeam(float _color) SetPlayerTeam(self, dteam, steam, FALSE); - if(cvar("teamplay") && self.classname == "player" && steam != dteam) + if(teams_matter && self.classname == "player" && steam != dteam) { // kill player when changing teams if(self.deadflag == DEAD_NO) diff --git a/data/qcsrc/server/w_rocketlauncher.qc b/data/qcsrc/server/w_rocketlauncher.qc index d95779305..546a9f65e 100644 --- a/data/qcsrc/server/w_rocketlauncher.qc +++ b/data/qcsrc/server/w_rocketlauncher.qc @@ -303,7 +303,7 @@ float w_rlauncher(float req) // count potential damage according to type of target if (targ == self) selfdamage = selfdamage + d; - else if (targ.team == self.team && teamplay) + else if (targ.team == self.team && teams_matter) teamdamage = teamdamage + d; else if (bot_shouldattack(targ)) enemydamage = enemydamage + d; @@ -315,7 +315,7 @@ float w_rlauncher(float req) desirabledamage = enemydamage; if (teamplay != 1 && time > self.invincible_finished && time > self.spawnshieldtime) desirabledamage = desirabledamage - selfdamage * cvar("g_balance_selfdamagepercent"); - if (self.team && teamplay == 2) + if (self.team && teamplay != 1) desirabledamage = desirabledamage - teamdamage; missile = find(world, classname, "rocket"); -- 2.39.2