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

1405 lines
35 KiB
Plaintext

// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
#using_animtree("generic_human");
init_animset_combat()
{
var_0 = [];
var_0["surprise_stop"] = %surprise_stop_v1;
var_0["trans_to_combat"] = %casual_stand_idle_trans_out;
var_0["drop_rpg_stand"] = %rpg_stand_throw;
var_0["drop_rpg_crouch"] = %rpg_crouch_throw;
var_0["pistol_to_primary"] = %pistol_stand_switch;
var_0["primary_to_pistol"] = %pistol_stand_pullout;
var_0["rpg_death"] = %rpg_stand_death;
var_0["rpg_death_stagger"] = %rpg_stand_death_stagger;
anim.archetypes["soldier"]["combat"] = var_0;
}
main()
{
if ( isdefined( self.no_ai ) )
return;
if ( isdefined( self.custom_animscript ) )
{
if ( isdefined( self.custom_animscript["combat"] ) )
{
[[ self.custom_animscript["combat"] ]]();
return;
}
}
self endon( "killanimscript" );
[[ self.exception["exposed"] ]]();
animscripts\utility::initialize( "combat" );
self.a.arrivaltype = undefined;
if ( isdefined( self.node ) && self.node.type == "Ambush" && self nearnode( self.node ) )
self.ambushnode = self.node;
transitiontocombat();
dofriendlyfirereaction();
if ( isdefined( self.specialidleanim ) )
animscripts\stop::specialidleloop();
setup();
exposedcombatmainloop();
self notify( "stop_deciding_how_to_shoot" );
}
end_script()
{
self.ambushnode = undefined;
combat_clearfacialanim();
}
dofriendlyfirereaction()
{
if ( self.team != "allies" )
return;
if ( self ismovesuppressed() && self.prevscript == "move" && self.a.pose == "stand" && !isdefined( self.disablefriendlyfirereaction ) )
{
if ( isdefined( self.enemy ) && distancesquared( self.origin, self.enemy.origin ) < squared( 128 ) )
return;
if ( !isdefined( self.a.array ) )
return;
if ( isdefined( self.a.array["surprise_stop"] ) )
var_0 = animscripts\utility::animarray( "surprise_stop" );
else if ( self.swimmer )
{
var_0 = animscripts\swim::getswimanim( "surprise_stop" );
if ( !isdefined( var_0 ) )
return;
}
else
var_0 = animscripts\utility::lookupanim( "combat", "surprise_stop" );
resetanimmode();
self setflaggedanimknoballrestart( "react", var_0, %root, 1, 0.2, self.animplaybackrate );
combat_playfacialanim( var_0, "run" );
animscripts\shared::donotetracks( "react" );
}
}
transitiontocombat()
{
if ( isdefined( self.specialidleanim ) || isdefined( self.customidleanimset ) )
return;
if ( isdefined( self.enemy ) && distancesquared( self.origin, self.enemy.origin ) < 262144 )
return;
if ( self.prevscript == "stop" && !animscripts\utility::iscqbwalking() && self.a.pose == "stand" )
{
resetanimmode();
var_0 = animscripts\utility::lookupanim( "combat", "trans_to_combat" );
self setflaggedanimknoballrestart( "transition", var_0, %root, 1, 0.2, 1.2 * self.animplaybackrate );
combat_playfacialanim( var_0, "run" );
animscripts\shared::donotetracks( "transition" );
}
}
setup_anim_array()
{
if ( self.a.pose == "stand" )
animscripts\animset::set_animarray_standing();
else if ( self.a.pose == "crouch" )
animscripts\animset::set_animarray_crouching();
else if ( self.a.pose == "prone" )
animscripts\animset::set_animarray_prone();
else
{
}
}
setup()
{
if ( animscripts\utility::usingsidearm() && self isstanceallowed( "stand" ) )
transitionto( "stand" );
setup_anim_array();
set_aim_and_turn_limits();
thread stopshortly();
self.previouspitchdelta = 0.0;
self clearanim( %root, 0.2 );
animscripts\combat_utility::setupaim( 0.2 );
thread animscripts\combat_utility::aimidlethread();
self.a.meleestate = "aim";
delaystandardmelee();
}
stopshortly()
{
self endon( "killanimscript" );
wait 0.2;
self.a.movement = "stop";
}
set_default_swimmer_aim_limits()
{
if ( self.swimmer )
{
if ( animscripts\utility::isspaceai() )
{
self.upaimlimit = 90;
self.downaimlimit = -90;
self.rightaimlimit = 45;
self.leftaimlimit = -45;
}
else
{
self.upaimlimit = 90;
self.downaimlimit = -120;
}
}
}
set_default_aim_limits( var_0 )
{
if ( isdefined( var_0 ) )
self setdefaultaimlimits( var_0 );
else
self setdefaultaimlimits();
set_default_swimmer_aim_limits();
}
set_aim_and_turn_limits()
{
set_default_aim_limits();
if ( self.a.pose == "stand" && !self.swimmer )
{
self.upaimlimit = 60;
self.downaimlimit = -60;
}
self.turnthreshold = self.defaultturnthreshold;
}
setupexposedcombatloop()
{
thread animscripts\track::trackshootentorpos();
thread reacquirewhennecessary();
thread animscripts\shoot_behavior::decidewhatandhowtoshoot( "normal" );
thread watchshootentvelocity();
resetgiveuponenemytime();
if ( isdefined( self.a.magicreloadwhenreachenemy ) )
{
animscripts\weaponlist::refillclip();
self.a.magicreloadwhenreachenemy = undefined;
}
self.a.dontcrouchtime = gettime() + randomintrange( 500, 1500 );
}
exposedcombatstopusingrpgcheck( var_0 )
{
if ( animscripts\utility::usingrocketlauncher() && animscripts\utility::shoulddroprocketlauncher( var_0 ) )
{
if ( self.a.pose != "stand" && self.a.pose != "crouch" )
transitionto( "crouch" );
if ( self.a.pose == "stand" )
animscripts\shared::throwdownweapon( animscripts\utility::lookupanim( "combat", "drop_rpg_stand" ) );
else
animscripts\shared::throwdownweapon( animscripts\utility::lookupanim( "combat", "drop_rpg_crouch" ) );
self clearanim( %root, 0.2 );
animscripts\combat_utility::endfireandanimidlethread();
setup_anim_array();
animscripts\combat_utility::startfireandaimidlethread();
return 1;
}
return 0;
}
exposedcombatcheckstance( var_0 )
{
if ( self.a.pose != "stand" && self isstanceallowed( "stand" ) )
{
if ( var_0 < 81225 )
{
transitionto( "stand" );
return 1;
}
if ( standifmakesenemyvisible() )
return 1;
}
if ( var_0 > 262144 && self.a.pose != "crouch" && self isstanceallowed( "crouch" ) && !self.swimmer && !animscripts\utility::usingsidearm() && !isdefined( self.heat ) && gettime() >= self.a.dontcrouchtime && lengthsquared( self.shootentvelocity ) < 10000 )
{
if ( !isdefined( self.shootpos ) || sighttracepassed( self.origin + ( 0, 0, 36 ), self.shootpos, 0, undefined ) )
{
transitionto( "crouch" );
return 1;
}
}
return 0;
}
exposedcombatcheckreloadorusepistol( var_0 )
{
if ( !animscripts\utility::usingsidearm() )
{
if ( isdefined( self.forcesidearm ) && self.a.pose == "stand" )
{
if ( tryusingsidearm() )
return 1;
}
if ( animscripts\combat_utility::issniper() && var_0 < 167772.0 )
{
if ( tryusingsidearm() )
return 1;
}
}
if ( animscripts\combat_utility::needtoreload( 0 ) )
{
if ( !animscripts\utility::usingsidearm() && common_scripts\utility::cointoss() && !animscripts\utility::usingrocketlauncher() && animscripts\utility::usingprimary() && var_0 < 167772.0 && self isstanceallowed( "stand" ) )
{
if ( self.a.pose != "stand" )
{
transitionto( "stand" );
return 1;
}
if ( tryusingsidearm() )
return 1;
}
if ( exposedreload( 0 ) )
return 1;
}
return 0;
}
exposedcombatcheckputawaypistol( var_0 )
{
if ( animscripts\utility::usingsidearm() && self.a.pose == "stand" && !isdefined( self.forcesidearm ) )
{
if ( var_0 > 262144 || self.combatmode == "ambush_nodes_only" && ( !isdefined( self.enemy ) || !self cansee( self.enemy ) ) )
switchtolastweapon( animscripts\utility::lookupanim( "combat", "pistol_to_primary" ) );
}
}
exposedcombatpositionadjust()
{
if ( isdefined( self.heat ) && self nearclaimnodeandangle() )
self safeteleport( self.nodeoffsetpos, self.node.angles );
}
exposedcombatneedtoturn()
{
if ( needtoturn() )
{
var_0 = 0.25;
if ( isdefined( self.shootent ) && !issentient( self.shootent ) )
var_0 = 1.5;
var_1 = animscripts\shared::getpredictedaimyawtoshootentorpos( var_0 );
if ( turntofacerelativeyaw( var_1 ) )
return 1;
}
return 0;
}
exposedcombatmainloop()
{
self endon( "killanimscript" );
setupexposedcombatloop();
resetanimmode( 0 );
if ( animscripts\utility::isspaceai() )
{
var_0 = ( 0, self.angles[1], 0 );
self orientmode( "face angle 3d", var_0 );
}
else
self orientmode( "face angle", self.angles[1] );
for (;;)
{
if ( animscripts\utility::usingrocketlauncher() )
self.deathfunction = undefined;
animscripts\utility::updateisincombattimer();
if ( waitforstancechange() )
continue;
trymelee();
exposedcombatpositionadjust();
if ( !isdefined( self.shootpos ) )
{
cantseeenemybehavior();
continue;
}
resetgiveuponenemytime();
var_1 = lengthsquared( self.origin - self.shootpos );
if ( exposedcombatstopusingrpgcheck( var_1 ) )
continue;
if ( exposedcombatneedtoturn() )
continue;
if ( considerthrowgrenade() )
continue;
if ( exposedcombatcheckreloadorusepistol( var_1 ) )
continue;
if ( animscripts\utility::usingrocketlauncher() && self.a.pose != "crouch" && randomfloat( 1 ) > 0.65 )
self.deathfunction = ::rpgdeath;
exposedcombatcheckputawaypistol( var_1 );
if ( exposedcombatcheckstance( var_1 ) )
continue;
if ( animscripts\combat_utility::aimedatshootentorpos() )
{
shootuntilneedtoturn();
animscripts\combat_utility::hidefireshowaimidle();
continue;
}
exposedwait();
}
}
exposedwait()
{
if ( !isdefined( self.enemy ) || !self cansee( self.enemy ) )
{
self endon( "enemy" );
self endon( "shoot_behavior_change" );
wait( 0.2 + randomfloat( 0.1 ) );
self waittill( "do_slow_things" );
}
else
wait 0.05;
}
standifmakesenemyvisible()
{
if ( isdefined( self.enemy ) && ( !self cansee( self.enemy ) || !self canshootenemy() ) && sighttracepassed( self.origin + ( 0, 0, 64 ), self.enemy getshootatpos(), 0, undefined ) )
{
self.a.dontcrouchtime = gettime() + 3000;
transitionto( "stand" );
return 1;
}
return 0;
}
needtoturn()
{
var_0 = self.shootpos;
if ( !isdefined( var_0 ) )
return 0;
var_1 = self.angles[1] - vectortoyaw( var_0 - self.origin );
var_2 = distancesquared( self.origin, var_0 );
if ( var_2 < 65536 )
{
var_3 = sqrt( var_2 );
if ( var_3 > 3 )
var_1 = var_1 + asin( -3 / var_3 );
}
return animscripts\utility::absangleclamp180( var_1 ) > self.turnthreshold;
}
waitforstancechange()
{
var_0 = self.a.pose;
if ( isdefined( self.a.onback ) )
{
wait 0.1;
return 1;
}
if ( var_0 == "stand" && isdefined( self.heat ) )
return 0;
if ( !self isstanceallowed( var_0 ) )
{
var_1 = "crouch";
if ( var_0 == "crouch" )
var_1 = "stand";
var_2 = "prone";
if ( var_0 == "prone" )
{
var_1 = "stand";
var_2 = "crouch";
}
if ( self isstanceallowed( var_1 ) )
{
if ( var_0 == "stand" && animscripts\utility::usingsidearm() )
return 0;
transitionto( var_1 );
return 1;
}
else if ( self isstanceallowed( var_2 ) )
{
if ( var_0 == "stand" && animscripts\utility::usingsidearm() )
return 0;
transitionto( var_2 );
return 1;
}
else
{
}
}
return 0;
}
cantseeenemybehavior()
{
if ( self.a.pose != "stand" && self isstanceallowed( "stand" ) && standifmakesenemyvisible() )
return 1;
var_0 = gettime();
self.a.dontcrouchtime = var_0 + 1500;
if ( isdefined( self.group ) && isdefined( self.group.forward ) )
{
var_1 = angleclamp180( self.angles[1] - vectortoyaw( self.group.forward ) );
if ( turntofacerelativeyaw( var_1 ) )
return 1;
}
if ( isdefined( self.node ) && isdefined( anim.iscombatscriptnode[self.node.type] ) )
{
var_1 = angleclamp180( self.angles[1] - self.node.angles[1] );
if ( turntofacerelativeyaw( var_1 ) )
return 1;
}
else if ( isdefined( self.enemy ) && self seerecently( self.enemy, 2 ) || var_0 > self.a.scriptstarttime + 1200 )
{
var_1 = undefined;
var_2 = self getanglestolikelyenemypath();
if ( isdefined( var_2 ) )
var_1 = angleclamp180( self.angles[1] - var_2[1] );
else if ( isdefined( self.node ) )
var_1 = angleclamp180( self.angles[1] - self.node.angles[1] );
else if ( isdefined( self.enemy ) )
{
var_2 = vectortoangles( self lastknownpos( self.enemy ) - self.origin );
var_1 = angleclamp180( self.angles[1] - var_2[1] );
}
if ( isdefined( var_1 ) && turntofacerelativeyaw( var_1 ) )
return 1;
}
else if ( isdefined( self.heat ) && self nearclaimnode() )
{
var_1 = angleclamp180( self.angles[1] - self.node.angles[1] );
if ( turntofacerelativeyaw( var_1 ) )
return 1;
}
if ( considerthrowgrenade() )
return 1;
var_3 = self.a.nextgiveuponenemytime < var_0;
var_4 = 0;
if ( var_3 )
var_4 = 0.99999;
if ( exposedreload( var_4 ) )
return 1;
if ( var_3 && animscripts\utility::usingsidearm() )
{
if ( switchtolastweapon( animscripts\utility::lookupanim( "combat", "pistol_to_primary" ) ) )
return 1;
}
cantseeenemywait();
return 1;
}
cantseeenemywait()
{
self endon( "shoot_behavior_change" );
wait( 0.4 + randomfloat( 0.4 ) );
self waittill( "do_slow_things" );
}
resetgiveuponenemytime()
{
self.a.nextgiveuponenemytime = gettime() + randomintrange( 2000, 4000 );
}
turntofacerelativeyaw( var_0 )
{
if ( var_0 < 0 - self.turnthreshold )
{
if ( self.a.pose == "prone" )
{
animscripts\cover_prone::proneto( "crouch" );
animscripts\animset::set_animarray_crouching();
}
doturn( "left", 0 - var_0 );
maps\_gameskill::didsomethingotherthanshooting();
return 1;
}
if ( var_0 > self.turnthreshold )
{
if ( self.a.pose == "prone" )
{
animscripts\cover_prone::proneto( "crouch" );
animscripts\animset::set_animarray_crouching();
}
doturn( "right", var_0 );
maps\_gameskill::didsomethingotherthanshooting();
return 1;
}
return 0;
}
watchshootentvelocity()
{
self endon( "killanimscript" );
self.shootentvelocity = ( 0, 0, 0 );
var_0 = undefined;
var_1 = self.origin;
var_2 = 0.15;
for (;;)
{
if ( isdefined( self.shootent ) && isdefined( var_0 ) && self.shootent == var_0 )
{
var_3 = self.shootent.origin;
self.shootentvelocity = ( var_3 - var_1 ) * ( 1 / var_2 );
var_1 = var_3;
}
else
{
if ( isdefined( self.shootent ) )
var_1 = self.shootent.origin;
else
var_1 = self.origin;
var_0 = self.shootent;
self.shootentvelocity = ( 0, 0, 0 );
}
wait( var_2 );
}
}
shouldswapshotgun()
{
return 0;
}
donotetrackswithendon( var_0 )
{
self endon( "killanimscript" );
animscripts\shared::donotetracks( var_0 );
}
faceenemyimmediately()
{
self endon( "killanimscript" );
self notify( "facing_enemy_immediately" );
self endon( "facing_enemy_immediately" );
var_0 = 5;
for (;;)
{
var_1 = 0 - animscripts\utility::getyawtoenemy();
if ( abs( var_1 ) < 2 )
break;
if ( abs( var_1 ) > var_0 )
var_1 = var_0 * common_scripts\utility::sign( var_1 );
self orientmode( "face angle", self.angles[1] + var_1 );
wait 0.05;
}
self orientmode( "face current" );
self notify( "can_stop_turning" );
}
isdeltaallowed( var_0 )
{
var_1 = getmovedelta( var_0, 0, 1 );
var_2 = self localtoworldcoords( var_1 );
return self isingoal( var_2 ) && self maymovetopoint( var_2 );
}
isanimdeltaingoal( var_0 )
{
var_1 = getmovedelta( var_0, 0, 1 );
var_2 = self localtoworldcoords( var_1 );
return self isingoal( var_2 );
}
doturn( var_0, var_1 )
{
var_2 = isdefined( self.shootpos );
var_3 = 1;
var_4 = 0.2;
var_5 = isdefined( self.enemy ) && !isdefined( self.turntomatchnode ) && self seerecently( self.enemy, 2 ) && distancesquared( self.enemy.origin, self.origin ) < 262144;
if ( self.a.scriptstarttime + 500 > gettime() )
{
var_4 = 0.25;
if ( var_5 )
thread faceenemyimmediately();
}
else if ( var_5 )
{
var_6 = 1.0 - distance( self.enemy.origin, self.origin ) / 512;
var_3 = 1 + var_6 * 1;
if ( var_3 > 2 )
var_4 = 0.05;
else if ( var_3 > 1.3 )
var_4 = 0.1;
else
var_4 = 0.15;
}
var_7 = 0;
if ( var_1 > 157.5 )
var_7 = 180;
else if ( var_1 > 112.5 )
var_7 = 135;
else if ( var_1 > 67.5 )
var_7 = 90;
else
var_7 = 45;
var_8 = "turn_" + var_0 + "_" + var_7;
var_9 = animscripts\utility::animarray( var_8 );
if ( isdefined( self.turntomatchnode ) )
self animmode( "angle deltas", 0 );
else if ( isdefined( self.node ) && isdefined( anim.iscombatpathnode[self.node.type] ) && distancesquared( self.origin, self.node.origin ) < 256 )
self animmode( "angle deltas", 0 );
else if ( isanimdeltaingoal( var_9 ) )
resetanimmode();
else
self animmode( "angle deltas", 0 );
self setanimknoball( %exposed_aiming, %body, 1, var_4 );
if ( !isdefined( self.turntomatchnode ) )
turningaimingon( var_4 );
self setanimlimited( %turn, 1, var_4 );
if ( isdefined( self.heat ) )
var_3 = min( 1.0, var_3 );
else if ( isdefined( self.turntomatchnode ) )
var_3 = max( 1.5, var_3 );
self setflaggedanimknoblimitedrestart( "turn", var_9, 1, var_4, var_3 );
combat_playfacialanim( var_9, "aim" );
self notify( "turning" );
if ( var_2 && !isdefined( self.turntomatchnode ) && !isdefined( self.heat ) )
thread shootwhileturning();
doturnnotetracks();
self setanimlimited( %turn, 0, 0.2 );
if ( !isdefined( self.turntomatchnode ) )
turningaimingoff( 0.2 );
if ( !isdefined( self.turntomatchnode ) )
{
self clearanim( %turn, 0.2 );
self setanimknob( %exposed_aiming, 1, 0.2, 1 );
}
else
self clearanim( %exposed_modern, 0.3 );
if ( isdefined( self.turnlastresort ) )
{
self.turnlastresort = undefined;
thread faceenemyimmediately();
}
resetanimmode( 0 );
self notify( "done turning" );
}
doturnnotetracks()
{
self endon( "can_stop_turning" );
animscripts\shared::donotetracks( "turn" );
}
makesureturnworks()
{
self endon( "killanimscript" );
self endon( "done turning" );
var_0 = self.angles[1];
wait 0.3;
if ( self.angles[1] == var_0 )
{
self notify( "turning_isnt_working" );
self.turnlastresort = 1;
}
}
turningaimingon( var_0 )
{
self setanimlimited( animscripts\utility::animarray( "straight_level" ), 0, var_0 );
self setanim( %add_idle, 0, var_0 );
if ( !animscripts\utility::weapon_pump_action_shotgun() )
self clearanim( %add_fire, 0.2 );
}
turningaimingoff( var_0 )
{
self setanimlimited( animscripts\utility::animarray( "straight_level" ), 1, var_0 );
self setanim( %add_idle, 1, var_0 );
}
shootwhileturning()
{
self endon( "killanimscript" );
self endon( "done turning" );
if ( animscripts\utility::usingrocketlauncher() )
return;
animscripts\combat_utility::shootuntilshootbehaviorchange();
self clearanim( %add_fire, 0.2 );
}
shootuntilneedtoturn()
{
thread watchforneedtoturnortimeout();
self endon( "need_to_turn" );
thread keeptryingtomelee();
animscripts\combat_utility::shootuntilshootbehaviorchange();
self notify( "stop_watching_for_need_to_turn" );
self notify( "stop_trying_to_melee" );
}
watchforneedtoturnortimeout()
{
self endon( "killanimscript" );
self endon( "stop_watching_for_need_to_turn" );
var_0 = gettime() + 4000 + randomint( 2000 );
for (;;)
{
if ( gettime() > var_0 || needtoturn() )
{
self notify( "need_to_turn" );
break;
}
wait 0.1;
}
}
considerthrowgrenade()
{
if ( !animscripts\combat_utility::mygrenadecooldownelapsed() )
return 0;
if ( isdefined( anim.throwgrenadeatplayerasap ) && isalive( level.player ) )
{
if ( tryexposedthrowgrenade( level.player, 200 ) )
return 1;
}
if ( isdefined( self.enemy ) && tryexposedthrowgrenade( self.enemy, self.minexposedgrenadedist ) )
return 1;
self.a.nextgrenadetrytime = gettime() + 500;
return 0;
}
tryexposedthrowgrenade( var_0, var_1 )
{
var_2 = 0;
if ( isdefined( self.dontevershoot ) || isdefined( var_0.dontattackme ) )
return 0;
if ( !isdefined( self.a.array["exposed_grenade"] ) )
return 0;
var_3 = var_0.origin;
if ( !self cansee( var_0 ) )
{
if ( isdefined( self.enemy ) && var_0 == self.enemy && isdefined( self.shootpos ) )
var_3 = self.shootpos;
}
if ( !self cansee( var_0 ) )
var_1 = 100;
if ( distancesquared( self.origin, var_3 ) > var_1 * var_1 && self.a.pose == self.a.grenadethrowpose )
{
animscripts\combat_utility::setactivegrenadetimer( var_0 );
if ( !animscripts\combat_utility::grenadecooldownelapsed( var_0 ) )
return 0;
var_4 = animscripts\utility::getyawtospot( var_3 );
if ( abs( var_4 ) < 60 )
{
var_5 = [];
foreach ( var_7 in self.a.array["exposed_grenade"] )
{
if ( isdeltaallowed( var_7 ) )
var_5[var_5.size] = var_7;
}
if ( var_5.size > 0 )
{
self setanim( %exposed_aiming, 0, 0.1 );
combat_clearfacialanim();
self animmode( "zonly_physics" );
animscripts\track::setanimaimweight( 0, 0 );
var_2 = animscripts\combat_utility::trygrenade( var_0, var_5[randomint( var_5.size )] );
self setanim( %exposed_aiming, 1, 0.1 );
combat_playfacialanim( undefined, "aim" );
if ( var_2 )
animscripts\track::setanimaimweight( 1, 0.5 );
else
animscripts\track::setanimaimweight( 1, 0 );
}
}
}
if ( var_2 )
maps\_gameskill::didsomethingotherthanshooting();
return var_2;
}
transitionto( var_0 )
{
if ( var_0 == self.a.pose )
return;
var_1 = self.a.pose + "_2_" + var_0;
if ( !isdefined( self.a.array ) )
return;
var_2 = self.a.array[var_1];
if ( !isdefined( var_2 ) )
return;
self clearanim( %root, 0.3 );
animscripts\combat_utility::endfireandanimidlethread();
if ( var_0 == "stand" )
var_3 = 2;
else
var_3 = 1.5;
if ( !animhasnotetrack( var_2, "anim_pose = \"" + var_0 + "\"" ) )
{
}
self setflaggedanimknoballrestart( "trans", var_2, %body, 1, 0.2, var_3 );
combat_playfacialanim( var_2, "run" );
var_4 = getanimlength( var_2 ) / var_3;
var_5 = var_4 - 0.3;
if ( var_5 < 0.2 )
var_5 = 0.2;
animscripts\notetracks::donotetracksfortime( var_5, "trans" );
self.a.pose = var_0;
setup_anim_array();
animscripts\combat_utility::startfireandaimidlethread();
maps\_gameskill::didsomethingotherthanshooting();
}
keeptryingtomelee()
{
self endon( "killanimscript" );
self endon( "stop_trying_to_melee" );
self endon( "done turning" );
self endon( "need_to_turn" );
self endon( "shoot_behavior_change" );
for (;;)
{
wait( 0.2 + randomfloat( 0.3 ) );
if ( isdefined( self.enemy ) )
{
if ( isplayer( self.enemy ) )
var_0 = 40000;
else
var_0 = 10000;
if ( distancesquared( self.enemy.origin, self.origin ) < var_0 )
trymelee();
}
}
}
trymelee()
{
animscripts\melee::melee_tryexecuting();
}
delaystandardmelee()
{
if ( isdefined( self.nomeleechargedelay ) )
return;
if ( isplayer( self.enemy ) )
return;
animscripts\melee::melee_standard_delaystandardcharge( self.enemy );
}
exposedreload( var_0 )
{
if ( animscripts\combat_utility::needtoreload( var_0 ) )
{
self.a.exposedreloading = 1;
animscripts\combat_utility::endfireandanimidlethread();
var_1 = undefined;
if ( isdefined( self.specialreloadanimfunc ) )
{
var_1 = self [[ self.specialreloadanimfunc ]]();
self.keepclaimednode = 1;
}
else
{
var_1 = animscripts\utility::animarraypickrandom( "reload" );
if ( self.a.pose == "stand" && animscripts\utility::animarrayanyexist( "reload_crouchhide" ) && common_scripts\utility::cointoss() )
var_1 = animscripts\utility::animarraypickrandom( "reload_crouchhide" );
}
thread keeptryingtomelee();
self.finishedreload = 0;
if ( weaponclass( self.weapon ) == "pistol" )
self orientmode( "face default" );
doreloadanim( var_1, var_0 > 0.05 );
self notify( "abort_reload" );
self orientmode( "face current" );
if ( self.finishedreload )
animscripts\weaponlist::refillclip();
self clearanim( %reload, 0.2 );
self.keepclaimednode = 0;
self notify( "stop_trying_to_melee" );
self.a.exposedreloading = 0;
self.finishedreload = undefined;
maps\_gameskill::didsomethingotherthanshooting();
animscripts\combat_utility::startfireandaimidlethread();
return 1;
}
return 0;
}
doreloadanim( var_0, var_1 )
{
self endon( "abort_reload" );
if ( var_1 )
thread abortreloadwhencanshoot();
var_2 = 1;
if ( !animscripts\utility::usingsidearm() && !animscripts\utility::isshotgun( self.weapon ) && isdefined( self.enemy ) && self cansee( self.enemy ) && distancesquared( self.enemy.origin, self.origin ) < 1048576 )
var_2 = 1.2;
var_3 = "reload_" + animscripts\combat_utility::getuniqueflagnameindex();
self clearanim( %root, 0.2 );
self setflaggedanimrestart( var_3, var_0, 1, 0.2, var_2 );
combat_playfacialanim( var_0, "run" );
thread notifyonstartaim( "abort_reload", var_3 );
self endon( "start_aim" );
animscripts\shared::donotetracks( var_3 );
self.finishedreload = 1;
}
abortreloadwhencanshoot()
{
self endon( "abort_reload" );
self endon( "killanimscript" );
for (;;)
{
if ( isdefined( self.shootent ) && self cansee( self.shootent ) )
break;
wait 0.05;
}
self notify( "abort_reload" );
}
notifyonstartaim( var_0, var_1 )
{
self endon( var_0 );
self waittillmatch( var_1, "start_aim" );
self.finishedreload = 1;
self notify( "start_aim" );
}
finishnotetracks( var_0 )
{
self endon( "killanimscript" );
animscripts\shared::donotetracks( var_0 );
}
drop_turret()
{
maps\_mgturret::dropturret();
animscripts\weaponlist::refillclip();
self.a.needstorechamber = 0;
self notify( "dropped_gun" );
maps\_mgturret::restoredefaults();
}
exception_exposed_mg42_portable()
{
drop_turret();
}
tryusingsidearm()
{
if ( isdefined( self.secondaryweapon ) && animscripts\utility::isshotgun( self.secondaryweapon ) )
return 0;
if ( isdefined( self.no_pistol_switch ) )
return 0;
self.a.pose = "stand";
switchtosidearm( animscripts\utility::lookupanim( "combat", "primary_to_pistol" ) );
return 1;
}
switchtosidearm( var_0 )
{
self endon( "killanimscript" );
thread animscripts\combat_utility::putgunbackinhandonkillanimscript();
animscripts\combat_utility::endfireandanimidlethread();
self.swapanim = var_0;
self setflaggedanimknoballrestart( "weapon swap", var_0, %body, 1, 0.2, animscripts\combat_utility::fasteranimspeed() );
combat_playfacialanim( var_0, "run" );
donotetrackspostcallbackwithendon( "weapon swap", ::handlepickup, "end_weapon_swap" );
self clearanim( self.swapanim, 0.2 );
self notify( "facing_enemy_immediately" );
self notify( "switched_to_sidearm" );
maps\_gameskill::didsomethingotherthanshooting();
}
donotetrackspostcallbackwithendon( var_0, var_1, var_2 )
{
self endon( var_2 );
animscripts\notetracks::donotetrackspostcallback( var_0, var_1 );
}
faceenemydelay( var_0 )
{
self endon( "killanimscript" );
wait( var_0 );
faceenemyimmediately();
}
handlepickup( var_0 )
{
if ( var_0 == "pistol_pickup" )
{
self clearanim( animscripts\utility::animarray( "straight_level" ), 0 );
animscripts\animset::set_animarray_standing();
thread faceenemydelay( 0.25 );
}
else if ( var_0 == "start_aim" )
{
animscripts\combat_utility::startfireandaimidlethread();
if ( needtoturn() )
self notify( "end_weapon_swap" );
}
}
switchtolastweapon( var_0, var_1 )
{
self endon( "killanimscript" );
if ( animscripts\utility::isshotgun( self.primaryweapon ) && ( isdefined( self.wantshotgun ) && !self.wantshotgun ) && self.lastweapon == animscripts\utility::getaiprimaryweapon() )
return 0;
animscripts\combat_utility::endfireandanimidlethread();
self.swapanim = var_0;
self setflaggedanimknoballrestart( "weapon swap", var_0, %body, 1, 0.1, 1 );
combat_playfacialanim( var_0, "run" );
if ( isdefined( var_1 ) )
donotetrackspostcallbackwithendon( "weapon swap", ::handlecleanupputaway, "end_weapon_swap" );
else
donotetrackspostcallbackwithendon( "weapon swap", ::handleputaway, "end_weapon_swap" );
self clearanim( self.swapanim, 0.2 );
self notify( "switched_to_lastweapon" );
maps\_gameskill::didsomethingotherthanshooting();
return 1;
}
handleputaway( var_0 )
{
if ( var_0 == "pistol_putaway" )
{
self clearanim( animscripts\utility::animarray( "straight_level" ), 0 );
animscripts\animset::set_animarray_standing();
thread animscripts\combat_utility::putgunbackinhandonkillanimscript();
}
else if ( var_0 == "start_aim" )
{
animscripts\combat_utility::startfireandaimidlethread();
if ( needtoturn() )
self notify( "end_weapon_swap" );
}
}
handlecleanupputaway( var_0 )
{
if ( var_0 == "pistol_putaway" )
thread animscripts\combat_utility::putgunbackinhandonkillanimscript();
else if ( issubstr( var_0, "anim_gunhand" ) )
self notify( "end_weapon_swap" );
}
rpgdeath()
{
if ( !animscripts\utility::usingrocketlauncher() || self.bulletsinclip == 0 )
return 0;
if ( randomfloat( 1 ) > 0.5 )
var_0 = animscripts\utility::lookupanim( "combat", "rpg_death" );
else
var_0 = animscripts\utility::lookupanim( "combat", "rpg_death_stagger" );
self setflaggedanimknoball( "deathanim", var_0, %root, 1, 0.05, 1 );
combat_playfacialanim( var_0, "death" );
animscripts\shared::donotetracks( "deathanim" );
animscripts\shared::dropallaiweapons();
return;
}
reacquirewhennecessary()
{
self endon( "killanimscript" );
self.a.exposedreloading = 0;
for (;;)
{
wait 0.2;
if ( isdefined( self.enemy ) && !self seerecently( self.enemy, 2 ) )
{
if ( self.combatmode == "ambush" || self.combatmode == "ambush_nodes_only" )
continue;
}
tryexposedreacquire();
}
}
tryexposedreacquire()
{
if ( self.fixednode )
return;
if ( !isdefined( self.enemy ) )
{
self.reacquire_state = 0;
return;
}
if ( gettime() < self.teammovewaittime )
{
self.reacquire_state = 0;
return;
}
if ( isdefined( self.prevenemy ) && self.prevenemy != self.enemy )
{
self.reacquire_state = 0;
self.prevenemy = undefined;
return;
}
self.prevenemy = self.enemy;
if ( self cansee( self.enemy ) && self canshootenemy() )
{
self.reacquire_state = 0;
return;
}
if ( isdefined( self.finishedreload ) && !self.finishedreload )
{
self.reacquire_state = 0;
return;
}
if ( !isdefined( self.reacquire_without_facing ) || !self.reacquire_without_facing )
{
var_0 = vectornormalize( self.enemy.origin - self.origin );
var_1 = anglestoforward( self.angles );
if ( vectordot( var_0, var_1 ) < 0.5 )
{
self.reacquire_state = 0;
return;
}
}
if ( self.a.exposedreloading && animscripts\combat_utility::needtoreload( 0.25 ) && self.enemy.health > self.enemy.maxhealth * 0.5 )
{
self.reacquire_state = 0;
return;
}
if ( animscripts\combat_utility::shouldhelpadvancingteammate() && self.reacquire_state < 3 )
self.reacquire_state = 3;
switch ( self.reacquire_state )
{
case 0:
if ( self reacquirestep( 32 ) )
return;
break;
case 1:
if ( self reacquirestep( 64 ) )
{
self.reacquire_state = 0;
return;
}
break;
case 2:
if ( self reacquirestep( 96 ) )
{
self.reacquire_state = 0;
return;
}
break;
case 3:
if ( animscripts\combat_utility::tryrunningtoenemy( 0 ) )
{
self.reacquire_state = 0;
return;
}
break;
case 4:
if ( !self cansee( self.enemy ) || !self canshootenemy() )
self flagenemyunattackable();
break;
default:
if ( self.reacquire_state > 15 )
{
self.reacquire_state = 0;
return;
}
break;
}
self.reacquire_state++;
}
resetanimmode( var_0 )
{
var_1 = var_0;
if ( !isdefined( var_1 ) )
var_1 = 1;
if ( self.swimmer )
self animmode( "nogravity", var_1 );
else
self animmode( "zonly_physics", var_1 );
}
combat_playfacialanim( var_0, var_1 )
{
self.facialidx = animscripts\face::playfacialanim( var_0, var_1, self.facialidx );
}
combat_clearfacialanim()
{
self.facialidx = undefined;
self clearanim( %head, 0.2 );
}