]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/common/monsters/monster/cerberus.qc
1b851d0734e2041b8cd17c7166685a3e9f9c2b37
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / monsters / monster / cerberus.qc
1 #ifdef REGISTER_MONSTER
2 REGISTER_MONSTER(
3 /* MON_##id   */ CERBERUS,
4 /* function   */ m_cerberus,
5 /* spawnflags */ 0,
6 /* mins,maxs  */ '-16 -16 -24', '16 16 12',
7 /* model      */ "dog.dpm",
8 /* netname    */ "cerberus",
9 /* fullname   */ _("Cerberus")
10 );
11
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) 
19
20 #ifdef SVQC
21 CERBERUS_SETTINGS(cerberus)
22 #endif // SVQC
23 #else
24 #ifdef SVQC
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;
31
32 void cerberus_touch_jump()
33 {
34         if (other.takedamage)
35         if (vlen(self.velocity) > 300)
36         {
37                 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));
38                 self.touch = MonsterTouch;
39         }
40
41         if(trace_dphitcontents)
42                 self.touch = MonsterTouch;
43 }
44
45 float cerberus_attack(float attack_type)
46 {
47         switch(attack_type)
48         {
49                 case MONSTER_ATTACK_MELEE:
50                 {
51                         monsters_setframe(cerberus_anim_attack);
52                         self.attack_finished_single = time + 0.7;
53                         monster_melee(self.enemy, MON_CVAR(cerberus, attack_bite_damage), 0.2, DEATH_MONSTER_CERBERUS_BITE, TRUE);
54                         
55                         return TRUE;
56                 }
57                 case MONSTER_ATTACK_RANGED:
58                 {
59                         makevectors(self.angles);
60                         if(monster_leap(cerberus_anim_attack, cerberus_touch_jump, v_forward * 300 + '0 0 200', 0.8))
61                                 return TRUE;
62                 }
63         }
64         
65         return FALSE;
66 }
67
68 void spawnfunc_monster_cerberus()
69 {
70         self.classname = "monster_cerberus";
71         
72         self.monster_spawnfunc = spawnfunc_monster_cerberus;
73         
74         if(Monster_CheckAppearFlags(self))
75                 return;
76         
77         if not(monster_initialize(MON_CERBERUS, FALSE)) { remove(self); return; }
78 }
79
80 // compatibility with old spawns
81 void spawnfunc_monster_dog() { spawnfunc_monster_cerberus(); }
82
83 float m_cerberus(float req)
84 {
85         switch(req)
86         {
87                 case MR_THINK:
88                 {
89                         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);
90                         return TRUE;
91                 }
92                 case MR_DEATH:
93                 {
94                         monsters_setframe(cerberus_anim_die);
95                         return TRUE;
96                 }
97                 case MR_SETUP:
98                 {
99                         if not(self.health) self.health = MON_CVAR(cerberus, health);
100                                 
101                         self.monster_attackfunc = cerberus_attack;
102                         monsters_setframe(cerberus_anim_idle);
103                         
104                         return TRUE;
105                 }
106                 case MR_INIT:
107                 {
108                         // nothing
109                         return TRUE;
110                 }
111                 case MR_CONFIG:
112                 {
113                         MON_CONFIG_SETTINGS(CERBERUS_SETTINGS(cerberus))
114                         return TRUE;
115                 }
116         }
117         
118         return TRUE;
119 }
120
121 #endif // SVQC
122 #ifdef CSQC
123 float m_cerberus(float req)
124 {
125         switch(req)
126         {
127                 case MR_DEATH:
128                 {
129                         // nothing
130                         return TRUE;
131                 }
132                 case MR_INIT:
133                 {
134                         precache_model ("models/monsters/dog.dpm");
135                         return TRUE;
136                 }
137         }
138         
139         return TRUE;
140 }
141
142 #endif // CSQC
143 #endif // REGISTER_MONSTER