diff --git a/OpenRA.Mods.Common/UpdateRules/UpdateUtils.cs b/OpenRA.Mods.Common/UpdateRules/UpdateUtils.cs index a8e7d791b7..26c62cd35a 100644 --- a/OpenRA.Mods.Common/UpdateRules/UpdateUtils.cs +++ b/OpenRA.Mods.Common/UpdateRules/UpdateUtils.cs @@ -46,11 +46,11 @@ namespace OpenRA.Mods.Common.UpdateRules /// /// Loads a YamlFileSet containing any external yaml definitions referenced by a map yaml block. /// - static YamlFileSet LoadExternalMapYaml(ModData modData, MiniYaml yaml) + static YamlFileSet LoadExternalMapYaml(ModData modData, MiniYaml yaml, HashSet externalFilenames) { return FieldLoader.GetValue("value", yaml.Value) .Where(f => f.Contains("|")) - .SelectMany(f => LoadModYaml(modData, new[] { f })) + .SelectMany(f => LoadModYaml(modData, FilterExternalModFiles(modData, new[] { f }, externalFilenames))) .ToList(); } @@ -123,13 +123,28 @@ namespace OpenRA.Mods.Common.UpdateRules return manualSteps; } - public static List UpdateMod(ModData modData, UpdateRule rule, out YamlFileSet files) + static IEnumerable FilterExternalModFiles(ModData modData, IEnumerable files, HashSet externalFilenames) + { + foreach (var f in files) + { + if (f.Contains("|") && modData.DefaultFileSystem.IsExternalModFile(f)) + { + externalFilenames.Add(f); + continue; + } + + yield return f; + } + } + + public static List UpdateMod(ModData modData, UpdateRule rule, out YamlFileSet files, HashSet externalFilenames) { var manualSteps = new List(); - var modRules = LoadModYaml(modData, modData.Manifest.Rules); - var modWeapons = LoadModYaml(modData, modData.Manifest.Weapons); - var modTilesets = LoadModYaml(modData, modData.Manifest.TileSets); - var modChromeLayout = LoadModYaml(modData, modData.Manifest.ChromeLayout); + + var modRules = LoadModYaml(modData, FilterExternalModFiles(modData, modData.Manifest.Rules, externalFilenames)); + var modWeapons = LoadModYaml(modData, FilterExternalModFiles(modData, modData.Manifest.Weapons, externalFilenames)); + var modTilesets = LoadModYaml(modData, FilterExternalModFiles(modData, modData.Manifest.TileSets, externalFilenames)); + var modChromeLayout = LoadModYaml(modData, FilterExternalModFiles(modData, modData.Manifest.ChromeLayout, externalFilenames)); // Find and add shared map includes foreach (var package in modData.MapCache.EnumerateMapPackagesWithoutCaching()) @@ -142,13 +157,13 @@ namespace OpenRA.Mods.Common.UpdateRules var yaml = new MiniYaml(null, MiniYaml.FromStream(mapStream, package.Name)); var mapRulesNode = yaml.Nodes.FirstOrDefault(n => n.Key == "Rules"); if (mapRulesNode != null) - foreach (var f in LoadExternalMapYaml(modData, mapRulesNode.Value)) + foreach (var f in LoadExternalMapYaml(modData, mapRulesNode.Value, externalFilenames)) if (!modRules.Any(m => m.Item1 == f.Item1 && m.Item2 == f.Item2)) modRules.Add(f); var mapWeaponsNode = yaml.Nodes.FirstOrDefault(n => n.Key == "Weapons"); if (mapWeaponsNode != null) - foreach (var f in LoadExternalMapYaml(modData, mapWeaponsNode.Value)) + foreach (var f in LoadExternalMapYaml(modData, mapWeaponsNode.Value, externalFilenames)) if (!modWeapons.Any(m => m.Item1 == f.Item1 && m.Item2 == f.Item2)) modWeapons.Add(f); } diff --git a/OpenRA.Mods.Common/UtilityCommands/UpdateModCommand.cs b/OpenRA.Mods.Common/UtilityCommands/UpdateModCommand.cs index 7288579185..854f2e660d 100644 --- a/OpenRA.Mods.Common/UtilityCommands/UpdateModCommand.cs +++ b/OpenRA.Mods.Common/UtilityCommands/UpdateModCommand.cs @@ -117,6 +117,8 @@ namespace OpenRA.Mods.Common.UtilityCommands static void ApplyRules(ModData modData, IEnumerable rules, bool skipMaps) { Console.WriteLine(); + + var externalFilenames = new HashSet(); foreach (var rule in rules) { var manualSteps = new List(); @@ -127,7 +129,7 @@ namespace OpenRA.Mods.Common.UtilityCommands try { Console.Write(" Updating mod... "); - manualSteps.AddRange(UpdateUtils.UpdateMod(modData, rule, out allFiles)); + manualSteps.AddRange(UpdateUtils.UpdateMod(modData, rule, out allFiles, externalFilenames)); Console.WriteLine("COMPLETE"); } catch (Exception ex) @@ -150,13 +152,13 @@ namespace OpenRA.Mods.Common.UtilityCommands if (!skipMaps) { var mapsFailed = false; - var externalFilenames = new HashSet(); + var mapExternalFilenames = new HashSet(); foreach (var package in modData.MapCache.EnumerateMapPackagesWithoutCaching()) { try { YamlFileSet mapFiles; - var mapSteps = UpdateUtils.UpdateMap(modData, package, rule, out mapFiles, externalFilenames); + var mapSteps = UpdateUtils.UpdateMap(modData, package, rule, out mapFiles, mapExternalFilenames); allFiles.AddRange(mapFiles); if (mapSteps.Any()) @@ -201,6 +203,14 @@ namespace OpenRA.Mods.Common.UtilityCommands Console.WriteLine(); } + if (externalFilenames.Any()) + { + Console.WriteLine("The following external mod files have been ignored:"); + Console.WriteLine(UpdateUtils.FormatMessageList(externalFilenames)); + Console.WriteLine("These files should be updated by running --update-mod on the referenced mod(s)"); + Console.WriteLine(); + } + Console.WriteLine("Semi-automated update complete."); Console.WriteLine("Please review the messages above for any manual actions that must be applied."); }