/******************************************************************* * Decompiled By: Bog * Decompiled File: maps\_drone.gsc * Game: Call of Duty: Modern Warfare 3 * Platform: PC * Function Count: 25 * Decompile Time: 453 ms * Timestamp: 10/27/2023 2:23:09 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_give_soul() { self useanimtree(#animtree); self startusingheroonlylighting(); if(isdefined(self.script_moveplaybackrate)) { self.moveplaybackrate = self.script_moveplaybackrate; } else { self.moveplaybackrate = 1; } if(self.team == "llies") { maps\_names::get_name(); self setlookattext(self.name,&""); } if(isdefined(level.dronecallbackthread)) { self thread [[ level.dronecallbackthread ]](); } if(!isdefined(self.script_friendly_fire_disable)) { level thread maps\_friendlyfire::friendly_fire_think(self); } if(!isdefined(level.ai_dont_glow_in_thermal)) { self thermaldrawenable(); } } //Function Number: 3 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); drone_give_soul(); if(isdefined(self.script_drone_override)) { return; } 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: 4 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: 5 drone_death_thread() { drone_wait_for_death(); if(!isdefined(self)) { return; } var_00 = "stand"; if(isdefined(self.animset) && isdefined(level.attachpropsfunction[self.team][self.animset]) && isdefined(level.attachpropsfunction[self.team][self.animset]["death"])) { var_00 = self.animset; } var_01 = level.attachpropsfunction[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(!maps\_utility::within_fov(level.player.origin,level.player.angles,self.origin,0.5)) { self delete(); } wait 5; } } //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) { self clearanim(%body,0.2); self stopanimscripted(); self setflaggedanimknoballrestart("drone_anim",param_00,%body,1,0.2,param_01); } //Function Number: 9 drone_play_scripted_anim(param_00,param_01) { 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)) { 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_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.attachpropsfunction[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.attachpropsfunction[self.team]["stand"]["idle"],1); } //Function Number: 12 drone_get_goal_loc_with_arrival(param_00,param_01) { var_02 = param_01["script_noteworthy"]; if(!isdefined(level.attachpropsfunction[self.team][var_02]["arrival"])) { return param_00; } var_03 = getmovedelta(level.attachpropsfunction[self.team][var_02]["arrival"],0,1); var_03 = length(var_03); param_00 = param_00 - var_03; return param_00; } //Function Number: 13 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 = "drone_ak47_fire_npc"; } else if(var_03 == 2) { self.weaponsound = "drone_g36c_fire_npc"; } if(var_03 == 3) { self.weaponsound = "drone_fnp90_fire_npc"; } } else { if(var_03 == 1) { self.weaponsound = "drone_m4carbine_fire_npc"; } else if(var_03 == 2) { self.weaponsound = "drone_m16_fire_npc"; } if(var_03 == 3) { self.weaponsound = "drone_m249saw_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.attachpropsfunction[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: 14 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: 15 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: 16 drone_shoot_fx() { var_00 = common_scripts\utility::getfx("ak47_muzzleflash"); if(self.team == "allies") { var_00 = common_scripts\utility::getfx("m16_muzzleflash"); } thread drone_play_weapon_sound(self.weaponsound); playfxontag(var_00,self,"tag_flash"); } //Function Number: 17 drone_play_weapon_sound(param_00) { self playsound(param_00); } //Function Number: 18 drone_wait_move() { self endon("death"); self waittill("move"); thread drone_move(); } //Function Number: 19 drone_init_path() { if(!isdefined(self.target)) { return; } if(isdefined(level.drone_paths[self.target])) { return; } level.drone_paths[self.target] = 1; var_00 = self.target; var_01 = common_scripts\utility::getstruct(var_00,"targetname"); if(!isdefined(var_01)) { return; } var_02 = []; var_03 = []; var_04 = var_01; for(;;) { var_01 = var_04; var_05 = 0; for(;;) { if(!isdefined(var_01.target)) { break; } var_06 = common_scripts\utility::getstructarray(var_01.target,"targetname"); if(var_06.size) { break; } var_07 = undefined; foreach(var_09 in var_06) { if(isdefined(var_03[var_09.origin + ""])) { continue; } var_07 = var_09; break; } if(!isdefined(var_07)) { break; } var_03[var_07.origin + ""] = 1; var_02[var_01.targetname] = var_07.origin - var_01.origin; var_01.angles = vectortoangles(var_02[var_01.targetname]); var_01 = var_07; var_05 = 1; } if(!var_05) { break; } } var_00 = self.target; var_01 = common_scripts\utility::getstruct(var_00,"targetname"); var_0B = var_01; var_03 = []; for(;;) { var_01 = var_04; var_05 = 0; for(;;) { if(!isdefined(var_01.target)) { return; } if(!isdefined(var_02[var_01.targetname])) { return; } var_06 = common_scripts\utility::getstructarray(var_01.target,"targetname"); if(var_06.size) { break; } var_07 = undefined; foreach(var_09 in var_06) { if(isdefined(var_03[var_09.origin + ""])) { continue; } var_07 = var_09; break; } if(!isdefined(var_07)) { break; } if(isdefined(var_01.radius)) { var_0E = var_02[var_0B.targetname]; var_0F = var_02[var_01.targetname]; var_10 = var_0E + var_0F * 0.5; var_01.angles = vectortoangles(var_10); } var_05 = 1; var_0B = var_01; var_01 = var_07; } if(!var_05) { break; } } } //Function Number: 20 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: 21 drone_move() { self endon("death"); self endon("drone_stop"); wait 0.05; var_00 = getpatharray(self.target,self.origin); var_01 = level.attachpropsfunction[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]; for(;;) { if(!isdefined(var_00[var_06])) { break; } var_07 = var_00[var_06]["vec"]; var_08 = self.origin - var_00[var_06]["origin"]; var_09 = vectordot(vectornormalize(var_07),var_08); if(!isdefined(var_00[var_06]["dist"])) { break; } var_0A = var_09 + level.drone_lookahead_value; while(var_0A > var_00[var_06]["dist"]) { var_0A = var_0A - var_00[var_06]["dist"]; var_06++; self.cur_node = var_00[var_06]; if(!isdefined(var_00[var_06]["dist"])) { self rotateto(vectortoangles(var_00[var_00.size - 1]["vec"]),var_05); var_0B = distance(self.origin,var_00[var_00.size - 1]["origin"]); var_0C = var_0B / var_03 * self.moveplaybackrate; var_0D = var_00[var_00.size - 1]["origin"] + (0,0,100); var_0E = var_00[var_00.size - 1]["origin"] - (0,0,100); var_0F = physicstrace(var_0D,var_0E); if(getdvar("debug_drones") == "1") { thread common_scripts\utility::draw_line_for_time(var_0D,var_0E,1,1,1,var_05); thread common_scripts\utility::draw_line_for_time(self.origin,var_0F,0,0,1,var_05); } self moveto(var_0F,var_0C); wait var_0C; self notify("goal"); thread check_delete(); thread drone_idle(var_00[var_00.size - 1],var_0F); 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)) { var_04 = var_05.runanim; if(var_05.runanim != var_04) { 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_0E = var_03[var_09]["vec"] * var_0D; var_0E = var_0E + var_03[var_09]["origin"]; var_12 = var_0E; var_13 = var_12 + (0,0,100); var_14 = var_12 - (0,0,100); var_12 = physicstrace(var_13,var_14); if(!var_07) { self.drone_look_ahead_point = var_12; } if(getdvar("debug_drones") == "1") { thread common_scripts\utility::draw_line_for_time(var_13,var_14,1,1,1,var_08); thread draw_point(var_12,1,0,0,16,var_08); } var_0B = vectortoangles(var_12 - self.origin); self rotateto((0,var_0B[1],0),var_08); var_0C = var_06 * var_08 * self.moveplaybackrate; var_0F = vectornormalize(var_12 - self.origin); var_0E = var_0F * var_0C; var_0E = var_0E + self.origin; if(getdvar("debug_drones") == "1") { thread common_scripts\utility::draw_line_for_time(self.origin,var_0E,0,0,1,var_08); } self moveto(var_0E,var_08); wait var_08; } thread drone_idle(); } //Function Number: 22 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: 23 getpatharray(param_00,param_01) { var_02 = 1; var_03 = []; var_1C[0] = "origin"; var_1C[0] = "dist"; var_04 = undefined; var_04 = param_01; param_00["entity"] = ::maps\_spawner::get_target_ents; var_06 = undefined; var_07 = [[ var_7B["entity"] ]](var_04); var_08 = [[ var_7B["node"] ]](var_04); var_09 = [[ var_7B["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"; } for(;;) { var_0A = var_1C.size; var_0B = [[ var_7B[var_06] ]](var_04); var_0C = common_scripts\utility::random(var_0B); 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_1C[var_0A]["origin"] = var_0D; var_1C[var_0A]["target"] = var_0C.target; if(isdefined(self.script_parameters) && self.script_parameters == "use_last_node_angles" && isdefined(var_0C.angles)) { var_1C[var_0A]["angles"] = var_0C.angles; } if(isdefined(var_0C.script_noteworthy)) { var_1C[var_0A]["script_noteworthy"] = var_0C.script_noteworthy; } var_1C[var_0A - 1]["dist"] = distance(var_1C[var_0A]["origin"],var_1C[var_0A - 1]["origin"]); var_1C[var_0A - 1]["vec"] = vectornormalize(var_1C[var_0A]["origin"] - var_1C[var_0A - 1]["origin"]); if(!isdefined(var_1C[var_0A - 1]["target"])) { var_1C[var_0A - 1]["target"] = var_0C.targetname; } if(!isdefined(var_1C[var_0A - 1]["script_noteworthy"]) && isdefined(var_0C.script_noteworthy)) { var_1C[var_0A - 1]["script_noteworthy"] = var_0C.script_noteworthy; } 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_1C[var_0A]["angles"])) { var_1C[var_0A]["vec"] = anglestoforward(var_1C[var_0A]["angles"]); } else { var_1C[var_0A]["vec"] = var_1C[var_0A - 1]["vec"]; } var_0C = undefined; return var_1C; } //Function Number: 24 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: 25 check_delete() { if(!isdefined(self)) { return; } if(!isdefined(self.script_noteworthy)) { return; } switch(self.script_noteworthy) { case "delete_on_goal": self delete(); break; case "die_on_goal": self kill(); break; } }