diff options
| author | Mikaƫl Capelle <capelle.mikael@gmail.com> | 2025-09-03 10:13:06 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-09-03 10:13:06 +0200 |
| commit | b77b2722b7f0190fc877d526d98200fe340771a0 (patch) | |
| tree | 9d020c4437d74f95afda41b755dbf0d980551a4c /src | |
| parent | d52fcccb831b63dc1add068084369543d0a45246 (diff) | |
Fix an issue with implementation of CombinedModDataContent. (#2278)
Diffstat (limited to 'src')
| -rw-r--r-- | src/game_features.cpp | 32 | ||||
| -rw-r--r-- | 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<std::pair<std::shared_ptr<ModDataContent>, int>> m_modDataContents; + std::vector<std::pair<std::shared_ptr<ModDataContent>, std::unordered_map<int, int>>> + m_modDataContents; std::vector<Content> 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<int>(offset)); + std::unordered_map<int, int> 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<int>(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<const MOBase::IFileTree> fileTree) const { std::vector<int> 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; |
