void UpdateAvatarEffect(void) { if(!haptics->HasDevice()) return; Vector vel; Vector vvel; Vector evel; QAngle eye; C_BasePlayer* pPlayer = C_BasePlayer::GetLocalPlayer(); if(!pPlayer) return; eye = pPlayer->GetAbsAngles(); if(pPlayer->IsInAVehicle() && pPlayer->GetVehicle()) { pPlayer->GetVehicle()->GetVehicleEnt()->EstimateAbsVelocity(vvel); eye = pPlayer->GetVehicle()->GetVehicleEnt()->EyeAngles(); if(!Q_stristr(pPlayer->GetVehicle()->GetVehicleEnt()->GetClassname(),"choreo")) { eye[YAW] += 90; } } else { vel = pPlayer->GetAbsVelocity(); } Vector PlayerVel = pPlayer->GetAbsVelocity(); //Choreo vehicles use player avatar and don't produce their own velocity if(!pPlayer->GetVehicle() || abs(vvel.Length()) == 0 ) { vel = PlayerVel; } else vel = vvel; VectorYawRotate(vel, -90 -eye[YAW], vel ); vel.y = -vel.y; vel.z = -vel.z; switch(pPlayer->GetMoveType()) { case MOVETYPE_NOCLIP: vel *= hap_noclip_avatar_scale.GetFloat(); break; default: break; } haptics->UpdateAvatarVelocity(vel); }
//----------------------------------------------------------------------------- // Purpose: Returns a very rough estimate for distance needed to turn //----------------------------------------------------------------------------- float UnitVehicleNavigator::CalcNeededDistanceForTurn( UnitBaseMoveCommand &MoveCommand, float turn ) { float turnPerInterval = MoveCommand.yawspeed * 10.0f * MoveCommand.interval; float turnStep, speedWeight; Vector dir( 1, 0, 0 ); Vector end(0, 0, 0); int i = 0; for( i = 0; turn > 0 && i < 1000; i++ ) { turnStep = Min( turnPerInterval, turn - turnPerInterval ); speedWeight = turnStep / turnPerInterval; turn -= turnPerInterval; VectorYawRotate( dir, turnStep, dir ); end += dir * (MoveCommand.maxspeed * speedWeight * MoveCommand.interval); } return end.Length2D(); }
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; } }
float DensityWeightsMap::Get( const Vector &vPos ) { Vector vTranslated; #ifdef USELERP float x, y; int xlow, xhigh, ylow, yhigh; switch( m_iType ) { case DENSITY_NONE: { return 0.0f; } break; case DENSITY_GAUSSIAN: default: { x = ((vPos.x - m_pOuter->GetAbsOrigin().x)/MAP_TILE_SIZE) + m_iHalfSizeX; y = ((vPos.y - m_pOuter->GetAbsOrigin().y)/MAP_TILE_SIZE) + m_iHalfSizeY; } break; }; xlow = floor(x); xhigh = ceil(x); ylow = floor(y); yhigh = ceil(y); if( xlow < 0 || ylow < 0 || xhigh >= m_iSizeX || yhigh >= m_iSizeY ) return 0.0f; return Lerp<float>(sqrt(pow(x - xlow, 2) + pow(y - ylow, 2)), m_pWeights[xlow][ylow], m_pWeights[xhigh][yhigh]); #else // Read out density for the given position // If outside our field, return zero (too far away). int x, y; switch( m_iType ) { case DENSITY_NONE: { return 0.0f; } break; case DENSITY_GAUSSIANECLIPSE: { vTranslated = vPos - m_pOuter->GetAbsOrigin(); VectorYawRotate(vTranslated, -m_pOuter->GetAbsAngles()[YAW], vTranslated); x = (int)floor(((vTranslated.x + m_fXOffset)/unit_density_eclipse_tile_res.GetFloat()) + m_iHalfSizeX + 0.5f); y = (int)floor(((vTranslated.y + m_fYOffset)/unit_density_eclipse_tile_res.GetFloat()) + m_iHalfSizeY + 0.5f); } break; case DENSITY_GAUSSIAN: default: { x = (int)floor(((vPos.x - m_pOuter->GetAbsOrigin().x)/MAP_TILE_SIZE) + m_iHalfSizeX + 0.5f); y = (int)floor(((vPos.y - m_pOuter->GetAbsOrigin().y)/MAP_TILE_SIZE) + m_iHalfSizeY + 0.5f); } break; } if( x < 0 || y < 0 || x >= m_iSizeX || y >= m_iSizeY ) return 0.0f; return m_pWeights[x][y]; #endif // USELERP }