/******************************************************************* * Decompiled By: Bog * Decompiled File: _attack_drone.gsc * Game: Call of Duty: Advanced Warfare * Platform: PC * Function Count: 42 * Decompile Time: 592 ms * Timestamp: 4/22/2024 2:04:22 AM *******************************************************************/ //Function Number: 1 drone_swarm_init() { if(level.nextgen) { level.attack_drones_num_drones_per_queen = 24; level.attack_drones_num_queens = 6; level.attack_drones_nofly_zone_radius = 125; } else { level.attack_drones_num_drones_per_queen = 5; level.attack_drones_num_queens = 3; level.attack_drones_nofly_zone_radius = 125; } level.swarm_spawned = 0; level.drone_turret_fake_death_awesome = 0; level.killable_kamikazes = 0; level.big_kamikaze_death = 0; common_scripts\utility::flag_init("cloud_in_formation"); if(!isdefined(level.flock_drones)) { level.flock_drones = []; } if(!isdefined(level.snakes)) { level.snakes = []; } level.expected_drones = level.attack_drones_num_queens * level.attack_drones_num_drones_per_queen; level.drones_vs_car_shield = 0; level.no_fly_zone = undefined; level.smart_drone_think = 0; level.drone_test_tag = common_scripts\utility::spawn_tag_origin(); precacheitem("iw5_attackdronemagicbullet"); precacheitem("remote_missile_drone_light"); precachemodel("vehicle_mil_attack_drone_static"); precachemodel("vehicle_mil_attack_drone_destroy"); precachemodel("vehicle_mil_attack_drone_ai"); precachemodel("vehicle_atlas_assault_drone_physics"); vehicle_scripts\_attack_drone_common::drone_fx(); if(!isdefined(level.boid_settings_presets)) { level.boid_settings_presets = []; } level.boid_settings_presets["default_snake"] = spawnstruct(); level.boid_settings_presets["default_snake"].queen_deadzone = 0; level.boid_settings_presets["default_snake"].queen_curl = 0.5; level.boid_settings_presets["default_snake"].neighborhood_radius = 110; level.boid_settings_presets["default_snake"].separation_factor = 12000; level.boid_settings_presets["default_snake"].alignment_factor = 0.002; level.boid_settings_presets["default_snake"].cohesion_factor = 0.00015; level.boid_settings_presets["default_snake"].magnet_factor = 10; level.boid_settings_presets["default_snake"].random_factor = 250; level.boid_settings_presets["default_snake"].max_accel = 3200; level.boid_settings_presets["default_snake"].drag_amount = 0.05; level.boid_settings_presets["default_snake"].random_drag_amount = 0.2; level.boid_settings_presets["default_snake"].queen_relative_speed = 1; level.boid_settings_presets["default_snake"].dodge_player_shots = 1; level.boid_settings_presets["default_snake"].emp_mode = 0; level.boid_settings_presets["frozen_snake"] = spawnstruct(); level.boid_settings_presets["frozen_snake"].queen_deadzone = 0; level.boid_settings_presets["frozen_snake"].queen_curl = 0; level.boid_settings_presets["frozen_snake"].neighborhood_radius = 110; level.boid_settings_presets["frozen_snake"].separation_factor = 48000; level.boid_settings_presets["frozen_snake"].alignment_factor = -0.002; level.boid_settings_presets["frozen_snake"].cohesion_factor = 0; level.boid_settings_presets["frozen_snake"].magnet_factor = 2.5; level.boid_settings_presets["frozen_snake"].random_factor = 100; level.boid_settings_presets["frozen_snake"].max_accel = 3200; level.boid_settings_presets["frozen_snake"].drag_amount = 0.15; level.boid_settings_presets["frozen_snake"].random_drag_amount = 0; level.boid_settings_presets["frozen_snake"].queen_relative_speed = 0; level.boid_settings_presets["frozen_snake"].min_speed = 0; level.boid_settings_presets["frozen_snake"].max_speed = 352; level.boid_settings_presets["frozen_snake"].dodge_player_shots = 1; level.boid_settings_presets["frozen_snake"].emp_mode = 0; level.boid_settings_presets["emp_snake"] = spawnstruct(); level.boid_settings_presets["emp_snake"].queen_deadzone = 0; level.boid_settings_presets["emp_snake"].queen_curl = 0; level.boid_settings_presets["emp_snake"].neighborhood_radius = 110; level.boid_settings_presets["emp_snake"].separation_factor = 48000; level.boid_settings_presets["emp_snake"].alignment_factor = 0; level.boid_settings_presets["emp_snake"].cohesion_factor = 0; level.boid_settings_presets["emp_snake"].magnet_factor = 0.000386; level.boid_settings_presets["emp_snake"].random_factor = 150; level.boid_settings_presets["emp_snake"].max_accel = 800; level.boid_settings_presets["emp_snake"].drag_amount = 0.01; level.boid_settings_presets["emp_snake"].random_drag_amount = 0; level.boid_settings_presets["emp_snake"].queen_relative_speed = 0; level.boid_settings_presets["emp_snake"].min_speed = 0; level.boid_settings_presets["emp_snake"].max_speed = 880; level.boid_settings_presets["emp_snake"].dodge_player_shots = 0; level.boid_settings_presets["emp_snake"].emp_mode = 1; } //Function Number: 2 spawn_queen_drone_and_drive(param_00,param_01,param_02) { if(isdefined(param_01)) { var_03 = param_01 maps\_utility::spawn_vehicle(); } else { var_03 = maps\_vehicle::spawn_vehicle_from_targetname_and_drive(param_01); } var_03 vehicle_scripts\_attack_drone_common::setup_queen_drone(); return var_03; } //Function Number: 3 monitor_drone_death() { self endon("death"); foreach(var_01 in self.drones) { while(isdefined(var_01)) { wait(0.05); } } self notify("drones_gone"); } //Function Number: 4 flying_attack_drone_move_think() { self endon("death"); self.current_air_space = common_scripts\utility::getclosest(self.origin,level.drone_air_spaces); update_flying_attack_drone_goal_pos(); self waittill("near_goal"); wait(2); for(;;) { var_00 = maps\_utility::get_closest_player_healthy(self.origin); self setlookatent(var_00); var_01 = var_00.origin; var_02 = common_scripts\utility::getclosest(var_01,level.player_test_points); var_03 = getent(var_02.target,"targetname"); if(var_03 != self.current_air_space) { var_04 = get_next_air_space(self.current_air_space,var_03,level.drone_air_spaces); if(isdefined(var_04)) { self.current_air_space = var_04; } } update_flying_attack_drone_goal_pos(); self waittill("near_goal"); if(var_03 == self.current_air_space) { wait(randomfloatrange(0.5,1.5)); } } } //Function Number: 5 update_flying_attack_drone_goal_pos() { var_00 = self.origin; var_01 = spawn("script_origin",(0,0,0)); var_01.origin = var_00; if(!var_01 istouching(self.current_air_space)) { var_00 = get_random_point_in_air_space(self.current_air_space); } else { var_02 = 0; var_03 = 0; var_04 = (0,0,0); var_05 = 0; var_06 = (0,0,0); foreach(var_08 in level.flying_attack_drones) { if(self != var_08 && isdefined(self.current_air_space) && isdefined(var_08.current_air_space)) { if(self.current_air_space == var_08.current_air_space) { var_02++; var_09 = var_08.origin - self.origin; var_0A = length(var_09); if(var_0A < 90) { var_03++; var_04 = var_04 - 0.5 * 90 - var_0A * var_09 / var_0A; } else if(var_0A > 150) { var_05++; var_06 = var_06 + 0.5 * var_0A - 150 * var_09 / var_0A; } } } } if(var_02 > 0) { if(var_03 > 0) { var_00 = var_00 + var_04 / var_03; } if(var_05 > 0) { var_00 = var_00 + var_06 / var_05; } } else { var_00 = get_random_point_in_air_space(self.current_air_space); } } self setvehgoalpos(var_00,1); var_01 delete(); } //Function Number: 6 get_random_point_in_air_space(param_00) { var_01 = spawn("script_origin",(0,0,0)); var_01.origin = param_00 getpointinbounds(randomfloatrange(-1,1),randomfloatrange(-1,1),randomfloatrange(-1,1)); while(!var_01 istouching(param_00)) { var_01.origin = param_00 getpointinbounds(randomfloatrange(-1,1),randomfloatrange(-1,1),randomfloatrange(-1,1)); } var_02 = var_01.origin; var_01 delete(); return var_02; } //Function Number: 7 flying_attack_drone_damage_monitor() { self endon("death"); self.damagetaken = 0; self.istakingdamage = 0; for(;;) { self waittill("damage",var_00,var_01,var_02,var_03,var_04); if(!isdefined(var_01) || !isplayer(var_01)) { continue; } self notify("flying_attack_drone_damaged_by_player"); thread flying_attack_drone_damage_update(); } } //Function Number: 8 flying_attack_drone_damage_update() { self notify("taking damage"); self endon("taking damage"); self endon("death"); self.istakingdamage = 1; wait(1); self.istakingdamage = 0; } //Function Number: 9 flying_attack_drone_death_monitor() { level.flying_attack_drones = common_scripts\utility::array_add(level.flying_attack_drones,self); self waittill("death"); level.flying_attack_drones = common_scripts\utility::array_remove(level.flying_attack_drones,self); level notify("flying_attack_drone_destroyed"); } //Function Number: 10 get_linked_air_spaces(param_00,param_01) { var_02 = []; var_03 = []; if(isdefined(param_00.script_linkto)) { var_03 = strtok(param_00.script_linkto," "); } for(var_04 = 0;var_04 < param_01.size;var_04++) { var_05 = 0; if(isdefined(param_01[var_04].script_linkname)) { for(var_06 = 0;var_06 < var_03.size;var_06++) { if(param_01[var_04].script_linkname == var_03[var_06]) { var_02[var_02.size] = param_01[var_04]; var_05 = 1; break; } } } if(!var_05 && isdefined(param_01[var_04].script_linkto) && isdefined(param_00.script_linkname)) { var_07 = strtok(param_01[var_04].script_linkto," "); for(var_06 = 0;var_06 < var_07.size;var_06++) { if(param_00.script_linkname == var_07[var_06]) { var_02[var_02.size] = param_01[var_04]; break; } } } } return var_02; } //Function Number: 11 get_next_air_space(param_00,param_01,param_02) { var_03 = []; var_03[0] = param_00; var_04 = []; foreach(var_06 in param_02) { var_06.g_score = 0; } param_00.f_score = param_00.g_score + distance(param_00.origin,param_01.origin); while(var_03.size > 0) { var_08 = undefined; var_09 = 500000; foreach(var_0B in var_03) { if(var_0B.f_score < var_09) { var_08 = var_0B; var_09 = var_0B.f_score; } } if(var_08 == param_01) { var_0D = param_01; while(var_0D.came_from != param_00) { var_0D = var_0D.came_from; } return var_0D; } var_04 = common_scripts\utility::array_remove(var_04,var_09); var_05[var_05.size] = var_09; var_0F = get_linked_air_spaces(var_09,var_03); foreach(var_0C in var_0F) { var_11 = var_09.g_score + distance(var_09.origin,var_0C.origin); if(common_scripts\utility::array_contains(var_05,var_0C) && var_11 >= var_0C.g_score) { continue; } var_12 = common_scripts\utility::array_contains(var_04,var_0C); if(!var_12 || var_11 < var_0C.g_score) { var_0C.came_from = var_09; var_0C.g_score = var_11; var_0C.f_score = var_0C.g_score + distance(var_0C.origin,param_02.origin); if(!var_12) { var_04[var_04.size] = var_0C; } } } } return undefined; } //Function Number: 12 sortbydistanceauto(param_00,param_01) { return sortbydistance(param_00,param_01,0,1); } //Function Number: 13 kamikaze_new_style(param_00,param_01) { level endon("end_kamikaze_newstyle"); level endon("delete_drone_cloud"); for(;;) { var_02 = sortbydistanceauto(level.flock_drones,level.player.origin); var_03 = randomint(5); for(var_04 = 0;var_04 < var_03;var_04++) { if(!isdefined(var_02[var_04]) || isdefined(var_02[var_04].attacking_player)) { continue; } var_02[var_04] thread drone_kamikaze_player(param_01,param_00); var_02[var_04].attacking_player = 1; wait(randomfloatrange(0.1,0.25)); } wait(0.5); } } //Function Number: 14 handle_drones_vs_car_shield(param_00) { if(!level.drones_vs_car_shield) { return; } level notify("kill_drone_vs_carshiel_process"); level endon("kill_drone_vs_carshiel_process"); level endon("end_drone_kamikaze_player"); level endon("delete_drone_cloud"); for(;;) { while(level.flock_drones.size <= 0) { wait(0.05); } var_01 = anglestoforward(level.player getplayerangles()); var_02 = level.player geteye() + var_01 * 200; var_03 = sortbydistanceauto(level.flock_drones,var_02); if(var_03.size > 0) { var_04 = distance(var_03[0].origin,level.player.origin); if(var_04 <= 1000) { var_03[0] thread drone_kamikaze_player(param_00); var_03[0] setmodel("vehicle_mil_attack_drone_static"); wait(randomfloatrange(1.5,2.5)); } else { wait(0.25); } continue; } wait(0.25); } } //Function Number: 15 force_kamikaze(param_00,param_01) { level endon("delete_drone_cloud"); var_02 = get_legal_drone_for_kamikaze(); if(!isdefined(var_02)) { return; } while(isdefined(param_00.vehicle_spawned_thisframe)) { wait(0.1); } var_02 thread drone_kamikaze_player(param_00,undefined,param_01); } //Function Number: 16 get_legal_drone_for_kamikaze() { level endon("delete_drone_cloud"); var_00 = undefined; for(;;) { var_01 = anglestoforward(level.player getplayerangles()); var_02 = level.player geteye() + var_01 * 200; var_03 = sortbydistanceauto(level.flock_drones,var_02); foreach(var_00 in var_03) { var_05 = distance(var_00.origin,var_02); if(var_05 > 100) { continue; } else { return var_00; } } wait 0.05; } } //Function Number: 17 drone_kamikaze_player(param_00,param_01,param_02) { level endon("delete_drone_cloud"); level endon("stop_kamikaze_player"); if(isdefined(param_00.vehicle_spawned_thisframe)) { return; } if(!isdefined(level.spawned_kamikaze_drones)) { level.spawned_kamikaze_drones = []; } var_03 = param_00 maps\_utility::spawn_vehicle(); level.spawned_kamikaze_drones[level.spawned_kamikaze_drones.size] = var_03; if(!isdefined(var_03) || !var_03 maps\_vehicle::isvehicle()) { return; } var_03 notify("nodeath_thread"); var_03.health = 1; if(isdefined(self)) { var_03 vehicle_teleport(self.origin,self.angles); var_04 = vectortoangles(level.player.origin - var_03.origin); var_03 vehicle_teleport(self.origin,var_04); } else { return; } if(level.killable_kamikazes) { level.flock_drones = common_scripts\utility::array_add(level.flock_drones,var_03); var_03.kamikaze = 1; } var_05 = var_03.origin; for(;;) { if(!isdefined(var_03) || !var_03 maps\_vehicle::isvehicle()) { return; } var_06 = anglestoforward(level.player getplayerangles()); var_07 = level.player geteye() + var_06 * 30; var_03 vehicle_setspeed(20,20,20); var_03 setvehgoalposauto(var_07); var_08 = level.player.origin - var_03.origin; var_08 = vectortoyaw(var_08); var_03 setgoalyaw(var_08); if(!isdefined(param_01)) { if(distance(var_03.origin,level.player geteye()) < 60) { var_09 = 30; level.player notify("car_door_shield_damaged",var_09,var_03.origin,var_03.angles,"drones"); if(!is_current_weapon_shield(level.player getcurrentweapon())) { soundscripts\_snd::snd_message("drone_kamikaze_hit_player"); } var_03 thread drone_die_random(); level.player notify("kamikaze_hit_player"); earthquake(randomfloatrange(0.25,1),0.5,level.player.origin,32); } } else if((isdefined(param_01) && var_03 isorigintouchingvol(param_01)) || distance(var_03.origin,level.player geteye()) < 60) { if(distance(var_03.origin,level.player geteye()) < 60) { soundscripts\_snd::snd_message("drone_kamikaze_hit_player"); } var_03 thread drone_die_random(); earthquake(randomfloatrange(0.25,1),0.5,level.player.origin,32); } else if(!bullettracepassed(var_05,var_03.origin,0,var_03)) { var_03 thread drone_die_random(); } if(isdefined(var_03)) { var_05 = var_03.origin; } wait(0.05); } } //Function Number: 18 is_current_weapon_shield(param_00) { return param_00 == "weapon_suv_door_shield_fr" || param_00 == "weapon_suv_door_shield_fl" || param_00 == "weapon_suv_door_shield_kl" || param_00 == "weapon_suv_door_shield_kr"; } //Function Number: 19 drone_kamikaze_player_evil_style(param_00,param_01) { var_02 = param_00.model; var_03 = spawn("script_model",self.origin); var_03.angles = self.angles; var_03 setmodel(var_02); var_04 = 352; var_05 = 1920; var_06 = 0.15; var_07 = 0.3; var_08 = (0,0,0); var_09 = 0; var_0A = 60; var_0B = self evaluatetrajectorydelta(); var_0C = undefined; var_0D = vectornormalize(var_0B); var_0E = var_0D; for(;;) { var_0C = kamikaze_drone_get_target_origin(); var_0F = var_0C - var_03.origin; var_0D = vectornormalize(var_0F); var_10 = var_0D - var_0E * 20 + var_08 + common_scripts\utility::randomvector(var_09); var_0E = var_0D; var_11 = length(var_0B); var_12 = vectornormalize(var_0B); if(var_11 < var_04) { var_13 = min(var_11 + var_05 * 0.05,var_04); } else { var_13 = max(var_11 - var_05 * 0.05,var_04); } if(vectordot(var_0B,var_0C - var_03.origin) < 0) { var_10 = var_10 * -1; } var_14 = vectorclamp(var_10 * var_07,var_06); var_15 = vectornormalize(var_12 + var_14); var_0B = var_15 * var_13; var_16 = var_03.origin + var_0B * 0.05; if(!bullettracepassed(self.origin,var_16,0,var_03)) { break; } var_03.origin = var_16; var_03.angles = vectortoangles(var_0B); if(distance(var_16,var_0C) < var_0A) { break; } if(isdefined(param_01) && var_03 istouching(param_01)) { break; } wait 0.05; } var_17 = 30; level.player notify("car_door_shield_damaged",var_17,var_03.origin,var_03.angles,"drones"); var_03 drone_die_random(var_0B); earthquake(randomfloatrange(0.25,1),0.5,level.player.origin,32); } //Function Number: 20 kamikaze_drone_get_target_origin() { var_00 = anglestoforward(level.player getplayerangles()); var_01 = level.player geteye() + var_00 * 30; return var_01; } //Function Number: 21 isorigintouchingvol(param_00) { var_01 = common_scripts\utility::spawn_tag_origin(); if(var_01 istouching(param_00)) { var_01 delete(); return 1; } else { var_01 delete(); } return 0; } //Function Number: 22 setvehgoalposauto(param_00) { if(!isdefined(self)) { return; } if(!maps\_vehicle::isvehicle()) { return; } self setvehgoalpos(param_00); } //Function Number: 23 drone_die_random(param_00,param_01) { var_02 = self.origin; var_03 = self.angles; if(!isdefined(level.every_other_one)) { level.every_other_one = 0; } if(level.every_other_one > 1) { level.every_other_one = 0; } if(randomint(100) < 5) { playfx(common_scripts\utility::getfx("drone_sparks"),var_02); } if(isdefined(param_00)) { if(level.gameskill > 1 && level.every_other_one < 1) { magicbullet("iw5_attackdronemagicbullet",var_02,var_02 + param_00); level.every_other_one++; } else { magicbullet("iw5_attackdronemagicbullet",var_02,var_02 + param_00); } } else if(level.gameskill > 1 && level.every_other_one < 1) { magicbullet("iw5_attackdronemagicbullet",var_02,level.player geteye()); level.every_other_one++; } else { magicbullet("iw5_attackdronemagicbullet",var_02,level.player geteye()); } level notify("heavy_rumble"); var_04 = spawn("script_model",var_02); var_04 setmodel("vehicle_mil_attack_drone_destroy"); var_04.angles = var_03; level notify("drone_kamikaze_crash",self.origin); if(!isdefined(param_01) || !param_01) { self delete(); } var_05 = var_04.origin + (randomintrange(-10,10),randomintrange(-10,10),randomintrange(-10,10)) - level.player geteye(); var_06 = randomintrange(50,80); var_04 physicslaunchserver(var_04.origin + (randomintrange(-15,15),randomintrange(-15,15),randomintrange(-15,15)),var_05 * var_06); if(randomint(100) < 15) { playfxontag(common_scripts\utility::getfx("drone_smoke"),var_04,"tag_origin"); } playfxontag(common_scripts\utility::getfx("drone_sparks"),var_04,"tag_origin"); if(level.big_kamikaze_death) { playfxontag(common_scripts\utility::getfx("drone_death_explode1"),var_04,"tag_origin"); } wait(15); var_04 delete(); } //Function Number: 24 spawn_drone_physics(param_00,param_01) { var_02 = self.origin; var_03 = self.angles; var_04 = spawn("script_model",var_02); var_04 setmodel("vehicle_mil_attack_drone_destroy"); var_04.angles = var_03; var_05 = var_04.origin + (randomintrange(-10,10),randomintrange(-10,10),randomintrange(-10,10)) - level.player geteye(); var_04 physicslaunchserver(var_04.origin + (randomintrange(-15,15),randomintrange(-15,15),randomintrange(-15,15)),var_05); if(randomint(100) < 5) { playfxontag(common_scripts\utility::getfx("drone_smoke"),var_04,"tag_origin"); } wait(randomfloat(5)); playfx(common_scripts\utility::getfx("drone_sparks"),var_04.origin); var_04 delete(); } //Function Number: 25 clear_drone_cloud() { level waittill("delete_drone_cloud"); common_scripts\utility::array_thread(level.flock_drones,::delete_drone); } //Function Number: 26 delete_drone() { if(!isdefined(self)) { return; } self delete(); } //Function Number: 27 handle_drone_cloud_vehicle_attack(param_00,param_01) { self notify("kill_cloud_vehicle_attack_process"); self endon("kill_cloud_vehicle_attack_process"); if(!common_scripts\utility::flag("cloud_in_formation")) { common_scripts\utility::flag_set("cloud_in_formation"); } if(isdefined(param_00)) { thread drone_cloud_formation_circle(param_00,param_01); } while(vehicle_scripts\_attack_drone_common::isdronevehiclealive(param_00)) { wait(0.05); } common_scripts\utility::flag_clear("cloud_in_formation"); level notify("drone_cloud_formation_end"); } //Function Number: 28 drone_cloud_formation_circle(param_00,param_01) { self notify("kill_drone_cloud_formation_circle_process"); self endon("kill_drone_cloud_formation_circle_process"); var_02 = (0,0,0); param_00 endon("death"); param_00.follow_dist = 200; level.cloud_queen.radii = 600; level.cloud_queen.accel = 35; level.cloud_queen.decel = 45; if(!isdefined(param_01)) { param_01 = 100; } while(vehicle_scripts\_attack_drone_common::isdronevehiclealive(param_00)) { level.cloud_queen.desired_speed = level.cloud_queen vehicle_getspeed() + 8; level.drone_test_tag.origin = param_00.origin; level.drone_test_tag.angles = param_00.angles; var_03 = level.drone_test_tag vehicle_scripts\_attack_drone_common::offset_position_from_drone("backward","tag_origin",param_00.follow_dist); var_03 = var_03 + (0,0,param_01); if(var_03 == var_02 && distance(var_03,level.cloud_queen.origin) < 20) { level.cloud_queen vehicle_setspeed(0,30,40); } else { var_04 = param_00 vehicle_getspeed() * 1.25; if(var_04 <= 0) { var_04 = 18; } level.cloud_queen vehicle_setspeed(var_04,var_04,var_04 * 1.25); level.cloud_queen setvehgoalpos(var_03); } var_02 = var_03; wait(0.05); } level.cloud_queen vehicle_setspeed(10,5,5); } //Function Number: 29 drone_cloud_formation_circle_player(param_00,param_01,param_02) { self notify("kill_drone_cloud_formation_circle_process"); self endon("kill_cdrone_cloud_formation_circle_process"); level endon("end_cherry_picker"); level endon("end_drone_cloud"); self endon("death"); foreach(var_05, var_04 in level.drone_swarm_queens) { if(var_04 != self) { var_04 thread queen_drone_form_hemisphere(self,var_05); } } self hide(); var_06 = (0,0,0); param_00 endon("death"); level.player endon("death"); param_00.follow_dist = 200; self.radii = 600; self.accel = 35; self.decel = 45; self.retreat_path = 0; var_07 = param_00.origin + (0,0,90); var_08 = var_07[2] + 50; var_09 = var_07[2] + 250; if(!isdefined(param_01)) { param_01 = 50; } while(isdefined(self)) { while(common_scripts\utility::flag("cloud_queen_retreat_path")) { self.retreat_path = 1; wait(0.05); } self.retreat_path = 0; wait(randomfloatrange(0.5,0.9)); var_0A = fixed_point_on_squished_sphere(250,70); var_0B = param_00 gettagorigin("tag_flash"); var_0C = param_00 gettagangles("tag_flash"); var_0B = var_0B + anglestoforward(var_0C) * param_01; var_0B = var_0B + var_0A; if(var_0B[2] > var_09) { var_0B = (var_0B[0],var_0B[1],var_08); } else if(var_0B[2] < var_08) { var_0B = (var_0B[0],var_0B[1],var_09); } var_0D = vectortoangles(var_07 - self.origin); self vehicle_teleport(var_0B,var_0D); self vehicle_setspeed(0,5,5); wait(0.25); } } //Function Number: 30 queen_drone_form_hemisphere(param_00,param_01) { level endon("delete_drone_cloud"); level endon("end_drone_cloud"); self endon("death"); self notify("kill_queen_drone_fly_process"); self endon("kill_queen_drone_fly_process"); self.retreat_path = 0; self.radii = 250; self.accel = 5; self.decel = 15; var_02 = (0,0,0); self.desired_speed = 15; self.new_position = param_00.origin; var_03 = level.player.cherry_turret; self.maintain_position = undefined; thread maintain_position_around_queen(200,-100,150,level.cloud_queen); while(vehicle_scripts\_attack_drone_common::is_real_vehicle()) { while(!isdefined(self.maintain_position) || self.retreat_path) { wait(0.05); } if(level.cloud_queen vehicle_getspeed() < 18) { var_04 = 18; } else { var_04 = level.cloud_queen vehicle_getspeed(); } self vehicle_setspeed(var_04,var_04,var_04); self setvehgoalpos(self.maintain_position); wait(0.5); } } //Function Number: 31 maintain_position_around_queen(param_00,param_01,param_02,param_03) { level endon("end_drone_cloud"); var_04 = level.player.cherry_turret; var_05 = param_03.origin; var_06 = var_05; while(isdefined(self)) { var_07 = distance(var_05,param_03.origin); var_08 = fixed_point_on_squished_sphere(param_00); var_09 = param_03.origin + var_08; var_06 = param_03.origin; if(!isdefined(level.no_fly_zone) || isdefined(level.no_fly_zone) && distance(level.no_fly_zone,var_09) > level.attack_drones_nofly_zone_radius) { self.maintain_position = var_09; continue; } wait(0.05); continue; wait(0.1); } } //Function Number: 32 queen_drone_fly(param_00,param_01) { level endon("delete_drone_cloud"); self endon("death"); self notify("kill_queen_drone_fly_process"); self endon("kill_queen_drone_fly_process"); self.radii = param_01; self.accel = 5; self.decel = 15; var_02 = (0,0,0); self.desired_speed = 15; self notify("queen_set_fly_logic"); while(vehicle_scripts\_attack_drone_common::is_real_vehicle()) { var_03 = (perlinnoise2d(gettime() * 0.001 * 0.05,10,4,5,2),perlinnoise2d(gettime() * 0.001 * 0.05,20,4,5,2),perlinnoise2d(gettime() * 0.001 * 0.05,30,4,5,2)); var_04 = position_in_circle(param_00.origin,self.radii); var_02 = var_04; var_05 = param_00 vehicle_getspeed(); if(var_05 <= 5) { var_06 = 1; var_05 = 18; self vehicle_setspeed(var_05 * 1.25,var_05 * 2,var_05 * 2.25); } else { var_06 = 0; self vehicle_setspeed(var_05 * 1.25,var_05,var_05 * 1.25); } self setvehgoalpos(var_03 + var_04); if(var_06) { if(self.location + 1 <= self.num_in_formation) { self.location++; } else { self.location = 0; } wait(0.05); continue; } wait(0.25); } } //Function Number: 33 position_in_circle(param_00,param_01) { var_02 = param_01; var_03 = 1; var_04 = self.num_in_formation; var_05 = 360 / var_04; 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: 34 position_in_spear(param_00,param_01,param_02) { return param_02.origin; } //Function Number: 35 make_boidcloud(param_00,param_01,param_02) { if(!isdefined(param_01)) { param_01 = level.attack_drones_num_drones_per_queen; } if(!isdefined(param_02)) { param_02 = 50; } var_03 = spawnstruct(); var_03.queen = self; var_03.queen.flock = var_03; var_03.boids = []; if(isdefined(param_00)) { var_03.boid_settings = param_00; } else { var_03.boid_settings = spawnstruct(); } setsaveddvar("r_lightCacheLessFrequentPeriod",20); setsaveddvar("r_lightCacheLessFrequentMaxDistance",9999); for(var_04 = 0;var_04 < param_01;var_04++) { var_05 = spawn("script_model",self.origin); if(level.nextgen) { var_05 setmodel(self.model); } else if(randomint(100) < param_02) { var_05 setmodel("vehicle_mil_attack_drone_static_multi_cg"); var_05 thread multi_drone_handle_anim(); } else { var_05 setmodel(self.model); } var_05.old_contents = var_05 setcontents(0); var_05 startusinglessfrequentlighting(); var_03.boids[var_03.boids.size] = var_05; var_05 thread vehicle_scripts\_attack_drone_common::monitor_drone_cloud_health(); } self.boid_cloud_spawned = 1; var_03 thread vehicle_scripts\_attack_drone_common::boid_flock_think(); return var_03; } //Function Number: 36 make_boidcloud_from_spawned_models(param_00,param_01) { var_02 = spawnstruct(); var_02.queen = self; var_02.queen.flock = var_02; var_02.boids = param_01; if(isdefined(param_00)) { var_02.boid_settings = param_00; } else { var_02.boid_settings = spawnstruct(); } setsaveddvar("r_lightCacheLessFrequentPeriod",20); setsaveddvar("r_lightCacheLessFrequentMaxDistance",9999); foreach(var_04 in param_01) { var_04.old_contents = var_04 setcontents(0); var_04 startusinglessfrequentlighting(); var_04 thread vehicle_scripts\_attack_drone_common::monitor_drone_cloud_health(); } self.boid_cloud_spawned = 1; var_02 thread vehicle_scripts\_attack_drone_common::boid_flock_think(); return var_02; } //Function Number: 37 monitor_drone_swearm_boundaries() { if(common_scripts\utility::cointoss()) { return; } var_00 = getentarray("vol_drone_swarm_boundary","targetname"); while(isdefined(self)) { if(!is_boid_in_vols(var_00)) { wait(0.1); } wait(0.05); } } //Function Number: 38 is_boid_in_vols(param_00) { foreach(var_02 in param_00) { if(self istouching(var_02)) { return 1; } } return 0; } //Function Number: 39 fixed_point_squished_sphere(param_00) { var_01 = param_00 * param_00; for(var_02 = common_scripts\utility::randomvector(param_00);lengthsquared(var_02) > var_01;var_02 = common_scripts\utility::randomvector(param_00)) { } return (var_02[0],var_02[1],var_02[2] * 0.65); } //Function Number: 40 fixed_point_on_squished_sphere(param_00,param_01) { var_02 = fixed_point_squished_sphere(1); var_03 = vectornormalize(var_02) * param_00; while(isdefined(param_01)) { if(var_03[2] < param_01) { var_02 = fixed_point_squished_sphere(1); var_03 = vectornormalize(var_02) * param_00; continue; } break; } return var_03; } //Function Number: 41 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(vehicle_scripts\_attack_drone_common::isdronevehiclealive(param_00)) { var_02 = sortbydistanceauto(level.flock_drones,param_00.origin); for(var_03 = 0;var_03 < 5;var_03++) { if(isdefined(var_02[var_03])) { var_02[var_03] thread vehicle_scripts\_attack_drone_common::boid_vehicle_targets(param_00,param_01); wait(0.1); } } wait(2); } } //Function Number: 42 multi_drone_handle_anim() { self endon("death"); level endon("end_drone_cloud"); level endon("delete_drone_cloud"); self useanimtree(#animtree); if(randomfloat(1) >= 0.5) { var_00 = %mil_attack_drone_multi_cg_spin_cw; } else { var_00 = %mil_attack_drone_multi_cg_spin_ccw; } var_01 = getanimlength(var_00); wait(randomfloat(1)); for(;;) { self setanimknobrestart(var_00); wait(var_01); } }