]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Experimental: Bruiser will wait for its pet (closest cerberus) to attack before charg...
authorMario <mario.mario@y7mail.com>
Wed, 28 Aug 2013 21:26:00 +0000 (07:26 +1000)
committerMario <mario.mario@y7mail.com>
Wed, 28 Aug 2013 21:26:00 +0000 (07:26 +1000)
qcsrc/common/monsters/lib/monsters.qc
qcsrc/common/monsters/monster/bruiser.qc
qcsrc/common/monsters/monster/cerberus.qc

index 3bd5a46f663913102e7621a3768e8e417a0bec70..6772028f6c85406aa1525d8361565f4a065f5b47 100644 (file)
@@ -651,7 +651,10 @@ void monster_move(float runspeed, float walkspeed, float stopspeed, float manim_
                        movelib_move_simple_gravity(v_forward, ((self.enemy) ? runspeed : walkspeed), 0.6);
                if(time > self.pain_finished)
                if(time > self.attack_finished_single)
+               if(vlen(self.velocity) > 0)
                        monsters_setframe((self.enemy) ? manim_run : manim_walk);
+               else
+                       monsters_setframe(manim_idle);
        }
        else
        {
index ce23074cdc03c9257a653b6d9a702be2a6fce7ce..015d0abf2c79d6119df4a96ee8bda25e03629232 100644 (file)
@@ -75,7 +75,16 @@ float m_bruiser(float req)
        {
                case MR_THINK:
                {
-                       monster_move(MON_CVAR(bruiser, speed_run), MON_CVAR(bruiser, speed_walk), MON_CVAR(bruiser, speed_stop), bruiser_anim_run, bruiser_anim_walk, bruiser_anim_stand);
+                       entity pet = world;
+                       pet = findentity(pet, monster_owner, self);
+                       float rspeed = MON_CVAR(bruiser, speed_run);
+                       
+                       if(pet)
+                       if(self.enemy)
+                       if(vlen(self.enemy.origin - pet.origin) < vlen(self.enemy.origin - self.origin))
+                               rspeed = 0;
+                               
+                       monster_move(rspeed, MON_CVAR(bruiser, speed_walk), MON_CVAR(bruiser, speed_stop), bruiser_anim_run, bruiser_anim_walk, bruiser_anim_stand);
                        return TRUE;
                }
                case MR_DEATH:
index 1b851d0734e2041b8cd17c7166685a3e9f9c2b37..d7acb316f27da61e0b7d0e54a3e6826473e098fe 100644 (file)
@@ -29,6 +29,45 @@ const float cerberus_anim_attack     = 3;
 const float cerberus_anim_die          = 4;
 const float cerberus_anim_pain         = 5;
 
+.float cerberus_last_trace;
+
+void cerberus_findowner()
+{
+       if(time < self.cerberus_last_trace || self.monster_owner)
+               return;
+               
+       entity head;
+       
+       FOR_EACH_MONSTER(head)
+       if(head.health > 0)
+       if(head.monsterid == MON_BRUISER)
+       if(findentity(world, monster_owner, head) == world)
+       if(vlen(head.origin - self.origin) < self.target_range)
+       if(!IsDifferentTeam(head, self))
+       if(head.enemy == world)
+       {
+               self.monster_owner = head;
+               break;
+       }
+               
+       self.cerberus_last_trace = time + 3;
+}
+
+void cerberus_checkowner()
+{
+       if(time < self.cerberus_last_trace)
+               return;
+
+       if(vlen(self.origin - self.monster_owner.origin) > self.target_range)
+               self.monster_owner = world;
+       if(self.monster_owner.health < 1)
+               self.monster_owner = world;
+       if(IsDifferentTeam(self.monster_owner, self))
+               self.monster_owner = world;
+               
+       self.cerberus_last_trace = time + 3;
+}
+
 void cerberus_touch_jump()
 {
        if (other.takedamage)
@@ -86,11 +125,17 @@ float m_cerberus(float req)
        {
                case MR_THINK:
                {
+                       if(self.monster_owner)
+                               cerberus_checkowner();
+                       else
+                               cerberus_findowner();
                        monster_move(MON_CVAR(cerberus, speed_run), MON_CVAR(cerberus, speed_walk), MON_CVAR(cerberus, speed_stop), cerberus_anim_run, cerberus_anim_walk, cerberus_anim_idle);
                        return TRUE;
                }
                case MR_DEATH:
                {
+                       if(self.monster_owner.flags & FL_MONSTER)
+                               self.monster_owner = world;
                        monsters_setframe(cerberus_anim_die);
                        return TRUE;
                }