From: FruitieX Date: Wed, 17 Nov 2010 23:05:50 +0000 (+0200) Subject: fix, again, several important things X-Git-Tag: xonotic-v0.1.0preview~86^2~2^2~13 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=526256220aa1c46ff61799f2ca68a33b1451b503;p=xonotic%2Fxonotic-data.pk3dir.git fix, again, several important things --- diff --git a/qcsrc/server/arena.qc b/qcsrc/server/arena.qc index 41540280f..12f25fad5 100644 --- a/qcsrc/server/arena.qc +++ b/qcsrc/server/arena.qc @@ -27,8 +27,10 @@ void target_assault_roundend_reset(); float next_round; float stopalivecheck; float redalive, bluealive, yellowalive, pinkalive; +float totalalive; .float redalive_stat, bluealive_stat, yellowalive_stat, pinkalive_stat; float redspawned, bluespawned, yellowspawned, pinkspawned; +float totalspawned; /** * Resets the state of all clients, items, flags, runes, keys, weapons, waypoints, ... of the map. @@ -56,7 +58,7 @@ void reset_map(float dorespawn) race_ReadyRestart(); for(self = world; (self = nextent(self)); ) - if(clienttype(self) == CLIENTTYPE_NOTACLIENT) + if(clienttype(self) == CLIENTTYPE_NOTACLIENT && self.items != IT_STRENGTH && self.items != IT_INVINCIBLE) // don't respawn strength or shield, that will only lead to them spawning very early each match { if(self.reset) { @@ -210,18 +212,6 @@ void Arena_Warmup() if((!g_arena && !g_ca && !g_freezetag) || (g_arena && !arena_roundbased) || (time < game_starttime)) return; - if(g_freezetag && time > game_starttime && - !((redspawned >= 1 && bluespawned >= 1) - || (redspawned >= 1 && yellowspawned >= 1) - || (redspawned >= 1 && pinkspawned >= 1) - || (bluespawned >= 1 && yellowspawned >= 1) - || (bluespawned >= 1 && pinkspawned >= 1) - || (yellowspawned >= 1 && pinkspawned >= 1))) - { // no teams, or only one team has players - warmup = time + cvar("g_freezetag_warmup"); - return; - } - f = ceil(warmup - time); if(f > 0) champion = world; // this is done because a if(champion) will not execute if champion = world @@ -290,26 +280,51 @@ void Arena_Warmup() void count_spawned_players() { // TODO fix "*spawned" name, it should rather be "*players" or so - // not doing this not to prevent merge hell with Tag + // not doing this now to prevent merge hell with Tag + // fix after merging with Tag // count amount of players in each team - redspawned = bluespawned = yellowspawned = pinkspawned = 0; + totalspawned = redspawned = bluespawned = yellowspawned = pinkspawned = 0; FOR_EACH_PLAYER(self) { - if (self.team == COLOR_TEAM1) redspawned += 1; - else if (self.team == COLOR_TEAM2) bluespawned += 1; - else if (self.team == COLOR_TEAM3) yellowspawned += 1; - else if (self.team == COLOR_TEAM4) pinkspawned += 1; + if (self.team == COLOR_TEAM1) + { + redspawned += 1; + totalspawned += 1; + } + else if (self.team == COLOR_TEAM2) + { + bluespawned += 1; + totalspawned += 1; + } + else if (self.team == COLOR_TEAM3) + { + yellowspawned += 1; + totalspawned += 1; + } + else if (self.team == COLOR_TEAM4) + { + pinkspawned += 1; + totalspawned += 1; + } } } void count_alive_players() { - redalive = bluealive = yellowalive = pinkalive = 0; + totalalive = redalive = bluealive = yellowalive = pinkalive = 0; if(g_ca) { FOR_EACH_PLAYER(self) { - if (self.team == COLOR_TEAM1 && self.health >= 1) redalive += 1; - else if (self.team == COLOR_TEAM2 && self.health >= 1) bluealive += 1; + if (self.team == COLOR_TEAM1 && self.health >= 1) + { + redalive += 1; + totalalive += 1; + } + else if (self.team == COLOR_TEAM2 && self.health >= 1) + { + bluealive += 1; + totalalive += 1; + } } FOR_EACH_PLAYER(self) { self.redalive_stat = redalive; @@ -320,10 +335,26 @@ void count_alive_players() { // count amount of alive players in each team FOR_EACH_PLAYER(self) { - if (self.team == COLOR_TEAM1 && self.freezetag_frozen == 0 && self.health >= 1) redalive += 1; - else if (self.team == COLOR_TEAM2 && self.freezetag_frozen == 0 && self.health >= 1) bluealive += 1; - else if (self.team == COLOR_TEAM3 && self.freezetag_frozen == 0 && self.health >= 1) yellowalive += 1; - else if (self.team == COLOR_TEAM4 && self.freezetag_frozen == 0 && self.health >= 1) pinkalive += 1; + if (self.team == COLOR_TEAM1 && self.freezetag_frozen == 0 && self.health >= 1) + { + redalive += 1; + totalalive += 1; + } + else if (self.team == COLOR_TEAM2 && self.freezetag_frozen == 0 && self.health >= 1) + { + bluealive += 1; + totalalive += 1; + } + else if (self.team == COLOR_TEAM3 && self.freezetag_frozen == 0 && self.health >= 1) + { + yellowalive += 1; + totalalive += 1; + } + else if (self.team == COLOR_TEAM4 && self.freezetag_frozen == 0 && self.health >= 1) + { + pinkalive += 1; + totalalive += 1; + } } FOR_EACH_PLAYER(self) { self.redalive_stat = redalive; diff --git a/qcsrc/server/mutators/gamemode_freezetag.qc b/qcsrc/server/mutators/gamemode_freezetag.qc index fb7525a43..14fe430f1 100644 --- a/qcsrc/server/mutators/gamemode_freezetag.qc +++ b/qcsrc/server/mutators/gamemode_freezetag.qc @@ -1,29 +1,24 @@ void freezetag_Initialize() { precache_model("models/ice/ice.md3"); - next_round = time + cvar("g_start_delay"); + warmup = time + cvar("g_start_delay") + cvar("g_freezetag_warmup"); } void freezetag_CheckWinner() { - if(time <= game_starttime) + if(time <= game_starttime) // game didn't even start yet! nobody can win in that case. return; if(next_round || (time > warmup - cvar("g_freezetag_warmup") && time < warmup)) return; // already waiting for next round to start - if(redalive + bluealive + yellowalive + pinkalive <= 0 && time > game_starttime) - { - next_round = time + 5; - } - if((redalive >= 1 && bluealive >= 1) // counted in arena.qc || (redalive >= 1 && yellowalive >= 1) || (redalive >= 1 && pinkalive >= 1) || (bluealive >= 1 && yellowalive >= 1) || (bluealive >= 1 && pinkalive >= 1) || (yellowalive >= 1 && pinkalive >= 1)) - return; // we still have active players on two or more teams + return; // we still have active players on two or more teams, nobody won yet entity e, winner; string teamname; @@ -37,7 +32,7 @@ void freezetag_CheckWinner() } } - if(winner != world) // just in case a winner isn't found + if(winner != world) // just in case a winner wasn't found { TeamScore_AddToTeam(winner.team, ST_SCORE, +1); if(winner.team == COLOR_TEAM1) @@ -115,9 +110,12 @@ MUTATOR_HOOKFUNCTION(freezetag_RemovePlayer) --yellowalive; else if(self.team == COLOR_TEAM4) --pinkalive; + --totalalive; } - freezetag_CheckWinner(); + if(totalspawned > 2) // only check for winners if we had more than two players (one of them left, don't let the other player win just because of that) + freezetag_CheckWinner(); + freezetag_Unfreeze(); return 1; @@ -125,8 +123,20 @@ MUTATOR_HOOKFUNCTION(freezetag_RemovePlayer) MUTATOR_HOOKFUNCTION(freezetag_PlayerDies) { + if(self.freezetag_frozen == 0) + { + if(self.team == COLOR_TEAM1) + --redalive; + else if(self.team == COLOR_TEAM2) + --bluealive; + else if(self.team == COLOR_TEAM3) + --yellowalive; + else if(self.team == COLOR_TEAM4) + --pinkalive; + --totalalive; + } + freezetag_Freeze(); - count_alive_players(); centerprint(frag_attacker, strcat("^2You froze ^7", frag_target.netname, ".\n")); if(frag_attacker == frag_target || frag_attacker == world) @@ -149,9 +159,14 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerDies) MUTATOR_HOOKFUNCTION(freezetag_PlayerSpawn) { - if(time > warmup) // spawn too late, freeze player + if(totalspawned == 1 && time > game_starttime) // only one player active on server, start a new match immediately + if(!next_round && warmup && (time < warmup - cvar("g_freezetag_warmup") || time > warmup)) // not awaiting next round + { + next_round = time; + return 1; + } + if(warmup && time > warmup) // spawn too late, freeze player { - print("time: ", ftos(time), " warmup: ", ftos(warmup), "\n"); centerprint(self, "^1You spawned after the round started, you'll spawn as frozen.\n"); freezetag_Freeze(); }