3 const vector ENFORCER_MIN = '-32 -32 0';
4 const vector ENFORCER_MAX = '32 32 64';
7 string ENFORCER_MODEL = "models/turrets/ewheel-base2.md3";
13 float autocvar_g_monster_enforcer;
14 float autocvar_g_monster_enforcer_health;
15 float autocvar_g_monster_enforcer_speed_walk;
16 float autocvar_g_monster_enforcer_speed_run;
17 float autocvar_g_monster_enforcer_attack_uzi_bullets;
20 const float enforcer_anim_stop = 0;
21 const float enforcer_anim_walk = 1;
22 const float enforcer_anim_run = 2;
23 const float enforcer_anim_walkback = 3;
24 const float enforcer_anim_runback = 4;
26 void enforcer_think ()
28 self.think = enforcer_think;
29 self.nextthink = time + self.ticrate;
32 self.nextthink = self.delay;
34 monster_move(autocvar_g_monster_enforcer_speed_run, autocvar_g_monster_enforcer_speed_walk, 100, enforcer_anim_run, enforcer_anim_walk, enforcer_anim_stop);
38 void enforcer_uzi_fire ()
42 if(self.enf_cycles > autocvar_g_monster_enforcer_attack_uzi_bullets)
44 self.monster_delayedattack = func_null;
48 W_UZI_Attack(DEATH_MONSTER_ENFORCER);
49 self.delay = time + 0.1;
50 self.monster_delayedattack = enforcer_uzi_fire;
53 float enforcer_attack()
55 makevectors(self.angles);
58 case WEP_ROCKET_LAUNCHER:
60 self.attack_finished_single = time + 0.8;
66 self.attack_finished_single = time + 0.8;
72 self.attack_finished_single = time + 0.8;
79 self.attack_finished_single = time + 0.8;
80 self.delay = time + 0.1;
81 self.monster_delayedattack = enforcer_uzi_fire;
86 self.attack_finished_single = time + 0.8;
90 return FALSE; // no weapon?
98 Monster_CheckDropCvars ("enforcer");
100 self.think = Monster_Fade;
101 self.nextthink = time + 5;
102 monsters_setframe(enforcer_anim_stop);
104 monster_hook_death(); // for post-death mods
107 void enforcer_spawn ()
110 self.health = autocvar_g_monster_enforcer_health * self.scale;
112 self.damageforcescale = 0;
113 self.classname = "monster_enforcer";
114 self.checkattack = GenericCheckAttack;
115 self.nextthink = time + random() * 0.5 + 0.1;
116 self.think = enforcer_think;
117 self.items = (IT_SHELLS | IT_ROCKETS | IT_NAILS | IT_CELLS);
118 self.sprite_height = 45;
119 self.attack_ranged = enforcer_attack;
120 self.view_ofs *= 0.5;
122 monsters_setframe(enforcer_anim_stop);
124 monster_setupsounds("enforcer");
126 setmodel(self, ENFORCER_MODEL); // for weapon entity
128 self.weaponentity = spawn();
129 self.weaponentity.owner = self;
130 self.weaponentity.team = self.team;
131 self.weaponentity.solid = SOLID_NOT;
132 self.weaponentity.owner = self.weaponentity.realowner = self;
133 self.weaponentity.movetype = MOVETYPE_NOCLIP;
134 setmodel(self.weaponentity, "models/turrets/ewheel-gun1.md3");
135 setattachment(self.weaponentity, self, "tag_head");
137 RandomSelection_Init();
138 RandomSelection_Add(world, WEP_ROCKET_LAUNCHER, "", 1, 1);
139 RandomSelection_Add(world, WEP_ELECTRO, "", 1, 1);
140 RandomSelection_Add(world, WEP_SHOTGUN, "", 1, 1);
141 RandomSelection_Add(world, WEP_UZI, "", 1, 1);
142 RandomSelection_Add(world, WEP_LASER, "", 1, 1);
144 self.weapon = RandomSelection_chosen_float;
146 monster_hook_spawn(); // for post-spawn mods
149 void spawnfunc_monster_enforcer ()
151 if not(autocvar_g_monster_enforcer) { remove(self); return; }
153 self.monster_spawnfunc = spawnfunc_monster_enforcer;
155 if(Monster_CheckAppearFlags(self))
158 precache_model("models/turrets/ewheel-gun1.md3");
159 precache_model(ENFORCER_MODEL);
161 if not (monster_initialize(
162 "Enforcer", MONSTER_ENFORCER,
163 ENFORCER_MIN, ENFORCER_MAX,
165 enforcer_die, enforcer_spawn))