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