2 const vector ENFORCER_MIN = '-16 -16 -24';
3 const vector ENFORCER_MAX = '16 16 24';
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;
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
24 void enforcer_think ()
26 self.think = enforcer_think;
27 self.nextthink = time + 0.1;
30 self.nextthink = self.delay;
32 if(time < self.attack_finished_single)
33 monster_move(0, 0, 0, enforcer_anim_attack, enforcer_anim_attack, enforcer_anim_attack);
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);
38 void enforcer_laser ()
40 self.frame = enforcer_anim_attack;
41 self.attack_finished_single = time + 0.8;
45 float enf_missile_laser ()
51 void enforcer_shotgun ()
53 self.frame = enforcer_anim_attack;
54 self.attack_finished_single = time + 0.8;
58 float enf_missile_shotgun ()
65 void enforcer_uzi_fire ()
69 if(self.enf_cycles > autocvar_g_monster_enforcer_attack_uzi_bullets)
71 self.monster_delayedattack = func_null;
75 W_UZI_Attack(DEATH_MONSTER_ENFORCER_NAIL);
76 self.delay = time + 0.1;
77 self.monster_delayedattack = enforcer_uzi_fire;
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;
88 float enf_missile_uzi ()
97 self.frame = enforcer_anim_attack;
98 self.attack_finished_single = time + 0.8;
102 float enf_missile_rocket ()
108 void enforcer_electro ()
110 self.frame = enforcer_anim_attack;
111 self.attack_finished_single = time + 0.8;
115 float enf_missile_plasma ()
123 Monster_CheckDropCvars ("enforcer");
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;
131 self.nextthink = time + 2.1;
132 self.pain_finished = self.nextthink;
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);
143 W_ThrowNewWeapon(self, WEP_LASER, 0, self.origin, self.velocity);
146 self.frame = enforcer_anim_death1;
148 self.frame = enforcer_anim_death2;
150 monster_hook_death(); // for post-death mods
153 void enforcer_spawn ()
156 self.health = autocvar_g_monster_enforcer_health * self.scale;
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;
166 local float r = random();
168 self.attack_ranged = enf_missile_rocket;
170 self.attack_ranged = enf_missile_plasma;
172 self.attack_ranged = enf_missile_shotgun;
174 self.attack_ranged = enf_missile_uzi;
176 self.attack_ranged = enf_missile_laser;
178 monster_hook_spawn(); // for post-spawn mods
181 void spawnfunc_monster_enforcer ()
183 if not(autocvar_g_monster_enforcer)
189 self.monster_spawnfunc = spawnfunc_monster_enforcer;
191 if(self.spawnflags & MONSTERFLAG_APPEAR)
193 self.think = func_null;
195 self.use = Monster_Appear;
201 if not (monster_initialize(
203 "models/monsters/enforcer.mdl",
204 ENFORCER_MIN, ENFORCER_MAX,
206 enforcer_die, enforcer_spawn))