842 lines
20 KiB
Plaintext
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;
|
|
}
|