//------------------------------------------------------------------------ void CRapid::Accelerate(float acc) { m_acceleration = acc; if (acc > 0.0f) { if (!IsFiring()) SpinUpEffect(true); m_accelerating = true; m_decelerating = false; m_spinUpSoundId = m_pWeapon->PlayAction(m_pShared->actions.spin_up, 0, false, CItem::eIPAF_Default|CItem::eIPAF_CleanBlending); } else { m_accelerating = false; m_decelerating = true; if(m_speed>0.0f) { m_pWeapon->PlayAction(m_pShared->actions.spin_down, 0, false, CItem::eIPAF_Default|CItem::eIPAF_CleanBlending); if(m_firing) m_pWeapon->PlayAction(m_pShared->actions.spin_down_tail); } if (m_spinUpSoundId != INVALID_SOUNDID) { m_pWeapon->StopSound(m_spinUpSoundId); m_spinUpSoundId = INVALID_SOUNDID; } if (IsFiring()) SpinUpEffect(false); } }
//------------------------------------------------------------------------ void CRapid::StopFire() { bool acceleratingOrDecelerating = (m_rapidFlags & (eRapidFlag_accelerating|eRapidFlag_decelerating)) != 0; if (!m_firing && (m_reloading || !acceleratingOrDecelerating)) return; m_firing = false; m_rapidFlags &= ~(eRapidFlag_startedFiring|eRapidFlag_rapidFiring); if(m_acceleration >= 0.0f) { Accelerate(m_fireParams->rapidparams.deceleration); if (m_pWeapon->IsDestroyed()) FinishDeceleration(); } SpinUpEffect(false); SmokeEffect(); const bool shouldTriggerStopFiringAnim = m_fireParams->rapidparams.min_firingTimeToStop==0.0f || ((gEnv->pTimer->GetAsyncTime().GetSeconds() - m_startFiringTime.GetSeconds()) > m_fireParams->rapidparams.min_firingTimeToStop); if (shouldTriggerStopFiringAnim) { m_queueRapidFireAction = true; } m_startFiringTime.SetSeconds(0.0f); m_muzzleEffect.StopFire(this); m_pWeapon->RequestStopFire(); }
//------------------------------------------------------------------------ void CRapid::Firing(bool firing) { SpinUpEffect(false); if (m_firing != firing) { if (m_firing) StopFire(); } m_firing = firing; }
//------------------------------------------------------------------------ void CRapid::Firing(bool firing) { SpinUpEffect(false); if (m_firing != firing) { if (!m_firing) m_pWeapon->PlayAction(m_pShared->rapidactions.blast); } m_firing = firing; }
//------------------------------------------------------------------------ void CRapid::Accelerate(float acc) { m_acceleration = acc; if (acc > 0.0f) { if (!IsFiring()) { SpinUpEffect(true); } m_rapidFlags |= eRapidFlag_accelerating; m_rapidFlags &= ~eRapidFlag_decelerating; int flags = CItem::eIPAF_Default; m_pWeapon->PlayAction(GetFragmentIds().spin_up, 0, false, flags); } else { m_rapidFlags |= eRapidFlag_decelerating; m_rapidFlags &= ~eRapidFlag_accelerating; if(m_speed>0.0f) { m_pWeapon->PlayAction(GetFragmentIds().spin_down); if(m_firing) { m_pWeapon->PlayAction(GetFragmentIds().spin_down_tail); } } if (IsFiring()) { SpinUpEffect(false); } } }
//------------------------------------------------------------------------ void CRapid::NetStopFire() { if(m_acceleration >= 0.0f) { Accelerate(m_pShared->rapidparams.deceleration); if (m_pWeapon->IsDestroyed()) FinishDeceleration(); } SpinUpEffect(false); if(m_firing) SmokeEffect(); }
//------------------------------------------------------------------------ void CRapid::StopFire() { m_startedToFire = false; if (m_pWeapon->IsBusy() && !m_pWeapon->IsZoomingInOrOut()) { return; } if (m_zoomtimeout > 0.0f) { CActor *pActor = m_pWeapon->GetOwnerActor(); CScreenEffects *pSE = pActor ? pActor->GetScreenEffects() : NULL; if (pSE) { float speed = 1.0f / .1f; pSE->ResetBlendGroup(CScreenEffects::eSFX_GID_ZoomIn); pSE->ResetBlendGroup(CScreenEffects::eSFX_GID_ZoomOut); IBlendedEffect *fov = CBlendedEffect<CFOVEffect>::Create(CFOVEffect(pActor->GetEntityId(), 1.0f)); IBlendType *blend = CBlendType<CLinearBlend>::Create(CLinearBlend(1.0f)); pSE->StartBlend(fov, blend, speed, CScreenEffects::eSFX_GID_ZoomOut); } m_zoomtimeout = 0.0f; } if(m_acceleration >= 0.0f) { Accelerate(m_pShared->rapidparams.deceleration); if (m_pWeapon->IsDestroyed()) { FinishDeceleration(); } } SpinUpEffect(false); if(m_firing) { SmokeEffect(); } m_pWeapon->RequestStopFire(); }
//------------------------------------------------------------------------ void CRapid::NetStopFire() { if(m_acceleration >= 0.0f) { Accelerate(m_fireParams->rapidparams.deceleration); if (m_pWeapon->IsDestroyed()) FinishDeceleration(); } SpinUpEffect(false); if(m_firing) SmokeEffect(); m_firing = false; m_rapidFlags &= ~(eRapidFlag_startedFiring|eRapidFlag_rapidFiring|eRapidFlag_netShooting); m_queueRapidFireAction = true; m_startFiringTime.SetSeconds(0.0f); }