//------------------------------------------------------------------------ int CTracerManager::EmitTracer(const STracerParams ¶ms, const EntityId bulletId) { if(!gEnv->IsClient()) return -1; CRecordingSystem* pRecordingSystem = g_pGame->GetRecordingSystem(); if (pRecordingSystem) { if (!pRecordingSystem->OnEmitTracer(params)) { return -1; } } int idx = 0; if(m_numActiveTracers < kMaxNumTracers) { //Add to end of array idx = m_numActiveTracers; m_tracerPool[idx].CreateEntity(); m_tracerPool[idx].Reset(params.position, params.destination); m_numActiveTracers++; } else { //Find the oldest existing tracer and remove assert(!"Too many tracers in existence! Removing oldest"); float oldest = 0.0f; for(int i = 0; i < kMaxNumTracers; i++) { CryPrefetchUnsafe(&m_tracerPool[i+4]); if(m_tracerPool[i].m_age > oldest) { oldest = m_tracerPool[i].m_age; idx = i; } } m_tracerPool[idx].Reset(params.position, params.destination); } CTracer& tracer = m_tracerPool[idx]; tracer.m_boundToBulletId = bulletId; tracer.m_tracerFlags = kTracerFlag_active; tracer.m_effectSlot = -1; tracer.m_geometryOpacity = params.geometryOpacity; if (params.geometry && params.geometry[0]) { tracer.SetGeometry(params.geometry, params.scale); tracer.m_tracerFlags |= kTracerFlag_useGeometry; } tracer.SetLifeTime(params.lifetime); tracer.m_speed = params.speed; tracer.m_pos = params.position; tracer.m_startingPos = params.position; tracer.m_dest = params.destination; tracer.m_fadeOutTime = params.delayBeforeDestroy; if(params.scaleToDistance) { tracer.m_tracerFlags |= kTracerFlag_scaleToDistance; } if(params.dontTranslate) { tracer.m_tracerFlags |= kTracerFlag_dontTranslate; } if(params.updateDestPosFromBullet) { tracer.m_tracerFlags |= kTracerFlag_updateDestFromBullet; } tracer.m_startFadeOutTime = params.startFadeOutTime; tracer.m_scale = params.scale; tracer.m_slideFrac = params.slideFraction; if (IEntity *pEntity=gEnv->pEntitySystem->GetEntity(tracer.m_entityId)) { pEntity->Hide(0); } // set effect after unhiding the entity, or else the particle emitter is created hidden if (params.effect && params.effect[0]) tracer.SetEffect(params.effect, params.scale); return idx; }