mirror of
https://github.com/Outer-Wilds-New-Horizons/new-horizons.git
synced 2025-12-11 20:15:44 +01:00
Preloading bundles and setting subtitle path
This commit is contained in:
parent
0528360cc0
commit
1a56fe1ab2
12
NewHorizons/External/Configs/AddonConfig.cs
vendored
12
NewHorizons/External/Configs/AddonConfig.cs
vendored
@ -31,5 +31,17 @@ namespace NewHorizons.External.Configs
|
||||
/// If popupMessage is set, should it repeat every time the game starts or only once
|
||||
/// </summary>
|
||||
public bool repeatPopup;
|
||||
|
||||
/// <summary>
|
||||
/// These asset bundles will be loaded on the title screen and stay loaded. Will improve initial load time at the cost of increased memory use.
|
||||
/// The path is the relative directory of the asset bundle in the mod folder.
|
||||
/// </summary>
|
||||
public string[] preloadAssetBundles;
|
||||
|
||||
/// <summary>
|
||||
/// The path to the addons subtitle for the main menu.
|
||||
/// Defaults to "subtitle.png".
|
||||
/// </summary>
|
||||
public string subtitlePath = "subtitle.png";
|
||||
}
|
||||
}
|
||||
|
||||
@ -61,11 +61,19 @@ namespace NewHorizons.Handlers
|
||||
|
||||
private void AddSubtitles()
|
||||
{
|
||||
foreach (var mod in Main.MountedAddons.Where(mod => File.Exists($"{mod.ModHelper.Manifest.ModFolderPath}subtitle.png")))
|
||||
foreach (var mod in Main.MountedAddons)
|
||||
{
|
||||
if (Main.AddonConfigs.TryGetValue(mod, out var addonConfig) && File.Exists(Path.Combine(mod.ModHelper.Manifest.ModFolderPath, addonConfig.subtitlePath)))
|
||||
{
|
||||
AddSubtitle(mod, addonConfig.subtitlePath);
|
||||
}
|
||||
// Else default to subtitle.png
|
||||
else if (File.Exists(Path.Combine(mod.ModHelper.Manifest.ModFolderPath, "subtitle.png")))
|
||||
{
|
||||
AddSubtitle(mod, "subtitle.png");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void AddSubtitle(IModBehaviour mod, string filepath)
|
||||
{
|
||||
|
||||
@ -50,9 +50,10 @@ namespace NewHorizons
|
||||
private static bool _wasConfigured = false;
|
||||
private static string _defaultSystemOverride;
|
||||
|
||||
public static Dictionary<string, NewHorizonsSystem> SystemDict = new Dictionary<string, NewHorizonsSystem>();
|
||||
public static Dictionary<string, List<NewHorizonsBody>> BodyDict = new Dictionary<string, List<NewHorizonsBody>>();
|
||||
public static List<IModBehaviour> MountedAddons = new List<IModBehaviour>();
|
||||
public static Dictionary<string, NewHorizonsSystem> SystemDict = new();
|
||||
public static Dictionary<string, List<NewHorizonsBody>> BodyDict = new();
|
||||
public static List<IModBehaviour> MountedAddons = new();
|
||||
public static Dictionary<IModBehaviour, AddonConfig> AddonConfigs = new();
|
||||
|
||||
public static float SecondsElapsedInLoop = -1;
|
||||
|
||||
@ -747,6 +748,15 @@ namespace NewHorizons
|
||||
{
|
||||
MenuHandler.RegisterOneTimePopup(mod, TranslationHandler.GetTranslation(addonConfig.popupMessage, TranslationHandler.TextType.UI), addonConfig.repeatPopup);
|
||||
}
|
||||
if (addonConfig.preloadAssetBundles != null)
|
||||
{
|
||||
foreach (var bundle in addonConfig.preloadAssetBundles)
|
||||
{
|
||||
AssetBundleUtilities.PreloadBundle(bundle, mod);
|
||||
}
|
||||
}
|
||||
|
||||
AddonConfigs[mod] = addonConfig;
|
||||
}
|
||||
|
||||
private void LoadTranslations(string folder, IModBehaviour mod)
|
||||
|
||||
@ -26,11 +26,10 @@ using UnityEngine;
|
||||
using UnityEngine.Events;
|
||||
using static NewHorizons.External.Modules.ShipLogModule;
|
||||
|
||||
namespace NewHorizons
|
||||
{
|
||||
namespace NewHorizons;
|
||||
|
||||
public class NewHorizonsApi : INewHorizons
|
||||
{
|
||||
public class NewHorizonsApi : INewHorizons
|
||||
{
|
||||
[Obsolete("Create(Dictionary<string, object> config) is deprecated, please use LoadConfigs(IModBehaviour mod) instead")]
|
||||
public void Create(Dictionary<string, object> config)
|
||||
{
|
||||
@ -337,5 +336,4 @@ namespace NewHorizons
|
||||
public string GetTranslationForUI(string text) => TranslationHandler.GetTranslation(text, TranslationHandler.TextType.UI);
|
||||
|
||||
public string GetTranslationForOtherText(string text) => TranslationHandler.GetTranslation(text, TranslationHandler.TextType.OTHER);
|
||||
}
|
||||
}
|
||||
|
||||
@ -3,22 +3,45 @@ using OWML.Common;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
|
||||
namespace NewHorizons.Utility.Files
|
||||
namespace NewHorizons.Utility.Files;
|
||||
|
||||
public static class AssetBundleUtilities
|
||||
{
|
||||
public static class AssetBundleUtilities
|
||||
{
|
||||
public static Dictionary<string, AssetBundle> AssetBundles = new Dictionary<string, AssetBundle>();
|
||||
public static Dictionary<string, (AssetBundle bundle, bool keepLoaded)> AssetBundles = new Dictionary<string, (AssetBundle, bool)>();
|
||||
|
||||
public static void ClearCache()
|
||||
{
|
||||
foreach (var pair in AssetBundles)
|
||||
{
|
||||
if (pair.Value == null) NHLogger.LogError($"The asset bundle for {pair.Key} was null when trying to unload");
|
||||
else pair.Value.Unload(true);
|
||||
if (!pair.Value.keepLoaded)
|
||||
{
|
||||
if (pair.Value.bundle == null)
|
||||
{
|
||||
NHLogger.LogError($"The asset bundle for {pair.Key} was null when trying to unload");
|
||||
}
|
||||
AssetBundles.Clear();
|
||||
else
|
||||
{
|
||||
pair.Value.bundle.Unload(true);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
AssetBundles = AssetBundles.Where(x => x.Value.keepLoaded).ToDictionary(x => x.Key, x => x.Value);
|
||||
}
|
||||
|
||||
public static void PreloadBundle(string assetBundleRelativeDir, IModBehaviour mod)
|
||||
{
|
||||
string key = Path.GetFileName(assetBundleRelativeDir);
|
||||
var completePath = Path.Combine(mod.ModHelper.Manifest.ModFolderPath, assetBundleRelativeDir);
|
||||
var request = AssetBundle.LoadFromFileAsync(completePath);
|
||||
request.completed += _ =>
|
||||
{
|
||||
NHLogger.Log($"Finished loading async bundle {assetBundleRelativeDir}");
|
||||
AssetBundles[key] = (request.assetBundle, true);
|
||||
};
|
||||
}
|
||||
|
||||
public static T Load<T>(string assetBundleRelativeDir, string pathInBundle, IModBehaviour mod) where T : UnityEngine.Object
|
||||
@ -32,7 +55,7 @@ namespace NewHorizons.Utility.Files
|
||||
|
||||
if (AssetBundles.ContainsKey(key))
|
||||
{
|
||||
bundle = AssetBundles[key];
|
||||
bundle = AssetBundles[key].bundle;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -44,7 +67,7 @@ namespace NewHorizons.Utility.Files
|
||||
return null;
|
||||
}
|
||||
|
||||
AssetBundles[key] = bundle;
|
||||
AssetBundles[key] = (bundle, false);
|
||||
}
|
||||
|
||||
obj = bundle.LoadAsset<T>(pathInBundle);
|
||||
@ -123,5 +146,4 @@ namespace NewHorizons.Utility.Files
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user