IL-GSC/BO1/PC/ZM/maps/_autosave.gsc
2024-02-18 17:32:07 -05:00

462 lines
9.3 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include maps\_utility;
#include common_scripts\utility;
main()
{
level.lastAutoSaveTime = 0;
flag_init( "game_saving" );
flag_init( "can_save" );
flag_set( "can_save" );
}
autosave_description()
{
return( &"AUTOSAVE_AUTOSAVE" );
}
autosave_names( num )
{
if( num == 0 )
{
savedescription = &"AUTOSAVE_GAME";
}
else
{
savedescription = &"AUTOSAVE_NOGAME";
}
return savedescription;
}
start_level_save()
{
flag_wait( "all_players_connected" );
flag_wait( "starting final intro screen fadeout" );
wait( 0.5 );
players = get_players();
players[0] player_flag_wait( "loadout_given" );
if( level.createFX_enabled )
{
return;
}
if( level.missionfailed )
{
return;
}
if( flag( "game_saving" ) )
{
return;
}
flag_set( "game_saving" );
imagename = "levelshots/autosave/autosave_" + level.script + "start";
for( i = 0; i < players.size; i++ )
{
players[i].savedVisionSet = players[i] GetVisionSetNaked();
}
SaveGame( "levelstart", &"AUTOSAVE_LEVELSTART", imagename, true );
setDvar( "ui_grenade_death", "0" );
println( "Saving level start saved game" );
flag_clear( "game_saving" );
}
trigger_autosave( trigger )
{
if( !IsDefined( trigger.script_autosave ) )
{
trigger.script_autosave = 0;
}
autosave_think( trigger );
}
autosave_think( trigger )
{
savedescription = autosave_names( trigger.script_autosave );
if( !( IsDefined( savedescription ) ) )
{
println( "autosave", self.script_autosave, " with no save description in _autosave.gsc!" );
return;
}
trigger waittill( "trigger", ent );
num = trigger.script_autosave;
imagename = "levelshots/autosave/autosave_" + level.script + num;
try_auto_save( num, savedescription, imagename, undefined, ent );
if( IsDefined( trigger ) )
{
wait 2;
trigger delete();
}
}
autosave_name_think( trigger )
{
trigger waittill( "trigger", ent );
if( IsDefined( level.customautosavecheck ) )
{
if( ![[level.customautosavecheck]]() )
{
return;
}
}
name = trigger.script_autosavename;
level._save_pos = trigger.origin;
level._save_trig_ent = ent getentitynumber();
maps\_utility::set_breadcrumbs_player_positions();
maps\_utility::autosave_by_name( name );
wait 2;
if( IsDefined( trigger ) )
{
trigger delete();
}
}
trigger_autosave_immediate( trigger )
{
trigger waittill( "trigger" );
}
auto_save_print( msg, msg2 )
{
msg = " AUTOSAVE: " + msg;
if( IsDefined( msg2 ) )
{
println( msg, msg2 );
}
else
{
println( msg );
}
}
autosave_game_now( suppress_print )
{
if( flag( "game_saving" ) )
{
return false;
}
if( !IsAlive( get_host() ) )
{
return false;
}
filename = "save_now";
descriptionString = autosave_description();
players = get_players();
for( i = 0; i < players.size; i++ )
{
players[i].savedVisionSet = players[i] GetVisionSetNaked();
}
if( IsDefined( suppress_print ) )
{
saveId = saveGameNoCommit( filename, descriptionString, "$default", true );
}
else
{
saveId = saveGameNoCommit( filename, descriptionString );
}
wait( 0.05 );
if( isSaveRecentlyLoaded() )
{
level.lastAutoSaveTime = GetTime();
return false;
}
if( saveId < 0 )
{
return false;
}
if( !try_to_autosave_now() )
{
return false;
}
flag_set( "game_saving" );
wait 2;
if( try_to_autosave_now() )
{
level notify( "save_success" );
commitSave( saveId );
setDvar( "ui_grenade_death", "0" );
}
flag_clear( "game_saving" );
return true;
}
autosave_now_trigger( trigger )
{
trigger waittill( "trigger" );
autosave_now();
}
try_to_autosave_now()
{
if( !issavesuccessful() )
{
return false;
}
if( !autosave_health_check() )
{
return false;
}
if( !flag( "can_save" ) )
{
return false;
}
return true;
}
autosave_check_simple()
{
if( IsDefined( level.special_autosavecondition ) && ![[level.special_autosavecondition]]() )
{
return false;
}
if( level.missionfailed )
{
return false;
}
if( maps\_laststand::player_any_player_in_laststand() )
{
return false;
}
if( IsDefined( level.savehere ) && !level.savehere )
{
return false;
}
if( IsDefined( level.canSave ) && !level.canSave )
{
return false;
}
if( !flag( "can_save" ) )
{
return false;
}
players = get_players();
for( i = 0; i < players.size; i++ )
{
if( players[i] call_overloaded_func( "animscripts\banzai", "in_banzai_attack" ) )
{
return false;
}
axis = GetAiArray( "axis" );
for ( j = 0; j < axis.size; j++ )
{
if ( isdefined(axis[j].banzai) && axis[j].banzai )
{
if ( isdefined(axis[j].enemy) && axis[j].enemy == players[i] )
{
return false;
}
if ( isdefined(axis[j].favoriteEnemy) && axis[j].favoriteEnemy == players[i] )
{
return false;
}
}
}
}
return true;
}
try_auto_save( filename, description, image, timeout, ent )
{
if( !flag( "all_players_connected" ) )
{
flag_wait( "all_players_connected" );
wait( 3 );
}
level endon( "save_success" );
flag_waitopen( "game_saving" );
flag_set( "game_saving" );
descriptionString = autosave_description();
start_save_time = GetTime();
if(!isdefined(ent))
{
ent = get_players()[0];
}
level._save_pos = ent.origin;
level._save_trig_ent = ent getentitynumber();
maps\_utility::set_breadcrumbs_player_positions();
wait (0.05);
while(1)
{
if( isSaveRecentlyLoaded() )
{
level.lastAutoSaveTime = GetTime();
break;
}
if( autosave_check() && !isSaveRecentlyLoaded() )
{
players = get_players();
for( i = 0; i < players.size; i++ )
{
players[i].savedVisionSet = players[i] GetVisionSetNaked();
}
saveId = saveGameNoCommit( filename, descriptionString, image, coopGame() );
if( !IsDefined( saveId ) || saveId < 0 )
{
flag_clear( "game_saving" );
return false;
}
wait(6);
retries = 0;
while (retries < 8)
{
if ( autosave_check_simple() )
{
commitSave( saveId );
level.lastSaveTime = GetTime();
setDvar( "ui_grenade_death", "0" );
flag_clear( "game_saving" );
return true;
}
retries++;
wait(2);
}
flag_clear( "game_saving" );
return false;
}
wait(1);
}
flag_clear( "game_saving" );
return false;
}
autosave_check( doPickyChecks )
{
if( IsDefined( level.special_autosavecondition ) && ![[level.special_autosavecondition]]() )
{
return false;
}
if( level.missionfailed )
{
return false;
}
if( maps\_laststand::player_any_player_in_laststand() )
{
return false;
}
if( !IsDefined( doPickyChecks ) )
{
doPickyChecks = true;
}
if( !autosave_health_check() )
{
return false;
}
if( !autosave_threat_check( doPickyChecks ) )
{
return false;
}
if( !autosave_player_check() )
{
return false;
}
if( IsDefined( level.dont_save_now ) && level.dont_save_now )
{
return false;
}
if( !IsSaveSuccessful() )
{
return false;
}
return true;
}
autosave_player_check()
{
host = get_host();
if( host IsMeleeing() )
{
return false;
}
if( host IsThrowingGrenade() && host GetCurrentOffHand() != "molotov" )
{
return false;
}
if( host IsFiring() )
{
return false;
}
if( IsDefined( host.shellshocked ) && host.shellshocked )
{
return false;
}
players = get_players();
for( i = 0; i < players.size; i++ )
{
if( players[i] call_overloaded_func( "animscripts\banzai", "in_banzai_attack" ) )
{
return false;
}
axis = GetAiArray( "axis" );
for ( j = 0; j < axis.size; j++ )
{
if ( isdefined(axis[j].banzai) && axis[j].banzai )
{
if ( isdefined(axis[j].enemy) && axis[j].enemy == players[i] )
{
return false;
}
if ( isdefined(axis[j].favoriteEnemy) && axis[j].favoriteEnemy == players[i] )
{
return false;
}
}
}
}
return true;
}
autosave_health_check()
{
players = get_players();
if( players.size > 1 )
{
for( i = 1; i < players.size; i ++ )
{
if( players[i] player_flag( "player_has_red_flashing_overlay" ) )
{
return false;
}
}
}
host = get_host();
healthFraction = host.health / host.maxhealth;
if( healthFraction < 0.5 )
{
return false;
}
if( host player_flag( "player_has_red_flashing_overlay" ) )
{
return false;
}
return true;
}
autosave_threat_check( doPickyChecks )
{
if( level.script == "see2" )
{
return true;
}
host = get_host();
enemies = GetAISpeciesArray( "axis", "all" );
for( i = 0; i < enemies.size; i++ )
{
if( !IsDefined( enemies[i].enemy ) )
{
continue;
}
if( enemies[i].enemy != host )
{
continue;
}
if( enemies[i].isdog )
{
if( DistanceSquared( enemies[i].origin, host.origin ) < ( 384 * 384 ) )
{
return( false );
}
continue;
}
if( enemies[i].a.lastShootTime > GetTime() - 500 )
{
if( doPickyChecks || enemies[i] animscripts\utility::canShootEnemy() )
{
return( false );
}
}
if( enemies[i].a.alertness == "aiming" && enemies[i] animscripts\utility::canShootEnemy() )
{
return( false );
}
if( IsDefined( enemies[i].a.personImMeleeing ) && enemies[i].a.personImMeleeing == host )
{
return( false );
}
}
if( player_is_near_live_grenade() )
{
return false;
}
return( true );
}