//------------------------------------------------------------------------ void CRapid::Activate(bool activate) { CSingle::Activate(activate); if (!activate) { if (m_soundId != INVALID_SOUNDID) { m_pWeapon->StopSound(m_soundId); m_soundId = INVALID_SOUNDID; } if (m_spinUpSoundId != INVALID_SOUNDID) { m_pWeapon->StopSound(m_spinUpSoundId); m_spinUpSoundId = INVALID_SOUNDID; } } m_rotation_angle = 0.0f; m_speed = 0.0f; m_accelerating = false; m_decelerating = false; m_acceleration = 0.0f; // initialize rotation xforms UpdateRotation(0.0f); m_soundId = INVALID_SOUNDID; m_spinUpSoundId = INVALID_SOUNDID; Firing(false); m_startedToFire = false; }
//------------------------------------------------------------------------ void CRapid::StartReload(int zoomed) { if (IsFiring()) Accelerate(m_pShared->rapidparams.deceleration); Firing(false); CSingle::StartReload(zoomed); }
//------------------------------------------------------------------------ void CRapid::StartReload(int zoomed) { if (IsFiring()) Accelerate(m_fireParams->rapidparams.deceleration); Firing(false); PlayStopRapidFireIfNeeded(); BaseClass::StartReload(zoomed); }
//------------------------------------------------------------------------ void CRapid::Activate(bool activate) { BaseClass::Activate(activate); if (m_pBarrelSpinAction) { m_pBarrelSpinAction->Stop(); m_pBarrelSpinAction = 0; } if (activate) { m_pBarrelSpinAction = GetWeapon()->PlayAction(GetFragmentIds().barrel_spin); } m_rotation_angle = 0.0f; m_speed = 0.0f; m_rapidFlags &= ~(eRapidFlag_accelerating|eRapidFlag_decelerating|eRapidFlag_startedFiring); m_acceleration = 0.0f; // initialize rotation xforms UpdateRotation(0.0f); Firing(false); }
//------------------------------------------------------------------------ void CRapid::Update(float frameTime, uint32 frameId) { FUNCTION_PROFILER( GetISystem(), PROFILE_GAME ); PlayStopRapidFireIfNeeded(); BaseClass::Update(frameTime, frameId); if (m_speed <= 0.0f && m_acceleration < 0.0001f) { FinishDeceleration(); return; } CActor* pOwnerActor = m_pWeapon->GetOwnerActor(); const bool isOwnerClient = pOwnerActor ? pOwnerActor->IsClient() : false; const bool isOwnerPlayer = pOwnerActor ? pOwnerActor->IsPlayer() : false; m_pWeapon->RequireUpdate(eIUS_FireMode); m_speed = m_speed + m_acceleration*frameTime; if (m_speed > m_fireParams->rapidparams.max_speed) { m_speed = m_fireParams->rapidparams.max_speed; m_rapidFlags &= ~eRapidFlag_accelerating; } if ((m_speed >= m_fireParams->rapidparams.min_speed) && !(m_rapidFlags & eRapidFlag_decelerating)) { float dt = 1.0f; if (cry_fabsf(m_speed)>0.001f && cry_fabsf(m_fireParams->rapidparams.max_speed)>0.001f) { dt = m_speed * (float)__fres(m_fireParams->rapidparams.max_speed); } CRY_ASSERT(m_fireParams->fireparams.rate > 0); m_next_shot_dt = 60.0f* (float)__fres((m_fireParams->fireparams.rate*dt)); if (CanFire(false)) { if (!OutOfAmmo()) { const bool firing = (m_rapidFlags & eRapidFlag_netShooting) || Shoot(true, m_fireParams->fireparams.autoReload); Firing(firing); } else { StopFire(); } } } else if (m_firing) { StopFire(); if (OutOfAmmo() && isOwnerPlayer) { m_pWeapon->Reload(); } } if ((m_speed < m_fireParams->rapidparams.min_speed) && (m_acceleration < 0.0f) && !(m_rapidFlags & eRapidFlag_decelerating)) Accelerate(m_fireParams->rapidparams.deceleration); UpdateRotation(frameTime); UpdateFiring(pOwnerActor, isOwnerClient, isOwnerPlayer, frameTime); }
//------------------------------------------------------------------------ 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); }