r6030 - in branches/nexuiz-2.0: . data/qcsrc/server

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Sun Mar 1 06:31:09 EST 2009


Author: div0
Date: 2009-03-01 06:31:09 -0500 (Sun, 01 Mar 2009)
New Revision: 6030

Modified:
   branches/nexuiz-2.0/.patchsets
   branches/nexuiz-2.0/data/qcsrc/server/bots.qc
   branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc
   branches/nexuiz-2.0/data/qcsrc/server/clientcommands.qc
   branches/nexuiz-2.0/data/qcsrc/server/defs.qh
   branches/nexuiz-2.0/data/qcsrc/server/domination.qc
   branches/nexuiz-2.0/data/qcsrc/server/g_damage.qc
   branches/nexuiz-2.0/data/qcsrc/server/g_world.qc
   branches/nexuiz-2.0/data/qcsrc/server/gamecommand.qc
   branches/nexuiz-2.0/data/qcsrc/server/havocbot_roles.qc
   branches/nexuiz-2.0/data/qcsrc/server/sv_main.qc
   branches/nexuiz-2.0/data/qcsrc/server/teamplay.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_rocketlauncher.qc
Log:
r6012 | div0 | 2009-02-27 19:30:19 +0100 (Fri, 27 Feb 2009) | 2 lines
lots of teamplay cleanups, should fix "color 3 3; cmd join" server crash exploit
r6013 | div0 | 2009-02-27 19:32:06 +0100 (Fri, 27 Feb 2009) | 2 lines
slightly better behaviour on "color 14 14; connect ..."
r6014 | div0 | 2009-02-27 19:41:17 +0100 (Fri, 27 Feb 2009) | 2 lines
more teamplay fixes

Please try this patchset on your servers! It might cause crashes or bad team balance! PLEASE TEST.


Modified: branches/nexuiz-2.0/.patchsets
===================================================================
--- branches/nexuiz-2.0/.patchsets	2009-03-01 11:28:08 UTC (rev 6029)
+++ branches/nexuiz-2.0/.patchsets	2009-03-01 11:31:09 UTC (rev 6030)
@@ -1,2 +1,2 @@
 master = svn://svn.icculus.org/nexuiz/trunk
-revisions_applied = 1-6008,6010-6011,6026-6026
+revisions_applied = 1-6014,6026-6026

Modified: branches/nexuiz-2.0/data/qcsrc/server/bots.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/bots.qc	2009-03-01 11:28:08 UTC (rev 6029)
+++ branches/nexuiz-2.0/data/qcsrc/server/bots.qc	2009-03-01 11:31:09 UTC (rev 6030)
@@ -1627,11 +1627,11 @@
 	{
 		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;

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc	2009-03-01 11:28:08 UTC (rev 6029)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc	2009-03-01 11:31:09 UTC (rev 6030)
@@ -722,6 +722,7 @@
 		self.campingrifle_bulletcounter = 0;
 
 		self.classname = "player";
+		self.wasplayer = TRUE;
 		self.iscreature = TRUE;
 		self.movetype = MOVETYPE_WALK;
 		self.solid = SOLID_SLIDEBOX;
@@ -1091,7 +1092,7 @@
 void DoTeamChange(float destteam)
 {
 	float t, c0;
-	if(!cvar("teamplay"))
+	if(!teams_matter)
 	{
 		if(destteam >= 0)
 			SetPlayerColors(self, destteam);
@@ -1174,6 +1175,7 @@
 void ClientConnect (void)
 {
 	local string s;
+	float t;
 
 	if(self.flags & FL_CLIENT)
 	{
@@ -1207,16 +1209,17 @@
 	//if(g_domination)
 	//	dom_player_join_team(self);
 
+	JoinBestTeam(self, FALSE, FALSE); // if the team number is valid, keep it
+
 	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 +1283,10 @@
 	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 +1486,10 @@
 
 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 +1514,7 @@
 	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 +1914,7 @@
 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.wasplayer && cvar("g_changeteam_banned"))) {
 			self.classname = "player";
 			if(cvar("g_campaign") || cvar("g_balance_teams") || cvar("g_balance_teams_force"))
 				JoinBestTeam(self, FALSE, TRUE);

Modified: branches/nexuiz-2.0/data/qcsrc/server/clientcommands.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/clientcommands.qc	2009-03-01 11:28:08 UTC (rev 6029)
+++ branches/nexuiz-2.0/data/qcsrc/server/clientcommands.qc	2009-03-01 11:31:09 UTC (rev 6030)
@@ -138,7 +138,7 @@
 			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 @@
 	} 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);

Modified: branches/nexuiz-2.0/data/qcsrc/server/defs.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/defs.qh	2009-03-01 11:28:08 UTC (rev 6029)
+++ branches/nexuiz-2.0/data/qcsrc/server/defs.qh	2009-03-01 11:31:09 UTC (rev 6030)
@@ -541,3 +541,5 @@
 // the QC VM sucks
 #define BITXOR(v,b)        ((v) + (b) - 2 * ((v) & (b)))
 #define BITXOR_ASSIGN(v,b) ((v) += ((b) - 2 * ((v) & (b))))
+
+.float wasplayer;

Modified: branches/nexuiz-2.0/data/qcsrc/server/domination.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/domination.qc	2009-03-01 11:28:08 UTC (rev 6029)
+++ branches/nexuiz-2.0/data/qcsrc/server/domination.qc	2009-03-01 11:31:09 UTC (rev 6030)
@@ -605,7 +605,7 @@
 	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");
 };
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/g_damage.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_damage.qc	2009-03-01 11:28:08 UTC (rev 6029)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_damage.qc	2009-03-01 11:31:09 UTC (rev 6030)
@@ -296,7 +296,7 @@
 		}
 		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!"));

Modified: branches/nexuiz-2.0/data/qcsrc/server/g_world.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_world.qc	2009-03-01 11:28:08 UTC (rev 6029)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_world.qc	2009-03-01 11:31:09 UTC (rev 6030)
@@ -196,6 +196,7 @@
 		BADPREFIX("userbind");
 		BADPREFIX("v_");
 		BADPREFIX("vid_");
+		BADPREFIX("crosshair");
 		BADCVAR("mod_q3bsp_lightmapmergepower");
 		BADCVAR("mod_q3bsp_nolightmaps");
 
@@ -1166,7 +1167,7 @@
 		}
 	}
 
-	if(teamplay)
+	if(teams_matter)
 	{
 		s = strcat(":labels:teamscores:", GetTeamScoreString(0, 0));
 		if(to_console)

Modified: branches/nexuiz-2.0/data/qcsrc/server/gamecommand.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/gamecommand.qc	2009-03-01 11:28:08 UTC (rev 6029)
+++ branches/nexuiz-2.0/data/qcsrc/server/gamecommand.qc	2009-03-01 11:31:09 UTC (rev 6030)
@@ -725,7 +725,7 @@
 	}
 	if (argv(0) == "lockteams")
 	{
-		if(teamplay)
+		if(teams_matter)
 		{
 			lockteams = 1;
 			bprint("^1The teams are now locked.\n");
@@ -736,7 +736,7 @@
 	}
 	if (argv(0) == "unlockteams")
 	{
-		if(teamplay)
+		if(teams_matter)
 		{
 			lockteams = 0;
 			bprint("^1The teams are now unlocked.\n");

Modified: branches/nexuiz-2.0/data/qcsrc/server/havocbot_roles.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/havocbot_roles.qc	2009-03-01 11:28:08 UTC (rev 6029)
+++ branches/nexuiz-2.0/data/qcsrc/server/havocbot_roles.qc	2009-03-01 11:31:09 UTC (rev 6030)
@@ -128,7 +128,7 @@
 			}
 		}
 		
-		if(teamplay)
+		if(teams_matter)
 		{
 			discard = FALSE;
 			
@@ -246,7 +246,7 @@
 {
 	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)
 	{

Modified: branches/nexuiz-2.0/data/qcsrc/server/sv_main.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/sv_main.qc	2009-03-01 11:28:08 UTC (rev 6029)
+++ branches/nexuiz-2.0/data/qcsrc/server/sv_main.qc	2009-03-01 11:31:09 UTC (rev 6030)
@@ -154,6 +154,12 @@
 
 	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 SV_OnEntityPreSpawnFunction()
 {
 	if(self.gametypefilter != "")
-	if not(isGametypeInFilter(game, teamplay, self.gametypefilter))
+	if not(isGametypeInFilter(game, teams_matter, self.gametypefilter))
 	{
 		remove(self);
 		return;

Modified: branches/nexuiz-2.0/data/qcsrc/server/teamplay.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/teamplay.qc	2009-03-01 11:28:08 UTC (rev 6029)
+++ branches/nexuiz-2.0/data/qcsrc/server/teamplay.qc	2009-03-01 11:31:09 UTC (rev 6030)
@@ -12,7 +12,7 @@
 {
 	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 @@
 	shirt = _color & 0xF0;
 
 
-	if(teamplay) {
+	if(teams_matter) {
 		setcolor(pl, 16*pants + pants);
 	} else {
 		setcolor(pl, shirt + pants);
@@ -824,7 +824,7 @@
 	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 @@
 	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,76 +945,79 @@
 		return;
 	}
 
-	if(cvar("teamplay"))
+	if(cvar("g_campaign"))
 	{
-		if(cvar("g_campaign") || cvar("g_changeteam_banned"))
+		sprint(self, "Team changes not allowed\n");
+		return; // changing teams is not allowed
+	}
+
+	if(cvar("g_changeteam_banned") && self.wasplayer)
+	{
+		sprint(self, "Team changes not allowed\n");
+		return;
+	}
+
+	if(cvar("g_balance_teams_prevent_imbalance"))
+	{
+		// only allow changing to a smaller or equal size team
+
+		// find out what teams are available
+		//CheckAllowedTeams();
+		// count how many players on each team
+		GetTeamCounts(world);
+
+		// get desired team
+		if(dteam == 1 && c1 >= 0)//dcolor == COLOR_TEAM1 - 1)
 		{
-			sprint(self, "Team changes not allowed\n");
-			return; // changing teams is not allowed
+			dcount = c1;
+			dbotcount = cb1;
 		}
-
-		if(!cvar("g_campaign") && cvar("g_balance_teams_prevent_imbalance"))
+		else if(dteam == 2 && c2 >= 0)//dcolor == COLOR_TEAM2 - 1)
 		{
-			// only allow changing to a smaller or equal size team
+			dcount = c2;
+			dbotcount = cb2;
+		}
+		else if(dteam == 3 && c3 >= 0)//dcolor == COLOR_TEAM3 - 1)
+		{
+			dcount = c3;
+			dbotcount = cb3;
+		}
+		else if(dteam == 4 && c4 >= 0)//dcolor == COLOR_TEAM4 - 1)
+		{
+			dcount = c4;
+			dbotcount = cb4;
+		}
+		else
+		{
+			sprint(self, "Cannot change to an invalid team\n");
 
-			// find out what teams are available
-			//CheckAllowedTeams();
-			// count how many players on each team
-			GetTeamCounts(world);
+			return;
+		}
 
-			// get desired team
-			if(dteam == 1 && c1 >= 0)//dcolor == COLOR_TEAM1 - 1)
-			{
-				dcount = c1;
-				dbotcount = cb1;
-			}
-			else if(dteam == 2 && c2 >= 0)//dcolor == COLOR_TEAM2 - 1)
-			{
-				dcount = c2;
-				dbotcount = cb2;
-			}
-			else if(dteam == 3 && c3 >= 0)//dcolor == COLOR_TEAM3 - 1)
-			{
-				dcount = c3;
-				dbotcount = cb3;
-			}
-			else if(dteam == 4 && c4 >= 0)//dcolor == COLOR_TEAM4 - 1)
-			{
-				dcount = c4;
-				dbotcount = cb4;
-			}
-			else
-			{
-				sprint(self, "Cannot change to an invalid team\n");
+		// get starting team
+		if(steam == 1)//scolor == COLOR_TEAM1 - 1)
+			scount = c1;
+		else if(steam == 2)//scolor == COLOR_TEAM2 - 1)
+			scount = c2;
+		else if(steam == 3)//scolor == COLOR_TEAM3 - 1)
+			scount = c3;
+		else if(steam == 4)//scolor == COLOR_TEAM4 - 1)
+			scount = c4;
 
-				return;
-			}
-
-			// get starting team
-			if(steam == 1)//scolor == COLOR_TEAM1 - 1)
-				scount = c1;
-			else if(steam == 2)//scolor == COLOR_TEAM2 - 1)
-				scount = c2;
-			else if(steam == 3)//scolor == COLOR_TEAM3 - 1)
-				scount = c3;
-			else if(steam == 4)//scolor == COLOR_TEAM4 - 1)
-				scount = c4;
-
-			if(scount) // started at a valid, nonempty team
+		if(scount) // started at a valid, nonempty team
+		{
+			// check if we're trying to change to a larger team that doens't have bots to swap with
+			if(dcount >= scount && dbotcount <= 0)
 			{
-				// check if we're trying to change to a larger team that doens't have bots to swap with
-				if(dcount >= scount && dbotcount <= 0)
-				{
-					sprint(self, "Cannot change to a larger team\n");
-					return; // can't change to a larger team
-				}
+				sprint(self, "Cannot change to a larger team\n");
+				return; // can't change to a larger team
 			}
 		}
 	}
 
 //	bprint("allow change teams from ", ftos(steam), " to ", ftos(dteam), "\n");
 
-	if(cvar("teamplay") && self.classname == "player" && steam != dteam)
+	if(self.classname == "player" && steam != dteam)
 	{
 		// reduce frags during a team change
 		TeamchangeFrags(self);
@@ -1022,7 +1025,7 @@
 
 	SetPlayerTeam(self, dteam, steam, FALSE);
 
-	if(cvar("teamplay") && self.classname == "player" && steam != dteam)
+	if(self.classname == "player" && steam != dteam)
 	{
 		// kill player when changing teams
 		if(self.deadflag == DEAD_NO)

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_rocketlauncher.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_rocketlauncher.qc	2009-03-01 11:28:08 UTC (rev 6029)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_rocketlauncher.qc	2009-03-01 11:31:09 UTC (rev 6030)
@@ -303,7 +303,7 @@
 					// 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 @@
 			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");




More information about the nexuiz-commits mailing list