NorbiPeti
5602ef9268
- Fixed toggling time running mode - Fixed closing popups - Added support for pressing the buttons on a popup - Added error handling to Main.Init() - Automatically closing the beta message in the test plugin - Fixed Game.EnterGame() causing a crash in the game
140 lines
5.4 KiB
C#
140 lines
5.4 KiB
C#
using System;
|
|
using System.Reflection;
|
|
using HarmonyLib;
|
|
|
|
using RobocraftX;
|
|
using RobocraftX.Services;
|
|
using Svelto.Context;
|
|
|
|
using TechbloxModdingAPI.App;
|
|
using TechbloxModdingAPI.Blocks;
|
|
using TechbloxModdingAPI.Tasks;
|
|
using TechbloxModdingAPI.Utility;
|
|
|
|
namespace TechbloxModdingAPI
|
|
{
|
|
/// <summary>
|
|
/// The main class of the TechbloxModdingAPI.
|
|
/// Use this to initialize the API before calling it.
|
|
/// </summary>
|
|
public static class Main
|
|
{
|
|
private static Harmony harmony;
|
|
|
|
public static bool IsInitialized {
|
|
get { return harmony != null; }
|
|
}
|
|
|
|
private static int referenceCount = 0;
|
|
|
|
/// <summary>
|
|
/// Initializes the TechbloxModdingAPI.
|
|
/// Call this as soon as possible after Techblox starts up.
|
|
/// Ideally, this should be called from your main Plugin class's OnApplicationStart() method.
|
|
/// </summary>
|
|
public static void Init()
|
|
{
|
|
referenceCount++;
|
|
if (referenceCount > 1) { return; }
|
|
if (IsInitialized)
|
|
{
|
|
Logging.LogWarning("TechbloxModdingAPI.Main.Init() called but API is already initialized!");
|
|
return;
|
|
}
|
|
Logging.MetaDebugLog($"Patching Techblox");
|
|
var currentAssembly = Assembly.GetExecutingAssembly();
|
|
harmony = new Harmony(currentAssembly.GetName().Name);
|
|
try
|
|
{
|
|
harmony.PatchAll(currentAssembly);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
HandleError(e, "Failed to patch Techblox. Attempting to patch to display error...", OnPatchError);
|
|
return;
|
|
}
|
|
|
|
try
|
|
{
|
|
// init utility
|
|
Logging.MetaDebugLog($"Initializing Utility");
|
|
Utility.GameState.Init();
|
|
// init block implementors
|
|
Logging.MetaDebugLog($"Initializing Blocks");
|
|
// init input
|
|
Input.FakeInput.Init();
|
|
// init object-oriented classes
|
|
Player.Init();
|
|
Block.Init();
|
|
BlockGroup.Init();
|
|
Wire.Init();
|
|
// init client
|
|
Logging.MetaDebugLog($"Initializing Client");
|
|
Client.Init();
|
|
Game.Init();
|
|
// init UI
|
|
Logging.MetaDebugLog($"Initializing UI");
|
|
Interface.IMGUI.Constants.Init();
|
|
Interface.IMGUI.IMGUIManager.Init();
|
|
// init anti-anticheat
|
|
Logging.MetaDebugLog("Initializing anti-anticheat");
|
|
AntiAntiCheatPatch.Init(harmony);
|
|
Logging.MetaLog($"{currentAssembly.GetName().Name} v{currentAssembly.GetName().Version} initialized");
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
HandleError(e, "Failed to initialize the API! Attempting to patch to display error...", OnInitError);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Shuts down & cleans up the TechbloxModdingAPI.
|
|
/// Call this as late as possible before Techblox quits.
|
|
/// Ideally, this should be called from your main Plugin class's OnApplicationQuit() method.
|
|
/// </summary>
|
|
public static void Shutdown()
|
|
{
|
|
if (referenceCount > 0) { referenceCount--; }
|
|
if (referenceCount == 0)
|
|
{
|
|
if (!IsInitialized)
|
|
{
|
|
Logging.LogWarning("TechbloxModdingAPI.Main.Shutdown() called but API is not initialized!");
|
|
return;
|
|
}
|
|
Scheduler.Dispose();
|
|
var currentAssembly = Assembly.GetExecutingAssembly();
|
|
harmony.UnpatchAll(currentAssembly.GetName().Name);
|
|
harmony = null;
|
|
Logging.MetaLog($"{currentAssembly.GetName().Name} v{currentAssembly.GetName().Version} shutdown");
|
|
}
|
|
}
|
|
|
|
private static void OnPatchError()
|
|
{
|
|
ErrorBuilder.DisplayMustQuitError("Failed to patch Techblox!\n" +
|
|
"Make sure you're using the latest version of TechbloxModdingAPI or disable mods if the API isn't released yet.");
|
|
}
|
|
|
|
private static void OnInitError()
|
|
{
|
|
ErrorBuilder.DisplayMustQuitError("Failed to initialize the modding API!\n" +
|
|
"Make sure you're using the latest version. If you are, please report the error.");
|
|
}
|
|
|
|
/// <summary>
|
|
/// Handles an init error. Logs the exception, a log message, and allows displaying an error in-game.
|
|
/// </summary>
|
|
/// <param name="e">The exception</param>
|
|
/// <param name="logMsg">The log message</param>
|
|
/// <param name="onInit">The action to run when the game is ready to display error messages</param>
|
|
private static void HandleError(Exception e, string logMsg, Action onInit)
|
|
{ //Can't use ErrorBuilder or Logging.LogException (which eventually uses ErrorBuilder) yet
|
|
Logging.Log(e.ToString());
|
|
Logging.LogWarning(logMsg);
|
|
harmony.Patch(AccessTools.Method(typeof(FullGameCompositionRoot), "OnContextInitialized")
|
|
.MakeGenericMethod(typeof(UnityContext<FullGameCompositionRoot>)),
|
|
new HarmonyMethod(onInit.Method)); //Can't use lambdas here :(
|
|
}
|
|
}
|
|
}
|