From: Mario Date: Mon, 5 Aug 2013 09:00:10 +0000 (+1000) Subject: Another attempt at fixing counting X-Git-Tag: xonotic-v0.8.0~241^2^2~170 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=00098d0620fadacaa0011750414ecf2dcd840cb9;p=xonotic%2Fxonotic-data.pk3dir.git Another attempt at fixing counting --- diff --git a/gamemodes.cfg b/gamemodes.cfg index 552c8a7c8..40e0f0987 100644 --- a/gamemodes.cfg +++ b/gamemodes.cfg @@ -432,6 +432,6 @@ set g_race_teams 0 "when 2, 3, or 4, the race is played as a team game (the team // ========== set g_invasion 0 "Invasion: survive against waves of monsters" set g_invasion_round_timelimit 120 "maximum time to kill all monsters" -set g_invasion_warmup 20 "time between waves to prepare for battle" -set g_invasion_monster_count 20 "number of monsters on first wave (increments)" -set g_invasion_zombies_only 0 "only spawn zombies" +set g_invasion_warmup 10 "time between waves to prepare for battle" +set g_invasion_monster_count 10 "number of monsters on first wave (increments)" +set g_invasion_zombies_only 1 "only spawn zombies" diff --git a/qcsrc/server/mutators/gamemode_invasion.qc b/qcsrc/server/mutators/gamemode_invasion.qc index 4feee161c..ca0b201ae 100644 --- a/qcsrc/server/mutators/gamemode_invasion.qc +++ b/qcsrc/server/mutators/gamemode_invasion.qc @@ -76,8 +76,13 @@ float Invasion_CheckWinner() round_handler_Init(5, autocvar_g_invasion_warmup, autocvar_g_invasion_round_timelimit); return 1; } + + float total_alive_monsters = 0; + + FOR_EACH_MONSTER(head) if(head.health > 0) + ++total_alive_monsters; - if((numspawned + numkilled) < maxspawned) + if((total_alive_monsters + numkilled) < maxspawned) { if(time >= last_check) { @@ -88,7 +93,7 @@ float Invasion_CheckWinner() return 0; } - if(numspawned < 1 || numkilled < numspawned) + if(numspawned < 1 || numkilled < maxspawned) return 0; // nothing has spawned yet, or there are still alive monsters if(roundcnt >= maxrounds) @@ -132,8 +137,8 @@ void Invasion_RoundStart() float numplayers = 0; FOR_EACH_PLAYER(e) { - ++numplayers; e.player_blocked = 0; + ++numplayers; } roundcnt += 1; @@ -192,18 +197,38 @@ MUTATOR_HOOKFUNCTION(invasion_PlayerSpawn) MUTATOR_HOOKFUNCTION(invasion_PlayerDamage) { - if(IS_PLAYER(frag_attacker) && IS_PLAYER(frag_target)) + if(IS_PLAYER(frag_attacker) && IS_PLAYER(frag_target) && frag_attacker != frag_target) { frag_damage = 0; frag_force = '0 0 0'; } - if(frag_attacker.flags & FL_MONSTER && frag_target.flags & FL_MONSTER) + if(frag_attacker.flags & FL_MONSTER && frag_target.flags & FL_MONSTER && frag_attacker != frag_target) frag_damage = 0; return FALSE; } +MUTATOR_HOOKFUNCTION(invasion_PlayerCommand) +{ + if(MUTATOR_RETURNVALUE) // command was already handled? + return FALSE; + + if(cmd_name == "debuginvasion") + { + sprint(self, strcat("maxspawned = ", ftos(maxspawned), "\n")); + sprint(self, strcat("numspawned = ", ftos(numspawned), "\n")); + sprint(self, strcat("numkilled = ", ftos(numkilled), "\n")); + sprint(self, strcat("roundcnt = ", ftos(roundcnt), "\n")); + sprint(self, strcat("monsters_total = ", ftos(monsters_total), "\n")); + sprint(self, strcat("monsters_killed = ", ftos(monsters_killed), "\n")); + + return TRUE; + } + + return FALSE; +} + void invasion_ScoreRules() { ScoreRules_basics(0, SFL_SORT_PRIO_SECONDARY, 0, FALSE); @@ -220,7 +245,7 @@ void invasion_Initialize() allowed_to_spawn = TRUE; - monster_skill = 0.01; + monster_skill = 0; roundcnt = 0; } @@ -232,6 +257,7 @@ MUTATOR_DEFINITION(gamemode_invasion) MUTATOR_HOOK(PlayerPreThink, invasion_PlayerThink, CBC_ORDER_ANY); MUTATOR_HOOK(PlayerSpawn, invasion_PlayerSpawn, CBC_ORDER_ANY); MUTATOR_HOOK(PlayerDamage_Calculate, invasion_PlayerDamage, CBC_ORDER_ANY); + MUTATOR_HOOK(SV_ParseClientCommand, invasion_PlayerCommand, CBC_ORDER_ANY); MUTATOR_ONADD {