#define mag1 currentammo #define maxmag1 cnt .entity objective; void () LobAGrenade; void (vector jojo) spawn_civilian; void (entity jeb, float time) spawn_excla; void(float db) monster_noise; void () find_hide; void () army_load1; void () army_radio1; void () Footstep; void () monster_commander; void () DeathThroes = { local entity te; te = findradius (self.origin, 300); while (te) { if (te.classname == "monster" && te.health > 0 && te != self) te.enemy = self; te = te.chain; } }; //RADIO void() fire_radio = { if (world.map_obj == OBJ_SHADOW && self.has_radio == 1) { spawn_excla(self, 8); bprint(2, self.netname); bprint(2, " is calling for help! silence him!\n"); self.rtime = 0; army_radio1(); return; } }; //PISTOL void (float tmp, float dam) army_fire = { local vector src; local vector dir; local vector direction; local entity en; local vector org; if (self.enemy.sneak == 1) tmp = tmp * 2; //soldiers call for help on shadow ops if (world.map_obj == OBJ_SHADOW && self.has_radio == 1) { spawn_excla(self, 8); bprint(2, self.netname); bprint(2, " is calling for help! silence him!\n"); self.rtime = 0; army_radio1(); return; } if (self.mag1 <= 0) { self.mag1 = 12; sound (self, CHAN_WEAPON, "misc/greload.wav", PLAT_LOW_TRIGGER, ATTN_NORM); army_load1(); return; } self.mag1 = self.mag1 - 1; makevectors (self.angles); sound (self, CHAN_WEAPON, "weapons/usp.wav", PLAT_LOW_TRIGGER, ATTN_NORM); src = self.origin + v_forward*10; src_z = self.absmin_z + self.size_z * 0.7; en = self.enemy; dir = en.origin - en.velocity*0.2; if (en.position == 1) dir = dir - '0 0 8'; if (en.position == 2) dir = dir - '0 0 16'; dir = normalize (dir - self.origin); direction = dir; traceline (src, src + direction*2048 + v_right*crandom()*tmp + v_up*crandom()*tmp, FALSE, self); if (trace_fraction == 1) return; if (trace_ent.takedamage) { dam = 1 + random()*dam + random()*dam; dam = dam - (1 - (trace_fraction/2)); SpawnBlood (org, PLAT_LOW_TRIGGER); T_Damage (trace_ent, self, self, dam); } else bullet_hole (trace_endpos); }; //RIFLE void (float tmp, float dam) army_fire1 = { local vector src; local vector dir; local vector direction; local entity en; local vector org; if (self.enemy.sneak == 1) tmp = tmp * 2; //soldiers call for help on shadow ops if (world.map_obj == OBJ_SHADOW && self.has_radio == 1) { spawn_excla(self, 8); bprint(2, self.netname); bprint(2, " is calling for help! silence him!\n"); self.rtime = 0; army_radio1(); return; } monster_noise(60); if (self.mag1 <= 0) { self.mag1 = 1; sound (self, CHAN_WEAPON, "misc/greload.wav", PLAT_LOW_TRIGGER, ATTN_NORM); army_load1(); return; } self.mag1 = self.mag1 - 1; makevectors (self.angles); sound (self, CHAN_WEAPON, "weapons/rangem.wav", PLAT_LOW_TRIGGER, ATTN_NORM); src = self.origin + v_forward*10; src_z = self.absmin_z + self.size_z * 0.7; en = self.enemy; dir = en.origin - en.velocity*0.05; if (en.position == 1) dir = dir - '0 0 8'; if (en.position == 2) dir = dir - '0 0 16'; dir = normalize (dir - self.origin); direction = dir; traceline (src, src + direction*2048 + v_right*crandom()*150 + v_up*crandom()*150, FALSE, self); if (trace_fraction == 1) return; if (trace_ent.takedamage) { SpawnBlood (org, PLAT_LOW_TRIGGER); dam = 10 + random()*dam + random()*dam; dam = dam * (1 - (trace_fraction/2)); X_Damage (trace_ent, self, self, dam); } else bullet_hole (trace_endpos); }; //SHOTGUN void (float tmp, float dam) army_fire2 = { local vector src; local vector dir; local vector direction; local entity en; local vector org; local float var_u, var_r, var_o; local float shot; if (self.enemy.sneak == 1) tmp = tmp * 2; if (self.mag1 <= 0) { self.mag1 = 6; sound (self, CHAN_WEAPON, "misc/greload.wav", PLAT_LOW_TRIGGER, ATTN_NORM); army_load1(); return; } //soldiers call for help on shadow ops if (world.map_obj == OBJ_SHADOW && self.has_radio == 1) { spawn_excla(self, 8); bprint(2, self.netname); bprint(2, " is calling for help! silence him!\n"); self.rtime = 0; army_radio1(); return; } self.mag1 = self.mag1 - 1; makevectors (self.angles); sound (self, CHAN_WEAPON, "weapons/shotgun1.wav", PLAT_LOW_TRIGGER, ATTN_NORM); monster_noise(50); src = self.origin + v_forward*10; src_z = self.absmin_z + self.size_z * 0.7; en = self.enemy; dir = en.origin - en.velocity*0.2; if (en.position == 1) dir = dir - '0 0 8'; if (en.position == 2) dir = dir - '0 0 16'; dir = normalize (dir - self.origin); direction = dir; shot = 5; var_o = crandom()*50; while (shot > 0) { if (shot == 5) { var_r = 30; var_u = 30; } if (shot == 4) { var_r = -30; var_u = 30; } if (shot == 3) { var_r = 30; var_u = -30; } if (shot == 2) { var_r = -30; var_u = -30; } if (shot == 1) { var_r = 0; var_u = 0; } traceline (src, src + direction*2048 + v_right*(var_o+var_r) + v_up*(var_o+var_u), FALSE, self); shot = (shot - 1); if (trace_fraction == 1) return; if (trace_ent.takedamage) { SpawnBlood (org, PLAT_LOW_TRIGGER); dam = 1 + random()*dam + random()*dam; dam = dam * (1 - (trace_fraction/2)); T_Damage (trace_ent, self, self, dam); } else bullet_hole (trace_endpos); } }; //SMG void (float tmp, float dam) army_fire3 = { local vector src; local vector dir; local vector direction; local entity en; local vector org; if (self.mag1 <= 0) { self.mag1 = 30; sound (self, CHAN_WEAPON, "misc/greload.wav", 1, ATTN_NORM); army_load1(); return; } //soldiers call for help on shadow ops if (world.map_obj == OBJ_SHADOW && self.has_radio == 1) { spawn_excla(self, 8); bprint(2, self.netname); bprint(2, " is calling for help! silence him!\n"); self.rtime = 0; army_radio1(); return; } monster_noise(40); if (self.enemy.sneak == 1) tmp = tmp * 2; sound (self, CHAN_WEAPON, "weapons/mp5.wav", PLAT_LOW_TRIGGER, ATTN_NORM); self.mag1 = self.mag1 - 1; makevectors (self.angles); src = self.origin + v_forward*10; src_z = self.absmin_z + self.size_z * 0.7; en = self.enemy; dir = en.origin - en.velocity*0.2; if (en.position == 1) dir = dir - '0 0 8'; if (en.position == 2) dir = dir - '0 0 16'; dir = normalize (dir - self.origin); direction = dir; traceline (src, src + direction*1024 + v_right*crandom()*tmp + v_up*crandom()*tmp, FALSE, self); if (trace_fraction == 1) return; if (trace_ent.takedamage) { SpawnBlood (org, PLAT_LOW_TRIGGER); dam = 1 + random()*dam + random()*dam; dam = dam * (1 - (trace_fraction/2)); T_Damage (trace_ent, self, self, dam); } else bullet_hole (trace_endpos); }; //Assault Rifle void (float tmp, float dam) army_fire4 = { local vector src; local vector dir; local vector direction; local entity en; local vector org; if (self.mag1 <= 0) { self.mag1 = 24; sound (self, CHAN_WEAPON, "misc/greload.wav", PLAT_LOW_TRIGGER, ATTN_NORM); army_load1(); return; } self.mag1 = self.mag1 - 1; makevectors (self.angles); sound (self, CHAN_WEAPON, "weapons/ak112.wav", PLAT_LOW_TRIGGER, ATTN_NORM); src = self.origin + v_forward*10; src_z = self.absmin_z + self.size_z * 0.7; en = self.enemy; dir = en.origin - en.velocity*0.2; if (en.position == 1) dir = dir - '0 0 8'; if (en.position == 2) dir = dir - '0 0 16'; dir = normalize (dir - self.origin); direction = dir; traceline (src, src + direction*2048 + v_right*crandom()*tmp + v_up*crandom()*tmp, FALSE, self); monster_noise(60); if (trace_fraction == 1) return; if (trace_ent.takedamage) { SpawnBlood (org, PLAT_LOW_TRIGGER); dam = 1 + random()*dam + random()*dam; dam = dam * (1 - (trace_fraction/2)); T_Damage (trace_ent, self, self, dam); } else { if (en.classname == "player" && random()*20 <= 5) stuffcmd(en, "play effects/miss\n"); bullet_hole (trace_endpos); } }; void () army_run1; void () army_radio1 = [ 29, army_radio2 ] { if (self.health <= 0) { self.think = SUB_Null; return; } self.rtime = self.rtime + 1; ai_stand (); }; void () army_radio2 = [ 29, army_radio3 ] { ai_stand (); }; void () army_radio3 = [ 29, army_radio1 ] { if (self.rtime > 15) { if (random()<0.25) sound (self, CHAN_VOICE, "effects/radio1.wav", 1, ATTN_NONE); else if (random()<0.25) sound (self, CHAN_VOICE, "effects/radio2.wav", 1, ATTN_NONE); else if (random()<0.25) sound (self, CHAN_VOICE, "effects/radio3.wav", 1, ATTN_NONE); else sound (self, CHAN_VOICE, "effects/radio4.wav", 1, ATTN_NONE); called_in += 1; self.has_radio = 0; army_run1(); bprint(2, "soldier reported suspicious activity!\n"); if (called_in == 1) bprint(2, "threat level: low\n"); if (called_in == 2) bprint(2, "threat level: rising\n"); if (called_in == 3) bprint(2, "threat level: alert\n"); if (called_in == 4) bprint(2, "threat level: paranoid\n"); if (called_in >= 5) bprint(2, "threat level: discovered\n"); } else { if (random()<0.5) sound (self, CHAN_VOICE, "effects/blip1.wav", 1, ATTN_IDLE); else sound (self, CHAN_VOICE, "effects/blip2.wav", 1, ATTN_IDLE); } ai_stand (); }; void () army_load1 = [ 29, army_load2 ] { ai_stand (); }; void () army_load2 = [ 29, army_load3 ] { ai_stand (); }; void () army_load3 = [ 30, army_load4 ] { ai_stand (); }; void () army_load4 = [ 30, army_load5 ] { ai_stand (); }; void () army_load5 = [ 31, army_load6 ] { ai_stand (); }; void () army_load6 = [ 31, army_load7 ] { ai_stand (); }; void () army_load7 = [ 32, army_load8 ] { ai_stand (); }; void () army_load8 = [ 32, army_load9 ] { ai_stand (); }; void () army_load9 = [ 33, army_load10 ] { ai_stand (); }; void () army_load10 = [ 33, army_load11 ] { ai_stand (); }; void () army_load11 = [ 34, army_load12 ] { ai_stand (); }; void () army_load12 = [ 34, army_load13 ] { ai_stand (); }; void () army_load13 = [ 35, army_load14 ] { ai_stand (); }; void () army_load14 = [ 35, army_load15 ] { ai_stand (); }; void () army_load15 = [ 36, army_load16 ] { ai_stand (); }; void () army_load16 = [ 36, army_load17 ] { ai_stand (); }; void () army_load17 = [ 37, army_load18 ] { ai_stand (); }; void () army_load18 = [ 37, army_load19 ] { ai_stand (); }; void () army_load19 = [ 38, army_load20 ] { ai_stand (); }; void () army_load20 = [ 38, army_load21 ] { ai_stand (); }; void () army_load21 = [ 39, army_load22 ] { ai_stand (); }; void () army_load22 = [ 39, army_run1 ] { ai_stand (); }; void () army_stand1 = [ 0, army_stand2 ] { ai_stand (); }; void () army_stand2 = [ 1, army_stand3 ] { ai_stand (); }; void () army_stand3 = [ 2, army_stand4 ] { ai_stand (); }; void () army_stand4 = [ 3, army_stand5 ] { ai_stand (); }; void () army_stand5 = [ 4, army_stand6 ] { ai_stand (); }; void () army_stand6 = [ 5, army_stand7 ] { ai_stand (); }; void () army_stand7 = [ 6, army_stand8 ] { ai_stand (); }; void () army_stand8 = [ 7, army_stand1 ] { ai_stand (); }; void () army_walk1 = [ 73, army_walk2 ] { ai_walk (TE_TELEPORT); }; void () army_walk2 = [ 74, army_walk3 ] { ai_walk (15); }; void () army_walk3 = [ 75, army_walk4 ] { ai_walk (TE_LAVASPLASH); }; void () army_walk4 = [ 76, army_walk5 ] { ai_walk (TE_LAVASPLASH); }; void () army_walk5 = [ 77, army_walk6 ] { ai_walk (SECRET_NO_SHOOT); }; void () army_walk6 = [ 78, army_walk7 ] { ai_walk (15); }; void () army_walk7 = [ 79, army_walk8 ] { ai_walk (TE_LAVASPLASH); }; void () army_walk8 = [ 80, army_walk1 ] { ai_walk (SECRET_NO_SHOOT); }; void () army_run1 = [ 73, army_run2 ] { if (random()<0.25 || self.health <= 25) find_hide(); ai_run (TE_TELEPORT); }; void () army_run2 = [ 74, army_run3 ] { ai_run (15); }; void () army_run3 = [ 75, army_run4 ] { if (world.map_obj == OBJ_SHADOW && self.has_radio == 1) { spawn_excla(self, 8); bprint(2, self.netname); bprint(2, " is calling for help! silence him!\n"); self.rtime = 0; army_radio1(); return; } ai_run (TE_LAVASPLASH); }; void () army_run4 = [ 76, army_run5 ] { ai_run (TE_LAVASPLASH); }; void () army_run5 = [ 77, army_run6 ] { ai_run (SECRET_NO_SHOOT); }; void () army_run6 = [ 78, army_run7 ] { ai_run (15); }; void () army_run7 = [ 79, army_run8 ] { ai_run (TE_LAVASPLASH); }; void () army_run8 = [ 80, army_run1 ] { ai_run (SECRET_NO_SHOOT); }; void () army_atk1 = [ 81, army_atk2 ] { if (self.grenadetoggle > 0 && random()*4 <= 1) { LobAGrenade(); self.grenadetoggle = self.grenadetoggle - 1; } ai_face (); }; void () army_atk2 = [ 82, army_atk3 ] { ai_face (); }; void () army_atk3 = [ 83, army_atk4 ] { ai_face (); }; void () army_atk4 = [ 84, army_atk5 ] { ai_face (); }; void () army_atk5 = [ 85, army_atk6 ] { ai_face (); }; void () army_atk6 = [ 86, army_atk7 ] { ai_face (); }; void () army_atk7 = [ 87, army_atk8 ] { ai_face (); army_fire (120, 19); }; void () army_atk8 = [ 88, army_atk9 ] { ai_face (); }; void () army_atk9 = [ 89, army_run1 ] { ai_face (); }; void () army_atka1 = [ 81, army_atka2 ] { if (self.grenadetoggle > 0 && self.health < 70) { LobAGrenade(); self.grenadetoggle = self.grenadetoggle - 1; } ai_face (); }; void () army_atka2 = [ 82, army_atka3 ] { ai_face (); }; void () army_atka3 = [ 83, army_atka4 ] { ai_face (); }; void () army_atka4 = [ 84, army_atka5 ] { ai_face (); }; void () army_atka5 = [ 85, army_atka6 ] { ai_face (); army_fire2 (200, 7); }; void () army_atka6 = [ 86, army_atka7 ] { ai_face (); }; void () army_atka7 = [ 87, army_atka8 ] { ai_face (); }; void () army_atka8 = [ 88, army_atka9 ] { ai_face (); }; void () army_atka9 = [ 89, army_run1 ] { ai_face (); }; void () army_atkb1 = [ 81, army_atkb2 ] { if (self.grenadetoggle > 0 && self.health < 70) { LobAGrenade(); self.grenadetoggle = self.grenadetoggle - 1; } ai_face (); }; void () army_atkb2 = [ 82, army_atkb4 ] { ai_face (); }; void () army_atkb3 = [ 83, army_atkb4 ] { ai_face (); }; void () army_atkb4 = [ 84, army_atkb5 ] { ai_face (); }; void () army_atkb5 = [ 85, army_atkb6 ] { local float r; ai_face (); r = range (self.enemy); self.recoil = 0; if (r == RANGE_NEAR || r == RANGE_MELEE) self.recoil = 1; army_fire3 (100, 15); }; void () army_atkb6 = [ 86, army_atkb7 ] { ai_face (); if (self.recoil == 1) { army_fire3 (150, 14); army_fire3 (150, 14); } }; void () army_atkb7 = [ 87, army_atkb8 ] { ai_face (); if (self.recoil == 1) army_fire3 (150, 14); }; void () army_atkb8 = [ 88, army_atkb9 ] { ai_face (); if (self.recoil == 1) { army_fire3 (150, 14); army_fire3 (150, 14); } }; void () army_atkb9 = [ 89, army_run1 ] { ai_face (); if (self.recoil == 1) { army_fire3 (150, 14); army_fire3 (150, 14); } }; void () army_atkcs1 = [ 81, army_atkcs2 ] { if (self.grenadetoggle > 0 && self.health < 70) { LobAGrenade(); self.grenadetoggle = self.grenadetoggle - 1; } ai_face (); }; void () army_atkcs2 = [ 82, army_atkcs3 ] { ai_face (); }; void () army_atkcs3 = [ 83, army_atkcs4 ] { ai_face (); }; void () army_atkcs4 = [ 84, army_atkcs5 ] { ai_face (); }; void () army_atkcs5 = [ 85, army_atkcs6 ] { ai_face (); sound (self, CHAN_WEAPON, "weapons/ak112.wav", PLAT_LOW_TRIGGER, ATTN_NORM); army_fire4 (100, 20); }; void () army_atkcs6 = [ 85, army_atkcs7 ] { ai_face (); }; void () army_atkcs7 = [ 87, army_atkcs8 ] { ai_face (); }; void () army_atkcs8 = [ 88, army_atkcs9 ] { ai_face (); }; void () army_atkcs9 = [ 89, army_run1 ] { ai_face (); }; void () army_atkc1 = [ 81, army_atkc2 ] { ai_face (); }; void () army_atkc2 = [ 82, army_atkc3 ] { ai_face (); }; void () army_atkc3 = [ 83, army_atkc4 ] { ai_face (); }; void () army_atkc4 = [ 84, army_atkc5 ] { ai_face (); }; void () army_assault_rifle = { local float r; r = range (self.enemy); if (r == RANGE_FAR)//single shot at range army_atkcs1(); else//full-auto army_atkc1(); }; void () army_atkc5 = [ 85, army_atkc6 ] { ai_face (); sound (self, CHAN_WEAPON, "weapons/auto.wav", PLAT_LOW_TRIGGER, ATTN_NORM); army_fire4 (100, 16); }; void () army_atkc6 = [ 84, army_atkc7 ] { ai_face (); army_fire4 (140, 16); }; void () army_atkc7 = [ 85, army_atkc8 ] { ai_face (); army_fire4 (180, 16); }; void () army_atkc8 = [ 84, army_atkc9 ] { ai_face (); army_fire4 (220, 16); }; void () army_atkc9 = [ 85, army_atkc10 ] { ai_face (); army_fire4 (260, 16); }; void () army_atkc10 = [ 84, army_atkc11 ] { ai_face (); army_fire4 (300, 16); }; void () army_atkc11 = [ 85, army_atkc12 ] { ai_face (); army_fire4 (340, 16); }; void () army_atkc12 = [ 84, army_atkc13 ] { ai_face (); army_fire4 (380, 16); }; void () army_atkc13 = [ 86, army_atkc14 ] { ai_face (); }; void () army_atkc14 = [ 87, army_atkc15 ] { ai_face (); }; void () army_atkc15 = [ 88, army_atkc16 ] { ai_face (); }; void () army_atkc16 = [ 89, army_run1 ] { ai_face (); }; void () army_atkp1 = [ 81, army_atkp2 ] { if (self.grenadetoggle > 0 && self.health < 70) { LobAGrenade(); self.grenadetoggle = self.grenadetoggle - 1; } ai_face (); }; void () army_atkp2 = [ 82, army_atkp3 ] { ai_face (); }; void () army_atkp3 = [ 83, army_atkp4 ] { ai_face (); }; void () army_atkp4 = [ 84, army_atkp5 ] { ai_face (); }; void () army_atkp5 = [ 85, army_atkp6 ] { ai_face (); army_fire1 (300, 22); }; void () army_atkp6 = [ 86, army_atkp7 ] { ai_face (); }; void () army_atkp7 = [ 87, army_atkp8 ] { ai_face (); }; void () army_atkp8 = [ 88, army_atkp9 ] { ai_face (); }; void () army_atkp9 = [ 89, army_run1 ] { ai_face (); }; void () army_pain1 = [ 40, army_pain2 ] { }; void () army_pain2 = [ 41, army_pain3 ] { }; void () army_pain3 = [ 42, army_pain4 ] { }; void () army_pain4 = [ 43, army_pain5 ] { }; void () army_pain5 = [ 44, army_pain6 ] { }; void () army_pain6 = [ 45, army_run1 ] { ai_pain (PLAT_LOW_TRIGGER); }; void () army_painb1 = [ 46, army_painb2 ] { }; void () army_painb2 = [ 47, army_painb3 ] { ai_painforward (TE_LIGHTNINGBLOOD); }; void () army_painb3 = [ 48, army_painb4 ] { ai_painforward (TE_LIGHTNING3); }; void () army_painb4 = [ 49, army_painb5 ] { }; void () army_painb5 = [ 50, army_painb6 ] { }; void () army_painb6 = [ 51, army_painb7 ] { }; void () army_painb7 = [ 52, army_painb8 ] { }; void () army_painb8 = [ 53, army_painb9 ] { }; void () army_painb9 = [ 54, army_painb10 ] { }; void () army_painb10 = [ 55, army_painb11 ] { }; void () army_painb11 = [ 56, army_painb12 ] { }; void () army_painb12 = [ 57, army_painb13 ] { ai_pain (SILENT); }; void () army_painb13 = [ 58, army_painb14 ] { }; void () army_painb14 = [ 59, army_run1 ] { }; void () army_painc1 = [ 60, army_painc2 ] { }; void () army_painc2 = [ 61, army_painc3 ] { ai_pain (PLAT_LOW_TRIGGER); }; void () army_painc3 = [ 62, army_painc4 ] { }; void () army_painc4 = [ 63, army_painc5 ] { }; void () army_painc5 = [ 64, army_painc6 ] { ai_painforward (PLAT_LOW_TRIGGER); }; void () army_painc6 = [ 65, army_painc7 ] { ai_painforward (PLAT_LOW_TRIGGER); }; void () army_painc7 = [ 66, army_painc8 ] { }; void () army_painc8 = [ 67, army_painc9 ] { ai_pain (PLAT_LOW_TRIGGER); }; void () army_painc9 = [ 68, army_painc10 ] { ai_painforward (SECRET_1ST_DOWN); }; void () army_painc10 = [ 69, army_painc11 ] { ai_painforward (AS_MELEE); }; void () army_painc11 = [ 70, army_painc12 ] { ai_painforward (TE_LIGHTNING2); }; void () army_painc12 = [ 71, army_painc13 ] { ai_painforward (SECRET_NO_SHOOT); }; void () army_painc13 = [ 72, army_run1 ] { }; void (entity attacker, float damage) army_pain = { local float r; if ((self.pain_finished > time)) { return; } r = random (); if ((r < 0.05)) { self.pain_finished = (time + 0.6); army_pain1 (); sound (self, CHAN_VOICE, "player/paina.wav", PLAT_LOW_TRIGGER, ATTN_NORM); } else { if ((r < 0.1)) { self.pain_finished = (time + 1.1); army_painb1 (); sound (self, CHAN_VOICE, "player/painb.wav", PLAT_LOW_TRIGGER, ATTN_NORM); } } }; void () army_die1 = [ 8, army_die2 ] { if (random()*4 <= 2) sound (self, CHAN_VOICE, "player/agdie2.wav", 1, ATTN_NORM); else sound (self, CHAN_VOICE, "player/agdie3.wav", 1, ATTN_NORM); }; void () army_die2 = [ 9, army_die3 ] { self.rtime = 1; self.velocity_z = 50+random()*50; }; void () army_die3 = [ 10, army_die4 ] { }; void () army_die4 = [ 11, army_die5 ] { setsize (self, '-12 -12 -24', '12 12 -16'); }; void () army_die5 = [ 12, army_die6 ] { }; void () army_die6 = [ 13, army_die7 ] { }; void () army_die7 = [ 14, army_die8 ] { }; void () army_die8 = [ 15, army_die9 ] { }; void () army_die9 = [ 16, army_die10 ] { }; void () army_die10 = [ 17, army_die10 ] { }; void () army_cdie1 = [ 18, army_cdie2 ] { }; void () army_cdie2 = [ 19, army_cdie3 ] { self.rtime = 1; self.velocity_z = 50+random()*50; ai_back (MULTICAST_PVS_R); }; void () army_cdie3 = [ 20, army_cdie4 ] { ai_back (SECRET_1ST_DOWN); }; void () army_cdie4 = [ 21, army_cdie5 ] { setsize (self, '-12 -12 -24', '12 12 -16'); ai_back (TE_LIGHTNINGBLOOD); }; void () army_cdie5 = [ 22, army_cdie6 ] { ai_back (AS_MELEE); }; void () army_cdie6 = [ 23, army_cdie7 ] { ai_back (SECRET_1ST_DOWN); }; void () army_cdie7 = [ 24, army_cdie8 ] { }; void () army_cdie8 = [ 25, army_cdie9 ] { }; void () army_cdie9 = [ 26, army_cdie10 ] { }; void () army_cdie10 = [ 27, army_cdie11 ] { }; void () army_cdie11 = [ 28, army_cdie11 ] { }; void () grunt_pain = { local vector dir; if (self.rtime > 0) { if (random()*100<50) sound (self, CHAN_VOICE, "player/headshot.wav", 0.75, ATTN_NORM); else sound (self, CHAN_VOICE, "misc/thud.wav", 1, ATTN_NORM); SpawnBlood (self.origin + '0 0 8', 4); self.health = 180; return; } dir = normalize(self.origin - self.enemy.origin); self.velocity = dir * 120; if (self.frame == 41) { self.health = 180; self.frame = 42; self.think = army_die1; self.nextthink = time + 0.12; } else { self.health = 180; ThrowGib ("progs/zom_gib.mdl", -40); self.frame = 41; self.think = army_cdie1; self.nextthink = time + 0.12; } self.attack = self.attack + 1; if (self.attack >= 16) { self.solid = SOLID_NOT; army_cdie1(); ThrowGib ("progs/zom_gib.mdl", -35); ThrowGib ("progs/zom_gib.mdl", -35); ThrowGib ("progs/gib1.mdl", -35); } }; void (vector stuff, vector ang) spawn_live_grunt = { local entity grunt; grunt = spawn (); grunt.origin = stuff; grunt.enemy = self.enemy; grunt.attack_finished = time + 10; grunt.solid = SOLID_SLIDEBOX; grunt.movetype = MOVETYPE_STEP; grunt.takedamage = DAMAGE_YES; setmodel (grunt, "progs/soldier.mdl"); setsize (grunt, '-12 -12 -24', '12 12 28'); grunt.classname = "body"; grunt.netname = "dead"; grunt.health = 180; grunt.angles = ang; grunt.max_health = grunt.health; grunt.th_pain = grunt_pain; grunt.think = grunt_pain; grunt.th_die = corpse_gib; grunt.nextthink = time + 0.05; }; void () army_die = { local float r; r = random(); if (random()<0.75) DropMoney(); if (r <= 0.20) sound (self, CHAN_VOICE, "player/agdie1.wav", 1, ATTN_NORM); else if (r <= 0.40) sound (self, CHAN_VOICE, "player/agdie2.wav", 1, ATTN_NORM); else if (r <= 0.60) sound (self, CHAN_VOICE, "player/agdie3.wav", 1, ATTN_NORM); else if (r <= 0.80) sound (self, CHAN_VOICE, "player/agdie4.wav", 1, ATTN_NORM); else sound (self, CHAN_VOICE, "player/agdie5.wav", 1, ATTN_NORM); DeathThroes(); sound (self, CHAN_BODY, "", 1, ATTN_NORM); if (self.weapon == 1) DropFromChest(self, IID_WP_PIPERIFLE, 1); if (self.weapon == 2) DropFromChest(self, IID_WP_USP, 6); if (self.weapon == 3) DropFromChest(self, IID_WP_WINCHESTER, 1); if (self.weapon == 4) DropFromChest(self, IID_WP_MP9, 15); if (self.weapon == 5) DropFromChest(self, IID_WP_AK112, 12); if (self.weapon == 1) DropFromChest(self, IID_AM_44MAGNUM, 10); if (self.weapon == 2) DropFromChest(self, IID_AM_45ACP, 12); if (self.weapon == 3) DropFromChest(self, IID_AM_12GAUGESHELLS, 8); if (self.weapon == 4) DropFromChest(self, IID_AM_10MM, 15); if (self.weapon == 4) DropFromChest(self, IID_AM_10MM, 30); if (self.weapon == 5) DropFromChest(self, IID_AM_5MMHIGHVEL, 24); self.solid = SOLID_NOT; spawn_live_grunt(self.origin, self.angles); remove(self); }; void (vector jojo, entity friend) spawn_soldier = { local entity soldier; local entity te; soldier = spawn (); self = soldier; self.solid = SOLID_SLIDEBOX; self.movetype = MOVETYPE_STEP; setmodel (self, "progs/soldier.mdl"); setsize (self, '-12 -12 -24', '12 12 28'); self.health = 60+random()*30; self.netname = "raider"; self.max_health = self.health; self.armornoise = "misc/thud.wav"; self.th_stand = army_stand1; self.th_walk = army_walk1; self.th_run = army_run1; if (random()<0.3) self.has_radio = 1; if (self.has_radio == 0) self.th_missile = army_atk1; if (self.has_radio == 1) self.th_missile = army_radio1; self.th_pain = army_pain; self.th_die = army_die; self.origin = jojo + '0 64 0'; self.origin_z = self.origin_z + 1; droptofloor(); if (!walkmove(0, 0)) { self.origin = jojo + '0 -64 0'; self.origin_z = self.origin_z + 1; droptofloor(); if (!walkmove(0, 0)) { self.origin = jojo + '64 0 0'; self.origin_z = self.origin_z + 1; droptofloor(); if (!walkmove(0, 0)) { self.origin = jojo + '-64 0 0'; self.origin_z = self.origin_z + 1; droptofloor(); if (!walkmove(0, 0)) { remove(self); return; } } } } te = findradius (self.origin, 30); while (te) { if (te.classname == "player" || te.classname == "monster" && te.health > 0) { remove(self); return; } te = te.chain; } //soldiers have either 0, 1 or 2 grenades self.grenadetoggle = floor(random()*2); //soldiers have either pistol, smg, shotgun or rifle self.weapon = ceil(random()*4); if (self.weapon == 1) self.th_missile = army_atkp1; //rifle if (self.weapon == 2) self.th_missile = army_atk1; //pistol if (self.weapon == 3) self.th_missile = army_atka1; //shotgun if (self.weapon == 4) self.th_missile = army_atkb1; //smg self.mag1 = 8; if (self.weapon == 1) self.mag1 = 6+random()*6; if (self.weapon == 2) self.mag1 = 12+random()*12; if (self.weapon == 3) self.mag1 = 3+random()*3; if (self.weapon == 4) self.mag1 = 15+random()*15; self.maxmag1 = self.mag1; self.classname = "monster"; walkmonster_start_go (); self.angles_y = friend.angles_y; }; void () monster_army = { local float com; local entity te; if (self.zone == 0) { load_monster(); return; } local float x; local entity te; x = total_players; te = find(world, classname, "monster"); while (te) { if (te.netname == "commander") com = com + 1; te = find(te, classname, "monster"); } if (com == 0 && random()<0.50 && world.map_obj == OBJ_SHADOW) { monster_commander(); return; } else if (com == 1 && random()<0.25 && world.map_obj == OBJ_SHADOW) { monster_commander(); return; } if (random()*10 <= x*0.5) { precache_model2 ("progs/enforcer.mdl"); precache_model2 ("progs/h_mega.mdl"); precache_model2 ("progs/laser.mdl"); precache_sound2 ("enforcer/death1.wav"); precache_sound2 ("enforcer/enfire.wav"); precache_sound2 ("enforcer/enfstop.wav"); precache_sound2 ("enforcer/idle1.wav"); precache_sound2 ("enforcer/pain1.wav"); precache_sound2 ("enforcer/pain2.wav"); precache_sound2 ("enforcer/sight1.wav"); precache_sound2 ("enforcer/sight2.wav"); precache_sound2 ("enforcer/sight3.wav"); precache_sound2 ("enforcer/sight4.wav"); self.solid = SOLID_SLIDEBOX; self.movetype = MOVETYPE_STEP; self.team = 3; setmodel (self, "progs/enforcer.mdl"); self.classname = "monster"; self.netname = "enforcer"; setsize (self, '-12 -12 -24', '12 12 28'); self.health = 120; self.islot3 = SlotVal(IID_ARM_COMBAT, 1); self.armortype = 35; self.helmet = 1; self.th_stand = enf_stand1; self.th_walk = enf_walk1; self.th_run = enf_run1; self.th_pain = enf_pain; self.th_die = enf_die; self.th_missile = enf_atk1; self.armornoise = "misc/thud.wav"; walkmonster_start(); if (random()*4 <= 2) self.weapon = 5; else self.weapon = 6; self.th_missile = enf_atk1; self.mag1 = 24; self.maxmag1 = self.mag1; return; } precache_model ("progs/soldier.mdl"); precache_model ("progs/h_guard.mdl"); precache_model ("progs/gib1.mdl"); precache_model ("progs/gib2.mdl"); precache_model ("progs/gib3.mdl"); precache_sound ("soldier/death1.wav"); precache_sound ("soldier/idle.wav"); precache_sound ("soldier/pain1.wav"); precache_sound ("soldier/pain2.wav"); precache_sound ("soldier/sattck1.wav"); precache_sound ("soldier/sight1.wav"); precache_sound ("player/udeath.wav"); self.ammo_shells = 1; self.solid = SOLID_SLIDEBOX; self.classname = "monster"; self.netname = "raider"; self.movetype = MOVETYPE_STEP; setmodel (self, "progs/soldier.mdl"); setsize (self, '-12 -12 -24', '12 12 28'); self.health = 70+random()*30; self.team = 3; self.islot3 = SlotVal(IID_ARM_LEATHER, 1); self.armortype = 0.2; self.armornoise = "misc/thud.wav"; self.th_stand = army_stand1; self.th_walk = army_walk1; self.th_run = army_run1; if (random()<0.3) self.has_radio = 1; if (self.has_radio == 0) self.th_missile = army_atk1; if (self.has_radio == 1) self.th_missile = army_radio1; self.th_pain = army_pain; self.th_die = army_die; te = find (world, classname, "rhostage"); self.movetarget = te; walkmonster_start (); //soldiers have either 0, 1 or 2 grenades self.grenadetoggle = floor(random()*2); //soldiers have either pistol, smg, shotgun or rifle if (random()*100 >= 80) self.weapon = ceil(random()*4); else self.weapon = 2; if (self.weapon == 1) self.th_missile = army_atkp1; //pipe rifle if (self.weapon == 2) self.th_missile = army_atk1; //pistol if (self.weapon == 3) self.th_missile = army_atka1; //shotgun if (self.weapon == 4) self.th_missile = army_atkb1; //smg self.mag1 = 8; if (self.weapon == 1) self.mag1 = 1; if (self.weapon == 2) self.mag1 = 6+random()*6; if (self.weapon == 3) self.mag1 = 3+random()*3; if (self.weapon == 4) self.mag1 = 15+random()*15; //soldiers on shadow missions have full combat armor & assault rifles if (world.map_obj == OBJ_SHADOW) { if (random()<0.5) self.islot3 = SlotVal(IID_ARM_LEATHER, 1); else if (random()<0.5) self.islot3 = SlotVal(IID_ARM_METAL, 1); else self.islot3 = SlotVal(IID_ARM_COMBAT, 1); if (random()<0.25) self.weapon = 3; else if (random()<0.5) self.weapon = 4; else self.weapon = 5; if (self.weapon == 3) self.th_missile = army_atka1; //shotgun if (self.weapon == 4) self.th_missile = army_atkb1; //smg if (self.weapon == 5) self.th_missile = army_assault_rifle; //ak-112 assault rifle self.mag1 = 24; } self.maxmag1 = self.mag1; if (random()<0.25 && (world.map_obj != OBJ_SHADOW)) spawn_soldier(self.origin, self); if (random()<0.25 && world.map_obj == OBJ_HOSTAGE) spawn_civilian(self.origin); }; void() WalkTo_Think = { local entity ent; ent = nextent(world); while(ent) { if((ent.goalentity == self) || (ent.objective == self)) { self.nextthink = time + 2; return; } ent = nextent(ent); } remove(self); }; float(vector vec) hide_search = { local float flo; local vector vic; local entity ent; flo = random() * 1000; traceline(self.origin, self.origin + vec * flo, TRUE, self); vic = trace_endpos - normalize(trace_endpos - self.origin) * 32; traceline(vic, self.enemy.origin, TRUE, self); if (vlen(trace_endpos - self.enemy.origin) > 50) { makevectors(vec); ent = spawn(); // setmodel(ent, "progs/lavaball.mdl"); setorigin(ent, vic - v_forward * 8); ent.think = WalkTo_Think; ent.nextthink = time + 8; ent.classname = "runner"; // self.objective = ent; self.angles_y = vectoyaw(ent.origin - self.origin); self.goalentity = ent; // self.think = self.th_run; return TRUE; } return FALSE; }; void() find_hide = { local float flo; local vector vec, vac; flo = 5; makevectors(self.angles); while(flo) { vec = crandom() * v_right; vac = crandom() * v_forward; vec = vec + vac; if (hide_search(vec)) return; flo = flo - 1; } }; void () monster_commander = { if (self.zone == 0) { load_monster(); return; } precache_model2 ("progs/enforcer.mdl"); precache_model2 ("progs/h_mega.mdl"); precache_model2 ("progs/laser.mdl"); precache_sound2 ("enforcer/death1.wav"); precache_sound2 ("enforcer/enfire.wav"); precache_sound2 ("enforcer/enfstop.wav"); precache_sound2 ("enforcer/idle1.wav"); precache_sound2 ("enforcer/pain1.wav"); precache_sound2 ("enforcer/pain2.wav"); precache_sound2 ("enforcer/sight1.wav"); precache_sound2 ("enforcer/sight2.wav"); precache_sound2 ("enforcer/sight3.wav"); precache_sound2 ("enforcer/sight4.wav"); self.solid = SOLID_SLIDEBOX; self.movetype = MOVETYPE_STEP; self.team = 3; setmodel (self, "progs/enforcer.mdl"); self.classname = "monster"; self.netname = "commander"; commanders = commanders + 1; setsize (self, '-12 -12 -24', '12 12 32'); self.health = 120; self.islot3 = SlotVal(IID_ARM_COMBAT, 1); self.armortype = 0.5; self.helmet = 1; self.th_stand = enf_stand1; self.th_walk = enf_walk1; self.th_run = enf_run1; self.th_pain = enf_pain; self.th_die = enf_die; self.th_missile = enf_atk1; if (random()<0.9) self.weapon = 5; else if (random()<0.1) self.weapon = 3; else if (random()<0.1) self.weapon = 4; else if (random()<0.1) self.weapon = 6; else self.weapon = 5; self.th_missile = enf_atk1; self.mag1 = 24; self.maxmag1 = self.mag1; walkmonster_start(); spawn_soldier(self.origin, self); spawn_soldier(self.origin, self); spawn_soldier(self.origin, self); spawn_soldier(self.origin, self); return; }; #undef mag1 #undef maxmag1