/******************************************************************* * Decompiled By: Bog * Decompiled File: _attack_heli.gsc * Game: Call of Duty: Advanced Warfare * Platform: PC * Function Count: 74 * Decompile Time: 1118 ms * Timestamp: 4/22/2024 2:04:33 AM *******************************************************************/ //Function Number: 1 preload() { precacheitem("turret_attackheli"); precacheitem("missile_attackheli"); attack_heli_fx(); thread init(); } //Function Number: 2 attack_heli_fx() { if(getdvarint("sm_enable") && getdvar("r_zfeather") != "0") { level._effect["_attack_heli_spotlight"] = loadfx("fx/misc/hunted_spotlight_model"); return; } level._effect["_attack_heli_spotlight"] = loadfx("fx/misc/spotlight_large"); } //Function Number: 3 init() { if(isdefined(level.attackheliaiburstsize)) { return; } while(!isdefined(level.gameskill)) { wait(0.05); } if(!isdefined(level.cosine)) { level.cosine = []; } if(!isdefined(level.cosine["25"])) { level.cosine["25"] = cos(25); } if(!isdefined(level.cosine["35"])) { level.cosine["35"] = cos(35); } if(!isdefined(level.attackhelirange)) { level.attackhelirange = 3500; } if(!isdefined(level.attackhelikillsai)) { level.attackhelikillsai = 0; } if(!isdefined(level.attackhelifov)) { level.attackhelifov = cos(30); } level.attackheliaiburstsize = 1; level.attackhelimemory = 3; level.attackhelitargetreaquire = 6; level.attackhelimovetime = 3; switch(level.gameskill) { case 0: level.attackheliplayerbreak = 9; level.attackhelitimeout = 1; break; case 1: level.attackheliplayerbreak = 7; level.attackhelitimeout = 2; break; case 2: level.attackheliplayerbreak = 5; level.attackhelitimeout = 3; break; case 3: level.attackheliplayerbreak = 3; level.attackhelitimeout = 5; break; } } //Function Number: 4 start_attack_heli(param_00) { if(!isdefined(param_00)) { param_00 = "kill_heli"; } var_01 = maps\_vehicle::spawn_vehicle_from_targetname_and_drive(param_00); var_01 = begin_attack_heli_behavior(var_01); return var_01; } //Function Number: 5 begin_attack_heli_behavior(param_00,param_01) { param_00 endon("death"); param_00 endon("heli_players_dead"); if(level.gameskill == 0 || level.gameskill == 1) { var_02 = spawn("script_origin",param_00.origin + (0,0,-20)); var_02 linkto(param_00); param_00 thread common_scripts\utility::delete_on_death(var_02); var_03 = undefined; if(level.gameskill == 0) { var_03 = 2800; } else { var_03 = 2200; } if(!isdefined(param_00.no_attractor)) { param_00.attractor = missile_createattractorent(var_02,var_03,10000,level.player); if(maps\_utility::is_coop()) { param_00.attractor2 = missile_createattractorent(var_02,var_03,10000,level.player2); } } } param_00 enableaimassist(); param_00.startingorigin = spawn("script_origin",param_00.origin); param_00 thread common_scripts\utility::delete_on_death(param_00.startingorigin); if(!isdefined(param_00.circling)) { param_00.circling = 0; } param_00.allowshoot = 1; param_00.firingmissiles = 0; param_00.moving = 1; param_00.istakingdamage = 0; param_00.heli_lastattacker = undefined; param_00 thread notify_disable(); param_00 thread notify_enable(); thread kill_heli_logic(param_00,param_01); param_00.turrettype = undefined; param_00 heli_default_target_setup(); param_00 thread detect_player_death(); switch(param_00.vehicletype) { case "ny_harbor_hind": case "hind_blackice": case "hind": param_00.turrettype = "default"; break; case "mi28": case "nh90": case "mi17": param_00.turrettype = "default"; break; case "apache": param_00.turrettype = "default"; break; case "littlebird_spotlight": case "littlebird": param_00 setyawspeed(90,30,20); param_00 setmaxpitchroll(40,40); param_00 sethoverparams(100,20,5); param_00 setup_miniguns(); break; default: break; } param_00.etarget = param_00.targetdefault; if(isdefined(param_00.script_spotlight) && param_00.script_spotlight == 1 && !isdefined(param_00.spotlight)) { param_00 thread heli_spotlight_on(undefined,1); } param_00 thread attack_heli_cleanup(); return param_00; } //Function Number: 6 detect_player_death() { foreach(var_01 in level.players) { var_01 maps\_utility::add_wait(::maps\_utility::waittill_msg,"death"); } maps\_utility::do_wait_any(); self notify("heli_players_dead"); } //Function Number: 7 heli_default_target_setup() { var_00 = undefined; var_01 = undefined; switch(self.vehicletype) { case "ny_harbor_hind": case "hind_blackice": case "hind": var_01 = 600; var_00 = -100; break; case "mi28": case "nh90": case "mi17": var_01 = 600; var_00 = -100; break; case "apache": var_01 = 600; var_00 = -100; break; case "littlebird_spotlight": case "littlebird": var_01 = 600; var_00 = -204; break; default: break; } self.targetdefault = spawn("script_origin",self.origin); self.targetdefault.angles = self.angles; self.targetdefault.origin = self.origin; var_02 = spawnstruct(); var_02.entity = self.targetdefault; var_02.forward = var_01; var_02.up = var_00; var_02 maps\_utility::translate_local(); self.targetdefault linkto(self); self.targetdefault thread heli_default_target_cleanup(self); } //Function Number: 8 get_turrets() { if(isdefined(self.turrets)) { return self.turrets; } setup_miniguns(); return self.turrets; } //Function Number: 9 setup_miniguns() { self.turrettype = "miniguns"; self.minigunsspinning = 0; self.firingguns = 0; if(!isdefined(self.mgturret)) { return; } self.turrets = self.mgturret; common_scripts\utility::array_thread(self.turrets,::littlebird_turrets_think,self); } //Function Number: 10 heli_default_target_cleanup(param_00) { param_00 common_scripts\utility::waittill_either("death","crash_done"); if(isdefined(self)) { self delete(); } } //Function Number: 11 start_circling_heli(param_00,param_01) { if(!isdefined(param_00)) { param_00 = "kill_heli"; } var_02 = maps\_vehicle::spawn_vehicle_from_targetname_and_drive(param_00); var_02.startingorigin = spawn("script_origin",var_02.origin); var_02 thread common_scripts\utility::delete_on_death(var_02.startingorigin); var_02.circling = 1; var_02.allowshoot = 1; var_02.firingmissiles = 0; var_02 thread notify_disable(); var_02 thread notify_enable(); thread kill_heli_logic(var_02,param_01); return var_02; } //Function Number: 12 kill_heli_logic(param_00,param_01) { if(!isdefined(param_00)) { param_00 = maps\_vehicle::spawn_vehicle_from_targetname_and_drive("kill_heli"); param_00.allowshoot = 1; param_00.firingmissiles = 0; param_00 thread notify_disable(); param_00 thread notify_enable(); } var_02 = undefined; if(!isdefined(param_00.script_airspeed)) { var_02 = 40; } else { var_02 = param_00.script_airspeed; } if(!isdefined(level.enemy_heli_killed)) { level.enemy_heli_killed = 0; } if(!isdefined(level.commander_speaking)) { level.commander_speaking = 0; } if(!isdefined(level.enemy_heli_attacking)) { level.enemy_heli_attacking = 0; } level.attack_heli_safe_volumes = undefined; var_03 = getentarray("attack_heli_safe_volume","script_noteworthy"); if(var_03.size > 0) { level.attack_heli_safe_volumes = var_03; } if(!level.enemy_heli_killed) { thread dialog_nags_heli(param_00); } if(!isdefined(param_00.helicopter_predator_target_shader)) { switch(param_00.vehicletype) { case "mi28": case "nh90": case "mi17": target_set(param_00,(0,0,-80)); break; case "ny_harbor_hind": case "hind_blackice": case "hind": target_set(param_00,(0,0,-96)); break; case "apache": target_set(param_00,(0,0,-96)); break; case "littlebird_spotlight": case "littlebird": target_set(param_00,(0,0,-80)); break; default: break; } target_setjavelinonly(param_00,1); } param_00 thread heli_damage_monitor(); param_00 thread heli_death_monitor(); param_00 endon("death"); param_00 endon("heli_players_dead"); param_00 endon("returning_home"); param_00 setvehweapon("turret_attackheli"); if(!isdefined(param_00.circling)) { param_00.circling = 0; } if(!param_00.circling) { param_00 setneargoalnotifydist(100); if(!isdefined(param_00.dontwaitforpathend)) { param_00 waittill("reached_dynamic_path_end"); } } else { param_00 setneargoalnotifydist(500); param_00 waittill("near_goal"); } param_00 thread heli_shoot_think(); if(param_00.circling) { param_00 thread heli_circling_think(param_01,var_02); return; } param_00 thread heli_goal_think(var_02); } //Function Number: 13 heli_circling_think(param_00,param_01) { if(!isdefined(param_00)) { param_00 = "attack_heli_circle_node"; } var_02 = getentarray(param_00,"targetname"); if(!isdefined(var_02) || var_02.size < 1) { var_02 = common_scripts\utility::getstructarray(param_00,"targetname"); } var_03 = self; var_03 endon("stop_circling"); var_03 endon("death"); var_03 endon("returning_home"); var_03 endon("heli_players_dead"); for(;;) { var_03 vehicle_setspeed(param_01,param_01 / 4,param_01 / 4); var_03 setneargoalnotifydist(100); var_04 = maps\_utility::get_closest_player_healthy(var_03.origin); var_05 = var_04.origin; var_03 setlookatent(var_04); var_06 = common_scripts\utility::getclosest(var_05,var_02); var_07 = getentarray(var_06.target,"targetname"); if(!isdefined(var_07) || var_07.size < 1) { var_07 = common_scripts\utility::getstructarray(var_06.target,"targetname"); } var_08 = var_07[randomint(var_07.size)]; var_03 setvehgoalpos(var_08.origin,1); var_03 waittill("near_goal"); if(!isdefined(var_04.is_controlling_uav)) { wait(1); wait(randomfloatrange(0.8,1.3)); } } } //Function Number: 14 heli_goal_think(param_00) { self endon("death"); var_01 = getentarray("kill_heli_spot","targetname"); var_02 = self; var_03 = common_scripts\utility::getclosest(var_02.origin,var_01); var_04 = var_03; var_02 endon("death"); var_02 endon("returning_home"); var_02 endon("heli_players_dead"); var_05 = undefined; for(;;) { wait(0.05); var_02 vehicle_setspeed(param_00,param_00 / 2,param_00 / 10); var_02 setneargoalnotifydist(100); var_06 = maps\_utility::get_closest_player_healthy(var_02.origin); var_07 = var_06.origin; if(var_03 == var_04 && var_02.istakingdamage) { var_08 = get_linked_points(var_02,var_03,var_01,var_06,var_07); var_03 = common_scripts\utility::getclosest(var_07,var_08); } var_02 setvehgoalpos(var_03.origin,1); var_02.moving = 1; var_06 = maps\_utility::get_closest_player_healthy(var_02.origin); if(isdefined(self.etarget) && isdefined(self.etarget.classname) && self.etarget.classname == "script_origin") { var_05 = var_06; } else if(isdefined(self.etarget)) { var_05 = self.etarget; } else { var_05 = self.targetdefault; } var_02 setlookatent(var_05); var_02 waittill("near_goal"); var_02.moving = 0; if(!maps\_utility::is_coop()) { if(level.gameskill == 0 || level.gameskill == 1) { while(player_is_aiming_with_rocket(var_02)) { wait(0.5); } wait(3); } } var_06 = maps\_utility::get_closest_player_healthy(var_02.origin); var_07 = var_06.origin; var_08 = get_linked_points(var_02,var_03,var_01,var_06,var_07); var_08[var_08.size] = var_03; var_04 = var_03; var_09 = common_scripts\utility::getclosest(var_07,var_01); var_0A = common_scripts\utility::getclosest(var_07,var_08); foreach(var_0C in var_08) { if(var_06 sightconetrace(var_0C.origin,var_02) != 1) { var_08 = common_scripts\utility::array_remove(var_08,var_0C); continue; } } var_0E = common_scripts\utility::getclosest(var_07,var_08); if(var_08.size < 2) { var_03 = var_0A; } else if(var_0E != var_09) { var_03 = var_0E; } else { var_0F = []; var_0F[0] = var_0E; var_08 = common_scripts\utility::get_array_of_closest(var_07,var_08,var_0F,2); var_10 = randomint(var_08.size); if(randomint(100) > 50) { var_03 = var_08[var_10]; } else { var_03 = var_09; } } var_11 = randomfloatrange(level.attackhelimovetime - 0.5,level.attackhelimovetime + 0.5); common_scripts\utility::waittill_notify_or_timeout("damage_by_player",var_11); } } //Function Number: 15 player_is_aiming_with_rocket(param_00) { if(!level.player usingantiairweapon()) { return 0; } if(!level.player adsbuttonpressed()) { return 0; } var_01 = level.player geteye(); if(sighttracepassed(var_01,param_00.origin,0,level.player)) { return 1; } return 0; } //Function Number: 16 heli_shoot_think() { self endon("stop_shooting"); self endon("death"); self endon("heli_players_dead"); thread heli_missiles_think(); var_00 = level.attackhelirange * level.attackhelirange; level.attackheligraceperiod = 0; while(isdefined(self)) { wait(randomfloatrange(0.8,1.3)); if(!heli_has_target() || !heli_has_player_target()) { var_01 = heli_get_target_player_only(); if(isplayer(var_01)) { self.etarget = var_01; } } if(heli_has_player_target() && level.players.size > 1) { var_02 = maps\_utility::get_closest_player_healthy(self.origin); if(self.etarget != var_02) { var_01 = heli_get_target_player_only(); if(isplayer(var_01)) { self.etarget = var_01; } } } if(heli_has_player_target()) { if(!heli_can_see_target() || level.attackheligraceperiod == 1) { var_01 = heli_get_target_ai_only(); self.etarget = var_01; } } if(isdefined(self.heli_lastattacker) && isplayer(self.heli_lastattacker)) { self.etarget = self.heli_lastattacker; } else if(!heli_has_target()) { var_01 = heli_get_target_ai_only(); self.etarget = var_01; } if(!heli_has_target()) { continue; } if(self.etarget is_hidden_from_heli(self)) { continue; } if(heli_has_target() && distancesquared(self.etarget.origin,self.origin) > var_00) { continue; } if(self.turrettype == "default" && heli_has_player_target()) { miss_player(self.etarget); wait(randomfloatrange(0.8,1.3)); miss_player(self.etarget); wait(randomfloatrange(0.8,1.3)); while(can_see_player(self.etarget) && !self.etarget is_hidden_from_heli(self)) { fire_guns(); wait(randomfloatrange(2,4)); } continue; } if(isplayer(self.etarget) || isai(self.etarget)) { fire_guns(); } if(isplayer(self.etarget)) { thread player_grace_period(self); } common_scripts\utility::waittill_notify_or_timeout("damage_by_player",level.attackhelitargetreaquire); } } //Function Number: 17 player_grace_period(param_00) { level notify("player_is_heli_target"); level endon("player_is_heli_target"); level.attackheligraceperiod = 1; param_00 common_scripts\utility::waittill_notify_or_timeout("damage_by_player",level.attackheliplayerbreak); level.attackheligraceperiod = 0; } //Function Number: 18 heli_can_see_target() { if(!isdefined(self.etarget)) { return 0; } var_00 = self.etarget.origin + (0,0,32); if(isplayer(self.etarget)) { var_00 = self.etarget geteye(); } var_01 = self gettagorigin("tag_flash"); var_02 = sighttracepassed(var_01,var_00,0,self); return var_02; } //Function Number: 19 heli_has_player_target() { if(!isdefined(self.etarget)) { return 0; } if(isplayer(self.etarget)) { return 1; } return 0; } //Function Number: 20 heli_has_target() { if(!isdefined(self.etarget)) { return 0; } if(!isalive(self.etarget)) { return 0; } if(self.etarget == self.targetdefault) { return 0; } return 1; } //Function Number: 21 heli_get_target() { var_00 = maps\_helicopter_globals::getenemytarget(level.attackhelirange,level.attackhelifov,1,1,0,1,level.attackheliexcluders); if(isdefined(var_00) && isplayer(var_00)) { var_00 = self.targetdefault; } if(!isdefined(var_00)) { var_00 = self.targetdefault; } return var_00; } //Function Number: 22 heli_get_target_player_only() { var_00 = getaiarray("allies"); var_01 = maps\_helicopter_globals::getenemytarget(level.attackhelirange,level.attackhelifov,1,0,0,0,var_00); if(!isdefined(var_01)) { var_01 = self.targetdefault; } return var_01; } //Function Number: 23 heli_get_target_ai_only() { var_00 = maps\_helicopter_globals::getenemytarget(level.attackhelirange,level.attackhelifov,1,1,0,1,level.players); if(!isdefined(var_00)) { var_00 = self.targetdefault; } return var_00; } //Function Number: 24 heli_missiles_think() { if(!isdefined(self.script_missiles)) { return; } self endon("death"); self endon("heli_players_dead"); self endon("stop_shooting"); var_00 = undefined; var_01 = "turret_attackheli"; var_02 = "missile_attackheli"; var_03 = undefined; var_04 = undefined; var_05 = []; switch(self.vehicletype) { case "mi28": var_00 = 1; var_03 = 1; var_04 = 0.5; var_05[0] = "tag_store_L_2_a"; var_05[1] = "tag_store_R_2_a"; var_05[2] = "tag_store_L_2_b"; var_05[3] = "tag_store_R_2_b"; var_05[4] = "tag_store_L_2_c"; var_05[5] = "tag_store_R_2_c"; var_05[6] = "tag_store_L_2_d"; var_05[7] = "tag_store_R_2_d"; break; case "littlebird": case "apache": var_00 = 1; var_03 = 1; var_04 = 0.5; var_05[0] = "tag_missile_left"; var_05[1] = "tag_missile_right"; break; default: break; } var_06 = -1; for(;;) { wait(0.05); self waittill("fire_missiles",var_07); if(!isplayer(var_07)) { continue; } var_08 = var_07; if(!player_is_good_missile_target(var_08)) { continue; } for(var_09 = 0;var_09 < var_00;var_09++) { var_06++; if(var_06 >= var_05.size) { var_06 = 0; } self setvehweapon(var_02); self.firingmissiles = 1; var_0A = self fireweapon(var_05[var_06],var_08); var_0A thread missilelosetarget(var_04); var_0A thread missile_earthquake(); if(var_09 < var_00 - 1) { wait(var_03); } } self.firingmissiles = 0; self setvehweapon(var_01); wait(10); } } //Function Number: 25 player_is_good_missile_target(param_00) { if(self.moving) { return 0; } return 1; } //Function Number: 26 missile_earthquake() { if(distancesquared(self.origin,level.player.origin) > 9000000) { return; } var_00 = self.origin; while(isdefined(self)) { var_00 = self.origin; wait(0.1); } earthquake(0.7,1.5,var_00,1600); } //Function Number: 27 missilelosetarget(param_00) { self endon("death"); self endon("heli_players_dead"); wait(param_00); if(isdefined(self)) { self missile_cleartarget(); } } //Function Number: 28 get_different_player(param_00) { for(var_01 = 0;var_01 < level.players.size;var_01++) { if(param_00 != level.players[var_01]) { return level.players[var_01]; } } return level.players[0]; } //Function Number: 29 notify_disable() { self notify("notify_disable_thread"); self endon("notify_disable_thread"); self endon("death"); self endon("heli_players_dead"); for(;;) { self waittill("disable_turret"); self.allowshoot = 0; } } //Function Number: 30 notify_enable() { self notify("notify_enable_thread"); self endon("notify_enable_thread"); self endon("death"); self endon("heli_players_dead"); for(;;) { self waittill("enable_turret"); self.allowshoot = 1; } } //Function Number: 31 fire_guns() { switch(self.turrettype) { case "default": var_00 = randomintrange(5,10); var_01 = weaponfiretime("turret_attackheli"); turret_default_fire(self.etarget,var_00,var_01); break; case "miniguns": var_00 = getburstsize(self.etarget); if(self.allowshoot && !self.firingmissiles) { turret_minigun_fire(self.etarget,var_00); } break; default: break; } } //Function Number: 32 getburstsize(param_00) { var_01 = undefined; if(!isplayer(param_00)) { var_01 = level.attackheliaiburstsize; return var_01; } switch(level.gameskill) { case 3: case 2: case 1: case 0: var_01 = randomintrange(2,3); break; } return var_01; } //Function Number: 33 fire_missiles(param_00) { self endon("death"); self endon("heli_players_dead"); wait(param_00); if(!isplayer(self.etarget)) { return; } self notify("fire_missiles",self.etarget); } //Function Number: 34 turret_default_fire(param_00,param_01,param_02) { thread fire_missiles(randomfloatrange(0.2,2)); for(var_03 = 0;var_03 < param_01;var_03++) { self setturrettargetent(param_00,common_scripts\utility::randomvector(50) + (0,0,32)); if(self.allowshoot && !self.firingmissiles) { self fireweapon(); } wait(param_02); } } //Function Number: 35 turret_minigun_fire(param_00,param_01,param_02) { self endon("death"); self endon("heli_players_dead"); self notify("firing_miniguns"); self endon("firing_miniguns"); var_03 = get_turrets(); common_scripts\utility::array_thread(var_03,::turret_minigun_target_track,param_00,self); if(!self.minigunsspinning) { self.firingguns = 1; thread maps\_utility::play_sound_on_tag("littlebird_gatling_spinup","tag_flash"); wait(2.1); thread maps\_utility::play_loop_sound_on_tag("littlebird_minigun_spinloop","tag_flash"); } self.minigunsspinning = 1; if(!isdefined(param_02)) { param_02 = 3; } var_04 = 0.5; if(var_04 > param_02) { var_04 = param_02; } if(var_04 > 0) { wait(randomfloatrange(var_04,param_02)); } minigun_fire(param_00,param_01); var_03 = get_turrets(); common_scripts\utility::array_call(var_03,::stopfiring); thread minigun_spindown(param_00); self notify("stopping_firing"); } //Function Number: 36 minigun_fire(param_00,param_01) { self endon("death"); self endon("heli_players_dead"); if(isplayer(param_00)) { self endon("cant_see_player"); } var_02 = get_turrets(); common_scripts\utility::array_call(var_02,::startfiring); wait(randomfloatrange(1,2)); if(isplayer(param_00)) { thread target_track(param_00); } if(isplayer(param_00)) { var_03 = randomfloatrange(0.5,3); thread fire_missiles(var_03); } wait(param_01); } //Function Number: 37 target_track(param_00) { self endon("death"); self endon("heli_players_dead"); self endon("stopping_firing"); self notify("tracking_player"); self endon("tracking_player"); for(;;) { if(!can_see_player(param_00)) { break; } wait(0.5); } wait(level.attackhelitimeout); self notify("cant_see_player"); } //Function Number: 38 turret_minigun_target_track(param_00,param_01) { param_01 endon("death"); param_01 endon("heli_players_dead"); self notify("miniguns_have_new_target"); self endon("miniguns_have_new_target"); if(!isplayer(param_00) && isai(param_00) && level.attackhelikillsai == 0) { var_02 = spawn("script_origin",param_00.origin + (0,0,100)); var_02 linkto(param_00); thread minigun_ai_target_cleanup(var_02); param_00 = var_02; } for(;;) { wait(0.5); self settargetentity(param_00); } } //Function Number: 39 minigun_ai_target_cleanup(param_00) { common_scripts\utility::waittill_either("death","miniguns_have_new_target"); param_00 delete(); } //Function Number: 40 minigun_spindown(param_00) { self endon("death"); self endon("heli_players_dead"); self endon("firing_miniguns"); if(isplayer(param_00)) { wait(randomfloatrange(3,4)); } else { wait(randomfloatrange(1,2)); } thread minigun_spindown_sound(); self.firingguns = 0; } //Function Number: 41 minigun_spindown_sound() { self notify("stop soundlittlebird_minigun_spinloop"); self.minigunsspinning = 0; maps\_utility::play_sound_on_tag("littlebird_gatling_cooldown","tag_flash"); } //Function Number: 42 miss_player(param_00) { var_01 = anglestoforward(level.player.angles); var_02 = var_01 * 400; var_03 = var_02 + common_scripts\utility::randomvector(50); var_04 = randomintrange(10,20); var_05 = weaponfiretime("turret_attackheli"); for(var_06 = 0;var_06 < var_04;var_06++) { var_03 = var_02 + common_scripts\utility::randomvector(50); self setturrettargetent(param_00,var_03); if(self.allowshoot) { self fireweapon(); } wait(var_05); } } //Function Number: 43 can_see_player(param_00) { self endon("death"); self endon("heli_players_dead"); var_01 = self gettagorigin("tag_flash"); var_02 = (0,0,0); if(isplayer(param_00)) { var_02 = param_00 geteye(); } else { var_02 = param_00.origin; } if(sighttracepassed(var_01,var_02,0,undefined)) { return 1; } return 0; } //Function Number: 44 get_linked_points(param_00,param_01,param_02,param_03,param_04) { var_05 = []; var_06 = strtok(param_01.script_linkto," "); for(var_07 = 0;var_07 < param_02.size;var_07++) { for(var_08 = 0;var_08 < var_06.size;var_08++) { if(param_02[var_07].script_linkname == var_06[var_08]) { var_05[var_05.size] = param_02[var_07]; } } } foreach(var_0A in var_05) { if(var_0A.origin[2] < param_04[2]) { var_05 = common_scripts\utility::array_remove(var_05,var_0A); continue; } } return var_05; } //Function Number: 45 heli_damage_monitor() { self endon("death"); self endon("heli_players_dead"); self endon("crashing"); self endon("leaving"); self.damagetaken = 0; self.seen_attacker = undefined; for(;;) { self waittill("damage",var_00,var_01,var_02,var_03,var_04); if(!isdefined(var_01) || !isplayer(var_01)) { continue; } self notify("damage_by_player"); thread heli_damage_update(); thread can_see_attacker_for_a_bit(var_01); if(maps\_utility::is_damagefeedback_hud_enabled()) { var_01 thread updatedamagefeedbackhud(); } if(maps\_utility::is_damagefeedback_snd_enabled()) { var_01 thread updatedamagefeedbacksnd(); } } } //Function Number: 46 heli_damage_update() { self notify("taking damage"); self endon("taking damage"); self endon("death"); self endon("heli_players_dead"); self.istakingdamage = 1; wait(1); self.istakingdamage = 0; } //Function Number: 47 can_see_attacker_for_a_bit(param_00) { self notify("attacker_seen"); self endon("attacker_seen"); self.seen_attacker = param_00; self.heli_lastattacker = param_00; wait(level.attackhelimemory); self.heli_lastattacker = undefined; self.seen_attacker = undefined; } //Function Number: 48 is_hidden_from_heli(param_00) { if(isdefined(param_00.seen_attacker)) { if(param_00.seen_attacker == self) { return 0; } } if(isdefined(level.attack_heli_safe_volumes)) { foreach(var_02 in level.attack_heli_safe_volumes) { if(self istouching(var_02)) { return 1; } } } return 0; } //Function Number: 49 updatedamagefeedbackhud() { if(!isplayer(self)) { return; } self.hud_damagefeedback setshader("damage_feedback",24,48); self.hud_damagefeedback.alpha = 1; self.hud_damagefeedback fadeovertime(1); self.hud_damagefeedback.alpha = 0; } //Function Number: 50 updatedamagefeedbacksnd() { if(!isplayer(self)) { return; } self playlocalsound("player_feedback_hit_alert"); } //Function Number: 51 damage_feedback_setup() { for(var_00 = 0;var_00 < level.players.size;var_00++) { var_01 = level.players[var_00]; var_01.hud_damagefeedback = newclienthudelem(var_01); var_01.hud_damagefeedback.horzalign = "center"; var_01.hud_damagefeedback.vertalign = "middle"; var_01.hud_damagefeedback.x = -12; var_01.hud_damagefeedback.y = -12; var_01.hud_damagefeedback.alpha = 0; var_01.hud_damagefeedback.archived = 1; var_01.hud_damagefeedback setshader("damage_feedback",24,48); } } //Function Number: 52 heli_death_monitor() { self waittill("death"); level notify("attack_heli_destroyed"); level.enemy_heli_killed = 1; wait(15); level.enemy_heli_attacking = 0; } //Function Number: 53 dialog_nags_heli(param_00) { param_00 endon("death"); param_00 endon("heli_players_dead"); wait(30); if(!level.enemy_heli_attacking) { return; } commander_dialog("co_cf_cmd_heli_small_fire"); if(!level.enemy_heli_attacking) { return; } commander_dialog("co_cf_cmd_rpg_stinger"); wait(30); if(!level.enemy_heli_attacking) { return; } commander_dialog("co_cf_cmd_heli_wonders"); } //Function Number: 54 commander_dialog(param_00) { while(level.commander_speaking) { wait(1); } level.commander_speaking = 1; level.player playsound(param_00,"sounddone"); level.player waittill("sounddone"); wait(0.5); level.commander_speaking = 0; } //Function Number: 55 usingantiairweapon() { var_00 = self getcurrentweapon(); if(!isdefined(var_00)) { return 0; } if(issubstr(tolower(var_00),"rpg")) { return 1; } if(issubstr(tolower(var_00),"stinger")) { return 1; } if(issubstr(tolower(var_00),"at4")) { return 1; } return 0; } //Function Number: 56 heli_spotlight_cleanup(param_00) { common_scripts\utility::waittill_any("death","crash_done","turn_off_spotlight"); self.spotlight = undefined; if(isdefined(self)) { stopfxontag(common_scripts\utility::getfx("_attack_heli_spotlight"),self,param_00); } } //Function Number: 57 heli_spotlight_create_default_targets(param_00) { self endon("death"); self endon("heli_players_dead"); var_01 = self.targetdefault; if(isdefined(param_00)) { var_01 = param_00; } var_01.targetname = "original_ent"; self.left_ent = spawn("script_origin",var_01.origin); self.left_ent.origin = var_01.origin; self.left_ent.angles = var_01.angles; self.left_ent.targetname = "left_ent"; self.right_ent = spawn("script_origin",var_01.origin); self.right_ent.origin = var_01.origin; self.right_ent.angles = var_01.angles; self.right_ent.targetname = "right_ent"; var_02 = spawnstruct(); var_02.entity = self.left_ent; var_02.right = 250; var_02 maps\_utility::translate_local(); self.left_ent linkto(self); var_03 = spawnstruct(); var_03.entity = self.right_ent; var_03.right = -250; var_03 maps\_utility::translate_local(); self.right_ent linkto(self); var_04 = []; var_04[0] = var_01; var_04[1] = self.left_ent; var_04[2] = self.right_ent; level.spotlight_aim_ents = var_04; self.spottarget = var_01; } //Function Number: 58 heli_spotlight_destroy_default_targets() { if(isdefined(level.spotlight_aim_ents)) { foreach(var_01 in level.spotlight_aim_ents) { if(isdefined(var_01)) { var_01 delete(); } } } } //Function Number: 59 heli_spotlight_aim(param_00) { self endon("death"); self endon("heli_players_dead"); if(self.vehicletype != "littlebird") { return; } thread heli_spotlight_think(param_00); var_01 = undefined; for(;;) { wait(0.05); switch(self.vehicletype) { case "littlebird_spotlight": case "littlebird": var_01 = self.spottarget; break; default: var_01 = self.etarget; break; } if(isdefined(var_01)) { self setturrettargetent(var_01,(0,0,0)); } } } //Function Number: 60 heli_spotlight_think(param_00) { self endon("death"); self endon("heli_players_dead"); heli_spotlight_create_default_targets(); common_scripts\utility::array_thread(level.spotlight_aim_ents,::heli_spotlight_aim_ents_cleanup,self); if(isdefined(param_00)) { self thread [[ param_00 ]](); return; } for(;;) { wait(randomfloatrange(1,3)); if(heli_has_player_target() && !within_player_fov()) { self.spottarget = self.etarget; continue; } var_01 = randomint(level.spotlight_aim_ents.size); self.targetdefault = level.spotlight_aim_ents[var_01]; self.spottarget = self.targetdefault; } } //Function Number: 61 within_player_fov() { self endon("death"); self endon("heli_players_dead"); if(!isdefined(self.etarget)) { return 0; } if(!isplayer(self.etarget)) { return 0; } var_00 = self.etarget; var_01 = common_scripts\utility::within_fov(var_00 geteye(),var_00 getplayerangles(),self.origin,level.cosine["35"]); return var_01; } //Function Number: 62 heli_spotlight_aim_ents_cleanup(param_00) { param_00 common_scripts\utility::waittill_either("death","crash_done"); if(isdefined(self)) { self delete(); } } //Function Number: 63 littlebird_turrets_think(param_00) { var_01 = self; var_01 maps\_vehicle_code::turret_set_default_on_mode("manual"); if(isdefined(param_00.targetdefault)) { var_01 settargetentity(param_00.targetdefault); } var_01 setmode("manual"); param_00 waittill("death"); if(isdefined(param_00.firingguns) && param_00.firingguns == 1) { thread minigun_spindown_sound(); } } //Function Number: 64 attack_heli_cleanup() { common_scripts\utility::waittill_either("death","crash_done"); if(isdefined(self.attractor)) { missile_deleteattractor(self.attractor); } if(isdefined(self.attractor2)) { missile_deleteattractor(self.attractor2); } } //Function Number: 65 heli_default_missiles_on(param_00) { self endon("death"); self endon("heli_players_dead"); self endon("stop_default_heli_missiles"); self.preferredtarget = undefined; while(isdefined(self)) { wait(0.05); var_01 = undefined; var_02 = undefined; var_03 = undefined; self.preferredtarget = undefined; var_04 = undefined; if(isdefined(self.currentnode) && isdefined(self.currentnode.target)) { var_04 = maps\_utility::getent_or_struct(self.currentnode.target,"targetname"); } if(isdefined(var_04) && isdefined(var_04.script_linkto)) { self.preferredtarget = maps\_utility::getent_or_struct(var_04.script_linkto,"script_linkname"); } if(isdefined(self.preferredtarget)) { var_01 = self.preferredtarget; var_02 = var_01.script_shotcount; var_03 = var_01.script_delay; var_04 waittill("trigger"); continue; } common_scripts\utility::waittill_any("near_goal","goal"); if(isdefined(var_01)) { thread heli_fire_missiles(var_01,var_02,var_03,param_00); } } } //Function Number: 66 heli_default_missiles_off() { self notify("stop_default_heli_missiles"); } //Function Number: 67 heli_spotlight_on(param_00,param_01,param_02) { if(!isdefined(param_00)) { param_00 = "tag_barrel"; } if(!isdefined(param_01)) { param_01 = 0; } if(!isdefined(param_02)) { param_02 = 0; } playfxontag(common_scripts\utility::getfx("_attack_heli_spotlight"),self,param_00); self.spotlight = 1; thread heli_spotlight_cleanup(param_00); if(param_02) { self setturrettargetent(level.player); return; } if(param_01) { self endon("death"); self endon("heli_players_dead"); var_03 = self gettagorigin("tag_origin"); if(!isdefined(self.targetdefault)) { heli_default_target_setup(); } self setturrettargetent(self.targetdefault); thread heli_spotlight_aim(); } } //Function Number: 68 heli_spotlight_off() { self notify("turn_off_spotlight"); } //Function Number: 69 heli_spotlight_random_targets_on() { self endon("death"); self endon("heli_players_dead"); self endon("stop_spotlight_random_targets"); if(!isdefined(self.targetdefault)) { thread heli_default_target_setup(); } if(!isdefined(self.left_ent)) { thread heli_spotlight_think(); } while(isdefined(self)) { wait(0.05); self setturrettargetent(self.targetdefault,(0,0,0)); } } //Function Number: 70 heli_spotlight_random_targets_off() { self notify("stop_spotlight_random_targets"); } //Function Number: 71 heli_fire_missiles(param_00,param_01,param_02,param_03) { self endon("death"); self endon("heli_players_dead"); if(isdefined(self.defaultweapon)) { var_04 = self.defaultweapon; } else { var_04 = "turret_attackheli"; } var_05 = "missile_attackheli"; if(isdefined(param_03)) { var_05 = param_03; } var_06 = undefined; var_07 = []; self setvehweapon(var_04); if(!isdefined(param_01)) { param_01 = 1; } if(!isdefined(param_02)) { param_02 = 1; } if(!isdefined(param_00.classname)) { if(!isdefined(self.dummytarget)) { self.dummytarget = spawn("script_origin",param_00.origin); thread common_scripts\utility::delete_on_death(self.dummytarget); } self.dummytarget.origin = param_00.origin; param_00 = self.dummytarget; } switch(self.vehicletype) { case "mi28": var_06 = 0.5; var_07[0] = "tag_store_L_2_a"; var_07[1] = "tag_store_R_2_a"; var_07[2] = "tag_store_L_2_b"; var_07[3] = "tag_store_R_2_b"; var_07[4] = "tag_store_L_2_c"; var_07[5] = "tag_store_R_2_c"; var_07[6] = "tag_store_L_2_d"; var_07[7] = "tag_store_R_2_d"; break; case "littlebird": case "apache": var_06 = 0.5; var_07[0] = "tag_missile_left"; var_07[1] = "tag_missile_right"; break; case "hind_battle": var_07[0] = "tag_missile_left"; var_07[1] = "tag_missile_right"; break; default: break; } var_08 = -1; for(var_09 = 0;var_09 < param_01;var_09++) { var_08++; if(var_08 >= var_07.size) { var_08 = 0; } self setvehweapon(var_05); self.firingmissiles = 1; var_0A = self fireweapon(var_07[var_08],param_00); var_0A thread missile_earthquake(); if(var_09 < param_01 - 1) { wait(param_02); } } self.firingmissiles = 0; self setvehweapon(var_04); } //Function Number: 72 boneyard_style_heli_missile_attack() { self waittill("trigger",var_00); var_01 = common_scripts\utility::getstructarray(self.target,"targetname"); var_01 = maps\_utility::array_index_by_script_index(var_01); boneyard_fire_at_targets(var_00,var_01); } //Function Number: 73 boneyard_style_heli_missile_attack_linked() { self waittill("trigger",var_00); var_01 = maps\_utility::get_linked_structs(); var_01 = maps\_utility::array_index_by_script_index(var_01); boneyard_fire_at_targets(var_00,var_01); } //Function Number: 74 boneyard_fire_at_targets(param_00,param_01) { var_02 = []; var_02[0] = "tag_missile_right"; var_02[1] = "tag_missile_left"; if(param_00.vehicletype == "cobra") { var_02[0] = "tag_store_L_1_a"; var_02[1] = "tag_store_R_1_a"; } var_03 = []; for(var_04 = 0;var_04 < param_01.size;var_04++) { var_03[var_04] = spawn("script_origin",param_01[var_04].origin); param_00 setvehweapon("littlebird_FFAR"); param_00 setturrettargetent(var_03[var_04]); var_05 = param_00 fireweapon(var_02[var_04 % var_02.size],var_03[var_04],(0,0,0)); var_05 common_scripts\utility::delaycall(1,::missile_cleartarget); wait(randomfloatrange(0.2,0.3)); } wait(2); foreach(var_07 in var_03) { var_07 delete(); } }