//------------------------------------------------------------------------ void CGameRules::HostMigrationRemoveDuplicateDynamicEntities() { CRY_ASSERT(!m_hostMigrationCachedEntities.empty()); TEntityIdVec dynamicEntities; HostMigrationFindDynamicEntities(dynamicEntities); CryLog("CGameRules::HostMigrationRemoveDuplicateDynamicEntities(), found %i entities, already know about %i", (uint32)dynamicEntities.size(), (uint32)m_hostMigrationCachedEntities.size()); // Any entities in the dynamicEntities vector that aren't in the m_hostMigrationCachedEntities vector have been added during a previous migration attempt, need to remove them now // Note: entities in the m_hostMigrationCachedEntities vector are removed in OnFinalise const int numEntities = dynamicEntities.size(); for (int i = 0; i < numEntities; ++ i) { EntityId entityId = dynamicEntities[i]; if (!stl::find(m_hostMigrationCachedEntities, entityId)) { gEnv->pEntitySystem->RemoveEntity(entityId, true); } } }
//------------------------------------------------------------------------ void CGameRules::HostMigrationFindDynamicEntities(TEntityIdVec &results) { IEntityItPtr pEntityIt = gEnv->pEntitySystem->GetEntityIterator(); while (IEntity *pEntity = pEntityIt->Next()) { if (pEntity->GetFlags() & ENTITY_FLAG_NEVER_NETWORK_STATIC) { results.push_back(pEntity->GetId()); CryLog(" found dynamic entity %i '%s'", pEntity->GetId(), pEntity->GetName()); } } }
//------------------------------------------------------------------------ void CGameRules::HostMigrationFindDynamicEntities(TEntityIdVec &results) { IItemSystem *pItemSystem = g_pGame->GetIGameFramework()->GetIItemSystem(); IEntityItPtr pEntityIt = gEnv->pEntitySystem->GetEntityIterator(); while (IEntity *pEntity = pEntityIt->Next()) { if (pEntity->GetFlags() & ENTITY_FLAG_NEVER_NETWORK_STATIC) { results.push_back(pEntity->GetId()); CryLog(" found dynamic entity %i '%s'", pEntity->GetId(), pEntity->GetName()); } else { /*CItem *pItem = static_cast<CItem*>(pItemSystem->GetItem(pEntity->GetId())); if (pItem) { // Need to reset owner on static items since they will be given to players again once we've rejoined pItem->SetOwnerId(0); }*/ } } }