iw6-scripts/animscripts/cover_behavior.gsc
2024-02-13 13:20:49 +01:00

842 lines
20 KiB
Plaintext

// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main( var_0 )
{
self.couldntseeenemypos = self.origin;
var_1 = gettime();
var_2 = spawnstruct();
var_2.nextallowedlooktime = var_1 - 1;
var_2.nextallowedsuppresstime = var_1 - 1;
resetlookforbettercovertime();
resetrespondtodeathtime();
self.seekoutenemytime = gettime();
self.a.lastencountertime = var_1;
self.a.idlingatcover = 0;
self.a.movement = "stop";
self.meleecoverchargemintime = var_1 + 3000;
thread watchsuppression();
var_3 = gettime() > 2500;
for (;;)
{
if ( isdefined( self.cover ) && isdefined( self.cover.fnoverlord ) )
{
var_4 = gettime();
thread endidleatframeend();
[[ self.cover.fnoverlord ]]();
if ( gettime() == var_4 )
self notify( "dont_end_idle" );
}
if ( animscripts\combat_utility::shouldhelpadvancingteammate() )
{
if ( animscripts\combat_utility::tryrunningtoenemy( 1 ) )
{
wait 0.05;
continue;
}
}
if ( isdefined( var_0.mainloopstart ) )
{
var_4 = gettime();
thread endidleatframeend();
[[ var_0.mainloopstart ]]();
if ( gettime() == var_4 )
self notify( "dont_end_idle" );
}
if ( isdefined( var_0.movetonearbycover ) )
{
if ( [[ var_0.movetonearbycover ]]() )
continue;
}
if ( animscripts\utility::isspaceai() )
self safeteleport( self.covernode.origin );
else
self safeteleport( self.covernode.origin, getcorrectcoverangles() );
if ( !var_3 )
{
idle( var_0, 0.05 + randomfloat( 1.5 ) );
var_3 = 1;
continue;
}
if ( dononattackcoverbehavior( var_0 ) )
continue;
if ( isdefined( anim.throwgrenadeatplayerasap ) && isalive( level.player ) )
{
if ( trythrowinggrenade( var_0, level.player ) )
continue;
}
if ( respondtodeadteammate() )
return;
var_5 = 0;
var_6 = 0;
if ( isalive( self.enemy ) )
{
var_5 = isenemyvisiblefromexposed();
var_6 = animscripts\utility::cansuppressenemyfromexposed();
}
if ( var_5 )
{
if ( self.a.getboredofthisnodetime < gettime() )
{
if ( animscripts\combat_utility::lookforbettercover() )
return;
}
attackvisibleenemy( var_0 );
continue;
}
if ( isdefined( self.aggressivemode ) || enemyishiding() )
{
if ( advanceonhidingenemy() )
return;
}
if ( var_6 )
{
attacksuppressableenemy( var_0, var_2 );
continue;
}
if ( attacknothingtodo( var_0, var_2 ) )
return;
}
}
#using_animtree("generic_human");
end_script( var_0 )
{
self.turntomatchnode = undefined;
self.a.prevattack = undefined;
if ( isdefined( self.meleecoverchargemintime ) && self.meleecoverchargemintime <= gettime() )
{
self.meleecoverchargegraceendtime = gettime() + 5000;
self.meleecoverchargemintime = undefined;
}
self clearanim( %head, 0.2 );
self.facialidx = undefined;
}
getcorrectcoverangles()
{
if ( self.swimmer )
return animscripts\swim::getnodeforwardangles( self.covernode );
var_0 = ( self.covernode.angles[0], animscripts\utility::getnodeforwardyaw( self.covernode ), self.covernode.angles[2] );
return var_0;
}
respondtodeadteammate()
{
if ( self atdangerousnode() && self.a.respondtodeathtime < gettime() )
{
if ( animscripts\combat_utility::lookforbettercover() )
return 1;
self.a.respondtodeathtime = gettime() + 30000;
}
return 0;
}
dononattackcoverbehavior( var_0 )
{
if ( suppressedbehavior( var_0 ) )
{
if ( isenemyvisiblefromexposed() )
resetseekoutenemytime();
self.a.lastencountertime = gettime();
return 1;
}
if ( coverreload( var_0, 0 ) )
return 1;
return 0;
}
attackvisibleenemy( var_0 )
{
if ( distancesquared( self.origin, self.enemy.origin ) > 562500 )
{
if ( trythrowinggrenade( var_0, self.enemy ) )
return;
}
if ( leavecoverandshoot( var_0, "normal" ) )
{
resetseekoutenemytime();
self.a.lastencountertime = gettime();
}
else
idle( var_0 );
}
attacksuppressableenemy( var_0, var_1 )
{
if ( self.doingambush )
{
if ( leavecoverandshoot( var_0, "ambush" ) )
return;
}
else if ( self.providecoveringfire || gettime() >= var_1.nextallowedsuppresstime )
{
var_2 = "suppress";
if ( !self.providecoveringfire && gettime() - self.lastsuppressiontime > 5000 && randomint( 3 ) < 2 )
var_2 = "ambush";
else if ( !animscripts\shoot_behavior::shouldsuppress() )
var_2 = "ambush";
if ( leavecoverandshoot( var_0, var_2 ) )
{
var_1.nextallowedsuppresstime = gettime() + randomintrange( 3000, 20000 );
if ( isenemyvisiblefromexposed() )
self.a.lastencountertime = gettime();
return;
}
}
if ( trythrowinggrenade( var_0, self.enemy ) )
return;
idle( var_0 );
}
attacknothingtodo( var_0, var_1 )
{
if ( coverreload( var_0, 0.1 ) )
return 0;
if ( isdefined( self.enemy ) )
{
if ( trythrowinggrenade( var_0, self.enemy ) )
return 0;
}
if ( !self.doingambush && gettime() >= var_1.nextallowedlooktime )
{
if ( lookforenemy( var_0 ) )
{
var_1.nextallowedlooktime = gettime() + randomintrange( 4000, 15000 );
return 0;
}
}
if ( gettime() > self.a.getboredofthisnodetime )
{
if ( cantfindanythingtodo() )
return 1;
}
if ( self.doingambush || gettime() >= var_1.nextallowedsuppresstime && isdefined( self.enemy ) )
{
if ( leavecoverandshoot( var_0, "ambush" ) )
{
if ( isenemyvisiblefromexposed() )
resetseekoutenemytime();
self.a.lastencountertime = gettime();
var_1.nextallowedsuppresstime = gettime() + randomintrange( 6000, 20000 );
return 0;
}
}
idle( var_0 );
return 0;
}
isenemyvisiblefromexposed()
{
if ( !isdefined( self.enemy ) )
return 0;
if ( distancesquared( self.enemy.origin, self.couldntseeenemypos ) < 256 )
return 0;
else
return animscripts\utility::canseeenemyfromexposed();
}
suppressedbehavior( var_0 )
{
if ( !animscripts\utility::issuppressedwrapper() )
return 0;
var_1 = gettime();
var_2 = 1;
while ( animscripts\utility::issuppressedwrapper() )
{
var_2 = 0;
self safeteleport( self.covernode.origin );
var_3 = 1;
if ( isdefined( self.favor_blindfire ) )
var_3 = common_scripts\utility::cointoss();
if ( var_3 )
{
if ( trytogetoutofdangeroussituation( var_0 ) )
{
self notify( "killanimscript" );
return 1;
}
}
if ( self.a.atconcealmentnode && animscripts\utility::canseeenemy() )
return 0;
if ( isenemyvisiblefromexposed() || animscripts\utility::cansuppressenemyfromexposed() )
{
if ( isdefined( anim.throwgrenadeatplayerasap ) && isalive( level.player ) )
{
if ( trythrowinggrenade( var_0, level.player ) )
continue;
}
if ( coverreload( var_0, 0 ) )
continue;
if ( self.team != "allies" && gettime() >= var_1 )
{
if ( blindfire( var_0 ) )
{
var_1 = gettime();
if ( !isdefined( self.favor_blindfire ) )
var_1 = var_1 + randomintrange( 3000, 12000 );
continue;
}
}
if ( trythrowinggrenade( var_0, self.enemy ) )
{
var_2 = 1;
continue;
}
}
if ( coverreload( var_0, 0.1 ) )
continue;
idle( var_0 );
}
if ( !var_2 && randomint( 2 ) == 0 )
lookfast( var_0 );
return 1;
}
getpermutation( var_0 )
{
var_1 = [];
if ( var_0 == 1 )
var_1[0] = 0;
else if ( var_0 == 2 )
{
var_1[0] = randomint( 2 );
var_1[1] = 1 - var_1[0];
}
else
{
for ( var_2 = 0; var_2 < var_0; var_2++ )
var_1[var_2] = var_2;
for ( var_2 = 0; var_2 < var_0; var_2++ )
{
var_3 = var_2 + randomint( var_0 - var_2 );
var_4 = var_1[var_3];
var_1[var_3] = var_1[var_2];
var_1[var_2] = var_4;
}
}
return var_1;
}
calloptionalbehaviorcallback( var_0, var_1, var_2, var_3 )
{
if ( !isdefined( var_0 ) )
return 0;
thread endidleatframeend();
var_4 = gettime();
var_5 = undefined;
if ( isdefined( var_3 ) )
var_5 = [[ var_0 ]]( var_1, var_2, var_3 );
else if ( isdefined( var_2 ) )
var_5 = [[ var_0 ]]( var_1, var_2 );
else if ( isdefined( var_1 ) )
var_5 = [[ var_0 ]]( var_1 );
else
var_5 = [[ var_0 ]]();
if ( !var_5 )
self notify( "dont_end_idle" );
return var_5;
}
watchsuppression()
{
self endon( "killanimscript" );
self.lastsuppressiontime = gettime() - 100000;
self.suppressionstart = self.lastsuppressiontime;
for (;;)
{
self waittill( "suppression" );
var_0 = gettime();
if ( self.lastsuppressiontime < var_0 - 700 )
self.suppressionstart = var_0;
self.lastsuppressiontime = var_0;
}
}
coverreload( var_0, var_1 )
{
if ( self.bulletsinclip > weaponclipsize( self.weapon ) * var_1 )
return 0;
self.isreloading = 1;
var_2 = calloptionalbehaviorcallback( var_0.reload );
self.isreloading = 0;
return var_2;
}
leavecoverandshoot( var_0, var_1 )
{
thread animscripts\shoot_behavior::decidewhatandhowtoshoot( var_1 );
if ( !self.fixednode && !self.doingambush )
thread breakoutofshootingifwanttomoveup();
var_2 = calloptionalbehaviorcallback( var_0.leavecoverandshoot );
self notify( "stop_deciding_how_to_shoot" );
return var_2;
}
lookforenemy( var_0 )
{
if ( self.a.atconcealmentnode && animscripts\utility::canseeenemy() )
return 0;
if ( self.a.lastencountertime + 6000 > gettime() )
return lookfast( var_0 );
else
{
var_1 = calloptionalbehaviorcallback( var_0.look, 2 + randomfloat( 2 ) );
if ( var_1 )
return 1;
return calloptionalbehaviorcallback( var_0.fastlook );
}
}
lookfast( var_0 )
{
var_1 = calloptionalbehaviorcallback( var_0.fastlook );
if ( var_1 )
return 1;
return calloptionalbehaviorcallback( var_0.look, 0 );
}
idle( var_0, var_1 )
{
self.flinching = 0;
if ( isdefined( var_0.flinch ) )
{
if ( !self.a.idlingatcover && gettime() - self.suppressionstart < 600 )
{
if ( [[ var_0.flinch ]]() )
return 1;
}
else
thread flinchwhensuppressed( var_0 );
}
if ( !self.a.idlingatcover )
{
thread idlethread( var_0.idle );
self.a.idlingatcover = 1;
}
if ( isdefined( var_1 ) )
idlewait( var_1 );
else
idlewaitabit();
if ( self.flinching )
self waittill( "flinch_done" );
self notify( "stop_waiting_to_flinch" );
}
idlewait( var_0 )
{
self endon( "end_idle" );
wait( var_0 );
}
idlewaitabit()
{
self endon( "end_idle" );
wait( 0.3 + randomfloat( 0.1 ) );
self waittill( "do_slow_things" );
}
idlethread( var_0 )
{
self endon( "killanimscript" );
self [[ var_0 ]]();
}
flinchwhensuppressed( var_0 )
{
self endon( "killanimscript" );
self endon( "stop_waiting_to_flinch" );
var_1 = self.lastsuppressiontime;
for (;;)
{
self waittill( "suppression" );
var_2 = gettime();
if ( var_1 < var_2 - 2000 )
break;
var_1 = var_2;
}
self.flinching = 1;
thread endidleatframeend();
var_3 = [[ var_0.flinch ]]();
if ( !var_3 )
self notify( "dont_end_idle" );
self.flinching = 0;
self notify( "flinch_done" );
}
endidleatframeend()
{
self endon( "killanimscript" );
self endon( "dont_end_idle" );
waittillframeend;
if ( !isdefined( self ) )
return;
self notify( "end_idle" );
self.a.idlingatcover = 0;
}
trythrowinggrenade( var_0, var_1 )
{
var_2 = anglestoforward( self.angles );
var_3 = vectornormalize( var_1.origin - self.origin );
if ( vectordot( var_2, var_3 ) < 0 )
return 0;
if ( self.doingambush && !animscripts\utility::recentlysawenemy() )
return 0;
if ( animscripts\utility::ispartiallysuppressedwrapper() )
return calloptionalbehaviorcallback( var_0.grenadehidden, var_1 );
else
return calloptionalbehaviorcallback( var_0.grenade, var_1 );
}
blindfire( var_0 )
{
if ( !animscripts\utility::canblindfire() )
return 0;
return calloptionalbehaviorcallback( var_0.blindfire );
}
breakoutofshootingifwanttomoveup()
{
self endon( "killanimscript" );
self endon( "stop_deciding_how_to_shoot" );
for (;;)
{
if ( self.fixednode || self.doingambush )
return;
wait( 0.5 + randomfloat( 0.75 ) );
if ( !isdefined( self.enemy ) )
continue;
if ( enemyishiding() )
{
if ( advanceonhidingenemy() )
return;
}
if ( !animscripts\utility::recentlysawenemy() && !animscripts\utility::cansuppressenemy() )
{
if ( gettime() > self.a.getboredofthisnodetime )
{
if ( cantfindanythingtodo() )
return;
}
}
}
}
enemyishiding()
{
if ( !isdefined( self.enemy ) )
return 0;
if ( self.enemy common_scripts\utility::isflashed() )
return 1;
if ( isplayer( self.enemy ) )
{
if ( isdefined( self.enemy.health ) && self.enemy.health < self.enemy.maxhealth )
return 1;
}
else if ( isai( self.enemy ) && self.enemy animscripts\utility::issuppressedwrapper() )
return 1;
if ( isdefined( self.enemy.isreloading ) && self.enemy.isreloading )
return 1;
return 0;
}
resetrespondtodeathtime()
{
self.a.respondtodeathtime = 0;
}
resetlookforbettercovertime()
{
var_0 = gettime();
if ( isdefined( self.didshufflemove ) && var_0 > self.a.getboredofthisnodetime )
self.a.getboredofthisnodetime = var_0 + randomintrange( 2000, 5000 );
else if ( isdefined( self.enemy ) )
{
var_1 = distance2d( self.origin, self.enemy.origin );
if ( var_1 < self.engagemindist )
{
self.a.getboredofthisnodetime = var_0 + randomintrange( 5000, 10000 );
return;
}
if ( var_1 > self.engagemaxdist && var_1 < self.goalradius )
{
self.a.getboredofthisnodetime = var_0 + randomintrange( 2000, 5000 );
return;
}
self.a.getboredofthisnodetime = var_0 + randomintrange( 10000, 15000 );
return;
return;
}
else
self.a.getboredofthisnodetime = var_0 + randomintrange( 5000, 15000 );
}
resetseekoutenemytime()
{
if ( isdefined( self.aggressivemode ) )
self.seekoutenemytime = gettime() + randomintrange( 500, 1000 );
else
self.seekoutenemytime = gettime() + randomintrange( 3000, 5000 );
}
cantfindanythingtodo()
{
return advanceonhidingenemy();
}
advanceonhidingenemy()
{
if ( self.fixednode || self.doingambush )
return 0;
if ( isdefined( self.aggressivemode ) && gettime() >= self.seekoutenemytime )
return animscripts\combat_utility::tryrunningtoenemy( 0 );
var_0 = 0;
if ( !isdefined( self.enemy ) || !self.enemy common_scripts\utility::isflashed() )
var_0 = animscripts\combat_utility::lookforbettercover();
if ( !var_0 && isdefined( self.enemy ) && !animscripts\utility::canseeenemyfromexposed() )
{
if ( gettime() >= self.seekoutenemytime )
return animscripts\combat_utility::tryrunningtoenemy( 0 );
}
return var_0;
}
trytogetoutofdangeroussituation( var_0 )
{
if ( isdefined( var_0.movetonearbycover ) )
{
if ( [[ var_0.movetonearbycover ]]() )
return 1;
}
return animscripts\combat_utility::lookforbettercover();
}
set_standing_turns()
{
var_0 = animscripts\utility::lookupanimarray( "exposed_turn" );
foreach ( var_3, var_2 in var_0 )
self.a.array[var_3] = var_2;
}
set_crouching_turns()
{
var_0 = animscripts\utility::lookupanimarray( "exposed_turn_crouch" );
foreach ( var_3, var_2 in var_0 )
self.a.array[var_3] = var_2;
}
set_swimming_turns()
{
self.a.array["turn_left_45"] = animscripts\swim::getswimanim( "turn_left_45" );
self.a.array["turn_left_90"] = animscripts\swim::getswimanim( "turn_left_90" );
self.a.array["turn_left_135"] = animscripts\swim::getswimanim( "turn_left_135" );
self.a.array["turn_left_180"] = animscripts\swim::getswimanim( "turn_left_180" );
self.a.array["turn_right_45"] = animscripts\swim::getswimanim( "turn_right_45" );
self.a.array["turn_right_90"] = animscripts\swim::getswimanim( "turn_right_90" );
self.a.array["turn_right_135"] = animscripts\swim::getswimanim( "turn_right_135" );
self.a.array["turn_right_180"] = animscripts\swim::getswimanim( "turn_right_180" );
}
turntomatchnodedirection( var_0 )
{
if ( isdefined( self.node ) )
{
var_1 = self.node;
var_2 = abs( angleclamp180( self.angles[1] - ( var_1.angles[1] + var_0 ) ) );
if ( self.a.pose == "stand" && var_1 gethighestnodestance() != "stand" )
{
if ( var_2 > 45 && var_2 < 90 )
self orientmode( "face angle", self.angles[1] );
else
self orientmode( "face current" );
var_3 = 1.5;
var_4 = getnotetracktimes( %exposed_stand_2_crouch, "anim_pose = \"crouch\"" )[0];
var_4 = min( 1, var_4 * 1.1 );
var_5 = var_4 * getanimlength( %exposed_stand_2_crouch ) / var_3;
self setflaggedanimknoballrestart( "crouchanim", %exposed_stand_2_crouch, %body, 1, 0.2, var_3 );
animscripts\notetracks::donotetracksfortime( var_5, "crouchanim" );
self clearanim( %body, 0.2 );
}
if ( animscripts\utility::isspaceai() )
{
self notify( "force_space_rotation_update", 0, 0 );
return;
}
else
self orientmode( "face angle", self.angles[1] );
var_6 = angleclamp180( self.angles[1] - ( var_1.angles[1] + var_0 ) );
if ( abs( var_6 ) > 45 )
{
if ( self.swimmer )
set_swimming_turns();
else if ( self.a.pose == "stand" )
set_standing_turns();
else
set_crouching_turns();
self.turnthreshold = 45;
self.turntomatchnode = 1;
animscripts\combat::turntofacerelativeyaw( var_6 );
self.turntomatchnode = undefined;
}
}
}
movetonearbycover()
{
if ( !isdefined( self.enemy ) )
return 0;
if ( isdefined( self.didshufflemove ) )
{
self.didshufflemove = undefined;
return 0;
}
if ( !isdefined( self.node ) )
return 0;
if ( animscripts\utility::isnodecover3d( self.node ) )
return 0;
if ( randomint( 3 ) == 0 )
return 0;
if ( self.fixednode || self.doingambush || self.keepclaimednode || self.keepclaimednodeifvalid )
return 0;
if ( distancesquared( self.origin, self.node.origin ) > 256 )
return 0;
var_0 = self findshufflecovernode();
if ( isdefined( var_0 ) && var_0 != self.node && self usecovernode( var_0 ) )
{
self.shufflemove = 1;
self.shufflenode = var_0;
self.didshufflemove = 1;
wait 0.5;
return 1;
}
return 0;
}