r4101 - trunk/data/qcsrc/server

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Mon Aug 11 04:16:39 EDT 2008


Author: div0
Date: 2008-08-11 04:16:29 -0400 (Mon, 11 Aug 2008)
New Revision: 4101

Modified:
   trunk/data/qcsrc/server/cl_client.qc
   trunk/data/qcsrc/server/clientcommands.qc
   trunk/data/qcsrc/server/defs.qh
   trunk/data/qcsrc/server/g_damage.qc
   trunk/data/qcsrc/server/g_world.qc
   trunk/data/qcsrc/server/havocbot.qc
   trunk/data/qcsrc/server/race.qc
   trunk/data/qcsrc/server/race.qh
   trunk/data/qcsrc/server/scores.qc
   trunk/data/qcsrc/server/scores.qh
Log:
race: let everyone complete his lap when the race is over; players who have completed their race get the intermission scoreboard but still can walk (as nonsolid players)


Modified: trunk/data/qcsrc/server/cl_client.qc
===================================================================
--- trunk/data/qcsrc/server/cl_client.qc	2008-08-10 17:49:50 UTC (rev 4100)
+++ trunk/data/qcsrc/server/cl_client.qc	2008-08-11 08:16:29 UTC (rev 4101)
@@ -613,10 +613,9 @@
 		self.classname = "player";
 		self.iscreature = TRUE;
 		self.movetype = MOVETYPE_WALK;
+		self.solid = SOLID_SLIDEBOX;
 		if(independent_players)
-			self.solid = SOLID_TRIGGER;
-		else
-			self.solid = SOLID_SLIDEBOX;
+			MAKE_INDEPENDENT_PLAYER(self);
 		self.flags = FL_CLIENT;
 		self.takedamage = DAMAGE_AIM;
 		if(g_minstagib)

Modified: trunk/data/qcsrc/server/clientcommands.qc
===================================================================
--- trunk/data/qcsrc/server/clientcommands.qc	2008-08-10 17:49:50 UTC (rev 4100)
+++ trunk/data/qcsrc/server/clientcommands.qc	2008-08-11 08:16:29 UTC (rev 4101)
@@ -385,7 +385,7 @@
 	bprint("^1Server is restarting...\n");
 
 	// no arena, assault support yet...
-	if(g_arena | g_assault | gameover | intermission_running)
+	if(g_arena | g_assault | gameover | intermission_running | race_completing)
 		localcmd("restart\n");
 
 	if(readyNagActive) { //if every player is ready, remove the ready-nagger again

Modified: trunk/data/qcsrc/server/defs.qh
===================================================================
--- trunk/data/qcsrc/server/defs.qh	2008-08-10 17:49:50 UTC (rev 4100)
+++ trunk/data/qcsrc/server/defs.qh	2008-08-11 08:16:29 UTC (rev 4101)
@@ -484,3 +484,5 @@
 .float version_mismatch;
 
 float independent_players;
+#define IS_INDEPENDENT_PLAYER(e) ((e).solid == SOLID_TRIGGER)
+#define MAKE_INDEPENDENT_PLAYER(e) ((e).solid = SOLID_TRIGGER)

Modified: trunk/data/qcsrc/server/g_damage.qc
===================================================================
--- trunk/data/qcsrc/server/g_damage.qc	2008-08-10 17:49:50 UTC (rev 4100)
+++ trunk/data/qcsrc/server/g_damage.qc	2008-08-11 08:16:29 UTC (rev 4101)
@@ -515,7 +515,7 @@
 		if(deathtype != DEATH_TELEFRAG)
 		if(attacker.classname == "player")
 		{
-			if(independent_players && targ != attacker && targ.classname == "player")
+			if(targ.classname == "player" && targ != attacker && IS_INDEPENDENT_PLAYER(attacker) && IS_INDEPENDENT_PLAYER(targ))
 			{
 				damage = 0;
 				force = '0 0 0';

Modified: trunk/data/qcsrc/server/g_world.qc
===================================================================
--- trunk/data/qcsrc/server/g_world.qc	2008-08-10 17:49:50 UTC (rev 4100)
+++ trunk/data/qcsrc/server/g_world.qc	2008-08-11 08:16:29 UTC (rev 4101)
@@ -1497,6 +1497,24 @@
 	return GetWinningCode(limit && WinningConditionHelper_topscore && (WinningConditionHelper_topscore >= limit), WinningConditionHelper_equality);
 }
 
+float WinningCondition_Race(float fraglimit)
+{
+	float wc;
+	entity p;
+	wc = WinningCondition_Scores(fraglimit);
+
+	// ALWAYS initiate overtime, unless EVERYONE has finished the race!
+	if(wc == WINNING_YES || wc == WINNING_STARTOVERTIME)
+	// do NOT support equality when the laps are all raced!
+	{
+		FOR_EACH_PLAYER(p)
+			if not(p.race_completed)
+				return WINNING_STARTOVERTIME;
+		return WINNING_YES;
+	}
+	return wc;
+}
+
 float WinningCondition_RanOutOfSpawns()
 {
 	entity head;
@@ -1609,7 +1627,10 @@
 		{
 			checkrules_overtimewarning = TRUE;
 			//announceall("announcer/robotic/1minuteremains.wav");
-			bcenterprint("^3Now playing ^1OVERTIME^3!\n\n^3Keep fragging until we have a ^1winner^3!");
+			if(!g_race_qualifying)
+				bcenterprint("^3Everyone, finish your lap! The race is over!");
+			else
+				bcenterprint("^3Now playing ^1OVERTIME^3!\n\n^3Keep fragging until we have a ^1winner^3!");
 		}
 	}
 	else
@@ -1635,6 +1656,10 @@
 	{
 		bprint("Hey! Someone ran out of spawns!\n");
 	}
+	else if(g_race && !g_race_qualifying)
+	{
+		status = WinningCondition_Race(fraglimit);
+	}
 	else if(g_assault)
 	{
 		status = WinningCondition_Assault(); // TODO remove this?

Modified: trunk/data/qcsrc/server/havocbot.qc
===================================================================
--- trunk/data/qcsrc/server/havocbot.qc	2008-08-10 17:49:50 UTC (rev 4100)
+++ trunk/data/qcsrc/server/havocbot.qc	2008-08-11 08:16:29 UTC (rev 4101)
@@ -258,7 +258,7 @@
 	local entity head, best;
 	local float rating, bestrating;
 	local vector eye, v;
-	if (cvar("bot_nofire") || independent_players)
+	if (cvar("bot_nofire") || IS_INDEPENDENT_PLAYER(self))
 	{
 		self.enemy = world;
 		return;
@@ -457,7 +457,7 @@
 	if (self.bot_aimtarg)
 	{
 		weapon_action(self.weapon, WR_AIM);
-		if (cvar("bot_nofire") || independent_players)
+		if (cvar("bot_nofire") || IS_INDEPENDENT_PLAYER(self))
 		{
 			self.BUTTON_ATCK = FALSE;
 			self.BUTTON_ATCK2 = FALSE;

Modified: trunk/data/qcsrc/server/race.qc
===================================================================
--- trunk/data/qcsrc/server/race.qc	2008-08-10 17:49:50 UTC (rev 4100)
+++ trunk/data/qcsrc/server/race.qc	2008-08-11 08:16:29 UTC (rev 4101)
@@ -65,11 +65,12 @@
 
 void race_SendTime(entity e, float cp, float t, float tvalid)
 {
+	float snew, l;
 	t = floor(0.5 + 10 * t); // make integer
-	float snew;
 
 	if(tvalid)
 	if(cp == 0) // finish line
+	if not(e.race_completed)
 	{
 		float s;
 		if(g_race_qualifying)
@@ -83,7 +84,24 @@
 			s = PlayerScore_Add(e, SP_RACE_TIME, 0);
 			snew = floor(0.5 + 10 * (time - restart_countdown));
 			PlayerScore_Add(e, SP_RACE_TIME, snew - s);
-			PlayerTeamScore_Add(e, SP_RACE_LAPS, ST_RACE_LAPS, 1);
+			l = PlayerTeamScore_Add(e, SP_RACE_LAPS, ST_RACE_LAPS, 1);
+
+			if(cvar("fraglimit"))
+				if(l > cvar("fraglimit"))
+					race_completing = 1;
+
+			if(race_completing)
+			{
+				e.race_completed = 1;
+				MAKE_INDEPENDENT_PLAYER(e);
+				bprint(e.netname, "^7 has finished the race.\n");
+				if(clienttype(e) == CLIENTTYPE_REAL)
+				{
+					msg_entity = e;
+					WriteByte(MSG_ONE, SVC_INTERMISSION);
+					// he can still move, but will see the scoreboard now
+				}
+			}
 		}
 	}
 

Modified: trunk/data/qcsrc/server/race.qh
===================================================================
--- trunk/data/qcsrc/server/race.qh	2008-08-10 17:49:50 UTC (rev 4100)
+++ trunk/data/qcsrc/server/race.qh	2008-08-11 08:16:29 UTC (rev 4101)
@@ -9,3 +9,5 @@
 float race_highest_place_spawn;
 float race_fraglimit;
 .float race_place;
+.float race_completed;
+float race_completing;

Modified: trunk/data/qcsrc/server/scores.qc
===================================================================
--- trunk/data/qcsrc/server/scores.qc	2008-08-10 17:49:50 UTC (rev 4100)
+++ trunk/data/qcsrc/server/scores.qc	2008-08-11 08:16:29 UTC (rev 4101)
@@ -270,11 +270,13 @@
 	return (s.(scores[scorefield]) += score);
 }
 
-void PlayerTeamScore_Add(entity player, float pscorefield, float tscorefield, float score)
+float PlayerTeamScore_Add(entity player, float pscorefield, float tscorefield, float score)
 {
-	PlayerScore_Add(player, pscorefield, score);
+	float r;
+	r = PlayerScore_Add(player, pscorefield, score);
 	if(teamscores_entities_count) // only for teamplay
-		TeamScore_Add(player, tscorefield, score);
+		r = TeamScore_Add(player, tscorefield, score);
+	return r;
 }
 
 float PlayerScore_Compare(entity t1, entity t2)

Modified: trunk/data/qcsrc/server/scores.qh
===================================================================
--- trunk/data/qcsrc/server/scores.qh	2008-08-10 17:49:50 UTC (rev 4100)
+++ trunk/data/qcsrc/server/scores.qh	2008-08-11 08:16:29 UTC (rev 4101)
@@ -41,9 +41,10 @@
 float TeamScore_AddToTeam(float t, float scorefield, float score);
 
 /**
- * Adds a score to both the player and the team.
+ * Adds a score to both the player and the team. Returns the team score if
+ * possible, otherwise the player score.
  */
-void PlayerTeamScore_Add(entity player, float pscorefield, float tscorefield, float score);
+float PlayerTeamScore_Add(entity player, float pscorefield, float tscorefield, float score);
 
 /**
  * Adds to the generic score fields for both the player and the team.




More information about the nexuiz-commits mailing list