// Shake the view as requested void CPlayerView::ViewShakePostProcess(CPlayer &rPlayer, SViewParams &viewParams) { if (rPlayer.m_stats.inFreefall.Value()) { IView *pView = g_pGame->GetIGameFramework()->GetIViewSystem()->GetViewByEntityId(rPlayer.GetEntityId()); if (pView) { float dot(0.1f * min(19.0f, 5.0f + max(0.0f, rPlayer.m_stats.velocity * viewParams.rotation.GetColumn1()))); if (rPlayer.m_stats.inFreefall.Value() == 2) { dot *= 0.5f; } //float white[4] = {1,1,1,1}; //gEnv->pRenderer->Draw2dLabel( 100, 50, 2, white, false, "dot:%f vel:%f", dot, rPlayer.m_stats.velocity.len() ); pView->SetViewShake(Ang3(0.0005f, 0.001f, 0.0005f)*dot, Vec3(0.003f, 0.0f, 0.003f)*dot, 0.3f, 0.015f, 1.0f, 2); } } //testing code /*if (m_stats.inAir < 0.1f && m_stats.flatSpeed > GetStanceInfo(STANCE_STAND)->maxSpeed * 1.1f) { float shake(g_pGameCVars->cl_sprintShake); IView *pView = g_pGame->GetIGameFramework()->GetIViewSystem()->GetViewByEntityId(GetEntityId()); if (pView) pView->SetViewShake(ZERO,Vec3(m_stats.flatSpeed*0.0035f,0,m_stats.flatSpeed*0.0035f) * shake,0.1f,0.05f,0.5f,1); }*/ }
//--------------------------------- void CScreenEffects::CamShake(Vec3 rotateShake, Vec3 shiftShake, float freq, float shakeTime, float randomness, int shakeID) { if (g_pGameCVars && g_pGameCVars->g_detachCamera==0) { IViewSystem *pViewSystem = g_pGame->GetIGameFramework()->GetIViewSystem(); if (pViewSystem) { IView *pView = pViewSystem->GetActiveView(); if (pView) { const bool bClientActorView = pViewSystem->IsClientActorViewActive();; if (gEnv->pFlashUI) { gEnv->pFlashUI->SetHudElementsVisible(bClientActorView); } if (bClientActorView && shakeID == eCS_GID_Player) { CCCPOINT(Camera_DoShake); pView->SetViewShake(Ang3(rotateShake), shiftShake, shakeTime, freq, randomness, shakeID, false); } } } } }
//--------------------------------- void CScreenEffects::CamShake(Vec3 shiftShake, Vec3 rotateShake, float freq, float shakeTime, float randomness, int shakeID) { if (m_ownerActor->IsClient()) { IView *view = gEnv->pGame->GetIGameFramework()->GetIViewSystem()->GetActiveView(); if (view) { view->SetViewShake(Ang3(shiftShake), rotateShake, shakeTime, shakeTime, randomness, shakeID, false); } } }
// Shake the view as requested void CPlayerView::ViewShakePostProcess(CPlayer &rPlayer,SViewParams &viewParams) { if (rPlayer.m_stats.inFreefall.Value()) { IView *pView = g_pGame->GetIGameFramework()->GetIViewSystem()->GetViewByEntityId(rPlayer.GetEntityId()); if (pView) { float dot(0.1f * min(19.0f,5.0f + max(0.0f,rPlayer.m_stats.velocity*viewParams.rotation.GetColumn1()))); if (rPlayer.m_stats.inFreefall.Value()==2) dot *= 0.5f; //float white[4] = {1,1,1,1}; //gEnv->pRenderer->Draw2dLabel( 100, 50, 2, white, false, "dot:%f vel:%f", dot, rPlayer.m_stats.velocity.len() ); pView->SetViewShake(Ang3(0.0005f,0.001f,0.0005f)*dot,Vec3(0.003f,0.0f,0.003f)*dot,0.3f,0.015f,1.0f,2); } } #if 0 if (m_io.viewShake.amount>0.001f) { viewParams.shakeDuration = m_io.viewShake.duration; viewParams.shakeFrequency = m_io.viewShake.frequency; viewParams.shakeAmount = m_io.viewShake.angle; viewParams.shakeID = 1; memset(&m_io.viewShake,0,sizeof(SViewShake)); } /*else if (IsZeroG() && m_stats.flatSpeed > 10.0f) { viewParams.shakeDuration = 0.1f; viewParams.shakeFrequency = 0.1f; viewParams.shakeAmount = Ang3(m_stats.flatSpeed*0.001f,0,0); }*/ else if (m_in.stats_inAir < 0.1f && m_in.stats_flatSpeed > m_in.stand_MaxSpeed * 1.1f) { viewParams.shakeDuration = 0.1f ;/// (shake*shake); viewParams.shakeFrequency = 0.1f ;/// (shake*shake); viewParams.shakeAmount = Ang3(m_in.stats_flatSpeed*0.0015f,m_in.stats_flatSpeed*0.00035f,m_in.stats_flatSpeed*0.00035f) * m_in.shake; viewParams.shakeID = 0; } #endif //testing code /*if (m_stats.inAir < 0.1f && m_stats.flatSpeed > GetStanceInfo(STANCE_STAND)->maxSpeed * 1.1f) { float shake(g_pGameCVars->cl_sprintShake); IView *pView = g_pGame->GetIGameFramework()->GetIViewSystem()->GetViewByEntityId(GetEntityId()); if (pView) pView->SetViewShake(ZERO,Vec3(m_stats.flatSpeed*0.0035f,0,m_stats.flatSpeed*0.0035f) * shake,0.1f,0.05f,0.5f,1); }*/ }
int CScriptBind_Actor::SetViewShake(IFunctionHandler *pH, Ang3 shakeAngle, Vec3 shakeShift, float duration, float frequency, float randomness) { CActor *pActor = GetActor(pH); if (!pActor) return pH->EndFunction(); EntityId actorId = pActor->GetEntityId(); IView* pView = m_pGameFW->GetIViewSystem()->GetViewByEntityId(actorId); if (pView) { const int SCRIPT_SHAKE_ID = 42; pView->SetViewShake(shakeAngle, shakeShift, duration, frequency, randomness, SCRIPT_SHAKE_ID); } return pH->EndFunction(); }
//------------------------------------------------------------------------ void CShake::Update(SEntityUpdateContext &ctx, int updateSlot) { IActor *pClient = g_pGame->GetIGameFramework()->GetClientActor(); if (pClient) { float dist2ToClient((pClient->GetEntity()->GetWorldPos() - GetEntity()->GetWorldPos()).len2()); float maxRange(m_radius * m_radius); if (dist2ToClient<maxRange) { IView *pView = g_pGame->GetIGameFramework()->GetIViewSystem()->GetViewByEntityId(pClient->GetEntityId()); if (pView) { float strength = (1.0f - (dist2ToClient/maxRange)) * 0.5f; pView->SetViewShake(ZERO,Vec3(m_shake*strength,0,m_shake*strength),0.1f,0.0225f,1.5f,1); } } } }
//------------------------------------------------------------------------ void CRapid::Update(float frameTime, uint32 frameId) { FUNCTION_PROFILER( GetISystem(), PROFILE_GAME ); CSingle::Update(frameTime, frameId); if (m_speed <= 0.0f && m_acceleration < 0.0001f) { FinishDeceleration(); return; } m_pWeapon->RequireUpdate(eIUS_FireMode); m_speed = m_speed + m_acceleration*frameTime; if (m_speed > m_pShared->rapidparams.max_speed) { m_speed = m_pShared->rapidparams.max_speed; m_accelerating = false; } if ((m_speed >= m_pShared->rapidparams.min_speed) && (!m_decelerating)) { float dt = 1.0f; if (cry_fabsf(m_speed)>0.001f && cry_fabsf(m_pShared->rapidparams.max_speed>0.001f)) dt=m_speed/m_pShared->rapidparams.max_speed; m_next_shot_dt = 60.0f/(m_pShared->fireparams.rate*dt); bool canShoot = CanFire(false); if (canShoot) { if (!OutOfAmmo()) { if (m_netshooting) Firing(true); else Firing(Shoot(true, false)); if (m_firing && !(m_pShared->rapidparams.camshake_rotate.IsZero() && m_pShared->rapidparams.camshake_shift.IsZero())) { CActor *act = m_pWeapon->GetOwnerActor(); if (act && act->IsClient()) { IView *pView = g_pGame->GetIGameFramework()->GetIViewSystem()->GetActiveView(); if (pView) pView->SetViewShake(Ang3(m_pShared->rapidparams.camshake_rotate), m_pShared->rapidparams.camshake_shift, m_next_shot_dt/m_pShared->rapidparams.camshake_perShot, m_next_shot_dt/m_pShared->rapidparams.camshake_perShot, 0, 1); } } } else { Firing(false); Accelerate(m_pShared->rapidparams.deceleration); if (m_pWeapon->GetOwnerActor() && m_pWeapon->GetOwnerActor()->IsPlayer()) { SmokeEffect(); m_pWeapon->Reload(); } } } } else if (m_firing) { Firing(false); if (OutOfAmmo() && m_pWeapon->GetOwnerActor() && m_pWeapon->GetOwnerActor()->IsPlayer()) { SmokeEffect(); m_pWeapon->Reload(); } } if ((m_speed < m_pShared->rapidparams.min_speed) && (m_acceleration < 0.0f) && (!m_decelerating)) Accelerate(m_pShared->rapidparams.deceleration); UpdateRotation(frameTime); UpdateSound(frameTime); }
virtual void ProcessEvent( EFlowEvent event,SActivationInfo* pActInfo ) { if (event != eFE_Activate) return; if (!InputEntityIsLocalPlayer( pActInfo )) return; const bool bTriggered = IsPortActive(pActInfo, EIP_Trigger); const bool bFreqTriggered = IsPortActive(pActInfo, EIP_Frequency); if (bTriggered == false && bFreqTriggered == false) return; IGameFramework* pGF = gEnv->pGame->GetIGameFramework(); IView* pView = 0; IView* pActiveView = pGF->GetIViewSystem()->GetActiveView(); int viewType = GetPortInt(pActInfo, EIP_ViewType); if (viewType == VT_FirstPerson) // use player's view { IActor* pActor = pGF->GetClientActor(); if (pActor == 0) return; const int restriction = GetPortInt(pActInfo, EIP_Restriction); if (restriction != ER_None) { IVehicle* pVehicle = pActor->GetLinkedVehicle(); if (restriction == ER_InVehicle && pVehicle == 0) return; if (restriction == ER_NoVehicle && pVehicle != 0 /* && pVehicle->GetSeatForPassenger(entityId) != 0 */) return; } EntityId entityId = pActor->GetEntityId(); pView = pGF->GetIViewSystem()->GetViewByEntityId(entityId); } else // active view { pView = pActiveView; } if (pView == 0 || pView != pActiveView) return; const bool bGroundOnly = GetPortBool(pActInfo, EIP_GroundOnly); Ang3 angles = Ang3(DEG2RAD(GetPortVec3(pActInfo, EIP_Angle))); Vec3 shift = GetPortVec3(pActInfo, EIP_Shift); const float duration = GetPortFloat(pActInfo, EIP_Duration); float freq = GetPortFloat(pActInfo, EIP_Frequency); if (iszero(freq) == false) freq = 1.0f / freq; const float randomness = GetPortFloat(pActInfo, EIP_Randomness); static const bool bFlip = true; // GetPortBool(pActInfo, EIP_Flip); const bool bUpdateOnly = !bTriggered && bFreqTriggered; // it's an update if and only if Frequency has been changed const float distance = GetPortFloat(pActInfo, EIP_Distance); const float rangeMin = GetPortFloat(pActInfo, EIP_RangeMin); const float rangeMax = GetPortFloat(pActInfo, EIP_RangeMax); float amount = min(1.f, max(0.f, (rangeMax - distance) / (rangeMax - rangeMin))); angles *= amount; shift *= amount; pView->SetViewShake(angles, shift, duration, freq, randomness, FLOWGRAPH_SHAKE_ID, bFlip, bUpdateOnly, bGroundOnly); }