From ba4e8f539ba65bd983b487930fc26080f578ba71 Mon Sep 17 00:00:00 2001 From: Cj <161484149+CJ-SPT@users.noreply.github.com> Date: Tue, 28 Oct 2025 07:41:28 -0400 Subject: [PATCH 1/4] Validate core assembly reference when loading mods --- SPTarkov.Server/Modding/ModValidator.cs | 35 +++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/SPTarkov.Server/Modding/ModValidator.cs b/SPTarkov.Server/Modding/ModValidator.cs index 88e4e0e01..562783868 100644 --- a/SPTarkov.Server/Modding/ModValidator.cs +++ b/SPTarkov.Server/Modding/ModValidator.cs @@ -18,6 +18,12 @@ public List ValidateMods(IEnumerable mods) return []; } + // Validate all assemblies for references. This will deprecate AbstractMetadata semver checks in 4.1 + foreach (var mod in mods) + { + ValidateCoreAssemblyReference(mod); + } + logger.Info(localisationService.GetText("modloader-loading_mods", mods.Count())); // Validate and remove broken mods from mod list @@ -121,6 +127,7 @@ protected IEnumerable GetValidMods(IEnumerable mods) /// /// Mod to check compatibility with SPT /// True if compatible + /// protected bool IsModCompatibleWithSpt(AbstractModMetadata mod) { var sptVersion = ProgramStatics.SPT_VERSION(); @@ -147,6 +154,34 @@ protected bool IsModCompatibleWithSpt(AbstractModMetadata mod) return true; } + /// + /// Validate that the SPTarkov.Server.Core assembly is compatible with this mod. Semver is not enough.
+ /// + /// Throws an exception if the mod was built for a newer SPT version than the current running SPT version + ///
+ /// mod to validate + protected void ValidateCoreAssemblyReference(SptMod mod) + { + var sptVersion = ProgramStatics.SPT_VERSION(); + var modName = $"{mod.ModMetadata.Author}-{mod.ModMetadata.Name}"; + + foreach (var assembly in mod.Assemblies) + { + var sptCoreAsmRefVersion = assembly + .GetReferencedAssemblies() + .FirstOrDefault(asm => asm.Name == "SPTarkov.Server.Core") + ?.Version?.ToString(); + + var modRefVersion = new SemanticVersioning.Version(sptCoreAsmRefVersion?[..^2]!); + if (modRefVersion > sptVersion) + { + throw new Exception( + $"Mod: {modName} requires a minimum SPT version of `{modRefVersion}`, but you are running `{sptVersion}`. Please update SPT to use this mod." + ); + } + } + } + /// /// Add into class property "Imported" /// From 6af6fe70a073643b2c4c1e9ca754d1a2c550bc00 Mon Sep 17 00:00:00 2001 From: Cj <161484149+CJ-SPT@users.noreply.github.com> Date: Tue, 28 Oct 2025 07:47:09 -0400 Subject: [PATCH 2/4] Mark SptVersion obsolete --- .../SPTarkov.Server.Core/Models/Spt/Mod/AbstractModMetadata.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Libraries/SPTarkov.Server.Core/Models/Spt/Mod/AbstractModMetadata.cs b/Libraries/SPTarkov.Server.Core/Models/Spt/Mod/AbstractModMetadata.cs index b711730e5..3b87fd563 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Spt/Mod/AbstractModMetadata.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Spt/Mod/AbstractModMetadata.cs @@ -52,6 +52,7 @@ public abstract record AbstractModMetadata ///
/// Version = new Version("4.0.0.0"); is not /// + [Obsolete("Will be removed in 4.1, we now check the assemblies reference to SPTarkov.Server.Core during mod loading")] [JsonConverter(typeof(ToStringJsonConverter))] public abstract Range SptVersion { get; init; } From 6b9b5cd8571f5a6454548cb807417a82f8c726a9 Mon Sep 17 00:00:00 2001 From: Cj <161484149+CJ-SPT@users.noreply.github.com> Date: Tue, 28 Oct 2025 08:17:03 -0400 Subject: [PATCH 3/4] Fix typo, fix doc, oops --- .../SPTarkov.Server.Core/Models/Spt/Mod/AbstractModMetadata.cs | 2 +- SPTarkov.Server/Modding/ModValidator.cs | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Libraries/SPTarkov.Server.Core/Models/Spt/Mod/AbstractModMetadata.cs b/Libraries/SPTarkov.Server.Core/Models/Spt/Mod/AbstractModMetadata.cs index 3b87fd563..8846cb64e 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Spt/Mod/AbstractModMetadata.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Spt/Mod/AbstractModMetadata.cs @@ -52,7 +52,7 @@ public abstract record AbstractModMetadata ///
/// Version = new Version("4.0.0.0"); is not /// - [Obsolete("Will be removed in 4.1, we now check the assemblies reference to SPTarkov.Server.Core during mod loading")] + [Obsolete("Will be removed in 4.1, we now check the mods assembly reference to SPTarkov.Server.Core during mod loading")] [JsonConverter(typeof(ToStringJsonConverter))] public abstract Range SptVersion { get; init; } diff --git a/SPTarkov.Server/Modding/ModValidator.cs b/SPTarkov.Server/Modding/ModValidator.cs index 562783868..2aa9b2b8a 100644 --- a/SPTarkov.Server/Modding/ModValidator.cs +++ b/SPTarkov.Server/Modding/ModValidator.cs @@ -127,7 +127,6 @@ protected IEnumerable GetValidMods(IEnumerable mods) /// /// Mod to check compatibility with SPT /// True if compatible - /// protected bool IsModCompatibleWithSpt(AbstractModMetadata mod) { var sptVersion = ProgramStatics.SPT_VERSION(); From 81c142ac81cd35d6fe757ac5cceee7321cb1fd03 Mon Sep 17 00:00:00 2001 From: Cj <161484149+CJ-SPT@users.noreply.github.com> Date: Tue, 28 Oct 2025 15:50:41 -0400 Subject: [PATCH 4/4] Fix nullref, remove obsolete --- .../Models/Spt/Mod/AbstractModMetadata.cs | 1 - SPTarkov.Server/Modding/ModValidator.cs | 5 +++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Libraries/SPTarkov.Server.Core/Models/Spt/Mod/AbstractModMetadata.cs b/Libraries/SPTarkov.Server.Core/Models/Spt/Mod/AbstractModMetadata.cs index 8846cb64e..b711730e5 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Spt/Mod/AbstractModMetadata.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Spt/Mod/AbstractModMetadata.cs @@ -52,7 +52,6 @@ public abstract record AbstractModMetadata ///
/// Version = new Version("4.0.0.0"); is not /// - [Obsolete("Will be removed in 4.1, we now check the mods assembly reference to SPTarkov.Server.Core during mod loading")] [JsonConverter(typeof(ToStringJsonConverter))] public abstract Range SptVersion { get; init; } diff --git a/SPTarkov.Server/Modding/ModValidator.cs b/SPTarkov.Server/Modding/ModValidator.cs index 2aa9b2b8a..40ee87003 100644 --- a/SPTarkov.Server/Modding/ModValidator.cs +++ b/SPTarkov.Server/Modding/ModValidator.cs @@ -171,6 +171,11 @@ protected void ValidateCoreAssemblyReference(SptMod mod) .FirstOrDefault(asm => asm.Name == "SPTarkov.Server.Core") ?.Version?.ToString(); + if (sptCoreAsmRefVersion is null) + { + continue; + } + var modRefVersion = new SemanticVersioning.Version(sptCoreAsmRefVersion?[..^2]!); if (modRefVersion > sptVersion) {