/******************************************************************* * Decompiled By: Bog * Decompiled File: _exo_shield_sp.gsc * Game: Call of Duty: Advanced Warfare * Platform: PC * Function Count: 21 * Decompile Time: 322 ms * Timestamp: 4/22/2024 2:20:58 AM *******************************************************************/ //Function Number: 1 init() { precacheitem("s1_exo_shield_sp"); precacheshader("dpad_icon_shield"); precacheshader("dpad_icon_shield_off"); level.player maps\_utility::set_unstorable_weapon("s1_exo_shield_sp"); precachestring(&"GAME_CROUCH_BLOCKED_WEAPON"); maps\_utility::add_hint_string("EXO_SHIELD_CROUCH_BLOCKED_WEAPON",&"GAME_CROUCH_BLOCKED_WEAPON"); if(!isdefined(level.player.exoparams)) { level.player.exoparams = []; } level.player.exoparams["shield"] = spawnstruct(); var_00 = level.player.exoparams["shield"]; var_00.weapon_name = "s1_exo_shield_sp"; var_00.activation_cost = 1; var_00.state = "disabled"; var_00.return_after_offhand = 1; var_00.duration = 15; level.player thread monitor_unauthorized_shield(); level.player thread monitor_failed_switchback(); if(!level.player maps\_utility::ent_flag_exist("exo_shield_on")) { level.player maps\_utility::ent_flag_init("exo_shield_on"); } } //Function Number: 2 get_exo_shield_params() { return level.player.exoparams["shield"]; } //Function Number: 3 state_change(param_00) { var_01 = get_exo_shield_params(); var_02 = is_shield_up_state(var_01.state); var_03 = is_shield_up_state(param_00); var_01.state = param_00; if(!var_02 && var_03) { on_shield_up(); return; } if(var_02 && !var_03) { on_shield_down(); } } //Function Number: 4 is_shield_up_state(param_00) { return isdefined(param_00) && param_00 == "raised"; } //Function Number: 5 on_shield_up() { var_00 = get_exo_shield_params(); level.player maps\_utility::playerallowalternatemelee(0,"exo_shield"); level.player.forcealtmeleedeaths = 1; } //Function Number: 6 on_shield_down() { var_00 = get_exo_shield_params(); level.player maps\_utility::playerallowalternatemelee(1,"exo_shield"); level.player.forcealtmeleedeaths = undefined; } //Function Number: 7 enable_shield_ability() { level.player endon("exo_shield_disabled"); level.player notify("exo_shield_enabled"); state_change("idle"); var_00 = get_exo_shield_params(); update_exo_shield_icon(); level.player notifyonplayercommand("exo_shield_toggle","+actionslot 2"); for(;;) { level.player waittill("exo_shield_toggle"); switch(var_00.state) { case "equipping": case "raised": lower_shield(); break; case "idle": thread try_raise_shield(); break; } } } //Function Number: 8 disable_shield_ability() { var_00 = get_exo_shield_params(); level.player setweaponhudiconoverride("actionslot2","dpad_icon_shield_off"); switch(var_00.state) { case "equipping": case "raised": lower_shield(); break; } level.player notify("exo_shield_disabled"); if(level.player hasweapon(var_00.weapon_name)) { level.player endon("exo_shield_enabled"); level.player waittill("exo_shield_removed"); } state_change("disabled"); } //Function Number: 9 try_raise_shield() { var_00 = get_exo_shield_params(); var_01 = 0; if(level.player getstance() == "prone") { level.player setstance("crouch"); } if(level.player getstance() == "prone") { maps\_utility::display_hint("EXO_SHIELD_CROUCH_BLOCKED_WEAPON",undefined,undefined,undefined,200); var_01 = 1; } else if(level.player isthrowinggrenade() || level.player isonladder()) { var_01 = 1; } else if(maps\_player_exo::batteryspend(var_00.activation_cost)) { raise_shield(); } if(var_01) { maps\_player_exo::exofailfx(); } } //Function Number: 10 raise_shield() { level.player endon("exo_shield_disabled"); level.player endon("exo_shield_lower"); level.player endon("exo_shield_removed"); level.player maps\_utility::ent_flag_set("exo_shield_on"); var_00 = get_exo_shield_params(); state_change("equipping"); var_00.previous_weapon = level.player getcurrentprimaryweapon(); level.player giveweapon(var_00.weapon_name); soundscripts\_snd::snd_message("exo_raise_shield"); level.player thread monitor_equip_interrupt(); level.player switchtoweapon(var_00.weapon_name); var_01 = undefined; var_02 = level.player getcurrentweapon(1); while(!isdefined(var_01) || var_01 || var_02 == "none") { level.player waittill("weapon_change"); var_01 = level.player isonladder(); var_02 = level.player getcurrentweapon(1); } var_03 = level.player getcurrentweapon(0) == var_00.weapon_name; if(!var_03) { var_02 = level.player getcurrentweapon(); if(var_02 == var_00.weapon_name || var_02 == "none") { switch_to_previous_weapon(); } _remove_shield(); return; } level.player notify("exo_shield_equipped"); state_change("raised"); thread monitor_shield_switchout(); thread monitor_shield_timeout(); } //Function Number: 11 monitor_equip_interrupt() { level.player endon("exo_shield_equipped"); level.player endon("exo_shield_removed"); level.player childthread monitor_shield_stolen(); level.player common_scripts\utility::waittill_any("exo_shield_disabled","exo_shield_lower"); _remove_shield(); } //Function Number: 12 monitor_shield_stolen() { level.player endon("exo_shield_disabled"); level.player endon("exo_shield_lower"); var_00 = get_exo_shield_params(); for(;;) { level.player waittill("weapon_taken",var_01); if(issubstr(var_01,var_00.weapon_name)) { state_change("idle"); level.player notify("exo_shield_removed"); } } } //Function Number: 13 lower_shield(param_00) { var_01 = get_exo_shield_params(); level.player notify("exo_shield_lower"); soundscripts\_snd::snd_message("exo_lower_shield"); level.player maps\_utility::ent_flag_clear("exo_shield_on"); var_02 = level.player getcurrentweapon(); if(var_02 == "none" || var_02 == var_01.weapon_name || var_01.state == "equipping") { switch_to_previous_weapon(param_00); } } //Function Number: 14 _remove_shield() { var_00 = get_exo_shield_params(); level.player takeweapon(var_00.weapon_name); state_change("idle"); level.player notify("exo_shield_removed"); } //Function Number: 15 switch_to_previous_weapon(param_00) { var_01 = get_exo_shield_params(); var_02 = undefined; if(isdefined(var_01.previous_weapon) && level.player hasweapon(var_01.previous_weapon)) { var_02 = var_01.previous_weapon; } else { var_02 = level.player maps\_utility::get_first_storable_weapon(); } if(!isdefined(var_02) && var_02 != "none") { } if(isdefined(var_02)) { if(isdefined(param_00) && param_00) { level.player switchtoweaponimmediate(var_02); return; } level.player switchtoweapon(var_02); } } //Function Number: 16 monitor_shield_timeout() { var_00 = get_exo_shield_params(); level.player endon("exo_shield_removed"); var_00.start_time = gettime(); wait(var_00.duration); if(var_00.state == "raised") { if(level.player isusingoffhand()) { offhand_switchout(); return; } var_02 = level.player getcurrentweapon(0) == var_00.weapon_name; lower_shield(!var_02); } } //Function Number: 17 monitor_shield_switchout() { var_00 = get_exo_shield_params(); level.player endon("exo_shield_removed"); var_01 = 0; while(!var_01) { level.player common_scripts\utility::waittill_any("weapon_switch_started","weapon_change","exo_shield_toggle"); var_02 = level.player getcurrentweapon(0) == var_00.weapon_name; var_03 = !var_02 && level.player getcurrentweapon(1) == var_00.weapon_name; var_04 = level.player isusingoffhand() || level.player isthrowinggrenade(); var_05 = level.player hasweapon(var_00.weapon_name); var_06 = !var_03 && var_05 && level.player isonladder(); switch(var_00.state) { case "raised": if(!var_02 && !var_06) { if(var_05) { if(var_03) { lower_shield(1); } level.player takeweapon(var_00.weapon_name); } state_change("idle"); var_01 = 1; } else if(var_04 && !var_00.return_after_offhand) { offhand_switchout(); var_01 = 1; } break; default: break; } } level.player notify("exo_shield_removed"); } //Function Number: 18 monitor_failed_switchback() { var_00 = get_exo_shield_params(); level.player endon("death"); for(;;) { level.player waittill("weapon_switch_invalid",var_01,var_02); if(isdefined(var_01) && var_01 == var_00.weapon_name) { switch_to_previous_weapon(var_02); } } } //Function Number: 19 monitor_unauthorized_shield() { var_00 = get_exo_shield_params(); level.player endon("death"); for(;;) { level.player waittill("weapon_switch_started",var_01); if((var_00.state == "disabled" || var_00.state == "idle") && level.player hasweapon(var_00.weapon_name)) { level.player takeweapon(var_00.weapon_name); if(isdefined(var_01) && var_01 == var_00.weapon_name) { switch_to_previous_weapon(0); } } } } //Function Number: 20 offhand_switchout() { var_00 = get_exo_shield_params(); var_01 = level.player isusingoffhand(); while(!var_01) { wait 0.05; var_01 = level.player isusingoffhand(); } lower_shield(1); _remove_shield(); } //Function Number: 21 update_exo_shield_icon() { if(!maps\_player_exo::player_exo_is_active()) { level.player setweaponhudiconoverride("actionslot2","none"); return; } if(maps\_player_exo::get_exo_battery_percent() > 0) { level.player setweaponhudiconoverride("actionslot2","dpad_icon_shield"); return; } level.player setweaponhudiconoverride("actionslot2","dpad_icon_shield_off"); }