IL-GSC/AW/PC/vehicle_scripts/_pdrone_security.gsc
InfinityLoader b2389dbcb9 Full AW Dump
2024-04-22 02:38:24 -04:00

2751 lines
64 KiB
Plaintext

/*******************************************************************
* Decompiled By: Bog
* Decompiled File: _pdrone_security.gsc
* Game: Call of Duty: Advanced Warfare
* Platform: PC
* Function Count: 85
* Decompile Time: 1215 ms
* Timestamp: 4/22/2024 2:05:22 AM
*******************************************************************/
//Function Number: 1
main(param_00,param_01,param_02)
{
precachemodel(param_00);
maps\_utility::set_console_status();
setup_pdrone_type(param_02);
level._effect["pdrone_death_explosion"] = loadfx("vfx/explosion/vehicle_pdrone_explosion");
level._effect["pdrone_large_death_explosion"] = loadfx("vfx/explosion/vehicle_pdrone_large_explosion");
level._effect["pdrone_emp_death"] = loadfx("vfx/explosion/vehicle_pdrone_explosion");
level._effect["emp_drone_damage"] = loadfx("vfx/sparks/emp_drone_damage");
level._effect["ie_drone_thrusters_side"] = loadfx("vfx/map/irons_estate/ie_drone_thrusters_side");
level._effect["ie_drone_thrusters"] = loadfx("vfx/map/irons_estate/ie_drone_thrusters");
level._effect["ie_drone_eye_emissive"] = loadfx("vfx/map/irons_estate/ie_drone_eye_emissive");
level._effect["ie_drone_eye_emissive_bootup"] = loadfx("vfx/map/irons_estate/ie_drone_eye_emissive_bootup");
level._effect["drone_search_lt"] = loadfx("vfx/lights/drone_search_lt");
level._effect["atlas_drone_shell"] = loadfx("vfx/shelleject/atlas_drone_shell");
level._effect["atlas_drone_turret_flash"] = loadfx("vfx/muzzleflash/atlas_drone_turret_flash");
level._effect["ie_drone_gun_lights"] = loadfx("vfx/map/irons_estate/ie_drone_gun_lights");
level._effect["ie_drone_thrusters_side"] = loadfx("vfx/map/irons_estate/ie_drone_thrusters_side");
level._effect["ie_drone_thrusters"] = loadfx("vfx/map/irons_estate/ie_drone_thrusters");
level._effect["ie_drone_eye_emissive"] = loadfx("vfx/map/irons_estate/ie_drone_eye_emissive");
level._effect["ie_drone_eye_emissive_bootup"] = loadfx("vfx/map/irons_estate/ie_drone_eye_emissive_bootup");
level._effect["ie_drone_wash"] = loadfx("vfx/map/irons_estate/ie_drone_wash");
level._effect["drone_search_lt"] = loadfx("vfx/lights/drone_search_lt");
level._effect["drone_scan"] = loadfx("vfx/map/irons_estate/ie_drone_scan");
level._effect["ie_drone_cam_distort"] = loadfx("vfx/map/irons_estate/ie_drone_cam_distort");
level.sdrone_weapon_fire_sounds = ["sdrone_weapon_fire","sdrone_weapon_fire_alt1","sdrone_weapon_fire_alt2"];
level.sdrone_weapon_fire_sound_next = 0;
var_03 = "pdrone_security";
if(isdefined(param_01))
{
var_03 = param_01;
}
maps\_vehicle::build_template(var_03,param_00,param_01,param_02);
maps\_vehicle::build_localinit(::init_local);
maps\_vehicle::build_drive(undefined,undefined,0);
maps\_vehicle::build_deathquake(0.4,0.8,1024);
maps\_vehicle::build_life(level.pdrone_parms[param_02]["health"]);
maps\_vehicle::build_team("allies");
maps\_vehicle::build_mainturret();
var_04 = randomfloatrange(0,1);
var_05 = param_02;
maps\_vehicle::build_is_helicopter();
}
//Function Number: 2
setup_pdrone_type(param_00)
{
if(!isdefined(level.pdrone_parms))
{
level.pdrone_parms = [];
}
if(isdefined(level.pdrone_parms[param_00]))
{
return;
}
level.pdrone_parms[param_00] = [];
level.pdrone_parms[param_00]["health"] = 800;
level.pdrone_parms[param_00]["axial_move"] = 1;
level.pdrone_parms[param_00]["hover_radius"] = 16;
level.pdrone_parms[param_00]["hover_speed"] = 8;
level.pdrone_parms[param_00]["hover_accel"] = 8;
level.pdrone_parms[param_00]["speed"] = 40;
level.pdrone_parms[param_00]["accel"] = 80;
level.pdrone_parms[param_00]["decel"] = 80;
level.pdrone_parms[param_00]["angle_vel_pitch"] = 1000;
level.pdrone_parms[param_00]["angle_vel_yaw"] = 2000;
level.pdrone_parms[param_00]["angle_vel_roll"] = 10;
level.pdrone_parms[param_00]["angle_accel"] = 1000;
level.pdrone_parms[param_00]["yaw_speed"] = 2000;
level.pdrone_parms[param_00]["yaw_accel"] = 2000;
level.pdrone_parms[param_00]["yaw_decel"] = 2000;
level.pdrone_parms[param_00]["yaw_over"] = 0;
level.pdrone_parms[param_00]["pitchmax"] = 5;
level.pdrone_parms[param_00]["rollmax"] = 5;
level.pdrone_parms[param_00]["weap_fire_tags"] = ["tag_muzzle_flash_lt","tag_muzzle_flash_rt"];
level.pdrone_parms[param_00]["clear_look"] = 0;
}
//Function Number: 3
drone_parm(param_00)
{
return level.pdrone_parms[self.classname][param_00];
}
//Function Number: 4
init_class_motion(param_00,param_01,param_02)
{
self sethoverparams(drone_parm("hover_radius"),drone_parm("hover_speed"),drone_parm("hover_accel"));
self setmaxpitchroll(drone_parm("pitchmax"),drone_parm("rollmax"));
var_03 = drone_parm("speed");
var_04 = drone_parm("accel");
var_05 = drone_parm("decel");
if(isdefined(param_00))
{
var_03 = param_00;
}
if(isdefined(param_01))
{
var_04 = param_01;
}
if(isdefined(param_02))
{
var_05 = param_02;
}
self vehicle_setspeed(var_03,var_04,var_05);
self vehicle_helicoptersetmaxangularvelocity(drone_parm("angle_vel_pitch"),drone_parm("angle_vel_yaw"),drone_parm("angle_vel_roll"));
self vehicle_helicoptersetmaxangularacceleration(drone_parm("angle_accel"));
self setneargoalnotifydist(5);
self setyawspeed(drone_parm("yaw_speed"),drone_parm("yaw_accel"),drone_parm("yaw_decel"),drone_parm("yaw_over"));
self setaxialmove(drone_parm("axial_move"));
}
//Function Number: 5
init_local()
{
self endon("death");
self.originheightoffset = distance(self gettagorigin("tag_origin"),self gettagorigin("tag_ground"));
self.script_badplace = 0;
self.dontdisconnectpaths = 1;
self.vehicle_heli_default_path_speeds = ::init_class_motion;
init_class_motion();
self setvehweapon("pdrone_turret_security");
if(self.script_team == "allies")
{
thread maps\_vehicle::vehicle_lights_on("friendly");
self.contents = self setcontents(0);
}
else
{
thread maps\_vehicle::vehicle_lights_on("hostile");
self.ignore_death_fx = 1;
self.delete_on_death = 1;
thread pdrone_handle_death();
}
maps\_utility::ent_flag_init("sentient_controlled");
maps\_utility::ent_flag_init("fire_disabled");
self.playing_hit_reaction = 0;
self.drone_relocating = 0;
self.drone_firing = 0;
vehicle_scripts\_pdrone_threat_sensor::build_threat_data();
waittillframeend;
self.emp_death_function = ::pdrone_emp_death;
maps\_utility::add_damage_function(::pdrone_damage_function);
thread maps\_damagefeedback::monitordamage();
if(self.script_team != "allies")
{
self enableaimassist();
thread maps\_shg_utility::make_emp_vulnerable();
}
if(isdefined(self.script_parameters) && self.script_parameters == "diveboat_weapon_target")
{
target_set(self,(0,0,0));
target_hidefromplayer(self,level.player);
}
else if(self.classname != "script_vehicle_pdrone_kva")
{
target_set(self,(0,0,0));
target_setjavelinonly(self,1);
}
thread pdrone_ai(0);
thread pdrone_flying_fx();
self notify("stop_kicking_up_dust");
thread handle_pdrone_audio();
}
//Function Number: 6
handle_pdrone_audio()
{
self endon("death");
var_00 = spawnstruct();
var_00.preset_name = "pdrone_security";
var_01 = ::vehicle_scripts\_pdrone_security_aud::snd_pdrone_security_constructor;
soundscripts\_snd::snd_message("snd_register_vehicle",var_00.preset_name,var_01);
soundscripts\_snd::snd_message("snd_start_vehicle",var_00);
}
//Function Number: 7
pdrone_ai(param_00)
{
self endon("death");
self makeentitysentient(self.script_team,param_00);
self setmaxpitchroll(drone_parm("pitchmax"),drone_parm("rollmax"));
thread vehicle_scripts\_pdrone_threat_sensor::pdrone_update_threat_sensor();
thread pdrone_player_collision_monitor();
}
//Function Number: 8
pdrone_player_collision_monitor()
{
self endon("death");
var_00 = undefined;
var_01 = 0;
while(isdefined(self))
{
var_02 = distancesquared(level.player.origin,self.origin);
var_03 = var_02 < 16384 && level.player.origin[2] > self.origin[2];
if(!var_01 && var_03)
{
var_00 = self setcontents(0);
var_01 = 1;
continue;
}
if(var_01 && !var_03)
{
self setcontents(var_00);
var_01 = 0;
}
wait(0.05);
}
}
//Function Number: 9
pdrone_flying_fx()
{
self endon("death");
var_00 = 0.3;
playfxontag(common_scripts\utility::getfx("ie_drone_eye_emissive"),self,"TAG_MAIN_CAMERA");
playfxontag(common_scripts\utility::getfx("ie_drone_thrusters"),self,"TAG_EXHAUST_REAR");
playfxontag(common_scripts\utility::getfx("ie_drone_thrusters_side"),self,"TAG_EXHAUST_LT");
playfxontag(common_scripts\utility::getfx("ie_drone_thrusters_side"),self,"TAG_EXHAUST_RT");
thread drone_security_thrust_fx("ie_drone_wash","ie_drone_cam_distort","TAG_ORIGIN",105);
}
//Function Number: 10
drone_security_thrust_fx(param_00,param_01,param_02,param_03)
{
self endon("death");
var_04 = param_03 * 3 * param_03 * 3;
var_05 = ["",""];
var_06 = ["",""];
var_07 = [];
for(var_08 = 0;var_08 < var_05.size;var_08++)
{
var_07[var_08] = common_scripts\utility::spawn_tag_origin();
var_07[var_08].angles = (-90,0,0);
var_07[var_08] thread drone_security_thrust_fx_cleanup(self);
}
for(;;)
{
var_09 = self gettagorigin(param_02);
var_0A = var_09 - (0,0,param_03);
var_0B = bullettrace(var_09,var_0A,0,self,1);
var_05[0] = "";
var_05[1] = "";
if(var_0B["fraction"] < 1)
{
var_05[0] = param_00;
if(self == level.player.closest_drone && distancesquared(var_09,level.player geteye()) < var_04 && isdefined(level.player.inwater) && isdefined(level.player.underwater))
{
var_05[1] = param_01;
}
for(var_08 = 0;var_08 < var_05.size;var_08++)
{
var_07[var_08] unlink();
var_07[var_08].origin = var_0B["position"];
var_07[var_08] linkto(self);
}
}
for(var_08 = 0;var_08 < var_05.size;var_08++)
{
if(var_05[var_08] != var_06[var_08])
{
if(var_06[var_08] != "")
{
stopfxontag(common_scripts\utility::getfx(var_06[var_08]),var_07[var_08],"tag_origin");
var_06[var_08] = "";
}
if(var_05[var_08] != "")
{
playfxontag(common_scripts\utility::getfx(var_05[var_08]),var_07[var_08],"tag_origin");
var_06[var_08] = var_05[var_08];
}
}
}
wait(0.25);
}
}
//Function Number: 11
drone_security_thrust_fx_cleanup(param_00)
{
self notify("drone_security_thrust_fx_cleanup");
self endon("drone_security_thrust_fx_cleanup");
self endon("death");
param_00 waittill("death");
if(isdefined(self))
{
self delete();
}
}
//Function Number: 12
pdrone_get_nodes_in_radius(param_00,param_01,param_02,param_03)
{
return getnodesinradius(param_00,param_01,param_02,param_03,"Path","Exposed");
}
//Function Number: 13
pdrone_can_move_to_point(param_00,param_01)
{
param_01 = param_01 + vectornormalize(param_01 - param_00) * 32;
param_00 = param_00 + (0,0,-24);
param_01 = param_01 + (0,0,-24);
var_02 = playerphysicstrace(param_00,param_01);
var_03 = distancesquared(var_02,param_01) < 0.01;
return var_03;
}
//Function Number: 14
pdrone_can_teleport_to_point(param_00)
{
var_01 = param_00 + (0,0,12);
var_02 = playerphysicstrace(var_01,param_00);
var_03 = distancesquared(var_02,param_00) < 0.01;
return var_03;
}
//Function Number: 15
pdrone_can_see_owner_from_point(param_00)
{
var_01 = self.owner geteye();
var_02 = sighttracepassed(param_00,var_01,0,self);
return var_02;
}
//Function Number: 16
pdrone_targeting(param_00)
{
self notify("pdrone_targeting");
self endon("pdrone_targeting");
if(isdefined(self.owner))
{
self.owner endon("pdrone_returning");
}
self endon("death");
self endon("emp_death");
var_01 = "axis";
if(self.script_team == "axis")
{
var_01 = "allies";
if(isdefined(self.mgturret))
{
foreach(var_03 in self.mgturret)
{
var_03.script_team = "axis";
}
}
}
for(;;)
{
wait(0.05);
if(self.reached_node && isdefined(self.drone_threat_data.threat))
{
thread pdrone_fire_at_enemy(self.drone_threat_data.threat,param_00);
self.drone_threat_data.threat common_scripts\utility::waittill_any("death","target_lost");
continue;
}
if(drone_parm("clear_look"))
{
self clearlookatent();
}
if(isdefined(self.owner))
{
self settargetyaw(self.owner.angles[1]);
}
}
}
//Function Number: 17
calculate_lateral_move_accuracy(param_00)
{
var_01 = param_00.origin - self.origin * (1,1,0);
var_01 = vectornormalize(var_01);
var_01 = (var_01[1],var_01[0] * -1,0);
var_02 = abs(vectordot(var_01,param_00 getvelocity()));
var_02 = clamp(var_02,0,250) / 250;
var_02 = 1 - var_02;
var_02 = clamp(var_02,0.3,1);
return var_02;
}
//Function Number: 18
calculate_stance_accuracy(param_00)
{
if(param_00 getstance() == "crouch")
{
return 0.75;
}
else if(param_00 getstance() == "prone")
{
return 0.5;
}
return 1;
}
//Function Number: 19
calculate_player_wounded_accuracy(param_00)
{
if(level.player maps\_utility::ent_flag("player_has_red_flashing_overlay"))
{
return 0.5;
}
return 1;
}
//Function Number: 20
calculate_aim_offset(param_00,param_01)
{
var_02 = self.origin - param_00.origin;
var_02 = var_02 * (1,1,0);
var_02 = vectornormalize(var_02);
if(isplayer(param_00))
{
param_01 = param_01 * calculate_lateral_move_accuracy(param_00);
param_01 = param_01 * calculate_stance_accuracy(param_00);
param_01 = param_01 * calculate_player_wounded_accuracy(param_00);
}
var_03 = vectorcross((0,0,1),var_02);
var_04 = var_03 * 10 / param_01 * randomfloatrange(-1,1);
var_05 = (0,0,5) / param_01 * randomfloatrange(-1,1);
return var_04 + var_05;
}
//Function Number: 21
pdrone_should_hold_fire()
{
if(self.drone_firing)
{
return 0;
}
if(self.drone_relocating)
{
return 1;
}
return !pdrone_fire_request();
}
//Function Number: 22
pdrone_fire_request()
{
var_00 = 2;
if(!isdefined(level.drone_fire_queue))
{
level.drone_fire_queue = [];
}
level.drone_fire_queue = common_scripts\utility::array_removeundefined(level.drone_fire_queue);
if(!common_scripts\utility::array_contains(level.drone_fire_queue,self))
{
level.drone_fire_queue = common_scripts\utility::array_add(level.drone_fire_queue,self);
}
for(var_01 = 0;var_01 < var_00;var_01++)
{
if(level.drone_fire_queue[var_01] == self)
{
return 1;
}
}
return 0;
}
//Function Number: 23
pdrone_fire_finished()
{
self.drone_firing = 0;
level.drone_fire_queue = common_scripts\utility::array_remove(level.drone_fire_queue,self);
}
//Function Number: 24
pdrone_cycle_fire_sound()
{
self.weapon_fire_sound = level.sdrone_weapon_fire_sound_next;
level.sdrone_weapon_fire_sound_next = level.sdrone_weapon_fire_sound_next + 1;
if(level.sdrone_weapon_fire_sound_next >= level.sdrone_weapon_fire_sounds.size)
{
level.sdrone_weapon_fire_sound_next = 0;
}
}
//Function Number: 25
pdrone_fire_at_enemy(param_00,param_01)
{
self notify("pdrone_fire_at_enemy");
self endon("pdrone_fire_at_enemy");
param_00 endon("death");
self endon("death");
self endon("emp_death");
self endon("pdrone_targeting");
if(isdefined(self.owner))
{
self.owner endon("pdrone_returning");
}
self notify("new_target");
self endon("new_target");
self.drone_firing = 0;
var_02 = param_00 geteye() - param_00.origin;
if(isdefined(param_00.inwater) && param_00.inwater)
{
var_03 = (0,0,var_02[2]);
}
else
{
var_03 = (0,0,var_03[2] / 2);
}
var_04 = 1;
if(isdefined(self.attack_accuracy))
{
var_04 = self.attack_accuracy;
}
if(isplayer(param_00))
{
var_05 = 0.15 * var_04;
}
else
{
var_05 = 0.3 * var_05;
}
var_06 = 0.095;
if(!isdefined(param_01))
{
param_01 = 0.25;
}
var_07 = param_01 - param_01 * 0.2;
var_08 = param_01 + param_01 * 0.2;
if(level.currentgen)
{
var_06 = 0.2499;
var_07 = var_07 * 2.5;
var_08 = var_08 * 2.5;
}
var_09 = var_03 + calculate_aim_offset(param_00,var_05);
if(!isdefined(self.fire_at_ent))
{
self.fire_at_ent = common_scripts\utility::spawn_tag_origin();
self.fire_at_ent thread drone_fire_at_ent_cleanup(self);
}
if(isdefined(self.fire_at_ent))
{
self setlookatent(self.fire_at_ent);
}
else
{
self setlookatent(param_00);
}
for(;;)
{
self setturrettargetent(param_00,var_09);
if(isdefined(self.fire_at_ent))
{
self.fire_at_ent unlink();
self.fire_at_ent.origin = param_00.origin + var_09;
self.fire_at_ent linkto(param_00);
}
if(pdrone_should_hold_fire())
{
wait(0.05);
continue;
}
var_0A = self.origin;
var_0B = self.angles;
var_0C = drone_parm("weap_fire_tags");
var_0D = var_0C[0];
if(self gettagindex(var_0D) != -1)
{
var_0B = self gettagangles(var_0D);
var_0A = self gettagorigin(var_0D);
}
if(pdrone_could_be_friendly_fire(var_0A,param_00.origin + var_09) || !isdefined(self.drone_threat_data.threat) || self.drone_threat_data.threat != param_00)
{
param_00 notify("target_lost");
return;
}
var_0E = randomfloatrange(2,3);
var_09 = var_03 + calculate_aim_offset(param_00,var_05);
while(var_0E > 0)
{
if(pdrone_should_hold_fire())
{
var_0E = randomfloatrange(2,3);
wait(0.05);
continue;
}
pdrone_cycle_fire_sound();
var_0F = randomfloatrange(var_07,var_08);
var_10 = min(var_0F,var_0E);
while(var_10 > 0)
{
if(pdrone_should_hold_fire())
{
var_10 = min(var_0F,var_0E);
var_0E = randomfloatrange(2,3);
wait(var_06);
pdrone_fire_finished();
continue;
}
self.drone_firing = 1;
var_0A = self.origin;
var_0B = self.angles;
if(self gettagindex(var_0D) != -1)
{
var_0B = self gettagangles(var_0D);
var_0A = self gettagorigin(var_0D);
}
var_11 = var_0A;
var_12 = compute_fireweapon_direction(var_11,var_0B,param_00.origin + var_09,10);
if(pdrone_could_be_friendly_fire(var_11,var_11 + var_12 * 10000))
{
param_00 notify("target_lost");
return;
}
pdrone_fire_weapon();
var_0E = var_0E - var_06;
var_10 = var_10 - var_06;
wait(var_06);
}
pdrone_fire_finished();
var_13 = randomfloatrange(0.5,1);
var_13 = min(var_13,var_0E);
if(var_13 > 0)
{
var_0E = var_0E - var_13;
wait(var_13);
}
}
}
}
//Function Number: 26
drone_fire_at_ent_cleanup(param_00)
{
param_00 waittill("death");
self delete();
}
//Function Number: 27
pdrone_fire_weapon()
{
var_00 = drone_parm("weap_fire_tags");
soundscripts\_snd_playsound::snd_play_linked(level.sdrone_weapon_fire_sounds[self.weapon_fire_sound]);
pdrone_gunshot_teammate();
foreach(var_02 in var_00)
{
self fireweapon(var_02);
self.shot_at_player = 1;
}
}
//Function Number: 28
pdrone_gunshot_teammate()
{
if(!isdefined(self.last_team_gunshot_announce) || gettime() - self.last_team_gunshot_announce > 1000)
{
self.last_team_gunshot_announce = gettime();
var_00 = getaiarray(self.team);
foreach(var_02 in var_00)
{
if(distancesquared(var_02.origin,self.origin) < 640000)
{
var_02 notify("gunshot_teammate",self.origin);
}
}
}
}
//Function Number: 29
compute_fireweapon_direction(param_00,param_01,param_02,param_03)
{
var_04 = vectortoangles(param_02 - param_00);
var_05 = anglessubtract(param_01,var_04);
var_05 = (clamp(var_05[0],0 - param_03,param_03),clamp(var_05[1],0 - param_03,param_03),0);
param_01 = anglessubtract(param_01,var_05);
var_06 = anglestoforward(param_01);
return var_06;
}
//Function Number: 30
anglessubtract(param_00,param_01)
{
return (angleclamp180(param_00[0] - param_01[0]),angleclamp180(param_00[1] - param_01[1]),angleclamp180(param_00[2] - param_01[2]));
}
//Function Number: 31
pdrone_could_be_friendly_fire(param_00,param_01)
{
if(self.script_team == "axis")
{
return 0;
}
return maps\_utility::shot_endangers_any_player(param_00,param_01);
}
//Function Number: 32
pdrone_damage_function(param_00,param_01,param_02,param_03,param_04,param_05,param_06)
{
if(isdefined(param_01) && isdefined(param_01.script_team) && self.script_team == param_01.script_team)
{
return;
}
if(param_04 == "MOD_ENERGY")
{
self dodamage(param_00 * 4,param_01.origin,param_01);
return;
}
if(isalive(self) && isdefined(param_01) && !isplayer(param_01))
{
self.health = int(min(self.maxhealth,self.health + param_00 * 0.7));
}
}
//Function Number: 33
play_death_explosion_fx()
{
playfx(common_scripts\utility::getfx("pdrone_death_explosion"),self gettagorigin("tag_origin"));
soundscripts\_snd::snd_message("pdrone_death_explode");
pdrone_notify_explosion();
}
//Function Number: 34
pdrone_notify_explosion()
{
var_00 = self gettagorigin("tag_origin");
var_01 = getaiarray("axis","allies","neutral");
var_01 = common_scripts\utility::get_array_of_closest(var_00,var_01,undefined,undefined,1500,undefined);
var_01 = maps\_utility::array_removedead_or_dying(var_01);
if(isdefined(var_01) && var_01.size > 0)
{
foreach(var_03 in var_01)
{
var_03 notify("explode",var_00);
}
}
}
//Function Number: 35
pdrone_handle_death()
{
self waittill("death",var_00);
if(!isdefined(self))
{
return;
}
setdvarifuninitialized("drone_spin_death_chance",0.85);
if(self.script_team != "allies" && !isdefined(self.owner) && randomfloat(1) <= getdvarfloat("drone_spin_death_chance"))
{
thread death_out_of_control(var_00);
return;
}
play_death_explosion_fx();
}
//Function Number: 36
pdrone_emp_death()
{
self endon("death");
self endon("in_air_explosion");
self notify("emp_death");
self.vehicle_stays_alive = 1;
var_00 = self vehicle_getvelocity();
var_01 = 60;
if(isdefined(level.get_pdrone_crash_location_override))
{
var_02 = [[ level.get_pdrone_crash_location_override ]]();
}
else
{
var_03 = (self.origin[0] + var_01[0] * 10,self.origin[1] + var_01[1] * 10,self.origin[2] - 2000);
var_02 = physicstrace(self.origin,var_03);
}
self notify("newpath");
self notify("deathspin");
thread drone_deathspin();
var_04 = 60;
self vehicle_setspeed(var_04,60,1000);
self setneargoalnotifydist(var_01);
self setvehgoalpos(var_02,0);
thread drone_emp_crash_movement(var_02,var_01,var_04);
common_scripts\utility::waittill_any("goal","near_goal");
self notify("stop_crash_loop_sound");
self notify("crash_done");
play_death_explosion_fx();
self delete();
}
//Function Number: 37
drone_deathspin()
{
level.scr_animtree["pdrone_dummy"] = #animtree;
level.scr_anim["pdrone_dummy"]["roll_left"][0] = %rotate_x_l;
level.scr_anim["pdrone_dummy"]["roll_right"][0] = %rotate_x_r;
var_00 = spawn("script_model",self.origin);
var_00.angles = self.angles;
var_00 linkto(self);
if(isdefined(self.death_model_override))
{
var_00 setmodel(self.death_model_override);
}
else
{
var_00 setmodel(self.model);
}
self hide();
stopfxontag(common_scripts\utility::getfx("drone_beacon_red"),self,"tag_origin");
playfxontag(common_scripts\utility::getfx("emp_drone_damage"),var_00,"TAG_ORIGIN");
var_00.animname = "pdrone_dummy";
var_00 maps\_utility::assign_animtree();
if(common_scripts\utility::cointoss())
{
var_01 = "roll_left";
}
else
{
var_01 = "roll_right";
}
var_00 thread maps\_anim::anim_loop_solo(var_00,var_01);
self waittill("death");
var_00 delete();
}
//Function Number: 38
drone_emp_crash_movement(param_00,param_01,param_02)
{
self endon("crash_done");
self clearlookatent();
self setmaxpitchroll(180,180);
self setyawspeed(400,100,100);
self setturningability(1);
var_03 = 1400;
var_04 = 800;
var_05 = undefined;
var_06 = 90 * randomintrange(-2,3);
for(;;)
{
if(!isdefined(self))
{
break;
}
if(self.origin[2] < param_00[2] + param_01)
{
self notify("near_goal");
}
if(common_scripts\utility::cointoss())
{
var_05 = self.angles[1] - 300;
self setyawspeed(var_03,var_04);
self settargetyaw(var_05);
self settargetyaw(var_05);
}
wait(0.05);
}
}
//Function Number: 39
death_out_of_control(param_00)
{
var_01 = spawn("script_model",self.origin);
var_01.angles = self.angles;
if(isdefined(self.death_model_override))
{
var_01 setmodel(self.death_model_override);
}
else
{
var_01 setmodel(self.model);
}
var_01 setcontents(0);
self setcontents(0);
self hide();
playfxontag(common_scripts\utility::getfx("emp_drone_damage"),var_01,"TAG_ORIGIN");
soundscripts\_snd::snd_message("pdrone_emp_death",var_01);
playfxontag(common_scripts\utility::getfx("ie_drone_thrusters"),var_01,"TAG_EXHAUST_REAR");
playfxontag(common_scripts\utility::getfx("ie_drone_thrusters_side"),var_01,"TAG_EXHAUST_LT");
playfxontag(common_scripts\utility::getfx("ie_drone_thrusters_side"),var_01,"TAG_EXHAUST_RT");
var_02 = (self.origin[0],self.origin[1],self.origin[2] - 500);
var_03 = physicstrace(self.origin,var_02);
var_04 = 0;
var_05 = param_00.origin - var_01.origin;
var_05 = vectornormalize(var_05);
var_06 = vectorcross((0,0,1),var_05);
var_06 = vectornormalize(var_06);
var_07 = 100;
var_08 = var_01.origin + var_06 * var_07;
var_09 = vectortoangles(var_01.origin - var_08);
var_0A = 1;
if(common_scripts\utility::cointoss())
{
var_0A = -1;
}
var_0B = 5;
var_0C = 25;
var_0D = 0;
var_0E = var_0B;
if(common_scripts\utility::cointoss())
{
var_0E = randomfloatrange(0,1);
}
var_0F = -2;
var_10 = var_0E + 1;
var_11 = 0;
var_12 = 0;
while(var_04 < var_0B)
{
wait(0.05);
var_04 = var_04 + 0.05;
if(!var_12 && var_10 < var_0B && var_04 >= var_10)
{
playfxontag(common_scripts\utility::getfx("emp_drone_damage"),var_01,"TAG_ORIGIN");
soundscripts\_snd::snd_message("pdrone_emp_death",var_01);
stopfxontag(common_scripts\utility::getfx("ie_drone_eye_emissive"),var_01,"TAG_MAIN_CAMERA");
var_12 = 1;
}
if(var_04 >= var_0E && var_04 < var_10)
{
if(!var_11)
{
playfxontag(common_scripts\utility::getfx("ie_drone_eye_emissive"),var_01,"TAG_MAIN_CAMERA");
var_11 = 1;
}
var_0F = var_0F + 0.5;
var_0D = clamp(var_0D - 2.5,var_0C * -1,var_0C);
}
else
{
var_0F = var_0F - 0.5;
var_0D = clamp(var_0D + 2.5,var_0C * -1,var_0C);
}
var_09 = var_09 + (0,abs(var_0D) * 0.4,0) * var_0A;
var_08 = var_08 + (0,0,var_0F);
var_13 = var_08 + anglestoforward(var_09) * var_07;
var_14 = physicstrace(var_01.origin,var_13,var_01);
var_01.origin = var_13;
var_01.angles = var_01.angles + (0,var_0D,0) * var_0A;
var_01.angles = (var_01.angles[0],var_01.angles[1],cos(var_04) * 10);
var_15 = length(var_03 - var_01.origin);
if(var_15 < 60 || var_01.origin[2] < var_03[2] + 15 || var_14 != var_13)
{
break;
}
}
playfx(common_scripts\utility::getfx("pdrone_death_explosion"),var_01.origin);
soundscripts\_snd::snd_message("pdrone_crash_land",var_01.origin);
var_01 pdrone_notify_explosion();
var_01 delete();
}
//Function Number: 40
destroy_drones_when_nuked()
{
self endon("death");
for(;;)
{
if(getdvar("debug_nuke") == "on")
{
self dodamage(self.health + 99999,(0,0,-500),level.player);
}
wait(0.05);
}
}
//Function Number: 41
flying_attack_drone_logic(param_00)
{
self notify("pdrone_flying_attack_drone_logic");
self endon("pdrone_flying_attack_drone_logic");
self endon("death");
param_00 = self;
param_00 childthread flying_attack_drone_damage_monitor();
param_00 thread flying_attack_drone_death_monitor();
setdvarifuninitialized("drone_attack_delay",1);
setdvarifuninitialized("drone_attack_accuracy",10);
setdvarifuninitialized("drone_attack_sight_required",0);
param_00.attack_delay = getdvarfloat("drone_attack_delay");
param_00.attack_accuracy = getdvarfloat("drone_attack_accuracy");
param_00.attack_sight_required = getdvarint("drone_attack_sight_required");
init_class_motion();
if(isdefined(param_00.target))
{
param_00 waittill("reached_dynamic_path_end");
}
if(!isdefined(level.player.drone_attack_nodes))
{
level.player thread player_attack_nodes_update();
}
param_00 childthread flying_attack_drone_goal_update();
}
//Function Number: 42
player_attack_nodes_update()
{
self notify("player_attack_nodes_update");
self endon("player_attack_nodes_update");
self endon("death");
self.drone_attack_nodes = [];
for(;;)
{
var_00 = 0;
if(isdefined(level.active_drones))
{
foreach(var_02 in level.active_drones)
{
if(isdefined(var_02) && var_02.mode == "attack")
{
var_00 = 1;
break;
}
}
}
if(!var_00)
{
self.drone_attack_nodes = undefined;
self notify("player_attack_nodes_update");
return;
}
var_04 = [];
var_05 = level.player.origin;
var_06 = level.player getnearestnode();
if(!isdefined(var_06))
{
wait(0.05);
continue;
}
var_07 = pdrone_get_nodes_in_radius(var_05,800,300,512);
var_08 = 0;
foreach(var_0A in var_07)
{
if(!nodesvisible(var_06,var_0A))
{
continue;
}
if(var_08 >= 3)
{
wait(0.05);
var_08 = 0;
}
var_08++;
if(!drone_validate_node(var_0A))
{
continue;
}
var_04[var_04.size] = var_0A;
}
self.drone_attack_nodes = var_04;
wait(1);
}
}
//Function Number: 43
drone_waittill_goal()
{
self.drone_relocating = 1;
self waittill("goal");
self.drone_relocating = 0;
}
//Function Number: 44
drone_monitor_player_aim()
{
var_00 = cos(3);
for(;;)
{
if(isalive(level.player))
{
var_01 = vectornormalize(self gettagorigin("tag_origin") - level.player geteye());
var_02 = anglestoforward(level.player getplayerangles());
if(vectordot(var_01,var_02) > var_00)
{
self notify("aimed_at");
}
}
wait(0.25);
}
}
//Function Number: 45
flying_attack_drone_goal_update()
{
self notify("flying_attack_drone_goal_update");
self endon("flying_attack_drone_goal_update");
self endon("death");
childthread drone_monitor_player_aim();
for(;;)
{
var_00 = common_scripts\utility::waittill_any_timeout(randomfloatrange(1,2),"aimed_at");
var_01 = self gettagorigin("tag_origin");
var_02 = self gettagangles("tag_origin");
var_03 = var_01;
if(common_scripts\utility::cointoss())
{
var_03 = var_03 + anglestoright(var_02) * 200;
}
else
{
var_03 = var_03 + anglestoright(var_02) * -200;
}
if(isdefined(level.player.drone_attack_nodes) && level.player.drone_attack_nodes.size > 0)
{
if(!isdefined(self.claimed_node))
{
var_04 = sortbydistance(level.player.drone_attack_nodes,var_03);
foreach(var_06 in var_04)
{
if(drone_node_claimed_by_other(var_06))
{
continue;
}
drone_claim_node(var_06);
break;
}
if(isdefined(self.claimed_node))
{
var_08 = self.claimed_node.origin;
var_09 = var_08[2] + 100;
init_class_motion(100,200,200);
if(isdefined(self.prev_attachedpath))
{
self setgoalyaw(vectortoyaw(var_08 - var_01));
self setvehgoalpos((self.origin[0],self.origin[1],max(var_09 + 500,var_01[2])),1);
drone_waittill_goal();
self setgoalyaw(vectortoyaw(var_08 - var_01));
self setvehgoalpos((var_08[0],var_08[1],max(var_09 + 500,var_01[2])),1);
drone_waittill_goal();
}
self setgoalyaw(vectortoyaw(var_08 - var_01));
self setvehgoalpos((var_08[0],var_08[1],max(var_09,var_01[2])),1);
drone_waittill_goal();
init_class_motion();
self setvehgoalpos((var_08[0],var_08[1],var_09),1);
drone_waittill_goal();
self.reached_node = 1;
}
}
var_0A = sortbydistance(level.player.drone_attack_nodes,var_03);
var_0B = self.claimed_node;
var_0C = var_01[2];
var_0D = 0;
foreach(var_06 in var_0A)
{
if(isdefined(self.claimed_node) && var_06 == self.claimed_node)
{
continue;
}
if(drone_node_claimed_by_other(var_06))
{
continue;
}
if(!isdefined(self.claimed_node))
{
var_0B = var_06;
break;
}
wait(0.05);
var_0F = level.player.origin[2] + 100;
var_10 = drone_validate_path_to(self.claimed_node,var_01[2],var_06,var_0F);
if(var_10)
{
var_0D = var_0D + 1;
}
else
{
wait(0.05);
var_10 = drone_validate_path_to(self.claimed_node,var_01[2],var_06,undefined);
if(var_10)
{
var_0D = var_0D + 1;
var_0F = var_06.origin[2] + 100;
}
}
if(var_10 && randomfloat(1) <= 1 / var_0D)
{
var_0B = var_06;
var_0C = var_0F;
if(var_0D >= 5 || var_00 == "aimed_at")
{
break;
}
}
}
if(isdefined(var_0B) && !isdefined(self.claimed_node) || var_0B != self.claimed_node)
{
while(self.drone_firing)
{
wait(0.05);
}
if(drone_node_claimed_by_other(var_0B))
{
continue;
}
drone_claim_node(var_0B);
init_class_motion();
self setmaxpitchroll(80,drone_parm("rollmax"));
self setvehgoalpos((var_0B.origin[0],var_0B.origin[1],var_0C),1);
drone_waittill_goal();
self.reached_node = 1;
self vehicle_setspeedimmediate(0.05,0.05,0.05);
}
}
}
}
//Function Number: 46
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: 47
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: 48
flying_attack_drone_death_monitor()
{
if(!isdefined(level.flying_attack_drones))
{
level.flying_attack_drones = [];
}
level.flying_attack_drones = common_scripts\utility::array_add(level.flying_attack_drones,self);
common_scripts\utility::waittill_any("death","pdrone_flying_attack_drone_logic");
level.flying_attack_drones = common_scripts\utility::array_remove(level.flying_attack_drones,self);
level notify("flying_attack_drone_destroyed");
}
//Function Number: 49
drone_investigate_try_location(param_00,param_01,param_02)
{
if((!isdefined(param_02) && !isdefined(level.dronespawners)) || level.dronespawners.size == 0)
{
return 0;
}
var_03 = pdrone_get_nodes_in_radius(param_00 + (0,0,-512),1000,0,1024);
if(var_03.size == 0)
{
return 0;
}
var_03 = sortbydistance(var_03,param_00);
var_04 = param_00;
param_00 = var_03[0].origin;
var_05 = 0;
if(!isdefined(param_01))
{
foreach(var_07 in level.drone_investigates)
{
if(distancesquared(var_03[0].origin,var_07) < 1000000)
{
var_05 = 1;
}
}
}
if(var_05)
{
return 0;
}
var_09 = param_02;
if(!isdefined(var_09))
{
level.dronespawners = sortbydistance(level.dronespawners,param_00);
var_0A = anglestoforward(level.player getplayerangles());
var_0B = cos(60);
var_09 = level.dronespawners[0];
foreach(param_02 in level.dronespawners)
{
var_0D = vectornormalize(param_02.origin - level.player.origin);
if(vectordot(var_0D,var_0A) > var_0B)
{
continue;
}
var_09 = param_02;
break;
}
}
var_0F = drone_spawner_get_height(var_09);
var_10 = 0;
var_11 = 0;
for(var_12 = 0;var_12 < var_03.size;var_12++)
{
if(var_11 >= 100)
{
return 0;
}
if(!nodesvisible(var_03[var_12],var_03[0]))
{
continue;
}
var_10 = drone_validate_node(var_03[var_12]);
if(!sighttracepassed(var_04 + (0,0,50),var_03[var_12].origin + (0,0,100),0,undefined,undefined,0))
{
var_10 = 0;
}
if(var_10)
{
break;
}
else
{
}
var_11++;
wait(0.05);
}
if(var_10)
{
var_13 = var_09;
if(level.dronespawnerexits.size > 0)
{
level.dronespawnerexits = sortbydistance(level.dronespawnerexits,param_00);
var_13 = level.dronespawnerexits[0];
}
level thread drone_investigate(var_09,var_13,var_03[var_12],var_0F,var_04,param_01);
}
return var_10;
}
//Function Number: 50
drone_spawner_get_height(param_00)
{
if(isdefined(param_00.script_parameters))
{
var_01 = int(param_00.script_parameters);
if(var_01 != 0)
{
return var_01;
}
}
return max(param_00.origin[2],1500);
}
//Function Number: 51
drone_validate_node(param_00)
{
var_01 = param_00.origin;
var_02 = var_01 + (0,0,10);
var_03 = (var_01[0],var_01[1],param_00.origin[2] + 10000);
var_04 = playerphysicstrace(var_02,var_03,level.player);
var_05 = distancesquared(var_04,var_03) < 0.01;
return var_05;
}
//Function Number: 52
drone_validate_path_to(param_00,param_01,param_02,param_03)
{
if(!isdefined(param_00))
{
return 0;
}
if(!isdefined(param_02))
{
return 0;
}
if(!isdefined(param_01))
{
param_01 = param_00.origin[2] + 100;
}
if(!isdefined(param_03))
{
param_03 = param_02.origin[2] + 100;
}
if(param_03 < param_02.origin[2] + 50)
{
return 0;
}
var_04 = (param_00.origin[0],param_00.origin[1],param_01);
var_05 = (param_00.origin[0],param_00.origin[1],param_03);
var_06 = playerphysicstrace(var_04,var_05,self);
if(distancesquared(var_05,var_06) < 0.01)
{
var_04 = (param_00.origin[0],param_00.origin[1],param_03);
var_05 = (param_02.origin[0],param_02.origin[1],param_03);
var_06 = playerphysicstrace(var_04,var_05,self);
return distancesquared(var_05,var_06) < 0.01;
}
return 0;
}
//Function Number: 53
drone_investigate(param_00,param_01,param_02,param_03,param_04,param_05)
{
var_06 = drone_spawn(param_00,"patrol");
var_06 childthread drone_investigate_thread(param_01,param_02,param_03,param_04,param_05);
}
//Function Number: 54
drone_investigate_thread(param_00,param_01,param_02,param_03,param_04)
{
var_05 = self;
var_06 = param_01.origin;
level.drone_investigates[level.drone_investigates.size] = var_06;
var_05 endon("death");
var_05 notify("drone_investigate");
var_05 endon("drone_investigate");
var_05 drone_abort_path();
level notify("drone_investigate_start",var_05);
level.aud_drone_investigating = 1;
var_07 = var_05.origin;
var_08 = (0,0,100);
var_09 = var_06 + var_08;
var_05 thread drone_investigate_cleanup(var_06);
var_05 thread drone_investigate_scan();
var_05 childthread drone_investigate_find_spots(param_01,var_07,param_02,param_03);
var_05 init_class_motion();
var_05 setgoalyaw(vectortoyaw(var_06 - var_07));
var_05 setvehgoalpos((var_07[0],var_07[1],param_02),1);
var_05 drone_waittill_goal();
var_05 init_class_motion(100,200,200);
var_05 setgoalyaw(vectortoyaw(var_06 - var_07));
var_05 setvehgoalpos((var_09[0],var_09[1],param_02),1);
var_05 drone_waittill_goal();
var_05 init_class_motion();
if(isdefined(param_04))
{
var_05 thread drone_investigate_spot(param_01,param_04[2],param_04,1);
}
else
{
var_05 thread drone_investigate_spot(param_01,param_03[2] + 100);
}
var_05 waittill("drone_investigate_spot_finished");
for(var_0A = 0;var_0A < min(var_05.investigatenodes.size,2);var_0A++)
{
if(isdefined(param_04))
{
var_05 thread drone_investigate_spot(var_05.investigatenodes[var_0A],param_04[2],param_04,1);
}
else
{
var_05 thread drone_investigate_spot(var_05.investigatenodes[var_0A]);
}
var_05 waittill("drone_investigate_spot_finished");
}
var_05 drone_return_home(param_00,self.prev_attachedpath);
}
//Function Number: 55
drone_return_home(param_00,param_01)
{
var_02 = self;
var_02 notify("drone_return_home");
var_02 endon("drone_return_home");
var_02 endon("death");
var_02 drone_set_mode("patrol",0);
if(!isdefined(param_00))
{
if(level.dronespawnerexits.size > 0)
{
level.dronespawnerexits = sortbydistance(level.dronespawnerexits,var_02.origin);
param_00 = level.dronespawnerexits[0];
}
}
if(!isdefined(param_00) && !isdefined(param_01))
{
return;
}
var_03 = param_00.origin;
if(isdefined(param_01))
{
var_03 = param_01.origin;
}
var_02 notify("drone_investigate_cleanup");
var_04 = drone_spawner_get_height(param_00);
var_02 setgoalyaw(vectortoyaw(param_00.origin - var_02.origin));
var_02 setvehgoalpos((var_02.origin[0],var_02.origin[1],var_04),1);
var_02 drone_waittill_goal();
level.aud_drone_investigating = 0;
var_02 init_class_motion(100,200,200);
var_02 setgoalyaw(vectortoyaw(var_03 - var_02.origin));
var_02 setvehgoalpos((var_03[0],var_03[1],var_04),1);
var_02 drone_waittill_goal();
if(isdefined(param_01))
{
var_02 thread maps\_vehicle_code::vehicle_paths_helicopter(param_01);
return;
}
if(isdefined(self.tagged))
{
var_02 maps\_tagging::tag_outline_enemy(0);
}
var_02 setvehgoalpos(param_00.origin,1);
var_02 drone_waittill_goal();
var_02 delete();
}
//Function Number: 56
drone_investigate_find_spots(param_00,param_01,param_02,param_03)
{
var_04 = 400;
var_05 = 40000;
var_06 = pdrone_get_nodes_in_radius(param_00.origin,var_04,0,512);
var_07 = [];
foreach(var_09 in var_06)
{
if(drone_node_claimed_by_other(var_09))
{
continue;
}
if(!nodesvisible(var_09,param_00))
{
continue;
}
if(distancesquared(var_09.origin,param_00.origin) < var_05)
{
continue;
}
var_0A = 0;
foreach(var_0C in var_07)
{
if(distancesquared(var_09.origin,var_0C.origin) < var_05)
{
var_0A = 1;
break;
}
}
if(var_0A)
{
continue;
}
wait(0.05);
if(drone_validate_node(var_09))
{
var_07[var_07.size] = var_09;
}
}
var_0F = common_scripts\utility::array_randomize(var_07);
var_10 = [];
foreach(var_09 in var_0F)
{
if(var_10.size == 0 && drone_validate_path_to(param_00,param_03[2] + 100,var_09,undefined))
{
var_10[var_10.size] = var_09;
}
else if(var_10.size > 0 && drone_validate_path_to(var_10[var_10.size - 1],undefined,var_09,undefined))
{
var_10[var_10.size] = var_09;
}
wait(0.05);
}
self.investigatenodes = var_10;
}
//Function Number: 57
drone_node_claimed_by_other(param_00)
{
if(!isdefined(param_00))
{
return 0;
}
if(!isdefined(param_00.claimed_drone))
{
return 0;
}
if(param_00.claimed_drone == self)
{
return 0;
}
return 1;
}
//Function Number: 58
drone_claim_node(param_00)
{
if(isdefined(self.claimed_node))
{
self.claimed_node.claimed_drone = undefined;
self.claimed_node = undefined;
}
if(isdefined(param_00))
{
if(isdefined(param_00.claimed_drone) && param_00.claimed_drone != self)
{
param_00.claimed_drone notify("node_kicked");
param_00.claimed_drone drone_claim_node(undefined);
}
self.claimed_node = param_00;
param_00.claimed_drone = self;
}
}
//Function Number: 59
drone_investigate_spot(param_00,param_01,param_02,param_03)
{
self notify("drone_investigate_spot");
self endon("drone_investigate_spot");
self endon("drone_investigate");
self endon("death");
drone_claim_node(param_00);
if(!isdefined(param_03))
{
param_03 = 0;
}
if(!isdefined(param_01))
{
param_01 = param_00.origin[2] + 100;
}
var_04 = (param_00.origin[0],param_00.origin[1],param_01);
self.visiting_player_from_node = undefined;
init_class_motion();
self cleargoalyaw();
if(isdefined(param_02))
{
drone_security_bays_open(1);
self settargetyaw(vectortoyaw(param_02 - self.origin));
}
else
{
drone_security_bays_open(0);
self settargetyaw(vectortoyaw(var_04 - self.origin));
}
self setvehgoalpos(var_04,1);
var_05 = "timeout";
while(var_05 == "timeout")
{
if(isdefined(param_02))
{
self settargetyaw(vectortoyaw(param_02 - self.origin));
}
var_05 = common_scripts\utility::waittill_any_timeout(0.05,"goal");
}
self.reached_node = 1;
self vehicle_setspeedimmediate(0.05,0.05,0.05);
var_06 = self.angles[1];
var_07 = 1;
while(var_07)
{
var_07 = 0;
for(var_08 = 0;var_08 < 4;var_08++)
{
var_09 = 2;
self.scantime = 0;
var_0A = 0;
while(var_09 > 0)
{
var_0B = var_06 + var_08 * 90;
if(isdefined(param_02))
{
var_0B = vectortoyaw(param_02 - self.origin);
}
var_0C = drone_investigate_yaw(var_0B);
if(var_0C > 0)
{
var_0A = var_0A + 0.05;
var_09 = 2;
}
if(var_0A > 0.5)
{
var_07 = 1;
if(var_0C > 250)
{
childthread drone_investigate_visit_player_from(param_00);
}
}
var_09 = var_09 - 0.05;
self.scantime = self.scantime + 0.05;
wait(0.05);
}
if(!param_03)
{
param_02 = undefined;
}
}
}
init_class_motion();
self.scantime = 0;
if(isdefined(self.investigate_spot_return_to) && self.investigate_spot_return_to.size > 0)
{
var_0D = self.investigate_spot_return_to[self.investigate_spot_return_to.size - 1];
self.investigate_spot_return_to[self.investigate_spot_return_to.size - 1] = undefined;
thread drone_investigate_spot(var_0D);
return;
}
self cleartargetyaw();
self notify("drone_investigate_spot_finished");
}
//Function Number: 60
drone_investigate_visit_player_from(param_00)
{
if(isdefined(self.visiting_player_from_node))
{
return;
}
self.visiting_player_from_node = param_00;
var_01 = pdrone_get_nodes_in_radius(level.player.origin - (0,0,256),512,128,512);
var_01 = sortbydistance(var_01,level.player.origin);
foreach(var_03 in var_01)
{
if(distancesquared(var_03.origin,param_00.origin) < 22500)
{
self.visiting_player_from_node = undefined;
return;
}
wait(0.05);
if(drone_validate_path_to(param_00,undefined,var_03,level.player.origin[2] + 100))
{
wait(0.05);
if(drone_validate_path_to(var_03,level.player.origin[2],param_00,undefined))
{
if(!isdefined(self.investigate_spot_return_to))
{
self.investigate_spot_return_to = [];
}
self.investigate_spot_return_to[self.investigate_spot_return_to.size] = param_00;
thread drone_investigate_spot(var_03,level.player.origin[2] + 100,level.player.origin);
return;
}
}
}
self.visiting_player_from_node = undefined;
}
//Function Number: 61
drone_investigate_scan()
{
self endon("death");
self endon("drone_investigate");
self.scanning = 0;
self.scantime = 0;
self.scantag childthread drone_investigate_scan_tag_think(self);
for(;;)
{
if(self.scantag.seeing)
{
wait(0.05);
continue;
}
if((self.scantime <= 0.3 || self.mode == "attack") && self.scanning)
{
level notify("aud_stop_drone_scanning");
stopfxontag(level._effect["drone_scan"],self.scantag,"tag_origin");
self.scanning = 0;
self.scantag.active = 0;
}
else if(self.scantime > 0.3 && !self.scanning)
{
self.scantag linkto(self,"tag_top_camera",(0,0,0),(0,-45,0));
wait(0.05);
self.scantag rotatebylinked((0,90,0),1.7,0,0);
self.scantag.active = 1;
self.scantagaudio soundscripts\_snd_playsound::snd_play_loop_linked("sdrn_scan_lp","aud_stop_drone_scanning",0.1,0.1);
playfxontag(level._effect["drone_scan"],self.scantag,"tag_origin");
self.scanning = 1;
}
wait(0.05);
}
}
//Function Number: 62
drone_investigate_scan_tag_think(param_00)
{
self.seeing = 0;
for(;;)
{
self waittill("sight");
self linkto(param_00,"tag_top_camera",(0,0,0),(0,0,0));
self.seeing = 1;
wait(3);
self.seeing = 0;
}
}
//Function Number: 63
drone_security_scan_tag_cleanup(param_00)
{
self notify("drone_security_scan_tag_cleanup");
self endon("drone_security_scan_tag_cleanup");
param_00 waittill("death");
if(isdefined(self))
{
self delete();
}
}
//Function Number: 64
drone_security_scan_tag_audio(param_00,param_01)
{
self notify("drone_security_scan_tag_audio");
self endon("drone_security_scan_tag_audio");
param_00 endon("death");
self endon("death");
var_02 = 0;
while(isdefined(self) && isdefined(param_00) && isdefined(param_00.scantag))
{
var_03 = param_01;
var_04 = distancesquared(level.player.origin,param_00.scantag.origin);
if(var_04 < param_01 * param_01)
{
var_03 = sqrt(var_04);
}
if(var_02 != var_03)
{
self unlink();
var_02 = var_03;
self.origin = param_00.scantag.origin;
self.origin = self.origin + anglestoforward(param_00.scantag.angles) * var_02;
self linkto(param_00.scantag);
}
wait(0.05);
}
}
//Function Number: 65
drone_investigate_yaw(param_00)
{
if(isdefined(self.last_saw_player) && gettime() - self.last_saw_player_time < 1000)
{
self settargetyaw(vectortoyaw(self.last_saw_player - self.origin));
return gettime() - self.last_saw_player_time;
}
self settargetyaw(param_00);
return -1;
}
//Function Number: 66
drone_investigate_cleanup(param_00)
{
self.investigating = 1;
common_scripts\utility::flag_set("drones_investigating");
common_scripts\utility::waittill_any("death","drone_investigate","drone_investigate_cleanup");
level.drone_investigates = common_scripts\utility::array_remove(level.drone_investigates,param_00);
if(isdefined(self))
{
self.investigating = undefined;
level notify("drone_investigate_finished",self);
}
wait(0.1);
if(level.drone_investigates.size == 0)
{
common_scripts\utility::flag_clear("drones_investigating");
}
}
//Function Number: 67
drone_spawn(param_00,param_01)
{
if(!isdefined(param_01))
{
param_01 = "patrol";
}
if(!isdefined(param_00))
{
return undefined;
}
var_02 = drone_spawn_single_struct(param_00);
if(!isdefined(var_02))
{
return undefined;
}
var_02 thread drone_active_thread();
var_02 drone_set_mode(param_01);
return var_02;
}
//Function Number: 68
drone_spawn_and_drive(param_00,param_01)
{
if(!isdefined(param_01))
{
param_01 = "patrol";
}
if(!isdefined(param_00))
{
return [];
}
var_02 = common_scripts\utility::getstructarray(param_00,"targetname");
var_03 = [];
foreach(var_05 in var_02)
{
var_06 = drone_spawn_single_struct(var_05);
var_06 thread drone_active_thread();
var_06 drone_set_mode(param_01);
var_03[var_03.size] = var_06;
}
return var_03;
}
//Function Number: 69
drone_spawn_single_struct(param_00)
{
if(!isdefined(level.dronespawnertemplate))
{
return undefined;
}
while(isdefined(level.dronespawnertemplate.vehicle_spawned_thisframe))
{
wait(0.05);
}
level.dronespawnertemplate.origin = param_00.origin;
level.dronespawnertemplate.angles = param_00.angles;
level.dronespawnertemplate.target = param_00.target;
level.dronespawnertemplate.script_noteworthy = param_00.script_noteworthy;
var_01 = level.dronespawnertemplate maps\_vehicle::spawn_vehicle_and_gopath();
return var_01;
}
//Function Number: 70
drone_active_thread()
{
if(!isdefined(level.last_drone_attacking_sound))
{
level.last_drone_attacking_sound = 0;
}
if(!isdefined(level.last_drone_investigating_sound))
{
level.last_drone_investigating_sound = 0;
}
if(!isdefined(level.last_drone_passive_sound))
{
level.last_drone_passive_sound = 0;
}
if(!isdefined(level.last_drone_lens_sound))
{
level.last_drone_lens_sound = 0;
}
if(!isdefined(level.active_drones))
{
level.active_drones = [];
}
level.active_drones = common_scripts\utility::array_add(level.active_drones,self);
level.player thread drone_closest();
childthread drone_random_vocalizations();
childthread drone_spin_monitor();
self waittill("death");
level.active_drones = common_scripts\utility::array_remove(level.active_drones,self);
}
//Function Number: 71
drone_closest()
{
self notify("drone_closest");
self endon("drone_closest");
while(isdefined(level.active_drones) && isdefined(self))
{
var_00 = sortbydistance(level.active_drones,self.origin);
if(var_00.size > 0)
{
self.closest_drone = var_00[0];
continue;
}
self.closest_drone = undefined;
wait(0.5);
}
}
//Function Number: 72
drone_spin_monitor()
{
self endon("death");
var_00 = 0;
var_01 = angleclamp180(self gettagangles("tag_origin")[1]);
while(isdefined(self))
{
var_02 = angleclamp180(self gettagangles("tag_origin")[1]);
if(abs(var_02 - var_01) > 1)
{
if(!var_00)
{
soundscripts\_snd_playsound::snd_play_linked("sdrone_pivot");
}
var_00 = 1;
}
else
{
var_00 = 0;
}
var_01 = var_02;
wait(0.05);
}
}
//Function Number: 73
drone_random_vocalizations()
{
self endon("death");
while(isdefined(self))
{
if(!common_scripts\utility::flag("_stealth_spotted") && common_scripts\utility::flag("drones_investigating"))
{
if(gettime() - level.last_drone_investigating_sound > 3000)
{
var_00 = level.player.closest_drone;
if(isdefined(var_00))
{
level.last_drone_investigating_sound = gettime();
if(randomint(5) > 1)
{
var_00 soundscripts\_snd_playsound::snd_play_linked("sdrone_voc_suspicious");
}
else
{
var_00 soundscripts\_snd_playsound::snd_play_linked("sdrone_voc_aggressive");
}
}
}
if(randomint(5) > 3 && gettime() - level.last_drone_lens_sound > 3000)
{
var_00 = level.player.closest_drone;
if(isdefined(var_00))
{
level.last_drone_lens_sound = gettime();
var_00 soundscripts\_snd_playsound::snd_play_linked("sdrone_lens_movement");
}
}
wait(randomfloatrange(0.2,6));
continue;
}
if(gettime() - level.last_drone_passive_sound > 5000)
{
var_00 = level.player.closest_drone;
if(isdefined(var_00))
{
level.last_drone_passive_sound = gettime();
var_00 soundscripts\_snd_playsound::snd_play_linked("sdrone_voc_curious");
}
}
wait(randomfloatrange(5,10));
wait(0.05);
}
}
//Function Number: 74
drone_alert_sight(param_00,param_01,param_02,param_03,param_04)
{
self notify("drone_alert_sight");
self endon("death");
self endon("drone_alert_sight");
self.threatsightdelayenabled = 1;
self.threatsightdelayfalloff = 1;
self.threatsightdelay = 0;
self.corpse_array_time = 0;
if(!isdefined(self.fovcosinez) || self.fovcosinez == 0)
{
self.fovcosinez = cos(10);
}
if(!isdefined(self.fovcosine) || self.fovcosine == 0)
{
self.fovcosine = cos(45);
}
if(!isdefined(param_03))
{
param_03 = 1;
}
if(!isdefined(param_04))
{
param_04 = 1;
}
var_05 = 0.05;
for(;;)
{
if(!isdefined(level._stealth) || !common_scripts\utility::flag_exist("_stealth_enabled") || !common_scripts\utility::flag("_stealth_enabled"))
{
wait(0.05);
continue;
}
var_06 = getdvarfloat("ai_threatSightDelayDistMin");
var_07 = getdvarfloat("ai_threatSightDelayDistMax");
var_08 = getdvarfloat("ai_threatSightDelayRateMin");
var_09 = getdvarfloat("ai_threatSightDelayRateMax");
var_0A = level.player.maxvisibledist;
if(isai(self))
{
var_0B = self geteye();
var_0C = anglestoforward(self.angles);
}
else
{
var_0B = self gettagorigin("tag_origin");
var_0C = anglestoforward(self gettagangles("tag_origin"));
}
var_0D = var_0A;
if(isdefined(level._stealth) && isdefined(level._stealth.logic) && isdefined(level._stealth.logic.detect_range))
{
var_0E = level._stealth.logic.detect_range["hidden"][level.player getstance()];
if(isdefined(var_0E))
{
var_0D = min(var_0E,var_0D);
}
}
var_0F = drone_alert_sight_check(level.player,var_0B,param_01,param_02,var_0D * param_03);
self.canseeplayer = var_0F != 0;
if(self.canseeplayer)
{
if(var_0F <= var_06 * var_06)
{
self.threatsightdelay = self.threatsightdelay + var_05;
}
else
{
var_10 = sqrt(var_0F);
if(param_04 != 1)
{
var_11 = var_10 / param_04;
var_12 = vectornormalize(level.player.origin - var_0B);
var_13 = vectordot(var_12,var_0C);
var_14 = var_13 - self.fovcosine / 1 - self.fovcosine;
var_10 = var_10 + var_11 - var_10 * var_14;
}
var_15 = clamp(var_10 - var_06 / var_07 - var_06,0,1);
var_16 = var_08 + var_09 - var_08 * var_15;
self.threatsightdelay = self.threatsightdelay + var_05 * var_16;
}
self.last_saw_player = level.player.origin;
self.last_saw_player_time = gettime();
level.player.stealth_can_be_seen = 1;
}
else
{
var_17 = getdvarfloat("ai_threatSightDelayFalloff");
self.threatsightdelay = self.threatsightdelay - var_05 * var_17;
}
if(!self.canseeplayer)
{
if(gettime() > self.corpse_array_time)
{
self.corpse_array = sortbydistance(getcorpsearray(),self.origin,1000,1);
self.corpse_array_time = gettime() + randomintrange(500,1000);
}
if(isdefined(self.corpse_array))
{
foreach(var_19 in self.corpse_array)
{
if(!isdefined(var_19))
{
continue;
}
if(isdefined(var_19.corpse_seen_by) && isdefined(var_19.corpse_seen_by[self getentitynumber()]))
{
continue;
}
if(drone_alert_sight_check(var_19,var_0B,param_01,param_02,1000) != 0)
{
var_19.corpse_seen_by[self getentitynumber()] = 1;
self notify("see_corpse",var_19);
wait(0.05);
}
}
}
}
self.threatsightdelay = clamp(self.threatsightdelay,0,1);
if(self.threatsightdelay >= 1)
{
self notify(param_00);
return;
}
wait(var_05);
}
}
//Function Number: 75
drone_alert_sight_check(param_00,param_01,param_02,param_03,param_04)
{
if(isdefined(param_00.ignoreme) && param_00.ignoreme)
{
return 0;
}
var_05 = param_00.origin + (0,0,20);
if(isplayer(param_00))
{
var_05 = param_00 geteye();
}
var_06 = var_05 - param_01;
var_07 = lengthsquared(var_06);
var_08 = 0;
var_09 = 4900;
if(var_07 < var_09)
{
var_08 = var_07;
}
else
{
if(drone_alert_sight_can_see(var_05,param_04,1,isplayer(param_00)))
{
var_08 = var_07;
}
if(var_08 == 0 && isplayer(param_00) && isdefined(param_02) && param_02.active)
{
if(param_02 drone_alert_sight_can_see(var_05,param_03,0,isplayer(param_00)))
{
var_08 = var_07;
}
if(var_08 != 0)
{
param_02 notify("sight",var_05);
}
}
}
return var_08;
}
//Function Number: 76
drone_alert_sight_can_see(param_00,param_01,param_02,param_03)
{
var_04 = self gettagorigin("tag_origin");
if(isai(self))
{
var_04 = self geteye();
}
var_05 = param_00 - var_04;
var_06 = lengthsquared(var_05);
var_07 = param_01 * param_01;
var_08 = var_06 <= var_07;
var_09 = getdvarfloat("ai_threatSightDelayDistMin");
if(var_08)
{
if(isai(self) && param_03 && !isdefined(self.sight_ignore))
{
var_08 = self cansee(level.player);
}
else
{
var_0A = anglestoforward(self gettagangles("tag_origin"));
var_05 = param_00 - var_04;
var_0B = vectornormalize(var_05);
var_0C = vectordot(var_0A,var_0B);
var_08 = var_0C >= self.fovcosine;
if(var_08)
{
if(self.fovcosinez > self.fovcosine && isdefined(self.sight_ignore) || lengthsquared(var_05) > var_09 * var_09)
{
var_0D = (var_0A[0],var_0A[1],0) * length((var_05[0],var_05[1],0));
var_0E = var_04 + (var_0D[0],var_0D[1],var_05[2]);
var_0F = vectornormalize(var_0E - var_04);
var_10 = vectordot(var_0F,var_0A);
var_08 = var_10 >= self.fovcosinez;
}
if(var_08)
{
var_08 = sighttracepassed(var_04,param_00,0,self.sight_ignore,self,param_02);
}
}
}
}
return var_08;
}
//Function Number: 77
drone_set_mode(param_00,param_01)
{
self endon("death");
if(!isdefined(param_00))
{
return;
}
if(!isdefined(param_01))
{
param_01 = 1;
}
var_02 = self;
var_03 = 0;
if(isdefined(var_02.mode) && var_02.mode == param_00)
{
return;
}
if(!isdefined(var_02.mode))
{
var_03 = 1;
var_02.reached_node = 0;
var_02 useanimtree(#animtree);
if(param_00 == "attack")
{
var_02 setanim(%ie_drone_deploy,1,0,1);
var_02 setanimtime(%ie_drone_deploy,1);
var_02.bays_open = 1;
}
else
{
var_02 setanim(%ie_drone_retract,1,0,1);
var_02 setanimtime(%ie_drone_retract,1);
var_02.bays_open = 0;
}
}
self notify("drone_set_mode");
self endon("drone_set_mode");
var_04 = var_02.mode;
var_02.mode = param_00;
if(!isdefined(var_02.scantag))
{
var_02.scantag = common_scripts\utility::spawn_tag_origin();
var_02.scantag thread drone_security_scan_tag_cleanup(var_02);
var_02.scantag.fovcosinez = 0;
var_02.scantag.fovcosine = cos(30);
var_02.scantag.active = 0;
var_02.scantag.sight_ignore = var_02;
var_02.scantagaudio = common_scripts\utility::spawn_tag_origin();
var_02.scantagaudio thread drone_security_scan_tag_cleanup(var_02);
var_02.scantagaudio thread drone_security_scan_tag_audio(var_02,300);
}
if(isdefined(level.stealth_spotted_drones))
{
level.stealth_spotted_drones = common_scripts\utility::array_remove(level.stealth_spotted_drones,self);
}
wait(0.1);
switch(param_00)
{
case "patrol":
var_02.fovcosinez = cos(15);
var_02.fovcosine = cos(55);
var_02 notify("stealth_spotted_drone_death_monitor");
var_02 clearlookatent();
var_02 cleargoalyaw();
var_02 notify("pdrone_targeting");
var_02 notify("pdrone_flying_attack_drone_logic");
if(param_01)
{
var_02 thread drone_alert_sight("attack",var_02.scantag,300,1,2);
var_02 thread drone_wait_for_attack();
var_02 thread drone_corpse_monitor();
}
if(isdefined(var_04))
{
var_02 thread drone_security_prepare_patrol(var_03);
}
break;
case "attack":
var_02.fovcosinez = cos(60);
var_02.fovcosine = cos(60);
var_02 notify("drone_investigate");
var_02 notify("drone_corpse_monitor");
var_02 notify("drone_alert_sight");
var_02 notify("drone_wait_for_attack");
var_02 thread drone_security_prepare_attack(var_03);
break;
}
}
//Function Number: 78
drone_corpse_monitor()
{
self notify("drone_corpse_monitor");
self endon("drone_corpse_monitor");
self endon("death");
for(;;)
{
self waittill("see_corpse",var_00);
var_01 = pdrone_get_nodes_in_radius(var_00.origin,500,0,500);
var_01 = sortbydistance(var_01,var_00.origin,500,1);
if(isdefined(var_01) && var_01.size > 0)
{
drone_investigate_thread(undefined,var_01[0],var_01[0].origin[2] + 500,var_00.origin);
}
}
}
//Function Number: 79
drone_security_bays_open(param_00)
{
if(!isdefined(self.bays_open))
{
self.bays_open = 0;
}
if(self.bays_open != param_00)
{
self.bays_open = param_00;
if(param_00)
{
soundscripts\_snd_playsound::snd_play_linked("sdrone_wpn_bays_open");
playfxontag(level._effect["ie_drone_gun_lights"],self,"tag_origin");
self setanimrestart(%ie_drone_deploy,1,0,1);
self setanim(%ie_drone_retract,0,0,1);
wait(getanimlength(%ie_drone_deploy));
return;
}
soundscripts\_snd_playsound::snd_play_linked("sdrone_wpn_bays_close");
stopfxontag(level._effect["ie_drone_gun_lights"],self,"tag_origin");
self setanimrestart(%ie_drone_retract,1,0,1);
self setanim(%ie_drone_deploy,0,0,1);
wait(getanimlength(%ie_drone_retract));
}
}
//Function Number: 80
drone_security_prepare_patrol(param_00)
{
self notify("drone_security_prepare_attack");
self notify("drone_security_prepare_patrol");
self endon("drone_security_prepare_attack");
self endon("drone_security_prepare_patrol");
self vehicle_setspeedimmediate(0.05,0.05,0.05);
if(gettime() - level.last_drone_passive_sound > 2000)
{
var_01 = level.player.closest_drone;
if(isdefined(var_01))
{
level.last_drone_passive_sound = gettime();
var_01 soundscripts\_snd_playsound::snd_play_linked("sdrone_voc_curious");
}
if(!param_00)
{
wait(0.75);
}
}
if(!param_00)
{
drone_security_bays_open(0);
wait(0.5);
}
init_class_motion();
}
//Function Number: 81
drone_abort_path()
{
if(isdefined(self.attachedpath))
{
self.prev_attachedpath = self.attachedpath;
var_00 = self gettagorigin("tag_origin");
self.reached_node = 1;
self notify("newpath");
self vehicle_helisetai(var_00,0,0,0,1,0,self gettagangles("tag_origin")[1],0,0,1,0,0,1,1);
}
}
//Function Number: 82
drone_security_prepare_attack(param_00)
{
self notify("drone_security_prepare_attack");
self notify("drone_security_prepare_patrol");
self endon("drone_security_prepare_attack");
self endon("drone_security_prepare_patrol");
self endon("death");
thread drone_security_prepare_attack_relay(randomfloatrange(0.3,0.6));
drone_abort_path();
self vehicle_setspeedimmediate(0.05,0.05,0.05);
self setlookatent(level.player);
if(gettime() - level.last_drone_attacking_sound > 6000)
{
var_01 = level.player.closest_drone;
if(isdefined(var_01))
{
level.last_drone_attacking_sound = gettime();
var_01 soundscripts\_snd_playsound::snd_play_linked("sdrone_alert");
}
if(!param_00)
{
wait(0.75);
}
}
if(!param_00)
{
drone_security_bays_open(1);
wait(0.5);
}
thread flying_attack_drone_logic();
thread pdrone_targeting(1);
self notify("reached_dynamic_path_end");
wait(0.05);
self setlookatent(level.player);
self setmaxpitchroll(80,drone_parm("rollmax"));
}
//Function Number: 83
drone_mode_population(param_00)
{
if(!isdefined(level.active_drones))
{
return 0;
}
var_01 = 0;
foreach(var_03 in level.active_drones)
{
if(isdefined(var_03) && var_03.mode == param_00)
{
var_01++;
}
}
return var_01;
}
//Function Number: 84
drone_security_prepare_attack_relay(param_00)
{
self notify("drone_security_prepare_attack_relay");
self endon("drone_security_prepare_attack_relay");
self endon("drone_security_prepare_attack");
self endon("drone_security_prepare_patrol");
self endon("drone_set_mode");
self endon("death");
wait(param_00);
while(isdefined(self) && drone_mode_population("attack") >= 4)
{
wait(1);
}
if(!isdefined(self))
{
return;
}
var_01 = sortbydistance(level.active_drones,self.origin);
foreach(var_03 in var_01)
{
if(var_03 != self && distancesquared(var_03.origin,self.origin) < 1000000 && !isdefined(var_03.mode) || var_03.mode != "attack")
{
var_03 drone_set_mode("attack");
break;
}
}
}
//Function Number: 85
drone_wait_for_attack()
{
self notify("drone_wait_for_attack");
self endon("death");
self endon("drone_wait_for_attack");
var_00 = common_scripts\utility::waittill_any_return("attack","damage");
if(!common_scripts\utility::flag("_stealth_spotted"))
{
level.player soundscripts\_snd_playsound::snd_play_2d("irons_spotted_alert");
}
common_scripts\utility::flag_set("_stealth_spotted");
if(isdefined(self))
{
thread drone_set_mode("attack");
}
}