//------------------------------------------------------------------------ void CProjectile::HandleEvent(const SGameObjectEvent &event) { if (m_destroying) return; FUNCTION_PROFILER(GetISystem(), PROFILE_GAME); if (event.event == eGFE_OnCollision) { EventPhysCollision *pCollision = (EventPhysCollision *)event.ptr; IEntity *pCollidee = pCollision->iForeignData[0]==PHYS_FOREIGN_ID_ENTITY ? (IEntity*)pCollision->pForeignData[0]:0; const SCollisionParams* pCollisionParams = m_pAmmoParams->pCollision; if (pCollisionParams) { if (pCollisionParams->pParticleEffect) pCollisionParams->pParticleEffect->Spawn(true, IParticleEffect::ParticleLoc(pCollision->pt, pCollision->n, pCollisionParams->scale)); if (pCollisionParams->sound) { _smart_ptr<ISound> pSound = gEnv->pSoundSystem->CreateSound(pCollisionParams->sound, FLAG_SOUND_DEFAULT_3D); pSound->SetSemantic(eSoundSemantic_Projectile); pSound->SetPosition(pCollision->pt); pSound->Play(); } IStatObj *statObj = 0; if (pCollision->iForeignData[1] == PHYS_FOREIGN_ID_STATIC) { IRenderNode * pRN = (IRenderNode*)pCollision->pForeignData[1]; if (pRN && pRN->GetEntityStatObj(0)) statObj = pRN->GetEntityStatObj(0); } } // add battledust for bulletimpact if(gEnv->bServer && g_pGame->GetGameRules()) { if(CBattleDust* pBD = g_pGame->GetGameRules()->GetBattleDust()) { pBD->RecordEvent(eBDET_ShotImpact, pCollision->pt, GetEntity()->GetClass()); } } Ricochet(pCollision); } }
//------------------------------------------------------------------------ void CProjectile::HandleEvent(const SGameObjectEvent &event) { if(m_destroying) return; FUNCTION_PROFILER(GetISystem(), PROFILE_GAME); if(event.event == eGFE_OnCollision) { EventPhysCollision *pCollision = (EventPhysCollision *)event.ptr; if(pCollision == NULL) return; const SCollisionParams *pCollisionParams = m_pAmmoParams->pCollision; if(pCollisionParams) { if(pCollisionParams->pParticleEffect) pCollisionParams->pParticleEffect->Spawn(true, IParticleEffect::ParticleLoc(pCollision->pt, pCollision->n, pCollisionParams->scale)); if(pCollisionParams->sound) { _smart_ptr<ISound> pSound = gEnv->pSoundSystem->CreateSound(pCollisionParams->sound, FLAG_SOUND_DEFAULT_3D); if(pSound) { pSound->SetSemantic(eSoundSemantic_Projectile); pSound->SetPosition(pCollision->pt); pSound->Play(); } } } // add battledust for bulletimpact if(gEnv->bServer && g_pGame->GetGameRules()) { if(CBattleDust *pBD = g_pGame->GetGameRules()->GetBattleDust()) { pBD->RecordEvent(eBDET_ShotImpact, pCollision->pt, GetEntity()->GetClass()); } } Ricochet(pCollision); //Update damage if((m_damageDropPerMeter>0.0001f)&& (((pCollision->pt-m_initial_pos).len2()>m_damageDropMinDisSqr)||m_firstDropApplied)) { if(!m_firstDropApplied) { m_firstDropApplied = true; m_initial_pos = m_initial_pos + (m_initial_dir*(sqrt_fast_tpl(m_damageDropMinDisSqr))); } Vec3 vDiff = pCollision->pt - m_initial_pos; float dis = vDiff.len(); m_damage -= (int)(floor_tpl(m_damageDropPerMeter * dis)); //Check m_damage is positive if(m_damage<MIN_DAMAGE) m_damage=MIN_DAMAGE; //Also modify initial position (the projectile could not be destroyed, cause of pirceability) m_initial_pos = pCollision->pt; } // Notify AI system about grenades. if(gEnv->pAISystem) { IAIObject *pAI = 0; if((pAI = GetEntity()->GetAI()) != NULL && pAI->GetAIType() == AIOBJECT_GRENADE) { // Associate event with vehicle if the shooter is in a vehicle (tank cannon shot, etc) EntityId ownerId = m_ownerId; IActor *pActor = g_pGame->GetIGameFramework()->GetIActorSystem()->GetActor(ownerId); if(pActor && pActor->GetLinkedVehicle() && pActor->GetLinkedVehicle()->GetEntityId()) ownerId = pActor->GetLinkedVehicle()->GetEntityId(); SAIStimulus stim(AISTIM_GRENADE, AIGRENADE_COLLISION, ownerId, GetEntityId(), GetEntity()->GetWorldPos(), ZERO, 12.0f); gEnv->pAISystem->RegisterStimulus(stim); } } } }