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

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Sun Jul 9 11:27:03 EDT 2006


Author: div0
Date: 2006-07-09 11:27:03 -0400 (Sun, 09 Jul 2006)
New Revision: 1743

Modified:
   branches/nexuiz-2.0/data/default.cfg
   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/miscfunctions.qc
   branches/nexuiz-2.0/data/qcsrc/server/teamplay.qc
Log:
teamchange frag transfer to team mates; say_team


Modified: branches/nexuiz-2.0/data/default.cfg
===================================================================
--- branches/nexuiz-2.0/data/default.cfg	2006-07-09 15:25:38 UTC (rev 1742)
+++ branches/nexuiz-2.0/data/default.cfg	2006-07-09 15:27:03 UTC (rev 1743)
@@ -240,7 +240,7 @@
 seta g_balance_teams_prevent_imbalance	0	// prevent players from changing to larger teams
 seta g_tdm_teams			2	// how many teams are in team deathmatch
 set g_changeteam_banned			0	// not allowed to change team
-set g_changeteam_fragtransfer		80	// % of frags you get to keep when you change teams (rounded down)
+set g_changeteam_fragtransfer		0	// % of frags you get to keep when you change teams (rounded down)
 
 // ctf
 set g_ctf				0

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc	2006-07-09 15:25:38 UTC (rev 1742)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc	2006-07-09 15:27:03 UTC (rev 1743)
@@ -290,6 +290,8 @@
 	if (cvar("g_runematch"))
 		DropAllRunes(self);
 
+	DistributeFragsAmongTeam(self, self.team, 1);
+
 	if(self.frags <= 0 && self.frags > -666 && cvar("g_lms") && self.killcount != -666)
 		bprint (strcat("^4", self.netname, "^4 has no more lives left\n"));
 	else if(self.killcount != -666)
@@ -811,6 +813,8 @@
 	if(self.flagcarried)
 		DropFlag(self.flagcarried);
 
+	DistributeFragsAmongTeam(self, self.team, 1);
+
 	save = self.flags;
 	self.flags = self.flags - (self.flags & FL_CLIENT);
 	bot_relinkplayerlist();

Modified: branches/nexuiz-2.0/data/qcsrc/server/clientcommands.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/clientcommands.qc	2006-07-09 15:25:38 UTC (rev 1742)
+++ branches/nexuiz-2.0/data/qcsrc/server/clientcommands.qc	2006-07-09 15:27:03 UTC (rev 1743)
@@ -1,6 +1,72 @@
 void ReadyCount();
 float ValidateMap(string vote);
 
+void Say(entity source, float teamsay, string msgin)
+{
+	string msgstr, colorstr;
+	entity head;
+
+	msgin = formatmessage(msgin);
+
+	if(source.team == COLOR_TEAM1)
+		colorstr = "^1";
+	else if(source.team == COLOR_TEAM2)
+		colorstr = "^4";
+	else if(source.team == COLOR_TEAM3)
+		colorstr = "^6";
+	else if(source.team == COLOR_TEAM4)
+		colorstr = "^3";
+	else
+		colorstr = "^7";
+
+	if(!teams_matter)
+		teamsay = FALSE;
+
+	if(source.classname != "player") // observers can't
+		teamsay = FALSE;
+
+	// how can we prevent the message from appearing in a listen server?
+	// for now, just give "say" back and only handle say_team
+	if(!teamsay)
+	{
+		clientcommand(self, strcat("say ", msgin));
+		return;
+	}
+
+	if(teamsay)
+		msgstr = strcat(colorstr, "(^3", source.netname, colorstr, ") ^7", msgin, "\n");
+	else
+		msgstr = strcat("^3", source.netname, "^7: ", msgin, "\n");
+
+	head = find(world, classname, "player");
+	while(head)
+	{
+		if(clienttype(head) == CLIENTTYPE_REAL)
+			if(!teamsay || (head.team == source.team))
+				sprint(head, msgstr);
+		head = find(head, classname, "player");
+	}
+
+	if(!teamsay)
+	{
+		head = find(world, classname, "observer");
+		while(head)
+		{
+			if(clienttype(head) == CLIENTTYPE_REAL)
+				sprint(head, msgstr);
+			head = find(head, classname, "observer");
+		}
+		head = find(world, classname, "spectator");
+		while(head)
+		{
+			if(clienttype(head) == CLIENTTYPE_REAL)
+				sprint(head, msgstr);
+			head = find(head, classname, "spectator");
+		}
+		ServerConsoleEcho(substring(msgstr, 0, strlen(msgstr) - 1), TRUE);
+	}
+}
+
 void SV_ParseClientCommand(string s) {
 	local float index;
 
@@ -258,9 +324,11 @@
 			ReadyCount();
 		}
 	} else if(argv(0) == "say") {
-		clientcommand(self, formatmessage(s));
+		Say(self, FALSE, substring(s, 4, strlen(s) - 4));
+		//clientcommand(self, formatmessage(s));
 	} else if(argv(0) == "say_team") {
-		clientcommand(self, formatmessage(s));
+		Say(self, TRUE, substring(s, 9, strlen(s) - 9));
+		//clientcommand(self, formatmessage(s));
 	} else {
 		clientcommand(self,s);
 	}

Modified: branches/nexuiz-2.0/data/qcsrc/server/defs.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/defs.qh	2006-07-09 15:25:38 UTC (rev 1742)
+++ branches/nexuiz-2.0/data/qcsrc/server/defs.qh	2006-07-09 15:27:03 UTC (rev 1743)
@@ -266,3 +266,6 @@
 #define NUM_JUMPPADSUSED 3
 .float jumppadcount;
 .entity jumppadsused[NUM_JUMPPADSUSED];
+
+string gamemode_name;
+float teams_matter;

Modified: branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc	2006-07-09 15:25:38 UTC (rev 1742)
+++ branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc	2006-07-09 15:27:03 UTC (rev 1743)
@@ -421,3 +421,59 @@
 	dprint("\n--- CUT UNTIL HERE ---\n");
 	cvar_set("developer", ftos(dev));
 }
+
+void DistributeFragsAmongTeam(entity p, float targetteam, float factor)
+{
+	float f;
+	float d;
+	float nTeam;
+	entity head;
+
+	if(!teams_matter)
+		return;
+
+	//if(p.frags < 0)
+	//{
+	//	p.frags = 0; // do not harm the new team!
+	//	return; // won't distribute negative scores
+	//}
+
+	if(p.frags == -666)
+		return;
+	
+	f = ceil(factor * p.frags);
+	p.frags = p.frags - f;
+
+	nTeam = 0;
+	head = find(world, classname, "player");
+	while(head)
+	{
+		if(head != p)
+			if(head.team == targetteam)
+				nTeam = nTeam + 1;
+		head = find(head, classname, "player");
+	}
+
+	if(nTeam == 0)
+		return;
+
+	head = find(world, classname, "player");
+	while(head)
+	{
+		if(head != p)
+			if(head.team == targetteam)
+			{
+				d = floor(f / nTeam);
+				head.frags = head.frags + d;
+				f = f - d;
+				nTeam = nTeam - 1;
+			}
+		head = find(head, classname, "player");
+	}
+
+	if(nTeam != 0)
+		error("nPlayers in team changed!");
+	if(f != 0)
+		error(strcat("There were ", ftos(f), " frags left. BAD!"));
+}
+

Modified: branches/nexuiz-2.0/data/qcsrc/server/teamplay.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/teamplay.qc	2006-07-09 15:25:38 UTC (rev 1742)
+++ branches/nexuiz-2.0/data/qcsrc/server/teamplay.qc	2006-07-09 15:27:03 UTC (rev 1743)
@@ -22,6 +22,14 @@
 
 float audit_teams_time;
 
+void TeamchangeFrags(entity e)
+{
+	if(e.classname == "player")
+	{
+		// reduce frags during a team change
+		DistributeFragsAmongTeam(e, (e.clientcolors & 0x0F) + 1, 1 - cvar("g_changeteam_fragtransfer") / 100);
+	}
+}
 
 string TeamName(float t)
 {
@@ -105,9 +113,6 @@
 		cvar_set("teamplay", "3");
 }
 
-string gamemode_name;
-float teams_matter;
-
 void InitGameplayMode()
 {
 	float fraglimit_override, timelimit_override;
@@ -734,6 +739,7 @@
 
 	if(!only_return_best)
 	{
+		TeamchangeFrags(self);
 		if(smallest == 1)
 		{
 			SetPlayerColors(pl, COLOR_TEAM1 - 1);
@@ -896,18 +902,22 @@
 
 //	bprint(strcat("allow change teams from ", ftos(steam), " to ", ftos(dteam), "\n"));
 
+	if(cvar("teamplay") && self.classname == "player" && steam != dteam)
+	{
+		// reduce frags during a team change
+		TeamchangeFrags(self);
+	}
+
 	SetPlayerTeam(self, dteam, steam, FALSE);
+
 	if(cvar("teamplay") && self.classname == "player" && steam != dteam)
 	{
 		// kill player when changing teams
 		if(self.deadflag == DEAD_NO)
 			Damage(self, self, self, 100000, DEATH_TEAMCHANGE, self.origin, '0 0 0');
-			// reduce frags during a team change
-			self.frags = floor(self.frags * (cvar("g_changeteam_fragtransfer") / 100));
 	}
 }
 
-
 void ShufflePlayerOutOfTeam (float source_team)
 {
 	float smallestteam, smallestteam_count, steam;




More information about the nexuiz-commits mailing list