149 lines
3.9 KiB
Plaintext
149 lines
3.9 KiB
Plaintext
#include animscripts\Utility;
|
|
#using_animtree( "generic_human" );
|
|
|
|
// Grenade_return_throw
|
|
// Picks up a grenade from 32 units in front of the character, and throws it.
|
|
|
|
main()
|
|
{
|
|
/#
|
|
if ( getdvar( "scr_forcegrenadecower" ) == "on" && isdefined( self.grenade ) )
|
|
{
|
|
self OrientMode( "face angle", randomfloat( 360 ) );
|
|
self animmode( "gravity" );
|
|
wait .2;
|
|
animscripts\grenade_cower::main();
|
|
return;
|
|
}
|
|
#/
|
|
|
|
self orientMode( "face default" );
|
|
self endon( "killanimscript" );
|
|
|
|
animscripts\utility::initialize( "grenade_return_throw" );
|
|
|
|
self animMode( "zonly_physics" );// Unlatch the feet
|
|
|
|
throwAnim = undefined;
|
|
|
|
throwDist = 1000;
|
|
if ( isdefined( self.enemy ) )
|
|
throwDist = distance( self.origin, self.enemy.origin );
|
|
|
|
// unused: grenade_return_running_kick_forward_1; kicks don't read well to player
|
|
// unused: grenade_return_running_kick_forward_2
|
|
// unused: %grenade_return_standing_throw_forward_2; similar to other ones
|
|
|
|
animArray = [];
|
|
if ( throwDist < 600 && isLowThrowSafe() )
|
|
{
|
|
if ( throwDist < 300 )
|
|
{
|
|
// really short range
|
|
animArray[ 0 ] = %grenade_return_running_throw_forward;
|
|
animArray[ 1 ] = %grenade_return_standing_throw_forward_1;
|
|
}
|
|
else
|
|
{
|
|
// long range
|
|
animArray[ 0 ] = %grenade_return_running_throw_forward;
|
|
animArray[ 1 ] = %grenade_return_standing_throw_overhand_forward;
|
|
}
|
|
}
|
|
|
|
if ( animArray.size == 0 )
|
|
{
|
|
// really long range or can't do low throw
|
|
animArray[ 0 ] = %grenade_return_standing_throw_overhand_forward;
|
|
}
|
|
|
|
assert( animArray.size );
|
|
throwAnim = animArray[ randomint( animArray.size ) ];
|
|
|
|
/#
|
|
if ( getdvar( "scr_grenadereturnanim" ) != "" )
|
|
{
|
|
val = getdvar( "scr_grenadereturnanim" );
|
|
//if ( val == "kick1")
|
|
// throwAnim = %grenade_return_running_kick_forward_1;
|
|
//else if ( val == "kick2")
|
|
// throwAnim = %grenade_return_running_kick_forward_2;
|
|
//else
|
|
if ( val == "throw1" )
|
|
throwAnim = %grenade_return_running_throw_forward;
|
|
else if ( val == "throw2" )
|
|
throwAnim = %grenade_return_standing_throw_forward_1;
|
|
//else if ( val == "throw3")
|
|
// throwAnim = %grenade_return_standing_throw_forward_2;
|
|
else if ( val == "throw4" )
|
|
throwAnim = %grenade_return_standing_throw_overhand_forward;
|
|
}
|
|
#/
|
|
|
|
assert( isdefined( throwAnim ) );
|
|
self setFlaggedAnimKnoballRestart( "throwanim", throwAnim, %body, 1, .3 );
|
|
|
|
hasPickup = ( animHasNotetrack( throwAnim, "grenade_left" ) || animHasNotetrack( throwAnim, "grenade_right" ) );
|
|
if ( hasPickup )
|
|
{
|
|
self animscripts\shared::placeWeaponOn( self.weapon, "left" );
|
|
self thread putWeaponBackInRightHand();
|
|
|
|
self thread notifyGrenadePickup( "throwanim", "grenade_left" );
|
|
self thread notifyGrenadePickup( "throwanim", "grenade_right" );
|
|
self waittill( "grenade_pickup" );
|
|
self pickUpGrenade();
|
|
|
|
self animscripts\battleChatter_ai::evaluateAttackEvent( "grenade" );
|
|
|
|
self waittillmatch( "throwanim", "grenade_throw" );
|
|
}
|
|
else
|
|
{
|
|
// kick animations don't have pickup.
|
|
self waittillmatch( "throwanim", "grenade_throw" );
|
|
self pickUpGrenade();
|
|
|
|
self animscripts\battleChatter_ai::evaluateAttackEvent( "grenade" );
|
|
}
|
|
|
|
if ( isDefined( self.grenade ) ) // it may have exploded and we may have magic bullet shield
|
|
self throwGrenade();
|
|
|
|
// TODO: replace with a notetrack?
|
|
wait 1;
|
|
|
|
if ( hasPickup )
|
|
{
|
|
self notify( "put_weapon_back_in_right_hand" );
|
|
self animscripts\shared::placeWeaponOn( self.weapon, "right" );
|
|
}
|
|
}
|
|
|
|
isLowThrowSafe()
|
|
{
|
|
start = ( self.origin[ 0 ], self.origin[ 1 ], self.origin[ 2 ] + 20 );
|
|
end = start + anglesToForward( self.angles ) * 50;
|
|
|
|
return sightTracePassed( start, end, false, undefined );
|
|
}
|
|
|
|
putWeaponBackInRightHand()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "put_weapon_back_in_right_hand" );
|
|
|
|
self waittill( "killanimscript" );
|
|
|
|
self animscripts\shared::placeWeaponOn( self.weapon, "right" );
|
|
}
|
|
|
|
notifyGrenadePickup( animFlag, notetrack )
|
|
{
|
|
self endon( "killanimscript" );
|
|
self endon( "grenade_pickup" );
|
|
|
|
self waittillmatch( animFlag, notetrack );
|
|
self notify( "grenade_pickup" );
|
|
}
|