2024-02-13 13:20:49 +01:00

1432 lines
38 KiB
Plaintext

// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
moveswim()
{
self endon( "movemode" );
self orientmode( "face enemy or motion" );
if ( animscripts\utility::isspaceai() )
self.turnrate = 0.16;
else
self.turnrate = 0.03;
animscripts\utility::updateisincombattimer();
if ( animscripts\utility::isincombat( 0 ) )
moveswim_combat();
else
moveswim_noncombat();
}
swim_begin()
{
self.swim = spawnstruct();
self.swim.combatstate = "nostate";
self.swim.movestate = "combat_stationary";
self.swim.trackstate = "track_none";
self.swim.statefns = [];
self.swim.statefns["nostate"] = [ ::swim_null, ::swim_null ];
self.swim.statefns["noncombat"] = [ ::moveswim_noncombat_enter, ::moveswim_noncombat_exit ];
self.swim.statefns["combat"] = [ ::moveswim_combat_enter, ::moveswim_combat_exit ];
self.swim.statefns["combat_stationary"] = [ ::swim_null, ::swim_null ];
self.swim.statefns["combat_forward"] = [ ::moveswim_combat_forward_enter, ::moveswim_combat_forward_exit ];
self.swim.statefns["combat_strafe"] = [ ::moveswim_combat_strafe_enter, ::moveswim_combat_strafe_exit ];
self.swim.statefns["track_none"] = [ ::swim_null, ::swim_null ];
self.swim.statefns["track_forward"] = [ ::swim_track_forward_enter, ::swim_track_forward_exit ];
self.swim.statefns["track_strafe"] = [ ::swim_track_strafe_enter, ::swim_track_strafe_exit ];
self setanimlimited( getswimanim( "aim_stand_D" ) );
self setanimlimited( getswimanim( "aim_stand_U" ) );
self setanimlimited( getswimanim( "aim_stand_L" ) );
self setanimlimited( getswimanim( "aim_stand_R" ) );
self.custommovetransition = ::swim_movebegin;
self.permanentcustommovetransition = 1;
self.pathturnanimoverridefunc = ::swim_pathchange_getturnanim;
self.pathturnanimblendtime = 0.2;
}
swim_end()
{
self.swim = undefined;
if ( animscripts\utility::isspaceai() )
self.turnrate = 0.16;
else
self.turnrate = 0.3;
}
swim_null()
{
}
swim_moveend()
{
moveswim_set( "nostate" );
swim_clearleananims();
if ( isdefined( self.prevturnrate ) )
{
self.turnrate = self.prevturnrate;
self.prevturnrate = undefined;
}
}
moveswim_noncombat()
{
if ( self.swim.combatstate != "noncombat" )
moveswim_set( "noncombat" );
var_0 = self.swim.move_noncombat_anim;
var_1 = 0.4;
if ( animscripts\utility::isspaceai() )
var_1 = 0.2;
self setflaggedanimknob( "swimanim", var_0, 1, var_1, self.moveplaybackrate );
swim_updateleananim();
animscripts\notetracks::donotetracksfortime( 0.2, "swimanim" );
}
moveswim_combat()
{
if ( self.swim.combatstate != "combat" )
moveswim_set( "combat" );
if ( isdefined( self.enemy ) )
{
animscripts\run::setshootwhilemoving( 1 );
if ( !self.facemotion )
{
swim_dostrafe();
return;
}
else
{
if ( self.swim.movestate != "combat_forward" )
moveswim_combat_move_set( "combat_forward" );
if ( isdefined( self.bclearstrafeturnrate ) && self.bclearstrafeturnrate && lengthsquared( self.velocity ) )
{
var_0 = vectortoangles( self.velocity );
if ( abs( angleclamp180( var_0[1] - self.angles[1] ) ) > 35 )
{
self.turnrate = 0.18;
if ( animscripts\utility::isspaceai() )
self.turnrate = 0.2;
}
else
{
if ( animscripts\utility::isspaceai() )
self.turnrate = 0.16;
else
self.turnrate = 0.03;
self.bclearstrafeturnrate = undefined;
}
}
else
self.bclearstrafeturnrate = undefined;
var_1 = getswimanim( "forward_aim" );
}
}
else
{
if ( self.swim.movestate != "combat_forward" )
moveswim_combat_move_set( "combat_forward" );
animscripts\run::setshootwhilemoving( 0 );
var_1 = getswimanim( "forward_aim" );
}
var_2 = 0.4;
if ( animscripts\utility::isspaceai() )
var_2 = 0.2;
swim_updateleananim();
self setflaggedanimknob( "swimanim", var_1, 1, var_2, self.moveplaybackrate );
animscripts\notetracks::donotetracksfortime( 0.2, "swimanim" );
}
moveswim_set( var_0 )
{
if ( var_0 == self.swim.combatstate )
return;
[[ self.swim.statefns[self.swim.combatstate][1] ]]();
[[ self.swim.statefns[var_0][0] ]]();
self.swim.combatstate = var_0;
}
moveswim_noncombat_enter()
{
if ( self.swim.trackstate != "track_none" )
swim_track_set( "track_none" );
swim_setleananims();
thread moveswim_noncombat_twitchupdate();
}
moveswim_noncombat_exit()
{
self notify( "end_MoveSwim_NonCombat_TwitchUpdate" );
}
#using_animtree("generic_human");
moveswim_combat_enter()
{
self setanimknob( %combatrun, 1.0, 0.5, self.moveplaybackrate );
if ( self.swim.movestate != "combat_forward" )
moveswim_combat_move_set( "combat_forward" );
}
moveswim_combat_exit()
{
moveswim_combat_move_set( "combat_stationary" );
}
moveswim_combat_move_set( var_0 )
{
if ( var_0 == self.swim.movestate )
return;
[[ self.swim.statefns[self.swim.movestate][1] ]]();
[[ self.swim.statefns[var_0][0] ]]();
self.swim.movestate = var_0;
}
moveswim_combat_forward_enter()
{
if ( self.swim.trackstate != "track_forward" )
swim_track_set( "track_forward" );
swim_setleananims();
}
moveswim_combat_forward_exit()
{
}
moveswim_combat_strafe_enter()
{
self setanimknoblimited( getswimanim( "strafe_B" ), 1, 0.1, self.sidesteprate, 1 );
self setanimknoblimited( getswimanim( "strafe_L" ), 1, 0.1, self.sidesteprate, 1 );
self setanimknoblimited( getswimanim( "strafe_R" ), 1, 0.1, self.sidesteprate, 1 );
if ( self.swim.trackstate != "track_strafe" )
swim_track_set( "track_strafe" );
swim_clearleananims();
if ( animscripts\utility::isspaceai() )
self.turnrate = 0.25;
else
{
self.turnrate = 0.18;
self.jumping = 1;
}
}
moveswim_combat_strafe_exit()
{
self clearanim( %combatrun_forward, 0.2 );
self clearanim( %combatrun_backward, 0.2 );
self clearanim( %combatrun_left, 0.2 );
self clearanim( %combatrun_right, 0.2 );
if ( animscripts\utility::isspaceai() )
self.turnrate = 0.16;
else
{
self.turnrate = 0.03;
self.jumping = 0;
}
self.bclearstrafeturnrate = 1;
}
swim_track_set( var_0 )
{
if ( self.swim.trackstate == var_0 )
return;
[[ self.swim.statefns[self.swim.trackstate][1] ]]();
[[ self.swim.statefns[var_0][0] ]]();
self.swim.trackstate = var_0;
}
swim_track_forward_enter()
{
self setanimlimited( getswimanim( "aim_move_D" ) );
self setanimlimited( getswimanim( "aim_move_L" ) );
self setanimlimited( getswimanim( "aim_move_R" ) );
self setanimlimited( getswimanim( "aim_move_U" ) );
thread moveswim_track_combat();
}
swim_track_forward_exit()
{
self clearanim( %aim_2, 0.2 );
self clearanim( %aim_4, 0.2 );
self clearanim( %aim_6, 0.2 );
self clearanim( %aim_8, 0.2 );
}
swim_track_strafe_enter()
{
}
swim_track_strafe_exit()
{
self clearanim( %w_aim_4, 0.2 );
self clearanim( %w_aim_6, 0.2 );
self clearanim( %w_aim_8, 0.2 );
self clearanim( %w_aim_2, 0.2 );
}
moveswim_track_combat()
{
self endon( "killanimscript" );
self endon( "end_face_enemy_tracking" );
if ( !isdefined( self.aim_while_moving_thread ) )
{
self.aim_while_moving_thread = 1;
animscripts\combat::set_default_aim_limits();
if ( animscripts\utility::isspaceai() )
{
self.rightaimlimit = 90;
self.leftaimlimit = -90;
}
animscripts\track::trackloop( %w_aim_2, %w_aim_4, %w_aim_6, %w_aim_8 );
}
}
getswimanim( var_0, var_1 )
{
var_2 = animscripts\utility::lookupanim( "swim", var_0 );
if ( isdefined( var_1 ) )
return var_2[var_1];
else
return var_2;
}
moveswim_noncombat_twitchupdate()
{
var_0 = getswimanim( "forward" );
self.swim.move_noncombat_anim = var_0;
}
swim_shoulddonodeexit()
{
if ( isdefined( self.disableexits ) )
return 0;
if ( !isdefined( self.pathgoalpos ) )
return 0;
var_0 = self.maxfaceenemydist;
self.maxfaceenemydist = 128;
if ( !self shouldfacemotion() )
{
self.maxfaceenemydist = var_0;
return 0;
}
self.maxfaceenemydist = var_0;
var_1 = 10000;
if ( animscripts\utility::isspaceai() )
var_1 = 32400;
if ( distancesquared( self.origin, self.pathgoalpos ) < var_1 )
return 0;
if ( self.a.movement != "stop" )
return 0;
if ( lengthsquared( self.prevanimdelta ) > 1 )
{
var_2 = vectortoangles( self.prevanimdelta );
if ( abs( angleclamp180( var_2[1] - self.angles[1] ) ) < 90 )
{
var_3 = vectortoangles( self.lookaheaddir );
if ( abs( angleclamp180( var_3[1] - self.angles[1] ) ) < 90 )
return 0;
}
}
return 1;
}
swim_movebegin()
{
self.a.pose = "stand";
if ( !swim_shoulddonodeexit() )
return;
var_0 = swim_choosestart();
if ( !isdefined( var_0 ) )
return;
var_1 = var_0.m_turnanim;
var_2 = var_0.m_anim;
var_3 = var_0.m_angledelta;
var_4 = vectortoangles( self.lookaheaddir );
var_5 = var_4 - var_3;
var_6 = anglestoforward( var_5 );
var_7 = animscripts\exit_node::getexitnode();
if ( animscripts\utility::isspaceai() && isdefined( var_7 ) )
{
var_8 = swim_getapproachtype( var_7 );
if ( var_8 != "exposed" )
{
var_9 = getnodeforwardangles( var_7 );
var_6 = anglestoforward( var_9 );
}
else
var_6 = anglestoforward( self.angles );
}
self animmode( "nogravity", 0 );
var_10 = randomfloatrange( 0.9, 1.1 );
var_11 = 0.3;
self orientmode( "face angle 3d", self.angles );
if ( isdefined( var_1 ) && !animscripts\utility::isspaceai() )
{
self setflaggedanimknoballrestart( "startturn", var_1, %body, 1, 0.3, var_10 * self.moveplaybackrate );
animscripts\shared::donotetracks( "startturn" );
var_11 = 0.5;
}
else if ( isdefined( var_1 ) && animscripts\utility::isspaceai() )
{
if ( isdefined( var_7 ) )
self orientmode( "face direction", var_6 );
self.prevturnrate = 0.16;
self.turnrate = 5.0;
var_11 = 0.1;
self setflaggedanimknoballrestart( "startturn", var_1, %body, 1, var_11, var_10 * self.moveplaybackrate );
animscripts\shared::donotetracks( "startturn" );
var_11 = 0.5;
self.turnrate = 0.16;
self.prevturnrate = undefined;
var_12 = getangledelta( var_1 );
var_7 = animscripts\exit_node::getexitnode();
var_6 = anglestoforward( self.angles );
if ( isdefined( var_7 ) )
{
var_8 = swim_getapproachtype( var_7 );
if ( var_8 != "exposed" )
{
var_9 = getnodeforwardangles( var_7 );
var_9 = ( var_9[0], var_9[1] - var_12, var_9[2] );
var_6 = anglestoforward( var_9 );
}
}
}
var_13 = var_4 - self.angles;
var_14 = getanimlength( var_2 );
var_15 = 0.001 * abs( angleclamp180( var_13[1] - var_3[1] ) ) / var_14;
var_16 = 0.001 * abs( angleclamp180( var_13[0] - var_3[0] ) ) / var_14;
var_17 = max( var_15, var_16 );
if ( var_17 < 0.01 )
var_17 = 0.01;
if ( animscripts\utility::isspaceai() )
{
var_11 = 0.05;
self.turnrate = 0.16;
var_17 = 5.0;
}
self.prevturnrate = self.turnrate;
self.turnrate = var_17;
self orientmode( "face direction", var_6 );
self setflaggedanimknoballrestart( "startmove", var_2, %body, 1, var_11, var_10 * self.moveplaybackrate );
animscripts\shared::donotetracks( "startmove" );
self.turnrate = self.prevturnrate;
self.prevturnrate = undefined;
self orientmode( "face default" );
self animmode( "none", 0 );
if ( animscripts\utility::isspaceai() )
{
if ( animhasnotetrack( var_2, "finish" ) )
animscripts\shared::donotetracks( "startmove" );
var_18 = 65536;
var_19 = self.goalpos;
if ( isdefined( self.node ) )
var_19 = self.node.origin;
if ( distance2dsquared( self.origin, var_19 ) > var_18 )
self notify( "force_space_rotation_update", 0, 0, undefined, 1 );
}
if ( animscripts\utility::isspaceai() )
return 0.2;
else
return 0.4;
}
swim_setleananims()
{
self setanimlimited( getswimanim( "turn_add_l" ) );
self setanimlimited( getswimanim( "turn_add_r" ) );
self setanimlimited( getswimanim( "turn_add_u" ) );
self setanimlimited( getswimanim( "turn_add_d" ) );
self.prevleanfracyaw = 0;
self.prevleanfracpitch = 0;
}
swim_clearleananims()
{
self clearanim( %add_turn_l, 0.2 );
self clearanim( %add_turn_r, 0.2 );
self clearanim( %add_turn_u, 0.2 );
self clearanim( %add_turn_d, 0.2 );
self.prevleanfracyaw = undefined;
self.prevleanfracpitch = undefined;
}
swim_choosestart()
{
var_0 = animscripts\utility::isincombat();
var_1 = animscripts\exit_node::getexitnode();
var_2 = self.angles;
var_3 = 0;
var_4 = 0;
var_5 = 0;
var_6 = vectortoangles( self.lookaheaddir );
var_7 = animscripts\utility::gettruenodeangles( var_1 );
if ( animscripts\utility::isspaceai() && var_7[2] )
{
if ( var_7[2] != 0 )
{
var_8 = anglestoforward( var_7 );
var_9 = self.goalpos;
if ( isdefined( self.node ) )
var_9 = self.node.origin;
var_10 = rotatepointaroundvector( var_8, var_9 - self.origin, var_7[2] * -1 );
var_11 = var_10 + self.origin;
var_12 = var_11 - self.origin;
var_12 = vectornormalize( var_12 );
var_6 = vectortoangles( var_12 );
var_5 = 1;
}
}
var_13 = undefined;
var_14 = undefined;
if ( isdefined( var_1 ) && isdefined( var_1.type ) )
{
var_14 = swim_getapproachtype( var_1 );
if ( var_14 != "exposed" )
{
var_13 = "exit_" + var_14;
var_2 = var_1.angles;
if ( animscripts\utility::isspaceai() )
{
var_2 = animscripts\utility::gettruenodeangles( var_1 );
if ( var_5 == 1 )
var_2 = ( var_2[0], var_2[1], 0 );
}
else
var_2 = var_1.angles;
var_3 = 1;
}
}
if ( !isdefined( var_13 ) )
{
if ( var_0 )
var_13 = "idle_ready_to_forward";
else
{
var_13 = "idle_to_forward";
var_4 = 1;
var_3 = 1;
}
}
var_15 = getswimanim( var_13 );
var_16 = angleclamp180( var_6[1] - var_2[1] );
var_17 = angleclamp180( var_6[0] - var_2[0] );
var_18 = undefined;
if ( animscripts\utility::isspaceai() )
var_18 = 3;
var_19 = swim_getangleindex( var_16, var_18 );
var_20 = swim_getangleindex( var_17, var_18 );
var_21 = var_14;
if ( !isdefined( var_21 ) && isdefined( self.prevnode ) && distance2dsquared( self.prevnode.origin, self.origin ) < 36 )
var_21 = swim_getapproachtype( self.prevnode );
if ( var_19 == 4 && isdefined( var_21 ) )
{
var_22 = isdefined( var_14 );
if ( var_21 == "cover_corner_l" && var_16 < -10 && ( !var_22 || isdefined( var_15[2] ) ) )
var_19 = 2;
else if ( var_21 == "cover_corner_r" && var_16 > 10 && ( !var_22 || isdefined( var_15[6] ) ) )
var_19 = 6;
}
if ( !isdefined( var_15[var_19] ) )
{
var_13 = "idle_to_forward";
var_15 = getswimanim( var_13 );
var_4 = 1;
}
var_23 = spawnstruct();
if ( var_4 )
{
var_24 = getswimanim( "idle_turn" );
if ( !isdefined( var_24[var_19] ) )
{
var_25 = 0;
for ( var_26 = 8; !isdefined( var_15[var_25] ) && var_25 < 8; var_25++ )
{
}
while ( !isdefined( var_15[var_26] ) && var_26 > 0 )
var_26--;
if ( var_19 < var_25 )
var_19 = var_25;
else if ( var_19 > var_26 )
var_19 = var_26;
}
var_23.m_turnanim = var_24[var_19];
var_19 = 4;
}
if ( isdefined( var_15[var_19] ) && isdefined( var_15[var_19][var_20] ) )
{
var_23.m_anim = var_15[var_19][var_20];
if ( var_3 )
{
var_15 = getswimanim( var_13 + "_angleDelta" );
var_23.m_angledelta = var_15[var_19][var_20];
}
else
var_23.m_angledelta = ( 0, 0, 0 );
return var_23;
}
var_23 = undefined;
return undefined;
}
swim_setupapproach()
{
self endon( "killanimscript" );
self endon( "swim_cancelapproach" );
thread swim_restartapproachlistener();
if ( isdefined( self.disablearrivals ) && self.disablearrivals )
return;
self.swim.arrivalpathgoalpos = self.pathgoalpos;
if ( isdefined( self getnegotiationstartnode() ) )
return;
var_0 = animscripts\cover_arrival::getapproachent();
if ( isdefined( var_0 ) && swim_isapproachablenode( var_0 ) )
thread swim_approachnode();
else
thread swim_approachpos();
}
swim_restartapproachlistener()
{
self endon( "killanimscript" );
self endon( "swim_killrestartlistener" );
self waittill( "path_set" );
var_0 = isdefined( self.pathgoalpos ) && isdefined( self.swim.arrivalpathgoalpos ) && distancesquared( self.pathgoalpos, self.swim.arrivalpathgoalpos ) < 4;
if ( var_0 )
{
thread swim_restartapproachlistener();
return;
}
swim_cancelcurrentapproach();
swim_setupapproach();
}
swim_cancelcurrentapproach()
{
self notify( "swim_cancelapproach" );
self.stopanimdistsq = 0;
}
swim_waitforapproachpos( var_0, var_1 )
{
self endon( "swim_cancelwaitforapproachpos" );
var_2 = ( var_1 + 60 ) * ( var_1 + 60 );
var_3 = distancesquared( var_0, self.origin );
if ( var_3 <= var_2 )
return;
self.stopanimdistsq = var_2;
self waittill( "stop_soon" );
self.stopanimdistsq = 0;
}
swim_approachpos()
{
self endon( "killanimscript" );
self endon( "swim_cancelapproach" );
self endon( "move_interrupt" );
self endon( "swim_killrestartlistener" );
if ( !isdefined( self.pathgoalpos ) )
return;
var_0 = swim_getmaxanimdist( "arrival_exposed" );
swim_waitforapproachpos( self.pathgoalpos, var_0 );
swim_doposarrival();
}
swim_approachnode()
{
self endon( "killanimscript" );
self endon( "swim_cancelapproach" );
self endon( "swim_killrestartlistener" );
var_0 = animscripts\cover_arrival::getapproachent();
self.approachtype = swim_getapproachtype( var_0 );
self.requestarrivalnotify = 1;
self waittill( "cover_approach", var_1 );
var_0 = animscripts\cover_arrival::getapproachent();
var_2 = swim_getapproachtype( var_0 );
if ( var_2 == "exposed" )
{
if ( isdefined( var_0 ) )
var_3 = var_0.origin;
else
var_3 = self.pathgoalpos;
var_4 = var_3 - self.origin;
var_5 = vectortoangles( var_4 );
var_6 = ( 0, var_5[1], 0 );
var_7 = ( 0, var_5[1], 0 );
}
else
{
var_3 = var_0.origin;
var_6 = getnodeforwardangles( var_0 );
if ( animscripts\utility::isspaceai() )
var_7 = animscripts\utility::gettruenodeangles( var_0 );
else
var_7 = var_0.angles;
}
thread swim_dofinalarrival( var_2, var_3, var_1, var_7, var_6 );
}
swim_doposarrival()
{
var_0 = animscripts\cover_arrival::getapproachent();
var_1 = self.pathgoalpos;
var_2 = ( 0, self.angles[1], self.angles[2] );
if ( isdefined( var_0 ) && var_0.type != "Path" && var_0.type != "Path 3D" )
var_2 = getnodeforwardangles( var_0 );
else if ( animscripts\cover_arrival::faceenemyatendofapproach() )
var_2 = vectortoangles( self.enemy.origin - var_1 );
var_3 = vectornormalize( var_1 - self.origin );
if ( isdefined( var_0 ) && swim_isapproachablenode( var_0 ) )
{
var_4 = swim_getapproachtype( var_0 );
var_5 = getnodeforwardangles( var_0 );
var_2 = var_0.angles;
if ( animscripts\utility::isspaceai() )
var_2 = animscripts\utility::gettruenodeangles( var_0 );
thread swim_dofinalarrival( var_4, var_0.origin, var_3, var_2, var_5 );
return;
}
thread swim_dofinalarrival( "exposed", var_1, var_3, var_2, var_2 );
}
swim_determineapproachanim3d( var_0, var_1, var_2, var_3, var_4, var_5 )
{
if ( animscripts\utility::isspaceai() )
{
var_6 = ( 0, 0, 0 );
var_7 = ( 0, 0, 0 );
var_8 = combineangles( invertangles( var_4 ), var_5 );
var_9 = rotatevectorinverted( vectornormalize( self.origin - var_2 ), var_4 ) * -1.0;
var_10 = swim_determineapproachanim( var_0, var_1, var_6, var_9, var_7, var_8, 1, var_2, var_4 );
if ( var_10 )
var_0.m_worldstartpos = rotatevector( var_0.m_worldstartpos, var_4 ) + var_2;
return var_10;
}
else
return swim_determineapproachanim( var_0, var_1, var_2, var_3, var_4, var_5, 0 );
}
swim_dofinalarrival( var_0, var_1, var_2, var_3, var_4 )
{
self endon( "killanimscript" );
self endon( "swim_cancelapproach" );
self.approachtype = var_0;
var_5 = spawnstruct();
if ( !swim_determineapproachanim3d( var_5, var_0, var_1, var_2, var_3, var_4 ) )
return;
var_6 = anglestoforward( self.angles );
var_7 = var_5.m_worldstartpos - self.origin;
var_8 = length( var_7 );
var_7 = var_7 / var_8;
if ( animscripts\utility::isspaceai() )
{
var_9 = var_1 - var_5.m_worldstartpos;
var_10 = length( var_9 );
var_11 = vectordot( var_7, var_6 );
if ( var_8 > var_10 * 0.4 && vectordot( var_7, var_6 ) < 0.5 )
{
self notify( "force_space_rotation_update", 0, 0 );
return;
}
}
else if ( var_8 < 100 && vectordot( var_7, var_6 ) < 0.5 )
return;
if ( var_8 > 4 )
{
if ( var_8 < 12 || self.fixednode || !isdefined( self.node ) || !animscripts\cover_arrival::isthreatenedbyenemy() )
{
self.swim.arrivalpathgoalpos = var_5.m_worldstartpos;
self setruntopos( var_5.m_worldstartpos );
if ( animscripts\utility::isspaceai() )
{
var_12 = 16384;
for (;;)
{
if ( distancesquared( self.origin, var_5.m_worldstartpos ) < var_12 )
{
self.prevturnrate = self.turnrate;
self.turnrate = 0.1;
var_13 = calculatestartorientation( var_5.m_delta, var_5.m_angledelta, var_1, var_4 );
self notify( "force_space_rotation_update", 0, 0, var_13[1] );
break;
}
wait 0.1;
}
}
self waittill( "runto_arrived" );
}
}
self notify( "swim_killrestartlistener" );
var_14 = vectornormalize( var_1 - self.origin );
if ( !swim_determineapproachanim3d( var_5, var_0, var_1, var_14, var_3, var_4 ) )
return;
self.swim.arrivalanim = var_5.m_anim;
if ( animscripts\utility::isspaceai() )
var_15 = self startcoverarrival( var_5.m_worldstartpos, var_4[1] - var_5.m_angledelta[1], var_4[0] - var_5.m_angledelta[0], var_4, var_5.m_angledelta );
else
self startcoverarrival( var_5.m_worldstartpos, var_4[1] - var_5.m_angledelta[1], var_4[0] - var_5.m_angledelta[0] );
}
swim_coverarrival_main()
{
self endon( "killanimscript" );
self endon( "abort_approach" );
var_0 = "arrival_" + self.approachtype;
var_1 = self.swim.arrivalanim;
if ( !self.fixednode )
thread animscripts\cover_arrival::abortapproachifthreatened();
var_2 = 0.4;
if ( animscripts\utility::isspaceai() )
{
var_2 = 0.2;
thread space_arrival_turnrate_delay();
}
self clearanim( %body, 0.2 );
self setflaggedanimrestart( "coverArrival", var_1, 1, var_2, self.movetransitionrate );
animscripts\shared::donotetracks( "coverArrival", ::swim_handlestartcoveraim );
if ( !animhasnotetrack( var_1, "start_aim" ) )
swim_startcoveraim();
self.a.pose = "stand";
self.a.movement = "stop";
self.a.arrivaltype = self.approachtype;
if ( animscripts\utility::isspaceai() )
{
self.turnrate = 0.16;
self.prevturnrate = undefined;
}
self clearanim( %root, 0.3 );
self.lastapproachaborttime = undefined;
self.swim.arrivalanim = undefined;
if ( animscripts\utility::isspaceai() && self.approachtype == "exposed" )
self notify( "force_space_rotation_update", 0, 0, undefined, 1 );
}
space_arrival_turnrate_delay()
{
self endon( "killanimscript" );
self endon( "abort_approach" );
wait 0.22;
self.prevturnrate = 0.16;
self.turnrate = 5.0;
}
swim_getanimstartpos( var_0, var_1, var_2, var_3, var_4 )
{
if ( var_4 )
{
var_5 = calculatestartorientation( var_2, var_3, var_0, var_1 );
return var_5[0];
}
var_6 = var_1 - var_3;
var_7 = anglestoforward( var_6 );
var_8 = anglestoright( var_6 );
var_9 = anglestoup( var_6 );
var_10 = var_7 * var_2[0];
var_11 = var_8 * var_2[1];
var_12 = var_9 * var_2[2];
return var_0 - var_10 + var_11 - var_12;
}
swim_maymovefrompointtopoint( var_0, var_1, var_2, var_3, var_4 )
{
if ( var_2 )
{
var_1 = rotatevector( var_1, var_4 ) + var_3;
return self maymovefrompointtopoint( var_3, var_1, 0, 1 );
}
return self maymovefrompointtopoint( var_0, var_1, 0, 1 );
}
swim_determineapproachanim( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8 )
{
if ( lengthsquared( var_3 ) < 0.003 )
return 0;
var_9 = vectortoangles( var_3 );
if ( var_1 == "exposed" )
{
var_10 = 4;
var_11 = 4;
}
else
{
var_12 = angleclamp180( var_4[1] - var_9[1] );
var_10 = swim_getangleindex( var_12 );
var_11 = swim_getangleindex( var_12, 25 );
}
var_13 = angleclamp180( var_4[0] - var_9[0] );
var_14 = swim_getangleindex( var_13 );
var_15 = swim_getangleindex( var_13, 25 );
var_16 = "arrival_" + var_1;
if ( var_1 == "exposed" && !animscripts\utility::isincombat( 0 ) )
var_16 = var_16 + "_noncombat";
var_17 = getswimanim( var_16 );
if ( !isdefined( var_17[var_10] ) || !isdefined( var_17[var_10][var_14] ) )
return 0;
var_18 = ( var_10 != var_11 || var_14 != var_15 ) && isdefined( var_17[var_11] ) && isdefined( var_17[var_11][var_15] );
var_19 = 0;
var_20 = 0;
var_21 = undefined;
var_22 = var_17[var_10][var_14];
if ( var_18 )
var_21 = var_17[var_11][var_15];
var_23 = var_16 + "_delta";
var_17 = getswimanim( var_23 );
var_24 = var_17[var_10][var_14];
if ( var_18 )
var_19 = var_17[var_11][var_15];
var_25 = var_16 + "_angleDelta";
var_17 = getswimanim( var_25 );
var_26 = var_17[var_10][var_14];
if ( var_18 )
var_20 = var_17[var_11][var_15];
var_27 = swim_getanimstartpos( var_2, var_5, var_24, var_26, var_6 );
if ( !swim_maymovefrompointtopoint( var_2, var_27, var_6, var_7, var_8 ) && var_18 && !animscripts\utility::isspaceai() )
{
var_22 = var_21;
var_24 = var_19;
var_26 = var_20;
var_27 = swim_getanimstartpos( var_2, var_5, var_24, var_26, var_6 );
if ( !swim_maymovefrompointtopoint( var_2, var_27, var_6, var_7, var_8 ) )
return 0;
}
var_0.m_anim = var_22;
var_0.m_delta = var_24;
var_0.m_angledelta = var_26;
var_0.m_worldstartpos = var_27;
return 1;
}
swim_getangleindex( var_0, var_1 )
{
if ( !isdefined( var_1 ) )
var_1 = 10;
if ( var_0 < 0 )
return int( ceil( ( 180 + var_0 - var_1 ) / 45 ) );
else
return int( floor( ( 180 + var_0 + var_1 ) / 45 ) );
}
swim_getmaxanimdist( var_0 )
{
var_1 = anim.archetypes["soldier"]["swim"][var_0]["maxDelta"];
if ( isdefined( self.animarchetype ) && self.animarchetype != "soldier" )
{
if ( isdefined( anim.archetypes[self.animarchetype]["swim"] ) && isdefined( anim.archetypes[self.animarchetype]["swim"][var_0] ) )
{
var_2 = anim.archetypes[self.animarchetype]["swim"][var_0]["maxDelta"];
if ( var_2 > var_1 )
var_1 = var_2;
}
}
return var_1;
}
swim_startcoveraim()
{
animscripts\animset::set_animarray_standing();
animscripts\combat::set_aim_and_turn_limits();
self.previouspitchdelta = 0.0;
animscripts\combat_utility::setupaim( 0 );
thread animscripts\track::trackshootentorpos();
}
swim_handlestartcoveraim( var_0 )
{
if ( var_0 != "start_aim" )
return;
swim_startcoveraim();
}
swim_getapproachtype( var_0 )
{
if ( !isdefined( var_0 ) )
return "exposed";
var_1 = var_0.type;
if ( !isdefined( var_1 ) )
return "exposed";
switch ( var_1 )
{
case "Cover Right 3D":
return "cover_corner_r";
case "Cover Left 3D":
return "cover_corner_l";
case "Cover Up 3D":
return "cover_u";
case "Path 3D":
case "Exposed 3D":
return "exposed";
default:
}
}
getnodeforwardangles( var_0 )
{
if ( getdvarint( "player_spaceEnabled" ) == 1 )
{
var_1 = animscripts\utility::gettruenodeangles( var_0 );
if ( animscripts\utility::isnodecoverleft( var_0 ) )
{
var_2 = getswimanim( "arrival_cover_corner_l_angleDelta" );
var_3 = var_2[4][4][1];
}
else if ( animscripts\utility::isnodecoverright( var_0 ) )
{
var_2 = getswimanim( "arrival_cover_corner_r_angleDelta" );
var_3 = var_2[4][4][1];
}
else
var_3 = 0;
var_1 = combineangles( var_1, ( 0, var_3, 0 ) );
return var_1;
}
else
var_1 = var_0.angles;
var_4 = var_1[1];
if ( animscripts\utility::isnodecoverleft( var_0 ) )
{
var_2 = getswimanim( "arrival_cover_corner_l_angleDelta" );
var_4 = var_4 + var_2[4][4][1];
}
else if ( animscripts\utility::isnodecoverright( var_0 ) )
{
var_2 = getswimanim( "arrival_cover_corner_r_angleDelta" );
var_4 = var_4 + var_2[4][4][1];
}
var_1 = ( var_1[0], var_4, var_1[2] );
return var_1;
}
swim_dostrafe()
{
if ( self.swim.movestate != "combat_strafe" )
moveswim_combat_move_set( "combat_strafe" );
var_0 = getswimanim( "forward_aim" );
self setflaggedanimknoblimited( "swimanim", var_0, 1, 0.1, 1, 1 );
thread swim_updatestrafeanim();
animscripts\notetracks::donotetracksfortime( 0.2, "swimanim" );
self notify( "end_swim_updatestrafeanim" );
}
swim_updatestrafeanim()
{
self endon( "killanimscript" );
self endon( "move_interrupt" );
self endon( "move_mode" );
self endon( "move_loop_restart" );
self endon( "end_swim_updatestrafeanim" );
var_0 = 0;
for (;;)
{
if ( self.facemotion )
{
if ( !var_0 )
{
swim_setstrafeweights( 1.0, 0.0, 0.0, 0.0 );
swim_setstrafeaimweights( 0, 0, 0, 0 );
}
}
else
{
if ( self.relativedir == 1 )
{
var_1 = [];
var_1["front"] = 1;
var_1["back"] = 0;
var_1["left"] = 0;
var_1["right"] = 0;
}
else
var_1 = animscripts\utility::quadrantanimweights( self getmotionangle() );
if ( isdefined( self.update_move_front_bias ) )
{
var_1["back"] = 0.0;
if ( var_1["front"] < 0.2 )
var_1["front"] = 0.2;
}
var_2 = swim_setstrafeweights( var_1["front"], var_1["back"], var_1["left"], var_1["right"] );
swim_setstrafeaimset( var_2 );
swim_updatestrafeaimanim();
}
var_0 = self.facemotion;
wait 0.05;
waittillframeend;
}
}
swim_getstrafeblendtime()
{
if ( animscripts\utility::isspaceai() )
return 0.5;
else
return 0.5;
}
swim_setstrafeweights( var_0, var_1, var_2, var_3 )
{
var_4 = swim_getstrafeblendtime();
self setanim( %combatrun_forward, var_0, var_4, 1, 1 );
self setanim( %combatrun_backward, var_1, var_4, 1, 1 );
self setanim( %combatrun_left, var_2, var_4, 1, 1 );
self setanim( %combatrun_right, var_3, var_4, 1, 1 );
if ( var_0 > 0 )
return "front";
else if ( var_1 > 0 )
return "back";
else if ( var_2 > 0 )
return "left";
else if ( var_3 > 0 )
return "right";
}
swim_setstrafeaimset( var_0 )
{
switch ( var_0 )
{
case "front":
self setanimknoblimited( getswimanim( "aim_move_U" ), 1, 0.1 );
self setanimknoblimited( getswimanim( "aim_move_D" ), 1, 0.1 );
self setanimknoblimited( getswimanim( "aim_move_L" ), 1, 0.1 );
self setanimknoblimited( getswimanim( "aim_move_R" ), 1, 0.1 );
break;
case "back":
self setanimknoblimited( getswimanim( "strafe_B_aim_U" ), 1, 0.1 );
self setanimknoblimited( getswimanim( "strafe_B_aim_D" ), 1, 0.1 );
self setanimknoblimited( getswimanim( "strafe_B_aim_L" ), 1, 0.1 );
self setanimknoblimited( getswimanim( "strafe_B_aim_R" ), 1, 0.1 );
break;
case "left":
self setanimknoblimited( getswimanim( "strafe_L_aim_U" ), 1, 0.1 );
self setanimknoblimited( getswimanim( "strafe_L_aim_D" ), 1, 0.1 );
self setanimknoblimited( getswimanim( "strafe_L_aim_L" ), 1, 0.1 );
self setanimknoblimited( getswimanim( "strafe_L_aim_R" ), 1, 0.1 );
break;
case "right":
self setanimknoblimited( getswimanim( "strafe_R_aim_U" ), 1, 0.1 );
self setanimknoblimited( getswimanim( "strafe_R_aim_D" ), 1, 0.1 );
self setanimknoblimited( getswimanim( "strafe_R_aim_L" ), 1, 0.1 );
self setanimknoblimited( getswimanim( "strafe_R_aim_R" ), 1, 0.1 );
break;
default:
}
}
swim_updatestrafeaimanim()
{
var_0 = self.angles[1];
var_1 = self.angles[0];
var_2 = 0;
var_3 = 0;
var_4 = 0;
var_5 = 0;
var_6 = 45;
var_7 = 60;
if ( isdefined( self.enemy ) )
{
var_8 = self.enemy.origin - self.origin;
var_9 = vectortoangles( var_8 );
var_10 = angleclamp180( var_9[1] - var_0 );
var_11 = angleclamp180( var_9[0] - var_1 );
if ( var_10 > 0 )
var_4 = clamp( 1 - ( var_6 - var_10 ) / var_6, 0, 1 );
else
var_5 = clamp( 1 - ( var_6 + var_10 ) / var_6, 0, 1 );
if ( var_11 > 0 )
var_3 = clamp( 1 - ( var_7 - var_11 ) / var_7, 0, 1 );
else
var_2 = clamp( 1 - ( var_7 + var_11 ) / var_7, 0, 1 );
}
swim_setstrafeaimweights( var_2, var_3, var_4, var_5 );
}
swim_setstrafeaimweights( var_0, var_1, var_2, var_3 )
{
self setanim( %w_aim_4, var_2, 0.2, 1, 1 );
self setanim( %w_aim_6, var_3, 0.2, 1, 1 );
self setanim( %w_aim_8, var_0, 0.2, 1, 1 );
self setanim( %w_aim_2, var_1, 0.2, 1, 1 );
}
swim_pathchange_getturnanim( var_0, var_1 )
{
var_2 = undefined;
var_3 = undefined;
var_4 = getswimanim( "turn" );
var_5 = swim_getangleindex( var_0 );
var_6 = swim_getangleindex( var_1 );
if ( isdefined( var_4[var_5] ) )
var_2 = var_4[var_5][var_6];
if ( var_5 == 4 )
{
if ( var_6 > 4 && isdefined( var_4[4][var_6 + 1] ) )
var_2 = var_4[4][var_6 + 1];
else if ( var_6 < 4 && var_6 > 0 && isdefined( var_4[4][var_6 - 1] ) )
var_2 = var_4[4][var_6 - 1];
}
if ( !isdefined( var_2 ) )
var_2 = var_4[var_5][4];
if ( isdefined( var_2 ) )
{
if ( animscripts\move::pathchange_candoturnanim( var_2 ) )
return var_2;
}
return undefined;
}
swim_cleanupturnanim()
{
moveswim_set( "nostate" );
}
swim_updateleananim()
{
var_0 = clamp( self.leanamount / 20.0, -1, 1 );
if ( var_0 > 0 )
{
if ( self.prevleanfracyaw <= 0 && var_0 < 0.075 )
var_0 = 0;
self setanim( %add_turn_l, var_0, 0.2, 1, 1 );
self setanim( %add_turn_r, 0.0, 0.2, 1, 1 );
}
else
{
if ( self.prevleanfracyaw >= 0 && var_0 > -0.075 )
var_0 = 0;
self setanim( %add_turn_l, 0, 0.2, 1, 1 );
self setanim( %add_turn_r, 0 - var_0, 0.2, 1, 1 );
}
self.prevleanfracyaw = var_0;
var_0 = clamp( self.pitchamount / 25.0, -1, 1 );
if ( var_0 > 0 )
{
if ( self.prevleanfracpitch <= 0 && var_0 < 0.075 )
var_0 = 0;
self setanim( %add_turn_d, var_0, 0.2, 1, 1 );
self setanim( %add_turn_u, 0.0, 0.2, 1, 1 );
}
else
{
if ( self.prevleanfracpitch >= 0 && var_0 > -0.075 )
var_0 = 0;
self setanim( %add_turn_d, 0, 0.2, 1, 1 );
self setanim( %add_turn_u, 0 - var_0, 0.2, 1, 1 );
}
self.prevleanfracpitch = var_0;
}
swim_isapproachablenode( var_0 )
{
switch ( var_0.type )
{
case "Exposed 3D":
case "Cover Right 3D":
case "Cover Left 3D":
case "Cover Up 3D":
return 1;
}
return 0;
}
space_getdefaultturnrate()
{
return 0.16;
}
space_getorientturnrate()
{
return 0.1;
}