/******************************************************************* * Decompiled By: Bog * Decompiled File: _variable_grenade.gsc * Game: Call of Duty: Advanced Warfare * Platform: PC * Function Count: 56 * Decompile Time: 938 ms * Timestamp: 4/22/2024 2:24:23 AM *******************************************************************/ //Function Number: 1 main() { init_variable_grenade(); give_player_variable_grenade(); } //Function Number: 2 init_variable_grenade() { if(isdefined(level.player.variable_grenade)) { return; } var_00["normal"][0] = "tracking_grenade_var"; var_00["normal"][1] = "contact_grenade_var"; var_00["normal"][2] = "frag_grenade_var"; var_00["special"][0] = "paint_grenade_var"; var_00["special"][1] = "flash_grenade_var"; var_00["special"][2] = "emp_grenade_var"; level.player.variable_grenade = var_00; var_01 = []; var_01["frag_grenade_var"] = 1; var_01["contact_grenade_var"] = 2; var_01["tracking_grenade_var"] = 3; var_01["paint_grenade_var"] = 4; var_01["flash_grenade_var"] = 5; var_01["emp_grenade_var"] = 6; level.player.variable_grenade_ui_type = var_01; common_scripts\utility::flag_init("variable_grenade_switch"); level.player.detection_grenade_range = 1000; level.player.detection_grenade_sweep_time = 1.75; level.player.detection_grenade_duration = 15; level.player.threat_detection_style = "enhanceable"; foreach(var_03 in ["normal","special"]) { foreach(var_05 in var_00[var_03]) { precacheitem(var_05); } } precacheitem("smart_grenade"); precachemodel("npc_variable_grenade_lethal"); var_08 = getspawnerteamarray("axis"); if(var_08.size > 0) { maps\_utility::array_spawn_function(var_08,::handle_detection); } handle_detection_spawners(); init_grenade_hints(); precache_var_grenade_fx(); level.player thread target_enhancer_think(); } //Function Number: 3 handle_detection_spawners() { var_00 = vehicle_getspawnerarray(); var_01 = []; foreach(var_03 in var_00) { if(isdefined(var_03.script_team) && var_03.script_team == "axis") { if(isdefined(var_03.script_parameters) && issubstr(var_03.script_parameters,"threat_detectable")) { var_01 = common_scripts\utility::add_to_array(var_01,var_03); continue; } if(issubstr(var_03.classname,"pdrone")) { var_01 = common_scripts\utility::add_to_array(var_01,var_03); } } } if(var_01.size > 0) { maps\_utility::array_spawn_function(var_01,::handle_detection); } var_05 = getentarray("script_vehicle_pdrone_kva","classname"); if(var_05.size > 0) { maps\_utility::array_spawn_function(var_05,::handle_detection); } var_06 = getentarray("enemy_walker","targetname"); if(var_06.size > 0) { maps\_utility::array_spawn_function_targetname("enemy_walker",::handle_detection); } foreach(var_08 in getentarray("actor_enemy_dog","classname")) { if(isspawner(var_08)) { var_08 maps\_utility::add_spawn_function(::handle_detection); continue; } var_08 thread handle_detection(); } } //Function Number: 4 give_player_variable_grenade() { init_variable_grenade(); var_00 = 0; var_01 = level.player getweaponslistoffhands(); if(!isdefined(var_01) || var_01.size == 0) { var_00 = 1; } else { foreach(var_03 in var_01) { if(!isdefined(level.player get_index_for_weapon_name(var_03))) { var_00 = 1; break; } } } if(var_00) { foreach(var_03 in level.player getweaponslistoffhands()) { level.player takeweapon(var_03); } level.player setlethalweapon(level.player.variable_grenade["normal"][0]); level.player giveweapon(level.player.variable_grenade["normal"][0]); level.player settacticalweapon(level.player.variable_grenade["special"][0]); level.player giveweapon(level.player.variable_grenade["special"][0]); } common_scripts\utility::flag_set("variable_grenade_switch"); level.player thread monitor_grenade_fire(); level.player thread monitor_offhand_cycle(); } //Function Number: 5 set_variable_grenades_with_no_switch(param_00,param_01) { foreach(var_03 in level.player getweaponslistoffhands()) { level.player takeweapon(var_03); } level.player setlethalweapon(param_00); level.player giveweapon(param_00); level.player settacticalweapon(param_01); level.player giveweapon(param_01); common_scripts\utility::flag_clear("variable_grenade_switch"); } //Function Number: 6 get_mode_for_weapon_name(param_00) { if(!isdefined(param_00)) { return undefined; } var_01 = undefined; foreach(var_03 in ["normal","special"]) { if(common_scripts\utility::array_contains(self.variable_grenade[var_03],param_00)) { var_01 = var_03; break; } } return var_01; } //Function Number: 7 get_index_for_weapon_name(param_00) { var_01 = get_mode_for_weapon_name(param_00); if(!isdefined(var_01)) { return undefined; } foreach(var_04, var_03 in self.variable_grenade[var_01]) { if(var_03 == param_00) { return var_04; } } } //Function Number: 8 monitor_grenade_fire() { self endon("death"); self notify("new_monitor_grenade_fire"); self endon("new_monitor_grenade_fire"); for(;;) { self waittill("grenade_fire",var_00,var_01); var_02 = get_mode_for_weapon_name(var_01); if(!isdefined(var_02)) { wait 0.05; continue; } foreach(var_04 in ["normal","special"]) { if(common_scripts\utility::array_contains(self.variable_grenade[var_04],var_01)) { thread hide_grenade_hints(); } } if(issubstr(var_01,"emp_grenade_var")) { var_00 thread emp_grenade_think(self); continue; } if(issubstr(var_01,"paint_grenade_var")) { var_00 thread detection_grenade_think(self); continue; } if(issubstr(var_01,"tracking_grenade_var")) { var_00 thread tracking_grenade_think(self); } } } //Function Number: 9 grenade_ui_on(param_00) { if(isdefined(level.player.variable_grenade_ui_enabled)) { return; } level.player.variable_grenade_ui_enabled = 1; setomnvar("ui_grenade_screen",1); if(common_scripts\utility::flag("variable_grenade_switch")) { thread show_grenade_hint(param_00); } } //Function Number: 10 grenade_ui_off() { if(!isdefined(level.player.variable_grenade_ui_enabled)) { return; } level.player.variable_grenade_ui_enabled = undefined; setomnvar("ui_grenade_screen",0); if(common_scripts\utility::flag("variable_grenade_switch")) { thread hide_grenade_hints(); } } //Function Number: 11 monitor_offhand_cycle() { self endon("death"); self notify("new_monitor_offhand_cycle"); self endon("new_monitor_offhand_cycle"); var_00 = ["current","previous"]; var_00["previous"] = spawnstruct(); var_00["current"] = spawnstruct(); var_00["current"].is_switching = 0; var_00["current"].is_holding = 0; var_00["current"].is_prepping = 0; childthread monitor_cycle_direction(); childthread monitor_speech_action(); for(;;) { var_01 = var_00["previous"]; var_00["previous"] = var_00["current"]; var_00["current"] = var_01; var_02 = self getcurrentoffhand(); var_03 = get_mode_for_weapon_name(var_02); if(!isdefined(var_03)) { grenade_ui_off(); wait 0.05; continue; } var_00["current"].is_prepping = self ispreparinggrenade(); var_00["current"].is_holding = self isholdinggrenade() || self ispreparinggrenade() || self isswitchinggrenade(); var_00["current"].is_switching = var_00["current"].is_holding && self usebuttonpressed() || self.grenade_cycle_next; var_04 = var_00["current"].is_prepping && !var_00["previous"].is_prepping; var_05 = var_00["current"].is_switching && !var_00["previous"].is_switching; var_06 = var_00["current"].is_holding && !var_00["previous"].is_holding; var_07 = !var_00["current"].is_holding && var_00["previous"].is_holding; if(common_scripts\utility::flag("variable_grenade_switch") && var_00["current"].is_holding && var_05) { cycle_offhand_grenade(); } self.grenade_cycle_next = 0; if(var_04) { grenade_ui_on(var_03); } else if(var_07) { grenade_ui_off(); } if(var_04 || var_06 || var_05) { var_02 = self getcurrentoffhand(); var_08 = level.player.variable_grenade_ui_type[var_02]; setomnvar("ui_grenade_type",var_08); } wait 0.05; } } //Function Number: 12 monitor_cycle_direction() { self.grenade_cycle_next = 0; if(isdefined(level.ps4) && level.ps4) { for(;;) { var_00 = self getnormalizedflick(); if(lengthsquared(var_00) > 0) { if(abs(var_00[0]) > abs(var_00[1])) { if(var_00[0] < 0) { self.grenade_cycle_next = 1; } else { self.grenade_cycle_next = 4; } } else if(var_00[1] < 0) { self.grenade_cycle_next = 3; } else { self.grenade_cycle_next = 2; } wait 0.05; } wait 0.05; } } } //Function Number: 13 monitor_speech_action() { if(isdefined(level.xb3) && level.xb3) { for(;;) { self waittill("speechCommand",var_00,var_01); if(var_00 > 0.7 && self isholdinggrenade() || self ispreparinggrenade() || self isswitchinggrenade()) { var_02 = undefined; var_03 = undefined; var_04 = undefined; var_05 = self getcurrentoffhand(); if(!isdefined(var_05)) { continue; } var_06 = get_mode_for_weapon_name(var_05); if(!isdefined(var_06)) { continue; } switch(var_01) { case "next_var": var_02 = var_06; var_07 = get_index_for_weapon_name(var_05); var_03 = var_07 + 1 % self.variable_grenade[var_06].size; var_08 = self.variable_grenade[var_06][var_03]; var_04 = level.player.variable_grenade_ui_type[var_08]; break; case "previous_var": var_02 = var_06; var_07 = get_index_for_weapon_name(var_05); var_03 = var_07 - 1; if(var_03 < 0) { var_03 = self.variable_grenade[var_06].size - 1; } var_08 = self.variable_grenade[var_06][var_03]; var_04 = level.player.variable_grenade_ui_type[var_08]; break; case "frag_var": var_02 = get_mode_for_weapon_name("frag_grenade_var"); var_03 = get_index_for_weapon_name("frag_grenade_var"); var_04 = level.player.variable_grenade_ui_type["frag_grenade_var"]; break; case "smart_var": var_02 = get_mode_for_weapon_name("tracking_grenade_var"); var_03 = get_index_for_weapon_name("tracking_grenade_var"); var_04 = level.player.variable_grenade_ui_type["tracking_grenade_var"]; break; case "emp_var": var_02 = get_mode_for_weapon_name("emp_grenade_var"); var_03 = get_index_for_weapon_name("emp_grenade_var"); var_04 = level.player.variable_grenade_ui_type["emp_grenade_var"]; break; case "contact_var": var_02 = get_mode_for_weapon_name("contact_grenade_var"); var_03 = get_index_for_weapon_name("contact_grenade_var"); var_04 = level.player.variable_grenade_ui_type["contact_grenade_var"]; break; case "flash_var": var_02 = get_mode_for_weapon_name("flash_grenade_var"); var_03 = get_index_for_weapon_name("flash_grenade_var"); var_04 = level.player.variable_grenade_ui_type["flash_grenade_var"]; break; case "threat_var": var_02 = get_mode_for_weapon_name("paint_grenade_var"); var_03 = get_index_for_weapon_name("paint_grenade_var"); var_04 = level.player.variable_grenade_ui_type["paint_grenade_var"]; break; } if(isdefined(var_02) && var_02 == var_06) { if(isdefined(var_03)) { handle_weapon_switch(var_02,var_03); soundscripts\_snd::snd_message("variable_grenade_type_switch",var_03); } if(isdefined(var_04)) { setomnvar("ui_grenade_type",var_04); } } } } } } //Function Number: 14 cycle_offhand_grenade() { var_00 = self getcurrentoffhand(); if(isdefined(var_00)) { var_01 = get_mode_for_weapon_name(var_00); var_02 = get_index_for_weapon_name(var_00); if(isdefined(var_01) && isdefined(var_02)) { var_03 = var_02; if(self.grenade_cycle_next > 0 && self.grenade_cycle_next - 1 < self.variable_grenade[var_01].size) { var_03 = self.grenade_cycle_next - 1; } else if(self.grenade_cycle_next == 0) { var_03 = var_02 + 1 % self.variable_grenade[var_01].size; } if(var_03 != var_02) { handle_weapon_switch(var_01,var_03); soundscripts\_snd::snd_message("variable_grenade_type_switch",var_03); return; } return; } return; } } //Function Number: 15 handle_weapon_switch(param_00,param_01) { var_02 = 0; foreach(var_04 in self getweaponslistoffhands()) { if(common_scripts\utility::array_contains(self.variable_grenade[param_00],var_04)) { var_02 = int(max(var_02,self setweaponammostock(var_04))); self takeweapon(var_04); } } if(param_00 == "special") { self settacticalweapon(self.variable_grenade[param_00][param_01]); } else { self setlethalweapon(self.variable_grenade[param_00][param_01]); } self giveweapon(self.variable_grenade[param_00][param_01]); self setweaponammostock(self.variable_grenade[param_00][param_01],var_02); } //Function Number: 16 init_grenade_hints() { precachestring(&"VARIABLE_GRENADE_HINT_CYCLE_LETHAL"); precachestring(&"VARIABLE_GRENADE_HINT_CYCLE_TACTICAL"); } //Function Number: 17 show_grenade_hint(param_00) { level.player notify("show_grenade_hint_stop"); if(isdefined(level.player.grenadecyclehint)) { level.player.grenadecyclehint destroy(); } level.player endon("show_grenade_hint_stop"); level.player endon("death"); var_01 = 1; var_02 = 0.75; var_03 = 0.95; var_04 = 0.4; var_05 = maps\_hud_util::createclientfontstring("objective",2); level.player.grenadecyclehint = var_05; level.player.grenadecyclehint endon("stop_hint"); var_05.alpha = 0.9; var_05.x = 225; var_05.y = 150; var_05.alignx = "center"; var_05.aligny = "middle"; var_05.horzalign = "center"; var_05.vertalign = "middle"; var_05.foreground = 0; var_05.hidewhendead = 1; var_06 = &"VARIABLE_GRENADE_HINT_CYCLE_LETHAL"; if(param_00 == "special") { var_06 = &"VARIABLE_GRENADE_HINT_CYCLE_TACTICAL"; } var_05 settext(var_06); var_05.alpha = 0; var_05 fadeovertime(var_01); var_05.alpha = var_03; wait(var_01); for(;;) { var_05 fadeovertime(var_02); var_05.alpha = var_04; wait(var_02); var_05 fadeovertime(var_02); var_05.alpha = var_03; wait(var_02); } } //Function Number: 18 hide_grenade_hints() { level.player notify("show_grenade_hint_stop"); if(!isdefined(level.player.grenadecyclehint) || isremovedentity(level.player.grenadecyclehint)) { return; } level.player.grenadecyclehint destroy(); } //Function Number: 19 precache_var_grenade_fx() { level._effect["paint_grenade"] = loadfx("vfx/explosion/paint_grenade"); level._effect["emp_grenade"] = loadfx("vfx/explosion/emp_grenade_explosion"); level._effect["tracking_grenade_spray_large"] = loadfx("vfx/trail/tracking_grenade_hovering"); level._effect["tracking_grenade_spray_small"] = loadfx("vfx/trail/tracking_grenade_spay_small"); level._effect["tracking_grenade_spray_large_homing"] = loadfx("vfx/trail/tracking_grenade_trail"); level._effect["tracking_grenade_homing"] = loadfx("vfx/trail/tracking_grenade_geotrail"); level._effect["tracking_grenade_impact"] = loadfx("vfx/explosion/smart_grenade_explosion"); level._effect["tracking_grenade_water_impact_0"] = loadfx("vfx/explosion/smart_grenade_water_impact_01"); level._effect["tracking_grenade_water_impact_1"] = loadfx("vfx/explosion/smart_grenade_water_impact_02"); level._effect["tracking_grenade_water_impact_2"] = loadfx("vfx/explosion/smart_grenade_water_impact_03"); level._effect["tracking_grenade_default_impact_0"] = loadfx("vfx/explosion/smart_grenade_default_impact_01"); level._effect["tracking_grenade_default_impact_1"] = loadfx("vfx/explosion/smart_grenade_default_impact_02"); level._effect["tracking_grenade_default_impact_2"] = loadfx("vfx/explosion/smart_grenade_default_impact_03"); } //Function Number: 20 emp_notify_on_target_hit(param_00,param_01) { for(;;) { self waittill("damage",var_02,var_03,var_04,var_05,var_06,var_07,var_08,var_09,var_0A,var_0B); if(var_06 == "MOD_IMPACT" && isplayer(var_03) && var_0B == "emp_grenade_var") { param_00 notify(param_01); break; } } } //Function Number: 21 emp_wait_till_contact_or_timeout(param_00) { var_01 = "wait_till_contact_or_timeout_stop"; self endon(var_01); self endon("death"); var_02 = level.emp_vulnerable_list; if(isdefined(var_02) && var_02.size > 0) { foreach(var_04 in level.emp_vulnerable_list) { if(isdefined(var_04)) { var_04 childthread emp_notify_on_target_hit(self,var_01); } } } wait(param_00); self notify(var_01); } //Function Number: 22 emp_grenade_think(param_00) { self endon("death"); emp_wait_till_contact_or_timeout(1); var_01 = 500; var_02 = self.origin; var_03 = 500; playfx(common_scripts\utility::getfx("emp_grenade"),var_02); soundscripts\_snd::snd_message("emp_grenade_detonate"); if(isdefined(param_00.team)) { maps\_dds::dds_notify("react_emp",param_00.team != "allies"); } if(!isdefined(level.emp_vulnerable_list)) { self delete(); return; } var_04 = level.emp_vulnerable_list; foreach(var_06 in var_04) { if(!isdefined(var_06)) { continue; } if(var_06 damageconetrace(var_02,self)) { if(distancesquared(var_06.origin,var_02) < var_01 * var_01) { if(isdefined(var_06.mech) && var_06.mech) { maps\_utility::giveachievement_wrapper("EMP_AST"); } if(isdefined(var_06.emp_death_function) && !isdefined(var_06.processing_emp_death_function)) { if(isdefined(var_06.vehicletype) && var_06.vehicletype == "pdrone") { if(isplayer(param_00)) { param_00 maps\_player_stats::register_kill(self,"emp_grenade","emp_grenade_var"); } var_07 = level.player getlocalplayerprofiledata("ach_flySwatter") + 1; level.player setlocalplayerprofiledata("ach_flySwatter",var_07); if(var_07 == 25) { maps\_utility::giveachievement_wrapper("EMP_DRONE"); } } var_06.processing_emp_death_function = 1; var_06 thread [[ var_06.emp_death_function ]](); continue; } var_06 dodamage(var_03,var_02,param_00); } } } self delete(); } //Function Number: 23 detection_grenade_think(param_00,param_01,param_02,param_03) { self endon("death"); if(!isdefined(param_01)) { param_01 = level.player.detection_grenade_range; } if(!isdefined(param_02)) { param_02 = level.player.detection_grenade_sweep_time; } if(!isdefined(param_03)) { if(isdefined(level.player.detection_grenade_duration_bonus)) { param_03 = level.player.detection_grenade_duration + level.player.detection_grenade_duration_bonus; } else { param_03 = level.player.detection_grenade_duration; } } wait(1); if(isdefined(param_00)) { thread detection_grenade_hud_effect(param_00,param_01,param_02); thread detection_highlight_hud_effect(param_00,param_03); } playfx(common_scripts\utility::getfx("paint_grenade"),self.origin); soundscripts\_snd::snd_message("paint_grenade_detonate"); self.enemies = getaiarray("axis"); self.enemies = common_scripts\utility::array_combine(self.enemies,get_threat_detectables()); var_04 = "grenade"; var_05 = 0; foreach(var_07 in self.enemies) { if(!isdefined(var_07)) { continue; } else if(!isalive(var_07)) { if(!var_07 is_valid_non_human_paint_target()) { continue; } } if(distance(var_07.origin,self.origin) < param_01) { var_05++; self.detected[var_04] = 0; var_08 = distance(var_07.origin,self.origin) * param_02 / param_01; var_07 maps\_utility::delaythread(var_08,::handle_marking_guy,var_04,param_03 - var_08); } } if(var_05 >= 10) { maps\_utility::giveachievement_wrapper("THREAT_GRENADE_KILL"); } level.player notify("threat_grenade_marking_started",self); wait 0.05; self delete(); } //Function Number: 24 get_threat_detectables() { var_00 = []; var_00 = common_scripts\utility::array_combine(var_00,getentarray("script_vehicle_pdrone_kva","classname")); var_00 = common_scripts\utility::array_combine(var_00,getentarray("script_vehicle_walker_tank","classname")); var_00 = common_scripts\utility::array_combine(var_00,getentarray("actor_enemy_dog","classname")); var_01 = maps\_utility::getvehiclearray(); foreach(var_03 in var_01) { if(isdefined(var_03.script_team) && var_03.script_team == "axis") { if(isdefined(var_03.script_parameters) && issubstr(var_03.script_parameters,"threat_detectable")) { var_00 = common_scripts\utility::add_to_array(var_00,var_03); } else if(issubstr(var_03.classname,"pdrone")) { var_00 = common_scripts\utility::add_to_array(var_00,var_03); } if(isdefined(var_03.mgturret)) { foreach(var_05 in var_03.mgturret) { var_00 = common_scripts\utility::add_to_array(var_00,var_05); } } } } return var_00; } //Function Number: 25 detection_highlight_hud_effect_apply(param_00,param_01) { if(!isdefined(param_00.detection_highlight_hud_effect)) { param_00.detection_highlight_hud_effect = newclienthudelem(param_00); param_00.detection_highlight_hud_effect.color = (0.2,0.01,0.01); param_00.detection_highlight_hud_effect.alpha = 1; } param_00.detection_highlight_hud_effect setradarhighlight(param_01); } //Function Number: 26 detection_highlight_hud_effect_remove(param_00) { if(isdefined(param_00.detection_highlight_hud_effect)) { param_00.detection_highlight_hud_effect destroy(); param_00.detection_highlight_hud_effect = undefined; } } //Function Number: 27 change_threat_detection_style(param_00) { level.player.threat_detection_style = param_00; var_01 = getaiarray("axis"); foreach(var_03 in var_01) { if(!isdefined(var_03.pdrone_marked_state) && !isdefined(var_03.pretending_to_be_dead)) { var_03 setthreatdetection(param_00); } } } //Function Number: 28 detection_highlight_hud_effect(param_00,param_01) { param_00 notify("detection_highlight_hud_effect"); param_00 endon("detection_highlight_hud_effect"); detection_highlight_hud_effect_apply(param_00,param_01); wait(param_01); detection_highlight_hud_effect_remove(param_00); } //Function Number: 29 detection_grenade_hud_effect(param_00,param_01,param_02) { var_03 = newclienthudelem(param_00); var_03.x = self.origin[0]; var_03.y = self.origin[1]; var_03.z = self.origin[2]; var_03.color = (0.2,0.01,0.01); var_03.alpha = 0.1; var_04 = 500; var_03 setradarping(int(param_01 + var_04 / 2),int(var_04),param_02 + 0.05); wait(param_02); var_03 destroy(); } //Function Number: 30 handle_detection() { self notify("handle_detection"); self endon("handle_detection"); self endon("death"); if(maps\_vehicle::isvehicle() && isdefined(self.mgturret)) { foreach(var_01 in self.mgturret) { var_01 thread handle_detection(); } } thread handle_detection_death(); self.detected = []; var_03 = self.noragdoll; unmark_guy_fx(); for(;;) { self waittill("detected"); var_04 = 0; foreach(var_06 in self.detected) { if(var_06) { var_04++; } } if(var_04 == 1) { var_03 = self.noragdoll; self.noragdoll = 1; mark_guy_fx(); } for(var_08 = 1;var_08;var_08 = 1) { self waittill("no_longer_detected"); var_08 = 0; if(self.detected.size == 0) { unmark_guy_fx(); self.mark_fx = undefined; self.noragdoll = var_03; continue; } } } } //Function Number: 31 handle_marking_guy(param_00,param_01) { self endon("death"); self notify("marking_" + param_00); self endon("marking_" + param_00); self.detected[param_00] = 1; self notify("detected"); if(isdefined(param_01)) { wait(param_01); unmark_guy(param_00); } } //Function Number: 32 unmark_guy(param_00) { self.detected[param_00] = undefined; self notify("no_longer_detected"); } //Function Number: 33 mark_guy_fx() { if(isdefined(self.pretending_to_be_dead)) { return; } self.pdrone_marked_state = "marked"; self setthreatdetection("detected"); } //Function Number: 34 unmark_guy_fx() { if(isdefined(self)) { if(isalive(self)) { self.pdrone_marked_state = undefined; self setthreatdetection(level.player.threat_detection_style); return; } self setthreatdetection("disabled"); } } //Function Number: 35 clear_guy_fx() { if(isdefined(self)) { self setthreatdetection("disable"); } } //Function Number: 36 handle_detection_death() { common_scripts\utility::waittill_any("death","emp_death"); var_00 = undefined; clear_guy_fx(); } //Function Number: 37 is_valid_non_human_paint_target() { return self.code_classname == "script_vehicle"; } //Function Number: 38 tracking_grenade_think(param_00) { var_01 = 35; var_02 = 20; var_03 = 195; var_04 = 0.5; var_05 = 1; var_06 = 2.5; var_07 = param_00 get_smart_grenade_timer(); var_08 = var_07 * 0.5; var_09 = 0.35; var_0A = 88; var_0B = 7; var_0C = 2112; var_0D = 2; var_0E = 0.05; var_0F = (0,0,-300 * var_0E); var_10 = 3000 * var_0E; var_11 = 600 * var_0E; var_12 = 0.2; var_13 = 0.6; var_14 = 2; var_15 = sin(2); var_16 = 0.05; var_17 = make_tracking_grenade(self); var_17 thread tracking_grenade_handle_damage(param_00); var_17 thread tracking_grenade_handle_autosave(param_00); var_18 = common_scripts\utility::spawn_tag_origin(); var_18 linkto(var_17,"",(0,0,0),(-90,0,0)); var_19 = level.player geteye(); var_1A = anglestoforward(level.player getgunangles()); var_1B = bullettrace(var_19,var_19 + var_1A * 7000,0,var_17); var_1C = var_1B["position"]; var_1D = var_1A + (0,0,0.2) * 50 * 17.6; var_1E = (0,0,0); var_1F = undefined; var_20 = (0,0,0); var_21 = (0,0,0); var_22 = 0; var_23 = 0; var_24 = 0; var_25 = 0; soundscripts\_snd::snd_message("tracking_grenade_hover",var_17); var_26 = 0; while(var_26 < var_0B) { if(!isdefined(var_1F) || !isalive(var_1F) || var_26 <= var_08) { var_1F = var_17 tracking_grenade_get_target(param_00); if(isdefined(var_1F) && isdefined(var_1F.team)) { var_1F maps\_dds::dds_notify("react_smart",var_1F.team == "allies"); } } if(var_26 > var_07 && isdefined(var_1F) && !var_22) { var_22 = 1; tracking_grenade_scare_enemies(var_1F.origin); } if(var_26 > var_08 && isdefined(var_1F) && !var_23) { var_23 = 1; soundscripts\_snd::snd_message("tracking_grenade_beep",var_17); } if(var_26 > var_07) { if(isdefined(var_1F)) { var_1C = var_1F.origin + var_1F get_npc_center_offset(); } } else { var_19 = level.player geteye(); var_1A = anglestoforward(level.player getgunangles()); var_1B = bullettrace(var_19,var_19 + var_1A * 7000,0,var_17); var_27 = var_1B["position"]; if(distancesquared(var_27,param_00.origin) > distancesquared(var_17.origin,param_00.origin)) { var_1C = var_27; } } if(var_26 > var_07) { if(vectordot(var_1C - var_17.origin,var_1C - param_00.origin) < 0) { break; } if(!var_24) { var_24 = 1; playfxontag(common_scripts\utility::getfx("tracking_grenade_homing"),var_18,"tag_origin"); soundscripts\_snd::snd_message("tracking_grenade_jump",var_17); } var_28 = maps\_shg_utility::linear_map_clamp(var_26 - var_07 - var_09,0,var_0D,0,var_0C); var_1E = vectornormalize(var_1C - var_17.origin) * var_28; if(var_26 < var_07 + var_09 && bullettracepassed(var_17.origin,var_17.origin + (0,0,var_0A * var_09),0,undefined)) { var_1E = (0,0,var_0A); } else if(!var_25) { var_25 = 1; soundscripts\_snd::snd_message("tracking_grenade_strike",var_17); } } else { var_19 = param_00 geteye(); if(var_26 < var_08 || !isdefined(var_1F)) { var_29 = param_00 getgunangles(); } else { var_29 = (0,vectortoyaw(var_18.origin - var_1A),0); } var_1A = anglestoforward(var_29); var_1A = (var_1A[0],var_1A[1],var_1A[2] * var_04); var_2A = anglestoright(var_29); var_2B = -1 * common_scripts\utility::sign(vectordot(var_19 - var_17.origin,var_2A)); var_2C = var_19 + var_1A * var_03 + (0,0,var_01) + var_2A * var_2B * var_02; var_2D = var_2C - var_17.origin; if(isplayer(param_00) && param_00 fragbuttonpressed()) { var_2E = var_06; } else { var_2E = var_06; } var_1E = var_2D * var_2E; } var_1E = var_1E + getsmoothrandomvector(52.8,1); var_2F = vectorclamp(var_1E - var_1D * var_13 - var_0F,var_10); var_2F = vectorlerp(var_2F,var_20,var_12); var_21 = var_21 + var_2F; var_21 = var_21 + common_scripts\utility::randomvector(var_16 * length(var_21)); var_30 = length(var_21); if(var_30 > 0) { var_31 = anglestoup(var_17.angles); var_17.angles = combineangles(vectortoangles(var_21),(90,0,0)); var_32 = vectornormalize(var_21); var_33 = vectorcross(var_32,var_31); var_34 = vectorcross(var_32,var_33); var_35 = length(var_34); if(var_35 > var_15) { var_17 tracking_grenade_thrust_effect(var_34,"tracking_grenade_spray_small",var_32 * var_14); if(var_35 > 2 * var_15) { var_17 tracking_grenade_thrust_effect(-1 * var_34,"tracking_grenade_spray_small",var_32 * var_14 * -1); } } if(var_30 > var_11) { if(var_26 > var_07) { var_36 = "tracking_grenade_spray_large_homing"; } else { var_36 = "tracking_grenade_spray_large"; } playfxontag(common_scripts\utility::getfx(var_36),var_18,"tag_origin"); var_21 = (0,0,0); var_1D = var_1D + vectorclamp(var_2F,var_10,var_11); } var_1D = var_1D + var_0F; } var_21 = (0,0,0); var_37 = var_17.origin + var_1D * 0.05; var_38 = bullettrace(var_17.origin,var_37,1,param_00,0,1,0,0,1); if(isdefined(var_38["glass"])) { destroyglass(var_38["glass"],vectornormalize(var_1D)); var_38 = bullettrace(var_17.origin,var_37,1,param_00,0,1,0,0,1); } if(isdefined(var_38["entity"]) && isdefined(var_38["entity"].linked_player) && var_38["entity"].linked_player == param_00) { } else if(var_38["fraction"] < 1) { break; } var_17.origin = var_37; var_20 = var_2F; wait(0.05); var_26 = var_26 + 0.05; } var_17 tracking_grenade_detonate(param_00,var_1D,var_18); } //Function Number: 39 get_smart_grenade_timer() { if(isplayer(self)) { var_00 = self getcurrentweapon(); if(isdefined(var_00) && issubstr(var_00,"microdronelaunchersmartgrenade")) { return 0.1; } } return 1; } //Function Number: 40 safe_str(param_00) { if(isdefined(param_00)) { if(isarray(param_00)) { var_01 = "(array "; foreach(var_04, var_03 in param_00) { var_01 = var_01 + var_04 + " -> " + safe_str(var_03) + "\n"; } var_01 = var_01 + ")"; return var_01; } if(isremovedentity(var_04)) { return "" + var_04; } if(isdefined(var_04.code_classname)) { var_01 = "(entity $e" + var_04 getentitynumber() + " code_classname: \" + var_04.code_classname + "\"; if(isspawner(var_03)) { var_04 = var_04 + " (spawner)"; } } else { var_01 = "(object"; } if(isdefined(var_03.targetname)) { var_04 = var_04 + " targetname: \" + var_03.targetname + "\"; } if(isdefined(var_03.script_noteworthy)) { var_04 = var_04 + " script_noteworthy: \" + var_03.script_noteworthy + "\"; } if(isdefined(var_03.classname)) { var_04 = var_04 + " classname: \" + var_03.classname + "\"; } var_04 = var_04 + ")"; return var_04; } if(isremovedentity(var_04)) { return "(removed entity)"; } if(var_04 == undefined) { return "(undefined)"; } } //Function Number: 41 tracking_grenade_detonate(param_00,param_01,param_02) { var_03 = 150; var_04 = 128; var_05 = 1000; var_06 = 50; self notify("tracking_grenade_deactivate"); if(distance(param_00.origin,self.origin) > var_03) { radiusdamage(self.origin,var_04,var_05,var_06,param_00,"MOD_GRENADE","tracking_grenade_var",1); playfx(common_scripts\utility::getfx("tracking_grenade_impact"),self.origin); soundscripts\_snd::snd_message("smart_grenade_detonate"); thread play_tracking_grenade_impacts(300,self.origin); param_02 delete(); self delete(); return; } self physicslaunchserver(self.origin + common_scripts\utility::randomvector(10),param_01 * 0.1 * 0.25); soundscripts\_snd::snd_message("tracking_grenade_dud",self); for(var_07 = 0;var_07 < 5;var_07++) { playfxontag(common_scripts\utility::getfx("tracking_grenade_spray_large"),param_02,"tag_origin"); wait(randomfloatrange(0.05,0.3)); } param_02 delete(); thread tracking_grenade_pickup(param_00); wait(30); if(isdefined(self)) { self delete(); } } //Function Number: 42 tracking_grenade_pickup(param_00) { if(!isdefined(param_00)) { return; } self endon("death"); var_01 = spawn("trigger_radius",self.origin,0,15,5); var_01 enablelinkto(); var_01 linkto(self); thread common_scripts\utility::delete_on_death(var_01); for(;;) { var_01 waittill("trigger",var_02); if(var_02 == param_00 && var_02 setweaponammostock("tracking_grenade_var") < weaponmaxammo("tracking_grenade_var")) { break; } } param_00 setweaponammostock("tracking_grenade_var",param_00 setweaponammostock("tracking_grenade_var") + 1); self delete(); } //Function Number: 43 play_tracking_grenade_impacts(param_00,param_01) { for(var_02 = 0;var_02 < 20;var_02++) { wait(0.01); var_03 = "tracking_grenade_water_impact_" + randomintrange(0,2); var_04 = "tracking_grenade_default_impact_" + randomintrange(0,2); var_05 = (randomfloat(2) - 1,randomfloat(2) - 1,randomfloat(-1)); var_06 = 32 * var_05 + param_01; var_07 = param_00 * var_05 + param_01; var_08 = bullettrace(var_06,var_07,0,undefined,0,0,1,0,0); if(isdefined(var_08) && var_08["surfacetype"] != "none") { if(distance(var_06,var_08["position"]) > 5) { if(iswatersurface(var_08["surfacetype"])) { playfx(common_scripts\utility::getfx(var_03),var_08["position"],var_08["normal"]); continue; } playfx(common_scripts\utility::getfx(var_04),var_08["position"],var_08["normal"]); } } } } //Function Number: 44 tracking_grenade_handle_damage(param_00) { self endon("death"); self makeentitysentient(param_00.team,1); self waittill("damage"); tracking_grenade_detonate(); } //Function Number: 45 tracking_grenade_handle_autosave(param_00) { if(!isplayer(param_00)) { return; } if(!isdefined(param_00.num_active_tracking_grenades)) { param_00.num_active_tracking_grenades = 0; } param_00.num_active_tracking_grenades++; maps\_utility::add_extra_autosave_check("no_tracking_grenades_active",::no_tracking_grenades_active,"tracking grenades are active"); common_scripts\utility::waittill_either("death","tracking_grenade_deactivate"); wait(1); param_00.num_active_tracking_grenades--; } //Function Number: 46 no_tracking_grenades_active() { return !isdefined(level.player.num_active_tracking_grenades) || level.player.num_active_tracking_grenades == 0; } //Function Number: 47 tracking_grenade_scare_enemies(param_00) { badplace_cylinder("",4,param_00 + (0,0,-64),117,128,"all"); } //Function Number: 48 tracking_grenade_get_target(param_00) { var_01 = param_00 geteye(); var_02 = anglestoforward(param_00 getgunangles()); var_03 = cos(20); var_04 = undefined; var_05 = getaispeciesarray(common_scripts\utility::get_enemy_team(param_00.team),"all"); var_05 = common_scripts\utility::array_combine(var_05,getentarray("tracking_grenade_target","script_noteworthy")); var_05 = common_scripts\utility::array_combine(var_05,vehicle_getarray()); foreach(var_07 in var_05) { if(var_07.code_classname == "script_vehicle" && !issentient(var_07)) { continue; } if(isdefined(var_07.pretending_to_be_dead)) { continue; } var_08 = undefined; if(isai(var_07)) { var_08 = var_07 geteye(); } else { var_08 = var_07.origin; } var_09 = vectordot(vectornormalize(var_08 - var_01),var_02); if(var_09 <= var_03) { continue; } if(distancesquared(var_08,var_01) < distancesquared(self.origin,var_01)) { continue; } if(!sighttracepassed(self.origin,var_08,0,self,var_07)) { continue; } if(isdefined(var_04) && !sighttracepassed(self.origin,var_08,0,self,var_07)) { continue; } var_03 = var_09; var_04 = var_07; } return var_04; } //Function Number: 49 tracking_grenade_thrust_effect(param_00,param_01,param_02) { var_03 = common_scripts\utility::spawn_tag_origin(); if(isdefined(param_02)) { var_03.origin = var_03.origin + param_02; } var_03.angles = vectortoangles(param_00); var_03 linkto(self); playfxontag(common_scripts\utility::getfx(param_01),var_03,"tag_origin"); var_03 common_scripts\utility::delaycall(0.3,::delete); } //Function Number: 50 getsmoothrandomvector(param_00,param_01) { var_02 = gettime() * 0.001 * param_01; return (perlinnoise2d(var_02,10,1,1,1) * param_00,perlinnoise2d(var_02,20,1,1,1) * param_00,perlinnoise2d(var_02,30,1,1,1) * param_00); } //Function Number: 51 make_tracking_grenade(param_00) { var_01 = param_00.origin; param_00 delete(); var_02 = spawn("script_model",var_01); var_02 setmodel("npc_variable_grenade_lethal"); return var_02; } //Function Number: 52 target_valid_targets() { var_00 = getaiarray("axis"); var_01 = []; var_02 = common_scripts\utility::spawn_tag_origin(); target_set(var_02); target_setjavelinonly(var_02,1); foreach(var_04 in var_00) { var_02.origin = var_04 geteye(); if(target_isincircle(var_02,self,65,100)) { var_01[var_01.size] = var_04; } } var_02 delete(); return var_01; } //Function Number: 53 get_npc_center_offset() { if(isai(self) && isalive(self)) { var_00 = self geteye()[2]; var_01 = self.origin[2]; var_02 = var_00 - var_01; return (0,0,var_02); } return (0,0,0); } //Function Number: 54 iswatersurface(param_00) { var_01 = ["water_waist","water_ankle","water_knee"]; foreach(var_03 in var_01) { if(var_03 == param_00) { return 1; } } return 0; } //Function Number: 55 target_enhancer_think() { self endon("death"); self endon("disconnect"); self endon("faux_spawn"); var_00 = 10; var_01 = cos(var_00); var_02 = 0.5; var_03 = undefined; for(;;) { var_04 = 0; var_05 = getweaponattachments(self getcurrentweapon()); if(isdefined(var_05)) { foreach(var_07 in var_05) { if(var_07 == "opticstargetenhancer") { var_04 = 1; break; } } } while(var_04 && self playerads() < var_02) { if(isdefined(var_03)) { var_03 destroy(); var_03 = undefined; } wait(0.05); } if(!var_04) { if(isdefined(var_03)) { var_03 destroy(); var_03 = undefined; } wait(0.05); continue; } if(self isusingturret()) { if(isdefined(var_03)) { var_03 destroy(); var_03 = undefined; } wait(0.05); continue; } if(!isdefined(var_03)) { var_03 = player_enable_highlight(); } wait(0.05); } } //Function Number: 56 player_enable_highlight() { var_00 = newclienthudelem(self); var_00.color = (0.2,0.01,0.01); var_00.alpha = 1; var_00 setradarhighlight(-1); return var_00; }