diff --git a/OpenRA.Game/Map/MapCache.cs b/OpenRA.Game/Map/MapCache.cs index cb29969815..3b83ce5e58 100644 --- a/OpenRA.Game/Map/MapCache.cs +++ b/OpenRA.Game/Map/MapCache.cs @@ -233,7 +233,7 @@ namespace OpenRA .ToList(); foreach (var uid in queryUids) - previews[uid].UpdateRemoteSearch(MapStatus.Searching, null); + previews[uid].UpdateRemoteSearch(MapStatus.Searching, null, null); Task.Run(async () => { @@ -251,13 +251,13 @@ namespace OpenRA var yaml = MiniYaml.FromStream(result); foreach (var kv in yaml) - previews[kv.Key].UpdateRemoteSearch(MapStatus.DownloadAvailable, kv.Value, mapDetailsReceived); + previews[kv.Key].UpdateRemoteSearch(MapStatus.DownloadAvailable, kv.Value, modData.Manifest.MapCompatibility, mapDetailsReceived); foreach (var uid in batchUids) { var p = previews[uid]; if (p.Status != MapStatus.DownloadAvailable) - p.UpdateRemoteSearch(MapStatus.Unavailable, null); + p.UpdateRemoteSearch(MapStatus.Unavailable, null, null); } } catch (Exception e) @@ -269,7 +269,7 @@ namespace OpenRA foreach (var uid in batchUids) { var p = previews[uid]; - p.UpdateRemoteSearch(MapStatus.Unavailable, null); + p.UpdateRemoteSearch(MapStatus.Unavailable, null, null); mapQueryFailed?.Invoke(p); } } diff --git a/OpenRA.Game/Map/MapPreview.cs b/OpenRA.Game/Map/MapPreview.cs index ec815de07b..bda6b01032 100644 --- a/OpenRA.Game/Map/MapPreview.cs +++ b/OpenRA.Game/Map/MapPreview.cs @@ -59,6 +59,7 @@ namespace OpenRA public readonly string rules; public readonly string players_block; public readonly int mapformat; + public readonly string game_mod; } public sealed class MapPreview : IDisposable, IReadOnlyFileSystem @@ -427,7 +428,7 @@ namespace OpenRA innerData = newData; } - public void UpdateRemoteSearch(MapStatus status, MiniYaml yaml, Action parseMetadata = null) + public void UpdateRemoteSearch(MapStatus status, MiniYaml yaml, string[] mapCompatibility, Action parseMetadata = null) { var newData = innerData.Clone(); newData.Status = status; @@ -479,6 +480,12 @@ namespace OpenRA var rulesString = Encoding.UTF8.GetString(Convert.FromBase64String(r.rules)); var rulesYaml = new MiniYaml("", MiniYaml.FromString(rulesString)).ToDictionary(); newData.SetCustomRules(modData, this, rulesYaml, null); + + // Map is for a different mod: update its information so it can be displayed + // in the cross-mod server browser UI, but mark it as unavailable so it can't + // be selected in a server for the current mod. + if (!mapCompatibility.Contains(r.game_mod)) + newData.Status = MapStatus.Unavailable; } catch (Exception e) {