I think that proper way is to hook Ham_Player_Jump as post and there check if m_IdealActivity (or m_Activity) is equal to ACT_LEAP and frame (or gaitsequence) is equal to 0.
From HLSDK :
Code:
void CBasePlayer::Jump()
{
Vector vecWallCheckDir;// direction we're tracing a line to find a wall when walljumping
Vector vecAdjustedVelocity;
Vector vecSpot;
TraceResult tr;
if (FBitSet(pev->flags, FL_WATERJUMP))
return;
if (pev->waterlevel >= 2)
{
return;
}
// jump velocity is sqrt( height * gravity * 2)
// If this isn't the first frame pressing the jump button, break out.
if ( !FBitSet( m_afButtonPressed, IN_JUMP ) )
return; // don't pogo stick
if ( !(pev->flags & FL_ONGROUND) || !pev->groundentity )
{
return;
}
// many features in this function use v_forward, so makevectors now.
UTIL_MakeVectors (pev->angles);
// ClearBits(pev->flags, FL_ONGROUND); // don't stairwalk
SetAnimation( PLAYER_JUMP );
if ( m_fLongJump &&
(pev->button & IN_DUCK) &&
( pev->flDuckTime > 0 ) &&
pev->velocity.Length() > 50 )
{
SetAnimation( PLAYER_SUPERJUMP );
}
// If you're standing on a conveyor, add it's velocity to yours (for momentum)
entvars_t *pevGround = VARS(pev->groundentity);
if ( pevGround && (pevGround->flags & FL_CONVEYOR) )
{
pev->velocity = pev->velocity + pev->basevelocity;
}
}
Code:
// Set the activity based on an event or current state
void CBasePlayer::SetAnimation( PLAYER_ANIM playerAnim )
{
/* [ ... ] */
switch (m_IdealActivity)
{
case ACT_HOVER:
case ACT_LEAP:
case ACT_SWIM:
case ACT_HOP:
case ACT_DIESIMPLE:
default:
if ( m_Activity == m_IdealActivity)
return;
m_Activity = m_IdealActivity;
animDesired = LookupActivity( m_Activity );
// Already using the desired animation?
if (pev->sequence == animDesired)
return;
pev->gaitsequence = 0;
pev->sequence = animDesired;
pev->frame = 0;
ResetSequenceInfo( );
return;
So in Jump hook post, you come right after SetAnimation( PLAYER_SUPERJUMP ).
__________________