1059 lines
30 KiB
Plaintext
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 );
|
|
}
|