/******************************************************************* * Decompiled By: Bog * Decompiled File: _autosave.gsc * Game: Call of Duty: Advanced Warfare * Platform: PC * Function Count: 28 * Decompile Time: 413 ms * Timestamp: 4/22/2024 2:20:05 AM *******************************************************************/ //Function Number: 1 main() { level.lastautosavetime = 0; common_scripts\utility::flag_init("game_saving"); common_scripts\utility::flag_init("can_save"); common_scripts\utility::flag_set("can_save"); common_scripts\utility::flag_init("disable_autosaves"); if(!isdefined(level._extra_autosave_checks)) { level._extra_autosave_checks = []; } level.autosave_proximity_threat_func = ::autosave_proximity_threat_func; } //Function Number: 2 getdescription() { return &"AUTOSAVE_AUTOSAVE"; } //Function Number: 3 getnames(param_00) { if(param_00 == 0) { var_01 = &"AUTOSAVE_GAME"; } else { var_01 = &"AUTOSAVE_NOGAME"; } return var_01; } //Function Number: 4 beginningoflevelsave() { common_scripts\utility::flag_wait("introscreen_complete"); if(isdefined(level.introscreen_complete_delay)) { wait(level.introscreen_complete_delay); } if(level.missionfailed) { return; } if(common_scripts\utility::flag("game_saving")) { return; } common_scripts\utility::flag_set("game_saving"); var_00 = "levelshots / autosave / autosave_" + level.script + "start"; savegame("levelstart",&"AUTOSAVE_LEVELSTART",var_00,1); setdvar("ui_grenade_death","0"); common_scripts\utility::flag_clear("game_saving"); } //Function Number: 5 trigger_autosave_stealth(param_00) { param_00 waittill("trigger"); maps\_utility::autosave_stealth(); } //Function Number: 6 trigger_autosave_tactical(param_00) { param_00 waittill("trigger"); maps\_utility::autosave_tactical(); } //Function Number: 7 trigger_autosave(param_00) { if(!isdefined(param_00.script_autosave)) { param_00.script_autosave = 0; } autosaves_think(param_00); } //Function Number: 8 autosaves_think(param_00) { var_01 = getnames(param_00.script_autosave); if(!isdefined(var_01)) { return; } wait(1); param_00 waittill("trigger"); var_02 = param_00.script_autosave; var_03 = "levelshots / autosave / autosave_" + level.script + var_02; tryautosave(var_02,var_01,var_03); if(isdefined(param_00)) { param_00 delete(); } } //Function Number: 9 autosavenamethink(param_00) { if(maps\_utility::is_no_game_start()) { return; } wait(1); param_00 waittill("trigger"); if(!isdefined(param_00)) { return; } var_01 = param_00.script_autosavename; param_00 delete(); if(isdefined(level.customautosavecheck)) { if(![[ level.customautosavecheck ]]()) { return; } } maps\_utility::autosave_by_name(var_01); } //Function Number: 10 trigger_autosave_immediate(param_00) { param_00 waittill("trigger"); } //Function Number: 11 autosaveprint(param_00,param_01) { if(isdefined(param_01)) { } } //Function Number: 12 autosave_timeout(param_00) { level endon("trying_new_autosave"); level endon("autosave_complete"); wait(param_00); common_scripts\utility::flag_clear("game_saving"); level notify("autosave_timeout"); } //Function Number: 13 _autosave_game_now_nochecks() { var_00 = "levelshots / autosave / autosave_" + level.script + "start"; savegame("levelstart",&"AUTOSAVE_LEVELSTART",var_00,1); autosave_recon(0); } //Function Number: 14 _autosave_game_now_notrestart() { var_00 = "levelshots / autosave / autosave_" + level.script + "start"; if(getdvarint("g_reloading") == 0) { savegame("levelstart",&"AUTOSAVE_LEVELSTART",var_00,1); autosave_recon(0); } } //Function Number: 15 _autosave_game_now(param_00) { if(isdefined(level.missionfailed) && level.missionfailed) { return; } if(common_scripts\utility::flag("game_saving")) { return 0; } for(var_01 = 0;var_01 < level.players.size;var_01++) { var_02 = level.players[var_01]; if(!isalive(var_02)) { return 0; } } var_03 = "save_now"; var_04 = getdescription(); if(isdefined(param_00)) { var_05 = savegamenocommit(var_03,var_04,"$default",1); } else { var_05 = savegamenocommit(var_04,var_05); } wait(0.05); if(issaverecentlyloaded()) { level.lastautosavetime = gettime(); return 0; } if(var_05 < 0) { return 0; } if(!try_to_autosave_now()) { return 0; } common_scripts\utility::flag_set("game_saving"); wait(2); common_scripts\utility::flag_clear("game_saving"); if(!commitwouldbevalid(var_05)) { return 0; } if(try_to_autosave_now()) { autosave_recon(var_05); commitsave(var_05); setdvar("ui_grenade_death","0"); } return 1; } //Function Number: 16 autosave_now_trigger(param_00) { param_00 waittill("trigger"); maps\_utility::autosave_now(); } //Function Number: 17 try_to_autosave_now() { if(!issavesuccessful()) { return 0; } for(var_00 = 0;var_00 < level.players.size;var_00++) { var_01 = level.players[var_00]; if(!var_01 autosavehealthcheck()) { return 0; } } if(!common_scripts\utility::flag("can_save")) { return 0; } return 1; } //Function Number: 18 tryautosave(param_00,param_01,param_02,param_03,param_04,param_05) { if(common_scripts\utility::flag("disable_autosaves")) { return 0; } level endon("nextmission"); level.player endon("death"); if(maps\_utility::is_coop()) { level.player2 endon("death"); } level notify("trying_new_autosave"); if(common_scripts\utility::flag("game_saving")) { return 0; } if(isdefined(level.nextmission)) { return 0; } var_06 = 1.25; var_07 = 1.25; if(isdefined(param_03) && param_03 < var_06 + var_07) { } if(!isdefined(param_05)) { param_05 = 0; } if(!isdefined(param_02)) { param_02 = "$default"; } if(!isdefined(param_04)) { param_04 = 0; } common_scripts\utility::flag_set("game_saving"); var_08 = getdescription(); var_09 = gettime(); for(;;) { if(autosavecheck(undefined,param_04)) { var_0A = savegamenocommit(param_00,var_08,param_02,param_05); if(var_0A < 0) { break; } wait(0.05); if(issaverecentlyloaded()) { level.lastautosavetime = gettime(); break; } wait(var_06); if(!autosavecheck(undefined,param_04)) { continue; } wait(var_07); if(!autosavecheck_not_picky()) { continue; } if(isdefined(param_03)) { if(gettime() > var_09 + param_03 * 1000) { break; } } if(!common_scripts\utility::flag("can_save")) { break; } if(!commitwouldbevalid(var_0A)) { common_scripts\utility::flag_clear("game_saving"); return 0; } autosave_recon(var_0A); commitsave(var_0A); level.lastsavetime = gettime(); setdvar("ui_grenade_death","0"); break; } wait(0.25); } common_scripts\utility::flag_clear("game_saving"); return 1; } //Function Number: 19 extra_autosave_checks_failed() { foreach(var_01 in level._extra_autosave_checks) { if(![[ var_01["func"] ]]()) { autosaveprint("autosave failed: " + var_01["msg"]); return 1; } } return 0; } //Function Number: 20 autosavecheck_not_picky() { return autosavecheck(0,0); } //Function Number: 21 autosavecheck(param_00,param_01) { if(isdefined(level.autosave_check_override)) { return [[ level.autosave_check_override ]](); } if(isdefined(level.special_autosavecondition) && ![[ level.special_autosavecondition ]]()) { return 0; } if(level.missionfailed) { return 0; } if(!isdefined(param_00)) { param_00 = level.dopickyautosavechecks; } if(!isdefined(param_01)) { param_01 = 0; } if(param_01) { if(![[ level.global_callbacks["_autosave_stealthcheck"] ]]()) { return 0; } } for(var_02 = 0;var_02 < level.players.size;var_02++) { var_03 = level.players[var_02]; if(!var_03 autosavehealthcheck()) { return 0; } if(param_00 && !var_03 autosaveammocheck()) { return 0; } } if(level.autosave_threat_check_enabled) { if(!autosavethreatcheck(param_00)) { return 0; } } for(var_02 = 0;var_02 < level.players.size;var_02++) { var_03 = level.players[var_02]; if(!var_03 autosaveplayercheck(param_00)) { return 0; } } if(isdefined(level.savehere) && !level.savehere) { return 0; } if(isdefined(level.cansave) && !level.cansave) { return 0; } if(extra_autosave_checks_failed()) { return 0; } if(!issavesuccessful()) { autosaveprint("autosave failed: save call was unsuccessful"); return 0; } return 1; } //Function Number: 22 autosaveplayercheck(param_00) { if(isdefined(level.ac130gunner) && level.ac130gunner == self) { return 1; } if(self ismeleeing() && param_00) { autosaveprint("autosave failed:player is meleeing"); return 0; } if(self isthrowinggrenade() && param_00) { autosaveprint("autosave failed:player is throwing a grenade"); return 0; } if(self isfiring() && param_00) { autosaveprint("autosave failed:player is firing"); return 0; } if(isdefined(self.shellshocked) && self.shellshocked) { autosaveprint("autosave failed:player is in shellshock"); return 0; } if(common_scripts\utility::isflashed()) { autosaveprint("autosave failed:player is flashbanged"); return 0; } return 1; } //Function Number: 23 autosaveammocheck() { if(isdefined(level.noautosaveammocheck) && level.noautosaveammocheck) { return 1; } if(isdefined(level.ac130gunner) && level.ac130gunner == self) { return 1; } var_00 = self getweaponslistprimaries(); for(var_01 = 0;var_01 < var_00.size;var_01++) { var_02 = self getfractionmaxammo(var_00[var_01]); if(var_02 > 0.1) { return 1; } } autosaveprint("autosave failed: ammo too low"); return 0; } //Function Number: 24 autosavehealthcheck() { if(isdefined(level.ac130gunner) && level.ac130gunner == self) { return 1; } if(maps\_utility::ent_flag_exist("laststand_downed") && maps\_utility::ent_flag("laststand_downed")) { return 0; } var_00 = self.health / self.maxhealth; if(var_00 < 0.5) { return 0; } if(common_scripts\utility::flag("_radiation_poisoning")) { return 0; } if(maps\_utility::ent_flag("player_has_red_flashing_overlay")) { return 0; } return 1; } //Function Number: 25 autosavethreatcheck(param_00) { if(isdefined(level.ac130gunner) && level.ac130gunner == self) { return 1; } var_01 = getaispeciesarray("bad_guys","all"); foreach(var_03 in var_01) { if(!isdefined(var_03.enemy)) { continue; } if(!isplayer(var_03.enemy)) { continue; } if(var_03.type == "dog") { foreach(var_05 in level.players) { if(distance(var_03.origin,var_05.origin) < 384) { return 0; } } continue; } if(isdefined(var_03.melee) && isdefined(var_03.melee.target) && isplayer(var_03.melee.target)) { return 0; } var_07 = [[ level.autosave_proximity_threat_func ]](var_03); if(var_07 == "return_even_if_low_accuracy") { return 0; } if(var_03.finalaccuracy < 0.021 && var_03.finalaccuracy > -1) { continue; } if(var_07 == "return") { return 0; } if(var_07 == "none") { continue; } if(var_03.a.lastshoottime > gettime() - 500) { if(param_00 || var_03 animscripts\utility::canseeenemy(0) && var_03 canshootenemy(0)) { return 0; } } if(isdefined(var_03.a.aimidlethread) && var_03 animscripts\utility::canseeenemy(0) && var_03 canshootenemy(0)) { return 0; } } if(maps\_utility::player_is_near_live_grenade()) { return 0; } var_09 = getentarray("destructible","classname"); foreach(var_0B in var_09) { if(!isdefined(var_0B.healthdrain)) { continue; } foreach(var_05 in level.players) { if(distance(var_0B.origin,var_05.origin) < 400) { return 0; } } } return 1; } //Function Number: 26 enemy_is_a_threat() { if(self.finalaccuracy >= 0.021) { return 1; } foreach(var_01 in level.players) { if(distance(self.origin,var_01.origin) < 500) { return 1; } } return 0; } //Function Number: 27 autosave_proximity_threat_func(param_00) { foreach(var_02 in level.players) { var_03 = distance(param_00.origin,var_02.origin); if(var_03 < 200) { return "return_even_if_low_accuracy"; } else if(var_03 < 360) { return "return"; } else if(var_03 < 1000) { return "threat_exists"; } } return "none"; } //Function Number: 28 autosave_recon(param_00) { if(!maps\_utility::is_default_start()) { return; } var_01 = maps\_utility_code::get_leveltime(); var_02 = var_01; if(isdefined(level.recon_checkpoint_lasttime)) { var_02 = var_01 - level.recon_checkpoint_lasttime; } level.recon_checkpoint_lasttime = var_01; reconevent("script_checkpoint: id %d, leveltime %d, deltatime %d",param_00,var_01,var_02); }