//----------------------------------------------------------------------------- // Purpose: bool CPortalPlayerAnimState::HandleJumping( Activity &idealActivity ) { Vector vecVelocity; GetOuterAbsVelocity( vecVelocity ); if ( ( vecVelocity.z > 300.0f || m_bInAirWalk ) ) { // Check to see if we were in an airwalk and now we are basically on the ground. if ( GetBasePlayer()->GetFlags() & FL_ONGROUND ) { m_bInAirWalk = false; RestartMainSequence(); RestartGesture( GESTURE_SLOT_JUMP, ACT_MP_JUMP_LAND ); } else { // In an air walk. idealActivity = ACT_MP_AIRWALK; m_bInAirWalk = true; } } // Jumping. else { if ( m_bJumping ) { if ( m_bFirstJumpFrame ) { m_bFirstJumpFrame = false; RestartMainSequence(); // Reset the animation. } // Don't check if he's on the ground for a sec.. sometimes the client still has the // on-ground flag set right when the message comes in. else if ( gpGlobals->curtime - m_flJumpStartTime > 0.2f ) { if ( GetBasePlayer()->GetFlags() & FL_ONGROUND ) { m_bJumping = false; RestartMainSequence(); RestartGesture( GESTURE_SLOT_JUMP, ACT_MP_JUMP_LAND ); } } // if we're still jumping if ( m_bJumping ) { idealActivity = ACT_MP_JUMP_START; } } } if ( m_bJumping || m_bInAirWalk ) return true; return false; }
//----------------------------------------------------------------------------- // Purpose: // Input : event - //----------------------------------------------------------------------------- void CPortalPlayerAnimState::DoAnimationEvent( PlayerAnimEvent_t event, int nData ) { Activity iWeaponActivity = ACT_INVALID; switch( event ) { case PLAYERANIMEVENT_ATTACK_PRIMARY: case PLAYERANIMEVENT_ATTACK_SECONDARY: { CPortal_Player *pPlayer = GetPortalPlayer(); if ( !pPlayer ) return; CWeaponPortalBase *pWpn = pPlayer->GetActivePortalWeapon(); if ( pWpn ) { // Weapon primary fire. if ( GetBasePlayer()->GetFlags() & FL_DUCKING ) { RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_ATTACK_CROUCH_PRIMARYFIRE ); } else { RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_ATTACK_STAND_PRIMARYFIRE ); } iWeaponActivity = ACT_VM_PRIMARYATTACK; } else // unarmed player { } break; } default: { BaseClass::DoAnimationEvent( event, nData ); break; } } #ifdef CLIENT_DLL // Make the weapon play the animation as well if ( iWeaponActivity != ACT_INVALID ) { CBaseCombatWeapon *pWeapon = GetPortalPlayer()->GetActiveWeapon(); if ( pWeapon ) { pWeapon->SendWeaponAnim( iWeaponActivity ); } } #endif }
//----------------------------------------------------------------------------- // Purpose: bool CSDKPlayerAnimState::HandleJumping( Activity &idealActivity ) { Vector vecVelocity; GetOuterAbsVelocity( vecVelocity ); if ( m_bJumping ) { if ( m_bFirstJumpFrame ) { m_bFirstJumpFrame = false; RestartMainSequence(); // Reset the animation. } // Reset if we hit water and start swimming. if ( m_pSDKPlayer->GetWaterLevel() >= WL_Waist ) { m_bJumping = false; RestartMainSequence(); } // Don't check if he's on the ground for a sec.. sometimes the client still has the // on-ground flag set right when the message comes in. else if ( m_pSDKPlayer->GetCurrentTime() - m_flJumpStartTime > 0.2f ) { if ( m_pSDKPlayer->GetFlags() & FL_ONGROUND ) { m_bJumping = false; RestartMainSequence(); RestartGesture( GESTURE_SLOT_JUMP, ACT_DA_JUMP_LAND ); } } // if we're still jumping if ( m_bJumping ) { if ( m_pSDKPlayer->GetCurrentTime() - m_flJumpStartTime > 0.5 ) idealActivity = ACT_DA_JUMP_FLOAT; else idealActivity = ACT_DA_JUMP_START; } } if (!m_bJumping && !(m_pSDKPlayer->GetFlags() & FL_ONGROUND) && !m_pSDKPlayer->m_Shared.IsSliding () && !m_pSDKPlayer->m_Shared.IsRolling () && m_pSDKPlayer->GetAbsVelocity ().z < -270) { idealActivity = ACT_DA_JUMP_FLOAT; return true; } if ( m_bJumping ) return true; return false; }
//----------------------------------------------------------------------------- // Purpose: // Input : event - //----------------------------------------------------------------------------- void CSDKPlayerAnimState::DoAnimationEvent( PlayerAnimEvent_t event, int nData ) { Activity iGestureActivity = ACT_INVALID; switch( event ) { case PLAYERANIMEVENT_ATTACK_PRIMARY: { // Weapon primary fire. if ( m_pSDKPlayer->m_Shared.IsProne() || m_pSDKPlayer->m_Shared.IsDiveSliding() ) RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_DA_PRIMARYATTACK_PRONE ); else if ( m_pSDKPlayer->m_Shared.IsSliding() ) RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_DA_PRIMARYATTACK_SLIDE ); else if ( m_pSDKPlayer->m_Shared.IsRolling() ) RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_DA_PRIMARYATTACK_ROLL ); else if ( m_pSDKPlayer->m_Shared.IsDiving() ) RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_DA_PRIMARYATTACK_DIVE ); else if ( m_pSDKPlayer->GetFlags() & FL_DUCKING ) RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_DA_PRIMARYATTACK_CROUCH ); else RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_DA_PRIMARYATTACK ); iGestureActivity = ACT_VM_PRIMARYATTACK; break; } case PLAYERANIMEVENT_VOICE_COMMAND_GESTURE: { if ( !IsGestureSlotActive( GESTURE_SLOT_ATTACK_AND_RELOAD ) ) { RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, (Activity)nData ); } iGestureActivity = ACT_VM_IDLE; //TODO? break; } case PLAYERANIMEVENT_ATTACK_SECONDARY: { // Weapon secondary fire. if ( m_pSDKPlayer->m_Shared.IsProne() || m_pSDKPlayer->m_Shared.IsDiveSliding() ) RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_DA_BRAWL_PRONE ); else if ( m_pSDKPlayer->m_Shared.IsSliding() ) RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_DA_BRAWL_SLIDE ); else if ( m_pSDKPlayer->m_Shared.IsRolling() ) RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_DA_BRAWL_ROLL ); else if ( m_pSDKPlayer->m_Shared.IsDiving() ) RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_DA_BRAWL_DIVE ); else if ( m_pSDKPlayer->GetFlags() & FL_DUCKING ) RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_DA_BRAWL_CROUCH ); else RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_DA_BRAWL ); iGestureActivity = ACT_VM_PRIMARYATTACK; break; } case PLAYERANIMEVENT_ATTACK_PRE: { if ( m_pSDKPlayer->GetFlags() & FL_DUCKING ) { // Weapon pre-fire. Used for minigun windup, sniper aiming start, etc in crouch. iGestureActivity = ACT_MP_ATTACK_CROUCH_PREFIRE; } else { // Weapon pre-fire. Used for minigun windup, sniper aiming start, etc. iGestureActivity = ACT_MP_ATTACK_STAND_PREFIRE; } RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, iGestureActivity, false ); iGestureActivity = ACT_VM_IDLE; //TODO? break; } case PLAYERANIMEVENT_ATTACK_POST: { RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_ATTACK_STAND_POSTFIRE ); iGestureActivity = ACT_VM_IDLE; //TODO? break; } case PLAYERANIMEVENT_RELOAD: { // Weapon reload. /*//We only have standing reload-- it blends into other states if ( m_pSDKPlayer->m_Shared.IsProne() || m_pSDKPlayer->m_Shared.IsDiveSliding() ) RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_DA_RELOAD_PRONE ); else if ( m_pSDKPlayer->m_Shared.IsSliding() ) RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_DA_RELOAD_SLIDE ); else if ( GetBasePlayer()->GetFlags() & FL_DUCKING ) RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_DA_RELOAD_CROUCH ); else*/ RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_DA_RELOAD ); iGestureActivity = ACT_VM_RELOAD; //Make view reload if it isn't already break; } case PLAYERANIMEVENT_RELOAD_LOOP: { // Weapon reload. /*//We only have standing reload-- it blends into other states if ( m_pSDKPlayer->m_Shared.IsProne() || m_pSDKPlayer->m_Shared.IsDiveSliding() ) RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_DA_RELOAD_LOOP_PRONE ); else if ( m_pSDKPlayer->m_Shared.IsSliding() ) RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_DA_RELOAD_LOOP_SLIDE ); else if ( GetBasePlayer()->GetFlags() & FL_DUCKING ) RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_DA_RELOAD_LOOP_CROUCH ); else*/ RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_DA_RELOAD_LOOP ); iGestureActivity = ACT_INVALID; //TODO: fix break; } case PLAYERANIMEVENT_RELOAD_END: { // Weapon reload. if ( m_pSDKPlayer->m_Shared.IsProne() || m_pSDKPlayer->m_Shared.IsDiveSliding() ) RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_DA_RELOAD_END_PRONE ); else if ( m_pSDKPlayer->m_Shared.IsSliding() ) RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_DA_RELOAD_END_SLIDE ); else if ( GetBasePlayer()->GetFlags() & FL_DUCKING ) RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_DA_RELOAD_END_CROUCH ); else RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_DA_RELOAD_END ); iGestureActivity = ACT_INVALID; //TODO: fix break; } #if defined ( SDK_USE_PRONE ) case PLAYERANIMEVENT_STAND_TO_PRONE: { m_bProneTransition = true; m_bProneTransitionFirstFrame = true; //m_iProneActivity = ACT_MP_STAND_TO_PRONE; RestartMainSequence(); iGestureActivity = ACT_VM_IDLE; //Clear for weapon, we have no stand->prone so just idle. } break; case PLAYERANIMEVENT_CROUCH_TO_PRONE: { m_bProneTransition = true; m_bProneTransitionFirstFrame = true; //m_iProneActivity = ACT_MP_CROUCH_TO_PRONE; RestartMainSequence(); iGestureActivity = ACT_VM_IDLE; //Clear for weapon, we have no crouch->prone so just idle. } break; case PLAYERANIMEVENT_PRONE_TO_STAND: { m_bProneTransition = true; m_bProneTransitionFirstFrame = true; m_iProneActivity = ACT_DA_PRONE_TO_STAND; RestartMainSequence(); iGestureActivity = ACT_VM_IDLE; //Clear for weapon, we have no prone->stand so just idle. } break; case PLAYERANIMEVENT_PRONE_TO_CROUCH: { m_bProneTransition = true; m_bProneTransitionFirstFrame = true; //m_iProneActivity = ACT_MP_PRONE_TO_CROUCH; RestartMainSequence(); iGestureActivity = ACT_VM_IDLE; //Clear for weapon, we have no prone->crouch so just idle. } break; #endif case PLAYERANIMEVENT_DRAW: { RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_DA_DRAW ); iGestureActivity = ACT_VM_DRAW; break; } case PLAYERANIMEVENT_DIVE: { m_bDiveStart = true; m_bDiveStartFirstFrame = true; m_iDiveActivity = ACT_DA_DIVE; RestartMainSequence(); iGestureActivity = ACT_VM_IDLE; } break; case PLAYERANIMEVENT_DIVE_TO_ROLL: { m_bRollTransition = true; m_bRollTransitionFirstFrame = true; m_iRollActivity = ACT_DA_DIVEROLL; RestartMainSequence(); iGestureActivity = ACT_VM_IDLE; //Clear for weapon, we have no stand->slide so just idle. } break; case PLAYERANIMEVENT_STAND_TO_SLIDE: { m_bSlideTransition = true; m_bSlideTransitionFirstFrame = true; m_iSlideActivity = ACT_DA_SLIDESTART; RestartMainSequence(); iGestureActivity = ACT_VM_IDLE; //Clear for weapon, we have no stand->slide so just idle. } break; case PLAYERANIMEVENT_STAND_TO_ROLL: { m_bRollTransition = true; m_bRollTransitionFirstFrame = true; m_iRollActivity = ACT_DA_ROLL; RestartMainSequence(); iGestureActivity = ACT_VM_IDLE; //Clear for weapon, we have no stand->slide so just idle. } break; case PLAYERANIMEVENT_STAND_TO_VAULT: m_bRollTransition = true; m_bRollTransitionFirstFrame = true; m_iRollActivity = ACT_DA_ROLL; RestartMainSequence(); iGestureActivity = ACT_VM_IDLE; break; case PLAYERANIMEVENT_STAND_TO_WALLRUN: m_bRollTransition = true; m_bRollTransitionFirstFrame = true; m_iRollActivity = ACT_DA_ROLL; RestartMainSequence(); iGestureActivity = ACT_VM_IDLE; break; case PLAYERANIMEVENT_WALLFLIP: RestartMainSequence(); iGestureActivity = ACT_VM_IDLE; break; case PLAYERANIMEVENT_WALLCLIMB: RestartMainSequence(); iGestureActivity = ACT_VM_IDLE; break; case PLAYERANIMEVENT_JUMP: { // Jump. m_bJumping = true; m_bFirstJumpFrame = true; m_flJumpStartTime = m_pSDKPlayer->GetCurrentTime(); RestartMainSequence(); break; } case PLAYERANIMEVENT_CANCEL: { ResetGestureSlot( GESTURE_SLOT_ATTACK_AND_RELOAD ); break; } default: { BaseClass::DoAnimationEvent( event, nData ); break; } } #ifdef CLIENT_DLL // Make the weapon play the animation as well if ( iGestureActivity != ACT_INVALID && GetSDKPlayer() != CSDKPlayer::GetLocalSDKPlayer()) { CBaseCombatWeapon *pWeapon = GetSDKPlayer()->GetActiveWeapon(); if ( pWeapon ) { //pWeapon->EnsureCorrectRenderingModel(); pWeapon->SendWeaponAnim( iGestureActivity ); // Force animation events! //pWeapon->ResetEventsParity(); // reset event parity so the animation events will occur on the weapon. pWeapon->DoAnimationEvents( pWeapon->GetModelPtr() ); } } #endif }
//----------------------------------------------------------------------------- // Purpose: bool CHL2MPPlayerAnimState::HandleJumping( Activity &idealActivity ) { Vector vecVelocity; GetOuterAbsVelocity( vecVelocity ); if ( m_bJumping ) { static bool bNewJump = false; //Tony; hl2mp players only have a 'hop' if ( m_bFirstJumpFrame ) { m_bFirstJumpFrame = false; RestartMainSequence(); // Reset the animation. } // Reset if we hit water and start swimming. if ( m_pHL2MPPlayer->GetWaterLevel() >= WL_Waist ) { m_bJumping = false; RestartMainSequence(); } // Don't check if he's on the ground for a sec.. sometimes the client still has the // on-ground flag set right when the message comes in. else if ( gpGlobals->curtime - m_flJumpStartTime > 0.2f ) { if ( m_pHL2MPPlayer->GetFlags() & FL_ONGROUND ) { m_bJumping = false; RestartMainSequence(); if ( bNewJump ) { RestartGesture( GESTURE_SLOT_JUMP, ACT_MP_JUMP_LAND ); } } } // if we're still jumping if ( m_bJumping ) { if ( bNewJump ) { if ( gpGlobals->curtime - m_flJumpStartTime > 0.5 ) { idealActivity = ACT_MP_JUMP_FLOAT; } else { idealActivity = ACT_MP_JUMP_START; } } else { idealActivity = ACT_MP_JUMP; } } } if ( m_bJumping ) return true; return false; }
//----------------------------------------------------------------------------- // Purpose: // Input : event - //----------------------------------------------------------------------------- void CHL2MPPlayerAnimState::DoAnimationEvent( PlayerAnimEvent_t event, int nData ) { Activity iGestureActivity = ACT_INVALID; switch( event ) { case PLAYERANIMEVENT_ATTACK_PRIMARY: { // Weapon primary fire. if ( m_pHL2MPPlayer->GetFlags() & FL_DUCKING ) RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_ATTACK_CROUCH_PRIMARYFIRE ); else RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_ATTACK_STAND_PRIMARYFIRE ); iGestureActivity = ACT_VM_PRIMARYATTACK; break; } case PLAYERANIMEVENT_VOICE_COMMAND_GESTURE: { if ( !IsGestureSlotActive( GESTURE_SLOT_ATTACK_AND_RELOAD ) ) RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, (Activity)nData ); break; } case PLAYERANIMEVENT_ATTACK_SECONDARY: { // Weapon secondary fire. if ( m_pHL2MPPlayer->GetFlags() & FL_DUCKING ) RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_ATTACK_CROUCH_SECONDARYFIRE ); else RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_ATTACK_STAND_SECONDARYFIRE ); iGestureActivity = ACT_VM_PRIMARYATTACK; break; } case PLAYERANIMEVENT_ATTACK_PRE: { if ( m_pHL2MPPlayer->GetFlags() & FL_DUCKING ) { // Weapon pre-fire. Used for minigun windup, sniper aiming start, etc in crouch. iGestureActivity = ACT_MP_ATTACK_CROUCH_PREFIRE; } else { // Weapon pre-fire. Used for minigun windup, sniper aiming start, etc. iGestureActivity = ACT_MP_ATTACK_STAND_PREFIRE; } RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, iGestureActivity, false ); break; } case PLAYERANIMEVENT_ATTACK_POST: { RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_ATTACK_STAND_POSTFIRE ); break; } case PLAYERANIMEVENT_RELOAD: { // Weapon reload. if ( GetBasePlayer()->GetFlags() & FL_DUCKING ) RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_RELOAD_CROUCH ); else RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_RELOAD_STAND ); break; } case PLAYERANIMEVENT_RELOAD_LOOP: { // Weapon reload. if ( GetBasePlayer()->GetFlags() & FL_DUCKING ) RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_RELOAD_CROUCH_LOOP ); else RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_RELOAD_STAND_LOOP ); break; } case PLAYERANIMEVENT_RELOAD_END: { // Weapon reload. if ( GetBasePlayer()->GetFlags() & FL_DUCKING ) RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_RELOAD_CROUCH_END ); else RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_RELOAD_STAND_END ); break; } default: { BaseClass::DoAnimationEvent( event, nData ); break; } } #ifdef CLIENT_DLL //DHL - Skillet - Commented as unnecessary according to [hlcoders] "Duplicated Tracers" - author: Jonathan White // Make the weapon play the animation as well /*if ( iGestureActivity != ACT_INVALID ) { CBaseCombatWeapon *pWeapon = GetHL2MPPlayer()->GetActiveWeapon(); if ( pWeapon ) { pWeapon->EnsureCorrectRenderingModel(); pWeapon->SendWeaponAnim( iGestureActivity ); // Force animation events! pWeapon->ResetEventsParity(); // reset event parity so the animation events will occur on the weapon. pWeapon->DoAnimationEvents( pWeapon->GetModelPtr() ); } }*/ #endif }
// Set the activity based on an event or current state void CHL2MP_Player::SetAnimation( PLAYER_ANIM playerAnim ) { int animDesired; float speed; speed = GetAbsVelocity().Length2D(); // bool bRunning = true; //Revisit! /* if ( ( m_nButtons & ( IN_FORWARD | IN_BACK | IN_MOVELEFT | IN_MOVERIGHT ) ) ) { if ( speed > 1.0f && speed < hl2_normspeed.GetFloat() - 20.0f ) { bRunning = false; } }*/ if ( GetFlags() & ( FL_FROZEN | FL_ATCONTROLS ) ) { speed = 0; playerAnim = PLAYER_IDLE; } Activity idealActivity = ACT_HL2MP_RUN; // This could stand to be redone. Why is playerAnim abstracted from activity? (sjb) if ( playerAnim == PLAYER_JUMP ) { idealActivity = ACT_HL2MP_JUMP; } else if ( playerAnim == PLAYER_DIE ) { if ( m_lifeState == LIFE_ALIVE ) { return; } } else if ( playerAnim == PLAYER_ATTACK1 ) { if ( GetActivity( ) == ACT_HOVER || GetActivity( ) == ACT_SWIM || GetActivity( ) == ACT_HOP || GetActivity( ) == ACT_LEAP || GetActivity( ) == ACT_DIESIMPLE ) { idealActivity = GetActivity( ); } else { idealActivity = ACT_HL2MP_GESTURE_RANGE_ATTACK; } } else if ( playerAnim == PLAYER_RELOAD ) { idealActivity = ACT_HL2MP_GESTURE_RELOAD; } else if ( playerAnim == PLAYER_IDLE || playerAnim == PLAYER_WALK ) { if ( !( GetFlags() & FL_ONGROUND ) && GetActivity( ) == ACT_HL2MP_JUMP ) // Still jumping { idealActivity = GetActivity( ); } /* else if ( GetWaterLevel() > 1 ) { if ( speed == 0 ) idealActivity = ACT_HOVER; else idealActivity = ACT_SWIM; } */ else { if ( GetFlags() & FL_DUCKING ) { if ( speed > 0 ) { idealActivity = ACT_HL2MP_WALK_CROUCH; } else { idealActivity = ACT_HL2MP_IDLE_CROUCH; } } else { if ( speed > 0 ) { /* if ( bRunning == false ) { idealActivity = ACT_WALK; } else */ { idealActivity = ACT_HL2MP_RUN; } } else { idealActivity = ACT_HL2MP_IDLE; } } } idealActivity = TranslateTeamActivity( idealActivity ); } if ( idealActivity == ACT_HL2MP_GESTURE_RANGE_ATTACK ) { RestartGesture( Weapon_TranslateActivity( idealActivity ) ); // FIXME: this seems a bit wacked Weapon_SetActivity( Weapon_TranslateActivity( ACT_RANGE_ATTACK1 ), 0 ); return; } else if ( idealActivity == ACT_HL2MP_GESTURE_RELOAD ) { RestartGesture( Weapon_TranslateActivity( idealActivity ) ); return; } else { SetActivity( idealActivity ); animDesired = SelectWeightedSequence( Weapon_TranslateActivity ( idealActivity ) ); if (animDesired == -1) { animDesired = SelectWeightedSequence( idealActivity ); if ( animDesired == -1 ) { animDesired = 0; } } // Already using the desired animation? if ( GetSequence() == animDesired ) return; m_flPlaybackRate = 1.0; ResetSequence( animDesired ); SetCycle( 0 ); return; } // Already using the desired animation? if ( GetSequence() == animDesired ) return; //Msg( "Set animation to %d\n", animDesired ); // Reset to first frame of desired animation ResetSequence( animDesired ); SetCycle( 0 ); }
//----------------------------------------------------------------------------- // Purpose: bool CTFPlayerAnimState::HandleJumping( Activity &idealActivity ) { Vector vecVelocity; GetOuterAbsVelocity( vecVelocity ); // Don't allow a firing heavy to jump or air walk. if ( m_pTFPlayer->GetPlayerClass()->IsClass( TF_CLASS_HEAVYWEAPONS ) && m_pTFPlayer->m_Shared.InCond( TF_COND_AIMING ) ) return false; // Handle air walking before handling jumping - air walking supersedes jump TFPlayerClassData_t *pData = m_pTFPlayer->GetPlayerClass()->GetData(); bool bValidAirWalkClass = ( pData && pData->m_bDontDoAirwalk == false ); if ( bValidAirWalkClass && ( vecVelocity.z > 300.0f || m_bInAirWalk ) ) { // Check to see if we were in an airwalk and now we are basically on the ground. if ( ( GetBasePlayer()->GetFlags() & FL_ONGROUND ) && m_bInAirWalk ) { m_bInAirWalk = false; RestartMainSequence(); RestartGesture( GESTURE_SLOT_JUMP, ACT_MP_JUMP_LAND ); } else if ( GetBasePlayer()->GetWaterLevel() >= WL_Waist ) { // Turn off air walking and reset the animation. m_bInAirWalk = false; RestartMainSequence(); } else if ( ( GetBasePlayer()->GetFlags() & FL_ONGROUND ) == 0 ) { // In an air walk. idealActivity = ACT_MP_AIRWALK; m_bInAirWalk = true; } } // Jumping. else { if ( m_bJumping ) { // Remove me once all classes are doing the new jump TFPlayerClassData_t *pData = m_pTFPlayer->GetPlayerClass()->GetData(); bool bNewJump = ( pData && pData->m_bDontDoNewJump == false ); if ( m_bFirstJumpFrame ) { m_bFirstJumpFrame = false; RestartMainSequence(); // Reset the animation. } // Reset if we hit water and start swimming. if ( GetBasePlayer()->GetWaterLevel() >= WL_Waist ) { m_bJumping = false; RestartMainSequence(); } // Don't check if he's on the ground for a sec.. sometimes the client still has the // on-ground flag set right when the message comes in. else if ( gpGlobals->curtime - m_flJumpStartTime > 0.2f ) { if ( GetBasePlayer()->GetFlags() & FL_ONGROUND ) { m_bJumping = false; RestartMainSequence(); if ( bNewJump ) { RestartGesture( GESTURE_SLOT_JUMP, ACT_MP_JUMP_LAND ); } } } // if we're still jumping if ( m_bJumping ) { if ( bNewJump ) { if ( gpGlobals->curtime - m_flJumpStartTime > 0.5 ) { idealActivity = ACT_MP_JUMP_FLOAT; } else { idealActivity = ACT_MP_JUMP_START; } } else { idealActivity = ACT_MP_JUMP; } } } } if ( m_bJumping || m_bInAirWalk ) return true; return false; }
//----------------------------------------------------------------------------- // Purpose: // Input : event - //----------------------------------------------------------------------------- void CTFPlayerAnimState::DoAnimationEvent( PlayerAnimEvent_t event, int nData ) { Activity iGestureActivity = ACT_INVALID; switch( event ) { case PLAYERANIMEVENT_ATTACK_PRIMARY: { CTFPlayer *pPlayer = GetTFPlayer(); if ( !pPlayer ) return; CTFWeaponBase *pWpn = pPlayer->GetActiveTFWeapon(); bool bIsMinigun = ( pWpn && pWpn->GetWeaponID() == TF_WEAPON_MINIGUN ); bool bIsSniperRifle = ( pWpn && pWpn->GetWeaponID() == TF_WEAPON_SNIPERRIFLE ); // Heavy weapons primary fire. if ( bIsMinigun ) { // Play standing primary fire. iGestureActivity = ACT_MP_ATTACK_STAND_PRIMARYFIRE; if ( m_bInSwim ) { // Play swimming primary fire. iGestureActivity = ACT_MP_ATTACK_SWIM_PRIMARYFIRE; } else if ( GetBasePlayer()->GetFlags() & FL_DUCKING ) { // Play crouching primary fire. iGestureActivity = ACT_MP_ATTACK_CROUCH_PRIMARYFIRE; } if ( !IsGestureSlotPlaying( GESTURE_SLOT_ATTACK_AND_RELOAD, TranslateActivity(iGestureActivity) ) ) { RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, iGestureActivity ); } } else if ( bIsSniperRifle && pPlayer->m_Shared.InCond( TF_COND_ZOOMED ) ) { // Weapon primary fire, zoomed in if ( GetBasePlayer()->GetFlags() & FL_DUCKING ) { RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_ATTACK_CROUCH_PRIMARYFIRE_DEPLOYED ); } else { RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_ATTACK_STAND_PRIMARYFIRE_DEPLOYED ); } iGestureActivity = ACT_VM_PRIMARYATTACK; // Hold our deployed pose for a few seconds m_flHoldDeployedPoseUntilTime = gpGlobals->curtime + 2.0; } else { // Weapon primary fire. if ( GetBasePlayer()->GetFlags() & FL_DUCKING ) { RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_ATTACK_CROUCH_PRIMARYFIRE ); } else { RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_ATTACK_STAND_PRIMARYFIRE ); } iGestureActivity = ACT_VM_PRIMARYATTACK; } break; } case PLAYERANIMEVENT_VOICE_COMMAND_GESTURE: { if ( !IsGestureSlotActive( GESTURE_SLOT_ATTACK_AND_RELOAD ) ) { RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, (Activity)nData ); } break; } case PLAYERANIMEVENT_ATTACK_SECONDARY: { // Weapon secondary fire. if ( GetBasePlayer()->GetFlags() & FL_DUCKING ) { RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_ATTACK_CROUCH_SECONDARYFIRE ); } else { RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_ATTACK_STAND_SECONDARYFIRE ); } iGestureActivity = ACT_VM_PRIMARYATTACK; break; } case PLAYERANIMEVENT_ATTACK_PRE: { CTFPlayer *pPlayer = GetTFPlayer(); if ( !pPlayer ) return; CTFWeaponBase *pWpn = pPlayer->GetActiveTFWeapon(); bool bIsMinigun = ( pWpn && pWpn->GetWeaponID() == TF_WEAPON_MINIGUN ); bool bAutoKillPreFire = false; if ( bIsMinigun ) { bAutoKillPreFire = true; } if ( m_bInSwim && bIsMinigun ) { // Weapon pre-fire. Used for minigun windup while swimming iGestureActivity = ACT_MP_ATTACK_SWIM_PREFIRE; } else if ( GetBasePlayer()->GetFlags() & FL_DUCKING ) { // Weapon pre-fire. Used for minigun windup, sniper aiming start, etc in crouch. iGestureActivity = ACT_MP_ATTACK_CROUCH_PREFIRE; } else { // Weapon pre-fire. Used for minigun windup, sniper aiming start, etc. iGestureActivity = ACT_MP_ATTACK_STAND_PREFIRE; } RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, iGestureActivity, bAutoKillPreFire ); break; } case PLAYERANIMEVENT_ATTACK_POST: { CTFPlayer *pPlayer = GetTFPlayer(); if ( !pPlayer ) return; CTFWeaponBase *pWpn = pPlayer->GetActiveTFWeapon(); bool bIsMinigun = ( pWpn && pWpn->GetWeaponID() == TF_WEAPON_MINIGUN ); if ( m_bInSwim && bIsMinigun ) { // Weapon pre-fire. Used for minigun winddown while swimming iGestureActivity = ACT_MP_ATTACK_SWIM_POSTFIRE; } else if ( GetBasePlayer()->GetFlags() & FL_DUCKING ) { // Weapon post-fire. Used for minigun winddown in crouch. iGestureActivity = ACT_MP_ATTACK_CROUCH_POSTFIRE; } else { // Weapon post-fire. Used for minigun winddown. iGestureActivity = ACT_MP_ATTACK_STAND_POSTFIRE; } RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, iGestureActivity ); break; } case PLAYERANIMEVENT_RELOAD: { // Weapon reload. if ( m_bInAirWalk ) { RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_RELOAD_AIRWALK ); } else { BaseClass::DoAnimationEvent( event, nData ); } break; } case PLAYERANIMEVENT_RELOAD_LOOP: { // Weapon reload. if ( m_bInAirWalk ) { RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_RELOAD_AIRWALK_LOOP ); } else { BaseClass::DoAnimationEvent( event, nData ); } break; } case PLAYERANIMEVENT_RELOAD_END: { // Weapon reload. if ( m_bInAirWalk ) { RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_RELOAD_AIRWALK_END ); } else { BaseClass::DoAnimationEvent( event, nData ); } break; } case PLAYERANIMEVENT_DOUBLEJUMP: { // Check to see if we are jumping! if ( !m_bJumping ) { m_bJumping = true; m_bFirstJumpFrame = true; m_flJumpStartTime = gpGlobals->curtime; RestartMainSequence(); } // Force the air walk off. m_bInAirWalk = false; // Player the air dash gesture. if (GetBasePlayer()->GetFlags() & FL_DUCKING) { RestartGesture( GESTURE_SLOT_JUMP, ACT_MP_DOUBLEJUMP_CROUCH ); } else { RestartGesture( GESTURE_SLOT_JUMP, ACT_MP_DOUBLEJUMP ); } break; } default: { BaseClass::DoAnimationEvent( event, nData ); break; } } #ifdef CLIENT_DLL // Make the weapon play the animation as well if (iGestureActivity != ACT_INVALID && GetBasePlayer() != C_BasePlayer::GetLocalPlayer()) { CBaseCombatWeapon *pWeapon = GetTFPlayer()->GetActiveWeapon(); if ( pWeapon ) { pWeapon->SendWeaponAnim( iGestureActivity ); pWeapon->DoAnimationEvents(pWeapon->GetModelPtr()); } } #endif }
//----------------------------------------------------------------------------- // Purpose: // Input : event - //----------------------------------------------------------------------------- void CSDKPlayerAnimState::DoAnimationEvent( PlayerAnimEvent_t event, int nData ) { Activity iGestureActivity = ACT_INVALID; switch( event ) { case PLAYERANIMEVENT_ATTACK_PRIMARY: { // Weapon primary fire. #if defined ( SDK_USE_PRONE ) if ( m_pSDKPlayer->m_Shared.IsProne() ) { RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_ATTACK_PRONE_PRIMARYFIRE ); } else #endif //SDK_USE_PRONE if ( m_pSDKPlayer->GetFlags() & FL_DUCKING ) { RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_ATTACK_CROUCH_PRIMARYFIRE ); } else { RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_ATTACK_STAND_PRIMARYFIRE ); } iGestureActivity = ACT_VM_PRIMARYATTACK; break; } case PLAYERANIMEVENT_VOICE_COMMAND_GESTURE: { if ( !IsGestureSlotActive( GESTURE_SLOT_ATTACK_AND_RELOAD ) ) { RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, (Activity)nData ); } iGestureActivity = ACT_VM_IDLE; //TODO? break; } case PLAYERANIMEVENT_ATTACK_SECONDARY: { // Weapon secondary fire. #if defined ( SDK_USE_PRONE ) if ( m_pSDKPlayer->m_Shared.IsProne() ) { RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_ATTACK_PRONE_SECONDARYFIRE ); } else #endif //SDK_USE_PRONE if ( m_pSDKPlayer->GetFlags() & FL_DUCKING ) { RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_ATTACK_CROUCH_SECONDARYFIRE ); } else { RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_ATTACK_STAND_SECONDARYFIRE ); } iGestureActivity = ACT_VM_PRIMARYATTACK; break; } case PLAYERANIMEVENT_ATTACK_PRE: { if ( m_pSDKPlayer->GetFlags() & FL_DUCKING ) { // Weapon pre-fire. Used for minigun windup, sniper aiming start, etc in crouch. iGestureActivity = ACT_MP_ATTACK_CROUCH_PREFIRE; } else { // Weapon pre-fire. Used for minigun windup, sniper aiming start, etc. iGestureActivity = ACT_MP_ATTACK_STAND_PREFIRE; } RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, iGestureActivity, false ); iGestureActivity = ACT_VM_IDLE; //TODO? break; } case PLAYERANIMEVENT_ATTACK_POST: { RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_ATTACK_STAND_POSTFIRE ); iGestureActivity = ACT_VM_IDLE; //TODO? break; } case PLAYERANIMEVENT_RELOAD: { // Weapon reload. #if defined ( SDK_USE_PRONE ) if ( m_pSDKPlayer->m_Shared.IsProne() ) { RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_RELOAD_PRONE ); } else #endif //SDK_USE_PRONE if ( GetBasePlayer()->GetFlags() & FL_DUCKING ) { RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_RELOAD_CROUCH ); } else { RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_RELOAD_STAND ); } iGestureActivity = ACT_VM_RELOAD; //Make view reload if it isn't already break; } case PLAYERANIMEVENT_RELOAD_LOOP: { // Weapon reload. #if defined ( SDK_USE_PRONE ) if ( m_pSDKPlayer->m_Shared.IsProne() ) { RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_RELOAD_PRONE_LOOP ); } else #endif //SDK_USE_PRONE if ( GetBasePlayer()->GetFlags() & FL_DUCKING ) { RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_RELOAD_CROUCH_LOOP ); } else { RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_RELOAD_STAND_LOOP ); } iGestureActivity = ACT_INVALID; //TODO: fix break; } case PLAYERANIMEVENT_RELOAD_END: { // Weapon reload. #if defined ( SDK_USE_PRONE ) if ( m_pSDKPlayer->m_Shared.IsProne() ) { RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_RELOAD_PRONE_END ); } else #endif //SDK_USE_PRONE if ( GetBasePlayer()->GetFlags() & FL_DUCKING ) { RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_RELOAD_CROUCH_END ); } else { RestartGesture( GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_MP_RELOAD_STAND_END ); } iGestureActivity = ACT_INVALID; //TODO: fix break; } #if defined ( SDK_USE_PRONE ) case PLAYERANIMEVENT_STAND_TO_PRONE: { m_bProneTransition = true; m_bProneTransitionFirstFrame = true; m_iProneActivity = ACT_MP_STAND_TO_PRONE; RestartMainSequence(); iGestureActivity = ACT_VM_IDLE; //Clear for weapon, we have no stand->prone so just idle. } break; case PLAYERANIMEVENT_CROUCH_TO_PRONE: { m_bProneTransition = true; m_bProneTransitionFirstFrame = true; m_iProneActivity = ACT_MP_CROUCH_TO_PRONE; RestartMainSequence(); iGestureActivity = ACT_VM_IDLE; //Clear for weapon, we have no crouch->prone so just idle. } break; case PLAYERANIMEVENT_PRONE_TO_STAND: { m_bProneTransition = true; m_bProneTransitionFirstFrame = true; m_iProneActivity = ACT_MP_PRONE_TO_STAND; RestartMainSequence(); iGestureActivity = ACT_VM_IDLE; //Clear for weapon, we have no prone->stand so just idle. } break; case PLAYERANIMEVENT_PRONE_TO_CROUCH: { m_bProneTransition = true; m_bProneTransitionFirstFrame = true; m_iProneActivity = ACT_MP_PRONE_TO_CROUCH; RestartMainSequence(); iGestureActivity = ACT_VM_IDLE; //Clear for weapon, we have no prone->crouch so just idle. } break; #endif default: { BaseClass::DoAnimationEvent( event, nData ); break; } } #ifdef CLIENT_DLL // Make the weapon play the animation as well if ( iGestureActivity != ACT_INVALID && GetSDKPlayer() != CSDKPlayer::GetLocalSDKPlayer()) { CBaseCombatWeapon *pWeapon = GetSDKPlayer()->GetActiveWeapon(); if ( pWeapon ) { pWeapon->EnsureCorrectRenderingModel(); pWeapon->SendWeaponAnim( iGestureActivity ); // Force animation events! // pWeapon->ResetEventsParity(); // reset event parity so the animation events will occur on the weapon. pWeapon->DoAnimationEvents( pWeapon->GetModelPtr() ); } } #endif }