Sfoglia il codice sorgente

Fixed possible cyclic dependency with incompatible plugins

ManlyMarco 5 anni fa
parent
commit
eb65de062d
1 ha cambiato i file con 15 aggiunte e 20 eliminazioni
  1. 15 20
      BepInEx/Bootstrap/Chainloader.cs

+ 15 - 20
BepInEx/Bootstrap/Chainloader.cs

@@ -224,11 +224,25 @@ namespace BepInEx.Bootstrap
 							continue;
 						}
 
-						dependencyDict[pluginInfo.Metadata.GUID] = pluginInfo.Dependencies.Select(d => d.DependencyGUID).Concat(pluginInfo.Incompatibilities.Select(i => i.IncompatibilityGUID));
+						dependencyDict[pluginInfo.Metadata.GUID] = pluginInfo.Dependencies.Select(d => d.DependencyGUID);
 						pluginsByGUID[pluginInfo.Metadata.GUID] = pluginInfo;
 					}
 				}
 
+				foreach (var pluginInfo in pluginsByGUID.Values.ToList())
+				{
+					if (pluginInfo.Incompatibilities.Any(incompatibility => pluginsByGUID.ContainsKey(incompatibility.IncompatibilityGUID)))
+					{
+						pluginsByGUID.Remove(pluginInfo.Metadata.GUID);
+						dependencyDict.Remove(pluginInfo.Metadata.GUID);
+
+						var incompatiblePlugins = pluginInfo.Incompatibilities.Select(x => x.IncompatibilityGUID).Where(x => pluginsByGUID.ContainsKey(x)).ToArray();
+						string message = $@"Could not load [{pluginInfo.Metadata.Name}] because it is incompatible with: {string.Join(", ", incompatiblePlugins)}";
+						DependencyErrors.Add(message);
+						Logger.LogError(message);
+					}
+				}
+
 				var emptyDependencies = new string[0];
 
 				// Sort plugins by their dependencies.
@@ -266,13 +280,6 @@ namespace BepInEx.Bootstrap
 						}
 					}
 
-					var incompatibilities = new List<BepInIncompatibility>();
-					foreach (var incompatibility in pluginInfo.Incompatibilities)
-					{
-						if (processedPlugins.ContainsKey(incompatibility.IncompatibilityGUID))
-							incompatibilities.Add(incompatibility);
-					}
-
 					processedPlugins.Add(pluginGUID, pluginInfo.Metadata.Version);
 
 					if (dependsOnInvalidPlugin)
@@ -297,18 +304,6 @@ namespace BepInEx.Bootstrap
 						continue;
 					}
 
-					if (incompatibilities.Count != 0)
-					{
-						string message = $@"Could not load [{pluginInfo.Metadata.Name}] because it is incompatible with: {
-							string.Join(", ", incompatibilities.Select(i => i.IncompatibilityGUID).ToArray())
-							}";
-						DependencyErrors.Add(message);
-						Logger.LogError(message);
-
-						invalidPlugins.Add(pluginGUID);
-						continue;
-					}
-
 					try
 					{
 						Logger.LogInfo($"Loading [{pluginInfo.Metadata.Name} {pluginInfo.Metadata.Version}]");