Prevent key has already been added exception when checking for duplicate mods and building modPackageData

This commit is contained in:
Cj
2025-09-30 12:06:14 -04:00
parent ba85880443
commit aa3ee64526
2 changed files with 14 additions and 9 deletions
+8 -7
View File
@@ -23,11 +23,11 @@ public class ModValidator(ISptLogger<ModValidator> logger, ServerLocalisationSer
// Validate and remove broken mods from mod list
var validMods = GetValidMods(mods).ToList(); // ToList now so we can .Sort later
CheckForDuplicateMods(validMods);
// Key to guid for easy comparision later
var modPackageData = validMods.ToDictionary(m => m.ModMetadata.ModGuid, m => m.ModMetadata);
CheckForDuplicateMods(modPackageData);
// Used to check all errors before stopping the load execution
var errorsFound = false;
@@ -82,19 +82,20 @@ public class ModValidator(ISptLogger<ModValidator> logger, ServerLocalisationSer
/// <summary>
/// Check for duplicate mods loaded, show error if any
/// </summary>
/// <param name="modPackageData">Dictionary of mod package.json data</param>
protected void CheckForDuplicateMods(Dictionary<string, AbstractModMetadata> modPackageData)
/// <param name="validMods">List of validated mods to check for duplicates</param>
protected void CheckForDuplicateMods(List<SptMod> validMods)
{
var groupedMods = new Dictionary<string, List<AbstractModMetadata>>();
foreach (var mod in modPackageData.Values)
foreach (var mod in validMods.Select(mod => mod.ModMetadata).ToArray())
{
groupedMods.Add(mod.ModGuid, [.. groupedMods.GetValueOrDefault(mod.ModGuid) ?? [], mod]);
groupedMods[mod.ModGuid] = [.. groupedMods.GetValueOrDefault(mod.ModGuid) ?? [], mod];
// if there's more than one entry for a given mod it means there's at least 2 mods with the same author and name trying to load.
// if there's more than one entry for a given mod it means there's at least 2 mods with the same GUID trying to load.
if (groupedMods[mod.ModGuid].Count > 1)
{
SkippedMods.Add(mod.ModGuid);
validMods.RemoveAll(modInner => modInner.ModMetadata.ModGuid == mod.ModGuid);
}
}
+6 -2
View File
@@ -2,6 +2,7 @@
<Import Project="..\..\Build.props" />
<PropertyGroup>
<ImplicitUsings>enable</ImplicitUsings>
<AssemblyName>TestMod2</AssemblyName>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\Libraries\SPTarkov.Common\SPTarkov.Common.csproj" />
@@ -16,10 +17,13 @@
<Resources Include="$(ProjectDir)Resources\**\*.*" />
</ItemGroup>
<!-- Copies the output dll -->
<Copy SourceFiles="@(OutputDLL);" DestinationFolder="$(SolutionDir)\SPTarkov.Server\bin\$(Configuration)\net9.0\user\mods\TestMod" />
<Copy
SourceFiles="@(OutputDLL);"
DestinationFolder="$(SolutionDir)\SPTarkov.Server\bin\$(Configuration)\net9.0\user\mods\$(TargetName)"
/>
<Copy
SourceFiles="@(Resources);"
DestinationFolder="$(SolutionDir)\SPTarkov.Server\bin\$(Configuration)\net9.0\user\mods\TestMod\Resources\%(RecursiveDir)"
DestinationFolder="$(SolutionDir)\SPTarkov.Server\bin\$(Configuration)\net9.0\user\mods\$(TargetName)\Resources\%(RecursiveDir)"
/>
</Target>
</Project>