From c29ab76e23e359bb8a418e1b20314b6a85316f91 Mon Sep 17 00:00:00 2001 From: Rudolf Polzer Date: Tue, 4 Jan 2011 22:45:44 +0100 Subject: [PATCH] freezetag: do not abort revival entirely when out of range, just have it go down again; thaw faster when multiple team mates are in range --- defaultXonotic.cfg | 3 +- qcsrc/server/autocvars.qh | 3 +- qcsrc/server/defs.qh | 1 - qcsrc/server/mutators/gamemode_freezetag.qc | 147 ++++++++++---------- 4 files changed, 77 insertions(+), 77 deletions(-) diff --git a/defaultXonotic.cfg b/defaultXonotic.cfg index 4e9c2a95b..08e26c6fa 100644 --- a/defaultXonotic.cfg +++ b/defaultXonotic.cfg @@ -565,7 +565,8 @@ set g_freezetag 0 "Freeze Tag: Freeze the opposing team(s) to win, unfreeze team seta g_freezetag_warmup 5 "Time players get to run around before the round starts" seta g_freezetag_point_limit -1 "Freeze Tag point limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)" seta g_freezetag_point_leadlimit -1 "Freeze Tag point lead limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)" -seta g_freezetag_revive_time 2.5 "Time it takes to revive a frozen teammate" +seta g_freezetag_revive_speed 0.4 "Speed for reviving a frozen teammate" +seta g_freezetag_revive_clearspeed 1.6 "Speed at which reviving progress gets lost when out of range" seta g_freezetag_revive_extra_size 100 "Distance in qu that you can stand from a frozen teammate to keep reviving him" seta g_freezetag_frozen_force 0.6 "How much to multiply the force on a frozen player with" diff --git a/qcsrc/server/autocvars.qh b/qcsrc/server/autocvars.qh index 8e67f618a..b00c1acc4 100644 --- a/qcsrc/server/autocvars.qh +++ b/qcsrc/server/autocvars.qh @@ -721,7 +721,8 @@ float autocvar_g_freezetag_frozen_force; float autocvar_g_freezetag_point_leadlimit; float autocvar_g_freezetag_point_limit; float autocvar_g_freezetag_revive_extra_size; -float autocvar_g_freezetag_revive_time; +float autocvar_g_freezetag_revive_speed; +float autocvar_g_freezetag_revive_clearspeed; float autocvar_g_freezetag_warmup; #define autocvar_g_friendlyfire cvar("g_friendlyfire") #define autocvar_g_friendlyfire_virtual cvar("g_friendlyfire_virtual") diff --git a/qcsrc/server/defs.qh b/qcsrc/server/defs.qh index bbd554f5e..8db4849e7 100644 --- a/qcsrc/server/defs.qh +++ b/qcsrc/server/defs.qh @@ -658,7 +658,6 @@ float serverflags; .float team_forced; // can be a team number to force a team, or 0 for default action, or -1 for forced spectator .float freezetag_frozen; -.float freezetag_beginrevive_time; .float freezetag_revive_progress; .entity muzzle_flash; diff --git a/qcsrc/server/mutators/gamemode_freezetag.qc b/qcsrc/server/mutators/gamemode_freezetag.qc index 0cc163152..d09bbeecf 100644 --- a/qcsrc/server/mutators/gamemode_freezetag.qc +++ b/qcsrc/server/mutators/gamemode_freezetag.qc @@ -65,7 +65,10 @@ void freezetag_Ice_Think() void freezetag_Freeze(entity attacker) { + if(self.freezetag_frozen) + return; self.freezetag_frozen = 1; + self.freezetag_revive_progress = 0; entity ice; ice = spawn(); @@ -111,6 +114,7 @@ void freezetag_Freeze(entity attacker) void freezetag_Unfreeze(entity attacker) { self.freezetag_frozen = 0; + self.freezetag_revive_progress = 0; // remove the ice block entity ice; @@ -215,91 +219,86 @@ MUTATOR_HOOKFUNCTION(freezetag_GiveFragsForKill) MUTATOR_HOOKFUNCTION(freezetag_PlayerPreThink) { - vector revive_extra_size; - revive_extra_size = '1 1 1' * autocvar_g_freezetag_revive_extra_size; + float n; + vector revive_extra_size; - float teammate_nearby; - FOR_EACH_PLAYER(other) if(self != other) - { - if(other.freezetag_frozen == 0) - { - if(other.team == self.team) - { - teammate_nearby = boxesoverlap(self.absmin - revive_extra_size, self.absmax + revive_extra_size, other.absmin, other.absmax); - if(teammate_nearby) - break; - } - } - } + revive_extra_size = '1 1 1' * autocvar_g_freezetag_revive_extra_size; - if(teammate_nearby && self.freezetag_frozen == 1) // OK, there is at least one teammate reviving us - { - if(self.freezetag_beginrevive_time == -9999) // initialize values if this is the first frame of revival - { - self.freezetag_beginrevive_time = time; - self.freezetag_revive_progress = 0; - } - else - { - self.freezetag_revive_progress = (time - self.freezetag_beginrevive_time) / autocvar_g_freezetag_revive_time; - if(time - self.freezetag_beginrevive_time >= autocvar_g_freezetag_revive_time) - { - freezetag_Unfreeze(self); - entity o; - o = other; - - // EVERY team mate nearby gets a point (even if multiple!) - float n; - FOR_EACH_PLAYER(other) if(self != other) + entity o; + o = world; + n = 0; + FOR_EACH_PLAYER(other) if(self != other) + { + if(other.freezetag_frozen == 0) { - if(other.freezetag_frozen == 0) + if(other.team == self.team) { - if(other.team == self.team) + if(boxesoverlap(self.absmin - revive_extra_size, self.absmax + revive_extra_size, other.absmin, other.absmax)) + { + if(!o) + o = other; + ++n; + } + } + } + } + + if(n && self.freezetag_frozen) // OK, there is at least one teammate reviving us + { + self.freezetag_revive_progress = bound(0, self.freezetag_revive_progress + frametime * autocvar_g_freezetag_revive_speed, 1); + + if(self.freezetag_revive_progress >= 1) + { + freezetag_Unfreeze(self); + + // EVERY team mate nearby gets a point (even if multiple!) + FOR_EACH_PLAYER(other) if(self != other) + { + if(other.freezetag_frozen == 0) { - teammate_nearby = boxesoverlap(self.absmin - revive_extra_size, self.absmax + revive_extra_size, other.absmin, other.absmax); - if(teammate_nearby) + if(other.team == self.team) { - PlayerScore_Add(other, SP_FREEZETAG_REVIVALS, +1); - PlayerScore_Add(other, SP_SCORE, +1); - ++n; + if(boxesoverlap(self.absmin - revive_extra_size, self.absmax + revive_extra_size, other.absmin, other.absmax)) + { + PlayerScore_Add(other, SP_FREEZETAG_REVIVALS, +1); + PlayerScore_Add(other, SP_SCORE, +1); + } } } } - } - if(n > 1) - centerprint(self, strcat("^5You were revived by ^7", o.netname, "^5 et al.\n")); - else - centerprint(self, strcat("^5You were revived by ^7", o.netname, "^5.\n")); - centerprint(o, strcat("^5You revived ^7", self.netname, "^5.\n")); - if(n > 1) - bprint("^7", o.netname, "^5 et al revived ^7", self.netname, "^5.\n"); - else - bprint("^7", o.netname, "^5 revived ^7", self.netname, "^5.\n"); + if(n > 1) + centerprint(self, strcat("^5You were revived by ^7", o.netname, "^5 et al.\n")); + else + centerprint(self, strcat("^5You were revived by ^7", o.netname, "^5.\n")); + centerprint(o, strcat("^5You revived ^7", self.netname, "^5.\n")); + if(n > 1) + bprint("^7", o.netname, "^5 et al revived ^7", self.netname, "^5.\n"); + else + bprint("^7", o.netname, "^5 revived ^7", self.netname, "^5.\n"); + } - self.freezetag_beginrevive_time = -9999; - self.freezetag_revive_progress = 0; - } - } - // now find EVERY teammate within reviving radius, set their revive_progress values correct - FOR_EACH_PLAYER(other) if(self != other) - { - if(other.freezetag_frozen == 0) - { - if(other.team == self.team) - { - teammate_nearby = boxesoverlap(self.absmin - revive_extra_size, self.absmax + revive_extra_size, other.absmin, other.absmax); - if(teammate_nearby) - other.freezetag_revive_progress = self.freezetag_revive_progress; - } - } - } - } - else if(!teammate_nearby) // only if no teammate is nearby will we reset - { - self.freezetag_beginrevive_time = -9999; - self.freezetag_revive_progress = 0; - } + // now find EVERY teammate within reviving radius, set their revive_progress values correct + FOR_EACH_PLAYER(other) if(self != other) + { + if(other.freezetag_frozen == 0) + { + if(other.team == self.team) + { + if(boxesoverlap(self.absmin - revive_extra_size, self.absmax + revive_extra_size, other.absmin, other.absmax)) + other.freezetag_revive_progress = self.freezetag_revive_progress; + } + } + } + } + else if(!n && self.freezetag_frozen) // only if no teammate is nearby will we reset + { + self.freezetag_revive_progress = bound(0, self.freezetag_revive_progress - frametime * autocvar_g_freezetag_revive_clearspeed, 1); + } + else if(!n) + { + self.freezetag_revive_progress = 0; // thawing nobody + } return 1; } -- 2.39.2