/******************************************************************* * Decompiled By: Bog * Decompiled File: _drone.gsc * Game: Call of Duty: Advanced Warfare * Platform: PC * Function Count: 27 * Decompile Time: 399 ms * Timestamp: 4/22/2024 2:20:46 AM *******************************************************************/ //Function Number: 1 initglobals() { if(getdvar("debug_drones") == "") { setdvar("debug_drones","0"); } if(!isdefined(level.lookahead_value)) { level.drone_lookahead_value = 200; } if(!isdefined(level.max_drones)) { level.max_drones = []; } if(!isdefined(level.max_drones["allies"])) { level.max_drones["allies"] = 99999; } if(!isdefined(level.max_drones["axis"])) { level.max_drones["axis"] = 99999; } if(!isdefined(level.max_drones["team3"])) { level.max_drones["team3"] = 99999; } if(!isdefined(level.max_drones["neutral"])) { level.max_drones["neutral"] = 99999; } if(!isdefined(level.drones)) { level.drones = []; } if(!isdefined(level.drones["allies"])) { level.drones["allies"] = maps\_utility::struct_arrayspawn(); } if(!isdefined(level.drones["axis"])) { level.drones["axis"] = maps\_utility::struct_arrayspawn(); } if(!isdefined(level.drones["team3"])) { level.drones["team3"] = maps\_utility::struct_arrayspawn(); } if(!isdefined(level.drones["neutral"])) { level.drones["neutral"] = maps\_utility::struct_arrayspawn(); } level.drone_spawn_func = ::drone_init; } //Function Number: 2 drone_init() { if(level.drones[self.team].array.size >= level.max_drones[self.team]) { self delete(); return; } thread drone_array_handling(self); level notify("new_drone"); self setcandamage(1); maps\_drone_base::drone_give_soul(); if(isdefined(self.script_drone_override)) { return; } thread drone_monitor_damage_shield(); thread drone_death_thread(); if(isdefined(self.target)) { if(!isdefined(self.script_moveoverride)) { thread drone_move(); } else { thread drone_wait_move(); } } if(isdefined(self.script_looping) && self.script_looping == 0) { return; } thread drone_idle(); } //Function Number: 3 drone_array_handling(param_00) { maps\_utility::structarray_add(level.drones[param_00.team],param_00); var_01 = param_00.team; param_00 waittill("death"); if(isdefined(param_00) && isdefined(param_00.struct_array_index)) { maps\_utility::structarray_remove_index(level.drones[var_01],param_00.struct_array_index); return; } maps\_utility::structarray_remove_undefined(level.drones[var_01]); } //Function Number: 4 drone_death_thread() { drone_wait_for_death(); if(!isdefined(self)) { return; } var_00 = "stand"; if(isdefined(self.animset) && isdefined(level.drone_anims[self.team][self.animset]) && isdefined(level.drone_anims[self.team][self.animset]["death"])) { var_00 = self.animset; } var_01 = level.drone_anims[self.team][var_00]["death"]; if(isdefined(self.deathanim)) { var_01 = self.deathanim; } self notify("death"); if(isdefined(level.drone_death_handler)) { self thread [[ level.drone_death_handler ]](var_01); return; } if(!isdefined(self.noragdoll) && isdefined(self.skipdeathanim)) { if(isdefined(self.noragdoll)) { drone_play_scripted_anim(var_01,"deathplant"); } else if(isdefined(self.skipdeathanim)) { self startragdoll(); drone_play_scripted_anim(var_01,"deathplant"); } else { drone_play_scripted_anim(var_01,"deathplant"); self startragdoll(); } } self notsolid(); thread drone_thermal_draw_disable(2); if(isdefined(self) && isdefined(self.nocorpsedelete)) { return; } wait(10); while(isdefined(self)) { if(!common_scripts\utility::within_fov(level.player.origin,level.player.angles,self.origin,0.5)) { self delete(); } wait(5); } } //Function Number: 5 drone_monitor_damage_shield() { self endon("death"); for(;;) { while(!isdefined(self.damageshield) || !self.damageshield) { wait(0.05); } var_00 = self.health; self.health = 100000; while(isdefined(self.damageshield) && self.damageshield) { wait(0.05); } self.health = var_00; wait(0.05); } } //Function Number: 6 drone_wait_for_death() { self endon("death"); while(isdefined(self)) { self waittill("damage"); if(isdefined(self.damageshield) && self.damageshield) { self.health = 100000; continue; } if(self.health <= 0) { break; } } } //Function Number: 7 drone_thermal_draw_disable(param_00) { wait(param_00); if(isdefined(self)) { self thermaldrawdisable(); } } //Function Number: 8 drone_play_looping_anim(param_00,param_01) { if(isdefined(self.drone_loop_custom)) { self [[ self.drone_loop_override ]](param_00,param_01); return; } self clearanim(%body,0.2); self stopanimscripted(); self setflaggedanimknoballrestart("drone_anim",param_00,%body,1,0.2,param_01); self.droneanim = param_00; } //Function Number: 9 drone_play_scripted_anim(param_00,param_01) { if(self.type == "human") { self clearanim(%body,0.2); } self stopanimscripted(); var_02 = "normal"; if(isdefined(param_01)) { var_02 = "deathplant"; } var_03 = "drone_anim"; self animscripted(var_03,self.origin,self.angles,param_00,var_02); self waittillmatch("end","drone_anim"); } //Function Number: 10 drone_drop_real_weapon_on_death() { if(!isdefined(self)) { return; } self waittill("death"); if(!isdefined(self)) { return; } var_00 = getweaponmodel(self.weapon); var_01 = self.weapon; if(isdefined(var_00)) { maps\_utility::detach_attachments_from_weapon_model(self.weapon); self detach(var_00,"tag_weapon_right"); var_02 = self gettagorigin("tag_weapon_right"); var_03 = self gettagangles("tag_weapon_right"); var_04 = spawn("weapon_" + var_01,(0,0,0)); var_04.angles = var_03; var_04.origin = var_02; } } //Function Number: 11 drone_set_archetype_idle(param_00) { if(isdefined(level.archetypes[param_00])) { var_01 = level.archetypes[param_00]["idle"]["stand"][0]; var_01 = common_scripts\utility::array_combine(var_01,level.archetypes[param_00]["idle"]["stand"][1]); var_02 = level.archetypes[param_00]["idle"]["stand"][0][0]; self.drone_archetype_custom_idle_base = var_02; self.drone_archetype_custom_idles = var_01; self.drone_idle_custom = 1; self.drone_idle_override = ::drone_archetype_idle_internal; thread drone_idle(undefined,undefined); } } //Function Number: 12 drone_archetype_idle_internal() { self endon("death"); var_00 = 10; if(!isdefined(self.drone_archetype_custom_idles) || !isarray(self.drone_archetype_custom_idles)) { return; } self clearanim(%body,0.2); self stopanimscripted(); var_01 = 1; animscripts\face::playfacialanim(undefined,"idle",undefined); for(;;) { var_02 = common_scripts\utility::random(self.drone_archetype_custom_idles); if(randomint(100) < var_00 || var_01) { self setflaggedanimknoballrestart("drone_anim",var_02,%body,1,0.2,1); var_01 = 0; } self waittillmatch("end","drone_anim"); self setflaggedanimknoballrestart("drone_anim",self.drone_archetype_custom_idle_base,%body,1,0.2,1); } } //Function Number: 13 drone_idle(param_00,param_01) { if(isdefined(self.drone_idle_custom)) { [[ self.drone_idle_override ]](); return; } if(isdefined(param_00) && isdefined(param_00["script_noteworthy"]) && isdefined(level.drone_anims[self.team][param_00["script_noteworthy"]])) { thread drone_fight(param_00["script_noteworthy"],param_00,param_01); return; } if(isdefined(self.idleanim)) { drone_play_looping_anim(self.idleanim,1); return; } drone_play_looping_anim(level.drone_anims[self.team]["stand"]["idle"],1); } //Function Number: 14 drone_get_goal_loc_with_arrival(param_00,param_01) { var_02 = param_01["script_noteworthy"]; if(!isdefined(level.drone_anims[self.team][var_02]["arrival"])) { return param_00; } var_03 = getmovedelta(level.drone_anims[self.team][var_02]["arrival"],0,1); var_03 = length(var_03); param_00 = param_00 - var_03; return param_00; } //Function Number: 15 drone_fight(param_00,param_01,param_02) { self endon("death"); self endon("stop_drone_fighting"); self.animset = param_00; self.weaponsound = undefined; var_03 = randomintrange(1,4); if(self.team == "axis") { if(var_03 == 1) { self.weaponsound = "weap_m9_fire_npc"; } else if(var_03 == 2) { self.weaponsound = "weap_usp45sd_fire_npc"; } if(var_03 == 3) { self.weaponsound = "weap_pecheneg_fire_npc"; } } else { if(var_03 == 1) { self.weaponsound = "weap_m9_fire_npc"; } else if(var_03 == 2) { self.weaponsound = "weap_usp45sd_fire_npc"; } if(var_03 == 3) { self.weaponsound = "weap_pecheneg_fire_npc"; } } self.angles = (0,self.angles[1],self.angles[2]); if(param_00 == "coverprone") { self moveto(self.origin + (0,0,8),0.05); } self.noragdoll = 1; var_04 = level.drone_anims[self.team][param_00]; self.deathanim = var_04["death"]; while(isdefined(self)) { drone_play_scripted_anim(var_04["idle"][randomint(var_04["idle"].size)]); if(common_scripts\utility::cointoss() && !isdefined(self.ignoreall)) { var_05 = 1; if(isdefined(var_04["pop_up_chance"])) { var_05 = var_04["pop_up_chance"]; } var_05 = var_05 * 100; var_06 = 1; if(randomfloat(100) > var_05) { var_06 = 0; } if(var_06 == 1) { drone_play_scripted_anim(var_04["hide_2_aim"]); wait(getanimlength(var_04["hide_2_aim"]) - 0.5); } if(isdefined(var_04["fire"])) { if(param_00 == "coverprone" && var_06 == 1) { thread drone_play_looping_anim(var_04["fire_exposed"],1); } else { thread drone_play_looping_anim(var_04["fire"],1); } drone_fire_randomly(); } else { drone_shoot(); wait(0.15); drone_shoot(); wait(0.15); drone_shoot(); wait(0.15); drone_shoot(); } if(var_06 == 1) { drone_play_scripted_anim(var_04["aim_2_hide"]); } drone_play_scripted_anim(var_04["reload"]); } } } //Function Number: 16 drone_fire_randomly() { self endon("death"); if(common_scripts\utility::cointoss()) { drone_shoot(); wait(0.1); drone_shoot(); wait(0.1); drone_shoot(); if(common_scripts\utility::cointoss()) { wait(0.1); drone_shoot(); } if(common_scripts\utility::cointoss()) { wait(0.1); drone_shoot(); wait(0.1); drone_shoot(); wait(0.1); } if(common_scripts\utility::cointoss()) { wait(randomfloatrange(1,2)); return; } return; } drone_shoot(); wait(randomfloatrange(0.25,0.75)); drone_shoot(); wait(randomfloatrange(0.15,0.75)); drone_shoot(); wait(randomfloatrange(0.15,0.75)); drone_shoot(); wait(randomfloatrange(0.15,0.75)); } //Function Number: 17 drone_shoot() { self endon("death"); self notify("firing"); self endon("firing"); drone_shoot_fx(); var_00 = %exposed_crouch_shoot_auto_v2; self setanimknobrestart(var_00,1,0.2,1); common_scripts\utility::delaycall(0.25,::clearanim,var_00,0); } //Function Number: 18 drone_shoot_fx() { var_00 = common_scripts\utility::getfx("pdrone_flash_wv"); if(self.team == "allies") { var_00 = common_scripts\utility::getfx("pdrone_flash_wv"); } if(isdefined(self.muzzleflashoverride)) { var_00 = common_scripts\utility::getfx(self.muzzleflashoverride); } if(!isdefined(self.nodroneweaponsound)) { thread drone_play_weapon_sound(self.weaponsound); } playfxontag(var_00,self,"tag_flash"); } //Function Number: 19 drone_play_weapon_sound(param_00) { self playsound(param_00); } //Function Number: 20 drone_wait_move() { self endon("death"); self waittill("move"); thread drone_move(); } //Function Number: 21 get_anim_data(param_00) { var_01 = 170; var_02 = 1; var_03 = getanimlength(param_00); var_04 = getmovedelta(param_00,0,1); var_05 = length(var_04); if(var_03 > 0 && var_05 > 0) { var_01 = var_05 / var_03; var_02 = 0; } if(isdefined(self.drone_run_speed)) { var_01 = self.drone_run_speed; } var_06 = spawnstruct(); var_06.anim_relative = var_02; var_06.run_speed = var_01; var_06.anim_time = var_03; return var_06; } //Function Number: 22 drone_get_final_target_node() { var_00 = getpatharray(self.target,self.origin); var_01 = var_00[var_00.size - 2]["target"]; var_02 = getnode(var_01,"targetname"); if(!isdefined(var_02)) { var_03 = getnodesonpath(var_00[var_00.size - 1]["origin"],var_00[var_00.size - 1]["origin"]); var_02 = var_03[var_03.size - 1]; } return var_02; } //Function Number: 23 drone_move() { self endon("death"); self endon("drone_stop"); wait(0.05); var_00 = getpatharray(self.target,self.origin); var_01 = level.drone_anims[self.team]["stand"]["run"]; if(isdefined(self.runanim)) { var_01 = self.runanim; } var_02 = get_anim_data(var_01); var_03 = var_02.run_speed; var_04 = var_02.anim_relative; if(isdefined(self.drone_move_callback)) { var_02 = [[ self.drone_move_callback ]](); if(isdefined(var_02)) { var_01 = var_02.runanim; var_03 = var_02.run_speed; var_04 = var_02.anim_relative; } var_02 = undefined; } if(!var_04) { thread drone_move_z(var_03); } drone_play_looping_anim(var_01,self.moveplaybackrate); var_05 = 0.5; var_06 = 0; self.started_moving = 1; self.cur_node = var_00[var_06]; var_07 = 0; var_08 = undefined; for(;;) { if(!isdefined(var_00[var_06])) { break; } var_09 = var_00[var_06]["vec"]; var_0A = self.origin - var_00[var_06]["origin"]; var_0B = vectordot(vectornormalize(var_09),var_0A); if(!isdefined(var_00[var_06]["dist"])) { break; } var_0C = var_0B + level.drone_lookahead_value; while(var_0C > var_00[var_06]["dist"]) { var_0C = var_0C - var_00[var_06]["dist"]; var_06++; self.cur_node = var_00[var_06]; if(isdefined(var_08)) { if(var_06 == 0) { } if(!isdefined(self.beforestairanim)) { self.beforestairanim = self.droneanim; } var_0D = level.drone_anims[self.team]["stairs"][var_08]; drone_play_looping_anim(var_0D,self.moveplaybackrate); var_07 = 1; } if(!isdefined(var_00[var_06]["dist"])) { self rotateto(vectortoangles(var_00[var_00.size - 1]["vec"]),var_05); var_0E = distance(self.origin,var_00[var_00.size - 1]["origin"]); var_0F = var_0E / var_03 * self.moveplaybackrate; var_10 = var_00[var_00.size - 1]["origin"] + (0,0,100); var_11 = var_00[var_00.size - 1]["origin"] - (0,0,100); var_12 = physicstrace(var_10,var_11); if(getdvar("debug_drones") == "1") { thread common_scripts\utility::draw_line_for_time(var_10,var_11,1,1,1,var_05); thread common_scripts\utility::draw_line_for_time(self.origin,var_12,0,0,1,var_05); } self moveto(var_12,var_0F); wait(var_0F); self notify("goal"); thread check_delete(); thread drone_idle(var_00[var_00.size - 1],var_12); return; } if(!isdefined(var_03[var_09])) { self notify("goal"); thread drone_idle(); return; } } if(isdefined(self.drone_move_callback)) { var_05 = [[ self.drone_move_callback ]](); if(isdefined(var_05)) { if(var_05.runanim != var_04) { var_04 = var_05.runanim; var_06 = var_05.run_speed; var_07 = var_05.anim_relative; if(!var_07) { thread drone_move_z(var_06); } else { self notify("drone_move_z"); } drone_play_looping_anim(var_04,self.moveplaybackrate); } } } self.cur_node = var_03[var_09]; var_11 = var_03[var_09]["vec"] * var_10; var_11 = var_11 + var_03[var_09]["origin"]; var_15 = var_11; var_16 = var_15 + (0,0,100); var_17 = var_15 - (0,0,100); var_15 = physicstrace(var_16,var_17); if(!var_07) { self.drone_look_ahead_point = var_15; } if(getdvar("debug_drones") == "1") { thread common_scripts\utility::draw_line_for_time(var_16,var_17,1,1,1,var_08); thread draw_point(var_15,1,0,0,16,var_08); } var_0E = vectortoangles(var_15 - self.origin); self rotateto((0,var_0E[1],0),var_08); var_0F = var_06 * var_08 * self.moveplaybackrate; var_12 = vectornormalize(var_15 - self.origin); var_11 = var_12 * var_0F; var_11 = var_11 + self.origin; if(getdvar("debug_drones") == "1") { thread common_scripts\utility::draw_line_for_time(self.origin,var_11,0,0,1,var_08); } self moveto(var_11,var_08); wait(var_08); if(isdefined(self.cur_node["script_noteworthy"]) && self.cur_node["script_noteworthy"] == "stairs_start_up" || self.cur_node["script_noteworthy"] == "stairs_start_down") { var_18 = strtok(self.cur_node["script_noteworthy"],"_"); var_0B = var_18[2]; continue; } if(var_0A == 1) { if(isdefined(self.cur_node["script_noteworthy"]) && self.cur_node["script_noteworthy"] == "stairs_end") { var_19 = self.beforestairanim; drone_play_looping_anim(var_19,self.moveplaybackrate); var_0A = 0; var_0B = undefined; } } } thread drone_idle(); } //Function Number: 24 drone_move_z(param_00) { self endon("death"); self endon("drone_stop"); self notify("drone_move_z"); self endon("drone_move_z"); var_01 = 0.05; for(;;) { if(isdefined(self.drone_look_ahead_point) && param_00 > 0) { var_02 = self.drone_look_ahead_point[2] - self.origin[2]; var_03 = distance2d(self.drone_look_ahead_point,self.origin); var_04 = var_03 / param_00; if(var_04 > 0 && var_02 != 0) { var_05 = abs(var_02) / var_04; var_06 = var_05 * var_01; if(var_02 >= var_05) { self.origin = (self.origin[0],self.origin[1],self.origin[2] + var_06); } else if(var_02 <= var_05 * -1) { self.origin = (self.origin[0],self.origin[1],self.origin[2] - var_06); } } } wait(var_01); } } //Function Number: 25 getpatharray(param_00,param_01) { var_02 = 1; var_03 = []; var_03[0]["origin"] = param_01; var_03[0]["dist"] = 0; var_04 = undefined; var_04 = param_00; var_05["entity"] = ::maps\_spawner::get_target_ents; var_05["node"] = ::maps\_spawner::get_target_nodes; var_05["struct"] = ::maps\_spawner::get_target_structs; var_06 = undefined; var_07 = [[ var_05["entity"] ]](var_04); var_08 = [[ var_05["node"] ]](var_04); var_09 = [[ var_05["struct"] ]](var_04); if(var_07.size) { var_06 = "entity"; } else if(var_08.size) { var_06 = "node"; } else if(var_09.size) { var_06 = "struct"; } var_0A = var_03.size; for(;;) { var_0B = [[ var_05[var_06] ]](var_04); var_0C = common_scripts\utility::random(var_0B); if(!isdefined(var_0C)) { break; } var_0A = var_03.size; var_0D = var_0C.origin; if(isdefined(var_0C.radius)) { if(!isdefined(self.dronerunoffset)) { self.dronerunoffset = -1 + randomfloat(2); } if(!isdefined(var_0C.angles)) { var_0C.angles = (0,0,0); } var_0E = anglestoforward(var_0C.angles); var_0F = anglestoright(var_0C.angles); var_10 = anglestoup(var_0C.angles); var_11 = (0,self.dronerunoffset * var_0C.radius,0); var_0D = var_0D + var_0E * var_11[0]; var_0D = var_0D + var_0F * var_11[1]; var_0D = var_0D + var_10 * var_11[2]; } var_03[var_0A]["origin"] = var_0D; var_03[var_0A]["target"] = var_0C.target; if(isdefined(self.script_parameters) && self.script_parameters == "use_last_node_angles" && isdefined(var_0C.angles)) { var_03[var_0A]["angles"] = var_0C.angles; } if(isdefined(var_0C.script_noteworthy)) { var_03[var_0A]["script_noteworthy"] = var_0C.script_noteworthy; } if(isdefined(var_0C.script_linkname)) { var_03[var_0A]["script_linkname"] = var_0C.script_linkname; } var_03[var_0A - 1]["dist"] = distance(var_03[var_0A]["origin"],var_03[var_0A - 1]["origin"]); var_03[var_0A - 1]["vec"] = vectornormalize(var_03[var_0A]["origin"] - var_03[var_0A - 1]["origin"]); if(!isdefined(var_03[var_0A - 1]["target"])) { var_03[var_0A - 1]["target"] = var_0C.targetname; } if(!isdefined(var_03[var_0A - 1]["script_noteworthy"]) && isdefined(var_0C.script_noteworthy)) { var_03[var_0A - 1]["script_noteworthy"] = var_0C.script_noteworthy; } if(!isdefined(var_03[var_0A - 1]["script_linkname"]) && isdefined(var_0C.script_linkname)) { var_03[var_0A - 1]["script_linkname"] = var_0C.script_linkname; } if(!isdefined(var_0C.target)) { break; } var_04 = var_0C.target; } if(isdefined(self.script_parameters) && self.script_parameters == "use_last_node_angles" && isdefined(var_03[var_0A]["angles"])) { var_03[var_0A]["vec"] = anglestoforward(var_03[var_0A]["angles"]); } else { var_03[var_0A]["vec"] = var_03[var_0A - 1]["vec"]; } var_0C = undefined; return var_03; } //Function Number: 26 draw_point(param_00,param_01,param_02,param_03,param_04,param_05) { var_06 = param_00 + (param_04,0,0); var_07 = param_00 - (param_04,0,0); thread common_scripts\utility::draw_line_for_time(var_06,var_07,param_01,param_02,param_03,param_05); var_06 = param_00 + (0,param_04,0); var_07 = param_00 - (0,param_04,0); thread common_scripts\utility::draw_line_for_time(var_06,var_07,param_01,param_02,param_03,param_05); var_06 = param_00 + (0,0,param_04); var_07 = param_00 - (0,0,param_04); thread common_scripts\utility::draw_line_for_time(var_06,var_07,param_01,param_02,param_03,param_05); } //Function Number: 27 check_delete() { if(!isdefined(self)) { return; } if(!isdefined(self.script_noteworthy)) { return; } switch(self.script_noteworthy) { case "delete_on_goal": if(isdefined(self.magic_bullet_shield)) { maps\_utility::stop_magic_bullet_shield(); } self delete(); break; case "die_on_goal": self kill(); break; } }