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

1987 lines
42 KiB
Plaintext

// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("generic_human");
initanimtree( var_0 )
{
self clearanim( %body, 0.3 );
self setanim( %body, 1, 0 );
if ( var_0 != "pain" && var_0 != "death" )
self.a.special = "none";
self.a.aimweight = 1.0;
self.a.aimweight_start = 1.0;
self.a.aimweight_end = 1.0;
self.a.aimweight_transframes = 0;
self.a.aimweight_t = 0;
updateisincombattimer();
}
updateanimpose()
{
if ( isdefined( self.desired_anim_pose ) && self.desired_anim_pose != self.a.pose )
{
if ( self.a.pose == "prone" )
exitpronewrapper( 0.5 );
if ( self.desired_anim_pose == "prone" )
{
self setproneanimnodes( -45, 45, %prone_legs_down, %exposed_aiming, %prone_legs_up );
enterpronewrapper( 0.5 );
self setanimknoball( lookupanim( "default_prone", "straight_level" ), %body, 1, 0.1, 1 );
}
}
self.desired_anim_pose = undefined;
}
initialize( var_0 )
{
if ( isdefined( self.longdeathstarting ) )
{
if ( var_0 != "pain" && var_0 != "death" )
self kill( self.origin );
if ( var_0 != "pain" )
{
self.longdeathstarting = undefined;
self notify( "kill_long_death" );
}
}
if ( isdefined( self.a.mayonlydie ) && var_0 != "death" )
self kill( self.origin );
if ( isdefined( self.a.postscriptfunc ) )
{
var_1 = self.a.postscriptfunc;
self.a.postscriptfunc = undefined;
[[ var_1 ]]( var_0 );
}
if ( var_0 != "combat" && var_0 != "pain" && var_0 != "death" && usingsidearm() )
animscripts\combat::switchtolastweapon( lookupanim( "combat", "pistol_to_primary" ), 1 );
if ( var_0 != "combat" && var_0 != "move" && var_0 != "pain" )
self.a.magicreloadwhenreachenemy = undefined;
if ( var_0 != "death" )
self.a.nodeath = 0;
if ( isdefined( self.isholdinggrenade ) && ( var_0 == "pain" || var_0 == "death" || var_0 == "flashed" ) )
animscripts\combat_utility::dropgrenade();
self.isholdinggrenade = undefined;
animscripts\squadmanager::aiupdateanimstate( var_0 );
self.covernode = undefined;
self.suppressed = 0;
self.isreloading = 0;
self.changingcoverpos = 0;
self.a.aimidlethread = undefined;
self.a.scriptstarttime = gettime();
self.a.atconcealmentnode = 0;
if ( isdefined( self.node ) && ( self.node.type == "Conceal Prone" || self.node.type == "Conceal Crouch" || self.node.type == "Conceal Stand" ) )
self.a.atconcealmentnode = 1;
initanimtree( var_0 );
updateanimpose();
}
getpreferredweapon()
{
if ( isdefined( self.wantshotgun ) && self.wantshotgun )
{
if ( isshotgun( self.primaryweapon ) )
return self.primaryweapon;
else if ( isshotgun( self.secondaryweapon ) )
return self.secondaryweapon;
}
return self.primaryweapon;
}
badplacer( var_0, var_1, var_2 )
{
for ( var_3 = 0; var_3 < var_0 * 20; var_3++ )
{
for ( var_4 = 0; var_4 < 10; var_4++ )
{
var_5 = ( 0, randomint( 360 ), 0 );
var_6 = anglestoforward( var_5 );
var_7 = var_6 * var_2;
}
wait 0.05;
}
}
printdisplaceinfo()
{
self endon( "death" );
self notify( "displaceprint" );
self endon( "displaceprint" );
for (;;)
wait 0.05;
}
isincombat( var_0 )
{
if ( ( !isdefined( var_0 ) || var_0 ) && self.alertlevelint > 1 )
return 1;
if ( isdefined( self.enemy ) )
return 1;
return self.a.combatendtime > gettime();
}
updateisincombattimer()
{
if ( isdefined( self.enemy ) )
self.a.combatendtime = gettime() + anim.combatmemorytimeconst + randomint( anim.combatmemorytimerand );
}
getenemyeyepos()
{
if ( isdefined( self.enemy ) )
{
self.a.lastenemypos = self.enemy getshootatpos();
self.a.lastenemytime = gettime();
return self.a.lastenemypos;
}
else if ( isdefined( self.a.lastenemytime ) && isdefined( self.a.lastenemypos ) && self.a.lastenemytime + 3000 < gettime() )
return self.a.lastenemypos;
else
{
var_0 = self getshootatpos();
var_0 = var_0 + ( 196 * self.lookforward[0], 196 * self.lookforward[1], 196 * self.lookforward[2] );
return var_0;
}
}
getnodeforwardyaw( var_0 )
{
if ( !isdefined( self.heat ) )
{
if ( isnodecoverleft( var_0 ) )
return var_0.angles[1] + 90;
else if ( isnodecoverright( var_0 ) )
return var_0.angles[1] - 90;
else if ( var_0.type == "Cover Multi" )
{
if ( isdefined( self.cover ) && isdefined( self.cover.state ) )
{
if ( self.cover.state == "right" )
return var_0.angles[1] - 90;
else if ( self.cover.state == "left" )
return var_0.angles[1] + 90;
}
}
}
return var_0.angles[1];
}
getnodeyawtoorigin( var_0 )
{
if ( isdefined( self.node ) )
var_1 = self.node.angles[1] - getyaw( var_0 );
else
var_1 = self.angles[1] - getyaw( var_0 );
var_1 = angleclamp180( var_1 );
return var_1;
}
getnodeyawtoenemy()
{
var_0 = undefined;
if ( isdefined( self.enemy ) )
var_0 = self.enemy.origin;
else
{
if ( isdefined( self.node ) )
var_1 = anglestoforward( self.node.angles );
else
var_1 = anglestoforward( self.angles );
var_1 = var_1 * 150;
var_0 = self.origin + var_1;
}
if ( isdefined( self.node ) )
var_2 = self.node.angles[1] - getyaw( var_0 );
else
var_2 = self.angles[1] - getyaw( var_0 );
var_2 = angleclamp180( var_2 );
return var_2;
}
getyawtospot( var_0 )
{
if ( isspaceai() )
{
var_1 = anglestoforward( self.angles );
var_2 = rotatepointaroundvector( var_1, var_0 - self.origin, self.angles[2] * -1 );
var_0 = var_2 + self.origin;
}
var_3 = self.angles[1] - getyaw( var_0 );
var_3 = angleclamp180( var_3 );
return var_3;
}
getyawtoenemy()
{
var_0 = undefined;
if ( isdefined( self.enemy ) )
var_0 = self.enemy.origin;
else
{
var_1 = anglestoforward( self.angles );
var_1 = var_1 * 150;
var_0 = self.origin + var_1;
}
var_2 = self.angles[1] - getyaw( var_0 );
var_2 = angleclamp180( var_2 );
return var_2;
}
getyaw( var_0 )
{
return vectortoyaw( var_0 - self.origin );
}
getyaw2d( var_0 )
{
var_1 = vectortoangles( ( var_0[0], var_0[1], 0 ) - ( self.origin[0], self.origin[1], 0 ) );
return var_1[1];
}
absyawtoenemy()
{
var_0 = self.angles[1] - getyaw( self.enemy.origin );
var_0 = angleclamp180( var_0 );
if ( var_0 < 0 )
var_0 = -1 * var_0;
return var_0;
}
absyawtoenemy2d()
{
var_0 = self.angles[1] - getyaw2d( self.enemy.origin );
var_0 = angleclamp180( var_0 );
if ( var_0 < 0 )
var_0 = -1 * var_0;
return var_0;
}
absyawtoorigin( var_0 )
{
var_1 = self.angles[1] - getyaw( var_0 );
var_1 = angleclamp180( var_1 );
if ( var_1 < 0 )
var_1 = -1 * var_1;
return var_1;
}
absyawtoangles( var_0 )
{
var_1 = self.angles[1] - var_0;
var_1 = angleclamp180( var_1 );
if ( var_1 < 0 )
var_1 = -1 * var_1;
return var_1;
}
getyawfromorigin( var_0, var_1 )
{
var_2 = vectortoangles( var_0 - var_1 );
return var_2[1];
}
getyawtotag( var_0, var_1 )
{
var_2 = self gettagangles( var_0 )[1] - getyawfromorigin( var_1, self gettagorigin( var_0 ) );
var_2 = angleclamp180( var_2 );
return var_2;
}
getyawtoorigin( var_0 )
{
if ( isdefined( self.type ) && ( self.type == "Cover Up 3D" || self.type == "Cover Left 3D" || self.type == "Cover Right 3D" || self.type == "Exposed 3D" ) )
{
var_1 = gettruenodeangles( self );
var_2 = anglestoforward( var_1 );
var_3 = rotatepointaroundvector( var_2, var_0 - self.origin, var_1[2] * -1 );
var_3 = var_3 + self.origin;
var_4 = var_1[1] - getyaw( var_3 );
var_4 = angleclamp180( var_4 );
return var_4;
}
var_4 = self.angles[1] - getyaw( var_0 );
var_4 = angleclamp180( var_4 );
return var_4;
}
geteyeyawtoorigin( var_0 )
{
var_1 = self gettagangles( "TAG_EYE" )[1] - getyaw( var_0 );
var_1 = angleclamp180( var_1 );
return var_1;
}
isstanceallowedwrapper( var_0 )
{
if ( isdefined( self.covernode ) )
return self.covernode doesnodeallowstance( var_0 );
return self isstanceallowed( var_0 );
}
choosepose( var_0 )
{
if ( !isdefined( var_0 ) )
var_0 = self.a.pose;
switch ( var_0 )
{
case "stand":
if ( isstanceallowedwrapper( "stand" ) )
var_1 = "stand";
else if ( isstanceallowedwrapper( "crouch" ) )
var_1 = "crouch";
else if ( isstanceallowedwrapper( "prone" ) )
var_1 = "prone";
else
var_1 = "stand";
break;
case "crouch":
if ( isstanceallowedwrapper( "crouch" ) )
var_1 = "crouch";
else if ( isstanceallowedwrapper( "stand" ) )
var_1 = "stand";
else if ( isstanceallowedwrapper( "prone" ) )
var_1 = "prone";
else
var_1 = "crouch";
break;
case "prone":
if ( isstanceallowedwrapper( "prone" ) )
var_1 = "prone";
else if ( isstanceallowedwrapper( "crouch" ) )
var_1 = "crouch";
else if ( isstanceallowedwrapper( "stand" ) )
var_1 = "stand";
else
var_1 = "prone";
break;
default:
var_1 = "stand";
break;
}
return var_1;
}
getclaimednode()
{
var_0 = self.node;
if ( isdefined( var_0 ) && ( self nearnode( var_0 ) || isdefined( self.covernode ) && var_0 == self.covernode ) )
return var_0;
return undefined;
}
getnodetype()
{
var_0 = getclaimednode();
if ( isdefined( var_0 ) )
return var_0.type;
return "none";
}
getnodedirection()
{
var_0 = getclaimednode();
if ( isdefined( var_0 ) )
return var_0.angles[1];
return self.desiredangle;
}
getnodeforward()
{
var_0 = getclaimednode();
if ( isdefined( var_0 ) )
return anglestoforward( var_0.angles );
return anglestoforward( self.angles );
}
getnodeorigin()
{
var_0 = getclaimednode();
if ( isdefined( var_0 ) )
return var_0.origin;
return self.origin;
}
safemod( var_0, var_1 )
{
var_2 = int( var_0 ) % var_1;
var_2 = var_2 + var_1;
return var_2 % var_1;
}
absangleclamp180( var_0 )
{
return abs( angleclamp180( var_0 ) );
}
quadrantanimweights( var_0 )
{
var_1 = cos( var_0 );
var_2 = sin( var_0 );
var_3["front"] = 0;
var_3["right"] = 0;
var_3["back"] = 0;
var_3["left"] = 0;
if ( isdefined( self.alwaysrunforward ) )
{
var_3["front"] = 1;
return var_3;
}
if ( var_1 > 0 )
{
if ( var_2 > var_1 )
var_3["left"] = 1;
else if ( var_2 < -1 * var_1 )
var_3["right"] = 1;
else
var_3["front"] = 1;
}
else
{
var_4 = -1 * var_1;
if ( var_2 > var_4 )
var_3["left"] = 1;
else if ( var_2 < var_1 )
var_3["right"] = 1;
else
var_3["back"] = 1;
}
return var_3;
}
getquadrant( var_0 )
{
var_0 = angleclamp( var_0 );
if ( var_0 < 45 || var_0 > 315 )
var_1 = "front";
else if ( var_0 < 135 )
var_1 = "left";
else if ( var_0 < 225 )
var_1 = "back";
else
var_1 = "right";
return var_1;
}
isinset( var_0, var_1 )
{
for ( var_2 = var_1.size - 1; var_2 >= 0; var_2-- )
{
if ( var_0 == var_1[var_2] )
return 1;
}
return 0;
}
playanim( var_0 )
{
if ( isdefined( var_0 ) )
{
self setflaggedanimknoballrestart( "playAnim", var_0, %root, 1, 0.1, 1 );
var_1 = getanimlength( var_0 );
var_1 = 3 * var_1 + 1;
thread notifyaftertime( "time is up", "time is up", var_1 );
self waittill( "time is up" );
self notify( "enddrawstring" );
}
}
notifyaftertime( var_0, var_1, var_2 )
{
self endon( "death" );
self endon( var_1 );
wait( var_2 );
self notify( var_0 );
}
drawstring( var_0 )
{
self endon( "killanimscript" );
self endon( "enddrawstring" );
for (;;)
wait 0.05;
}
drawstringtime( var_0, var_1, var_2, var_3 )
{
var_4 = var_3 * 20;
for ( var_5 = 0; var_5 < var_4; var_5++ )
wait 0.05;
}
showlastenemysightpos( var_0 )
{
self notify( "got known enemy2" );
self endon( "got known enemy2" );
self endon( "death" );
if ( !isdefined( self.enemy ) )
return;
if ( self.enemy.team == "allies" )
var_1 = ( 0.4, 0.7, 1 );
else
var_1 = ( 1, 0.7, 0.4 );
for (;;)
{
wait 0.05;
if ( !isdefined( self.lastenemysightpos ) )
continue;
}
}
hasenemysightpos()
{
if ( isdefined( self.node ) )
return canseeenemyfromexposed() || cansuppressenemyfromexposed();
else
return canseeenemy() || cansuppressenemy();
}
getenemysightpos()
{
return self.goodshootpos;
}
util_ignorecurrentsightpos()
{
if ( !hasenemysightpos() )
return;
self.ignoresightpos = getenemysightpos();
self.ignoreorigin = self.origin;
}
util_evaluateknownenemylocation()
{
if ( !hasenemysightpos() )
return 0;
var_0 = self getmuzzlepos();
var_1 = self getshootatpos() - var_0;
if ( isdefined( self.ignoresightpos ) && isdefined( self.ignoreorigin ) )
{
if ( distance( self.origin, self.ignoreorigin ) < 25 )
return 0;
}
self.ignoresightpos = undefined;
var_2 = self canshoot( getenemysightpos(), var_1 );
if ( !var_2 )
{
self.ignoresightpos = getenemysightpos();
return 0;
}
return 1;
}
debugtimeout()
{
wait 5;
self notify( "timeout" );
}
debugposinternal( var_0, var_1, var_2 )
{
self endon( "death" );
self notify( "stop debug " + var_0 );
self endon( "stop debug " + var_0 );
var_3 = spawnstruct();
var_3 thread debugtimeout();
var_3 endon( "timeout" );
if ( self.enemy.team == "allies" )
var_4 = ( 0.4, 0.7, 1 );
else
var_4 = ( 1, 0.7, 0.4 );
for (;;)
wait 0.05;
}
debugpos( var_0, var_1 )
{
thread debugposinternal( var_0, var_1, 2.15 );
}
debugpossize( var_0, var_1, var_2 )
{
thread debugposinternal( var_0, var_1, var_2 );
}
debugburstprint( var_0, var_1 )
{
var_2 = var_0 / var_1;
var_3 = undefined;
if ( var_0 == self.bulletsinclip )
var_3 = "all rounds";
else if ( var_2 < 0.25 )
var_3 = "small burst";
else if ( var_2 < 0.5 )
var_3 = "med burst";
else
var_3 = "long burst";
thread debugpossize( self.origin + ( 0, 0, 42 ), var_3, 1.5 );
thread debugpos( self.origin + ( 0, 0, 60 ), "Suppressing" );
}
printshootproc()
{
self endon( "death" );
self notify( "stop shoot " + self.export );
self endon( "stop shoot " + self.export );
var_0 = 0.25;
var_1 = var_0 * 20;
for ( var_2 = 0; var_2 < var_1; var_2 = var_2 + 1 )
wait 0.05;
}
printshoot()
{
}
showdebugproc( var_0, var_1, var_2, var_3 )
{
self endon( "death" );
var_4 = var_3 * 20;
for ( var_5 = 0; var_5 < var_4; var_5 = var_5 + 1 )
wait 0.05;
}
showdebugline( var_0, var_1, var_2, var_3 )
{
thread showdebugproc( var_0, var_1 + ( 0, 0, -5 ), var_2, var_3 );
}
shootenemywrapper( var_0 )
{
if ( !isdefined( var_0 ) )
var_0 = 1;
[[ anim.shootenemywrapper_func ]]( var_0 );
}
shootenemywrapper_normal( var_0 )
{
self.a.lastshoottime = gettime();
maps\_gameskill::set_accuracy_based_on_situation();
self notify( "shooting" );
self shoot( 1, undefined, var_0 );
}
shootenemywrapper_shootnotify( var_0 )
{
level notify( "an_enemy_shot", self );
shootenemywrapper_normal( var_0 );
}
shootposwrapper( var_0, var_1 )
{
var_2 = bulletspread( self getmuzzlepos(), var_0, 4 );
self.a.lastshoottime = gettime();
if ( !isdefined( var_1 ) )
var_1 = 1;
self notify( "shooting" );
self shoot( 1, var_2, var_1 );
}
throwgun()
{
var_0 = spawn( "script_model", ( 0, 0, 0 ) );
var_0 setmodel( "temp" );
var_0.origin = self gettagorigin( "tag_weapon_right" ) + ( 50, 50, 0 );
var_0.angles = self gettagangles( "tag_weapon_right" );
var_1 = anglestoright( var_0.angles );
var_1 = var_1 * 15;
var_2 = anglestoforward( var_0.angles );
var_2 = var_2 * 15;
var_0 movegravity( ( 0, 50, 150 ), 100 );
var_3 = "weapon_" + self.weapon;
var_4 = spawn( var_3, var_0.origin );
var_4.angles = self gettagangles( "tag_weapon_right" );
var_4 linkto( var_0 );
var_5 = var_0.origin;
while ( isdefined( var_4 ) && isdefined( var_4.origin ) )
{
var_6 = var_5;
var_7 = var_0.origin;
var_8 = vectortoangles( var_7 - var_6 );
var_2 = anglestoforward( var_8 );
var_2 = var_2 * 4;
var_9 = bullettrace( var_7, var_7 + var_2, 1, var_4 );
if ( isalive( var_9["entity"] ) && var_9["entity"] == self )
{
wait 0.05;
continue;
}
if ( var_9["fraction"] < 1.0 )
break;
var_5 = var_0.origin;
wait 0.05;
}
if ( isdefined( var_4 ) && isdefined( var_4.origin ) )
var_4 unlink();
var_0 delete();
}
personalcoldbreath()
{
var_0 = "TAG_EYE";
self endon( "death" );
self notify( "stop personal effect" );
self endon( "stop personal effect" );
while ( isdefined( self ) )
{
wait 0.05;
if ( !isdefined( self ) )
break;
if ( isdefined( self.a.movement ) && self.a.movement == "stop" )
{
if ( isdefined( self.isindoor ) && self.isindoor == 1 )
continue;
playfxontag( level._effect["cold_breath"], self, var_0 );
wait( 2.5 + randomfloat( 3 ) );
continue;
}
wait 0.5;
}
}
personalcoldbreathstop()
{
self notify( "stop personal effect" );
}
personalcoldbreathspawner()
{
self endon( "death" );
self notify( "stop personal effect" );
self endon( "stop personal effect" );
for (;;)
{
self waittill( "spawned", var_0 );
if ( maps\_utility::spawn_failed( var_0 ) )
continue;
var_0 thread personalcoldbreath();
}
}
issuppressedwrapper()
{
if ( isdefined( self.forcesuppression ) )
return self.forcesuppression;
if ( self.suppressionmeter <= self.suppressionthreshold )
return 0;
return self issuppressed();
}
isspaceai()
{
return isdefined( self.swimmer ) && self.swimmer == 1 && ( isdefined( self.space ) && self.space == 1 );
}
gettruenodeangles( var_0 )
{
if ( !isdefined( var_0 ) )
return ( 0, 0, 0 );
if ( !isdefined( var_0.script_angles ) )
return var_0.angles;
var_1 = var_0.angles;
var_2 = angleclamp180( var_1[0] + var_0.script_angles[0] );
var_3 = var_1[1];
var_4 = angleclamp180( var_1[2] + var_0.script_angles[2] );
return ( var_2, var_3, var_4 );
}
ispartiallysuppressedwrapper()
{
if ( self.suppressionmeter <= self.suppressionthreshold * 0.25 )
return 0;
return self issuppressed();
}
getnodeoffset( var_0 )
{
if ( isdefined( var_0.offset ) )
return var_0.offset;
var_1 = ( -26, 0.4, 36 );
var_2 = ( -32, 7, 63 );
var_3 = ( 43.5, 11, 36 );
var_4 = ( 36, 8.3, 63 );
var_5 = ( 3.5, -12.5, 45 );
var_6 = ( -3.7, -22, 63 );
var_7 = 0;
var_8 = ( 0, 0, 0 );
var_9 = anglestoright( var_0.angles );
var_10 = anglestoforward( var_0.angles );
var_11 = var_0.type;
if ( var_11 == "Cover Multi" )
var_11 = getcovermultipretendtype( var_0 );
switch ( var_11 )
{
case "Cover Left":
case "Cover Left 3D":
if ( var_0 gethighestnodestance() == "crouch" )
var_8 = calculatenodeoffset( var_9, var_10, var_1 );
else
var_8 = calculatenodeoffset( var_9, var_10, var_2 );
break;
case "Cover Right":
case "Cover Right 3D":
if ( var_0 gethighestnodestance() == "crouch" )
var_8 = calculatenodeoffset( var_9, var_10, var_3 );
else
var_8 = calculatenodeoffset( var_9, var_10, var_4 );
break;
case "Turret":
case "Cover Stand":
case "Conceal Stand":
var_8 = calculatenodeoffset( var_9, var_10, var_6 );
break;
case "Cover Crouch Window":
case "Cover Crouch":
case "Conceal Crouch":
var_8 = calculatenodeoffset( var_9, var_10, var_5 );
break;
}
var_0.offset = var_8;
return var_0.offset;
}
calculatenodeoffset( var_0, var_1, var_2 )
{
return var_0 * var_2[0] + var_1 * var_2[1] + ( 0, 0, var_2[2] );
}
recentlysawenemy()
{
return isdefined( self.enemy ) && self seerecently( self.enemy, 5 );
}
canseeenemy( var_0 )
{
if ( !isdefined( self.enemy ) )
return 0;
if ( isdefined( var_0 ) && self cansee( self.enemy, var_0 ) || self cansee( self.enemy ) )
{
if ( !checkpitchvisibility( self geteye(), self.enemy getshootatpos() ) )
return 0;
self.goodshootpos = getenemyeyepos();
dontgiveuponsuppressionyet();
return 1;
}
return 0;
}
canseeenemyfromexposed()
{
if ( !isdefined( self.enemy ) )
{
self.goodshootpos = undefined;
return 0;
}
var_0 = getenemyeyepos();
if ( !isdefined( self.node ) )
var_1 = self cansee( self.enemy );
else
var_1 = canseepointfromexposedatnode( var_0, self.node );
if ( var_1 )
{
self.goodshootpos = var_0;
dontgiveuponsuppressionyet();
}
else
{
}
return var_1;
}
canseepointfromexposedatnode( var_0, var_1 )
{
if ( isnodecoverleft( var_1 ) || isnodecoverright( var_1 ) || isnodecovermulticorner( var_1 ) )
{
if ( !animscripts\corner::canseepointfromexposedatcorner( var_0, var_1 ) )
return 0;
}
var_2 = getnodeoffset( var_1 );
var_3 = var_1.origin + var_2;
if ( !checkpitchvisibility( var_3, var_0, var_1 ) )
return 0;
if ( !sighttracepassed( var_3, var_0, 0, undefined ) )
{
if ( var_1.type == "Cover Crouch" || var_1.type == "Conceal Crouch" )
{
var_3 = ( 0, 0, 64 ) + var_1.origin;
return sighttracepassed( var_3, var_0, 0, undefined );
}
if ( isspaceai() && var_1.type == "Cover Up 3D" )
{
var_4 = anglestoup( self.angles );
var_3 = var_1.origin + ( var_4[0] * 32, var_4[1] * 32, var_4[2] * 32 );
return sighttracepassed( var_3, var_0, 0, undefined );
}
return 0;
}
return 1;
}
isnodecovermulticorner( var_0 )
{
if ( var_0.type != "Cover Multi" )
return 0;
if ( !isdefined( self.cover ) )
return 0;
if ( isdefined( self.cover.state ) )
return self.cover.state == "right" || self.cover.state == "left";
if ( isdefined( self.cover.arrivalnodetype ) )
return self.cover.arrivalnodetype == "right" || self.cover.arrivalnodetype == "left";
return 0;
}
getcovermultipretendtype( var_0, var_1 )
{
if ( !isdefined( var_1 ) )
var_1 = var_0 animscripts\cover_multi::covermulti_getnonrandomvaliddir();
switch ( var_1 )
{
case "right":
return "Cover Right";
case "left":
return "Cover Left";
case "stand":
return "Cover Stand";
case "crouch":
return "Cover Crouch";
default:
}
}
checkpitchvisibility( var_0, var_1, var_2 )
{
var_3 = self.downaimlimit - anim.aimpitchdifftolerance;
var_4 = self.upaimlimit + anim.aimpitchdifftolerance;
var_5 = angleclamp180( vectortoangles( var_1 - var_0 )[0] );
if ( var_5 > var_4 )
return 0;
if ( var_5 < var_3 )
{
if ( isdefined( var_2 ) && var_2.type != "Cover Crouch" && var_2.type != "Conceal Crouch" )
return 0;
if ( var_5 < anim.covercrouchleanpitch + var_3 )
return 0;
}
return 1;
}
dontgiveuponsuppressionyet()
{
self.a.shouldresetgiveuponsuppressiontimer = 1;
}
updategiveuponsuppressiontimer()
{
if ( !isdefined( self.a.shouldresetgiveuponsuppressiontimer ) )
self.a.shouldresetgiveuponsuppressiontimer = 1;
if ( self.a.shouldresetgiveuponsuppressiontimer )
{
self.a.giveuponsuppressiontime = gettime() + randomintrange( 15000, 30000 );
self.a.shouldresetgiveuponsuppressiontimer = 0;
}
}
showlines( var_0, var_1, var_2 )
{
for (;;)
{
wait 0.05;
wait 0.05;
}
}
aisuppressai()
{
if ( !self canattackenemynode() )
return 0;
var_0 = undefined;
if ( isdefined( self.enemy.node ) )
{
var_1 = getnodeoffset( self.enemy.node );
var_0 = self.enemy.node.origin + var_1;
}
else
var_0 = self.enemy getshootatpos();
if ( !self canshoot( var_0 ) )
return 0;
if ( self.script == "combat" )
{
if ( !sighttracepassed( self geteye(), self getmuzzlepos(), 0, undefined ) )
return 0;
}
self.goodshootpos = var_0;
return 1;
}
cansuppressenemyfromexposed()
{
if ( !hassuppressableenemy() )
{
self.goodshootpos = undefined;
return 0;
}
if ( !isplayer( self.enemy ) )
return aisuppressai();
if ( isdefined( self.node ) )
{
if ( isnodecoverleft( self.node ) || isnodecoverright( self.node ) )
{
if ( !animscripts\corner::canseepointfromexposedatcorner( getenemyeyepos(), self.node ) )
return 0;
}
var_0 = getnodeoffset( self.node );
var_1 = self.node.origin + var_0;
}
else
var_1 = self getmuzzlepos();
if ( !checkpitchvisibility( var_1, self.lastenemysightpos ) )
return 0;
return findgoodsuppressspot( var_1 );
}
cansuppressenemy()
{
if ( !hassuppressableenemy() )
{
self.goodshootpos = undefined;
return 0;
}
if ( !isplayer( self.enemy ) )
return aisuppressai();
var_0 = self getmuzzlepos();
if ( !checkpitchvisibility( var_0, self.lastenemysightpos ) )
return 0;
return findgoodsuppressspot( var_0 );
}
hassuppressableenemy()
{
if ( !isdefined( self.enemy ) )
return 0;
if ( !isdefined( self.lastenemysightpos ) )
return 0;
updategiveuponsuppressiontimer();
if ( gettime() > self.a.giveuponsuppressiontime )
return 0;
if ( !needrecalculatesuppressspot() )
return isdefined( self.goodshootpos );
return 1;
}
canseeandshootpoint( var_0 )
{
if ( !sighttracepassed( self getshootatpos(), var_0, 0, undefined ) )
return 0;
if ( self.a.weaponpos["right"] == "none" )
return 0;
var_1 = self getmuzzlepos();
return sighttracepassed( var_1, var_0, 0, undefined );
}
needrecalculatesuppressspot()
{
if ( isdefined( self.goodshootpos ) && !canseeandshootpoint( self.goodshootpos ) )
return 1;
return !isdefined( self.lastenemysightposold ) || self.lastenemysightposold != self.lastenemysightpos || distancesquared( self.lastenemysightposselforigin, self.origin ) > 1024;
}
findgoodsuppressspot( var_0 )
{
if ( !needrecalculatesuppressspot() )
return isdefined( self.goodshootpos );
if ( isdefined( self.enemy ) && distancesquared( self.origin, self.enemy.origin ) > squared( self.enemy.maxvisibledist ) )
{
self.goodshootpos = undefined;
return 0;
}
if ( !sighttracepassed( self getshootatpos(), var_0, 0, undefined ) )
{
self.goodshootpos = undefined;
return 0;
}
self.lastenemysightposselforigin = self.origin;
self.lastenemysightposold = self.lastenemysightpos;
var_1 = getenemyeyepos();
var_2 = bullettrace( self.lastenemysightpos, var_1, 0, undefined );
var_3 = var_2["position"];
var_4 = self.lastenemysightpos - var_3;
var_5 = vectornormalize( self.lastenemysightpos - var_0 );
var_4 = var_4 - var_5 * vectordot( var_4, var_5 );
var_6 = 20.0;
var_7 = int( length( var_4 ) / var_6 + 0.5 );
if ( var_7 < 1 )
var_7 = 1;
if ( var_7 > 20 )
var_7 = 20;
var_8 = self.lastenemysightpos - var_3;
var_8 = ( var_8[0] / var_7, var_8[1] / var_7, var_8[2] / var_7 );
var_7++;
var_9 = var_3;
self.goodshootpos = undefined;
var_10 = 0;
var_11 = 2;
for ( var_12 = 0; var_12 < var_7 + var_11; var_12++ )
{
var_13 = sighttracepassed( var_0, var_9, 0, undefined );
var_14 = var_9;
if ( var_12 == var_7 - 1 )
var_8 = var_8 - var_5 * vectordot( var_8, var_5 );
var_9 = var_9 + var_8;
if ( var_13 )
{
var_10++;
self.goodshootpos = var_14;
if ( var_12 > 0 && var_10 < var_11 && var_12 < var_7 + var_11 - 1 )
continue;
return 1;
}
else
var_10 = 0;
}
return isdefined( self.goodshootpos );
}
anim_array( var_0, var_1 )
{
var_2 = var_0.size;
var_3 = randomint( var_2 );
if ( var_2 == 1 )
return var_0[0];
var_4 = 0;
var_5 = 0;
for ( var_6 = 0; var_6 < var_2; var_6++ )
var_5 = var_5 + var_1[var_6];
var_7 = randomfloat( var_5 );
var_8 = 0;
for ( var_6 = 0; var_6 < var_2; var_6++ )
{
var_8 = var_8 + var_1[var_6];
if ( var_7 >= var_8 )
continue;
var_3 = var_6;
break;
}
return var_0[var_3];
}
print3dtime( var_0, var_1, var_2, var_3, var_4, var_5 )
{
var_6 = var_0 / 0.05;
for ( var_7 = 0; var_7 < var_6; var_7++ )
wait 0.05;
}
print3drise( var_0, var_1, var_2, var_3, var_4 )
{
var_5 = 100.0;
var_6 = 0;
var_0 = var_0 + common_scripts\utility::randomvector( 30 );
for ( var_7 = 0; var_7 < var_5; var_7++ )
{
var_6 = var_6 + 0.5;
wait 0.05;
}
}
crossproduct( var_0, var_1 )
{
return var_0[0] * var_1[1] - var_0[1] * var_1[0] > 0;
}
getgrenademodel()
{
return getweaponmodel( self.grenadeweapon );
}
sawenemymove( var_0 )
{
if ( !isdefined( var_0 ) )
var_0 = 500;
return gettime() - self.personalsighttime < var_0;
}
canthrowgrenade()
{
if ( !self.grenadeammo )
return 0;
if ( self.script_forcegrenade )
return 1;
return isplayer( self.enemy );
}
usingboltactionweapon()
{
return weaponisboltaction( self.weapon );
}
random_weight( var_0 )
{
var_1 = randomint( var_0.size );
if ( var_0.size > 1 )
{
var_2 = 0;
for ( var_3 = 0; var_3 < var_0.size; var_3++ )
var_2 = var_2 + var_0[var_3];
var_4 = randomfloat( var_2 );
var_2 = 0;
for ( var_3 = 0; var_3 < var_0.size; var_3++ )
{
var_2 = var_2 + var_0[var_3];
if ( var_4 < var_2 )
{
var_1 = var_3;
break;
}
}
}
return var_1;
}
setfootstepeffect( var_0, var_1 )
{
if ( !isdefined( anim.optionalstepeffects ) )
anim.optionalstepeffects = [];
anim.optionalstepeffects[var_0] = 1;
level._effect["step_" + var_0] = var_1;
}
setfootstepeffectsmall( var_0, var_1 )
{
if ( !isdefined( anim.optionalstepeffectssmall ) )
anim.optionalstepeffectssmall = [];
anim.optionalstepeffectssmall[var_0] = 1;
level._effect["step_small_" + var_0] = var_1;
}
unsetfootstepeffect( var_0 )
{
if ( isdefined( anim.optionalstepeffects ) )
anim.optionalstepeffects[var_0] = undefined;
level._effect["step_" + var_0] = undefined;
}
unsetfootstepeffectsmall( var_0 )
{
if ( isdefined( anim.optionalstepeffectssmall ) )
anim.optionalstepeffectssmall[var_0] = undefined;
level._effect["step_small_" + var_0] = undefined;
}
setnotetrackeffect( var_0, var_1, var_2, var_3, var_4, var_5 )
{
if ( !isdefined( var_2 ) )
var_2 = "all";
if ( !isdefined( level._notetrackfx ) )
level._notetrackfx = [];
level._notetrackfx[var_0][var_2] = spawnstruct();
level._notetrackfx[var_0][var_2].tag = var_1;
level._notetrackfx[var_0][var_2].fx = var_3;
setnotetracksound( var_0, var_2, var_4, var_5 );
}
setnotetracksound( var_0, var_1, var_2, var_3 )
{
if ( !isdefined( var_1 ) )
var_1 = "all";
if ( !isdefined( level._notetrackfx ) )
level._notetrackfx = [];
if ( isdefined( level._notetrackfx[var_0][var_1] ) )
var_4 = level._notetrackfx[var_0][var_1];
else
{
var_4 = spawnstruct();
level._notetrackfx[var_0][var_1] = var_4;
}
if ( isdefined( var_2 ) )
var_4.sound_prefix = var_2;
if ( isdefined( var_3 ) )
var_4.sound_suffix = var_3;
}
persistentdebugline( var_0, var_1 )
{
self endon( "death" );
level notify( "newdebugline" );
level endon( "newdebugline" );
for (;;)
wait 0.05;
}
enterpronewrapper( var_0 )
{
thread enterpronewrapperproc( var_0 );
}
enterpronewrapperproc( var_0 )
{
self endon( "death" );
self notify( "anim_prone_change" );
self endon( "anim_prone_change" );
self enterprone( var_0, isdefined( self.a.onback ) );
self waittill( "killanimscript" );
if ( self.a.pose != "prone" && !isdefined( self.a.onback ) )
self.a.pose = "prone";
}
exitpronewrapper( var_0 )
{
thread exitpronewrapperproc( var_0 );
}
exitpronewrapperproc( var_0 )
{
self endon( "death" );
self notify( "anim_prone_change" );
self endon( "anim_prone_change" );
self exitprone( var_0 );
self waittill( "killanimscript" );
if ( self.a.pose == "prone" )
self.a.pose = "crouch";
}
canblindfire()
{
if ( self.a.atconcealmentnode )
return 0;
if ( !animscripts\weaponlist::usingautomaticweapon() )
return 0;
if ( weaponclass( self.weapon ) == "mg" )
return 0;
if ( isdefined( self.disable_blindfire ) && self.disable_blindfire == 1 )
return 0;
return 1;
}
canhitsuppressspot()
{
if ( !hasenemysightpos() )
return 0;
var_0 = self getmuzzlepos();
return sighttracepassed( var_0, getenemysightpos(), 0, undefined );
}
getmoveanim( var_0 )
{
return self.a.moveanimset[var_0];
}
randomanimoftwo( var_0, var_1 )
{
if ( randomint( 2 ) )
return var_0;
else
return var_1;
}
animarray( var_0 )
{
return self.a.array[var_0];
}
animarrayanyexist( var_0 )
{
return isdefined( self.a.array[var_0] ) && self.a.array[var_0].size > 0;
}
animarraypickrandom( var_0 )
{
var_1 = randomint( self.a.array[var_0].size );
return self.a.array[var_0][var_1];
}
array( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10, var_11, var_12, var_13 )
{
var_14 = [];
if ( isdefined( var_0 ) )
var_14[0] = var_0;
else
return var_14;
if ( isdefined( var_1 ) )
var_14[1] = var_1;
else
return var_14;
if ( isdefined( var_2 ) )
var_14[2] = var_2;
else
return var_14;
if ( isdefined( var_3 ) )
var_14[3] = var_3;
else
return var_14;
if ( isdefined( var_4 ) )
var_14[4] = var_4;
else
return var_14;
if ( isdefined( var_5 ) )
var_14[5] = var_5;
else
return var_14;
if ( isdefined( var_6 ) )
var_14[6] = var_6;
else
return var_14;
if ( isdefined( var_7 ) )
var_14[7] = var_7;
else
return var_14;
if ( isdefined( var_8 ) )
var_14[8] = var_8;
else
return var_14;
if ( isdefined( var_9 ) )
var_14[9] = var_9;
else
return var_14;
if ( isdefined( var_10 ) )
var_14[10] = var_10;
else
return var_14;
if ( isdefined( var_11 ) )
var_14[11] = var_11;
else
return var_14;
if ( isdefined( var_12 ) )
var_14[12] = var_12;
else
return var_14;
if ( isdefined( var_13 ) )
var_14[13] = var_13;
return var_14;
}
getaiprimaryweapon()
{
return self.primaryweapon;
}
getaisecondaryweapon()
{
return self.secondaryweapon;
}
getaisidearmweapon()
{
return self.sidearm;
}
getaicurrentweapon()
{
return self.weapon;
}
usingprimary()
{
return self.weapon == self.primaryweapon && self.weapon != "none";
}
usingsecondary()
{
return self.weapon == self.secondaryweapon && self.weapon != "none";
}
usingsidearm()
{
return self.weapon == self.sidearm && self.weapon != "none";
}
getaicurrentweaponslot()
{
if ( self.weapon == self.primaryweapon )
return "primary";
else if ( self.weapon == self.secondaryweapon )
return "secondary";
else if ( self.weapon == self.sidearm )
return "sidearm";
else
{
}
}
aihasweapon( var_0 )
{
if ( isdefined( self.weaponinfo[var_0] ) )
return 1;
return 0;
}
getanimendpos( var_0 )
{
var_1 = getmovedelta( var_0, 0, 1 );
return self localtoworldcoords( var_1 );
}
damagelocationisany( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10, var_11 )
{
if ( !isdefined( var_0 ) )
return 0;
if ( self.damagelocation == var_0 )
return 1;
if ( !isdefined( var_1 ) )
return 0;
if ( self.damagelocation == var_1 )
return 1;
if ( !isdefined( var_2 ) )
return 0;
if ( self.damagelocation == var_2 )
return 1;
if ( !isdefined( var_3 ) )
return 0;
if ( self.damagelocation == var_3 )
return 1;
if ( !isdefined( var_4 ) )
return 0;
if ( self.damagelocation == var_4 )
return 1;
if ( !isdefined( var_5 ) )
return 0;
if ( self.damagelocation == var_5 )
return 1;
if ( !isdefined( var_6 ) )
return 0;
if ( self.damagelocation == var_6 )
return 1;
if ( !isdefined( var_7 ) )
return 0;
if ( self.damagelocation == var_7 )
return 1;
if ( !isdefined( var_8 ) )
return 0;
if ( self.damagelocation == var_8 )
return 1;
if ( !isdefined( var_9 ) )
return 0;
if ( self.damagelocation == var_9 )
return 1;
if ( !isdefined( var_10 ) )
return 0;
if ( self.damagelocation == var_10 )
return 1;
return 0;
}
usingpistol()
{
return weaponclass( self.weapon ) == "pistol";
}
usingrocketlauncher()
{
return weaponclass( self.weapon ) == "rocketlauncher";
}
usingmg()
{
return weaponclass( self.weapon ) == "mg";
}
usingshotgun()
{
return weaponclass( self.weapon ) == "spread";
}
usingriflelikeweapon()
{
var_0 = weaponclass( self.weapon );
switch ( var_0 )
{
case "rifle":
case "sniper":
case "smg":
case "spread":
case "mg":
return 1;
}
return 0;
}
shoulddroprocketlauncher( var_0 )
{
return isdefined( self.secondaryweapon ) && self.secondaryweapon != "none" && ( var_0 < squared( 512 ) || self.a.rockets < 1 );
}
ragdolldeath( var_0 )
{
self endon( "killanimscript" );
var_1 = self.origin;
var_2 = ( 0, 0, 0 );
for (;;)
{
wait 0.05;
var_3 = distance( self.origin, var_1 );
var_1 = self.origin;
if ( self.health == 1 )
{
self.a.nodeath = 1;
self startragdoll();
self clearanim( var_0, 0.1 );
wait 0.05;
physicsexplosionsphere( var_1, 600, 0, var_3 * 0.1 );
self notify( "killanimscript" );
return;
}
}
}
shouldcqb()
{
return isdefined( self.cqbwalking ) && !isdefined( self.grenade );
}
iscqbwalking()
{
return isdefined( self.cqbwalking );
}
iscqbwalkingorfacingenemy()
{
return !self.facemotion || isdefined( self.cqbwalking );
}
randomizeidleset()
{
self.a.idleset = randomint( 2 );
}
isshotgun( var_0 )
{
return weaponclass( var_0 ) == "spread";
}
issniperrifle( var_0 )
{
return weaponclass( var_0 ) == "sniper";
}
weapon_pump_action_shotgun()
{
return self.weapon != "none" && weaponisboltaction( self.weapon ) && weaponclass( self.weapon ) == "spread";
}
getrandomintfromseed( var_0, var_1 )
{
var_2 = var_0 % anim.randominttablesize;
return anim.randominttable[var_2] % var_1;
}
getcurrentweaponslotname()
{
if ( usingsecondary() )
return "secondary";
if ( usingsidearm() )
return "sidearm";
return "primary";
}
isnodecoverleft( var_0 )
{
return var_0.type == "Cover Left" || var_0.type == "Cover Left 3D";
}
isnodecoverright( var_0 )
{
return var_0.type == "Cover Right" || var_0.type == "Cover Right 3D";
}
isnodecover3d( var_0 )
{
return var_0.type == "Cover Left 3D" || var_0.type == "Cover Right 3D" || var_0.type == "Cover Up 3D";
}
lookupanim( var_0, var_1 )
{
if ( isdefined( self.animarchetype ) )
{
if ( isdefined( anim.archetypes[self.animarchetype][var_0] ) && isdefined( anim.archetypes[self.animarchetype][var_0][var_1] ) )
return anim.archetypes[self.animarchetype][var_0][var_1];
}
return anim.archetypes["soldier"][var_0][var_1];
}
lookupanimarray( var_0 )
{
if ( isdefined( self.animarchetype ) )
{
if ( isdefined( anim.archetypes[self.animarchetype][var_0] ) )
{
var_1 = anim.archetypes["soldier"][var_0];
foreach ( var_4, var_3 in anim.archetypes[self.animarchetype][var_0] )
var_1[var_4] = var_3;
return var_1;
}
}
return anim.archetypes["soldier"][var_0];
}
lookuptransitionanim( var_0, var_1, var_2 )
{
if ( isdefined( self.animarchetype ) )
{
if ( isdefined( anim.archetypes[self.animarchetype][var_0] ) && isdefined( anim.archetypes[self.animarchetype][var_0][var_1] ) && isdefined( anim.archetypes[self.animarchetype][var_0][var_1][var_2] ) )
return anim.archetypes[self.animarchetype][var_0][var_1][var_2];
}
return anim.archetypes["soldier"][var_0][var_1][var_2];
}
lookupdoganim( var_0, var_1 )
{
if ( isdefined( self.animarchetype ) )
{
if ( isdefined( anim.archetypes[self.animarchetype][var_0] ) && isdefined( anim.archetypes[self.animarchetype][var_0][var_1] ) )
return anim.archetypes[self.animarchetype][var_0][var_1];
}
return anim.archetypes["dog"][var_0][var_1];
}