// Blending Cycler think void CBlendingCycler::Think( void ) { SetNextThink( gpGlobals->curtime + 0.1f ); // Move m_iCurrent += m_iBlendspeed; if ( (m_iCurrent > m_iUpperBound) || (m_iCurrent < m_iLowerBound) ) m_iBlendspeed = m_iBlendspeed * -1; // Set blend SetPoseParameter( 0, m_iCurrent ); Msg( "Current Blend: %d\n", m_iCurrent ); if (IsSequenceFinished() && !SequenceLoops()) { // ResetSequenceInfo(); // hack to avoid reloading model every frame m_flAnimTime = gpGlobals->curtime; m_flPlaybackRate = 1.0; m_bSequenceFinished = false; m_flLastEventCheck = 0; m_flCycle = 0; if (!m_animate) { m_flPlaybackRate = 0.0; // FIX: don't reset framerate } } }
void CAnimating::ResetSequence(int nSequence) { if ( !SequenceLoops() ) { SetCycle( 0 ); } // Tracker 17868: If the sequence number didn't actually change, but you call resetsequence info, it changes // the newsequenceparity bit which causes the client to call m_flCycle.Reset() which causes a very slight // discontinuity in looping animations as they reset around to cycle 0.0. This was causing the parentattached // helmet on barney to hitch every time barney's idle cycled back around to its start. bool changed = nSequence != GetSequence() ? true : false; SetSequence( nSequence ); if ( changed || !SequenceLoops() ) { ResetSequenceInfo(); } }
void CBaseCombatWeapon::Operator_FrameUpdate( CBaseCombatCharacter *pOperator ) { StudioFrameAdvance( ); // animate if ( IsSequenceFinished() ) { if ( SequenceLoops() ) { // animation does loop, which means we're playing subtle idle. Might need to fidget. int iSequence = SelectWeightedSequence( GetActivity() ); if ( iSequence != ACTIVITY_NOT_AVAILABLE ) { ResetSequence( iSequence ); // Set to new anim (if it's there) } } #if 0 else { // animation that just ended doesn't loop! That means we just finished a fidget // and should return to our heaviest weighted idle (the subtle one) SelectHeaviestSequence( GetActivity() ); } #endif } CBasePlayer *pOwner = ToBasePlayer( GetOwner() ); if ( pOwner == NULL ) return; CBaseViewModel *vm = pOwner->GetViewModel( m_nViewModelIndex ); if ( vm == NULL ) return; // HACK: Player weapon and view model often use the same mdl, which results // in duplicate anim events. For now, let the view model handle the events // if they're the same, which is the preferred behavior in general. CStudioHdr *w_hdr = GetModelPtr(); CStudioHdr *v_hdr = vm->GetModelPtr(); if ( w_hdr->GetRenderHdr() != v_hdr->GetRenderHdr() ) { // Animation events are passed back to the weapon's owner/operator DispatchAnimEvents( pOperator ); } // Update and dispatch the viewmodel events if ( vm != NULL ) { vm->StudioFrameAdvance(); vm->DispatchAnimEvents( this ); } }
void CBaseCombatWeapon::Operator_FrameUpdate( CBaseCombatCharacter *pOperator ) { StudioFrameAdvance( ); // animate if ( IsSequenceFinished() ) { if ( SequenceLoops() ) { // animation does loop, which means we're playing subtle idle. Might need to fidget. int iSequence = SelectWeightedSequence( GetActivity() ); if ( iSequence != ACTIVITY_NOT_AVAILABLE ) { ResetSequence( iSequence ); // Set to new anim (if it's there) } } #if 0 else { // animation that just ended doesn't loop! That means we just finished a fidget // and should return to our heaviest weighted idle (the subtle one) SelectHeaviestSequence( GetActivity() ); } #endif } // Animation events are passed back to the weapon's owner/operator DispatchAnimEvents( pOperator ); // Update and dispatch the viewmodel events CBasePlayer *pOwner = ToBasePlayer( GetOwner() ); if ( pOwner == NULL ) return; CBaseViewModel *vm = pOwner->GetViewModel(); if ( vm != NULL ) { vm->StudioFrameAdvance(); vm->DispatchAnimEvents( this ); } }
bool C_CFPlayer::GetIntervalMovement( float flIntervalUsed, bool &bMoveSeqFinished, Vector &newPosition, QAngle &newAngles ) { CStudioHdr *pstudiohdr = GetModelPtr( ); if (! pstudiohdr || !pstudiohdr->SequencesAvailable()) return false; float flComputedCycleRate = GetSequenceCycleRate( pstudiohdr, GetSequence() ); float flNextCycle = GetCycle() + flIntervalUsed * flComputedCycleRate * m_flPlaybackRate; if ((!SequenceLoops()) && flNextCycle > 1.0) { flIntervalUsed = GetCycle() / (flComputedCycleRate * m_flPlaybackRate); flNextCycle = 1.0; bMoveSeqFinished = true; } else { bMoveSeqFinished = false; } Vector deltaPos; QAngle deltaAngles; float poseParameters[MAXSTUDIOPOSEPARAM]; GetPoseParameters(pstudiohdr, poseParameters); if (Studio_SeqMovement( pstudiohdr, GetSequence(), GetCycle(), flNextCycle, poseParameters, deltaPos, deltaAngles )) { VectorYawRotate( deltaPos, GetLocalAngles().y, deltaPos ); newPosition = GetLocalOrigin() + deltaPos; newAngles.Init(); newAngles.y = GetLocalAngles().y + deltaAngles.y; return true; } else { newPosition = GetLocalOrigin(); newAngles = GetLocalAngles(); return false; } }
// // cycler think // void CCycler::Think( void ) { SetNextThink( gpGlobals->curtime + 0.1f ); if (m_animate) { StudioFrameAdvance ( ); } if (IsSequenceFinished() && !SequenceLoops()) { // ResetSequenceInfo(); // hack to avoid reloading model every frame m_flAnimTime = gpGlobals->curtime; m_flPlaybackRate = 1.0; m_bSequenceFinished = false; m_flLastEventCheck = 0; m_flCycle = 0; if (!m_animate) m_flPlaybackRate = 0.0; // FIX: don't reset framerate } }
void CHL1MP_Player::SetAnimation( PLAYER_ANIM playerAnim ) { // BaseClass::SetAnimation( playerAnim ); if ( playerAnim == PLAYER_ATTACK1 ) { DoAnimationEvent( PLAYERANIMEVENT_FIRE_GUN ); } int animDesired; char szAnim[64]; float speed; speed = GetAbsVelocity().Length2D(); if (GetFlags() & (FL_FROZEN|FL_ATCONTROLS)) { speed = 0; playerAnim = PLAYER_IDLE; } if ( playerAnim == PLAYER_ATTACK1 ) { if ( speed > 0 ) { playerAnim = PLAYER_WALK; } else { playerAnim = PLAYER_IDLE; } } Activity idealActivity = ACT_WALK;// TEMP!!!!! // This could stand to be redone. Why is playerAnim abstracted from activity? (sjb) if (playerAnim == PLAYER_JUMP) { idealActivity = ACT_HOP; } else if (playerAnim == PLAYER_SUPERJUMP) { idealActivity = ACT_LEAP; } else if (playerAnim == PLAYER_DIE) { if ( m_lifeState == LIFE_ALIVE ) { idealActivity = ACT_DIERAGDOLL; } } 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_RANGE_ATTACK1; } } else if (playerAnim == PLAYER_IDLE || playerAnim == PLAYER_WALK) { if ( !( GetFlags() & FL_ONGROUND ) && (GetActivity() == ACT_HOP || GetActivity() == ACT_LEAP) ) // Still jumping { idealActivity = GetActivity(); } else if ( GetWaterLevel() > 1 ) { if ( speed == 0 ) idealActivity = ACT_HOVER; else idealActivity = ACT_SWIM; } else if ( speed > 0 ) { idealActivity = ACT_WALK; } else { idealActivity = ACT_IDLE; } } if (idealActivity == ACT_RANGE_ATTACK1) { if ( GetFlags() & FL_DUCKING ) // crouching { Q_strncpy( szAnim, "crouch_shoot_" ,sizeof(szAnim)); } else { Q_strncpy( szAnim, "ref_shoot_" ,sizeof(szAnim)); } Q_strncat( szAnim, m_szAnimExtension ,sizeof(szAnim), COPY_ALL_CHARACTERS ); animDesired = LookupSequence( szAnim ); if (animDesired == -1) animDesired = 0; if ( GetSequence() != animDesired || !SequenceLoops() ) { SetCycle( 0 ); } // Tracker 24588: In single player when firing own weapon this causes eye and punchangle to jitter //if (!SequenceLoops()) //{ // AddEffects( EF_NOINTERP ); //} SetActivity( idealActivity ); ResetSequence( animDesired ); } else if (idealActivity == ACT_IDLE) { if ( GetFlags() & FL_DUCKING ) { animDesired = LookupSequence( "crouch_idle" ); } else { animDesired = LookupSequence( "look_idle" ); } if (animDesired == -1) animDesired = 0; SetActivity( ACT_IDLE ); } else if ( idealActivity == ACT_WALK ) { if ( GetFlags() & FL_DUCKING ) { animDesired = SelectWeightedSequence( ACT_CROUCH ); SetActivity( ACT_CROUCH ); } else { animDesired = SelectWeightedSequence( ACT_RUN ); SetActivity( ACT_RUN ); } } else { if ( GetActivity() == idealActivity) return; SetActivity( idealActivity ); animDesired = SelectWeightedSequence( GetActivity() ); // Already using the desired animation? if (GetSequence() == animDesired) return; m_iRealSequence = animDesired; ResetSequence( animDesired ); SetCycle( 0 ); return; } // Already using the desired animation? if (GetSequence() == animDesired) return; m_iRealSequence = animDesired; //Msg( "Set animation to %d\n", animDesired ); // Reset to first frame of desired animation ResetSequence( animDesired ); SetCycle( 0 ); }