394 lines
9.9 KiB
Plaintext
394 lines
9.9 KiB
Plaintext
// IW6 GSC SOURCE
|
|
// Generated by https://github.com/xensik/gsc-tool
|
|
|
|
startmovetransition()
|
|
{
|
|
if ( isdefined( self.custommovetransition ) )
|
|
{
|
|
custommovetransition();
|
|
return;
|
|
}
|
|
|
|
self endon( "killanimscript" );
|
|
|
|
if ( !checktransitionpreconditions() )
|
|
return;
|
|
|
|
var_0 = self.origin;
|
|
var_1 = self.angles[1];
|
|
var_2 = "exposed";
|
|
var_3 = 0;
|
|
var_4 = getexitnode();
|
|
|
|
if ( isdefined( var_4 ) )
|
|
{
|
|
var_5 = determinenodeexittype( var_4 );
|
|
|
|
if ( isdefined( var_5 ) )
|
|
{
|
|
var_2 = var_5;
|
|
var_3 = 1;
|
|
|
|
if ( isdefined( self.heat ) )
|
|
var_2 = determineheatcoverexittype( var_4, var_2 );
|
|
|
|
if ( !isdefined( anim.exposedtransition[var_2] ) && var_2 != "stand_saw" && var_2 != "crouch_saw" )
|
|
{
|
|
var_6 = animscripts\utility::absangleclamp180( self.angles[1] - animscripts\utility::getnodeforwardyaw( var_4 ) );
|
|
|
|
if ( var_6 < 5 )
|
|
{
|
|
if ( !isdefined( self.heat ) )
|
|
var_0 = var_4.origin;
|
|
|
|
var_1 = animscripts\utility::getnodeforwardyaw( var_4 );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( !checktransitionconditions( var_2, var_4 ) )
|
|
return;
|
|
|
|
var_7 = isdefined( anim.exposedtransition[var_2] );
|
|
|
|
if ( !var_3 )
|
|
var_2 = determinenonnodeexittype();
|
|
|
|
var_8 = ( -1 * self.lookaheaddir[0], -1 * self.lookaheaddir[1], 0 );
|
|
var_9 = getmaxdirectionsandexcludedirfromapproachtype( var_4 );
|
|
var_10 = var_9.maxdirections;
|
|
var_11 = var_9.excludedir;
|
|
var_12 = spawnstruct();
|
|
calculatenodetransitionangles( var_12, var_2, 0, var_1, var_8, var_10, var_11 );
|
|
sortnodetransitionangles( var_12, var_10 );
|
|
var_13 = -1;
|
|
var_14 = 3;
|
|
|
|
if ( var_7 )
|
|
var_14 = 1;
|
|
|
|
for ( var_15 = 1; var_15 <= var_14; var_15++ )
|
|
{
|
|
var_13 = var_12.transindex[var_15];
|
|
|
|
if ( checknodeexitpos( var_0, var_1, var_2, var_7, var_13 ) )
|
|
break;
|
|
}
|
|
|
|
if ( var_15 > var_14 )
|
|
return;
|
|
|
|
var_16 = distancesquared( self.origin, self.coverexitpos ) * 1.25 * 1.25;
|
|
|
|
if ( distancesquared( self.origin, self.pathgoalpos ) < var_16 )
|
|
return;
|
|
|
|
donodeexitanimation( var_2, var_13 );
|
|
}
|
|
|
|
determinenodeexittype( var_0 )
|
|
{
|
|
if ( animscripts\cover_arrival::canusesawapproach( var_0 ) )
|
|
{
|
|
if ( var_0.type == "Cover Stand" )
|
|
return "stand_saw";
|
|
|
|
if ( var_0.type == "Cover Crouch" )
|
|
return "crouch_saw";
|
|
else if ( var_0.type == "Cover Prone" )
|
|
return "prone_saw";
|
|
}
|
|
|
|
if ( !isdefined( anim.approach_types[var_0.type] ) )
|
|
return;
|
|
|
|
if ( isdefined( anim.requiredexitstance[var_0.type] ) && anim.requiredexitstance[var_0.type] != self.a.pose )
|
|
return;
|
|
|
|
var_1 = self.a.pose;
|
|
|
|
if ( var_1 == "prone" )
|
|
var_1 = "crouch";
|
|
|
|
var_2 = anim.approach_types[var_0.type][var_1];
|
|
|
|
if ( animscripts\cover_arrival::usereadystand() && var_2 == "exposed" )
|
|
var_2 = "exposed_ready";
|
|
|
|
if ( animscripts\utility::shouldcqb() )
|
|
{
|
|
var_3 = var_2 + "_cqb";
|
|
|
|
if ( isdefined( anim.archetypes["soldier"]["cover_exit"][var_3] ) )
|
|
var_2 = var_3;
|
|
}
|
|
|
|
return var_2;
|
|
}
|
|
|
|
checktransitionpreconditions()
|
|
{
|
|
if ( !isdefined( self.pathgoalpos ) )
|
|
return 0;
|
|
|
|
if ( !self shouldfacemotion() )
|
|
return 0;
|
|
|
|
if ( self.a.pose == "prone" )
|
|
return 0;
|
|
|
|
if ( isdefined( self.disableexits ) && self.disableexits )
|
|
return 0;
|
|
|
|
if ( self.stairsstate != "none" )
|
|
return 0;
|
|
|
|
if ( !self isstanceallowed( "stand" ) && !isdefined( self.heat ) )
|
|
return 0;
|
|
|
|
if ( distancesquared( self.origin, self.pathgoalpos ) < 10000 )
|
|
return 0;
|
|
|
|
return 1;
|
|
}
|
|
|
|
checktransitionconditions( var_0, var_1 )
|
|
{
|
|
if ( !isdefined( var_0 ) )
|
|
return 0;
|
|
|
|
if ( var_0 == "exposed" || isdefined( self.heat ) )
|
|
{
|
|
if ( self.a.pose != "stand" && self.a.pose != "crouch" )
|
|
return 0;
|
|
|
|
if ( self.a.movement != "stop" )
|
|
return 0;
|
|
}
|
|
|
|
if ( !isdefined( self.heat ) && isdefined( self.enemy ) && vectordot( self.lookaheaddir, self.enemy.origin - self.origin ) < 0 )
|
|
{
|
|
if ( animscripts\utility::canseeenemyfromexposed() && distancesquared( self.origin, self.enemy.origin ) < 90000 )
|
|
return 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
determinenonnodeexittype( var_0 )
|
|
{
|
|
if ( self.a.pose == "stand" )
|
|
var_0 = "exposed";
|
|
else
|
|
var_0 = "exposed_crouch";
|
|
|
|
if ( animscripts\cover_arrival::usereadystand() )
|
|
var_0 = "exposed_ready";
|
|
|
|
if ( animscripts\utility::shouldcqb() )
|
|
var_0 = var_0 + "_cqb";
|
|
else if ( isdefined( self.heat ) )
|
|
var_0 = "heat";
|
|
|
|
return var_0;
|
|
}
|
|
|
|
getmaxdirectionsandexcludedirfromapproachtype( var_0 )
|
|
{
|
|
var_1 = spawnstruct();
|
|
|
|
if ( isdefined( var_0 ) && isdefined( anim.maxdirections[var_0.type] ) )
|
|
{
|
|
var_1.maxdirections = anim.maxdirections[var_0.type];
|
|
var_1.excludedir = anim.excludedir[var_0.type];
|
|
}
|
|
else
|
|
{
|
|
var_1.maxdirections = 9;
|
|
var_1.excludedir = -1;
|
|
}
|
|
|
|
return var_1;
|
|
}
|
|
|
|
calculatenodetransitionangles( var_0, var_1, var_2, var_3, var_4, var_5, var_6 )
|
|
{
|
|
var_0.transitions = [];
|
|
var_0.transindex = [];
|
|
var_7 = undefined;
|
|
var_8 = 1;
|
|
var_9 = 0;
|
|
|
|
if ( var_2 )
|
|
{
|
|
var_7 = animscripts\utility::lookupanim( "cover_trans_angles", var_1 );
|
|
var_8 = -1;
|
|
var_9 = 0;
|
|
}
|
|
else
|
|
{
|
|
var_7 = animscripts\utility::lookupanim( "cover_exit_angles", var_1 );
|
|
var_8 = 1;
|
|
var_9 = 180;
|
|
}
|
|
|
|
for ( var_10 = 1; var_10 <= var_5; var_10++ )
|
|
{
|
|
var_0.transindex[var_10] = var_10;
|
|
|
|
if ( var_10 == 5 || var_10 == var_6 || !isdefined( var_7[var_10] ) )
|
|
{
|
|
var_0.transitions[var_10] = -1.0003;
|
|
continue;
|
|
}
|
|
|
|
var_11 = ( 0, var_3 + var_8 * var_7[var_10] + var_9, 0 );
|
|
var_12 = vectornormalize( anglestoforward( var_11 ) );
|
|
var_0.transitions[var_10] = vectordot( var_4, var_12 );
|
|
}
|
|
}
|
|
|
|
sortnodetransitionangles( var_0, var_1 )
|
|
{
|
|
for ( var_2 = 2; var_2 <= var_1; var_2++ )
|
|
{
|
|
var_3 = var_0.transitions[var_0.transindex[var_2]];
|
|
var_4 = var_0.transindex[var_2];
|
|
|
|
for ( var_5 = var_2 - 1; var_5 >= 1; var_5-- )
|
|
{
|
|
if ( var_3 < var_0.transitions[var_0.transindex[var_5]] )
|
|
break;
|
|
|
|
var_0.transindex[var_5 + 1] = var_0.transindex[var_5];
|
|
}
|
|
|
|
var_0.transindex[var_5 + 1] = var_4;
|
|
}
|
|
}
|
|
|
|
checknodeexitpos( var_0, var_1, var_2, var_3, var_4 )
|
|
{
|
|
var_5 = ( 0, var_1, 0 );
|
|
var_6 = anglestoforward( var_5 );
|
|
var_7 = anglestoright( var_5 );
|
|
var_8 = animscripts\utility::lookuptransitionanim( "cover_exit_dist", var_2, var_4 );
|
|
var_9 = var_6 * var_8[0];
|
|
var_10 = var_7 * var_8[1];
|
|
var_11 = var_0 + var_9 - var_10;
|
|
self.coverexitpos = var_11;
|
|
|
|
if ( !var_3 && !self checkcoverexitposwithpath( var_11 ) )
|
|
return 0;
|
|
|
|
if ( !self maymovefrompointtopoint( self.origin, var_11 ) )
|
|
return 0;
|
|
|
|
if ( var_4 <= 6 || var_3 )
|
|
return 1;
|
|
|
|
var_12 = animscripts\utility::lookuptransitionanim( "cover_exit_postdist", var_2, var_4 );
|
|
var_9 = var_6 * var_12[0];
|
|
var_10 = var_7 * var_12[1];
|
|
var_13 = var_11 + var_9 - var_10;
|
|
self.coverexitpos = var_13;
|
|
return self maymovefrompointtopoint( var_11, var_13 );
|
|
}
|
|
|
|
#using_animtree("generic_human");
|
|
|
|
donodeexitanimation( var_0, var_1 )
|
|
{
|
|
var_2 = animscripts\utility::lookuptransitionanim( "cover_exit", var_0, var_1 );
|
|
var_3 = vectortoangles( self.lookaheaddir );
|
|
|
|
if ( self.a.pose == "prone" )
|
|
return;
|
|
|
|
var_5 = 0.2;
|
|
|
|
if ( self.swimmer )
|
|
self animmode( "nogravity", 0 );
|
|
else
|
|
self animmode( "zonly_physics", 0 );
|
|
|
|
self orientmode( "face angle", self.angles[1] );
|
|
self setflaggedanimknoballrestart( "coverexit", var_2, %body, 1, var_5, self.movetransitionrate );
|
|
animscripts\shared::donotetracks( "coverexit" );
|
|
self.a.pose = "stand";
|
|
self.a.movement = "run";
|
|
self.ignorepathchange = undefined;
|
|
self orientmode( "face motion" );
|
|
self animmode( "none", 0 );
|
|
finishcoverexitnotetracks( "coverexit" );
|
|
self clearanim( %root, 0.2 );
|
|
self orientmode( "face default" );
|
|
self animmode( "normal", 0 );
|
|
}
|
|
|
|
finishcoverexitnotetracks( var_0 )
|
|
{
|
|
self endon( "move_loop_restart" );
|
|
animscripts\shared::donotetracks( var_0 );
|
|
}
|
|
|
|
determineheatcoverexittype( var_0, var_1 )
|
|
{
|
|
if ( var_0.type == "Cover Right" )
|
|
var_1 = "heat_right";
|
|
else if ( var_0.type == "Cover Left" )
|
|
var_1 = "heat_left";
|
|
|
|
return var_1;
|
|
}
|
|
|
|
getexitnode()
|
|
{
|
|
var_0 = undefined;
|
|
|
|
if ( !isdefined( self.heat ) )
|
|
var_1 = 400;
|
|
else
|
|
var_1 = 4096;
|
|
|
|
if ( animscripts\utility::isspaceai() )
|
|
var_1 = 1024;
|
|
|
|
if ( isdefined( self.node ) && distancesquared( self.origin, self.node.origin ) < var_1 )
|
|
var_0 = self.node;
|
|
else if ( isdefined( self.prevnode ) && distancesquared( self.origin, self.prevnode.origin ) < var_1 )
|
|
var_0 = self.prevnode;
|
|
|
|
if ( isdefined( var_0 ) && isdefined( self.heat ) && animscripts\utility::absangleclamp180( self.angles[1] - var_0.angles[1] ) > 30 )
|
|
return undefined;
|
|
|
|
return var_0;
|
|
}
|
|
|
|
custommovetransition()
|
|
{
|
|
var_0 = self.custommovetransition;
|
|
|
|
if ( !isdefined( self.permanentcustommovetransition ) )
|
|
self.custommovetransition = undefined;
|
|
|
|
var_1 = [[ var_0 ]]();
|
|
|
|
if ( !isdefined( self.permanentcustommovetransition ) )
|
|
self.startmovetransitionanim = undefined;
|
|
|
|
if ( !isdefined( var_1 ) )
|
|
var_1 = 0.2;
|
|
|
|
self clearanim( %root, var_1 );
|
|
self orientmode( "face default" );
|
|
self animmode( "none", 0 );
|
|
}
|
|
|
|
debug_arrival( var_0 )
|
|
{
|
|
if ( !animscripts\cover_arrival::debug_arrivals_on_actor() )
|
|
return;
|
|
}
|