diff --git a/OpenRA.Game/Map/MapCache.cs b/OpenRA.Game/Map/MapCache.cs index d632026d46..419915de7c 100644 --- a/OpenRA.Game/Map/MapCache.cs +++ b/OpenRA.Game/Map/MapCache.cs @@ -122,6 +122,47 @@ namespace OpenRA } } + public IEnumerable EnumerateMapsWithoutCaching(MapClassification classification = MapClassification.System) + { + // Utility mod that does not support maps + if (!modData.Manifest.Contains()) + yield break; + + // Enumerate map directories + foreach (var kv in modData.Manifest.MapFolders) + { + MapClassification packageClassification; + if (!Enum.TryParse(kv.Value, out packageClassification)) + continue; + + if (!classification.HasFlag(packageClassification)) + continue; + + var name = kv.Key; + var optional = name.StartsWith("~", StringComparison.Ordinal); + if (optional) + name = name.Substring(1); + + // Don't try to open the map directory in the support directory if it doesn't exist + if (name.StartsWith("^", StringComparison.Ordinal)) + { + var resolved = Platform.ResolvePath(name); + if (!Directory.Exists(resolved) || !File.Exists(resolved)) + continue; + } + + using (var package = (IReadWritePackage)modData.ModFiles.OpenPackage(name)) + { + foreach (var map in package.Contents) + { + var mapPackage = package.OpenPackage(map, modData.ModFiles); + if (mapPackage != null) + yield return new Map(modData, mapPackage); + } + } + } + } + public void QueryRemoteMapDetails(string repositoryUrl, IEnumerable uids, Action mapDetailsReceived = null, Action queryFailed = null) { var maps = uids.Distinct() diff --git a/OpenRA.Game/Map/MapPreview.cs b/OpenRA.Game/Map/MapPreview.cs index dd2976cd6b..741dd0a25d 100644 --- a/OpenRA.Game/Map/MapPreview.cs +++ b/OpenRA.Game/Map/MapPreview.cs @@ -28,7 +28,14 @@ namespace OpenRA public enum MapStatus { Available, Unavailable, Searching, DownloadAvailable, Downloading, DownloadError } // Used for grouping maps in the UI - public enum MapClassification { Unknown, System, User, Remote } + [Flags] + public enum MapClassification + { + Unknown = 0, + System = 1, + User = 2, + Remote = 4 + } // Used for verifying map availability in the lobby public enum MapRuleStatus { Unknown, Cached, Invalid } diff --git a/OpenRA.Mods.Common/UtilityCommands/CheckYaml.cs b/OpenRA.Mods.Common/UtilityCommands/CheckYaml.cs index 96be5b001f..abe7c782c8 100644 --- a/OpenRA.Mods.Common/UtilityCommands/CheckYaml.cs +++ b/OpenRA.Mods.Common/UtilityCommands/CheckYaml.cs @@ -77,29 +77,8 @@ namespace OpenRA.Mods.Common.UtilityCommands } } - foreach (var kv in modData.Manifest.MapFolders) - { - var name = kv.Key; - var classification = string.IsNullOrEmpty(kv.Value) - ? MapClassification.Unknown : Enum.Parse(kv.Value); - - if (classification == MapClassification.Unknown) - continue; - - var optional = name.StartsWith("~", StringComparison.Ordinal); - if (optional) - name = name.Substring(1); - - using (var package = (IReadWritePackage)modData.ModFiles.OpenPackage(name)) - { - foreach (var map in package.Contents) - { - var mapPackage = package.OpenPackage(map, modData.ModFiles); - if (mapPackage != null) - maps.Add(new Map(modData, mapPackage)); - } - } - } + // Use all maps for lint checking + maps = modData.MapCache.EnumerateMapsWithoutCaching(MapClassification.System | MapClassification.User).ToList(); } else maps.Add(new Map(modData, new Folder(".").OpenPackage(args[1], modData.ModFiles)));