NorbiPeti
1c5ce37fce
Added API for adding more information on the debug display (not object-oriented yet) Removed the setter for block type to ensure stability Made the block API return defaults if the block no longer exists Added property to check if the block exists Made a struct for the block's color property Added missing block IDs
102 lines
4.3 KiB
C#
102 lines
4.3 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Reflection;
|
|
|
|
using HarmonyLib;
|
|
|
|
using GamecraftModdingAPI.Utility;
|
|
using GamecraftModdingAPI.Events;
|
|
using GamecraftModdingAPI.Players;
|
|
using GamecraftModdingAPI.Tasks;
|
|
using uREPL;
|
|
|
|
namespace GamecraftModdingAPI
|
|
{
|
|
/// <summary>
|
|
/// The main class of the GamecraftModdingAPI.
|
|
/// 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 GamecraftModdingAPI.
|
|
/// Call this as soon as possible after Gamecraft 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("GamecraftModdingAPI.Main.Init() called but API is already initialized!");
|
|
return;
|
|
}
|
|
Logging.MetaDebugLog($"Patching Gamecraft");
|
|
var currentAssembly = Assembly.GetExecutingAssembly();
|
|
harmony = new Harmony(currentAssembly.GetName().Name);
|
|
harmony.PatchAll(currentAssembly);
|
|
// init utility
|
|
Logging.MetaDebugLog($"Initializing Utility");
|
|
Utility.GameState.Init();
|
|
Utility.VersionTracking.Init();
|
|
// create default event emitters
|
|
Logging.MetaDebugLog($"Initializing Events");
|
|
EventManager.AddEventEmitter(new SimpleEventEmitterEngine(EventType.ApplicationInitialized, "GamecraftModdingAPIApplicationInitializedEventEmitter", false));
|
|
EventManager.AddEventEmitter(new SimpleEventEmitterEngine(EventType.Menu, "GamecraftModdingAPIMenuActivatedEventEmitter", false));
|
|
EventManager.AddEventEmitter(new SimpleEventEmitterEngine(EventType.MenuSwitchedTo, "GamecraftModdingAPIMenuSwitchedToEventEmitter", false));
|
|
EventManager.AddEventEmitter(new SimpleEventEmitterEngine(EventType.Game, "GamecraftModdingAPIGameActivatedEventEmitter", false));
|
|
EventManager.AddEventEmitter(new SimpleEventEmitterEngine(EventType.GameReloaded, "GamecraftModdingAPIGameReloadedEventEmitter", false));
|
|
EventManager.AddEventEmitter(new SimpleEventEmitterEngine(EventType.GameSwitchedTo, "GamecraftModdingAPIGameSwitchedToEventEmitter", false));
|
|
EventManager.AddEventEmitter(GameHostTransitionDeterministicGroupEnginePatch.buildEngine);
|
|
EventManager.AddEventEmitter(GameHostTransitionDeterministicGroupEnginePatch.simEngine);
|
|
// init block implementors
|
|
Logging.MetaDebugLog($"Initializing Blocks");
|
|
Blocks.Signals.Init();
|
|
Blocks.Tweakable.Init();
|
|
// init inventory
|
|
Inventory.Hotbar.Init();
|
|
// init input
|
|
Input.FakeInput.Init();
|
|
// init object-oriented classes
|
|
Player.Init();
|
|
Block.Init();
|
|
DebugInterface.Init();
|
|
Logging.MetaLog($"{currentAssembly.GetName().Name} v{currentAssembly.GetName().Version} initialized");
|
|
}
|
|
|
|
/// <summary>
|
|
/// Shuts down & cleans up the GamecraftModdingAPI.
|
|
/// Call this as late as possible before Gamecraft 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("GamecraftModdingAPI.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");
|
|
}
|
|
}
|
|
}
|
|
}
|