From: terencehill Date: Mon, 11 Mar 2013 15:35:41 +0000 (+0100) Subject: Make respawn code cleaner by adding respawn flags and the new mutator hook GetRespawn... X-Git-Tag: xonotic-v0.7.0~61^2~11 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=a2cf7a35d48cc6be3628af5c337147d89ba8d799;p=xonotic%2Fxonotic-data.pk3dir.git Make respawn code cleaner by adding respawn flags and the new mutator hook GetRespawnFlags --- diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc index 67190df2d..574df368d 100644 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@ -479,6 +479,7 @@ void PutObserverInServer (void) self.damageforcescale = 0; self.death_time = 0; self.respawn_time = 0; + self.stat_respawn_time = 0; self.alpha = 0; self.scale = 0; self.fade_time = 0; @@ -765,6 +766,7 @@ void PutClientInServer (void) self.damageforcescale = 2; self.death_time = 0; self.respawn_time = 0; + self.stat_respawn_time = 0; self.scale = 0; self.fade_time = 0; self.pain_frame = 0; @@ -2495,8 +2497,6 @@ void PlayerPreThink (void) self.stat_allow_oldnexbeam = autocvar_g_allow_oldnexbeam; self.stat_leadlimit = autocvar_leadlimit; - self.stat_respawn_time = self.respawn_time; - if(frametime) { // physics frames: update anticheat stuff @@ -2622,25 +2622,30 @@ void PlayerPreThink (void) if (self.deadflag != DEAD_NO) { - float button_pressed, force_respawn; if(self.personal && g_race_qualifying) { if(time > self.respawn_time) { self.respawn_time = time + 1; // only retry once a second + self.stat_respawn_time = self.respawn_time; respawn(); self.impulse = 141; } } else { + float button_pressed, respawn_flags; if(frametime) player_anim(); button_pressed = (self.BUTTON_ATCK || self.BUTTON_JUMP || self.BUTTON_ATCK2 || self.BUTTON_HOOK || self.BUTTON_USE); - force_respawn = (g_lms || g_ca || g_cts || autocvar_g_forced_respawn); + + respawn_flags = MUTATOR_CALLHOOK(GetRespawnFlags); + if(g_lms || g_cts || autocvar_g_forced_respawn) + respawn_flags = respawn_flags | RESPAWN_FORCE; + if (self.deadflag == DEAD_DYING) { - if(force_respawn) + if(respawn_flags & RESPAWN_FORCE) self.deadflag = DEAD_RESPAWNING; else if(!button_pressed) self.deadflag = DEAD_DEAD; @@ -2663,7 +2668,13 @@ void PlayerPreThink (void) respawn(); } } + ShowRespawnCountdown(); + + if(respawn_flags & RESPAWN_SILENT) + self.stat_respawn_time = 0; + else + self.stat_respawn_time = self.respawn_time; } // if respawning, invert stat_respawn_time to indicate this, the client translates it diff --git a/qcsrc/server/cl_player.qc b/qcsrc/server/cl_player.qc index 23014b857..2c9a823a8 100644 --- a/qcsrc/server/cl_player.qc +++ b/qcsrc/server/cl_player.qc @@ -661,6 +661,7 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht self.respawn_time = ceil((time + sdelay) / waves) * waves; else self.respawn_time = time + sdelay; + self.stat_respawn_time = self.respawn_time; if((sdelay + waves >= 5.0) && (self.respawn_time - time > 1.75)) self.respawn_countdown = 10; // first number to count down from is 10 else diff --git a/qcsrc/server/constants.qh b/qcsrc/server/constants.qh index 522bb2ffc..cb3c34fdc 100644 --- a/qcsrc/server/constants.qh +++ b/qcsrc/server/constants.qh @@ -47,6 +47,9 @@ float DEAD_DEAD = 2; float DEAD_RESPAWNABLE = 3; float DEAD_RESPAWNING = 4; +float RESPAWN_FORCE = 1; +float RESPAWN_SILENT = 2; + float DAMAGE_NO = 0; float DAMAGE_YES = 1; float DAMAGE_AIM = 2; diff --git a/qcsrc/server/mutators/base.qh b/qcsrc/server/mutators/base.qh index d3d91232c..06b5c0892 100644 --- a/qcsrc/server/mutators/base.qh +++ b/qcsrc/server/mutators/base.qh @@ -65,6 +65,9 @@ MUTATOR_HOOKABLE(ForbidPlayerScore_Clear); MUTATOR_HOOKABLE(ClientDisconnect); // called when a player disconnects +MUTATOR_HOOKABLE(GetRespawnFlags); + // returns respawn flags + MUTATOR_HOOKABLE(PlayerDies); // called when a player dies to e.g. remove stuff he was carrying. // INPUT: diff --git a/qcsrc/server/mutators/gamemode_arena.qc b/qcsrc/server/mutators/gamemode_arena.qc index 92c5fd614..c561815ad 100644 --- a/qcsrc/server/mutators/gamemode_arena.qc +++ b/qcsrc/server/mutators/gamemode_arena.qc @@ -204,16 +204,12 @@ MUTATOR_HOOKFUNCTION(arena_PlayerSpawn) return 1; } -MUTATOR_HOOKFUNCTION(arena_PlayerPreThink) +MUTATOR_HOOKFUNCTION(arena_GetRespawnFlags) { - self.stat_respawn_time = 0; - // put dead players in the spawn queue if(arena_roundbased) - if(self.deadflag && time - self.death_time >= 1.5) - PutClientInServer(); - - return 1; + return (RESPAWN_FORCE | RESPAWN_SILENT); + return RESPAWN_SILENT; } MUTATOR_HOOKFUNCTION(arena_ForbidPlayerScore_Clear) @@ -261,7 +257,7 @@ MUTATOR_DEFINITION(gamemode_arena) MUTATOR_HOOK(PutClientInServer, arena_PutClientInServer, CBC_ORDER_ANY); MUTATOR_HOOK(ClientConnect, arena_ClientConnect, CBC_ORDER_ANY); MUTATOR_HOOK(PlayerSpawn, arena_PlayerSpawn, CBC_ORDER_ANY); - MUTATOR_HOOK(PlayerPreThink, arena_PlayerPreThink, CBC_ORDER_ANY); + MUTATOR_HOOK(GetRespawnFlags, arena_GetRespawnFlags, CBC_ORDER_ANY); MUTATOR_HOOK(ForbidPlayerScore_Clear, arena_ForbidPlayerScore_Clear, CBC_ORDER_ANY); MUTATOR_HOOK(GiveFragsForKill, arena_GiveFragsForKill, CBC_ORDER_ANY); MUTATOR_HOOK(PlayerDies, arena_PlayerDies, CBC_ORDER_ANY); diff --git a/qcsrc/server/mutators/gamemode_ca.qc b/qcsrc/server/mutators/gamemode_ca.qc index 3e8d1b747..c86aa6d9e 100644 --- a/qcsrc/server/mutators/gamemode_ca.qc +++ b/qcsrc/server/mutators/gamemode_ca.qc @@ -190,11 +190,11 @@ MUTATOR_HOOKFUNCTION(ca_GetTeamCount) return 1; } -MUTATOR_HOOKFUNCTION(ca_PlayerPreThink) +MUTATOR_HOOKFUNCTION(ca_GetRespawnFlags) { if(!allowed_to_spawn) - self.stat_respawn_time = 0; - return 1; + return RESPAWN_SILENT; + return 0; } MUTATOR_HOOKFUNCTION(ca_ForbidPlayerScore_Clear) @@ -244,7 +244,7 @@ MUTATOR_DEFINITION(gamemode_ca) MUTATOR_HOOK(reset_map_global, ca_reset_map_global, CBC_ORDER_ANY); MUTATOR_HOOK(reset_map_players, ca_reset_map_players, CBC_ORDER_ANY); MUTATOR_HOOK(GetTeamCount, ca_GetTeamCount, CBC_ORDER_EXCLUSIVE); - MUTATOR_HOOK(PlayerPreThink, ca_PlayerPreThink, CBC_ORDER_ANY); + MUTATOR_HOOK(GetRespawnFlags, ca_GetRespawnFlags, CBC_ORDER_ANY); MUTATOR_HOOK(ForbidPlayerScore_Clear, ca_ForbidPlayerScore_Clear, CBC_ORDER_ANY); MUTATOR_HOOK(ForbidThrowCurrentWeapon, ca_ForbidThrowCurrentWeapon, CBC_ORDER_ANY); MUTATOR_HOOK(GiveFragsForKill, ca_GiveFragsForKill, CBC_ORDER_FIRST);