1 #ifdef REGISTER_MONSTER
3 /* MON_##id */ CERBERUS,
4 /* function */ m_cerberus,
5 /* spawnflags */ MON_FLAG_MELEE | MON_FLAG_MUTATORBLOCKED,
6 /* mins,maxs */ '-16 -16 -24', '16 16 12',
8 /* netname */ "cerberus",
9 /* fullname */ _("Cerberus")
12 #define CERBERUS_SETTINGS(monster) \
13 MON_ADD_CVAR(monster, health) \
14 MON_ADD_CVAR(monster, attack_bite_damage) \
15 MON_ADD_CVAR(monster, attack_jump_damage) \
16 MON_ADD_CVAR(monster, speed_stop) \
17 MON_ADD_CVAR(monster, speed_run) \
18 MON_ADD_CVAR(monster, speed_walk)
21 CERBERUS_SETTINGS(cerberus)
25 const float cerberus_anim_idle = 0;
26 const float cerberus_anim_walk = 1;
27 const float cerberus_anim_run = 2;
28 const float cerberus_anim_attack = 3;
29 const float cerberus_anim_die = 4;
30 const float cerberus_anim_pain = 5;
32 .float cerberus_last_trace;
34 void cerberus_findowner()
36 if(time < self.cerberus_last_trace || self.monster_owner)
41 FOR_EACH_MONSTER(head)
43 if(head.monsterid == MON_BRUISER)
44 if(findentity(world, monster_owner, head) == world)
45 if(vlen(head.origin - self.origin) < self.target_range)
46 if(SAME_TEAM(head, self))
47 if(head.enemy == world)
49 self.monster_owner = head;
53 self.cerberus_last_trace = time + 3;
56 void cerberus_checkowner()
58 if(time < self.cerberus_last_trace)
60 if(IS_PLAYER(self.monster_owner))
61 return; // don't check player masters
63 if(vlen(self.origin - self.monster_owner.origin) > self.target_range)
64 self.monster_owner = world;
65 if(self.monster_owner.health < 1)
66 self.monster_owner = world;
67 if(DIFF_TEAM(self.monster_owner, self))
68 self.monster_owner = world;
70 self.cerberus_last_trace = time + 3;
73 void cerberus_touch_jump()
76 if (vlen(self.velocity) > 300)
78 Damage(self.enemy, self, self, MON_CVAR(cerberus, attack_jump_damage) * monster_skill, DEATH_MONSTER_CERBERUS_JUMP, self.enemy.origin, normalize(self.enemy.origin - self.origin));
79 self.touch = MonsterTouch;
82 if(trace_dphitcontents)
83 self.touch = MonsterTouch;
86 float cerberus_attack(float attack_type)
90 case MONSTER_ATTACK_MELEE:
92 return monster_melee(self.enemy, MON_CVAR(cerberus, attack_bite_damage), cerberus_anim_attack, self.attack_range, 0.7, DEATH_MONSTER_CERBERUS_BITE, TRUE);
94 case MONSTER_ATTACK_RANGED:
96 makevectors(self.angles);
97 return monster_leap(cerberus_anim_attack, cerberus_touch_jump, v_forward * 300 + '0 0 200', 0.8);
104 void spawnfunc_monster_cerberus()
106 self.classname = "monster_cerberus";
108 self.monster_spawnfunc = spawnfunc_monster_cerberus;
110 if(Monster_CheckAppearFlags(self))
113 if not(monster_initialize(MON_CERBERUS, FALSE)) { remove(self); return; }
116 // compatibility with old spawns
117 void spawnfunc_monster_dog() { spawnfunc_monster_cerberus(); }
119 float m_cerberus(float req)
125 if(self.monster_owner)
126 cerberus_checkowner();
128 cerberus_findowner();
129 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);
134 if(self.monster_owner.flags & FL_MONSTER)
135 self.monster_owner = world;
136 self.frame = cerberus_anim_die;
141 if not(self.health) self.health = MON_CVAR(cerberus, health);
143 self.monster_loot = spawnfunc_item_health_small;
144 self.monster_attackfunc = cerberus_attack;
145 self.frame = cerberus_anim_idle;
151 precache_model ("models/monsters/dog.dpm");
156 MON_CONFIG_SETTINGS(CERBERUS_SETTINGS(cerberus))
166 float m_cerberus(float req)
172 precache_model ("models/monsters/dog.dpm");
181 #endif // REGISTER_MONSTER