summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMikaƫl Capelle <capelle.mikael@gmail.com>2025-09-03 10:13:06 +0200
committerGitHub <noreply@github.com>2025-09-03 10:13:06 +0200
commitb77b2722b7f0190fc877d526d98200fe340771a0 (patch)
tree9d020c4437d74f95afda41b755dbf0d980551a4c /src
parentd52fcccb831b63dc1add068084369543d0a45246 (diff)
Fix an issue with implementation of CombinedModDataContent. (#2278)
Diffstat (limited to 'src')
-rw-r--r--src/game_features.cpp32
-rw-r--r--src/game_features.h2
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;