From 7c5fbc24938ccedebf042369b8dbc6298c4c2250 Mon Sep 17 00:00:00 2001 From: div0 Date: Sat, 13 Jan 2007 21:21:45 +0000 Subject: [PATCH] respawn countdown git-svn-id: svn://svn.icculus.org/nexuiz/trunk@2102 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/default.cfg | 16 ++++++++++ data/qcsrc/server/cl_client.qc | 54 ++++++++++++++++++++++++---------- data/qcsrc/server/cl_player.qc | 17 +++++++++-- data/qcsrc/server/constants.qh | 1 + data/qcsrc/server/defs.qh | 2 ++ data/qcsrc/server/g_world.qc | 31 ++++++++++++++----- 6 files changed, 96 insertions(+), 25 deletions(-) diff --git a/data/default.cfg b/data/default.cfg index 817aeff4a..a4cf84267 100644 --- a/data/default.cfg +++ b/data/default.cfg @@ -257,6 +257,22 @@ seta g_ctf_capture_limit -1 seta g_domination_point_limit -1 seta g_runematch_point_limit -1 +// respawn delay +set g_respawn_delay 2 +set g_respawn_waves 0 +set g_ctf_respawn_delay 2 +set g_ctf_respawn_waves 5 +set g_dm_respawn_delay 0 +set g_dm_respawn_waves 0 +set g_dom_respawn_delay 0 +set g_dom_respawn_waves 0 +set g_lms_respawn_delay 0 +set g_lms_respawn_waves 0 +set g_rune_respawn_delay 0 +set g_rune_respawn_waves 0 +set g_tdm_respawn_delay 0 +set g_tdm_respawn_waves 0 + // maximum overtime seta timelimit_maxovertime 5 diff --git a/data/qcsrc/server/cl_client.qc b/data/qcsrc/server/cl_client.qc index 1974e2d94..0572a7958 100644 --- a/data/qcsrc/server/cl_client.qc +++ b/data/qcsrc/server/cl_client.qc @@ -1300,6 +1300,31 @@ float SpectateNext() { } } +/* +============= +ShowRespawnCountdown() + +Update a respawn countdown display. +============= +*/ +void ShowRespawnCountdown() +{ + float number; + if(self.deadflag == DEAD_NO) // just respawned? + return; + else + { + number = ceil(self.death_time - time); + if(number <= 0) + return; + if(number <= self.respawn_countdown) + { + self.respawn_countdown = number - 1; + stuffcmd(self, strcat("play2 announcer/robotic/", ftos(number), ".ogg\n")); + } + } +} + /* ============= PlayerPreThink @@ -1349,34 +1374,33 @@ void PlayerPreThink (void) if (self.deadflag != DEAD_NO) { + float button_pressed, force_respawn; player_anim(); + button_pressed = self.button0 || self.button2 || self.button3 || self.button4 || self.button5 || self.button6 || self.button7 || self.button8 || self.buttonuse; + force_respawn = cvar("g_lms") || cvar("g_forced_respawn"); if (self.deadflag == DEAD_DYING) { - if (time > self.dead_time) + if(force_respawn) + self.deadflag = DEAD_RESPAWNING; + else if(!button_pressed) self.deadflag = DEAD_DEAD; } else if (self.deadflag == DEAD_DEAD) { - if (cvar("g_lms") || cvar("g_arena") || cvar("g_forced_respawn")) - self.deadflag = DEAD_RESPAWNABLE; - else if (!self.button0 && !self.button2 && !self.button3) + if(button_pressed) self.deadflag = DEAD_RESPAWNABLE; } else if (self.deadflag == DEAD_RESPAWNABLE) { - if (self.button0 || - self.button2 || - self.button3 || - self.button4 || - self.button5 || - self.button6 || - self.button7 || - self.button8 || - self.buttonuse || - cvar("g_lms") || - cvar("g_forced_respawn")) + if(!button_pressed) + self.deadflag = DEAD_RESPAWNING; + } + else if (self.deadflag == DEAD_RESPAWNING) + { + if(time > self.death_time) respawn(); } + ShowRespawnCountdown(); return; } diff --git a/data/qcsrc/server/cl_player.qc b/data/qcsrc/server/cl_player.qc index 901830a18..15c1c8490 100644 --- a/data/qcsrc/server/cl_player.qc +++ b/data/qcsrc/server/cl_player.qc @@ -205,7 +205,7 @@ void PlayerCorpseDamage (entity inflictor, entity attacker, float damage, float void PlayerDamage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) { - local float take, save; + local float take, save, waves, sdelay; te_blood (hitloc, force, damage); if (self.pain_finished < time) //Don't switch pain sequences like crazy @@ -312,7 +312,20 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht // dying animation self.deadflag = DEAD_DYING; // when to allow respawn - self.death_time = time + 0.5; + sdelay = cvar(strcat("g_", GetGametype(), "_respawn_delay")); + if(!sdelay) + sdelay = cvar("g_respawn_delay"); + waves = cvar(strcat("g_", GetGametype(), "_respawn_waves")); + if(!waves) + waves = cvar("g_respawn_waves"); + if(waves) + self.death_time = ceil((time + sdelay) / waves) * waves; + else + self.death_time = time + sdelay; + if((sdelay + waves > 5.0) && (self.death_time - time > 1.75)) + self.respawn_countdown = 10; // first number to count down from is 10 + else + self.respawn_countdown = -1; // do not count down // when to switch to the dead_frame self.dead_time = time + 2; if (random() < 0.5) diff --git a/data/qcsrc/server/constants.qh b/data/qcsrc/server/constants.qh index a92d84211..a21577520 100644 --- a/data/qcsrc/server/constants.qh +++ b/data/qcsrc/server/constants.qh @@ -44,6 +44,7 @@ float DEAD_NO = 0; float DEAD_DYING = 1; float DEAD_DEAD = 2; float DEAD_RESPAWNABLE = 3; +float DEAD_RESPAWNING = 4; float DAMAGE_NO = 0; float DAMAGE_YES = 1; diff --git a/data/qcsrc/server/defs.qh b/data/qcsrc/server/defs.qh index 5e7d89308..4aac283ea 100644 --- a/data/qcsrc/server/defs.qh +++ b/data/qcsrc/server/defs.qh @@ -300,3 +300,5 @@ void ClearSelectedPlayer(); .float selected_player_count; // how long this player has been directly pointed to .float selected_player_display_needs_update; // are regular updates necessary? (health) .float selected_player_display_timeout; // when the selection will time out + +.float respawn_countdown; // next number to count diff --git a/data/qcsrc/server/g_world.qc b/data/qcsrc/server/g_world.qc index 35c6edae2..7683916e5 100644 --- a/data/qcsrc/server/g_world.qc +++ b/data/qcsrc/server/g_world.qc @@ -278,6 +278,16 @@ void worldspawn (void) precache_sound ("announcer/robotic/3fragsleft.ogg"); precache_sound ("announcer/robotic/lastsecond.ogg"); precache_sound ("announcer/robotic/narrowly.ogg"); + precache_sound ("announcer/robotic/1.ogg"); + precache_sound ("announcer/robotic/2.ogg"); + precache_sound ("announcer/robotic/3.ogg"); + precache_sound ("announcer/robotic/4.ogg"); + precache_sound ("announcer/robotic/5.ogg"); + precache_sound ("announcer/robotic/6.ogg"); + precache_sound ("announcer/robotic/7.ogg"); + precache_sound ("announcer/robotic/8.ogg"); + precache_sound ("announcer/robotic/9.ogg"); + precache_sound ("announcer/robotic/10.ogg"); // plays music for the level if there is any if (self.noise) @@ -412,21 +422,26 @@ float( string pFilename ) TryFile = } }; -string GetMapname() +string GetGametype() { if (game == GAME_DEATHMATCH) - return strcat("dm_", mapname); + return "dm"; else if (game == GAME_TEAM_DEATHMATCH) - return strcat("tdm_", mapname); + return "tdm"; else if (game == GAME_DOMINATION) - return strcat("dom_", mapname); + return "dom"; else if (game == GAME_CTF) - return strcat("ctf_", mapname); + return "ctf"; else if (game == GAME_RUNEMATCH) - return strcat("rune_", mapname); + return "rune"; else if (game == GAME_LMS) - return strcat("lms_", mapname); - return strcat("dm_", mapname); + return "lms"; + return "dm"; +} + +string GetMapname() +{ + return strcat(GetGametype(), "_", mapname); } float Map_Count, Map_Current; -- 2.39.2