/******************************************************************* * Decompiled By: Bog * Decompiled File: _attack_drone_controllable.gsc * Game: Call of Duty: Advanced Warfare * Platform: PC * Function Count: 54 * Decompile Time: 813 ms * Timestamp: 4/22/2024 2:04:28 AM *******************************************************************/ //Function Number: 1 controllable_drone_swarm_init() { setsaveddvar("r_hudoutlineenable",1); setsaveddvar("r_hudoutlinewidth",20); setsaveddvar("r_hudoutlinecloakblurradius",0.35); if(!isdefined(level.boid_settings_presets)) { level.boid_settings_presets = []; } level.boid_settings_presets["controllable_swarm"] = spawnstruct(); level.boid_settings_presets["controllable_swarm"].neighborhood_radius = 78; level.boid_settings_presets["controllable_swarm"].separation_factor = 3000; level.boid_settings_presets["controllable_swarm"].alignment_factor = 0.02; level.boid_settings_presets["controllable_swarm"].cohesion_factor = 0.0001; level.boid_settings_presets["controllable_swarm"].queen_factor = 10; level.boid_settings_presets["controllable_swarm"].queen_deadzone = 64; level.boid_settings_presets["controllable_swarm"].random_factor = 50; level.boid_settings_presets["controllable_swarm"].max_accel = 2400; level.boid_settings_presets["controllable_swarm"].min_speed = 52.8; level.boid_settings_presets["controllable_swarm"].max_speed = 396; level.boid_settings_presets["controllable_swarm"].dodge_player_shots = 0; level.boid_settings_presets["controllable_swarm"].emp_mode = 0; level.boid_settings_presets["controllable_swarm"].queen_relative_speed = 1; level.boid_settings_presets["controllable_swarm"].queen_data_accel = 5; level.boid_settings_presets["controllable_swarm"].queen_data_decel = 5; level.boid_settings_presets["controllable_swarm"].queen_data_desired_speed = 15; level.boid_settings_presets["controllable_swarm"].queen_data_follow_radii = 75; level.fully_controllable_swarm = 0; level.swarm_spawned = 0; level.controllable_drone_hud = "drone_hud_controllable_overlay_2"; level.controllable_drone_activated = "drone_hud_controllable_overlay_1"; level.controllable_hud_target_shader = "jet_hud_hex_blue"; level.controllable_drone_swarm_target = []; if(!common_scripts\utility::flag_exist("cloud_in_formation")) { common_scripts\utility::flag_init("cloud_in_formation"); } maps\_utility::ent_flag_init("controllable_drones_go"); common_scripts\utility::flag_init("controllable_swarm_activated"); common_scripts\utility::flag_init("player_attack_think_running"); common_scripts\utility::flag_init("controlling_drones"); common_scripts\utility::flag_init("controlling_drones_first_time"); level.controllable_drones = []; level.expected_drones = level.attack_drones_num_queens * level.attack_drones_num_drones_per_queen; precacheitem("iw5_attackdronemagicbullet"); precacheshader(level.controllable_drone_hud); precacheshader(level.controllable_drone_activated); precacheshader(level.controllable_hud_target_shader); precacheshader("sat_hud_xray_blue"); precacheshader("jet_hud_hex_orange"); precacheshader("jet_hud_missile_circle"); precacheitem("remote_missile_drone"); precache_icons(); vehicle_scripts\_attack_drone_common::drone_fx(); level.scr_animtree["drone_control_view_model"] = #animtree; level.scr_model["drone_control_view_model"] = "viewhands_s1_pmc"; level.scr_anim["drone_control_view_model"]["drone_control_on"] = %vm_turn_on_cloak; } //Function Number: 2 precache_icons() { precacheshader("drone_hud_locking_on_1"); precacheshader("drone_hud_locking_on_2"); precacheshader("drone_hud_locking_on_3"); precacheshader("drone_hud_locking_on_4"); precacheshader("drone_hud_locking_on_5"); precacheshader("drone_hud_locking_on_6"); precacheshader("drone_hud_locking_on_7"); precacheshader("drone_hud_locking_on_8"); precacheshader("drone_hud_locking_on_9"); precacheshader("drone_hud_locking_on_10"); precacheshader("drone_hud_locking_on_11"); precacheshader("drone_hud_locking_on_12"); precacheshader("drone_hud_locking_on_13"); precacheshader("drone_hud_locking_on_14"); precacheshader("drone_hud_locking_on_15"); precacheshader("drone_hud_locking_on_16"); precacheshader("drone_hud_npc_lockon"); precacheshader("drone_hud_veh_lockon"); level.drone_lockon_icons = ["drone_hud_locking_on_2","drone_hud_locking_on_4","drone_hud_locking_on_6","drone_hud_locking_on_8","drone_hud_locking_on_10","drone_hud_locking_on_12","drone_hud_locking_on_14","drone_hud_locking_on_16"]; } //Function Number: 3 kill_controllable_drone_swarm() { level.controllable_cloud_queen notify("end_drone_swarm"); level notify("delete_drone_cloud"); common_scripts\utility::array_thread(level.controllable_drones,::maps\_shg_design_tools::delete_auto); common_scripts\utility::array_thread(level.drone_swarm_queens,::maps\_shg_design_tools::delete_auto); common_scripts\utility::array_removeundefined(level.controllable_drones); common_scripts\utility::array_removeundefined(level.drone_swarm_queens); } //Function Number: 4 ad_offset_position_from_tag(param_00,param_01,param_02) { var_03 = self gettagangles(param_01); var_04 = self gettagorigin(param_01); if(param_00 == "up") { return var_04 + anglestoup(var_03) * param_02; } if(param_00 == "down") { return var_04 + anglestoup(var_03) * param_02 * -1; } if(param_00 == "right") { return var_04 + anglestoright(var_03) * param_02; } if(param_00 == "left") { return var_04 + anglestoright(var_03) * param_02 * -1; } if(param_00 == "forward") { return var_04 + anglestoforward(var_03) * param_02; } if(param_00 == "backward") { return var_04 + anglestoforward(var_03) * param_02 * -1; } if(param_00 == "backwardright") { var_04 = var_04 + anglestoright(var_03) * param_02; return var_04 + anglestoforward(var_03) * param_02 * -1; } if(param_00 == "backwardleft") { var_04 = var_04 + anglestoright(var_03) * param_02 * -1; return var_04 + anglestoforward(var_03) * param_02 * -1; } if(param_00 == "forwardright") { var_04 = var_04 + anglestoright(var_03) * param_02 * 1; return var_04 + anglestoforward(var_03) * param_02; } if(param_00 == "forwardleft") { var_04 = var_04 + anglestoright(var_03) * param_02 * -1; return var_04 + anglestoforward(var_03) * param_02; } } //Function Number: 5 setup_drone_swarm_crates() { level.controllable_drone_spawners = getentarray("drone_crate_spawner","targetname"); var_00 = getentarray("vol_drone_crate_reinforcements","targetname"); foreach(var_02 in level.controllable_drone_spawners) { var_02 make_drone_crate(level.controllable_drone_spawners); } foreach(var_05 in var_00) { var_05 make_drone_crate_group(level.controllable_drone_spawners); var_05 thread waittill_crate_activated(); } level notify("queen_drone_selected",self); level.player swarm_drone_hud_on(level.controllable_drone_activated); } //Function Number: 6 make_drone_crate_group(param_00) { self.drone_spawners = []; self.path = undefined; foreach(var_02 in param_00) { if(var_02 istouching(self)) { self.drone_spawners[self.drone_spawners.size] = var_02; } } var_04 = common_scripts\utility::getstructarray("struct_drone_crate_reinforcements","targetname"); var_05 = common_scripts\utility::spawn_tag_origin(); foreach(var_07 in var_04) { var_05.origin = var_07.origin; if(var_05 istouching(self)) { self.path = var_07; } } } //Function Number: 7 make_drone_crate(param_00) { var_01 = getentarray("drone_crate_trigger","targetname"); self.trigger = getclosestdrone(self.origin,var_01,500); self.vols = getentarray("drone_crate_volume","targetname"); var_02 = getentarray("drone_crate_drone","targetname"); self.include = getent("vol_include_drones","targetname"); self.my_vol = getclosestdrone(self.origin,self.vols,500); self.my_orgs = func_4137(var_02,self.my_vol); self.nodes = maps\_shg_design_tools::getthingarray("drone_crate_path","targetname"); self.node = getclosestdrone(self.my_vol.origin,self.nodes,500); } //Function Number: 8 waittill_crate_activated() { while(!level.player istouching(self)) { wait 0.05; } drone_cloud_controllable(); } //Function Number: 9 handle_controllable_cloud_queen_pathing() { level.controllable_cloud_queen endon("death"); var_00 = common_scripts\utility::getstructarray("struct_drone_crate_masterpath1","targetname"); var_01 = level.player common_scripts\utility::spawn_tag_origin(); for(;;) { if(!level.controllable_cloud_queen.is_player_controlled) { var_01.origin = level.player.origin; var_01.angles = level.player getgunangles(); var_02 = var_01 maps\_shg_design_tools::offset_position_from_tag("forward","tag_origin",300); var_03 = maps\_shg_design_tools::getclosestauto(var_02,var_00,1000); if(isdefined(var_03)) { thread queen_change_path(var_03,20); } } wait(2); } } //Function Number: 10 drone_cloud_controllable() { var_00 = spawn_controllable_drone_cloud(); if(!isdefined(level.controllable_cloud_queen)) { level.controllable_cloud_queen = var_00[0]; level.controllable_cloud_queen.is_player_controlled = 0; level.controllable_cloud_queen show(); thread handle_controllable_cloud_queen_pathing(); } if(!isdefined(level.drone_swarm_queens)) { level.drone_swarm_queens = var_00; } else { level.drone_swarm_queens = common_scripts\utility::array_combine(level.drone_swarm_queens,var_00); } foreach(var_02 in var_00) { while(!isdefined(var_02.boid_cloud_spawned)) { wait 0.05; } } wait(4); common_scripts\utility::array_thread(var_00,::controllable_fly_think,level.controllable_cloud_queen,level.boid_settings_presets["controllable_swarm"].queen_data_follow_radii); level.controllable_cloud_queen.drones = level.controllable_drones; level.player thread player_attack_think(); level notify("drone_swarm_spawned"); level.swarm_spawned = 1; } //Function Number: 11 queen_change_path(param_00,param_01) { if(isdefined(level.controllable_cloud_queen)) { if(!isdefined(param_01)) { param_01 = 25; } level.controllable_cloud_queen notify("end_queen_think"); level.controllable_cloud_queen.attachedpath = undefined; var_02 = level.player getgunangles()[1]; level.controllable_cloud_queen vehicle_helisetai(param_00.origin,param_01,param_01 / 2,param_01 * 2,0,1,var_02,0,0,1,0,0,1); } } //Function Number: 12 getdroneperlinovertime(param_00,param_01,param_02,param_03) { if(!isdefined(param_03)) { param_03 = 1; } var_04 = (perlinnoise2d(gettime() * 0.001 * 0.05,10,param_00,param_01,param_02) * param_03,perlinnoise2d(gettime() * 0.001 * 0.05,20,param_00,param_01,param_02) * param_03,perlinnoise2d(gettime() * 0.001 * 0.05,30,param_00,param_01,param_02) * param_03); return var_04; } //Function Number: 13 spawn_controllable_drone_cloud() { var_00 = self.drone_spawners; var_01 = self.drone_spawners.size; var_02 = []; for(var_03 = 0;var_03 < var_01;var_03++) { var_00[var_03].count = 1; var_04 = var_00[var_03] maps\_utility::spawn_vehicle(); var_04.location = int(120 / var_01 * var_03); var_04.num_in_formation = var_01; var_04 thread make_crate_boidcloud(var_00[var_03].my_orgs); var_04 thread vehicle_scripts\_attack_drone_common::make_queen_invulnerable(); var_04.can_be_damaged = 1; var_04.script_team = "allies"; var_02[var_02.size] = var_04; var_04 hide(); wait(0.1); } return var_02; } //Function Number: 14 func_4137(param_00,param_01,param_02) { var_03 = undefined; if(isdefined(param_02) && param_02) { var_03 = common_scripts\utility::spawn_tag_origin(); } var_04 = []; foreach(var_06 in param_00) { if(isdefined(var_03)) { var_03.origin = var_06.origin; var_07 = var_03; } else { var_07 = var_06; } if(var_07 istouching(param_01)) { var_04[var_04.size] = var_06; } } if(isdefined(var_03)) { var_03 delete(); } return var_04; } //Function Number: 15 player_linkto_drone_missile(param_00) { if(level.player.is_driving_pdrone) { level.player maps\_utility::player_dismount_vehicle(); level.player.is_driving_pdrone = 0; } level.player maps\_shg_utility::setup_player_for_scene(); level.player playerlinktoabsolute(param_00,"tag_origin"); } //Function Number: 16 player_unlink_from_drone_missile() { level.player unlink(); level.player maps\_shg_utility::setup_player_for_gameplay(); } //Function Number: 17 prep_user_for_dronecrate() { self disableweapons(); self.ignoreme = 1; self enableinvulnerability(); var_00 = getaiarray("axis"); } //Function Number: 18 remove_user_from_dronecrate() { self enableweapons(); self.ignoreme = 0; self disableinvulnerability(); } //Function Number: 19 monitor_drone_depletion(param_00) { param_00 endon("death"); while(param_00.drones.size <= 0) { wait 0.05; } while(param_00.drones.size > 0) { param_00.drones = common_scripts\utility::array_removeundefined(param_00.drones); wait 0.05; } param_00 notify("end_drone_swarm"); } //Function Number: 20 swarm_drone_hud_on(param_00) { var_01 = 50000; var_02 = 60; self.dronecrate_hud["overlay1"] = newclienthudelem(self); self.dronecrate_hud["overlay1"] setshader(param_00,640,480); self.dronecrate_hud["overlay1"].alignx = "left"; self.dronecrate_hud["overlay1"].aligny = "top"; self.dronecrate_hud["overlay1"].x = 0; self.dronecrate_hud["overlay1"].y = 0; self.dronecrate_hud["overlay1"].horzalign = "fullscreen"; self.dronecrate_hud["overlay1"].vertalign = "fullscreen"; self.dronecrate_hud["overlay1"].alpha = 0.5; self.dronecrate_hud["num_drones"] = newclienthudelem(self); self.dronecrate_hud["num_drones"].alignx = "left"; self.dronecrate_hud["num_drones"].aligny = "top"; self.dronecrate_hud["num_drones"].x = 10; self.dronecrate_hud["num_drones"].y = 110; self.dronecrate_hud["num_drones"].fontscale = 2; thread monitor_num_activated_drones(); } //Function Number: 21 monitor_num_activated_drones() { for(;;) { self.dronecrate_hud["num_drones"] settext("Drones: " + level.controllable_drones.size); wait 0.05; } } //Function Number: 22 swarm_drone_hud_change(param_00) { self.dronecrate_hud["overlay1"] setshader(param_00,640,480); } //Function Number: 23 swarm_drone_hud_off(param_00) { common_scripts\utility::array_call(self.dronecrate_hud,::destroy); } //Function Number: 24 get_drones_into_start_positions(param_00,param_01,param_02,param_03,param_04) { wait(randomfloat(param_01 / 2)); param_00 = self.origin + (randomintrange(-20,20),randomintrange(-20,20),20 + param_01 * 12); vehicle_scripts\_attack_drone_common::drone_lerp_to_position((self.origin[0],self.origin[1],param_00[2]),50); self rotateto(param_02.angles,1,0.1,0.5); wait(1); vehicle_scripts\_attack_drone_common::drone_lerp_to_position(param_00,50); param_03 vehicle_scripts\_attack_drone_common::add_to_flock(self); } //Function Number: 25 attack_hint_display() { for(;;) { common_scripts\utility::flag_waitopen("controlling_drones"); common_scripts\utility::flag_wait("controlling_drones"); maps\_utility::hint("Press ^3[{+attack}]^7 to launch a drone at each locked on target"); level.player common_scripts\utility::waittill_any("attack_pressed","dpad_down"); maps\_utility::hint_fade(); } } //Function Number: 26 drone_enabled_animation() { level.player disableweapons(); level.player waittill("weapon_change"); var_00 = maps\_utility::spawn_anim_model("drone_control_view_model"); var_00 linktoplayerview(level.player,"tag_origin",(0,0,0),(0,0,0),1); level.player maps\_anim::anim_single_solo(var_00,"drone_control_on"); level.player enableweapons(); var_00 unlink(); var_00 delete(); } //Function Number: 27 setup_drone_mode() { foreach(var_01 in level.controllable_drones) { if(isdefined(var_01)) { var_01 maps\_vehicle::godon(); var_01 thermaldrawenable(); } } foreach(var_04 in level.controllable_drone_swarm_target) { if(isdefined(var_04)) { var_04 thermaldrawenable(); } } wait 0.05; level.player thermalvisionon(); level.player swarm_drone_hud_change(level.controllable_drone_hud); } //Function Number: 28 remove_drone_mode() { var_00 = level.player.drone_locked_targets; foreach(var_02 in var_00) { if(isdefined(var_02) && target_istarget(var_02)) { target_remove(var_02); } } level.player.drone_locked_targets = []; level.player thermalvisionoff(); level.player swarm_drone_hud_change(level.controllable_drone_activated); } //Function Number: 29 handle_drone_target_selection() { var_00 = getaiarray("axis"); level.controllable_drone_swarm_target = maps\_utility::array_removedead(level.controllable_drone_swarm_target); var_01 = common_scripts\utility::array_combine(level.controllable_drone_swarm_target,var_00); var_01 = common_scripts\utility::array_removeundefined(var_01); var_01 = common_scripts\utility::array_remove_duplicates(var_01); level.player.drone_locked_targets = []; foreach(var_03 in var_01) { if(isdefined(var_03.ridingvehicle)) { var_01 = common_scripts\utility::array_remove(var_01,var_03); } } handle_drone_target_selection_internal(var_01); foreach(var_03 in var_01) { if(isdefined(var_03) && target_istarget(var_03)) { target_remove(var_03); } } if(common_scripts\utility::flag("drone_swarm_launched")) { level waittill("drone_swarm_launch_seq_complete"); } } //Function Number: 30 handle_drone_target_selection_internal(param_00) { level.player endon("dpad_down"); level endon("drone_swarm_launched"); level.player endon("drone_killed_by_death"); var_01 = common_scripts\utility::spawn_tag_origin(); target_set(var_01); target_hidefromplayer(var_01,level.player); foreach(var_03 in param_00) { var_03.lock_on_stage = 0; } for(;;) { foreach(var_03 in param_00) { if(!isdefined(var_03) || var_03.lock_on_stage == level.drone_lockon_icons.size) { continue; } var_01.origin = var_03.origin; var_06 = level.controllable_cloud_queen vehicle_scripts\_pdrone_player::pdrone_player_get_current_fov(); var_07 = 60; var_08 = target_isincircle(var_01,level.player,var_06,var_07); var_08 = var_08 && level.player.drone_locked_targets.size < level.controllable_drones.size; if(var_08) { if(var_03.lock_on_stage == 0) { target_set(var_03,(0,0,32)); } var_03.lock_on_stage++; if(var_03.lock_on_stage == level.drone_lockon_icons.size) { if(var_03 maps\_vehicle::isvehicle()) { target_setshader(var_03,"drone_hud_veh_lockon"); } else { target_setshader(var_03,"drone_hud_npc_lockon"); } level.player.drone_locked_targets[level.player.drone_locked_targets.size] = var_03; level.player notify("drone_target_aquired"); } else { target_setshader(var_03,level.drone_lockon_icons[var_03.lock_on_stage]); } continue; } if(target_istarget(var_03)) { var_03.lock_on_stage = 0; target_remove(var_03); } } wait 0.05; } } //Function Number: 31 waittill_attack_and_launch_drones() { common_scripts\utility::flag_clear("drone_swarm_launched"); level.player waittill("attack_pressed"); level.player.drone_locked_targets = common_scripts\utility::array_removeundefined(level.player.drone_locked_targets); level.player.drone_locked_heli_target = undefined; foreach(var_01 in level.player.drone_locked_targets) { if(var_01 maps\_vehicle::isvehicle() && var_01 maps\_vehicle::ishelicopter()) { level.player.drone_locked_heli_target = var_01; level.player.drone_locked_targets = common_scripts\utility::array_remove(level.player.drone_locked_targets,var_01); break; } } if(level.player.drone_locked_targets.size > 0) { common_scripts\utility::flag_set("drone_swarm_launched"); var_03 = level.player.drone_locked_targets.size - 1; level.player.drone_locked_special_target = level.player.drone_locked_targets[var_03]; level.player.drone_locked_special_target.health = 1000; level.player.drone_locked_targets = maps\_utility::array_remove_index(level.player.drone_locked_targets,var_03); if(level.player.drone_locked_targets.size > 0) { launch_drone_missiles(level.player.drone_locked_targets); } level.player.drone_locked_special_target.health = 50; launch_drone_missile_special(level.player.drone_locked_special_target); } level notify("drone_swarm_launch_seq_complete"); if(isdefined(level.player.drone_locked_heli_target)) { level.player.drone_locked_heli_target thread helicopter_drone_attack(level.controllable_cloud_queen.origin); } } //Function Number: 32 player_attack_think() { level.player endon("death"); if(common_scripts\utility::flag("player_attack_think_running")) { return; } common_scripts\utility::flag_set("player_attack_think_running"); var_00 = 1000; thread attack_hint_display(); for(;;) { level.player waittill("dpad_down"); if(level.controllable_drones.size == 0) { continue; } drone_enabled_animation(); if(level.controllable_drones.size > 0) { common_scripts\utility::flag_set("controlling_drones"); common_scripts\utility::flag_set("controlling_drones_first_time"); var_01 = level.controllable_cloud_queen; var_01.is_player_controlled = 1; setup_drone_mode(); vehicle_scripts\_pdrone_player::pdrone_player_use(var_01,undefined,0,undefined,undefined,"LT","ui_sniperdrone"); thread maps\_introscreen::introscreen_generic_fade_in("black",0.5,0.5); var_01 vehicle_scripts\_pdrone_player::pdrone_player_enter(); var_01 returnplayercontrol(); thread waittill_attack_and_launch_drones(); if(isdefined(level.controllable_drone_allowed_vols)) { } var_01 thread vehicle_scripts\_pdrone_player::pdrone_player_loop(); handle_drone_target_selection(); var_01 vehicle_scripts\_pdrone_player::pdrone_player_exit(); var_01.is_player_controlled = 0; thread maps\_introscreen::introscreen_generic_fade_in("black",0.5,0.5); remove_drone_mode(); common_scripts\utility::flag_clear("controlling_drones"); } wait 0.05; } } //Function Number: 33 drone_missile_make(param_00,param_01) { var_02 = spawn("script_model",param_00); var_02 setmodel("vehicle_sentinel_survey_drone"); var_02 drone_missile_init(param_00,param_01); return var_02; } //Function Number: 34 drone_missile_init(param_00,param_01) { self.launch_org = param_00; self.target_org = param_01; self.direction = self.target_org - self.launch_org; var_02 = 500; self.total_time = length(self.target_org - self.launch_org) / var_02; self.vec_acceleration = (-1,-1,-150); self.vec_velocity = 2 * self.target_org - self.launch_org - self.vec_acceleration * self.total_time * self.total_time / 2 * self.total_time; } //Function Number: 35 drone_missile_loop() { self.time_passed = 0; while(self.time_passed <= self.total_time) { var_00 = self.origin; self.origin = self.launch_org + self.time_passed * self.vec_velocity + 0.5 * self.vec_acceleration * self.time_passed * self.time_passed; self.angles = vectortoangles(self.target_org - self.origin); self.time_passed = self.time_passed + 0.05; wait(0.05); } magicgrenademanual("fraggrenade",self.origin,(0,0,0),0.05,level.player); self delete(); level notify("drone_missile_loop_complete",self); } //Function Number: 36 launch_drone_missile_special(param_00) { level.controllable_drones = common_scripts\utility::array_removeundefined(level.controllable_drones); var_01 = level.controllable_drones[0]; level.controllable_drones = common_scripts\utility::array_remove(level.controllable_drones,var_01); var_01 delete(); var_02 = drone_missile_make(level.player.origin,param_00.origin); player_linkto_drone_missile(var_02); var_02 drone_missile_loop(); player_unlink_from_drone_missile(); } //Function Number: 37 launch_drone_missiles(param_00) { var_01 = level.player.origin; foreach(var_03 in param_00) { if(isdefined(var_03)) { var_01 = var_03.origin; break; } } level.controllable_drones = common_scripts\utility::array_removeundefined(level.controllable_drones); var_05 = level.controllable_drones; var_05 = sortbydistance(var_05,var_01); var_06 = []; foreach(var_08 in param_00) { if(isdefined(var_08)) { var_06[var_06.size] = var_08; if(target_istarget(var_08)) { target_remove(var_08); } } } var_0A = 0; foreach(var_14, var_0C in param_00) { if(!isdefined(var_0C)) { continue; } var_0D = var_05[var_14]; if(!isdefined(var_0D)) { foreach(var_03 in param_00) { if(isdefined(var_03)) { var_0C = var_03; } } } if(!isdefined(var_0D)) { return; } var_0D notify("im_attacking"); var_0D.remove_from_flock = 1; var_10 = var_0D.origin; var_10 = level.player geteye(); var_11 = level.player getplayerangles(); var_0D delete(); level.controllable_drones = common_scripts\utility::array_removeundefined(level.controllable_drones); var_12 = (randomintrange(-100,100),randomintrange(-100,100),0); var_13 = drone_missile_make(var_10,var_0C.origin); var_0A++; var_13 thermaldrawenable(); var_13 thread drone_missile_loop(); } while(var_0A > 0) { level waittill("drone_missile_loop_complete",var_15); var_0A--; } } //Function Number: 38 cleanup_missile(param_00,param_01) { while(isdefined(param_00)) { wait(0.05); } param_01 delete(); } //Function Number: 39 drone_lockon_missile_fire(param_00,param_01) { wait(randomfloatrange(0.1,0.35)); var_02 = common_scripts\utility::spawn_tag_origin(); if(issentient("target")) { var_02.origin = param_01 geteye(); } else { var_02.origin = param_01.origin; } var_02 linkto(param_01); target_set(var_02); target_hidefromplayer(var_02,level.player); if(issentient("target")) { var_03 = magicbullet("remote_missile_drone_light",param_00,param_01 geteye() + (0,0,200),level.player); } else { var_03 = magicbullet("remote_missile_drone_light",param_01,var_02.origin + (0,0,200),level.player); } var_03 missile_settargetent(var_02); var_03 missile_setflightmodetop(); thread cleanup_missile(var_03,var_02); return var_03; } //Function Number: 40 getclosestdrone(param_00,param_01,param_02) { if(!isdefined(param_02)) { param_02 = 500000; } if(!isdefined(param_01)) { return; } var_03 = undefined; foreach(var_05 in param_01) { if(!isdefined(var_05)) { continue; } var_06 = distance(var_05.origin,param_00); if(var_06 >= param_02) { continue; } param_02 = var_06; var_03 = var_05; } return var_03; } //Function Number: 41 monitor_drone_missile_death() { while(isdefined(self)) { wait 0.05; } level.player notify("drone_missile_impact"); } //Function Number: 42 helicopter_drone_attack(param_00) { if(isdefined(level.drone_swarm_queens[1])) { var_01 = level.drone_swarm_queens[1]; } else { var_01 = level.drone_swarm_queens[2]; } var_02 = var_01.origin; foreach(var_04 in var_01.boids) { if(isdefined(var_04)) { var_04 delete(); } } var_01 delete(); var_06 = undefined; var_07 = undefined; if(level.nextgen) { var_06 = 12; var_07 = 24; } else { var_06 = 6; var_07 = 12; } var_08 = vehicle_scripts\_attack_drone_common::spawn_snake_cloud("queen_drone_cloud_2",undefined,var_06,var_07,var_02); level notify("drone_attacked_chopper"); var_08 vehicle_scripts\_attack_drone_common::snake_cloud_pester_helicopter(self); } //Function Number: 43 send_swarm_to_chopper(param_00) { while(isdefined(param_00) && isdefined(self)) { self setvehgoalpos(param_00.origin,1); wait(0.05); } } //Function Number: 44 create_drone_kamikazes(param_00) { var_01 = common_scripts\utility::spawn_tag_origin(); var_01.angles = self.angles; var_01.origin = var_01 vehicle_scripts\_attack_drone_common::offset_position_from_drone("forward","tag_origin",50); var_02[0] = var_01 vehicle_scripts\_attack_drone_common::offset_position_from_drone("right","tag_origin",60); var_02[1] = var_01 vehicle_scripts\_attack_drone_common::offset_position_from_drone("left","tag_origin",70); var_02[2] = var_01 vehicle_scripts\_attack_drone_common::offset_position_from_drone("up","tag_origin",40); var_02[3] = var_01 vehicle_scripts\_attack_drone_common::offset_position_from_drone("down","tag_origin",40); foreach(var_04 in var_02) { var_05 = spawn("script_model",var_04); var_05 setmodel("vehicle_sentinel_survey_drone"); var_05.angles = var_01.angles; var_05 thread vehicle_scripts\_attack_drone_common::lerp_drone_to_position(param_00.origin,randomintrange(600,700)); var_05 thread simple_drone_health(); } } //Function Number: 45 clear_drone_cloud() { } //Function Number: 46 monitor_drone_cloud_members() { common_scripts\utility::waittill_any("im_dying","explode","death","im_attacking"); level.controllable_drones = common_scripts\utility::array_remove(level.controllable_drones,self); } //Function Number: 47 controllable_fly_think(param_00,param_01) { if(self != level.controllable_cloud_queen) { thread queen_drone_fly(param_00,param_01); } } //Function Number: 48 queen_drone_fly(param_00,param_01) { level endon("delete_drone_cloud"); self endon("death"); self endon("end_queen_think"); level.controllable_cloud_queen endon("end_drone_swarm"); self.radii = param_01; self.accel = level.boid_settings_presets["controllable_swarm"].queen_data_accel; self.decel = level.boid_settings_presets["controllable_swarm"].queen_data_decel; self.desired_speed = level.boid_settings_presets["controllable_swarm"].queen_data_desired_speed; var_02 = (0,0,0); self notify("queen_set_fly_logic"); for(;;) { var_03 = position_in_circle(param_00.origin,self.radii); var_02 = var_03; var_04 = param_00 vehicle_getspeed() * 1.75; if(var_04 <= 0) { var_04 = 1; } self vehicle_setspeed(var_04,var_04,var_04 * 1.5); self setvehgoalpos(var_03); if(!common_scripts\utility::flag("cloud_in_formation")) { if(self.location + 1 <= 120) { self.location++; } else { self.location = 0; } wait 0.05; continue; } wait(0.25); } } //Function Number: 49 position_in_circle(param_00,param_01) { var_02 = param_01; var_03 = 1; var_04 = 120; var_05 = 3; var_06 = []; var_07 = []; for(var_08 = 0;var_08 < var_04;var_08++) { var_03 = var_05 * var_08; var_09 = 0; var_06[var_06.size] = param_00 + anglestoforward((var_09,var_03,0)) * var_02; } if(isdefined(var_06[self.location])) { return var_06[self.location]; } return var_06[0]; } //Function Number: 50 make_crate_boidcloud(param_00,param_01) { var_02 = spawnstruct(); var_02.boids = []; var_02.queen = self; var_02.queen.flock = var_02; if(isdefined(param_01)) { var_02.boid_settings = param_01; } else { var_02.boid_settings = spawnstruct(); } for(var_03 = 0;var_03 < param_00.size;var_03++) { var_04 = spawn("script_model",param_00[var_03].origin); var_04 setmodel("vehicle_mil_attack_drone_static"); var_04.angles = param_00[var_03].angles; var_04 thread get_drones_into_start_positions(param_00[var_03],var_03,var_02.queen,var_02); param_00[var_03] hide(); var_04 thread monitor_controllable_drone_cloud_health(); thread monitor_drone_cloud_members(); level.controllable_drones[level.controllable_drones.size] = var_04; wait 0.05; } self.boids = var_02.boids; var_02.queen.boid_cloud_spawned = 1; var_02 thread vehicle_scripts\_attack_drone_common::boid_flock_think(); return var_02; } //Function Number: 51 will_boid_clip_camera(param_00) { var_01 = 150; if(!isdefined(level.controllable_cloud_queen.camera_tag)) { return 0; } if(distance(param_00,level.controllable_cloud_queen.camera_tag.origin) < var_01) { return 1; } return 0; } //Function Number: 52 simple_drone_health() { self setcandamage(1); self.can_be_damaged = 1; for(;;) { self waittill("damage",var_00,var_01,var_02,var_03,var_04); if(vehicle_scripts\_attack_drone_common::is_bullet_damage(var_04)) { thread vehicle_scripts\_attack_drone_common::fake_drone_death(); } } } //Function Number: 53 monitor_controllable_drone_cloud_health(param_00) { self notify("kill_drone_cloud_health_process"); self endon("kill_drone_cloud_health_process"); if(isdefined(self)) { self.can_be_damaged = 0; } if(!isdefined(self)) { return; } if(!isdefined(param_00)) { param_00 = 0; } if(!param_00 && randomint(100) > 25) { return; } if(!param_00) { wait(randomfloat(1)); } self setcandamage(1); self.can_be_damaged = 1; var_01 = 0; for(;;) { self waittill("damage",var_02,var_03,var_04,var_05,var_06); if(vehicle_scripts\_attack_drone_common::is_bullet_damage(var_06)) { var_01++; } if(var_01 >= 2) { thread vehicle_scripts\_attack_drone_common::fake_drone_death(); level notify("drone_killed_by_death"); break; } } } //Function Number: 54 boid_add_vehicle_to_targets(param_00,param_01) { param_00 notify("stop_friendlyfire_shield"); level endon("end_drone_cloud"); param_00 endon("death"); if(!isdefined(param_01)) { param_01 = 300; } while(!level.swarm_spawned) { wait 0.05; } while(distance(param_00.origin,level.cloud_queen.origin) > param_01) { var_02 = distance(param_00.origin,level.cloud_queen.origin); wait 0.05; } while(vehicle_scripts\_attack_drone_common::isdronevehiclealive(param_00)) { var_03 = sortbydistance(level.controllable_drones,param_00.origin); for(var_04 = 0;var_04 < 5;var_04++) { var_03[var_04] thread vehicle_scripts\_attack_drone_common::boid_vehicle_targets(param_00,param_01); wait(0.1); } wait(2); } }