From b76a556f30fc244576c98a30b305477e36db2db8 Mon Sep 17 00:00:00 2001 From: Mario Date: Tue, 6 Aug 2013 05:51:01 +1000 Subject: [PATCH] Fix spider freezing dead monsters/players --- qcsrc/server/monsters/monster/spider.qc | 2 +- qcsrc/server/mutators/gamemode_invasion.qc | 28 ++++++++++++++++------ qcsrc/server/mutators/gamemode_invasion.qh | 2 +- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/qcsrc/server/monsters/monster/spider.qc b/qcsrc/server/monsters/monster/spider.qc index cdae2f429..b72a857e7 100644 --- a/qcsrc/server/monsters/monster/spider.qc +++ b/qcsrc/server/monsters/monster/spider.qc @@ -54,7 +54,7 @@ void spider_web_explode() RadiusDamage(self, self.realowner, damg, edamg, 0, world, rad, DEATH_MONSTER_SPIDER_FIRE, world); // ice deals no damage anyway - for(e = findradius(self.origin, rad); e; e = e.chain) if(e.takedamage && e.deadflag == DEAD_NO) + for(e = findradius(self.origin, rad); e; e = e.chain) if(e.takedamage && e.deadflag == DEAD_NO) if(e.health > 0) { switch(self.realowner.spider_type) { diff --git a/qcsrc/server/mutators/gamemode_invasion.qc b/qcsrc/server/mutators/gamemode_invasion.qc index 03c469c64..dd2eeaf42 100644 --- a/qcsrc/server/mutators/gamemode_invasion.qc +++ b/qcsrc/server/mutators/gamemode_invasion.qc @@ -5,7 +5,7 @@ void invasion_spawnpoint() self.classname = "invasion_spawnpoint"; } -float invasion_PickMonster() +float invasion_PickMonster(float have_shamblers) { if(autocvar_g_invasion_zombies_only) return MONSTER_ZOMBIE; @@ -16,7 +16,7 @@ float invasion_PickMonster() for(i = MONSTER_FIRST + 1; i < MONSTER_LAST; ++i) { - if(i == MONSTER_STINGRAY || i == MONSTER_WYVERN) + if(i == MONSTER_STINGRAY || i == MONSTER_WYVERN || (i == MONSTER_SHAMBLER && have_shamblers >= 1)) continue; // flying/swimming monsters not yet supported RandomSelection_Add(world, i, "", 1, 1); @@ -52,9 +52,9 @@ void invasion_SpawnChosenMonster(float mon) monster = spawnmonster("", mon, spawn_point, spawn_point, spawn_point.origin, FALSE, 2); } -void invasion_SpawnMonsters() +void invasion_SpawnMonsters(float have_shamblers) { - float chosen_monster = invasion_PickMonster(); + float chosen_monster = invasion_PickMonster(have_shamblers); invasion_SpawnChosenMonster(chosen_monster); } @@ -78,16 +78,20 @@ float Invasion_CheckWinner() return 1; } - float total_alive_monsters = 0; + float total_alive_monsters = 0, shamblers = 0; FOR_EACH_MONSTER(head) if(head.health > 0) + { + if(head.monsterid == MONSTER_SHAMBLER) + ++shamblers; ++total_alive_monsters; + } - if((total_alive_monsters + numkilled) < maxspawned) + if((total_alive_monsters + numkilled) < maxspawned && maxcurrent < 10) // 10 at a time should be plenty { if(time >= last_check) { - invasion_SpawnMonsters(); + invasion_SpawnMonsters(shamblers); last_check = time + 2; } @@ -158,6 +162,7 @@ void Invasion_RoundStart() MUTATOR_HOOKFUNCTION(invasion_MonsterDies) { numkilled += 1; + maxcurrent -= 1; if(IS_PLAYER(frag_attacker)) PlayerScore_Add(frag_attacker, SP_KILLS, +1); @@ -177,6 +182,7 @@ MUTATOR_HOOKFUNCTION(invasion_MonsterSpawn) } numspawned += 1; + maxcurrent += 1; self.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_BOTCLIP | DPCONTENTS_MONSTERCLIP; @@ -232,6 +238,13 @@ MUTATOR_HOOKFUNCTION(invasion_PlayerCommand) return FALSE; } +MUTATOR_HOOKFUNCTION(invasion_SetStartItems) +{ + start_armorvalue = 100; + + return FALSE; +} + void invasion_ScoreRules() { ScoreRules_basics(0, 0, 0, FALSE); @@ -265,6 +278,7 @@ MUTATOR_DEFINITION(gamemode_invasion) 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_HOOK(SetStartItems, invasion_SetStartItems, CBC_ORDER_ANY); MUTATOR_ONADD { diff --git a/qcsrc/server/mutators/gamemode_invasion.qh b/qcsrc/server/mutators/gamemode_invasion.qh index 9c9343906..3d10814b4 100644 --- a/qcsrc/server/mutators/gamemode_invasion.qh +++ b/qcsrc/server/mutators/gamemode_invasion.qh @@ -4,4 +4,4 @@ float roundcnt; float maxrounds; float numkilled; float last_check; - +float maxcurrent; -- 2.39.2