r4474 - trunk/data/qcsrc/server

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Sat Sep 20 11:20:16 EDT 2008


Author: div0
Date: 2008-09-20 11:20:16 -0400 (Sat, 20 Sep 2008)
New Revision: 4474

Modified:
   trunk/data/qcsrc/server/cl_player.qc
   trunk/data/qcsrc/server/g_world.qc
   trunk/data/qcsrc/server/race.qc
   trunk/data/qcsrc/server/race.qh
Log:
race:
- enter race from qualifying at timelimit when at least one player is "ready"
- abandon race when DYING, not when RESPAWNING


Modified: trunk/data/qcsrc/server/cl_player.qc
===================================================================
--- trunk/data/qcsrc/server/cl_player.qc	2008-09-19 17:38:42 UTC (rev 4473)
+++ trunk/data/qcsrc/server/cl_player.qc	2008-09-20 15:20:16 UTC (rev 4474)
@@ -497,6 +497,7 @@
 		SpawnThrownWeapon (self.origin + (self.mins + self.maxs) * 0.5, self.switchweapon);
 		// print an obituary message
 		Obituary (attacker, self, deathtype);
+		race_PreDie();
 		DropAllRunes(self);
 		if(self == attacker)
 			kh_Key_DropAll(self, TRUE);

Modified: trunk/data/qcsrc/server/g_world.qc
===================================================================
--- trunk/data/qcsrc/server/g_world.qc	2008-09-19 17:38:42 UTC (rev 4473)
+++ trunk/data/qcsrc/server/g_world.qc	2008-09-20 15:20:16 UTC (rev 4474)
@@ -1443,19 +1443,21 @@
 	{
 		float totalplayers;
 		float playerswithlaps;
+		float readyplayers;
 		entity head;
-		totalplayers = playerswithlaps = 0;
+		totalplayers = playerswithlaps = readyplayers = 0;
 		FOR_EACH_PLAYER(head)
 		{
 			++totalplayers;
 			if(PlayerScore_Add(head, SP_RACE_FASTEST, 0))
 				++playerswithlaps;
+			if(head.ready)
+				++readyplayers;
 		}
 
 		// at least 2/3 of the players have completed a lap: start the RACE
 		// otherwise, the players should end the qualifying on their own
-		if(totalplayers >= 3)
-		if(playerswithlaps >= totalplayers * 2 / 3)
+		if(readyplayers || ((totalplayers >= 3) && (playerswithlaps * 3 >= totalplayers * 2)))
 		{
 			checkrules_overtimeend = 0;
 			ReadyRestart();

Modified: trunk/data/qcsrc/server/race.qc
===================================================================
--- trunk/data/qcsrc/server/race.qc	2008-09-19 17:38:42 UTC (rev 4473)
+++ trunk/data/qcsrc/server/race.qc	2008-09-20 15:20:16 UTC (rev 4474)
@@ -78,6 +78,8 @@
 void race_SendTime(entity e, float cp, float t, float tvalid)
 {
 	float snew, l;
+	entity p;
+
 	t = floor(0.5 + 10 * t); // make integer
 
 	if(tvalid)
@@ -100,7 +102,12 @@
 
 			if(cvar("fraglimit"))
 				if(l >= cvar("fraglimit"))
+				{
 					race_completing = 1;
+					FOR_EACH_PLAYER(p)
+						if(p.deadflag != DEAD_NO)
+							race_AbandonRaceCheck(p);
+				}
 
 			if(race_completing)
 			{
@@ -174,7 +181,6 @@
 
 				if(g_race_qualifying)
 				{
-					entity p;
 					FOR_EACH_REALPLAYER(p)
 						if(p.race_checkpoint == cp)
 							race_SendNextCheckpoint(p, 0);
@@ -441,6 +447,25 @@
 	self.sprite.waypointsprite_for_player = race_waypointsprite_for_player;
 }
 
+void race_AbandonRaceCheck(entity p)
+{
+	if(race_completing && !p.race_completed)
+	{
+		p.race_completed = 1;
+		MAKE_INDEPENDENT_PLAYER(p);
+		bprint(p.netname, "^7 has abandoned the race.\n");
+		// TODO support spectators with this (e.g. set a flag for forced sbar)
+		if(clienttype(p) == CLIENTTYPE_REAL)
+		{
+			msg_entity = p;
+			WriteByte(MSG_ONE, SVC_TEMPENTITY);
+			WriteByte(MSG_ONE, TE_CSQC_FORCESCOREBOARD);
+			WriteByte(MSG_ONE, 1);
+			// he can still move, but will see the scoreboard now
+		}
+	}
+}
+
 void race_PreparePlayer()
 {
 	race_ClearTime(self);
@@ -459,6 +484,11 @@
 	}
 }
 
+void race_PreDie()
+{
+	race_AbandonRaceCheck(self);
+}
+
 void race_PreSpawn()
 {
 	if(!g_race)
@@ -466,21 +496,7 @@
 	if(self.killcount == -666 || g_race_qualifying)
 		race_PreparePlayer();
 
-	if(race_completing)
-	{
-		self.race_completed = 1;
-		MAKE_INDEPENDENT_PLAYER(self);
-		bprint(self.netname, "^7 has abandoned the race.\n");
-		// TODO support spectators with this (e.g. set a flag for forced sbar)
-		if(clienttype(self) == CLIENTTYPE_REAL)
-		{
-			msg_entity = self;
-			WriteByte(MSG_ONE, SVC_TEMPENTITY);
-			WriteByte(MSG_ONE, TE_CSQC_FORCESCOREBOARD);
-			WriteByte(MSG_ONE, 1);
-			// he can still move, but will see the scoreboard now
-		}
-	}
+	race_AbandonRaceCheck(self);
 }
 
 void race_PostSpawn(entity spot)

Modified: trunk/data/qcsrc/server/race.qh
===================================================================
--- trunk/data/qcsrc/server/race.qh	2008-09-19 17:38:42 UTC (rev 4473)
+++ trunk/data/qcsrc/server/race.qh	2008-09-20 15:20:16 UTC (rev 4474)
@@ -2,11 +2,13 @@
 void race_PreSpawnObserver();
 void race_PreSpawn();
 void race_PostSpawn(entity spot);
+void race_PreDie();
 void race_ReadyRestart();
 float race_teams;
 float race_spawns;
 float race_PreviousCheckpoint(float f);
 float race_NextCheckpoint(float f);
+void race_AbandonRaceCheck(entity p);
 float race_highest_place_spawn; // number of places; a place higher gets spawned at 0
 float race_lowest_place_spawn; // where to spawn in qualifying
 float race_fraglimit;




More information about the nexuiz-commits mailing list