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