//------------------------------------------------------------------------ void CVehicleDamageBehaviorBurn::Update(const float deltaTime) { m_timeCounter -= deltaTime; if(m_timeCounter <= 0.0f) { CGameRules *pGameRules = g_pGame->GetGameRules(); if(pGameRules && gEnv->bServer) { Vec3 worldPos; if(m_pHelper) worldPos = m_pHelper->GetWorldSpaceTranslation(); else worldPos = m_pVehicle->GetEntity()->GetWorldTM().GetTranslation(); SEntityProximityQuery query; query.box = AABB(worldPos-Vec3(m_radius), worldPos+Vec3(m_radius)); gEnv->pEntitySystem->QueryProximity(query); IEntity *pEntity = 0; for(int i = 0; i < query.nCount; ++i) { if((pEntity = query.pEntities[i]) && pEntity->GetPhysics()) { float damage = (pEntity->GetId() == m_pVehicle->GetEntityId()) ? m_selfDamage : m_damage; // SNH: need to check vertical distance here as the QueryProximity() call seems to work in 2d only Vec3 pos = pEntity->GetWorldPos(); if(abs(pos.z - worldPos.z) < m_radius) { if(damage > 0.f) { HitInfo hitInfo; hitInfo.damage = damage; hitInfo.pos = worldPos; hitInfo.radius = m_radius; hitInfo.targetId = pEntity->GetId(); hitInfo.shooterId = m_shooterId; hitInfo.weaponId = m_pVehicle->GetEntityId(); hitInfo.type = pGameRules->GetHitTypeId("fire"); pGameRules->ServerHit(hitInfo); } } } } if(gEnv->pAISystem) gEnv->pAISystem->RegisterDamageRegion(this, Sphere(worldPos, m_radius)); } m_timeCounter = m_interval; } m_pVehicle->NeedsUpdate(); }
void CVTOLVehicleManager::DestructionDamageRatioReached(IVehicle* pVehicle, SVTOLInfo& info, float frameTime) { pVehicle->ClientEvictAllPassengers(); LockSeats(pVehicle, true); IPhysicalEntity* pPhysics = pVehicle->GetEntity()->GetPhysics(); if(pPhysics) { DestroyVTOL(pVehicle->GetEntity(), info); CGameRules::SModuleRMIEntityParams params; params.m_listenerIndex = m_moduleRMIIndex; params.m_entityId = info.entityId; params.m_data = eRMITypeSingleEntity_vtol_destroyed; // RMI will patch entityIDs between clients g_pGame->GetGameRules()->GetGameObject()->InvokeRMIWithDependentObject(CGameRules::ClModuleRMISingleEntity(), params, eRMI_ToRemoteClients, info.entityId); } //Damage any players inside CGameRules* pGameRules = g_pGame->GetGameRules(); CVehicleMovementMPVTOL* pMovement = static_cast<CVehicleMovementMPVTOL*>(pVehicle->GetMovement()); if (pGameRules && pMovement) { EntityId destroyerId = pMovement->GetDestroyerId(); HitInfo hitInfo(destroyerId, 0, pVehicle->GetEntityId(), g_pGameCVars->g_VTOLOnDestructionPlayerDamage, 0, 0, 0, CGameRules::EHitType::VTOLExplosion); TPlayerList& currentPlayerList = info.playersInside; TPlayerList::const_iterator iter = currentPlayerList.begin(); TPlayerList::const_iterator end = currentPlayerList.end(); while(iter != end) { hitInfo.targetId = *iter; pGameRules->ServerHit(hitInfo); ++iter; } } }