From 6d02f13fa2e16a45d34c5158dd90e2398ddc788d Mon Sep 17 00:00:00 2001 From: Aaron Robinson Date: Wed, 1 Mar 2023 22:35:13 -0600 Subject: [PATCH 01/29] First pass --- ExampleMod/ExampleMod.cs | 18 +- .../{ResourceManager.cs => AssetManager.cs} | 53 +- .../ConfigDefaultValueAttribute.cs | 13 - .../API/Configuration/ConfigFieldAttribute.cs | 13 - .../Configuration/ConfigSectionAttribute.cs | 13 - .../API/Configuration/ConfigurationManager.cs | 38 - .../API/Configuration/ModConfigAttribute.cs | 8 - SpaceWarp/API/Logging/BaseModLogger.cs | 16 - SpaceWarp/API/Logging/LogLevel.cs | 14 - SpaceWarp/API/Logging/ModLogger.cs | 42 - SpaceWarp/API/Managers/Manager.cs | 19 - SpaceWarp/API/Managers/ManagerLocator.cs | 47 -- SpaceWarp/API/Mods/BaseSpaceWarpPlugin.cs | 41 + SpaceWarp/API/Mods/GlobalModDefines.cs | 2 - SpaceWarp/API/Mods/JSON/ModInfo.cs | 4 +- SpaceWarp/API/Mods/Mod.cs | 41 - SpaceWarp/API/Mods/ModLocator.cs | 49 -- SpaceWarp/API/SpaceWarpGlobalConfiguration.cs | 74 -- SpaceWarp/API/SpaceWarpManager.cs | 771 ------------------ SpaceWarp/API/Toolbar/ToolbarBackend.cs | 8 +- SpaceWarp/API/Toolbar/ToolbarMenu.cs | 2 +- SpaceWarp/BepInExEntrypoint.cs | 15 - SpaceWarp/Compilation/ModCompiler.cs | 20 +- SpaceWarp/Entrypoint.cs | 62 -- SpaceWarp/Patching/BootstrapPatch.cs | 63 ++ .../LoadingActions/AfterModsLoadedAction.cs | 29 - .../LoadingActions/InitializeModAction.cs | 29 + .../Patching/LoadingActions/LoadModAction.cs | 34 - .../LoadingActions/PostInitializeModAction.cs | 29 + .../LoadingActions/PreInitializeModAction.cs | 29 + .../LoadingActions/ReadingModsAction.cs | 29 - SpaceWarp/Patching/LoadingScreenPatcher.cs | 5 +- SpaceWarp/Patching/MainMenuPatcher.cs | 8 +- SpaceWarp/Patching/StartGamePatch.cs | 14 - SpaceWarp/SpaceWarp.csproj | 5 +- SpaceWarp/SpaceWarpManager.cs | 322 ++++++++ SpaceWarp/SpaceWarpPlugin.cs | 22 + SpaceWarp/StartupManager.cs | 54 -- SpaceWarp/UI/ModConfigurationUI.cs | 216 ----- SpaceWarp/UI/ModListUI.cs | 2 +- SpaceWarp/UI/SpaceWarpConsole.cs | 31 +- SpaceWarp/UI/SpaceWarpConsoleLogListener.cs | 68 +- 42 files changed, 600 insertions(+), 1772 deletions(-) rename SpaceWarp/API/AssetBundles/{ResourceManager.cs => AssetManager.cs} (64%) delete mode 100644 SpaceWarp/API/Configuration/ConfigDefaultValueAttribute.cs delete mode 100644 SpaceWarp/API/Configuration/ConfigFieldAttribute.cs delete mode 100644 SpaceWarp/API/Configuration/ConfigSectionAttribute.cs delete mode 100644 SpaceWarp/API/Configuration/ConfigurationManager.cs delete mode 100644 SpaceWarp/API/Configuration/ModConfigAttribute.cs delete mode 100644 SpaceWarp/API/Logging/BaseModLogger.cs delete mode 100644 SpaceWarp/API/Logging/LogLevel.cs delete mode 100644 SpaceWarp/API/Logging/ModLogger.cs delete mode 100644 SpaceWarp/API/Managers/Manager.cs delete mode 100644 SpaceWarp/API/Managers/ManagerLocator.cs create mode 100644 SpaceWarp/API/Mods/BaseSpaceWarpPlugin.cs delete mode 100644 SpaceWarp/API/Mods/Mod.cs delete mode 100644 SpaceWarp/API/Mods/ModLocator.cs delete mode 100644 SpaceWarp/API/SpaceWarpGlobalConfiguration.cs delete mode 100644 SpaceWarp/API/SpaceWarpManager.cs delete mode 100644 SpaceWarp/BepInExEntrypoint.cs delete mode 100644 SpaceWarp/Entrypoint.cs create mode 100644 SpaceWarp/Patching/BootstrapPatch.cs delete mode 100644 SpaceWarp/Patching/LoadingActions/AfterModsLoadedAction.cs create mode 100644 SpaceWarp/Patching/LoadingActions/InitializeModAction.cs delete mode 100644 SpaceWarp/Patching/LoadingActions/LoadModAction.cs create mode 100644 SpaceWarp/Patching/LoadingActions/PostInitializeModAction.cs create mode 100644 SpaceWarp/Patching/LoadingActions/PreInitializeModAction.cs delete mode 100644 SpaceWarp/Patching/LoadingActions/ReadingModsAction.cs delete mode 100644 SpaceWarp/Patching/StartGamePatch.cs create mode 100644 SpaceWarp/SpaceWarpManager.cs create mode 100644 SpaceWarp/SpaceWarpPlugin.cs delete mode 100644 SpaceWarp/StartupManager.cs delete mode 100644 SpaceWarp/UI/ModConfigurationUI.cs diff --git a/ExampleMod/ExampleMod.cs b/ExampleMod/ExampleMod.cs index ca0e90c3..f227d3da 100644 --- a/ExampleMod/ExampleMod.cs +++ b/ExampleMod/ExampleMod.cs @@ -8,13 +8,12 @@ namespace ExampleMod; [MainMod] -public class ExampleMod : Mod +public class ExampleMod : BaseSpaceWarpPlugin { public GUISkin _spaceWarpUISkin; private bool drawUI; private Rect windowRect; - private bool loaded; private static ExampleMod Instance { get; set; } @@ -25,21 +24,14 @@ public class ExampleMod : Mod public override void OnInitialized() { base.OnInitialized(); - - if (loaded) - { - Destroy(this); - } - - loaded = true; Instance = this; // Example of using the logger, Were going to log a message to the console, ALT + C to open the console. - Logger.Info("Hello World, Im a spacewarp Mod."); + Logger.LogInfo("Hello World, Im a spacewarp Mod."); // Example of using the asset loader, were going to load the SpaceWarp GUI skin. // [FORMAT]: space_warp/[assetbundle_name]/[folder_in_assetbundle]/[file.type] - ResourceManager.TryGetAsset( + AssetManager.TryGetAsset( "space_warp/swconsoleui/swconsoleUI/spacewarpConsole.guiskin", out _spaceWarpUISkin ); @@ -115,11 +107,11 @@ private void LateUpdate() if (_activeVessel != null) { _activeVessel.ActivateNextStage(); - Logger.Warn("Stagin Active Vessel: " + _activeVessel.Name); + Logger.LogWarning("Stagin Active Vessel: " + _activeVessel.Name); VesselBehavior behavior = Game.ViewController.GetBehaviorIfLoaded(_activeVessel); foreach (PartBehavior pb in behavior.parts) { - Logger.Warn(pb.name); + Logger.LogWarning(pb.name); } } } diff --git a/SpaceWarp/API/AssetBundles/ResourceManager.cs b/SpaceWarp/API/AssetBundles/AssetManager.cs similarity index 64% rename from SpaceWarp/API/AssetBundles/ResourceManager.cs rename to SpaceWarp/API/AssetBundles/AssetManager.cs index 7f7251a6..b6fe58ce 100644 --- a/SpaceWarp/API/AssetBundles/ResourceManager.cs +++ b/SpaceWarp/API/AssetBundles/AssetManager.cs @@ -1,18 +1,18 @@ -using System.Collections.Generic; -using System.Linq; -using SpaceWarp.API.Logging; +using System; +using System.Collections.Generic; +using BepInEx.Logging; using UnityEngine; namespace SpaceWarp.API.AssetBundles; -public static class ResourceManager +public static class AssetManager { - static readonly Dictionary AllAssets = new Dictionary(); + static readonly Dictionary AllAssets = new Dictionary(); internal static void RegisterAssetBundle(string modId, string assetBundleName, AssetBundle assetBundle) { assetBundleName = assetBundleName.Replace(".bundle", ""); - ModLogger logger = new ModLogger($"{modId}/{assetBundleName}"); + ManualLogSource logger = BepInEx.Logging.Logger.CreateLogSource($"{modId}/{assetBundleName}"); // TODO: use async loading instead? // Object[] bundleObjects = assetBundle.LoadAllAssets(); @@ -20,28 +20,17 @@ internal static void RegisterAssetBundle(string modId, string assetBundleName, A for (int i = 0; i < names.Length; i++) { - List assetNamePath = names[i].Split('/').ToList(); - if (assetNamePath[0].ToLower() == "assets") - { - assetNamePath.RemoveAt(0); - } - - string assetName = ""; - for (int j = 0; j < assetNamePath.Count; j++) - { - assetName += assetNamePath[j]; - if (j != assetNamePath.Count - 1) - { - assetName += "/"; - } - } - + var assetName = names[i]; + if (assetName.StartsWith("assets/")) + assetName = assetName["assets/".Length..]; + if (assetName.StartsWith(assetBundleName + "/")) + assetName = assetName[(assetBundleName.Length + 1)..]; string path = modId + "/" + assetBundleName + "/" + assetName; path = path.ToLower(); - Object bundleObject = assetBundle.LoadAsset(names[i]); + var bundleObject = assetBundle.LoadAsset(names[i]); - logger.Info($"registering path \"{path}\""); + logger.LogInfo($"registering path \"{path}\""); AllAssets.Add(path, bundleObject); } @@ -77,17 +66,17 @@ public static T GetAsset(string path) where T: UnityEngine.Object string[] subPaths = path.Split('/', '\\'); if (subPaths.Length < 3) { - throw new System.ArgumentException("Invalid path, asset paths must follow to following structure: {mod_id}/{asset_bundle}/{asset_path}"); + throw new ArgumentException("Invalid path, asset paths must follow to following structure: {mod_id}/{asset_bundle}/{asset_path}"); } - if (!AllAssets.TryGetValue(path, out Object value)) + if (!AllAssets.TryGetValue(path, out UnityObject value)) { - throw new System.Exception($"Unable to find asset at path \"{path}\""); + throw new IndexOutOfRangeException($"Unable to find asset at path \"{path}\""); } - if (!(value is T tValue)) + if (value is not T tValue) { - throw new System.Exception($"The asset at path {path} isn't of type {typeof(T).Name} but of type {value.GetType().Name}"); + throw new InvalidCastException($"The asset at path {path} isn't of type {typeof(T).Name} but of type {value.GetType().Name}"); } return tValue; @@ -100,7 +89,7 @@ public static T GetAsset(string path) where T: UnityEngine.Object /// an asset path, format: {mod_id}/{asset_bundle}/{asset_name} /// the asset output /// Whether or not the asset exists and is loaded - public static bool TryGetAsset(string path, out T asset) where T : Object + public static bool TryGetAsset(string path, out T asset) where T : UnityObject { path = path.ToLower(); asset = null; @@ -109,11 +98,11 @@ public static bool TryGetAsset(string path, out T asset) where T : Object { return false; } - if (!AllAssets.TryGetValue(path, out Object value)) + if (!AllAssets.TryGetValue(path, out UnityObject value)) { return false; } - if (!(value is T tValue)) + if (value is not T tValue) { return false; } diff --git a/SpaceWarp/API/Configuration/ConfigDefaultValueAttribute.cs b/SpaceWarp/API/Configuration/ConfigDefaultValueAttribute.cs deleted file mode 100644 index caa370f3..00000000 --- a/SpaceWarp/API/Configuration/ConfigDefaultValueAttribute.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; - -namespace SpaceWarp.API.Configuration; - -public class ConfigDefaultValueAttribute : Attribute -{ - public readonly object DefaultValue; - - public ConfigDefaultValueAttribute(object defaultValue) - { - DefaultValue = defaultValue; - } -} \ No newline at end of file diff --git a/SpaceWarp/API/Configuration/ConfigFieldAttribute.cs b/SpaceWarp/API/Configuration/ConfigFieldAttribute.cs deleted file mode 100644 index 990e482c..00000000 --- a/SpaceWarp/API/Configuration/ConfigFieldAttribute.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; - -namespace SpaceWarp.API.Configuration; - -public class ConfigFieldAttribute : Attribute -{ - public readonly string Name; - - public ConfigFieldAttribute(string name) - { - Name = name; - } -} \ No newline at end of file diff --git a/SpaceWarp/API/Configuration/ConfigSectionAttribute.cs b/SpaceWarp/API/Configuration/ConfigSectionAttribute.cs deleted file mode 100644 index 6bd882f9..00000000 --- a/SpaceWarp/API/Configuration/ConfigSectionAttribute.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; - -namespace SpaceWarp.API.Configuration; - -public class ConfigSectionAttribute : Attribute -{ - public readonly string Path; - - public ConfigSectionAttribute(string path) - { - Path = path; - } -} \ No newline at end of file diff --git a/SpaceWarp/API/Configuration/ConfigurationManager.cs b/SpaceWarp/API/Configuration/ConfigurationManager.cs deleted file mode 100644 index 7bf73574..00000000 --- a/SpaceWarp/API/Configuration/ConfigurationManager.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using SpaceWarp.API.Managers; -using Newtonsoft.Json; - -namespace SpaceWarp.API.Configuration; - -public class ConfigurationManager : Manager -{ - private readonly Dictionary _modConfigurations = new Dictionary(); - - public void Add(string id, (Type configType, object configObject, string path) configuration) - { - if (_modConfigurations.ContainsKey(id)) - { - return; - } - - _modConfigurations[id] = configuration; - } - - public bool TryGet(string id, out (Type configType, object configObject, string path) config) - { - return _modConfigurations.TryGetValue(id, out config); - } - - public void UpdateConfiguration(string id) - { - if (!_modConfigurations.TryGetValue(id, out (Type, object, string) config)) - { - return; - } - - // Saves the new configuration - File.WriteAllText(config.Item3,JsonConvert.SerializeObject(config.Item2)); - } -} \ No newline at end of file diff --git a/SpaceWarp/API/Configuration/ModConfigAttribute.cs b/SpaceWarp/API/Configuration/ModConfigAttribute.cs deleted file mode 100644 index ffd1e156..00000000 --- a/SpaceWarp/API/Configuration/ModConfigAttribute.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System; - -namespace SpaceWarp.API.Configuration; - -public class ModConfigAttribute : Attribute -{ - -} \ No newline at end of file diff --git a/SpaceWarp/API/Logging/BaseModLogger.cs b/SpaceWarp/API/Logging/BaseModLogger.cs deleted file mode 100644 index 91570e65..00000000 --- a/SpaceWarp/API/Logging/BaseModLogger.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace SpaceWarp.API.Logging; - -/// -/// Used to print logs on each mod. -/// -public abstract class BaseModLogger -{ - protected abstract void Log(LogLevel level, string message); - - public void Trace(string message) => Log(LogLevel.Trace, message); - public void Debug(string message) => Log(LogLevel.Debug, message); - public void Info(string message) => Log(LogLevel.Info, message); - public void Warn(string message) => Log(LogLevel.Warn, message); - public void Error(string message) => Log(LogLevel.Error, message); - public void Critical(string message) => Log(LogLevel.Critical, message); -} \ No newline at end of file diff --git a/SpaceWarp/API/Logging/LogLevel.cs b/SpaceWarp/API/Logging/LogLevel.cs deleted file mode 100644 index ee8a7702..00000000 --- a/SpaceWarp/API/Logging/LogLevel.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace SpaceWarp.API.Logging; - -/// -/// Log levels for the BaseModLogger class. -/// -public enum LogLevel -{ - Trace = 0, - Debug = 1, - Info = 2, - Warn = 3, - Error = 4, - Critical = 5 -} \ No newline at end of file diff --git a/SpaceWarp/API/Logging/ModLogger.cs b/SpaceWarp/API/Logging/ModLogger.cs deleted file mode 100644 index 07b8dff0..00000000 --- a/SpaceWarp/API/Logging/ModLogger.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using System.Text; - -namespace SpaceWarp.API.Logging; - -/// -/// Unique logger for each mod, each mod has its own logger to accomodate different behaviours. -/// -public class ModLogger : BaseModLogger -{ - private readonly string _moduleName; - - /// - /// Creates a ModLogger for a module - /// - /// - public ModLogger(string moduleName) - { - _moduleName = moduleName; - } - - private string BuildLogMessage(LogLevel level, string message) - { - StringBuilder sb = new StringBuilder(); - - sb.Append($"[{DateTime.Now:HH:mm:ss.fff}] "); - sb.Append($"[{_moduleName}] "); - sb.Append($"[{level}] "); - sb.Append(message); - - return sb.ToString(); - } - - protected override void Log(LogLevel level, string message) - { - if ((int)level >= SpaceWarpGlobalConfiguration.Instance.LogLevel) - { - string logMessage = BuildLogMessage(level, message); - UnityEngine.Debug.Log(logMessage); - } - } -} \ No newline at end of file diff --git a/SpaceWarp/API/Managers/Manager.cs b/SpaceWarp/API/Managers/Manager.cs deleted file mode 100644 index 86f8a74d..00000000 --- a/SpaceWarp/API/Managers/Manager.cs +++ /dev/null @@ -1,19 +0,0 @@ -using KSP.Game; - -namespace SpaceWarp.API.Managers; - -/// -/// Class to register itself on the ManagerLocator class for ease and performant access. -/// -public class Manager : KerbalMonoBehaviour -{ - protected virtual void Start() - { - ManagerLocator.Add(this); - } - - private void OnDestroy() - { - ManagerLocator.Remove(this); - } -} \ No newline at end of file diff --git a/SpaceWarp/API/Managers/ManagerLocator.cs b/SpaceWarp/API/Managers/ManagerLocator.cs deleted file mode 100644 index 1e1f71aa..00000000 --- a/SpaceWarp/API/Managers/ManagerLocator.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using System.Collections.Generic; -using UnityEngine; - -namespace SpaceWarp.API.Managers; - -public static class ManagerLocator -{ - private static readonly Dictionary Managers = new Dictionary(); - - /// - /// Adds a manager object to the Managers dictionary. This should only run on Start(). - /// - /// The Mod component - public static void Add(MonoBehaviour manager) - { - if (Managers.TryGetValue(manager.GetType(), out object _)) - { - return; - } - - Managers.Add(manager.GetType(), manager); - } - - /// - /// Tries to get a manager from the Managers dictionary. - /// - /// The mod object found. - /// The type of Mod you want to find. - /// - public static bool TryGet(out T foundMod) where T : MonoBehaviour - { - bool hasMod = Managers.TryGetValue(typeof(T), out object mod); - - foundMod = mod as T; - return hasMod; - } - - /// - /// Removes a manager from the dictionary - /// - /// - public static void Remove(Manager manager) - { - Managers.Remove(manager.GetType()); - } -} \ No newline at end of file diff --git a/SpaceWarp/API/Mods/BaseSpaceWarpPlugin.cs b/SpaceWarp/API/Mods/BaseSpaceWarpPlugin.cs new file mode 100644 index 00000000..0d82da11 --- /dev/null +++ b/SpaceWarp/API/Mods/BaseSpaceWarpPlugin.cs @@ -0,0 +1,41 @@ +using BepInEx; +using BepInEx.Logging; +using KSP.Game; +using KSP.Messages; +using KSP.VFX; +using SpaceWarp.API.Mods.JSON; + +namespace SpaceWarp.API.Mods; + +/// +/// Represents a KSP2 Mod, you should inherit from this and do your manager processing. +/// +public abstract class BaseSpaceWarpPlugin : BaseUnityPlugin +{ + #region KspBehaviour things + protected GameInstance Game => GameManager.Instance == null ? null : GameManager.Instance.Game; + + protected MessageCenter Messages => Game.Messages; + + // ReSharper disable Unity.NoNullPropagation + // fine because its null checked by Game properly + protected ContextualFxSystem CFXSystem => Game?.GraphicsManager?.ContextualFxSystem; + + protected bool IsGameShuttingDown => Game == null; + #endregion + + public ModInfo SpaceWarpMetadata { get; internal set; } + internal ManualLogSource ModLogger => base.Logger; + + public virtual void OnPreInitialized() + { + } + + public virtual void OnInitialized() + { + } + + public virtual void OnPostInitialized() + { + } +} diff --git a/SpaceWarp/API/Mods/GlobalModDefines.cs b/SpaceWarp/API/Mods/GlobalModDefines.cs index 0bbf52b1..9022e253 100644 --- a/SpaceWarp/API/Mods/GlobalModDefines.cs +++ b/SpaceWarp/API/Mods/GlobalModDefines.cs @@ -4,7 +4,5 @@ namespace SpaceWarp.API.Mods; public static class GlobalModDefines { - public const string BINARIES_FOLDER = "bin"; - public static readonly string ASSET_BUNDLES_FOLDER = Path.Combine("assets","bundles"); } \ No newline at end of file diff --git a/SpaceWarp/API/Mods/JSON/ModInfo.cs b/SpaceWarp/API/Mods/JSON/ModInfo.cs index abe8964d..b9225c06 100644 --- a/SpaceWarp/API/Mods/JSON/ModInfo.cs +++ b/SpaceWarp/API/Mods/JSON/ModInfo.cs @@ -17,10 +17,10 @@ public class ModInfo [JsonProperty("author")] public string author { get; set; } - + [JsonProperty("description")] public string description { get; set; } - + [JsonProperty("source")] public string source { get; set; } diff --git a/SpaceWarp/API/Mods/Mod.cs b/SpaceWarp/API/Mods/Mod.cs deleted file mode 100644 index 6528c730..00000000 --- a/SpaceWarp/API/Mods/Mod.cs +++ /dev/null @@ -1,41 +0,0 @@ -using KSP.Game; -using SpaceWarp.API.Logging; -using SpaceWarp.API.Mods.JSON; -using UnityEngine; - -namespace SpaceWarp.API.Mods; - -/// -/// Represents a KSP2 Mod, you should inherit from this and do your manager processing. -/// -public abstract class Mod : KerbalMonoBehaviour -{ - public BaseModLogger Logger; - public ModInfo Info; - - - - public virtual void Initialize() - { - } - - private void OnDestroy() - { - ModLocator.Remove(this); - } - - public virtual void OnInitialized() - { - // Empty - } - - public void Setup(Transform transformParent, ModInfo info) - { - transform.SetParent(transformParent); - - ModLogger newModLogger = new ModLogger(info.name); - Logger = newModLogger; - - Info = info; - } -} \ No newline at end of file diff --git a/SpaceWarp/API/Mods/ModLocator.cs b/SpaceWarp/API/Mods/ModLocator.cs deleted file mode 100644 index e3116207..00000000 --- a/SpaceWarp/API/Mods/ModLocator.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace SpaceWarp.API.Mods; - -/// -/// Useful performance-optimized locator for Mod objects. Should be used instead of any other way. -/// -public static class ModLocator -{ - private static readonly Dictionary Mods = new Dictionary(); - - /// - /// Adds a mod object to the Mods dictionary. This should only run on Mod.Start(). - /// - /// The Mod component - public static void Add(Mod modObject) - { - if (Mods.TryGetValue(modObject.GetType(), out object _)) - { - return; - } - - Mods.Add(modObject.GetType(), modObject); - } - - /// - /// Tries to get a mod from the Mods dictionary. - /// - /// The mod object found. - /// The type of Mod you want to find. - /// - public static bool TryGet(out T foundMod) where T : Mod - { - bool hasMod = Mods.TryGetValue(typeof(T), out object mod); - - foundMod = mod as T; - return hasMod; - } - - /// - /// Removes a manager from the dictionary - /// - /// - public static void Remove(Mod modObject) - { - Mods.Remove(modObject.GetType()); - } -} \ No newline at end of file diff --git a/SpaceWarp/API/SpaceWarpGlobalConfiguration.cs b/SpaceWarp/API/SpaceWarpGlobalConfiguration.cs deleted file mode 100644 index ba0e8269..00000000 --- a/SpaceWarp/API/SpaceWarpGlobalConfiguration.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System; -using System.ComponentModel; -using System.IO; -using Newtonsoft.Json; -using UnityEngine; - -namespace SpaceWarp.API; - -[JsonObject(MemberSerialization.OptIn)] -public class SpaceWarpGlobalConfiguration -{ - public static SpaceWarpGlobalConfiguration Instance; - - private static string SPACEWARP_CONFIG_FULL_PATH = Path.Combine(SpaceWarpManager.MODS_FULL_PATH,SPACE_WARP_CONFIG_FILE_NAME); - private const string SPACE_WARP_CONFIG_FILE_NAME = "space_warp_config.json"; - - /// - /// Loading Global Configuration and puting it into Instance. - /// - public static void Init() - { - if (!File.Exists(SPACEWARP_CONFIG_FULL_PATH)) - { - Instance = new SpaceWarpGlobalConfiguration(); - Instance.ApplyDefaultValues(); - } - else - { - try - { - string json = File.ReadAllText(SPACEWARP_CONFIG_FULL_PATH); - Instance = JsonConvert.DeserializeObject(json); - } - catch (Exception exception) - { - //TODO: log this in a nicer way, for now I guess we can just construct a new logger - Debug.LogError($"Loading space warp config failed\nException: {exception}"); - - File.Delete(SPACEWARP_CONFIG_FULL_PATH); - Init(); - return; - } - } - - try - { - File.WriteAllLines(SPACEWARP_CONFIG_FULL_PATH, new[] { JsonConvert.SerializeObject(Instance) }); - } - catch (Exception exception) - { - //TODO: log this in a nicer way, for now I guess we can just construct a new logger - Debug.LogError($"Saving the spacewarp config failed\nException: {exception}"); - } - } - - [JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)] - [DefaultValue((int)Logging.LogLevel.Info)] - public int LogLevel { get; set; } - - [JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)] - [DefaultValue((bool)false)] - public bool HarmonyLoggin { get; set; } - - [JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)] - [DefaultValue((int)Logging.LogLevel.Info)] - public int HarmonyLogLevel { get; set; } - - public void ApplyDefaultValues() - { - LogLevel = (int)Logging.LogLevel.Info; - HarmonyLoggin = false; - HarmonyLogLevel = (int)Logging.LogLevel.Info; - } -} \ No newline at end of file diff --git a/SpaceWarp/API/SpaceWarpManager.cs b/SpaceWarp/API/SpaceWarpManager.cs deleted file mode 100644 index 48b75ff9..00000000 --- a/SpaceWarp/API/SpaceWarpManager.cs +++ /dev/null @@ -1,771 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; -using HarmonyLib; -using UnityEngine; -using Newtonsoft.Json; -using SpaceWarp.API.Configuration; -using SpaceWarp.API.Logging; -using SpaceWarp.API.AssetBundles; -using SpaceWarp.API.Managers; -using SpaceWarp.API.Mods; -using SpaceWarp.API.Mods.JSON; -using SpaceWarp.API.Toolbar; -using SpaceWarp.API.Versions; -using SpaceWarp.Compilation; -using SpaceWarp.Patching; -using SpaceWarp.UI; -using UnityEngine.AddressableAssets; -using UnityEngine.AddressableAssets.ResourceLocators; -using UnityEngine.AddressableAssets.ResourceProviders; -using UnityEngine.ResourceManagement.AsyncOperations; - -namespace SpaceWarp.API; - -/// -/// Handles all the SpaceWarp initialization and mod processing. -/// -public class SpaceWarpManager : Manager -{ - private BaseModLogger _modLogger; - - private const string MODS_FOLDER_NAME = "Mods"; - #if DOORSTOP_BUILD - public static string SPACE_WARP_PATH = Directory.GetParent(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)).FullName + "/"; - #else - public static string SPACE_WARP_PATH = Path.Combine(Directory.GetParent(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)).Parent.Parent.FullName,"SpaceWarp"); - #endif - public static string MODS_FULL_PATH = Path.Combine(SPACE_WARP_PATH,MODS_FOLDER_NAME); - - public SpaceWarpGlobalConfiguration SpaceWarpConfiguration; - - private readonly List _allModScripts = new List(); - internal readonly List<(string, ModInfo)> _modLoadOrder = new List<(string, ModInfo)>(); - public readonly List<(string,ModInfo)> LoadedMods = new List<(string,ModInfo)>(); - private static readonly List<(string, ModInfo)> AllEnabledModInfo = new List<(string, ModInfo)>(); - - public readonly List<(string,ModInfo)> IgnoredMods = new List<(string,ModInfo)>(); - - public ModListUI ModListUI { get; private set; } - protected override void Start() - { - - Debug.Log($"Space Warp Path {SPACE_WARP_PATH}"); - Debug.Log($"Mods Path {MODS_FULL_PATH}"); - - base.Start(); - - Initialize(); - } - - /// - /// Initializes the SpaceWarp manager. - /// - private void Initialize() - { - ToolbarBackend.AppBarInFlightSubscriber.AddListener(LoadAllButtons); - InitializeConfigManager(); - - InitializeModLogger(); - - LoadingScreenPatcher.AddModLoadingScreens(); - } - - /// - ///Initializes the configuration manager - /// - public void InitializeConfigManager() - { - GameObject confManagerObject = new GameObject("Configuration Manager"); - Persist(confManagerObject); - - confManagerObject.AddComponent(); - confManagerObject.SetActive(true); - } - - /// - /// Initializes the SpaceWarp mod logger. - /// - private void InitializeModLogger() - { - _modLogger = new ModLogger("Space Warp"); - _modLogger.Info("Warping Spacetime"); - } - - /// - /// Read all the mods in the mods path - /// - internal void ReadMods() - { - _modLogger.Info("Reading mods"); - - string[] modDirectories; - try - { - modDirectories = Directory.GetDirectories(MODS_FULL_PATH); - } - catch(Exception exception) - { - _modLogger.Critical($"Unable to open mod path: {MODS_FULL_PATH}\nException:{exception}"); - return; - } - - if (modDirectories.Length == 0) - { - _modLogger.Warn("No mods were found! No panic though."); - } - - foreach (string modFolderuntrimmedU in modDirectories) - { - string modFolder = modFolderuntrimmedU.TrimEnd('/', '\\'); - - string modName = Path.GetFileName(modFolder); - if (!File.Exists(Path.Combine(modFolder,"modinfo.json"))) - { - _modLogger.Warn($"Found mod {modName} without modinfo.json"); - continue; - } - - if (File.Exists(Path.Combine(modFolder,".ignore"))) - { - _modLogger.Info($"Skipping mod {modName} due to .ignore file"); - ModInfo ignore_info = JsonConvert.DeserializeObject(File.ReadAllText(modFolder + "\\modinfo.json")); - string ignore_fileName = Path.GetFileName(modFolder); - IgnoredMods.Add((ignore_fileName,ignore_info)); - continue; - } - _modLogger.Info($"Found mod: {modName}, adding to enable mods"); - - ModInfo info = JsonConvert.DeserializeObject(File.ReadAllText(modFolder + "\\modinfo.json")); - string fileName = Path.GetFileName(modFolder); - AllEnabledModInfo.Add((fileName,info)); - } - - ResolveLoadOrder(); - } - - /// - /// Checks if all dependencies are resolved. - /// - /// - /// - private bool AreDependenciesResolved(ModInfo mod) - { - foreach (DependencyInfo dependency in mod.dependencies) - { - _modLogger.Info($"{mod.name} dependency - {dependency.id} {dependency.version.min}-{dependency.version.max}"); - - string dependencyID = dependency.id; - SupportedVersionsInfo dependencyVersion = dependency.version; - - bool found = false; - foreach ((string, ModInfo) loadedMod in _modLoadOrder) - { - if (loadedMod.Item2.mod_id != dependencyID) - { - continue; - } - - string depLoadedVersion = loadedMod.Item2.version; - - if (!VersionUtility.IsVersionAbove(depLoadedVersion, dependencyVersion.min)) - return false; - if (!VersionUtility.IsVersionBellow(depLoadedVersion, dependencyVersion.max)) - return false; - - found = true; - } - - if (!found) return false; - } - - return true; - } - - /// - /// Resolves mod order - /// - private void ResolveLoadOrder() - { - //TODO: Make this way more optimized! - _modLogger.Info("Resolving Load Order"); - bool changed = true; - while (changed) - { - changed = false; - List toRemove = new List(); - for (int i = 0; i < AllEnabledModInfo.Count; i++) - { - _modLogger.Info("Attempting to resolve dependencies for " + AllEnabledModInfo[i].Item1); - if (AreDependenciesResolved(AllEnabledModInfo[i].Item2)) - { - _modLoadOrder.Add(AllEnabledModInfo[i]); - toRemove.Add(i); - changed = true; - } - } - - for (int i = toRemove.Count - 1; i >= 0; i--) - { - AllEnabledModInfo.RemoveAt(toRemove[i]); - } - } - - if (AllEnabledModInfo.Count > 0) - { - foreach ((string modName, ModInfo info) in AllEnabledModInfo) - { - _modLogger.Warn($"Skipping loading of {modName} as not all dependencies could be met"); - } - } - LoadingScreenPatcher.AddAllModLoadingSteps(); - } - - internal void InitializeAssets() - { - _modLogger.Info("Initializing mod assets"); - - foreach ((string modName, ModInfo info) in _modLoadOrder) - { - LoadSingleModAssets(modName, info); - } - - } - - - internal void LoadSpaceWarpAssets() - { - string bundlesPath = Path.Combine(SPACE_WARP_PATH, GlobalModDefines.ASSET_BUNDLES_FOLDER); - - if (Directory.Exists(bundlesPath)) - { - foreach (string file in Directory.GetFiles(bundlesPath)) - { - _modLogger.Info($"Found space warp asset file {file}"); - string assetBundleName = Path.GetFileNameWithoutExtension(file); - if (Path.GetExtension(file) != ".bundle") continue; - - - AssetBundle assetBundle = AssetBundle.LoadFromFile(file); - - if (assetBundle == null) - { - _modLogger.Error($"Failed to load AssetBundle space_warp/{assetBundleName}"); - continue; - } - ResourceManager.RegisterAssetBundle("space_warp", assetBundleName, assetBundle); - _modLogger.Info($"Loaded AssetBundle space_warp/{assetBundleName}"); - } - } - } - - /// - /// Loads a single mods assets - /// - /// the name/id of the mod - /// the mod info structure that describes the mod - internal void LoadSingleModAssets(string modName, ModInfo info) - { - string modFolder = Path.Combine(MODS_FULL_PATH, modName); - - // Now we load all asset bundles under the asset/bundles folder of the mod - string bundlesPath = modFolder + GlobalModDefines.ASSET_BUNDLES_FOLDER; - if (Directory.Exists(bundlesPath)) - { - foreach (string file in Directory.GetFiles(bundlesPath)) - { - string assetBundleName = Path.GetFileNameWithoutExtension(file); - if (Path.GetExtension(file) != ".bundle") continue; - - - AssetBundle assetBundle = AssetBundle.LoadFromFile(file); - - if (assetBundle == null) - { - _modLogger.Error($"Failed to load AssetBundle {info.mod_id}/{assetBundleName}"); - continue; - } - ResourceManager.RegisterAssetBundle(info.mod_id, assetBundleName, assetBundle); - _modLogger.Info($"Loaded AssetBundle {info.mod_id}/{assetBundleName}"); - } - } - else - { - _modLogger.Info($"Did not load assets for {modName} as no assets folder existed!"); - } - - // TODO: load part specific json stuff - } - - /// - /// Runs the mod initialization procedures. - /// - internal void InitializeMods() - { - _modLogger.Info("Initializing mods"); - - - foreach ((string modName, ModInfo info) in _modLoadOrder) - { - InitializeSingleMod(modName, info); - } - } - - /// - /// Initializes a single mod - /// - /// the name/id of the mod - /// the mod info structure that describes the mod - internal void InitializeSingleMod(string modName, ModInfo info) - { - string modFolder = Path.Combine(MODS_FULL_PATH, modName); - - _modLogger.Info($"Found mod: {modName}, attempting to load mod"); - - // Now we load all assemblies under the code folder of the mod - string codePath = Path.Combine(modFolder, GlobalModDefines.BINARIES_FOLDER); - - if (Directory.Exists(codePath)) - { - if (!TryLoadMod(codePath, modName, info, out Type mainModType)) - { - // error logging is done inside TryLoadMod - return; - } - - InitializeModObject(modName, info, mainModType); - } - else - { - _modLogger.Error($"Directory not found: {codePath}"); - } - } - - /// - /// Tries to load a mod at a path - /// - /// The full path to this mod binaries. - /// The mod name - /// The Mod type found - /// If the mod was successfully found. - private bool TryLoadMod(string codePath, string modName, ModInfo modInfo, out Type mainModType) - { - string[] files; - try - { - files = Directory.GetFiles(codePath); - } - catch - { - _modLogger.Error($"Could not load mod: {modName}, unable to read directory"); - mainModType = null; - return false; - } - - List modAssemblies = new List(); - foreach (string file in files) - { - // we only want to load dll files, ignore everything else - if (!file.EndsWith(".dll")) - { - _modLogger.Warn($"Non-dll file found in \"{codePath}\" \"{file}\", Ignoring"); - continue; - } - - Assembly asm; - try - { - asm = Assembly.LoadFrom(file); - } - catch(Exception exeption) - { - _modLogger.Error($"Could not load mod: {modName}, Failed to load assembly {file}\nException: {exeption}"); - mainModType = null; - - return false; - } - - modAssemblies.Add(asm); - } - - - string modFolder = Path.Combine(MODS_FULL_PATH,modName); - string srcPath = Path.Combine(modFolder, "src"); - if (Directory.Exists(srcPath) && Directory.GetFiles(srcPath, "*",SearchOption.AllDirectories).Length > 0) - { - var result = ModCompiler.CompileMod(modInfo.mod_id, srcPath); - if (result != null) - { - modAssemblies.Add(result); - } - } - - mainModType = null; - foreach (Assembly asm in modAssemblies) - { - Type[] types; - try - { - types = asm.GetTypes(); - } - catch - { - _modLogger.Error($"Could not load mod: {modName}, Unable to get types out of assembly {asm.FullName}"); - - mainModType = null; - return false; - } - - - mainModType = types.FirstOrDefault(type => type.GetCustomAttribute() != null); - if (mainModType != null) break; - } - - if (mainModType == null) - { - _modLogger.Error($"Could not load mod: {modName}, no type with [MainMod] exists"); - return false; - } - - - // We want to load the configuration for the mod as well - Type configurationModType = null; - foreach (Assembly asm in modAssemblies) - { - configurationModType = asm.GetTypes() - .FirstOrDefault(type => type.GetCustomAttribute () != null); - if (configurationModType != null) break; - } - - if (configurationModType != null) - { - InitializeModConfig(configurationModType, modName); - } - - if (!typeof(Mod).IsAssignableFrom(mainModType)) - { - _modLogger.Error($"Could not load mod: {modName}, the found class ({mainModType.FullName}) with [MainMod] doesn't inherit from {nameof(Mod)}"); - - mainModType = null; - return false; - } - - // Harmony patch everything in the current mod! - Harmony harmony = new Harmony($"com.mod.{modInfo.author}.{modInfo.mod_id}"); - foreach (Assembly asm in modAssemblies) - { - harmony.PatchAll(asm); - } - - return true; - - } - - /// - /// Tries to find a specific mods config file, if none is found, one is created - /// - private void InitializeModConfig(Type config_type, string mod_id) - { - object modConfiguration = null; - var config_path = Path.Combine(MODS_FULL_PATH, mod_id, "config","config.json"); - if (!File.Exists(config_path)) - { - modConfiguration = Activator.CreateInstance(config_type); - foreach (var fieldInfo in config_type.GetFields(BindingFlags.Instance | BindingFlags.Public)) - { - var def = fieldInfo.GetCustomAttribute(); - if (def != null) - { - fieldInfo.SetValue(modConfiguration, def.DefaultValue); - } - } - } - else - { - try - { - string json = File.ReadAllText(config_path); - modConfiguration = JsonConvert.DeserializeObject(json,config_type); - - } - catch (Exception exception) - { - _modLogger.Error($"Loading mod config failed\nException: {exception}"); - - File.Delete(config_path); - InitializeModConfig(config_type, mod_id); - return; - } - } - - try - { - File.WriteAllLines(config_path, new[] { JsonConvert.SerializeObject(modConfiguration) }); - } - catch (Exception exception) - { - _modLogger.Error($"Saving mod config failed\nException: {exception}"); - } - - if (ManagerLocator.TryGet(out ConfigurationManager configurationManager)) - { - configurationManager.Add(mod_id,(config_type,modConfiguration,config_path)); - } - } - - /// - /// Initializes a mod object. - /// - /// The mod name to initialize. - /// The mod type to initialize. - /// The new mod logger to spawn - private void InitializeModObject(string modName, ModInfo info, Type mainModType) - { - GameObject modObject = new GameObject($"Mod: {modName}"); - Mod modComponent = (Mod)modObject.AddComponent(mainModType); - - _allModScripts.Add(modComponent); - - modComponent.Setup(transform.parent, info); - modObject.SetActive(true); - - _modLogger.Info($"Loaded: {modName}"); - - // we probably dont want to completely stop loading mods if 1 mod throws an exception on Initialize - try - { - ModLocator.Add(modComponent); - Persist(modObject); - modComponent.Initialize(); - } - catch(Exception exception) - { - _modLogger.Critical($"Exception in {modName} Initialize(): {exception}"); - } - - LoadedMods.Add((modName, info)); - } - - /// - /// Calls the OnInitialized method on each initialized mod. - /// - internal void InvokePostInitializeModsAfterAllModsLoaded() - { - foreach (Mod mod in _allModScripts) - { - try - { - mod.OnInitialized(); - } - catch(Exception exception) - { - _modLogger.Critical($"Exception in {mod.name} AfterInitialization(): {exception}"); - } - } - InitModUI(); - } - /// - /// Initializes the UI for the mod list and configuration menu - /// - private void InitModUI() - { - GameObject modUIObject = new GameObject("Space Warp Mod UI"); - Persist(modUIObject); - - modUIObject.transform.SetParent(transform.parent); - ModListUI = modUIObject.AddComponent(); - - modUIObject.SetActive(true); - - GameObject consoleUIObject = new GameObject("Space Warp Console"); - Persist(consoleUIObject); - consoleUIObject.transform.SetParent(transform.parent); - SpaceWarpConsole con = consoleUIObject.AddComponent(); - consoleUIObject.SetActive(true); - } - - private static List<(string text, Sprite icon, string ID, Action action)> _buttonsToBeLoaded = - new List<(string text, Sprite icon, string ID, Action action)>(); - - public T RegisterGameToolbarMenu(string text, string title, string id, Sprite icon) where T : ToolbarMenu - { - GameObject toolBarUIObject = new GameObject($"Toolbar: {id}"); - Persist(toolBarUIObject); - ToolbarMenu menu = toolBarUIObject.AddComponent(); - menu.Title = title; - toolBarUIObject.transform.SetParent(transform.parent); - toolBarUIObject.SetActive(true); - _buttonsToBeLoaded.Add((text,icon,id,menu.ToggleGUI)); - return menu as T; - } - - public static void RegisterAppButton(string text, string id, Sprite icon, Action func) => - _buttonsToBeLoaded.Add((text ,icon, id, func)); - - /// - /// Allows an object to persist through KSP 2s destruction - /// - /// Object that should be persisted - public static void Persist(GameObject toPersist) - { - DontDestroyOnLoad(toPersist); - toPersist.tag = "Game Manager"; - } - - private static GUISkin _skin = null; - - public static GUISkin Skin - { - get - { - if (_skin == null) - ResourceManager.TryGetAsset("space_warp/swconsoleui/swconsoleUI/spacewarpConsole.guiskin", out - (_skin)); - return _skin; - } - } - - private void LoadAllButtons() - { - foreach (var button in _buttonsToBeLoaded) - { - ToolbarBackend.AddButton(button.text, button.icon, button.ID, button.action); - } - } - - /// - /// Loads a png called 'icon.png' as a sprite from the same folder as the calling dll. - /// In our case this should be SpaceWarp\Mods\[mod]\bin\icon.png - /// - /// The size of the png. The appbar expects 24x24. - public static Sprite LoadIcon(int size = 24) - { - string folderPath = Path.GetDirectoryName(Assembly.GetCallingAssembly().Location); - - return LoadIcon(Path.Combine(folderPath, "icon.png"), size); - } - - /// - /// Loads a png at the given path as a sprite. - /// - /// Path to the png. - /// The size of the png. The appbar expects 24x24. - public static Sprite LoadIcon(string path, int size = 24) - { - Texture2D tex = new Texture2D(size, size, TextureFormat.ARGB32, false); - tex.filterMode = FilterMode.Point; - - if (File.Exists(path)) - { - byte[] fileContent = File.ReadAllBytes(path); - ImageConversion.LoadImage(tex, fileContent); - } - - return Sprite.Create(tex, new Rect(0, 0, size, size), new Vector2(0.5f, 0.5f)); - } - - public void InitializeAddressablesFolder() - { - LoadSpaceWarpAddressables(); - } - - public IEnumerator LoadAddressable(string catalog) - { - _modLogger.Info($"Attempting to load {catalog}"); - AsyncOperationHandle operation = Addressables.LoadContentCatalogAsync(catalog, null); - yield return operation; - if (operation.Status == AsyncOperationStatus.Failed) - { - _modLogger.Error($"Failed to load addressables catalog {catalog}"); - } - else - { - _modLogger.Info($"Loaded addressables catalog {catalog}"); - var locator = operation.Result; - _modLogger.Info($"{catalog} ----- {locator.LocatorId}"); - Game.Assets.RegisterResourceLocator(locator); - } - } - - public void LoadSpaceWarpAddressables() - { - string addressablesPath = Path.Combine(SPACE_WARP_PATH,"addressables"); - string catalogPath = Path.Combine(addressablesPath,"catalog.json"); - if (File.Exists(catalogPath)) - { - StartCoroutine(LoadAddressable(catalogPath)); - } - } - - public void LoadSingleModAddressables(string modID, ModInfo info) - { - string modFolder = Path.Combine(MODS_FULL_PATH, modID); - string addressablesPath = Path.Combine(modFolder,"addressables"); - _modLogger.Info($"Loading addressables for {modID}"); - string catalogPath = Path.Combine(addressablesPath, "catalog.json"); - if (File.Exists(catalogPath)) - { - _modLogger.Info($"Found addressables for {modID}"); - StartCoroutine(LoadAddressable(catalogPath)); - } - else - { - _modLogger.Info($"Did not find addressables for {modID}"); - } - } - - private void LoadLocalizationFromFolder(string folder) - { - _modLogger.Info($"Attempting to load localizations from {folder}"); - I2.Loc.LanguageSourceData languageSourceData = null; - if (!Directory.Exists(folder)) - { - _modLogger.Info($"{folder} does not exist, not loading localizations."); - return; - } - DirectoryInfo info = new DirectoryInfo(folder); - foreach (var csvFile in info.GetFiles("*.csv")) - { - languageSourceData ??= new I2.Loc.LanguageSourceData(); - var csvData = File.ReadAllText(csvFile.FullName); - languageSourceData.Import_CSV("", csvData, I2.Loc.eSpreadsheetUpdateMode.AddNewTerms); - } - - foreach (var i2csvFile in info.GetFiles("*.i2csv")) - { - languageSourceData ??= new I2.Loc.LanguageSourceData(); - var i2csvData = File.ReadAllText(i2csvFile.FullName); - languageSourceData.Import_I2CSV("", i2csvData, I2.Loc.eSpreadsheetUpdateMode.AddNewTerms); - } - - if (languageSourceData != null) - { - _modLogger.Info($"Loaded localizations from {folder}"); - I2.Loc.LocalizationManager.AddSource(languageSourceData); - } - else - { - _modLogger.Info($"No localizations found in {folder}"); - } - } - public void LoadSpaceWarpLocalizations() - { - if (I2.Loc.LocalizationManager.Sources.Count == 0) - { - I2.Loc.LocalizationManager.UpdateSources(); - } - - string localizationsPath = Path.Combine(SPACE_WARP_PATH, "localizations"); - LoadLocalizationFromFolder(localizationsPath); - } - - public void LoadSingleModLocalization(string modID, ModInfo info) - { - string modFolder = Path.Combine(MODS_FULL_PATH, modID); - string localizationsPath = Path.Combine(modFolder, "localizations"); - LoadLocalizationFromFolder(localizationsPath); - } -} \ No newline at end of file diff --git a/SpaceWarp/API/Toolbar/ToolbarBackend.cs b/SpaceWarp/API/Toolbar/ToolbarBackend.cs index b1636a93..b5f6e323 100644 --- a/SpaceWarp/API/Toolbar/ToolbarBackend.cs +++ b/SpaceWarp/API/Toolbar/ToolbarBackend.cs @@ -3,6 +3,7 @@ using System; using System.Collections; +using BepInEx.Logging; using HarmonyLib; using I2.Loc; using KSP.Api; @@ -10,7 +11,6 @@ using KSP.Sim.impl; using KSP.UI.Binding; using KSP.UI.Flight; -using SpaceWarp.API.Logging; using TMPro; using UnityEngine; using UnityEngine.Events; @@ -21,7 +21,7 @@ namespace SpaceWarp.API.Toolbar; public static class ToolbarBackend { - private static BaseModLogger _logger = new ModLogger("ToolbarBackend"); + private static ManualLogSource _logger = BepInEx.Logging.Logger.CreateLogSource("ToolbarBackend"); public static GameObject AddButton(string buttonText, Sprite buttonIcon, string buttonId, Action function) { // Find the resource manager button and "others" group. @@ -32,7 +32,7 @@ public static GameObject AddButton(string buttonText, Sprite buttonIcon, string if (list == null || resourceManger == null) { - _logger.Info("Couldn't find appbar."); + _logger.LogInfo("Couldn't find appbar."); return null; } @@ -65,7 +65,7 @@ public static GameObject AddButton(string buttonText, Sprite buttonIcon, string IAction action = resourceManger.GetComponent().Action; appButton.GetComponent().BindAction(action); - _logger.Info($"Added appbar button: {buttonId}"); + _logger.LogInfo($"Added appbar button: {buttonId}"); return appButton; } diff --git a/SpaceWarp/API/Toolbar/ToolbarMenu.cs b/SpaceWarp/API/Toolbar/ToolbarMenu.cs index d880dd84..f0e07c43 100644 --- a/SpaceWarp/API/Toolbar/ToolbarMenu.cs +++ b/SpaceWarp/API/Toolbar/ToolbarMenu.cs @@ -38,7 +38,7 @@ public virtual GUISkin Skin { if (_spaceWarpConsoleSkin == null) { - ResourceManager.TryGetAsset($"space_warp/swconsoleui/swconsoleUI/spacewarpConsole.guiskin", out _spaceWarpConsoleSkin); + AssetManager.TryGetAsset($"space_warp/swconsoleui/swconsoleUI/spacewarpConsole.guiskin", out _spaceWarpConsoleSkin); } return _spaceWarpConsoleSkin; diff --git a/SpaceWarp/BepInExEntrypoint.cs b/SpaceWarp/BepInExEntrypoint.cs deleted file mode 100644 index c5c8301f..00000000 --- a/SpaceWarp/BepInExEntrypoint.cs +++ /dev/null @@ -1,15 +0,0 @@ -#if !DOORSTOP_BUILD -using BepInEx; - -namespace SpaceWarp -{ - [BepInPlugin("com.github.x606.spacewarp", "SpaceWarp", MyPluginInfo.PLUGIN_VERSION)] - public class BepInExEntrypoint : BaseUnityPlugin - { - public void Awake() - { - SpaceWarpEntrypoint.Start(); - } - } -} -#endif diff --git a/SpaceWarp/Compilation/ModCompiler.cs b/SpaceWarp/Compilation/ModCompiler.cs index 6adeb741..9fa45e92 100644 --- a/SpaceWarp/Compilation/ModCompiler.cs +++ b/SpaceWarp/Compilation/ModCompiler.cs @@ -2,19 +2,19 @@ using System.Collections.Generic; using System.IO; using System.Reflection; +using BepInEx.Logging; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using SpaceWarp.API; -using SpaceWarp.API.Logging; using UniLinq; namespace SpaceWarp.Compilation; public static class ModCompiler { - public static readonly string CACHE_LOCATION = Path.Combine(SpaceWarpManager.SPACE_WARP_PATH,"mod_cache"); + public static readonly string CACHE_LOCATION = Path.Combine(SpaceWarpManager.SPACE_WARP_PATH, "mod_cache"); - private static BaseModLogger _logger = new ModLogger("Roslyn Compilation"); + private static ManualLogSource _logger = Logger.CreateLogSource("Roslyn Compilation"); public static Assembly CompileMod(string modID, string modSrcPath) { try @@ -23,22 +23,22 @@ public static Assembly CompileMod(string modID, string modSrcPath) { return null; } - _logger.Info($"starting compilation of {modID}"); + _logger.LogInfo($"starting compilation of {modID}"); if (!CreateNewCompilation(modID, modSrcPath)) { - _logger.Info($"found cached version of {modID}"); + _logger.LogInfo($"found cached version of {modID}"); return GetCachedCompilation(modID); } - _logger.Info($"no cached version for {modID}, generating assembly"); + _logger.LogInfo($"no cached version for {modID}, generating assembly"); // Now work on adding dependencies to the tree return CompileNewAssemblyAndCache(modID, modSrcPath); } catch (Exception e) { - _logger.Error($"error compiling scripts for {modID}\n{e}"); + _logger.LogError($"error compiling scripts for {modID}\n{e}"); return null; } } @@ -114,15 +114,15 @@ select MetadataReference.CreateFromFile(asm.Location) { if (diagnostic.WarningLevel == 0) { - _logger.Error(diagnostic.ToString()); + _logger.LogError(diagnostic.ToString()); } else { - _logger.Info(diagnostic.ToString()); + _logger.LogInfo(diagnostic.ToString()); } } - _logger.Info(result.ToString()); + _logger.LogInfo(result.ToString()); if (!result.Success) { File.Delete(Path.Combine(CACHE_LOCATION,modID + ".dll")); diff --git a/SpaceWarp/Entrypoint.cs b/SpaceWarp/Entrypoint.cs deleted file mode 100644 index 15fed0cd..00000000 --- a/SpaceWarp/Entrypoint.cs +++ /dev/null @@ -1,62 +0,0 @@ -using HarmonyLib; -using KSP.Logging; -using SpaceWarp.API; -using SpaceWarp.UI; -using System.Reflection; -using UnityEngine.SceneManagement; -using HarmonyLogger = HarmonyLib.Tools.Logger; - -#if DOORSTOP_BUILD -namespace Doorstop -{ - public class Entrypoint -#else -namespace SpaceWarp { - public class SpaceWarpEntrypoint -#endif -{ - private static bool _patched; - - private const string HARMONY_PACKAGE_URL = "com.github.x606.spacewarp"; - - /// - /// EntryPoint for Spacewarp, called from Doorstop - /// - public static void Start() - { - SpaceWarpGlobalConfiguration.Init(); - - SceneManager.sceneLoaded += OnSceneLoaded; - - KspLogManager.AddLogCallback(SpaceWarpConsoleLogListener.LogCallback); - if (SpaceWarpGlobalConfiguration.Instance.HarmonyLoggin) - { - HarmonyLogger.ChannelFilter = HarmonyLogger.LogChannel.All; - HarmonyLogger.MessageReceived += SpaceWarpConsoleLogListener.HarmonyLogCallback; - } - } - - /// - /// Add OnGameStarted as postfix to StartGame - /// - static void OnSceneLoaded(Scene unused1, LoadSceneMode unused2) - { - if (!_patched) - { - InitializePatches(); - _patched = true; - } - } - - /// - /// Initializes Harmony - /// - - static void InitializePatches() - { - Harmony harmony = new Harmony(HARMONY_PACKAGE_URL); - - harmony.PatchAll(Assembly.GetExecutingAssembly()); - } - } -} \ No newline at end of file diff --git a/SpaceWarp/Patching/BootstrapPatch.cs b/SpaceWarp/Patching/BootstrapPatch.cs new file mode 100644 index 00000000..dd0ab086 --- /dev/null +++ b/SpaceWarp/Patching/BootstrapPatch.cs @@ -0,0 +1,63 @@ +using HarmonyLib; +using KSP.Game; +using KSP.Game.StartupFlow; +using MonoMod.Cil; +using SpaceWarp.Patching.LoadingActions; + +namespace SpaceWarp.Patching; + +[HarmonyPatch] +internal static class BootstrapPatch +{ + [HarmonyPrefix] + [HarmonyPatch(typeof(GameManager), nameof(GameManager.Awake))] + private static void GetSpaceWarpMods() + { + SpaceWarpManager.GetSpaceWarpPlugins(); + } + + [HarmonyILManipulator] + [HarmonyPatch(typeof(GameManager), nameof(GameManager.StartBootstrap))] + private static void PatchInitializationsIL(ILContext il, ILLabel endLabel) + { + ILCursor c = new(il); + + var flowProp = AccessTools.DeclaredProperty(typeof(GameManager), nameof(GameManager.LoadingFlow)); + + c.GotoNext(MoveType.After, + x => x.MatchCallOrCallvirt(flowProp.SetMethod) + ); + + c.EmitDelegate(static () => + { + foreach (var plugin in SpaceWarpManager.SpaceWarpPlugins) + { + GameManager.Instance.LoadingFlow.AddAction(new PreInitializeModAction(plugin)); + } + }); + + c.GotoNext(MoveType.Before, + x => x.MatchLdarg(0), + x => x.MatchCallOrCallvirt(flowProp.GetMethod), + x => x.MatchLdloc(out _), + x => x.MatchNewobj(out var ctor) && ctor.DeclaringType.FullName == typeof(CreateMainMenuFlowAction).FullName + ); + + c.EmitDelegate(static () => + { + foreach (var plugin in SpaceWarpManager.SpaceWarpPlugins) + { + GameManager.Instance.LoadingFlow.AddAction(new InitializeModAction(plugin)); + } + }); + + c.GotoLabel(endLabel); + c.EmitDelegate(static () => + { + foreach (var plugin in SpaceWarpManager.SpaceWarpPlugins) + { + GameManager.Instance.LoadingFlow.AddAction(new PostInitializeModAction(plugin)); + } + }); + } +} diff --git a/SpaceWarp/Patching/LoadingActions/AfterModsLoadedAction.cs b/SpaceWarp/Patching/LoadingActions/AfterModsLoadedAction.cs deleted file mode 100644 index 41a54d2d..00000000 --- a/SpaceWarp/Patching/LoadingActions/AfterModsLoadedAction.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; -using KSP.Game.Flow; -using SpaceWarp.API; -using SpaceWarp.API.Managers; - -namespace SpaceWarp.Patching.LoadingActions; - -public class AfterModsLoadedAction : FlowAction -{ - public AfterModsLoadedAction(string name) : base(name) - { - // - } - - public override void DoAction(Action resolve, Action reject) - { - ManagerLocator.TryGet(out SpaceWarpManager spaceWarpManager); - - try - { - spaceWarpManager.InvokePostInitializeModsAfterAllModsLoaded(); - resolve(); - } - catch (Exception e) - { - reject(e.ToString()); - } - } -} \ No newline at end of file diff --git a/SpaceWarp/Patching/LoadingActions/InitializeModAction.cs b/SpaceWarp/Patching/LoadingActions/InitializeModAction.cs new file mode 100644 index 00000000..f44faf7e --- /dev/null +++ b/SpaceWarp/Patching/LoadingActions/InitializeModAction.cs @@ -0,0 +1,29 @@ +using System; +using KSP.Game.Flow; +using SpaceWarp.API.Mods; + +namespace SpaceWarp.Patching.LoadingActions; + +public class InitializeModAction : FlowAction +{ + private BaseSpaceWarpPlugin Plugin; + + public InitializeModAction(BaseSpaceWarpPlugin plugin) : base($"Initialization for plugin {plugin.Info.Metadata.Name}") + { + Plugin = plugin; + } + + public override void DoAction(Action resolve, Action reject) + { + try + { + Plugin.OnInitialized(); + resolve(); + } + catch (Exception e) + { + Plugin.ModLogger.LogError(e.ToString()); + reject(null); + } + } +} diff --git a/SpaceWarp/Patching/LoadingActions/LoadModAction.cs b/SpaceWarp/Patching/LoadingActions/LoadModAction.cs deleted file mode 100644 index 500608c7..00000000 --- a/SpaceWarp/Patching/LoadingActions/LoadModAction.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; -using KSP.Game.Flow; -using SpaceWarp.API; -using SpaceWarp.API.Managers; -using SpaceWarp.API.Mods.JSON; - -namespace SpaceWarp.Patching.LoadingActions; - -public class LoadModAction : FlowAction -{ - private readonly string _modID; - private readonly ModInfo _info; - - public LoadModAction(string name, string modID, ModInfo info) : base(name) - { - _modID = modID; - _info = info; - } - - public override void DoAction(Action resolve, Action reject) - { - ManagerLocator.TryGet(out SpaceWarpManager spaceWarpManager); - - try - { - spaceWarpManager.InitializeSingleMod(_modID,_info); - resolve(); - } - catch (Exception e) - { - reject(e.ToString()); - } - } -} \ No newline at end of file diff --git a/SpaceWarp/Patching/LoadingActions/PostInitializeModAction.cs b/SpaceWarp/Patching/LoadingActions/PostInitializeModAction.cs new file mode 100644 index 00000000..1b795320 --- /dev/null +++ b/SpaceWarp/Patching/LoadingActions/PostInitializeModAction.cs @@ -0,0 +1,29 @@ +using System; +using KSP.Game.Flow; +using SpaceWarp.API.Mods; + +namespace SpaceWarp.Patching.LoadingActions; + +internal sealed class PostInitializeModAction : FlowAction +{ + private BaseSpaceWarpPlugin Plugin; + + public PostInitializeModAction(BaseSpaceWarpPlugin plugin) : base($"Post-initialization for plugin {plugin.Info.Metadata.Name}") + { + Plugin = plugin; + } + + public override void DoAction(Action resolve, Action reject) + { + try + { + Plugin.OnPostInitialized(); + resolve(); + } + catch (Exception e) + { + Plugin.ModLogger.LogError(e.ToString()); + reject(null); + } + } +} diff --git a/SpaceWarp/Patching/LoadingActions/PreInitializeModAction.cs b/SpaceWarp/Patching/LoadingActions/PreInitializeModAction.cs new file mode 100644 index 00000000..2e23d0cc --- /dev/null +++ b/SpaceWarp/Patching/LoadingActions/PreInitializeModAction.cs @@ -0,0 +1,29 @@ +using System; +using KSP.Game.Flow; +using SpaceWarp.API.Mods; + +namespace SpaceWarp.Patching.LoadingActions; + +internal sealed class PreInitializeModAction : FlowAction +{ + private BaseSpaceWarpPlugin Plugin; + + public PreInitializeModAction(BaseSpaceWarpPlugin plugin) : base($"Pre-initialization for plugin {plugin.Info.Metadata.Name}") + { + Plugin = plugin; + } + + public override void DoAction(Action resolve, Action reject) + { + try + { + Plugin.OnPreInitialized(); + resolve(); + } + catch (Exception e) + { + Plugin.ModLogger.LogError(e.ToString()); + reject(null); + } + } +} diff --git a/SpaceWarp/Patching/LoadingActions/ReadingModsAction.cs b/SpaceWarp/Patching/LoadingActions/ReadingModsAction.cs deleted file mode 100644 index ea3698c1..00000000 --- a/SpaceWarp/Patching/LoadingActions/ReadingModsAction.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; -using KSP.Game.Flow; -using SpaceWarp.API; -using SpaceWarp.API.Managers; - -namespace SpaceWarp.Patching.LoadingActions; - -public class ReadingModsAction : FlowAction -{ - public ReadingModsAction(string name) : base(name) - { - // - } - - public override void DoAction(Action resolve, Action reject) - { - ManagerLocator.TryGet(out SpaceWarpManager spaceWarpManager); - - try - { - spaceWarpManager.ReadMods(); - resolve(); - } - catch (Exception e) - { - reject(e.ToString()); - } - } -} \ No newline at end of file diff --git a/SpaceWarp/Patching/LoadingScreenPatcher.cs b/SpaceWarp/Patching/LoadingScreenPatcher.cs index ad7ff4e4..4e010b70 100644 --- a/SpaceWarp/Patching/LoadingScreenPatcher.cs +++ b/SpaceWarp/Patching/LoadingScreenPatcher.cs @@ -14,7 +14,6 @@ public class LoadingScreenPatcher public static void AddModLoadingScreens() { GameManager gameManager = GameManager.Instance; - gameManager.LoadingFlow.AddAction(new ReadingModsAction("Resolving Space Warp Mod Load Order")); gameManager.LoadingFlow.AddAction( new LoadSpaceWarpAddressablesAction("Initializing Space Warp Provided Addressables")); gameManager.LoadingFlow.AddAction( @@ -34,9 +33,9 @@ public static void AddAllModLoadingSteps() gameManager.LoadingFlow.AddAction(new LoadAssetAction($"Loading assets for {mod.Item1}", mod.Item1, mod.Item2)); gameManager.LoadingFlow.AddAction(new LoadLocalizationAction($"Loading localizations for {mod.Item1}", mod.Item1, mod.Item2)); - gameManager.LoadingFlow.AddAction(new LoadModAction($"Initializing {mod.Item1}", mod.Item1, mod.Item2)); + gameManager.LoadingFlow.AddAction(new InitializeModAction($"Initializing {mod.Item1}", mod.Item1, mod.Item2)); } - gameManager.LoadingFlow.AddAction(new AfterModsLoadedAction("Space Warp Mod Post-Initialization")); + gameManager.LoadingFlow.AddAction(new PostInitializeModsAction("Space Warp Mod Post-Initialization")); } } \ No newline at end of file diff --git a/SpaceWarp/Patching/MainMenuPatcher.cs b/SpaceWarp/Patching/MainMenuPatcher.cs index dd435a69..ce1bd8a1 100644 --- a/SpaceWarp/Patching/MainMenuPatcher.cs +++ b/SpaceWarp/Patching/MainMenuPatcher.cs @@ -1,7 +1,6 @@ using HarmonyLib; using KSP.Api.CoreTypes; using SpaceWarp.API; -using SpaceWarp.API.Managers; using TMPro; using UnityEngine; @@ -13,7 +12,6 @@ class MainMenuPatcher { public static void Postfix(KSP.Game.StartupFlow.LandingHUD __instance) { - Transform menuItemsGroupTransform = __instance.transform.FindChildEx("MenuItemsGroup"); Transform singleplayerButtonTransform = menuItemsGroupTransform.FindChildEx("Singleplayer"); @@ -39,11 +37,9 @@ public static void Postfix(KSP.Game.StartupFlow.LandingHUD __instance) static void ModsOnClick() { - bool found = ManagerLocator.TryGet(out SpaceWarpManager manager); - - if (found) + if (ManagerLocator.TryGet(out SpaceWarpManager manager)) { manager.ModListUI.ToggleVisible(); } } -} \ No newline at end of file +} diff --git a/SpaceWarp/Patching/StartGamePatch.cs b/SpaceWarp/Patching/StartGamePatch.cs deleted file mode 100644 index 346526a6..00000000 --- a/SpaceWarp/Patching/StartGamePatch.cs +++ /dev/null @@ -1,14 +0,0 @@ -using HarmonyLib; - - -namespace SpaceWarp.Patching; - -[HarmonyPatch(typeof(KSP.Game.GameManager))] -[HarmonyPatch("StartGame")] -public class StartGamePatch -{ - public static void Prefix() - { - StartupManager.OnGameStarted(); - } -} \ No newline at end of file diff --git a/SpaceWarp/SpaceWarp.csproj b/SpaceWarp/SpaceWarp.csproj index 88314d58..519fc63c 100644 --- a/SpaceWarp/SpaceWarp.csproj +++ b/SpaceWarp/SpaceWarp.csproj @@ -6,7 +6,7 @@ true false true - net472;netstandard2.0 + net472 @@ -25,9 +25,6 @@ ..\external_dlls\Unity.ResourceManager.dll - - ..\external_dlls\UnityEngine.ImageConversionModule.dll - diff --git a/SpaceWarp/SpaceWarpManager.cs b/SpaceWarp/SpaceWarpManager.cs new file mode 100644 index 00000000..c170dcd2 --- /dev/null +++ b/SpaceWarp/SpaceWarpManager.cs @@ -0,0 +1,322 @@ +using System; +using System.IO; +using System.Collections; +using System.Collections.Generic; +using System.Reflection; +using BepInEx.Bootstrap; +using BepInEx.Logging; +using UnityEngine; +using SpaceWarp.API.AssetBundles; +using SpaceWarp.API.Mods; +using SpaceWarp.API.Mods.JSON; +using SpaceWarp.API.Toolbar; +using SpaceWarp.Patching; +using SpaceWarp.UI; +using UnityEngine.AddressableAssets; +using UnityEngine.AddressableAssets.ResourceLocators; +using UnityEngine.ResourceManagement.AsyncOperations; + +namespace SpaceWarp; + +/// +/// Handles all the SpaceWarp initialization and mod processing. +/// +internal static class SpaceWarpManager +{ + private static ManualLogSource _logger; + + internal static BaseSpaceWarpPlugin[] SpaceWarpPlugins; + + internal static void GetSpaceWarpPlugins() + { + SpaceWarpPlugins = Chainloader.PluginInfos.Values.Select(p => p.Instance).OfType().ToArray(); + } + + public static ModListUI ModListUI { get; private set; } + + public static void Initialize() + { + ToolbarBackend.AppBarInFlightSubscriber.AddListener(LoadAllButtons); + + _logger = BepInEx.Logging.Logger.CreateLogSource("SpaceWarp Manager"); + + LoadingScreenPatcher.AddModLoadingScreens(); + } + + internal void InitializeAssets() + { + _logger.LogWarning("Initializing mod assets"); + + foreach ((string modName, ModInfo info) in _modLoadOrder) + { + LoadSingleModAssets(modName, info); + } + + } + + + internal void LoadSpaceWarpAssets() + { + string bundlesPath = Path.Combine(SPACE_WARP_PATH, GlobalModDefines.ASSET_BUNDLES_FOLDER); + + if (Directory.Exists(bundlesPath)) + { + foreach (string file in Directory.GetFiles(bundlesPath)) + { + _logger.LogInfo($"Found space warp asset file {file}"); + string assetBundleName = Path.GetFileNameWithoutExtension(file); + if (Path.GetExtension(file) != ".bundle") continue; + + + AssetBundle assetBundle = AssetBundle.LoadFromFile(file); + + if (assetBundle == null) + { + _logger.LogError($"Failed to load AssetBundle space_warp/{assetBundleName}"); + continue; + } + AssetManager.RegisterAssetBundle("space_warp", assetBundleName, assetBundle); + _logger.LogInfo($"Loaded AssetBundle space_warp/{assetBundleName}"); + } + } + } + + /// + /// Loads a single mods assets + /// + /// the name/id of the mod + /// the mod info structure that describes the mod + internal void LoadSingleModAssets(string modName, ModInfo info) + { + string modFolder = Path.Combine(MODS_FULL_PATH, modName); + + // Now we load all asset bundles under the asset/bundles folder of the mod + string bundlesPath = modFolder + GlobalModDefines.ASSET_BUNDLES_FOLDER; + if (Directory.Exists(bundlesPath)) + { + foreach (string file in Directory.GetFiles(bundlesPath)) + { + string assetBundleName = Path.GetFileNameWithoutExtension(file); + if (Path.GetExtension(file) != ".bundle") continue; + + + AssetBundle assetBundle = AssetBundle.LoadFromFile(file); + + if (assetBundle == null) + { + _logger.LogError($"Failed to load AssetBundle {info.mod_id}/{assetBundleName}"); + continue; + } + AssetManager.RegisterAssetBundle(info.mod_id, assetBundleName, assetBundle); + _logger.LogInfo($"Loaded AssetBundle {info.mod_id}/{assetBundleName}"); + } + } + else + { + _logger.LogInfo($"Did not load assets for {modName} as no assets folder existed!"); + } + + // TODO: load part specific json stuff + } + + /// + /// Initializes the UI for the mod list and configuration menu + /// + private void InitModUI() + { + GameObject modUIObject = new GameObject("Space Warp Mod UI"); + Persist(modUIObject); + + modUIObject.transform.SetParent(transform.parent); + ModListUI = modUIObject.AddComponent(); + + modUIObject.SetActive(true); + + GameObject consoleUIObject = new GameObject("Space Warp Console"); + Persist(consoleUIObject); + consoleUIObject.transform.SetParent(transform.parent); + SpaceWarpConsole con = consoleUIObject.AddComponent(); + consoleUIObject.SetActive(true); + } + + private static List<(string text, Sprite icon, string ID, Action action)> _buttonsToBeLoaded = + new List<(string text, Sprite icon, string ID, Action action)>(); + + public T RegisterGameToolbarMenu(string text, string title, string id, Sprite icon) where T : ToolbarMenu + { + GameObject toolBarUIObject = new GameObject($"Toolbar: {id}"); + Persist(toolBarUIObject); + ToolbarMenu menu = toolBarUIObject.AddComponent(); + menu.Title = title; + toolBarUIObject.transform.SetParent(transform.parent); + toolBarUIObject.SetActive(true); + _buttonsToBeLoaded.Add((text,icon,id,menu.ToggleGUI)); + return menu as T; + } + + public static void RegisterAppButton(string text, string id, Sprite icon, Action func) => + _buttonsToBeLoaded.Add((text ,icon, id, func)); + + /// + /// Allows an object to persist through KSP 2s destruction + /// + /// Object that should be persisted + public static void Persist(UnityObject toPersist) + { + UnityObject.DontDestroyOnLoad(toPersist); + toPersist.hideFlags |= HideFlags.HideAndDontSave; + } + + private static GUISkin _skin = null; + + public static GUISkin Skin + { + get + { + if (_skin) + AssetManager.TryGetAsset("space_warp/swconsoleui/spacewarpConsole.guiskin", out _skin); + return _skin; + } + } + + private void LoadAllButtons() + { + foreach (var button in _buttonsToBeLoaded) + { + ToolbarBackend.AddButton(button.text, button.icon, button.ID, button.action); + } + } + + /// + /// Loads a png called 'icon.png' as a sprite from the same folder as the calling dll. + /// In our case this should be SpaceWarp\Mods\[mod]\bin\icon.png + /// + /// The size of the png. The appbar expects 24x24. + public static Sprite LoadIcon(int size = 24) + { + string folderPath = Path.GetDirectoryName(Assembly.GetCallingAssembly().Location); + + return LoadIcon(Path.Combine(folderPath, "icon.png"), size); + } + + /// + /// Loads a png at the given path as a sprite. + /// + /// Path to the png. + /// The size of the png. The appbar expects 24x24. + public static Sprite LoadIcon(string path, int size = 24) + { + Texture2D tex = new Texture2D(size, size, TextureFormat.ARGB32, false); + tex.filterMode = FilterMode.Point; + + if (File.Exists(path)) + { + byte[] fileContent = File.ReadAllBytes(path); + tex.LoadImage(fileContent); + } + + return Sprite.Create(tex, new Rect(0, 0, size, size), new Vector2(0.5f, 0.5f)); + } + + public void InitializeAddressablesFolder() + { + LoadSpaceWarpAddressables(); + } + + public IEnumerator LoadAddressable(string catalog) + { + _logger.LogInfo($"Attempting to load {catalog}"); + AsyncOperationHandle operation = Addressables.LoadContentCatalogAsync(catalog, null); + yield return operation; + if (operation.Status == AsyncOperationStatus.Failed) + { + _logger.LogError($"Failed to load addressables catalog {catalog}"); + } + else + { + _logger.LogInfo($"Loaded addressables catalog {catalog}"); + var locator = operation.Result; + _logger.LogInfo($"{catalog} ----- {locator.LocatorId}"); + Game.Assets.RegisterResourceLocator(locator); + } + } + + public void LoadSpaceWarpAddressables() + { + string addressablesPath = Path.Combine(SPACE_WARP_PATH,"addressables"); + string catalogPath = Path.Combine(addressablesPath,"catalog.json"); + if (File.Exists(catalogPath)) + { + StartCoroutine(LoadAddressable(catalogPath)); + } + } + + public void LoadSingleModAddressables(string modID, ModInfo info) + { + string modFolder = Path.Combine(MODS_FULL_PATH, modID); + string addressablesPath = Path.Combine(modFolder,"addressables"); + _logger.LogInfo($"Loading addressables for {modID}"); + string catalogPath = Path.Combine(addressablesPath, "catalog.json"); + if (File.Exists(catalogPath)) + { + _logger.LogInfo($"Found addressables for {modID}"); + StartCoroutine(LoadAddressable(catalogPath)); + } + else + { + _logger.LogInfo($"Did not find addressables for {modID}"); + } + } + + private void LoadLocalizationFromFolder(string folder) + { + _logger.LogInfo($"Attempting to load localizations from {folder}"); + I2.Loc.LanguageSourceData languageSourceData = null; + if (!Directory.Exists(folder)) + { + _logger.LogInfo($"{folder} does not exist, not loading localizations."); + return; + } + DirectoryInfo info = new DirectoryInfo(folder); + foreach (var csvFile in info.GetFiles("*.csv")) + { + languageSourceData ??= new I2.Loc.LanguageSourceData(); + var csvData = File.ReadAllText(csvFile.FullName); + languageSourceData.Import_CSV("", csvData, I2.Loc.eSpreadsheetUpdateMode.AddNewTerms); + } + + foreach (var i2csvFile in info.GetFiles("*.i2csv")) + { + languageSourceData ??= new I2.Loc.LanguageSourceData(); + var i2csvData = File.ReadAllText(i2csvFile.FullName); + languageSourceData.Import_I2CSV("", i2csvData, I2.Loc.eSpreadsheetUpdateMode.AddNewTerms); + } + + if (languageSourceData != null) + { + _logger.LogInfo($"Loaded localizations from {folder}"); + I2.Loc.LocalizationManager.AddSource(languageSourceData); + } + else + { + _logger.LogInfo($"No localizations found in {folder}"); + } + } + public void LoadSpaceWarpLocalizations() + { + if (I2.Loc.LocalizationManager.Sources.Count == 0) + { + I2.Loc.LocalizationManager.UpdateSources(); + } + + string localizationsPath = Path.Combine(SPACE_WARP_PATH, "localizations"); + LoadLocalizationFromFolder(localizationsPath); + } + + public void LoadSingleModLocalization(string modID, ModInfo info) + { + string modFolder = Path.Combine(MODS_FULL_PATH, modID); + string localizationsPath = Path.Combine(modFolder, "localizations"); + LoadLocalizationFromFolder(localizationsPath); + } +} \ No newline at end of file diff --git a/SpaceWarp/SpaceWarpPlugin.cs b/SpaceWarp/SpaceWarpPlugin.cs new file mode 100644 index 00000000..39fbaa57 --- /dev/null +++ b/SpaceWarp/SpaceWarpPlugin.cs @@ -0,0 +1,22 @@ +global using UnityObject = UnityEngine.Object; +global using System.Linq; + +using BepInEx; +using HarmonyLib; +using SpaceWarp.UI; + +namespace SpaceWarp; + +[BepInPlugin(ModGuid, ModName, MyPluginInfo.PLUGIN_VERSION)] +public sealed class SpaceWarpPlugin : BaseUnityPlugin +{ + public const string ModGuid = "com.github.x606.spacewarp"; + public const string ModName = "Space Warp"; + + public void Awake() + { + BepInEx.Logging.Logger.Listeners.Add(new SpaceWarpConsoleLogListener()); + + Harmony.CreateAndPatchAll(typeof(SpaceWarpPlugin).Assembly, ModGuid); + } +} diff --git a/SpaceWarp/StartupManager.cs b/SpaceWarp/StartupManager.cs deleted file mode 100644 index d9bf68f4..00000000 --- a/SpaceWarp/StartupManager.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System; -using UnityEngine; -using System.IO; -using SpaceWarp.API; - -namespace SpaceWarp; - -/// -/// Starts the SpaceWarm mod manager -/// -public static class StartupManager -{ - public static SpaceWarpManager SpaceWarpObject; - public static bool _hasInitialized = false; - - /// - /// This will be called once the KSP2 game is loaded. - /// - /// - public static void OnGameStarted() - { - // since OnGameStarted could be called multiple times, we want to make sure we only do anything on first call. - if (_hasInitialized) - { - return; - } - - CreateModDirectoryIfNotExists(); - CreateSpaceWarpManager(); - - Console.WriteLine("[Space Warp] Space Warp mod manager loaded!"); - _hasInitialized = true; - } - - /// - /// Creates the space warp manager object. - /// - private static void CreateSpaceWarpManager() - { - GameObject spaceWarp = new GameObject("Space Warp"); - SpaceWarpManager.Persist(spaceWarp); - SpaceWarpObject = spaceWarp.AddComponent(); - spaceWarp.SetActive(true); - // SpaceWarpObject.Initialize(); - } - - /// - /// Creates the mod folder if it doesn't exist. - /// - private static void CreateModDirectoryIfNotExists() - { - Directory.CreateDirectory(SpaceWarpManager.MODS_FULL_PATH); - } -} \ No newline at end of file diff --git a/SpaceWarp/UI/ModConfigurationUI.cs b/SpaceWarp/UI/ModConfigurationUI.cs deleted file mode 100644 index e77de934..00000000 --- a/SpaceWarp/UI/ModConfigurationUI.cs +++ /dev/null @@ -1,216 +0,0 @@ -using System; -using System.ComponentModel; -using System.Reflection; -using KSP.Game; -using SpaceWarp.API; -using SpaceWarp.API.Configuration; -using SpaceWarp.API.Managers; -using UnityEngine; -using UnityEngine.Serialization; - -namespace SpaceWarp.UI; - -public class ModConfigurationUI : KerbalMonoBehaviour -{ - public Type ConfigurationType; - public object ConfigurationObject; - - [FormerlySerializedAs("ModID")] public string modID; - - private int _windowWidth = 350; - private int _windowHeight = 700; - private Rect _windowRect; - - private static GUIStyle _boxStyle; - - private ModConfigurationSection _rootSection; - private GUIStyle _spaceWarpUISkinToggled; - private bool hasGUIStyles = false; - - private void Awake() - { - _windowWidth = (int)(Screen.width * 0.5f); - _windowHeight = (int)(Screen.height * 0.5f); - } - - public void Start() - { - _rootSection = new ModConfigurationSection(); - foreach (FieldInfo field in ConfigurationType.GetFields(BindingFlags.Instance | BindingFlags.Public)) - { - object attribute; - string attributeName; - string section = ""; - - ConfigSectionAttribute sectionAttribute = field.GetCustomAttribute(); - - if (sectionAttribute != null) - { - section = sectionAttribute.Path; - } - - ConfigFieldAttribute fieldAttribute = field.GetCustomAttribute(); - - if (fieldAttribute == null) - { - // attribute = fieldAttribute; - // attributeName = fieldAttribute.Name; - // _rootSection.Insert(section.Split(new []{'/'},StringSplitOptions.RemoveEmptyEntries), (attributeName, field, attribute, field.GetValue(ConfigurationObject).ToString())); - continue; - } - attribute = fieldAttribute; - attributeName = fieldAttribute.Name; - - var value = field.GetValue(ConfigurationObject); - _rootSection.Insert(section.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries), - (attributeName, field, attribute, value != null ? value.ToString() : "")); - } - - _windowRect = new Rect((Screen.width * 0.15f), (Screen.height * 0.15f), 0, 0); - } - - private void GetGUIStyles() - { - _spaceWarpUISkinToggled = new GUIStyle(SpaceWarpManager.Skin.button); - var oldNormal = _spaceWarpUISkinToggled.normal; - var oldHover = _spaceWarpUISkinToggled.hover; - var oldActive = _spaceWarpUISkinToggled.active; - var oldFocused = _spaceWarpUISkinToggled.focused; - _spaceWarpUISkinToggled.normal = _spaceWarpUISkinToggled.onNormal; - _spaceWarpUISkinToggled.hover = _spaceWarpUISkinToggled.onHover; - _spaceWarpUISkinToggled.active = _spaceWarpUISkinToggled.onActive; - _spaceWarpUISkinToggled.focused = _spaceWarpUISkinToggled.onFocused; - _spaceWarpUISkinToggled.onNormal = oldNormal; - _spaceWarpUISkinToggled.onHover = oldHover; - _spaceWarpUISkinToggled.onActive = oldActive; - _spaceWarpUISkinToggled.onFocused = oldFocused; - hasGUIStyles = true; - } - public void OnGUI() - { - GUI.skin = SpaceWarpManager.Skin; - if (!hasGUIStyles) - { - - } - int controlID = GUIUtility.GetControlID(FocusType.Passive); - string header = $"{modID} configuration"; - - GUILayoutOption width = GUILayout.Width((float)(_windowWidth * 0.5)); - GUILayoutOption height = GUILayout.Height((float)(_windowHeight * 0.5)); - - _windowRect = GUILayout.Window(controlID, _windowRect, FillWindow, header, width, height); - } - - private string EditorInputField(string fieldName, FieldInfo info, string current) - { - var result = ""; - GUILayout.BeginHorizontal(); - - if (info.FieldType != typeof(bool)) - { - GUILayout.Label(fieldName); - - string rawInputValue = GUILayout.TextField(current); - result = rawInputValue; - try - { - object convertedInputValue = TypeDescriptor.GetConverter(info.FieldType) - .ConvertFromInvariantString(rawInputValue); - info.SetValue(ConfigurationObject, convertedInputValue); - } - catch - { - // ignored - } - } - else - { - bool toggleValue = GUILayout.Toggle((bool)info.GetValue(ConfigurationObject), fieldName); - result = toggleValue.ToString(); - info.SetValue(ConfigurationObject, toggleValue); - } - - GUILayout.EndHorizontal(); - return result; - } - - private string EditorForField((string name, FieldInfo info, object confAttribute, string currentStringValue) field) - { - if (field.confAttribute is ConfigFieldAttribute) - { - return EditorInputField(field.name, field.info, field.currentStringValue); - } - else - { - return ""; - } - } - - private void SectionPropertyViewer(string sectionName, ModConfigurationSection section, string parent) - { - - - if (GUILayout.Button((section.Open ? "V " : "> ") + (parent == "" ? sectionName : parent + "/" + sectionName))) - { - section.Open = !section.Open; - } - - if (!section.Open) - { - return; - } - - - for (int i = 0; i < section.Properties.Count; i++) - { - var prop = section.Properties[i]; - var str = EditorForField(prop); - prop.currentStringValue = str; - section.Properties[i] = prop; - } - - foreach ((string path, ModConfigurationSection section) sub in section.SubSections) - { - SectionPropertyViewer(sub.path, sub.section, parent == "" ? sectionName : parent + "/" + sectionName); - } - } - - public ModConfigurationUI(Rect windowRect) - { - _windowRect = windowRect; - } - - private void FillWindow(int windowID) - { - _boxStyle = GUI.skin.GetStyle("Box"); - GUILayout.BeginVertical(); - - // These are the root properties - for (int i = 0; i < _rootSection.Properties.Count; i++) - { - var prop = _rootSection.Properties[i]; - var str = EditorForField(prop); - prop.currentStringValue = str; - _rootSection.Properties[i] = prop; - } - - foreach ((string path, ModConfigurationSection section) section in _rootSection.SubSections) - { - SectionPropertyViewer(section.path, section.section, ""); - } - - if (GUILayout.Button("Save and close")) - { - //Run saving code from the configuration manager - if (ManagerLocator.TryGet(out ConfigurationManager configurationManager)) - { - configurationManager.UpdateConfiguration(modID); - } - Destroy(this); - } - - GUILayout.EndVertical(); - GUI.DragWindow(new Rect(0, 0, 10000, 500)); - } -} \ No newline at end of file diff --git a/SpaceWarp/UI/ModListUI.cs b/SpaceWarp/UI/ModListUI.cs index c0d876ee..a7197554 100644 --- a/SpaceWarp/UI/ModListUI.cs +++ b/SpaceWarp/UI/ModListUI.cs @@ -46,7 +46,7 @@ private void Awake() _windowHeight = (int)(Screen.height * 0.85f); _windowRect = new Rect(Screen.width * 0.15f, Screen.height * 0.15f, 0, 0); - ResourceManager.TryGetAsset($"space_warp/swconsoleui/swconsoleUI/spacewarpConsole.guiskin", out _spaceWarpUISkin); + AssetManager.TryGetAsset($"space_warp/swconsoleui/swconsoleUI/spacewarpConsole.guiskin", out _spaceWarpUISkin); } private void OnGUI() diff --git a/SpaceWarp/UI/SpaceWarpConsole.cs b/SpaceWarp/UI/SpaceWarpConsole.cs index 2b00a83a..838d20b9 100644 --- a/SpaceWarp/UI/SpaceWarpConsole.cs +++ b/SpaceWarp/UI/SpaceWarpConsole.cs @@ -5,10 +5,8 @@ namespace SpaceWarp.UI; -public class SpaceWarpConsole : KerbalBehavior +public sealed class SpaceWarpConsole : MonoBehaviour { - private static bool _loaded; - private bool _drawUI; private Rect _windowRect; bool _autoScroll = true; @@ -16,31 +14,16 @@ public class SpaceWarpConsole : KerbalBehavior private int _windowWidth = 350; private int _windowHeight = 700; - private static GUIStyle _boxStyle; private static Vector2 _scrollPosition; private static Vector2 _scrollView; - private readonly Queue _debugMessages = new(); - - public new void Start() - { - if (_loaded) - { - Destroy(this); - } - - _loaded = true; - } - private new void Awake() { - _windowWidth = (int)(Screen.width * 0.5f); _windowHeight = (int)(Screen.height * 0.5f); - _windowRect = new Rect((Screen.width * 0.15f), (Screen.height * 0.15f), 0, 0); + _windowRect = new Rect(Screen.width * 0.15f, Screen.height * 0.15f, 0, 0); _scrollPosition = Vector2.zero; - } private void OnGUI() @@ -52,7 +35,7 @@ private void OnGUI() } int controlID = GUIUtility.GetControlID(FocusType.Passive); - string header = $"spacewarp.console"; + string header = "spacewarp.console"; GUILayoutOption width = GUILayout.Width((float)(_windowWidth * 0.8)); GUILayoutOption height = GUILayout.Height((float)(_windowHeight * 0.8)); @@ -69,17 +52,15 @@ private void Update() private void DrawConsole(int windowID) { - _boxStyle = GUI.skin.GetStyle("Box"); GUILayout.BeginVertical(); _scrollView = GUILayout.BeginScrollView(_scrollPosition, false, true); foreach (string message in SpaceWarpConsoleLogListener.DebugMessages) { - string new_message = "" + message + "\n"; - GUILayout.Label( new_message); + GUILayout.Label(message); if(_autoScroll) { - _scrollView.Set(_scrollView.x, Mathf.Infinity ); + _scrollView.Set(_scrollView.x, Mathf.Infinity); _scrollPosition = _scrollView; } else @@ -102,7 +83,7 @@ private void DrawConsole(int windowID) SpaceWarpConsoleLogListener.DebugMessages.Clear(); } - if (GUILayout.Button( _autoScroll ? "Auto Scroll: On" : "Auto Scroll: Off" )) + if (GUILayout.Button(_autoScroll ? "Auto Scroll: On" : "Auto Scroll: Off")) { //Todo: Add proper close button to top corner and add input lock button back. // GameManager.Instance.Game.ViewController.inputLockManager.ClearControlLocks(); diff --git a/SpaceWarp/UI/SpaceWarpConsoleLogListener.cs b/SpaceWarp/UI/SpaceWarpConsoleLogListener.cs index 5c183881..bc708ba4 100644 --- a/SpaceWarp/UI/SpaceWarpConsoleLogListener.cs +++ b/SpaceWarp/UI/SpaceWarpConsoleLogListener.cs @@ -1,67 +1,19 @@ -using SpaceWarp.API; -using System; using System.Collections.Generic; -using UnityEngine; -using HarmonyLogger = HarmonyLib.Tools.Logger; +using BepInEx.Logging; + namespace SpaceWarp.UI; -public class SpaceWarpConsoleLogListener +public sealed class SpaceWarpConsoleLogListener : ILogListener { - internal static readonly List DebugMessages = new List(); - internal static SpaceWarpGlobalConfiguration config = SpaceWarpGlobalConfiguration.Instance; - - public static void LogCallback(string condition, string stackTrace, LogType type) + internal static readonly List DebugMessages = new(); + + public void LogEvent(object sender, LogEventArgs eventArgs) { - switch (type) - { - case LogType.Error: - if (config.LogLevel >= (int)LogType.Error) - DebugMessages.Add($"[ERR] {condition}"); - break; - case LogType.Assert: - if (config.LogLevel >= (int)LogType.Assert) - DebugMessages.Add($"[AST] {condition}"); - break; - case LogType.Warning: - if (config.LogLevel >= (int)LogType.Warning) - DebugMessages.Add($"[WRN] {condition}"); - break; - case LogType.Log: - if (config.LogLevel >= (int)LogType.Log) - DebugMessages.Add($"[LOG] {condition}"); - break; - case LogType.Exception: - if (config.LogLevel >= (int)LogType.Exception) - DebugMessages.Add($"[EXC] {condition}"); - break; - default: - throw new ArgumentOutOfRangeException(nameof(type), type, null); - } + DebugMessages.Add(eventArgs.ToStringLine()); } - public static void HarmonyLogCallback(object sender, HarmonyLogger.LogEventArgs e) + public void Dispose() { - switch (e.LogChannel) - { - case HarmonyLogger.LogChannel.Info: - if (config.HarmonyLogLevel >= (int)LogType.Log) - DebugMessages.Add($"[HINF] {e.Message}"); - break; - case HarmonyLogger.LogChannel.Warn: - if (config.HarmonyLogLevel >= (int)LogType.Warning) - DebugMessages.Add($"[HWRN] {e.Message}"); - break; - case HarmonyLogger.LogChannel.Error: - if (config.HarmonyLogLevel >= (int)LogType.Error) - DebugMessages.Add($"[HERR] {e.Message}"); - break; - case HarmonyLogger.LogChannel.IL: - if (config.HarmonyLogLevel >= (int)LogType.Exception) - DebugMessages.Add($"[HIL] {e.Message}"); - break; - default: - DebugMessages.Add($"[HARM] {e.Message}"); - break; - } + DebugMessages.Clear(); } -} \ No newline at end of file +} From e2361f3a2fd04a41d46f29ad43a6a30bfc996512 Mon Sep 17 00:00:00 2001 From: Aaron Robinson Date: Thu, 2 Mar 2023 01:12:40 -0600 Subject: [PATCH 02/29] Second pass --- Doorstop/.doorstop_version | 1 - Doorstop/doorstop_config.ini | 45 --- Doorstop/winhttp.dll | Bin 24576 -> 0 bytes ExampleMod/ExampleMod.cs | 25 +- ExampleMod/ExampleMod.csproj | 15 +- ExampleMod/{modInfo.json => swinfo.json} | 4 +- NuGet.config | 4 +- SpaceWarp/API/AssetBundles/AssetManager.cs | 2 +- SpaceWarp/API/Mods/BaseSpaceWarpPlugin.cs | 1 + SpaceWarp/API/Mods/GlobalModDefines.cs | 2 +- SpaceWarp/API/Mods/JSON/DependencyInfo.cs | 8 +- SpaceWarp/API/Mods/JSON/ModInfo.cs | 20 +- .../API/Mods/JSON/SupportedVersionsInfo.cs | 8 +- SpaceWarp/API/Mods/MainModAttribute.cs | 5 - SpaceWarp/API/Toolbar/Toolbar.cs | 33 ++ SpaceWarp/API/Toolbar/ToolbarBackend.cs | 4 +- SpaceWarp/AssetHelpers.cs | 63 ++++ SpaceWarp/Compilation/ModCompiler.cs | 5 +- SpaceWarp/InternalExtensions.cs | 12 + SpaceWarp/Patching/BootstrapPatch.cs | 14 +- SpaceWarp/Patching/FixMessageDiscovery.cs | 53 +++ .../LoadingActions/InitializeModAction.cs | 2 +- .../LoadingActions/LoadAddressablesAction.cs | 35 +- .../LoadingActions/LoadAssetAction.cs | 50 ++- .../LoadingActions/LoadAssetsAction.cs | 29 -- .../LoadingActions/LoadLocalizationAction.cs | 23 +- .../Patching/LoadingActions/LoadModsAction.cs | 29 -- .../LoadSpaceWarpAddressablesAction.cs | 21 +- .../LoadSpaceWarpAssetsAction.cs | 52 +++ .../LoadSpaceWarpLocalizationsAction.cs | 18 +- .../SpaceWarpAssetInitializationAction.cs | 28 -- SpaceWarp/Patching/LoadingScreenPatcher.cs | 41 --- SpaceWarp/Patching/MainMenuPatcher.cs | 13 +- SpaceWarp/SpaceWarp.csproj | 47 ++- SpaceWarp/SpaceWarpManager.cs | 316 +++--------------- SpaceWarp/SpaceWarpPlugin.cs | 5 + SpaceWarp/UI/ModConfigurationSection.cs | 52 --- SpaceWarp/UI/ModListUI.cs | 158 --------- SpaceWarp/UI/SpaceWarpConsole.cs | 2 +- example_mod_info.json | 4 +- 40 files changed, 470 insertions(+), 779 deletions(-) delete mode 100644 Doorstop/.doorstop_version delete mode 100644 Doorstop/doorstop_config.ini delete mode 100644 Doorstop/winhttp.dll rename ExampleMod/{modInfo.json => swinfo.json} (92%) delete mode 100644 SpaceWarp/API/Mods/MainModAttribute.cs create mode 100644 SpaceWarp/API/Toolbar/Toolbar.cs create mode 100644 SpaceWarp/AssetHelpers.cs create mode 100644 SpaceWarp/InternalExtensions.cs create mode 100644 SpaceWarp/Patching/FixMessageDiscovery.cs delete mode 100644 SpaceWarp/Patching/LoadingActions/LoadAssetsAction.cs delete mode 100644 SpaceWarp/Patching/LoadingActions/LoadModsAction.cs create mode 100644 SpaceWarp/Patching/LoadingActions/LoadSpaceWarpAssetsAction.cs delete mode 100644 SpaceWarp/Patching/LoadingActions/SpaceWarpAssetInitializationAction.cs delete mode 100644 SpaceWarp/Patching/LoadingScreenPatcher.cs delete mode 100644 SpaceWarp/UI/ModConfigurationSection.cs diff --git a/Doorstop/.doorstop_version b/Doorstop/.doorstop_version deleted file mode 100644 index 0c89fc92..00000000 --- a/Doorstop/.doorstop_version +++ /dev/null @@ -1 +0,0 @@ -4.0.0 \ No newline at end of file diff --git a/Doorstop/doorstop_config.ini b/Doorstop/doorstop_config.ini deleted file mode 100644 index 2bd6babd..00000000 --- a/Doorstop/doorstop_config.ini +++ /dev/null @@ -1,45 +0,0 @@ -# General options for Unity Doorstop -[General] - -# Enable Doorstop? -enabled=true - -# Path to the assembly to load and execute -# NOTE: The entrypoint must be of format `static void Doorstop.Entrypoint.Start()` -target_assembly=SpaceWarp/Core/SpaceWarp.dll - -# If true, Unity's output log is redirected to \output_log.txt -redirect_output_log=false - -# If enabled, DOORSTOP_DISABLE env var value is ignored -# USE THIS ONLY WHEN ASKED TO OR YOU KNOW WHAT THIS MEANS -ignore_disable_switch=false - - -# Options specific to running under Unity Mono runtime -[UnityMono] - -# Overrides default Mono DLL search path -# Sometimes it is needed to instruct Mono to seek its assemblies from a different path -# (e.g. mscorlib is stripped in original game) -# This option causes Mono to seek mscorlib and core libraries from a different folder before Managed -# Original Managed folder is added as a secondary folder in the search path -dll_search_path_override= - -# If true, Mono debugger server will be enabled -debug_enabled=false - -# When debug_enabled is true, specifies the address to use for the debugger server -debug_address=127.0.0.1:10000 - -# If true and debug_enabled is true, Mono debugger server will suspend the game execution until a debugger is attached -debug_suspend=false - -# Options sepcific to running under Il2Cpp runtime -[Il2Cpp] - -# Path to coreclr.dll that contains the CoreCLR runtime -coreclr_path= - -# Path to the directory containing the managed core libraries for CoreCLR (mscorlib, System, etc.) -corlib_dir= diff --git a/Doorstop/winhttp.dll b/Doorstop/winhttp.dll deleted file mode 100644 index e9816fd7b6ea830d137b728a9780016424759e1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24576 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 /// A method that is called when the mod's button on the SpaceWarp application bar is clicked. diff --git a/ExampleMod/ExampleMod.csproj b/ExampleMod/ExampleMod.csproj index 56930641..4747af9a 100644 --- a/ExampleMod/ExampleMod.csproj +++ b/ExampleMod/ExampleMod.csproj @@ -1,19 +1,24 @@  - - netstandard2.0 + net472 11 true false + false - - ..\external_dlls\Assembly-CSharp.dll true + false + + + + + + - \ No newline at end of file + diff --git a/ExampleMod/modInfo.json b/ExampleMod/swinfo.json similarity index 92% rename from ExampleMod/modInfo.json rename to ExampleMod/swinfo.json index 3c1920f7..cf57cdbd 100644 --- a/ExampleMod/modInfo.json +++ b/ExampleMod/swinfo.json @@ -4,10 +4,10 @@ "author": "Space-Warp Team", "description": "A Example Mod for Space-Warp", "source": "https://github.com/SpaceWarpDev/SpaceWarp/tree/main/ExampleMod", - "version": "v0.3.0", + "version": "0.4.0", "dependencies": [], "ksp2_version": { "min": "0", "max": "1" } -} \ No newline at end of file +} diff --git a/NuGet.config b/NuGet.config index 882d99d7..fffd9183 100644 --- a/NuGet.config +++ b/NuGet.config @@ -1,8 +1,6 @@ - - - \ No newline at end of file + diff --git a/SpaceWarp/API/AssetBundles/AssetManager.cs b/SpaceWarp/API/AssetBundles/AssetManager.cs index b6fe58ce..35adb3cb 100644 --- a/SpaceWarp/API/AssetBundles/AssetManager.cs +++ b/SpaceWarp/API/AssetBundles/AssetManager.cs @@ -7,7 +7,7 @@ namespace SpaceWarp.API.AssetBundles; public static class AssetManager { - static readonly Dictionary AllAssets = new Dictionary(); + private static readonly Dictionary AllAssets = new(); internal static void RegisterAssetBundle(string modId, string assetBundleName, AssetBundle assetBundle) { diff --git a/SpaceWarp/API/Mods/BaseSpaceWarpPlugin.cs b/SpaceWarp/API/Mods/BaseSpaceWarpPlugin.cs index 0d82da11..b6f1e1d5 100644 --- a/SpaceWarp/API/Mods/BaseSpaceWarpPlugin.cs +++ b/SpaceWarp/API/Mods/BaseSpaceWarpPlugin.cs @@ -26,6 +26,7 @@ public abstract class BaseSpaceWarpPlugin : BaseUnityPlugin public ModInfo SpaceWarpMetadata { get; internal set; } internal ManualLogSource ModLogger => base.Logger; + public string PluginFolderPath { get; internal set; } public virtual void OnPreInitialized() { diff --git a/SpaceWarp/API/Mods/GlobalModDefines.cs b/SpaceWarp/API/Mods/GlobalModDefines.cs index 9022e253..b8fe73a5 100644 --- a/SpaceWarp/API/Mods/GlobalModDefines.cs +++ b/SpaceWarp/API/Mods/GlobalModDefines.cs @@ -4,5 +4,5 @@ namespace SpaceWarp.API.Mods; public static class GlobalModDefines { - public static readonly string ASSET_BUNDLES_FOLDER = Path.Combine("assets","bundles"); + public static readonly string ASSET_BUNDLES_FOLDER = Path.Combine("assets", "bundles"); } \ No newline at end of file diff --git a/SpaceWarp/API/Mods/JSON/DependencyInfo.cs b/SpaceWarp/API/Mods/JSON/DependencyInfo.cs index dbdac248..dc3486e6 100644 --- a/SpaceWarp/API/Mods/JSON/DependencyInfo.cs +++ b/SpaceWarp/API/Mods/JSON/DependencyInfo.cs @@ -6,11 +6,11 @@ namespace SpaceWarp.API.Mods.JSON; /// Represents the json property info. Properties have to use the same name as in the JSON file, that's why they break convention. /// [JsonObject(MemberSerialization.OptIn)] -public class DependencyInfo +public sealed class DependencyInfo { [JsonProperty("id")] - public string id { get; set; } + public string ID { get; internal set; } [JsonProperty("version")] - public SupportedVersionsInfo version { get; set; } -} \ No newline at end of file + public SupportedVersionsInfo Version { get; internal set; } +} diff --git a/SpaceWarp/API/Mods/JSON/ModInfo.cs b/SpaceWarp/API/Mods/JSON/ModInfo.cs index b9225c06..e5130c48 100644 --- a/SpaceWarp/API/Mods/JSON/ModInfo.cs +++ b/SpaceWarp/API/Mods/JSON/ModInfo.cs @@ -7,29 +7,29 @@ namespace SpaceWarp.API.Mods.JSON; /// Representation of the mod info JSON file. /// [JsonObject(MemberSerialization.OptIn)] -public class ModInfo +public sealed class ModInfo { [JsonProperty("mod_id")] - public string mod_id { get; set; } + public string ModID { get; internal set; } [JsonProperty("name")] - public string name { get; set; } + public string Name { get; internal set; } [JsonProperty("author")] - public string author { get; set; } + public string Author { get; internal set; } [JsonProperty("description")] - public string description { get; set; } + public string Description { get; internal set; } [JsonProperty("source")] - public string source { get; set; } + public string Source { get; internal set; } [JsonProperty("version")] - public string version { get; set; } + public string Version { get; internal set; } [JsonProperty("dependencies")] - public List dependencies { get; set; } = new List(); + public List Dependencies { get; internal set; } [JsonProperty("ksp2_version")] - public SupportedVersionsInfo supported_ksp2_versions { get; set; } = new SupportedVersionsInfo(); -} \ No newline at end of file + public SupportedVersionsInfo SupportedKsp2Versions { get; internal set; } +} diff --git a/SpaceWarp/API/Mods/JSON/SupportedVersionsInfo.cs b/SpaceWarp/API/Mods/JSON/SupportedVersionsInfo.cs index a483a898..5ea1372e 100644 --- a/SpaceWarp/API/Mods/JSON/SupportedVersionsInfo.cs +++ b/SpaceWarp/API/Mods/JSON/SupportedVersionsInfo.cs @@ -6,11 +6,11 @@ namespace SpaceWarp.API.Mods.JSON; /// Representation of the supported version info of a mod from a JSON file. /// [JsonObject(MemberSerialization.OptIn)] -public class SupportedVersionsInfo +public sealed class SupportedVersionsInfo { [JsonProperty("min")] - public string min { get; set; } = "0.0.0"; + public string Min { get; internal set; } = "0.0.0"; [JsonProperty("max")] - public string max { get; set; } = "*"; -} \ No newline at end of file + public string Max { get; internal set; } = "*"; +} diff --git a/SpaceWarp/API/Mods/MainModAttribute.cs b/SpaceWarp/API/Mods/MainModAttribute.cs deleted file mode 100644 index e5838097..00000000 --- a/SpaceWarp/API/Mods/MainModAttribute.cs +++ /dev/null @@ -1,5 +0,0 @@ -using System; - -namespace SpaceWarp.API.Mods; - -public class MainModAttribute : Attribute { } \ No newline at end of file diff --git a/SpaceWarp/API/Toolbar/Toolbar.cs b/SpaceWarp/API/Toolbar/Toolbar.cs new file mode 100644 index 00000000..ba279599 --- /dev/null +++ b/SpaceWarp/API/Toolbar/Toolbar.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using BepInEx.Bootstrap; +using UnityEngine; + +namespace SpaceWarp.API.Toolbar; + +public static class Toolbar +{ + private static readonly List<(string text, Sprite icon, string ID, Action action)> _buttonsToBeLoaded = new(); + + public static T RegisterGameToolbarMenu(string text, string title, string id, Sprite icon) where T : ToolbarMenu + { + GameObject toolBarUIObject = new GameObject($"Toolbar: {id}"); + toolBarUIObject.Persist(); + ToolbarMenu menu = toolBarUIObject.AddComponent(); + menu.Title = title; + toolBarUIObject.transform.SetParent(Chainloader.ManagerObject.transform); + toolBarUIObject.SetActive(true); + _buttonsToBeLoaded.Add((text, icon, id, menu.ToggleGUI)); + return menu as T; + } + + public static void RegisterAppButton(string text, string id, Sprite icon, Action func) => _buttonsToBeLoaded.Add((text ,icon, id, func)); + + internal static void LoadAllButtons() + { + foreach (var button in _buttonsToBeLoaded) + { + ToolbarBackend.AddButton(button.text, button.icon, button.ID, button.action); + } + } +} diff --git a/SpaceWarp/API/Toolbar/ToolbarBackend.cs b/SpaceWarp/API/Toolbar/ToolbarBackend.cs index b5f6e323..853c176c 100644 --- a/SpaceWarp/API/Toolbar/ToolbarBackend.cs +++ b/SpaceWarp/API/Toolbar/ToolbarBackend.cs @@ -19,9 +19,9 @@ namespace SpaceWarp.API.Toolbar; -public static class ToolbarBackend +internal static class ToolbarBackend { - private static ManualLogSource _logger = BepInEx.Logging.Logger.CreateLogSource("ToolbarBackend"); + private static readonly ManualLogSource _logger = BepInEx.Logging.Logger.CreateLogSource("ToolbarBackend"); public static GameObject AddButton(string buttonText, Sprite buttonIcon, string buttonId, Action function) { // Find the resource manager button and "others" group. diff --git a/SpaceWarp/AssetHelpers.cs b/SpaceWarp/AssetHelpers.cs new file mode 100644 index 00000000..353ea801 --- /dev/null +++ b/SpaceWarp/AssetHelpers.cs @@ -0,0 +1,63 @@ +using System.IO; +using KSP.Game; +using UnityEngine.AddressableAssets; +using UnityEngine.AddressableAssets.ResourceLocators; +using UnityEngine.ResourceManagement.AsyncOperations; + +namespace SpaceWarp; + +internal static class AssetHelpers +{ + public static void LoadAddressable(string catalog) + { + SpaceWarpManager.Logger.LogInfo($"Attempting to load {catalog}"); + AsyncOperationHandle operation = Addressables.LoadContentCatalogAsync(catalog, null); + operation.WaitForCompletion(); + if (operation.Status == AsyncOperationStatus.Failed) + { + SpaceWarpManager.Logger.LogError($"Failed to load addressables catalog {catalog}"); + } + else + { + SpaceWarpManager.Logger.LogInfo($"Loaded addressables catalog {catalog}"); + var locator = operation.Result; + SpaceWarpManager.Logger.LogInfo($"{catalog} ----- {locator.LocatorId}"); + GameManager.Instance.Game.Assets.RegisterResourceLocator(locator); + } + } + + internal static void LoadLocalizationFromFolder(string folder) + { + SpaceWarpManager.Logger.LogInfo($"Attempting to load localizations from {folder}"); + I2.Loc.LanguageSourceData languageSourceData = null; + if (!Directory.Exists(folder)) + { + SpaceWarpManager.Logger.LogInfo($"{folder} does not exist, not loading localizations."); + return; + } + DirectoryInfo info = new DirectoryInfo(folder); + foreach (var csvFile in info.GetFiles("*.csv")) + { + languageSourceData ??= new I2.Loc.LanguageSourceData(); + var csvData = File.ReadAllText(csvFile.FullName); + languageSourceData.Import_CSV("", csvData, I2.Loc.eSpreadsheetUpdateMode.AddNewTerms); + } + + foreach (var i2csvFile in info.GetFiles("*.i2csv")) + { + languageSourceData ??= new I2.Loc.LanguageSourceData(); + var i2csvData = File.ReadAllText(i2csvFile.FullName); + languageSourceData.Import_I2CSV("", i2csvData, I2.Loc.eSpreadsheetUpdateMode.AddNewTerms); + } + + if (languageSourceData != null) + { + SpaceWarpManager.Logger.LogInfo($"Loaded localizations from {folder}"); + I2.Loc.LocalizationManager.AddSource(languageSourceData); + } + else + { + SpaceWarpManager.Logger.LogInfo($"No localizations found in {folder}"); + } + } +} diff --git a/SpaceWarp/Compilation/ModCompiler.cs b/SpaceWarp/Compilation/ModCompiler.cs index 9fa45e92..c120f693 100644 --- a/SpaceWarp/Compilation/ModCompiler.cs +++ b/SpaceWarp/Compilation/ModCompiler.cs @@ -2,17 +2,16 @@ using System.Collections.Generic; using System.IO; using System.Reflection; +using BepInEx; using BepInEx.Logging; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; -using SpaceWarp.API; -using UniLinq; namespace SpaceWarp.Compilation; public static class ModCompiler { - public static readonly string CACHE_LOCATION = Path.Combine(SpaceWarpManager.SPACE_WARP_PATH, "mod_cache"); + public static readonly string CACHE_LOCATION = Path.Combine(Paths.CachePath, "compilation_cache"); private static ManualLogSource _logger = Logger.CreateLogSource("Roslyn Compilation"); public static Assembly CompileMod(string modID, string modSrcPath) diff --git a/SpaceWarp/InternalExtensions.cs b/SpaceWarp/InternalExtensions.cs new file mode 100644 index 00000000..169d3e65 --- /dev/null +++ b/SpaceWarp/InternalExtensions.cs @@ -0,0 +1,12 @@ +using UnityEngine; + +namespace SpaceWarp; + +internal static class InternalExtensions +{ + public static void Persist(this UnityObject o) + { + UnityObject.DontDestroyOnLoad(o); + o.hideFlags |= HideFlags.HideAndDontSave; + } +} diff --git a/SpaceWarp/Patching/BootstrapPatch.cs b/SpaceWarp/Patching/BootstrapPatch.cs index dd0ab086..e20afa87 100644 --- a/SpaceWarp/Patching/BootstrapPatch.cs +++ b/SpaceWarp/Patching/BootstrapPatch.cs @@ -45,9 +45,21 @@ private static void PatchInitializationsIL(ILContext il, ILLabel endLabel) c.EmitDelegate(static () => { + var flow = GameManager.Instance.LoadingFlow; + flow.AddAction(new LoadSpaceWarpLocalizationsAction()); + flow.AddAction(new LoadSpaceWarpAddressablesAction()); + flow.AddAction(new SpaceWarpAssetInitializationAction()); + + foreach (var plugin in SpaceWarpManager.SpaceWarpPlugins) + { + flow.AddAction(new LoadLocalizationAction(plugin)); + flow.AddAction(new LoadAddressablesAction(plugin)); + flow.AddAction(new LoadAssetAction(plugin)); + } + foreach (var plugin in SpaceWarpManager.SpaceWarpPlugins) { - GameManager.Instance.LoadingFlow.AddAction(new InitializeModAction(plugin)); + flow.AddAction(new InitializeModAction(plugin)); } }); diff --git a/SpaceWarp/Patching/FixMessageDiscovery.cs b/SpaceWarp/Patching/FixMessageDiscovery.cs new file mode 100644 index 00000000..0b5f0d9c --- /dev/null +++ b/SpaceWarp/Patching/FixMessageDiscovery.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using HarmonyLib; +using KSP.Game; +using KSP.Messages; +using KSP.Logging; + +namespace SpaceWarp.Patching; + +[HarmonyPatch] +internal static class FixMessageDiscovery +{ + [HarmonyPrefix] + [HarmonyPatch(typeof(MessageDiscovery), nameof(MessageDiscovery.Initialize))] + private static bool InitializeReplacement() + { + if (MessageDiscovery._initialized) + { + return false; + } + Type[] types = typeof(GameManager).Assembly.GetTypes(); + foreach (Type type in types) + { + try + { + if (type.GetCustomAttribute(typeof(DiscoverableMessage), inherit: false) is DiscoverableMessage discoverableMessage) + { + if (MessageDiscovery._discoveryNameTypeCache.ContainsKey(discoverableMessage.discoveryName)) + { + GlobalLog.Error("More than one Discoverable Message is using the discoveryName of " + discoverableMessage.discoveryName + ". This is probably unintended!"); + } + MessageDiscovery._discoveryNameTypeCache[discoverableMessage.discoveryName] = type; + } + } + catch (Exception ex) + { + GlobalLog.Error("MessageDiscovery: Initialize: " + ex.Message); + } + } + MessageDiscovery.DiscoveryNamesSorted = new string[MessageDiscovery._discoveryNameTypeCache.Count]; + int num = 0; + foreach (KeyValuePair item in MessageDiscovery._discoveryNameTypeCache) + { + MessageDiscovery.DiscoveryNamesSorted[num] = item.Key; + num++; + } + Array.Sort(MessageDiscovery.DiscoveryNamesSorted); + MessageDiscovery._initialized = true; + + return false; + } +} diff --git a/SpaceWarp/Patching/LoadingActions/InitializeModAction.cs b/SpaceWarp/Patching/LoadingActions/InitializeModAction.cs index f44faf7e..92db72d4 100644 --- a/SpaceWarp/Patching/LoadingActions/InitializeModAction.cs +++ b/SpaceWarp/Patching/LoadingActions/InitializeModAction.cs @@ -4,7 +4,7 @@ namespace SpaceWarp.Patching.LoadingActions; -public class InitializeModAction : FlowAction +internal sealed class InitializeModAction : FlowAction { private BaseSpaceWarpPlugin Plugin; diff --git a/SpaceWarp/Patching/LoadingActions/LoadAddressablesAction.cs b/SpaceWarp/Patching/LoadingActions/LoadAddressablesAction.cs index e3594a75..1ed2f78f 100644 --- a/SpaceWarp/Patching/LoadingActions/LoadAddressablesAction.cs +++ b/SpaceWarp/Patching/LoadingActions/LoadAddressablesAction.cs @@ -1,34 +1,43 @@ using System; +using System.IO; +using BepInEx.Logging; using KSP.Game.Flow; -using SpaceWarp.API; -using SpaceWarp.API.Managers; -using SpaceWarp.API.Mods.JSON; +using SpaceWarp.API.Mods; namespace SpaceWarp.Patching.LoadingActions; -public class LoadAddressablesAction : FlowAction +internal sealed class LoadAddressablesAction : FlowAction { - private string _modID; - private ModInfo _info; + private readonly BaseSpaceWarpPlugin Plugin; + private static readonly ManualLogSource Logger = BepInEx.Logging.Logger.CreateLogSource("Addressables Loader"); - public LoadAddressablesAction(string name, string modID, ModInfo info) : base(name) + public LoadAddressablesAction(BaseSpaceWarpPlugin plugin) : base($"Loading addressables for {plugin.SpaceWarpMetadata.Name}") { - _modID = modID; - _info = info; + Plugin = plugin; } public override void DoAction(Action resolve, Action reject) { - ManagerLocator.TryGet(out SpaceWarpManager spaceWarpManager); - try { - spaceWarpManager.LoadSingleModAddressables(_modID,_info); + string addressablesPath = Path.Combine(Plugin.PluginFolderPath, "addressables"); + Logger.LogInfo($"Loading addressables for {Plugin.SpaceWarpMetadata.Name}"); + string catalogPath = Path.Combine(addressablesPath, "catalog.json"); + if (File.Exists(catalogPath)) + { + Logger.LogInfo($"Found addressables for {Plugin.SpaceWarpMetadata.Name}"); + AssetHelpers.LoadAddressable(catalogPath); + } + else + { + Logger.LogInfo($"Did not find addressables for {Plugin.SpaceWarpMetadata.Name}"); + } resolve(); } catch (Exception e) { - reject(e.ToString()); + Plugin.ModLogger.LogError(e.ToString()); + reject(null); } } } \ No newline at end of file diff --git a/SpaceWarp/Patching/LoadingActions/LoadAssetAction.cs b/SpaceWarp/Patching/LoadingActions/LoadAssetAction.cs index 299bc1d0..f266a21d 100644 --- a/SpaceWarp/Patching/LoadingActions/LoadAssetAction.cs +++ b/SpaceWarp/Patching/LoadingActions/LoadAssetAction.cs @@ -1,33 +1,57 @@ using System; +using System.IO; +using BepInEx.Logging; using KSP.Game.Flow; -using SpaceWarp.API; -using SpaceWarp.API.Managers; -using SpaceWarp.API.Mods.JSON; +using SpaceWarp.API.AssetBundles; +using SpaceWarp.API.Mods; +using UnityEngine; namespace SpaceWarp.Patching.LoadingActions; -public class LoadAssetAction : FlowAction +internal sealed class LoadAssetAction : FlowAction { - private readonly string _modID; - private readonly ModInfo _info; - public LoadAssetAction(string name, string modID, ModInfo info) : base(name) + private readonly BaseSpaceWarpPlugin Plugin; + private static readonly ManualLogSource Logger = BepInEx.Logging.Logger.CreateLogSource("Asset Loader"); + + public LoadAssetAction(BaseSpaceWarpPlugin plugin) : base($"Loading {plugin.SpaceWarpMetadata.Name} assets") { - _modID = modID; - _info = info; + Plugin = plugin; } public override void DoAction(Action resolve, Action reject) { - ManagerLocator.TryGet(out SpaceWarpManager spaceWarpManager); - try { - spaceWarpManager.LoadSingleModAssets(_modID,_info); + string bundlesPath = Path.Combine(Plugin.PluginFolderPath, GlobalModDefines.ASSET_BUNDLES_FOLDER); + if (Directory.Exists(bundlesPath)) + { + foreach (string file in Directory.GetFiles(bundlesPath)) + { + string assetBundleName = Path.GetFileNameWithoutExtension(file); + if (Path.GetExtension(file) != ".bundle") continue; + + + AssetBundle assetBundle = AssetBundle.LoadFromFile(file); + + if (assetBundle == null) + { + Logger.LogError($"Failed to load AssetBundle {Plugin.SpaceWarpMetadata.ModID}/{assetBundleName}"); + continue; + } + AssetManager.RegisterAssetBundle(Plugin.SpaceWarpMetadata.ModID, assetBundleName, assetBundle); + Logger.LogInfo($"Loaded AssetBundle {Plugin.SpaceWarpMetadata.ModID}/{assetBundleName}"); + } + } + else + { + Logger.LogInfo($"Did not load assets for {Plugin.SpaceWarpMetadata.Name} as no assets folder existed!"); + } resolve(); } catch (Exception e) { - reject(e.ToString()); + Plugin.ModLogger.LogError(e.ToString()); + reject(null); } } } \ No newline at end of file diff --git a/SpaceWarp/Patching/LoadingActions/LoadAssetsAction.cs b/SpaceWarp/Patching/LoadingActions/LoadAssetsAction.cs deleted file mode 100644 index 588bc932..00000000 --- a/SpaceWarp/Patching/LoadingActions/LoadAssetsAction.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; -using KSP.Game.Flow; -using SpaceWarp.API; -using SpaceWarp.API.Managers; - -namespace SpaceWarp.Patching.LoadingActions; - -public class LoadAssetsAction : FlowAction -{ - public LoadAssetsAction(string name) : base(name) - { - // - } - - public override void DoAction(Action resolve, Action reject) - { - ManagerLocator.TryGet(out SpaceWarpManager spaceWarpManager); - - try - { - spaceWarpManager.InitializeAssets(); - resolve(); - } - catch (Exception e) - { - reject(e.ToString()); - } - } -} \ No newline at end of file diff --git a/SpaceWarp/Patching/LoadingActions/LoadLocalizationAction.cs b/SpaceWarp/Patching/LoadingActions/LoadLocalizationAction.cs index 0b6131bb..e59f27f8 100644 --- a/SpaceWarp/Patching/LoadingActions/LoadLocalizationAction.cs +++ b/SpaceWarp/Patching/LoadingActions/LoadLocalizationAction.cs @@ -1,34 +1,31 @@ using System; +using System.IO; using KSP.Game.Flow; -using SpaceWarp.API; -using SpaceWarp.API.Managers; -using SpaceWarp.API.Mods.JSON; +using SpaceWarp.API.Mods; namespace SpaceWarp.Patching.LoadingActions; -public class LoadLocalizationAction : FlowAction +internal sealed class LoadLocalizationAction : FlowAction { - private string _modID; - private ModInfo _info; + private readonly BaseSpaceWarpPlugin Plugin; - public LoadLocalizationAction(string name, string modID, ModInfo info) : base(name) + public LoadLocalizationAction(BaseSpaceWarpPlugin plugin) : base($"Loading localizations for plugin {plugin.SpaceWarpMetadata.Name}") { - _modID = modID; - _info = info; + Plugin = plugin; } public override void DoAction(Action resolve, Action reject) { - ManagerLocator.TryGet(out SpaceWarpManager spaceWarpManager); - try { - spaceWarpManager.LoadSingleModLocalization(_modID,_info); + string localizationsPath = Path.Combine(Plugin.PluginFolderPath, "localizations"); + AssetHelpers.LoadLocalizationFromFolder(localizationsPath); resolve(); } catch (Exception e) { - reject(e.ToString()); + Plugin.ModLogger.LogError(e.ToString()); + reject(null); } } } \ No newline at end of file diff --git a/SpaceWarp/Patching/LoadingActions/LoadModsAction.cs b/SpaceWarp/Patching/LoadingActions/LoadModsAction.cs deleted file mode 100644 index 9c23442e..00000000 --- a/SpaceWarp/Patching/LoadingActions/LoadModsAction.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; -using KSP.Game.Flow; -using SpaceWarp.API; -using SpaceWarp.API.Managers; - -namespace SpaceWarp.Patching.LoadingActions; - -public class LoadModsAction : FlowAction -{ - public LoadModsAction(string name) : base(name) - { - // - } - - public override void DoAction(Action resolve, Action reject) - { - ManagerLocator.TryGet(out SpaceWarpManager spaceWarpManager); - - try - { - spaceWarpManager.InitializeMods(); - resolve(); - } - catch (Exception e) - { - reject(e.ToString()); - } - } -} \ No newline at end of file diff --git a/SpaceWarp/Patching/LoadingActions/LoadSpaceWarpAddressablesAction.cs b/SpaceWarp/Patching/LoadingActions/LoadSpaceWarpAddressablesAction.cs index c857ce8d..a0cae196 100644 --- a/SpaceWarp/Patching/LoadingActions/LoadSpaceWarpAddressablesAction.cs +++ b/SpaceWarp/Patching/LoadingActions/LoadSpaceWarpAddressablesAction.cs @@ -1,28 +1,31 @@ using System; +using System.IO; using KSP.Game.Flow; -using SpaceWarp.API; -using SpaceWarp.API.Managers; namespace SpaceWarp.Patching.LoadingActions; -public class LoadSpaceWarpAddressablesAction : FlowAction +internal sealed class LoadSpaceWarpAddressablesAction : FlowAction { - public LoadSpaceWarpAddressablesAction(string name) : base(name) + public LoadSpaceWarpAddressablesAction() : base("Initializing Space Warp Provided Addressables") { } public override void DoAction(Action resolve, Action reject) { - ManagerLocator.TryGet(out SpaceWarpManager spaceWarpManager); - try { - spaceWarpManager.InitializeAddressablesFolder(); + string addressablesPath = Path.Combine(SpaceWarpManager.SpaceWarpFolder, "addressables"); + string catalogPath = Path.Combine(addressablesPath, "catalog.json"); + if (File.Exists(catalogPath)) + { + AssetHelpers.LoadAddressable(catalogPath); + } resolve(); } catch (Exception e) { - reject(e.ToString()); + SpaceWarpManager.Logger.LogError(e.ToString()); + reject(null); } } -} \ No newline at end of file +} diff --git a/SpaceWarp/Patching/LoadingActions/LoadSpaceWarpAssetsAction.cs b/SpaceWarp/Patching/LoadingActions/LoadSpaceWarpAssetsAction.cs new file mode 100644 index 00000000..ae768a29 --- /dev/null +++ b/SpaceWarp/Patching/LoadingActions/LoadSpaceWarpAssetsAction.cs @@ -0,0 +1,52 @@ +using System; +using System.IO; +using BepInEx.Logging; +using KSP.Game.Flow; +using SpaceWarp.API.AssetBundles; +using SpaceWarp.API.Mods; +using UnityEngine; + +namespace SpaceWarp.Patching.LoadingActions; + +internal sealed class SpaceWarpAssetInitializationAction : FlowAction +{ + private static readonly ManualLogSource Logger = BepInEx.Logging.Logger.CreateLogSource("Space Warp Asset Loader"); + + public SpaceWarpAssetInitializationAction() : base("Initializing Space Warp Provided Assets") + { + } + + public override void DoAction(Action resolve, Action reject) + { + try + { + string bundlesPath = Path.Combine(SpaceWarpManager.SpaceWarpFolder, GlobalModDefines.ASSET_BUNDLES_FOLDER); + + if (Directory.Exists(bundlesPath)) + { + foreach (string file in Directory.GetFiles(bundlesPath)) + { + Logger.LogInfo($"Found space warp asset file {file}"); + string assetBundleName = Path.GetFileNameWithoutExtension(file); + if (Path.GetExtension(file) != ".bundle") continue; + + AssetBundle assetBundle = AssetBundle.LoadFromFile(file); + + if (assetBundle == null) + { + Logger.LogError($"Failed to load Space Warp AssetBundle {assetBundleName}"); + continue; + } + AssetManager.RegisterAssetBundle("space_warp", assetBundleName, assetBundle); + Logger.LogInfo($"Loaded Space Warp AssetBundle {assetBundleName}"); + } + } + resolve(); + } + catch (Exception e) + { + SpaceWarpManager.Logger.LogError(e.ToString()); + reject(null); + } + } +} \ No newline at end of file diff --git a/SpaceWarp/Patching/LoadingActions/LoadSpaceWarpLocalizationsAction.cs b/SpaceWarp/Patching/LoadingActions/LoadSpaceWarpLocalizationsAction.cs index 8f347067..34c7408b 100644 --- a/SpaceWarp/Patching/LoadingActions/LoadSpaceWarpLocalizationsAction.cs +++ b/SpaceWarp/Patching/LoadingActions/LoadSpaceWarpLocalizationsAction.cs @@ -1,28 +1,32 @@ using System; +using System.IO; using KSP.Game.Flow; -using SpaceWarp.API; -using SpaceWarp.API.Managers; namespace SpaceWarp.Patching.LoadingActions; public class LoadSpaceWarpLocalizationsAction : FlowAction { - public LoadSpaceWarpLocalizationsAction(string name) : base(name) + public LoadSpaceWarpLocalizationsAction() : base("Loading Space Warp localizations") { } public override void DoAction(Action resolve, Action reject) { - ManagerLocator.TryGet(out SpaceWarpManager spaceWarpManager); - try { - spaceWarpManager.LoadSpaceWarpLocalizations(); + if (I2.Loc.LocalizationManager.Sources.Count == 0) + { + I2.Loc.LocalizationManager.UpdateSources(); + } + + string localizationsPath = Path.Combine(SpaceWarpManager.SpaceWarpFolder, "localizations"); + AssetHelpers.LoadLocalizationFromFolder(localizationsPath); resolve(); } catch (Exception e) { - reject(e.ToString()); + SpaceWarpManager.Logger.LogError(e.ToString()); + reject(null); } } } \ No newline at end of file diff --git a/SpaceWarp/Patching/LoadingActions/SpaceWarpAssetInitializationAction.cs b/SpaceWarp/Patching/LoadingActions/SpaceWarpAssetInitializationAction.cs deleted file mode 100644 index e531f366..00000000 --- a/SpaceWarp/Patching/LoadingActions/SpaceWarpAssetInitializationAction.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using KSP.Game.Flow; -using SpaceWarp.API; -using SpaceWarp.API.Managers; - -namespace SpaceWarp.Patching.LoadingActions; - -public class SpaceWarpAssetInitializationAction : FlowAction -{ - public SpaceWarpAssetInitializationAction(string name) : base(name) - { - } - - public override void DoAction(Action resolve, Action reject) - { - ManagerLocator.TryGet(out SpaceWarpManager spaceWarpManager); - - try - { - spaceWarpManager.LoadSpaceWarpAssets(); - resolve(); - } - catch (Exception e) - { - reject(e.ToString()); - } - } -} \ No newline at end of file diff --git a/SpaceWarp/Patching/LoadingScreenPatcher.cs b/SpaceWarp/Patching/LoadingScreenPatcher.cs deleted file mode 100644 index 4e010b70..00000000 --- a/SpaceWarp/Patching/LoadingScreenPatcher.cs +++ /dev/null @@ -1,41 +0,0 @@ -using KSP.Game; -using SpaceWarp.API; -using SpaceWarp.API.Managers; -using SpaceWarp.Patching.LoadingActions; - - -namespace SpaceWarp.Patching; - -/// -/// Patches the loading screen to add the mod loading -/// -public class LoadingScreenPatcher -{ - public static void AddModLoadingScreens() - { - GameManager gameManager = GameManager.Instance; - gameManager.LoadingFlow.AddAction( - new LoadSpaceWarpAddressablesAction("Initializing Space Warp Provided Addressables")); - gameManager.LoadingFlow.AddAction( - new SpaceWarpAssetInitializationAction("Initializing Space Warp Provided Assets")); - gameManager.LoadingFlow.AddAction( - new LoadSpaceWarpLocalizationsAction("Initializing Space Warp Localizations")); - } - - public static void AddAllModLoadingSteps() - { - GameManager gameManager = GameManager.Instance; - if (!ManagerLocator.TryGet(out SpaceWarpManager spaceWarpManager)) return; //TODO: Log a message here - foreach (var mod in spaceWarpManager._modLoadOrder) - { - gameManager.LoadingFlow.AddAction(new LoadAddressablesAction($"Loading addressables for {mod.Item1}", - mod.Item1, mod.Item2)); - gameManager.LoadingFlow.AddAction(new LoadAssetAction($"Loading assets for {mod.Item1}", mod.Item1, - mod.Item2)); - gameManager.LoadingFlow.AddAction(new LoadLocalizationAction($"Loading localizations for {mod.Item1}", mod.Item1, mod.Item2)); - gameManager.LoadingFlow.AddAction(new InitializeModAction($"Initializing {mod.Item1}", mod.Item1, mod.Item2)); - } - - gameManager.LoadingFlow.AddAction(new PostInitializeModsAction("Space Warp Mod Post-Initialization")); - } -} \ No newline at end of file diff --git a/SpaceWarp/Patching/MainMenuPatcher.cs b/SpaceWarp/Patching/MainMenuPatcher.cs index ce1bd8a1..9fc6ae28 100644 --- a/SpaceWarp/Patching/MainMenuPatcher.cs +++ b/SpaceWarp/Patching/MainMenuPatcher.cs @@ -24,22 +24,13 @@ public static void Postfix(KSP.Game.StartupFlow.LandingHUD __instance) // Rebind the button's action to open the mod manager dialog. UIAction_Void_Button uiAction = modsButton.GetComponent(); - DelegateAction action = new DelegateAction(); - action.BindDelegate(ModsOnClick); + DelegateAction action = new(); + action.BindDelegate(() => SpaceWarpManager.ModListUI.ToggleVisible()); uiAction.BindAction(action); // Set the label to "Mods". TextMeshProUGUI tmp = modsButton.GetComponentInChildren(); tmp.SetText("Mods"); - - } - - static void ModsOnClick() - { - if (ManagerLocator.TryGet(out SpaceWarpManager manager)) - { - manager.ModListUI.ToggleVisible(); - } } } diff --git a/SpaceWarp/SpaceWarp.csproj b/SpaceWarp/SpaceWarp.csproj index 519fc63c..1823ac90 100644 --- a/SpaceWarp/SpaceWarp.csproj +++ b/SpaceWarp/SpaceWarp.csproj @@ -2,37 +2,64 @@ 0.3.0 - latest + net472 + 11 true false - true - net472 + false + + CS0436 ..\external_dlls\Assembly-CSharp.dll true + false ..\external_dlls\Unity.TextMeshPro.dll + false ..\external_dlls\UnityEngine.UI.dll + false ..\external_dlls\Unity.Addressables.dll + false ..\external_dlls\Unity.ResourceManager.dll + false + + + ..\external_dlls\KSPLogging.dll + false - - - - - - - + + + + + + + + + + + + + + + System.Index; + System.Range; + System.Diagnostics.CodeAnalysis.NotNullWhenAttribute; + System.Diagnostics.CodeAnalysis.DoesNotReturnAttribute; + + diff --git a/SpaceWarp/SpaceWarpManager.cs b/SpaceWarp/SpaceWarpManager.cs index c170dcd2..bc30a74c 100644 --- a/SpaceWarp/SpaceWarpManager.cs +++ b/SpaceWarp/SpaceWarpManager.cs @@ -1,20 +1,13 @@ -using System; -using System.IO; -using System.Collections; +using System.IO; using System.Collections.Generic; -using System.Reflection; using BepInEx.Bootstrap; using BepInEx.Logging; +using Newtonsoft.Json; using UnityEngine; using SpaceWarp.API.AssetBundles; using SpaceWarp.API.Mods; using SpaceWarp.API.Mods.JSON; -using SpaceWarp.API.Toolbar; -using SpaceWarp.Patching; using SpaceWarp.UI; -using UnityEngine.AddressableAssets; -using UnityEngine.AddressableAssets.ResourceLocators; -using UnityEngine.ResourceManagement.AsyncOperations; namespace SpaceWarp; @@ -23,150 +16,72 @@ namespace SpaceWarp; /// internal static class SpaceWarpManager { - private static ManualLogSource _logger; - - internal static BaseSpaceWarpPlugin[] SpaceWarpPlugins; - - internal static void GetSpaceWarpPlugins() - { - SpaceWarpPlugins = Chainloader.PluginInfos.Values.Select(p => p.Instance).OfType().ToArray(); - } - - public static ModListUI ModListUI { get; private set; } - - public static void Initialize() - { - ToolbarBackend.AppBarInFlightSubscriber.AddListener(LoadAllButtons); - - _logger = BepInEx.Logging.Logger.CreateLogSource("SpaceWarp Manager"); - - LoadingScreenPatcher.AddModLoadingScreens(); - } - - internal void InitializeAssets() - { - _logger.LogWarning("Initializing mod assets"); - - foreach ((string modName, ModInfo info) in _modLoadOrder) - { - LoadSingleModAssets(modName, info); - } - - } + internal static ManualLogSource Logger; + internal static string SpaceWarpFolder; + + internal static IReadOnlyList SpaceWarpPlugins; - internal void LoadSpaceWarpAssets() + internal static void GetSpaceWarpPlugins() { - string bundlesPath = Path.Combine(SPACE_WARP_PATH, GlobalModDefines.ASSET_BUNDLES_FOLDER); - - if (Directory.Exists(bundlesPath)) - { - foreach (string file in Directory.GetFiles(bundlesPath)) + // obsolete warning for Chainloader.Plugins, is fine since we need ordered list + // to break this we would likely need to upgrade to BIE 6, which isn't happening +#pragma warning disable CS0618 + var spaceWarpPlugins = Chainloader.Plugins.OfType().ToList(); + SpaceWarpPlugins = spaceWarpPlugins; +#pragma warning restore CS0618 + foreach (var plugin in SpaceWarpPlugins.ToArray()) + { + var folderPath = Path.GetDirectoryName(plugin.Info.Location); + plugin.PluginFolderPath = folderPath; + if (Path.GetFileName(Path.GetDirectoryName(folderPath)) == "plugins") { - _logger.LogInfo($"Found space warp asset file {file}"); - string assetBundleName = Path.GetFileNameWithoutExtension(file); - if (Path.GetExtension(file) != ".bundle") continue; - - - AssetBundle assetBundle = AssetBundle.LoadFromFile(file); - - if (assetBundle == null) - { - _logger.LogError($"Failed to load AssetBundle space_warp/{assetBundleName}"); - continue; - } - AssetManager.RegisterAssetBundle("space_warp", assetBundleName, assetBundle); - _logger.LogInfo($"Loaded AssetBundle space_warp/{assetBundleName}"); + Logger.LogError($"Found Space Warp mod {plugin.Info.Metadata.Name} in the BepInEx/plugins directory. This mod will not be initialized."); + spaceWarpPlugins.Remove(plugin); + continue; } - } - } - - /// - /// Loads a single mods assets - /// - /// the name/id of the mod - /// the mod info structure that describes the mod - internal void LoadSingleModAssets(string modName, ModInfo info) - { - string modFolder = Path.Combine(MODS_FULL_PATH, modName); - - // Now we load all asset bundles under the asset/bundles folder of the mod - string bundlesPath = modFolder + GlobalModDefines.ASSET_BUNDLES_FOLDER; - if (Directory.Exists(bundlesPath)) - { - foreach (string file in Directory.GetFiles(bundlesPath)) + var modInfoPath = Path.Combine(folderPath!, "swinfo.json"); + if (!File.Exists(modInfoPath)) { - string assetBundleName = Path.GetFileNameWithoutExtension(file); - if (Path.GetExtension(file) != ".bundle") continue; - - - AssetBundle assetBundle = AssetBundle.LoadFromFile(file); - - if (assetBundle == null) - { - _logger.LogError($"Failed to load AssetBundle {info.mod_id}/{assetBundleName}"); - continue; - } - AssetManager.RegisterAssetBundle(info.mod_id, assetBundleName, assetBundle); - _logger.LogInfo($"Loaded AssetBundle {info.mod_id}/{assetBundleName}"); + Logger.LogError($"Found Space Warp plugin {plugin.Info.Metadata.Name} without a swinfo.json next to it. This mod will not be initialized."); + spaceWarpPlugins.Remove(plugin); + continue; } + plugin.SpaceWarpMetadata = JsonConvert.DeserializeObject(File.ReadAllText(modInfoPath)); } - else - { - _logger.LogInfo($"Did not load assets for {modName} as no assets folder existed!"); - } + } + + public static void Initialize(SpaceWarpPlugin sw) + { + Logger = sw.Logger; - // TODO: load part specific json stuff + SpaceWarpFolder = Path.GetDirectoryName(sw.Info.Location); + + InitModUI(); } + public static ModListUI ModListUI { get; private set; } + /// /// Initializes the UI for the mod list and configuration menu /// - private void InitModUI() + private static void InitModUI() { GameObject modUIObject = new GameObject("Space Warp Mod UI"); - Persist(modUIObject); - - modUIObject.transform.SetParent(transform.parent); + modUIObject.Persist(); + + modUIObject.transform.SetParent(Chainloader.ManagerObject.transform); ModListUI = modUIObject.AddComponent(); - + modUIObject.SetActive(true); - + GameObject consoleUIObject = new GameObject("Space Warp Console"); - Persist(consoleUIObject); - consoleUIObject.transform.SetParent(transform.parent); + consoleUIObject.Persist(); + consoleUIObject.transform.SetParent(Chainloader.ManagerObject.transform); SpaceWarpConsole con = consoleUIObject.AddComponent(); consoleUIObject.SetActive(true); } - private static List<(string text, Sprite icon, string ID, Action action)> _buttonsToBeLoaded = - new List<(string text, Sprite icon, string ID, Action action)>(); - - public T RegisterGameToolbarMenu(string text, string title, string id, Sprite icon) where T : ToolbarMenu - { - GameObject toolBarUIObject = new GameObject($"Toolbar: {id}"); - Persist(toolBarUIObject); - ToolbarMenu menu = toolBarUIObject.AddComponent(); - menu.Title = title; - toolBarUIObject.transform.SetParent(transform.parent); - toolBarUIObject.SetActive(true); - _buttonsToBeLoaded.Add((text,icon,id,menu.ToggleGUI)); - return menu as T; - } - - public static void RegisterAppButton(string text, string id, Sprite icon, Action func) => - _buttonsToBeLoaded.Add((text ,icon, id, func)); - - /// - /// Allows an object to persist through KSP 2s destruction - /// - /// Object that should be persisted - public static void Persist(UnityObject toPersist) - { - UnityObject.DontDestroyOnLoad(toPersist); - toPersist.hideFlags |= HideFlags.HideAndDontSave; - } - private static GUISkin _skin = null; public static GUISkin Skin @@ -178,145 +93,4 @@ public static GUISkin Skin return _skin; } } - - private void LoadAllButtons() - { - foreach (var button in _buttonsToBeLoaded) - { - ToolbarBackend.AddButton(button.text, button.icon, button.ID, button.action); - } - } - - /// - /// Loads a png called 'icon.png' as a sprite from the same folder as the calling dll. - /// In our case this should be SpaceWarp\Mods\[mod]\bin\icon.png - /// - /// The size of the png. The appbar expects 24x24. - public static Sprite LoadIcon(int size = 24) - { - string folderPath = Path.GetDirectoryName(Assembly.GetCallingAssembly().Location); - - return LoadIcon(Path.Combine(folderPath, "icon.png"), size); - } - - /// - /// Loads a png at the given path as a sprite. - /// - /// Path to the png. - /// The size of the png. The appbar expects 24x24. - public static Sprite LoadIcon(string path, int size = 24) - { - Texture2D tex = new Texture2D(size, size, TextureFormat.ARGB32, false); - tex.filterMode = FilterMode.Point; - - if (File.Exists(path)) - { - byte[] fileContent = File.ReadAllBytes(path); - tex.LoadImage(fileContent); - } - - return Sprite.Create(tex, new Rect(0, 0, size, size), new Vector2(0.5f, 0.5f)); - } - - public void InitializeAddressablesFolder() - { - LoadSpaceWarpAddressables(); - } - - public IEnumerator LoadAddressable(string catalog) - { - _logger.LogInfo($"Attempting to load {catalog}"); - AsyncOperationHandle operation = Addressables.LoadContentCatalogAsync(catalog, null); - yield return operation; - if (operation.Status == AsyncOperationStatus.Failed) - { - _logger.LogError($"Failed to load addressables catalog {catalog}"); - } - else - { - _logger.LogInfo($"Loaded addressables catalog {catalog}"); - var locator = operation.Result; - _logger.LogInfo($"{catalog} ----- {locator.LocatorId}"); - Game.Assets.RegisterResourceLocator(locator); - } - } - - public void LoadSpaceWarpAddressables() - { - string addressablesPath = Path.Combine(SPACE_WARP_PATH,"addressables"); - string catalogPath = Path.Combine(addressablesPath,"catalog.json"); - if (File.Exists(catalogPath)) - { - StartCoroutine(LoadAddressable(catalogPath)); - } - } - - public void LoadSingleModAddressables(string modID, ModInfo info) - { - string modFolder = Path.Combine(MODS_FULL_PATH, modID); - string addressablesPath = Path.Combine(modFolder,"addressables"); - _logger.LogInfo($"Loading addressables for {modID}"); - string catalogPath = Path.Combine(addressablesPath, "catalog.json"); - if (File.Exists(catalogPath)) - { - _logger.LogInfo($"Found addressables for {modID}"); - StartCoroutine(LoadAddressable(catalogPath)); - } - else - { - _logger.LogInfo($"Did not find addressables for {modID}"); - } - } - - private void LoadLocalizationFromFolder(string folder) - { - _logger.LogInfo($"Attempting to load localizations from {folder}"); - I2.Loc.LanguageSourceData languageSourceData = null; - if (!Directory.Exists(folder)) - { - _logger.LogInfo($"{folder} does not exist, not loading localizations."); - return; - } - DirectoryInfo info = new DirectoryInfo(folder); - foreach (var csvFile in info.GetFiles("*.csv")) - { - languageSourceData ??= new I2.Loc.LanguageSourceData(); - var csvData = File.ReadAllText(csvFile.FullName); - languageSourceData.Import_CSV("", csvData, I2.Loc.eSpreadsheetUpdateMode.AddNewTerms); - } - - foreach (var i2csvFile in info.GetFiles("*.i2csv")) - { - languageSourceData ??= new I2.Loc.LanguageSourceData(); - var i2csvData = File.ReadAllText(i2csvFile.FullName); - languageSourceData.Import_I2CSV("", i2csvData, I2.Loc.eSpreadsheetUpdateMode.AddNewTerms); - } - - if (languageSourceData != null) - { - _logger.LogInfo($"Loaded localizations from {folder}"); - I2.Loc.LocalizationManager.AddSource(languageSourceData); - } - else - { - _logger.LogInfo($"No localizations found in {folder}"); - } - } - public void LoadSpaceWarpLocalizations() - { - if (I2.Loc.LocalizationManager.Sources.Count == 0) - { - I2.Loc.LocalizationManager.UpdateSources(); - } - - string localizationsPath = Path.Combine(SPACE_WARP_PATH, "localizations"); - LoadLocalizationFromFolder(localizationsPath); - } - - public void LoadSingleModLocalization(string modID, ModInfo info) - { - string modFolder = Path.Combine(MODS_FULL_PATH, modID); - string localizationsPath = Path.Combine(modFolder, "localizations"); - LoadLocalizationFromFolder(localizationsPath); - } } \ No newline at end of file diff --git a/SpaceWarp/SpaceWarpPlugin.cs b/SpaceWarp/SpaceWarpPlugin.cs index 39fbaa57..8e6616d0 100644 --- a/SpaceWarp/SpaceWarpPlugin.cs +++ b/SpaceWarp/SpaceWarpPlugin.cs @@ -2,6 +2,7 @@ global using System.Linq; using BepInEx; +using BepInEx.Logging; using HarmonyLib; using SpaceWarp.UI; @@ -12,11 +13,15 @@ public sealed class SpaceWarpPlugin : BaseUnityPlugin { public const string ModGuid = "com.github.x606.spacewarp"; public const string ModName = "Space Warp"; + + new internal ManualLogSource Logger => base.Logger; public void Awake() { BepInEx.Logging.Logger.Listeners.Add(new SpaceWarpConsoleLogListener()); Harmony.CreateAndPatchAll(typeof(SpaceWarpPlugin).Assembly, ModGuid); + + SpaceWarpManager.Initialize(this); } } diff --git a/SpaceWarp/UI/ModConfigurationSection.cs b/SpaceWarp/UI/ModConfigurationSection.cs deleted file mode 100644 index eff00147..00000000 --- a/SpaceWarp/UI/ModConfigurationSection.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Text; -namespace SpaceWarp.UI; - -public class ModConfigurationSection -{ - public bool Open = false; - - public readonly List<(string name, FieldInfo info, object confAttribute, string currentStringValue)> Properties = new List<(string name, FieldInfo info, object confAttribute, string currentStringValue)>(); - public readonly List<(string path, ModConfigurationSection section)> SubSections = new List<(string path, ModConfigurationSection section)>(); - - private ModConfigurationSection TouchSubSection(string subsection) - { - (string path, ModConfigurationSection section) sub1 = SubSections.FirstOrDefault(sub => sub.path == subsection); - - if (sub1 != default) - { - return sub1.section; - } - - ModConfigurationSection sub2 = new ModConfigurationSection(); - SubSections.Add((subsection, sub2)); - return sub2; - - } - public void Insert(string[] path, (string name, FieldInfo info, object confAttribute, string currentStringValue) property) - { - StringBuilder sb = new StringBuilder(); - foreach (string t in path) - { - sb.Append(t + "/"); - } - if (path.Length > 0) - { - List subPath = new List(); - for (int i = 1; i < path.Length; i++) - { - subPath.Add(path[i]); - } - - ModConfigurationSection receivedSub = TouchSubSection(path[0]); - - receivedSub.Insert(subPath.ToArray(),property); - } - else - { - Properties.Add(property); - } - } -} \ No newline at end of file diff --git a/SpaceWarp/UI/ModListUI.cs b/SpaceWarp/UI/ModListUI.cs index a7197554..5b793e48 100644 --- a/SpaceWarp/UI/ModListUI.cs +++ b/SpaceWarp/UI/ModListUI.cs @@ -2,10 +2,7 @@ using System.Collections.Generic; using System.IO; using KSP.Game; -using SpaceWarp.API; using SpaceWarp.API.AssetBundles; -using SpaceWarp.API.Configuration; -using SpaceWarp.API.Managers; using SpaceWarp.API.Mods.JSON; using UnityEngine; @@ -22,8 +19,6 @@ public class ModListUI : KerbalMonoBehaviour private static GUIStyle _boxStyle; private static Vector2 _scrollPositionMods; - private string _selectedMod; - private ModInfo _selectedModInfo; private GUISkin _spaceWarpUISkin; private List<(string, bool)> _toggles = new List<(string, bool)>(); @@ -105,28 +100,6 @@ private void FillWindow(int windowID) } } GUILayout.EndHorizontal(); - - - GUILayout.BeginHorizontal(); - if (ManagerLocator.TryGet(out SpaceWarpManager managerRemove)) - { - if (GUILayout.Button("Revert Changes")) - { - // Replace _toggles list with backup copy - _toggles = new List<(string, bool)>(_initialToggles); - - // Delete all ignore files - foreach ((string modID, ModInfo modInfo) in managerRemove.LoadedMods) - { - if (File.Exists($"SpaceWarp/Mods/{modID}/.ignore")) - { - File.Delete($"SpaceWarp/Mods/{modID}/.ignore"); - } - } - } - } - - GUILayout.EndHorizontal(); int numChanges = 0; for (int i = 0; i < _toggles.Count; i++) @@ -142,144 +115,13 @@ private void FillWindow(int windowID) GUILayout.Label($"{numChanges} changes detected, please restart"); } - if (ManagerLocator.TryGet(out SpaceWarpManager manager)) - { - foreach ((string modID, ModInfo modInfo) in manager.LoadedMods) - { - int toggleIndex = _toggles.FindIndex(t => t.Item1 == modID); - if (toggleIndex == -1) // Toggle not found, add a new one - { - _toggles.Add((modID, true)); - toggleIndex = _toggles.Count - 1; - } - - bool isToggled = _toggles[toggleIndex].Item2; // current state of the toggle - bool wasToggled = _wasToggledDict.ContainsKey(modID) && _wasToggledDict[modID]; // previous state of the toggle (defaults to false if not found) - - GUILayout.BeginHorizontal(); - _toggles[toggleIndex] = (modID, GUILayout.Toggle(isToggled, "")); - if (GUILayout.Button(modID)) - { - _selectedMod = modID; - _selectedModInfo = modInfo; - } - GUILayout.EndHorizontal(); - - // Edge detection - if (!isToggled && wasToggled) // falling edge - { - File.Create($"SpaceWarp/Mods/{modID}/.ignore").Close(); - } - else if (isToggled && !wasToggled) // rising edge - { - File.Delete($"SpaceWarp/Mods/{modID}/.ignore"); - } - - _wasToggledDict[modID] = isToggled; // update the previous state of the toggle - } - - - foreach ((string modID, ModInfo modInfo) in manager.IgnoredMods) - { - int toggleIndex = _toggles.FindIndex((t) => t.Item1 == modID); - if (toggleIndex == -1) // Toggle not found, add a new one - { - _toggles.Add((modID, false)); - toggleIndex = _toggles.Count - 1; - } - - bool isToggled = _toggles[toggleIndex].Item2; // current state of the toggle - bool wasToggled = !_wasToggledDict.ContainsKey(modID) || _wasToggledDict[modID]; - - GUILayout.BeginHorizontal(); - - // Add a space to vertically center the toggle button - GUILayoutOption[] alignMiddleOption = { GUILayout.Height(30)}; - - _toggles[toggleIndex] = (modID, GUILayout.Toggle(isToggled, "", alignMiddleOption)); - if (GUILayout.Button(modID)) - { - _selectedMod = modID; - _selectedModInfo = modInfo; - } - - GUILayout.EndHorizontal(); - // Edge detection - if (isToggled && !wasToggled) // falling edge - { - File.Delete($"SpaceWarp/Mods/{modID}/.ignore"); - } - else if (!isToggled && wasToggled) // rising edge - { - File.Create($"SpaceWarp/Mods/{modID}/.ignore").Close(); - } - - _wasToggledDict[modID] = isToggled; // update the previous state of the toggle - } - } - GUILayout.EndScrollView(); - GUILayout.EndVertical(); - GUILayout.BeginVertical(); - - if (_selectedModInfo != null) - { - CreateModConfigurationUI(); - } - else - { - GUILayout.Label("No mod selected"); - } - GUILayout.EndVertical(); GUILayout.EndHorizontal(); GUI.DragWindow(); } - private void CreateModConfigurationUI() - { - GUILayout.Label(_selectedModInfo.name); - GUILayout.Label($"Author: {_selectedModInfo.author}"); - GUILayout.Label($"Version: {_selectedModInfo.version}"); - GUILayout.Label($"Source: {_selectedModInfo.source}"); - GUILayout.Label($"Description: {_selectedModInfo.description}"); - GUILayout.Label($"KSP2 Version: {_selectedModInfo.supported_ksp2_versions.min} - {_selectedModInfo.supported_ksp2_versions.max}"); - GUILayout.Label($"Dependencies"); - - foreach (DependencyInfo dependency in _selectedModInfo.dependencies) - { - GUILayout.Label($"{dependency.id}: {dependency.version.min} - {dependency.version.max}"); - } - - if (!ManagerLocator.TryGet(out ConfigurationManager configManager)) - { - return; - } - - if (!configManager.TryGet(_selectedModInfo.mod_id, out (Type configType, object configObject, string path) config)) - { - return; - } - - if (!GUILayout.Button("Configure")) - { - return; - } - - GameObject go = new GameObject(_selectedModInfo.mod_id); - go.transform.SetParent(transform); - - ModConfigurationUI configUI = go.AddComponent(); - - configUI.ConfigurationType = config.configType; - configUI.ConfigurationObject = config.configObject; - configUI.modID = _selectedMod; - - - go.SetActive(true); - } - public void ToggleVisible() { _drawUI = !_drawUI; diff --git a/SpaceWarp/UI/SpaceWarpConsole.cs b/SpaceWarp/UI/SpaceWarpConsole.cs index 838d20b9..ef8e2e47 100644 --- a/SpaceWarp/UI/SpaceWarpConsole.cs +++ b/SpaceWarp/UI/SpaceWarpConsole.cs @@ -17,7 +17,7 @@ public sealed class SpaceWarpConsole : MonoBehaviour private static Vector2 _scrollPosition; private static Vector2 _scrollView; - private new void Awake() + private void Awake() { _windowWidth = (int)(Screen.width * 0.5f); _windowHeight = (int)(Screen.height * 0.5f); diff --git a/example_mod_info.json b/example_mod_info.json index aed175b1..5aabff9c 100644 --- a/example_mod_info.json +++ b/example_mod_info.json @@ -4,7 +4,7 @@ "author": "", "description": "", "source": "", - "version": "", + "version": "1.0.0", "dependencies": [ { "id": "example_mod", @@ -18,4 +18,4 @@ "min": "...", "max": "... (can be * for no max version)" } -} \ No newline at end of file +} From e9338a86a8451734ef6643bb4f4ff054eb5fa699 Mon Sep 17 00:00:00 2001 From: Aaron Robinson Date: Thu, 2 Mar 2023 02:19:41 -0600 Subject: [PATCH 03/29] Third pass --- ExampleMod/ExampleMod.cs | 3 +- SpaceWarp/API/Toolbar/ToolbarMenu.cs | 2 - SpaceWarp/Patching/BootstrapPatch.cs | 21 +++------- .../InitializeSpaceWarpUIAction.cs | 39 +++++++++++++++++++ SpaceWarp/Patching/MainMenuPatcher.cs | 1 - SpaceWarp/SpaceWarp.csproj | 2 +- SpaceWarp/SpaceWarpManager.cs | 31 ++------------- SpaceWarp/SpaceWarpPlugin.cs | 3 +- SpaceWarp/UI/ModListUI.cs | 12 ++---- SpaceWarp/UI/SpaceWarpConsole.cs | 5 +-- 10 files changed, 58 insertions(+), 61 deletions(-) create mode 100644 SpaceWarp/Patching/LoadingActions/InitializeSpaceWarpUIAction.cs diff --git a/ExampleMod/ExampleMod.cs b/ExampleMod/ExampleMod.cs index aad42604..3e54dbb5 100644 --- a/ExampleMod/ExampleMod.cs +++ b/ExampleMod/ExampleMod.cs @@ -2,15 +2,16 @@ using BepInEx; using SpaceWarp.API.Mods; using SpaceWarp.API.AssetBundles; -using SpaceWarp.API; using KSP.UI.Binding; using KSP.Sim.impl; +using SpaceWarp; using SpaceWarp.API.Toolbar; using UnityEngine; namespace ExampleMod; [BepInPlugin("com.SpaceWarpAuthorName.ExampleMod", "ExampleMod", "3.0.0")] +[BepInDependency(SpaceWarpPlugin.ModGuid, SpaceWarpPlugin.ModVer)] public class ExampleMod : BaseSpaceWarpPlugin { public GUISkin _spaceWarpUISkin; diff --git a/SpaceWarp/API/Toolbar/ToolbarMenu.cs b/SpaceWarp/API/Toolbar/ToolbarMenu.cs index f0e07c43..f6353742 100644 --- a/SpaceWarp/API/Toolbar/ToolbarMenu.cs +++ b/SpaceWarp/API/Toolbar/ToolbarMenu.cs @@ -1,5 +1,3 @@ -using System.IO; -using System.Reflection; using KSP.Game; using KSP.Sim.impl; using SpaceWarp.API.AssetBundles; diff --git a/SpaceWarp/Patching/BootstrapPatch.cs b/SpaceWarp/Patching/BootstrapPatch.cs index e20afa87..bcb96a3e 100644 --- a/SpaceWarp/Patching/BootstrapPatch.cs +++ b/SpaceWarp/Patching/BootstrapPatch.cs @@ -1,6 +1,5 @@ using HarmonyLib; using KSP.Game; -using KSP.Game.StartupFlow; using MonoMod.Cil; using SpaceWarp.Patching.LoadingActions; @@ -35,20 +34,16 @@ private static void PatchInitializationsIL(ILContext il, ILLabel endLabel) GameManager.Instance.LoadingFlow.AddAction(new PreInitializeModAction(plugin)); } }); - - c.GotoNext(MoveType.Before, - x => x.MatchLdarg(0), - x => x.MatchCallOrCallvirt(flowProp.GetMethod), - x => x.MatchLdloc(out _), - x => x.MatchNewobj(out var ctor) && ctor.DeclaringType.FullName == typeof(CreateMainMenuFlowAction).FullName - ); - + + c.GotoLabel(endLabel, MoveType.Before); + c.Index -= 1; c.EmitDelegate(static () => { var flow = GameManager.Instance.LoadingFlow; flow.AddAction(new LoadSpaceWarpLocalizationsAction()); flow.AddAction(new LoadSpaceWarpAddressablesAction()); flow.AddAction(new SpaceWarpAssetInitializationAction()); + flow.AddAction(new InitializeSpaceWarpUIAction()); foreach (var plugin in SpaceWarpManager.SpaceWarpPlugins) { @@ -61,14 +56,10 @@ private static void PatchInitializationsIL(ILContext il, ILLabel endLabel) { flow.AddAction(new InitializeModAction(plugin)); } - }); - - c.GotoLabel(endLabel); - c.EmitDelegate(static () => - { + foreach (var plugin in SpaceWarpManager.SpaceWarpPlugins) { - GameManager.Instance.LoadingFlow.AddAction(new PostInitializeModAction(plugin)); + flow.AddAction(new PostInitializeModAction(plugin)); } }); } diff --git a/SpaceWarp/Patching/LoadingActions/InitializeSpaceWarpUIAction.cs b/SpaceWarp/Patching/LoadingActions/InitializeSpaceWarpUIAction.cs new file mode 100644 index 00000000..c81a419f --- /dev/null +++ b/SpaceWarp/Patching/LoadingActions/InitializeSpaceWarpUIAction.cs @@ -0,0 +1,39 @@ +using System; +using BepInEx.Bootstrap; +using KSP.Game.Flow; +using SpaceWarp.UI; +using UnityEngine; + +namespace SpaceWarp.Patching.LoadingActions; + +internal sealed class InitializeSpaceWarpUIAction : FlowAction +{ + public InitializeSpaceWarpUIAction() : base("Loading Space Warp UI") { } + + public override void DoAction(Action resolve, Action reject) + { + try + { + GameObject modUIObject = new GameObject("Space Warp Mod UI"); + modUIObject.Persist(); + + modUIObject.transform.SetParent(Chainloader.ManagerObject.transform); + SpaceWarpManager.ModListUI = modUIObject.AddComponent(); + + modUIObject.SetActive(true); + + GameObject consoleUIObject = new GameObject("Space Warp Console"); + consoleUIObject.Persist(); + consoleUIObject.transform.SetParent(Chainloader.ManagerObject.transform); + SpaceWarpConsole con = consoleUIObject.AddComponent(); + consoleUIObject.SetActive(true); + + resolve(); + } + catch (Exception e) + { + SpaceWarpManager.Logger.LogError(e.ToString()); + reject(null); + } + } +} diff --git a/SpaceWarp/Patching/MainMenuPatcher.cs b/SpaceWarp/Patching/MainMenuPatcher.cs index 9fc6ae28..2f957538 100644 --- a/SpaceWarp/Patching/MainMenuPatcher.cs +++ b/SpaceWarp/Patching/MainMenuPatcher.cs @@ -1,6 +1,5 @@ using HarmonyLib; using KSP.Api.CoreTypes; -using SpaceWarp.API; using TMPro; using UnityEngine; diff --git a/SpaceWarp/SpaceWarp.csproj b/SpaceWarp/SpaceWarp.csproj index 1823ac90..be742735 100644 --- a/SpaceWarp/SpaceWarp.csproj +++ b/SpaceWarp/SpaceWarp.csproj @@ -1,7 +1,7 @@  - 0.3.0 + 0.4.0 net472 11 true diff --git a/SpaceWarp/SpaceWarpManager.cs b/SpaceWarp/SpaceWarpManager.cs index bc30a74c..2bd18b6c 100644 --- a/SpaceWarp/SpaceWarpManager.cs +++ b/SpaceWarp/SpaceWarpManager.cs @@ -34,7 +34,7 @@ internal static void GetSpaceWarpPlugins() { var folderPath = Path.GetDirectoryName(plugin.Info.Location); plugin.PluginFolderPath = folderPath; - if (Path.GetFileName(Path.GetDirectoryName(folderPath)) == "plugins") + if (Path.GetFileName(folderPath) == "plugins") { Logger.LogError($"Found Space Warp mod {plugin.Info.Metadata.Name} in the BepInEx/plugins directory. This mod will not be initialized."); spaceWarpPlugins.Remove(plugin); @@ -56,40 +56,17 @@ public static void Initialize(SpaceWarpPlugin sw) Logger = sw.Logger; SpaceWarpFolder = Path.GetDirectoryName(sw.Info.Location); - - InitModUI(); } - public static ModListUI ModListUI { get; private set; } - - /// - /// Initializes the UI for the mod list and configuration menu - /// - private static void InitModUI() - { - GameObject modUIObject = new GameObject("Space Warp Mod UI"); - modUIObject.Persist(); - - modUIObject.transform.SetParent(Chainloader.ManagerObject.transform); - ModListUI = modUIObject.AddComponent(); - - modUIObject.SetActive(true); - - GameObject consoleUIObject = new GameObject("Space Warp Console"); - consoleUIObject.Persist(); - consoleUIObject.transform.SetParent(Chainloader.ManagerObject.transform); - SpaceWarpConsole con = consoleUIObject.AddComponent(); - consoleUIObject.SetActive(true); - } + public static ModListUI ModListUI { get; internal set; } - private static GUISkin _skin = null; + private static GUISkin _skin; public static GUISkin Skin { get { - if (_skin) - AssetManager.TryGetAsset("space_warp/swconsoleui/spacewarpConsole.guiskin", out _skin); + AssetManager.TryGetAsset("space_warp/swconsoleui/spacewarpconsole.guiskin", out _skin); return _skin; } } diff --git a/SpaceWarp/SpaceWarpPlugin.cs b/SpaceWarp/SpaceWarpPlugin.cs index 8e6616d0..28fb1961 100644 --- a/SpaceWarp/SpaceWarpPlugin.cs +++ b/SpaceWarp/SpaceWarpPlugin.cs @@ -8,11 +8,12 @@ namespace SpaceWarp; -[BepInPlugin(ModGuid, ModName, MyPluginInfo.PLUGIN_VERSION)] +[BepInPlugin(ModGuid, ModName, ModVer)] public sealed class SpaceWarpPlugin : BaseUnityPlugin { public const string ModGuid = "com.github.x606.spacewarp"; public const string ModName = "Space Warp"; + public const string ModVer = MyPluginInfo.PLUGIN_VERSION; new internal ManualLogSource Logger => base.Logger; diff --git a/SpaceWarp/UI/ModListUI.cs b/SpaceWarp/UI/ModListUI.cs index 5b793e48..98f20d15 100644 --- a/SpaceWarp/UI/ModListUI.cs +++ b/SpaceWarp/UI/ModListUI.cs @@ -1,9 +1,5 @@ -using System; -using System.Collections.Generic; -using System.IO; +using System.Collections.Generic; using KSP.Game; -using SpaceWarp.API.AssetBundles; -using SpaceWarp.API.Mods.JSON; using UnityEngine; namespace SpaceWarp.UI; @@ -19,7 +15,6 @@ public class ModListUI : KerbalMonoBehaviour private static GUIStyle _boxStyle; private static Vector2 _scrollPositionMods; - private GUISkin _spaceWarpUISkin; private List<(string, bool)> _toggles = new List<(string, bool)>(); private List<(string, bool)> _initialToggles = new List<(string, bool)>(); @@ -41,12 +36,11 @@ private void Awake() _windowHeight = (int)(Screen.height * 0.85f); _windowRect = new Rect(Screen.width * 0.15f, Screen.height * 0.15f, 0, 0); - AssetManager.TryGetAsset($"space_warp/swconsoleui/swconsoleUI/spacewarpConsole.guiskin", out _spaceWarpUISkin); } private void OnGUI() { - GUI.skin = _spaceWarpUISkin; + GUI.skin = SpaceWarpManager.Skin; if (!_drawUI) { return; @@ -56,7 +50,7 @@ private void OnGUI() const string header = "spacewarp.modlist"; GUILayoutOption width = GUILayout.Width((float)(_windowWidth * 0.8)); GUILayoutOption height = GUILayout.Height((float)(_windowHeight * 0.8)); - GUI.skin = _spaceWarpUISkin; + GUI.skin = SpaceWarpManager.Skin; _windowRect = GUILayout.Window(controlID, _windowRect, FillWindow, header, width, height); } diff --git a/SpaceWarp/UI/SpaceWarpConsole.cs b/SpaceWarp/UI/SpaceWarpConsole.cs index ef8e2e47..c9bd9ce1 100644 --- a/SpaceWarp/UI/SpaceWarpConsole.cs +++ b/SpaceWarp/UI/SpaceWarpConsole.cs @@ -1,7 +1,4 @@ -using System.Collections.Generic; -using KSP.Sim.impl; -using UnityEngine; -using SpaceWarp.API; +using UnityEngine; namespace SpaceWarp.UI; From a5020590eb8d91803e089b1597e0ec7c1f1915a3 Mon Sep 17 00:00:00 2001 From: Lexi Date: Thu, 2 Mar 2023 12:42:24 -0500 Subject: [PATCH 04/29] Add experimental image asset loading and an expiremental icon loader. Exposed Space Warps reference to its own GUISkin asset. --- ExampleMod/ExampleMod.cs | 37 ++++-------- .../{AssetBundles => Assets}/AssetManager.cs | 15 ++++- SpaceWarp/API/Mods/GlobalModDefines.cs | 3 +- SpaceWarp/API/UI/Skins.cs | 9 +++ SpaceWarp/API/{ => UI}/Toolbar/Toolbar.cs | 17 +++++- .../API/{ => UI}/Toolbar/ToolbarBackend.cs | 2 +- SpaceWarp/API/{ => UI}/Toolbar/ToolbarMenu.cs | 4 +- .../LoadingActions/LoadAssetAction.cs | 44 +++++++++++++- .../LoadSpaceWarpAssetsAction.cs | 4 +- SpaceWarp/PathHelpers.cs | 59 +++++++++++++++++++ SpaceWarp/SpaceWarpManager.cs | 2 +- 11 files changed, 156 insertions(+), 40 deletions(-) rename SpaceWarp/API/{AssetBundles => Assets}/AssetManager.cs (86%) create mode 100644 SpaceWarp/API/UI/Skins.cs rename SpaceWarp/API/{ => UI}/Toolbar/Toolbar.cs (61%) rename SpaceWarp/API/{ => UI}/Toolbar/ToolbarBackend.cs (98%) rename SpaceWarp/API/{ => UI}/Toolbar/ToolbarMenu.cs (96%) create mode 100644 SpaceWarp/PathHelpers.cs diff --git a/ExampleMod/ExampleMod.cs b/ExampleMod/ExampleMod.cs index 3e54dbb5..4367e24e 100644 --- a/ExampleMod/ExampleMod.cs +++ b/ExampleMod/ExampleMod.cs @@ -1,11 +1,12 @@ using System.IO; using BepInEx; using SpaceWarp.API.Mods; -using SpaceWarp.API.AssetBundles; +using SpaceWarp.API.Assets; using KSP.UI.Binding; using KSP.Sim.impl; using SpaceWarp; -using SpaceWarp.API.Toolbar; +using SpaceWarp.API.UI; +using SpaceWarp.API.UI.Toolbar; using UnityEngine; namespace ExampleMod; @@ -14,7 +15,6 @@ namespace ExampleMod; [BepInDependency(SpaceWarpPlugin.ModGuid, SpaceWarpPlugin.ModVer)] public class ExampleMod : BaseSpaceWarpPlugin { - public GUISkin _spaceWarpUISkin; private bool drawUI; private Rect windowRect; @@ -33,35 +33,20 @@ public override void OnInitialized() // Example of using the logger, Were going to log a message to the console, ALT + C to open the console. Logger.LogInfo("Hello World, Im a spacewarp Mod."); - // Example of using the asset loader, were going to load the SpaceWarp GUI skin. - // [FORMAT]: space_warp/[assetbundle_name]/[folder_in_assetbundle]/[file.type] - AssetManager.TryGetAsset( - "space_warp/swconsoleui/swconsoleUI/spacewarpConsole.guiskin", - out _spaceWarpUISkin - ); - // Register the mod's button on the SpaceWarp application bar. + // Register the mod's button in KSP 2s app.bar + // This requires an `icon.png` file to exist under [plugin_folder]/assets/images Toolbar.RegisterAppButton( "Example Mod", "BTN-ExampleMod", - LoadIcon(Path.Combine(PluginFolderPath, "icon.png")), + // Example of using the asset loader, were going to load the apps icon + // Path format [mod_id]/images/filename + // for bundles its [mod_id]/[bundle_name]/[path to file in bundle with out assets/bundle]/filename.extension + // There is also a try get asset function, that returns a bool on whether or not it could grab the asset + AssetManager.GetAsset($"{SpaceWarpMetadata.ModID}/images/icon.png"), ToggleButton ); } - - public static Sprite LoadIcon(string path, int size = 24) - { - Texture2D tex = new Texture2D(size, size, TextureFormat.ARGB32, false); - tex.filterMode = FilterMode.Point; - - if (File.Exists(path)) - { - byte[] fileContent = File.ReadAllBytes(path); - tex.LoadImage(fileContent); - } - - return Sprite.Create(tex, new Rect(0, 0, size, size), new Vector2(0.5f, 0.5f)); - } /// /// A method that is called when the mod's button on the SpaceWarp application bar is clicked. @@ -82,7 +67,7 @@ private void ToggleButton(bool toggle) public void OnGUI() { // Set the GUI skin to the SpaceWarp GUI skin. - GUI.skin = _spaceWarpUISkin; + GUI.skin = Skins.ConsoleSkin; if (drawUI) { diff --git a/SpaceWarp/API/AssetBundles/AssetManager.cs b/SpaceWarp/API/Assets/AssetManager.cs similarity index 86% rename from SpaceWarp/API/AssetBundles/AssetManager.cs rename to SpaceWarp/API/Assets/AssetManager.cs index 35adb3cb..9aaa3b22 100644 --- a/SpaceWarp/API/AssetBundles/AssetManager.cs +++ b/SpaceWarp/API/Assets/AssetManager.cs @@ -3,7 +3,7 @@ using BepInEx.Logging; using UnityEngine; -namespace SpaceWarp.API.AssetBundles; +namespace SpaceWarp.API.Assets; public static class AssetManager { @@ -21,9 +21,9 @@ internal static void RegisterAssetBundle(string modId, string assetBundleName, A for (int i = 0; i < names.Length; i++) { var assetName = names[i]; - if (assetName.StartsWith("assets/")) + if (assetName.ToLower().StartsWith("assets/")) assetName = assetName["assets/".Length..]; - if (assetName.StartsWith(assetBundleName + "/")) + if (assetName.ToLower().StartsWith(assetBundleName + "/")) assetName = assetName[(assetBundleName.Length + 1)..]; string path = modId + "/" + assetBundleName + "/" + assetName; @@ -54,6 +54,15 @@ internal static void RegisterAssetBundle(string modId, string assetBundleName, A // } } + internal static void RegisterSingleAsset(string modId, string internalAssetPath, T asset) where T : UnityObject + { + var path = $"{modId}/{internalAssetPath}"; + path = path.ToLower(); + ManualLogSource logger = BepInEx.Logging.Logger.CreateLogSource($"{path}"); + logger.LogInfo($"registering path \"{path}\""); + AllAssets.Add(path,asset); + } + /// /// Gets an asset from the specified asset path /// diff --git a/SpaceWarp/API/Mods/GlobalModDefines.cs b/SpaceWarp/API/Mods/GlobalModDefines.cs index b8fe73a5..d93043e8 100644 --- a/SpaceWarp/API/Mods/GlobalModDefines.cs +++ b/SpaceWarp/API/Mods/GlobalModDefines.cs @@ -4,5 +4,6 @@ namespace SpaceWarp.API.Mods; public static class GlobalModDefines { - public static readonly string ASSET_BUNDLES_FOLDER = Path.Combine("assets", "bundles"); + public static readonly string AssetBundlesFolder = Path.Combine("assets", "bundles"); + public static readonly string ImageAssetsFolder = Path.Combine("assets", "images"); } \ No newline at end of file diff --git a/SpaceWarp/API/UI/Skins.cs b/SpaceWarp/API/UI/Skins.cs new file mode 100644 index 00000000..59da0818 --- /dev/null +++ b/SpaceWarp/API/UI/Skins.cs @@ -0,0 +1,9 @@ +using UnityEngine; + +namespace SpaceWarp.API.UI; + +// This exposes the SpaceWarp internal skins +public static class Skins +{ + public static GUISkin ConsoleSkin => SpaceWarpManager.Skin; +} \ No newline at end of file diff --git a/SpaceWarp/API/Toolbar/Toolbar.cs b/SpaceWarp/API/UI/Toolbar/Toolbar.cs similarity index 61% rename from SpaceWarp/API/Toolbar/Toolbar.cs rename to SpaceWarp/API/UI/Toolbar/Toolbar.cs index ba279599..5cf888fe 100644 --- a/SpaceWarp/API/Toolbar/Toolbar.cs +++ b/SpaceWarp/API/UI/Toolbar/Toolbar.cs @@ -3,7 +3,7 @@ using BepInEx.Bootstrap; using UnityEngine; -namespace SpaceWarp.API.Toolbar; +namespace SpaceWarp.API.UI.Toolbar; public static class Toolbar { @@ -20,8 +20,23 @@ public static T RegisterGameToolbarMenu(string text, string title, string id, _buttonsToBeLoaded.Add((text, icon, id, menu.ToggleGUI)); return menu as T; } + + public static T RegisterGameToolbarMenu(string text, string title, string id, Texture2D icon) where T : ToolbarMenu => + RegisterGameToolbarMenu(text, title, id, GetToolBarIconFromTexture(icon)); public static void RegisterAppButton(string text, string id, Sprite icon, Action func) => _buttonsToBeLoaded.Add((text ,icon, id, func)); + + public static void RegisterAppButton(string text, string id, Texture2D icon, Action func) => + RegisterAppButton(text, id, GetToolBarIconFromTexture(icon), func); + + public static Sprite GetToolBarIconFromTexture(Texture2D texture, int width=0,int height=0) + { + if (width == 0) width = texture.width; + if (height == 0) height = texture.height; + + return Sprite.Create(texture, new Rect(0, 0, width, height), new Vector2(0.5f, 0.5f)); + } + internal static void LoadAllButtons() { diff --git a/SpaceWarp/API/Toolbar/ToolbarBackend.cs b/SpaceWarp/API/UI/Toolbar/ToolbarBackend.cs similarity index 98% rename from SpaceWarp/API/Toolbar/ToolbarBackend.cs rename to SpaceWarp/API/UI/Toolbar/ToolbarBackend.cs index 853c176c..fc6ac7ce 100644 --- a/SpaceWarp/API/Toolbar/ToolbarBackend.cs +++ b/SpaceWarp/API/UI/Toolbar/ToolbarBackend.cs @@ -17,7 +17,7 @@ using UnityEngine.UI; using Object = UnityEngine.Object; -namespace SpaceWarp.API.Toolbar; +namespace SpaceWarp.API.UI.Toolbar; internal static class ToolbarBackend { diff --git a/SpaceWarp/API/Toolbar/ToolbarMenu.cs b/SpaceWarp/API/UI/Toolbar/ToolbarMenu.cs similarity index 96% rename from SpaceWarp/API/Toolbar/ToolbarMenu.cs rename to SpaceWarp/API/UI/Toolbar/ToolbarMenu.cs index f6353742..ff901d1b 100644 --- a/SpaceWarp/API/Toolbar/ToolbarMenu.cs +++ b/SpaceWarp/API/UI/Toolbar/ToolbarMenu.cs @@ -1,9 +1,9 @@ using KSP.Game; using KSP.Sim.impl; -using SpaceWarp.API.AssetBundles; +using SpaceWarp.API.Assets; using UnityEngine; -namespace SpaceWarp.API.Toolbar; +namespace SpaceWarp.API.UI.Toolbar; public abstract class ToolbarMenu : KerbalBehavior { diff --git a/SpaceWarp/Patching/LoadingActions/LoadAssetAction.cs b/SpaceWarp/Patching/LoadingActions/LoadAssetAction.cs index f266a21d..89db3006 100644 --- a/SpaceWarp/Patching/LoadingActions/LoadAssetAction.cs +++ b/SpaceWarp/Patching/LoadingActions/LoadAssetAction.cs @@ -2,7 +2,7 @@ using System.IO; using BepInEx.Logging; using KSP.Game.Flow; -using SpaceWarp.API.AssetBundles; +using SpaceWarp.API.Assets; using SpaceWarp.API.Mods; using UnityEngine; @@ -22,7 +22,7 @@ public override void DoAction(Action resolve, Action reject) { try { - string bundlesPath = Path.Combine(Plugin.PluginFolderPath, GlobalModDefines.ASSET_BUNDLES_FOLDER); + string bundlesPath = Path.Combine(Plugin.PluginFolderPath, GlobalModDefines.AssetBundlesFolder); if (Directory.Exists(bundlesPath)) { foreach (string file in Directory.GetFiles(bundlesPath)) @@ -44,8 +44,46 @@ public override void DoAction(Action resolve, Action reject) } else { - Logger.LogInfo($"Did not load assets for {Plugin.SpaceWarpMetadata.Name} as no assets folder existed!"); + Logger.LogInfo($"Did not load asset bundles for {Plugin.SpaceWarpMetadata.Name} as no asset bundles folder existed!"); } + + string imagesPath = Path.Combine(Plugin.PluginFolderPath, GlobalModDefines.ImageAssetsFolder); + if (Directory.Exists(imagesPath)) + { + var directoryInfo = new DirectoryInfo(imagesPath); + foreach (string file in directoryInfo.EnumerateFiles("*.cs", SearchOption.AllDirectories).Select(fileInfo => fileInfo.FullName)) + { + var assetPathList = PathHelpers.GetRelativePath(imagesPath, file).Split(Path.DirectorySeparatorChar); + //We have to make sure it uses '/' as the path separator and toLower() the names + var assetPath = ""; + for (int i = 0; i < assetPathList.Length; i++) + { + assetPath += assetPathList[i].ToLower(); + if (i != assetPathList.Length - 1) + { + assetPath += "/"; + } + } + + assetPath = $"images/{assetPath}"; + + Texture2D tex = new Texture2D(2, 2, TextureFormat.ARGB32, false) + { + filterMode = FilterMode.Point + }; + try + { + var fileData = File.ReadAllBytes(file); + tex.LoadImage(fileData); // Will automatically resize + AssetManager.RegisterSingleAsset(Plugin.SpaceWarpMetadata.ModID,assetPath,tex); + } + catch (Exception e) + { + Plugin.ModLogger.LogError(e.ToString()); + } + } + } + resolve(); } catch (Exception e) diff --git a/SpaceWarp/Patching/LoadingActions/LoadSpaceWarpAssetsAction.cs b/SpaceWarp/Patching/LoadingActions/LoadSpaceWarpAssetsAction.cs index ae768a29..630ca012 100644 --- a/SpaceWarp/Patching/LoadingActions/LoadSpaceWarpAssetsAction.cs +++ b/SpaceWarp/Patching/LoadingActions/LoadSpaceWarpAssetsAction.cs @@ -2,7 +2,7 @@ using System.IO; using BepInEx.Logging; using KSP.Game.Flow; -using SpaceWarp.API.AssetBundles; +using SpaceWarp.API.Assets; using SpaceWarp.API.Mods; using UnityEngine; @@ -20,7 +20,7 @@ public override void DoAction(Action resolve, Action reject) { try { - string bundlesPath = Path.Combine(SpaceWarpManager.SpaceWarpFolder, GlobalModDefines.ASSET_BUNDLES_FOLDER); + string bundlesPath = Path.Combine(SpaceWarpManager.SpaceWarpFolder, GlobalModDefines.AssetBundlesFolder); if (Directory.Exists(bundlesPath)) { diff --git a/SpaceWarp/PathHelpers.cs b/SpaceWarp/PathHelpers.cs new file mode 100644 index 00000000..009995dd --- /dev/null +++ b/SpaceWarp/PathHelpers.cs @@ -0,0 +1,59 @@ +using System; +using System.IO; + +namespace SpaceWarp; + +internal static class PathHelpers +{ + /// + /// Creates a relative path from one file or folder to another. + /// + /// Contains the directory that defines the start of the relative path. + /// Contains the path that defines the endpoint of the relative path. + /// The relative path from the start directory to the end path. + /// or is null. + /// + /// + internal static string GetRelativePath(string fromPath, string toPath) + { + if (string.IsNullOrEmpty(fromPath)) + { + throw new ArgumentNullException("fromPath"); + } + + if (string.IsNullOrEmpty(toPath)) + { + throw new ArgumentNullException("toPath"); + } + + Uri fromUri = new Uri(AppendDirectorySeparatorChar(fromPath)); + Uri toUri = new Uri(AppendDirectorySeparatorChar(toPath)); + + if (fromUri.Scheme != toUri.Scheme) + { + return toPath; + } + + Uri relativeUri = fromUri.MakeRelativeUri(toUri); + string relativePath = Uri.UnescapeDataString(relativeUri.ToString()); + + if (string.Equals(toUri.Scheme, Uri.UriSchemeFile, StringComparison.OrdinalIgnoreCase)) + { + relativePath = relativePath.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar); + } + + return relativePath; + } + + private static string AppendDirectorySeparatorChar(string path) + { + // Append a slash only if the path is a directory and does not have a slash. + if (!Path.HasExtension(path) && + !path.EndsWith(Path.DirectorySeparatorChar.ToString())) + { + return path + Path.DirectorySeparatorChar; + } + + return path; + } +} \ No newline at end of file diff --git a/SpaceWarp/SpaceWarpManager.cs b/SpaceWarp/SpaceWarpManager.cs index 2bd18b6c..cf8a992e 100644 --- a/SpaceWarp/SpaceWarpManager.cs +++ b/SpaceWarp/SpaceWarpManager.cs @@ -4,7 +4,7 @@ using BepInEx.Logging; using Newtonsoft.Json; using UnityEngine; -using SpaceWarp.API.AssetBundles; +using SpaceWarp.API.Assets; using SpaceWarp.API.Mods; using SpaceWarp.API.Mods.JSON; using SpaceWarp.UI; From 3f99920a033489cf2f3ca0506e69f892318b6b47 Mon Sep 17 00:00:00 2001 From: Lexi Date: Thu, 2 Mar 2023 16:19:14 -0500 Subject: [PATCH 05/29] Abstract out game state changing, and main menu buttons --- SpaceWarp/API/Game/StateChanges.cs | 204 ++++++++++++++++++ SpaceWarp/API/UI/MainMenu.cs | 14 ++ SpaceWarp/API/UI/Toolbar/Toolbar.cs | 10 +- .../UI/Toolbar/ToolbarBackend.cs | 2 +- SpaceWarp/Patching/BootstrapPatch.cs | 5 + SpaceWarp/Patching/MainMenuPatcher.cs | 29 +-- SpaceWarp/SpaceWarpManager.cs | 1 + SpaceWarp/SpaceWarpPlugin.cs | 28 ++- 8 files changed, 272 insertions(+), 21 deletions(-) create mode 100644 SpaceWarp/API/Game/StateChanges.cs create mode 100644 SpaceWarp/API/UI/MainMenu.cs rename SpaceWarp/{API => Backend}/UI/Toolbar/ToolbarBackend.cs (98%) diff --git a/SpaceWarp/API/Game/StateChanges.cs b/SpaceWarp/API/Game/StateChanges.cs new file mode 100644 index 00000000..52fc177e --- /dev/null +++ b/SpaceWarp/API/Game/StateChanges.cs @@ -0,0 +1,204 @@ +using System; +using KSP.Game; +using KSP.Messages; +using UnityEngine; + +namespace SpaceWarp.API.Game; + +public static class StateChanges +{ + #region Entering States + + public static event Action InvalidStateEntered; + public static event System.Action WarmUpLoadingStateEntered; + public static event System.Action MainMenuStateEntered; + public static event System.Action KerbalSpaceCenterStateEntered; + public static event System.Action VehicleAssemblyBuilderEntered; + public static event System.Action BaseAssemblyEditorEntered; + public static event System.Action FlightViewEntered; + public static event System.Action ColonyViewEntered; + public static event System.Action Map3DViewEntered; + public static event System.Action PhotoModeEntered; + public static event System.Action MetricsModeEntered; + public static event System.Action PlanetViewerEntered; + public static event System.Action LoadingEntered; + public static event System.Action TrainingCenterEntered; + public static event System.Action MissionControlEntered; + public static event System.Action TrackingStationEntered; + public static event System.Action ResearchAndDevelopmentEntered; + public static event System.Action LaunchpadEntered; + public static event System.Action RunwayEntered; + public static event System.Action FlagEntered; + + #endregion + + #region Leaving States + + public static event System.Action InvalidStateLeft; + public static event System.Action WarmUpLoadingStateLeft; + public static event System.Action MainMenuStateLeft; + public static event System.Action KerbalSpaceCenterStateLeft; + public static event System.Action VehicleAssemblyBuilderLeft; + public static event System.Action BaseAssemblyEditorLeft; + public static event System.Action FlightViewLeft; + public static event System.Action ColonyViewLeft; + public static event System.Action PhotoModeLeft; + public static event System.Action Map3DViewLeft; + public static event System.Action MetricsModeLeft; + public static event System.Action PlanetViewerLeft; + public static event System.Action LoadingLeft; + public static event System.Action TrainingCenterLeft; + public static event System.Action MissionControlLeft; + public static event System.Action TrackingStationLeft; + public static event System.Action ResearchAndDevelopmentLeft; + public static event System.Action LaunchpadLeft; + public static event System.Action RunwayLeft; + public static event System.Action FlagLeft; + + #endregion + + #region State Handling + + internal static void OnGameStateEntered(MessageCenterMessage message) + { + GameStateEnteredMessage msg = message as GameStateEnteredMessage; + switch (msg!.StateBeingEntered) + { + case GameState.Invalid: + InvalidStateEntered?.Invoke(msg); + break; + case GameState.WarmUpLoading: + WarmUpLoadingStateEntered?.Invoke(msg); + break; + case GameState.MainMenu: + MainMenuStateEntered?.Invoke(msg); + break; + case GameState.KerbalSpaceCenter: + KerbalSpaceCenterStateEntered?.Invoke(msg); + break; + case GameState.VehicleAssemblyBuilder: + VehicleAssemblyBuilderEntered?.Invoke(msg); + break; + case GameState.BaseAssemblyEditor: + BaseAssemblyEditorEntered?.Invoke(msg); + break; + case GameState.FlightView: + FlightViewEntered?.Invoke(msg); + break; + case GameState.ColonyView: + ColonyViewEntered?.Invoke(msg); + break; + case GameState.Map3DView: + Map3DViewEntered?.Invoke(msg); + break; + case GameState.PhotoMode: + PhotoModeEntered?.Invoke(msg); + break; + case GameState.MetricsMode: + MetricsModeEntered?.Invoke(msg); + break; + case GameState.PlanetViewer: + PlanetViewerEntered?.Invoke(msg); + break; + case GameState.Loading: + LoadingEntered?.Invoke(msg); + break; + case GameState.TrainingCenter: + TrainingCenterEntered?.Invoke(msg); + break; + case GameState.MissionControl: + MissionControlEntered?.Invoke(msg); + break; + case GameState.TrackingStation: + TrackingStationEntered?.Invoke(msg); + break; + case GameState.ResearchAndDevelopment: + ResearchAndDevelopmentEntered?.Invoke(msg); + break; + case GameState.Launchpad: + LaunchpadEntered?.Invoke(msg); + break; + case GameState.Runway: + RunwayEntered?.Invoke(msg); + break; + case GameState.Flag: + FlagEntered?.Invoke(msg); + break; + default: + throw new ArgumentOutOfRangeException(); + } + } + + + internal static void OnGameStateLeft(MessageCenterMessage message) + { + GameStateLeftMessage msg = message as GameStateLeftMessage; + switch (msg!.StateBeingLeft) + { + case GameState.Invalid: + InvalidStateLeft?.Invoke(msg); + break; + case GameState.WarmUpLoading: + WarmUpLoadingStateLeft?.Invoke(msg); + break; + case GameState.MainMenu: + MainMenuStateLeft?.Invoke(msg); + break; + case GameState.KerbalSpaceCenter: + KerbalSpaceCenterStateLeft?.Invoke(msg); + break; + case GameState.VehicleAssemblyBuilder: + VehicleAssemblyBuilderLeft?.Invoke(msg); + break; + case GameState.BaseAssemblyEditor: + BaseAssemblyEditorLeft?.Invoke(msg); + break; + case GameState.FlightView: + FlightViewLeft?.Invoke(msg); + break; + case GameState.ColonyView: + ColonyViewLeft?.Invoke(msg); + break; + case GameState.Map3DView: + Map3DViewLeft?.Invoke(msg); + break; + case GameState.PhotoMode: + PhotoModeLeft?.Invoke(msg); + break; + case GameState.MetricsMode: + MetricsModeLeft?.Invoke(msg); + break; + case GameState.PlanetViewer: + PlanetViewerLeft?.Invoke(msg); + break; + case GameState.Loading: + LoadingLeft?.Invoke(msg); + break; + case GameState.TrainingCenter: + TrainingCenterLeft?.Invoke(msg); + break; + case GameState.MissionControl: + MissionControlLeft?.Invoke(msg); + break; + case GameState.TrackingStation: + TrackingStationLeft?.Invoke(msg); + break; + case GameState.ResearchAndDevelopment: + ResearchAndDevelopmentLeft?.Invoke(msg); + break; + case GameState.Launchpad: + LaunchpadLeft?.Invoke(msg); + break; + case GameState.Runway: + RunwayLeft?.Invoke(msg); + break; + case GameState.Flag: + FlagLeft?.Invoke(msg); + break; + default: + throw new ArgumentOutOfRangeException(); + } + } + + #endregion +} \ No newline at end of file diff --git a/SpaceWarp/API/UI/MainMenu.cs b/SpaceWarp/API/UI/MainMenu.cs new file mode 100644 index 00000000..6e977cae --- /dev/null +++ b/SpaceWarp/API/UI/MainMenu.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; + +namespace SpaceWarp.API.UI; + +public static class MainMenu +{ + internal static List<(string name, Action onClicked)> MenuButtonsToBeAdded = new (); + + public static void RegisterMenuButton(string name, Action onClicked) + { + MenuButtonsToBeAdded.Add((name,onClicked)); + } +} \ No newline at end of file diff --git a/SpaceWarp/API/UI/Toolbar/Toolbar.cs b/SpaceWarp/API/UI/Toolbar/Toolbar.cs index 5cf888fe..85bcca02 100644 --- a/SpaceWarp/API/UI/Toolbar/Toolbar.cs +++ b/SpaceWarp/API/UI/Toolbar/Toolbar.cs @@ -2,12 +2,14 @@ using System.Collections.Generic; using BepInEx.Bootstrap; using UnityEngine; +using SpaceWarp.Backend.UI.Toolbar; + namespace SpaceWarp.API.UI.Toolbar; public static class Toolbar { - private static readonly List<(string text, Sprite icon, string ID, Action action)> _buttonsToBeLoaded = new(); + private static readonly List<(string text, Sprite icon, string ID, Action action)> ButtonsToBeLoaded = new(); public static T RegisterGameToolbarMenu(string text, string title, string id, Sprite icon) where T : ToolbarMenu { @@ -17,14 +19,14 @@ public static T RegisterGameToolbarMenu(string text, string title, string id, menu.Title = title; toolBarUIObject.transform.SetParent(Chainloader.ManagerObject.transform); toolBarUIObject.SetActive(true); - _buttonsToBeLoaded.Add((text, icon, id, menu.ToggleGUI)); + ButtonsToBeLoaded.Add((text, icon, id, menu.ToggleGUI)); return menu as T; } public static T RegisterGameToolbarMenu(string text, string title, string id, Texture2D icon) where T : ToolbarMenu => RegisterGameToolbarMenu(text, title, id, GetToolBarIconFromTexture(icon)); - public static void RegisterAppButton(string text, string id, Sprite icon, Action func) => _buttonsToBeLoaded.Add((text ,icon, id, func)); + public static void RegisterAppButton(string text, string id, Sprite icon, Action func) => ButtonsToBeLoaded.Add((text ,icon, id, func)); public static void RegisterAppButton(string text, string id, Texture2D icon, Action func) => RegisterAppButton(text, id, GetToolBarIconFromTexture(icon), func); @@ -40,7 +42,7 @@ public static Sprite GetToolBarIconFromTexture(Texture2D texture, int width=0,in internal static void LoadAllButtons() { - foreach (var button in _buttonsToBeLoaded) + foreach (var button in ButtonsToBeLoaded) { ToolbarBackend.AddButton(button.text, button.icon, button.ID, button.action); } diff --git a/SpaceWarp/API/UI/Toolbar/ToolbarBackend.cs b/SpaceWarp/Backend/UI/Toolbar/ToolbarBackend.cs similarity index 98% rename from SpaceWarp/API/UI/Toolbar/ToolbarBackend.cs rename to SpaceWarp/Backend/UI/Toolbar/ToolbarBackend.cs index fc6ac7ce..f0f8e566 100644 --- a/SpaceWarp/API/UI/Toolbar/ToolbarBackend.cs +++ b/SpaceWarp/Backend/UI/Toolbar/ToolbarBackend.cs @@ -17,7 +17,7 @@ using UnityEngine.UI; using Object = UnityEngine.Object; -namespace SpaceWarp.API.UI.Toolbar; +namespace SpaceWarp.Backend.UI.Toolbar; internal static class ToolbarBackend { diff --git a/SpaceWarp/Patching/BootstrapPatch.cs b/SpaceWarp/Patching/BootstrapPatch.cs index bcb96a3e..c012080d 100644 --- a/SpaceWarp/Patching/BootstrapPatch.cs +++ b/SpaceWarp/Patching/BootstrapPatch.cs @@ -1,7 +1,9 @@ using HarmonyLib; using KSP.Game; +using KSP.Messages; using MonoMod.Cil; using SpaceWarp.Patching.LoadingActions; +using SpaceWarp.API.Game; namespace SpaceWarp.Patching; @@ -40,6 +42,9 @@ private static void PatchInitializationsIL(ILContext il, ILLabel endLabel) c.EmitDelegate(static () => { var flow = GameManager.Instance.LoadingFlow; + + GameManager.Instance.Game.Messages.Subscribe(typeof(GameStateEnteredMessage), StateChanges.OnGameStateEntered,false,true); + GameManager.Instance.Game.Messages.Subscribe(typeof(GameStateLeftMessage), StateChanges.OnGameStateLeft,false,true); flow.AddAction(new LoadSpaceWarpLocalizationsAction()); flow.AddAction(new LoadSpaceWarpAddressablesAction()); flow.AddAction(new SpaceWarpAssetInitializationAction()); diff --git a/SpaceWarp/Patching/MainMenuPatcher.cs b/SpaceWarp/Patching/MainMenuPatcher.cs index 2f957538..376fc22c 100644 --- a/SpaceWarp/Patching/MainMenuPatcher.cs +++ b/SpaceWarp/Patching/MainMenuPatcher.cs @@ -1,5 +1,6 @@ using HarmonyLib; using KSP.Api.CoreTypes; +using SpaceWarp.API.UI; using TMPro; using UnityEngine; @@ -15,21 +16,25 @@ public static void Postfix(KSP.Game.StartupFlow.LandingHUD __instance) Transform singleplayerButtonTransform = menuItemsGroupTransform.FindChildEx("Singleplayer"); - GameObject modsButton = Object.Instantiate(singleplayerButtonTransform.gameObject, menuItemsGroupTransform, false); - modsButton.name = "Mods"; + foreach (var menuButtonToBeAdded in MainMenu.MenuButtonsToBeAdded) + { + GameObject newButton = + Object.Instantiate(singleplayerButtonTransform.gameObject, menuItemsGroupTransform, false); + newButton.name = menuButtonToBeAdded.name; - // Move the button to be above the Exit button. - modsButton.transform.SetSiblingIndex(modsButton.transform.GetSiblingIndex() - 1); + // Move the button to be above the Exit button. + newButton.transform.SetSiblingIndex(newButton.transform.GetSiblingIndex() - 1); - // Rebind the button's action to open the mod manager dialog. - UIAction_Void_Button uiAction = modsButton.GetComponent(); - DelegateAction action = new(); - action.BindDelegate(() => SpaceWarpManager.ModListUI.ToggleVisible()); - uiAction.BindAction(action); + // Rebind the button's action to call the action + UIAction_Void_Button uiAction = newButton.GetComponent(); + DelegateAction action = new(); + action.BindDelegate(() => menuButtonToBeAdded.onClicked.Invoke()); + uiAction.BindAction(action); - // Set the label to "Mods". - TextMeshProUGUI tmp = modsButton.GetComponentInChildren(); + // Set the label to "Mods". + TextMeshProUGUI tmp = newButton.GetComponentInChildren(); - tmp.SetText("Mods"); + tmp.SetText(menuButtonToBeAdded.name); + } } } diff --git a/SpaceWarp/SpaceWarpManager.cs b/SpaceWarp/SpaceWarpManager.cs index cf8a992e..8775e63d 100644 --- a/SpaceWarp/SpaceWarpManager.cs +++ b/SpaceWarp/SpaceWarpManager.cs @@ -56,6 +56,7 @@ public static void Initialize(SpaceWarpPlugin sw) Logger = sw.Logger; SpaceWarpFolder = Path.GetDirectoryName(sw.Info.Location); + API.UI.MainMenu.RegisterMenuButton("mods",ModListUI.ToggleVisible); } public static ModListUI ModListUI { get; internal set; } diff --git a/SpaceWarp/SpaceWarpPlugin.cs b/SpaceWarp/SpaceWarpPlugin.cs index 28fb1961..7b5fa079 100644 --- a/SpaceWarp/SpaceWarpPlugin.cs +++ b/SpaceWarp/SpaceWarpPlugin.cs @@ -1,9 +1,12 @@ global using UnityObject = UnityEngine.Object; global using System.Linq; - +using System; using BepInEx; using BepInEx.Logging; using HarmonyLib; +using KSP.Game; +using KSP.Messages; +using KSP.VFX; using SpaceWarp.UI; namespace SpaceWarp; @@ -15,14 +18,31 @@ public sealed class SpaceWarpPlugin : BaseUnityPlugin public const string ModName = "Space Warp"; public const string ModVer = MyPluginInfo.PLUGIN_VERSION; + #region KspBehaviour things + + private GameInstance Game => GameManager.Instance == null ? null : GameManager.Instance.Game; + + internal MessageCenter Messages => Game.Messages; + + // ReSharper disable Unity.NoNullPropagation + // fine because its null checked by Game properly + private ContextualFxSystem CFXSystem => Game?.GraphicsManager?.ContextualFxSystem; + + private bool IsGameShuttingDown => Game == null; + + #endregion + new internal ManualLogSource Logger => base.Logger; - + public void Awake() { BepInEx.Logging.Logger.Listeners.Add(new SpaceWarpConsoleLogListener()); - + Harmony.CreateAndPatchAll(typeof(SpaceWarpPlugin).Assembly, ModGuid); SpaceWarpManager.Initialize(this); } -} + + + +} \ No newline at end of file From deaa9622e71e500d2c644e754fddde79eaf2d60d Mon Sep 17 00:00:00 2001 From: Aaron Robinson Date: Thu, 2 Mar 2023 17:16:06 -0600 Subject: [PATCH 06/29] Fix RTLE and make spacewarp use BaseSpaceWarpPlugin --- ExampleMod/ExampleMod.cs | 3 +- SpaceWarp/API/Game/StateChanges.cs | 1 - SpaceWarp/Compilation/ModCompiler.cs | 131 ------------------ SpaceWarp/Patching/BootstrapPatch.cs | 9 -- SpaceWarp/Patching/FixGetTypes.cs | 28 ++++ SpaceWarp/Patching/FixMessageDiscovery.cs | 53 ------- .../InitializeSpaceWarpUIAction.cs | 39 ------ .../LoadSpaceWarpAddressablesAction.cs | 31 ----- .../LoadSpaceWarpAssetsAction.cs | 52 ------- .../LoadSpaceWarpLocalizationsAction.cs | 32 ----- SpaceWarp/SpaceWarpManager.cs | 4 +- SpaceWarp/SpaceWarpPlugin.cs | 52 ++++--- SpaceWarp/swinfo.json | 13 ++ 13 files changed, 77 insertions(+), 371 deletions(-) delete mode 100644 SpaceWarp/Compilation/ModCompiler.cs create mode 100644 SpaceWarp/Patching/FixGetTypes.cs delete mode 100644 SpaceWarp/Patching/FixMessageDiscovery.cs delete mode 100644 SpaceWarp/Patching/LoadingActions/InitializeSpaceWarpUIAction.cs delete mode 100644 SpaceWarp/Patching/LoadingActions/LoadSpaceWarpAddressablesAction.cs delete mode 100644 SpaceWarp/Patching/LoadingActions/LoadSpaceWarpAssetsAction.cs delete mode 100644 SpaceWarp/Patching/LoadingActions/LoadSpaceWarpLocalizationsAction.cs create mode 100644 SpaceWarp/swinfo.json diff --git a/ExampleMod/ExampleMod.cs b/ExampleMod/ExampleMod.cs index 4367e24e..bb93c945 100644 --- a/ExampleMod/ExampleMod.cs +++ b/ExampleMod/ExampleMod.cs @@ -1,5 +1,4 @@ -using System.IO; -using BepInEx; +using BepInEx; using SpaceWarp.API.Mods; using SpaceWarp.API.Assets; using KSP.UI.Binding; diff --git a/SpaceWarp/API/Game/StateChanges.cs b/SpaceWarp/API/Game/StateChanges.cs index 52fc177e..43404f7c 100644 --- a/SpaceWarp/API/Game/StateChanges.cs +++ b/SpaceWarp/API/Game/StateChanges.cs @@ -1,7 +1,6 @@ using System; using KSP.Game; using KSP.Messages; -using UnityEngine; namespace SpaceWarp.API.Game; diff --git a/SpaceWarp/Compilation/ModCompiler.cs b/SpaceWarp/Compilation/ModCompiler.cs deleted file mode 100644 index c120f693..00000000 --- a/SpaceWarp/Compilation/ModCompiler.cs +++ /dev/null @@ -1,131 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Reflection; -using BepInEx; -using BepInEx.Logging; -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; - -namespace SpaceWarp.Compilation; - -public static class ModCompiler -{ - public static readonly string CACHE_LOCATION = Path.Combine(Paths.CachePath, "compilation_cache"); - - private static ManualLogSource _logger = Logger.CreateLogSource("Roslyn Compilation"); - public static Assembly CompileMod(string modID, string modSrcPath) - { - try - { - if (!Directory.Exists(modSrcPath)) - { - return null; - } - _logger.LogInfo($"starting compilation of {modID}"); - - if (!CreateNewCompilation(modID, modSrcPath)) - { - _logger.LogInfo($"found cached version of {modID}"); - return GetCachedCompilation(modID); - } - - _logger.LogInfo($"no cached version for {modID}, generating assembly"); - - // Now work on adding dependencies to the tree - return CompileNewAssemblyAndCache(modID, modSrcPath); - } - catch (Exception e) - { - _logger.LogError($"error compiling scripts for {modID}\n{e}"); - return null; - } - } - - private static string[] AllSourceFiles(string modSrcPath) - { - DirectoryInfo directoryInfo = new DirectoryInfo(modSrcPath); - string[] sourceFiles = directoryInfo.EnumerateFiles("*.cs", SearchOption.AllDirectories) - .Select(fileInfo => fileInfo.FullName) - .ToArray(); - return sourceFiles; - } - - private static bool CreateNewCompilation(string modID, string modSrcPath) - { - string[] allSourceFiles = AllSourceFiles(modSrcPath); - DateTime latestWriteTime = DateTime.FromBinary(0); - foreach (var sourceFile in allSourceFiles) - { - if (File.GetLastWriteTime(sourceFile) > latestWriteTime) - { - latestWriteTime = File.GetLastWriteTime(sourceFile); - } - } - - if (!Directory.Exists(CACHE_LOCATION)) - { - Directory.CreateDirectory(CACHE_LOCATION); - return true; - } - - if (!File.Exists(Path.Combine(CACHE_LOCATION,modID + ".dll"))) - { - return true; - } - - if (File.GetLastWriteTime(Path.Combine(CACHE_LOCATION,modID + ".dll")) < latestWriteTime) - { - return true; - } - - return false; - } - - private static Assembly GetCachedCompilation(string modID) - { - return Assembly.LoadFrom(Path.Combine(CACHE_LOCATION,modID + ".dll")); - } - - private static Assembly CompileNewAssemblyAndCache(string modID, string modSrcPath) - { - string[] allSourceFiles = AllSourceFiles(modSrcPath); - List trees = Enumerable.ToList( - Enumerable.Select( - Enumerable.Select(allSourceFiles, File.ReadAllText), - code => CSharpSyntaxTree.ParseText(code) - ) - ); - - List references = Enumerable.ToList( - Enumerable.Cast( - from asm in AppDomain.CurrentDomain.GetAssemblies() - where !asm.IsDynamic - select MetadataReference.CreateFromFile(asm.Location) - ) - ); - - var compilation = CSharpCompilation.Create(modID + ".dll", trees, references, - new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary, allowUnsafe: true)); - - var result = compilation.Emit(Path.Combine(CACHE_LOCATION,modID + ".dll")); - foreach (Diagnostic diagnostic in result.Diagnostics) - { - if (diagnostic.WarningLevel == 0) - { - _logger.LogError(diagnostic.ToString()); - } - else - { - _logger.LogInfo(diagnostic.ToString()); - } - } - - _logger.LogInfo(result.ToString()); - if (!result.Success) - { - File.Delete(Path.Combine(CACHE_LOCATION,modID + ".dll")); - } - return !result.Success ? null : Assembly.LoadFile(Path.Combine(CACHE_LOCATION,modID + ".dll")); - } -} \ No newline at end of file diff --git a/SpaceWarp/Patching/BootstrapPatch.cs b/SpaceWarp/Patching/BootstrapPatch.cs index c012080d..d6b34367 100644 --- a/SpaceWarp/Patching/BootstrapPatch.cs +++ b/SpaceWarp/Patching/BootstrapPatch.cs @@ -1,9 +1,7 @@ using HarmonyLib; using KSP.Game; -using KSP.Messages; using MonoMod.Cil; using SpaceWarp.Patching.LoadingActions; -using SpaceWarp.API.Game; namespace SpaceWarp.Patching; @@ -42,13 +40,6 @@ private static void PatchInitializationsIL(ILContext il, ILLabel endLabel) c.EmitDelegate(static () => { var flow = GameManager.Instance.LoadingFlow; - - GameManager.Instance.Game.Messages.Subscribe(typeof(GameStateEnteredMessage), StateChanges.OnGameStateEntered,false,true); - GameManager.Instance.Game.Messages.Subscribe(typeof(GameStateLeftMessage), StateChanges.OnGameStateLeft,false,true); - flow.AddAction(new LoadSpaceWarpLocalizationsAction()); - flow.AddAction(new LoadSpaceWarpAddressablesAction()); - flow.AddAction(new SpaceWarpAssetInitializationAction()); - flow.AddAction(new InitializeSpaceWarpUIAction()); foreach (var plugin in SpaceWarpManager.SpaceWarpPlugins) { diff --git a/SpaceWarp/Patching/FixGetTypes.cs b/SpaceWarp/Patching/FixGetTypes.cs new file mode 100644 index 00000000..76b666a4 --- /dev/null +++ b/SpaceWarp/Patching/FixGetTypes.cs @@ -0,0 +1,28 @@ +using System; +using System.Reflection; +using HarmonyLib; + +namespace SpaceWarp.Patching; + +[HarmonyPatch] +internal static class FixGetTypes +{ + [HarmonyFinalizer] + [HarmonyPatch(typeof(Assembly), nameof(Assembly.GetTypes), new Type[0])] + [HarmonyPatch(typeof(Assembly), nameof(Assembly.GetExportedTypes))] + private static Exception GetTypesFix(Exception __exception, Assembly __instance, ref Type[] __result) + { + if (__exception is ReflectionTypeLoadException rtle) + { + SpaceWarpManager.Logger.LogWarning($"Types failed to load from assembly {__instance.FullName} due to the reasons below, continuing anyway."); + SpaceWarpManager.Logger.LogWarning($"Exception: {__exception}"); + foreach (var e in rtle.LoaderExceptions) + { + SpaceWarpManager.Logger.LogWarning(e.ToString()); + } + __result = rtle.Types.Where(t => t != null).ToArray(); + return null; + } + return __exception; + } +} diff --git a/SpaceWarp/Patching/FixMessageDiscovery.cs b/SpaceWarp/Patching/FixMessageDiscovery.cs deleted file mode 100644 index 0b5f0d9c..00000000 --- a/SpaceWarp/Patching/FixMessageDiscovery.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Reflection; -using HarmonyLib; -using KSP.Game; -using KSP.Messages; -using KSP.Logging; - -namespace SpaceWarp.Patching; - -[HarmonyPatch] -internal static class FixMessageDiscovery -{ - [HarmonyPrefix] - [HarmonyPatch(typeof(MessageDiscovery), nameof(MessageDiscovery.Initialize))] - private static bool InitializeReplacement() - { - if (MessageDiscovery._initialized) - { - return false; - } - Type[] types = typeof(GameManager).Assembly.GetTypes(); - foreach (Type type in types) - { - try - { - if (type.GetCustomAttribute(typeof(DiscoverableMessage), inherit: false) is DiscoverableMessage discoverableMessage) - { - if (MessageDiscovery._discoveryNameTypeCache.ContainsKey(discoverableMessage.discoveryName)) - { - GlobalLog.Error("More than one Discoverable Message is using the discoveryName of " + discoverableMessage.discoveryName + ". This is probably unintended!"); - } - MessageDiscovery._discoveryNameTypeCache[discoverableMessage.discoveryName] = type; - } - } - catch (Exception ex) - { - GlobalLog.Error("MessageDiscovery: Initialize: " + ex.Message); - } - } - MessageDiscovery.DiscoveryNamesSorted = new string[MessageDiscovery._discoveryNameTypeCache.Count]; - int num = 0; - foreach (KeyValuePair item in MessageDiscovery._discoveryNameTypeCache) - { - MessageDiscovery.DiscoveryNamesSorted[num] = item.Key; - num++; - } - Array.Sort(MessageDiscovery.DiscoveryNamesSorted); - MessageDiscovery._initialized = true; - - return false; - } -} diff --git a/SpaceWarp/Patching/LoadingActions/InitializeSpaceWarpUIAction.cs b/SpaceWarp/Patching/LoadingActions/InitializeSpaceWarpUIAction.cs deleted file mode 100644 index c81a419f..00000000 --- a/SpaceWarp/Patching/LoadingActions/InitializeSpaceWarpUIAction.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System; -using BepInEx.Bootstrap; -using KSP.Game.Flow; -using SpaceWarp.UI; -using UnityEngine; - -namespace SpaceWarp.Patching.LoadingActions; - -internal sealed class InitializeSpaceWarpUIAction : FlowAction -{ - public InitializeSpaceWarpUIAction() : base("Loading Space Warp UI") { } - - public override void DoAction(Action resolve, Action reject) - { - try - { - GameObject modUIObject = new GameObject("Space Warp Mod UI"); - modUIObject.Persist(); - - modUIObject.transform.SetParent(Chainloader.ManagerObject.transform); - SpaceWarpManager.ModListUI = modUIObject.AddComponent(); - - modUIObject.SetActive(true); - - GameObject consoleUIObject = new GameObject("Space Warp Console"); - consoleUIObject.Persist(); - consoleUIObject.transform.SetParent(Chainloader.ManagerObject.transform); - SpaceWarpConsole con = consoleUIObject.AddComponent(); - consoleUIObject.SetActive(true); - - resolve(); - } - catch (Exception e) - { - SpaceWarpManager.Logger.LogError(e.ToString()); - reject(null); - } - } -} diff --git a/SpaceWarp/Patching/LoadingActions/LoadSpaceWarpAddressablesAction.cs b/SpaceWarp/Patching/LoadingActions/LoadSpaceWarpAddressablesAction.cs deleted file mode 100644 index a0cae196..00000000 --- a/SpaceWarp/Patching/LoadingActions/LoadSpaceWarpAddressablesAction.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using System.IO; -using KSP.Game.Flow; - -namespace SpaceWarp.Patching.LoadingActions; - -internal sealed class LoadSpaceWarpAddressablesAction : FlowAction -{ - public LoadSpaceWarpAddressablesAction() : base("Initializing Space Warp Provided Addressables") - { - } - - public override void DoAction(Action resolve, Action reject) - { - try - { - string addressablesPath = Path.Combine(SpaceWarpManager.SpaceWarpFolder, "addressables"); - string catalogPath = Path.Combine(addressablesPath, "catalog.json"); - if (File.Exists(catalogPath)) - { - AssetHelpers.LoadAddressable(catalogPath); - } - resolve(); - } - catch (Exception e) - { - SpaceWarpManager.Logger.LogError(e.ToString()); - reject(null); - } - } -} diff --git a/SpaceWarp/Patching/LoadingActions/LoadSpaceWarpAssetsAction.cs b/SpaceWarp/Patching/LoadingActions/LoadSpaceWarpAssetsAction.cs deleted file mode 100644 index 630ca012..00000000 --- a/SpaceWarp/Patching/LoadingActions/LoadSpaceWarpAssetsAction.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; -using System.IO; -using BepInEx.Logging; -using KSP.Game.Flow; -using SpaceWarp.API.Assets; -using SpaceWarp.API.Mods; -using UnityEngine; - -namespace SpaceWarp.Patching.LoadingActions; - -internal sealed class SpaceWarpAssetInitializationAction : FlowAction -{ - private static readonly ManualLogSource Logger = BepInEx.Logging.Logger.CreateLogSource("Space Warp Asset Loader"); - - public SpaceWarpAssetInitializationAction() : base("Initializing Space Warp Provided Assets") - { - } - - public override void DoAction(Action resolve, Action reject) - { - try - { - string bundlesPath = Path.Combine(SpaceWarpManager.SpaceWarpFolder, GlobalModDefines.AssetBundlesFolder); - - if (Directory.Exists(bundlesPath)) - { - foreach (string file in Directory.GetFiles(bundlesPath)) - { - Logger.LogInfo($"Found space warp asset file {file}"); - string assetBundleName = Path.GetFileNameWithoutExtension(file); - if (Path.GetExtension(file) != ".bundle") continue; - - AssetBundle assetBundle = AssetBundle.LoadFromFile(file); - - if (assetBundle == null) - { - Logger.LogError($"Failed to load Space Warp AssetBundle {assetBundleName}"); - continue; - } - AssetManager.RegisterAssetBundle("space_warp", assetBundleName, assetBundle); - Logger.LogInfo($"Loaded Space Warp AssetBundle {assetBundleName}"); - } - } - resolve(); - } - catch (Exception e) - { - SpaceWarpManager.Logger.LogError(e.ToString()); - reject(null); - } - } -} \ No newline at end of file diff --git a/SpaceWarp/Patching/LoadingActions/LoadSpaceWarpLocalizationsAction.cs b/SpaceWarp/Patching/LoadingActions/LoadSpaceWarpLocalizationsAction.cs deleted file mode 100644 index 34c7408b..00000000 --- a/SpaceWarp/Patching/LoadingActions/LoadSpaceWarpLocalizationsAction.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.IO; -using KSP.Game.Flow; - -namespace SpaceWarp.Patching.LoadingActions; - -public class LoadSpaceWarpLocalizationsAction : FlowAction -{ - public LoadSpaceWarpLocalizationsAction() : base("Loading Space Warp localizations") - { - } - - public override void DoAction(Action resolve, Action reject) - { - try - { - if (I2.Loc.LocalizationManager.Sources.Count == 0) - { - I2.Loc.LocalizationManager.UpdateSources(); - } - - string localizationsPath = Path.Combine(SpaceWarpManager.SpaceWarpFolder, "localizations"); - AssetHelpers.LoadLocalizationFromFolder(localizationsPath); - resolve(); - } - catch (Exception e) - { - SpaceWarpManager.Logger.LogError(e.ToString()); - reject(null); - } - } -} \ No newline at end of file diff --git a/SpaceWarp/SpaceWarpManager.cs b/SpaceWarp/SpaceWarpManager.cs index 8775e63d..53ed0566 100644 --- a/SpaceWarp/SpaceWarpManager.cs +++ b/SpaceWarp/SpaceWarpManager.cs @@ -56,7 +56,6 @@ public static void Initialize(SpaceWarpPlugin sw) Logger = sw.Logger; SpaceWarpFolder = Path.GetDirectoryName(sw.Info.Location); - API.UI.MainMenu.RegisterMenuButton("mods",ModListUI.ToggleVisible); } public static ModListUI ModListUI { get; internal set; } @@ -67,7 +66,8 @@ public static GUISkin Skin { get { - AssetManager.TryGetAsset("space_warp/swconsoleui/spacewarpconsole.guiskin", out _skin); + if (!_skin) + AssetManager.TryGetAsset("spacewarp/swconsoleui/spacewarpconsole.guiskin", out _skin); return _skin; } } diff --git a/SpaceWarp/SpaceWarpPlugin.cs b/SpaceWarp/SpaceWarpPlugin.cs index 7b5fa079..dc6e79c6 100644 --- a/SpaceWarp/SpaceWarpPlugin.cs +++ b/SpaceWarp/SpaceWarpPlugin.cs @@ -1,37 +1,24 @@ global using UnityObject = UnityEngine.Object; global using System.Linq; -using System; using BepInEx; +using BepInEx.Bootstrap; using BepInEx.Logging; using HarmonyLib; -using KSP.Game; using KSP.Messages; -using KSP.VFX; +using SpaceWarp.API.Game; +using SpaceWarp.API.Mods; using SpaceWarp.UI; +using UnityEngine; namespace SpaceWarp; [BepInPlugin(ModGuid, ModName, ModVer)] -public sealed class SpaceWarpPlugin : BaseUnityPlugin +public sealed class SpaceWarpPlugin : BaseSpaceWarpPlugin { public const string ModGuid = "com.github.x606.spacewarp"; public const string ModName = "Space Warp"; public const string ModVer = MyPluginInfo.PLUGIN_VERSION; - #region KspBehaviour things - - private GameInstance Game => GameManager.Instance == null ? null : GameManager.Instance.Game; - - internal MessageCenter Messages => Game.Messages; - - // ReSharper disable Unity.NoNullPropagation - // fine because its null checked by Game properly - private ContextualFxSystem CFXSystem => Game?.GraphicsManager?.ContextualFxSystem; - - private bool IsGameShuttingDown => Game == null; - - #endregion - new internal ManualLogSource Logger => base.Logger; public void Awake() @@ -43,6 +30,33 @@ public void Awake() SpaceWarpManager.Initialize(this); } - + public override void OnInitialized() + { + base.OnInitialized(); + + Game.Messages.Subscribe(typeof(GameStateEnteredMessage), StateChanges.OnGameStateEntered,false,true); + Game.Messages.Subscribe(typeof(GameStateLeftMessage), StateChanges.OnGameStateLeft,false,true); + + InitializeUI(); + } + + private void InitializeUI() + { + GameObject modUIObject = new("Space Warp Mod UI"); + modUIObject.Persist(); + + modUIObject.transform.SetParent(this.transform); + SpaceWarpManager.ModListUI = modUIObject.AddComponent(); + + modUIObject.SetActive(true); + + GameObject consoleUIObject = new("Space Warp Console"); + consoleUIObject.Persist(); + consoleUIObject.transform.SetParent(Chainloader.ManagerObject.transform); + consoleUIObject.AddComponent(); + consoleUIObject.SetActive(true); + + API.UI.MainMenu.RegisterMenuButton("mods", SpaceWarpManager.ModListUI.ToggleVisible); + } } \ No newline at end of file diff --git a/SpaceWarp/swinfo.json b/SpaceWarp/swinfo.json new file mode 100644 index 00000000..1b358397 --- /dev/null +++ b/SpaceWarp/swinfo.json @@ -0,0 +1,13 @@ +{ + "mod_id": "SpaceWarp", + "name": "Space Warp", + "author": "Space-Warp Team", + "description": "Space-Warp is an API for KSP2 mod developers.", + "source": "https://github.com/SpaceWarpDev/SpaceWarp/tree/main/ExampleMod", + "version": "0.4.0", + "dependencies": [], + "ksp2_version": { + "min": "0", + "max": "*" + } +} From f18bed368ff23b90154fb5a81361b1df505f6c07 Mon Sep 17 00:00:00 2001 From: Lexi Date: Thu, 2 Mar 2023 20:12:51 -0500 Subject: [PATCH 07/29] Added mod ui Updated build system Cleaned up root directory --- ModTemplateGenerator.py | 299 -------- SpaceWarp/UI/ModListUI.cs | 63 +- .../assets/bundles}/README.md | 0 .../assets/bundles}/swconsoleui.bundle | Bin .../swinfo.json | 2 +- TemplateGenV2.py | 703 ------------------ builder.py | 127 +--- example_mod_info.json | 21 - 8 files changed, 53 insertions(+), 1162 deletions(-) delete mode 100644 ModTemplateGenerator.py rename {Bundles => SpaceWarpBuildTemplate/assets/bundles}/README.md (100%) rename {Bundles => SpaceWarpBuildTemplate/assets/bundles}/swconsoleui.bundle (100%) rename {SpaceWarp => SpaceWarpBuildTemplate}/swinfo.json (76%) delete mode 100644 TemplateGenV2.py delete mode 100644 example_mod_info.json diff --git a/ModTemplateGenerator.py b/ModTemplateGenerator.py deleted file mode 100644 index c37681b1..00000000 --- a/ModTemplateGenerator.py +++ /dev/null @@ -1,299 +0,0 @@ -# -------------------------------------- # -# KSP2 Space Warp Mod Template Generator # -# -------------------------------------- # -import shutil, json -from xml.dom import minidom - -# Generates a structure like the following -# mod_project -# mod_id -# modinfo.json -# README.md -# assets/ -# parts/ -# models/ -# resources/ -# bin/ -# config/ -# ModId -# Mod.cs -# Config.cs -# mod_project.csproj -# external_dlls/ -# .gitignore -# .gitignore -# -# -# .gitignore -# *.rsuser -# *.suo -# *.user -# *.userosscache -# *.sln.docstates -# *.userprefs -# mono_crash.* -# [Dd]ebug/ -# [Dd]ebugPublic/ -# [Rr]elease/ -# [Rr]eleases/ -# x64/ -# x86/ -# [Aa][Rr][Mm]/ -# [Aa][Rr][Mm]64/ -# bld/ -# [Bb]in/ -# [Oo]bj/ -# [Ll]og/ -# [Ll]ogs/ -# -# external_dlls/.gitignore -# * -# !.gitignore - -import os -from os.path import expanduser - - -def find_ksp2_install_path(): - # Checks if Operating System is NOT Windows - if os.path != "nt": - steam_install_folder = "" - return steam_install_folder - else: - # Look for the game in Steam library folders - steam_path = os.path.join(os.getenv("ProgramFiles(x86)"), "Steam") - steam_library_folders_file = os.path.join( - steam_path, "steamapps", "libraryfolders.vdf" - ) - steam_install_folder = os.path.join( - steam_path, "steamapps", "common", "Kerbal Space Program 2" - ) - - if os.path.exists(steam_library_folders_file): - with open(steam_library_folders_file) as f: - for line in f: - if "BaseInstallFolder" in line: - steam_library_path = line.strip().split('"')[3] - if os.path.exists( - os.path.join( - steam_library_path, - "steamapps", - "appmanifest_1406800.acf", - ) - ): - steam_install_folder = os.path.join( - steam_library_path, - "steamapps", - "common", - "Kerbal Space Program 2", - ) - break - - # Look for the game in default installation path - if not os.path.exists(steam_install_folder): - default_install_folder = os.path.join( - os.getenv("ProgramFiles"), "Private Division", "Kerbal Space Program 2" - ) - if os.path.exists(default_install_folder): - steam_install_folder = default_install_folder - - return steam_install_folder - - -print("Space Warp Mod Setup Wizard") - -# while True: -# project_name = input("What would you like to name the project: ") -# if not project_name: -# print("Project name cannot be empty, please try again.") -# else: -# break - -while True: - mod_id = input("What is the ID of the mod (This should be in snake_case): ") - if not mod_id: - print("Mod ID cannot be empty, please try again.") - else: - break - -while True: - mod_author = input("Who is the author of the mod: ") - if not mod_author: - print("Mod author cannot be empty, please try again.") - else: - break - -while True: - mod_name = input("What is the name of the mod: ") - if not mod_name: - print("Mod name cannot be empty, please try again.") - else: - break - -mod_description = input("What is a short description of the mod: ") -mod_source = input("What is the source link of the mod: ") -mod_version = input("What is the starting version of the mod: ") -mod_ksp_min_version = input( - "What is the minimum version of KSP2 this mod will accept: " -) -mod_ksp_max_version = input( - "What is the maximum version of KSP2 this mod will accept: " -) - -steam_install_folder = find_ksp2_install_path() - -if os.path.exists(steam_install_folder): - print(f"Kerbal Space Program 2 is installed at {steam_install_folder}") -else: - steam_install_folder = input( - "Could not find the installation path for Kerbal Space Program 2.\nPlease enter the path to the KSP2 installation folder manually: " - ) - -managed_path = os.path.join(steam_install_folder, "KSP2_x64_Data", "Managed") -space_warp_path = os.path.join(steam_install_folder, "SpaceWarp", "core") - -mod_id_title = mod_id.replace("_", " ").title().replace(" ", "") - - -os.mkdir(mod_id) -os.mkdir(f"{mod_id}/{mod_id}") -os.mkdir(f"{mod_id}/{mod_id}/assets") -os.mkdir(f"{mod_id}/{mod_id}/assets/parts") -os.mkdir(f"{mod_id}/{mod_id}/assets/models") -os.mkdir(f"{mod_id}/{mod_id}/assets/resources") -os.mkdir(f"{mod_id}/{mod_id}/bin") -os.mkdir(f"{mod_id}/{mod_id}/config") -os.mkdir(f"{mod_id}/{mod_id_title}Project") -os.mkdir(f"{mod_id}/{mod_id_title}Project/{mod_id_title}") -os.mkdir(f"{mod_id}/external_dlls") - -external_dlls = f"{mod_id}/external_dlls" -release_folder = f"{mod_id}/{mod_id}" - - -for filename in os.listdir(space_warp_path): - if filename.endswith(".dll"): - shutil.copy2(os.path.join(space_warp_path, filename), external_dlls) - -for filename in os.listdir(managed_path): - if filename.endswith(".dll"): - shutil.copy2(os.path.join(managed_path, filename), external_dlls) - -with open(f"{external_dlls}/.gitignore", "w") as external_gitignore: - external_gitignore.write("*\n!.gitignore") - -with open(f"{mod_id}/.gitignore", "w") as main_gitignore: - main_gitignore.write( - '\n'.join([ - "*.rsuser", - "*.suo", - "*.user", - "*.userosscache", - "*.sln.docstates", - "*.userprefs", - "mono_crash.*", - "[Dd]ebug/", - "[Dd]ebugPublic/", - "[Rr]elease/", - "[Rr]eleases/", - "x64/", - "x86/", - "[Aa][Rr][Mm]/", - "[Aa][Rr][Mm]64/", - "bld/", - "[Bb]in/", - "[Oo]bj/", - "[Ll]og/", - "[Ll]ogs/", - ]) - ) - -with open(f"{release_folder}/modinfo.json", "w") as modinfo: - modinfo.write( - json.dumps( - { - "mod_id": mod_id, - "author": mod_author, - "name": mod_name, - "description": mod_description, - "source": mod_source, - "version": mod_version, - "dependencies": [], - "ksp2_version": { - "min": mod_ksp_min_version, - "max": mod_ksp_max_version, - }, - }, - indent=4, - ) - ) -with open(f"README.json", "w") as readme: - readme.write("# Usage") - readme.write( - "Any code compiled in the csproj's dll should be moved to the /bin folder of the mod" - ) - -with open(f"{release_folder}/README.json", "w") as readme: - readme.write("# Default Readme") - -code_folder = f"{mod_id}/{mod_id_title}Project/{mod_id_title}" - -with open(f"{code_folder}/{mod_id_title}Mod.cs", "w") as default_code: - default_code.write( - "using SpaceWarp.API.Mods;\n\nnamespace " - + mod_id_title - + "\n{\n [MainMod]\n public class " - + mod_id_title - + 'Mod : Mod\n {\n public override void OnInitialized()\n {\n Logger.Info("Mod is initialized");\n }\n }\n}' - ) - -with open(f"{code_folder}/{mod_id_title}Config.cs", "w") as default_config: - default_config.write( - "using SpaceWarp.API.Configuration;\nusing Newtonsoft.Json;\n\nnamespace " - + mod_id_title - + "\n{\n [JsonObject(MemberSerialization.OptOut)]\n [ModConfig]\n public class " - + mod_id_title - + 'Config\n {\n [ConfigField("pi")] [ConfigDefaultValue(3.14159)] public double pi;\n }\n}' - ) - - -def quickCreateProperty(root, name, text): - a = root.createElement(name) - b = root.createTextNode(text) - a.appendChild(b) - return a - - -with open(f"{mod_id}/{mod_id_title}Project/{mod_id_title}.csproj", "w") as csproj: - root = minidom.Document() - xml = root.createElement("Project") - xml.setAttribute("Sdk", "Microsoft.NET.Sdk") - root.appendChild(xml) - propertyGroup = root.createElement("PropertyGroup") - xml.appendChild(propertyGroup) - propertyGroup.appendChild( - quickCreateProperty(root, "TargetFramework", "netstandard2.0") - ) - propertyGroup.appendChild(quickCreateProperty(root, "AllowUnsafeBlocks", "true")) - propertyGroup.appendChild(quickCreateProperty(root, "LangVersion", "11")) - propertyGroup.appendChild(quickCreateProperty(root, "ImplicitUsings", "true")) - - itemGroup = root.createElement("ItemGroup") - xml.appendChild(itemGroup) - - refs = [ - "..\\external_dlls\\SpaceWarp.dll", - "..\\external_dlls\\UnityEngine.dll", - "..\\external_dlls\\UnityEngine.CoreModule.dll", - "..\\external_dlls\\Assembly-CSharp.dll", - "..\\external_dlls\\NewtonSoft.Json.dll", - "..\\external_dlls\\NewtonSoft.Json.dll", - ] - - for ref in refs: - element = root.createElement("Reference") - element.setAttribute("Include", ref) - itemGroup.appendChild(element) - - xml_str = root.toprettyxml(indent=" ") - csproj.write(xml_str) diff --git a/SpaceWarp/UI/ModListUI.cs b/SpaceWarp/UI/ModListUI.cs index 98f20d15..c4bac9cc 100644 --- a/SpaceWarp/UI/ModListUI.cs +++ b/SpaceWarp/UI/ModListUI.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using KSP.Game; +using SpaceWarp.API.Mods.JSON; using UnityEngine; namespace SpaceWarp.UI; @@ -15,10 +16,9 @@ public class ModListUI : KerbalMonoBehaviour private static GUIStyle _boxStyle; private static Vector2 _scrollPositionMods; - - private List<(string, bool)> _toggles = new List<(string, bool)>(); - private List<(string, bool)> _initialToggles = new List<(string, bool)>(); - private readonly Dictionary _wasToggledDict = new Dictionary(); + private static Vector2 _scrollPositionInfo; + + private ModInfo _selectedMetaData = null; public void Start() { @@ -65,54 +65,45 @@ private void Update() private void FillWindow(int windowID) { - if (_initialToggles.Count == 0) - { - _initialToggles = new List<(string, bool)>(_toggles); - } - _boxStyle = GUI.skin.GetStyle("Box"); GUILayout.BeginHorizontal(); GUILayout.BeginVertical(); - _scrollPositionMods = GUILayout.BeginScrollView(_scrollPositionMods, false, true, + _scrollPositionMods = GUILayout.BeginScrollView(_scrollPositionMods, false, false, GUILayout.Height((float)(_windowHeight * 0.8)), GUILayout.Width(300)); - - GUILayout.BeginHorizontal(); - if (GUILayout.Button("Disable All")) + foreach (var mod in SpaceWarpManager.SpaceWarpPlugins) { - for (int i = 0; i < _toggles.Count; i++) + if (GUILayout.Button(mod.SpaceWarpMetadata.Name)) { - _toggles[i] = (_toggles[i].Item1, false); + _selectedMetaData = mod.SpaceWarpMetadata; } } - - if (GUILayout.Button("Enable All")) + GUILayout.EndScrollView(); + GUILayout.EndVertical(); + if (_selectedMetaData != null) { - for (int i = 0; i < _toggles.Count; i++) + GUILayout.BeginVertical(); + _scrollPositionInfo = GUILayout.BeginScrollView(_scrollPositionInfo, false, false); + GUILayout.Label($"{_selectedMetaData.Name} (id: {_selectedMetaData.ModID})"); + GUILayout.Label($"Author: {_selectedMetaData.Author}"); + GUILayout.Label($"Version: {_selectedMetaData.Version}"); + GUILayout.Label($"Source: {_selectedMetaData.Source}"); + GUILayout.Label($"Description: {_selectedMetaData.Description}"); + GUILayout.Label($"KSP2 Version: {_selectedMetaData.SupportedKsp2Versions.Min} - {_selectedMetaData.SupportedKsp2Versions.Max}"); + GUILayout.Label($"Dependencies"); + + foreach (DependencyInfo dependency in _selectedMetaData.Dependencies) { - _toggles[i] = (_toggles[i].Item1, true); + GUILayout.Label($"{dependency.ID}: {dependency.Version.Min} - {dependency.Version.Max}"); } + GUILayout.EndScrollView(); + GUILayout.EndVertical(); } GUILayout.EndHorizontal(); - - int numChanges = 0; - for (int i = 0; i < _toggles.Count; i++) + if (GUILayout.Button("Close")) { - if (_toggles[i].Item2 != _initialToggles[i].Item2) - { - numChanges++; - } - } - - if (numChanges > 0) - { - GUILayout.Label($"{numChanges} changes detected, please restart"); + ToggleVisible(); } - - GUILayout.EndScrollView(); - GUILayout.EndVertical(); - GUILayout.EndHorizontal(); - GUI.DragWindow(); } diff --git a/Bundles/README.md b/SpaceWarpBuildTemplate/assets/bundles/README.md similarity index 100% rename from Bundles/README.md rename to SpaceWarpBuildTemplate/assets/bundles/README.md diff --git a/Bundles/swconsoleui.bundle b/SpaceWarpBuildTemplate/assets/bundles/swconsoleui.bundle similarity index 100% rename from Bundles/swconsoleui.bundle rename to SpaceWarpBuildTemplate/assets/bundles/swconsoleui.bundle diff --git a/SpaceWarp/swinfo.json b/SpaceWarpBuildTemplate/swinfo.json similarity index 76% rename from SpaceWarp/swinfo.json rename to SpaceWarpBuildTemplate/swinfo.json index 1b358397..0744b84f 100644 --- a/SpaceWarp/swinfo.json +++ b/SpaceWarpBuildTemplate/swinfo.json @@ -3,7 +3,7 @@ "name": "Space Warp", "author": "Space-Warp Team", "description": "Space-Warp is an API for KSP2 mod developers.", - "source": "https://github.com/SpaceWarpDev/SpaceWarp/tree/main/ExampleMod", + "source": "https://github.com/SpaceWarpDev/SpaceWarp", "version": "0.4.0", "dependencies": [], "ksp2_version": { diff --git a/TemplateGenV2.py b/TemplateGenV2.py deleted file mode 100644 index 606dad6c..00000000 --- a/TemplateGenV2.py +++ /dev/null @@ -1,703 +0,0 @@ -# A better template generator -# Includes support for generating .csproj for roslyn and/or compiled mods -# Then also generates example code for those mods -import shutil, json -import os -from xml.dom import minidom - -template_mod = """ -// Import the Space Warp mod API -using SpaceWarp.API.Mods; - -namespace %NAMESPACE%; - -// Define our mod class with the [MainMod] attribute -[MainMod] -public class %MODNAME%Mod : Mod { - // This is our second stage initialization function, all assets and dependencies should be loaded by now. - public override void OnInitialized() { - // The mod class contains an Info and Logger class - Logger.Info($"{Info.name} OnInitialized()"); - } -} -""" - -template_configuration = """ -using SpaceWarp.API.Configuration; -using Newtonsoft.Json; -namespace %NAMESPACE%; - -// Define our config class with the [ModConfig] attribute -[ModConfig] -[JsonObject(MemberSerialization.OptOut)] -public class %MODNAME%Config { - [ConfigField("funny number")] - [ConfigDefaultValue(69)] - public int funny_number; -} -""" - -template_gitignore = """ -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. -## -## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore - -# User-specific files -*.rsuser -*.suo -*.user -*.userosscache -*.sln.docstates - -# User-specific files (MonoDevelop/Xamarin Studio) -*.userprefs - -# Mono auto generated files -mono_crash.* - -# Build results -[Dd]ebug/ -[Dd]ebugPublic/ -[Rr]elease/ -[Rr]eleases/ -x64/ -x86/ -[Aa][Rr][Mm]/ -[Aa][Rr][Mm]64/ -bld/ -[Bb]in/ -[Oo]bj/ -[Ll]og/ -[Ll]ogs/ - -# Visual Studio 2015/2017 cache/options directory -.vs/ -.idea/ -# Uncomment if you have tasks that create the project's static files in wwwroot -#wwwroot/ - -# Visual Studio 2017 auto generated files -Generated\ Files/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -# NUnit -*.VisualState.xml -TestResult.xml -nunit-*.xml - -# Build Results of an ATL Project -[Dd]ebugPS/ -[Rr]eleasePS/ -dlldata.c - -# Benchmark Results -BenchmarkDotNet.Artifacts/ - -# .NET Core -project.lock.json -project.fragment.lock.json -artifacts/ - -# StyleCop -StyleCopReport.xml - -# Files built by Visual Studio -*_i.c -*_p.c -*_h.h -*.ilk -*.meta -*.obj -*.iobj -*.pch -*.pdb -*.ipdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*_wpftmp.csproj -*.log -*.vspscc -*.vssscc -.builds -*.pidb -*.svclog -*.scc - -# Chutzpah Test files -_Chutzpah* - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opendb -*.opensdf -*.sdf -*.cachefile -*.VC.db -*.VC.VC.opendb - -# Visual Studio profiler -*.psess -*.vsp -*.vspx -*.sap - -# Visual Studio Trace Files -*.e2e - -# TFS 2012 Local Workspace -$tf/ - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper -*.DotSettings.user - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# AxoCover is a Code Coverage Tool -.axoCover/* -!.axoCover/settings.json - -# Visual Studio code coverage results -*.coverage -*.coveragexml - -# NCrunch -_NCrunch_* -.*crunch*.local.xml -nCrunchTemp_* - -# MightyMoose -*.mm.* -AutoTest.Net/ - -# Web workbench (sass) -.sass-cache/ - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.[Pp]ublish.xml -*.azurePubxml -# Note: Comment the next line if you want to checkin your web deploy settings, -# but database connection strings (with potential passwords) will be unencrypted -*.pubxml -*.publishproj - -# Microsoft Azure Web App publish settings. Comment the next line if you want to -# checkin your Azure Web App publish settings, but sensitive information contained -# in these scripts will be unencrypted -PublishScripts/ - -# NuGet Packages -*.nupkg -# NuGet Symbol Packages -*.snupkg -# The packages folder can be ignored because of Package Restore -**/[Pp]ackages/* -# except build/, which is used as an MSBuild target. -!**/[Pp]ackages/build/ -# Uncomment if necessary however generally it will be regenerated when needed -#!**/[Pp]ackages/repositories.config -# NuGet v3's project.json files produces more ignorable files -*.nuget.props -*.nuget.targets - -# Microsoft Azure Build Output -csx/ -*.build.csdef - -# Microsoft Azure Emulator -ecf/ -rcf/ - -# Windows Store app package directories and files -AppPackages/ -BundleArtifacts/ -Package.StoreAssociation.xml -_pkginfo.txt -*.appx -*.appxbundle -*.appxupload - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!?*.[Cc]ache/ - -# Others -ClientBin/ -~$* -*~ -*.dbmdl -*.dbproj.schemaview -*.jfm -*.pfx -*.publishsettings -orleans.codegen.cs - -# Including strong name files can present a security risk -# (https://github.com/github/gitignore/pull/2483#issue-259490424) -#*.snk - -# Since there are multiple workflows, uncomment next line to ignore bower_components -# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) -#bower_components/ - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file -# to a newer Visual Studio version. Backup files are not needed, -# because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm -ServiceFabricBackup/ -*.rptproj.bak - -# SQL Server files -*.mdf -*.ldf -*.ndf - -# Business Intelligence projects -*.rdl.data -*.bim.layout -*.bim_*.settings -*.rptproj.rsuser -*- [Bb]ackup.rdl -*- [Bb]ackup ([0-9]).rdl -*- [Bb]ackup ([0-9][0-9]).rdl - -# Microsoft Fakes -FakesAssemblies/ - -# GhostDoc plugin setting file -*.GhostDoc.xml - -# Node.js Tools for Visual Studio -.ntvs_analysis.dat -node_modules/ - -# Visual Studio 6 build log -*.plg - -# Visual Studio 6 workspace options file -*.opt - -# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) -*.vbw - -# Visual Studio LightSwitch build output -**/*.HTMLClient/GeneratedArtifacts -**/*.DesktopClient/GeneratedArtifacts -**/*.DesktopClient/ModelManifest.xml -**/*.Server/GeneratedArtifacts -**/*.Server/ModelManifest.xml -_Pvt_Extensions - -# Paket dependency manager -.paket/paket.exe -paket-files/ - -# FAKE - F# Make -.fake/ - -# CodeRush personal settings -.cr/personal - -# Python Tools for Visual Studio (PTVS) -__pycache__/ -*.pyc - -# Cake - Uncomment if you are using it -# tools/** -# !tools/packages.config - -# Tabs Studio -*.tss - -# Telerik's JustMock configuration file -*.jmconfig - -# BizTalk build output -*.btp.cs -*.btm.cs -*.odx.cs -*.xsd.cs - -# OpenCover UI analysis results -OpenCover/ - -# Azure Stream Analytics local run output -ASALocalRun/ - -# MSBuild Binary and Structured Log -*.binlog - -# NVidia Nsight GPU debugger configuration file -*.nvuser - -# MFractors (Xamarin productivity tool) working folder -.mfractor/ - -# Local History for Visual Studio -.localhistory/ - -# BeatPulse healthcheck temp database -healthchecksdb - -# Backup folder for Package Reference Convert tool in Visual Studio 2017 -MigrationBackup/ - -# Ionide (cross platform F# VS Code tools) working folder -.ionide/ - -# Build script folder -build/ - -# Idea folder -.idea -""" - -template_external_gitignore = """ -* -!.gitignore -""" - -def find_ksp2_install_path(): - # Checks if Operating System is NOT Windows - if os.path != "nt": - steam_install_folder = "" - return steam_install_folder - else: - # Look for the game in Steam library folders - steam_path = os.path.join(os.getenv("ProgramFiles(x86)"), "Steam") - steam_library_folders_file = os.path.join( - steam_path, "steamapps", "libraryfolders.vdf" - ) - steam_install_folder = os.path.join( - steam_path, "steamapps", "common", "Kerbal Space Program 2" - ) - - if os.path.exists(steam_library_folders_file): - with open(steam_library_folders_file) as f: - for line in f: - if "BaseInstallFolder" in line: - steam_library_path = line.strip().split('"')[3] - if os.path.exists( - os.path.join( - steam_library_path, - "steamapps", - "appmanifest_1406800.acf", - ) - ): - steam_install_folder = os.path.join( - steam_library_path, - "steamapps", - "common", - "Kerbal Space Program 2", - ) - break - - # Look for the game in default installation path - if not os.path.exists(steam_install_folder): - default_install_folder = os.path.join( - os.getenv("ProgramFiles"), "Private Division", "Kerbal Space Program 2" - ) - if os.path.exists(default_install_folder): - steam_install_folder = default_install_folder - -mode = 0 # 0 = roslyn, 1 = compiled, 2 = both (roslyn template), 3 = both (compiled template) - -mod_id = "" -mod_name = "" -mod_author = "" - -print("Space Warp Mod Setup Wizard") -while True: - compilation_mode = input("Is this mod going to be (R)oslyn, (C)ompiled, or (B)oth: ") - if not compilation_mode: - print("Please input a mode") - else: - if compilation_mode.lower().startswith("r"): - mode = 0 - break - elif compilation_mode.lower().startswith("c"): - mode = 1 - break - elif compilation_mode.lower().startswith("b"): - while True: - template_mode = input("Do you want the template to be (R)oslyn or (C)ompiled: ") - if not template_mode: - print("Please input a template mode") - else: - if template_mode.lower().startswith("r"): - mode = 2 - break - elif template_mode.lower().startswith("c"): - mode = 3 - break - else: - print("Please input one of the available options") - break - print("Please input one of the available options") - - -while True: - mod_id = input("What is the ID of the mod (This should be in snake_case): ") - if not mod_id: - print("Mod ID cannot be empty, please try again.") - else: - break - - - -while True: - mod_author = input("Who is the author of the mod: ") - if not mod_author: - print("Mod author cannot be empty, please try again.") - else: - break - -while True: - mod_name = input("What is the name of the mod: ") - if not mod_name: - print("Mod name cannot be empty, please try again.") - else: - break - -mod_description = input("What is a short description of the mod: ") -mod_source = input("What is the source link of the mod: ") -mod_version = input("What is the starting version of the mod: ") -mod_ksp_min_version = input( - "What is the minimum version of KSP2 this mod will accept: " -) -mod_ksp_max_version = input( - "What is the maximum version of KSP2 this mod will accept: " -) - -steam_install_folder = find_ksp2_install_path() - -if os.path.exists(steam_install_folder): - print(f"Kerbal Space Program 2 is installed at {steam_install_folder}") -else: - steam_install_folder = input( - "Could not find the installation path for Kerbal Space Program 2.\nPlease enter the path to the KSP2 installation folder manually: " - ) - -managed_path = os.path.join(steam_install_folder, "KSP2_x64_Data", "Managed") -space_warp_path = "" -bepinex_path = "" -use_bepinex = False -if os.path.exists(os.path.join(steam_install_folder, "SpaceWarp", "core")): - space_warp_path = os.path.join(steam_install_folder, "SpaceWarp", "core") -elif os.path.exists(os.path.join(steam_install_folder,"BepInEx","SpaceWarp")): - space_warp_path = os.path.join(steam_install_folder, "BepInEx","SpaceWarp") - use_bepinex = True - bepinex_path = os.path.join(steam_install_folder,"BepInEx","core") -else: - print("Could not find a space warp installation, are you sure space warp is installed?") - -def touch(name): - open(name,"w").close() - -mod_id_title = mod_id.replace("_", " ").title().replace(" ", "") - -os.mkdir(mod_id) -os.mkdir(f"{mod_id}/external_dlls") -os.mkdir(f"{mod_id}/{mod_id}") -os.mkdir(f"{mod_id}/{mod_id}/assets") -os.mkdir(f"{mod_id}/{mod_id}/assets/bundles") -touch(f"{mod_id}/{mod_id}/assets/bundles/BUNDLES_HERE") -os.mkdir(f"{mod_id}/{mod_id}/bin") -touch(f"{mod_id}/{mod_id}/bin/BINARIES_HERE") -os.mkdir(f"{mod_id}/{mod_id}/config") -touch(f"{mod_id}/{mod_id}/config/CONFIGURATION_HERE") -os.mkdir(f"{mod_id}/{mod_id}/localization") -touch(f"{mod_id}/{mod_id}/localization/LOCALIZATION_HERE") -os.mkdir(f"{mod_id}/{mod_id}/addressables") -touch(f"{mod_id}/{mod_id}/localization/ADDRESSABLES_HERE") -if mode == 0 or mode >= 2: - os.mkdir(f"{mod_id}/{mod_id}/src") - os.mkdir(f"{mod_id}/{mod_id}/src/{mod_id_title}") -if mode == 1 or mode >= 2: - os.mkdir(f"{mod_id}/{mod_id_title}Project") - os.mkdir(f"{mod_id}/{mod_id_title}Project/{mod_id_title}") - - -external_dlls = f"{mod_id}/external_dlls" -release_folder = f"{mod_id}/{mod_id}" - -dll_list = [] - - -for filename in os.listdir(space_warp_path): - if (filename.endswith(".dll")): - shutil.copy2(os.path.join(space_warp_path, filename), external_dlls) - dll_list.append(filename) - -if use_bepinex: - for filename in os.listdir(bepinex_path): - if filename.endswith(".dll") and filename.lower().find("bepinex") == -1: - shutil.copy2(os.path.join(bepinex_path, filename), external_dlls) - dll_list.append(filename) - -for filename in os.listdir(managed_path): - if filename.endswith(".dll"): - shutil.copy2(os.path.join(managed_path, filename), external_dlls) - dll_list.append(filename) - -with open(f"{external_dlls}/.gitignore", "w") as external_gitignore: - external_gitignore.write(template_external_gitignore) - -with open(f"{mod_id}/.gitignore","w") as main_gitignore: - main_gitignore.write(template_gitignore) - -with open(f"{release_folder}/modinfo.json", "w") as modinfo: - modinfo.write( - json.dumps( - { - "mod_id": mod_id, - "author": mod_author, - "name": mod_name, - "description": mod_description, - "source": mod_source, - "version": mod_version, - "dependencies": [], - "ksp2_version": { - "min": mod_ksp_min_version, - "max": mod_ksp_max_version, - }, - }, - indent=4, - ) - ) - -with open(f"{mod_id}/README.md", "w") as readme: - readme.write("# Usage") - readme.write("Copy all space warp dlls and ksp dlls into external dlls") - readme.write( - "# Template Mod" - ) - - -with open(f"{release_folder}/README.json", "w") as readme: - readme.write("# Default Readme") -code_folder = "" -if mode == 1 or mode == 3: - code_folder = f"{mod_id}/{mod_id_title}Project/{mod_id_title}" -else: - code_folder = f"{mod_id}/{mod_id}/src" - -with open(f"{code_folder}/{mod_id_title}Mod.cs", "w") as default_code: - default_code.write( - template_mod.replace("%NAMESPACE%",mod_id_title).replace("%MODNAME%",mod_id_title) - ) - -with open(f"{code_folder}/{mod_id_title}Config.cs", "w") as default_code: - default_code.write( - template_configuration.replace("%NAMESPACE%",mod_id_title).replace("%MODNAME%",mod_id_title) - ) - -if mode == 0 or mode >= 2: - - with open(f"{mod_id}/{mod_id}/.gitignore","w") as main_gitignore: - main_gitignore.write(template_gitignore) - -if mode == 1 or mode >= 2: - with open(f"{mod_id}/{mod_id_title}Project/.gitignore","w") as main_gitignore: - main_gitignore.write(template_gitignore) - - - -def quick_create_property(root, name, text): - a = root.createElement(name) - b = root.createTextNode(text) - a.appendChild(b) - return a - - -def gen_csproj(csproj_name, dll_list, is_compiled=False): - root = minidom.Document() - xml = root.createElement("Project") - xml.setAttribute("Sdk", "Microsoft.NET.Sdk") - root.appendChild(xml) - propertyGroup = root.createElement("PropertyGroup") - xml.appendChild(propertyGroup) - propertyGroup.appendChild( - quick_create_property(root, "TargetFramework", "net472") - ) - propertyGroup.appendChild(quick_create_property(root, "AllowUnsafeBlocks", "true")) - propertyGroup.appendChild(quick_create_property(root, "LangVersion", "latest")) - propertyGroup.appendChild(quick_create_property(root, "ImplicitUsings", "true")) - - itemGroup = root.createElement("ItemGroup") - xml.appendChild(itemGroup) - - refs = [ - os.path.join("..","external_dlls",f"{dll}") for dll in dll_list - ] - - for ref in refs: - element = root.createElement("Reference") - element.setAttribute("Include", ref) - itemGroup.appendChild(element) - - if is_compiled: - after_build_group = root.createElement("PropertyGroup") - xml.appendChild(after_build_group) - after_build_group.appendChild( - quick_create_property(root,"PostBuildEvent",""" -"$(ProjectDir)pdb2mdb\\pdb2mdb.exe" "$(TargetPath)" -copy /Y "$(TargetDir)$(ProjectName).dll" "../%MOD_ID%/bin/$(ProjectName).dll" -copy /Y "$(TargetDir)$(ProjectName).pdb" "../%MOD_ID%/bin/$(ProjectName).pdb" -copy /Y "$(TargetDir)$(ProjectName).dll.mdb" "../%MOD_ID%/bin/$(ProjectName).dll.mdb" -""".replace("%MOD_ID%",mod_id)) - ) - - xml_str = root.toprettyxml(indent=" ") - with open(csproj_name + ".csproj", "w") as csproj: - csproj.write(xml_str) - -if mode == 0 or mode >= 2: - gen_csproj(f"{mod_id}/{mod_id}/{mod_id_title}",dll_list,False) -if mode == 1 or mode >= 2: - gen_csproj(f"{mod_id}/{mod_id_title}Project/{mod_id_title}",dll_list,True) \ No newline at end of file diff --git a/builder.py b/builder.py index 366b5e74..1e317518 100644 --- a/builder.py +++ b/builder.py @@ -4,16 +4,14 @@ import subprocess import zipfile -DOORSTOP_DIR = os.path.abspath("Doorstop") -BUILD_DIR = os.path.abspath("build") -BUNDLES_DIR = os.path.abspath("Bundles") + +TEMPLATE_DIR = os.path.abspath("SpaceWarpBuildTemplate") SPACEWARP_DIR = os.path.abspath("SpaceWarp") +BUILD_DIR = os.path.abspath("build") -parser = argparse.ArgumentParser() +parser = argparse.ArgumentParser() parser.add_argument("-r", "--release", help="Build a release version", action="store_true") -parser.add_argument("-t", "--target", help="Build target", choices=["bepinex", "doorstop"], default="doorstop") -parser.add_argument("-a", "--all", help="Build all targets", action="store_true") def clean(): if os.path.exists(BUILD_DIR): @@ -25,30 +23,20 @@ def clean(): if os.path.exists(os.path.join(SPACEWARP_DIR, "obj")): shutil.rmtree(os.path.join(SPACEWARP_DIR, "obj")) -def build(release = False, doorstop = False): - build_type = "Doorstop" if doorstop else "BepInEx" - dotnet_args = ["dotnet", "build", os.path.join(SPACEWARP_DIR, "SpaceWarp.csproj"), "-c", "Release" if release else "Debug"] +def build(release = False): + dotnet_args = ["dotnet", "build", os.path.join(SPACEWARP_DIR,"SpaceWarp.csproj"), "-c", "Release" if release else "Debug"] build_output_dir = os.path.join(SPACEWARP_DIR, "bin", "Release" if release else "Debug") - output_dir = os.path.join(BUILD_DIR, build_type, "BepInEx", "plugins", "SpaceWarp") - - if doorstop: - dotnet_args.append("-p:DefineConstants=\"DOORSTOP_BUILD\"") - output_dir = os.path.join(BUILD_DIR, build_type, "SpaceWarp", "core") - + output_dir = os.path.join(BUILD_DIR, "SpaceWarp", "BepInEx", "plugins", "SpaceWarp") + # copy over the internals of the template print("=> Creating build directory...") - - os.makedirs(output_dir) - - if doorstop: - print("=> Copying doorstop DLLs...") - - for file in os.listdir(DOORSTOP_DIR): - shutil.copyfile(os.path.join(DOORSTOP_DIR, file), os.path.join(BUILD_DIR, build_type, file)) + os.makedirs(os.path.join(BUILD_DIR, "SpaceWarp", "BepInEx", "plugins")) + + print("=> Copying output template") + shutil.copytree(TEMPLATE_DIR,output_dir) print(f"=> Executing: {' '.join(dotnet_args)}") output = subprocess.run(args=dotnet_args, capture_output=True) - print(" |=>| STDOUT") for line in str(output.stdout, "utf-8").splitlines(): @@ -60,52 +48,11 @@ def build(release = False, doorstop = False): print(f" {line}") print("=> Copying build outputs...") - def shutil_copy(file): shutil.copyfile(os.path.join(build_output_dir,file),os.path.join(output_dir,file)) - - to_transfer = [ - "0Harmony.dll", - "Mono.Cecil.dll", - "Mono.Cecil.Mdb.dll", - "Mono.Cecil.Pdb.dll", - "Mono.Cecil.Rocks.dll", - "MonoMod.RuntimeDetour.dll", - "MonoMod.Utils.dll", - "Microsoft.CodeAnalysis.dll", - "Microsoft.CodeAnalysis.CSharp.dll", - "System.Collections.Immutable.dll", - "System.Buffers.dll", - "System.Memory.dll", - "System.Reflection.Metadata.dll", - "System.Runtime.CompilerServices.Unsafe.dll", - "System.Text.Encoding.CodePages.dll", - "System.Threading.Tasks.Extensions.dll", - "System.Numerics.Vectors.dll", - ] - - if doorstop: - for file in to_transfer: - shutil_copy(file) - - if not release and os.path.exists(os.path.join(build_output_dir, "SpaceWarp.pdb")): - shutil.copyfile(os.path.join(build_output_dir, "SpaceWarp.pdb"), os.path.join(output_dir, "SpaceWarp.pdb")) - - shutil.copyfile(os.path.join(build_output_dir, "SpaceWarp.dll"), os.path.join(output_dir, "SpaceWarp.dll")) - - print("=> Finalizing build...") - - os.makedirs(os.path.join(BUILD_DIR, build_type, "SpaceWarp", "assets", "bundles")) - os.makedirs(os.path.join(BUILD_DIR, build_type, "SpaceWarp", "Mods")) - - with open(os.path.join(BUILD_DIR, build_type, "SpaceWarp", "Mods","mods_folder.txt"),"w") as mods_folder_txt: - mods_folder_txt.write("Mods go here") - - for bundle in os.listdir(BUNDLES_DIR): - if bundle.endswith(".bundle"): - shutil.copyfile(os.path.join(BUNDLES_DIR, bundle), os.path.join(BUILD_DIR, build_type, "SpaceWarp", "assets", "bundles", bundle)) - + shutil_copy("SpaceWarp.pdb") + shutil_copy("SpaceWarp.dll") def create_zip_name(prefix): git_output = subprocess.run(["git", "rev-parse", "HEAD"], capture_output=True) @@ -119,49 +66,25 @@ def mkzip(in_dir, out_zip): for root, dirs, files in os.walk(in_dir): for file in files: handle.write(os.path.join(root, file), os.path.relpath(os.path.join(root, file), in_dir)) - handle.close() -def compress(doorstop = False, release = False): - target_name = "Doorstop" if doorstop else "BepInEx" +def compress(release = False): release_target = "Release" if release else "Debug" - - mkzip(os.path.join(BUILD_DIR, target_name), create_zip_name(f"SpaceWarp-{target_name}-{release_target}")) - + mkzip(os.path.join(BUILD_DIR,"SpaceWarp"),create_zip_name(f"SpaceWarp-{release_target}")) + def main(): args = parser.parse_args() - - doorstop = args.target == "doorstop" - target_name = "Doorstop" if args.target == "doorstop" else "BepInEx" - total_steps = 5 if args.all else 3 - + total_steps = 3 print(f"====> [1/{total_steps}] Cleaning...") clean() + + print(f"====> [2/{total_steps}] Building...") - if args.all: - print(f"====> [2/{total_steps}] Building for BepInEx...") - - build(args.release, False) + build(args.release) - print(f"====> [3/{total_steps}] Building for Doorstop...") - - build(args.release, True) - - print(f"====> [4/{total_steps}] Compressing BepInEx build...") - - compress(False, args.release) - - print(f"====> [5/{total_steps}] Compressing Doorstop build...") - - compress(True, args.release) - else: - print(f"====> [2/{total_steps}] Building for {target_name}...") - - build(args.release, doorstop) - - print(f"====> [3/{total_steps}] Compressing {target_name} build...") - - compress(doorstop, args.release) + print(f"====> [3/{total_steps}] Compressing...") + + compress(args.release) -main() +main() \ No newline at end of file diff --git a/example_mod_info.json b/example_mod_info.json deleted file mode 100644 index 5aabff9c..00000000 --- a/example_mod_info.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "mod_id": "[SHOULD BE THE SAME AS FOLDER NAME]", - "name": "[DESCRIPTIVE NAME OF MOD]", - "author": "", - "description": "", - "source": "", - "version": "1.0.0", - "dependencies": [ - { - "id": "example_mod", - "version": { - "min": "0.0.0", - "max": "9.9.9 (can be * for no max version)" - } - } - ], - "ksp2_version": { - "min": "...", - "max": "... (can be * for no max version)" - } -} From 0455343aef4c5b11836014d92afaf3973e121aee Mon Sep 17 00:00:00 2001 From: Lexi Date: Thu, 2 Mar 2023 21:11:26 -0500 Subject: [PATCH 08/29] Fixes in the image loading system, and console filtering --- SpaceWarp/Patching/LoadingActions/LoadAssetAction.cs | 2 +- SpaceWarp/SpaceWarpManager.cs | 4 ++++ SpaceWarp/UI/SpaceWarpConsole.cs | 4 ++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/SpaceWarp/Patching/LoadingActions/LoadAssetAction.cs b/SpaceWarp/Patching/LoadingActions/LoadAssetAction.cs index 89db3006..a9538af5 100644 --- a/SpaceWarp/Patching/LoadingActions/LoadAssetAction.cs +++ b/SpaceWarp/Patching/LoadingActions/LoadAssetAction.cs @@ -51,7 +51,7 @@ public override void DoAction(Action resolve, Action reject) if (Directory.Exists(imagesPath)) { var directoryInfo = new DirectoryInfo(imagesPath); - foreach (string file in directoryInfo.EnumerateFiles("*.cs", SearchOption.AllDirectories).Select(fileInfo => fileInfo.FullName)) + foreach (string file in directoryInfo.EnumerateFiles("*", SearchOption.AllDirectories).Select(fileInfo => fileInfo.FullName)) { var assetPathList = PathHelpers.GetRelativePath(imagesPath, file).Split(Path.DirectorySeparatorChar); //We have to make sure it uses '/' as the path separator and toLower() the names diff --git a/SpaceWarp/SpaceWarpManager.cs b/SpaceWarp/SpaceWarpManager.cs index 53ed0566..d9150a1d 100644 --- a/SpaceWarp/SpaceWarpManager.cs +++ b/SpaceWarp/SpaceWarpManager.cs @@ -7,6 +7,8 @@ using SpaceWarp.API.Assets; using SpaceWarp.API.Mods; using SpaceWarp.API.Mods.JSON; +using SpaceWarp.API.UI.Toolbar; +using SpaceWarp.Backend.UI.Toolbar; using SpaceWarp.UI; namespace SpaceWarp; @@ -56,6 +58,8 @@ public static void Initialize(SpaceWarpPlugin sw) Logger = sw.Logger; SpaceWarpFolder = Path.GetDirectoryName(sw.Info.Location); + + ToolbarBackend.AppBarInFlightSubscriber.AddListener(Toolbar.LoadAllButtons); } public static ModListUI ModListUI { get; internal set; } diff --git a/SpaceWarp/UI/SpaceWarpConsole.cs b/SpaceWarp/UI/SpaceWarpConsole.cs index c9bd9ce1..272b68ac 100644 --- a/SpaceWarp/UI/SpaceWarpConsole.cs +++ b/SpaceWarp/UI/SpaceWarpConsole.cs @@ -14,6 +14,8 @@ public sealed class SpaceWarpConsole : MonoBehaviour private static Vector2 _scrollPosition; private static Vector2 _scrollView; + private string _search = ""; + private void Awake() { _windowWidth = (int)(Screen.width * 0.5f); @@ -50,10 +52,12 @@ private void Update() private void DrawConsole(int windowID) { GUILayout.BeginVertical(); + _search = GUILayout.TextField(_search); _scrollView = GUILayout.BeginScrollView(_scrollPosition, false, true); foreach (string message in SpaceWarpConsoleLogListener.DebugMessages) { + if (!message.ToLower().Contains(_search.ToLower())) continue; GUILayout.Label(message); if(_autoScroll) { From 869bacb4e47ba34af88919abedfb129d0013e51a Mon Sep 17 00:00:00 2001 From: Lexi Date: Thu, 2 Mar 2023 21:43:45 -0500 Subject: [PATCH 09/29] This version adds app.bar support for the space warp console, and attempts to use control . (to no avail yet, they don't seem to be implemented.) --- ExampleMod/ExampleMod.cs | 4 +-- .../{Toolbar/Toolbar.cs => Appbar/Appbar.cs} | 14 ++++----- .../ToolbarMenu.cs => Appbar/AppbarMenu.cs} | 4 +-- .../AppbarBackend.cs} | 8 ++--- SpaceWarp/SpaceWarpManager.cs | 6 ++-- SpaceWarp/UI/SpaceWarpConsole.cs | 28 ++++++++++++++++-- .../assets/images/console.png | Bin 0 -> 210 bytes 7 files changed, 43 insertions(+), 21 deletions(-) rename SpaceWarp/API/UI/{Toolbar/Toolbar.cs => Appbar/Appbar.cs} (80%) rename SpaceWarp/API/UI/{Toolbar/ToolbarMenu.cs => Appbar/AppbarMenu.cs} (95%) rename SpaceWarp/Backend/UI/{Toolbar/ToolbarBackend.cs => Appbar/AppbarBackend.cs} (93%) create mode 100644 SpaceWarpBuildTemplate/assets/images/console.png diff --git a/ExampleMod/ExampleMod.cs b/ExampleMod/ExampleMod.cs index bb93c945..ef028056 100644 --- a/ExampleMod/ExampleMod.cs +++ b/ExampleMod/ExampleMod.cs @@ -5,7 +5,7 @@ using KSP.Sim.impl; using SpaceWarp; using SpaceWarp.API.UI; -using SpaceWarp.API.UI.Toolbar; +using SpaceWarp.API.UI.Appbar; using UnityEngine; namespace ExampleMod; @@ -35,7 +35,7 @@ public override void OnInitialized() // Register the mod's button in KSP 2s app.bar // This requires an `icon.png` file to exist under [plugin_folder]/assets/images - Toolbar.RegisterAppButton( + Appbar.RegisterAppButton( "Example Mod", "BTN-ExampleMod", // Example of using the asset loader, were going to load the apps icon diff --git a/SpaceWarp/API/UI/Toolbar/Toolbar.cs b/SpaceWarp/API/UI/Appbar/Appbar.cs similarity index 80% rename from SpaceWarp/API/UI/Toolbar/Toolbar.cs rename to SpaceWarp/API/UI/Appbar/Appbar.cs index 85bcca02..bfaaae89 100644 --- a/SpaceWarp/API/UI/Toolbar/Toolbar.cs +++ b/SpaceWarp/API/UI/Appbar/Appbar.cs @@ -2,20 +2,20 @@ using System.Collections.Generic; using BepInEx.Bootstrap; using UnityEngine; -using SpaceWarp.Backend.UI.Toolbar; +using SpaceWarp.Backend.UI.Appbar; -namespace SpaceWarp.API.UI.Toolbar; +namespace SpaceWarp.API.UI.Appbar; -public static class Toolbar +public static class Appbar { private static readonly List<(string text, Sprite icon, string ID, Action action)> ButtonsToBeLoaded = new(); - public static T RegisterGameToolbarMenu(string text, string title, string id, Sprite icon) where T : ToolbarMenu + public static T RegisterGameToolbarMenu(string text, string title, string id, Sprite icon) where T : AppbarMenu { GameObject toolBarUIObject = new GameObject($"Toolbar: {id}"); toolBarUIObject.Persist(); - ToolbarMenu menu = toolBarUIObject.AddComponent(); + AppbarMenu menu = toolBarUIObject.AddComponent(); menu.Title = title; toolBarUIObject.transform.SetParent(Chainloader.ManagerObject.transform); toolBarUIObject.SetActive(true); @@ -23,7 +23,7 @@ public static T RegisterGameToolbarMenu(string text, string title, string id, return menu as T; } - public static T RegisterGameToolbarMenu(string text, string title, string id, Texture2D icon) where T : ToolbarMenu => + public static T RegisterGameToolbarMenu(string text, string title, string id, Texture2D icon) where T : AppbarMenu => RegisterGameToolbarMenu(text, title, id, GetToolBarIconFromTexture(icon)); public static void RegisterAppButton(string text, string id, Sprite icon, Action func) => ButtonsToBeLoaded.Add((text ,icon, id, func)); @@ -44,7 +44,7 @@ internal static void LoadAllButtons() { foreach (var button in ButtonsToBeLoaded) { - ToolbarBackend.AddButton(button.text, button.icon, button.ID, button.action); + AppbarBackend.AddButton(button.text, button.icon, button.ID, button.action); } } } diff --git a/SpaceWarp/API/UI/Toolbar/ToolbarMenu.cs b/SpaceWarp/API/UI/Appbar/AppbarMenu.cs similarity index 95% rename from SpaceWarp/API/UI/Toolbar/ToolbarMenu.cs rename to SpaceWarp/API/UI/Appbar/AppbarMenu.cs index ff901d1b..9ea00093 100644 --- a/SpaceWarp/API/UI/Toolbar/ToolbarMenu.cs +++ b/SpaceWarp/API/UI/Appbar/AppbarMenu.cs @@ -3,9 +3,9 @@ using SpaceWarp.API.Assets; using UnityEngine; -namespace SpaceWarp.API.UI.Toolbar; +namespace SpaceWarp.API.UI.Appbar; -public abstract class ToolbarMenu : KerbalBehavior +public abstract class AppbarMenu : KerbalBehavior { private GUISkin _spaceWarpConsoleSkin = null; private bool _drawing = false; diff --git a/SpaceWarp/Backend/UI/Toolbar/ToolbarBackend.cs b/SpaceWarp/Backend/UI/Appbar/AppbarBackend.cs similarity index 93% rename from SpaceWarp/Backend/UI/Toolbar/ToolbarBackend.cs rename to SpaceWarp/Backend/UI/Appbar/AppbarBackend.cs index f0f8e566..cdb12d46 100644 --- a/SpaceWarp/Backend/UI/Toolbar/ToolbarBackend.cs +++ b/SpaceWarp/Backend/UI/Appbar/AppbarBackend.cs @@ -17,9 +17,9 @@ using UnityEngine.UI; using Object = UnityEngine.Object; -namespace SpaceWarp.Backend.UI.Toolbar; +namespace SpaceWarp.Backend.UI.Appbar; -internal static class ToolbarBackend +internal static class AppbarBackend { private static readonly ManualLogSource _logger = BepInEx.Logging.Logger.CreateLogSource("ToolbarBackend"); public static GameObject AddButton(string buttonText, Sprite buttonIcon, string buttonId, Action function) @@ -91,7 +91,7 @@ class ToolbarBackendObject : KerbalBehavior private IEnumerator awaiter() { yield return new WaitForSeconds(1); - ToolbarBackend.AppBarInFlightSubscriber.Invoke(); + AppbarBackend.AppBarInFlightSubscriber.Invoke(); Destroy(this); } } @@ -101,5 +101,5 @@ private IEnumerator awaiter() [HarmonyPatch("Start")] class ToolbarBackendAppBarPatcher { - public static void Postfix(UIFlightHud __instance) => ToolbarBackend.SubscriberSchedulePing(); + public static void Postfix(UIFlightHud __instance) => AppbarBackend.SubscriberSchedulePing(); } \ No newline at end of file diff --git a/SpaceWarp/SpaceWarpManager.cs b/SpaceWarp/SpaceWarpManager.cs index d9150a1d..bbe2096d 100644 --- a/SpaceWarp/SpaceWarpManager.cs +++ b/SpaceWarp/SpaceWarpManager.cs @@ -7,8 +7,8 @@ using SpaceWarp.API.Assets; using SpaceWarp.API.Mods; using SpaceWarp.API.Mods.JSON; -using SpaceWarp.API.UI.Toolbar; -using SpaceWarp.Backend.UI.Toolbar; +using SpaceWarp.API.UI.Appbar; +using SpaceWarp.Backend.UI.Appbar; using SpaceWarp.UI; namespace SpaceWarp; @@ -59,7 +59,7 @@ public static void Initialize(SpaceWarpPlugin sw) SpaceWarpFolder = Path.GetDirectoryName(sw.Info.Location); - ToolbarBackend.AppBarInFlightSubscriber.AddListener(Toolbar.LoadAllButtons); + AppbarBackend.AppBarInFlightSubscriber.AddListener(Appbar.LoadAllButtons); } public static ModListUI ModListUI { get; internal set; } diff --git a/SpaceWarp/UI/SpaceWarpConsole.cs b/SpaceWarp/UI/SpaceWarpConsole.cs index 272b68ac..46f78ab8 100644 --- a/SpaceWarp/UI/SpaceWarpConsole.cs +++ b/SpaceWarp/UI/SpaceWarpConsole.cs @@ -1,13 +1,20 @@ -using UnityEngine; +using KSP.Game; +using KSP.Sim.impl; +using SpaceWarp.API.Assets; +using SpaceWarp.API.UI.Appbar; +using UnityEngine; namespace SpaceWarp.UI; -public sealed class SpaceWarpConsole : MonoBehaviour +public sealed class SpaceWarpConsole : KerbalMonoBehaviour { private bool _drawUI; private Rect _windowRect; bool _autoScroll = true; + private const ControlTypes ConsoleLocks = ControlTypes.All; + private const string ConsoleLockID = "spacewarp.console"; + private int _windowWidth = 350; private int _windowHeight = 700; @@ -23,6 +30,16 @@ private void Awake() _windowRect = new Rect(Screen.width * 0.15f, Screen.height * 0.15f, 0, 0); _scrollPosition = Vector2.zero; + Appbar.RegisterAppButton( + "Console", + "BTN-SWConsole", + // Example of using the asset loader, were going to load the apps icon + // Path format [mod_id]/images/filename + // for bundles its [mod_id]/[bundle_name]/[path to file in bundle with out assets/bundle]/filename.extension + // There is also a try get asset function, that returns a bool on whether or not it could grab the asset + AssetManager.GetAsset($"spacewarp/images/console.png"), + ToggleVisible + ); } private void OnGUI() @@ -45,7 +62,7 @@ private void Update() { if (Input.GetKey(KeyCode.LeftAlt) && Input.GetKeyDown(KeyCode.C)) { - _drawUI = !_drawUI; + ToggleVisible(!_drawUI); } } @@ -95,4 +112,9 @@ private void DrawConsole(int windowID) GUILayout.EndVertical(); GUI.DragWindow(new Rect(0, 0, 10000, 500)); } + public void ToggleVisible(bool shouldDraw) + { + _drawUI = shouldDraw; + Game.ViewController.inputLockManager.SetControlLock(_drawUI ? ConsoleLocks : ControlTypes.None, ConsoleLockID); + } } \ No newline at end of file diff --git a/SpaceWarpBuildTemplate/assets/images/console.png b/SpaceWarpBuildTemplate/assets/images/console.png new file mode 100644 index 0000000000000000000000000000000000000000..c708e45d539b425e77ba3fd5b2a4bd697c857f5c GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|dOTemLp;3C zUc1QGpuoX;;m7~}We=xK7BSqB^Yc>Ghj}8WUTDdw{5*4}NOe(JzYNz3hhM_>s~wcH zytO7|p1*iv(+ZCxZ=^&v<$AL``c^Ae*!a=4XUhk{36B35Q(iq-ryzVUYuoRlw8PsO zl Date: Fri, 3 Mar 2023 09:02:33 -0500 Subject: [PATCH 10/29] Add summaries to a lot of our public facing methods --- SpaceWarp/API/Game/StateChanges.cs | 4 +- SpaceWarp/API/Mods/BaseSpaceWarpPlugin.cs | 12 +++++ SpaceWarp/API/UI/Appbar/Appbar.cs | 54 ++++++++++++++++++++--- SpaceWarp/API/UI/MainMenu.cs | 8 +++- SpaceWarp/API/Versions/VersionUtility.cs | 14 +++++- 5 files changed, 82 insertions(+), 10 deletions(-) diff --git a/SpaceWarp/API/Game/StateChanges.cs b/SpaceWarp/API/Game/StateChanges.cs index 43404f7c..b8e665b3 100644 --- a/SpaceWarp/API/Game/StateChanges.cs +++ b/SpaceWarp/API/Game/StateChanges.cs @@ -4,10 +4,12 @@ namespace SpaceWarp.API.Game; +/// +/// A class that contains a list of events that are published either when a state is entered or left +/// public static class StateChanges { #region Entering States - public static event Action InvalidStateEntered; public static event System.Action WarmUpLoadingStateEntered; public static event System.Action MainMenuStateEntered; diff --git a/SpaceWarp/API/Mods/BaseSpaceWarpPlugin.cs b/SpaceWarp/API/Mods/BaseSpaceWarpPlugin.cs index b6f1e1d5..4cfc7619 100644 --- a/SpaceWarp/API/Mods/BaseSpaceWarpPlugin.cs +++ b/SpaceWarp/API/Mods/BaseSpaceWarpPlugin.cs @@ -28,14 +28,26 @@ public abstract class BaseSpaceWarpPlugin : BaseUnityPlugin internal ManualLogSource ModLogger => base.Logger; public string PluginFolderPath { get; internal set; } + /// + /// 1st stage initialization + /// This is called before any of the game is actually loaded, it is called as early as possible in the games bootstrap process. + /// public virtual void OnPreInitialized() { } + /// + /// 2nd stage initialization + /// This is called after the game is loaded, and after your mods assets are loaded. + /// public virtual void OnInitialized() { } + /// + /// 3rd stage initialization + /// This is called after all mods have done first stage initialization + /// public virtual void OnPostInitialized() { } diff --git a/SpaceWarp/API/UI/Appbar/Appbar.cs b/SpaceWarp/API/UI/Appbar/Appbar.cs index bfaaae89..6b8772f5 100644 --- a/SpaceWarp/API/UI/Appbar/Appbar.cs +++ b/SpaceWarp/API/UI/Appbar/Appbar.cs @@ -10,8 +10,17 @@ namespace SpaceWarp.API.UI.Appbar; public static class Appbar { private static readonly List<(string text, Sprite icon, string ID, Action action)> ButtonsToBeLoaded = new(); - - public static T RegisterGameToolbarMenu(string text, string title, string id, Sprite icon) where T : AppbarMenu + + /// + /// Register a appbar menu for the game + /// + /// The text in the appbar menu + /// The title of the menu + /// A unique id for the appbar menu eg: "BTN-Example" + /// A Sprite for the icon in the appbar + /// The type of the appbar menu, must extend AppbarMenu + /// An instance of T which has been added to a GameObject + public static T RegisterGameAppbarMenu(string text, string title, string id, Sprite icon) where T : AppbarMenu { GameObject toolBarUIObject = new GameObject($"Toolbar: {id}"); toolBarUIObject.Persist(); @@ -23,15 +32,46 @@ public static T RegisterGameToolbarMenu(string text, string title, string id, return menu as T; } - public static T RegisterGameToolbarMenu(string text, string title, string id, Texture2D icon) where T : AppbarMenu => - RegisterGameToolbarMenu(text, title, id, GetToolBarIconFromTexture(icon)); + /// + /// Register a appbar menu for the game + /// + /// The text in the appbar menu + /// The title of the menu + /// A unique id for the appbar menu eg: "BTN-Example" + /// A Texture2D for the icon in the appbar + /// The type of the appbar menu, must extend AppbarMenu + /// An instance of T which has been added to a GameObject + public static T RegisterGameAppbarMenu(string text, string title, string id, Texture2D icon) where T : AppbarMenu => + RegisterGameAppbarMenu(text, title, id, GetAppBarIconFromTexture(icon)); + /// + /// Register a button on the games AppBar + /// + /// The text in the appbar menu + /// A unique id for the appbar menu eg: "BTN-Example" + /// A Sprite for the icon in the appbar + /// The function to be called when this button is clicked public static void RegisterAppButton(string text, string id, Sprite icon, Action func) => ButtonsToBeLoaded.Add((text ,icon, id, func)); - + + /// + /// Register a button on the games AppBar + /// + /// The text in the appbar menu + /// A unique id for the appbar menu eg: "BTN-Example" + /// A Texture2D for the icon in the appbar + /// The function to be called when this button is clicked public static void RegisterAppButton(string text, string id, Texture2D icon, Action func) => - RegisterAppButton(text, id, GetToolBarIconFromTexture(icon), func); + RegisterAppButton(text, id, GetAppBarIconFromTexture(icon), func); + - public static Sprite GetToolBarIconFromTexture(Texture2D texture, int width=0,int height=0) + /// + /// Convert a Texture2D to a Sprite + /// + /// The Texture2D + /// The width of the sprite, 0 for inferring + /// The height of the sprite, 0 for inferring + /// The Texture2D converted to a Sprite + public static Sprite GetAppBarIconFromTexture(Texture2D texture, int width=0,int height=0) { if (width == 0) width = texture.width; if (height == 0) height = texture.height; diff --git a/SpaceWarp/API/UI/MainMenu.cs b/SpaceWarp/API/UI/MainMenu.cs index 6e977cae..15db6f56 100644 --- a/SpaceWarp/API/UI/MainMenu.cs +++ b/SpaceWarp/API/UI/MainMenu.cs @@ -5,8 +5,14 @@ namespace SpaceWarp.API.UI; public static class MainMenu { - internal static List<(string name, Action onClicked)> MenuButtonsToBeAdded = new (); + internal static readonly List<(string name, Action onClicked)> MenuButtonsToBeAdded = new (); + + /// + /// Registers a button to be added to the main menu. + /// + /// The name of the button on the menu. + /// The action that is invoked when the button is pressed public static void RegisterMenuButton(string name, Action onClicked) { MenuButtonsToBeAdded.Add((name,onClicked)); diff --git a/SpaceWarp/API/Versions/VersionUtility.cs b/SpaceWarp/API/Versions/VersionUtility.cs index defaff80..9202b91b 100644 --- a/SpaceWarp/API/Versions/VersionUtility.cs +++ b/SpaceWarp/API/Versions/VersionUtility.cs @@ -2,6 +2,12 @@ public static class VersionUtility { + /// + /// Checks if one semantic version is above another + /// + /// The version to check against + /// The version that is being checked + /// toCheck >= version public static bool IsVersionAbove(string version, string toCheck) { if (version == "") @@ -28,7 +34,13 @@ public static bool IsVersionAbove(string version, string toCheck) return true; } - public static bool IsVersionBellow(string version, string toCheck) + /// + /// Checks if one semantic version is below another + /// + /// The version to check against + /// The version that is being checked + /// toCheck is less than or equal to version + public static bool IsVersionBelow(string version, string toCheck) { if (version == "") { From 51751a1accfbba71266721af26c7fe2136655b89 Mon Sep 17 00:00:00 2001 From: cheese3660 Date: Fri, 3 Mar 2023 09:06:19 -0500 Subject: [PATCH 11/29] Update README.md --- README.md | 32 ++++++++++++-------------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index a34676ba..200e3521 100644 --- a/README.md +++ b/README.md @@ -16,9 +16,7 @@ To compile this project, you will need to follow these steps: 1. Install NuGet 2. Run `nuget restore` inside the top directory to install the packages. 3. Copy everything in the `Kerbal Space Program 2\KSP2_x64_Data\Managed` folder into the `external_dlls/` folder. -4. Run one of the build scripts (see below for more info) and copy the contents from the correct build output directory into the KSP2 root directory. -5. Launch KSP2 and wait until the title screen appears. You should see a mods folder under the `SpaceWarp` folder. -6. Drag any mods that follow the structure below into that mods folder. +4. Run one of the build scripts (see below for more info) and copy the contents from the correct build output directory into the KSP2 root director Mods are currently implemented as monobehaviours with two fields: a `Logger` for logging and a `Manager` that points to Spacewarp. A mod template generator exists as a Python script. @@ -26,23 +24,21 @@ Mods are currently implemented as monobehaviours with two fields: a `Logger` for The mod structure is still a work in progress. However, the current structure is as follows: -* [KSP_ROOT]/SpaceWarp/Mods +* [KSP_ROOT]/BepInEx/Plugins * example_mod - * modinfo.json + * swinfo.json * README.md * assets/ * bundles/ + * \*.bundle + * images/ * \* - * assembly/ - * parts/ - * *.json - * models/ - * *.json - * resources/ - * *.json - * bin/ - * config/ - * .ignore (optional, if this file is present, the mod will be skipped!) + * localization/ + * \*.csv + * addressables/ + * catalog.json + * \* + * Mod.dll ## Build Scripts @@ -54,9 +50,5 @@ The build scripts are: The available arguments are: - `-r` or `--release` to build in release mode -- `-t [target]` or `--target [target]` to build for a specific target (accepted values: `bepinex` or `doorstop`) -- `-a` or `--all` to build for both BepInEx and Doorstop -When building for BepInEx, the build output will be in `build/BepInEx`, and the compressed version will be `build/SpaceWarp-BepInEx-[Debug|Release]-[commit].zip`. - -When building for Unity Doorstop (standalone), the build output will be in `build/Doorstop`, and the compressed version will be `build/SpaceWarp-Doorstop-[Debug|Release]-[commit].zip`. +When building, the build output will be in `build/SpaceWarp`, and the compressed version will be `build/SpaceWarp-[Debug|Release]-[commit].zip`. From f4ffd0db7a579ee45fbaecd435a1e1ab28f227c7 Mon Sep 17 00:00:00 2001 From: cheese3660 Date: Fri, 3 Mar 2023 09:06:48 -0500 Subject: [PATCH 12/29] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 200e3521..3f8f767e 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ The mod structure is still a work in progress. However, the current structure is * addressables/ * catalog.json * \* - * Mod.dll + * \*.dll ## Build Scripts From 0b05d9cbda4fefa71e5eb130796403e75f355f17 Mon Sep 17 00:00:00 2001 From: Lexi Date: Fri, 3 Mar 2023 10:59:08 -0500 Subject: [PATCH 13/29] Moved state changes to game.messages --- .../API/Game/{ => Messages}/StateChanges.cs | 17 ++++++++++++++++- .../Patching/LoadingActions/LoadAssetAction.cs | 4 ++++ SpaceWarp/SpaceWarpPlugin.cs | 3 ++- 3 files changed, 22 insertions(+), 2 deletions(-) rename SpaceWarp/API/Game/{ => Messages}/StateChanges.cs (94%) diff --git a/SpaceWarp/API/Game/StateChanges.cs b/SpaceWarp/API/Game/Messages/StateChanges.cs similarity index 94% rename from SpaceWarp/API/Game/StateChanges.cs rename to SpaceWarp/API/Game/Messages/StateChanges.cs index b8e665b3..d4043542 100644 --- a/SpaceWarp/API/Game/StateChanges.cs +++ b/SpaceWarp/API/Game/Messages/StateChanges.cs @@ -2,7 +2,7 @@ using KSP.Game; using KSP.Messages; -namespace SpaceWarp.API.Game; +namespace SpaceWarp.API.Game.Messages; /// /// A class that contains a list of events that are published either when a state is entered or left @@ -58,6 +58,15 @@ public static class StateChanges #endregion + #region State changing + + /// + /// Action(Message,PreviousState,CurrentState> + /// + public static event System.Action GameStateChanged; + + #endregion + #region State Handling internal static void OnGameStateEntered(MessageCenterMessage message) @@ -201,5 +210,11 @@ internal static void OnGameStateLeft(MessageCenterMessage message) } } + internal static void OnGameStateChanged(MessageCenterMessage message) + { + var msg = message as GameStateChangedMessage; + GameStateChanged?.Invoke(msg!,msg!.PreviousState,msg!.CurrentState); + } + #endregion } \ No newline at end of file diff --git a/SpaceWarp/Patching/LoadingActions/LoadAssetAction.cs b/SpaceWarp/Patching/LoadingActions/LoadAssetAction.cs index a9538af5..464cc6e4 100644 --- a/SpaceWarp/Patching/LoadingActions/LoadAssetAction.cs +++ b/SpaceWarp/Patching/LoadingActions/LoadAssetAction.cs @@ -83,6 +83,10 @@ public override void DoAction(Action resolve, Action reject) } } } + else + { + Logger.LogInfo($"Did not load images bundles for {Plugin.SpaceWarpMetadata.Name} as no images folder existed! (should be at {imagesPath}"); + } resolve(); } diff --git a/SpaceWarp/SpaceWarpPlugin.cs b/SpaceWarp/SpaceWarpPlugin.cs index dc6e79c6..941947f5 100644 --- a/SpaceWarp/SpaceWarpPlugin.cs +++ b/SpaceWarp/SpaceWarpPlugin.cs @@ -5,7 +5,7 @@ using BepInEx.Logging; using HarmonyLib; using KSP.Messages; -using SpaceWarp.API.Game; +using SpaceWarp.API.Game.Messages; using SpaceWarp.API.Mods; using SpaceWarp.UI; using UnityEngine; @@ -37,6 +37,7 @@ public override void OnInitialized() Game.Messages.Subscribe(typeof(GameStateEnteredMessage), StateChanges.OnGameStateEntered,false,true); Game.Messages.Subscribe(typeof(GameStateLeftMessage), StateChanges.OnGameStateLeft,false,true); + Game.Messages.Subscribe(typeof(GameStateChangedMessage), StateChanges.OnGameStateChanged,false,true); InitializeUI(); } From ea6e823fe5078d90994050c98b54ed8ee4c01f1b Mon Sep 17 00:00:00 2001 From: Lexi Date: Fri, 3 Mar 2023 12:49:04 -0500 Subject: [PATCH 14/29] Added close buttons --- SpaceWarp/API/UI/Appbar/Appbar.cs | 1 + SpaceWarp/API/UI/Appbar/AppbarMenu.cs | 25 ++++++++++++++++++++++--- SpaceWarp/UI/ModListUI.cs | 18 ++++++++++++++---- SpaceWarp/UI/SpaceWarpConsole.cs | 25 +++++++++++++++++++------ 4 files changed, 56 insertions(+), 13 deletions(-) diff --git a/SpaceWarp/API/UI/Appbar/Appbar.cs b/SpaceWarp/API/UI/Appbar/Appbar.cs index 6b8772f5..edf7ecb2 100644 --- a/SpaceWarp/API/UI/Appbar/Appbar.cs +++ b/SpaceWarp/API/UI/Appbar/Appbar.cs @@ -26,6 +26,7 @@ public static T RegisterGameAppbarMenu(string text, string title, string id, toolBarUIObject.Persist(); AppbarMenu menu = toolBarUIObject.AddComponent(); menu.Title = title; + menu.ID = id; toolBarUIObject.transform.SetParent(Chainloader.ManagerObject.transform); toolBarUIObject.SetActive(true); ButtonsToBeLoaded.Add((text, icon, id, menu.ToggleGUI)); diff --git a/SpaceWarp/API/UI/Appbar/AppbarMenu.cs b/SpaceWarp/API/UI/Appbar/AppbarMenu.cs index 9ea00093..222d039d 100644 --- a/SpaceWarp/API/UI/Appbar/AppbarMenu.cs +++ b/SpaceWarp/API/UI/Appbar/AppbarMenu.cs @@ -1,5 +1,6 @@ using KSP.Game; using KSP.Sim.impl; +using KSP.UI.Binding; using SpaceWarp.API.Assets; using UnityEngine; @@ -9,7 +10,9 @@ public abstract class AppbarMenu : KerbalBehavior { private GUISkin _spaceWarpConsoleSkin = null; private bool _drawing = false; - + internal string ID; + private GUIStyle _closeButtonStyle; + public abstract float Width { get; @@ -36,7 +39,7 @@ public virtual GUISkin Skin { if (_spaceWarpConsoleSkin == null) { - AssetManager.TryGetAsset($"space_warp/swconsoleui/swconsoleUI/spacewarpConsole.guiskin", out _spaceWarpConsoleSkin); + _spaceWarpConsoleSkin = Skins.ConsoleSkin; } return _spaceWarpConsoleSkin; @@ -55,8 +58,12 @@ public void OnGUI() { if (!_drawing || GameManager.Instance.Game.GlobalGameState.GetState() != GameState.FlightView) return; + GUI.skin = Skin; - + _closeButtonStyle ??= new GUIStyle(GUI.skin.button) + { + fontSize = 8 + }; int controlID = GUIUtility.GetControlID(FocusType.Passive); GUILayoutOption width = GUILayout.Width(Width); @@ -77,9 +84,21 @@ public void ToggleGUI() private void DoDrawing(int windowID) { + Rect closeButtonRect = new Rect(Width - 23, 6, 16, 16); + if (GUI.Button(new Rect(_windowRect.width - 18, 2, 16, 16), "x", _closeButtonStyle)) + { + CloseWindow(); + GUIUtility.ExitGUI(); + } DrawWindow(windowID); GUI.DragWindow(new Rect(0, 0, 10000, 10000)); } public abstract void DrawWindow(int windowID); + + public void CloseWindow() + { + ToggleGUI(false); + GameObject.Find(ID)?.GetComponent()?.SetValue(false); + } } \ No newline at end of file diff --git a/SpaceWarp/UI/ModListUI.cs b/SpaceWarp/UI/ModListUI.cs index c4bac9cc..dea4e3f6 100644 --- a/SpaceWarp/UI/ModListUI.cs +++ b/SpaceWarp/UI/ModListUI.cs @@ -2,6 +2,7 @@ using KSP.Game; using SpaceWarp.API.Mods.JSON; using UnityEngine; +using BepInEx.Configuration; namespace SpaceWarp.UI; @@ -18,6 +19,8 @@ public class ModListUI : KerbalMonoBehaviour private static Vector2 _scrollPositionMods; private static Vector2 _scrollPositionInfo; + private static GUIStyle _closeButtonStyle = null; + private ModInfo _selectedMetaData = null; public void Start() @@ -46,6 +49,11 @@ private void OnGUI() return; } + _closeButtonStyle ??= new GUIStyle(GUI.skin.button) + { + fontSize = 8 + }; + int controlID = GUIUtility.GetControlID(FocusType.Passive); const string header = "spacewarp.modlist"; GUILayoutOption width = GUILayout.Width((float)(_windowWidth * 0.8)); @@ -66,6 +74,11 @@ private void Update() private void FillWindow(int windowID) { _boxStyle = GUI.skin.GetStyle("Box"); + if (GUI.Button(new Rect(_windowRect.width - 18, 2, 16, 16), "x", _closeButtonStyle)) + { + _drawUI = false; + GUIUtility.ExitGUI(); + } GUILayout.BeginHorizontal(); GUILayout.BeginVertical(); @@ -99,11 +112,8 @@ private void FillWindow(int windowID) GUILayout.EndScrollView(); GUILayout.EndVertical(); } + GUILayout.EndHorizontal(); - if (GUILayout.Button("Close")) - { - ToggleVisible(); - } GUI.DragWindow(); } diff --git a/SpaceWarp/UI/SpaceWarpConsole.cs b/SpaceWarp/UI/SpaceWarpConsole.cs index 46f78ab8..c3667d91 100644 --- a/SpaceWarp/UI/SpaceWarpConsole.cs +++ b/SpaceWarp/UI/SpaceWarpConsole.cs @@ -1,5 +1,6 @@ using KSP.Game; using KSP.Sim.impl; +using KSP.UI.Binding; using SpaceWarp.API.Assets; using SpaceWarp.API.UI.Appbar; using UnityEngine; @@ -22,6 +23,7 @@ public sealed class SpaceWarpConsole : KerbalMonoBehaviour private static Vector2 _scrollView; private string _search = ""; + private GUIStyle _closeButtonStyle; private void Awake() { @@ -50,6 +52,11 @@ private void OnGUI() return; } + _closeButtonStyle ??= new GUIStyle(GUI.skin.button) + { + fontSize = 8 + }; + int controlID = GUIUtility.GetControlID(FocusType.Passive); string header = "spacewarp.console"; GUILayoutOption width = GUILayout.Width((float)(_windowWidth * 0.8)); @@ -68,6 +75,12 @@ private void Update() private void DrawConsole(int windowID) { + if (GUI.Button(new Rect(_windowRect.width - 18, 2, 16, 16), "x", _closeButtonStyle)) + { + SpaceWarpManager.Logger.LogInfo("Generating console close button"); + CloseWindow(); + GUIUtility.ExitGUI(); + } GUILayout.BeginVertical(); _search = GUILayout.TextField(_search); _scrollView = GUILayout.BeginScrollView(_scrollPosition, false, true); @@ -90,12 +103,6 @@ private void DrawConsole(int windowID) GUILayout.EndScrollView(); GUILayout.BeginHorizontal(); - if (GUILayout.Button("Close")) - { - _drawUI = false; - GUIUtility.ExitGUI(); - } - if (GUILayout.Button("Clear")) { SpaceWarpConsoleLogListener.DebugMessages.Clear(); @@ -117,4 +124,10 @@ public void ToggleVisible(bool shouldDraw) _drawUI = shouldDraw; Game.ViewController.inputLockManager.SetControlLock(_drawUI ? ConsoleLocks : ControlTypes.None, ConsoleLockID); } + + public void CloseWindow() + { + ToggleVisible(false); + GameObject.Find("BTN-SWConsole")?.GetComponent()?.SetValue(false); + } } \ No newline at end of file From e945b53c42be5f205921fbc01d9e3ff5dc39928a Mon Sep 17 00:00:00 2001 From: Lexi Date: Fri, 3 Mar 2023 13:49:15 -0500 Subject: [PATCH 15/29] Added configuration manager, and third party libraries for configuration manager, and bepinex itself. Changed the build script to package bepinex in with space warp. --- .../Patching/ConfigurationManagerPatch.cs | 14 + SpaceWarp/SpaceWarp.csproj | 3 + SpaceWarp/SpaceWarpManager.cs | 3 + SpaceWarp/SpaceWarpPlugin.cs | 1 + SpaceWarp/UI/ModListUI.cs | 9 + .../BepInEx 5.4.21/BepInEx/core/0Harmony.dll | Bin 0 -> 204800 bytes .../BepInEx 5.4.21/BepInEx/core/0Harmony.xml | 4288 +++++++++++++++++ .../BepInEx/core/0Harmony20.dll | Bin 0 -> 111616 bytes .../BepInEx/core/BepInEx.Harmony.dll | Bin 0 -> 5632 bytes .../BepInEx/core/BepInEx.Harmony.xml | 86 + .../BepInEx/core/BepInEx.Preloader.dll | Bin 0 -> 42496 bytes .../BepInEx/core/BepInEx.Preloader.xml | 169 + .../BepInEx 5.4.21/BepInEx/core/BepInEx.dll | Bin 0 -> 125440 bytes .../BepInEx 5.4.21/BepInEx/core/BepInEx.xml | 1729 +++++++ .../BepInEx/core/HarmonyXInterop.dll | Bin 0 -> 23552 bytes .../BepInEx/core/Mono.Cecil.Mdb.dll | Bin 0 -> 43008 bytes .../BepInEx/core/Mono.Cecil.Pdb.dll | Bin 0 -> 86528 bytes .../BepInEx/core/Mono.Cecil.Rocks.dll | Bin 0 -> 27648 bytes .../BepInEx/core/Mono.Cecil.dll | Bin 0 -> 339456 bytes .../BepInEx/core/MonoMod.RuntimeDetour.dll | Bin 0 -> 105984 bytes .../BepInEx/core/MonoMod.RuntimeDetour.xml | 178 + .../BepInEx/core/MonoMod.Utils.dll | Bin 0 -> 187904 bytes .../BepInEx/core/MonoMod.Utils.xml | 1470 ++++++ ThirdParty/BepInEx 5.4.21/LICENSE | 233 + ThirdParty/BepInEx 5.4.21/README | 2 + ThirdParty/BepInEx 5.4.21/changelog.txt | 7 + ThirdParty/BepInEx 5.4.21/doorstop_config.ini | 16 + ThirdParty/BepInEx 5.4.21/winhttp.dll | Bin 0 -> 25088 bytes .../ConfigurationManager.dll | Bin 0 -> 56832 bytes .../ConfigurationManager.xml | 197 + ThirdParty/ConfigurationManager/LICENSE | 233 + ThirdParty/ConfigurationManager/README | 2 + builder.py | 9 +- 33 files changed, 8648 insertions(+), 1 deletion(-) create mode 100644 SpaceWarp/Patching/ConfigurationManagerPatch.cs create mode 100644 ThirdParty/BepInEx 5.4.21/BepInEx/core/0Harmony.dll create mode 100644 ThirdParty/BepInEx 5.4.21/BepInEx/core/0Harmony.xml create mode 100644 ThirdParty/BepInEx 5.4.21/BepInEx/core/0Harmony20.dll create mode 100644 ThirdParty/BepInEx 5.4.21/BepInEx/core/BepInEx.Harmony.dll create mode 100644 ThirdParty/BepInEx 5.4.21/BepInEx/core/BepInEx.Harmony.xml create mode 100644 ThirdParty/BepInEx 5.4.21/BepInEx/core/BepInEx.Preloader.dll create mode 100644 ThirdParty/BepInEx 5.4.21/BepInEx/core/BepInEx.Preloader.xml create mode 100644 ThirdParty/BepInEx 5.4.21/BepInEx/core/BepInEx.dll create mode 100644 ThirdParty/BepInEx 5.4.21/BepInEx/core/BepInEx.xml create mode 100644 ThirdParty/BepInEx 5.4.21/BepInEx/core/HarmonyXInterop.dll create mode 100644 ThirdParty/BepInEx 5.4.21/BepInEx/core/Mono.Cecil.Mdb.dll create mode 100644 ThirdParty/BepInEx 5.4.21/BepInEx/core/Mono.Cecil.Pdb.dll create mode 100644 ThirdParty/BepInEx 5.4.21/BepInEx/core/Mono.Cecil.Rocks.dll create mode 100644 ThirdParty/BepInEx 5.4.21/BepInEx/core/Mono.Cecil.dll create mode 100644 ThirdParty/BepInEx 5.4.21/BepInEx/core/MonoMod.RuntimeDetour.dll create mode 100644 ThirdParty/BepInEx 5.4.21/BepInEx/core/MonoMod.RuntimeDetour.xml create mode 100644 ThirdParty/BepInEx 5.4.21/BepInEx/core/MonoMod.Utils.dll create mode 100644 ThirdParty/BepInEx 5.4.21/BepInEx/core/MonoMod.Utils.xml create mode 100644 ThirdParty/BepInEx 5.4.21/LICENSE create mode 100644 ThirdParty/BepInEx 5.4.21/README create mode 100644 ThirdParty/BepInEx 5.4.21/changelog.txt create mode 100644 ThirdParty/BepInEx 5.4.21/doorstop_config.ini create mode 100644 ThirdParty/BepInEx 5.4.21/winhttp.dll create mode 100644 ThirdParty/ConfigurationManager/ConfigurationManager.dll create mode 100644 ThirdParty/ConfigurationManager/ConfigurationManager.xml create mode 100644 ThirdParty/ConfigurationManager/LICENSE create mode 100644 ThirdParty/ConfigurationManager/README diff --git a/SpaceWarp/Patching/ConfigurationManagerPatch.cs b/SpaceWarp/Patching/ConfigurationManagerPatch.cs new file mode 100644 index 00000000..0aeae2f2 --- /dev/null +++ b/SpaceWarp/Patching/ConfigurationManagerPatch.cs @@ -0,0 +1,14 @@ +using HarmonyLib; +using SpaceWarp.API.UI; +using UnityEngine; + +namespace SpaceWarp.Patching; +[HarmonyPatch(typeof(ConfigurationManager.ConfigurationManager))] +[HarmonyPatch("OnGUI")] +public class ConfigurationManagerPatch +{ + public static void Prefix() + { + GUI.skin = Skins.ConsoleSkin; + } +} \ No newline at end of file diff --git a/SpaceWarp/SpaceWarp.csproj b/SpaceWarp/SpaceWarp.csproj index be742735..61de490a 100644 --- a/SpaceWarp/SpaceWarp.csproj +++ b/SpaceWarp/SpaceWarp.csproj @@ -36,6 +36,9 @@ ..\external_dlls\KSPLogging.dll false + + ..\ThirdParty\ConfigurationManager\ConfigurationManager.dll + diff --git a/SpaceWarp/SpaceWarpManager.cs b/SpaceWarp/SpaceWarpManager.cs index bbe2096d..7891b806 100644 --- a/SpaceWarp/SpaceWarpManager.cs +++ b/SpaceWarp/SpaceWarpManager.cs @@ -24,8 +24,11 @@ internal static class SpaceWarpManager internal static IReadOnlyList SpaceWarpPlugins; + internal static ConfigurationManager.ConfigurationManager _configurationManager; + internal static void GetSpaceWarpPlugins() { + _configurationManager = (ConfigurationManager.ConfigurationManager)Chainloader.PluginInfos[ConfigurationManager.ConfigurationManager.GUID].Instance; // obsolete warning for Chainloader.Plugins, is fine since we need ordered list // to break this we would likely need to upgrade to BIE 6, which isn't happening #pragma warning disable CS0618 diff --git a/SpaceWarp/SpaceWarpPlugin.cs b/SpaceWarp/SpaceWarpPlugin.cs index 941947f5..58e42af6 100644 --- a/SpaceWarp/SpaceWarpPlugin.cs +++ b/SpaceWarp/SpaceWarpPlugin.cs @@ -12,6 +12,7 @@ namespace SpaceWarp; +[BepInDependency(ConfigurationManager.ConfigurationManager.GUID,ConfigurationManager.ConfigurationManager.Version)] [BepInPlugin(ModGuid, ModName, ModVer)] public sealed class SpaceWarpPlugin : BaseSpaceWarpPlugin { diff --git a/SpaceWarp/UI/ModListUI.cs b/SpaceWarp/UI/ModListUI.cs index dea4e3f6..9c434516 100644 --- a/SpaceWarp/UI/ModListUI.cs +++ b/SpaceWarp/UI/ModListUI.cs @@ -79,6 +79,8 @@ private void FillWindow(int windowID) _drawUI = false; GUIUtility.ExitGUI(); } + + GUILayout.BeginVertical(); GUILayout.BeginHorizontal(); GUILayout.BeginVertical(); @@ -114,6 +116,13 @@ private void FillWindow(int windowID) } GUILayout.EndHorizontal(); + if (GUILayout.Button("Open Configuration Manager")) + { + SpaceWarpManager._configurationManager.DisplayingWindow = + !SpaceWarpManager._configurationManager.DisplayingWindow; + _drawUI = false; + } + GUILayout.EndVertical(); GUI.DragWindow(); } diff --git a/ThirdParty/BepInEx 5.4.21/BepInEx/core/0Harmony.dll b/ThirdParty/BepInEx 5.4.21/BepInEx/core/0Harmony.dll new file mode 100644 index 0000000000000000000000000000000000000000..99daef723fd1dd2189780b60d5a2f12c2a3e4e34 GIT binary patch literal 204800 zcmc${37jNFnfITaS(Q~?-90na-BUgHGy~NnbqvD{$1ouGp~x-5aNh_hBvdhqQ&ib_ zi!k1@qN0w1H{Ob__kHhp?<&lCyX&#*`s%u?yUqXmdm^hUtEWfV_p|@cTc7UCh$o(S z;)y4oc;b#c?SdD3f#-P{{vUb7^B&}_-!b<5%a2)t7p?usBJcgfU)$%wp;N!M&pFp# z*POno5kIMM`3=)oUVh_^@h#I=Ts_^`cH{JQH%^~$#uKJ*h_AYO{n%Jxzl8LeCwktg zLxJ~qpNOB+P3?!?y6KUj4W3tmv%G`ecrfm1+{cJpZ;82m$F~6D-+r@%1J^I`j)CS9 z`|H0GuS4-xLH7)~p?h$TND`>mWq~)UH+ZY`ezd>o9_tn(kN>f$xa)7Z`qo?U-!hrx zOLUk3z0`FMJlTI<% zMj@{(_~H74!`gw-0YWq?p*`aYfZ9}4HMru3Mmw(ItduHKm2Xa;a_~<-KYhRxpLpK| zspxSXgslmuJG=;0E>w;}1_$9l1{>wS0RJZEKUlA9`w)R= z{MAztaYI}|&$T*mFvNMNkb^cN%Rp+FmxL{^-sU$N<2@RQ3mWF?(c;&Dq%w33i zD0&Ql_$WP&<}vDm;$v{l`-4k9W+p?0nd>8ya&_;?`A6L?Hyi`f{Hgo+u-@&HNV zoXH1ccG8y zT!JqJ>}R5RIv6Ng68N?S0wcsw&BtegI2@nFv+)J7@OcW(#R^Ou>69lj#f+t$3FpFL z3a)uJ@gmGmHAM{^k#l7cog>N%6hr((0xDLYi#=WGs|uPRRWV(8CGV_sr664iGwm{^ z)>%#g1mk{uE_7Te}|U%6sar zeXWpo^%P=fDSE+>7tTt5njnX>D{)mOHe@~JGbEq8$oxtx%e4njmW;w=bQ#18VSPp8 zJCsr%!>UK~asszEemIm4i7`=y=t>@a?8)X;_{;ItdUmei8OBfI*}0ZSe4QTG^VkJn zj)CaOcyE!H!Vr%Xrj)jQgsdmZU2*7BSJ2B2MzKQ4j6v%!$1$j*d zD7gLpGTob@=*NvmO*in)hbp$N=od;O)yIdqdq(?G$#>pN5yVZ%jSbgw!x4p0t;`RP zXm$�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�Y*r+#Cg9S`aGfdAHffM#CGvkHk`0{b$6 zH9q@S(gm5!ou^2i43(Lb|FOL!*o5&oJiA9MG(H9QL&ePD?}d@T$`Ml(KOSi5o{3y( zg3n|z1RaXkp%#4J;_BjXJdLxMXQ#+SeqwBVEIJirOnFPvvg^D`8#2X0b=*O07ZPUv zS0XUNu8Ee!Ssbwfz+7_TtGj2sIJ(o-01{aZdi|xlmllV&F;g-m`&7#n7r8IH6vK(d z504K0*f2pQ5;7n zWEw{EjhO1?&Ll6%*B0j+d{^M6NXtS}r=V}P*9SqB8xm9x#(aJGd?dv-~-mKXKk&VtGun?|1fAt~$ zlzr4dI8zJZtQ|XlnL|3s*HNMn+R;aOLwifgAi=@ueH&o4R3HBk-JQ_AJ+Vi3A>ZWc zDqE!}gljge;nIJ*2zmvGGyI>+|3?19HS0^&GecG_Ht}79^;^Q}S)l7TR*&>=Sto5$ zSB*JhjK)y(8S#`XW@zk=`(VL8?cnOMM4yto@oIQ*Yb1Bl-Ayicv(98!hG!!lzP}Ma zK{70H>n**#uk|^fiq9c{?wh55qe6d?4t*k_F3i@6uZQVplK<)K((KYg$VvuZW(H-f zdiZdB9uB_Nxa{Kk(s1P!;nr~N$}6{GBu*j=mlvvh8|aGM)?6Amq7{#%hJIpqVYtQ_ zNF>Lx!QAxKFWh?Z1^N!V##%mKi97M!?tLN|?~m}I-}I43q6}J$u(gS0m(9Kf_pW0l zi^o8y@nyqVQ+ciZ(6<;P_n_ zp{~{G#%F|jzECIQ3wYTTJB{A}wRPE9HNFF}Gc%>VMjNSiqp7iOUI@Kene^sGa>>@a zbt#OI=8pM3!^H%&-$Ouhr3>Z>=N81?exEsykn{cKyhOMk=sQ0sr+vkS6&G%$a!W6l z;b8BjXom6Sc=(2!-xA$Sd<9+hYv^PZo12pPbC!15ASyiWwX=67z6$;-E<^FvxJw5ub-s-8A72B^ z%#>v^eo`03vTWDr#@F^xB-HpiLt&$=d>MD$^mFLzMbG8oNJ--HQ@VKaW!x>)&lBGB zdw432_y)t<;J4(%D)XU+uz4fE=mo;QgU7M4-4%@3G^wEq zAt@5@k1%|}68sb90)vLxb$`*_?dfwpC$N9{pL1^ zw#7g9JSyLQ^QnTcH>7uaigY!j{e<>=6j87>4=R4pDN;LZGshAfd@xRRLpx#1vkHkW zr`V%oco+w6J(di*bX?Y3qSX98^5PaSiA@Itaks>wv5EVma_fQnV{+?(8wJR;_28p^ z^CgMIQ=nk0iC1bMVQ?XZy`w8&uJXG9%=l>ts53s8vn~CcDWsn>`aqff9uy-QWDa6O z-IAdt9ODYkpW5mOvdtnbsw4UY6_O%&iSGmvY<2I<)`%S=T&5ayCI@L8DH^xJZFyE9 z(Mu)nm+7%l*>dH&9%;)4`O!C_Qd0-f;#NgXjK+{-3YrG)uyiETwtTcjvjQL%PxX-sNI%-;M6Bg!SAaor#!L3H=K0rCs-zHIa8AY$Ulz zl4Mo*HkcQWPoK}@pw`4~@O<05K_{%s_pdCw3Ey1jU~KvH(Ia-4hr#VzuuFdQUEJIe zK`~gHys{TR6a8jk0*1Gyi#I?_HG>T-y|f(79#587aF#29G~O$@j72pp?vRn&w;E&L zgVveB&GN+0u>5_5&cQq^25~|tmokRq zQ8xOW#R{@U=uRW#1Te3P#GzT!dG|I-sgXn{mOZlAYw(9bi~b4U zQ{6{RaFwe}DJnh&+NH$w4qJc1ndED!KTO{N2o2X~&w2Y*yM6XR-x5r8Dig8Eq{~IR z08dZbrubP4N$A-IlpR`|(8B`dGeKd=P`HHarDX6DOXN_m+0(+zS?b)Q?c@+7I&C(C zF<}tx0>S6hX(>_mAa`Ve00l-3>sM^?aYzHIz0RWz`PL~8>43Lmna3d~l>xwPjDrkn)<8ca=f5rUB_;3S#3qOR_{Sxj%}Sf-?3jUEtH-5`%)PwHGZHB zBpsVq$U3W|lH|qJ<8$FfHj%X%Yt!lnH2xr~WhR!n>*uP3UDM|fG>L(xag&S_VEy}i zLQ#B&^~H=!sLpCF&6fN6lAapVAbuWXti5_F>CuHQ2Bibl9`w5e8C8(;R6!^Z74Ly7 z@`(aEHL@xme@TTy%)IN-u67AHU)mPL&nLxTYU`4rUUhn->lZAOye!HX665+2bjUGr!Cn&Z3W z-2EPh`}{+P9d@ogUW#KbJX&q(%Z#!@T(|pf=(ww0f2F?VaX!-q5mIED!H(fekA4Jw zMgpukb{cAHR~9U>B!gcPFr$doV7#psx|S ze!q048~p~6T*VBA91cg{{xH4j;#@>fXKFBy$0(0~LptSIg}6Na4S5`e7CoVYi6-B_ z%+?Xh+1Q;m$Ih}rddG^M+eW33{zU4Q7#PvkbECzpltHc=)47;c%mv!H7dnPqO%aFfgZgEX=yOv-xTO};&3)gEVdI^B z-(_LreSP2AVdKMn-w9#k6Mf&I!)vEEE*@Un*-&6M>9vSurpl=6b3Kf3Sa*;&z5*b+ zmtZGLxA)e>eDpi#xO*v)ap?2`UN!$W%bVdN-~1kFd;47-YeSj9@_nBw1km^d$6@#Hnd+@%qG%(GtNzLnMB}lQj*qRi-0gx&L=rh zaAncy6lCWuO7N{bRD1^6)Pqp!T_%?9$%GAuoqXrfd|Qt~m*(4hkVirDp3W!W%yARH zgP5j%HP(wv_newcRqpA0^3kAuz4NI-wA!+SkWCUb-$??u)2^on%&p9op|iC}iY;v<@UiX{G{2`feiEclB_(n)B`+q$k(Nj0dr}U&YK!w4W+F zP#a@=R;Rpm!!+BMjh+L(ze0m>un?4y60l$ z_7cnK&oS_!@|FH9z{k@NP4Xc(YIceVW+G)_6N^`3BFsi&K{67X=VgXTGe^z$Ag1KI zZ|}ufIf{N?6{%=x%0V{`|~OH7gFvorrcjjxxbupe6%`_ur-5yHf6Nq}<<3xxbZie>>&=PRjk=l>2)r_ur@7|B!NjKjr>G%KcEv{cz7c zD_fhCiA-6y#AU>~ZW*txTSlwvma*!(Wu&@p8K0R~YpPEWy^7vG-7BB7S%i9Iv*;J><4zVgFm#8dbF7HR zBm2eXkHm@}|CrZEb!9I8369Z_$?Bit;Po?J@y~hW-2Q-vcNcOscH1$@RCp*DD@|mo z$8mq{Jqd+Xj>1GX@(Z=A113T&{@t4KHiIj|7fdFuve$GGout8Sdj=${fndu(~q(7hw;;IF{f1 zSD^YL`)_%d<}_dE_BIv8e}w#IKZAy>9iIIhuhQ)2rR>K;efA5u8vm?r_j!2Pw)P;% z^;|gnSpq7h=--rF^gEt2jgj@B{U4kz@VJhMb&S^UflB{W-X!OtzQvA`gd)0CC>ff+ z)s{Le`P~dI-=Km`WHRbaPIvEo3T%(id>S3`8XbiR_uW8~QC6W(CYj$F^``di((%20 z7U0F``0*cLITf4P#U;{*QEzN{KfdzB7lz!{!hD?>AGhME>X#T1#{8=3|5~dW?Utc1HDy`clzq{#j-=r@79-5@5;E#Yv4(5 zu_lAO_Sws&i%vZ4F7^}e>4MeCDQ}|EPa`_mrLiUX?4%!^hz__j@`o%S*G3gRb(-7x zFVeY_X{jMwT8RF8Fn9g3+Na*lN5=aDG|}0CeE2^cu}PlMsfn<9mHTWf(=F$b61#jZ z<&``6&WDuFVd%7}=O{a$Ht6QGYB5}MagFu%&nWI<+iJILi~Yd+^Y9R->w00 zSbK8wWf6I1kGZel_3isdEKYqD#@mMQt!z9XjW+J>9yY7BNuDZyN^`>SxK~nk`T)80%cvWwGP3jUc1P-v&HT~-BG^R# z)D%Vb(eWa}JeDvtk&d=AQ z;O8*|{3I!7T*~yTxvXj7q_uflbtkm_4s@j-P1>30L}2NhLmn}#k0zaT0+}R%zR;6QS^`;@z<^ZkN(`1_rRFuPhN-)%rFLqT*q1gK zBHec(sE%|~oP@cw#uZ$1ITuf>@engRNM=a9Sh{yR|9O9p8*ToJl^In@@pJDS`?{ff>mikG%`R_~}S)m+i}hG3W2OUTu1 zJSIy!Yw#7FZz`CN-P&8@na7i7{i3H4zqT=YI!^!~US%Q4ph%|nSMGN9f$O^&A(oo^*9 z+S~MPfB3r}S$4in5PNZ1ts5u(TSB@rqt6hK@2S6@UQU6tXg^f_bl>uu7iaP>#97b5 zLU_NlL>2ia_d=s7cx#a*sgnzp$>x>t&jInv^a|poP>Zj?9hY!bKHiVC@7^Qz@lUZn zCYz(4PddrUi`M#oMqb}cUfrpO+In|(f@Z47J{jTqYmatoJxoVF9yyNqL5{&{bO&L8 zP6xzNND#e1{?2z04nyjA3Lb02e%^Il!FvpN{f+dsMU>AKv_8FXPF@t^Wy<4n9*uPr zkZrlIt?qnRGz}ZVE9MhkDZo5(5a+-Vo!8vVKr-Z2c|Maj7L9!z)m#|g1{=(#C?oZM zOEO)p`fD$A+4k4gf_N2)Or0OE<~8H5z1W2W7In#x6GHuK*t(2Y9P;#iZPws}c#W~< z4#k`7c3jtmE{DY%NSL`_3DRF%bu_E{I#Ib1d`cr6KxwI8>jYx8W1_) zxqYA;6bkdQKJceK%bab4HN2q=FcC5 ze;tq5`8UY_*uMXqdEt$L@L5$tPV+X)5Njj1WZNfWKP1cWDxRXHYyZT#m&r{rWGY*N z=AGy_TjgFX`>=%_Elh3GuH7Z?xoej+c90IM1==*|E@^Z2^hT#9*zq>9*S>Uwps(D? z7tg>&^9PV=!leNHmIT>Bv)PCiSCq`L2{+pN!S^Bh2*pgluB@k9CiF8#VnZ;)16ZWS-noI*1#ywDnyfZ`q;Ro{{!$H!Ck$YXN3DyIijEhJ9Q{%au;!$ ze?9(u%)DjDE~`Kk1=iFqC!n144g_T)+?=7_kB1R0Wue?U78WKLiT02=!e*XgK4uO$ z^ozOD`0#i^OKshx4kBhTr)k=-+&TsVH8xGT3_PqfIka8SavYI|!|3JaC`2#gO{@zs z5q2!9eq-Y6XLbEdHgA5JD@bLMy6P#|iEFB3f*E$|h{OdkRWi;1f&MafOb%}N!W6+ZX{Ux{w zB_>vssm@V@q193XKYB0)_&5g0mZ!L{kns&pdcsNhstt7W$|K&Z?|0%<-|;x$`YBHd zRdE>1XD($MjKc(1mC$9x?3Y`sd54wFzeuiTzlJKZk8dJhX0Zlrm6_C>8AMslCbQ2f zON*@PJ5rrwHAGdHix#Z%#+b+um{hs`6SqRr*JDa9MN-yPbByjzD&1PW&-E_vD$n1O z?{^xnJ;UC&m8P_H*2S#^dWzuuW@R|P(Y}!q<3=SznpYJ%^jOmt`^hqcBjmI^tB`0X zW-vZh8RLuT@o_lDrbdQ4$K!}k;4vJwV(G()xWm>>IEUktaOd6H)>n5I@-@DNU~5}p zj`e-<$h!K;yrReQXe)Y(wS?Z|2l@D@=LtnK&5f4zrx|oVfd>tSxiRW5VAJB-OnQKm&!t z$r?M7)EaiPAQT%!#HYdUmS=)Meohnk=6F?QSl#;7oP0eCiH#Zn;ZsN9s&xiBZc-h<_RH*YM``YV%r^2va6L zshDTNSIU`g8{(f4bEGzsGaa@{kPbOH?`a_J9cFbcdeTrz`&V+T`!mq=e{)H5TvRW>i46dEGpnN8ru z=t26)weck20s>syUCG#C_`^Ss@G`roer}+(Y305E?AN&v`Cp1<*{y_L$J6HC%3835bsHRlG)8SMyAI*tzgd zaS{KjSA+7d?~`Ql8c@?c%_nvJs4a6F+-r->-qUM8OjFQ$YlF3#P!Fc~kcjTdrQOm! zxz|FVo*#~{h!7m#72+JG-PzY z+3O(_SGH2*b9}B8pG=f=PDB+oO7+rI&Rnv+)nI%}3I-2kz0-=EbuiO~rwAu&y`gHN z2B3VK^o=$_ZN=+q$PIn;gusnJ9BQ(!gq$7ySQHk4N}jK#F25Ifj(dKa*?8O>Z?xiOjsxy9@PW7w=^ z(Z;Z$Yox=rs5y?(&joX?{YRmVKDg{&@fa35IVj%_sc&Y$xw3(7=r$0JNsQs}3Obn{i+@V_7l8wbuSS7kF*t{eo?oXyv$r|&bn*X#Q- znp)O53zbNPElj$Dbo1T(PIhWMH=f^Pekc2==6Beq<>q(tHow!G zV_|oW&9T6TIwx)nKF~kWvWCmMX;C__PZ-Q=v!7Rm4CM6`+StLo(xM*+R*$;bo;|7} zwO4X47EB29qNErq4o{7bjF0Xio&S%y_YRM$+WN=$IWsv^QpluCLIMc^62?ptAR#@p z(0dKNcMv!*1B#3p0w{`7M1-p-7HrpsBKB)R5yW~?#4Z-Dbvkk&5`D*=JqP+6(CO0EbRG26p%>l;nW zC4)h0ABr!-V#_1fSq*U8*I6F9#0uSI<9YtfJW>orhLCMyAdQ?W=TGuCYwLDe)ikRu z(rJ2PgPC;hb0PDq@tXp~u8YqEj@=Hi5B=Yy)1A2xG<|)A>L&X%Ek*-7P+E!dn~;GN zNW>)Ih@O)P=$aIOUy5V`6f-73dy*XJJxqY`Bq7y#%#G-8K=k@Ef!50%I0q<9!~y!mGH_zWH-D`{J5A;!&>-?Ni#3Fj}# zW(GNs4!FDxxGRiptX{2qs?HtQMU_HyKz>a-*K8J=ZER?Z)CZE9VXy1Vrs?o}DiiHnK$&YFpc2ybK9x9093Oy z@0z74>S0X8L`m^UiwVyBagx*$eLkKVs`|#_j1{!AEy@oNL6#mxkZQ8Qn<){Qzo*n! z!7DYzmx4nPO>l-+0|f3wH5Z}%TJrIw1lEwpGTKy1^`#b13MF=-6L1y>Te<=>Av|A7 zxD>q`r@|~x1P_}b+lD6pPa%D&^7de360lba#(=fR2*!X5@B_xLP$gB}U6yE1tB}*e zUMRz^vxRjatSOdbRs~EwEg%UUiC%=CRID6HZ!&h}$@-U)F005`Q{w)=bXh;QXjaBz z^|J*;Geug|aGS4w5!E9_#-DAc`hEUb|0>H4?X;wJ`iVm$tEm~j47tWl@%h;dI` zR0(;3h9tbj6LU81!T_D`4}F9faYHCPs0_REGec*U6Qw0D$?(u@sEqM!#3DIbg?cgt z-`P{$az=K^yF~e1uU%+G9wQe;xL(&Ly-bjKMV)JK+gANukdHFSo@(rx`0&eGDoHA~ zXfh(H?i0tdq)r=)r_Agsyjb^hC#=do6DMDS-9y03=v=lChV~hYmUU{3r`!ukF^L;) zQ_#3=7?i5rPKuH8ZB%rMCR<1+yNJ-3?UKQfOp4mq5<2eJ)U2^PY&Dek;Uhb8(R3ru zDA8iQIK>sX7?~<=6`F`jGI&Bu;bu)to=(NKXel;9ar~w`-47YsL#!^o9n*F`+d&GBW+&lv5=Cp*bH^Lg=szH3uf9uHf=@GOJX!5txJj0nl+v(?6!!|H@5olRG7o2?8Yll zGFdecwbV=KI&Rs2oj!LE+rF|7dkg`>HZ3QpV!D6T1%$hJJcnmvT!ImvE@fCfDgYCQME1YbNm40;l-Z!LECg9^SCXn~8a6MH<$HNk?cqr$b|xyzSSjjPQB zl>cV^O{z3ickp-?6TT!HB4Xj&DaZjGL`cmw7^r*sa_!w~LyVH-93GwxRVCloqLDUc z^L?I1+H}qLUOYxWOYt59pamaMK^1VTQqg|6-c}p-MD#>t1pU z9nwy@E3g@9&zP)>=2N=hL~P=r==V3s~aTL46WMiq%51I zSaR`uM>>RuGlU#z=mn$-Q{0W{J2KADF*}8#41H^-pajm4x5^gkGorMKQDk}K0Z&>7 zFGZOjMwxK{3snb`m{S(G8-hq0XU@2_O=ga5I^JMFV{=Zt5n?z(xOjgzrozb57@wjZ zwqI3Mh;-$8v{ZDNBe%&WgvL;+G4Zm-SvVoIMpc+D*qr6@r^Ml4 z&-Gl7JZRFoSDI_w|HEOWI47H}4V#U|HXCW6i7AjJZEa(hp;1vUh-p+fZd&YiOY4hA z#rL&rYcWn})RbBqaJEAl=3Qb*;^^_%o?8P7{tw6_d>)2qdP{W@cM^j59AY4}3LMj4 zNh{6EQN+MqSZhQZ;Ayk5E+gNq@Xc=`pTKVL1hD@Zq+2rs_drO6UcQH(kY{;LzqIy>DRA7lG3d| z4~Ao~+}ucvij4M_enQzFL)ioO&@N_b z4hsDQ<>MLT-fx^;q>RBtGYO=4jTI=lg_od03v|mzHX0F;)4*wU(D)VR6o2BQ`H4Rn|~02_%r`Yk}b%P{bfto@}vCaMv_^sB&$ef9_xStr+p&C|%9 zOjnIi&h#DN4?Kdr>HmUye9YxCjC-6n9b1B4M{IoSAsV*HZ!F2)HW%f1g37^7%CNW5 zqXeOU@xT?6PtBO zQd0W0U~cw-v>e+LL{gUd&8gYB)$l-;8cVS+z3E|}-mhrkV8`FajYt=Sj1 zL%#u-FAl0O>{PM=L!3vX&=Wm;U5rdeN}a_V{Q-el)P8&?oa&M9$7u5X7~`{Et7<;* z$R}iE!&!nncw!H$pnjyB(nZS>X_K`NBDgu!7)0);w#I|VQ{ivWN-+}X@k?NJcxxpC6f8kw_M$;*Z`bKj7L9Uy~B`}P_ zhIBWw5xyCOz>{!+@K`f~j8A^+vY*-s>R?_=)4fPdQeF{gz|Lqf~` zDh%l^QREuSNMDpPYPLsmt0{_p3qlt;U5UpghgV_r#fLKI<0pah#KVUx&8^=GCOnq} zk79plel5u<6-8pbBm5F7YbD2x4%K9U*+qMC)5>dPvc1>+_eJZC&=21C%!s zrB^+zb(W~J?Oc42r`t6{560E$rZFz(72co2Y ztneFM&zvc4{SHJBNd2q)rR11#IOr}mfyvhwrKVw)kKEB|=4?L|j#Jti2rhgl;>~X& zAN?*k3pkX%8_xJ(0kn|2;Yz^u1^3`r-vht{qgqB+8r%ys@mPCs?S-rOWqF$PGi&{l z)~qt*eIGqV*)owt<)ynGR<4WX8#BLvlHd!kMZUaI1vxIxK0FPTC|3rzq7me_*Tbm$ zCi28XQ|NE;ntws#bY$OEoF~Iz#MaoQ^0(PHe}Wj8BiJTzAM)wa?+3(r*uVpn{}e~y zLHsg@7NMAmRaYU4!5RS>gZ6X*N$eqT2XL??h%*v#Ho3G#I;mQ0RP z5IR%V3FUka<)kyif2t!#_+dn^h93dc{{dh%8RLG6WRV$=GRsM8q7I9*)o}uIrGWf= zQ3ohRN})JhZ^>;xZunIs-ND1xLHlAP-xlNU%Plpj@p5>er^Xta(fzGyI&4tC=X9Q`SH7d!Ap zh8vC6&>B33%v%e8nUwkNjPQQS616<3pLzA0;ntr9l^(!|QVH|}!1&BNMt|`l<$=Vh z>IXrWuNsA(L3!9XFI(yI%aChi4^84vxr;o5U|Qr5p#Cg?l|Qq6Rf^1EGJhrE=fKcJ zQ6PPnco`N}43@s|#nh*;CYXix9Xd*~jF2-e4O8~>2omb+z(++mySYTi**z~`i4j8s zGeJvrr?^k~b>x#@FNsa>@lHM*iB~YtHR)~~8MhvXm0xa2?o|B+B#@xF!Y|@C-><(! zKhb{z>W2XWF9S5rL2k4NLH!l-IRYT@sGCHJWrR1}8$cfjaHb3;^0gizM^`)}=!xa7 z4c!+SMq}{i8}YwN@gF779n@4a*&aZ!EJXA1YH5wLNl?XzE3^nehO~!&4dKJD1K|Fn zQ`&kO7~UXE!=vzYRMeD4egTWoCK7(K$u3(;kZVJK6EWBmd5aPm1b<|ms!M+x1pOU= z{5IRswDfn$>DLDn3-W$UqVM5{3joq^j-5)QkBB8i8khb)*zo97af&DK0XdO0^RYVS z4SWci4{vT0EpQx&z8RPB_&E&ro>P9TlZ<1blF`Vg6IE}8{fNST4A6|_aVuki zPvDoI8n1tfUtfGG9fZsRCRJfcCQ_0D-vi6ne;`^5Ukh9VgDJ!3^A!_v z1tHiGEN&evF(kk>;nRPlh)6q5O$}z?4J@-#ev%}ouLbQ5rnbn}e+C7QxE7@NPo*Qt zY@a{q4g3OP_*ddhi~dGG>3DYQBphUH&a&JY!6dkU2i=z*IEA00ZphVE%2l#2xu~-* zS^opn80DyxfH*>1ku0mAd=FP3 zk>bq;x5b8CiX;%x7P8S6j8YzJo7xJgwQ8J)*l?~r>y&mWwK!;chPB`r<+3%j;1L+KDIpE`93!vVV52sSsotjsqmR~_Gn6gBu*=PDzl_p z`Ljx&%8|xAtn#OFHvCoyO9C?EF^`xGxTqOch?opmI57`P1|-Z(i{Fv}i9SZQ%1;&5 z(&DyCPt}@blA97y_QR`9$>es?TcT}57oZE_8hGkH*Iw(qg74`Nd+*xBTgt{i8*h zby-dAy8VBwCR>8Ci7Y@~nlK+YqXYsN(SuDe6FRN$i%&p`>8PSOv`;VG^j8xl7F@ri z7oyBGhRb^}UxC0Kk@0MB!Ak{l!l6JJ_|L&Vb*>`(E`u@SJFo>Mq11#)yU$(0~_pmuMsCUBE``31-2w zb66ZiX*|g)na#f~OSFvu77S;~VVH)Rx9( zr!S5dIq3DKe}Mh7&fuTl(&yap4|G%+(=r-X6QVRMvcWA0=T2VU!1F>S@)M;&kv$S& z2Wc<_vLL&r792CkTZ>(=GB5JKnjnk5i}CSR*bDvqQt%tJ{`B8 z%P*`5Ux8}KcQl3}Zfwvv9FY+9>i2m>ruw}L_53QeE9sM;(6|%~bmAVD+Gxy(+bKQ- zf8#QEs8PJQ<#j~J9ry%P=@+lM=<-_45#Gk>MJT<-a{=&n`3m}RHl9O2GGt?f+;OzT z!zLA#CoX_jxV(+aL2slSIy1@=WsY2p=K(J?k(GpS+jI!DY;hEMcSa~~ua;4wX_+N0 zf>~;`D`E?Lj2s1X)Mz&g@%=gfMp-ELYJ@65rlfaAAS6V6kJ5V$>By`)IIH0v@P~~) zRvEO$()6An<6fxnR>+}nB>&(*$719UwV+exCpaR6Vq#PyRMQTFyIMGk%NkN05dga0LnP45eLLU1hXiT&WhP*2OFWg#i3MQGG27K4%yNI?wqAk82YeL+- ziaEtl%3ZQhE?Gq6X#m)2rpf(QeEbjFn!#xlU?BXZob^F)R)5K5Bf0B?f#ar(`>1eQ zUy z-n!p(|015*r?74Ja#?!3=|qjwXnp!vL_$|YYx+32WM6QKDo70zzRzTH%EIAhHp%RD zay!xZ^L=}~Ml?^^X=Wsn<_t_gEIKY}v#0xi8-RMhKB;*M+s~9GXe9p)mppzxh8hGhWHM~K|2Px#c^?C4f>+=D}adt3& zvll+Xk!A#)x^lBma&UBN0r(r6xJWc2>1P8^byuNW0$+6DiU*hjaf%IhBY5eP%kR-s z3xF>Mo^8YR)9@t}5Qih_OfXv#+T*tZ|1`_>$A54fVp$3<`g)OK1xm&=R-hV5%fp=u z9z6t(Of#Kep%Es_qGTGBmKH^m8Xz(sM%bE4Iex)P4K36dzfy$1aSe(b+K(25fIlGl z6rn|kmNkyO{HgK5YLzXGI1agtN|O-!0PMa5*7NxEk}saME#A*IqVdIJcRJpOC%)K7 zxf}sYAF|>eFOyy8v62m+1CB(OGzlhFVf`ag64@k}ii=dKUVKS`Cm}9+1|UrDQ|Cvq zLbErFtEgd|i)iwj$VXoRr#=9jslKW;n154zfq{g8$<{)oBFvSdm*d6-W>4{27B;vaH!hm2CBnvUsG-n(rG=Rd~dLqHkN zi^xZ)GtmDgSa&Pfb_zEAzYMm>3>KUb+W23F*=dC-v7}(s=#%imm-dhXTLO)Y2hFzV z3k-rNYC_W5={x10W?4IZNiowej}2s3P4*@El5K-ScNkrHa7go|6_vs>ExM|CBiIoe z9mwaj(E*8c#879p(InFfn<%ZYm;BD>OcR@1VQHK*u9g%%XUSfSSorlbSSc;LADXPd zGJ)(M;!!jKp6uZ!`d)x-ph4YgMu$b6?Rf9o=w#c&=8JfX=KW%~KP`+wNW%$79-UxK z!Er5bajJpKzJT-AAUY&#JXY@5`1iUB*Ek}S``k7T?$cq6FY?w!RUUEVyB!Z8UvDF= zFivWCo3b$S)6oNOQ#QGp;EFzjU}S%Km4dG($|1POP<7Ozya*RrwBE8P&%#BfFW8BU zP%ptHO^9z>wC9M%Cbics+CPcLhC`@GM%d?x#>TogEZSkBv1RXFi}nK1*bMllMLR$= zD3)HfRmc(?BwBpFFP_ahlJ+#w67qcs(U+~TYf#+O#C%_3bS+%W*VGDJxaW>}A56+VayTl zQro&6{gUhq8_^t{+=mgUgXW4}1Om_Q>)^muUa|g5J~~PeL@KnlfsLVq=8nSTXAf{Q z1-Jxx$!{VbeLn^8Z@dZeLMG_EO+0M($0!fGIS*>%W#B_rw$P6jp&z*&Rf%agjLipc z`D?N*l~!hLT`ND5ey-s&-(+ zz?VI&6v6Cqnw;>V2Wd&%5^UwcrDK0)B=zYu#)32Pk%Dv@AG9jBPU==sj;#_68gKS- zfFO)el&%hw32q8Z#a0oaP-ZMq{b`u=4o+i8Dg39DlCapYZ|J*p6M zcS`dtUU;AZFnUSztlvsmhwTelC!YXB6~vsWiC!r8`&8~d;Gl8s3V5qpgnpdpf%j6t z?FcAI`KMg8oe=&TDD*^%7H|^iLD8{&h-^V0AU-uN$w^P6XwgfX=j87cA(lSK3HbzY zh%LzBVRoTf(V=zVI#;bwMvd?NnK~N9O$bg1??v!L59~b+AT(~H%sM;~`gJ+!z&-V*S+eV!do{RRX~_41>K_#6+4Gc0nZ1825rzW>Ud! zlE&{VF7FI=mzI4+0V7g;#wVjq;AoBT3H%m4XVuujIe6L*judO5c~3?wqjWwyNES4u8}-ou7IZEm6MVd*z6qfM@-Bt3|EnIt7+)G-8kgFQk=u|f>v*qL{whnoyeFi+}%lVl44 zJn{(tKGfw(dsxXCzyd)trE;}RDv#QwLLP=xjHVSnt!WvpfwaBiWSNXKg;5R*(Vo!Q z(0l~xu2)dI0%Eo;dK2#nB!@Tgb|E1?$2byvA5mL-3?6ij@EZ7N5rTB06802w`uYCZ zz&M!c0t!a5_+z;^X4|+EUO8x8k5d_Fy= zeoo)TuKn>e1ddL_G0kl z7yI$0$||P~ zp?pq$m+w42IQ0c4}`StN)_ej%D4 zdK}5Bkvc>WK{n)_384>}*p-q=MNi|S#L`TVuSU9o96CX{#axEwAL&j6t*1dS?IX0_ zs!|2rQ{_?&rZv8&|BzlT_WN+LB zW?Ttz4-Vd9BUfHzPB%il!-SS@elId;EOym`o5g$T*o z!eh`Duw!J`7D$kM2WqN2m;&Q0DP)*mov`1YL=HeR zWh|>EjqjFC!vS2G_us}nv^BTuJGSZO{x=SxyI4#uh|xd{Jvv934tD zzNj?=4pk$)P;Q5gp-0n40~F8$fB&a6}rs>feLt;B2yUoFhWfnQn^D zbW?=VO^?LpI3k!5y%_6CX{;NHda~kPY>c2kq2ux;Fj35e#@IMT`h}jt)&d`3!4uy! zM&~#JShEESOO3E95lbDRacDZahDKw>UV*s?ZNVA9i5xuE2&{pyalmjFMd3g-f@@{) zk~o%Z!N8BiGbcQT#zZ^-hHPMH91H(Os%M-6G3{;>KvToz=uaZ21vuQqnPa37euP?nGUL*Z^dCACLx0Zdn*klwr0qH)=Y!y6 zD6c$PPgEA86lPh(!Sx_(qim5QLRH~pST@xWi2~a+-)a1o4RJ(P85H?jRx5cV$0-e) zI>GSo=oJCXQo*9ulHbXpPWMIK#;?4hr+cXn&H~X9#%!bo{z*}mgvXLx zW`k^H#89Lh{C&AaWm%wv;!A4#8Tx~WQH{(;KvP+qgqXtcB_);UT3|ROVGJ!i;;4~% z@Q~`5J+BLhI+_NBlJGRj(Aglwl1AE!@FVRDk#-B1Sy3nQiy@j42GcN95}rxn7TLpP zg?2;Ch2D(9tWbG9Tv?%{UiiVFh7Ea}Tx4@rBjG<~4r(OkHK>ux;H5))u>p_tL$ddM zg*@>MBHqIl7?1c+0zbKhuepyPfc`2#f=hoIT`w_k0Fbr5RA=BIxt{@$pFz!}LScst z25;Ohh~FY;Nr&Jaeik6`96(~=d1BWBFVK%m3%!T(w6<<4S&mFX<#R*Z^Wg3;ACN3x z+^+m=pSFR_P$T$gJylJ63 zdy_&zA?3Hnhk<)+3b7XY6qLY=$ovLHf#nhtweg&p@d{l@cnMYGxroB5{IoM5uvRg6-;G4b-97Vx({ zJ!!U88V|8hB)tUV0R?dA*o)Nki2#^R0*+7*uaS1KNA69em*9>oN+;4t{953oz3tH$ zqX}9I)1Ml_tSj#U^LM5fjR*~OHs6wNB-Er9^r5G+BCrYAGr@-mcoUhKA)zQqXbre5 zVW9mB8W+rt-VCz_KPqcGd4~-NMC!Nv6%){^XwK5huYGe~Qmm{n6u_Kn4gv!>O$lWQZX~t?N zBUAyQp?9c}4PYvEg?a!F#)bMbxn*cMB#l0!MmAb;#2I0;Lv-vyu9RTQcCbwiSwWpq zTtzvk3kt=C1h^>|fnW1}jG;I?Nw{S(Aq-I?UhQ^6~oPgPEFZM}pJM12qrPbT*k@ zFL%*>{~v~iLr75IupspY#u=*L%d!_gk%bRj03aw)ktET8o35PVF>&TlfzDU$w8%ru1V0Et_8uWrI8N( z704nq143fOm~sm(HZOn>@3BRx{CfS7;9}UqEx;%!Gq?E!E z2N^&@t&%XSm4+@u+ISzCn9Q=FEl{7qu~C85G|r#}j$!mE;Q1=v721IiYUFn0E3yu? zpdX;ok84<3FkGQ;nd1&{7!w4K>~xwaRBH}PCU0_IE4GUe8@Ec%j$}|HcOseu_i~K- zYN7|vjp&dxc6^QbFqrCdhPoh*Pz?ZoGfd}lnWTHr;ELb#IWsmsj*g!1&-L!q1!&RR zIBVE7Bk5uf7lIDI3ZdsWkq<`|I1D``)k*J?V1?o}vMc*eN%%ghn!CVj2@P$Q)LUx1 z|M9mZjIZgnroHyCP#BI6w;OUA-W)W`$CqznyX!6HN_pCf&Z`o;gBSkO-#Ja6TpPM~qTjtuH= z07UQOvZ94iMW51ep8@t|;gR1&K7m(ICzuW~r#uK0A>V?Z##*2LHk_D(pFxnO$KY#g zV$IvcL3zEh8hHX-CAdmkzEm5U!Ch(}h@m-f@RC}%~tm>gKn>Ttf2l>_rzn=eTGr@@BdZZs{;8o>Yl>k_*9ZBqxOCfQQxo= zQzdeu5vsfO+-xYc~4s7+sCL0S{SuZ^1>CLJ~b1h^_$fI zl^<14G+Fh>NFb~ensxuh7qPmJ#Xxn>F`0Ew>DlU@QLcL|3w4^e1Y_f$Kl)jdbe zb&rcAxbEKsQzOX=b$^uHBxtx_CpSrg+rhuUjiC~E8)!{$gJ=yJXVk2$rORU0)#UI+ zGcB}VG-2a+jHAdU4VQ(n4_9HnWZju8k<7}IGt@B(8oCb^ER|p5p8QSoGn$WKp+~`j zYZsA6JQoMZOKVn|tUON%4eLitpEA?G0h{~N#@%P2MsG!h>&qx3Q$i;=$mbk{Jevo( zCA7LfMfnB$f64GGKvOOAk)0mv=GgE|iF^$XnMeV7MeU?CKY#9vyAZ)7x8$1paYYy=pc%@OG!$4ym!?;9qR}Zu+`m;8!C;*l!YQzdd zyI0c@3^oll@;$|5?q01YD&Jae$$od}0ElYj2k`NIF`*8F2>%f{N68i4-1Y{0+4(1)|IiLJFKYiUgO|$qR63d(F0JG-tsDsDxjL5BCe=$G;J3 zy`oR!)@V$W-Q8F;4yMN7Vt;Hwp5~7Vr}ffg{Qk^i9o8L&J*E?$w8r2^1io&^!O9pU zhJy~yVz-lRK*1!5Yfd~vM}>)V#p%<~H4Sp$K@>#CU1``eGi#1272AnMrSdNRl+a1e zW&+64v-w~!P>m$Q%b_oWBE>U|6&rNw7VxtB4`-D<2~_=as+y8;6(ru241yI5#_-*2 zm-^E$pS?ktZWJcHc^GMU2+0KwBYew~gC7Brw+@<0VoCT5q}}u-Wxyq8 z%p~7}ix7vALfOg1_b&w@y{`}s!x^AcKLIEskLirxkbi6{YWx=X={h6voTfK?2htgJ zMu$kin)w%Q0~8KAqXUhCbjB$D-@`xjhtKc>{ectDX#5_0_#iZ$N(3w24?y)F0UCb- zAoYOwg45we1pR07`h~nA6tXB8!vcO2pg<8Gg!x5M!oLD-{0#t#0L1}CAZ*5G20EX@ z8fnY;SvSB|8kG^c0cS#{L^?vL>P~S;evd7IOf!KLqg+y*IEgr*PS6=2(j)250r}8B ziG==0r({8J>ZDh2DNVhCvTy1Yr5M0H>Uw+ zILl(d@f^#oD|Y7XIE+JHINoD%sF7mJt*dtKIXIvLFC5SzhBSQ+Wv^M{JJbk71CGuy z4jh?@ACLaT?s_=NhWaee@|1hfnJ^7BN@D6v=PN;(;2UZV~`EWAdg=uT-15VP?ZH2DNz zcnB6|6y7U`k|-2)IZ+j58iUPI$SW4NRM8v(C*>Q5dLBW_(Ra;276ryHbN5N+#WK!h zg>IyBWQCrkpBeT7+=l6yO{Pd>@n3k*I+tY-$NPmOhVU#DDc_;TAxn)tsk9DVgFCVY znP{w+1oD(?_R&P3&o!kymdE5lJ}i&M9&lM@iIomRES1-)lXamlQ3!17f<1P*a5;6lfVwMeUyY(Q+vQ{7HbdnFo3`Y=hfYa zi*2Chh643-SpLLs=;wB(q7Eju2jP~rC27+wnzXg|Abzor2Rxl#V7Ysi?=b#7z~;4iGLd z3G4vjLX*IbSYkK?tTnAWQ(`dPm~;FT2cO>NGqesqcO6b3VZ;Awgpd8k+Ju9zX!#xW z6ix&y?a3wKS93PDz>fpkVKRQhK7hbcj0u6)Xkak&bqPL-hfjn)kK)71xJ-e9>1lxc zX^6$jh_wv@Wlnj-Y95wxMI}ng_9247h6y_Ub-q zXj*&lABTSrqNM+9o7<$(FSZ*+Km2#b|785H!atdrOrFJXUy1)JCzu`lG3PR@OqD&2g`q<;LF`s^90dt=nWh&R4!*Xe{UF+vGA_-?>?8~#nq!4*a_md7g_-eHfa zYUDCVUF8qKBvarQjLEzjjt}ZA@DJp+J;)va#!?z__{u4rTxodAjcwVwK-y=bA`e@=$!KbL_|BdO_Ap`tj zd_W^3h1vM9-no+e1Ne4RD>N}Z6ZK|cfj8`afj0>=!#^I{%-OmIk?1X{)#0{td2?#J zAPq%3$pfdTRBiXg^uq(UQ1IL+al^db7j}psiy6#gb#$V{Vuwjco&@a>og)?kq zmxBl$_aXd1wc|9^$PMt9Hm@7uA|;eOf=ks1;fBqNwrzOXP>kyW_}hs_T7$TmJ_0VL z*P>*NghgAS8@hSaNO9;{kVKKo?O|gW3}Dw$IvJddX#nHA$OKzsq%B^f2B>gQaw!v1 zW8Fukwc9?QeKuzQibX(rD(BqPQz~p9j>=K9j*8=9 zZ2zJY?~NokuKI(Z7S@j%Sda4$6eE8JeNJgfr;_qcm8CR6Vpv%SIO%D8PLH+5A^ctu zf_v1m(EP=7u|9-fr6LXw1+8I}C|aion0H0HehmY9h|5W6B?9>P1 zJvl&sRm$iv4W&+F&d2zL1OyJE2*_Tv1WvzH{n#Urxx_D6_#c82wfG-{e~JzY1@mZd zV-rzO1~Et*-QtiDQe;ahFdxj{lVD;vnmNbQ%&%rDuSDP6MQW5K&~dz22uQ3>Ev!%PHtZp^7W?? z9Mu22aYZMoo+m5Fy>KYyP${8O z_|J_QxmU_z7H|9FCtjpy$^P`SN12K1H%UQO%bo4$D)0*%=0D@{l!{>Gm%fP zxVRO?<0<^ASC;5kq1I=K>6I$@4}(8Rj7A|{DOA$sJqIG^vkS-6`$fyKRBJ)5wUq@V&s)!;P{Y9Q7e(+*5yys6sq2SRt@Ytj z9~naFPDH7b#DK{phtEJs5f3)Z2K~D6N9QGpW21;at!zxaLwN)y{w%SW>+WvO$=;5{ zv$x|I@E>RT$y!Rc`%r?5)2XHH;`ZFJfYLe_(nu1Y&nNe5EZak4s4T_PVPy$Fhq1lN=@h2dvRIS28i z2uE*fR~|0!N4-e?GccN^h)k~Wi6xZc*9e8Shy16AY>Z1ZH{{SXf;ogHl4Q{%Q-}t} z+`uNIkIWVhOx=WikJ^}x`O(dsORKM)z7%c`V>ee4hEb5B5+zfvoqitX)^x_sV=M(2 z&6O`N-H_XWufu?Wb5rJq+$VA8STo$1mK`VqpNtRpO6pd$i1IFhilu)9yO z6iy?oqnN>|KhbeR?s=jUUKpah94#ZP(!e%!CaliD#xT~~z;0!%A7MygSM`S6rDC9g z)pp&GyF?5U^Vmx)KItH_s~Nj~oW!nS?3=|B+sRn2 zF0pGFdk!^5abCyRs?id=p0N$1Bz6O1DGMaFi?OfzlH`YqJ6YE6umnfqtuB(wdELox zyn($kU_)-4G7)cAk>6YW37agQ0w%=lrNlW|>=#O#WKlej{HEgTYHC@xPa(hQI9pBO zasq_Sz|xWG{WsKYgIEH)331NhRnz6zz+9(CJ*TA0CptGJc#0!Dt9 z%_P5@#T>@UIcK+uh0OU6ZprtEgN%7N+(Y6;=6sYnpAg9^#qzy@Wis|2WBWxH#-avR z2Mk&#$GKm0Wxto$?~oXP6LiU9LkT+~ znpBdRX9QtK#YG&;-qGjOHsHp|4UAO}JEwM>^0l~KU5ymZ2G)R+mG`jUQ1<&)+|N0C zZz%bl68kvLD<}VbaszDR&oee-)cX1cj9!OU6Rg$9^fw+l+Nuw7%Y> z_>~jPdB-&3%uv4JShg~jrQmZc{H+_k1?goeKjQ1XWbwmN8Zp}{E{6jpY6tZfqmANb z>`j>GF`_752ku`KdrO5lPZTH#?6(Az22p5WYY=mTC{dExPseUYgD6$f9FDwX@g$6C z4QMSHwiK$BY@1(=(whBxVinOK>XbH&y^q1TLDVblY~gw-`LHf0iw8K)-b&CG%OIuL zh7DCZbGYtUjWmeSN|l33I|@t21~E?Q%CXRQ*bQQ$(#IBVqSBwkQA=nLQJMgWi4Z}j@By|I#kH>C$tIle&r%txXsEXEbBecSMFD~C>w2l zTa?Wl%PlO49m-XV$r4?yT*uf7uCblU4YqLCDmU7&8>Y0_-^w_-jy_gSF(&&Modco1 zDNFmAqB17i#1~2&V=bW6G>ESi7h|%fzf%$zlQsQ=(t@$|P-+^)Pl}H*oX`RGi;~9J zZm#Ly6hC7(ajQG2WHL6GQ}|uUV(dI_<)@TZjLA0fhmyk>KBz{VLT$?!at};V+cSn& zKY*!f0b|c`4~I31F)7_RwUDtVI6aqI#MlQMr$;SeO!l#OwG(4fN{MP2WBa*XC#mJm zSPw{6D{WZ1+Lf_axo%sk^&IXo#L|vfTmotXV^S_b zbu4325+&+*#-t=VsS_D{pJiR9PR3D$Wbw=tA@bA;b*htEPq3aw+A4LHlg6w&aPYN3 z^f0i04I-?UI@^}Be(D^KvjQ@kEyk+nGIj&^qj3gCIh!pesOQ=8G6@)^{wk+F8OI`G zGMlP4F{d2Mr>kpielyey*-wrPv($?jOXS*|t6pN`T%c~S#j;4r0rCi~H4>Tbql&$&X~!`RQ<>b9wS8I%2JyLvxku-78JE7gY>lVjF3>SK(N;j2Mh zt3Kh(6W`_S5qaWx-u+muRiy6$d@u8Kw>LXm$rH=ke_Wg=E^q%CV9c#)BXaKvj%gY_ z|Ks8@O><@w{C97HcXlE88eoj)Gf*;W2`0=WcwiR6-)DSQ>=XBmyeHUMj0=8M+*!Oi zMz|`((}6#VM>M5Oag=lx!>71Q@qH@Vk(P<~!aus|pH@^FG% zM-lwGj^Mh{>n;8_dTa#czOy%4l(b%3Kb>Xm>^Q+HW0EbD$JVi?KrVusf-yqn<+Kuvtznc&XO2h#Jzl6JzCC#u`+De;SQ za?-UtQN<~4p78+Wwqf2qL7%v#UAhLFV_*+LWg(O%5+P?zJlAm_C_^Vbj0vkabWczd z;V#dDqK+iExbusEtLt6^%<4w`hs!CR8$of1OvF$o_Dy-Xog(gTpROt55X02=$B^!C z?T-VtZbxN2J~<5NoyBDe{#Kx|xmPq08ZMx4kf;5-y?9tt=Q1zgt!oO%J$ zP1jb7AszN0=9hbuJUir^$jCzr{2Z-fU>QlHeDVmm?;m#p@Vs#+(W2%~itAV)-kRJ3 z@D#(#W|F&V7QrciW(*(n5H3ahv3LaHFVP9UGo0YgQ3MZ;9#K*zULUp%wX<^}^`<1` zd`wdc!;&84u4LGn;pnbJ8P4zz@Y_?#6A67rAa65*Ej#+eP3Th9|n^T_rfIm*8o^l7;2Bgh!ANv-J{TA_TEj^H~h<=?8q<0pt%=iiAO`GZH zgpy8e(a9%P&&~t<`>+DQ58F_C7&5pM+@H^?1AM$gU%(5xjskzzF%#ilm@^HqC*t>s zd&+0Sy>WaPa5Z3OF?r}jK&5{kVCOuFx#u+MgO}yBP016zX0Ga#Ck{FK5%(V!6&iFe3cZ|Ou@a(})Ak?Yp&jZrW|oo!3aQO)CWjq(=38( zQOh(2(zr)01op(yy*oRY(;<$`-ve9V@yQ?JLL~PTg4fI>*lQNSO@Ne2z~vXo&X#~m z+-S_0Svdoct`avCFfVy5;5Pp>zz5^b23(!I4Eb4HK`GMAh}ogy!xmJ!F(vIVD$WNC zcOlrRYh!1MZ4E*_q+J9!!+iz94w!la;H+*mo}XKIGu-{sZwK7UZdt}j6T+y?tem?M zDlhpyzz5_0>C?n`jOv>B**6sYln3H@9KIQ1Kd1E)yN>|6lHLYfr;z*2B!UZ_A0yNd zjL9Z^KabqW9Y{~e%J~jFGu%G|ZuSs-#OEm`daF{u_{v447K@i=X~N5}UwU3CYGFRb zKosIE0Ox~oB&*fQLAW1rk^3av*gIK7VLxX01;bYv$~b@TLGpZQ7_}&0mu+133dE2h z&gOE}!u^m&CEA-z@Hs!hw_6hYCY#_4cMtHC`j)}H&`Bu{>`L?Lbd3KR&tDQ!J_mtw zpgJ6|ZHtLq#zk;t*ywN)tcOq)|UWQ`nLi8(BgW;KVa%@fU>^2 z4cyJ~?1k?`8s%hfGQsEk1mA8+@SE%&%<~Z3x3qo?aGdJ`)alI=4k4aR^IriBX1oKK zm_;zyis0J}`?P+C!+wlVdy^^D#BL-jsV97hxmCKUbX$CW+$eehV4oJZ1Ge;2%c1#2 z6Mg!AUJCuKf=0QE&i(=J@omWc*dnUO<$#LVJmXiSdkLT->e8KMXW}2zn|k61Kt=Q( zOz!T0e-2CeNh+iKkhJrXQ{jFvE(dU((h2ZFM=jv!xW0f-t0Mqka}d0x1?7Ko(kkRc zjx(LO9_?d}oLeQuPFH4;z9fCy&74%G2}zMWI~pjrSF*&ahRlF(zx26)gGMg|JdsK6 zYoIMR4<%!}tUMLImz7hlOp284QqU(slhMStb2b6qhWP?HUwS_1+ZV3}wCC`#vq{=L zN3R3jUJ9D`F`oC_2715r9c3iF>mZFJ&rN`h8bcSsZk|2tyC3dM^$=jP^9Z04cY%*W z#bwfn`W;enkEFC79r+#U?MA&HLygONZ&~|hOSBw7XoDG~U3`@JG<@5&+JpBKvT}|g zCw=-J2YiluYoETCBZt!cqe1!7@-->{8-7Jx((WeAu(L_`Hs+eIOK$2orm18w!OL<8 z&L2qdg;4|}bp(@p-GrR<;*no!&ZK{8tgmX~ml|?s4fzduBgs=)L>H1Ijf5xtad0p6 zB?I2$tOn)PY@$5gir`)TY`{j1T3|QkzfDl6+9cw?E}h_lmc;o%dI0bUB(I6bbL+Zj z;_o%P(KZH5?FqMprv_6Vq?ST@h$1T5_w7RY8HBJHg~0j3*)y0j8#)JoJC@md2nJLX(V~A9gQl3+irtS^K(;#~gv-W(8vh z#owpCp6(C_46I$@0L>{*8rYY$KjIYpf;@r0bsWwqR$AD~)|%L2VG4F9uePv`j=MpTUdE{608?y&T7kB z2v1waI8LAN85qTh)quprluko{)mhkt@>J2kJ%@vzUhWt3ENn%22EHUVQ&3brxE)N)-GTd3Va3lC;OEbL(%7d2Qjlq58#bP+;db`LSeyF@ed~aZ* zhQ9)AbOAAM7o&!MP~K78X<(;Do+$4m(mF`Lxx-JDcNR?+mRM0Ljx)AJOeknoQ6@4u zb6dnxU|o#VWj@OdjOCKVhrW#R6;xDPem4foD!PhU9LshQ8D3M-O`bFHn6?G1`2-c7qM)czqDeo*vF#TB7U8F zUd2$HfT0u!yRu@WxQDT|;-i84D#nUHG5M_({=qL*Ocd7}*vWzKR7@2`CFDotQ^YK> znlafXW{LYGCN|Ics$!OC(UCZ}i2l_-Rm>J`4Q%pcQ8`C+wJ>kxTrt?d?kG;HoF}fd zu-26eL~nC_Tw} zsknqODZxu|UPk8SzLtk7FBQKS*dy7mRBjY$++@~5@^4jc7C%c&Y*=`_a*OCvL*dqn zq6yzrUM`yG;2yBM=KNNT0pfz{Yo|sM;x# zdytrOutQY`#5orBQq@6mwS~P=bx1sFVINgJ&#$7%5`9_qf_R_(R*M01 zzN~slEbnEex2FAJ5w)=HRWFN+Eo@-b5plVNjjTE#7WQ-1J7T|uDb>fs zyB3yI{ek$!!g8uV5~;n-)YHYMqLqc+S@myGU}5)HeJ(m%SfKhVG0?&~R-X{lEv&ry z8?n;Dx>tWEuCTC=s(utZE$qvxpTw;eHn{p1vCqO3@vAswVR69Tv9OWVzljqz?4)q^ zG0UKc-$mq_G{Y7&!$QrlmCdj<&9FwI7wpg>9=&R*qQMP1UK&M;3N(b(->%g&n9)S3LbG zPKxENYQK_gU>A2eUY((|H!x@0FRC+@3k9GB0f)f*uaj~^>gGYPcnAU{dD1vxQF++70y?ar~GPR={Tq1 zz*iZV4Ox52R}vVb5iA|2Hr|k!yIY$dacbjziHQUC3a}PKI4|O}QLSnUluQH59Gzd& zLCLeQlA3@LG_doARn-(Kv@ces7+8JRK{X}H-z;oqO&8@>#PPPL6$`W`MH7 z@cU%!lfYIP*!T`F0NZ9@y-JSO3{>tnuyY3;s~My`W?*;Le_1nF`Im+LR5MhGA5N*S z##xdz?T0H_1~x-eYDXxgjL9A_QlY(1%&=U4Bb8nj_Idm$We8&zz|URVpiHp*QfkL4 zD;Oiapl$60r3j~5s6YHNyQFrKGR?q-&*%b8=y^64jI^D^!G{1&x~z%zf?aE zoPQYDH}yk-xkhrF+*2njnT)L#zjYW@J6RcK`HiZbqAatp3AIy|r!8z`)hs1>6veV# z+&*?;?ObJ`fz=0>0~^iQR#6{ZTRTs=f-%{T<||(?wpI)t_@kJwJT;nPSt~r9-&Wyg zV8<6uOqs9z&Y0{E^Ob}K;@m3Q*KDbsuS{cXyLe;Zj@pIF-wo{hlACH5D^D9(eekYY zU1>9h!fg@WK@Zn1RaP*zT@;q?s|_jGN5$WEky-juZCLr#z&3Swy>^*0V6608+2Nzw z<;obw*120u?JdqxrWjcE)MQ|D4XgwFa9YQ}s^E97vckYx_W!DOh0hTdI~kMmj3{l!Q9ied?Pn#`MU=}J z`#`z0qE<92oyL>jYO!i$W?fWyl`*Mjty1JwQCr34n!LJIO796WmaA&cs%uh~8Q7K) zo$FRB`xsm2o>$vjT%g=DkvP}6Pfn?-yFjU%MA%yK?BuS%Ml-ff+`qUlK0aA%U`H0G z<5bb#49+jWxly^(@WaEqb(@v94a}#f!{j0lnppPLG9&^HlyqARDL$Fb8BYR-L3SV%6Z|Qvq!l?V(y#{{TzFgqG{~sEtXyefo9muby38>BuCIGeX_A;Y+~Kym7nMI4lQxK#l)Rb5 z`LVKk;JtPKRLU7UD99plSn18!Y8>BwuBi=j?O2mr3SX0U2a+7IR>_%v^9laX?W)P$5yo zs2s>d%%P|>XLG>R(zMLf$~1>CQ&XQ*N=tG`G%Xt}GbyWgt+h9B{q;Q0@Avt{e} z&-vc;zY9=)^bL>?mcrr3Ermrb8i7jDOZL(soDZ7cyGj1sy z9^0rKDnn1KLjkbDDa~wp>@B6dg*_kpy)s`g=yfY%e^eH?u-e$4lv>FQWh-LuD6hA$ z+Ss3!y^_5!a7FAdN?i-9jlHX!m8@*=ir8P3h89*Edr$dJvJp8eVt-S9ZDF;s_Z41_ zz@bI@||5R2= zhO5)xN}CGdxp~NuSf(bluoJ*Om8{p;bFqqgtA#bj!au7$F4E+Pm)oi5msenoNa>M_aQ&v`1&OAVbNZ1?(ai1Sqw zB2yzq&!%7LGU?=dadFcCF(H4}Ud%rih}JpNR`l>m_r@yBHU!(qm-d zj9ngi16Yqr;n^|oMqH3OTQbM?O>rUW1Iea_G{tpLr#&S+9ouX1;cA0qIa3|tBh?|Z zgw1ELXRnUxqmr3{byjCf_5^r#RezVPJ=nUdZJrkCGJr*^!IHfe>KXrt+9+8_m}h)n z^{3gwGbAiLK3+|Sfsehe&!k@QiKFN zMY_#kOH;F3SiksmwL-G6uEXLp)a#Nx+b=)fqT+-2F!z`HO^DA_D`HGHA)Ov!Ud7^~(> z_I060LZSMTWU=D{62_@ho)w<4<2ogbSA(BxX1x-M)gvt|J>gNcqNdq4JYk}m|2(qA zEYe(*Fi8!2LD(J{_jp2?y0nE=CrnX;Uu?F$kT6wU(8AUwJf=D=5>Z0TFC;v!?jp9F zwI8=F;R*Fv3)_|Oq#CwZL}@?nK*DsjriC3#n4w-FwwM{s#}a0$&%7jJ`a!?0RCi1E zO6lhbv(#@S8yRvXVYceGM0l?4d^4d+T}f;?+YtRz!W{L&a*?0f^N)mQ)btgCeKSxs z&r`Qc=4UYiJ1m%SeJ4xb`RXyro+0)x$)*syAk!_)Xk(tQrmYk)JN9You~4m)Y)@EQ zk7w2WEzHaOocfDolgj@{cusX+CDKhQZ)dJid$h1<^CC5Qjj-LBkZE43j+gAWqD=EL z^$E$eKAGm_>LST*_s=x1PX7;pslN!^)=9^ztYl&5}d%4TZTU2~Q4P#>G_`14&BeLbj9mSi>ud8pius6)x z)OU%^Gk!QW!?0aFNUX|uVyw=#tH%UmiEw}L4YfhClf!gicVxP-xD3Oa>R*z*5}3^1 zRJ}K0e)EhU5PL+jgMHC6OR}nncg%09MUwp;@&T|)$##wT5ZF@529G%nY`b945(?x{ z-@?8GTg+z45AG%0GQXuR7tDA%byDxQ)UDFiW5SPMJ0RIpa9y=iJu2CblzZl#>bVx1 zlDJcKdR4?UMLHzDtrkf3V4OqZZgsk3KaTN9d`I0b*^C|?6W>*DNcLu6pTxbY(`zEi zM=|Ea_th9;RqUgfti=85QfV6!W==e))=IWG&YXBy-7Z;5^w7jQ^|EA6Y2y<=QtwLU z5I#QfsOqyt}M zZo-np)2g;r#5^!&UE-&zt7M52wkMuZJ4&|1vM=$Rnk899>G8zR)q)mwF7doNO|lnb zt|nek-;%6H`0>Oq)w?b1T;fGF{dJMwy|Al^4QiQWf2H0sUs9_jYcuw{#7pW*$+XCy z6ECZEl3g74bK+I?E6HNRze~KP{wY~;=`C}kYO_t`@J9$TFUiuveot&v+ef_tfM!&~rI+ zOBtPXU)?TQmgTXeKh!@YOSjBSdZ60BDLm6HbCUj4nkB?oJH?+DKUA&(??(6&hS z`51F@xb|)f>z^E{9hL0rm@&y6wM&xivP??ur2QaSujEO|U9<<1jUF>SxtnJ9uE=5Z zn0d)PG#|-I#;i#0sdba=RfzJ4mMB>`MCq*!Bqr8?zM9|rBFZew=H$MbMY7lXyq6rS z0EMxHchf;%DzcX)D}p#sO*>IWNkY!yi)`J45Ah7!Do!jVxm)1 zELsDxHd>b25L7Yd$0e(=xlB20g)~~rn^tJc3-lYzy@i?gTgkf zcwzKlEl;vpqvoUx)}|a1wg;94DMPerEo^zpP;GV#+nO>=ThPJ|qzu>g6RV32N}d+o z!p;MWmF!g4ODUr?3o()VXl)QN%zaMqXsw`y&GQ?h&1vzxo|3QaYhgd86l#sallk@; z%EoI8KE$%j1NKbdcx^`u>+3OI`@DrUrA*Lxo$w6qqofvVt0a4&3*4d8E)c6?WqpjP zCEAoD!qd5jBe3@*n;PPn`lyC4Ovn7DhPbCr)Ot#`e^_8@sg^F;6H_CAz0$(Er%u*( zN~VqsOr4?~kt`%E0$9{h5i=yroH|vjk?e!vfvJyc>m)lkKAAnPy(ifKGQ-%yQb?4@BNQ=il-T3Bi74DFC)-;d~@`jiGgF(uFMM~qB;TFYu- zrKxkYWyHij>ly8BVKeeTOW$X-y^=Wv_6K%UGM7QKQs-%>Bx^fpF0kv8-HjcWGGDtb znN3`GpZVHdVvAXE%);meTIO*q%VPL8|GCr!TBTt0J;Jlv0%FUJnS++3KC8Vb*{DIQ zfUT75$-vsw=d_cOJqN5t`uS2>zc7%u(YyHY1_2nl1(gxJ*~z+6Snuvz0%&$+&&j9I|*$!zd#26 zUr-bWwt$Pm_DS~Ow4GW`gJ8$X6t+v-^p#-Ui=5MTX<1hVYZ^5&ZMT+pU9dhQ6t+hz zx*^zip~=9E-w3w7Y;4*d&FQ9Kd$UW@-q9BPj7-eC?`uM9a($HCOaV;EZH${WOF5Z-ucC}{o2xdBIaMp%Crx(Uy0#4 z%5*)X{YC63o0hOG?XbpwL(ijZt!0`2VXa28da!+{ts+*%-p?82`k}Uq*m73dXJ=ZS zc8(Z+7n14vk@hvQdGt-%Q4J$POdWG*Wtc-N!yG==z7^>x%EuZ$vKP<$?PB}scv(mv5Xm9~8FJgMFP13g6@PHJ8c zkcqQ$TFW3-#R{P1Piw^w+1?|z-1x$PlWC{5+mdYn_Af2qPZ6_tz=gC=wf&Nf$h?|% zMtdMxe_&^|;eQFw2XL41oVJG861E`WB(R*n(YA!um3-ExUW;oG#&v<1YL zGy9^2(dRXMf&T(dl zO|28LDx+O-dC)Cwys)u~_#WxEvb|AtId_nWngmpcUpoAMPa`V$WH%3+alSi z$dTzkX_q8h2J^%n?Yd;|4K7N*qx~+~o92;eKWlETBFZ7lr1W33VEDxeu8rRmKkau{ z%W7dyr2ncdYGJd}f71@PuxHbow4Ynp()2&HAP*5`PsFiZMq|WiXKo*W zo>lDFI4#4KFOqD)6#EQ!-T=Sh!8Utg;NZR<{5G*FHfFp}h9`e7SlFH%+a<%7H%c~e ztQlAjcuP0Ne6Da%MqBO|Dm=d_cp@W^FC|vRf_lu&XwT<{3EOj)S2BY6l?Y^uS^Kfu zGeY@K#Fn#xV-IF@;Q5hgTf*kDQyF3WQDWH76c)j!KE!4at7gk>>oX$w^H#P6@g@?KAx7I{7=b}{X8v?aJQ}^_scO;+w|h^5EHrg=D!jX_3O=*ZmlKj%}vCrSy$fG zrZ>-!tb<-;(}!mh6Y2W$QC8{t@^RABRzL6Fmsd#^;S}N!!&gbR&ZC_rmT!>kOFhIA z$MHX-vG+XdG{!Za?;|G4nZWC$?Q6dXO9DS5SytN!il~qlPSE2nE2K*l`oSFzo$&&TSPkcWm%#njq@HNrrVT6OFGY& ztiu$oR|cqwgY^C%xINW0c`GbdSyr-zc?=H5z2J%qJ{^e=g zE1Rbi6D1qO2TI%5_T`pAe6*EqFdr{%yX|LK2J`8}L>+SYGgh8C{CVlw+o{Tu!tvpBY{#KqN_)zJY2;UTr;G-mScAQ}u!Sf|sq}*d8`2@+XIU<`Z zSv7yfGLk<*Oyr)&XGz=FrWuwzzSzn(im#HkP}gmiQGC0VZ8YC4ZGYI^W23pLcWeDd zb9Z7Qhta$(v1+!)__k#<50z|>>21px-dVCM&Ic{|ycaRiN(DTbn21uqv!v&Jn=!5h zJlD!LmKRCeNZZqvvAovGR>-$V+aoUStdRd~Wh>$jq;0>gJ1gQN`n1+z93M|i%%cDFD{-3M)TZM`IEn?MdUifF0i5wmP1U3<~lpBeOHY??B583>P!F zmM3|*WD{IwSf=q9$p(7PuuSIzB;C~spLzn zY_s^w(zXNgo5kNGCfem`{=Svx)BHo}nWO$@d77V>EUL|4mf8HWRk|wvomILj{)_a? z(9XM8akn_p5=*@8Gw1NOlFjs;Z>i=%lCAZ#&z#GnBnxgk-|`IaCfPG>mA>vSfd^+3dA|XA={3U&!;M%?rluLOvrNa~Jhn$mbDj_I!a@HM?uLVOhwROLoiY zhUHnlu9@R6FI!VPe{+V+WKX_z`v4g ztj%iY7x{H7&qe$vX`5n~>AHy5Cx|v%1N(`^{5Q!a!G7W;?qe3VQLvv_!eb@-5!h0m zFIh=jPs=hsSF*D%L7B_>SHwg)SMXcJL^)URJI$U>tDRTyCM(-Yt|W^5Hrma%tmNH^ ziFB)YjI`YV+baGFF_FV+{-%}ZYW|M&{99e^yqX`7tbdz5&M))hlC}5v(s>QPY?W>; z|3=#C?Yd;Hv%9R@t>mWd7fl&+ncTDQVpmNL6DRdv z&zB0O^nxq>_55XN%bPe9*d}T78`3*-J-;v6q#={Q#!^~yU(W-GiQH@XaLF+DT3(vk zntLr@KuqLb%NGeox!3X)(uTR$@>*%b+~L9HX&B|Ig1G~Ozvf>?H8cDL&NSpX& z)W#OJF)}&x)rZo()?#}*va|cv7WPJDzs%QL*v3fskD`at?P#&R9hu?2vxU78`A&2z z+ZZ`Ma~C&KsYNf?&E1HJ{<53<5vyiy+HaQKysKo{PL)o3_#=|J7|Jr=;qj7fQl83u zm#0bgqBb}4Jw8CP(fV_ld-*WQPOC3vzRxE~c13$Bb041}*;{Q^JMZUnB%9zk-|_+9 zNKBOM0N*BUf0^#F1N_)Swoj#PIPByO@S6|Wev-Bfho+1JTua9@23Kyb_t-)1OHAZ& zkOxVdKU{?zGKbxnpYU^5wv)U;+U|Sq%RI?LGh6F^igzMb&7StDbUMY&R<_eTL)v_y zFP-KE57|nj4g26}UiFZzM%sEhe3*Hf|7vAB!~c}FpH1IpoZ(Jcq7Rx}?y<8xjF{*l zXL%QC8)1Jc^DIxYvYq3Z(q?cyn|Y2;CMHI4J)dFaS0i{`H#dzl#Bc~>B$sFuZ!H!ul1}na7SX*>?N1BUJblgi%n;j_;6xkF2BqdNrrRz zWqzbTMiDE?WqyU&Rnxggf62VeZwf|p`DOm2wBcNSnLm)WD>*+$UgpUIFp8MVFY_#7 zq7Ik&aAKkkmw7%h_|2r@FUSF3W!AhGzRI7Jwl4PW>?&VmW&4`1w6cB8Kd`c0;~!bs zuJP}zY>oUEX)A`9joe{iYkt?cJF#kpw(C5`%65Y%TiI^#QeiWCB^tB7;T6JW?2zaP z>?vu(U$flg&q&*+5%9||{(`X4eXv`6`9o~oL+n*zqRnpcw;!^-Ppq1CfRS^HACc?{ zXZNgI+&dd_Lw-N;g_7-ptJa_RBFR!5-Lrn;TP54-?w)mrACv4m_o%F&dDI|LvI=j% ztY3JXWM4s_zspmJi9Ycw?=Nk+ZSS#P`ILuj)1=MKH74sy#6(-)=N~>~J3*|PO;U5S?(>UQwkF;vZ71z> zvzmB^!B{^L<#*nln5fb3yf3k8#@ZBT{mxUZY=7{9(zepBEb9+G)5`WIua>qWFqi+y zcMuaf{K@w{lirIM>=}G+FeiPamCac%lD3x}&Sg34LBqtzneY0e z*+uV3OyuCI$4T34`-Uu6eW;bqO&=|7!(iXzra%6W?I~&NMv~{v;$nwzZBwOne8|h^U*_w zH@AciESZ>Ck9_q?$#6aL)k|~HQ>;h6`T}C&+QL^~Bp9tnzWNGj!}Z8lua!2uw(!+& zN`}`KzB)eUzDpRsp=ComlwXT5@C-h-iW3#{$p1n32aS&-&%KeD zs#VtDsbZ+X+?&fFH1AD7f1&?79Ic2d+ZBh`L1@LNO(OnJPgRy*_+wo(O2z+UDvYT< zWDU*2$Uj>U-=Q*FYdm|PUZ8dEU5hb}QiRr4`QPR4pXubJGKX>Kxjqq7)kHij<1;q@ zr^Y|CRby?nmc_ZdMy-c>4W20k@9JUi4#2ek)NdS*?+g-F^jE>($w^}ex;Z&<*0UT_ z{cn2AW#f4C$5gsZ_1Gv(+mMYY&Z8(NYE8v>Y>kaMm?}6L_4kHgeeoAh3hR@Gc)%a^9}RCU zgDAfx7SGz`p6KJy5q&<-L%Fv*%3ph-{8BQ?!Y6M8`nQ%)lpLNp10{!1KxaI+4CNhD zFqJrWbzM=;h4}E@AhZm&e`~(ChN1=@+bB_mCxW)hSSn$K-UYJu53A5{_FMsae%l4} z5~*5c4W2cMXS07Eo=xG2IjW#`@kJ_85|LKqh1gv3R#}sI361b?#b$rh z2)Wr`v;d+iBUsD-U$vE}%llR>kMhGU(5m@&Eg;hV-&;WVw_8t*LOlYY%Bejf9Vw zi_X#7Hw0b-4D*jDznCQgFpg(AmVdI4sZ~V_h&B;zRhNOD@S1jLx7CwSMvV$j{KK-< zz*?rj)9O&O9A>BHKJyNpeNl!kVVFzDsaV>_Aa@Q=yu?-#GoBcy4js`dMyOa31lm$$ zG4q$3F+My+5b}cO2ZAh0`wjG1l|2dTBRoU6HzJ<9W^674YOH(mKjm+uFwV{-^hCKC z#p*Dh)~PwP2f+TXL5dC?Meh>z-2r_D z&i=&Kx(Hdcs#uFfE1^H9w$iCJ@JZD8MsIQU|F51#cv5t03;*wtg}(`&GL5OQ52)~z zKPXFL&%{|!FCzOxX;t=S zU+mT8Fb28Y?+G8V_nS>C@-^Dq7)N8-))b;=66_3hc+xDE=ighK%PI20xkX`aP;z|6 zb*n7q4WSpajgZB>BxEtmi5WwjUol=VGVYyP=M9mUnDOon!CbB;sNmBq;~1|j#QHXC zgcUVn*VH-^n^TDv#>g5xt+#bOYV}m$#{-xb&NeEIeNB#ip;-ibGgvRId_JH#3gi^(c8Ox0ZK8hrpES+Z)|gmAg^i`XWpinpttvd@^#3Z0{x3%5&*L$b zM!N{nAA~I83t3!Y39FD1VdbSU^3SyY-oH7Qe@1SN+1x8c%+Fx;SLH6++DEKtM_^sk zSU?i?Tha13x|<`2>p{_C0-LW-aa_Dmf@#e;xEg*yv#7WZ-Piqp>a8REcUhD{oNM7J zu13G4tD8;Zu$;|%Gt5Qw-cD&aa)rDox>Y`xi*>i&zX@5)@ayD=Lw_;eHx*;u-=w-s zF2%I%Ls7F5^eTIdtT<+yXJd5$$}4D3f~c|_y512o#@8OwSX-@S4;ss&Y^|kj-hblG z(^`hJ6N+=%SG1RKO2=~{xL&qlCUy{?DoIg=0I5wM@wU;OeP)brYI1Nm#0X%ER(e{{`L8*-o|il;n}g zsQ2!RD9-6Tn)5%SIs6sabto){+UG)ll!ad4zraUj*D1n3ufl|8KF#^!yo;XmG0gz2 zE2F}M1`+NPLXXmDCnogb-W^=yz%EgNyF;xgVv0BqBlZ^D%i(E<23P*cvj)1Fpbvxr?B${M`s0OJddkhfD05xc(kCSge?c0iwFG&hPnlQ?52 z>@Gx5*jzYwxN@P45t^@~C&9eISv{pHqJ8fnh}IlOM7tY_8nN5Yjl~%?u%8O4ZqkbI z3*-W`H0>^SkVcgAf8M)O;Oz{}xx+m)YLoA&52Jsx)mkp6J6E;T=bxtQed|=#=LPTb ziFr}hv_dcB%a&GsIh|jj-!Z0Dk7u(v z?SGQftXjm$hiS`kDb-ZuTeE(C(Y0%T)t^(;>WqfxJ z>P3s8tij5QJE%B1`|A^NHV|h)_@JyY4#??=t0FDDC=WEM)GVLUnyQgjKye?V2*wet zo-jrfSz0lctWosXCPe!z}BhB!AJ7O+E^M66HH~8p zaT(Q4M6;Gfn+W~4P{RMMY$E0u>N6r$H=3pY6N>f`<+tt$|2%_YC!E(4%OJ4%8>rT+ z6>&ZF-@hpn*A)Ns6q?CASa_ciIY9#ukb?vOjnzby>j?jp96EZ&a zyZKurYyT~@+j*LL{#Kef;X&%)DfS6{pl@qzZz*a-DzUo|SN)>rTcc=O>s}xp}jTR_YkhPGD z%7)QcwjS>yg76gM9nYi64w9$PSVtDJ(2FxAA_&Ho@FRg;dqR}8(Ekm9LJS4@W%EvU|+*NQr3cQE$G&QZY}86 zg6;sknf?Ii4loz^oDQEKDL26H2Iy{p-wn{+0G)~9@9>-fb$BBI%7K8ktSg`s>kSA` zm?g|0%qGkwEFdf)EGL{!SVg!P&;wc)74eRW zzeGZPG&5`4;pvv3nrf^ z(kIg!DU<1qlv^pUEcScxNtOlgsrVe;7LRfc$yqEY;s(fwTj?3b&U)U2KUpcg$Fh{( zV_89Rg_Q9dP0$z$?SGfbyj{Uyb5VomfZv^mUcV&cqRJ_)&7JMl?nK>V&U*g|-r8O$gFoQ0A(7f~{&ZYd?XdDqaZix7Vj(AhwL{M|EmuDr zouh3~PIVZs?bVLL6ElwUB@SJ|vrCfjtN?jdh>+)N-bz`>I>2#Lw?L{dA=Pod#})lw z0w2u%tmdqk0+OMRkL`X@^;W)zR`phnl02&m==n5%^grJRaX>j@&oaafS(wWY@n3=b z9F^f~@~I{{n|!KE(bFQ!_6_()CEWo{Bl+CtX!UYJtnonH=8d@17jcgtVoY1awS>GK z%C7-p`}_^EKX{^S!x!q)2SxI`baoz4Yu}|a@_;lP{`Wl_-eiyGXrX?mIFj2dcplxL zEg>0gV^*qT>qohsFAiK1=nz%CNMZx&q_+T|HO9-!ZSEK7)8! zFIB=yvRMV?RY`KCf@7gV`5{6xR4CZr=2E^_IhMg&O)7^sF+wyiz>IPQM(Zv(zj*dz z4I3zOh4OAv5~STUF~d-xHAX&K_$h+ENAQlTGB)Ro&TXhhaPT6tdmq zvtPmYz8;|#J4t0bslZOq<_NXq5#{+&x=p=;@5-xJ@V$BU3jR8^fg;x{`1ZVd1%IL1 zNSY%Q;WpK)K<_{GoXu^jDVF(~%}y%wUGjWD$f0&-)t+WTH6de(JkPBaQYd z)+<>0U@O_H*h=;))-g)OI!38jyB_2dLzqmM1*jREb#3Y=#w>MI{u$$K$Z<2wPRl#q zV+DGa`MfcQJo6}85k)H{O%cTeeW}7KNK*+2J28n^DwK6L7f>_Ig$UD3H58#hcS?HB zR7oYzqte#MX#L?oj^~noDWo#1YY6k8rb&iMi14{-6Gf<`(r%Kep6qkRSP5~?7`KDJ z0#Dh)UhSvmgPF=(seoSBKy_(QSC)NdTS+Zh zO4vxAw+V4|XtG7Lv)d|WCq5VEtK&SM=AsFN&w=JH`8QI_KcHG~h4m=IaF=p#oW7 zm`TO|Nj5=_?(B^IRpcDIFZ5~AbM&iFQ@Asr_v!S!ouYl(VX56-tpMUcOHNsB=SR_k z38M%L^daTXnR<{sUAq`~$u362eua_Y9ZrDX+1;X;&ic*}-M&fxSB#y#Vwf~8nI%Ii z_-`@otFeCeCd0c)?d_cnS9`;A|Dhz|;JGyHnoY8X{VGf5HL}cXpF?u8hBIECwxiDt zSain3m>`$t=dU`9ny5F%6H-vTl+x`w)I>G4Rtha&wzg6+=6XMX- zfGv;#sh(9bG<-sNhKA1~&(J!jXE{{BzM|4lNv)ls;R-ufqxG6vJ{MBK`{T3`-C)h7 zw7HZvm(u2ve+Bsz5Sk$`c$UB6#Xe6v6lh2K&v!5zR`q`gWZR*uQ0}wdAyBWf>~Mft zV#02R8qk~7rG&V4|K_k)Uoj%gaSdrU5pI{(ze{(h<(k@|#Br~7Fge4pS9>e!3CD76 zc0i@0GprXij=RAV?lw^W*-tgvt>LKIPjxv$H9blClccGkxv_@k(jyv<$0Kwu>M2gW zhHvm`(D2v%^%}mvr;#GurU(rh&X%_+PQ8Zj^J&oV?W6Y8OB*zN2Wf+b?;vf^@ExQL z8oqgrTOtH52V;{!rYt3VB{3%jWg6zJY5yB)k0ujEQ6dyenR z%A&rPrKZMdFm@u#H#oU*#3prP$1k0BsvT3VIQc;wxF<%@qDbyRatvXET2Y$ld`le= znx@@S?TUx8WR7o=Oy>Aj$z+bdTIX)39{-bzQBkv<){(q*oU+^6J_OAX052ma!sC<{W3u1iU?mqw+t z{;%TBuDDyvblnMUJIGam`oc=hGrQ%w78t~iZeZLP&||4e48M2Ib#>N9<&SYK(MP8~ z>bi!a?bP~BdJ6oHcFA?!M4Ih{yG35wj&8?Yo3wD4EjK8751dI%g%@4-ll2H7)Q(oh zQbml`Jwhq> z#&!I)pFLoPyBi_w!;_QQ9fq^PE%k8pMt5&zZW!(oKkcvsW2FnZSkPn?$Zr>!hUkc zxzq{f()}ZyJ-n4QVfR=S%{FLl3z`K(gFRNk*zD`E*znW@)a22A)w6RlTcv#wr!zkt zXSr2cVEinPRob7V!QQn>YZH$vQSkVYE`d6}ab=bE9sK$i`ea!$?7MLO4~E=fzoZx< zRzl>$30TM9U~jxZ>0k7kN0YWXbi5X&ei1Zr_QInHA^Jp&0qf(VpdGfTjk%K%d zWZIh(xJ#+_cI0MdE46kdl_wA8xd?Db)0wT0=S3==e6#8Xeyzx>U#ai!RmiU875N{QcD$ zDoKrwzqi^XOXbqDlh<~VyVC5`RrL?uVQ{AN;;f7?C$rsT-A`xy2qAjvu)6&+c9j?U zuk*rlz1eH0!P9paU`Et?UR&Yn^#iXniZ->*>m;3*lRA#0e+xXX)Cc7hSV_2QuztG()3`bJ1;TG2GQ? zhTEj6hg1ryhn6{GJkB@MwOAPC`x)eWoJR#9=F$%5LmE485xzm5UC8q*^6WvLC&(H@ z{+CF;N!XJ#XGu1be1YUNl6?tHgu#R^gdGXb!Ij-{J}4S7iLUADNOLFxHQV5t6vlNV z;ysdIf!AgqhhIt~ZY6w~@GZbb8ZWnLyxgU}v7cJt0qMB`$C16^t=5^u}&^FD02UjDQ9 z8N<;|-f*33JG9CBE}e@n3}Ywx`rM^8J&JPg%J+A2XHgXSE}f$@hN6C5e7-PD=n2mP z)%O*r``j`-Uf$2=j$w85P@g8lW3hQYR}I*&uEIQD=wq_MRj-F(essA{43y2RI@|o! zV~!8b2@8C-D#3kLf*joEHNaEwE{|mJIqTDvzXs1fIAb^#3p+`O?C0wZGjot{54yK- zOFh~t#n;=WTV%HHE%nJhDZX>*8ny>}JF>(#%Yd_7lX{+ZEV%CEkj7hi1zxP|t$ZAx zVZi?XoUgYs7M_Of4A+&beNnR>(qa$HGT_+EAvuTSJdzc4R=b_PMFyOU?kJxZ-1aSn zeP)s&kK*SU@a$B8C# zS4l10qzsC7@++nIP0G2UXnj7*$!{)2sF4wd#GrmaIbvxX;#knsP=ux6S;*E%&vTGA zL+umsG$8)EX%p0Cv(lt!#i(B$z0~gv_YYm`x1Cb$rd0c>{CS3rQ_dKVkp3j;6}7(T zwr@RI74<1|blU=bZE2ZaLD#|!XO-4*2O)$w{C8Op%X|!?J&Up48Q2RfiGyA}Rv-bn2SEYg5 z;CO6OmN;Ola(^d3XMJGYigs}Q8?(OM9sT3tP3`P$@a*Fi$DVdg%3L_JP09rDY*J>C zoKJEtV4(hZ^!wmbVL|I;!l$X^Z?(gc;F;n!IHGYcak!nE4feVM172DCQ7*xRQ8xH) z)?D4DTe*KOJ#ndk<2{XB7%vO_b2whx=JL~>mVp)TZS^u1 z^q))X;B=ecquf~!u)-UA36q6P<1WSqM^+4tvKSle?LA1-L&}B;ivqI1->fFvypnh+ zAlU}nEr;4I&j#nQa*n&-JR6+Na;SC-ZHhW|4P0#VLF6+3g*F!^J`$L%d-}!&7EzpX zsKq?LJdj}zY=do51)7~2=5yi}=iidi4r_Iy}xvo2H4wr9ipAGqLZNCu8W>#~Rxp{lQ`bl7}tHMjV z?Q5^_S=|n|&sCP>9Rs}3%_Tmz4Lkd8fvRt9iE!sK3A`g{~0vc2T)dm6i(NM zV08-0RZ^$;1r>2jwUkno80_Fa@KW->qjW5c3R**LxCzceA=^$qi+P`}xvq)_ zQs~v6x8F_r3>AM1Io$@|SBQCy4a!iP#+L(jj+h;^AL8J=@miFV-+mk1t?jqL-C8!+ zrp^mm#j9W^f86Fc?DLO<=OWO&*!fvyHe&`DKPpj!sx4~v(}_M<&I;gGtDYz zX;fB_CX_T^&`c6f^3NbQKm^xs8N=R)W6;frbJr%C$NWh4 zGh)ATBeXZ-evFepC;uq&Sqy!+IAk#&Ub@zAG50nO^@!z7<3yg)u*ll%kW?;$Zp9LpJMaj_29?=!OI zg=WCWT@{)ItzlL()KT!}y$p4JpA16|wNDQy`RDEPWXUs2%Yzp4uR{>`67ue6LKpLI zCZfgzta()CBA5e{3`HE`+0evN_6?B-fCCsR8deEd?3wRRZd4la%plVhx>( z?Np;P%8t(WJFGEcY4?-Qb}IiGI%`KrbCR&0uz|3Vut48h{#sZKot=}^sx_h(5WkS! zrT8@vxyGp;tl6xQ?yHmRa#)7k+Q$ z7;#d;J3J>9yti{w!FxL=6}-1|Qo(yW^>kO~q=I*NqNof#s0@{`8$4qyfNPM92*hC# zP3rWNdvH&(W6FyWXLSFRWf6C5#wEWD`p(h!SQCsycfj{!@3CxsR-X+K3be-N2$Ruc z^0tT=6Rue?CS0wYp(PgumC$u!lZvZwlNvJe^N1{}-A>Z@(Y=}+@^4bhN7zQ@ku`_n zM3J=!H1JKX3Ge)rns7bxHZBe57U^wF3CMsexF_JN@Id2?xU5KT<+0AgB1`F>%x)FO zLOo$4X(}jkgPK11Qa~ldnH$+i_q69y{J9Wc_o^|`b)|`}E5WD6X^knb=Ub6$Ot}Gw z_)MoYrna8$hBYQ{xL(*qExE>Y-Rnr?c52TxrXataY&XO_r>-&0pLhvU;rm3_fJO(z ztBf@!d@{#=s!I%9kHGgqa4j>Vtr>cY0(JRof?d=RQ&d5P=8$zbS@YNx zuufsu0gu41o{aGDd5mz9d_E;>J$YVWKZ5=W`81NxP4c--K6gofpY#tvufqF`yL2?d z7yB5WD_9bvf)VVMyMS&A=H;beUI8Qrlbl8JK$3G5ti^DOkVg^nDZ)7LQQ;e4jQ=>v z(@9=P^7AC?D*6PfT{^1F3}|FUpfR#ywF$6P{R?o4s)4nftQD#ee5R=mfR(BX;B3_s zaIWgt(S>~gX^jLejaaH%B;PjT`TEI-J?E}55Yqli`uoOEkef(;V2lJ=F<}IqFd9&0 zy-iqmGs!6=_am!=En1yzW5DVTGPE9`Ba5|V@P8K>B=;lv8L}=Ue4cO_;ab8E2+!D2 z$pIbNExWjmj?CFU3G=l_eFkARVJ=|-pvqR+W7+mNpw9<{X8@sxIATBP2j~J%wLt40 z!V)Kx%L$heE_C@eDv-U*0tR(p&p~hR#Ow%N*@k|dm@j)BFo+!ojAUm4yR!>~-vah! zF8w>PBo+gh$ua;3v!Q?^+2eqPtPyY`y94+bdjL3-*$yyMUPO+M8mZzQZEysCc!<+(<(X4uBw8_W%L zpy4)%g*I4=jf4qCsuAIA!dk+Ogmr{h2$=~zg9wud3ryG!g(O#zTut%@lCKalJ8EY; zOdCLQ0bwC&sz}~ow~vJnI!tmM>8}ZYdrTWhm_%4exRLOXJ;tmf`5K|-fc`;*NrZ)j z)r1=fuMujF6qzuH&`elBSVdS(xPfpZVIAQ$LahzuMVLfbNLWp{k+6>N8lmPy{)9<{ zg@o0F8wu+OuMuj_gxRJ1q@EW1!LOz5^goT9Fgc}L#2(J-puH;XcL|8~zO}LRT z$PIlG2$Kl&2@45l6IK(}5^f~i~hVIg4^VKw0f!i|J= zgx3f)4~jsTL|8~zO}LS8lLwZej^t~EnkS_qG!rHf77|tyZX`TJSVwq;@ET#GC&tvg zC=Ou~VIg5PVJ+cC!fRf;z`xN8Qzdz0szSnQ!i|K7yf3n41M5g;J{Q@ZftnA+Co~f# z5f%^@5>^pb6V^hihJhPNt|M&pp&WfFN5YMSb%fUlHF&io%m9Aq89;InVFF{>z=jB;QwM#v|*HWcNAFv=_JBKsvfAPVIxQJ9u>L<}IT z?Sk^AE?DM6Bwrys(iJt0-4J;X#NcT1iKaM&tS8C=y?hnVK?#KUgtfg!;aA;K$!ESb_0CJ^Qm&L*rSJVbbf zkfo46VFF=3;cUWM!b5~t2w5um6DAPOCafhqM0hxr+KS|>B(pS1MVLUCPdJ-!Lnitk zCd?mz@@zsj5aj^E1j2m60>Uc74TL-!TRR~K{qqTD6V?(QBD_M#hEPm_Ls2dohH0-1 zLzxdpIbb--353a{$sdm8pG{axm_LFvgtdf6Mo=7**+{A{VFF?DNVEozLM$SjOSp;f z2w@{(!e~sJPdIxtmZX-DjY0WPK4S7XiZdRuu^914DanMvlTn^MVPK$uTBo3NJf$^x{qg^2ltvk7Yn4-sAw_#Bp#)gT5CCJ^Soh??1i zwSXhGT|BHY<(a8atZ?ns%Fxm~NTwn?h~l zY@e~+XRF(}*bTLtX*b_)tKBblYwWk#AF%(_{-%ACy_187gP%i$Ll=j5hesWrbf|H7 z)!~vuql2Ggd&en`a~zjAUUM|H@o)1+o6p+ZZZqDg)M<&+Zl}Xer=9BION0#P0nWpn zM>`ie-*WEj(%+@hvga1yzY8=cn5ed@c!ESZ*R@V!6)3Om(P1Xhkd^A z`P%14pZh+4`EXxbUngG=-w59+zDs=H^=;=D?3e5}#BY2Z}WfO|Cql+K=**GfN=pc1J(o>0>=hE9{5J!wZPv4 z4+cF5QiCgl7Y6?k>>A=7;ve!{NK`26;MiemhnXE-?%)!Z7B)6)McC(Iq2VuwZx25h zek%N8xMxIAM0iAL#1j$wA`V9!jrc0!*N9$`36ZIh1(D^EyCQE!wv7smijA5RwIOOp z)FAlJ`Qh-t_>8?2=mWTAKs#XYR5tiUg8{G$JZS^IS7bez1Kb;MggXOmSRDLscs%^i zyP0{iROZFfnJ*i_LRdBnWrJ8ayn!Kt<*`VX&!XV}<~zdw$#;hTi|-0=;Ofr)#iCgQ zdj$R`9{xEWo~!W-{AOT7yZeAWNB;>pceDz>IRh)7tnu9Lq&R2<@~ftczrVO?L;JQI-&*d{a+@V7Ao0jH1218kpG4ERVNte0CL#!MbG8PG1S z0wr^pKZ}cCN2Y6)K^59IN)W_h#cF5V%meL z7_&8kk42@*{k3MPj~`U;k>#79)z9%zsZANHNcZ>pf{-Od)5|wegK3#6n~HnfGV?5 z0zozcs?4MWfouz?GCL&%WP3m;kJ15TM?m;ZrxFh6r9=WoDjh)|1*ozlr8D50N>{)g zN_W7wlxVM+3jYA)af zZ6x5A+9<%Q+8DrVS^;1tF9htz#{rJv6Cgr9pvnq(3CLpsAs0Roi|`FcKl-?*8-~W6z#_WKjKfq$lU}j6T{l8y_b<@Finkz~#maz?H^$z|}@G;2L8l;5uUpjQQE7Xuvt9zJT*gv49Iq@qo{o%z!nf zB)}I;DKKxOvk`0tTL5qPTF`@s$)910vxIehET*)iTR*YTj^3CDAe7aeojl(d=OW?7p+r=CuOovNL- zIo)vj(doXE;@r`>(s{r0QRg3>ySXI0jCHAYdDG=fmv*j?xjyf@&UJ_D9an>!w_B83 zid%`>V{Xs7?Q#ooH@gpTukd)rW4}k8$0d(%Jbv)7@oeiE?U~^@+OyL0gy&7qKRw;N zg1!2CjrE%DwZQ9?*B4%2d;R5Q@OJbb>HVnpbnl(sAA6tiZtqj#^Mua{pP9aMeYf~t z^Zm`2`MLXb^Xuz3$?plj=lst3HTYfk`_b>dpVBt2ZCcxbZ6~*Vrritewzj*{u8n^; z|B?PT{O|Zb@IMuBE8zEl#K5}1e+7OS_)FlG_CZ091f>NH49X39GH6@S+d)@?z6&Y~ z-X8pJ@cH0d!9NG5hh&G02pJPn77`G;E_7q)d!ffd&xhU)P3f0<^2C8GJSh@M!{%oy7f zwE}*(hQIjJTa9Mj>L0VSLXMl29CKi`u7+Qy&4uF`IOf4I zAMQmifMX#X&%)gD92_+)mOT%9gBRd<5spQ0EQWo;OYl9y5;&H^eqk9)gb|&{R=~Fk zE8$oL$7+@W_b5|f-oaTXg{^}<#d~TJZ;~4yc?Km7K;P?a%{B_$YI8MXyFW6Ik3db2Z z&caM~4vu;_K7)I;pTlt;_D2`s_yUeE*%)>ajt1B-eFeuQI4;9+1&*t5d=1AnI2z%& z4#y2R@Q<_W^c;H5K8L*qJ|FG}2ZcW8xg$49Ze;V^v2Ph!TW{=TZmgd_JgWshGwD~D z9>n2k7sM6V&-J7J9V$Nu$j@x@W3bD^bPVo2V;uYxe2C;jBp)XEFv)Wz&y{?n*Exyu#3&W*7}O$8@;Ks*CCJZ-e7X`iIz z!80KkE0_9d@^gm#tdySzbpxGEqS!$k4XLqaWB?e^4^m7mAtRyv69D19xr*kKPSo0GWl69KOf_j?XbNc;{)hCJudmMX@;-#G{d)hF7h`CUJZ}-R=cJ-mzeHd zUVFUkMkdVZiKL_?}y?v#>1)rXQ&vy+DRQbHhxf=Zq>?G}S*7KKrU+MYX!EZ3eL*3u&eKq{yV72Re zy&vk{Jyh*_Z0Nbt>7irY(?dU5dS__0)V=c?rN8X^*>2J0{$0#_;3rGRcKu}Ole<3G z{g-`T3xC=7jnbd?e4h39|ME>==@}jQ z67;W9_FSnk^1m~OKcW0@y1&x%C#7%m`RKr6*Uau$!~e|ZcldmD_f6fZ^Lx-iG|=bU zjHmj4%X)sBzF)ri)$ofqKis|8{c!gm-+ZQfc+W>jpXPIv^has`QJ!abz6k!4Jg@cq z`Sw5LbFJsEc>dM)SHr$r{x|Z~uHPNJ25tV3&sfhBw~PTBqkN3~bEVoXe?@*r?^WPe zZ`s%T^sQsieXM8U)@oPSG0(dEd!7%`{{rc+vAO(8&(HSVv+W<={*BW1(Q4P+=;yk( zb2CBp7jA`5_P)Ap4*2%bMa%!>9iQj9uk@umUJdWL^VM+d&d*bJ&$fHVex&F5u`h+m zyMChYXZif%T|d?Lzur~t8o&Fo{=d2VL;b(E{cQgW@BLEvgZG~8-}b|2`$vBGL;Z83 z|Ax=2;rD*{YhiBmM|%GA4?jC_`JQJ71p7bkc{S{~_iOxh9(euUSHnNL_o0Dr-Fva; zmv8!1_jE6RWv~C0fnV$0SNgTypC0&L?^us`NBnsE`(7FN+tN2m!oB+buZ74pCG5p&FT3(dv0l2fboTe9Co}`Uo1Dr>vJoM zm8E75?;OmBc&gHzSemK4RGFDrYBcLB)6Hsasqy68)YMb;+KZp@O2X(t!|1tswOKh` zYcyx8FI5`q+~J*_Zw`Gdo1Y~o&&(WNs7+t^jFlUyB4rL7Fv50p6QLrvm3L6nV9@7er8!@ld8WMR6ZX2D6W$zp zXwz{YH0aq{y=geoEyyeT87~pJt;*3#W4c~l){=-$n|9_vwK%9b&Q+RI)~jP}&8&cl zoT^vns!L_#6|dbni_M`2t%J_Gha4)_NCQk>T8>PyX$!As>@8G}EmoUHD+`smakCYek>1)sjRdixzdTPRl5vhdTk$NREfn{?(QX#WGQ$a^g zSESHv_TIV!$*jwR55;Du>$T-dy?H5@T`TFNzSp-EomgD<*=$435rqSyM~Qp=^#;&acd&R?J8lbbp#s%(Z3Jlf3b;_s>e6)6bdim7C~tUN7O(o_Nkv;hCjwqw z9a^!>hA4v0e!8-N20422s2IlzI|!4(JNvZC(W98K=Fr5JTun$HtxPYJ>y?=zEa#&_ zg*G6=+bXsJk5}uB=%&QZPgd&A#q>jyq^6RJkV1?#rEdRDD0ty;4 z?_wh`V{s-10o?O;^#sIv-3Xq5Au*G=-k_>xpe=w;)|emYNrBvdA{X1mnMS|L+ZJU! z$2YNN0fp4_k=o)iTx(;VK<*M8F`Fq^>DZUlPD~zKVn1R!_#|BPOy#9iaKxOQ{k7dK1s4i95WNDNR z8^D$-j?IRMRL6|6QcEN`b7*HzsU!9zbOfz8+1I48RAb|IB9`LklaeIIB}4yau;RXf zr957)E}U9AQ?Uj0N=9nyVhev>!*n2zKfejofzbWHgDT!c%~?U@8FiplR@I_^Om-8Y zw`!WBwqTu7V}-VI1^+ho|4<~3Np#Zo3E1wh#ug8&h1R3P^>f5JbX``t==8;o9*IMD zdQcQ2rsnmqB&UghG(Urv6I)qg6Mu%{45^-%0MfZ(_Z|w`UFywhMB7eU3zl1N0B0)ghS)%| z+tyF)VROq%)fAB-X_I#gOOC0uSy%_PTUcNn7S?Mem76Rq(9HaiF4!t^T3AEXtrw6D zTU201*^N;vr_ZL2C;DMi14L(;uJ`5%U8j{>2x)X#hy$p2SqNHniaar=7a}-Iw8i$2 z{#4@<;fZL5&({`EKT!x26I?Gzfd7L5mAo0Q}vk&{$d*t=fu{V+NUY2 zPU9bt{@6-oMNeC^GnHAAXPf2e3p|g#v|MLDfgeN$jpm7oBejKvO3H~MrGK*$PPWvP8|C*0g!5wj?8ONl{6_fW8`e971JQiLeHPA zG)c*^;K3?8he<(rue5Jg7DeYrrlwx3mzNKOBWK_H_>+%LO|d@Zg@%e2(c|*^7cLzL z=O&h#hYkh|nLVS0KA0>tB?mXIB{o)2x3Q#LWpvosSi`Dz*hv^E@8N*@>R@Z)d;sS* zwP~^6gQ~I7ro~cB6DbH(v|r-i1aG%>)NNA?Nv%pGKcgnm=EU9~ROdyT6XC=^NEtN> zh9nj~tTIih!z@H-QUAvl=wnh&+;)8oxY{s(?a7C5j(jb6 zpxwwp$2RQ-s6&%^rKB2?CIgy$7?PP%^U9lr)mb45H}fL^Z?2%UHc~xeS%10;qQR51 z#Jrb?m@n2=8luJnFC26=axgqwURbG2t}LTS)KY={Oc@+Za(^&PoT$|8 zMVU4o`5&!ZvOcA@sD89+%A#Dqr86Xb&fTx!UodQDk@2;?4jxjflPhB3 z!z$Z^D!xM>h`42ab&%rLD2-qlsk&nVve63P?nj^#aa99xYCQ%#)8H zUA38&h02p*(VkD8n>ZTcVv{;eOnw&iNfHY2J@03yq&C}9N(&a+I@iDJ2@+}Ll24b|yzvbI#)zga<}Qm#+Wb54&>-lU=}MI&bLtDBW0^Oflf z+7N_UeF=3a%+n|x8ui#{#@e#wF3(kFCg z;Cxr=%-{mRINM5jA!d#(X}>cQI9!-Y=}Lro<V$m!!z4!yeC6UVLhW?BgavPgb=d;bb{HzG!y|a)7AoMQH+_d&)xx z<)vv4_ab7odQ3h(G4tewsj0*4=QwtY9iQTu0^e<8L7eKwf^;TeX8{}fV+NZSOf;UU zG>?GHnHBbb93yOKYBi4Q(EG(&{laysNkFzN_Tyy>NNpIwcJReSLS7Zs*2J+)9fUtWlcc$|AT8;~nFvl|PKOq{rWIYY6i z1m3liW^cW*3-`K=1enbY!^e3*3q)>X@wrCjN3l-F7s_*ujiv7RZBfYnd~&|JNh?AM z3)Sf=8e_9kZVPQ3sBkG_!we>LA8BI~3&(d>mi(|$lx&%V#I%VldbF_dk?!`2vsT@# zLo^Pwm5tz`Z~p4r_|i<^LRJ%M9V5BokI8yM)LIuQtt$(35m2I)*t=E?b0UAhl8wqVhi1vBJ3|;&G3h=D6Fz!rsk~U7ZUdvC z+rc^?h&C%$q$L_ZW|Crx+2(vDrm9O9YZod+pca>FFl_?Ucmqs!BT3)kawAnG&R$!% zm~yCg@qX-G%xjAOPXtpC*ycCwg ze|WK6hiQ{HVYz6go~bphUaDjnJdAoXL7MYb8mr%lhMDJCF4%;)nKQWbe`8rt8ctte zQAs*$dH9cPHM$cD7eod|cE)Ee%5phyx;9fOz-Y>qoWrm<_ZHi#78GN9K_Ta@3jh;o zBAnQJjp*dc^Us#+Re2XV#KkDjPu65(@;s~94tTCozK|E6qpLNrm?9X(bYbCPMK1vfPxy*^I);%EN|Y>JnGlCu+Z-u# z>K(Lvo=TS(Jcr{K)wJjFN7C##TX2a7Muh+}O(ws5bw8TUT{0Cz3ik6FQvuL@} z^ZfA$nJv!9=B43tW}UqwL`@}6J z-pvR_E#RW$@N#vjExS~m#qExuMQ^1Jq*RPkEMcbDQm))A$wg@0|Ge}uogGkP#%T*m z!qTcVQzGta#+%%eKEKlR(sEl)qb74;jZJ!@K`=nF4wg}M-M_TVQ&(vsl zggI5hw0%#2dU>YYET5gm=LwCK^CDLqH##H+iM#M32nzTHfo-oEnTLLE2^YSm{j&qL zl&E2yYek6G({_W|NM=7QC$`9Q$%D)x>Mfc$tM7!jq%*H26w027TRjP2@Rc)w4`9BXLr9R>uu>8z|wHb;xejjtN9TNRwye5;*>+ zX00|8=T?NL#%utwik>^_n2ZPb`*2xy|Ujt(p{$&x;ldLL@zg#Ml;)UVo5u? zv(>q!GPnHkLrfj$yuUIdCO^*WKQo2vft%NSrnYrGO*}>#xdCW{94Rl`)7erAF1Vyw z(i-5OS|(kdNMX6-iZv4zwwQAwRKZ8u@9q-LVV$=fxTz|y@uIG*2K1*VxEJ9UD586V zd#SBmQlUm-x!)O}UBw1YVxO(n^~y(9L*8yRsTWwU^`bo~%WVKoB{$zz$e014C z0WQKpc_*jN6TE=3IpoMnqsevE8@P+6AADJs`2O)wva};chy5;hm$rtpx`dun|c%STHHmm2Wy4#eOma~Ru4_`v$q_NDWGK1_X zkd>OB@mzGktR@?M2cn{=<>|920pw_9wu}n#f{Sw8PGk8+*MAKk8 zUX$YuFiXxsi;0H0jiDN!F^Yb+vM|e;)gcs?QWH&ooOqf&xHD{c20pon;%yQ$iJ)m? z<)rFe72zKSyCrw{l31DWsUR9UyOWeGD<^&XPqS&RPVYCTPZi^Gt0*yjUO3~_pO}@| zOx+U8!0%8l3!$Cl%u9gwD+px$Jyj#)QZr`GuAFb!8@^$Yd#;sbf^!OwaC>}?gGpO% z&f03c3t_LgWGG5a5TfMNmuNzaD3Gv&!ZOc!ed)AN&q)s07a$(iBTdmWGX`SJW5i8B zEDy{PxziD4&<#6S$GmG6VG);3PB1!trsAoNc%u>92&#aOCn8yk9(l-w#;atK<5>?8 zd0N+TJf*Wfo$N4v?9wxljRG3+($lC0-wZ0MYD(aAxzT8Hc(+1{1eYj*Vrrt@e6T1k ztcpW7Pta=O1ji>;?Q{%qdIjk51${Hy`LJM7;dz^+Iq)DbF9A}(z|ylRF~d6~S!qq@ zm6j7PYVq=8D$@-eAX^yu4q2NMm8Cf$;Ex!kl_SQT093i9wA#&vB{5cExf;&ZtB7dr z{HKsaed}s~p0;$vEv&>=T8D|rmrAi?gN-*XEltbzpI43Pl<0`1DP$IAjVVctPn-L% zTcnk`6`|`ZxN`+atmAYj)+s>FEzi~IVzO3%c^3u1ks9ZaaTp8I8MB&etngj7p>T-R z*c!$<&{v`AacSIQ-tUz<?oY9oxn@2Lxr<3s(wrtj*TXmR(Hl@j;${?la;Zz1flaR8yrugX|r@% zCcV}i_W@o>8?KaUd-<8oVD=)k(q3u7I*9jaikCo6o&OZ^D4cEj&x$z?T7td~g(nCP zqyuSN(?V9EZ_cUl-W7g6K~!VGZkot_KT`GdemfG#vbkrk3Nu9A+Ug~3+Gh8(6Ns+D z_(Gxt=Pqa@`@M+@BScGpvljFMikmd6bn0x}=2$MJqc%#}6XnJ8Gv)lfhPZDRyA*(x?7au;OIlZ( zpa7MoD{MEG%YrjBFaC-rSp5%r_0gyI^@_Y+miFYCU6nDmP zZVC`n7y8MM0xb1a0Cn7F<2cVzHiE;wXbmP9F9JEuH$YvJiPzg}Pj7_eUFA%nsp#l9 zbBQ>nX-b7!M3a||QkYrrvn$KGwortgRHPwZLd)xVn3xvE#5r6i8jS5{^*NZG%ZdW1 zr&gM$X6>Z6P{xV)+zRhEn9rKSv4|!+IVAO>K?+daKy*>hf$`d2)XlY}yu`LMaZ)~u zyv#YAJxC6+ElHk@{T6p839Gyk{uM;b^RdwpT&f(1x1#%oIUx3#11j0dbo^S3TqffM z9U|*>t?*pAzJ!gOZR%TARjH#j+YR9ePS)IV@;W`lxAIoD?e&?uDNu2+PF`w|Z$ne1UJX_RX3Uz6`DnPXyc`yrDp)3X;BN>efA5HFKX5Z1 z+=}>gGI}SfOP?klm9D&gYHDf{a%DGOQ(n$~g{6#Mv)LqNGsad1tm4DHWo58u7W}HS z&*axG1cJEPWeQG~*~oH!q3=(x)O3fMR7Tsg+VhkNWgFO?XG;RctfKes8yqZo#W2Glm6DUDpWn@XL~*$VoE1~qO%)|sU)T(E374|dkcq`2lT ze#Igy;bZ&NA^3bLT|x@S(fAIIhn;@OC}kW=c|@Hr+6Gg(T$#^=ro9al2BCHs%Ts_+ zBNfm4IjS}>9EruBGXr~F(kcLGQOMz{6thuz7b-OKu4sv2Zy*TrQXq)kcbrf#FVyr) zPBy8JfN0&_=@C2?94e zkc?3_+-!@s$=$xlHBP!QQi|lHPoB&dE2%R!FT8$H4=4{_7ImGaytB7OeHd2|3|UMi z-HUExRhv2vQHAWq5@%+`%Ip`EQnd)4IH4uCF?2IBWnl2^w;UpW=lRINIe>_e9fs5c z8zDxHFQ$Nh8rFnRc?H9c)$61PAFtFKBtUrL1Ze3}Az7bmo;RB1*=374bkw#V1kLMM zlMdK&)+E2Oa0C-)0f`f6$@JT8ak>+2usG#*Acz;+NzRM;*ro`oE-V%XD!kpF9D{sM znY|jdKUE{b@%X)y@1MNyN#2^`!X(=OGtxKOHsYhmRmcAF20APt(J^{X&bV}iI8CtF zS`lE2oyBpuzKLpRJ3S{3oEOifpQ5wZUoXlf3HIhV-}>4I~a7_NBVf*1+% zx7p!&u_109x~OvmTcD z@U9)-B0$`Y>YOL&bVpSs76gIxYMATrEN~fvBN19OPuNdJHzRjy_OPNh!YcVJhQ+v@4&gP#cPb2M65R$#$hyanW1I3Bx(Sf`__om2 zt*K%U)23=n#0E=w(>EzYVd0H;O*)mtSr=biXoT|0OI4KarBrD#j_lj>r5PO>=|zNw zA2PwrT=vgk9kDROzqX8%d9jMBOlz1zWired=z3P3S&t0D2^LW*td7SN8Zu1gFe#{E zJV*#HoM(}y?M6LgoH^!q;v0Bs>CSv3aC3tr5xZW`3d?S!jB2slkba5PvYh#{`t3`c zKMMU4eS=+)h65nWkUO`YH$qY7ewQy4S?IoT<+5LF3@U5SIr}tlC>r@MxO$|J?re#9 z&Q$ag5icI_t8W@3qtr~?5eN=@7IM@o^Q0$Tnvl=InDu6OREx@8^6(Dq1 z$ju=!(A6#jHL^?bhO?H^?h+E5Yw-Ix+IXF9UQ&iWOcLciTF%+hv*mhrVVpH#!-Kc2 zc$b$RKRaKp+s#JLs8 zK9*d?d3HDy@C5y0J^dDvU=dzoJ4P9b1 zMU|b!!``eyA?wsE0MthzYdoj}=K_pr6>{oO;lu*SJM92!`8%#p89_I|kZ-^0S?Doy zy9+SrLU_O^Qh=7z4V{L)C(I=sl!JW>0SiW;A+oofbbC<}X0OP%9gjs7tOwYcXCT@}HoYN+5>428E4~7WuM_Yb7qR*hadZ7tlAl zB3_E{>6!MFcTS^u2cgV#7uxtRrL{7gb%|iw@!!5nE5y%f;5}_%;{XRnh;QlOe_N>3Nmln_0ih$hjFVyPr(hDVVn^u4r zFTqtN#07YCA{21k4O!5x2L0Y|0nJWPD3kV{+BO@AOs zMlZ2xTW#Q-dA6gvx6ui1KU!;eD7jihy5Pdo-lpE*^hdPLf=)hH^q7gOp0;9&VtbLr zh#QLL68?s?4pr2(VdClbE!u5a^~9A?i!}7xCl*xmmf6TLc7>bcqPMXC>CB^1j3zI? z2v{t?RLp8ua;XSt;=;vW_BU1RKg(mu%-Y0xr$~=vS?7m^a?WVEz)%3NM1|aP-qfPk z_yBR{Nq^#-6`~e#9$Ap0K`1;%DU67&8~CaA4FLeO!a`xwP6bW44brxcx9*a&hbl?C zM}xQJrS2wt8>NAztc}}>Ow|ZeM6lQc%dsSuVqpy4kt6hmgUpT$s2?{QpK!6&XA-x< z=HcPEX26X%f;!{dv8p1hF)75(uGm|i=~rFieFZ2iw$@AjDS7@_ zqjRtbQCPve0Pc&PP7W()gT^4K@u&UnGyW~RVY`@`#5QK+B*tWNonzL#QfHFWypL7o zSl2j)n+FZOkl}Y$Ea%#Ayji@1MXo?Ma;%aYSJkU6am*`g&YzM9zEgB|Y>exYEe?QX z{X|J?z|BejjU28x&qOdDfbA%?f_CB)vlYenV!GxvxVFsJQ_&B-MnXy+gIL55s4T_% zBu&ns-0;KsXU!~VaNizt%&X9WA?7@!vOE>_cLX?hrCoBt24(RyHnEsKoNk}0{b0Xo zXJ@^Dx{N7?v6y8lu=&OMjKe{^e(XQg{J{+%cDLrq%Li3Dd0@=yC_5+Sfs4j>=S7tL zGVD-^FSwwoTSSH&_aJn)Qo?A5WY5$R#9ux>rOOjm160j3&mqVBdcrt%FjcasRi2%M z3hI4gT=!RFW|nY&`f+FRj$VSFti{5*HxRadFwkZVtZ)Jo6iuJQKI_^Y`zw2B zS5}Z$wp5ufNtB(Vc7OdlbZldifJHXVvK{i5xh09J#U+nwp}6!Zlp49_Mq3s3Hy!TT zll!mJRSKVq=dM%jI(W`W6}gA<_kruXbXUZ;SoQHI4^B-@M>HlH$BFl7e`9Y18mHRX zho5|evrFaW#(b@*0L%QD8i}d8z8B4#wrH0m*dv&p)mYJCaR74F4)9QrehsYdvf*bq zdF^7}&v3kq?PuPIGp@WvmT6{C>mB_`+(yb$$2Yd$(1j3-FKLTOmAUsuT)+`Yfkahv_g>_4^pRuRknouE!HSCd; zLMwB?#wZDZxo8KN*-NF>g_Ob{z8EfC3=R7!kIDK)qG38yR7&?S^=#Jk?T28N$EM0M zUsU`B6=g7TTuWio^`epD8J>0%2{UB(fUp)Xh3d>pPAKgrOsm_zA_kfS6RX)>883+D z%`+^8Df}##7ADnI2W*@8rmF7_;V)alczHls)F!5zaD|y-z2R<55@Bw&W5zsP>pcRZ zqKUa>??xSZ07N#IG-YI5XgWiksmuUuor5%u5KPnS;&0ogY&inZyXvf`ET=Ax>A;%(&B7(zd(BRPtt{Sb8FnyiuxvBKi5Qow_&sE>G|!B(OW8GX1StQj zA!!=voPpDX{La_@?2w_c-_NW$DVHyZ*rw8 zy06(aq^!=dB{Z}7QSm3z&A(dWH3p8In_4vsI;JZL+{^O22?_VK1ZY!Tcsy0Nz%JeU z0atRoB>`F5G;Wq#j)&{9%1f8*Z&H5vC-|G&WBk2tUX121dDr;s-edgz>@lDZ@K?Cs zPpZaW?ymBezE5W*2Phfi^KuC9dz!xuUZ;JHzxNGE!X&>rI?mtuCh!LIJbw-RQtT_- zvsvAfHs%WTDyd#qxO=mjlk~Kl*V?h4zebL0%IINmg3&LMzCd|s4NNkX3Me*XlQbPo zbOqF!l<|9Nbg*FPt8SSt#(*s{h}w-&s!6GKomOeEv2ZUC?|-Wri}a=*&KnlXM!<`} zn&d^&D*Y;5=UD~^!BneeP>oapzs;eWw-y=H$BL1>3byx!{UPiVVKf8H4r?26I7O{b zF@{E(3gMQcU@J@(sWEMT#B?+GSz0*!ICa%)k?i!-&1YD1o1ve2>^}^)<#r})1YP2< zPq*jygF}%OtBf-io(bo|3H}f7J7P0gGD?lv7#FF}tuekef6;iF)fr>%ALP5ex4c|! zw36Y-eLSbF*L!H|tG;Zjml$7oYLz;BI}a8!)a>g1UZ2y@W|-`7VYEvI0<{_ zjwRM?f&atpTek~$7CG13Io-6T)6BJ9U`_x%&-%AR!?AJbah|d{#;oxXZN;mJX0t#= zm-coi3oG(ttnw#AxFn%hFPfh?>sfk{nowU=dJ)$p2@>~-hCZ4`&{|cPv!u=2t4vbm zQrOvh68#1B&OY=V3m=za*l`#bSG&=xp?55>_`Sj)bn_X=gtGU80Rb4ydtsTn z-yg#6G~T^&r2BxshYw=ccOPx&<)Nx!dp*H$3sh9i;r6GoF=xWba0=D%2{1j%Utd0q zl6Z>V4=}PADYr@!l!xj$);w1Lf{le2sppI;0T)AxE-ykyF{3CoMk^Q4jd+Y1!?uru z(!E6tzD#drD3`N%*fE>&PPnTb!~3bb!kD#ie_VsEyCzV0W8nxenWU;=H^w}Ig}=m2)STccGsD}0HV^MXMoPxc4aa`|cD2_%0p0Em&r|jj;X!!RSL9yQ#`{RW zH-x9&4Ff4q@z@1EHK-;7>im+c0oHtnIPDkXTSUKpMdjbRvnrlk0aq6wv|Z1|`=JzNY3Z1p9JqfDYXJ4a9 zkdl>^sX1xiE;iz(t;(d#v>H;@?L3|H&bUqNlhnx-ov&IIUX$urVPs8RQspw43pC0- zQ|vzmPslWWGK90@JE<9$UFSJj{xpM5(kIg^u1o$$`{IN_Eu=7;1DEhqz7(GZJNGU% z*W@qEFt#|*eUF5F6NotTJZ-edxd!1Zk^D4ev+!CPBQ5R`X77^y0VwU;j_{$Jf~mf^ zT#Kt6gOBVi)j8L&v$%fDrR=6dGk6gUrNA{u$v~0Sd}PTr7s!lf+_<|3=oltB)>cb1 zlo4Ts@%G+)J)Bz7X2RSlko1Gbmfl#P2Q$qB$?%2u$;4=FI=wbwFD!B+8SZ+<`VjZD zuVz~BaHq`5Q}iY*q>+6SHx>0uxNWQQu=)o=ED29LNkl?dC`E>;z1RkbA%p+qieo186*+M&3)lx8W8$nxB_QTNnfMM}ES9=9K*cVRte z-d`^**T7$0joGHU|XMk<=NIJ2~H^+&=R6|Tt zHZ{~ak1$wNL*djo<4YVwpGjDz#vDW=%_iS!&k!LU}Vp_b~PS z&Q7})?F5$E9G5LI|A``%q;pb`E`>UBV=c`gJ>+KR9`=8}8<#;ZoA%kCnd}4To@Blc z!V$$$QoF8ul4M;U=kR04n2iTKa-*f_rQGvp_`C$~?Qa`HJSa2Q*=mDk+9~I$3a*+J zd+p)Qe#4d=D?{4u9;TT!t}g>{%jOdPZas>Nik|I;*=(t|z2{up-XNyWT_4k}`g>PA zx73`DXQ!sSL2N&HeQdAa>$~E-`U_%W?Gj`hHj0Wn5s9T0E)aVvLN~#;#9ORAHjtW%7qUsq9|-Ky`+`${-nx6kRV`t)VLF|7Y?!qquO zk@D}-^OmZ3bL`t!P0I6K`hOQ;>%=_gq<87})7PiE9MrV)k%CWZTPwL}Wp36_!S$Q3 z{RTC(rMo6B@x8}&`Q!%MFGT~iVf=}$W-OZN#KL9r1~A!D3byKLnf}{11RJpX(RatL z$d%Wn)Ru}g$FH-m8^G`edfl88u8ZrI@{{Abb+0#o^_Ipj@4sCp-^IP((oA2!zZ<}G z_iVNeOQtO}CXu&$3-&>BIZLoTcNN4*oen^RU<`m+~7jR<>_t4_;;0=+uov`V|%g?rMc)A6qO2#-G$md+d zvzOlvsr;`gMXvR|6JrHP&ID;R-@EawCLk%s8V#0GQy&sGub1hTvkscZDWK>hcBFDNBx>kQ7 zN9e!RbQ40Gc@3OGt^VfU4@#RKqvV2;kCLdJ)2eRPrTy?SQ5O`?$p(t{{E8X0S8QAy zkVh%CYMtz^7=C^iK?ib*0{fAi)-}9Oy%x{;XXvqbT9B_?c;6{I=2^1sf5Y^iAF@i7 z6x(1C_nu(mHA@|SEpTJ$bDgmKKv;JfG!t2LzgRbGs=(bbajn#l_|W;UNP+Mn#lAKk zM~Mp+=ktJuW3GEBnw$98&Q$OF5P6-==z@`s?9w5a#&?&}x2560RyE})^Amg27M1f2 za@caym2b4QrhZ`dEU5+3mFvgc2G6p7nv0#=>@4Ou^|8AVDYO#~h%UvO6{1=y%~x2P z9hc#7Tl-utWg(xi+b!3f=hC4S(DlMPYpGK#KU-_BFRpi$;8)h-*%o+;A2i;J zHWPk(-P%tB=V$Q^8{rrB?k7%r%nZ`THeq*OsturM6S{TdNfZvl!f+b+jP=c>j@^lC zbUwyk1=b~yoz8>eJkN_C{r;5Y_k0Ta=tPpAi(mv9VpF6>DcHMEjx+Z1kb854$*L#>ff<&iP&9O<5su7POQT0dP7ao9vzR%nDtbN19)Zy+I-%b0z zXx}S*zr-!Bu)|kKnn?G}k`@eib>5ge!QHv1*asa)3Qr&v;m-COY5R?H=aA{9oos~n zIbD4d{w{UF-aV$dC+ zuv3at_id!Ssl%;s&Cw0ESXGKrVifu$$UF!901;C($Peje_tnD=e#0g8Pg?6P(;Ws~ z)YO_b1G*(-{p^s5*7~X^33}FIK#EksnQ&WimZ#vmB=ljhEq6!rs&Ls+p&eit8$in(rhebUOGG724ND<7~d>;gs7&_3pm2?{ma@e&Q}= zBR}4c6n%dzu@;YsHKkC~#W~c@hrK`Dl}i3W-m}_iB>Dd8eUtW2wJYMJJcWI_s3r_k zKqJkwU1@^Hk@kLk9X&A8S$A{FNQG+M?PA?vQA%`=D;a_grMpL5-M)gN$!5Ia=1TsS zQ$dERXbJ^&IwzWH?_>vkz38?6!R?Z9>cJg{QOj zGZREyZ3>GEkW=R)9l@o;3be=djsmWNy^nG%^*=LJmFiq+>*)p ze476B>Yjvgvyt5NAUt=A?fkq{Sh(VlD5U$t>BW-m2&@=W%0AqZSm-&!O84SLvGB+_ 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 J|NieN@K3@ + + + 0Harmony + + + + A factory to create delegate types + + + + Instance for the delegate type factory + + + Exists for API compatibility with Harmony + + + + + Creates a delegate type for a method + + Type of the return value + Types of the arguments + The new delegate type for the given type info + + + + Creates a delegate type for a method + + Type of the return value + Types of the arguments + Calling convention. If specified, adds to the delegate type + The new delegate type for the given type info + + + Creates a delegate type for a method + The method + The new delegate type + + + Creates a delegate type for a method + The method + Calling convention. If specified, adds to the delegate type. + The new delegate type + + + A getter delegate type + Type that getter gets field/property value from + Type of the value that getter gets + The instance get getter uses + An delegate + + + + A setter delegate type + Type that setter sets field/property value for + Type of the value that setter sets + The instance the setter uses + The value the setter uses + An delegate + + + + A constructor delegate type + Type that constructor creates + An delegate + + + + A helper class for fast access to getters and setters + + + Creates an instantiation delegate + Type that constructor creates + The new instantiation delegate + + + + Creates an getter delegate for a property + Type that getter reads property from + Type of the property that gets accessed + The property + The new getter delegate + + + + Creates an getter delegate for a field + Type that getter reads field from + Type of the field that gets accessed + The field + The new getter delegate + + + + Creates an getter delegate for a field (with a list of possible field names) + Type that getter reads field/property from + Type of the field/property that gets accessed + A list of possible field names + The new getter delegate + + + + Creates an setter delegate + Type that setter assigns property value to + Type of the property that gets assigned + The property + The new setter delegate + + + + Creates an setter delegate for a field + Type that setter assigns field value to + Type of the field that gets assigned + The field + The new getter delegate + + + + A delegate to invoke a method + The instance + The method parameters + The method result + + + A helper class to invoke method with delegates + + + Creates a fast invocation handler from a method + The method to invoke + Controls if boxed value object is accessed/updated directly + The + + + The directBoxValueAccess option controls how value types passed by reference (e.g. ref int, out my_struct) are handled in the arguments array + passed to the fast invocation handler. + Since the arguments array is an object array, any value types contained within it are actually references to a boxed value object. + Like any other object, there can be other references to such boxed value objects, other than the reference within the arguments array. + For example, + + var val = 5; + var box = (object)val; + var arr = new object[] { box }; + handler(arr); // for a method with parameter signature: ref/out/in int + + + + + If directBoxValueAccess is true, the boxed value object is accessed (and potentially updated) directly when the handler is called, + such that all references to the boxed object reflect the potentially updated value. + In the above example, if the method associated with the handler updates the passed (boxed) value to 10, both box and arr[0] + now reflect the value 10. Note that the original val is not updated, since boxing always copies the value into the new boxed value object. + + + If directBoxValueAccess is false (default), the boxed value object in the arguments array is replaced with a "reboxed" value object, + such that potential updates to the value are reflected only in the arguments array. + In the above example, if the method associated with the handler updates the passed (boxed) value to 10, only arr[0] now reflects the value 10. + + + + + Patch function helpers + + + Sorts patch methods by their priority rules + The original method + Patches to sort + Use debug mode + The sorted patch methods + + + + Sorts patch methods by their priority rules + The original method + Patches to sort + Use debug mode + The sorted patch methods + + + + Creates new replacement method with the latest patches and detours the original method + The original method + Information describing the patches + The newly created replacement method + + + + + High-level IL code manipulator for MonoMod that allows to manipulate a method as a stream of CodeInstructions. + + + + + Initialize IL transpiler + + Body of the method to transpile + Whether to always log everything for this instance + + + + Adds a transpiler method that edits the IL of the given method + + Transpiler method + Currently not implemented + + + + Processes and writes IL to the provided method body. + Note that this cleans the existing method body (removes insturctions and exception handlers). + + Method body to write to. + Original method that transpiler can optionally call into + + One of IL opcodes contains a CallSide (e.g. calli), which is currently not + fully supported. + + One of IL opcodes with an operand contains a null operand. + + + + Normalizes instructions into a consistent format for passing to transpilers. + Converts short branches to long, ensures that certain fields are properly initialized. + + Enumerable of instructions + Enumerable of normalized instructions + + + + Basic safe DLL emitter for dynamically generated s. + + Based on https://github.com/MonoMod/MonoMod.Common/blob/master/Utils/DMDGenerators/DMDCecilGenerator.cs + + + + Helper wrapper around ILProcessor to allow emitting code at certain positions + + + + + Write method body to a ILDasm -like representation + + Method body to write + String representation of the method body (locals and instruction) + Unexpected exception block type + + + + Patching methods potentially messes up the stack. + Especially calls to GetExecutingAssembly won't turn in correct methods + + + + Creates a patch sorter + Array of patches that will be sorted + Use debugging + + + Sorts internal PatchSortingWrapper collection and caches the results. + After first run the result is provided from the cache. + The original method + The sorted patch methods + + + Sorts internal PatchSortingWrapper collection and caches the results. + After first run the result is provided from the cache. + The original method + The sorted patch methods as instance + + + Checks if the sorter was created with the same patch list and as a result can be reused to + get the sorted order of the patches. + List of patches to check against + true if equal + + + Removes one unresolved dependency from the least important patch. + + + Outputs all unblocked patches from the waiting list to results list + + + Adds patch to both results list and handled patches set + Patch to add + + + Wrapper used over the Patch object to allow faster dependency access and + dependency removal in case of cyclic dependencies + + + Create patch wrapper object used for sorting + Patch to wrap + + + Determines how patches sort + The other patch + integer to define sort order (-1, 0, 1) + + + Determines whether patches are equal + The other patch + true if equal + + + Hash function + A hash code + + + Bidirectionally registers Patches as after dependencies + List of dependencies to register + + + Bidirectionally registers Patches as before dependencies + List of dependencies to register + + + Bidirectionally removes Patch from after dependencies + Patch to remove + + + Bidirectionally removes Patch from before dependencies + Patch to remove + + + Specifies the type of method + + + + This is a normal method + + + This is a getter + + + This is a setter + + + This is a constructor + + + This is a static constructor + + + This is an enumerator (, or UniTask coroutine) + This path will target the method that contains the actual enumerator code + + + Specifies the type of argument + + + + This is a normal argument + + + This is a reference argument (ref) + + + This is an out argument (out) + + + This is a pointer argument (&) + + + Specifies the type of patch + + + + Any patch + + + A prefix patch + + + A postfix patch + + + A transpiler + + + A finalizer + + + A reverse patch + + + A MonoMod + + + Specifies the type of reverse patch + + + + Use the unmodified original method (directly from IL) + + + Use the original as it is right now including previous patches but excluding future ones + + + Specifies the type of method call dispatching mechanics + + + + Call the method using dynamic dispatching if method is virtual (including overriden) + + + This is the built-in form of late binding (a.k.a. dynamic binding) and is the default dispatching mechanic in C#. + This directly corresponds with the instruction. + + + For virtual (including overriden) methods, the instance type's most-derived/overriden implementation of the method is called. + For non-virtual (including static) methods, same behavior as : the exact specified method implementation is called. + + + Note: This is not a fully dynamic dispatch, since non-virtual (including static) methods are still called non-virtually. + A fully dynamic dispatch in C# involves using + the dynamic type + (actually a fully dynamic binding, since even the name and overload resolution happens at runtime), which does not support. + + + + + Call the method using static dispatching, regardless of whether method is virtual (including overriden) or non-virtual (including static) + + + a.k.a. non-virtual dispatching, early binding, or static binding. + This directly corresponds with the instruction. + + + For both virtual (including overriden) and non-virtual (including static) methods, the exact specified method implementation is called, without virtual/override mechanics. + + + + + The base class for all Harmony annotations (not meant to be used directly) + + + + The common information for all attributes + + + Annotation to define targets of your Harmony patch methods + + + + An empty annotation can be used together with TargetMethod(s) + + + + An annotation that specifies a class to patch + The declaring class/type + + + + An annotation that specifies a method, property or constructor to patch + The declaring class/type + The argument types of the method or constructor to patch + + + + An annotation that specifies a method, property or constructor to patch + The declaring class/type + The name of the method, property or constructor to patch + + + + An annotation that specifies a method, property or constructor to patch + The declaring class/type + The name of the method, property or constructor to patch + An array of argument types to target overloads + + + + An annotation that specifies a method, property or constructor to patch + The declaring class/type + The name of the method, property or constructor to patch + An array of argument types to target overloads + Array of + + + + An annotation that specifies a method, property or constructor to patch + Assembly-qualified name of the declaring class/type + The name of the method, property or constructor to patch + + + + An annotation that specifies a method, property or constructor to patch + Assembly-qualified name of the declaring class/type + The name of the method, property or constructor to patch + The + An array of argument types to target overloads + Array of + + + + An annotation that specifies a method, property or constructor to patch + The declaring class/type + The + + + + An annotation that specifies a method, property or constructor to patch + The declaring class/type + The + An array of argument types to target overloads + + + + An annotation that specifies a method, property or constructor to patch + The declaring class/type + The + An array of argument types to target overloads + Array of + + + + An annotation that specifies a method, property or constructor to patch + The declaring class/type + The name of the method, property or constructor to patch + The + + + + An annotation that specifies a method, property or constructor to patch + The name of the method, property or constructor to patch + + + + An annotation that specifies a method, property or constructor to patch + The name of the method, property or constructor to patch + An array of argument types to target overloads + + + + An annotation that specifies a method, property or constructor to patch + The name of the method, property or constructor to patch + An array of argument types to target overloads + An array of + + + + An annotation that specifies a method, property or constructor to patch + The name of the method, property or constructor to patch + The + + + + An annotation that specifies a method, property or constructor to patch + The + + + + An annotation that specifies a method, property or constructor to patch + The + An array of argument types to target overloads + + + + An annotation that specifies a method, property or constructor to patch + The + An array of argument types to target overloads + An array of + + + + An annotation that specifies a method, property or constructor to patch + An array of argument types to target overloads + + + + An annotation that specifies a method, property or constructor to patch + An array of argument types to target overloads + An array of + + + + Annotation to define the original method for delegate injection + + + + An annotation that specifies a class to patch + The declaring class/type + + + + An annotation that specifies a method, property or constructor to patch + The declaring class/type + The argument types of the method or constructor to patch + + + + An annotation that specifies a method, property or constructor to patch + The declaring class/type + The name of the method, property or constructor to patch + + + + An annotation that specifies a method, property or constructor to patch + The declaring class/type + The name of the method, property or constructor to patch + An array of argument types to target overloads + + + + An annotation that specifies a method, property or constructor to patch + The declaring class/type + The name of the method, property or constructor to patch + An array of argument types to target overloads + Array of + + + + An annotation that specifies a method, property or constructor to patch + The declaring class/type + The + + + + An annotation that specifies a method, property or constructor to patch + The declaring class/type + The + An array of argument types to target overloads + + + + An annotation that specifies a method, property or constructor to patch + The declaring class/type + The + An array of argument types to target overloads + Array of + + + + An annotation that specifies a method, property or constructor to patch + The declaring class/type + The name of the method, property or constructor to patch + The + + + + An annotation that specifies a method, property or constructor to patch + The name of the method, property or constructor to patch + + + + An annotation that specifies a method, property or constructor to patch + The name of the method, property or constructor to patch + An array of argument types to target overloads + + + + An annotation that specifies a method, property or constructor to patch + The name of the method, property or constructor to patch + An array of argument types to target overloads + An array of + + + + An annotation that specifies a method, property or constructor to patch + The name of the method, property or constructor to patch + The + + + + An annotation that specifies call dispatching mechanics for the delegate + The + + + + An annotation that specifies a method, property or constructor to patch + The + An array of argument types to target overloads + + + + An annotation that specifies a method, property or constructor to patch + The + An array of argument types to target overloads + An array of + + + + An annotation that specifies a method, property or constructor to patch + An array of argument types to target overloads + + + + An annotation that specifies a method, property or constructor to patch + An array of argument types to target overloads + An array of + + + + Annotation to define your standin methods for reverse patching + + + + An annotation that specifies the type of reverse patching + The of the reverse patch + + + + A Harmony annotation to define that all methods in a class are to be patched + + + + A Harmony annotation used to change order in which Harmony patches are applied + + + + A Harmony annotation to define patch priority + The priority + + + + A Harmony annotation to define that a patch comes before another patch + + + + A Harmony annotation to define that a patch comes before another patch + The array of harmony IDs of the other patches + + + + A Harmony annotation to define that a patch comes after another patch + + + A Harmony annotation to define that a patch comes after another patch + The array of harmony IDs of the other patches + + + + A Harmony annotation to output a debug log for a patch + + + A Harmony annotation to debug a patch (output uses to log to your Desktop) + + + + A Harmony annotation to emit IL of the patch to a DLL + + + + A Harmony annotation to emit IL of the patch to the current working directory + + + + A Harmony annotation to emit IL of the patch to the given path + Directory to which emit the patch + + + + A Harmony attribute to automatically wrap the patch into try/catch. Exceptions are logged to Harmony log and eaten. + + + + If specified on a prefix, postfix or a finalizer, the method will be automatically wrapped into try/catch. + + + + Specifies the Prepare function in a patch class + + + + Specifies the Cleanup function in a patch class + + + + Specifies the TargetMethod function in a patch class + + + + Specifies the TargetMethods function in a patch class + + + + Specifies the Prefix function in a patch class + + + + Specifies the Postfix function in a patch class + + + + Specifies the Transpiler function in a patch class + + + + Specifies the ILManipulator function in a patch class> + + + + Specifies the Finalizer function in a patch class + + + + A Harmony annotation to declare injected arguments + + + + The name of the original argument + + + + The index of the original argument + + + + The new name of the original argument + + + + An annotation to declare injected arguments by name + + + + An annotation to declare injected arguments by index + Zero-based index + + + + An annotation to declare injected arguments by renaming them + Name of the original argument + New name + + + + An annotation to declare injected arguments by index and renaming them + Zero-based index + New name + + + + An abstract wrapper around OpCode and their operands. Used by transpilers + + + + The opcode + + + + The operand + + + + All labels defined on this instruction + + + + All exception block boundaries defined on this instruction + + + + Creates a new CodeInstruction with a given opcode and optional operand + The opcode + The operand + + + + Create a full copy (including labels and exception blocks) of a CodeInstruction + The to copy + + + + Clones a CodeInstruction and resets its labels and exception blocks + A lightweight copy of this code instruction + + + + Clones a CodeInstruction, resets labels and exception blocks and sets its opcode + The opcode + A copy of this CodeInstruction with a new opcode + + + + Clones a CodeInstruction, resets labels and exception blocks and sets its operand + The operand + A copy of this CodeInstruction with a new operand + + + + Creates a CodeInstruction calling a method (CALL) + The class/type where the method is declared + The name of the method (case sensitive) + Optional parameters to target a specific overload of the method + Optional list of types that define the generic version of the method + A code instruction that calls the method matching the arguments + + + + Creates a CodeInstruction calling a method (CALL) + The target method in the form TypeFullName:MethodName, where the type name matches a form recognized by Type.GetType like Some.Namespace.Type. + Optional parameters to target a specific overload of the method + Optional list of types that define the generic version of the method + A code instruction that calls the method matching the arguments + + + + Creates a CodeInstruction calling a method (CALL) + The lambda expression using the method + + + + + Creates a CodeInstruction calling a method (CALL) + The lambda expression using the method + + + + + Creates a CodeInstruction calling a method (CALL) + The lambda expression using the method + + + + + Creates a CodeInstruction calling a method (CALL) + The lambda expression using the method + + + + + Returns an instruction to call the specified closure + The delegate type to emit + The closure that defines the method to call + A that calls the closure as a method + + + + Creates a CodeInstruction loading a field (LD[S]FLD[A]) + The class/type where the field is defined + The name of the field (case sensitive) + Use address of field + + + + Creates a CodeInstruction storing to a field (ST[S]FLD) + The class/type where the field is defined + The name of the field (case sensitive) + + + + Returns a string representation of the code instruction + A string representation of the code instruction + + + + Exception block types + + + + The beginning of an exception block + + + + The beginning of a catch block + + + + The beginning of an except filter block + + + + The beginning of a fault block + + + + The beginning of a finally block + + + + The end of an exception block + + + + An exception block + + + + Block type + + + + Catch type + + + + Creates an exception block + The + The catch type + + + + + An exception thrown when a patch argument in a Harmony patch is invalid. + + + + + Original method to be patched. + + + + + Patch that was attempted to be applied. + + + + + + + + Constructs a new exception instance. + + Message of the exception. + Original method to be patched. + Patch that was attempted to be applied. + + + + An exception thrown when a reflection member is not found. + + + + + + + The Harmony instance is the main entry to Harmony. After creating one with an unique identifier, it is used to patch and query the current application domain + + + + Set to true before instantiating Harmony to debug Harmony or use an environment variable to set HARMONY_DEBUG to '1' like this: cmd /C "set HARMONY_DEBUG=1 && game.exe" + This is for full debugging. To debug only specific patches, use the attribute + + + + Creates a new Harmony instance + A unique identifier (you choose your own) + A Harmony instance + + + + The unique identifier + + + + Searches the current assembly for Harmony annotations and uses them to create patches + This method can fail to use the correct assembly when being inlined. It calls StackTrace.GetFrame(1) which can point to the wrong method/assembly. If you are unsure or run into problems, use PatchAll(Assembly.GetExecutingAssembly()) instead. + + + + Creates a empty patch processor for an original method + The original method/constructor + A new instance + + + + Creates a patch class processor from an annotated class + The class/type + A new instance + + + + Creates a patch class processor from an annotated class + The class/type + If true, the type doesn't need to have any attributes present for processing + A new instance + + + + Creates a reverse patcher for one of your stub methods + The original method/constructor + The stand-in stub method as + A new instance + + + + Searches an assembly for Harmony annotations and uses them to create patches + The assembly + + + + Searches the given type for Harmony annotation and uses them to create patches + The type to search + + + + Creates patches by manually specifying the methods + The original method/constructor + An optional prefix method wrapped in a object + An optional postfix method wrapped in a object + An optional transpiler method wrapped in a object + An optional finalizer method wrapped in a object + An optional ilmanipulator method wrapped in a + The replacement method that was created to patch the original method + + + + Creates patches by manually specifying the methods + The original method/constructor + An optional prefix method wrapped in a object + An optional postfix method wrapped in a object + An optional transpiler method wrapped in a object + An optional finalizer method wrapped in a object + The replacement method that was created to patch the original method + + + + Patches a foreign method onto a stub method of yours and optionally applies transpilers during the process + The original method/constructor you want to duplicate + Your stub method as that will become the original. Needs to have the correct signature (either original or whatever your transpilers generates) + An optional transpiler as method that will be applied during the process + An optional ilmanipulator as method that will be applied during the process + The replacement method that was created to patch the stub method + + + + Patches a foreign method onto a stub method of yours and optionally applies transpilers during the process + The original method/constructor you want to duplicate + Your stub method as that will become the original. Needs to have the correct signature (either original or whatever your transpilers generates) + An optional transpiler as method that will be applied during the process + The replacement method that was created to patch the stub method + + + + Unpatches all methods that were patched by the specified . Unpatching is done by repatching methods without patches of this instance. + The Harmony ID to restrict unpatching to a specific Harmony instance. + Gets thrown when a null or empty HarmonyID gets passed in. + + + + Unpatches all methods that were patched by this Harmony instance's ID. Unpatching is done by repatching methods without patches of this instance. + + + + Globally unpatches ALL methods by patching them with zero patches. Complete unpatching is not supported. + + + + Unpatches methods by patching them with zero patches. Fully unpatching is not supported. Be careful, unpatching is global + The Harmony ID to restrict unpatching to a specific Harmony instance. Whether this parameter is actually optional is determined by the global flag + When is set to true, the execution of this method will be skipped when no is specified. + + + + Unpatches a method by patching it with zero patches. Fully unpatching is not supported. Be careful, unpatching is global + The original method/constructor + The + The optional Harmony ID to restrict unpatching to a specific Harmony instance + + + + Unpatches a method by patching it with zero patches. Fully unpatching is not supported. Be careful, unpatching is global + The original method/constructor + The patch method as method to remove + + + + Test for patches from a specific Harmony ID + The Harmony ID + True if patches for this ID exist + + + + Gets patch information for a given original method + The original method/constructor + The patch information as + + + + Gets the methods this instance has patched + An enumeration of original methods/constructors + + + + Gets all patched original methods in the appdomain + An enumeration of patched original methods/constructors + + + + Gets the original method from a given replacement method + A replacement method, for example from a stacktrace + The original method/constructor or null if not found + + + + Tries to get the method from a stackframe including dynamic replacement methods + The + For normal frames, frame.GetMethod() is returned. For frames containing patched methods, the replacement method is returned or null if no method can be found + + + + Gets Harmony version for all active Harmony instances + [out] The current Harmony version + A dictionary containing assembly versions keyed by Harmony IDs + + + + Creates a new Harmony instance and applies all patches specified in the type + The type to scan for patches. + The ID for the Harmony instance to create, which will be used. + + + + Applies all patches specified in the assembly + The assembly to scan. + The ID for the Harmony instance to create, which will be used. + + + + Under Mono, HarmonyException wraps IL compile errors with detailed information about the failure + + + + Default serialization constructor (not implemented) + The info + The context + + + + Get a list of IL instructions in pairs of offset+code + A list of key/value pairs which represent an offset and the code at that offset + + + + Get a list of IL instructions without offsets + A list of + + + + Get the error offset of the errornous IL instruction + The offset + + + + Get the index of the errornous IL instruction + The index into the list of instructions or -1 if not found + + + + Class that holds all Global Harmony settings + + + + Set to true to disallow executing the legacy instance method without specifying a harmonyId. + If set to true and the legacy instance method is called without passing a harmonyId, then execution of said method will be skipped. + + + A wrapper around a method to use it as a patch (for example a Prefix) + + + + The original method + + + + Class/type declaring this patch + + + + Patch method name + + + + Optional patch + + + + Array of argument types of the patch method + + + + of the patch + + + + Install this patch before patches with these Harmony IDs + + + + Install this patch after patches with these Harmony IDs + + + + Reverse patch type, see + + + + Create debug output for this patch + + + + If not null, the IL of the patch is output to this path + + + + Whether to use (true) or (false) mechanics + for -attributed delegate + + + + Whether to wrap the patch itself into a try/catch. + + + + Default constructor + + + + Creates a patch from a given method + The original method + + + + Creates a patch from a given method + The original method + The patch + A list of harmony IDs that should come after this patch + A list of harmony IDs that should come before this patch + Set to true to generate debug output + + + + Creates a patch from a given method + The patch class/type + The patch method name + The optional argument types of the patch method (for overloaded methods) + + + + Gets the names of all internal patch info fields + A list of field names + + + + Merges annotations + The list of to merge + The merged + + + + Returns a string that represents the annotation + A string representation + + + + Annotation extensions + + + + Copies annotation information + The source + The destination + + + + Clones an annotation + The to clone + A copied + + + + Merges annotations + The master + The detail + A new, merged + + + + Gets all annotations on a class/type + The class/type + A list of all + + + + Gets merged annotations on a class/type + The class/type + The merged + + + + Gets all annotations on a method + The method/constructor + A list of + + + + Gets merged annotations on a method + The method/constructor + The merged + + + + + A mutable representation of an inline signature, similar to Mono.Cecil's CallSite. + Used by the calli instruction, can be used by transpilers + + + + + See + + + + See + + + + See + + + + The list of all parameter types or function pointer signatures received by the call site + + + + The return type or function pointer signature returned by the call site + + + + Returns a string representation of the inline signature + A string representation of the inline signature + + + + + A mutable representation of a parameter type with an attached type modifier, + similar to Mono.Cecil's OptionalModifierType / RequiredModifierType and C#'s modopt / modreq + + + + + Whether this is a modopt (optional modifier type) or a modreq (required modifier type) + + + + The modifier type attached to the parameter type + + + + The modified parameter type + + + + Returns a string representation of the modifier type + A string representation of the modifier type + + + + Patch serialization + + + + Control the binding of a serialized object to a type + Specifies the assembly name of the serialized object + Specifies the type name of the serialized object + The type of the object the formatter creates a new instance of + + + + Serializes a patch info + The + The serialized data + + + + Deserialize a patch info + The serialized data + A + + + + Compare function to sort patch priorities + The patch + Zero-based index + The priority + A standard sort integer (-1, 0, 1) + + + + Serializable patch information + + + + Prefixes as an array of + + + + Postfixes as an array of + + + + Transpilers as an array of + + + + Finalizers as an array of + + + + ILManipulators as an array of + + + + Returns if any of the patches wants debugging turned on + + + + Returns a list of paths that the IL should be dumped to + + + + Adds prefixes + An owner (Harmony ID) + The patch methods + + + + Adds a prefix + + + Removes prefixes + The owner of the prefixes, or * for all + + + + Adds postfixes + An owner (Harmony ID) + The patch methods + + + + Adds a postfix + + + Removes postfixes + The owner of the postfixes, or * for all + + + + Adds transpilers + An owner (Harmony ID) + The patch methods + + + + Adds a transpiler + + + Removes transpilers + The owner of the transpilers, or * for all + + + + Adds finalizers + An owner (Harmony ID) + The patch methods + + + + Adds a finalizer + + + Removes finalizers + The owner of the finalizers, or * for all + + + + Adds ilmanipulators + An owner (Harmony ID) + The patch methods + + + + Removes ilmanipulators + The owner of the ilmanipulators, or * for all + + + + Removes a patch using its method + The method of the patch to remove + + + + Gets a concatenated list of patches + The Harmony instance ID adding the new patches + The patches to add + The current patches + + + + Gets a list of patches with any from the given owner removed + The owner of the methods, or * for all + The current patches + + + + A serializable patch + + + + Zero-based index + + + + The owner (Harmony ID) + + + + The priority, see + + + + Keep this patch before the patches indicated in the list of Harmony IDs + + + + Keep this patch after the patches indicated in the list of Harmony IDs + + + + A flag that will log the replacement method via every time this patch is used to build the replacement, even in the future + + + + If not null, IL DLL is output to this directory + + + + Whether to wrap the patch into a general try/catch that logs the error + + + + The method of the static patch method + + + + Creates a patch + The method of the patch + Zero-based index + An owner (Harmony ID) + The priority, see + A list of Harmony IDs for patches that should run after this patch + A list of Harmony IDs for patches that should run before this patch + A flag that will log the replacement method via every time this patch is used to build the replacement, even in the future + + + + Creates a patch + The method of the patch + Zero-based index + An owner (Harmony ID) + The priority, see + A list of Harmony IDs for patches that should run after this patch + A list of Harmony IDs for patches that should run before this patch + A flag that will log the replacement method via every time this patch is used to build the replacement, even in the future + Whether to wrap the patch into a general try/catch that logs the error + + + + Creates a patch + The method of the patch + Zero-based index + An owner (Harmony ID) + The priority, see + A list of Harmony IDs for patches that should run after this patch + A list of Harmony IDs for patches that should run before this patch + A flag that will log the replacement method via every time this patch is used to build the replacement, even in the future + Whether to wrap the patch into a general try/catch that logs the error + If not null, the patch IL DLL is saved to this directory + + + + Creates a patch + The method of the patch + Zero-based index + An owner (Harmony ID) + + + Get the patch method or a DynamicMethod if original patch method is a patch factory + The original method/constructor + The method of the patch + + + + Determines whether patches are equal + The other patch + true if equal + + + + Determines how patches sort + The other patch + integer to define sort order (-1, 0, 1) + + + + Hash function + A hash code + + + + A PatchClassProcessor used to turn on a class/type into patches + + + + Creates a patch class processor by pointing out a class. Similar to PatchAll() but without searching through all classes. + The Harmony instance + The class to process (need to have at least a [HarmonyPatch] attribute if allowUnannotatedType is set to false) + + + + Creates a patch class processor by pointing out a class. Similar to PatchAll() but without searching through all classes. + The Harmony instance + The class to process (need to have at least a [HarmonyPatch] attribute if allowUnannotatedType is set to false) + If true, the type doesn't need to have any attributes present for processing + + + + Applies the patches + A list of all created replacement methods or null if patch class is not annotated + + + + A group of patches + + + + A collection of prefix + + + + A collection of postfix + + + + A collection of transpiler + + + + A collection of finalizer + + + + A collection of ILManipulator + + + + Gets all owners (Harmony IDs) or all known patches + The patch owners + + + + Creates a group of patches + An array of prefixes as + An array of postfixes as + An array of transpileres as + An array of finalizeres as + An array of ilmanipulators as + + + + Creates a group of patches + An array of prefixes as + An array of postfixes as + An array of transpileres as + An array of finalizeres as + + + + + IL manipulator to create Harmony-style patches. + + + + + Initializes a new instance of the class. + + Patches to apply to the body. + + + + Manipulates a by applying Harmony patches to it. + + + Reference to the method that should be considered as original. Used to reference parameter and + return types. + + Collection of Harmony patches to apply. + Method body to manipulate as instance. Should contain instructions to patch. + + In most cases you will want to use to create or obtain global + patch info for the method that contains aggregated info of all Harmony instances. + + + + + Manipulates IL into a replacement method with Harmony patches applied to it. + + Original method that contains and other metadata. + IL to rewrite. + + + + Convert the IL code into a Harmony patch. + + IL body of the method to rewrite into a Harmony patch. + Original method to use for context. + + + + Method patcher for normal managed methods that have IL body attached to them. + Uses in order to apply hooks in a way compatible with MonoMod's own + hooking system. + + + + + + + + + + + + + + + + + + A handler for that checks if a method is a normal Managed method. + + Not used + Patch resolver arguments + + + + + A general method patcher for implementing custom Harmony patcher backends. + + + + + + Constructs a method patcher + + Original method to patch + + + + + Original method to patch. + + + + + + Prepares method body for the unpatched that simply calls + function. + + + A that contains a call to + the original method to pass to the IL manipulator. + If null, Harmony patches must be manually applied to the original via . + + + + + + Detours to the provided replacement function. If called multiple times, + is re-detoured to the new method. + + + Result of + if returned non-null. + Otherwise, this will be null, in which case you must manually generate Harmony-patched method + with . + + of the hook, if it's different from `replacement`. + + + + + Creates a copy of the original method. If not possible, creates a method that calls into the original method. + + Copy of the original method that is transpileable. If not possible, returns null. + + This method creates a pure copy of the original method that is usable with transpilers. Currently, this + method is used to generate reverse patchers. + If a purse IL copy is not possible, a best approximation should be generated + (e.g. a wrapper that calls original method). + If no best approximation is possible, this method should return null, in which case generating reverse + patchers for the method will fail. + + + + + + A method patcher that uses to patch internal calls, + methods marked with and any other managed method that CLR managed-to-native + trampolines for and which has no IL body defined. + + + + + Constructs a new instance of method patcher. + + + + + + + + + + + + + + + A handler for that checks if a method doesn't have a body + (e.g. it's icall or marked with ) and thus can be patched with + . + + Not used + Patch resolver arguments + + + + + A global manager for handling Harmony patch state. Contains information about all patched methods and all + actual instances that handle patching implementation. + + + + + + Method patcher resolve event. + + + When a method is to be patched, this resolver event is called once on the method to determine which + backend to use in order to patch the method. + To make Harmony use the specified backend, set to an + instance of the method patcher backend to use. + + + + + + Creates or gets an existing instance of that handles patching the method. + + Method to patch. + Instance of that handles patching the method. + No suitable patcher found for the method. + + + + + Gets patch info for the given target method. + + Method to get patch info for. + Current patch info of the method. + + + + + Gets or creates patch info for the given method. + + Method to get info from. + An existing or new patch info for the method containing information about the applied patches. + + + + + Gets all methods that have been patched. + + List of methods that have been patched. + + + + + Removes all method resolvers. Use with care, this removes the default ones too! + + + + + Patcher resolve event arguments. + + + + + + Original method that is to be patched. + + + + + + Method patcher to use to patch . + Set this value to specify which one to use. + + + + + A PatchProcessor handles patches on a method/constructor + + + + Creates an empty patch processor + The Harmony instance + The original method/constructor + + + + Adds a prefix + The prefix as a + A for chaining calls + + + + Adds a prefix + The prefix method + A for chaining calls + + + + Adds a postfix + The postfix as a + A for chaining calls + + + + Adds a postfix + The postfix method + A for chaining calls + + + + Adds a transpiler + The transpiler as a + A for chaining calls + + + + Adds a transpiler + The transpiler method + A for chaining calls + + + + Adds a finalizer + The finalizer as a + A for chaining calls + + + + Adds a finalizer + The finalizer method + A for chaining calls + + + + Adds an ilmanipulator + The ilmanipulator as a + A for chaining calls + + + + Adds an ilmanipulator + The ilmanipulator method + A for chaining calls + + + + Gets all patched original methods in the appdomain + An enumeration of patched method/constructor + + + + Applies all registered patches + The generated replacement method + + + + Unpatches patches of a given type and/or Harmony ID + The patch type + Harmony ID or * for any + A for chaining calls + + + + Unpatches a specific patch + The method of the patch + A for chaining calls + + + + Gets patch information on an original + The original method/constructor + The patch information as + + + + Sort patch methods by their priority rules + The original method + Patches to sort + The sorted patch methods + + + + Gets Harmony version for all active Harmony instances + [out] The current Harmony version + A dictionary containing assembly version keyed by Harmony ID + + + + Creates a new empty generator to use when reading method bodies + A new + + + + Creates a new generator matching the method/constructor to use when reading method bodies + The original method/constructor to copy method information from + A new + + + + Returns the methods unmodified list of code instructions + The original method/constructor + Optionally an existing generator that will be used to create all local variables and labels contained in the result (if not specified, an internal generator is used) + A list containing all the original + + + + Returns the methods unmodified list of code instructions + The original method/constructor + A new generator that now contains all local variables and labels contained in the result + A list containing all the original + + + + Returns the methods current list of code instructions after all existing transpilers have been applied + The original method/constructor + Apply only the first count of transpilers + Optionally an existing generator that will be used to create all local variables and labels contained in the result (if not specified, an internal generator is used) + A list of + + + + Returns the methods current list of code instructions after all existing transpilers have been applied + The original method/constructor + A new generator that now contains all local variables and labels contained in the result + Apply only the first count of transpilers + A list of + + + + A low level way to read the body of a method. Used for quick searching in methods + The original method + All instructions as opcode/operand pairs + + + + A low level way to read the body of a method. Used for quick searching in methods + The original method + An existing generator that will be used to create all local variables and labels contained in the result + All instructions as opcode/operand pairs + + + + A patch priority + + + + Patch last + + + + Patch with very low priority + + + + Patch with low priority + + + + Patch with lower than normal priority + + + + Patch with normal priority + + + + Patch with higher than normal priority + + + + Patch with high priority + + + + Patch with very high priority + + + + Patch first + + + + A reverse patcher + + + + Creates a reverse patcher + The Harmony instance + The original method/constructor + Your stand-in stub method as + + + + Applies the patch + The type of patch, see + The generated replacement method + + + + A collection of commonly used transpilers + + + + Returns an instruction to call the specified delegate + The delegate type to emit + The delegate to emit + The instruction to call the specified action + + + + A transpiler that replaces all occurrences of a given method with another one using the same signature + The enumeration of to act on + Method or constructor to search for + Method or constructor to replace with + Modified enumeration of + + + + A transpiler that alters instructions that match a predicate by calling an action + The enumeration of to act on + A predicate selecting the instructions to change + An action to apply to matching instructions + Modified enumeration of + + + + A transpiler that logs a text at the beginning of the method + The instructions to act on + The log text + Modified enumeration of + + + + A transpiler that replaces the entire body of the method with another one + The replacement method. It's up to the caller of this transpiler to make sure that the signatures match. + of the patch. This is passed via transpiler. + A collection of that contains instructions of replacement method. + The replacement method is not a managed method that contains any IL. + This transpiler has a side effect of clearing up all previous locals and previous transpilers. + Use to run this transpiler as early as possible. + + + A helper class for reflection related functions + + + + Shortcut for to simplify the use of reflections and make it work for any access level + + + + Shortcut for to simplify the use of reflections and make it work for any access level but only within the current type + + + + Enumerates all assemblies in the current app domain, excluding visual studio assemblies + An enumeration of + + + Gets a type by name. Prefers a full name with namespace but falls back to the first type matching the name otherwise + The name + A type or null if not found + + + + Gets all successfully loaded types from a given assembly + The assembly + An array of types + + This calls and returns , while catching any thrown . + If such an exception is thrown, returns the successfully loaded types (, + filtered for non-null values). + + + + + Enumerates all successfully loaded types in the current app domain, excluding visual studio assemblies + An enumeration of all in all assemblies, excluding visual studio assemblies + + + Applies a function going up the type hierarchy and stops at the first non-null result + Result type of func() + The class/type to start with + The evaluation function returning T + The first non-null result, or null if no match + + The type hierarchy of a class or value type (including struct) does NOT include implemented interfaces, + and the type hierarchy of an interface is only itself (regardless of whether that interface implements other interfaces). + The top-most type in the type hierarchy of all non-interface types (including value types) is . + + + + + Applies a function going into inner types and stops at the first non-null result + Generic type parameter + The class/type to start with + The evaluation function returning T + The first non-null result, or null if no match + + + + Gets the reflection information for a directly declared field + The class/type where the field is defined + The name of the field + A field or null when type/name is null or when the field cannot be found + + + + Gets the reflection information for a field by searching the type and all its super types + The class/type where the field is defined + The name of the field (case sensitive) + A field or null when type/name is null or when the field cannot be found + + + + Gets the reflection information for a field + The class/type where the field is declared + The zero-based index of the field inside the class definition + A field or null when type is null or when the field cannot be found + + + + Gets the reflection information for a directly declared property + The class/type where the property is declared + The name of the property (case sensitive) + A property or null when type/name is null or when the property cannot be found + + + + Gets the reflection information for the getter method of a directly declared property + The class/type where the property is declared + The name of the property (case sensitive) + A method or null when type/name is null or when the property cannot be found + + + + Gets the reflection information for the setter method of a directly declared property + The class/type where the property is declared + The name of the property (case sensitive) + A method or null when type/name is null or when the property cannot be found + + + + Gets the reflection information for a property by searching the type and all its super types + The class/type + The name + A property or null when type/name is null or when the property cannot be found + + + + Gets the reflection information for the getter method of a property by searching the type and all its super types + The class/type + The name + A method or null when type/name is null or when the property cannot be found + + + + Gets the reflection information for the setter method of a property by searching the type and all its super types + The class/type + The name + A method or null when type/name is null or when the property cannot be found + + + + Gets the reflection information for a directly declared method + The class/type where the method is declared + The name of the method (case sensitive) + Optional parameters to target a specific overload of the method + Optional list of types that define the generic version of the method + A method or null when type/name is null or when the method cannot be found + + + + Gets the reflection information for a method by searching the type and all its super types + The class/type where the method is declared + The name of the method (case sensitive) + Optional parameters to target a specific overload of the method + Optional list of types that define the generic version of the method + A method or null when type/name is null or when the method cannot be found + + + + Gets the reflection information for a method by searching the type and all its super types + The target method in the form TypeFullName:MethodName, where the type name matches a form recognized by Type.GetType like Some.Namespace.Type. + Optional parameters to target a specific overload of the method + Optional list of types that define the generic version of the method + A method or null when type/name is null or when the method cannot be found + + + + Gets method of an enumerator method. + Enumerator method from which to get its + of the enumerator or null if no valid enumerator is detected + + + Gets the names of all method that are declared in a type + The declaring class/type + A list of method names + + + + Gets the names of all method that are declared in the type of the instance + An instance of the type to search in + A list of method names + + + + Gets the names of all fields that are declared in a type + The declaring class/type + A list of field names + + + + Gets the names of all fields that are declared in the type of the instance + An instance of the type to search in + A list of field names + + + + Gets the names of all properties that are declared in a type + The declaring class/type + A list of property names + + + + Gets the names of all properties that are declared in the type of the instance + An instance of the type to search in + A list of property names + + + + Gets the type of any class member of + A member + The class/type of this member + + + + Test if a class member is actually an concrete implementation + A member + True if the member is a declared + + + + Gets the real implementation of a class member + A member + The member itself if its declared. Otherwise the member that is actually implemented in some base type + + + + Gets the reflection information for a directly declared constructor + The class/type where the constructor is declared + Optional parameters to target a specific overload of the constructor + Optional parameters to only consider static constructors + A constructor info or null when type is null or when the constructor cannot be found + + + + Gets the reflection information for a constructor by searching the type and all its super types + The class/type where the constructor is declared + Optional parameters to target a specific overload of the method + Optional parameters to only consider static constructors + A constructor info or null when type is null or when the method cannot be found + + + + Gets reflection information for all declared constructors + The class/type where the constructors are declared + Optional parameters to only consider static constructors + A list of constructor infos + + + + Gets reflection information for all declared methods + The class/type where the methods are declared + A list of methods + + + + Gets reflection information for all declared properties + The class/type where the properties are declared + A list of properties + + + + Gets reflection information for all declared fields + The class/type where the fields are declared + A list of fields + + + + Gets the return type of a method or constructor + The method/constructor + The return type + + + + Given a type, returns the first inner type matching a recursive search by name + The class/type to start searching at + The name of the inner type (case sensitive) + The inner type or null if type/name is null or if a type with that name cannot be found + + + + Given a type, returns the first inner type matching a recursive search with a predicate + The class/type to start searching at + The predicate to search with + The inner type or null if type/predicate is null or if a type with that name cannot be found + + + + Given a type, returns the first method matching a predicate + The class/type to start searching at + The predicate to search with + The method or null if type/predicate is null or if a type with that name cannot be found + + + + Given a type, returns the first constructor matching a predicate + The class/type to start searching at + The predicate to search with + The constructor info or null if type/predicate is null or if a type with that name cannot be found + + + + Given a type, returns the first property matching a predicate + The class/type to start searching at + The predicate to search with + The property or null if type/predicate is null or if a type with that name cannot be found + + + + Returns an array containing the type of each object in the given array + An array of objects + An array of types or an empty array if parameters is null (if an object is null, the type for it will be object) + + + + Creates an array of input parameters for a given method and a given set of potential inputs + The method/constructor you are planing to call + The possible input parameters in any order + An object array matching the method signature + + + + A readable/assignable reference delegate to an instance field of a class or static field (NOT an instance field of a struct) + + An arbitrary type if the field is static; otherwise the class that defines the field, or a parent class (including ), + implemented interface, or derived class of this type + + + The type of the field; or if the field's type is a reference type (a class or interface, NOT a struct or other value type), + a type that is assignable from that type; or if the field's type is an enum type, + either that type or the underlying integral type of that enum type + + The runtime instance to access the field (ignored and can be omitted for static fields) + A readable/assignable reference to the field + Null instance passed to a non-static field ref delegate + + Instance of invalid type passed to a non-static field ref delegate + (this can happen if is a parent class or interface of the field's declaring type) + + + + This delegate cannot be used for instance fields of structs, since a struct instance passed to the delegate would be passed by + value and thus would be a copy that only exists within the delegate's invocation. This is fine for a readonly reference, + but makes assignment futile. Use instead. + + + Note that is not required to be the field's declaring type. It can be a parent class (including ), + implemented interface, or a derived class of the field's declaring type ("instanceOfT is FieldDeclaringType" must be possible). + Specifically, must be assignable from OR to the field's declaring type. + Technically, this allows Nullable, although Nullable is only relevant for structs, and since only static fields of structs + are allowed for this delegate, and the instance passed to such a delegate is ignored, this hardly matters. + + + Similarly, is not required to be the field's field type, unless that type is a non-enum value type. + It can be a parent class (including object) or implemented interface of the field's field type. It cannot be a derived class. + This variance is not allowed for value types, since that would require boxing/unboxing, which is not allowed for ref values. + Special case for enum types: can also be the underlying integral type of the enum type. + Specifically, for reference types, must be assignable from + the field's field type; for non-enum value types, must be exactly the field's field type; for enum types, + must be either the field's field type or the underyling integral type of that field type. + + + This delegate supports static fields, even those defined in structs, for legacy reasons. + For such static fields, is effectively ignored. + Consider using (and StaticFieldRefAccess methods that return it) instead for static fields. + + + + + + Creates a field reference delegate for an instance field of a class + The class that defines the instance field, or derived class of this type + + The type of the field; or if the field's type is a reference type (a class or interface, NOT a struct or other value type), + a type that is assignable from that type; or if the field's type is an enum type, + either that type or the underlying integral type of that enum type + + The name of the field + A readable/assignable delegate + + + For backwards compatibility, there is no class constraint on . + Instead, the non-value-type check is done at runtime within the method. + + + + + + Creates an instance field reference for a specific instance of a class + The class that defines the instance field, or derived class of this type + + The type of the field; or if the field's type is a reference type (a class or interface, NOT a struct or other value type), + a type that is assignable from that type; or if the field's type is an enum type, + either that type or the underlying integral type of that enum type + + The instance + The name of the field + A readable/assignable reference to the field + + + This method is meant for one-off access to a field's value for a single instance. + If you need to access a field's value for potentially multiple instances, use instead. + FieldRefAccess<T, F>(instance, fieldName) is functionally equivalent to FieldRefAccess<T, F>(fieldName)(instance). + + + For backwards compatibility, there is no class constraint on . + Instead, the non-value-type check is done at runtime within the method. + + + + + + Creates a field reference delegate for an instance field of a class or static field (NOT an instance field of a struct) + + The type of the field; or if the field's type is a reference type (a class or interface, NOT a struct or other value type), + a type that is assignable from that type; or if the field's type is an enum type, + either that type or the underlying integral type of that enum type + + + The type that defines the field, or derived class of this type; must not be a struct type unless the field is static + + The name of the field + + A readable/assignable delegate with T=object + (for static fields, the instance delegate parameter is ignored) + + + + This method is meant for cases where the given type is only known at runtime and thus can't be used as a type parameter T + in e.g. . + + + This method supports static fields, even those defined in structs, for legacy reasons. + Consider using (and other overloads) instead for static fields. + + + + + + Creates a field reference delegate for an instance field of a class or static field (NOT an instance field of a struct) + + An arbitrary type if the field is static; otherwise the class that defines the field, or a parent class (including ), + implemented interface, or derived class of this type ("instanceOfT is FieldDeclaringType" must be possible) + + + The type of the field; or if the field's type is a reference type (a class or interface, NOT a struct or other value type), + a type that is assignable from that type; or if the field's type is an enum type, + either that type or the underlying integral type of that enum type + + The field + A readable/assignable delegate + + + This method is meant for cases where the field has already been obtained, avoiding the field searching cost in + e.g. . + + + This method supports static fields, even those defined in structs, for legacy reasons. + For such static fields, is effectively ignored. + Consider using (and other overloads) instead for static fields. + + + For backwards compatibility, there is no class constraint on . + Instead, the non-value-type check is done at runtime within the method. + + + + + + Creates a field reference for an instance field of a class + + The type that defines the field; or a parent class (including ), implemented interface, or derived class of this type + ("instanceOfT is FieldDeclaringType" must be possible) + + + The type of the field; or if the field's type is a reference type (a class or interface, NOT a struct or other value type), + a type that is assignable from that type; or if the field's type is an enum type, + either that type or the underlying integral type of that enum type + + The instance + The field + A readable/assignable reference to the field + + + This method is meant for one-off access to a field's value for a single instance and where the field has already been obtained. + If you need to access a field's value for potentially multiple instances, use instead. + FieldRefAccess<T, F>(instance, fieldInfo) is functionally equivalent to FieldRefAccess<T, F>(fieldInfo)(instance). + + + For backwards compatibility, there is no class constraint on . + Instead, the non-value-type check is done at runtime within the method. + + + + + + A readable/assignable reference delegate to an instance field of a struct + The struct that defines the instance field + + The type of the field; or if the field's type is a reference type (a class or interface, NOT a struct or other value type), + a type that is assignable from that type; or if the field's type is an enum type, + either that type or the underlying integral type of that enum type + + A reference to the runtime instance to access the field + A readable/assignable reference to the field + + + + Creates a field reference delegate for an instance field of a struct + The struct that defines the instance field + + The type of the field; or if the field's type is a reference type (a class or interface, NOT a struct or other value type), + a type that is assignable from that type; or if the field's type is an enum type, + either that type or the underlying integral type of that enum type + + The name of the field + A readable/assignable delegate + + + + Creates an instance field reference for a specific instance of a struct + The struct that defines the instance field + + The type of the field; or if the field's type is a reference type (a class or interface, NOT a struct or other value type), + a type that is assignable from that type; or if the field's type is an enum type, + either that type or the underlying integral type of that enum type + + The instance + The name of the field + A readable/assignable reference to the field + + + This method is meant for one-off access to a field's value for a single instance. + If you need to access a field's value for potentially multiple instances, use instead. + StructFieldRefAccess<T, F>(ref instance, fieldName) is functionally equivalent to StructFieldRefAccess<T, F>(fieldName)(ref instance). + + + + + + Creates a field reference delegate for an instance field of a struct + The struct that defines the instance field + + The type of the field; or if the field's type is a reference type (a class or interface, NOT a struct or other value type), + a type that is assignable from that type; or if the field's type is an enum type, + either that type or the underlying integral type of that enum type + + The field + A readable/assignable delegate + + + This method is meant for cases where the field has already been obtained, avoiding the field searching cost in + e.g. . + + + + + + Creates a field reference for an instance field of a struct + The struct that defines the instance field + + The type of the field; or if the field's type is a reference type (a class or interface, NOT a struct or other value type), + a type that is assignable from that type; or if the field's type is an enum type, + either that type or the underlying integral type of that enum type + + The instance + The field + A readable/assignable reference to the field + + + This method is meant for one-off access to a field's value for a single instance and where the field has already been obtained. + If you need to access a field's value for potentially multiple instances, use instead. + StructFieldRefAccess<T, F>(ref instance, fieldInfo) is functionally equivalent to StructFieldRefAccess<T, F>(fieldInfo)(ref instance). + + + + + + A readable/assignable reference delegate to a static field + + The type of the field; or if the field's type is a reference type (a class or interface, NOT a struct or other value type), + a type that is assignable from that type; or if the field's type is an enum type, + either that type or the underlying integral type of that enum type + + A readable/assignable reference to the field + + + + Creates a static field reference + The type (can be class or struct) the field is defined in + + The type of the field; or if the field's type is a reference type (a class or interface, NOT a struct or other value type), + a type that is assignable from that type; or if the field's type is an enum type, + either that type or the underlying integral type of that enum type + + The name of the field + A readable/assignable reference to the field + + + + Creates a static field reference + + The type of the field; or if the field's type is a reference type (a class or interface, NOT a struct or other value type), + a type that is assignable from that type; or if the field's type is an enum type, + either that type or the underlying integral type of that enum type + + The type (can be class or struct) the field is defined in + The name of the field + A readable/assignable reference to the field + + + + Creates a static field reference + An arbitrary type (by convention, the type the field is defined in) + + The type of the field; or if the field's type is a reference type (a class or interface, NOT a struct or other value type), + a type that is assignable from that type; or if the field's type is an enum type, + either that type or the underlying integral type of that enum type + + The field + A readable/assignable reference to the field + + The type parameter is only used in exception messaging and to distinguish between this method overload + and the overload (which returns a rather than a reference). + + + + + Creates a static field reference delegate + + The type of the field; or if the field's type is a reference type (a class or interface, NOT a struct or other value type), + a type that is assignable from that type; or if the field's type is an enum type, + either that type or the underlying integral type of that enum type + + The field + A readable/assignable delegate + + + + Creates a delegate to a given method + The delegate Type + The method to create a delegate from. + + Only applies for instance methods. If null (default), returned delegate is an open (a.k.a. unbound) instance delegate + where an instance is supplied as the first argument to the delegate invocation; else, delegate is a closed (a.k.a. bound) + instance delegate where the delegate invocation always applies to the given . + + + Only applies for instance methods. If true (default) and is virtual, invocation of the delegate + calls the instance method virtually (the instance type's most-derived/overriden implementation of the method is called); + else, invocation of the delegate calls the exact specified (this is useful for calling base class methods) + Note: if false and is an interface method, an ArgumentException is thrown. + + A delegate of given to given + + + Delegate invocation is more performant and more convenient to use than + at a one-time setup cost. + + + Works for both type of static and instance methods, both open and closed (a.k.a. unbound and bound) instance methods, + and both class and struct methods. + + + + + + Creates a delegate for a given delegate definition, attributed with [] + The delegate Type, attributed with [] + + Only applies for instance methods. If null (default), returned delegate is an open (a.k.a. unbound) instance delegate + where an instance is supplied as the first argument to the delegate invocation; else, delegate is a closed (a.k.a. bound) + instance delegate where the delegate invocation always applies to the given . + + A delegate of given to the method specified via [] + attributes on + + This calls with the method and virtualCall arguments + determined from the [] attributes on , + and the given (for closed instance delegates). + + + + + Returns who called the current method + The calling method/constructor (excluding the caller) + + + + Rethrows an exception while preserving its stack trace (throw statement typically clobbers existing stack traces) + The exception to rethrow + + + + True if the current runtime is based on Mono, false otherwise (.NET) + + + + True if the current runtime is .NET Framework, false otherwise (.NET Core or Mono, although latter isn't guaranteed) + + + + True if the current runtime is .NET Core, false otherwise (Mono or .NET Framework) + + + + Throws a missing member runtime exception + The type that is involved + A list of names + + + + Gets default value for a specific type + The class/type + The default value + + + + Creates an (possibly uninitialized) instance of a given type + The class/type + The new instance + + + + Creates an (possibly uninitialized) instance of a given type + The class/type + The new instance + + + + + A cache for the or similar Add methods for different types. + + + + Makes a deep copy of any object + The type of the instance that should be created; for legacy reasons, this must be a class or interface + The original object + A copy of the original object but of type T + + + + Makes a deep copy of any object + The type of the instance that should be created + The original object + [out] The copy of the original object + Optional value transformation function (taking a field name and src/dst instances) + The optional path root to start with + + + + Makes a deep copy of any object + The original object + The type of the instance that should be created + Optional value transformation function (taking a field name and src/dst instances) + The optional path root to start with + The copy of the original object + + + + Tests if a type is a struct + The type + True if the type is a struct + + + + Tests if a type is a class + The type + True if the type is a class + + + + Tests if a type is a value type + The type + True if the type is a value type + + + + Tests if a type is an integer type + The type + True if the type represents some integer + + + + Tests if a type is a floating point type + The type + True if the type represents some floating point + + + + Tests if a type is a numerical type + The type + True if the type represents some number + + + + Tests if a type is void + The type + True if the type is void + + + + Test whether an instance is of a nullable type + Type of instance + An instance to test + True if instance is of nullable type, false if not + + + + Tests whether a type or member is static, as defined in C# + The type or member + True if the type or member is static + + + + Tests whether a type is static, as defined in C# + The type + True if the type is static + + + + Tests whether a property is static, as defined in C# + The property + True if the property is static + + + + Tests whether an event is static, as defined in C# + The event + True if the event is static + + + + Calculates a combined hash code for an enumeration of objects + The objects + The hash code + + + + A CodeInstruction match + + + The name of the match + + + The matched opcodes + + + The matched operands + + + The matched labels + + + The matched blocks + + + The jumps from the match + + + The jumps to the match + + + The match predicate + + + Creates a code match + The optional opcode + The optional operand + The optional name + + + + Creates a code match + The CodeInstruction + An optional name + + + + Creates a code match + The predicate + An optional name + + + + Returns a string that represents the match + A string representation + + + + Creates a new code match for an opcode + Opcode to match + + + + Creates a new code match for a code instruction + Code instruction + + + + A CodeInstruction matcher + + + The current position + The index or -1 if out of bounds + + + + Gets the number of code instructions in this matcher + The count + + + + Checks whether the position of this CodeMatcher is within bounds + True if this CodeMatcher is valid + + + + Checks whether the position of this CodeMatcher is outside its bounds + True if this CodeMatcher is invalid + + + + Gets the remaining code instructions + The remaining count + + + + Gets the opcode at the current position + The opcode + + + + Gets the operand at the current position + The operand + + + + Gets the labels at the current position + The labels + + + + Gets the exception blocks at the current position + The blocks + + + + Creates an empty code matcher + + + Creates a code matcher from an enumeration of instructions + The instructions (transpiler argument) + An optional IL generator + + + + Makes a clone of this instruction matcher + A copy of this matcher + + + + Gets instructions at the current position + The instruction + + + + Gets instructions at the current position with offset + The offset + The instruction + + + + Gets all instructions + A list of instructions + + + + Gets all instructions as an enumeration + A list of instructions + + + + Gets some instructions counting from current position + Number of instructions + A list of instructions + + + + Gets all instructions within a range + The start index + The end index + A list of instructions + + + + Gets all instructions within a range (relative to current position) + The start offset + The end offset + A list of instructions + + + + Gets a list of all distinct labels + The instructions (transpiler argument) + A list of Labels + + + + Reports a failure + The method involved + The logger + True if current position is invalid and error was logged + + + + Throw an InvalidOperationException if current state is invalid (position out of bounds / last match failed) + Explanation of where/why the exception was thrown that will be added to the exception message + The same code matcher + + + + Throw an InvalidOperationException if current state is invalid (position out of bounds / last match failed), + or if the matches do not match at current position + Explanation of where/why the exception was thrown that will be added to the exception message + Some code matches + The same code matcher + + + + Throw an InvalidOperationException if current state is invalid (position out of bounds / last match failed), + or if the matches do not match at any point between current position and the end + Explanation of where/why the exception was thrown that will be added to the exception message + Some code matches + The same code matcher + + + + Throw an InvalidOperationException if current state is invalid (position out of bounds / last match failed), + or if the matches do not match at any point between current position and the start + Explanation of where/why the exception was thrown that will be added to the exception message + Some code matches + The same code matcher + + + + Throw an InvalidOperationException if current state is invalid (position out of bounds / last match failed), + or if the check function returns false + Explanation of where/why the exception was thrown that will be added to the exception message + Function that checks validity of current state. If it returns false, an exception is thrown + The same code matcher + + + + Sets an instruction at current position + The instruction to set + The same code matcher + + + + Sets instruction at current position and advances + The instruction + The same code matcher + + + + Sets opcode and operand at current position + The opcode + The operand + The same code matcher + + + + Sets opcode and operand at current position and advances + The opcode + The operand + The same code matcher + + + + Sets opcode at current position and advances + The opcode + The same code matcher + + + + Sets operand at current position and advances + The operand + The same code matcher + + + + Creates a label at current position + [out] The label + The same code matcher + + + + Creates a label at a position + The position + [out] The new label + The same code matcher + + + + Adds an enumeration of labels to current position + The labels + The same code matcher + + + + Adds an enumeration of labels at a position + The position + The labels + The same code matcher + + + + Sets jump to + Branch instruction + Destination for the jump + [out] The created label + The same code matcher + + + + Inserts some instructions + The instructions + The same code matcher + + + + Inserts an enumeration of instructions + The instructions + The same code matcher + + + + Inserts a branch + The branch opcode + Branch destination + The same code matcher + + + + Inserts some instructions and advances the position + The instructions + The same code matcher + + + + Inserts an enumeration of instructions and advances the position + The instructions + The same code matcher + + + + Inserts a branch and advances the position + The branch opcode + Branch destination + The same code matcher + + + + Removes current instruction + The same code matcher + + + + Removes some instruction from current position by count + Number of instructions + The same code matcher + + + + Removes the instructions in a range + The start + The end + The same code matcher + + + + Removes the instructions in a offset range + The start offset + The end offset + The same code matcher + + + + Advances the current position + The offset + The same code matcher + + + + Moves the current position to the start + The same code matcher + + + + Moves the current position to the end + The same code matcher + + + + Searches forward with a predicate and advances position + The predicate + The same code matcher + + + + Searches backwards with a predicate and reverses position + The predicate + The same code matcher + + + + Matches forward and advances position + True to set position to end of match, false to set it to the beginning of the match + Some code matches + The same code matcher + + + + Matches backwards and reverses position + True to set position to end of match, false to set it to the beginning of the match + Some code matches + The same code matcher + + + + Matches forward and advances position to beginning of matching sequence + Some code matches + The same code matcher + + + + Matches forward and advances position to ending of matching sequence + Some code matches + The same code matcher + + + + Matches backwards and reverses position to beginning of matching sequence + Some code matches + The same code matcher + + + + Matches backwards and reverses position to ending of matching sequence + Some code matches + The same code matcher + + + + Repeats a match action until boundaries are met + The match action + An optional action that is executed when no match is found + The same code matcher + + + + Gets a match by its name + The match name + An instruction + + + + General extensions for common cases + + + + Joins an enumeration with a value converter and a delimiter to a string + The inner type of the enumeration + The enumeration + An optional value converter (from T to string) + An optional delimiter + The values joined into a string + + + + Converts an array of types (for example methods arguments) into a human readable form + The array of types + A human readable description including brackets + + + + A full description of a type + The type + A human readable description + + + + A a full description of a method or a constructor without assembly details but with generics + The method/constructor + A human readable description + + + + A helper converting parameter infos to types + The array of parameter infos + An array of types + + + + A helper to access a value via key from a dictionary + The key type + The value type + The dictionary + The key + The value for the key or the default value (of T) if that key does not exist + + + + A helper to access a value via key from a dictionary with extra casting + The value type + The dictionary + The key + The value for the key or the default value (of T) if that key does not exist or cannot be cast to T + + + + Escapes Unicode and ASCII non printable characters + The string to convert + The string to convert + A string literal surrounded by + + + + Extensions for + + + + Shortcut for testing whether the operand is equal to a non-null value + The + The value + True if the operand has the same type and is equal to the value + + + + Shortcut for testing whether the operand is equal to a non-null value + The + The value + True if the operand is equal to the value + This is an optimized version of for + + + + Shortcut for code.opcode == opcode && code.OperandIs(operand) + The + The + The operand value + True if the opcode is equal to the given opcode and the operand has the same type and is equal to the given operand + + + + Shortcut for code.opcode == opcode && code.OperandIs(operand) + The + The + The operand value + True if the opcode is equal to the given opcode and the operand is equal to the given operand + This is an optimized version of for + + + + Tests for any form of Ldarg* + The + The (optional) index + True if it matches one of the variations + + + + Tests for Ldarga/Ldarga_S + The + The (optional) index + True if it matches one of the variations + + + + Tests for Starg/Starg_S + The + The (optional) index + True if it matches one of the variations + + + + Tests for any form of Ldloc* + The + The optional local variable + True if it matches one of the variations + + + + Tests for any form of Stloc* + The + The optional local variable + True if it matches one of the variations + + + + Tests if the code instruction branches + The + The label if the instruction is a branch operation or if not + True if the instruction branches + + + + Tests if the code instruction calls the method/constructor + The + The method + True if the instruction calls the method or constructor + + + + Tests if the code instruction loads a constant + The + True if the instruction loads a constant + + + + Tests if the code instruction loads an integer constant + The + The integer constant + True if the instruction loads the constant + + + + Tests if the code instruction loads a floating point constant + The + The floating point constant + True if the instruction loads the constant + + + + Tests if the code instruction loads an enum constant + The + The enum + True if the instruction loads the constant + + + + Tests if the code instruction loads a field + The + The field + Set to true if the address of the field is loaded + True if the instruction loads the field + + + + Tests if the code instruction stores a field + The + The field + True if the instruction stores this field + + + + Adds labels to the code instruction and return it + The + One or several to add + The same code instruction + + + Adds labels to the code instruction and return it + The + An enumeration of + The same code instruction + + + Extracts all labels from the code instruction and returns them + The + A list of + + + Moves all labels from the code instruction to a different one + The to move the labels from + The to move the labels to + The code instruction labels were moved from (now empty) + + + Moves all labels from a different code instruction to the current one + The to move the labels from + The to move the labels to + The code instruction that received the labels + + + Adds ExceptionBlocks to the code instruction and return it + The + One or several to add + The same code instruction + + + Adds ExceptionBlocks to the code instruction and return it + The + An enumeration of + The same code instruction + + + Extracts all ExceptionBlocks from the code instruction and returns them + The + A list of + + + Moves all ExceptionBlocks from the code instruction to a different one + The to move the ExceptionBlocks from + The to move the ExceptionBlocks to + The code instruction blocks were moved from (now empty) + + + Moves all ExceptionBlocks from a different code instruction to the current one + The to move the ExceptionBlocks from + The to move the ExceptionBlocks to + The code instruction that received the blocks + + + General extensions for collections + + + + A simple way to execute code for every element in a collection + The inner type of the collection + The collection + The action to execute + + + + A simple way to execute code for elements in a collection matching a condition + The inner type of the collection + The collection + The predicate + The action to execute + + + + A helper to add an item to a collection + The inner type of the collection + The collection + The item to add + The collection containing the item + + + + A helper to add an item to an array + The inner type of the collection + The array + The item to add + The array containing the item + + + + A helper to add items to an array + The inner type of the collection + The array + The items to add + The array containing the items + + + + General extensions for collections + + + + Tests a class member if it has an IL method body (external methods for example don't have a body) + The member to test + Returns true if the member has an IL body or false if not + + + A file log for debugging + + + + Full pathname of the log file, defaults to a file called harmony.log.txt on your Desktop + + + + The indent character. The default is tab + + + + The current indent level + + + + Changes the indentation level + The value to add to the indentation level + + + + Log a string in a buffered way. Use this method only if you are sure that FlushBuffer will be called + or else logging information is incomplete in case of a crash + The string to log + + + + Logs a list of string in a buffered way. Use this method only if you are sure that FlushBuffer will be called + or else logging information is incomplete in case of a crash + A list of strings to log (they will not be re-indented) + + + + Returns the log buffer and optionally empties it + True to empty the buffer + The buffer. + + + + Replaces the buffer with new lines + The lines to store + + + + Flushes the log buffer to disk (use in combination with LogBuffered) + + + + Log a string directly to disk. Slower method that prevents missing information in case of a crash + The string to log. + + + + Log a string directly to disk if Harmony.DEBUG is true. Slower method that prevents missing information in case of a crash + The string to log. + + + + Resets and deletes the log + + + + Logs some bytes as hex values + The pointer to some memory + The length of bytes to log + + + + + Default Harmony logger that writes to a file + + + + + Whether or not to enable writing the log. + + + + + Text writer to write the logs to. If not set, defaults to a file log. + + + + + File path of the log. + + + + + Main logger class that exposes log events. + + + + + A single log event that represents a single log message. + + + + + Log channel of the message. + + + + + The log message. + + + + + Log channel for the messages. + + + + + No channels (or an empty channel). + + + + + Basic information. + + + + + Full IL dumps of the generated dynamic methods. + + + + + Channel for warnings. + + + + + Channel for errors. + + + + + Additional debug information that is related to patching + + + + + All channels. + + + + + Filter for which channels should be listened to. + If the channel is in the filter, all log messages from that channel get propagated into event. + + + + + Event fired on any incoming message that passes the channel filter. + + + + + Pretty print a full type name. + + The . + The pretty printed full type name. + + + + A helper class to retrieve reflection info for non-private methods + + + + Given a lambda expression that calls a method, returns the method info + The lambda expression using the method + The method in the lambda expression + + + + Given a lambda expression that calls a method, returns the method info + The generic type + The lambda expression using the method + The method in the lambda expression + + + + Given a lambda expression that calls a method, returns the method info + The generic type + The generic result type + The lambda expression using the method + The method in the lambda expression + + + + Given a lambda expression that calls a method, returns the method info + The lambda expression using the method + The method in the lambda expression + + + + A reflection helper to read and write private elements + The result type defined by GetValue() + + + + Creates a traverse instance from an existing instance + The existing instance + + + + Gets/Sets the current value + The value to read or write + + + + A reflection helper to read and write private elements + + + + Creates a new traverse instance from a class/type + The class/type + A instance + + + + Creates a new traverse instance from a class T + The class + A instance + + + + Creates a new traverse instance from an instance + The object + A instance + + + + Creates a new traverse instance from a named type + The type name, for format see + A instance + + + + Creates a new and empty traverse instance + + + + Creates a new traverse instance from a class/type + The class/type + + + + Creates a new traverse instance from an instance + The object + + + + Gets the current value + The value + + + + Gets the current value + The type of the value + The value + + + + Invokes the current method with arguments and returns the result + The method arguments + The value returned by the method + + + + Invokes the current method with arguments and returns the result + The type of the value + The method arguments + The value returned by the method + + + + Sets a value of the current field or property + The value + The same traverse instance + + + + Gets the type of the current field or property + The type + + + + Moves the current traverse instance to a inner type + The type name + A traverse instance + + + + Moves the current traverse instance to a field + The type name + A traverse instance + + + + Moves the current traverse instance to a field + The type of the field + The type name + A traverse instance + + + + Gets all fields of the current type + A list of field names + + + + Moves the current traverse instance to a property + The type name + Optional property index + A traverse instance + + + + Moves the current traverse instance to a field + The type of the property + The type name + Optional property index + A traverse instance + + + + Gets all properties of the current type + A list of property names + + + + Moves the current traverse instance to a method + The name of the method + The arguments defining the argument types of the method overload + A traverse instance + + + + Moves the current traverse instance to a method + The name of the method + The argument types of the method + The arguments for the method + A traverse instance + + + + Gets all methods of the current type + A list of method names + + + + Checks if the current traverse instance is for a field + True if its a field + + + + Checks if the current traverse instance is for a property + True if its a property + + + + Checks if the current traverse instance is for a method + True if its a method + + + + Checks if the current traverse instance is for a type + True if its a type + + + + Iterates over all fields of the current type and executes a traverse action + Original object + The action receiving a instance for each field + + + + Iterates over all fields of the current type and executes a traverse action + Original object + Target object + The action receiving a pair of instances for each field pair + + + + Iterates over all fields of the current type and executes a traverse action + Original object + Target object + The action receiving a dot path representing the field pair and the instances + + + + Iterates over all properties of the current type and executes a traverse action + Original object + The action receiving a instance for each property + + + + Iterates over all properties of the current type and executes a traverse action + Original object + Target object + The action receiving a pair of instances for each property pair + + + + Iterates over all properties of the current type and executes a traverse action + Original object + Target object + The action receiving a dot path representing the property pair and the instances + + + + A default field action that copies fields to fields + + + + Returns a string that represents the current traverse + A string representation + + + + + Indicates that the marked symbol is used implicitly (e.g. via reflection, in external library), + so this symbol will not be reported as unused (as well as by other usage inspections). + + + + + Can be applied to attributes, type parameters, and parameters of a type assignable from . + When applied to an attribute, the decorated attribute behaves the same as . + When applied to a type parameter or to a parameter of type , indicates that the corresponding type + is used implicitly. + + + + + Specify the details of implicitly used symbol when it is marked + with or . + + + + Only entity marked with attribute considered used. + + + Indicates implicit assignment to a member. + + + + Indicates implicit instantiation of a type with fixed constructor signature. + That means any unused constructor parameters won't be reported as such. + + + + Indicates implicit instantiation of a type. + + + + Specify what is considered to be used implicitly when marked + with or . + + + + Members of entity marked with attribute are considered used. + + + Inherited entities are considered used. + + + Entity marked with attribute and all its members considered used. + + + diff --git a/ThirdParty/BepInEx 5.4.21/BepInEx/core/0Harmony20.dll b/ThirdParty/BepInEx 5.4.21/BepInEx/core/0Harmony20.dll new file mode 100644 index 0000000000000000000000000000000000000000..67779b38c011ada44dd72f22e833a49c3774d45e GIT binary patch literal 111616 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 literal 0 HcmV?d00001 diff --git a/ThirdParty/BepInEx 5.4.21/BepInEx/core/BepInEx.Harmony.xml b/ThirdParty/BepInEx 5.4.21/BepInEx/core/BepInEx.Harmony.xml new file mode 100644 index 00000000..86b7dc6e --- /dev/null +++ b/ThirdParty/BepInEx 5.4.21/BepInEx/core/BepInEx.Harmony.xml @@ -0,0 +1,86 @@ + + + + BepInEx.Harmony + + + +

+ Specifies the indices of parameters that are ByRef. + + + + + The indices of parameters that are ByRef. + + + + The indices of parameters that are ByRef. + + + + An extension class for Harmony based operations. + + + + + Applies all patches specified in the type. + + The HarmonyInstance to use. + The type to scan. + + + + A wrapper for Harmony based operations. + + + + + Applies all patches specified in the type. + + The type to scan. + The HarmonyInstance to use. + + + + Applies all patches specified in the type. + + The type to scan. + The ID for the Harmony instance to create, which will be used. + + + + Applies all patches specified in the assembly. + + The assembly to scan. + The HarmonyInstance to use. + + + + Applies all patches specified in the assembly. + + The assembly to scan. + The ID for the Harmony instance to create, which will be used. + + + + Applies all patches specified in the calling assembly. + + The Harmony instance to use. + + + + Applies all patches specified in the calling assembly. + + The ID for the Harmony instance to create, which will be used. + + + + Returns an instruction to call the specified delegate. + + The delegate type to emit. + The delegate to emit. + The instruction to + + + diff --git a/ThirdParty/BepInEx 5.4.21/BepInEx/core/BepInEx.Preloader.dll b/ThirdParty/BepInEx 5.4.21/BepInEx/core/BepInEx.Preloader.dll new file mode 100644 index 0000000000000000000000000000000000000000..acdcdd05ab6aa3d183b9d53d98b8cd89aff4bf47 GIT binary patch literal 42496 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 cy0%XK+xO24{H` + + + BepInEx.Preloader + + + + + Doorstop environment variables, passed into the BepInEx preloader. + https://github.com/NeighTools/UnityDoorstop/wiki#environment-variables + + + + + Path to the assembly that was invoked via Doorstop. Contains the same value as in "targetAssembly" configuration option in the config file. + + + + + Full path to the game's "Managed" folder that contains all the game's managed assemblies + + + + + Full path to the game executable currently running. + + + + + Array of paths where Mono searches DLLs from before assembly resolvers are invoked. + + + + + Delegate used in patching assemblies. + + The assembly that is being patched. + + + + Worker class which is used for loading and patching entire folders of assemblies, or alternatively patching and + loading assemblies one at a time. + + + + + List of all patcher plugins to be applied + + + + + Adds a single assembly patcher to the pool of applicable patches. + + Patcher to apply. + + + + Adds all patchers from all managed assemblies specified in a directory. + + Directory to search patcher DLLs from. + + + + Releases all patchers to let them be collected by GC. + + + + + Applies patchers to all assemblies in the given directory and loads patched assemblies into memory. + + Directories to load CLR assemblies from in their search order. + + + + Loads an individual assembly definition into the CLR. + + The assembly to load. + File name of the assembly being loaded. + + + + A single assembly patcher. + + + + + Target assemblies to patch. + + + + + Initializer method that is run before any patching occurs. + + + + + Finalizer method that is run after all patching is done. + + + + + The main patcher method that is called on every DLL defined in . + + + + + Type name of the patcher. + + + + + + + + + + + The main entrypoint of BepInEx, called from Doorstop. + + + + + Recreation of MonoMod's PlatformHelper.DeterminePlatform method, but with libc calls instead of creating processes. + + + + + This exists because the Mono implementation of is/was broken, and would call Write directly instead of calling TraceEvent. + + + + + The main entrypoint of BepInEx, and initializes all patchers and the chainloader. + + + + + The log writer that is specific to the preloader. + + + + + Inserts BepInEx's own chainloader entrypoint into UnityEngine. + + The assembly that will be attempted to be patched. + + + + Allocates a console window for use by BepInEx safely. + + + + + Log listener that listens to logs during preloading time and buffers messages for output in Unity logs later. + + + + + + + + + + + + + + + diff --git a/ThirdParty/BepInEx 5.4.21/BepInEx/core/BepInEx.dll b/ThirdParty/BepInEx 5.4.21/BepInEx/core/BepInEx.dll new file mode 100644 index 0000000000000000000000000000000000000000..2fb6c0d0a62c39a78315d246186661fedb66cd01 GIT binary patch literal 125440 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�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 literal 0 HcmV?d00001 diff --git a/ThirdParty/BepInEx 5.4.21/BepInEx/core/BepInEx.xml b/ThirdParty/BepInEx 5.4.21/BepInEx/core/BepInEx.xml new file mode 100644 index 00000000..03a03f4b --- /dev/null +++ b/ThirdParty/BepInEx 5.4.21/BepInEx/core/BepInEx.xml @@ -0,0 +1,1729 @@ + + + + BepInEx + + + + + Abstraction layer over Unity's input systems for use in universal plugins that need to use hotkeys. + It can use either Input or Unity.InputSystem, depending on what's available. Input is preferred. + WARNING: Use only inside of Unity's main thread! + + + + + Best currently supported input system. + + + + + True if the Input class is not disabled. + + + + + Generic input system interface. Just barely good enough for hotkeys. + + + + + + + + + + + + + + + + + + + + All KeyCodes supported by the current input system. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Base type of all classes representing and enforcing acceptable values of config settings. + + + + Type of values that this class can Clamp. + + + + Change the value to be acceptable, if it's not already. + + + + + Check if the value is an acceptable value. + + + + + Type of the supported values. + + + + + Get the string for use in config files. + + + + + Specify the list of acceptable values for a setting. + + + + + List of values that a setting can take. + + + + + Specify the list of acceptable values for a setting. + If the setting does not equal any of the values, it will be set to the first one. + + + + + + + + + + + + + + Specify the range of acceptable values for a setting. + + + + Lowest acceptable value + Highest acceptable value + + + + Lowest acceptable value + + + + + Highest acceptable value + + + + + + + + + + + + + + Provides access to a single setting inside of a . + + Type of the setting. + + + + Fired when the setting is changed. Does not detect changes made outside from this object. + + + + + Value of this setting. + + + + + + + + Container for a single setting of a . + Each config entry is linked to one config file. + + + + + Types of defaultValue and definition.AcceptableValues have to be the same as settingType. + + + + + Config file this entry is a part of. + + + + + Category and name of this setting. Used as a unique key for identification within a . + + + + + Description / metadata of this setting. + + + + + Type of the that this setting holds. + + + + + Default value of this setting (set only if the setting was not changed before). + + + + + Get or set the value of the setting. + + + + + Get the serialized representation of the value. + + + + + Set the value by using its serialized form. + + + + + If necessary, clamp the value to acceptable value range. T has to be equal to settingType. + + + + + Trigger setting changed event. + + + + + Write a description of this setting using all available metadata. + + + + + Section and key of a setting. Used as a unique key for identification within a . + The same definition can be used in multiple config files, it will point to different settings then. + + + + + + Group of the setting. All settings within a config file are grouped by this. + + + + + Name of the setting. + + + + + Create a new definition. Definitions with same section and key are equal. + + Group of the setting, case sensitive. + Name of the setting, case sensitive. + + + + + + + Check if the definitions are the same. + + + + + + Check if the definitions are the same. + + + + + + + + Check if the definitions are the same. + + + + + Check if the definitions are the same. + + + + + + + + Metadata of a . + + + + + Create a new description. + + Text describing the function of the setting and any notes or warnings. + Range of values that this setting can take. The setting's value will be automatically clamped. + Objects that can be used by user-made classes to add functionality. + + + + Text describing the function of the setting and any notes or warnings. + + + + + Range of acceptable values for a setting. + + + + + Objects that can be used by user-made classes to add functionality. + + + + + An empty description. + + + + + A helper class to handle persistent data. All public methods are thread-safe. + + + + + All config entries inside + + + + + Create a list with all config entries inside of this config file. + + + + + Create an array with all config entries inside of this config file. Should be only used for metadata purposes. + If you want to access and modify an existing setting then use + instead with no description. + + + + + Full path to the config file. The file might not exist until a setting is added and changed, or is called. + + + + + If enabled, writes the config to disk every time a value is set. + If disabled, you have to manually use or the changes will be lost! + + + + + + + + Create a new config file at the specified config path. + + Full path to a file that contains settings. The file will be created as needed. + If the config file/directory doesn't exist, create it immediately. + Information about the plugin that owns this setting file. + + + + Reloads the config from disk. Unsaved changes are lost. + + + + + Writes the config to disk. + + + + + Access one of the existing settings. If the setting has not been added yet, null is returned. + If the setting exists but has a different type than T, an exception is thrown. + New settings should be added with . + + Type of the value contained in this setting. + Section and Key of the setting. + + + + Access one of the existing settings. If the setting has not been added yet, null is returned. + If the setting exists but has a different type than T, an exception is thrown. + New settings should be added with . + + Type of the value contained in this setting. + Section/category/group of the setting. Settings are grouped by this. + Name of the setting. + + + + Access one of the existing settings. If the setting has not been added yet, false is returned. Otherwise, true. + If the setting exists but has a different type than T, an exception is thrown. + New settings should be added with . + + Type of the value contained in this setting. + Section and Key of the setting. + The ConfigEntry value to return. + + + + Access one of the existing settings. If the setting has not been added yet, null is returned. + If the setting exists but has a different type than T, an exception is thrown. + New settings should be added with . + + Type of the value contained in this setting. + Section/category/group of the setting. Settings are grouped by this. + Name of the setting. + The ConfigEntry value to return. + + + + Create a new setting. The setting is saved to drive and loaded automatically. + Each definition can be used to add only one setting, trying to add a second setting will throw an exception. + + Type of the value contained in this setting. + Section and Key of the setting. + Value of the setting if the setting was not created yet. + Description of the setting shown to the user and other metadata. + + + + Create a new setting. The setting is saved to drive and loaded automatically. + Each section and key pair can be used to add only one setting, trying to add a second setting will throw an exception. + + Type of the value contained in this setting. + Section/category/group of the setting. Settings are grouped by this. + Name of the setting. + Value of the setting if the setting was not created yet. + Description of the setting shown to the user and other metadata. + + + + Create a new setting. The setting is saved to drive and loaded automatically. + Each section and key pair can be used to add only one setting, trying to add a second setting will throw an exception. + + Type of the value contained in this setting. + Section/category/group of the setting. Settings are grouped by this. + Name of the setting. + Value of the setting if the setting was not created yet. + Simple description of the setting shown to the user. + + + + Create a new setting. The setting is saved to drive and loaded automatically. + Each definition can be used to add only one setting, trying to add a second setting will throw an exception. + + Type of the value contained in this setting. + Section and Key of the setting. + Value of the setting if the setting was not created yet. + Description of the setting shown to the user and other metadata. + + + + Create a new setting. The setting is saved to drive and loaded automatically. + Each section and key pair can be used to add only one setting, trying to add a second setting will throw an exception. + + Type of the value contained in this setting. + Section/category/group of the setting. Settings are grouped by this. + Name of the setting. + Value of the setting if the setting was not created yet. + Description of the setting shown to the user and other metadata. + + + + Create a new setting. The setting is saved to drive and loaded automatically. + Each section and key pair can be used to add only one setting, trying to add a second setting will throw an exception. + + Type of the value contained in this setting. + Section/category/group of the setting. Settings are grouped by this. + Name of the setting. + Value of the setting if the setting was not created yet. + Simple description of the setting shown to the user. + + + + Access a setting. Use Bind instead. + + + + + Access a setting. Use Bind instead. + + + + + An event that is fired every time the config is reloaded. + + + + + Fired when one of the settings is changed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Returns the ConfigDefinitions that the ConfigFile contains. + Creates a new array when the property is accessed. Thread-safe. + + + + + Returns the ConfigEntryBase values that the ConfigFile contains. + Creates a new array when the property is accessed. Thread-safe. + + + + + Provides access to a single setting inside of a . + + Type of the setting. + + + + Entry of this setting in the . + + + + + Unique definition of this setting. + + + + + Config file this setting is inside of. + + + + + Fired when the setting is changed. Does not detect changes made outside from this object. + + + + + Value of this setting. + + + + + A keyboard shortcut that can be used in Update method to check if user presses a key combo. The shortcut is only + triggered when the user presses the exact combination. For example, F + LeftCtrl will trigger only if user + presses and holds only LeftCtrl, and then presses F. If any other keys are pressed, the shortcut will not trigger. + + Can be used as a value of a setting in + to allow user to change this shortcut and have the changes saved. + + How to use: Use in this class instead of in the Update loop. + + + + + Shortcut that never triggers. + + + + + All KeyCode values that can be used in a keyboard shortcut. + + + + + Create a new keyboard shortcut. + + Main key to press + Keys that should be held down before main key is registered + + + + Main key of the key combination. It has to be pressed / let go last for the combination to be triggered. + If the combination is empty, is returned. + + + + + Modifiers of the key combination, if any. + + + + + Attempt to deserialize key combination from the string. + + + + + Serialize the key combination into a user readable string. + + + + + Check if the main key was just pressed (Input.GetKeyDown), and specified modifier keys are all pressed + + + + + Check if the main key is currently held down (Input.GetKey), and specified modifier keys are all pressed + + + + + Check if the main key was just lifted (Input.GetKeyUp), and specified modifier keys are all pressed. + + + + + + + + + + + + + + Arguments for events concerning a change of a setting. + + + + + + + + + Setting that was changed + + + + + Serializer/deserializer used by the config system. + + + + + Convert object of a given type to a string using available converters. + + + + + Convert string to an object of a given type using available converters. + + + + + Convert string to an object of a given type using available converters. + + + + + Get a converter for a given type if there is any. + + + + + Add a new type converter for a given type. + If a different converter is already added, this call is ignored and false is returned. + + + + + Check if a given type can be converted to and from string. + + + + + Give a list of types with registered converters. + + + + + For types that are in assemblies that can't get loaded before preloader runs (or it won't work on these assemblies) + + + + + A serializer/deserializer combo for some type(s). Used by the config system. + + + + + Used to serialize the type into a (hopefully) human-readable string. + Object is the instance to serialize, Type is the object's type. + + + + + Used to deserialize the type from a string. + String is the data to deserialize, Type is the object's type, should return instance to an object of Type. + + + + + True if an external console has been started, false otherwise. + + + + + The stream that writes to the standard out stream of the process. Should never be null. + + + + + The stream that writes to an external console. Null if no such console exists + + + + + Data class that represents information about a loadable BepInEx plugin. + Contains all metadata and additional info required for plugin loading by . + + + + + General metadata about a plugin. + + + + + Collection of attributes that describe what processes the plugin can run on. + + + + + Collection of attributes that describe what plugins this plugin depends on. + + + + + Collection of attributes that describe what plugins this plugin + is incompatible with. + + + + + File path to the plugin DLL + + + + + Instance of the plugin that represents this info. NULL if no plugin is instantiated from info (yet) + + + + + + + + This attribute denotes that a class is a plugin, and specifies the required metadata. + + + + + The unique identifier of the plugin. Should not change between plugin versions. + + + + + The user friendly name of the plugin. Is able to be changed between versions. + + + + + The specfic version of the plugin. + + + + The unique identifier of the plugin. Should not change between plugin versions. + The user friendly name of the plugin. Is able to be changed between versions. + The specfic version of the plugin. + + + + This attribute specifies any dependencies that this plugin has on other plugins. + + + + + Flags that are applied to a dependency + + + + + The plugin has a hard dependency on the referenced plugin, and will not run without it. + + + + + This plugin has a soft dependency on the referenced plugin, and is able to run without it. + + + + + The GUID of the referenced plugin. + + + + + The flags associated with this dependency definition. + + + + + The minimum version of the referenced plugin. + + + + + Marks this as depenant on another plugin. The other plugin will be loaded before this one. + If the other plugin doesn't exist, what happens depends on the parameter. + + The GUID of the referenced plugin. + The flags associated with this dependency definition. + + + + Marks this as depenant on another plugin. The other plugin will be loaded before this one. + If the other plugin doesn't exist or is of a version below , this plugin will not load and an error will be logged instead. + + The GUID of the referenced plugin. + The minimum version of the referenced plugin. + When version is supplied the dependency is always treated as HardDependency + + + + This attribute specifies other plugins that are incompatible with this plugin. + + + + + The GUID of the referenced plugin. + + + + + Marks this as incompatible with another plugin. + If the other plugin exists, this plugin will not be loaded and a warning will be shown. + + The GUID of the referenced plugin. + + + + This attribute specifies which processes this plugin should be run for. Not specifying this attribute will load the plugin under every process. + + + + + The name of the process that this plugin will run under. + + + + The name of the process that this plugin will run under. + + + + Helper class to use for retrieving metadata about a plugin, defined as attributes. + + + + + Retrieves the BepInPlugin metadata from a plugin type. + + The plugin type. + The BepInPlugin metadata of the plugin type. + + + + Retrieves the BepInPlugin metadata from a plugin instance. + + The plugin instance. + The BepInPlugin metadata of the plugin instance. + + + + Gets the specified attributes of a type, if they exist. + + The attribute type to retrieve. + The plugin type. + The attributes of the type, if existing. + + + + Gets the specified attributes of an instance, if they exist. + + The attribute type to retrieve. + The plugin instance. + The attributes of the instance, if existing. + + + + Retrieves the dependencies of the specified plugin type. + + The plugin type. + A list of all plugin types that the specified plugin type depends upon. + + + + This class is appended to AssemblyInfo.cs when BepInEx is built via a CI pipeline. + It is mainly intended to signify that the current build is not a release build and is special, like for instance a bleeding edge build. + + + + + The manager and loader for all plugins, and the entry point for BepInEx plugin system. + + + + + The loaded and initialized list of plugins. + + + + + List of all loaded via the chainloader. + + + + + Collection of error chainloader messages that occured during plugin loading. + Contains information about what certain plugins were not loaded. + + + + + The GameObject that all plugins are attached to as components. + + + + + Initializes BepInEx to be able to start the chainloader. + + + + + Analyzes the given type definition and attempts to convert it to a valid + + Type definition to analyze. + If the type represent a valid plugin, returns a instance. Otherwise, return null. + + + + The entrypoint for the BepInEx plugin system. + + + + + A cacheable metadata item. Can be used with and to cache plugin metadata. + + + + + Serialize the object into a binary format. + + + + + + Loads the object from binary format. + + + + + + A cached assembly. + + + + + + List of cached items inside the assembly. + + + + + Timestamp of the assembly. Used to check the age of the cache. + + + + + Provides methods for loading specified types from an assembly. + + + + + Default assembly resolved used by the + + + + + Default reader parameters used by + + + + + Event fired when fails to resolve a type during type loading. + + + + + Looks up assemblies in the given directory and locates all types that can be loaded and collects their metadata. + + The specific base type to search for. + The directory to search for assemblies. + A function to check if a type should be selected and to build the type metadata. + A filter function to quickly determine if the assembly can be loaded. + The name of the cache to get cached types from. + A dictionary of all assemblies in the directory and the list of type metadatas of types that match the selector. + + + + Loads an index of type metadatas from a cache. + + Name of the cache + Cacheable item + Cached type metadatas indexed by the path of the assembly that defines the type. If no cache is defined, return null. + + + + Saves indexed type metadata into a cache. + + Name of the cache + List of plugin metadatas indexed by the path to the assembly that contains the types + Cacheable item + + + + Converts TypeLoadException to a readable string. + + TypeLoadException + Readable representation of the exception + + + + The base plugin type that is used by the BepInEx plugin loader. + + + + + Information about this plugin as it was loaded. + + + + + Logger instance tied to this plugin. + + + + + Default config file tied to this plugin. The config file will not be created until + any settings are added and changed, or is called. + + + + + Create a new instance of a plugin and all of its tied in objects. + + BepInPlugin attribute is missing. + + + + Logs entries using Unity specific outputs. + + + + + Log levels to display. + + + + + Writer for the disk log. + + + + + Timer for flushing the logs to a file. + + + + + Whether to write Unity log messages to disk log. + + + + + Creates a new disk log listener. + + Path to the log. + Log levels to display. + Whether to append logs to an already existing log file. + Whether to include Unity log into the disk log. + + + + + + + + + + Disposes of Disk logger + + + + + Log event arguments. Contains info about the log message. + + + + + Logged data. + + + + + Log levels for the data. + + + + + Log source that emitted the log event. + + + + + Creates the log event args- + + Logged data. + Log level of the data. + Log source that emits these args. + + + + + + + Like but appends newline at the end. + + Same output as but with new line. + + + + A static Logger instance. + + + + + Collection of all log listeners that receive log events. + + + + + Collection of all log source that output log events. + + + + + Logs an entry to the current logger instance. + + The level of the entry. + The textual value of the entry. + + + + Creates a new log source with a name and attaches it to log sources. + + Name of the log source to create. + An instance of that allows to write logs. + + + + The level, or severity of a log entry. + + + + + No level selected. + + + + + A fatal error has occurred, which cannot be recovered from. + + + + + An error has occured, but can be recovered from. + + + + + A warning has been produced, but does not necessarily mean that something wrong has happened. + + + + + An important message that should be displayed to the user. + + + + + A message of low importance. + + + + + A message that would likely only interest a developer. + + + + + All log levels. + + + + + Helper methods for log level handling. + + + + + Gets the highest log level when there could potentially be multiple levels provided. + + The log level(s). + The highest log level supplied. + + + + Returns a translation of a log level to it's associated console colour. + + The log level(s). + A console color associated with the highest log level supplied. + + + + A generic log listener that receives log events and can route them to some output (e.g. file, console, socket). + + + + + Handle an incoming log event. + + Log source that sent the event. Don't use; instead use + Information about the log message. + + + + Log source that can output log messages. + + + + + Name of the log source. + + + + + Event that sends the log message. Call to send a log message. + + + + + A generic, multi-purpose log source. Exposes simple API to manually emit logs. + + + + + + + + + + + Creates a manual log source. + + Name of the log source. + + + + Logs a message with the specified log level. + + Log levels to attach to the message. Multiple can be used with bitwise ORing. + Data to log. + + + + Logs a message with level. + + Data to log. + + + + Logs a message with level. + + Data to log. + + + + Logs a message with level. + + Data to log. + + + + Logs a message with level. + + Data to log. + + + + Logs a message with level. + + Data to log. + + + + Logs a message with level. + + Data to log. + + + + + + + A source that routes all logs from API to BepInEx logger. + + + + + + Whether Trace logs are rerouted. + + + + + Creates a new trace log source. + + New log source (or already existing one). + + + + Internal log source. + + + + + Creates a new trace log source. + + + + + Writes a message to the underlying instance. + + The message to write. + + + + Writes a message and a newline to the underlying instance. + + The message to write. + + + + + + + + + + Logs entries using Unity specific outputs. + + + + + + + + + + + Logs entries using Unity specific outputs. + + + + + + + + + + + Logs entries using Unity specific outputs. + + + + + + + + + + + Creates a new Unity log source. + + + + + + + + Paths used by BepInEx + + + + + List of directories from where Mono will search assemblies before assembly resolving is invoked. + + + + + The directory that the core BepInEx DLLs reside in. + + + + + The path to the core BepInEx DLL. + + + + + The path to the main BepInEx folder. + + + + + The path of the currently executing program BepInEx is encapsulated in. + + + + + The directory that the currently executing process resides in. + On OSX however, this is the parent directory of the game.app folder. + + + + + The path to the Managed folder of the currently running Unity game. + + + + + The path to the config directory. + + + + + The path to the global BepInEx configuration file. + + + + + The path to temporary cache files. + + + + + The path to the patcher plugin folder which resides in the BepInEx folder. + + + + + The path to the plugin folder which resides in the BepInEx folder. + + This is ONLY guaranteed to be set correctly when Chainloader has been initialized. + + + + + + The name of the currently executing process. + + + + + Provides methods for running code on other threads and synchronizing with the main thread. + + + + + Current instance of the helper. + + + + + Gives methods for invoking delegates on the main unity thread, both synchronously and asynchronously. + Can be used in many built-in framework types, for example + and to make their events fire on the main unity thread. + + + + + Queue the delegate to be invoked on the main unity thread. Use to synchronize your threads. + + + + + Queue the delegate to be invoked on a background thread. Use this to run slow tasks without affecting the game. + NOTE: Most of Unity API can not be accessed while running on another thread! + + + Task to be executed on another thread. Can optionally return an Action that will be executed on the main thread. + You can use this action to return results of your work safely. Return null if this is not needed. + + + + + False if current code is executing on the main unity thread, otherwise True. + Warning: Will return true before the first frame finishes (i.e. inside plugin Awake and Start methods). + + + + + + Convenience extensions for utilizing multiple threads and using the . + + + + + + + + Apply a function to a collection of data by spreading the work on multiple threads. + Outputs of the functions are returned to the current thread and yielded one by one. + + Type of the input values. + Type of the output values. + Input values for the work function. + Function to apply to the data on multiple threads at once. + Number of worker threads. By default SystemInfo.processorCount is used. + An exception was thrown inside one of the threads, and the operation was aborted. + Need at least 1 workerCount. + + + + Generic helper properties and methods. + + + + + Whether current Common Language Runtime supports dynamic method generation using namespace. + + + + + An encoding for UTF-8 which does not emit a byte order mark (BOM). + + + + + Try to perform an action. + + Action to perform. + Possible exception that gets returned. + True, if action succeeded, false if an exception occured. + + + + Combines multiple paths together, as the specific method is not available in .NET 3.5. + + The multiple paths to combine together. + A combined path. + + + + Returns the parent directory of a path, optionally specifying the amount of levels. + + The path to get the parent directory of. + The amount of levels to traverse. Defaults to 1 + The parent directory. + + + + Tries to parse a bool, with a default value if unable to parse. + + The string to parse + The value to return if parsing is unsuccessful. + Boolean value of input if able to be parsed, otherwise default value. + + + + Converts a file path into a UnityEngine.WWW format. + + The file path to convert. + A converted file path. + + + + Indicates whether a specified string is null, empty, or consists only of white-space characters. + + The string to test. + True if the value parameter is null or empty, or if value consists exclusively of white-space characters. + + + + Sorts a given dependency graph using a direct toposort, reporting possible cyclic dependencies. + + Nodes to sort + Function that maps a node to a collection of its dependencies. + Type of the node in a dependency graph. + Collection of nodes sorted in the order of least dependencies to the most. + Thrown when a cyclic dependency occurs. + + + + Checks whether a given cecil type definition is a subtype of a provided type. + + Cecil type definition + Type to check against + Whether the given cecil type is a subtype of the type. + + + + Try to resolve and load the given assembly DLL. + + Name of the assembly, of the type . + Directory to search the assembly from. + The loaded assembly. + True, if the assembly was found and loaded. Otherwise, false. + + + + Try to resolve and load the given assembly DLL. + + Name of the assembly, of the type . + Directory to search the assembly from. + Reader parameters that contain possible custom assembly resolver. + The loaded assembly. + True, if the assembly was found and loaded. Otherwise, false. + + + + Tries to create a file with the given name + + Path of the file to create + File open mode + Resulting filestream + File access options + File share options + + + + + Try to parse given string as an assembly name + + Fully qualified assembly name + Resulting instance + true, if parsing was successful, otherwise false + + On some versions of mono, using fails because it runs on unmanaged side + which has problems with encoding. + Using solves this by doing parsing on managed side instead. + + + + + Gets unique files in all given directories. If the file with the same name exists in multiple directories, + only the first occurrence is returned. + + Directories to search from. + File pattern to search. + Collection of all files in the directories. + + + + Console class with safe handlers for Unity 4.x, which does not have a proper Console implementation + + + + diff --git a/ThirdParty/BepInEx 5.4.21/BepInEx/core/HarmonyXInterop.dll b/ThirdParty/BepInEx 5.4.21/BepInEx/core/HarmonyXInterop.dll new file mode 100644 index 0000000000000000000000000000000000000000..ca690b1937a00a6f3ed5666cf2a223ba054ef156 GIT binary patch literal 23552 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 literal 0 HcmV?d00001 diff --git a/ThirdParty/BepInEx 5.4.21/BepInEx/core/Mono.Cecil.Mdb.dll b/ThirdParty/BepInEx 5.4.21/BepInEx/core/Mono.Cecil.Mdb.dll new file mode 100644 index 0000000000000000000000000000000000000000..bddf5cbdb5e0fa67f1a50ffce4173d540c2fe346 GIT binary patch literal 43008 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 z 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 CYk-#k literal 0 HcmV?d00001 diff --git a/ThirdParty/BepInEx 5.4.21/BepInEx/core/Mono.Cecil.Pdb.dll b/ThirdParty/BepInEx 5.4.21/BepInEx/core/Mono.Cecil.Pdb.dll new file mode 100644 index 0000000000000000000000000000000000000000..9227f6db0bf46d7494d3c675c5d2b6e007d9995e GIT binary patch literal 86528 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 Z-~Ml(rMTgK*XIB2bNYWW`2Rr-{7<+s*ku3! literal 0 HcmV?d00001 diff --git a/ThirdParty/BepInEx 5.4.21/BepInEx/core/Mono.Cecil.Rocks.dll b/ThirdParty/BepInEx 5.4.21/BepInEx/core/Mono.Cecil.Rocks.dll new file mode 100644 index 0000000000000000000000000000000000000000..a77ac871e5e6cd346c7c2d9a24bdda7d046a1a04 GIT binary patch literal 27648 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 + + + MonoMod.RuntimeDetour + + + +

+ A fully managed detour. + Multiple Detours for a method to detour from can exist at any given time. Detours can be layered. + If you're writing your own detour manager or need to detour native functions, it's better to create instances of NativeDetour instead. + + + + + Mark the detour as applied in the detour chain. This can be done automatically when creating an instance. + + + + + Undo the detour without freeing it, allowing you to reapply it later. + + + + + Free the detour, while also permanently undoing it. This makes any further operations on this detour invalid. + + + + + Undo and free this temporary detour. + + + + + Generate a new DynamicMethod with which you can invoke the previous state. + + + + + Generate a new DynamicMethod with which you can invoke the previous state. + + + + + Generate a new DynamicMethod with which you can invoke the previous state. + + + + + A "raw" native detour, acting as a wrapper around NativeDetourData with a few helpers. + Only one NativeDetour for a method to detour from can exist at any given time. NativeDetours cannot be layered. + If you don't need the trampoline generator or any of the management helpers, use DetourManager.Native directly. + Unless you're writing your own detour manager or need to detour native functions, it's better to create instances of Detour instead. + + + + + Apply the native detour. This can be done automatically when creating an instance. + + + + + Undo the native detour without freeing the detour native data, allowing you to reapply it later. + + + + + Changes the source of this native detour to a new source address. This does not repair the old source location. + This also assumes that is simply a new address for the same method as this was constructed with. + + The new source location. + + + + Changed the target of this native detour to a new target. + + The new target address. + + + + Free the detour's data without undoing it. This makes any further operations on this detour invalid. + + + + + Undo and free this temporary detour. + + + + + Generate a new DynamicMethod with which you can invoke the previous state. + If the NativeDetour holds a reference to a managed method, a copy of the original method is returned. + If the NativeDetour holds a reference to a native function, an "undo-call-redo" trampoline with a matching signature is returned. + + + + + Generate a new delegate with which you can invoke the previous state. + If the NativeDetour holds a reference to a managed method, a copy of the original method is returned. + If the NativeDetour holds a reference to a native function, an "undo-call-redo" trampoline with a matching signature is returned. + + + + + Write the given value at the address to + offs, afterwards advancing offs by sizeof(byte). + + + + + Write the given value at the address to + offs, afterwards advancing offs by sizeof(ushort). + + + + + Write the given value at the address to + offs, afterwards advancing offs by sizeof(ushort). + + + + + Write the given value at the address to + offs, afterwards advancing offs by sizeof(ulong). + + + + + Generate a DynamicMethod to easily call the given native function from another DynamicMethod. + + The pointer to the native function to call. + A MethodBase with the target function's signature. + The detoured DynamicMethod. + + + + Fill the DynamicMethodDefinition with a throw. + + + + + Emit a call to DetourManager.Native.Copy using the given parameters. + + + + + Emit a call to DetourManager.Native.Apply using a copy of the given data. + + + + + The data forming a "raw" native detour, created and consumed by DetourManager.Native. + + + + + The method to detour from. Set when the structure is created by the IDetourNativePlatform. + + + + + The target method to be called instead. Set when the structure is created by the IDetourNativePlatform. + + + + + The type of the detour. Determined when the structure is created by the IDetourNativePlatform. + + + + + The size of the detour. Calculated when the structure is created by the IDetourNativePlatform. + + + + + DetourManager.Native-specific data. + + + + diff --git a/ThirdParty/BepInEx 5.4.21/BepInEx/core/MonoMod.Utils.dll b/ThirdParty/BepInEx 5.4.21/BepInEx/core/MonoMod.Utils.dll new file mode 100644 index 0000000000000000000000000000000000000000..1d9fb357158ab6f5b76be0d85795fd3e93a954bf GIT binary patch literal 187904 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 + + + MonoMod.Utils + + + + + An IL manipulation "context" with various helpers and direct access to the MethodBody. + + + + + The manipulator callback, accepted by the Invoke method. + + + + + + The manipulated method. + + + + + The manipulated method's IL processor. + + + + + The manipulated method body. + + + + + The manipulated method's module. + + + + + The manipulated method instructions. + + + + + A readonly list of all defined labels. + + + + + Has the context been made read-only? No further method access is possible, but the context has not yet been disposed. + + + + + Events which run when the context will be disposed. + + + + + The current reference bag. Used for methods such as EmitReference and EmitDelegate. + + + + + Invoke a given manipulator callback. + + The manipulator to run in this context. + + + + Mark this ILContext as read-only and prevent this context from further accessing the originally passed method. + + + If the method is altered prior to calling MakeReadOnly or afterwards by accessing the method directly, the results are undefined. + + + + + See + + + + + See + + + + + See + + + + + Define a new label to be marked with a cursor. + + A label without a target instruction. + + + + Define a new label pointing at a given instruction. + + The instruction the label will point at. + A label pointing at the given instruction. + + + + Determine the index of a given instruction. + + The instruction to get the index of. + The instruction index, or the end of the method body if it hasn't been found. + + + + Obtain all labels pointing at the given instruction. + + The instruction to get all labels for. + All labels targeting the given instruction. + + + + Bind an arbitary object to an ILContext for static retrieval. + + The type of the object. The combination of typeparam and id provides the unique static reference. + The object to store. + The id to use in combination with the typeparam for object retrieval. + + + + Dispose this context, making it read-only and invoking all OnDispose event listeners. + + + + + Obtain a string representation of this context (method ID and body). + + A string representation of this context. + + + + Specifies where a ILCursor should be positioned in relation to the target of a search function + + + + + Move the cursor before the first instruction in the match + + + + + Equivalent to Before with `cursor.MoveAfterLabels()` causing emitted instructions to become the target of incoming labels + + + + + Move the cursor after the last instruction in the match + + + + + Indicates whether the position of a ILCursor is the result of a search function and + if the next search should ignore the instruction preceeding or following this cursor. + + SearchTarget.Next is the result of searching with MoveType.Before, and SearchTarget.Prev from MoveType.After + + + + + A foward searching function cannot match the Next instruction and must move the cursor forward + + + + + A reverse searching function cannot match the Next instruction and must move the cursor backward + + + + + A cursor used to manipulate a method body in an ILContext. + + + + + The context to which this cursor belongs to. + + + + + The instruction immediately following the cursor position or null if the cursor is at the end of the instruction list. + + + + + The instruction immediately preceding the cursor position or null if the cursor is at the start of the instruction list. + + + + + The instruction immediately preceding the cursor position or null if the cursor is at the start of the instruction list. + + + + + The index of the instruction immediately following the cursor position. Range: 0 to Instrs.Count + Setter accepts negative indexing by adding Instrs.Count to the operand + + + + + Indicates whether the position of a MMILCursor is the result of a search function and + if the next search should ignore the instruction preceeding or following this cursor. + + See + + + + + Enumerates all labels which point to the current instruction (label.Target == Next) + + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + Create a clone of this cursor. + + The cloned cursor. + + + + Is this cursor before the given instruction? + + The instruction to check. + True if this cursor is before the given instruction, false otherwise. + + + + Is this cursor after the given instruction? + + The instruction to check. + True if this cursor is after the given instruction, false otherwise. + + + + Obtain a string representation of this cursor (method ID, index, search target, surrounding instructions). + + A string representation of this cursor. + + + + Move the cursor to a target instruction. All other movements go through this. + + The target instruction + Where to move in relation to the target instruction and incoming labels (branches) + Whether to set the `SearchTarget` and skip the target instruction with the next search function + this + + + + Move the cursor after incoming labels (branches). If an instruction is emitted, all labels which currently point to Next, will point to the newly emitted instruction. + + this + + + + Move the cursor before incoming labels (branches). This is the default behaviour. Emitted instructions will not cause labels to change targets. + + this + + + + Move the cursor to a target index. Supports negative indexing. See + + this + + + + Overload for Goto(label.Target). defaults to MoveType.AfterLabel + + this + + + + Search forward and moves the cursor to the next sequence of instructions matching the corresponding predicates. See also + + this + If no match is found + + + + Search forward and moves the cursor to the next sequence of instructions matching the corresponding predicates. + + True if a match was found + + + + Search backward and moves the cursor to the next sequence of instructions matching the corresponding predicates. See also + + this + If no match is found + + + + Search backward and moves the cursor to the next sequence of instructions matching the corresponding predicates. + + True if a match was found + + + + Find the next occurences of a series of instructions matching the given set of predicates with gaps permitted. + + An array of cursors corresponding to each found instruction (MoveType.Before) + If no match is found + + + + Find the next occurences of a series of instructions matching the given set of predicates with gaps permitted. + + An array of cursors corresponding to each found instruction (MoveType.Before) + True if a match was found + + + + Search backwards for occurences of a series of instructions matching the given set of predicates with gaps permitted. + + An array of cursors corresponding to each found instruction (MoveType.Before) + If no match is found + + + + Search backwards for occurences of a series of instructions matching the given set of predicates with gaps permitted. + + An array of cursors corresponding to each found instruction (MoveType.Before) + True if a match was found + + + + Set the target of a label to the current position (label.Target = Next) and moves after it. + + The label to mark + + + + Create a new label targetting the current position (label.Target = Next) and moves after it. + + The newly created label + + + + Create a new label for use with + + A new label with no target + + + + Remove the Next instruction + + + + + Remove several instructions + + + + + Move the cursor and all labels the cursor is positioned after to a target instruction + + + + + Emit a new instruction at this cursor's current position. + + The instruction opcode. + The instruction operand. + this + + + + Emit a new instruction at this cursor's current position. + + The instruction opcode. + The instruction operand. + this + + + + Emit a new instruction at this cursor's current position. + + The instruction opcode. + The instruction operand. + this + + + + Emit a new instruction at this cursor's current position. + + The instruction opcode. + The instruction operand. + this + + + + Emit a new instruction at this cursor's current position. + + The instruction opcode. + The instruction operand. + this + + + + Emit a new instruction at this cursor's current position. + + The instruction opcode. + The instruction operand. + this + + + + Emit a new instruction at this cursor's current position. + + The instruction opcode. + The instruction operand. + this + + + + Emit a new instruction at this cursor's current position. + + The instruction opcode. + The instruction operand. + this + + + + Emit a new instruction at this cursor's current position. + + The instruction opcode. + The instruction operand. + this + + + + Emit a new instruction at this cursor's current position. + + The instruction opcode. + The instruction operand. + this + + + + Emit a new instruction at this cursor's current position. + + The instruction opcode. + The instruction operand. + this + + + + Emit a new instruction at this cursor's current position. + + The instruction opcode. + The instruction operand. + this + + + + Emit a new instruction at this cursor's current position. + + The instruction opcode. + The instruction operand. + this + + + + Emit a new instruction at this cursor's current position. + + The instruction opcode. + this + + + + Emit a new instruction at this cursor's current position. + + The instruction opcode. + The instruction operand. + this + + + + Emit a new instruction at this cursor's current position. + + The instruction opcode. + The instruction operand. + this + + + + Emit a new instruction at this cursor's current position. + + The instruction opcode. + The instruction operand. + this + + + + Emit a new instruction at this cursor's current position. + + The instruction opcode. + The instruction operand. + this + + + + Emit a new instruction at this cursor's current position. + + The instruction opcode. + The instruction operand. + this + + + + Emit a new instruction at this cursor's current position. + + The instruction opcode. + The instruction operand. + this + + + + Emit a new instruction at this cursor's current position, accessing a given member. + + The type in which the member is defined. + The instruction opcode. + The accessed member name. + this + + + + Bind an arbitary object to an ILContext for static retrieval. See + + + + + Emit the IL to retrieve a stored reference of type with the given and place it on the stack. + + + + + Store an object in the reference store, and emit the IL to retrieve it and place it on the stack. + + + + + Emit the IL to invoke a delegate as if it were a method. Stack behaviour matches OpCodes.Call + + + + + A label to be used in ILContexts. + + + + + The target instruction this label points at. + + + + + All instructions using this label. + + + + + An IL inline reference bag used for ILContexts. + + + + + Get the object for the given ID. + + The object type. + The object ID. + The stored object. + + + + Get a MethodInfo for the getter. + + The object type. + The getter method. + + + + Store a new object. + + The object type. + The object to be stored. + An ID to be used for all further operations. + + + + Remove the object with the given ID from the bag, essentially clearing the ID's slot. + + The object type. + The object ID. + + + + Get a MethodInfo invoking a delegate of the given type, with the delegate at the top of the stack. Used by . + + The delegate type. + A MethodInfo invoking a delegate of the given type. + + + + The default IL reference bag. Throws NotSupportedException for every operation. + + + + + An IL reference bag implementation to be used for runtime-generated methods. + + + + + Collection of extensions used by MonoMod and other projects. + + + + + Create a hexadecimal string for the given bytes. + + The input bytes. + The output hexadecimal string. + + + + Invokes all delegates in the invocation list, passing on the result to the next. + + Type of the result. + The multicast delegate. + The initial value and first parameter. + Any other arguments that may be passed. + The result of all delegates. + + + + Invokes all delegates in the invocation list, as long as the previously invoked delegate returns true. + + + + + Invokes all delegates in the invocation list, as long as the previously invoked delegate returns false. + + + + + Invokes all delegates in the invocation list, as long as the previously invoked delegate returns null. + + + + + Split PascalCase words to become Pascal Case instead. + + PascalCaseString + Pascal Case String + + + + Read the string from the BinaryReader BinaryWriter in a C-friendly format. + + The input which the method reads from. + The output string. + + + + Write the string to the BinaryWriter in a C-friendly format. + + The output which the method writes to. + The input string. + + + + Cast a delegate from one type to another. Compatible with delegates holding an invocation list (combined delegates). + + The input delegate. + The output delegate. + + + + Cast a delegate from one type to another. Compatible with delegates holding an invocation list (combined delegates). + + The input delegate. + The wanted output delegate type. + The output delegate. + + + + Print the exception to the console, including extended loading / reflection data useful for mods. + + + + + Get the method of interest for a given state machine method. + + The method creating the state machine. + The "main" method in the state machine. + + + + Gets the actual generic method definition of a method, as defined on the fully open type. + + The potentially instantiated method to find the definition of. + The original method definition, with no generic arguments filled in. + + + + Safely resolve a reference, silently discarding any exceptions. + + The reference to resolve. + The resolved definition or null. + + + + Safely resolve a reference, silently discarding any exceptions. + + The reference to resolve. + The resolved definition or null. + + + + Safely resolve a reference, silently discarding any exceptions. + + The reference to resolve. + The resolved definition or null. + + + + Safely resolve a reference, silently discarding any exceptions. + + The reference to resolve. + The resolved definition or null. + + + + Get a certain custom attribute from an attribute provider. + + The attribute provider. + The custom attribute name. + The first matching custom attribute, or null if no matching attribute has been found. + + + + Determine if an attribute provider has got a specific custom attribute. + + The attribute provider. + The custom attribute name. + true if the attribute provider contains the given custom attribute, false otherwise. + + + + Get the integer value pushed onto the stack with this instruction. + + The instruction to get the pushed integer value for. + The pushed integer value. + + + + Get the integer value pushed onto the stack with this instruction. + + The instruction to get the pushed integer value for. + The pushed integer value or null. + + + + Determine if the method call is a base method call. + + The caller method body. + The called method. + True if the called method is a base method of the caller method, false otherwise. + + + + Determine if the given method can be preferably called using callvirt. + + The called method. + True if the called method can be called using callvirt, false otherwise. + + + + Determine if the given type is a struct (also known as "value type") or struct-alike (f.e. primitive). + + The type to check. + True if the type is a struct, primitive or similar, false otherwise. + + + + Get the long form opcode for any short form opcode. + + The short form opcode. + The long form opcode. + + + + Get the short form opcode for any long form opcode. + + The long form opcode. + The short form opcode. + + + + Calculate updated instruction offsets. Required for certain manual fixes. + + The method to recalculate the IL instruction offsets for. + + + + Fix (and optimize) any instructions which should use the long / short form opcodes instead. + + The method to apply the fixes to. + + + + Check if the signatures of a given System.Reflection and Mono.Cecil member reference match. + + The System.Reflection member reference. + The Mono.Cecil member reference. + True if both references share the same signature, false otherwise. + + + + Check if the signatures of a given System.Reflection and Mono.Cecil member reference match. + + The Mono.Cecil member reference. + The System.Reflection member reference. + True if both references share the same signature, false otherwise. + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + Determine if two types are compatible with each other (f.e. object with string, or enums with their underlying integer type). + + The first type. + The second type. + True if both types are compatible with each other, false otherwise. + + + + Creates a delegate of the specified type from this method. + + The method to create the delegate from. + The type of the delegate to create. + The delegate for this method. + + + + Creates a delegate of the specified type with the specified target from this method. + + The method to create the delegate from. + The type of the delegate to create. + The object targeted by the delegate. + The delegate for this method. + + + + Creates a delegate of the specified type from this method. + + The method to create the delegate from. + The type of the delegate to create. + The delegate for this method. + + + + Creates a delegate of the specified type with the specified target from this method. + + The method to create the delegate from. + The type of the delegate to create. + The object targeted by the delegate. + The delegate for this method. + + + + Find a method for a given ID. + + The type to search in. + The method ID. + Whether to perform a simple search pass as well or not. + The first matching method or null. + + + + Find a method for a given ID recursively (including the passed type's base types). + + The type to search in. + The method ID. + Whether to perform a simple search pass as well or not. + The first matching method or null. + + + + Find a method for a given ID. + + The type to search in. + The method ID. + Whether to perform a simple search pass as well or not. + The first matching method or null. + + + + Find a method for a given ID recursively (including the passed type's base types). + + The type to search in. + The method ID. + Whether to perform a simple search pass as well or not. + The first matching method or null. + + + + Find a property for a given name. + + The type to search in. + The property name. + The first matching property or null. + + + + Find a property for a given name recursively (including the passed type's base types). + + The type to search in. + The property name. + The first matching property or null. + + + + Find a field for a given name. + + The type to search in. + The field name. + The first matching field or null. + + + + Find a field for a given name recursively (including the passed type's base types). + + The type to search in. + The field name. + The first matching field or null. + + + + Find an event for a given name. + + The type to search in. + The event name. + The first matching event or null. + + + + Find an event for a given name recursively (including the passed type's base types). + + The type to search in. + The event name. + The first matching event or null. + + + + Get a reference ID that is similar to the full name, but consistent between System.Reflection and Mono.Cecil. + + The method to get the ID for. + The name to use instead of the reference's own name. + The ID to use instead of the reference's declaring type ID. + Whether the type ID should be included or not. System.Reflection avoids it by default. + Whether the ID should be "simple" (name only). + The ID. + + + + Get a reference ID that is similar to the full name, but consistent between System.Reflection and Mono.Cecil. + + The call site to get the ID for. + The ID. + + + + Get a reference ID that is similar to the full name, but consistent between System.Reflection and Mono.Cecil. + + The method to get the ID for. + The name to use instead of the reference's own name. + The ID to use instead of the reference's declaring type ID. + Whether the type ID should be included or not. System.Reflection avoids it by default. + Whether the method is regarded as a proxy method or not. Setting this paramater to true will skip the first parameter. + Whether the ID should be "simple" (name only). + The ID. + + + + Get the "patch name" - the name of the target to patch - for the given member. + + The member to get the patch name for. + The patch name. + + + + Get the "patch name" - the name of the target to patch - for the given member. + + The member to get the patch name for. + The patch name. + + + + Clone the given method definition. + + The original method. + The method definition to apply the cloning process onto, or null to create a new method. + A clone of the original method. + + + + Clone the given method body. + + The original method body. + The method which will own the newly cloned method body. + A clone of the original method body. + + + + Force-update a generic parameter's position and type. + + The generic parameter to update. + The new position. + The new type. + The updated generic parameter. + + + + Resolve a given generic parameter in another context. + + The new context. + The original generic parameter. + A generic parameter provided by the given context which matches the original generic parameter. + + + + Relink the given member reference (metadata token provider). + + The reference to relink. + The relinker to use during the relinking process. + The generic context provided to relink generic references. + A relinked reference. + + + + Relink the given type reference. + + The reference to relink. + The relinker to use during the relinking process. + The generic context provided to relink generic references. + A relinked reference. + + + + Relink the given method reference. + + The reference to relink. + The relinker to use during the relinking process. + The generic context provided to relink generic references. + A relinked reference. + + + + Relink the given callsite. + + The reference to relink. + The relinker to use during the relinking process. + The generic context provided to relink generic references. + A relinked reference. + + + + Relink the given field reference. + + The reference to relink. + The relinker to use during the relinking process. + The generic context provided to relink generic references. + A relinked reference. + + + + Relink the given parameter definition. + + The reference to relink. + The relinker to use during the relinking process. + The generic context provided to relink generic references. + A relinked reference. + + + + Clone the given parameter definition. + + The original parameter definition. + A clone of the original parameter definition. + + + + Relink the given custom attribute. + + The reference to relink. + The relinker to use during the relinking process. + The generic context provided to relink generic references. + A relinked reference. + + + + Clone the given custom attribute. + + The original custom attribute. + A clone of the original custom attribute. + + + + Relink the given generic parameter reference. + + The reference to relink. + The relinker to use during the relinking process. + The generic context provided to relink generic references. + A relinked reference. + + + + Clone the given generic parameter. + + The original generic parameter. + A clone of the original generic parameter. + + + + Get the managed size of a given type. This matches an IL-level sizeof(t), even if it cannot be determined normally in C#. + Note that sizeof(t) != Marshal.SizeOf(t), f.e. when t is char. + + The type to get the size from. + The managed type size. + + + + Get a type which matches what the method should receive via ldarg.0 + + The method to obtain the "this" parameter type from. + The "this" parameter type. + + + + Get a native function pointer for a given method. This matches an IL-level ldftn. + + + The result of ldftn doesn't always match that of MethodHandle.GetFunctionPointer(). + For example, ldftn doesn't JIT-compile the method on mono, which thus keeps the class constructor untouched. + And on .NET, struct overrides (f.e. ToString) have got multiple entry points pointing towards the same code. + + The method to get a native function pointer for. + The native function pointer. + + + + A variant of ILGenerator which uses Mono.Cecil under the hood. + + + + + The underlying Mono.Cecil.Cil.ILProcessor. + + + + + Abstract version of System.Reflection.Emit.ILGenerator. See for proper documentation. + + + + + Get a "real" ILGenerator for this ILGeneratorShim. + + A "real" ILGenerator. + + + + Get the proxy type for a given ILGeneratorShim type. The proxy type implements ILGenerator. + + The ILGeneratorShim type. + The "real" ILGenerator type. + + + + Get the proxy type for a given ILGeneratorShim type. The proxy type implements ILGenerator. + + The ILGeneratorShim type. + The "real" ILGenerator type. + + + + Get the non-generic proxy type implementing ILGenerator. + + The "real" ILGenerator type, non-generic. + + + + A DynamicMethodDefinition "generator", responsible for generating a runtime MethodInfo from a DMD MethodDefinition. + + + + + + A DMDGenerator implementation using Mono.Cecil to build an in-memory assembly. + + + + + Fill the DynamicMethod with a stub. + + + + + Fill the DynamicMethod with a stub. + + + + + Emit a reference to an arbitrary object. Note that the references "leak." + + + + + Emit a reference to an arbitrary object. Note that the references "leak." + + + + + Emit a reference to an arbitrary object. Note that the references "leak." + + + + + Emit a reference to an arbitrary object. Note that the references "leak." + + + + + Allows you to remap library paths / names and specify loading flags. Useful for cross-platform compatibility. Applies only to DynDll. + + + + + Open a given library and get its handle. + + The library name. + Whether to skip using the mapping or not. + Any optional platform-specific flags. + The library handle. + + + + Try to open a given library and get its handle. + + The library name. + The library handle, or null if it failed loading. + Whether to skip using the mapping or not. + Any optional platform-specific flags. + True if the handle was obtained, false otherwise. + + + + Release a library handle obtained via OpenLibrary. Don't release the result of OpenLibrary(null)! + + The library handle. + + + + Get a function pointer for a function in the given library. + + The library handle. + The function name. + The function pointer. + + + + Get a function pointer for a function in the given library. + + The library handle. + The function name. + The function pointer, or null if it wasn't found. + True if the function pointer was obtained, false otherwise. + + + + Extension method wrapping Marshal.GetDelegateForFunctionPointer + + + + + Fill all static delegate fields with the DynDllImport attribute. + Call this early on in the static constructor. + + The type containing the DynDllImport delegate fields. + Any optional mappings similar to the static mappings. + + + + Fill all instance delegate fields with the DynDllImport attribute. + Call this early on in the constructor. + + An instance of a type containing the DynDllImport delegate fields. + Any optional mappings similar to the static mappings. + + + + Similar to DllImport, but requires you to run typeof(DeclaringType).ResolveDynDllImports(); + + + + + The library or library alias to use. + + + + + A list of possible entrypoints that the function can be resolved to. Implicitly includes the field name and delegate name. + + + + The library or library alias to use. + A list of possible entrypoints that the function can be resolved to. Implicitly includes the field name and delegate name. + + + + A mapping entry, to be used by . + + + + + The name as which the library will be resolved as. Useful to remap libraries or to provide full paths. + + + + + Platform-dependent loading flags. + + + + The name as which the library will be resolved as. Useful to remap libraries or to provide full paths. + Platform-dependent loading flags. + + + + The relinker callback delegate type. + + The reference (metadata token provider) to relink. + The generic context provided to relink generic references. + A relinked reference. + + + + Generic platform enum. + + + + + Bit applied to all OSes (Unknown, Windows, MacOS, ...). + + + + + On demand 64-bit platform bit. + + + + + Applied to all NT and NT-oid platforms (Windows). + + + + + Applied to all Unix and Unix-oid platforms (macOS, Linux, ...). + + + + + On demand ARM platform bit. + + + + + On demand Wine bit. DON'T RELY ON THIS. + + + + + Unknown OS. + + + + + Windows, using the NT kernel. + + + + + macOS, using the Darwin kernel. + + + + + Linux. + + + + + Android, using the Linux kernel. + + + + + iOS, sharing components with macOS. + + + + diff --git a/ThirdParty/BepInEx 5.4.21/LICENSE b/ThirdParty/BepInEx 5.4.21/LICENSE new file mode 100644 index 00000000..6e409d03 --- /dev/null +++ b/ThirdParty/BepInEx 5.4.21/LICENSE @@ -0,0 +1,233 @@ +Skip to content +Search or jump to… +Pull requests +Issues +Codespaces +Marketplace +Explore + +@cheese3660 +BepInEx +/ +BepInEx.ConfigurationManager +Public +Fork your own copy of BepInEx/BepInEx.ConfigurationManager +Code +Issues +7 +Pull requests +1 +Actions +Projects +Security +Insights +Beta Try the new code view +BepInEx.ConfigurationManager/LICENSE +BepInEx/BepInEx.ConfigurationManager is licensed under the + +GNU Lesser General Public License v3.0 +Permissions of this copyleft license are conditioned on making available complete source code of licensed works and modifications under the same license or the GNU GPLv3. Copyright and license notices must be preserved. Contributors provide an express grant of patent rights. However, a larger work using the licensed work through interfaces provided by the licensed work may be distributed under different terms and without source code for the larger work. + +Permissions + Commercial use + Modification + Distribution + Patent use + Private use +Limitations + Liability + Warranty +Conditions + License and copyright notice + Disclose source + State changes + Same license (library) +This is not legal advice. Learn more about repository licenses. +@ghorsington +ghorsington Changle GPL to LGPL +Latest commit 209602a on Jul 28, 2020 + History + 2 contributors +@ghorsington@ManlyMarco +165 lines (128 sloc) 7.47 KB + + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. +Footer +© 2023 GitHub, Inc. +Footer navigation +Terms +Privacy +Security +Status +Docs +Contact GitHub +Pricing +API +Training +Blog +About +BepInEx.ConfigurationManager/LICENSE at master · BepInEx/BepInEx.ConfigurationManager \ No newline at end of file diff --git a/ThirdParty/BepInEx 5.4.21/README b/ThirdParty/BepInEx 5.4.21/README new file mode 100644 index 00000000..c5059afb --- /dev/null +++ b/ThirdParty/BepInEx 5.4.21/README @@ -0,0 +1,2 @@ +This contains binaries for BepInEx, which is under the LGPL V3 license, copy of which is provided here. +The source for these binaries can be found at https://github.com/BepInEx/BepInEx \ No newline at end of file diff --git a/ThirdParty/BepInEx 5.4.21/changelog.txt b/ThirdParty/BepInEx 5.4.21/changelog.txt new file mode 100644 index 00000000..36308c6d --- /dev/null +++ b/ThirdParty/BepInEx 5.4.21/changelog.txt @@ -0,0 +1,7 @@ +4 commits since v5.4.20 + +Changelog (excluding merges): +* (0d06996) [ghorsington] UnityInput: revert to null input in case of total failure +* (ea709e2) [ghorsington] Bump version +* (806d6d2) [ghorsington] UnityInput: remove hard dependency on Unity.InputManager (fixes #446) +* (a79d657) [ghorsington] UnityInput: Reformat, fix LegacyInputSystemAvailable not being static \ No newline at end of file diff --git a/ThirdParty/BepInEx 5.4.21/doorstop_config.ini b/ThirdParty/BepInEx 5.4.21/doorstop_config.ini new file mode 100644 index 00000000..a68f30f1 --- /dev/null +++ b/ThirdParty/BepInEx 5.4.21/doorstop_config.ini @@ -0,0 +1,16 @@ +[UnityDoorstop] +# Specifies whether assembly executing is enabled +enabled=true +# Specifies the path (absolute, or relative to the game's exe) to the DLL/EXE that should be executed by Doorstop +targetAssembly=BepInEx\core\BepInEx.Preloader.dll +# Specifies whether Unity's output log should be redirected to \output_log.txt +redirectOutputLog=false +# If enabled, DOORSTOP_DISABLE env var value is ignored +# USE THIS ONLY WHEN ASKED TO OR YOU KNOW WHAT THIS MEANS +ignoreDisableSwitch=false +# Overrides default Mono DLL search path +# Sometimes it is needed to instruct Mono to seek its assemblies from a different path +# (e.g. mscorlib is stripped in original game) +# This option causes Mono to seek mscorlib and core libraries from a different folder before Managed +# Original Managed folder is added as a secondary folder in the search path +dllSearchPathOverride= \ No newline at end of file diff --git a/ThirdParty/BepInEx 5.4.21/winhttp.dll b/ThirdParty/BepInEx 5.4.21/winhttp.dll new file mode 100644 index 0000000000000000000000000000000000000000..bdf9c790dbf3cd0c1c2af726f33db01c1adf64c5 GIT binary patch literal 25088 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 Xrx=Yx@wrpo?RS*0RHTI-2 literal 0 HcmV?d00001 diff --git a/ThirdParty/ConfigurationManager/ConfigurationManager.dll b/ThirdParty/ConfigurationManager/ConfigurationManager.dll new file mode 100644 index 0000000000000000000000000000000000000000..ef1e70730f29776ff7d287382d6fb5ef36059e21 GIT binary patch literal 56832 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 T7|eU=|5<4LFE;;gDDZy($~oGr literal 0 HcmV?d00001 diff --git a/ThirdParty/ConfigurationManager/ConfigurationManager.xml b/ThirdParty/ConfigurationManager/ConfigurationManager.xml new file mode 100644 index 00000000..fb742bb1 --- /dev/null +++ b/ThirdParty/ConfigurationManager/ConfigurationManager.xml @@ -0,0 +1,197 @@ + + + + ConfigurationManager + + + + + Get entries for all core BepInEx settings + + + + + Get entries for all settings of a plugin + + + + + An easy way to let user configure how a plugin behaves without the need to make your own GUI. The user can change any of the settings you expose, even keyboard shortcuts. + https://github.com/ManlyMarco/BepInEx.ConfigurationManager + + + + + GUID of this plugin + + + + + Version constant + + + + + Event fired every time the manager window is shown or hidden. + + + + + Disable the hotkey check used by config manager. If enabled you have to set to show the manager. + + + + + + + + Is the config manager main window displayed on screen + + + + + Register a custom setting drawer for a given type. The action is ran in OnGui in a single setting slot. + Do not use any Begin / End layout methods, and avoid raising height from standard. + + + + + Rebuild the setting list. Use to update the config manager window if config settings were removed or added while it was open. + + + + + String currently entered into the search box + + + + + Class representing all data about a setting collected by ConfigurationManager. + + + + + List of values this setting can take + + + + + Range of the values this setting can take + + + + + Should the setting be shown as a percentage (only applies to value range settings) + + + + + Custom setting draw action + + + + + Show this setting in the settings screen at all? If false, don't show. + + + + + Category the setting is under. Null to be directly under the plugin. + + + + + If set, a "Default" button will be shown next to the setting to allow resetting to default. + + + + + Force the "Reset" button to not be displayed, even if a valid DefaultValue is available. + + + + + Force the setting name to not be displayed. Should only be used with a to get more space. + Can be used together with to gain even more space. + + + + + Optional description shown when hovering over the setting + + + + + Name of the setting + + + + + Plugin this setting belongs to + + + + + Only allow showing of the value. False whenever possible by default. + + + + + Type of the variable + + + + + Instance of the plugin that owns this setting + + + + + Is this setting advanced + + + + + Order of the setting on the settings list relative to other settings in a category. 0 by default, lower is higher on the list. + + + + + Get the value of this setting + + + + + Set the value of this setting + + + + + Implementation of + + + + + Custom converter from setting type to string for the textbox + + + + + Custom converter from string to setting type for the textbox + + + + + Arguments representing a change in value + + + + + + + + Newly assigned value + + + + diff --git a/ThirdParty/ConfigurationManager/LICENSE b/ThirdParty/ConfigurationManager/LICENSE new file mode 100644 index 00000000..6e409d03 --- /dev/null +++ b/ThirdParty/ConfigurationManager/LICENSE @@ -0,0 +1,233 @@ +Skip to content +Search or jump to… +Pull requests +Issues +Codespaces +Marketplace +Explore + +@cheese3660 +BepInEx +/ +BepInEx.ConfigurationManager +Public +Fork your own copy of BepInEx/BepInEx.ConfigurationManager +Code +Issues +7 +Pull requests +1 +Actions +Projects +Security +Insights +Beta Try the new code view +BepInEx.ConfigurationManager/LICENSE +BepInEx/BepInEx.ConfigurationManager is licensed under the + +GNU Lesser General Public License v3.0 +Permissions of this copyleft license are conditioned on making available complete source code of licensed works and modifications under the same license or the GNU GPLv3. Copyright and license notices must be preserved. Contributors provide an express grant of patent rights. However, a larger work using the licensed work through interfaces provided by the licensed work may be distributed under different terms and without source code for the larger work. + +Permissions + Commercial use + Modification + Distribution + Patent use + Private use +Limitations + Liability + Warranty +Conditions + License and copyright notice + Disclose source + State changes + Same license (library) +This is not legal advice. Learn more about repository licenses. +@ghorsington +ghorsington Changle GPL to LGPL +Latest commit 209602a on Jul 28, 2020 + History + 2 contributors +@ghorsington@ManlyMarco +165 lines (128 sloc) 7.47 KB + + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. +Footer +© 2023 GitHub, Inc. +Footer navigation +Terms +Privacy +Security +Status +Docs +Contact GitHub +Pricing +API +Training +Blog +About +BepInEx.ConfigurationManager/LICENSE at master · BepInEx/BepInEx.ConfigurationManager \ No newline at end of file diff --git a/ThirdParty/ConfigurationManager/README b/ThirdParty/ConfigurationManager/README new file mode 100644 index 00000000..019b6aef --- /dev/null +++ b/ThirdParty/ConfigurationManager/README @@ -0,0 +1,2 @@ +This contains binaries for BepInEx.ConfigurationManager, which is under the LGPL V3 license, copy of which is provided here. +The source for these binaries can be found at https://github.com/BepInEx/BepInEx.ConfigurationManager \ No newline at end of file diff --git a/builder.py b/builder.py index 1e317518..6804f853 100644 --- a/builder.py +++ b/builder.py @@ -8,6 +8,7 @@ TEMPLATE_DIR = os.path.abspath("SpaceWarpBuildTemplate") SPACEWARP_DIR = os.path.abspath("SpaceWarp") BUILD_DIR = os.path.abspath("build") +THIRD_PARTY = os.path.abspath("ThirdParty") parser = argparse.ArgumentParser() @@ -29,7 +30,13 @@ def build(release = False): output_dir = os.path.join(BUILD_DIR, "SpaceWarp", "BepInEx", "plugins", "SpaceWarp") # copy over the internals of the template print("=> Creating build directory...") - os.makedirs(os.path.join(BUILD_DIR, "SpaceWarp", "BepInEx", "plugins")) + os.makedirs(os.path.join(BUILD_DIR,"SpaceWarp"),True) + print("=> Copying BepInEx") + os.makedirs(os.path.join(BUILD_DIR, "SpaceWarp", "BepInEx", "plugins"),True) + shutil.copytree(os.path.join(THIRD_PARTY,"BepInEx 5.4.21"),os.path.join(BUILD_DIR,"SpaceWarp"),dirs_exist_ok=True) + print("=> Copying BepInEx.ConfigurationManager") + os.makedirs(os.path.join(BUILD_DIR, "SpaceWarp", "BepInEx", "plugins", "ConfigurationManager"),True) + shutil.copytree(os.path.join(THIRD_PARTY,"ConfigurationManager"), os.path.join(BUILD_DIR, "SpaceWarp", "BepInEx", "plugins", "ConfigurationManager"),dirs_exist_ok=True) print("=> Copying output template") shutil.copytree(TEMPLATE_DIR,output_dir) From 86e9dca8696dbcb2423aaed5141ebd892c0cb034 Mon Sep 17 00:00:00 2001 From: Lexi Date: Fri, 3 Mar 2023 16:21:06 -0500 Subject: [PATCH 16/29] fix 9 slicing --- .../assets/bundles/swconsoleui.bundle | Bin 3174999 -> 3175007 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/SpaceWarpBuildTemplate/assets/bundles/swconsoleui.bundle b/SpaceWarpBuildTemplate/assets/bundles/swconsoleui.bundle index 951a47f5ac37e2a42735a45d4ef50d572ca121a3..a4417c36711af8757b536a600ed82521f3829014 100644 GIT binary patch literal 3175007 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

0wt%6s)z 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

- public virtual void OnPreInitialized() - { - } + public virtual void OnPreInitialized() { } /// /// 2nd stage initialization /// This is called after the game is loaded, and after your mods assets are loaded. /// - public virtual void OnInitialized() - { - } + public virtual void OnInitialized() { } /// /// 3rd stage initialization /// This is called after all mods have done first stage initialization /// - public virtual void OnPostInitialized() - { - } + public virtual void OnPostInitialized() { } + } diff --git a/SpaceWarp/API/UI/Appbar/Appbar.cs b/SpaceWarp/API/UI/Appbar/Appbar.cs index edf7ecb2..1b09a0e5 100644 --- a/SpaceWarp/API/UI/Appbar/Appbar.cs +++ b/SpaceWarp/API/UI/Appbar/Appbar.cs @@ -42,9 +42,11 @@ public static T RegisterGameAppbarMenu(string text, string title, string id, /// A Texture2D for the icon in the appbar /// The type of the appbar menu, must extend AppbarMenu /// An instance of T which has been added to a GameObject - public static T RegisterGameAppbarMenu(string text, string title, string id, Texture2D icon) where T : AppbarMenu => - RegisterGameAppbarMenu(text, title, id, GetAppBarIconFromTexture(icon)); - + public static T RegisterGameAppbarMenu(string text, string title, string id, Texture2D icon) where T : AppbarMenu + { + return RegisterGameAppbarMenu(text, title, id, GetAppBarIconFromTexture(icon)); + } + /// /// Register a button on the games AppBar /// @@ -52,8 +54,11 @@ public static T RegisterGameAppbarMenu(string text, string title, string id, /// A unique id for the appbar menu eg: "BTN-Example" /// A Sprite for the icon in the appbar /// The function to be called when this button is clicked - public static void RegisterAppButton(string text, string id, Sprite icon, Action func) => ButtonsToBeLoaded.Add((text ,icon, id, func)); - + public static void RegisterAppButton(string text, string id, Sprite icon, Action func) + { + ButtonsToBeLoaded.Add((text, icon, id, func)); + } + /// /// Register a button on the games AppBar /// @@ -61,10 +66,12 @@ public static T RegisterGameAppbarMenu(string text, string title, string id, /// A unique id for the appbar menu eg: "BTN-Example" /// A Texture2D for the icon in the appbar /// The function to be called when this button is clicked - public static void RegisterAppButton(string text, string id, Texture2D icon, Action func) => + public static void RegisterAppButton(string text, string id, Texture2D icon, Action func) + { RegisterAppButton(text, id, GetAppBarIconFromTexture(icon), func); - - + } + + /// /// Convert a Texture2D to a Sprite /// @@ -72,7 +79,7 @@ public static void RegisterAppButton(string text, string id, Texture2D icon, Act /// The width of the sprite, 0 for inferring /// The height of the sprite, 0 for inferring /// The Texture2D converted to a Sprite - public static Sprite GetAppBarIconFromTexture(Texture2D texture, int width=0,int height=0) + public static Sprite GetAppBarIconFromTexture(Texture2D texture, int width=0, int height=0) { if (width == 0) width = texture.width; if (height == 0) height = texture.height; diff --git a/SpaceWarp/API/UI/Appbar/AppbarMenu.cs b/SpaceWarp/API/UI/Appbar/AppbarMenu.cs index 222d039d..aee7780e 100644 --- a/SpaceWarp/API/UI/Appbar/AppbarMenu.cs +++ b/SpaceWarp/API/UI/Appbar/AppbarMenu.cs @@ -1,15 +1,14 @@ using KSP.Game; using KSP.Sim.impl; using KSP.UI.Binding; -using SpaceWarp.API.Assets; using UnityEngine; namespace SpaceWarp.API.UI.Appbar; public abstract class AppbarMenu : KerbalBehavior { - private GUISkin _spaceWarpConsoleSkin = null; - private bool _drawing = false; + private GUISkin _spaceWarpConsoleSkin; + private bool _drawing; internal string ID; private GUIStyle _closeButtonStyle; diff --git a/SpaceWarp/API/Versions/VersionUtility.cs b/SpaceWarp/API/Versions/VersionUtility.cs index 9202b91b..93e91aa4 100644 --- a/SpaceWarp/API/Versions/VersionUtility.cs +++ b/SpaceWarp/API/Versions/VersionUtility.cs @@ -17,21 +17,8 @@ public static bool IsVersionAbove(string version, string toCheck) string[] semanticVersion = toCheck.Split('.'); string[] requiredVersion = version.Split('.'); - - for (int i = 0; i < requiredVersion.Length; i++) - { - if (requiredVersion[i] == "*") - { - continue; - } - - if (int.Parse(semanticVersion[i]) < int.Parse(requiredVersion[i])) - { - return false; - } - } - return true; + return !requiredVersion.Where((t, i) => t != "*" && int.Parse(semanticVersion[i]) < int.Parse(t)).Any(); } /// @@ -49,20 +36,7 @@ public static bool IsVersionBelow(string version, string toCheck) string[] semanticVersion = toCheck.Split('.'); string[] requiredVersion = version.Split('.'); - - for (int i = 0; i < requiredVersion.Length; i++) - { - if (requiredVersion[i] == "*") - { - continue; - } - - if (int.Parse(semanticVersion[i]) > int.Parse(requiredVersion[i])) - { - return false; - } - } - return true; + return !requiredVersion.Where((t, i) => t != "*" && int.Parse(semanticVersion[i]) > int.Parse(t)).Any(); } } \ No newline at end of file diff --git a/SpaceWarp/AssetHelpers.cs b/SpaceWarp/AssetHelpers.cs index 353ea801..779ba479 100644 --- a/SpaceWarp/AssetHelpers.cs +++ b/SpaceWarp/AssetHelpers.cs @@ -11,7 +11,7 @@ internal static class AssetHelpers public static void LoadAddressable(string catalog) { SpaceWarpManager.Logger.LogInfo($"Attempting to load {catalog}"); - AsyncOperationHandle operation = Addressables.LoadContentCatalogAsync(catalog, null); + AsyncOperationHandle operation = Addressables.LoadContentCatalogAsync(catalog); operation.WaitForCompletion(); if (operation.Status == AsyncOperationStatus.Failed) { diff --git a/SpaceWarp/Backend/UI/Appbar/AppbarBackend.cs b/SpaceWarp/Backend/UI/Appbar/AppbarBackend.cs index cdb12d46..8ab07545 100644 --- a/SpaceWarp/Backend/UI/Appbar/AppbarBackend.cs +++ b/SpaceWarp/Backend/UI/Appbar/AppbarBackend.cs @@ -21,14 +21,16 @@ namespace SpaceWarp.Backend.UI.Appbar; internal static class AppbarBackend { + private static readonly ManualLogSource _logger = BepInEx.Logging.Logger.CreateLogSource("ToolbarBackend"); + public static GameObject AddButton(string buttonText, Sprite buttonIcon, string buttonId, Action function) { // Find the resource manager button and "others" group. // Say the magic words... GameObject list = GameObject.Find("GameManager/Default Game Instance(Clone)/UI Manager(Clone)/Popup Canvas/Container/ButtonBar/BTN-App-Tray/appbar-others-group"); - GameObject resourceManger = list?.GetChild("BTN-Resource-Manager"); + GameObject resourceManger = list != null ? list.GetChild("BTN-Resource-Manager") : null; if (list == null || resourceManger == null) { @@ -46,7 +48,9 @@ public static GameObject AddButton(string buttonText, Sprite buttonIcon, string Localize localizer = text.gameObject.GetComponent(); if (localizer) + { Object.Destroy(localizer); + } // Change the icon. GameObject icon = appButton.GetChild("Content").GetChild("GRP-icon"); @@ -70,7 +74,7 @@ public static GameObject AddButton(string buttonText, Sprite buttonIcon, string return appButton; } - public static UnityEvent AppBarInFlightSubscriber = new UnityEvent(); + public static readonly UnityEvent AppBarInFlightSubscriber = new(); internal static void SubscriberSchedulePing() { @@ -80,7 +84,7 @@ internal static void SubscriberSchedulePing() } } -class ToolbarBackendObject : KerbalBehavior +internal class ToolbarBackendObject : KerbalBehavior { public new void Start() { @@ -99,7 +103,7 @@ private IEnumerator awaiter() //TODO: Much better way of doing this [HarmonyPatch(typeof(UIFlightHud))] [HarmonyPatch("Start")] -class ToolbarBackendAppBarPatcher +internal class ToolbarBackendAppBarPatcher { public static void Postfix(UIFlightHud __instance) => AppbarBackend.SubscriberSchedulePing(); } \ No newline at end of file diff --git a/SpaceWarp/InternalExtensions.cs b/SpaceWarp/InternalExtensions.cs index 169d3e65..e7f14502 100644 --- a/SpaceWarp/InternalExtensions.cs +++ b/SpaceWarp/InternalExtensions.cs @@ -4,9 +4,9 @@ namespace SpaceWarp; internal static class InternalExtensions { - public static void Persist(this UnityObject o) + public static void Persist(this UnityObject obj) { - UnityObject.DontDestroyOnLoad(o); - o.hideFlags |= HideFlags.HideAndDontSave; + UnityObject.DontDestroyOnLoad(obj); + obj.hideFlags |= HideFlags.HideAndDontSave; } } diff --git a/SpaceWarp/Patching/BootstrapPatch.cs b/SpaceWarp/Patching/BootstrapPatch.cs index d6b34367..71dc62f5 100644 --- a/SpaceWarp/Patching/BootstrapPatch.cs +++ b/SpaceWarp/Patching/BootstrapPatch.cs @@ -17,17 +17,18 @@ private static void GetSpaceWarpMods() [HarmonyILManipulator] [HarmonyPatch(typeof(GameManager), nameof(GameManager.StartBootstrap))] - private static void PatchInitializationsIL(ILContext il, ILLabel endLabel) + private static void PatchInitializationsIL(ILContext ilContext, ILLabel endLabel) { - ILCursor c = new(il); + ILCursor ilCursor = new(ilContext); var flowProp = AccessTools.DeclaredProperty(typeof(GameManager), nameof(GameManager.LoadingFlow)); - c.GotoNext(MoveType.After, - x => x.MatchCallOrCallvirt(flowProp.SetMethod) + ilCursor.GotoNext( + MoveType.After, + instruction => instruction.MatchCallOrCallvirt(flowProp.SetMethod) ); - c.EmitDelegate(static () => + ilCursor.EmitDelegate(static () => { foreach (var plugin in SpaceWarpManager.SpaceWarpPlugins) { @@ -35,9 +36,9 @@ private static void PatchInitializationsIL(ILContext il, ILLabel endLabel) } }); - c.GotoLabel(endLabel, MoveType.Before); - c.Index -= 1; - c.EmitDelegate(static () => + ilCursor.GotoLabel(endLabel, MoveType.Before); + ilCursor.Index -= 1; + ilCursor.EmitDelegate(static () => { var flow = GameManager.Instance.LoadingFlow; @@ -57,6 +58,7 @@ private static void PatchInitializationsIL(ILContext il, ILLabel endLabel) { flow.AddAction(new PostInitializeModAction(plugin)); } + }); } } diff --git a/SpaceWarp/Patching/FixGetTypes.cs b/SpaceWarp/Patching/FixGetTypes.cs index 76b666a4..d6234655 100644 --- a/SpaceWarp/Patching/FixGetTypes.cs +++ b/SpaceWarp/Patching/FixGetTypes.cs @@ -12,17 +12,19 @@ internal static class FixGetTypes [HarmonyPatch(typeof(Assembly), nameof(Assembly.GetExportedTypes))] private static Exception GetTypesFix(Exception __exception, Assembly __instance, ref Type[] __result) { - if (__exception is ReflectionTypeLoadException rtle) + if (__exception is ReflectionTypeLoadException reflectionTypeLoadException) { SpaceWarpManager.Logger.LogWarning($"Types failed to load from assembly {__instance.FullName} due to the reasons below, continuing anyway."); SpaceWarpManager.Logger.LogWarning($"Exception: {__exception}"); - foreach (var e in rtle.LoaderExceptions) + + foreach (var exception in reflectionTypeLoadException.LoaderExceptions) { - SpaceWarpManager.Logger.LogWarning(e.ToString()); + SpaceWarpManager.Logger.LogWarning(exception.ToString()); } - __result = rtle.Types.Where(t => t != null).ToArray(); + __result = reflectionTypeLoadException.Types.Where(type => type != null).ToArray(); return null; } + return __exception; } } diff --git a/SpaceWarp/Patching/LoadingActions/InitializeModAction.cs b/SpaceWarp/Patching/LoadingActions/InitializeModAction.cs index 92db72d4..ca2949b4 100644 --- a/SpaceWarp/Patching/LoadingActions/InitializeModAction.cs +++ b/SpaceWarp/Patching/LoadingActions/InitializeModAction.cs @@ -6,7 +6,7 @@ namespace SpaceWarp.Patching.LoadingActions; internal sealed class InitializeModAction : FlowAction { - private BaseSpaceWarpPlugin Plugin; + private readonly BaseSpaceWarpPlugin Plugin; public InitializeModAction(BaseSpaceWarpPlugin plugin) : base($"Initialization for plugin {plugin.Info.Metadata.Name}") { diff --git a/SpaceWarp/Patching/LoadingActions/PostInitializeModAction.cs b/SpaceWarp/Patching/LoadingActions/PostInitializeModAction.cs index 1b795320..106bbb86 100644 --- a/SpaceWarp/Patching/LoadingActions/PostInitializeModAction.cs +++ b/SpaceWarp/Patching/LoadingActions/PostInitializeModAction.cs @@ -6,7 +6,7 @@ namespace SpaceWarp.Patching.LoadingActions; internal sealed class PostInitializeModAction : FlowAction { - private BaseSpaceWarpPlugin Plugin; + private readonly BaseSpaceWarpPlugin Plugin; public PostInitializeModAction(BaseSpaceWarpPlugin plugin) : base($"Post-initialization for plugin {plugin.Info.Metadata.Name}") { diff --git a/SpaceWarp/Patching/LoadingActions/PreInitializeModAction.cs b/SpaceWarp/Patching/LoadingActions/PreInitializeModAction.cs index 2e23d0cc..f6168f03 100644 --- a/SpaceWarp/Patching/LoadingActions/PreInitializeModAction.cs +++ b/SpaceWarp/Patching/LoadingActions/PreInitializeModAction.cs @@ -6,7 +6,7 @@ namespace SpaceWarp.Patching.LoadingActions; internal sealed class PreInitializeModAction : FlowAction { - private BaseSpaceWarpPlugin Plugin; + private readonly BaseSpaceWarpPlugin Plugin; public PreInitializeModAction(BaseSpaceWarpPlugin plugin) : base($"Pre-initialization for plugin {plugin.Info.Metadata.Name}") { diff --git a/SpaceWarp/Patching/MainMenuPatcher.cs b/SpaceWarp/Patching/MainMenuPatcher.cs index 376fc22c..c5df6255 100644 --- a/SpaceWarp/Patching/MainMenuPatcher.cs +++ b/SpaceWarp/Patching/MainMenuPatcher.cs @@ -8,18 +8,16 @@ namespace SpaceWarp.Patching; [HarmonyPatch(typeof(KSP.Game.StartupFlow.LandingHUD))] [HarmonyPatch("Start")] -class MainMenuPatcher +internal class MainMenuPatcher { public static void Postfix(KSP.Game.StartupFlow.LandingHUD __instance) { Transform menuItemsGroupTransform = __instance.transform.FindChildEx("MenuItemsGroup"); - Transform singleplayerButtonTransform = menuItemsGroupTransform.FindChildEx("Singleplayer"); foreach (var menuButtonToBeAdded in MainMenu.MenuButtonsToBeAdded) { - GameObject newButton = - Object.Instantiate(singleplayerButtonTransform.gameObject, menuItemsGroupTransform, false); + GameObject newButton = Object.Instantiate(singleplayerButtonTransform.gameObject, menuItemsGroupTransform, false); newButton.name = menuButtonToBeAdded.name; // Move the button to be above the Exit button. diff --git a/SpaceWarp/PathHelpers.cs b/SpaceWarp/PathHelpers.cs index 009995dd..b2483b60 100644 --- a/SpaceWarp/PathHelpers.cs +++ b/SpaceWarp/PathHelpers.cs @@ -18,12 +18,12 @@ internal static string GetRelativePath(string fromPath, string toPath) { if (string.IsNullOrEmpty(fromPath)) { - throw new ArgumentNullException("fromPath"); + throw new ArgumentNullException(nameof(fromPath)); } if (string.IsNullOrEmpty(toPath)) { - throw new ArgumentNullException("toPath"); + throw new ArgumentNullException(nameof(toPath)); } Uri fromUri = new Uri(AppendDirectorySeparatorChar(fromPath)); @@ -48,8 +48,7 @@ internal static string GetRelativePath(string fromPath, string toPath) private static string AppendDirectorySeparatorChar(string path) { // Append a slash only if the path is a directory and does not have a slash. - if (!Path.HasExtension(path) && - !path.EndsWith(Path.DirectorySeparatorChar.ToString())) + if (!Path.HasExtension(path) && !path.EndsWith(Path.DirectorySeparatorChar.ToString())) { return path + Path.DirectorySeparatorChar; } diff --git a/SpaceWarp/SpaceWarpManager.cs b/SpaceWarp/SpaceWarpManager.cs index 7891b806..c5957316 100644 --- a/SpaceWarp/SpaceWarpManager.cs +++ b/SpaceWarp/SpaceWarpManager.cs @@ -19,22 +19,22 @@ namespace SpaceWarp; internal static class SpaceWarpManager { internal static ManualLogSource Logger; - internal static string SpaceWarpFolder; - internal static IReadOnlyList SpaceWarpPlugins; - - internal static ConfigurationManager.ConfigurationManager _configurationManager; + internal static ConfigurationManager.ConfigurationManager ConfigurationManager; internal static void GetSpaceWarpPlugins() { - _configurationManager = (ConfigurationManager.ConfigurationManager)Chainloader.PluginInfos[ConfigurationManager.ConfigurationManager.GUID].Instance; + ConfigurationManager = (ConfigurationManager.ConfigurationManager)Chainloader.PluginInfos[global::ConfigurationManager.ConfigurationManager.GUID].Instance; + // obsolete warning for Chainloader.Plugins, is fine since we need ordered list // to break this we would likely need to upgrade to BIE 6, which isn't happening -#pragma warning disable CS0618 + #pragma warning disable CS0618 var spaceWarpPlugins = Chainloader.Plugins.OfType().ToList(); + SpaceWarpPlugins = spaceWarpPlugins; -#pragma warning restore CS0618 + + #pragma warning restore CS0618 foreach (var plugin in SpaceWarpPlugins.ToArray()) { var folderPath = Path.GetDirectoryName(plugin.Info.Location); @@ -56,11 +56,11 @@ internal static void GetSpaceWarpPlugins() } } - public static void Initialize(SpaceWarpPlugin sw) + public static void Initialize(SpaceWarpPlugin spaceWarpPlugin) { - Logger = sw.Logger; + Logger = spaceWarpPlugin.Logger; - SpaceWarpFolder = Path.GetDirectoryName(sw.Info.Location); + SpaceWarpFolder = Path.GetDirectoryName(spaceWarpPlugin.Info.Location); AppbarBackend.AppBarInFlightSubscriber.AddListener(Appbar.LoadAllButtons); } @@ -74,7 +74,9 @@ public static GUISkin Skin get { if (!_skin) + { AssetManager.TryGetAsset("spacewarp/swconsoleui/spacewarpconsole.guiskin", out _skin); + } return _skin; } } diff --git a/SpaceWarp/SpaceWarpPlugin.cs b/SpaceWarp/SpaceWarpPlugin.cs index 58e42af6..c3f7619e 100644 --- a/SpaceWarp/SpaceWarpPlugin.cs +++ b/SpaceWarp/SpaceWarpPlugin.cs @@ -20,7 +20,7 @@ public sealed class SpaceWarpPlugin : BaseSpaceWarpPlugin public const string ModName = "Space Warp"; public const string ModVer = MyPluginInfo.PLUGIN_VERSION; - new internal ManualLogSource Logger => base.Logger; + internal new ManualLogSource Logger => base.Logger; public void Awake() { diff --git a/SpaceWarp/UI/ModListUI.cs b/SpaceWarp/UI/ModListUI.cs index 9c434516..89e2caa2 100644 --- a/SpaceWarp/UI/ModListUI.cs +++ b/SpaceWarp/UI/ModListUI.cs @@ -1,16 +1,16 @@ -using System.Collections.Generic; -using KSP.Game; +using KSP.Game; using SpaceWarp.API.Mods.JSON; using UnityEngine; -using BepInEx.Configuration; namespace SpaceWarp.UI; public class ModListUI : KerbalMonoBehaviour { private static bool _loaded; + private bool _drawUI; private Rect _windowRect; + private ModInfo _selectedMetaData; private int _windowWidth = 350; private int _windowHeight = 700; @@ -18,10 +18,9 @@ public class ModListUI : KerbalMonoBehaviour private static GUIStyle _boxStyle; private static Vector2 _scrollPositionMods; private static Vector2 _scrollPositionInfo; - - private static GUIStyle _closeButtonStyle = null; + private static GUIStyle _closeButtonStyle; - private ModInfo _selectedMetaData = null; + private const string ModListHeader = "ModListHeader"; public void Start() { @@ -55,14 +54,13 @@ private void OnGUI() }; int controlID = GUIUtility.GetControlID(FocusType.Passive); - const string header = "spacewarp.modlist"; GUILayoutOption width = GUILayout.Width((float)(_windowWidth * 0.8)); GUILayoutOption height = GUILayout.Height((float)(_windowHeight * 0.8)); GUI.skin = SpaceWarpManager.Skin; - _windowRect = GUILayout.Window(controlID, _windowRect, FillWindow, header, width, height); + _windowRect = GUILayout.Window(controlID, _windowRect, FillWindow, ModListHeader, width, height); } - + private void Update() { if (Input.GetKey(KeyCode.LeftAlt) && Input.GetKeyDown(KeyCode.M)) @@ -118,8 +116,8 @@ private void FillWindow(int windowID) GUILayout.EndHorizontal(); if (GUILayout.Button("Open Configuration Manager")) { - SpaceWarpManager._configurationManager.DisplayingWindow = - !SpaceWarpManager._configurationManager.DisplayingWindow; + SpaceWarpManager.ConfigurationManager.DisplayingWindow = + !SpaceWarpManager.ConfigurationManager.DisplayingWindow; _drawUI = false; } GUILayout.EndVertical(); diff --git a/SpaceWarp/UI/SpaceWarpConsole.cs b/SpaceWarp/UI/SpaceWarpConsole.cs index c3667d91..0a5f6a51 100644 --- a/SpaceWarp/UI/SpaceWarpConsole.cs +++ b/SpaceWarp/UI/SpaceWarpConsole.cs @@ -1,5 +1,4 @@ using KSP.Game; -using KSP.Sim.impl; using KSP.UI.Binding; using SpaceWarp.API.Assets; using SpaceWarp.API.UI.Appbar; From 11dc3807afbf3d42b76212afcbd259b726b95081 Mon Sep 17 00:00:00 2001 From: Ewy Date: Sat, 4 Mar 2023 15:32:22 +0100 Subject: [PATCH 20/29] Console & Mod UI can now be closed by pressing ESC --- SpaceWarp/UI/ModListUI.cs | 24 ++++++++++++++++++++++-- SpaceWarp/UI/SpaceWarpConsole.cs | 20 ++++++++++++++------ 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/SpaceWarp/UI/ModListUI.cs b/SpaceWarp/UI/ModListUI.cs index 89e2caa2..f2e2e228 100644 --- a/SpaceWarp/UI/ModListUI.cs +++ b/SpaceWarp/UI/ModListUI.cs @@ -1,4 +1,5 @@ using KSP.Game; +using KSP.UI.Binding; using SpaceWarp.API.Mods.JSON; using UnityEngine; @@ -67,6 +68,13 @@ private void Update() { ToggleVisible(); } + + if (Input.GetKey(KeyCode.Escape) && _drawUI) + { + CloseWindow(); + GUIUtility.ExitGUI(); + } + } private void FillWindow(int windowID) @@ -82,8 +90,14 @@ private void FillWindow(int windowID) GUILayout.BeginHorizontal(); GUILayout.BeginVertical(); - _scrollPositionMods = GUILayout.BeginScrollView(_scrollPositionMods, false, false, - GUILayout.Height((float)(_windowHeight * 0.8)), GUILayout.Width(300)); + _scrollPositionMods = GUILayout.BeginScrollView( + _scrollPositionMods, + false, + false, + GUILayout.Height((float)(_windowHeight * 0.8)), + GUILayout.Width(300) + ); + foreach (var mod in SpaceWarpManager.SpaceWarpPlugins) { if (GUILayout.Button(mod.SpaceWarpMetadata.Name)) @@ -128,4 +142,10 @@ public void ToggleVisible() { _drawUI = !_drawUI; } + + public void CloseWindow() + { + ToggleVisible(); + } + } \ No newline at end of file diff --git a/SpaceWarp/UI/SpaceWarpConsole.cs b/SpaceWarp/UI/SpaceWarpConsole.cs index 0a5f6a51..8c50e3f4 100644 --- a/SpaceWarp/UI/SpaceWarpConsole.cs +++ b/SpaceWarp/UI/SpaceWarpConsole.cs @@ -10,7 +10,7 @@ public sealed class SpaceWarpConsole : KerbalMonoBehaviour { private bool _drawUI; private Rect _windowRect; - bool _autoScroll = true; + private bool _autoScroll = true; private const ControlTypes ConsoleLocks = ControlTypes.All; private const string ConsoleLockID = "spacewarp.console"; @@ -28,9 +28,9 @@ private void Awake() { _windowWidth = (int)(Screen.width * 0.5f); _windowHeight = (int)(Screen.height * 0.5f); - _windowRect = new Rect(Screen.width * 0.15f, Screen.height * 0.15f, 0, 0); _scrollPosition = Vector2.zero; + Appbar.RegisterAppButton( "Console", "BTN-SWConsole", @@ -38,14 +38,15 @@ private void Awake() // Path format [mod_id]/images/filename // for bundles its [mod_id]/[bundle_name]/[path to file in bundle with out assets/bundle]/filename.extension // There is also a try get asset function, that returns a bool on whether or not it could grab the asset - AssetManager.GetAsset($"spacewarp/images/console.png"), + AssetManager.GetAsset("spacewarp/images/console.png"), ToggleVisible - ); + ); } private void OnGUI() { GUI.skin = SpaceWarpManager.Skin; + if (!_drawUI) { return; @@ -57,19 +58,26 @@ private void OnGUI() }; int controlID = GUIUtility.GetControlID(FocusType.Passive); - string header = "spacewarp.console"; GUILayoutOption width = GUILayout.Width((float)(_windowWidth * 0.8)); GUILayoutOption height = GUILayout.Height((float)(_windowHeight * 0.8)); - _windowRect = GUILayout.Window(controlID, _windowRect, DrawConsole, header, width, height); + _windowRect = GUILayout.Window(controlID, _windowRect, DrawConsole, ConsoleLockID, width, height); } private void Update() { + if (Input.GetKey(KeyCode.LeftAlt) && Input.GetKeyDown(KeyCode.C)) { ToggleVisible(!_drawUI); } + + if (Input.GetKey(KeyCode.Escape) && _drawUI) + { + CloseWindow(); + GUIUtility.ExitGUI(); + } + } private void DrawConsole(int windowID) From 8f8bacf6db11d0bfa824c40b745cde12c7b6d9f2 Mon Sep 17 00:00:00 2001 From: Ewy Date: Sat, 4 Mar 2023 17:31:23 +0100 Subject: [PATCH 21/29] Debug Console now has colors based off their Log Level --- ExampleMod/ExampleMod.cs | 25 ++++++++++- SpaceWarp/UI/ModListUI.cs | 1 - SpaceWarp/UI/SpaceWarpConsole.cs | 50 ++++++++++++++++++++- SpaceWarp/UI/SpaceWarpConsoleLogListener.cs | 13 ++++-- 4 files changed, 81 insertions(+), 8 deletions(-) diff --git a/ExampleMod/ExampleMod.cs b/ExampleMod/ExampleMod.cs index 7464f649..ef19e495 100644 --- a/ExampleMod/ExampleMod.cs +++ b/ExampleMod/ExampleMod.cs @@ -1,4 +1,5 @@ using BepInEx; +using BepInEx.Logging; using SpaceWarp.API.Mods; using SpaceWarp.API.Assets; using KSP.UI.Binding; @@ -90,6 +91,9 @@ private static void FillWindow(int windowID) GUILayout.Label("Example Mod - Built with Space-Warp"); GUI.DragWindow(new Rect(0, 0, 10000, 500)); } + + private float lastUpdateTime = 0.0f; + private float updateInterval = 1.0f; /// /// Runs every frame and performs various tasks based on the game state. @@ -97,9 +101,26 @@ private static void FillWindow(int windowID) private void LateUpdate() { // Now lets play with some Game objects - if (Game.GlobalGameState.GetState() == KSP.Game.GameState.MainMenu) + // Check if the specified interval has elapsed + if (Time.time - lastUpdateTime >= updateInterval) { - KSP.Audio.KSPAudioEventManager.SetMasterVolume(Mathf.Sin(Time.time) * 100); + // Update the last update time to the current time + lastUpdateTime = Time.time; + + // Now lets play with some Game objects + if (Game.GlobalGameState.GetState() == KSP.Game.GameState.MainMenu) + { + Logger.Log(LogLevel.None, "This is log level none"); + Logger.Log(LogLevel.Debug, "This is log level debug"); + Logger.Log(LogLevel.Info, "This is log level info"); + Logger.Log(LogLevel.Warning, "This is log level warning"); + Logger.Log(LogLevel.Error, "This is log level error"); + Logger.Log(LogLevel.Fatal, "This is log level fatal"); + Logger.Log(LogLevel.Message, "This is log level message"); + Logger.Log(LogLevel.All, "This is log level all"); + + KSP.Audio.KSPAudioEventManager.SetMasterVolume(Mathf.Sin(Time.time) * 100); + } } else if (Game.GlobalGameState.GetState() == KSP.Game.GameState.FlightView) { diff --git a/SpaceWarp/UI/ModListUI.cs b/SpaceWarp/UI/ModListUI.cs index f2e2e228..d2115d69 100644 --- a/SpaceWarp/UI/ModListUI.cs +++ b/SpaceWarp/UI/ModListUI.cs @@ -1,5 +1,4 @@ using KSP.Game; -using KSP.UI.Binding; using SpaceWarp.API.Mods.JSON; using UnityEngine; diff --git a/SpaceWarp/UI/SpaceWarpConsole.cs b/SpaceWarp/UI/SpaceWarpConsole.cs index 8c50e3f4..038f68ec 100644 --- a/SpaceWarp/UI/SpaceWarpConsole.cs +++ b/SpaceWarp/UI/SpaceWarpConsole.cs @@ -1,4 +1,5 @@ -using KSP.Game; +using BepInEx.Logging; +using KSP.Game; using KSP.UI.Binding; using SpaceWarp.API.Assets; using SpaceWarp.API.UI.Appbar; @@ -95,7 +96,17 @@ private void DrawConsole(int windowID) foreach (string message in SpaceWarpConsoleLogListener.DebugMessages) { if (!message.ToLower().Contains(_search.ToLower())) continue; - GUILayout.Label(message); + + // Parse the log level from the message string + LogLevel logType = GetLogLevelFromMessage(message); + + // Apply a different color style based on the log level + GUIStyle style = GetLogStyle(logType); + + if (logType == LogLevel.Fatal) style.fontStyle = FontStyle.Bold; + + GUILayout.Label(message, style); + if(_autoScroll) { _scrollView.Set(_scrollView.x, Mathf.Infinity); @@ -126,6 +137,41 @@ private void DrawConsole(int windowID) GUILayout.EndVertical(); GUI.DragWindow(new Rect(0, 0, 10000, 500)); } + + private static LogLevel GetLogLevelFromMessage(string message) + { + return message.ToLower() switch + { + string logMessage when logMessage.StartsWith("[fatal") => LogLevel.Fatal, + string logMessage when logMessage.StartsWith("[error") => LogLevel.Error, + string logMessage when logMessage.StartsWith("[warn") => LogLevel.Warning, + string logMessage when logMessage.StartsWith("[message") => LogLevel.Message, + string logMessage when logMessage.StartsWith("[info") => LogLevel.Info, + string logMessage when logMessage.StartsWith("[debug") => LogLevel.Debug, + string logMessage when logMessage.StartsWith("[all") => LogLevel.All, + _ => LogLevel.None + }; + } + + private static GUIStyle GetLogStyle(LogLevel logLevel) + { + GUIStyle style = new GUIStyle(GUI.skin.label); + + style.normal.textColor = logLevel switch + { + LogLevel.Fatal => Color.red, + LogLevel.Error => Color.red, + LogLevel.Warning => Color.yellow, + LogLevel.Message => Color.white, + LogLevel.Info => Color.cyan, + LogLevel.Debug => Color.green, + LogLevel.All => Color.magenta, + _ => style.normal.textColor + }; + + return style; + } + public void ToggleVisible(bool shouldDraw) { _drawUI = shouldDraw; diff --git a/SpaceWarp/UI/SpaceWarpConsoleLogListener.cs b/SpaceWarp/UI/SpaceWarpConsoleLogListener.cs index bc708ba4..b906ea23 100644 --- a/SpaceWarp/UI/SpaceWarpConsoleLogListener.cs +++ b/SpaceWarp/UI/SpaceWarpConsoleLogListener.cs @@ -6,14 +6,21 @@ namespace SpaceWarp.UI; public sealed class SpaceWarpConsoleLogListener : ILogListener { internal static readonly List DebugMessages = new(); - + public void LogEvent(object sender, LogEventArgs eventArgs) { - DebugMessages.Add(eventArgs.ToStringLine()); + DebugMessages.Add(BuildMessage(eventArgs.Level, eventArgs.Data, eventArgs.Source)); + } + + private static string BuildMessage(LogLevel level, object data, ILogSource source) + { + return level == LogLevel.None + ? $"[{(object) source.SourceName}] {data}" + : $"[{(object) level} : {(object) source.SourceName}] {data}"; } public void Dispose() { DebugMessages.Clear(); } -} +} \ No newline at end of file From e76722430641d2aafbee60f3c4be169a4d0ded80 Mon Sep 17 00:00:00 2001 From: Lexi Date: Sat, 4 Mar 2023 13:02:07 -0500 Subject: [PATCH 22/29] Added color configuration. Fixed configuration menu by patching its plugin search to use Chainloader --- SpaceWarp/Patching/ConfigurationPatch.cs | 19 ++++ SpaceWarp/SpaceWarp.csproj | 1 + SpaceWarp/SpaceWarpManager.cs | 7 +- SpaceWarp/SpaceWarpPlugin.cs | 34 ++++++++ SpaceWarp/UI/SpaceWarpConsole.cs | 106 ++++++++++++----------- 5 files changed, 112 insertions(+), 55 deletions(-) create mode 100644 SpaceWarp/Patching/ConfigurationPatch.cs diff --git a/SpaceWarp/Patching/ConfigurationPatch.cs b/SpaceWarp/Patching/ConfigurationPatch.cs new file mode 100644 index 00000000..e9dfcc46 --- /dev/null +++ b/SpaceWarp/Patching/ConfigurationPatch.cs @@ -0,0 +1,19 @@ +using BepInEx; +using BepInEx.Bootstrap; +using ConfigurationManager.Utilities; +using HarmonyLib; + +namespace SpaceWarp.Patching; + +[HarmonyPatch(typeof(Utils))] +[HarmonyPatch(nameof(Utils.FindPlugins))] +public class ConfigurationPatch +{ + static void Postfix(ref BaseUnityPlugin[] __result) + { + //Disable because I know what I am doing. +#pragma warning disable CS0618 + __result = Chainloader.Plugins.ToArray(); +#pragma warning restore CS0618 + } +} \ No newline at end of file diff --git a/SpaceWarp/SpaceWarp.csproj b/SpaceWarp/SpaceWarp.csproj index 61de490a..b4bb46a3 100644 --- a/SpaceWarp/SpaceWarp.csproj +++ b/SpaceWarp/SpaceWarp.csproj @@ -38,6 +38,7 @@ ..\ThirdParty\ConfigurationManager\ConfigurationManager.dll + true diff --git a/SpaceWarp/SpaceWarpManager.cs b/SpaceWarp/SpaceWarpManager.cs index c5957316..739e8590 100644 --- a/SpaceWarp/SpaceWarpManager.cs +++ b/SpaceWarp/SpaceWarpManager.cs @@ -1,5 +1,7 @@ -using System.IO; +using System; +using System.IO; using System.Collections.Generic; +using BepInEx; using BepInEx.Bootstrap; using BepInEx.Logging; using Newtonsoft.Json; @@ -22,16 +24,13 @@ internal static class SpaceWarpManager internal static string SpaceWarpFolder; internal static IReadOnlyList SpaceWarpPlugins; internal static ConfigurationManager.ConfigurationManager ConfigurationManager; - internal static void GetSpaceWarpPlugins() { - ConfigurationManager = (ConfigurationManager.ConfigurationManager)Chainloader.PluginInfos[global::ConfigurationManager.ConfigurationManager.GUID].Instance; // obsolete warning for Chainloader.Plugins, is fine since we need ordered list // to break this we would likely need to upgrade to BIE 6, which isn't happening #pragma warning disable CS0618 var spaceWarpPlugins = Chainloader.Plugins.OfType().ToList(); - SpaceWarpPlugins = spaceWarpPlugins; #pragma warning restore CS0618 diff --git a/SpaceWarp/SpaceWarpPlugin.cs b/SpaceWarp/SpaceWarpPlugin.cs index c3f7619e..11760f53 100644 --- a/SpaceWarp/SpaceWarpPlugin.cs +++ b/SpaceWarp/SpaceWarpPlugin.cs @@ -1,7 +1,10 @@ global using UnityObject = UnityEngine.Object; global using System.Linq; +using System; +using System.ComponentModel; using BepInEx; using BepInEx.Bootstrap; +using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using KSP.Messages; @@ -20,10 +23,38 @@ public sealed class SpaceWarpPlugin : BaseSpaceWarpPlugin public const string ModName = "Space Warp"; public const string ModVer = MyPluginInfo.PLUGIN_VERSION; + + internal ConfigEntry configErrorColor; + internal ConfigEntry configWarningColor; + internal ConfigEntry configMessageColor; + internal ConfigEntry configInfoColor; + internal ConfigEntry configDebugColor; + internal ConfigEntry configAllColor; + internal ConfigEntry configShowConsoleButton; + internal ConfigEntry configShowTimeStamps; + internal new ManualLogSource Logger => base.Logger; public void Awake() { + configErrorColor = Config.Bind("DebugConsole", "ErrorColor", Color.red, + "The color for log messages that have the level: Error/Fatal (bolded)"); + configWarningColor = Config.Bind("DebugConsole", "WarningColor", Color.yellow, + "The color for log messages that have the level: Warning"); + configMessageColor = Config.Bind("DebugConsole", "MessageColor", Color.white, + "The color for log messages that have the level: Message"); + configInfoColor = Config.Bind("DebugConsole", "InfoColor", Color.cyan, + "The color for log messages that have the level: Info"); + configDebugColor = Config.Bind("DebugConsole", "DebugColor", Color.green, + "The color for log messages that have the level: Debug"); + configAllColor = Config.Bind("DebugConsole", "AllColor", Color.magenta, + "The color for log messages that have the level: All"); + configShowConsoleButton = + Config.Bind("DebugConsole", "ShowConsoleButton", false, + "Show console button in app.bar, requires restart"); + configShowTimeStamps = + Config.Bind("DebugConsole", "ShowTimeStamps", false, "Show time stamps in debug console"); + BepInEx.Logging.Logger.Listeners.Add(new SpaceWarpConsoleLogListener()); Harmony.CreateAndPatchAll(typeof(SpaceWarpPlugin).Assembly, ModGuid); @@ -36,6 +67,8 @@ public override void OnInitialized() { base.OnInitialized(); + + Game.Messages.Subscribe(typeof(GameStateEnteredMessage), StateChanges.OnGameStateEntered,false,true); Game.Messages.Subscribe(typeof(GameStateLeftMessage), StateChanges.OnGameStateLeft,false,true); Game.Messages.Subscribe(typeof(GameStateChangedMessage), StateChanges.OnGameStateChanged,false,true); @@ -45,6 +78,7 @@ public override void OnInitialized() private void InitializeUI() { + SpaceWarpManager.ConfigurationManager = (ConfigurationManager.ConfigurationManager)Chainloader.PluginInfos[global::ConfigurationManager.ConfigurationManager.GUID].Instance; GameObject modUIObject = new("Space Warp Mod UI"); modUIObject.Persist(); diff --git a/SpaceWarp/UI/SpaceWarpConsole.cs b/SpaceWarp/UI/SpaceWarpConsole.cs index 038f68ec..2c08d655 100644 --- a/SpaceWarp/UI/SpaceWarpConsole.cs +++ b/SpaceWarp/UI/SpaceWarpConsole.cs @@ -1,4 +1,5 @@ -using BepInEx.Logging; +using BepInEx.Bootstrap; +using BepInEx.Logging; using KSP.Game; using KSP.UI.Binding; using SpaceWarp.API.Assets; @@ -25,29 +26,34 @@ public sealed class SpaceWarpConsole : KerbalMonoBehaviour private string _search = ""; private GUIStyle _closeButtonStyle; + private SpaceWarpPlugin _spaceWarpPluginInstance; + + private void Awake() { _windowWidth = (int)(Screen.width * 0.5f); _windowHeight = (int)(Screen.height * 0.5f); _windowRect = new Rect(Screen.width * 0.15f, Screen.height * 0.15f, 0, 0); _scrollPosition = Vector2.zero; - - Appbar.RegisterAppButton( - "Console", - "BTN-SWConsole", - // Example of using the asset loader, were going to load the apps icon - // Path format [mod_id]/images/filename - // for bundles its [mod_id]/[bundle_name]/[path to file in bundle with out assets/bundle]/filename.extension - // There is also a try get asset function, that returns a bool on whether or not it could grab the asset - AssetManager.GetAsset("spacewarp/images/console.png"), - ToggleVisible - ); + _spaceWarpPluginInstance = (Chainloader.PluginInfos[SpaceWarpPlugin.ModGuid].Instance as SpaceWarpPlugin)!; + + if (_spaceWarpPluginInstance.configShowConsoleButton.Value) + Appbar.RegisterAppButton( + "Console", + "BTN-SWConsole", + // Example of using the asset loader, were going to load the apps icon + // Path format [mod_id]/images/filename + // for bundles its [mod_id]/[bundle_name]/[path to file in bundle with out assets/bundle]/filename.extension + // There is also a try get asset function, that returns a bool on whether or not it could grab the asset + AssetManager.GetAsset("spacewarp/images/console.png"), + ToggleVisible + ); } private void OnGUI() { GUI.skin = SpaceWarpManager.Skin; - + if (!_drawUI) { return; @@ -61,63 +67,61 @@ private void OnGUI() int controlID = GUIUtility.GetControlID(FocusType.Passive); GUILayoutOption width = GUILayout.Width((float)(_windowWidth * 0.8)); GUILayoutOption height = GUILayout.Height((float)(_windowHeight * 0.8)); - + _windowRect = GUILayout.Window(controlID, _windowRect, DrawConsole, ConsoleLockID, width, height); } - + private void Update() { - if (Input.GetKey(KeyCode.LeftAlt) && Input.GetKeyDown(KeyCode.C)) { ToggleVisible(!_drawUI); } - + if (Input.GetKey(KeyCode.Escape) && _drawUI) { CloseWindow(); GUIUtility.ExitGUI(); } - } private void DrawConsole(int windowID) { if (GUI.Button(new Rect(_windowRect.width - 18, 2, 16, 16), "x", _closeButtonStyle)) { - SpaceWarpManager.Logger.LogInfo("Generating console close button"); CloseWindow(); GUIUtility.ExitGUI(); } + GUILayout.BeginVertical(); _search = GUILayout.TextField(_search); _scrollView = GUILayout.BeginScrollView(_scrollPosition, false, true); - + foreach (string message in SpaceWarpConsoleLogListener.DebugMessages) { if (!message.ToLower().Contains(_search.ToLower())) continue; - + // Parse the log level from the message string LogLevel logType = GetLogLevelFromMessage(message); // Apply a different color style based on the log level GUIStyle style = GetLogStyle(logType); - + if (logType == LogLevel.Fatal) style.fontStyle = FontStyle.Bold; GUILayout.Label(message, style); - - if(_autoScroll) - { - _scrollView.Set(_scrollView.x, Mathf.Infinity); - _scrollPosition = _scrollView; - } - else - { - _scrollPosition = _scrollView; - } } - + + if (_autoScroll) + { + _scrollView.Set(_scrollView.x, Mathf.Infinity); + _scrollPosition = _scrollView; + } + else + { + _scrollPosition = _scrollView; + } + GUILayout.EndScrollView(); GUILayout.BeginHorizontal(); @@ -137,41 +141,41 @@ private void DrawConsole(int windowID) GUILayout.EndVertical(); GUI.DragWindow(new Rect(0, 0, 10000, 500)); } - + private static LogLevel GetLogLevelFromMessage(string message) { return message.ToLower() switch { - string logMessage when logMessage.StartsWith("[fatal") => LogLevel.Fatal, - string logMessage when logMessage.StartsWith("[error") => LogLevel.Error, - string logMessage when logMessage.StartsWith("[warn") => LogLevel.Warning, - string logMessage when logMessage.StartsWith("[message") => LogLevel.Message, - string logMessage when logMessage.StartsWith("[info") => LogLevel.Info, - string logMessage when logMessage.StartsWith("[debug") => LogLevel.Debug, - string logMessage when logMessage.StartsWith("[all") => LogLevel.All, + { } logMessage when logMessage.StartsWith("[fatal") => LogLevel.Fatal, + { } logMessage when logMessage.StartsWith("[error") => LogLevel.Error, + { } logMessage when logMessage.StartsWith("[warn") => LogLevel.Warning, + { } logMessage when logMessage.StartsWith("[message") => LogLevel.Message, + { } logMessage when logMessage.StartsWith("[info") => LogLevel.Info, + { } logMessage when logMessage.StartsWith("[debug") => LogLevel.Debug, + { } logMessage when logMessage.StartsWith("[all") => LogLevel.All, _ => LogLevel.None }; } - - private static GUIStyle GetLogStyle(LogLevel logLevel) + + private GUIStyle GetLogStyle(LogLevel logLevel) { GUIStyle style = new GUIStyle(GUI.skin.label); style.normal.textColor = logLevel switch { - LogLevel.Fatal => Color.red, - LogLevel.Error => Color.red, - LogLevel.Warning => Color.yellow, - LogLevel.Message => Color.white, - LogLevel.Info => Color.cyan, - LogLevel.Debug => Color.green, - LogLevel.All => Color.magenta, + LogLevel.Fatal => _spaceWarpPluginInstance.configErrorColor.Value, + LogLevel.Error => _spaceWarpPluginInstance.configErrorColor.Value, + LogLevel.Warning => _spaceWarpPluginInstance.configWarningColor.Value, + LogLevel.Message => _spaceWarpPluginInstance.configMessageColor.Value, + LogLevel.Info => _spaceWarpPluginInstance.configInfoColor.Value, + LogLevel.Debug => _spaceWarpPluginInstance.configDebugColor.Value, + LogLevel.All => _spaceWarpPluginInstance.configAllColor.Value, _ => style.normal.textColor }; return style; } - + public void ToggleVisible(bool shouldDraw) { _drawUI = shouldDraw; From 273d105eee0d7f5c76208276a7e2826f0c9b6466 Mon Sep 17 00:00:00 2001 From: Ewy Date: Sat, 4 Mar 2023 20:40:23 +0100 Subject: [PATCH 23/29] Reorganized the config options as they are sorted Alphabetically --- SpaceWarp/SpaceWarpPlugin.cs | 24 ++++++++------------- SpaceWarp/UI/SpaceWarpConsole.cs | 3 +-- SpaceWarp/UI/SpaceWarpConsoleLogListener.cs | 6 ++++-- 3 files changed, 14 insertions(+), 19 deletions(-) diff --git a/SpaceWarp/SpaceWarpPlugin.cs b/SpaceWarp/SpaceWarpPlugin.cs index 11760f53..f6f30697 100644 --- a/SpaceWarp/SpaceWarpPlugin.cs +++ b/SpaceWarp/SpaceWarpPlugin.cs @@ -1,7 +1,5 @@ global using UnityObject = UnityEngine.Object; global using System.Linq; -using System; -using System.ComponentModel; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; @@ -23,7 +21,6 @@ public sealed class SpaceWarpPlugin : BaseSpaceWarpPlugin public const string ModName = "Space Warp"; public const string ModVer = MyPluginInfo.PLUGIN_VERSION; - internal ConfigEntry configErrorColor; internal ConfigEntry configWarningColor; internal ConfigEntry configMessageColor; @@ -37,23 +34,22 @@ public sealed class SpaceWarpPlugin : BaseSpaceWarpPlugin public void Awake() { - configErrorColor = Config.Bind("DebugConsole", "ErrorColor", Color.red, + configErrorColor = Config.Bind("Debug Console", "Color Error", Color.red, "The color for log messages that have the level: Error/Fatal (bolded)"); - configWarningColor = Config.Bind("DebugConsole", "WarningColor", Color.yellow, + configWarningColor = Config.Bind("Debug Console", "Color Warning", Color.yellow, "The color for log messages that have the level: Warning"); - configMessageColor = Config.Bind("DebugConsole", "MessageColor", Color.white, + configMessageColor = Config.Bind("Debug Console", "Color Message", Color.white, "The color for log messages that have the level: Message"); - configInfoColor = Config.Bind("DebugConsole", "InfoColor", Color.cyan, + configInfoColor = Config.Bind("Debug Console", "Color Info", Color.cyan, "The color for log messages that have the level: Info"); - configDebugColor = Config.Bind("DebugConsole", "DebugColor", Color.green, + configDebugColor = Config.Bind("Debug Console", "Color Debug", Color.green, "The color for log messages that have the level: Debug"); - configAllColor = Config.Bind("DebugConsole", "AllColor", Color.magenta, + configAllColor = Config.Bind("Debug Console", "Color All", Color.magenta, "The color for log messages that have the level: All"); - configShowConsoleButton = - Config.Bind("DebugConsole", "ShowConsoleButton", false, + configShowConsoleButton = Config.Bind("Debug Console", "Show Console Button", false, "Show console button in app.bar, requires restart"); - configShowTimeStamps = - Config.Bind("DebugConsole", "ShowTimeStamps", false, "Show time stamps in debug console"); + configShowTimeStamps = Config.Bind("Debug Console", "Show Timestamps", false, + "Show time stamps in debug console"); BepInEx.Logging.Logger.Listeners.Add(new SpaceWarpConsoleLogListener()); @@ -67,8 +63,6 @@ public override void OnInitialized() { base.OnInitialized(); - - Game.Messages.Subscribe(typeof(GameStateEnteredMessage), StateChanges.OnGameStateEntered,false,true); Game.Messages.Subscribe(typeof(GameStateLeftMessage), StateChanges.OnGameStateLeft,false,true); Game.Messages.Subscribe(typeof(GameStateChangedMessage), StateChanges.OnGameStateChanged,false,true); diff --git a/SpaceWarp/UI/SpaceWarpConsole.cs b/SpaceWarp/UI/SpaceWarpConsole.cs index 2c08d655..983f76d7 100644 --- a/SpaceWarp/UI/SpaceWarpConsole.cs +++ b/SpaceWarp/UI/SpaceWarpConsole.cs @@ -12,6 +12,7 @@ public sealed class SpaceWarpConsole : KerbalMonoBehaviour { private bool _drawUI; private Rect _windowRect; + private string _search = ""; private bool _autoScroll = true; private const ControlTypes ConsoleLocks = ControlTypes.All; @@ -23,9 +24,7 @@ public sealed class SpaceWarpConsole : KerbalMonoBehaviour private static Vector2 _scrollPosition; private static Vector2 _scrollView; - private string _search = ""; private GUIStyle _closeButtonStyle; - private SpaceWarpPlugin _spaceWarpPluginInstance; diff --git a/SpaceWarp/UI/SpaceWarpConsoleLogListener.cs b/SpaceWarp/UI/SpaceWarpConsoleLogListener.cs index b906ea23..57d7490d 100644 --- a/SpaceWarp/UI/SpaceWarpConsoleLogListener.cs +++ b/SpaceWarp/UI/SpaceWarpConsoleLogListener.cs @@ -1,5 +1,7 @@ using System.Collections.Generic; +using BepInEx.Bootstrap; using BepInEx.Logging; +using UnityEngine; namespace SpaceWarp.UI; @@ -14,8 +16,8 @@ public void LogEvent(object sender, LogEventArgs eventArgs) private static string BuildMessage(LogLevel level, object data, ILogSource source) { - return level == LogLevel.None - ? $"[{(object) source.SourceName}] {data}" + return level == LogLevel.None + ? $"[{(object) source.SourceName}] {data}" : $"[{(object) level} : {(object) source.SourceName}] {data}"; } From a20adca7d4297adf375d7df410daa242b72d4d0e Mon Sep 17 00:00:00 2001 From: Ewy Date: Sat, 4 Mar 2023 22:15:22 +0100 Subject: [PATCH 24/29] Added timestamps to the debug console window --- SpaceWarp/SpaceWarpPlugin.cs | 7 ++++-- SpaceWarp/UI/SpaceWarpConsole.cs | 10 ++++++--- SpaceWarp/UI/SpaceWarpConsoleLogListener.cs | 25 ++++++++++++++++----- 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/SpaceWarp/SpaceWarpPlugin.cs b/SpaceWarp/SpaceWarpPlugin.cs index f6f30697..c34c2cc5 100644 --- a/SpaceWarp/SpaceWarpPlugin.cs +++ b/SpaceWarp/SpaceWarpPlugin.cs @@ -29,6 +29,7 @@ public sealed class SpaceWarpPlugin : BaseSpaceWarpPlugin internal ConfigEntry configAllColor; internal ConfigEntry configShowConsoleButton; internal ConfigEntry configShowTimeStamps; + internal ConfigEntry configTimeStampFormat; internal new ManualLogSource Logger => base.Logger; @@ -50,8 +51,10 @@ public void Awake() "Show console button in app.bar, requires restart"); configShowTimeStamps = Config.Bind("Debug Console", "Show Timestamps", false, "Show time stamps in debug console"); - - BepInEx.Logging.Logger.Listeners.Add(new SpaceWarpConsoleLogListener()); + configTimeStampFormat = Config.Bind("Debug Console", "Timestamp Format", "HH:mm:ss.fff", + "The format for the timestamps in the debug console."); + + BepInEx.Logging.Logger.Listeners.Add(new SpaceWarpConsoleLogListener(this)); Harmony.CreateAndPatchAll(typeof(SpaceWarpPlugin).Assembly, ModGuid); diff --git a/SpaceWarp/UI/SpaceWarpConsole.cs b/SpaceWarp/UI/SpaceWarpConsole.cs index 983f76d7..ea7dee8b 100644 --- a/SpaceWarp/UI/SpaceWarpConsole.cs +++ b/SpaceWarp/UI/SpaceWarpConsole.cs @@ -1,4 +1,5 @@ -using BepInEx.Bootstrap; +using System; +using BepInEx.Bootstrap; using BepInEx.Logging; using KSP.Game; using KSP.UI.Binding; @@ -141,9 +142,12 @@ private void DrawConsole(int windowID) GUI.DragWindow(new Rect(0, 0, 10000, 500)); } - private static LogLevel GetLogLevelFromMessage(string message) + private LogLevel GetLogLevelFromMessage(string message) { - return message.ToLower() switch + var logParts = message.ToLower().Replace(" ", "").Split(']'); + var logLevelIndex = _spaceWarpPluginInstance.configShowTimeStamps.Value ? 1 : 0; + + return logParts[logLevelIndex] switch { { } logMessage when logMessage.StartsWith("[fatal") => LogLevel.Fatal, { } logMessage when logMessage.StartsWith("[error") => LogLevel.Error, diff --git a/SpaceWarp/UI/SpaceWarpConsoleLogListener.cs b/SpaceWarp/UI/SpaceWarpConsoleLogListener.cs index 57d7490d..be6d50cf 100644 --- a/SpaceWarp/UI/SpaceWarpConsoleLogListener.cs +++ b/SpaceWarp/UI/SpaceWarpConsoleLogListener.cs @@ -1,24 +1,37 @@ +using System; using System.Collections.Generic; -using BepInEx.Bootstrap; using BepInEx.Logging; -using UnityEngine; namespace SpaceWarp.UI; public sealed class SpaceWarpConsoleLogListener : ILogListener { + private readonly SpaceWarpPlugin _spaceWarpPluginInstance; + internal static readonly List DebugMessages = new(); + public SpaceWarpConsoleLogListener(SpaceWarpPlugin spaceWarpPluginInstance) + { + _spaceWarpPluginInstance = spaceWarpPluginInstance; + } + public void LogEvent(object sender, LogEventArgs eventArgs) { - DebugMessages.Add(BuildMessage(eventArgs.Level, eventArgs.Data, eventArgs.Source)); + DebugMessages.Add(BuildMessage(TimestampMessage(), eventArgs.Level, eventArgs.Data, eventArgs.Source)); + } + + private string TimestampMessage() + { + return _spaceWarpPluginInstance.configShowTimeStamps.Value + ? "[" + DateTime.Now.ToString(_spaceWarpPluginInstance.configTimeStampFormat.Value) + "] " + : ""; } - private static string BuildMessage(LogLevel level, object data, ILogSource source) + private static string BuildMessage(string timestamp, LogLevel level, object data, ILogSource source) { return level == LogLevel.None - ? $"[{(object) source.SourceName}] {data}" - : $"[{(object) level} : {(object) source.SourceName}] {data}"; + ? $"{timestamp}[{source.SourceName}] {data}" + : $"{timestamp}[{level} : {source.SourceName}] {data}"; } public void Dispose() From 63d70f541dbb6ce74b5127962eb276b521814510 Mon Sep 17 00:00:00 2001 From: Eivind Date: Sat, 4 Mar 2023 22:48:57 +0100 Subject: [PATCH 25/29] Default value should be true --- SpaceWarp/SpaceWarpPlugin.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SpaceWarp/SpaceWarpPlugin.cs b/SpaceWarp/SpaceWarpPlugin.cs index c34c2cc5..6434e772 100644 --- a/SpaceWarp/SpaceWarpPlugin.cs +++ b/SpaceWarp/SpaceWarpPlugin.cs @@ -49,7 +49,7 @@ public void Awake() "The color for log messages that have the level: All"); configShowConsoleButton = Config.Bind("Debug Console", "Show Console Button", false, "Show console button in app.bar, requires restart"); - configShowTimeStamps = Config.Bind("Debug Console", "Show Timestamps", false, + configShowTimeStamps = Config.Bind("Debug Console", "Show Timestamps", true, "Show time stamps in debug console"); configTimeStampFormat = Config.Bind("Debug Console", "Timestamp Format", "HH:mm:ss.fff", "The format for the timestamps in the debug console."); @@ -79,7 +79,7 @@ private void InitializeUI() GameObject modUIObject = new("Space Warp Mod UI"); modUIObject.Persist(); - modUIObject.transform.SetParent(this.transform); + modUIObject.transform.SetParent(transform); SpaceWarpManager.ModListUI = modUIObject.AddComponent(); modUIObject.SetActive(true); From a3f7aaeeb7085493680f8a1f40cfc0b8d7d1bdb4 Mon Sep 17 00:00:00 2001 From: Ewy Date: Sat, 4 Mar 2023 23:06:57 +0100 Subject: [PATCH 26/29] Basic implementation of a log janitor so we don't run out of memory --- SpaceWarp/SpaceWarpPlugin.cs | 3 +++ SpaceWarp/UI/SpaceWarpConsole.cs | 3 +-- SpaceWarp/UI/SpaceWarpConsoleLogListener.cs | 10 ++++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/SpaceWarp/SpaceWarpPlugin.cs b/SpaceWarp/SpaceWarpPlugin.cs index 6434e772..874b48d5 100644 --- a/SpaceWarp/SpaceWarpPlugin.cs +++ b/SpaceWarp/SpaceWarpPlugin.cs @@ -30,6 +30,7 @@ public sealed class SpaceWarpPlugin : BaseSpaceWarpPlugin internal ConfigEntry configShowConsoleButton; internal ConfigEntry configShowTimeStamps; internal ConfigEntry configTimeStampFormat; + internal ConfigEntry configDebugMessageLimit; internal new ManualLogSource Logger => base.Logger; @@ -53,6 +54,8 @@ public void Awake() "Show time stamps in debug console"); configTimeStampFormat = Config.Bind("Debug Console", "Timestamp Format", "HH:mm:ss.fff", "The format for the timestamps in the debug console."); + configDebugMessageLimit = Config.Bind("Debug Console", "Message Limit", 1000, + "The maximum number of messages to keep in the debug console."); BepInEx.Logging.Logger.Listeners.Add(new SpaceWarpConsoleLogListener(this)); diff --git a/SpaceWarp/UI/SpaceWarpConsole.cs b/SpaceWarp/UI/SpaceWarpConsole.cs index ea7dee8b..8e5c4bfc 100644 --- a/SpaceWarp/UI/SpaceWarpConsole.cs +++ b/SpaceWarp/UI/SpaceWarpConsole.cs @@ -1,5 +1,4 @@ -using System; -using BepInEx.Bootstrap; +using BepInEx.Bootstrap; using BepInEx.Logging; using KSP.Game; using KSP.UI.Binding; diff --git a/SpaceWarp/UI/SpaceWarpConsoleLogListener.cs b/SpaceWarp/UI/SpaceWarpConsoleLogListener.cs index be6d50cf..44cbfbb3 100644 --- a/SpaceWarp/UI/SpaceWarpConsoleLogListener.cs +++ b/SpaceWarp/UI/SpaceWarpConsoleLogListener.cs @@ -18,6 +18,16 @@ public SpaceWarpConsoleLogListener(SpaceWarpPlugin spaceWarpPluginInstance) public void LogEvent(object sender, LogEventArgs eventArgs) { DebugMessages.Add(BuildMessage(TimestampMessage(), eventArgs.Level, eventArgs.Data, eventArgs.Source)); + LogMessageJanitor(); + } + + private void LogMessageJanitor() + { + var configDebugMessageLimit = _spaceWarpPluginInstance.configDebugMessageLimit.Value; + if (DebugMessages.Count > configDebugMessageLimit) + { + DebugMessages.RemoveRange(0, DebugMessages.Count - configDebugMessageLimit); + } } private string TimestampMessage() From 0cd2a3baf66b87f529b82fa938c894d7fb31a1dc Mon Sep 17 00:00:00 2001 From: Lawrence <30965946+Halbann@users.noreply.github.com> Date: Sun, 5 Mar 2023 14:28:10 +0000 Subject: [PATCH 27/29] OAB App bar support --- SpaceWarp/API/UI/Appbar/Appbar.cs | 34 ++- SpaceWarp/Backend/UI/Appbar/AppbarBackend.cs | 210 +++++++++++++++++- SpaceWarp/SpaceWarpManager.cs | 1 + .../assets/images/oabTrayButton.png | Bin 0 -> 257 bytes 4 files changed, 237 insertions(+), 8 deletions(-) create mode 100644 SpaceWarpBuildTemplate/assets/images/oabTrayButton.png diff --git a/SpaceWarp/API/UI/Appbar/Appbar.cs b/SpaceWarp/API/UI/Appbar/Appbar.cs index 1b09a0e5..2176d507 100644 --- a/SpaceWarp/API/UI/Appbar/Appbar.cs +++ b/SpaceWarp/API/UI/Appbar/Appbar.cs @@ -10,6 +10,7 @@ namespace SpaceWarp.API.UI.Appbar; public static class Appbar { private static readonly List<(string text, Sprite icon, string ID, Action action)> ButtonsToBeLoaded = new(); + private static readonly List<(string text, Sprite icon, string ID, Action action)> OABButtonsToBeLoaded = new(); /// /// Register a appbar menu for the game @@ -71,6 +72,30 @@ public static void RegisterAppButton(string text, string id, Texture2D icon, Act RegisterAppButton(text, id, GetAppBarIconFromTexture(icon), func); } + /// + /// Register a button on the OAB AppBar + /// + /// The text in the appbar menu + /// A unique id for the appbar menu eg: "BTN-ExampleOAB" + /// A Sprite for the icon in the appbar + /// The function to be called when this button is clicked + public static void RegisterOABAppButton(string text, string id, Sprite icon, Action func) + { + OABButtonsToBeLoaded.Add((text, icon, id, func)); + } + + /// + /// Register a button on the OAB AppBar + /// + /// The text in the appbar menu + /// A unique id for the appbar menu eg: "BTN-ExampleOAB" + /// A Texture2D for the icon in the appbar + /// The function to be called when this button is clicked + public static void RegisterOABAppButton(string text, string id, Texture2D icon, Action func) + { + RegisterOABAppButton(text, id, GetAppBarIconFromTexture(icon), func); + } + /// /// Convert a Texture2D to a Sprite @@ -87,7 +112,6 @@ public static Sprite GetAppBarIconFromTexture(Texture2D texture, int width=0, in return Sprite.Create(texture, new Rect(0, 0, width, height), new Vector2(0.5f, 0.5f)); } - internal static void LoadAllButtons() { foreach (var button in ButtonsToBeLoaded) @@ -95,4 +119,12 @@ internal static void LoadAllButtons() AppbarBackend.AddButton(button.text, button.icon, button.ID, button.action); } } + + internal static void LoadOABButtons() + { + foreach (var button in OABButtonsToBeLoaded) + { + AppbarBackend.AddOABButton(button.text, button.icon, button.ID, button.action); + } + } } diff --git a/SpaceWarp/Backend/UI/Appbar/AppbarBackend.cs b/SpaceWarp/Backend/UI/Appbar/AppbarBackend.cs index 8ab07545..63dec4a1 100644 --- a/SpaceWarp/Backend/UI/Appbar/AppbarBackend.cs +++ b/SpaceWarp/Backend/UI/Appbar/AppbarBackend.cs @@ -3,14 +3,19 @@ using System; using System.Collections; +using System.Reflection; using BepInEx.Logging; using HarmonyLib; using I2.Loc; +using KSP; using KSP.Api; using KSP.Api.CoreTypes; +using KSP.Game; +using KSP.OAB; using KSP.Sim.impl; using KSP.UI.Binding; using KSP.UI.Flight; +using SpaceWarp.API.Assets; using TMPro; using UnityEngine; using UnityEngine.Events; @@ -23,7 +28,9 @@ internal static class AppbarBackend { private static readonly ManualLogSource _logger = BepInEx.Logging.Logger.CreateLogSource("ToolbarBackend"); - + + #region Flight App Bar + public static GameObject AddButton(string buttonText, Sprite buttonIcon, string buttonId, Action function) { // Find the resource manager button and "others" group. @@ -74,28 +81,208 @@ public static GameObject AddButton(string buttonText, Sprite buttonIcon, string return appButton; } + #endregion + + #region OAB App Bar + + private static GameObject _oabTray; + private static GameObject OABTray + { + get + { + if (_oabTray == null) + return _oabTray = CreateOABTray(); + + return _oabTray; + } + set => _oabTray = value; + } + + private static Property _oabState; + + private static GameObject CreateOABTray() + { + _logger.LogInfo("Creating OAB app button tray..."); + + // Find the OAB app bar and the kerbal manager button. + + // Say the magic words... + GameObject oabAppBar = GameObject.Find("OAB(Clone)/HUDSpawner/HUD/widget_SideBar/widget_sidebarNav"); + GameObject kerbalManager = oabAppBar?.GetChild("button_kerbal-manager"); + + if (oabAppBar == null || kerbalManager == null) + { + _logger.LogError("Couldn't find OAB appbar."); + return null; + } + + // Clone the kerbal manager button. + GameObject oabTrayButton = Object.Instantiate(kerbalManager, oabAppBar.transform); + oabTrayButton.name = "OAB-AppTrayButton"; + + // Set the initial state of the button. + UIValue_WriteBool_Toggle toggle = oabTrayButton.GetComponent(); + Property state = new Property(false); + toggle.BindValue(state); + _oabState = state; + + // Set the button icon. + Image image = oabTrayButton.GetComponent(); + Texture2D tex = AssetManager.GetAsset("spacewarp/images/oabTrayButton.png"); + tex.filterMode = FilterMode.Point; + image.sprite = Sprite.Create(tex, new Rect(0, 0, 32, 32), new Vector2(0.5f, 0.5f)); + + // Delete the old tooltip. + var tooltip = oabTrayButton.GetComponent(); + Object.DestroyImmediate(tooltip); + + // Create a new tooltip holder, having it on a separate game object prevents + // the tooltip from showing up on children of the tray button. + GameObject tooltipObject = new GameObject("OAB-AppTrayTooltip"); + + tooltipObject.AddComponent().CopyFrom(oabTrayButton.GetComponent()); + tooltipObject.transform.SetParent(oabTrayButton.transform); + tooltipObject.transform.localPosition = Vector3.zero; + + // ObjectAssemblyBuilderTooltipDisplay seems to require an image to work. + Image tooltipImage = tooltipObject.AddComponent(); + tooltipImage.color = new Color(0, 0, 0, 0); + + // Create the tooltip itself. + tooltip = tooltipObject.AddComponent(); + tooltip.GetType().GetField("tooltipText", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(tooltip, "App Tray"); + + // Clone the tray from the flight UI. + GameObject trayButton = GameManager.Instance.Game.UI.GetPopupCanvas().gameObject.GetChild("BTN-App-Tray"); + GameObject oabTray = Object.Instantiate(trayButton.GetChild("appbar-others-group"), oabTrayButton.transform); + oabTray.name = "OAB-AppTray"; + + // Bind the tray state with our button. + oabTray.GetComponent().BindValue(state); + + // Change the background colour. + var oabAppBarBG = oabAppBar.GetChild("BG-AppBar").GetComponent(); + oabTray.GetComponent().color = oabAppBarBG.color; + + // Delete the existing buttons in the tray. + for (int i = 0; i < oabTray.transform.childCount; i++) + { + var child = oabTray.transform.GetChild(i); + + if (child.name.Contains("ELE-border")) + continue; + + Object.Destroy(child.gameObject); + } + + _logger.LogInfo("Created OAB app button tray."); + + return oabTray; + } + + public static GameObject AddOABButton(string buttonText, Sprite buttonIcon, string buttonId, Action function) + { + _logger.LogInfo($"Adding OAB app bar button: {buttonId}."); + + // Find the resource manager button. + GameObject list = GameObject.Find("GameManager/Default Game Instance(Clone)/UI Manager(Clone)/Popup Canvas/Container/ButtonBar/BTN-App-Tray/appbar-others-group"); + GameObject resourceManger = list?.GetChild("BTN-Resource-Manager"); + + if (resourceManger == null) + { + _logger.LogError("Couldn't find the appbar."); + return null; + } + + // Clone the resource manager button. + GameObject appButton = Object.Instantiate(resourceManger, OABTray.transform); + appButton.name = buttonId; + + // Change the text. + TextMeshProUGUI text = appButton.GetChild("Content").GetChild("TXT-title").GetComponent(); + text.text = buttonText; + + Localize localizer = text.gameObject.GetComponent(); + if (localizer) + Object.Destroy(localizer); + + // Change the icon. + GameObject icon = appButton.GetChild("Content").GetChild("GRP-icon"); + Image image = icon.GetChild("ICO-asset").GetComponent(); + image.sprite = buttonIcon; + + // Add our function call to the toggle. + ToggleExtended utoggle = appButton.GetComponent(); + utoggle.onValueChanged.AddListener(state => function(state)); + + // Set the initial state of the button. + UIValue_WriteBool_Toggle toggle = appButton.GetComponent(); + toggle.BindValue(new Property(false)); + + // Bind the action to close the tray after pressing the button. + Action action = () => SetOABTrayState(false); + appButton.GetComponent().BindAction(new DelegateAction(action)); + + _logger.LogInfo($"Added appbar button: {buttonId}"); + + return appButton; + } + + public static void SetOABTrayState(bool state) + { + if (_oabTray == null) + return; + + _oabState.SetValue(state); + } + + #endregion + + public static readonly UnityEvent AppBarOABSubscriber = new(); public static readonly UnityEvent AppBarInFlightSubscriber = new(); - internal static void SubscriberSchedulePing() + internal static void SubscriberSchedulePing(AppbarEvent type) { + _logger.LogInfo($"App bar creation event started: {type}"); + GameObject gameObject = new GameObject(); - gameObject.AddComponent(); + ToolbarBackendObject waiterObject = gameObject.AddComponent(); + + switch (type) + { + case AppbarEvent.Flight: + waiterObject.creationEvent = AppBarInFlightSubscriber; + break; + case AppbarEvent.OAB: + waiterObject.creationEvent = AppBarOABSubscriber; + break; + default: + break; + } + gameObject.SetActive(true); } + + internal enum AppbarEvent + { + Flight, + OAB + } } internal class ToolbarBackendObject : KerbalBehavior { + internal UnityEvent creationEvent; + public new void Start() { - StartCoroutine(awaiter()); } private IEnumerator awaiter() { yield return new WaitForSeconds(1); - AppbarBackend.AppBarInFlightSubscriber.Invoke(); + creationEvent.Invoke(); Destroy(this); } } @@ -105,5 +292,14 @@ private IEnumerator awaiter() [HarmonyPatch("Start")] internal class ToolbarBackendAppBarPatcher { - public static void Postfix(UIFlightHud __instance) => AppbarBackend.SubscriberSchedulePing(); -} \ No newline at end of file + public static void Postfix(UIFlightHud __instance) => + AppbarBackend.SubscriberSchedulePing(AppbarBackend.AppbarEvent.Flight); +} + +[HarmonyPatch(typeof(OABSideBar))] +[HarmonyPatch("Start")] +internal class ToolbarBackendOABSideBarPatcher +{ + public static void Postfix(OABSideBar __instance) => + AppbarBackend.SubscriberSchedulePing(AppbarBackend.AppbarEvent.OAB); +} diff --git a/SpaceWarp/SpaceWarpManager.cs b/SpaceWarp/SpaceWarpManager.cs index 739e8590..532ffed2 100644 --- a/SpaceWarp/SpaceWarpManager.cs +++ b/SpaceWarp/SpaceWarpManager.cs @@ -62,6 +62,7 @@ public static void Initialize(SpaceWarpPlugin spaceWarpPlugin) SpaceWarpFolder = Path.GetDirectoryName(spaceWarpPlugin.Info.Location); AppbarBackend.AppBarInFlightSubscriber.AddListener(Appbar.LoadAllButtons); + AppbarBackend.AppBarOABSubscriber.AddListener(Appbar.LoadOABButtons); } public static ModListUI ModListUI { get; internal set; } diff --git a/SpaceWarpBuildTemplate/assets/images/oabTrayButton.png b/SpaceWarpBuildTemplate/assets/images/oabTrayButton.png new file mode 100644 index 0000000000000000000000000000000000000000..ca651e7789eb4c7756091cd2db2b1e46079d50f3 GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCils0(?ST|Ns9FWQHEPTnD6>N`m}?|1&(@Zr}yvaTa()7BevL9R^{> Date: Sun, 5 Mar 2023 16:28:56 +0100 Subject: [PATCH 28/29] Create CONTRIBUTING.md --- CONTRIBUTING.md | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..99d4bf1d --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,47 @@ +# Contributing to Space Warp + +Thank you for your interest in contributing to Space Warp! This document outlines the guidelines for contributing to this project. + +## Getting Started + +To get started, you will need to have [Git](https://git-scm.com/) and a legit copy of [Kerbal Space Program 2](https://www.kerbalspaceprogram.com/games-kerbal-space-program-2) installed on your machine. You will also need to have a GitHub account. + +## Contributing to Issues + +We welcome contributions from the community to help us improve Space Warp. You can contribute by submitting bug reports, feature requests, or code changes. + +### Issue Tracker + +All contributions to Space Warp are tracked on the [GitHub issue tracker](https://github.com/SpaceWarpDev/SpaceWarp/issues). Before you start working on a feature or issue, please check the issue tracker to make sure that it has not already been reported. + +### Reporting Bugs + +If you encounter a bug while using Space Warp, please report it on the issue tracker. When submitting a bug report, please include as much information as possible, including the steps to reproduce the bug and any error messages that you received. + +### Feature Requests + +If you have an idea for a new feature or improvement to Space Warp, please submit it on the issue tracker. We encourage you to discuss your idea with the community before submitting a feature request. + +### Contributing Code + +If you would like to contribute code to Space Warp, please follow these guidelines: + +1. Create a fork of the Space Warp repository. +2. Clone your fork onto your local machine. +3. Create a new branch for your changes. +4. Make your changes on the new branch. +5. Test your changes to make sure they work as expected. +6. Commit your changes and push them to your fork. +7. Create a pull request on the main Space Warp repository. + +### Good First Issues + +We mark some issues as "good first issue" to help new contributors get started with the project. These issues are usually relatively simple and don't require a lot of experience with the project. + +## Code of Conduct + +We expect all contributors to follow our [Code of Conduct](CODE_OF_CONDUCT.md). Please review this document before contributing to Space Warp. + +## License + +Space Warp is licensed under the [MIT License](LICENSE). By contributing to this project, you agree to license your contributions under the same license. From fbfeabbd1f2607f71272f5c34f2c473b53f329b5 Mon Sep 17 00:00:00 2001 From: Lawrence <30965946+Halbann@users.noreply.github.com> Date: Sun, 5 Mar 2023 15:31:49 +0000 Subject: [PATCH 29/29] Fixed OAB timing and flight tray closing --- SpaceWarp/Backend/UI/Appbar/AppbarBackend.cs | 36 ++++++++++++++++---- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/SpaceWarp/Backend/UI/Appbar/AppbarBackend.cs b/SpaceWarp/Backend/UI/Appbar/AppbarBackend.cs index 63dec4a1..a9e60215 100644 --- a/SpaceWarp/Backend/UI/Appbar/AppbarBackend.cs +++ b/SpaceWarp/Backend/UI/Appbar/AppbarBackend.cs @@ -20,6 +20,7 @@ using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; +using static SpaceWarp.Backend.UI.Appbar.AppbarBackend; using Object = UnityEngine.Object; namespace SpaceWarp.Backend.UI.Appbar; @@ -31,13 +32,15 @@ internal static class AppbarBackend #region Flight App Bar + private static UIValue_WriteBool_Toggle trayState; + public static GameObject AddButton(string buttonText, Sprite buttonIcon, string buttonId, Action function) { // Find the resource manager button and "others" group. // Say the magic words... GameObject list = GameObject.Find("GameManager/Default Game Instance(Clone)/UI Manager(Clone)/Popup Canvas/Container/ButtonBar/BTN-App-Tray/appbar-others-group"); - GameObject resourceManger = list != null ? list.GetChild("BTN-Resource-Manager") : null; + GameObject resourceManger = list?.GetChild("BTN-Resource-Manager"); if (list == null || resourceManger == null) { @@ -45,6 +48,8 @@ public static GameObject AddButton(string buttonText, Sprite buttonIcon, string return null; } + trayState = list.transform.parent.gameObject.GetComponent(); + // Clone the resource manager button. GameObject appButton = Object.Instantiate(resourceManger, list.transform); appButton.name = buttonId; @@ -67,20 +72,25 @@ public static GameObject AddButton(string buttonText, Sprite buttonIcon, string // Add our function call to the toggle. ToggleExtended utoggle = appButton.GetComponent(); utoggle.onValueChanged.AddListener(state => function(state)); + utoggle.onValueChanged.AddListener(state => SetTrayState(false)); // Set the initial state of the button. UIValue_WriteBool_Toggle toggle = appButton.GetComponent(); toggle.BindValue(new Property(false)); - // Bind the action to close the tray after pressing the button. - IAction action = resourceManger.GetComponent().Action; - appButton.GetComponent().BindAction(action); - _logger.LogInfo($"Added appbar button: {buttonId}"); return appButton; } + public static void SetTrayState(bool state) + { + if (trayState == null) + return; + + trayState.SetValue(state); + } + #endregion #region OAB App Bar @@ -260,6 +270,7 @@ internal static void SubscriberSchedulePing(AppbarEvent type) break; } + waiterObject.type = type; gameObject.SetActive(true); } @@ -273,6 +284,7 @@ internal enum AppbarEvent internal class ToolbarBackendObject : KerbalBehavior { internal UnityEvent creationEvent; + internal AppbarEvent type; public new void Start() { @@ -281,7 +293,19 @@ internal class ToolbarBackendObject : KerbalBehavior private IEnumerator awaiter() { - yield return new WaitForSeconds(1); + switch (type) + { + case AppbarEvent.Flight: + yield return new WaitForSeconds(1); + break; + case AppbarEvent.OAB: + yield return new WaitForFixedUpdate(); + break; + default: + yield return new WaitForSeconds(1); + break; + } + creationEvent.Invoke(); Destroy(this); }