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