From: terencehill Date: Sat, 1 Dec 2012 12:42:45 +0000 (+0100) Subject: Freezetag, warmup stage: automatically unfreeze frozen players after 5 seconds, other... X-Git-Tag: xonotic-v0.7.0~61^2~103 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=4ac7682d090bc3f070c4659dd719fac9569ad899;p=xonotic%2Fxonotic-data.pk3dir.git Freezetag, warmup stage: automatically unfreeze frozen players after 5 seconds, otherwise once all players of a team are frozen they can't be revived anymore --- diff --git a/qcsrc/server/arena.qc b/qcsrc/server/arena.qc index 181b15d75..6f38c4569 100644 --- a/qcsrc/server/arena.qc +++ b/qcsrc/server/arena.qc @@ -42,15 +42,9 @@ void reset_map(float dorespawn) warmup += autocvar_g_ca_warmup; allowed_to_spawn = 1; } - else if(g_freezetag) - { - redalive = bluealive = yellowalive = pinkalive = 0; - warmup = max(time, game_starttime); - if(autocvar_g_freezetag_warmup > 0) - warmup += autocvar_g_freezetag_warmup; - } else if(g_race || g_cts) race_ReadyRestart(); + else MUTATOR_CALLHOOK(reset_map_global); lms_lowest_lives = 999; lms_next_place = player_count; @@ -85,6 +79,7 @@ void reset_map(float dorespawn) // Moving the player reset code here since the player-reset depends // on spawnpoint entities which have to be reset first --blub if(dorespawn) + if(!MUTATOR_CALLHOOK(reset_map_players)) FOR_EACH_CLIENT(self) { if(self.flags & FL_CLIENT) // reset all players { @@ -99,11 +94,6 @@ void reset_map(float dorespawn) self.classname = "player"; PutClientInServer(); } - else if(g_freezetag) - { - if(self.classname == "player") - PutClientInServer(); - } else { /* diff --git a/qcsrc/server/defs.qh b/qcsrc/server/defs.qh index 9068fa75b..757a2a1d7 100644 --- a/qcsrc/server/defs.qh +++ b/qcsrc/server/defs.qh @@ -642,6 +642,7 @@ float serverflags; .float player_blocked; .float freezetag_frozen; +.float freezetag_frozen_timeout; .float freezetag_revive_progress; .entity muzzle_flash; diff --git a/qcsrc/server/mutators/base.qh b/qcsrc/server/mutators/base.qh index e276d555c..1f42d3059 100644 --- a/qcsrc/server/mutators/base.qh +++ b/qcsrc/server/mutators/base.qh @@ -48,6 +48,12 @@ MUTATOR_HOOKABLE(PlayerSpawn); entity spawn_spot; // spot that was used, or world // called when a player spawns as player, after shared setup, before his weapon is chosen (so items may be changed in here) +MUTATOR_HOOKABLE(reset_map_global); + // called in reset_map + +MUTATOR_HOOKABLE(reset_map_players); + // called in reset_map + MUTATOR_HOOKABLE(ClientDisconnect); // called when a player disconnects diff --git a/qcsrc/server/mutators/gamemode_freezetag.qc b/qcsrc/server/mutators/gamemode_freezetag.qc index 06f1c2c39..d35e8ec34 100644 --- a/qcsrc/server/mutators/gamemode_freezetag.qc +++ b/qcsrc/server/mutators/gamemode_freezetag.qc @@ -7,7 +7,7 @@ void freezetag_Initialize() void freezetag_CheckWinner() { - if(time <= game_starttime) // game didn't even start yet! nobody can win in that case. + if(time <= game_starttime || inWarmupStage) return; if(next_round || (time > warmup - autocvar_g_freezetag_warmup && time < warmup)) @@ -99,6 +99,8 @@ void freezetag_Freeze(entity attacker) self.freezetag_frozen = 1; self.freezetag_revive_progress = 0; self.health = 1; + if(inWarmupStage) + self.freezetag_frozen_timeout = time + 5; entity ice; ice = spawn(); @@ -142,6 +144,7 @@ void freezetag_Freeze(entity attacker) void freezetag_Unfreeze(entity attacker) { self.freezetag_frozen = 0; + self.freezetag_frozen_timeout = 0; self.freezetag_revive_progress = 0; self.health = autocvar_g_balance_health_start; @@ -282,12 +285,12 @@ MUTATOR_HOOKFUNCTION(freezetag_RemovePlayer) MUTATOR_HOOKFUNCTION(freezetag_PlayerDies) { - if(frag_deathtype == DEATH_HURTTRIGGER) { if(!self.freezetag_frozen) { freezetag_remove_alive(); + freezetag_Freeze(world); freezetag_CheckWinner(); } PutClientInServer(); // respawn the player @@ -325,11 +328,13 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerDies) MUTATOR_HOOKFUNCTION(freezetag_PlayerSpawn) { - freezetag_add_alive(); - if(time <= game_starttime || total_players == 0) + if(self.freezetag_frozen) // stay frozen if respawning after death (DEATH_HURTTRIGGER) return 1; - freezetag_Unfreeze(world); // start by making sure that all ice blocks are removed + freezetag_add_alive(); + + if(time <= game_starttime || inWarmupStage || total_players == 0) + return 1; if(total_players == 1) // only one player active on server, start a new match immediately if(!next_round && warmup && (time < warmup - autocvar_g_freezetag_warmup || time > warmup)) // not awaiting next round @@ -340,8 +345,7 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerSpawn) if(warmup && time > warmup) // spawn too late, freeze player { - if(!next_round) // no msg if player respawn after a death by DEATH_HURTTRIGGER - centerprint(self, "^1Round already started, you spawn as frozen."); + centerprint(self, "^1Round already started, you spawn as frozen."); freezetag_Freeze(world); freezetag_remove_alive(); } @@ -349,6 +353,26 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerSpawn) return 1; } +MUTATOR_HOOKFUNCTION(freezetag_reset_map_global) +{ + redalive = bluealive = yellowalive = pinkalive = 0; + warmup = max(time, game_starttime); + if(autocvar_g_freezetag_warmup > 0) + warmup += autocvar_g_freezetag_warmup; + return 1; +} + +MUTATOR_HOOKFUNCTION(freezetag_reset_map_players) +{ + FOR_EACH_PLAYER(self) + { + if (self.freezetag_frozen) + freezetag_Unfreeze(world); + PutClientInServer(); + } + return 1; +} + MUTATOR_HOOKFUNCTION(freezetag_GiveFragsForKill) { frag_score = 0; // no frags counted in Freeze Tag @@ -364,6 +388,12 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerPreThink) return 1; if(self.freezetag_frozen && !self.freezetag_revive_progress) self.health = 1; + if(self.freezetag_frozen_timeout && time >= self.freezetag_frozen_timeout) + { + freezetag_Unfreeze(world); + freezetag_add_alive(); + return 1; + } if(next_round || (time > warmup - autocvar_g_freezetag_warmup && time < warmup)) return 1; // already waiting for next round to start @@ -500,6 +530,8 @@ MUTATOR_DEFINITION(gamemode_freezetag) MUTATOR_HOOK(ClientDisconnect, freezetag_RemovePlayer, CBC_ORDER_ANY); MUTATOR_HOOK(PlayerDies, freezetag_PlayerDies, CBC_ORDER_ANY); MUTATOR_HOOK(PlayerSpawn, freezetag_PlayerSpawn, CBC_ORDER_ANY); + MUTATOR_HOOK(reset_map_global, freezetag_reset_map_global, CBC_ORDER_ANY); + MUTATOR_HOOK(reset_map_players, freezetag_reset_map_players, CBC_ORDER_ANY); MUTATOR_HOOK(GiveFragsForKill, freezetag_GiveFragsForKill, CBC_ORDER_FIRST); MUTATOR_HOOK(PlayerPreThink, freezetag_PlayerPreThink, CBC_ORDER_FIRST); MUTATOR_HOOK(PlayerPhysics, freezetag_PlayerPhysics, CBC_ORDER_FIRST);