From: terencehill Date: Wed, 12 Dec 2012 21:24:38 +0000 (+0100) Subject: Freezetag: don't respawn immediately as frozen a player that dies for some particular... X-Git-Tag: xonotic-v0.7.0~61^2~87 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=dda601a551ef5b6bd6063149aafab0a73bc64198;p=xonotic%2Fxonotic-data.pk3dir.git Freezetag: don't respawn immediately as frozen a player that dies for some particular reasons, the killer player would see him suddenly disappear, not a very nice thing. Cases DEATH_TEAMCHANGE and DEATH_AUTOTEAMCHANGE are needed to fix a bug when you succeed changing team through the menu: you both really die (gibbing) and get frozen --- diff --git a/qcsrc/server/mutators/gamemode_freezetag.qc b/qcsrc/server/mutators/gamemode_freezetag.qc index 8b4fa02ba..64156043d 100644 --- a/qcsrc/server/mutators/gamemode_freezetag.qc +++ b/qcsrc/server/mutators/gamemode_freezetag.qc @@ -108,6 +108,24 @@ void freezetag_Ice_Think() self.nextthink = time; } +void freezetag_Add_Score(entity attacker) +{ + if(attacker == self) + { + // you froze your own dumb self + // counted as "suicide" already + PlayerScore_Add(self, SP_SCORE, -1); + } + else if(attacker.classname == "player") + { + // got frozen by an enemy + // counted as "kill" and "death" already + PlayerScore_Add(self, SP_SCORE, -1); + PlayerScore_Add(attacker, SP_SCORE, +1); + } + // else nothing - got frozen by the game type rules themselves +} + void freezetag_Freeze(entity attacker) { if(self.freezetag_frozen) @@ -140,23 +158,7 @@ void freezetag_Freeze(entity attacker) // add waypoint WaypointSprite_Spawn("freezetag_frozen", 0, 0, self, '0 0 64', world, self.team, self, waypointsprite_attached, TRUE, RADARICON_WAYPOINT, '0.25 0.90 1'); - if(attacker == self) - { - // you froze your own dumb self - // counted as "suicide" already - PlayerScore_Add(self, SP_SCORE, -1); - } - else if(attacker.classname == "player") - { - // got frozen by an enemy - // counted as "kill" and "death" already - PlayerScore_Add(self, SP_SCORE, -1); - PlayerScore_Add(attacker, SP_SCORE, +1); - } - else - { - // nothing - got frozen by the game type rules themselves - } + freezetag_Add_Score(attacker); } void freezetag_Unfreeze(entity attacker) @@ -306,14 +308,28 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerDies) return 1; // let the player die so that he can respawn whenever he wants } - if(frag_deathtype == DEATH_HURTTRIGGER) + switch(frag_deathtype) { - if(!self.freezetag_frozen) - freezetag_Freeze(world); - PutClientInServer(); // respawn the player - self.health = 1; - self.armorvalue = 0; - return 1; + case DEATH_HURTTRIGGER: + case DEATH_FALL: + case DEATH_DROWN: + case DEATH_LAVA: + case DEATH_SLIME: + case DEATH_SWAMP: + case DEATH_TEAMCHANGE: + case DEATH_AUTOTEAMCHANGE: + { + // let the player die, he will be automatically frozen when he respawns + if(!self.freezetag_frozen) + { + freezetag_Add_Score(frag_attacker); + freezetag_count_alive_players(); + } + else + freezetag_Unfreeze(world); // remove ice + self.freezetag_frozen_timeout = -2; // freeze on respawn + return 1; + } } if(self.freezetag_frozen) @@ -346,9 +362,15 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerSpawn) if(self.freezetag_frozen_timeout == -1) // if PlayerSpawn is called by reset_map_players return 1; // do nothing, round is starting right now + if(self.freezetag_frozen_timeout == -2) // player was dead + { + freezetag_Freeze(world); + return 1; + } + freezetag_count_alive_players(); - if(self.freezetag_frozen) // stay frozen if respawning after death (DEATH_HURTTRIGGER) + if(self.freezetag_frozen) return 1; if(round_handler_IsActive()) @@ -391,7 +413,7 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerPreThink) // keep health = 1 self.pauseregen_finished = time + autocvar_g_balance_pause_health_regen; - if(self.freezetag_frozen_timeout && time >= self.freezetag_frozen_timeout) + if(self.freezetag_frozen_timeout > 0 && time >= self.freezetag_frozen_timeout) { self.health = autocvar_g_balance_health_start; freezetag_Unfreeze(world);