Files
barotrauma-localmods/Quick Interactions/CSharp/Shared/Mod.cs

139 lines
3.6 KiB
C#

using System;
using System.Reflection;
using System.Diagnostics;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.IO;
using Barotrauma;
using HarmonyLib;
using Microsoft.Xna.Framework;
using QIDependencyInjection;
#if CLIENT
using QICrabUI;
#endif
namespace QuickInteractions
{
public class PatchClassAttribute : System.Attribute { }
public partial class Mod : IAssemblyPlugin
{
public static string Name = "Quick Interactions";
public static Harmony Harmony = new Harmony("quick.interactions");
[EntryPoint] public static Mod Instance { get; set; }
[Singleton] public Debugger Debugger { get; set; }
[Singleton] public Logger Logger { get; set; }
[Singleton] public LogicLayer Logic { get; set; }
[Singleton] public Debouncer Debouncer { get; set; }
[Dependency] public GameStageTracker GameStageTracker { get; set; }
public ModPaths Paths { get; set; }
public bool Disposed { get; set; }
public event Action OnPluginLoad;
public event Action OnPluginUnload;
public ServiceCollection Services = new ServiceCollection() { Debug = false };
public void SetupDependencies()
{
}
public void Initialize()
{
Stopwatch sw1 = Stopwatch.StartNew();
Instance = this;
AddCommands();
Paths = new ModPaths(Name);
sw1.Stop();
Stopwatch sw2 = Stopwatch.StartNew();
#if CLIENT
//CUI.Debug = Paths.IsInLocalMods;
CUI.ModDir = Paths.ModDir;
CUI.AssetsPath = Paths.AssetsFolder;
CUI.HookIdentifier = Name;
//CUI.UseCursedPatches = true;
CUI.UseLua = false;
CUI.Initialize();
#endif
sw2.Stop();
Stopwatch sw3 = Stopwatch.StartNew();
SetupDependencies();
Services.InjectEverything();
sw3.Stop();
Debugger.Debug = Paths.IsInLocalMods;
//Debugger.CurrentLevel = DebugLevel.ButtonColor;
Debugger.Log($"AddCommands took {sw1.ElapsedMilliseconds}ms", DebugLevel.Performance);
Debugger.Log($"CUI.Initialize() took {sw2.ElapsedMilliseconds}ms", DebugLevel.Performance);
Debugger.Log($"InjectEverything took {sw3.ElapsedMilliseconds}ms", DebugLevel.Performance);
Stopwatch sw = Stopwatch.StartNew();
PatchAll();
Debugger.Log($"PatchAll took {sw.ElapsedMilliseconds}ms", DebugLevel.Performance);
#if CLIENT
InitializeClient();
#endif
sw.Restart();
OnPluginLoad?.Invoke();
if (Utils.RoundIsLive)
{
GameStageTracker.InvokeOnRoundStartOrInitialize();
}
Debugger.Log($"Hooks took {sw.ElapsedMilliseconds}ms", DebugLevel.Performance);
Logger.Info($"{Name} initialized");
}
public void PatchAll()
{
Assembly CallingAssembly = Assembly.GetCallingAssembly();
foreach (Type type in CallingAssembly.GetTypes())
{
if (Attribute.IsDefined(type, typeof(PatchClassAttribute)))
{
MethodInfo init = type.GetMethod("Initialize", AccessTools.all);
if (init != null)
{
init.Invoke(null, new object[] { });
}
}
}
}
public static void Log(object msg, Color? color = null)
{
color ??= Color.Cyan;
LuaCsLogger.LogMessage($"{msg ?? "null"}", color * 0.8f, color);
}
public void OnLoadCompleted() { }
public void PreInitPatching() { }
public void Dispose()
{
OnPluginUnload?.Invoke();
#if CLIENT
CUI.Dispose();
#endif
RemoveCommands();
Debouncer.Dispose();
Mod.Harmony.UnpatchAll(Mod.Harmony.Id);
Disposed = true;
//Instance = null;
}
}
}