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