iw6-scripts/maps/_autosave.gsc
2024-02-13 13:20:49 +01:00

611 lines
13 KiB
Plaintext

// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
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;
}
getdescription()
{
return &"AUTOSAVE_AUTOSAVE";
}
getnames( var_0 )
{
if ( var_0 == 0 )
var_1 = &"AUTOSAVE_GAME";
else
var_1 = &"AUTOSAVE_NOGAME";
return var_1;
}
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_0 = "levelshots / autosave / autosave_" + level.script + "start";
savegame( "levelstart", &"AUTOSAVE_LEVELSTART", var_0, 1 );
setdvar( "ui_grenade_death", "0" );
common_scripts\utility::flag_clear( "game_saving" );
}
trigger_autosave_stealth( var_0 )
{
var_0 waittill( "trigger" );
maps\_utility::autosave_stealth();
}
trigger_autosave_tactical( var_0 )
{
var_0 waittill( "trigger" );
maps\_utility::autosave_tactical();
}
trigger_autosave( var_0 )
{
if ( !isdefined( var_0.script_autosave ) )
var_0.script_autosave = 0;
autosaves_think( var_0 );
}
autosaves_think( var_0 )
{
var_1 = getnames( var_0.script_autosave );
if ( !isdefined( var_1 ) )
return;
wait 1;
var_0 waittill( "trigger" );
var_2 = var_0.script_autosave;
var_3 = "levelshots / autosave / autosave_" + level.script + var_2;
tryautosave( var_2, var_1, var_3 );
if ( isdefined( var_0 ) )
var_0 delete();
}
autosavenamethink( var_0 )
{
if ( maps\_utility::is_no_game_start() )
return;
wait 1;
var_0 waittill( "trigger" );
if ( !isdefined( var_0 ) )
return;
var_1 = var_0.script_autosavename;
var_0 delete();
if ( isdefined( level.customautosavecheck ) )
{
if ( ![[ level.customautosavecheck ]]() )
return;
}
maps\_utility::autosave_by_name( var_1 );
}
trigger_autosave_immediate( var_0 )
{
var_0 waittill( "trigger" );
}
autosaveprint( var_0, var_1 )
{
if ( isdefined( var_1 ) )
return;
return;
}
autosave_timeout( var_0 )
{
level endon( "trying_new_autosave" );
level endon( "autosave_complete" );
wait( var_0 );
common_scripts\utility::flag_clear( "game_saving" );
level notify( "autosave_timeout" );
}
_autosave_game_now_nochecks()
{
var_0 = "levelshots / autosave / autosave_" + level.script + "start";
savegame( "levelstart", &"AUTOSAVE_LEVELSTART", var_0, 1 );
autosave_recon( 0 );
}
_autosave_game_now_notrestart()
{
var_0 = "levelshots / autosave / autosave_" + level.script + "start";
if ( getdvarint( "g_reloading" ) == 0 )
{
savegame( "levelstart", &"AUTOSAVE_LEVELSTART", var_0, 1 );
autosave_recon( 0 );
}
}
_autosave_game_now( var_0 )
{
if ( isdefined( level.missionfailed ) && level.missionfailed )
return;
if ( common_scripts\utility::flag( "game_saving" ) )
return 0;
for ( var_1 = 0; var_1 < level.players.size; var_1++ )
{
var_2 = level.players[var_1];
if ( !isalive( var_2 ) )
return 0;
}
var_3 = "save_now";
var_4 = getdescription();
if ( isdefined( var_0 ) )
var_5 = savegamenocommit( var_3, var_4, "$default", 1 );
else
var_5 = savegamenocommit( var_3, var_4 );
wait 0.05;
if ( issaverecentlyloaded() )
{
level.lastautosavetime = gettime();
return 0;
}
if ( var_5 < 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_5 ) )
return 0;
if ( try_to_autosave_now() )
{
autosave_recon( var_5 );
commitsave( var_5 );
setdvar( "ui_grenade_death", "0" );
}
return 1;
}
autosave_now_trigger( var_0 )
{
var_0 waittill( "trigger" );
maps\_utility::autosave_now();
}
try_to_autosave_now()
{
if ( !issavesuccessful() )
return 0;
for ( var_0 = 0; var_0 < level.players.size; var_0++ )
{
var_1 = level.players[var_0];
if ( !var_1 autosavehealthcheck() )
return 0;
}
if ( !common_scripts\utility::flag( "can_save" ) )
return 0;
return 1;
}
tryautosave( var_0, var_1, var_2, var_3, var_4, var_5 )
{
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_6 = 1.25;
var_7 = 1.25;
if ( isdefined( var_3 ) && var_3 < var_6 + var_7 )
{
}
if ( !isdefined( var_5 ) )
var_5 = 0;
if ( !isdefined( var_2 ) )
var_2 = "$default";
if ( !isdefined( var_4 ) )
var_4 = 0;
common_scripts\utility::flag_set( "game_saving" );
var_8 = getdescription();
var_9 = gettime();
for (;;)
{
if ( autosavecheck( undefined, var_4 ) )
{
var_10 = savegamenocommit( var_0, var_8, var_2, var_5 );
if ( var_10 < 0 )
break;
wait 0.05;
if ( issaverecentlyloaded() )
{
level.lastautosavetime = gettime();
break;
}
wait( var_6 );
if ( extra_autosave_checks_failed() )
continue;
if ( !autosavecheck( undefined, var_4 ) )
continue;
wait( var_7 );
if ( !autosavecheck_not_picky() )
continue;
if ( isdefined( var_3 ) )
{
if ( gettime() > var_9 + var_3 * 1000 )
break;
}
if ( !common_scripts\utility::flag( "can_save" ) )
break;
if ( !commitwouldbevalid( var_10 ) )
{
common_scripts\utility::flag_clear( "game_saving" );
return 0;
}
autosave_recon( var_10 );
commitsave( var_10 );
level.lastsavetime = gettime();
setdvar( "ui_grenade_death", "0" );
break;
}
wait 0.25;
}
common_scripts\utility::flag_clear( "game_saving" );
return 1;
}
extra_autosave_checks_failed()
{
foreach ( var_1 in level._extra_autosave_checks )
{
if ( ![[ var_1["func"] ]]() )
{
autosaveprint( "autosave failed: " + var_1["msg"] );
return 1;
}
}
return 0;
}
autosavecheck_not_picky()
{
return autosavecheck( 0, 0 );
}
autosavecheck( var_0, var_1 )
{
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( var_0 ) )
var_0 = level.dopickyautosavechecks;
if ( !isdefined( var_1 ) )
var_1 = 0;
if ( var_1 )
{
if ( ![[ level.global_callbacks["_autosave_stealthcheck"] ]]() )
return 0;
}
for ( var_2 = 0; var_2 < level.players.size; var_2++ )
{
var_3 = level.players[var_2];
if ( !var_3 autosavehealthcheck() )
return 0;
if ( var_0 && !var_3 autosaveammocheck() )
return 0;
}
if ( level.autosave_threat_check_enabled )
{
if ( !autosavethreatcheck( var_0 ) )
return 0;
}
for ( var_2 = 0; var_2 < level.players.size; var_2++ )
{
var_3 = level.players[var_2];
if ( !var_3 autosaveplayercheck( var_0 ) )
return 0;
}
if ( isdefined( level.savehere ) && !level.savehere )
return 0;
if ( isdefined( level.cansave ) && !level.cansave )
return 0;
if ( !issavesuccessful() )
{
autosaveprint( "autosave failed: save call was unsuccessful" );
return 0;
}
return 1;
}
autosaveplayercheck( var_0 )
{
if ( isdefined( level.ac130gunner ) && level.ac130gunner == self )
return 1;
if ( self ismeleeing() && var_0 )
{
autosaveprint( "autosave failed:player is meleeing" );
return 0;
}
if ( self isthrowinggrenade() && var_0 )
{
autosaveprint( "autosave failed:player is throwing a grenade" );
return 0;
}
if ( self isfiring() && var_0 )
{
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;
}
autosaveammocheck()
{
if ( isdefined( level.ac130gunner ) && level.ac130gunner == self )
return 1;
var_0 = self getweaponslistprimaries();
for ( var_1 = 0; var_1 < var_0.size; var_1++ )
{
var_2 = self getfractionmaxammo( var_0[var_1] );
if ( var_2 > 0.1 )
return 1;
}
autosaveprint( "autosave failed: ammo too low" );
return 0;
}
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_0 = self.health / self.maxhealth;
if ( var_0 < 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;
}
autosavethreatcheck( var_0 )
{
if ( isdefined( level.ac130gunner ) && level.ac130gunner == self )
return 1;
var_1 = getaispeciesarray( "bad_guys", "all" );
foreach ( var_3 in var_1 )
{
if ( !isdefined( var_3.enemy ) )
continue;
if ( !isplayer( var_3.enemy ) )
continue;
if ( var_3.type == "dog" )
{
foreach ( var_5 in level.players )
{
if ( distance( var_3.origin, var_5.origin ) < 384 )
return 0;
}
continue;
}
if ( isdefined( var_3.melee ) && isdefined( var_3.melee.target ) && isplayer( var_3.melee.target ) )
return 0;
var_7 = [[ level.autosave_proximity_threat_func ]]( var_3 );
if ( var_7 == "return_even_if_low_accuracy" )
return 0;
if ( var_3.finalaccuracy < 0.021 && var_3.finalaccuracy > -1 )
continue;
if ( var_7 == "return" )
return 0;
if ( var_7 == "none" )
continue;
if ( var_3.a.lastshoottime > gettime() - 500 )
{
if ( var_0 || var_3 animscripts\utility::canseeenemy( 0 ) && var_3 canshootenemy( 0 ) )
return 0;
}
if ( isdefined( var_3.a.aimidlethread ) && var_3 animscripts\utility::canseeenemy( 0 ) && var_3 canshootenemy( 0 ) )
return 0;
}
if ( maps\_utility::player_is_near_live_grenade() )
return 0;
var_9 = getentarray( "destructible", "classname" );
foreach ( var_11 in var_9 )
{
if ( !isdefined( var_11.healthdrain ) )
continue;
foreach ( var_5 in level.players )
{
if ( distance( var_11.origin, var_5.origin ) < 400 )
return 0;
}
}
return 1;
}
enemy_is_a_threat()
{
if ( self.finalaccuracy >= 0.021 )
return 1;
foreach ( var_1 in level.players )
{
if ( distance( self.origin, var_1.origin ) < 500 )
return 1;
}
return 0;
}
autosave_proximity_threat_func( var_0 )
{
foreach ( var_2 in level.players )
{
var_3 = distance( var_0.origin, var_2.origin );
if ( var_3 < 200 )
return "return_even_if_low_accuracy";
else if ( var_3 < 360 )
return "return";
else if ( var_3 < 1000 )
return "threat_exists";
}
return "none";
}
autosave_recon( var_0 )
{
if ( !maps\_utility::is_default_start() )
return;
var_1 = maps\_utility_code::get_leveltime();
var_2 = var_1;
if ( isdefined( level.recon_checkpoint_lasttime ) )
var_2 = var_1 - level.recon_checkpoint_lasttime;
level.recon_checkpoint_lasttime = var_1;
reconevent( "script_checkpoint: id %d, leveltime %d, deltatime %d", var_0, var_1, var_2 );
}