From b0d3e4610c36f2ba84ea08125b16bb85f869111d Mon Sep 17 00:00:00 2001 From: Mr-Wiseguy Date: Wed, 10 Jul 2024 18:17:32 -0400 Subject: [PATCH] Add duplicate mod detection --- librecomp/include/librecomp/mods.hpp | 8 +++++--- librecomp/src/mod_manifest.cpp | 9 +++++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/librecomp/include/librecomp/mods.hpp b/librecomp/include/librecomp/mods.hpp index 954da71..a5a7813 100644 --- a/librecomp/include/librecomp/mods.hpp +++ b/librecomp/include/librecomp/mods.hpp @@ -29,9 +29,12 @@ namespace recomp { UnrecognizedManifestField, IncorrectManifestFieldType, MissingManifestField, - InnerFileDoesNotExist + InnerFileDoesNotExist, + DuplicateMod }; + std::string error_to_string(ModOpenError); + enum class ModLoadError { Good, FailedToLoadSyms, @@ -123,10 +126,9 @@ namespace recomp { void add_opened_mod(ModManifest&& manifest); std::vector opened_mods; + std::unordered_set mod_ids; std::unordered_set enabled_mods; }; - - std::string error_to_string(ModOpenError); } }; diff --git a/librecomp/src/mod_manifest.cpp b/librecomp/src/mod_manifest.cpp index 54e8010..302e1c1 100644 --- a/librecomp/src/mod_manifest.cpp +++ b/librecomp/src/mod_manifest.cpp @@ -366,6 +366,13 @@ recomp::mods::ModOpenError recomp::mods::ModContext::open_mod(const std::filesys } } + // Check for this being a duplicate of another opened mod. + if (mod_ids.contains(manifest.mod_id)) { + error_param = manifest.mod_id; + return ModOpenError::DuplicateMod; + } + mod_ids.emplace(manifest.mod_id); + ModOpenError validate_error = validate_manifest(manifest, error_param); if (validate_error != ModOpenError::Good) { return validate_error; @@ -404,6 +411,8 @@ std::string recomp::mods::error_to_string(ModOpenError error) { return "Missing required field in manifest"; case ModOpenError::InnerFileDoesNotExist: return "File inside mod does not exist"; + case ModOpenError::DuplicateMod: + return "Duplicate mod found"; } return "Unknown error " + std::to_string((int)error); }