Stop passing around partially constructed ModData instances.

This commit is contained in:
Paul Chote
2025-12-06 21:36:34 +00:00
committed by Gustas Kažukauskas
parent 2b6977d53f
commit 31607bd0cf
15 changed files with 82 additions and 77 deletions

View File

@@ -21,6 +21,7 @@ using OpenRA.Graphics;
using OpenRA.Primitives;
using OpenRA.Support;
using OpenRA.Traits;
using FS = OpenRA.FileSystem.FileSystem;
namespace OpenRA
{
@@ -31,8 +32,9 @@ namespace OpenRA
readonly Dictionary<IReadOnlyPackage, MapClassification> mapLocations = [];
public bool LoadPreviewImages = true;
readonly Cache<string, MapPreview> previews;
readonly ModData modData;
readonly Manifest manifest;
readonly FS modFiles;
Cache<string, MapPreview> previews;
readonly SheetBuilder sheetBuilder;
Thread previewLoaderThread;
bool previewLoaderThreadShutDown = true;
@@ -67,13 +69,11 @@ namespace OpenRA
return null;
}
public MapCache(ModData modData)
public MapCache(Manifest manifest, FS modFiles)
{
this.modData = modData;
var gridType = Exts.Lazy(() => modData.GetOrCreate<MapGrid>().Type);
previews = new Cache<string, MapPreview>(uid => new MapPreview(modData, uid, gridType.Value, this));
sheetBuilder = new SheetBuilder(SheetType.BGRA, modData.Manifest.RendererConstants.MapPreviewSheetSize);
this.manifest = manifest;
this.modFiles = modFiles;
sheetBuilder = new SheetBuilder(SheetType.BGRA, manifest.RendererConstants.MapPreviewSheetSize);
}
public void UpdateMaps()
@@ -82,14 +82,17 @@ namespace OpenRA
tracker.UpdateMaps(this);
}
public void LoadMaps()
public void LoadMaps(ModData modData)
{
// Utility mod that does not support maps
if (modData.Manifest.MapFolders.Count == 0)
if (manifest.MapFolders.Count == 0)
return;
var gridType = modData.GetOrCreate<MapGrid>().Type;
previews = new Cache<string, MapPreview>(uid => new MapPreview(modData, uid, gridType, this));
// Enumerate map directories
foreach (var kv in modData.Manifest.MapFolders)
foreach (var kv in manifest.MapFolders)
{
var name = kv.Key;
var classification = string.IsNullOrEmpty(kv.Value)
@@ -108,7 +111,7 @@ namespace OpenRA
if (resolved.StartsWith(Platform.SupportDir, StringComparison.Ordinal) && !File.Exists(resolved))
Directory.CreateDirectory(resolved);
package = modData.ModFiles.OpenPackage(name);
package = modFiles.OpenPackage(name);
}
catch
{
@@ -124,12 +127,9 @@ namespace OpenRA
// PERF: Load the mod YAML once outside the loop, and reuse it when resolving each maps custom YAML.
var modDataRules = modData.GetRulesYaml();
var gridType = modData.GetOrCreate<MapGrid>().Type;
foreach (var kv in MapLocations)
{
foreach (var map in kv.Key.Contents)
LoadMapInternal(map, kv.Key, kv.Value, null, gridType, modDataRules);
}
// We only want to track maps in runtime, not at loadtime
LastModifiedMap = null;
@@ -148,7 +148,7 @@ namespace OpenRA
{
using (new PerfTimer(map))
{
mapPackage = package.OpenPackage(map, modData.ModFiles);
mapPackage = package.OpenPackage(map, modFiles);
if (mapPackage != null)
{
var uid = Map.ComputeUID(mapPackage);
@@ -179,7 +179,7 @@ namespace OpenRA
public IEnumerable<IReadWritePackage> EnumerateMapDirPackages(MapClassification classification = MapClassification.System)
{
// Enumerate map directories
foreach (var kv in modData.Manifest.MapFolders)
foreach (var kv in manifest.MapFolders)
{
if (!Enum.TryParse(kv.Value, out MapClassification packageClassification))
continue;
@@ -197,7 +197,7 @@ namespace OpenRA
if (resolved.StartsWith(Platform.SupportDir, StringComparison.Ordinal) && (!Directory.Exists(resolved) || !File.Exists(resolved)))
continue;
using (var package = (IReadWritePackage)modData.ModFiles.OpenPackage(name))
using (var package = (IReadWritePackage)modFiles.OpenPackage(name))
yield return package;
}
}
@@ -217,11 +217,11 @@ namespace OpenRA
foreach (var mapDirPackage in mapDirPackages)
foreach (var map in mapDirPackage.Contents)
if (mapDirPackage.OpenPackage(map, modData.ModFiles) is IReadWritePackage mapPackage)
if (mapDirPackage.OpenPackage(map, modFiles) is IReadWritePackage mapPackage)
yield return mapPackage;
}
public void GenerateMap(MapGenerationArgs args)
public void GenerateMap(ModData modData, MapGenerationArgs args)
{
var p = previews[args.Uid];
if (p.Class == MapClassification.Generated)