Implement missing events
This commit is contained in:
parent
864efca755
commit
fae054b72b
23 changed files with 353 additions and 79 deletions
|
@ -16,7 +16,7 @@ using GamecraftModdingAPI.Utility;
|
||||||
namespace GamecraftModdingAPI.Commands
|
namespace GamecraftModdingAPI.Commands
|
||||||
{
|
{
|
||||||
[HarmonyPatch]
|
[HarmonyPatch]
|
||||||
class CommandPatch
|
public static class CommandPatch
|
||||||
{
|
{
|
||||||
public static void Prefix(UnityContext<FullGameCompositionRoot> contextHolder, EnginesRoot enginesRoot, World physicsWorld, Action reloadGame, MultiplayerInitParameters multiplayerParameters)
|
public static void Prefix(UnityContext<FullGameCompositionRoot> contextHolder, EnginesRoot enginesRoot, World physicsWorld, Action reloadGame, MultiplayerInitParameters multiplayerParameters)
|
||||||
{
|
{
|
||||||
|
|
|
@ -7,7 +7,7 @@ using Svelto.ECS;
|
||||||
|
|
||||||
namespace GamecraftModdingAPI.Commands
|
namespace GamecraftModdingAPI.Commands
|
||||||
{
|
{
|
||||||
interface ICustomCommandEngine : IEngine, IQueryingEntitiesEngine
|
public interface ICustomCommandEngine : IEngine, IQueryingEntitiesEngine
|
||||||
{
|
{
|
||||||
string Name { get; }
|
string Name { get; }
|
||||||
|
|
||||||
|
|
|
@ -6,14 +6,16 @@ using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace GamecraftModdingAPI.Events
|
namespace GamecraftModdingAPI.Events
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Built-in event types.
|
||||||
|
/// These are configured to fire when the API is initialized.
|
||||||
|
/// </summary>
|
||||||
public enum EventType
|
public enum EventType
|
||||||
{
|
{
|
||||||
ApplicationInitialized,
|
ApplicationInitialized,
|
||||||
MenuActivated,
|
Menu,
|
||||||
MenuDestroyed,
|
|
||||||
MenuSwitchedTo,
|
MenuSwitchedTo,
|
||||||
GameActivated,
|
Game,
|
||||||
GameDestroyed,
|
|
||||||
GameReloaded,
|
GameReloaded,
|
||||||
GameSwitchedTo
|
GameSwitchedTo
|
||||||
}
|
}
|
||||||
|
|
29
GamecraftModdingAPI/Events/GameActivatedPatch.cs
Normal file
29
GamecraftModdingAPI/Events/GameActivatedPatch.cs
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Harmony;
|
||||||
|
using RobocraftX;
|
||||||
|
using Svelto.ECS;
|
||||||
|
|
||||||
|
using GamecraftModdingAPI.Utility;
|
||||||
|
|
||||||
|
namespace GamecraftModdingAPI.Events
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Patch of RobocraftX.FullGameCompositionRoot.ActivateGame()
|
||||||
|
/// </summary>
|
||||||
|
[HarmonyPatch(typeof(FullGameCompositionRoot), "ActivateGame")]
|
||||||
|
class GameActivatedPatch
|
||||||
|
{
|
||||||
|
public static void Postfix(ref EnginesRoot ____mainGameEnginesRoot)
|
||||||
|
{
|
||||||
|
// A new EnginesRoot is always created when ActivateGame is called
|
||||||
|
// so all event emitters and handlers must be re-registered.
|
||||||
|
Manager.RegisterEngines(____mainGameEnginesRoot);
|
||||||
|
Logging.Log("Dispatching Game Activated event");
|
||||||
|
Manager.GetEventEmitter("GamecraftModdingAPIGameActivatedEventEmitter").Emit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
27
GamecraftModdingAPI/Events/GameReloadedPatch.cs
Normal file
27
GamecraftModdingAPI/Events/GameReloadedPatch.cs
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Harmony;
|
||||||
|
using RobocraftX;
|
||||||
|
using Svelto.ECS;
|
||||||
|
|
||||||
|
using GamecraftModdingAPI.Utility;
|
||||||
|
|
||||||
|
namespace GamecraftModdingAPI.Events
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Patch of RobocraftX.FullGameCompositionRoot.ReloadGame()
|
||||||
|
/// </summary>
|
||||||
|
[HarmonyPatch(typeof(FullGameCompositionRoot), "ReloadGame")]
|
||||||
|
class GameReloadedPatch
|
||||||
|
{
|
||||||
|
public static void Postfix()
|
||||||
|
{
|
||||||
|
// Event emitters and handlers should already be registered by GameActivatedPatch
|
||||||
|
Logging.Log("Dispatching Game Reloaded event");
|
||||||
|
Manager.GetEventEmitter("GamecraftModdingAPIGameReloadedEventEmitter").Emit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
27
GamecraftModdingAPI/Events/GameSwitchedToPatch.cs
Normal file
27
GamecraftModdingAPI/Events/GameSwitchedToPatch.cs
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Harmony;
|
||||||
|
using RobocraftX;
|
||||||
|
using Svelto.ECS;
|
||||||
|
|
||||||
|
using GamecraftModdingAPI.Utility;
|
||||||
|
|
||||||
|
namespace GamecraftModdingAPI.Events
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Patch of RobocraftX.FullGameCompositionRoot.SwitchToGame()
|
||||||
|
/// </summary>
|
||||||
|
[HarmonyPatch(typeof(FullGameCompositionRoot), "SwitchToGame")]
|
||||||
|
class GameSwitchedToPatch
|
||||||
|
{
|
||||||
|
public static void Postfix()
|
||||||
|
{
|
||||||
|
// Event emitters and handlers should already be registered by GameActivated event
|
||||||
|
Logging.Log("Dispatching Game Switched To event");
|
||||||
|
Manager.GetEventEmitter("GamecraftModdingAPIGameSwitchedToEventEmitter").Emit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -7,13 +7,36 @@ using Svelto.ECS;
|
||||||
|
|
||||||
namespace GamecraftModdingAPI.Events
|
namespace GamecraftModdingAPI.Events
|
||||||
{
|
{
|
||||||
public interface IEventEmitterEngine : IEngine, IQueryingEntitiesEngine
|
/// <summary>
|
||||||
|
/// Engine interface to create a ModEventEntityStruct in entitiesDB when Emit() is called.
|
||||||
|
/// </summary>
|
||||||
|
public interface IEventEmitterEngine : IEngine, IQueryingEntitiesEngine, IDisposable
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The name of the IEventEmitterEngine
|
||||||
|
/// </summary>
|
||||||
string Name { get; }
|
string Name { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The type of event emitted
|
||||||
|
/// </summary>
|
||||||
object type { get; }
|
object type { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Whether the emitter can be removed with Manager.RemoveEventEmitter(name)
|
||||||
|
/// </summary>
|
||||||
|
bool isRemovable { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The EntityFactory for the entitiesDB.
|
||||||
|
/// Use this to create a ModEventEntityStruct when Emit() is called.
|
||||||
|
/// </summary>
|
||||||
IEntityFactory Factory { set; }
|
IEntityFactory Factory { set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Emit the event so IEventHandlerEngines can handle it.
|
||||||
|
/// Call Emit() to trigger the IEventEmitterEngine's event.
|
||||||
|
/// </summary>
|
||||||
void Emit();
|
void Emit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,8 +8,14 @@ using Svelto.ECS.Internal;
|
||||||
|
|
||||||
namespace GamecraftModdingAPI.Events
|
namespace GamecraftModdingAPI.Events
|
||||||
{
|
{
|
||||||
public interface IEventHandlerEngine : IEngine, IQueryingEntitiesEngine, IReactOnAddAndRemove<ModEventEntityStruct>, IReactOnAddAndRemove
|
/// <summary>
|
||||||
|
/// Engine interface to handle ModEventEntityStruct events emitted by IEventEmitterEngines.
|
||||||
|
/// </summary>
|
||||||
|
public interface IEventHandlerEngine : IEngine, IQueryingEntitiesEngine, IReactOnAddAndRemove<ModEventEntityStruct>, IReactOnAddAndRemove, IDisposable
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The name of the IEventHandlerEngine
|
||||||
|
/// </summary>
|
||||||
string Name { get; }
|
string Name { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,9 +77,12 @@ namespace GamecraftModdingAPI.Events
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void RemoveEventEmitter(string name)
|
public static void RemoveEventEmitter(string name)
|
||||||
|
{
|
||||||
|
if (_eventEmitters[name].isRemovable)
|
||||||
{
|
{
|
||||||
_eventEmitters.Remove(name);
|
_eventEmitters.Remove(name);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static void RegisterEngines(EnginesRoot enginesRoot)
|
public static void RegisterEngines(EnginesRoot enginesRoot)
|
||||||
{
|
{
|
||||||
|
|
|
@ -11,8 +11,11 @@ using GamecraftModdingAPI.Utility;
|
||||||
|
|
||||||
namespace GamecraftModdingAPI.Events
|
namespace GamecraftModdingAPI.Events
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Patch of RobocraftX.FullGameCompositionRoot.ActivateMenu()
|
||||||
|
/// </summary>
|
||||||
[HarmonyPatch(typeof(FullGameCompositionRoot), "ActivateMenu")]
|
[HarmonyPatch(typeof(FullGameCompositionRoot), "ActivateMenu")]
|
||||||
class GameInitPatch
|
class MenuActivatedPatch
|
||||||
{
|
{
|
||||||
|
|
||||||
private static bool firstLoad = true;
|
private static bool firstLoad = true;
|
27
GamecraftModdingAPI/Events/MenuSwitchedToPatch.cs
Normal file
27
GamecraftModdingAPI/Events/MenuSwitchedToPatch.cs
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Harmony;
|
||||||
|
using RobocraftX;
|
||||||
|
using Svelto.ECS;
|
||||||
|
|
||||||
|
using GamecraftModdingAPI.Utility;
|
||||||
|
|
||||||
|
namespace GamecraftModdingAPI.Events
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Patch of RobocraftX.FullGameCompositionRoot.SwitchToMenu()
|
||||||
|
/// </summary>
|
||||||
|
[HarmonyPatch(typeof(FullGameCompositionRoot), "SwitchToMenu")]
|
||||||
|
class MenuSwitchedToPatch
|
||||||
|
{
|
||||||
|
public static void Postfix()
|
||||||
|
{
|
||||||
|
// Event emitters and handlers should already be registered by MenuActivated event
|
||||||
|
Logging.Log("Dispatching Menu Switched To event");
|
||||||
|
Manager.GetEventEmitter("GamecraftModdingAPIMenuSwitchedToEventEmitter").Emit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -7,6 +7,9 @@ using Svelto.ECS;
|
||||||
|
|
||||||
namespace GamecraftModdingAPI.Events
|
namespace GamecraftModdingAPI.Events
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// EntityDescriptor for creating ModEventEntityStructs
|
||||||
|
/// </summary>
|
||||||
public class ModEventEntityDescriptor : GenericEntityDescriptor<ModEventEntityStruct>
|
public class ModEventEntityDescriptor : GenericEntityDescriptor<ModEventEntityStruct>
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,10 +8,14 @@ using Svelto.ECS.Hybrid;
|
||||||
|
|
||||||
namespace GamecraftModdingAPI.Events
|
namespace GamecraftModdingAPI.Events
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The event entity struct
|
||||||
|
/// </summary>
|
||||||
public struct ModEventEntityStruct : IEntityStruct
|
public struct ModEventEntityStruct : IEntityStruct
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The type of event that has been emitted
|
||||||
|
/// </summary>
|
||||||
public object type;
|
public object type;
|
||||||
|
|
||||||
public EGID ID { get; set; }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,36 +8,57 @@ using GamecraftModdingAPI.Utility;
|
||||||
|
|
||||||
namespace GamecraftModdingAPI.Events
|
namespace GamecraftModdingAPI.Events
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// A simple implementation of IEventEmitterEngine sufficient for most uses
|
||||||
|
/// </summary>
|
||||||
class SimpleEventEmitterEngine : IEventEmitterEngine
|
class SimpleEventEmitterEngine : IEventEmitterEngine
|
||||||
{
|
{
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
public object type { get; set; }
|
public object type { get; set; }
|
||||||
|
|
||||||
|
public bool isRemovable { get; }
|
||||||
|
|
||||||
public IEntityFactory Factory { private get; set; }
|
public IEntityFactory Factory { private get; set; }
|
||||||
|
|
||||||
public IEntitiesDB entitiesDB { set; private get; }
|
public IEntitiesDB entitiesDB { set; private get; }
|
||||||
|
|
||||||
public void Ready() { }
|
public void Ready() { }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Emit the event
|
||||||
|
/// </summary>
|
||||||
public void Emit()
|
public void Emit()
|
||||||
{
|
{
|
||||||
Factory.BuildEntity<ModEventEntityDescriptor>(ApiExclusiveGroups.eventID++, ApiExclusiveGroups.eventsExclusiveGroup)
|
Factory.BuildEntity<ModEventEntityDescriptor>(ApiExclusiveGroups.eventID++, ApiExclusiveGroups.eventsExclusiveGroup)
|
||||||
.Init(new ModEventEntityStruct
|
.Init(new ModEventEntityStruct { type = type });
|
||||||
{
|
|
||||||
type = type
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public SimpleEventEmitterEngine(EventType type, string name)
|
public void Dispose() { }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Construct the engine
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="type">The EventType to use for ModEventEntityStruct.type</param>
|
||||||
|
/// <param name="name">The name of this engine</param>
|
||||||
|
/// <param name="isRemovable">Will removing this engine not break your code?</param>
|
||||||
|
public SimpleEventEmitterEngine(EventType type, string name, bool isRemovable = true)
|
||||||
{
|
{
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.Name = name;
|
this.Name = name;
|
||||||
|
this.isRemovable = isRemovable;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SimpleEventEmitterEngine(object type, string name)
|
/// <summary>
|
||||||
|
/// Construct the engine
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="type">The object to use for ModEventEntityStruct.type</param>
|
||||||
|
/// <param name="name">The name of this engine</param>
|
||||||
|
/// <param name="isRemovable">Will removing this engine not break your code?</param>
|
||||||
|
public SimpleEventEmitterEngine(object type, string name, bool isRemovable = true)
|
||||||
{
|
{
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.Name = name;
|
this.Name = name;
|
||||||
|
this.isRemovable = isRemovable;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,12 +7,19 @@ using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace GamecraftModdingAPI.Events
|
namespace GamecraftModdingAPI.Events
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// A simple implementation of IEventHandlerEngine sufficient for most uses
|
||||||
|
/// </summary>
|
||||||
class SimpleEventHandlerEngine : IEventHandlerEngine
|
class SimpleEventHandlerEngine : IEventHandlerEngine
|
||||||
{
|
{
|
||||||
public object type { get; set; }
|
public object type { get; set; }
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
|
|
||||||
private readonly Action<IEntitiesDB> onEvent;
|
private bool isActivated = false;
|
||||||
|
|
||||||
|
private readonly Action<IEntitiesDB> onActivated;
|
||||||
|
|
||||||
|
private readonly Action<IEntitiesDB> onDestroyed;
|
||||||
|
|
||||||
public IEntitiesDB entitiesDB { set; private get; }
|
public IEntitiesDB entitiesDB { set; private get; }
|
||||||
|
|
||||||
|
@ -20,21 +27,47 @@ namespace GamecraftModdingAPI.Events
|
||||||
{
|
{
|
||||||
if (entityView.type.Equals(this.type))
|
if (entityView.type.Equals(this.type))
|
||||||
{
|
{
|
||||||
onEvent.Invoke(entitiesDB);
|
isActivated = true;
|
||||||
|
onActivated.Invoke(entitiesDB);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Ready() { }
|
public void Ready() { }
|
||||||
|
|
||||||
public void Remove(ref ModEventEntityStruct entityView, EGID egid) { }
|
public void Remove(ref ModEventEntityStruct entityView, EGID egid)
|
||||||
|
{
|
||||||
|
if (entityView.type.Equals(this.type) && isActivated)
|
||||||
|
{
|
||||||
|
isActivated = false;
|
||||||
|
onDestroyed.Invoke(entitiesDB);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public SimpleEventHandlerEngine(Action handleEvent, object type, string name) : this((IEntitiesDB db) => { handleEvent.Invoke(); }, type, name) { }
|
public void Dispose()
|
||||||
|
{
|
||||||
|
if (isActivated)
|
||||||
|
{
|
||||||
|
isActivated = false;
|
||||||
|
onDestroyed.Invoke(entitiesDB);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public SimpleEventHandlerEngine(Action<IEntitiesDB> handleEvent, object type, string name)
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="activated"></param>
|
||||||
|
/// <param name="removed"></param>
|
||||||
|
/// <param name="type"></param>
|
||||||
|
/// <param name="name"></param>
|
||||||
|
public SimpleEventHandlerEngine(Action activated, Action removed, object type, string name)
|
||||||
|
: this((IEntitiesDB _) => { activated.Invoke(); }, (IEntitiesDB _) => { removed.Invoke(); }, type, name) { }
|
||||||
|
|
||||||
|
public SimpleEventHandlerEngine(Action<IEntitiesDB> activated, Action<IEntitiesDB> removed, object type, string name)
|
||||||
{
|
{
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.Name = name;
|
this.Name = name;
|
||||||
this.onEvent = handleEvent;
|
this.onActivated = activated;
|
||||||
|
this.onDestroyed = removed;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -537,17 +537,7 @@
|
||||||
</Reference>
|
</Reference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Update="Properties\Settings.Designer.cs">
|
<Folder Include="Properties\" />
|
||||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
|
||||||
<AutoGen>True</AutoGen>
|
|
||||||
<DependentUpon>Settings.settings</DependentUpon>
|
|
||||||
</Compile>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<None Update="Properties\Settings.settings">
|
|
||||||
<Generator>SettingsSingleFileGenerator</Generator>
|
|
||||||
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
|
||||||
</None>
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<!--End Dependencies-->
|
<!--End Dependencies-->
|
||||||
|
|
||||||
|
|
|
@ -21,12 +21,14 @@ namespace GamecraftModdingAPI
|
||||||
harmony = HarmonyInstance.Create(currentAssembly.GetName().Name);
|
harmony = HarmonyInstance.Create(currentAssembly.GetName().Name);
|
||||||
harmony.PatchAll(currentAssembly);
|
harmony.PatchAll(currentAssembly);
|
||||||
}
|
}
|
||||||
// create default event objects
|
// create default event emitters
|
||||||
Manager.AddEventHandler(new SimpleEventHandlerEngine(() => { Logging.Log("App Inited event!"); },
|
Manager.AddEventEmitter(new SimpleEventEmitterEngine(EventType.ApplicationInitialized, "GamecraftModdingAPIApplicationInitializedEventEmitter", false));
|
||||||
EventType.ApplicationInitialized, "appinit API debug"));
|
Manager.AddEventEmitter(new SimpleEventEmitterEngine(EventType.Menu, "GamecraftModdingAPIMenuActivatedEventEmitter", false));
|
||||||
Manager.AddEventEmitter(new SimpleEventEmitterEngine(EventType.ApplicationInitialized, "GamecraftModdingAPIApplicationInitializedEventEmitter"));
|
Manager.AddEventEmitter(new SimpleEventEmitterEngine(EventType.MenuSwitchedTo, "GamecraftModdingAPIMenuSwitchedToEventEmitter", false)); // TODO
|
||||||
Manager.AddEventEmitter(new SimpleEventEmitterEngine(EventType.MenuActivated, "GamecraftModdingAPIMenuActivatedEventEmitter"));
|
Manager.AddEventEmitter(new SimpleEventEmitterEngine(EventType.Game, "GamecraftModdingAPIGameActivatedEventEmitter", false));
|
||||||
Logging.Log($"{currentAssembly.GetName().Name} {currentAssembly.GetName().Version} start & patch complete");
|
Manager.AddEventEmitter(new SimpleEventEmitterEngine(EventType.GameReloaded, "GamecraftModdingAPIGameReloadedEventEmitter", false)); // TODO
|
||||||
|
Manager.AddEventEmitter(new SimpleEventEmitterEngine(EventType.GameSwitchedTo, "GamecraftModdingAPIGameSwitchedToEventEmitter", false)); // TODO
|
||||||
|
Logging.Log($"{currentAssembly.GetName().Name} {currentAssembly.GetName().Version} init & patch complete");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void Shutdown()
|
public static void Shutdown()
|
||||||
|
|
26
GamecraftModdingAPI/Properties/Settings.Designer.cs
generated
26
GamecraftModdingAPI/Properties/Settings.Designer.cs
generated
|
@ -1,26 +0,0 @@
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// <auto-generated>
|
|
||||||
// This code was generated by a tool.
|
|
||||||
// Runtime Version:4.0.30319.42000
|
|
||||||
//
|
|
||||||
// Changes to this file may cause incorrect behavior and will be lost if
|
|
||||||
// the code is regenerated.
|
|
||||||
// </auto-generated>
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
namespace GamecraftModdingAPI.Properties {
|
|
||||||
|
|
||||||
|
|
||||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
|
||||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.4.0.0")]
|
|
||||||
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
|
|
||||||
|
|
||||||
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
|
|
||||||
|
|
||||||
public static Settings Default {
|
|
||||||
get {
|
|
||||||
return defaultInstance;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,6 +0,0 @@
|
||||||
<?xml version='1.0' encoding='utf-8'?>
|
|
||||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
|
|
||||||
<Profiles>
|
|
||||||
<Profile Name="(Default)" />
|
|
||||||
</Profiles>
|
|
||||||
</SettingsFile>
|
|
|
@ -1,20 +1,24 @@
|
||||||
using System;
|
using System;
|
||||||
using UnityEngine;
|
|
||||||
using Harmony;
|
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
using Harmony;
|
||||||
|
using GamecraftModdingAPI.Events;
|
||||||
|
using GamecraftModdingAPI.Utility;
|
||||||
|
|
||||||
namespace GamecraftModdingAPI.Tests
|
namespace GamecraftModdingAPI.Tests
|
||||||
{
|
{
|
||||||
// unused by design
|
// unused by design
|
||||||
public class GamecraftModdingAPIPluginTest //: IllusionPlugin.IEnhancedPlugin
|
public class GamecraftModdingAPIPluginTest
|
||||||
|
#if DEBUG
|
||||||
|
: IllusionPlugin.IEnhancedPlugin
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
public static HarmonyInstance harmony { get; protected set; }
|
public static HarmonyInstance harmony { get; protected set; }
|
||||||
|
|
||||||
public string[] Filter { get; } = new string[] { "Gamecraft" };
|
public string[] Filter { get; } = new string[] { "Gamecraft" };
|
||||||
|
|
||||||
public string Name { get; } = "Gamecraft Modding API";
|
public string Name { get; } = Assembly.GetExecutingAssembly().GetName().Name;
|
||||||
|
|
||||||
public string Version { get; } = "v0.1.0.A";
|
public string Version { get; } = Assembly.GetExecutingAssembly().GetName().Version.ToString();
|
||||||
|
|
||||||
public string HarmonyID { get; } = "org.git.exmods.modtainers.gamecraftmoddingapi";
|
public string HarmonyID { get; } = "org.git.exmods.modtainers.gamecraftmoddingapi";
|
||||||
|
|
||||||
|
@ -26,6 +30,28 @@ namespace GamecraftModdingAPI.Tests
|
||||||
public void OnApplicationStart()
|
public void OnApplicationStart()
|
||||||
{
|
{
|
||||||
GamecraftModdingAPI.Main.Init();
|
GamecraftModdingAPI.Main.Init();
|
||||||
|
// in case Steam is not installed/running
|
||||||
|
// this will crash the game slightly later during startup
|
||||||
|
//SteamInitPatch.ForcePassSteamCheck = true;
|
||||||
|
// in case running in a VM
|
||||||
|
//MinimumSpecsCheckPatch.ForcePassMinimumSpecCheck = true;
|
||||||
|
|
||||||
|
// debug/test handlers
|
||||||
|
Manager.AddEventHandler(new SimpleEventHandlerEngine(() => { Logging.Log("App Inited event!"); }, () => { },
|
||||||
|
EventType.ApplicationInitialized, "appinit API debug"));
|
||||||
|
Manager.AddEventHandler(new SimpleEventHandlerEngine(() => { Logging.Log("Menu Activated event!"); },
|
||||||
|
() => { Logging.Log("Menu Destroyed event!"); },
|
||||||
|
EventType.Menu, "menuact API debug"));
|
||||||
|
Manager.AddEventHandler(new SimpleEventHandlerEngine(() => { Logging.Log("Menu Switched To event!"); }, () => { },
|
||||||
|
EventType.MenuSwitchedTo, "menuswitch API debug"));
|
||||||
|
Manager.AddEventHandler(new SimpleEventHandlerEngine(() => { Logging.Log("Game Activated event!"); },
|
||||||
|
() => { Logging.Log("Game Destroyed event!"); },
|
||||||
|
EventType.Game, "gameact API debug"));
|
||||||
|
Manager.AddEventHandler(new SimpleEventHandlerEngine(() => { Logging.Log("Game Reloaded event!"); }, () => { },
|
||||||
|
EventType.GameReloaded, "gamerel API debug"));
|
||||||
|
Manager.AddEventHandler(new SimpleEventHandlerEngine(() => { Logging.Log("Game Switched To event!"); }, () => { },
|
||||||
|
EventType.GameSwitchedTo, "gameswitch API debug"));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnFixedUpdate() { }
|
public void OnFixedUpdate() { }
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Reflection;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
@ -135,7 +136,7 @@ namespace GamecraftModdingAPI.Utility
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Write a message to stdout (usually the terminal which is running, like Command Prompt or PowerShell)
|
/// Write a message to stdout (ie the terminal, like Command Prompt or PowerShell)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="obj">The object to log</param>
|
/// <param name="obj">The object to log</param>
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
|
@ -143,5 +144,28 @@ namespace GamecraftModdingAPI.Utility
|
||||||
{
|
{
|
||||||
Svelto.Console.SystemLog(obj.ToString());
|
Svelto.Console.SystemLog(obj.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Write a descriptive message to Gamecraft's log only when the API is a Debug build
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="obj">The object to log</param>
|
||||||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
|
public static void MetaDebugLog(object obj)
|
||||||
|
{
|
||||||
|
#if DEBUG
|
||||||
|
MetaLog($"[MetaDebug]{obj.ToString()}");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Write a descriptive message to Gamecraft's log including the current time and the DLL's name
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="obj">The object to log</param>
|
||||||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
|
public static void MetaLog(object obj)
|
||||||
|
{
|
||||||
|
var callAsm = Assembly.GetCallingAssembly();
|
||||||
|
Log($"[{DateTime.Now.ToString()}][{callAsm.GetName().Name}]{obj.ToString()}");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
27
GamecraftModdingAPI/Utility/MinimumSpecsCheckPatch.cs
Normal file
27
GamecraftModdingAPI/Utility/MinimumSpecsCheckPatch.cs
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Harmony;
|
||||||
|
using RobocraftX.FrontEnd;
|
||||||
|
|
||||||
|
namespace GamecraftModdingAPI.Utility
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Patch of bool RobocraftX.FrontEnd.MinimumSpecsCheck.CheckRequirementsMet()
|
||||||
|
/// </summary>
|
||||||
|
[HarmonyPatch(typeof(MinimumSpecsCheck), "CheckRequirementsMet")]
|
||||||
|
class MinimumSpecsCheckPatch
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Ignore result of the requirement check?
|
||||||
|
/// </summary>
|
||||||
|
public static bool ForcePassMinimumSpecCheck = false;
|
||||||
|
|
||||||
|
public static void Postfix(ref bool __result)
|
||||||
|
{
|
||||||
|
__result = __result || ForcePassMinimumSpecCheck;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
29
GamecraftModdingAPI/Utility/SteamInitPatch.cs
Normal file
29
GamecraftModdingAPI/Utility/SteamInitPatch.cs
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Harmony;
|
||||||
|
using RobocraftX.Common;
|
||||||
|
|
||||||
|
namespace GamecraftModdingAPI.Utility
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Patch of bool RobocraftX.Common.SteamManager.VerifyOrInit()
|
||||||
|
/// This does not let you run Gamecraft without Steam.
|
||||||
|
/// DO NOT USE!
|
||||||
|
/// </summary>
|
||||||
|
[HarmonyPatch(typeof(SteamManager), "VerifyOrInit")]
|
||||||
|
class SteamInitPatch
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Ignore the result of steam initialization?
|
||||||
|
/// </summary>
|
||||||
|
public static bool ForcePassSteamCheck = false;
|
||||||
|
|
||||||
|
public static void Postfix(ref bool __result)
|
||||||
|
{
|
||||||
|
__result = __result || ForcePassSteamCheck;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue