Index: binaries/data/mods/public/gui/lobby/lobby.js =================================================================== --- binaries/data/mods/public/gui/lobby/lobby.js +++ binaries/data/mods/public/gui/lobby/lobby.js @@ -993,6 +993,8 @@ g_SelectedGamePort = g_GameList[gamesBox.selected].port; } + let modList = Engine.GetEngineInfo().mods; + g_GameList = Engine.GetGameList().map(game => { game.hasBuddies = 0; @@ -1017,7 +1019,7 @@ Math.round(playerRatings.reduce((sum, current) => sum + current) / playerRatings.length) : g_DefaultLobbyRating; - if (!hasSameMods(JSON.parse(game.mods), Engine.GetEngineInfo().mods)) + if (!hasSameMods(JSON.parse(game.mods), modList)) game.state = "incompatible"; return game; Index: source/lib/file/vfs/tests/test_vfs_tree.h =================================================================== --- source/lib/file/vfs/tests/test_vfs_tree.h +++ source/lib/file/vfs/tests/test_vfs_tree.h @@ -122,20 +122,20 @@ void check_priority(VfsDirectory& root, const VfsPath& path, size_t priority) { VfsDirectory* dir; VfsFile* file; - TS_ASSERT_OK(vfs_Lookup(path, &root, dir, &file, VFS_LOOKUP_SKIP_POPULATE)); + TS_ASSERT_OK(vfs_Lookup(path, &root, dir, &file, 0)); TS_ASSERT_EQUALS(file->Priority(), priority); } void file_does_not_exists(VfsDirectory& root, const VfsPath& path) { VfsDirectory* dir; VfsFile* file; - TS_ASSERT_EQUALS(vfs_Lookup(path, &root, dir, &file, VFS_LOOKUP_SKIP_POPULATE), ERR::VFS_FILE_NOT_FOUND); + TS_ASSERT_EQUALS(vfs_Lookup(path, &root, dir, &file, 0), ERR::VFS_FILE_NOT_FOUND); } void directory_exists(VfsDirectory& root, const VfsPath& path, Status error = INFO::OK) { VfsDirectory* dir; - TS_ASSERT_EQUALS(vfs_Lookup(path, &root, dir, nullptr, VFS_LOOKUP_SKIP_POPULATE), error); + TS_ASSERT_EQUALS(vfs_Lookup(path, &root, dir, nullptr, 0), error); } public: Index: source/lib/file/vfs/vfs.cpp =================================================================== --- source/lib/file/vfs/vfs.cpp +++ source/lib/file/vfs/vfs.cpp @@ -69,7 +69,9 @@ } VfsDirectory* directory; - WARN_RETURN_STATUS_IF_ERR(vfs_Lookup(mountPoint, &m_rootDirectory, directory, 0, VFS_LOOKUP_ADD|VFS_LOOKUP_SKIP_POPULATE)); + WARN_RETURN_STATUS_IF_ERR(vfs_Lookup(mountPoint, &m_rootDirectory, directory, 0, 0)); + + RETURN_STATUS_IF_ERR(vfs_Populate(&m_rootDirectory)); PRealDirectory realDirectory(new RealDirectory(path, priority, flags)); RETURN_STATUS_IF_ERR(vfs_Attach(directory, realDirectory)); @@ -134,7 +136,7 @@ ScopedLock s; VfsDirectory* directory; Status st; - st = vfs_Lookup(pathname, &m_rootDirectory, directory, 0, VFS_LOOKUP_ADD|VFS_LOOKUP_CREATE|VFS_LOOKUP_CREATE_ALWAYS); + st = vfs_Lookup(pathname, &m_rootDirectory, directory, 0, VFS_LOOKUP_CREATE|VFS_LOOKUP_CREATE_ALWAYS); if (st == ERR::FILE_ACCESS) return ERR::FILE_ACCESS; @@ -157,7 +159,7 @@ VfsDirectory* directory; VfsFile* file; Status st; - st = vfs_Lookup(pathname, &m_rootDirectory, directory, &file, VFS_LOOKUP_ADD|VFS_LOOKUP_CREATE); + st = vfs_Lookup(pathname, &m_rootDirectory, directory, &file, VFS_LOOKUP_CREATE); // There is no such file, create it. if (st == ERR::VFS_FILE_NOT_FOUND) @@ -185,7 +187,7 @@ // per 2010-05-01 meeting, this shouldn't raise 'scary error // dialogs', which might fail to display the culprit pathname // instead, callers should log the error, including pathname. - RETURN_STATUS_IF_ERR(vfs_Lookup(pathname, &m_rootDirectory, directory, &file)); + RETURN_STATUS_IF_ERR(vfs_Lookup(pathname, &m_rootDirectory, directory, &file, 0)); fileContents = DummySharedPtr((u8*)0); size = file->Size(); Index: source/lib/file/vfs/vfs_lookup.h =================================================================== --- source/lib/file/vfs/vfs_lookup.h +++ source/lib/file/vfs/vfs_lookup.h @@ -37,24 +37,15 @@ enum VfsLookupFlags { - // add (if they do not already exist) subdirectory components - // encountered in the path[name]. - VFS_LOOKUP_ADD = 1, - // if VFS directories encountered are not already associated // with a real directory, do so (creating the directories // if they do not already exist). - VFS_LOOKUP_CREATE = 2, - - // don't populate the directories encountered. this makes sense - // when adding files from an archive, which would otherwise - // cause nearly every directory to be populated. - VFS_LOOKUP_SKIP_POPULATE = 4, + VFS_LOOKUP_CREATE = 1, // even create directories if they are already present, this is // useful to write new files to the directory that was attached // last, if the directory wasn't mounted with VFS_MOUNT_REPLACEABLE - VFS_LOOKUP_CREATE_ALWAYS = 8 + VFS_LOOKUP_CREATE_ALWAYS = 2 }; /** Index: source/lib/file/vfs/vfs_lookup.cpp =================================================================== --- source/lib/file/vfs/vfs_lookup.cpp +++ source/lib/file/vfs/vfs_lookup.cpp @@ -75,19 +75,14 @@ Status vfs_Lookup(const VfsPath& pathname, VfsDirectory* startDirectory, VfsDirectory*& directory, VfsFile** pfile, size_t flags) { // extract and validate flags (ensure no unknown bits are set) - const bool addMissingDirectories = (flags & VFS_LOOKUP_ADD) != 0; const bool createMissingDirectories = (flags & VFS_LOOKUP_CREATE) != 0; - const bool skipPopulate = (flags & VFS_LOOKUP_SKIP_POPULATE) != 0; const bool createAlways = (flags & VFS_LOOKUP_CREATE_ALWAYS) != 0; - ENSURE((flags & ~(VFS_LOOKUP_ADD|VFS_LOOKUP_CREATE|VFS_LOOKUP_SKIP_POPULATE|VFS_LOOKUP_CREATE_ALWAYS)) == 0); + ENSURE((flags & ~(VFS_LOOKUP_CREATE|VFS_LOOKUP_CREATE_ALWAYS)) == 0); directory = startDirectory; if(pfile) *pfile = 0; - if(!skipPopulate) - RETURN_STATUS_IF_ERR(vfs_Populate(directory)); - // early-out for pathname == "" when mounting into VFS root if(pathname.empty()) // (prevent iterator error in loop end condition) { @@ -109,12 +104,7 @@ VfsDirectory* subdirectory = directory->GetSubdirectory(subdirectoryName); if(!subdirectory) - { - if(addMissingDirectories) - subdirectory = directory->AddSubdirectory(subdirectoryName); - else - return ERR::VFS_DIR_NOT_FOUND; // NOWARN - } + subdirectory = directory->AddSubdirectory(subdirectoryName); if(createMissingDirectories && (!subdirectory->AssociatedDirectory() || (createAlways && (subdirectory->AssociatedDirectory()->Flags() & VFS_MOUNT_REPLACEABLE) != 0))) @@ -129,10 +119,7 @@ PRealDirectory realDirectory(new RealDirectory(currentPath, 0, 0)); RETURN_STATUS_IF_ERR(vfs_Attach(subdirectory, realDirectory)); } - - if(!skipPopulate) - RETURN_STATUS_IF_ERR(vfs_Populate(subdirectory)); - + RETURN_STATUS_IF_ERR(vfs_Populate(subdirectory)); directory = subdirectory; } Index: source/lib/file/vfs/vfs_populate.cpp =================================================================== --- source/lib/file/vfs/vfs_populate.cpp +++ source/lib/file/vfs/vfs_populate.cpp @@ -90,11 +90,8 @@ { PopulateHelper* this_ = (PopulateHelper*)cbData; - // (we have to create missing subdirectoryNames because archivers - // don't always place directory entries before their files) - const size_t flags = VFS_LOOKUP_ADD|VFS_LOOKUP_SKIP_POPULATE; VfsDirectory* directory; - WARN_IF_ERR(vfs_Lookup(pathname, this_->m_directory, directory, 0, flags)); + WARN_IF_ERR(vfs_Lookup(pathname, this_->m_directory, directory, 0, 0)); const VfsPath name = fileInfo.Name(); const VfsFile file(name, (size_t)fileInfo.Size(), fileInfo.MTime(), this_->m_realDirectory->Priority(), archiveFile);