From b77b2722b7f0190fc877d526d98200fe340771a0 Mon Sep 17 00:00:00 2001 From: Mikaƫl Capelle Date: Wed, 3 Sep 2025 10:13:06 +0200 Subject: Fix an issue with implementation of CombinedModDataContent. (#2278) --- src/game_features.cpp | 32 +++++++++++++++++--------------- src/game_features.h | 2 +- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/game_features.cpp b/src/game_features.cpp index 9505c8dc..2eb7835d 100644 --- a/src/game_features.cpp +++ b/src/game_features.cpp @@ -83,7 +83,8 @@ public: class GameFeatures::CombinedModDataContent : public ModDataContent { // store the ModDataContent and the offset to add to the content - std::vector, int>> m_modDataContents; + std::vector, std::unordered_map>> + m_modDataContents; std::vector m_allContents; public: @@ -96,20 +97,22 @@ public: m_allContents.clear(); - // update all contents and offsets - std::size_t offset = 0; + // update all contents for (auto& modDataContent : modDataContents) { - m_modDataContents.emplace_back(modDataContent, static_cast(offset)); + std::unordered_map idMap; - // add to the list of contents - auto contents = modDataContent->getAllContents(); - m_allContents.insert(m_allContents.end(), - std::make_move_iterator(contents.begin()), - std::make_move_iterator(contents.end())); + // extract contents for all ModDataContent, replacing ID with index in the list + // and keeping track of the ID/index with the mapping (required since + // getContentsFor returns ID, not index) + for (const auto& content : modDataContent->getAllContents()) { + const auto index = static_cast(m_allContents.size()); + idMap[content.id()] = index; + m_allContents.emplace_back(index, content.name(), content.icon(), + content.isOnlyForFilter()); + } - // increase offset for next mod data content - offset += contents.size(); + m_modDataContents.emplace_back(modDataContent, std::move(idMap)); } } @@ -119,12 +122,11 @@ public: getContentsFor(std::shared_ptr fileTree) const { std::vector contentsFor; - for (auto& modDataContent : m_modDataContents) { + for (const auto& modDataContent : m_modDataContents) { auto contentsForFrom = modDataContent.first->getContentsFor(fileTree); std::transform(contentsForFrom.begin(), contentsForFrom.end(), - std::back_inserter(contentsFor), - [offset = modDataContent.second](auto content) { - return content + offset; + std::back_inserter(contentsFor), [&modDataContent](auto content) { + return modDataContent.second.at(content); }); } diff --git a/src/game_features.h b/src/game_features.h index 55f35e37..da26d001 100644 --- a/src/game_features.h +++ b/src/game_features.h @@ -57,7 +57,7 @@ public: signals: void modDataCheckerUpdated(const MOBase::ModDataChecker* check); - void modDataContentUpdated(const MOBase::ModDataContent* check); + void modDataContentUpdated(const MOBase::ModDataContent* content); private: friend class GameFeaturesProxy; -- cgit v1.3.1