Преглед изворни кода

Merge pull request #103 from BepInEx/bepin-version-warning

Added warning if a plugin was built against a newer version of bepinex
Geoffrey Horsington пре 5 година
родитељ
комит
b4d5ee5ac1
2 измењених фајлова са 28 додато и 2 уклоњено
  1. 20 1
      BepInEx/Bootstrap/Chainloader.cs
  2. 8 1
      BepInEx/Contract/PluginInfo.cs

+ 20 - 1
BepInEx/Bootstrap/Chainloader.cs

@@ -172,13 +172,16 @@ namespace BepInEx.Bootstrap
 			var dependencies = BepInDependency.FromCecilType(type);
 			var incompatibilities = BepInIncompatibility.FromCecilType(type);
 
+			var bepinVersion = type.Module.AssemblyReferences.FirstOrDefault(reference => reference.Name == "BepInEx")?.Version ?? new Version();
+
 			return new PluginInfo
 			{
 				Metadata = metadata,
 				Processes = filters,
 				Dependencies = dependencies,
 				Incompatibilities = incompatibilities,
-				TypeName = type.FullName
+				TypeName = type.FullName,
+				TargettedBepInExVersion = bepinVersion
 			};
 		}
 
@@ -195,6 +198,16 @@ namespace BepInEx.Bootstrap
 			return true;
 		}
 
+		private static bool PluginTargetsWrongBepin(PluginInfo pluginInfo)
+		{
+			var pluginTarget = pluginInfo.TargettedBepInExVersion;
+			// X.X.X.x - compare normally. x.x.x.X - nightly build number, ignore
+			if (pluginTarget.Major != CurrentAssemblyVersion.Major) return true;
+			if (pluginTarget.Minor > CurrentAssemblyVersion.Minor) return true;
+			if (pluginTarget.Minor < CurrentAssemblyVersion.Minor) return false;
+			return pluginTarget.Build > CurrentAssemblyVersion.Build;
+		}
+
 		/// <summary>
 		/// The entrypoint for the BepInEx plugin system.
 		/// </summary>
@@ -276,6 +289,12 @@ namespace BepInEx.Bootstrap
 						DependencyErrors.Add(message);
 						Logger.LogError(message);
 					}
+					else if (PluginTargetsWrongBepin(pluginInfo))
+					{
+						string message = $@"Plugin [{pluginInfo.Metadata.Name}] targets a wrong version of BepInEx ({pluginInfo.TargettedBepInExVersion}) and might not work until you update";
+						DependencyErrors.Add(message);
+						Logger.LogWarning(message);
+					}
 				}
 
 				var emptyDependencies = new string[0];

+ 8 - 1
BepInEx/Contract/PluginInfo.cs

@@ -1,4 +1,5 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
 using System.IO;
 using System.Linq;
 using BepInEx.Bootstrap;
@@ -21,6 +22,8 @@ namespace BepInEx
 
 		internal string TypeName { get; set; }
 
+		internal Version TargettedBepInExVersion { get; set; }
+
 		void ICacheable.Save(BinaryWriter bw)
 		{
 			bw.Write(TypeName);
@@ -43,6 +46,8 @@ namespace BepInEx
 			bw.Write(incList.Count);
 			foreach (var bepInIncompatibility in incList)
 				((ICacheable)bepInIncompatibility).Save(bw);
+
+			bw.Write(TargettedBepInExVersion.ToString(4));
 		}
 
 		void ICacheable.Load(BinaryReader br)
@@ -78,6 +83,8 @@ namespace BepInEx
 			}
 
 			Incompatibilities = incList;
+
+			TargettedBepInExVersion = new Version(br.ReadString());
 		}
 	}
 }