From: Mario Date: Sat, 20 Apr 2013 15:41:53 +0000 (+1000) Subject: Add a basic trick to make monsters walk around eachother X-Git-Tag: xonotic-v0.8.0~241^2^2~333 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=dddbd0474976772112f78e0254afd3442d1d9cc6;p=xonotic%2Fxonotic-data.pk3dir.git Add a basic trick to make monsters walk around eachother --- diff --git a/qcsrc/server/mutators/gamemode_towerdefense.qc b/qcsrc/server/mutators/gamemode_towerdefense.qc index a5f42d79e..3e7223e30 100644 --- a/qcsrc/server/mutators/gamemode_towerdefense.qc +++ b/qcsrc/server/mutators/gamemode_towerdefense.qc @@ -764,8 +764,11 @@ MUTATOR_HOOKFUNCTION(td_MonsterCheckBossFlag) MUTATOR_HOOKFUNCTION(td_MonsterMove) { - entity player; + entity player, monster = world; float n_players = 0; + float dot = 0, es = 10; + vector extra_size = '1 1 1' * es; + FOR_EACH_PLAYER(player) { ++n_players; } if(n_players < 1) // no players online, so do nothing @@ -775,6 +778,21 @@ MUTATOR_HOOKFUNCTION(td_MonsterMove) return FALSE; } + if not(self.enemy) + { + makevectors (self.angles); + + FOR_EACH_MONSTER(monster) if(monster != self) + { + dot = normalize (monster.origin - self.origin) * v_forward; + if(boxesoverlap(self.absmin - extra_size, self.absmax + extra_size, monster.absmin, monster.absmax) && dot > 0.3) + { + self.moveto = (v_forward * 50) + ((random() > 0.5) ? (v_right * 0.5) : ((v_right * -1) * 0.5)); + break; + } + } + } + if not(self.enemy) // don't change targets while attacking if((vlen(self.goalentity.origin - self.origin) <= 100 && self.goalentity.classname == "td_waypoint") || (vlen(self.goalentity.origin - self.origin) <= 200 && (self.flags & FL_FLY) && self.goalentity.classname == "td_waypoint")) { @@ -794,8 +812,8 @@ MUTATOR_HOOKFUNCTION(td_MonsterMove) self.goalentity = PickGenerator(); } - monster_speed_run = m_speed_run * monster_skill; - monster_speed_walk = m_speed_walk * monster_skill; + monster_speed_run = (m_speed_run + random() * 4) * monster_skill; + monster_speed_walk = (m_speed_walk + random() * 4) * monster_skill; return FALSE; }