]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/server/monsters/monster/enforcer.qc
The first of many bad mistakes (forgot to include the new files)
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / monsters / monster / enforcer.qc
1 // size
2 const vector ENFORCER_MIN = '-16 -16 -24';
3 const vector ENFORCER_MAX = '16 16 24';
4
5 // cvars
6 float autocvar_g_monster_enforcer;
7 float autocvar_g_monster_enforcer_health;
8 float autocvar_g_monster_enforcer_speed_walk;
9 float autocvar_g_monster_enforcer_speed_run;
10 float autocvar_g_monster_enforcer_attack_uzi_bullets;
11
12 // animations
13 #define enforcer_anim_stand     0
14 #define enforcer_anim_walk              1
15 #define enforcer_anim_run               2
16 #define enforcer_anim_attack    3
17 #define enforcer_anim_death1    4
18 #define enforcer_anim_death2    5
19 #define enforcer_anim_pain1     6
20 #define enforcer_anim_pain2     7
21 #define enforcer_anim_pain3     8
22 #define enforcer_anim_pain4     9
23
24 void enforcer_think ()
25 {
26         self.think = enforcer_think;
27         self.nextthink = time + 0.3;
28         
29         if(self.delay != -1)
30                 self.nextthink = self.delay;
31         
32         if(time < self.attack_finished_single)
33                 monster_move(0, 0, 0, enforcer_anim_attack, enforcer_anim_attack, enforcer_anim_attack);
34         else
35                 monster_move(autocvar_g_monster_enforcer_speed_run, autocvar_g_monster_enforcer_speed_walk, 100, enforcer_anim_run, enforcer_anim_walk, enforcer_anim_stand);
36 }
37
38 void enforcer_laser ()
39 {
40         self.frame = enforcer_anim_attack;
41         self.attack_finished_single = time + 0.8;
42         W_Laser_Attack(0);
43 }
44
45 float enf_missile_laser ()
46 {
47         enforcer_laser();
48         return TRUE;
49 }
50
51 void enforcer_shotgun ()
52 {
53         self.frame = enforcer_anim_attack;
54         self.attack_finished_single = time + 0.8;
55         W_Shotgun_Attack();
56 }
57
58 float enf_missile_shotgun ()
59 {
60         enforcer_shotgun();
61         return TRUE;
62 }
63
64 .float enf_cycles;
65 void enforcer_uzi_fire ()
66 {
67         self.enf_cycles += 1;
68         
69         if(self.enf_cycles > autocvar_g_monster_enforcer_attack_uzi_bullets)
70         {
71                 self.monster_delayedattack = func_null;
72                 self.delay = -1;
73                 return;
74         }
75         W_UZI_Attack(DEATH_MONSTER_ENFORCER_NAIL);
76         self.delay = time + 0.1;
77         self.monster_delayedattack = enforcer_uzi_fire;
78 }
79
80 void enforcer_uzi ()
81 {
82         self.frame = enforcer_anim_attack;
83         self.attack_finished_single = time + 0.8;
84         self.delay = time + 0.1;
85         self.monster_delayedattack = enforcer_uzi_fire;
86 }
87
88 float enf_missile_uzi ()
89 {
90         self.enf_cycles = 0;
91         enforcer_uzi();
92         return TRUE;
93 }
94
95 void enforcer_rl ()
96 {
97         self.frame = enforcer_anim_attack;
98         self.attack_finished_single = time + 0.8;
99         W_Rocket_Attack();
100 }
101
102 float enf_missile_rocket ()
103 {
104         enforcer_rl();
105         return TRUE;
106 }
107
108 void enforcer_electro ()
109 {
110         self.frame = enforcer_anim_attack;
111         self.attack_finished_single = time + 0.8;
112         W_Electro_Attack();
113 }
114
115 float enf_missile_plasma ()
116 {
117         enforcer_electro();
118         return TRUE;
119 }
120
121 void enforcer_die ()
122 {
123         Monster_CheckDropCvars ("enforcer");
124         
125         self.solid                      = SOLID_NOT;
126         self.movetype           = MOVETYPE_TOSS;
127         self.think                      = Monster_Fade;
128         self.takedamage         = DAMAGE_NO;
129         self.event_damage   = func_null;
130         self.enemy                      = world;
131         self.nextthink          = time + 2.1;
132         self.pain_finished  = self.nextthink;
133         
134         if (self.attack_ranged == enf_missile_rocket)
135                 W_ThrowNewWeapon(self, WEP_ROCKET_LAUNCHER, 0, self.origin, self.velocity);
136         else if (self.attack_ranged == enf_missile_plasma)
137                 W_ThrowNewWeapon(self, WEP_ELECTRO, 0, self.origin, self.velocity);
138         else if (self.attack_ranged == enf_missile_shotgun)
139                 W_ThrowNewWeapon(self, WEP_SHOTGUN, 0, self.origin, self.velocity);        
140         else if (self.attack_ranged == enf_missile_uzi)
141                 W_ThrowNewWeapon(self, WEP_UZI, 0, self.origin, self.velocity);
142         else
143                 W_ThrowNewWeapon(self, WEP_LASER, 0, self.origin, self.velocity);
144                 
145         if (random() > 0.5)
146                 self.frame = enforcer_anim_death1;
147         else
148                 self.frame = enforcer_anim_death2;
149                 
150         monster_hook_death(); // for post-death mods
151 }
152
153 void enforcer_spawn ()
154 {
155         if not(self.health)
156                 self.health = autocvar_g_monster_enforcer_health * self.scale;
157
158         self.damageforcescale   = 0;
159         self.classname                  = "monster_enforcer";
160         self.checkattack                = GenericCheckAttack;
161         self.nextthink                  = time + random() * 0.5 + 0.1;
162         self.think                              = enforcer_think;
163         self.items                              = (IT_SHELLS | IT_ROCKETS | IT_NAILS | IT_CELLS);
164         self.sprite_height              = 30 * self.scale;
165         
166         local float r = random();
167         if (r < 0.20)
168                 self.attack_ranged = enf_missile_rocket;
169         else if (r < 0.40)
170                 self.attack_ranged = enf_missile_plasma;
171         else if (r < 0.60)
172                 self.attack_ranged = enf_missile_shotgun;         
173         else if (r < 0.80)
174                 self.attack_ranged = enf_missile_uzi;
175         else
176                 self.attack_ranged = enf_missile_laser;
177                 
178         monster_hook_spawn(); // for post-spawn mods
179 }
180
181 void spawnfunc_monster_enforcer ()
182 {       
183         if not(autocvar_g_monster_enforcer)
184         {
185                 remove(self);
186                 return;
187         }
188         
189         self.monster_spawnfunc = spawnfunc_monster_enforcer;
190         
191         if(self.spawnflags & MONSTERFLAG_APPEAR)
192         {
193                 self.think = func_null;
194                 self.nextthink = -1;
195                 self.use = Monster_Appear;
196                 return;
197         }
198         
199         self.scale = 1.3;
200         
201         if not (monster_initialize(
202                          "Enforcer",
203                          "models/monsters/enforcer.mdl",
204                          ENFORCER_MIN, ENFORCER_MAX,
205                          FALSE,
206                          enforcer_die, enforcer_spawn))
207         {
208                 remove(self);
209                 return;
210         }
211 }