//------------------------------------------------------------------------ bool CFireModePlugin_Reject::Update(float frameTime, uint32 frameId) { CWeapon* pWeapon = m_pOwnerFiremode->GetWeapon(); if(pWeapon->IsOwnerClient()) { const int slot = pWeapon->GetStats().fp ? 0 : 1; const SEffectParams& rejectEffect = m_pParams->rejectEffect; Vec3 lastShellFXPosition = m_lastShellFXPosition; const Vec3 helperLocalPosition = pWeapon->GetSlotHelperPos(slot, rejectEffect.helper[slot].c_str(), true); if (lastShellFXPosition.IsZero()) { lastShellFXPosition = helperLocalPosition; } const Vec3 positionDifferential = helperLocalPosition - lastShellFXPosition; m_shellHelperVelocity = positionDifferential * (1.0f / frameTime); m_lastShellFXPosition = helperLocalPosition; } return false; }
//-------------------------------------------- void CLaser::TurnOnLaser(bool manual /*= false*/) { CWeapon* pParentWeapon = GetWeapon(); if(pParentWeapon == NULL) return; m_laserHelperFP.clear(); const SAccessoryParams *params = GetWeapon()->GetAccessoryParams(GetEntity()->GetClass()); if (params) m_laserHelperFP = params->attach_helper; int slot = pParentWeapon->IsOwnerFP() ? eIGS_FirstPerson: eIGS_ThirdPerson; CActor* pOwner = pParentWeapon->GetOwnerActor(); GetGameObject()->EnableUpdateSlot(this, eIUS_General); if (pOwner && pOwner->IsPlayer()) pParentWeapon->SetFiringLocator(this); m_laserBeam.TurnOnLaser(); //Turn off crosshair if (pParentWeapon->IsOwnerClient()) { pParentWeapon->SetCrosshairMode(CWeapon::eWeaponCrossHair_ForceOff); pParentWeapon->FadeCrosshair(0.0f, g_pGame->GetUI()->GetCVars()->hud_Crosshair_laser_fadeOutTime); } }
//------------------------------------------------------------------------ void CFireModePlugin_Reject::OnShoot() { const SEffectParams& rejectEffect = m_pParams->rejectEffect; CWeapon* pWeapon = m_pOwnerFiremode->GetWeapon(); const int slot = pWeapon->GetStats().fp ? 0 : 1; const bool doRejectEffect = (g_pGameCVars->i_rejecteffects != 0) && (!rejectEffect.effect[slot].empty()); if (doRejectEffect) { //First check if we can skip/cull the effect (not for the local player) if (!pWeapon->IsOwnerClient()) { const CCamera& camera = gEnv->p3DEngine->GetRenderingCamera(); const Vec3 cameraPos = camera.GetPosition(); const Vec3 effectPosition = pWeapon->GetWorldPos(); const float fDist2 = (cameraPos-effectPosition).len2(); // Too far, skip if (fDist2 > g_pGameCVars->g_rejectEffectCullDistance) { return; } // Not in the view ? if(g_pGameCVars->g_rejectEffectVisibilityCull) { Sphere emitterSphere(effectPosition, 2.0f); if(camera.IsSphereVisible_F(emitterSphere) == false) { return; } } } IParticleEffect* pParticleEffect = gEnv->pParticleManager->FindEffect(rejectEffect.effect[slot].c_str()); if (m_shellFXSpeed == 0.0f) { if (pParticleEffect) { const ParticleParams& particleParams = pParticleEffect->GetParticleParams(); m_shellFXSpeed = particleParams.fSpeed.GetMaxValue(); } } const Vec3 shellDirection = pWeapon->GetSlotHelperRotation(slot, rejectEffect.helper[slot].c_str(), true).GetColumn1(); const Vec3 shellVelocity = m_shellHelperVelocity + (shellDirection * m_shellFXSpeed); EntityEffects::SEffectSpawnParams spawnParams(ZERO, shellVelocity.GetNormalized(), rejectEffect.scale[slot], shellVelocity.GetLength(), false); EntityEffects::SpawnParticleWithEntity(pWeapon->GetEntity(), slot, pParticleEffect, rejectEffect.helper[slot].c_str(), spawnParams); } }
//-------------------------------------------- void CLaser::TurnOffLaser(bool manual /*= false*/) { if(!m_laserBeam.IsLaserActivated()) return; GetGameObject()->DisableUpdateSlot(this, eIUS_General); CWeapon* pParentWeapon = GetWeapon(); if(pParentWeapon == NULL) return; bool ownerIsFP = pParentWeapon? pParentWeapon->IsOwnerFP(): false; m_laserBeam.TurnOffLaser(); //Turn on crosshair if (pParentWeapon->IsOwnerClient()) { pParentWeapon->SetCrosshairMode(CWeapon::eWeaponCrossHair_Default); pParentWeapon->FadeCrosshair(1.0f, g_pGame->GetUI()->GetCVars()->hud_Crosshair_laser_fadeInTime); } pParentWeapon->SetFiringLocator(0); }