void CEditorGame::InitEntityArchetypeEnums(IGameToEditorInterface* pGTE, const char* levelFolder /*= NULL*/, const char* levelName /*= NULL*/) { CRY_ASSERT(pGTE); // Look in all the archetype files ICryPak* pCryPak = gEnv->pCryPak; CRY_ASSERT(pCryPak); std::vector<string> vecArchetypeNames; if (levelFolder && levelName) { string levelPath = string(levelFolder) + "/" + string(levelName) + ".cry"; if (pCryPak && pCryPak->OpenPack(levelPath)) { string editorXML = string(levelFolder) + "/Level.editor_xml"; XmlNodeRef pRoot = gEnv->pSystem->LoadXmlFromFile(editorXML); if (pRoot) GetArchetypesFromLevelLib(pRoot, &vecArchetypeNames); pCryPak->ClosePack(levelPath); } } _finddata_t fd; string sSearchPath = PathUtil::Make("Libs\\EntityArchetypes", "*", "xml"); intptr_t handle = pCryPak->FindFirst(sSearchPath, &fd); if (handle >= 0) { do { string sFilePath = PathUtil::Make("Libs\\EntityArchetypes", fd.name, "xml"); XmlNodeRef pRoot = gEnv->pSystem->LoadXmlFromFile(sFilePath.c_str()); if (!pRoot || stricmp(pRoot->getTag(), "EntityPrototypeLibrary")) continue; XmlString sRootName; pRoot->getAttr("Name", sRootName); GetArchetypesFromLib(pRoot, sRootName, &vecArchetypeNames); } while (pCryPak->FindNext(handle, &fd) >= 0); pCryPak->FindClose(handle); } if (!vecArchetypeNames.empty()) { size_t numFilters = 0; const int allArchetypeCount = vecArchetypeNames.size()+1; const char** allArchetypeNames = new const char*[allArchetypeCount]; allArchetypeNames[numFilters++] = ""; // Blank entry at top std::vector<string>::const_iterator iter = vecArchetypeNames.begin(); std::vector<string>::const_iterator iterEnd = vecArchetypeNames.end(); while (iter != iterEnd) { assert(numFilters > 0 && numFilters < allArchetypeCount); PREFAST_ASSUME(numFilters > 0 && numFilters < allArchetypeCount); allArchetypeNames[numFilters++] = iter->c_str(); ++iter; } pGTE->SetUIEnums("entity_archetypes", allArchetypeNames, numFilters); delete[] allArchetypeNames; } }