//------------------------------------------------------------------------ void CProjectile::Update(SEntityUpdateContext &ctx, int updateSlot) { FUNCTION_PROFILER(GetISystem(), PROFILE_GAME); if (updateSlot!=0) return; float color[4] = {1,1,1,1}; bool bDebug = g_pGameCVars->i_debug_projectiles > 0; if(bDebug) gEnv->pRenderer->Draw2dLabel(50,15,2.0f,color,false,"Projectile: %s",GetEntity()->GetClass()->GetName()); Vec3 pos = GetEntity()->GetWorldPos(); ScaledEffect(m_pAmmoParams->pScaledEffect); // update whiz if(m_pAmmoParams->pWhiz) { if (m_whizSoundId == INVALID_SOUNDID) { IActor *pActor = g_pGame->GetIGameFramework()->GetClientActor(); if (pActor && (m_ownerId != pActor->GetEntityId())) { float probability = 0.85f; if (Random()<=probability) { Lineseg line(m_last, pos); Vec3 player = pActor->GetEntity()->GetWorldPos(); float t; float distanceSq=Distance::Point_LinesegSq(player, line, t); if (distanceSq < 4.7f*4.7f && (t>=0.0f && t<=1.0f)) { if (distanceSq >= 0.65*0.65) { Sphere s; s.center = player; s.radius = 4.7f; Vec3 entry,exit; int intersect=Intersect::Lineseg_Sphere(line, s, entry,exit); if (intersect==0x1 || intersect==0x3) // one entry or one entry and one exit WhizSound(true, entry, (pos-m_last).GetNormalized()); } } } } } } if (m_trailSoundId==INVALID_SOUNDID) TrailSound(true); m_totalLifetime += ctx.fFrameTime; m_last = pos; }
//------------------------------------------------------------------------ void CProjectile::Destroy() { if(m_destroying) return; m_destroying=true; EndScaledEffect(m_pAmmoParams->pScaledEffect); GetGameObject()->ReleaseProfileManager(this); GetGameObject()->EnablePhysicsEvent(false, eEPE_OnCollisionLogged); if(m_obstructObject) gEnv->pPhysicalWorld->DestroyPhysicalEntity(m_obstructObject); if(m_hitListener) if(CGameRules *pGameRules = g_pGame->GetGameRules()) pGameRules->RemoveHitListener(this); WhizSound(false, ZERO, ZERO); bool returnToPoolOK = true; if(m_pAmmoParams->reusable) { returnToPoolOK = g_pGame->GetWeaponSystem()->ReturnToPool(this); } if(!m_pAmmoParams->reusable || !returnToPoolOK) { if((GetEntity()->GetFlags()&ENTITY_FLAG_CLIENT_ONLY) || gEnv->bServer) gEnv->pEntitySystem->RemoveEntity(GetEntity()->GetId()); } }
//------------------------------------------------------------------------ void CProjectile::Destroy() { m_destroying=true; if ((GetEntity()->GetFlags()&ENTITY_FLAG_CLIENT_ONLY) || gEnv->bServer) gEnv->pEntitySystem->RemoveEntity(GetEntity()->GetId()); WhizSound(false, ZERO, ZERO); }