IW4-Dump-Files/animscripts/dog/dog_stop.gsc

130 lines
3.2 KiB
Plaintext

#using_animtree( "dog" );
main()
{
self endon( "killanimscript" );
self clearanim( %root, 0.2 );
self clearanim( %german_shepherd_idle, 0.2 );
self clearanim( %german_shepherd_attackidle_knob, 0.2 );
self thread lookAtTarget( "attackIdle" );
while ( 1 )
{
if ( shouldAttackIdle() )
{
self clearanim( %german_shepherd_idle, 0.2 );
self randomAttackIdle();
}
else
{
self orientmode( "face current" );
self clearanim( %german_shepherd_attackidle_knob, 0.2 );
self setflaggedanimrestart( "dog_idle", %german_shepherd_idle, 1, 0.2, self.animplaybackrate );
}
animscripts\shared::DoNoteTracks( "dog_idle" );
}
}
isFacingEnemy( toleranceCosAngle )
{
assert( isdefined( self.enemy ) );
vecToEnemy = self.enemy.origin - self.origin;
distToEnemy = length( vecToEnemy );
if ( distToEnemy < 1 )
return true;
forward = anglesToForward( self.angles );
return( ( forward[ 0 ] * vecToEnemy[ 0 ] ) + ( forward[ 1 ] * vecToEnemy[ 1 ] ) ) / distToEnemy > toleranceCosAngle;
}
randomAttackIdle()
{
if ( isFacingEnemy( -0.5 ) ) // cos120
self orientmode( "face current" );
else
self orientmode( "face enemy" );
self clearanim( %german_shepherd_attackidle_knob, 0.1 );
if ( should_growl() )
{
// just growl
self setflaggedanimrestart( "dog_idle", %german_shepherd_attackidle_growl, 1, 0.2, 1 );
return;
}
idleChance = 33;
barkChance = 66;
if ( isdefined( self.mode ) )
{
if ( self.mode == "growl" )
{
idleChance = 15;
barkChance = 30;
}
else if ( self.mode == "bark" )
{
idleChance = 15;
barkChance = 85;
}
}
rand = randomInt( 100 );
if ( rand < idleChance )
self setflaggedanimrestart( "dog_idle", %german_shepherd_attackidle, 1, 0.2, self.animplaybackrate );
else if ( rand < barkChance )
self setflaggedanimrestart( "dog_idle", %german_shepherd_attackidle_bark, 1, 0.2, self.animplaybackrate );
else
self setflaggedanimrestart( "dog_idle", %german_shepherd_attackidle_growl, 1, 0.2, self.animplaybackrate );
}
shouldAttackIdle()
{
return( isdefined( self.enemy ) && isalive( self.enemy ) && distanceSquared( self.origin, self.enemy.origin ) < 1000000 );
}
should_growl()
{
if ( isdefined( self.script_growl ) )
return true;
if ( !isalive( self.enemy ) )
return true;
return !( self cansee( self.enemy ) );
}
lookAtTarget( lookPoseSet )
{
self endon( "killanimscript" );
self endon( "stop tracking" );
self clearanim( %german_shepherd_look_2, 0 );
self clearanim( %german_shepherd_look_4, 0 );
self clearanim( %german_shepherd_look_6, 0 );
self clearanim( %german_shepherd_look_8, 0 );
self setDefaultAimLimits();
self.rightAimLimit = 90;
self.leftAimLimit = -90;
self setanimlimited( anim.dogLookPose[ lookPoseSet ][ 2 ], 1, 0 );
self setanimlimited( anim.dogLookPose[ lookPoseSet ][ 4 ], 1, 0 );
self setanimlimited( anim.dogLookPose[ lookPoseSet ][ 6 ], 1, 0 );
self setanimlimited( anim.dogLookPose[ lookPoseSet ][ 8 ], 1, 0 );
self animscripts\shared::setAnimAimWeight( 1, 0.2 );
/#
assert( !isdefined( self.trackLoopThread ) );
self.trackLoopThread = thisthread;
self.trackLoopThreadType = "lookAtTarget";
#/
self animscripts\shared::trackLoop( %german_shepherd_look_2, %german_shepherd_look_4, %german_shepherd_look_6, %german_shepherd_look_8 );
}