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

1059 lines
30 KiB
Plaintext

// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("generic_human");
init_animset_move()
{
var_0 = [];
var_0["fire"] = %exposed_shoot_auto_v3;
var_0["single"] = [ %exposed_shoot_semi1 ];
var_0["single_shotgun"] = [ %shotgun_stand_fire_1a, %shotgun_stand_fire_1b ];
var_0["burst2"] = %exposed_shoot_burst3;
var_0["burst3"] = %exposed_shoot_burst3;
var_0["burst4"] = %exposed_shoot_burst4;
var_0["burst5"] = %exposed_shoot_burst5;
var_0["burst6"] = %exposed_shoot_burst6;
var_0["semi2"] = %exposed_shoot_semi2;
var_0["semi3"] = %exposed_shoot_semi3;
var_0["semi4"] = %exposed_shoot_semi4;
var_0["semi5"] = %exposed_shoot_semi5;
anim.archetypes["soldier"]["shoot_while_moving"] = var_0;
var_0 = [];
var_0["shuffle_start_from_cover_left"] = %cornercrl_alert_2_shuffle;
var_0["shuffle_start_from_cover_right"] = %cornercrr_alert_2_shuffle;
var_0["shuffle_start_left"] = %covercrouch_hide_2_shufflel;
var_0["shuffle_start_right"] = %covercrouch_hide_2_shuffler;
var_0["shuffle_to_cover_left"] = %covercrouch_shufflel;
var_0["shuffle_end_to_cover_left"] = %cornercrl_shuffle_2_alert;
var_0["shuffle_to_cover_right"] = %covercrouch_shuffler;
var_0["shuffle_end_to_cover_right"] = %cornercrr_shuffle_2_alert;
var_0["shuffle_start_left_stand_to_stand"] = %coverstand_hide_2_shufflel;
var_0["shuffle_left_stand_to_stand"] = %coverstand_shufflel;
var_0["shuffle_end_left_stand_to_stand"] = %coverstand_shufflel_2_hide;
var_0["shuffle_start_right_stand_to_stand"] = %coverstand_hide_2_shuffler;
var_0["shuffle_right_stand_to_stand"] = %coverstand_shuffler;
var_0["shuffle_end_right_stand_to_stand"] = %coverstand_shuffler_2_hide;
var_0["shuffle_to_left_crouch"] = %covercrouch_shufflel;
var_0["shuffle_end_to_left_stand"] = %coverstand_shufflel_2_hide;
var_0["shuffle_end_to_left_crouch"] = %covercrouch_shufflel_2_hide;
var_0["shuffle_to_right_crouch"] = %covercrouch_shuffler;
var_0["shuffle_end_to_right_stand"] = %coverstand_shuffler_2_hide;
var_0["shuffle_end_to_right_crouch"] = %covercrouch_shuffler_2_hide;
anim.archetypes["soldier"]["shuffle"] = var_0;
}
main()
{
if ( isdefined( self.custom_animscript ) )
{
if ( isdefined( self.custom_animscript["move"] ) )
{
[[ self.custom_animscript["move"] ]]();
return;
}
}
self endon( "killanimscript" );
[[ self.exception["move"] ]]();
moveinit();
getupifprone();
animscripts\utility::initialize( "move" );
var_0 = waspreviouslyincover();
if ( var_0 && isdefined( self.shufflemove ) )
{
movecovertocover();
movecovertocoverfinish();
}
else if ( isdefined( self.battlechatter ) && self.battlechatter )
{
movestartbattlechatter( var_0 );
animscripts\battlechatter::playbattlechatter();
}
thread updatestairsstate();
var_1 = ::pathchangelistener;
if ( isdefined( self.pathchangecheckoverridefunc ) )
var_1 = self.pathchangecheckoverridefunc;
self thread [[ var_1 ]]();
thread animdodgeobstaclelistener();
animscripts\exit_node::startmovetransition();
self.doingreacquirestep = undefined;
self.ignorepathchange = undefined;
thread startthreadstorunwhilemoving();
listenforcoverapproach();
self.shoot_while_moving_thread = undefined;
self.aim_while_moving_thread = undefined;
self.runngun = undefined;
movemainloop( 1 );
}
end_script()
{
if ( isdefined( self.oldgrenadeweapon ) )
{
self.grenadeweapon = self.oldgrenadeweapon;
self.oldgrenadeweapon = undefined;
}
self.teamflashbangimmunity = undefined;
self.minindoortime = undefined;
self.ignorepathchange = undefined;
self.shufflemove = undefined;
self.shufflenode = undefined;
self.runngun = undefined;
self.reactingtobullet = undefined;
self.requestreacttobullet = undefined;
self.currentdodgeanim = undefined;
self.moveloopoverridefunc = undefined;
animscripts\run::setshootwhilemoving( 0 );
if ( self.swimmer )
animscripts\swim::swim_moveend();
self clearanim( %head, 0.2 );
self.facialidx = undefined;
}
moveinit()
{
self.reactingtobullet = undefined;
self.requestreacttobullet = undefined;
self.update_move_anim_type = undefined;
self.update_move_front_bias = undefined;
self.runngunweight = 0;
self.arrivalstartdist = undefined;
}
getupifprone()
{
if ( self.a.pose == "prone" )
{
var_0 = animscripts\utility::choosepose( "stand" );
if ( var_0 != "prone" )
{
self orientmode( "face current" );
self animmode( "zonly_physics", 0 );
var_1 = 1;
if ( isdefined( self.grenade ) )
var_1 = 2;
animscripts\cover_prone::proneto( var_0, var_1 );
self animmode( "none", 0 );
self orientmode( "face default" );
}
}
}
waspreviouslyincover()
{
switch ( self.prevscript )
{
case "concealment_stand":
case "concealment_prone":
case "concealment_crouch":
case "cover_wide_right":
case "cover_wide_left":
case "cover_swim_right":
case "cover_swim_left":
case "cover_prone":
case "cover_left":
case "cover_stand":
case "turret":
case "cover_crouch":
case "hide":
case "cover_multi":
case "cover_right":
return 1;
}
return 0;
}
movestartbattlechatter( var_0 )
{
if ( self.movemode == "run" )
animscripts\battlechatter_ai::evaluatemoveevent( var_0 );
}
movemainloop( var_0 )
{
movemainloopinternal( var_0 );
self notify( "abort_reload" );
}
archetypechanged()
{
if ( isdefined( self.animarchetype ) && self.animarchetype != self.prevmovearchetype )
return 1;
else if ( !isdefined( self.animarchetype ) && self.prevmovearchetype != "none" )
return 1;
return 0;
}
updatemovemode( var_0 )
{
if ( var_0 != self.prevmovemode || archetypechanged() )
{
if ( isdefined( self.custommoveanimset ) && isdefined( self.custommoveanimset[var_0] ) )
self.a.moveanimset = self.custommoveanimset[var_0];
else
{
self.a.moveanimset = animscripts\utility::lookupanimarray( var_0 );
if ( ( self.combatmode == "ambush" || self.combatmode == "ambush_nodes_only" ) && ( isdefined( self.pathgoalpos ) && distancesquared( self.origin, self.pathgoalpos ) > squared( 100 ) ) )
{
self.sidesteprate = 1;
animscripts\animset::set_ambush_sidestep_anims();
}
else
self.sidesteprate = 1.35;
}
self.prevmovemode = var_0;
if ( isdefined( self.animarchetype ) )
self.prevmovearchetype = self.animarchetype;
}
}
movemainloopinternal( var_0 )
{
self endon( "killanimscript" );
self endon( "move_interrupt" );
var_1 = self getanimtime( %walk_and_run_loops );
self.a.runloopcount = randomint( 10000 );
self.prevmovemode = "none";
self.prevmovearchetype = "none";
self.moveloopcleanupfunc = undefined;
for (;;)
{
var_2 = self getanimtime( %walk_and_run_loops );
if ( var_2 < var_1 )
self.a.runloopcount++;
var_1 = var_2;
updatemovemode( self.movemode );
if ( isdefined( self.movemainloopprocessoverridefunc ) )
self [[ self.movemainloopprocessoverridefunc ]]( self.movemode );
else
movemainloopprocess( self.movemode );
if ( isdefined( self.moveloopcleanupfunc ) )
{
self [[ self.moveloopcleanupfunc ]]();
self.moveloopcleanupfunc = undefined;
}
self notify( "abort_reload" );
}
}
movemainloopprocess( var_0 )
{
self endon( "move_loop_restart" );
animscripts\face::setidlefacedelayed( anim.alertface );
if ( isdefined( self.moveloopoverridefunc ) )
self [[ self.moveloopoverridefunc ]]();
else if ( animscripts\utility::shouldcqb() )
animscripts\cqb::movecqb();
else if ( self.swimmer )
animscripts\swim::moveswim();
else if ( var_0 == "run" )
animscripts\run::moverun();
else
animscripts\walk::movewalk();
self.requestreacttobullet = undefined;
}
mayshootwhilemoving()
{
if ( self.weapon == "none" )
return 0;
var_0 = weaponclass( self.weapon );
if ( !animscripts\utility::usingriflelikeweapon() )
return 0;
if ( animscripts\combat_utility::issniper() )
{
if ( !animscripts\utility::iscqbwalking() && self.facemotion )
return 0;
}
if ( isdefined( self.dontshootwhilemoving ) )
return 0;
return 1;
}
shootwhilemoving()
{
self endon( "killanimscript" );
self notify( "doing_shootWhileMoving" );
self endon( "doing_shootWhileMoving" );
var_0 = animscripts\utility::lookupanimarray( "shoot_while_moving" );
foreach ( var_3, var_2 in var_0 )
self.a.array[var_3] = var_2;
if ( isdefined( self.combatstandanims ) && isdefined( self.combatstandanims["fire"] ) )
self.a.array["fire"] = self.combatstandanims["fire"];
if ( isdefined( self.weapon ) && animscripts\utility::weapon_pump_action_shotgun() )
self.a.array["single"] = animscripts\utility::lookupanim( "shotgun_stand", "single" );
for (;;)
{
if ( !self.bulletsinclip )
{
if ( animscripts\utility::iscqbwalkingorfacingenemy() )
{
self.ammocheattime = 0;
animscripts\combat_utility::cheatammoifnecessary();
}
if ( !self.bulletsinclip )
{
wait 0.5;
continue;
}
}
animscripts\combat_utility::shootuntilshootbehaviorchange();
self clearanim( %exposed_aiming, 0.2 );
}
}
startthreadstorunwhilemoving()
{
self endon( "killanimscript" );
wait 0.05;
thread bulletwhizbycheck_whilemoving();
thread meleeattackcheck_whilemoving();
thread animscripts\door::indoorcqbtogglecheck();
thread animscripts\door::doorenterexitcheck();
}
updatestairsstate()
{
self endon( "killanimscript" );
self.prevstairsstate = self.stairsstate;
for (;;)
{
wait 0.05;
if ( self.prevstairsstate != self.stairsstate )
{
if ( !isdefined( self.ignorepathchange ) || self.stairsstate != "none" )
self notify( "move_loop_restart" );
}
self.prevstairsstate = self.stairsstate;
}
}
restartmoveloop( var_0 )
{
self endon( "killanimscript" );
if ( !var_0 )
animscripts\exit_node::startmovetransition();
self.ignorepathchange = undefined;
self clearanim( %root, 0.1 );
self orientmode( "face default" );
self animmode( "none", 0 );
self.requestarrivalnotify = 1;
movemainloop( !var_0 );
}
pathchangelistener()
{
self endon( "killanimscript" );
self endon( "move_interrupt" );
self.ignorepathchange = 1;
for (;;)
{
self waittill( "path_changed", var_0, var_1 );
if ( isdefined( self.ignorepathchange ) || isdefined( self.noturnanims ) )
continue;
if ( !self.facemotion || abs( self getmotionangle() ) > 15 )
continue;
if ( self.a.pose != "stand" )
continue;
self notify( "stop_move_anim_update" );
self.update_move_anim_type = undefined;
var_2 = vectortoangles( var_1 );
var_3 = angleclamp180( self.angles[1] - var_2[1] );
var_4 = angleclamp180( self.angles[0] - var_2[0] );
var_5 = pathchange_getturnanim( var_3, var_4 );
if ( isdefined( var_5 ) )
{
self.turnanim = var_5;
self.turntime = gettime();
self.moveloopoverridefunc = ::pathchange_doturnanim;
self notify( "move_loop_restart" );
animscripts\run::endfaceenemyaimtracking();
}
}
}
pathchange_getturnanim( var_0, var_1 )
{
if ( isdefined( self.pathturnanimoverridefunc ) )
return [[ self.pathturnanimoverridefunc ]]( var_0, var_1 );
var_2 = undefined;
var_3 = undefined;
if ( self.swimmer )
var_4 = animscripts\swim::getswimanim( "turn" );
else if ( self.movemode == "walk" )
var_4 = animscripts\utility::lookupanimarray( "cqb_turn" );
else if ( animscripts\utility::shouldcqb() )
var_4 = animscripts\utility::lookupanimarray( "cqb_run_turn" );
else
var_4 = animscripts\utility::lookupanimarray( "run_turn" );
if ( var_0 < 0 )
{
if ( var_0 > -45 )
var_5 = 3;
else
var_5 = int( ceil( ( var_0 + 180 - 10 ) / 45 ) );
}
else if ( var_0 < 45 )
var_5 = 5;
else
var_5 = int( floor( ( var_0 + 180 + 10 ) / 45 ) );
var_2 = var_4[var_5];
if ( isdefined( var_2 ) )
{
if ( isarray( var_2 ) )
{
while ( var_2.size > 0 )
{
var_6 = randomint( var_2.size );
if ( pathchange_candoturnanim( var_2[var_6] ) )
return var_2[var_6];
var_2[var_6] = var_2[var_2.size - 1];
var_2[var_2.size - 1] = undefined;
}
}
else if ( pathchange_candoturnanim( var_2 ) )
return var_2;
}
var_7 = -1;
if ( var_0 < -60 )
{
var_7 = int( ceil( ( var_0 + 180 ) / 45 ) );
if ( var_7 == var_5 )
var_7 = var_5 - 1;
}
else if ( var_0 > 60 )
{
var_7 = int( floor( ( var_0 + 180 ) / 45 ) );
if ( var_7 == var_5 )
var_7 = var_5 + 1;
}
if ( var_7 >= 0 && var_7 < 9 )
var_3 = var_4[var_7];
if ( isdefined( var_3 ) )
{
if ( isarray( var_3 ) )
var_3 = var_3[0];
if ( pathchange_candoturnanim( var_3 ) )
return var_3;
}
return undefined;
}
pathchange_candoturnanim( var_0 )
{
if ( !isdefined( self.pathgoalpos ) )
return 0;
var_1 = getnotetracktimes( var_0, "code_move" );
var_2 = var_1[0];
var_3 = getmovedelta( var_0, 0, var_2 );
var_4 = self localtoworldcoords( var_3 );
if ( isdefined( self.arrivalstartdist ) && squared( self.arrivalstartdist ) > distancesquared( self.pathgoalpos, var_4 ) )
return 0;
var_3 = getmovedelta( var_0, 0, 1 );
var_5 = self localtoworldcoords( var_3 );
var_5 = var_4 + vectornormalize( var_5 - var_4 ) * 20;
var_6 = !self.swimmer;
return self maymovefrompointtopoint( var_4, var_5, var_6, 1 );
}
pathchange_doturnanim()
{
self endon( "killanimscript" );
self.moveloopoverridefunc = undefined;
var_0 = self.turnanim;
if ( gettime() > self.turntime + 50 )
return;
if ( self.swimmer )
self animmode( "nogravity", 0 );
else
self animmode( "zonly_physics", 0 );
var_1 = 0.1;
if ( isdefined( self.pathturnanimblendtime ) )
var_1 = self.pathturnanimblendtime;
self clearanim( %body, var_1 );
self.moveloopcleanupfunc = ::pathchange_cleanupturnanim;
self.ignorepathchange = 1;
var_1 = 0.05;
if ( isdefined( self.pathturnanimblendtime ) )
var_1 = self.pathturnanimblendtime;
self setflaggedanimrestart( "turnAnim", var_0, 1, var_1, self.moveplaybackrate );
if ( animscripts\utility::isspaceai() )
self orientmode( "face angle 3d", self.angles );
else
self orientmode( "face angle", self.angles[1] );
animscripts\shared::donotetracks( "turnAnim" );
self.ignorepathchange = undefined;
self orientmode( "face motion" );
self animmode( "none", 0 );
animscripts\shared::donotetracks( "turnAnim" );
}
pathchange_cleanupturnanim()
{
self.ignorepathchange = undefined;
self orientmode( "face default" );
self clearanim( %root, 0.1 );
self animmode( "none", 0 );
if ( self.swimmer )
animscripts\swim::swim_cleanupturnanim();
}
dodgemoveloopoverride()
{
self pushplayer( 1 );
self animmode( "zonly_physics", 0 );
self clearanim( %body, 0.2 );
self setflaggedanimrestart( "dodgeAnim", self.currentdodgeanim, 1, 0.2, 1 );
animscripts\shared::donotetracks( "dodgeAnim" );
self animmode( "none", 0 );
self orientmode( "face default" );
if ( animhasnotetrack( self.currentdodgeanim, "code_move" ) )
animscripts\shared::donotetracks( "dodgeAnim" );
self clearanim( %civilian_dodge, 0.2 );
self pushplayer( 0 );
self.currentdodgeanim = undefined;
self.moveloopoverridefunc = undefined;
return 1;
}
trydodgewithanim( var_0, var_1 )
{
var_2 = ( self.lookaheaddir[1], -1 * self.lookaheaddir[0], 0 );
var_3 = self.lookaheaddir * var_1[0];
var_4 = var_2 * var_1[1];
var_5 = self.origin + var_3 - var_4;
self pushplayer( 1 );
if ( self maymovetopoint( var_5 ) )
{
self.currentdodgeanim = var_0;
self.moveloopoverridefunc = ::dodgemoveloopoverride;
self notify( "move_loop_restart" );
return 1;
}
self pushplayer( 0 );
return 0;
}
animdodgeobstaclelistener()
{
if ( !isdefined( self.dodgeleftanim ) || !isdefined( self.dodgerightanim ) )
return;
self endon( "killanimscript" );
self endon( "move_interrupt" );
for (;;)
{
self waittill( "path_need_dodge", var_0, var_1 );
animscripts\utility::updateisincombattimer();
if ( animscripts\utility::isincombat() )
{
self.nododgemove = 0;
return;
}
if ( !issentient( var_0 ) )
continue;
var_2 = vectornormalize( var_1 - self.origin );
if ( self.lookaheaddir[0] * var_2[1] - var_2[0] * self.lookaheaddir[1] > 0 )
{
if ( !trydodgewithanim( self.dodgerightanim, self.dodgerightanimoffset ) )
trydodgewithanim( self.dodgeleftanim, self.dodgeleftanimoffset );
}
else if ( !trydodgewithanim( self.dodgeleftanim, self.dodgeleftanimoffset ) )
trydodgewithanim( self.dodgerightanim, self.dodgerightanimoffset );
if ( isdefined( self.currentdodgeanim ) )
{
wait( getanimlength( self.currentdodgeanim ) );
continue;
}
wait 0.1;
}
}
setdodgeanims( var_0, var_1 )
{
self.nododgemove = 1;
self.dodgeleftanim = var_0;
self.dodgerightanim = var_1;
var_2 = 1;
if ( animhasnotetrack( var_0, "code_move" ) )
var_2 = getnotetracktimes( var_0, "code_move" )[0];
self.dodgeleftanimoffset = getmovedelta( var_0, 0, var_2 );
var_2 = 1;
if ( animhasnotetrack( var_1, "code_move" ) )
var_2 = getnotetracktimes( var_1, "code_move" )[0];
self.dodgerightanimoffset = getmovedelta( var_1, 0, var_2 );
self.interval = 80;
}
cleardodgeanims()
{
self.nododgemove = 0;
self.dodgeleftanim = undefined;
self.dodgerightanim = undefined;
self.dodgeleftanimoffset = undefined;
self.dodgerightanimoffset = undefined;
}
meleeattackcheck_whilemoving()
{
self endon( "killanimscript" );
for (;;)
{
if ( isdefined( self.enemy ) && ( isai( self.enemy ) || isdefined( self.meleeplayerwhilemoving ) ) )
{
if ( abs( self getmotionangle() ) <= 135 )
animscripts\melee::melee_tryexecuting();
}
wait 0.1;
}
}
bulletwhizbycheck_whilemoving()
{
self endon( "killanimscript" );
if ( isdefined( self.disablebulletwhizbyreaction ) )
return;
for (;;)
{
self waittill( "bulletwhizby", var_0 );
if ( self.movemode != "run" || !self.facemotion || self.a.pose != "stand" || isdefined( self.reactingtobullet ) )
continue;
if ( self.stairsstate != "none" )
continue;
if ( !isdefined( self.enemy ) && !self.ignoreall && isdefined( var_0.team ) && isenemyteam( self.team, var_0.team ) )
{
self.whizbyenemy = var_0;
self animcustom( animscripts\reactions::bulletwhizbyreaction );
continue;
}
if ( self.lookaheadhitsstairs || self.lookaheaddist < 100 )
continue;
if ( isdefined( self.pathgoalpos ) && distancesquared( self.origin, self.pathgoalpos ) < 10000 )
{
wait 0.2;
continue;
}
self.requestreacttobullet = gettime();
self notify( "move_loop_restart" );
animscripts\run::endfaceenemyaimtracking();
}
}
get_shuffle_to_corner_start_anim( var_0, var_1 )
{
var_2 = var_1.type;
if ( var_2 == "Cover Multi" )
var_2 = animscripts\utility::getcovermultipretendtype( var_1 );
if ( var_2 == "Cover Left" )
return animscripts\utility::lookupanim( "shuffle", "shuffle_start_from_cover_left" );
else if ( var_2 == "Cover Right" )
return animscripts\utility::lookupanim( "shuffle", "shuffle_start_from_cover_right" );
else if ( var_0 )
return animscripts\utility::lookupanim( "shuffle", "shuffle_start_left" );
else
return animscripts\utility::lookupanim( "shuffle", "shuffle_start_right" );
}
setup_shuffle_anim_array( var_0, var_1, var_2 )
{
var_3 = [];
var_4 = var_2.type;
if ( var_4 == "Cover Multi" )
var_4 = animscripts\utility::getcovermultipretendtype( var_2 );
if ( var_4 == "Cover Left" )
{
var_3["shuffle_start"] = get_shuffle_to_corner_start_anim( var_0, var_1 );
var_3["shuffle"] = animscripts\utility::lookupanim( "shuffle", "shuffle_to_cover_left" );
var_3["shuffle_end"] = animscripts\utility::lookupanim( "shuffle", "shuffle_end_to_cover_left" );
}
else if ( var_4 == "Cover Right" )
{
var_3["shuffle_start"] = get_shuffle_to_corner_start_anim( var_0, var_1 );
var_3["shuffle"] = animscripts\utility::lookupanim( "shuffle", "shuffle_to_cover_right" );
var_3["shuffle_end"] = animscripts\utility::lookupanim( "shuffle", "shuffle_end_to_cover_right" );
}
else if ( var_4 == "Cover Stand" && var_1.type == var_4 )
{
if ( var_0 )
{
var_3["shuffle_start"] = animscripts\utility::lookupanim( "shuffle", "shuffle_start_left_stand_to_stand" );
var_3["shuffle"] = animscripts\utility::lookupanim( "shuffle", "shuffle_left_stand_to_stand" );
var_3["shuffle_end"] = animscripts\utility::lookupanim( "shuffle", "shuffle_end_left_stand_to_stand" );
}
else
{
var_3["shuffle_start"] = animscripts\utility::lookupanim( "shuffle", "shuffle_start_right_stand_to_stand" );
var_3["shuffle"] = animscripts\utility::lookupanim( "shuffle", "shuffle_right_stand_to_stand" );
var_3["shuffle_end"] = animscripts\utility::lookupanim( "shuffle", "shuffle_end_right_stand_to_stand" );
}
}
else if ( var_0 )
{
var_3["shuffle_start"] = get_shuffle_to_corner_start_anim( var_0, var_1 );
var_3["shuffle"] = animscripts\utility::lookupanim( "shuffle", "shuffle_to_left_crouch" );
if ( var_4 == "Cover Stand" )
var_3["shuffle_end"] = animscripts\utility::lookupanim( "shuffle", "shuffle_end_to_left_stand" );
else
var_3["shuffle_end"] = animscripts\utility::lookupanim( "shuffle", "shuffle_end_to_left_crouch" );
}
else
{
var_3["shuffle_start"] = get_shuffle_to_corner_start_anim( var_0, var_1 );
var_3["shuffle"] = animscripts\utility::lookupanim( "shuffle", "shuffle_to_right_crouch" );
if ( var_4 == "Cover Stand" )
var_3["shuffle_end"] = animscripts\utility::lookupanim( "shuffle", "shuffle_end_to_right_stand" );
else
var_3["shuffle_end"] = animscripts\utility::lookupanim( "shuffle", "shuffle_end_to_right_crouch" );
}
self.a.array = var_3;
}
movecovertocover_checkstartpose( var_0, var_1 )
{
if ( self.a.pose == "stand" && ( var_1.type != "Cover Stand" || var_0.type != "Cover Stand" ) )
{
self.a.pose = "crouch";
return 0;
}
return 1;
}
movecovertocover_checkendpose( var_0 )
{
if ( self.a.pose == "crouch" && var_0.type == "Cover Stand" )
{
self.a.pose = "stand";
return 0;
}
return 1;
}
movecovertocover()
{
self endon( "killanimscript" );
self endon( "goal_changed" );
var_0 = self.shufflenode;
self.shufflemove = undefined;
self.shufflenode = undefined;
self.shufflemoveinterrupted = 1;
if ( !isdefined( self.prevnode ) )
return;
if ( !isdefined( self.node ) || !isdefined( var_0 ) || self.node != var_0 )
return;
var_1 = self.prevnode;
var_2 = self.node;
var_3 = var_2.origin - self.origin;
if ( lengthsquared( var_3 ) < 1 )
return;
var_3 = vectornormalize( var_3 );
var_4 = anglestoforward( var_2.angles );
var_5 = var_4[0] * var_3[1] - var_4[1] * var_3[0] > 0;
if ( movedoorsidetoside( var_5, var_1, var_2 ) )
return;
if ( movecovertocover_checkstartpose( var_1, var_2 ) )
var_6 = 0.1;
else
var_6 = 0.4;
setup_shuffle_anim_array( var_5, var_1, var_2 );
self animmode( "zonly_physics", 0 );
self clearanim( %body, var_6 );
var_7 = animscripts\utility::animarray( "shuffle_start" );
var_8 = animscripts\utility::animarray( "shuffle" );
var_9 = animscripts\utility::animarray( "shuffle_end" );
if ( animhasnotetrack( var_7, "finish" ) )
var_10 = getnotetracktimes( var_7, "finish" )[0];
else
var_10 = 1;
var_11 = length( getmovedelta( var_7, 0, var_10 ) );
var_12 = length( getmovedelta( var_8, 0, 1 ) );
var_13 = length( getmovedelta( var_9, 0, 1 ) );
var_14 = distance( self.origin, var_2.origin );
if ( var_14 > var_11 )
{
self orientmode( "face angle", animscripts\utility::getnodeforwardyaw( var_1 ) );
self setflaggedanimrestart( "shuffle_start", var_7, 1, var_6 );
animscripts\shared::donotetracks( "shuffle_start" );
self clearanim( var_7, 0.2 );
var_14 = var_14 - var_11;
var_6 = 0.2;
}
else
self orientmode( "face angle", var_2.angles[1] );
var_15 = 0;
if ( var_14 > var_13 )
{
var_15 = 1;
var_14 = var_14 - var_13;
}
var_16 = getanimlength( var_8 );
var_17 = var_16 * ( var_14 / var_12 ) * 0.9;
var_17 = floor( var_17 * 20 ) * 0.05;
self setflaggedanim( "shuffle", var_8, 1, var_6 );
animscripts\notetracks::donotetracksfortime( var_17, "shuffle" );
for ( var_18 = 0; var_18 < 2; var_18++ )
{
var_14 = distance( self.origin, var_2.origin );
if ( var_15 )
var_14 = var_14 - var_13;
if ( var_14 < 4 )
break;
var_17 = var_16 * ( var_14 / var_12 ) * 0.9;
var_17 = floor( var_17 * 20 ) * 0.05;
if ( var_17 < 0.05 )
break;
animscripts\notetracks::donotetracksfortime( var_17, "shuffle" );
}
if ( var_15 )
{
if ( movecovertocover_checkendpose( var_2 ) )
var_6 = 0.2;
else
var_6 = 0.4;
self clearanim( var_8, var_6 );
self setflaggedanim( "shuffle_end", var_9, 1, var_6 );
animscripts\shared::donotetracks( "shuffle_end" );
}
self safeteleport( var_2.origin );
self animmode( "normal" );
self.shufflemoveinterrupted = undefined;
}
movecovertocoverfinish()
{
if ( isdefined( self.shufflemoveinterrupted ) )
{
self clearanim( %cover_shuffle, 0.2 );
self.shufflemoveinterrupted = undefined;
self animmode( "none", 0 );
self orientmode( "face default" );
}
else
{
wait 0.2;
self clearanim( %cover_shuffle, 0.2 );
}
}
movedoorsidetoside( var_0, var_1, var_2 )
{
var_3 = undefined;
if ( var_1.type == "Cover Right" && var_2.type == "Cover Left" && !var_0 )
var_3 = %corner_standr_door_r2l;
else if ( var_1.type == "Cover Left" && var_2.type == "Cover Right" && var_0 )
var_3 = %corner_standl_door_l2r;
if ( !isdefined( var_3 ) )
return 0;
self animmode( "zonly_physics", 0 );
self orientmode( "face current" );
self setflaggedanimrestart( "sideToSide", var_3, 1, 0.2 );
animscripts\shared::donotetracks( "sideToSide", ::handlesidetosidenotetracks );
var_4 = self getanimtime( var_3 );
var_5 = var_2.origin - var_1.origin;
var_5 = vectornormalize( ( var_5[0], var_5[1], 0 ) );
var_6 = getmovedelta( var_3, var_4, 1 );
var_7 = var_2.origin - self.origin;
var_7 = ( var_7[0], var_7[1], 0 );
var_8 = vectordot( var_7, var_5 ) - abs( var_6[1] );
if ( var_8 > 2 )
{
var_9 = getnotetracktimes( var_3, "slide_end" )[0];
var_10 = ( var_9 - var_4 ) * getanimlength( var_3 );
var_11 = int( ceil( var_10 / 0.05 ) );
var_12 = var_5 * var_8 / var_11;
thread slidefortime( var_12, var_11 );
}
animscripts\shared::donotetracks( "sideToSide" );
self safeteleport( var_2.origin );
self animmode( "none" );
self orientmode( "face default" );
self.shufflemoveinterrupted = undefined;
wait 0.2;
return 1;
}
handlesidetosidenotetracks( var_0 )
{
if ( var_0 == "slide_start" )
return 1;
}
slidefortime( var_0, var_1 )
{
self endon( "killanimscript" );
self endon( "goal_changed" );
while ( var_1 > 0 )
{
self safeteleport( self.origin + var_0 );
var_1--;
wait 0.05;
}
}
movestand_moveoverride( var_0, var_1 )
{
self endon( "movemode" );
self clearanim( %combatrun, 0.6 );
self setanimknoball( %combatrun, %body, 1, 0.5, self.moveplaybackrate );
if ( isdefined( self.requestreacttobullet ) && gettime() - self.requestreacttobullet < 100 && isdefined( self.run_overridebulletreact ) && randomfloat( 1 ) < self.a.reacttobulletchance )
{
animscripts\run::customrunningreacttobullets();
return;
}
if ( isarray( var_0 ) )
{
if ( isdefined( self.run_override_weights ) )
var_2 = common_scripts\utility::choose_from_weighted_array( var_0, var_1 );
else
var_2 = var_0[randomint( var_0.size )];
}
else
var_2 = var_0;
self setflaggedanimknob( "moveanim", var_2, 1, 0.2, self.moveplaybackrate );
animscripts\shared::donotetracks( "moveanim" );
}
listenforcoverapproach()
{
thread animscripts\cover_arrival::setupapproachnode( 1 );
}