2 const vector ENFORCER_MIN = '-32 -32 0';
3 const vector ENFORCER_MAX = '32 32 64';
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_stop 0
14 #define enforcer_anim_walk 1
15 #define enforcer_anim_run 2
16 #define enforcer_anim_walkback 3
17 #define enforcer_anim_runback 4
19 void enforcer_think ()
21 self.think = enforcer_think;
22 self.nextthink = time + 0.1;
25 self.nextthink = self.delay;
27 monster_move(autocvar_g_monster_enforcer_speed_run, autocvar_g_monster_enforcer_speed_walk, 100, enforcer_anim_run, enforcer_anim_walk, enforcer_anim_stop);
30 void enforcer_laser ()
32 self.attack_finished_single = time + 0.8;
36 float enf_missile_laser ()
42 void enforcer_shotgun ()
44 self.attack_finished_single = time + 0.8;
48 float enf_missile_shotgun ()
55 void enforcer_uzi_fire ()
59 if(self.enf_cycles > autocvar_g_monster_enforcer_attack_uzi_bullets)
61 self.monster_delayedattack = func_null;
65 W_UZI_Attack(DEATH_MONSTER_ENFORCER_NAIL);
66 self.delay = time + 0.1;
67 self.monster_delayedattack = enforcer_uzi_fire;
72 self.attack_finished_single = time + 0.8;
73 self.delay = time + 0.1;
74 self.monster_delayedattack = enforcer_uzi_fire;
77 float enf_missile_uzi ()
86 self.attack_finished_single = time + 0.8;
90 float enf_missile_rocket ()
96 void enforcer_electro ()
98 self.attack_finished_single = time + 0.8;
102 float enf_missile_plasma ()
110 Monster_CheckDropCvars ("enforcer");
112 self.solid = SOLID_NOT;
113 self.movetype = MOVETYPE_TOSS;
114 self.think = Monster_Fade;
115 self.takedamage = DAMAGE_NO;
116 self.event_damage = func_null;
118 self.nextthink = time + 2.1;
119 self.pain_finished = self.nextthink;
121 remove(self.weaponentity);
122 self.weaponentity = world;
124 if (self.attack_ranged == enf_missile_rocket)
125 W_ThrowNewWeapon(self, WEP_ROCKET_LAUNCHER, 0, self.origin, self.velocity);
126 else if (self.attack_ranged == enf_missile_plasma)
127 W_ThrowNewWeapon(self, WEP_ELECTRO, 0, self.origin, self.velocity);
128 else if (self.attack_ranged == enf_missile_shotgun)
129 W_ThrowNewWeapon(self, WEP_SHOTGUN, 0, self.origin, self.velocity);
130 else if (self.attack_ranged == enf_missile_uzi)
131 W_ThrowNewWeapon(self, WEP_UZI, 0, self.origin, self.velocity);
133 W_ThrowNewWeapon(self, WEP_LASER, 0, self.origin, self.velocity);
135 self.frame = enforcer_anim_stop;
137 monster_hook_death(); // for post-death mods
140 void enforcer_spawn ()
143 self.health = autocvar_g_monster_enforcer_health * self.scale;
145 self.damageforcescale = 0;
146 self.classname = "monster_enforcer";
147 self.checkattack = GenericCheckAttack;
148 self.nextthink = time + random() * 0.5 + 0.1;
149 self.think = enforcer_think;
150 self.items = (IT_SHELLS | IT_ROCKETS | IT_NAILS | IT_CELLS);
151 self.sprite_height = 45 * self.scale;
153 self.weaponentity = spawn();
154 self.weaponentity.owner = self;
155 self.weaponentity.team = self.team;
156 self.weaponentity.solid = SOLID_NOT;
157 self.weaponentity.owner = self.weaponentity.realowner = self;
158 self.weaponentity.movetype = MOVETYPE_NOCLIP;
159 setmodel(self.weaponentity, "models/turrets/ewheel-gun1.md3");
160 setattachment(self.weaponentity, self, "tag_head");
162 local float r = random();
164 self.attack_ranged = enf_missile_rocket;
166 self.attack_ranged = enf_missile_plasma;
168 self.attack_ranged = enf_missile_shotgun;
170 self.attack_ranged = enf_missile_uzi;
172 self.attack_ranged = enf_missile_laser;
174 monster_hook_spawn(); // for post-spawn mods
177 void spawnfunc_monster_enforcer ()
179 if not(autocvar_g_monster_enforcer) { remove(self); return; }
181 self.monster_spawnfunc = spawnfunc_monster_enforcer;
183 if(self.spawnflags & MONSTERFLAG_APPEAR)
185 self.think = func_null;
187 self.use = Monster_Appear;
191 if not (monster_initialize(
193 "models/turrets/ewheel-base2.md3",
194 ENFORCER_MIN, ENFORCER_MAX,
196 enforcer_die, enforcer_spawn))