Fix GameSwitchedTo event with some statefulness

This commit is contained in:
NGnius 2020-02-18 13:59:02 -05:00
parent 1366d95c4a
commit 8145c6c23f
5 changed files with 74 additions and 36 deletions

View file

@ -17,18 +17,34 @@ namespace GamecraftModdingAPI.Events
/// <summary> /// <summary>
/// Patch of RobocraftX.FullGameCompositionRoot.ActivateGame() /// Patch of RobocraftX.FullGameCompositionRoot.ActivateGame()
/// </summary> /// </summary>
[HarmonyPatch] [HarmonyPatch]
class GameActivatedPatch class GameActivatedComposePatch
{ {
public static bool IsGameSwitching = false;
public static bool IsGameReloading = false;
public static void Postfix(ref EnginesRoot enginesRoot) public static void Postfix(ref EnginesRoot enginesRoot)
{ {
// register custom game engines // register custom game engines
GameEngineManager.RegisterEngines(enginesRoot); GameEngineManager.RegisterEngines(enginesRoot);
// A new EnginesRoot is always created when ActivateGame is called // A new EnginesRoot is always created when ActivateGame is called
// so all event emitters and handlers must be re-registered. // so all event emitters and handlers must be re-registered.
EventManager.RegisterEngines(enginesRoot); EventManager.RegisterEngines(enginesRoot);
Logging.Log("Dispatching Game Activated event"); Logging.Log("Dispatching Game Activated event");
EventManager.GetEventEmitter("GamecraftModdingAPIGameActivatedEventEmitter").Emit(); EventManager.GetEventEmitter("GamecraftModdingAPIGameActivatedEventEmitter").Emit();
if (IsGameSwitching)
{
IsGameSwitching = false;
Logging.Log("Dispatching Game Switched To event");
EventManager.GetEventEmitter("GamecraftModdingAPIGameSwitchedToEventEmitter").Emit();
}
if (IsGameReloading)
{
IsGameReloading = false;
Logging.Log("Dispatching Game Reloaded event");
EventManager.GetEventEmitter("GamecraftModdingAPIGameReloadedEventEmitter").Emit();
}
} }
public static MethodBase TargetMethod() public static MethodBase TargetMethod()

View file

@ -19,9 +19,7 @@ namespace GamecraftModdingAPI.Events
{ {
public static void Postfix() public static void Postfix()
{ {
// Event emitters and handlers should already be registered by GameActivatedPatch GameActivatedComposePatch.IsGameReloading = true;
Logging.Log("Dispatching Game Reloaded event");
EventManager.GetEventEmitter("GamecraftModdingAPIGameReloadedEventEmitter").Emit();
} }
} }
} }

View file

@ -3,25 +3,27 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Reflection;
using Harmony; using Harmony;
using RobocraftX; using RobocraftX;
using RobocraftX.CR.MainGame;
using Svelto.ECS;
using GamecraftModdingAPI.Utility; using GamecraftModdingAPI.Utility;
namespace GamecraftModdingAPI.Events namespace GamecraftModdingAPI.Events
{ {
/// <summary> /// <summary>
/// Patch of RobocraftX.FullGameCompositionRoot.SwitchToGame() /// Patch of RobocraftX.FullGameCompositionRoot.ActivateGame()
/// (scheduled for execution during RobocraftX.FullGameCompositionRoot.SwitchToGame())
/// </summary> /// </summary>
[HarmonyPatch(typeof(FullGameCompositionRoot), "SwitchToGame")] [HarmonyPatch(typeof(FullGameCompositionRoot), "SwitchToGame")]
class GameSwitchedToPatch class GameSwitchedToPatch
{ {
public static void Postfix() public static void Prefix()
{ {
// Event emitters and handlers should already be registered by GameActivated event GameActivatedComposePatch.IsGameSwitching = true;
Logging.Log("Not dispatching Game Switched To event");
//EventManager.GetEventEmitter("GamecraftModdingAPIGameSwitchedToEventEmitter").Emit();
} }
} }
} }

View file

@ -26,7 +26,7 @@ namespace GamecraftModdingAPI.Tests
{ {
private static HarmonyInstance harmony { get; set; } private static HarmonyInstance harmony { get; set; }
public string[] Filter { get; } = new string[] { "Gamecraft" }; public string[] Filter { get; } = new string[] { "Gamecraft", "GamecraftPreview" };
public string Name { get; } = Assembly.GetExecutingAssembly().GetName().Name; public string Name { get; } = Assembly.GetExecutingAssembly().GetName().Name;
@ -49,8 +49,9 @@ namespace GamecraftModdingAPI.Tests
//MinimumSpecsCheckPatch.ForcePassMinimumSpecCheck = true; //MinimumSpecsCheckPatch.ForcePassMinimumSpecCheck = true;
// disable some Gamecraft analytics // disable some Gamecraft analytics
//AnalyticsDisablerPatch.DisableAnalytics = true; //AnalyticsDisablerPatch.DisableAnalytics = true;
// disable background music // disable background music
AudioTools.SetVolume(0.0f, "Music"); Logging.MetaDebugLog("Audio Mixers: "+string.Join(",", AudioTools.GetMixers()));
//AudioTools.SetVolume(0.0f, "Music"); // The game now sets this from settings again after this is called
/*if (!FMODUnity.RuntimeManager.HasBankLoaded("Modded")) /*if (!FMODUnity.RuntimeManager.HasBankLoaded("Modded"))
{ {
@ -75,27 +76,38 @@ namespace GamecraftModdingAPI.Tests
EventType.GameSwitchedTo, "gameswitch API debug")); EventType.GameSwitchedTo, "gameswitch API debug"));
// debug/test commands // debug/test commands
CommandManager.AddCommand(new SimpleCustomCommandEngine(() => { UnityEngine.Application.Quit(); }, if (Dependency.Hell("ExtraCommands"))
{
CommandManager.AddCommand(new SimpleCustomCommandEngine(() => { UnityEngine.Application.Quit(); },
"Exit", "Close Gamecraft without any prompts")); "Exit", "Close Gamecraft without any prompts"));
CommandManager.AddCommand(new SimpleCustomCommandEngine<float>((float d) => { UnityEngine.Camera.main.fieldOfView = d; }, CommandManager.AddCommand(new SimpleCustomCommandEngine<float>((float d) => { UnityEngine.Camera.main.fieldOfView = d; },
"SetFOV", "Set the player camera's field of view")); "SetFOV", "Set the player camera's field of view"));
CommandManager.AddCommand(new SimpleCustomCommandEngine<float, float, float>( CommandManager.AddCommand(new SimpleCustomCommandEngine<float, float, float>(
(x,y,z) => { (x, y, z) => {
bool success = GamecraftModdingAPI.Blocks.Movement.MoveConnectedBlocks( bool success = GamecraftModdingAPI.Blocks.Movement.MoveConnectedBlocks(
GamecraftModdingAPI.Blocks.BlockIdentifiers.LatestBlockID, GamecraftModdingAPI.Blocks.BlockIdentifiers.LatestBlockID,
new Unity.Mathematics.float3(x, y, z)); new Unity.Mathematics.float3(x, y, z));
if (!success) if (!success)
{ {
GamecraftModdingAPI.Utility.Logging.CommandLogError("Blocks can only be moved in Build mode!"); GamecraftModdingAPI.Utility.Logging.CommandLogError("Blocks can only be moved in Build mode!");
} }
}, "MoveLastBlock", "Move the most-recently-placed block, and any connected blocks by the given offset")); }, "MoveLastBlock", "Move the most-recently-placed block, and any connected blocks by the given offset"));
CommandManager.AddCommand(new SimpleCustomCommandEngine<float, float, float>( CommandManager.AddCommand(new SimpleCustomCommandEngine<float, float, float>(
(x,y,z) => { Blocks.Placement.PlaceBlock(Blocks.BlockIDs.AluminiumCube, new Unity.Mathematics.float3(x, y, z)); }, (x, y, z) => { Blocks.Placement.PlaceBlock(Blocks.BlockIDs.AluminiumCube, new Unity.Mathematics.float3(x, y, z)); },
"PlaceAluminium", "Place a block of aluminium at the given coordinates")); "PlaceAluminium", "Place a block of aluminium at the given coordinates"));
Analytics.DeltaDNAHelper.PlayerLifetimeParameters plp = new Analytics.DeltaDNAHelper.PlayerLifetimeParameters(); Analytics.DeltaDNAHelper.PlayerLifetimeParameters plp = new Analytics.DeltaDNAHelper.PlayerLifetimeParameters();
CommandManager.AddCommand(new SimpleCustomCommandEngine<string>( CommandManager.AddCommand(new SimpleCustomCommandEngine<string>(
(s) => { Analytics.DeltaDNAHelper.SendActionCompletedEvent(in plp, s.Replace(", ", " ")); }, (s) => { Analytics.DeltaDNAHelper.SendActionCompletedEvent(in plp, s.Replace(", ", " ")); },
"SendAnalyticsAction", "Send an analytics action")); "SendAnalyticsAction", "Send an analytics action"));
}
if (Dependency.Hell("GamecraftScripting", new Version("0.0.1.0")))
{
Logging.LogWarning("You're in GamecraftScripting dependency hell");
}
else
{
Logging.Log("Compatible GamecraftScripting detected");
}
} }
public void OnFixedUpdate() { } public void OnFixedUpdate() { }

View file

@ -0,0 +1,10 @@
using System;
namespace GamecraftModdingAPI
{
public class Dependency
{
public Dependency()
{
}
}
}