bool CNPC_Infected::OverrideMoveFacing( const AILocalMoveGoal_t &move, float flInterval ) { // required movement direction float flMoveYaw = UTIL_VecToYaw( move.dir ); // FIXME: move this up to navigator so that path goals can ignore these overrides. Vector dir; float flInfluence = GetFacingDirection( dir ); dir = move.facing * (1 - flInfluence) + dir * flInfluence; VectorNormalize( dir ); // ideal facing direction float idealYaw = UTIL_AngleMod( UTIL_VecToYaw( dir ) ); // FIXME: facing has important max velocity issues GetMotor()->SetIdealYawAndUpdate( idealYaw ); // find movement direction to compensate for not being turned far enough float flDiff = UTIL_AngleDiff( flMoveYaw, GetLocalAngles().y ); // Setup the 9-way blend parameters based on our speed and direction. Vector2D vCurMovePose( 0, 0 ); vCurMovePose.x = cos( DEG2RAD( flDiff ) ) * 1.0f; //flPlaybackRate; vCurMovePose.y = -sin( DEG2RAD( flDiff ) ) * 1.0f; //flPlaybackRate; SetPoseParameter( gm_nMoveXPoseParam, vCurMovePose.x ); SetPoseParameter( gm_nMoveYPoseParam, vCurMovePose.y ); // ==== Update Lean pose parameters if ( gm_nLeanYawPoseParam >= 0 ) { float targetLean = GetPoseParameter( gm_nMoveYPoseParam ) * 30.0f; float curLean = GetPoseParameter( gm_nLeanYawPoseParam ); if( curLean < targetLean ) curLean += MIN(fabs(targetLean-curLean), GetAnimTimeInterval()*12.0f); //was 15.0f else curLean -= MIN(fabs(targetLean-curLean), GetAnimTimeInterval()*12.0f); //was 15.0f SetPoseParameter( gm_nLeanYawPoseParam, curLean ); } if( gm_nLeanPitchPoseParam >= 0 ) { float targetLean = GetPoseParameter( gm_nMoveXPoseParam ) * -20.0f; //was -30.0f float curLean = GetPoseParameter( gm_nLeanPitchPoseParam ); if( curLean < targetLean ) curLean += MIN(fabs(targetLean-curLean), GetAnimTimeInterval()*10.0f); //was 15.0f else curLean -= MIN(fabs(targetLean-curLean), GetAnimTimeInterval()*10.0f); //was 15.0f SetPoseParameter( gm_nLeanPitchPoseParam, curLean ); } return true; }
//----------------------------------------------------------------------------- // Purpose: Override for backpeddling // Input : dt - //----------------------------------------------------------------------------- void CBasePlayerAnimState::ComputePoseParam_MoveYaw( CStudioHdr *pStudioHdr ) { VPROF( "CBasePlayerAnimState::ComputePoseParam_MoveYaw" ); //Matt: Goldsrc style animations need to not rotate the model if ( m_AnimConfig.m_LegAnimType == LEGANIM_GOLDSRC ) { #ifndef CLIENT_DLL //Adrian: Make the model's angle match the legs so the hitboxes match on both sides. GetOuter()->SetLocalAngles( QAngle( 0, m_flCurrentFeetYaw, 0 ) ); #endif } // If using goldsrc-style animations where he's moving in the direction that his feet are facing, // we don't use move yaw. if ( m_AnimConfig.m_LegAnimType != LEGANIM_9WAY && m_AnimConfig.m_LegAnimType != LEGANIM_8WAY ) return; // view direction relative to movement float flYaw; EstimateYaw(); float ang = m_flEyeYaw; if ( ang > 180.0f ) { ang -= 360.0f; } else if ( ang < -180.0f ) { ang += 360.0f; } // calc side to side turning flYaw = ang - m_flGaitYaw; // Invert for mapping into 8way blend flYaw = -flYaw; flYaw = flYaw - (int)(flYaw / 360) * 360; if (flYaw < -180) { flYaw = flYaw + 360; } else if (flYaw > 180) { flYaw = flYaw - 360; } if ( m_AnimConfig.m_LegAnimType == LEGANIM_9WAY ) { #ifndef CLIENT_DLL //Adrian: Make the model's angle match the legs so the hitboxes match on both sides. GetOuter()->SetLocalAngles( QAngle( 0, m_flCurrentFeetYaw, 0 ) ); #endif int iMoveX = GetOuter()->LookupPoseParameter( pStudioHdr, "move_x" ); int iMoveY = GetOuter()->LookupPoseParameter( pStudioHdr, "move_y" ); if ( iMoveX < 0 || iMoveY < 0 ) return; bool bIsMoving; float flPlaybackRate = CalcMovementPlaybackRate( &bIsMoving ); // Setup the 9-way blend parameters based on our speed and direction. Vector2D vCurMovePose( 0, 0 ); if ( bIsMoving ) { vCurMovePose.x = cos( DEG2RAD( flYaw ) ) * flPlaybackRate; vCurMovePose.y = -sin( DEG2RAD( flYaw ) ) * flPlaybackRate; } GetOuter()->SetPoseParameter( pStudioHdr, iMoveX, vCurMovePose.x ); GetOuter()->SetPoseParameter( pStudioHdr, iMoveY, vCurMovePose.y ); m_vLastMovePose = vCurMovePose; } else { int iMoveYaw = GetOuter()->LookupPoseParameter( pStudioHdr, "move_yaw" ); if ( iMoveYaw >= 0 ) { GetOuter()->SetPoseParameter( pStudioHdr, iMoveYaw, flYaw ); m_flLastMoveYaw = flYaw; // Now blend in his idle animation. // This makes the 8-way blend act like a 9-way blend by blending to // an idle sequence as he slows down. #if defined(CLIENT_DLL) #ifndef INFESTED_DLL bool bIsMoving; CAnimationLayer *pLayer = m_pOuter->GetAnimOverlay( MAIN_IDLE_SEQUENCE_LAYER ); pLayer->SetWeight( 1 - CalcMovementPlaybackRate( &bIsMoving ) ); if ( !bIsMoving ) { pLayer->SetWeight( 1 ); } if ( ShouldChangeSequences() ) { // Whenever this layer stops blending, we can choose a new idle sequence to blend to, so he // doesn't always use the same idle. if ( pLayer->GetWeight() < 0.02f || m_iCurrent8WayIdleSequence == -1 ) { m_iCurrent8WayIdleSequence = m_pOuter->SelectWeightedSequence( ACT_IDLE ); m_iCurrent8WayCrouchIdleSequence = m_pOuter->SelectWeightedSequence( ACT_CROUCHIDLE ); } if ( m_eCurrentMainSequenceActivity == ACT_CROUCHIDLE || m_eCurrentMainSequenceActivity == ACT_RUN_CROUCH ) pLayer->SetSequence( m_iCurrent8WayCrouchIdleSequence ); else pLayer->SetSequence( m_iCurrent8WayIdleSequence ); } pLayer->SetPlaybackRate( 1 ); pLayer->SetCycle( pLayer->GetCycle() + m_pOuter->GetSequenceCycleRate( pStudioHdr, pLayer->GetSequence() ) * gpGlobals->frametime ); pLayer->SetCycle( fmod( pLayer->GetCycle(), 1 ) ); pLayer->SetOrder( MAIN_IDLE_SEQUENCE_LAYER ); #endif #endif } } }