diff options
author | Vittorio Romeo <vittorio.romeo@outlook.com> | 2021-10-26 17:03:45 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-26 17:03:45 +0100 |
commit | 6f9f2bfc9ded093eca6bd4a7072935248af47c55 (patch) | |
tree | e19f6bb6e6c6ae7ad7cd9481fa7cb16771e664bb | |
parent | 5ac4bb8dc40a51664d1228d1061c7e43f7e6222f (diff) | |
parent | e571c18f3f91073129817a8fa6a9f2f7209226de (diff) |
Merge pull request #357 from SuperV1234/offline_cache
Improve Offline Gameplay through Caching Workshop Pack Locations
-rwxr-xr-x | .gitignore | bin | 3324 -> 3353 bytes | |||
-rw-r--r-- | include/SSVOpenHexagon/Global/Assets.hpp | 5 | ||||
-rw-r--r-- | src/SSVOpenHexagon/Core/Steam.cpp | 23 | ||||
-rw-r--r-- | src/SSVOpenHexagon/Global/Assets.cpp | 68 |
4 files changed, 92 insertions, 4 deletions
Binary files differ diff --git a/include/SSVOpenHexagon/Global/Assets.hpp b/include/SSVOpenHexagon/Global/Assets.hpp index 49689224..75815ab6 100644 --- a/include/SSVOpenHexagon/Global/Assets.hpp +++ b/include/SSVOpenHexagon/Global/Assets.hpp @@ -73,6 +73,7 @@ private: [[nodiscard]] bool loadAllPackDatas(); [[nodiscard]] bool loadAllPackAssets(); + [[nodiscard]] bool loadWorkshopPackDatasFromCache(); [[nodiscard]] bool verifyAllPackDependencies(); [[nodiscard]] bool loadAllLocalProfiles(); @@ -102,6 +103,10 @@ public: ~HGAssets(); + // When the Steam API can not be retrieved, this set holds pack ids + // retrieved from the cache to try and load the workshop packs installed + std::unordered_set<std::string> cachedWorkshopPackIds; + [[nodiscard]] LoadInfo& getLoadResults(); [[nodiscard]] sf::Texture& getTexture(const std::string& mId); diff --git a/src/SSVOpenHexagon/Core/Steam.cpp b/src/SSVOpenHexagon/Core/Steam.cpp index 3fb5a140..de77d90b 100644 --- a/src/SSVOpenHexagon/Core/Steam.cpp +++ b/src/SSVOpenHexagon/Core/Steam.cpp @@ -191,6 +191,8 @@ void steam_manager::steam_manager_impl::load_workshop_data() constexpr std::size_t folderBufSize = 512; char folderBuf[folderBufSize]; + ssvuj::Obj cacheArray; + for(PublishedFileId_t id : subscribedItemsIds) { ssvu::lo("Steam") << "Workshop subscribed item id: " << id << '\n'; @@ -203,14 +205,29 @@ void steam_manager::steam_manager_impl::load_workshop_data() if(installed) { + std::string folderBufStr{folderBuf}; + ssvu::lo("Steam") << "Workshop id " << id << " is installed, with size " - << itemDiskSize << " at folder " << std::string{folderBuf} - << '\n'; + << itemDiskSize << " at folder " << folderBufStr << '\n'; - _workshop_pack_folders.emplace(std::string{folderBuf}); + // Write the path to an element in a JSON array. + ssvuj::arch( + cacheArray, _workshop_pack_folders.size(), folderBufStr); + + _workshop_pack_folders.emplace(std::move(folderBufStr)); } } + + // Update the workshop cache with our loaded folders + if(_workshop_pack_folders.size() > 0) + { + ssvu::lo("Steam") << "Updating workshop cache\n"; + ssvuj::Obj cacheObj; + + ssvuj::arch(cacheObj, "cachedPacks", cacheArray); + ssvuj::writeToFile(cacheObj, "workshopCache.json"); + } } steam_manager::steam_manager_impl::steam_manager_impl() diff --git a/src/SSVOpenHexagon/Global/Assets.cpp b/src/SSVOpenHexagon/Global/Assets.cpp index 18d164b9..771d03ad 100644 --- a/src/SSVOpenHexagon/Global/Assets.cpp +++ b/src/SSVOpenHexagon/Global/Assets.cpp @@ -457,6 +457,60 @@ HGAssets::getSelectablePackInfos() const noexcept return nullptr; } +[[nodiscard]] bool HGAssets::loadWorkshopPackDatasFromCache() +{ + if(!ssvufs::Path{"workshopCache.json"}.exists<ssvufs::Type::File>()) + { + ssvu::lo("::loadAssets") << "Workshop cache file does not exist. No " + "workshop packs to load\n"; + return false; + } + auto [cacheObject, cacheError] = + ssvuj::getFromFileWithErrors("workshopCache.json"); + + ssvu::lo("::loadAssets") << "Loading workshop packs from cache\n"; + if(ssvuj::hasObj(cacheObject, "cachedPacks")) + { + // Null check + auto& packValue = ssvuj::getObj(cacheObject, "cachedPacks"); + if(packValue.type() == Json::ValueType::nullValue || + packValue.type() != Json::ValueType::arrayValue) + { + ssvu::lo("::loadAssets") + << "Cache array is null. No workshop packs to load\n"; + return false; + } + + // Empty check + const auto packArray = + ssvuj::getExtr<std::vector<std::string>>( + cacheObject, "cachedPacks"); + + if(packArray.size() <= 0) + { + ssvu::lo("::loadAssets") + << "Cache array is empty. No workshop packs to load\n"; + return false; + } + + for(const auto& f : packArray) + { + // Simply emplace them. We will check them later. + cachedWorkshopPackIds.emplace(f); + } + } + else + { + ssvu::lo("::loadAssets") + << "[ERROR]: Cannot locate cache array in workshop cache file\n"; + + return false; + } + + loadInfo.addFormattedError(cacheError); + return true; +} + [[nodiscard]] bool HGAssets::loadAllPackDatas() { if(!ssvufs::Path{"Packs/"}.exists<ssvufs::Type::Folder>()) @@ -494,7 +548,19 @@ HGAssets::getSelectablePackInfos() const noexcept // Load pack datas from Steam workshop. if(steamManager != nullptr) { - steamManager->for_workshop_pack_folders(tryLoadPackFromPath); + if(steamManager->is_initialized()) + { + steamManager->for_workshop_pack_folders(tryLoadPackFromPath); + } + else if(loadWorkshopPackDatasFromCache()) + { + // In the case the Steam API can't be retrieved, look for a cache + // that contains the paths we need to load + for(const auto& cachedPath : cachedWorkshopPackIds) + { + tryLoadPackFromPath(cachedPath); + } + } } return true; |