Rework mod content installation.

This commit is contained in:
Paul Chote
2024-10-19 12:32:56 +01:00
committed by Gustas
parent c84d088dfa
commit b57be1cc08
61 changed files with 744 additions and 538 deletions

View File

@@ -0,0 +1,64 @@
#region Copyright & License Information
/*
* Copyright (c) The OpenRA Developers and Contributors
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version. For more
* information, see COPYING.
*/
#endregion
using System.Collections.Generic;
namespace OpenRA.Mods.Common.FileSystem
{
public class ContentInstallerFileSystemLoader : IFileSystemLoader, IFileSystemExternalContent
{
[FieldLoader.Require]
public readonly string ContentInstallerMod = null;
[FieldLoader.Require]
public readonly Dictionary<string, string> Packages = null;
public readonly Dictionary<string, string> ContentPackages = null;
public readonly Dictionary<string, string> ContentFiles = null;
bool contentAvailable = true;
public void Mount(OpenRA.FileSystem.FileSystem fileSystem, ObjectCreator objectCreator)
{
foreach (var kv in Packages)
fileSystem.Mount(kv.Key, kv.Value);
if (ContentPackages != null)
{
foreach (var kv in ContentPackages)
{
try
{
fileSystem.Mount(kv.Key, kv.Value);
}
catch
{
contentAvailable = false;
}
}
}
if (ContentFiles != null)
foreach (var kv in ContentFiles)
if (!fileSystem.Exists(kv.Key))
contentAvailable = false;
}
bool IFileSystemExternalContent.InstallContentIfRequired(ModData modData)
{
if (!contentAvailable)
Game.InitializeMod(ContentInstallerMod, new Arguments());
return !contentAvailable;
}
}
}

View File

@@ -10,8 +10,6 @@
#endregion
using System.Collections.Generic;
using System.IO;
using System.Linq;
using OpenRA.Traits;
namespace OpenRA.Mods.Common.FileSystem
@@ -22,7 +20,7 @@ namespace OpenRA.Mods.Common.FileSystem
public bool InstallContentIfRequired(ModData modData);
}
public class DefaultFileSystemLoader : IFileSystemLoader, IFileSystemExternalContent
public class DefaultFileSystemLoader : IFileSystemLoader
{
public readonly Dictionary<string, string> Packages = null;
@@ -32,29 +30,5 @@ namespace OpenRA.Mods.Common.FileSystem
foreach (var kv in Packages)
fileSystem.Mount(kv.Key, kv.Value);
}
bool IFileSystemExternalContent.InstallContentIfRequired(ModData modData)
{
// If a ModContent section is defined then we need to make sure that the
// required content is installed or switch to the defined content installer.
if (!modData.Manifest.Contains<ModContent>())
return false;
var content = modData.Manifest.Get<ModContent>();
var contentInstalled = content.Packages
.Where(p => p.Value.Required)
.All(p => p.Value.TestFiles.All(f => File.Exists(Platform.ResolvePath(f))));
if (contentInstalled)
return false;
string translationPath;
using (var fs = (FileStream)modData.DefaultFileSystem.Open(content.Translation))
translationPath = fs.Name;
Game.InitializeMod(
content.ContentInstallerMod,
new Arguments(new[] { "Content.Mod=" + modData.Manifest.Id, "Content.TranslationFile=" + translationPath }));
return true;
}
}
}