Add duplicate mod detection

This commit is contained in:
Mr-Wiseguy 2024-07-10 18:17:32 -04:00
parent f34909ef42
commit b0d3e4610c
2 changed files with 14 additions and 3 deletions

View file

@ -29,9 +29,12 @@ namespace recomp {
UnrecognizedManifestField, UnrecognizedManifestField,
IncorrectManifestFieldType, IncorrectManifestFieldType,
MissingManifestField, MissingManifestField,
InnerFileDoesNotExist InnerFileDoesNotExist,
DuplicateMod
}; };
std::string error_to_string(ModOpenError);
enum class ModLoadError { enum class ModLoadError {
Good, Good,
FailedToLoadSyms, FailedToLoadSyms,
@ -123,10 +126,9 @@ namespace recomp {
void add_opened_mod(ModManifest&& manifest); void add_opened_mod(ModManifest&& manifest);
std::vector<ModHandle> opened_mods; std::vector<ModHandle> opened_mods;
std::unordered_set<std::string> mod_ids;
std::unordered_set<std::string> enabled_mods; std::unordered_set<std::string> enabled_mods;
}; };
std::string error_to_string(ModOpenError);
} }
}; };

View file

@ -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); ModOpenError validate_error = validate_manifest(manifest, error_param);
if (validate_error != ModOpenError::Good) { if (validate_error != ModOpenError::Good) {
return validate_error; return validate_error;
@ -404,6 +411,8 @@ std::string recomp::mods::error_to_string(ModOpenError error) {
return "Missing required field in manifest"; return "Missing required field in manifest";
case ModOpenError::InnerFileDoesNotExist: case ModOpenError::InnerFileDoesNotExist:
return "File inside mod does not exist"; return "File inside mod does not exist";
case ModOpenError::DuplicateMod:
return "Duplicate mod found";
} }
return "Unknown error " + std::to_string((int)error); return "Unknown error " + std::to_string((int)error);
} }