]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/server/monsters/monster/cerberus.qc
38b57e76c961df1258a416c938ea592260f2c2d4
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / monsters / monster / cerberus.qc
1 const vector CERBERUS_MIN = '-16 -16 -24';
2 const vector CERBERUS_MAX = '16 16 12';
3
4 string CERBERUS_MODEL = "models/monsters/dog.dpm";
5
6 #ifdef SVQC
7 float autocvar_g_monster_cerberus;
8 float autocvar_g_monster_cerberus_health;
9 float autocvar_g_monster_cerberus_bite_damage;
10 float autocvar_g_monster_cerberus_attack_jump_damage;
11 float autocvar_g_monster_cerberus_speed_walk;
12 float autocvar_g_monster_cerberus_speed_run;
13
14 const float cerberus_anim_idle  = 0;
15 const float cerberus_anim_walk  = 1;
16 const float cerberus_anim_run   = 2;
17 const float cerberus_anim_attack        = 3;
18 const float cerberus_anim_die   = 4;
19 const float cerberus_anim_pain  = 5;
20
21 void cerberus_think()
22 {
23         self.think = cerberus_think;
24         self.nextthink = time + self.ticrate;
25         
26         monster_move(autocvar_g_monster_cerberus_speed_run, autocvar_g_monster_cerberus_speed_walk, 50, cerberus_anim_run, cerberus_anim_walk, cerberus_anim_idle);
27 }
28
29 void cerberus_touch_jump()
30 {
31         if (other.takedamage)
32         if (vlen(self.velocity) > 300)
33         {
34                 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));
35                 self.touch = MonsterTouch;
36         }
37
38         if(trace_dphitcontents)
39                 self.touch = MonsterTouch;
40 }
41
42 float cerberus_attack(float attack_type)
43 {
44         switch(attack_type)
45         {
46                 case MONSTER_ATTACK_MELEE:
47                 {
48                         monsters_setframe(cerberus_anim_attack);
49                         self.attack_finished_single = time + 0.7;
50                         monster_melee(self.enemy, autocvar_g_monster_cerberus_bite_damage, 0.2, DEATH_MONSTER_CERBERUS_BITE, TRUE);
51                         
52                         return TRUE;
53                 }
54                 case MONSTER_ATTACK_RANGED:
55                 {
56                         makevectors(self.angles);
57                         if(monster_leap(cerberus_anim_attack, cerberus_touch_jump, v_forward * 300 + '0 0 200', 0.8))
58                                 return TRUE;
59                 }
60         }
61         
62         return FALSE;
63 }
64
65 void cerberus_die()
66 {
67         Monster_CheckDropCvars ("cerberus");
68         
69         self.think = monster_dead_think;
70         self.nextthink = time + self.ticrate;
71         self.ltime = time + 5;
72         monsters_setframe(cerberus_anim_die);
73         
74         monster_hook_death(); // for post-death mods
75 }
76
77 void cerberus_spawn()
78 {
79         if not(self.health)
80                 self.health = autocvar_g_monster_cerberus_health;
81
82         self.damageforcescale   = 0;
83         self.classname                  = "monster_cerberus";
84         self.monster_attackfunc = cerberus_attack;
85         self.nextthink                  = time + random() * 0.5 + 0.1;
86         self.think                              = cerberus_think;
87         
88         monsters_setframe(cerberus_anim_idle);
89         
90         monster_setupsounds("cerberus");
91         
92         monster_hook_spawn(); // for post-spawn mods
93 }
94
95 void spawnfunc_monster_cerberus()
96 {
97         if not(autocvar_g_monster_cerberus) { remove(self); return; }
98         
99         self.monster_spawnfunc = spawnfunc_monster_cerberus;
100         
101         if(Monster_CheckAppearFlags(self))
102                 return;
103         
104         if not (monster_initialize(
105                          "Cerberus", MONSTER_CERBERUS,
106                          CERBERUS_MIN, CERBERUS_MAX,
107                          FALSE,
108                          cerberus_die, cerberus_spawn))
109         {
110                 remove(self);
111                 return;
112         }
113 }
114
115 // compatibility with old spawns
116 void spawnfunc_monster_dog() { spawnfunc_monster_cerberus(); }
117
118 #endif // SVQC