Fix GameSwitchedTo event with some statefulness
This commit is contained in:
parent
1366d95c4a
commit
8145c6c23f
5 changed files with 74 additions and 36 deletions
|
@ -17,18 +17,34 @@ namespace GamecraftModdingAPI.Events
|
|||
/// <summary>
|
||||
/// Patch of RobocraftX.FullGameCompositionRoot.ActivateGame()
|
||||
/// </summary>
|
||||
[HarmonyPatch]
|
||||
class GameActivatedPatch
|
||||
[HarmonyPatch]
|
||||
class GameActivatedComposePatch
|
||||
{
|
||||
public static bool IsGameSwitching = false;
|
||||
|
||||
public static bool IsGameReloading = false;
|
||||
|
||||
public static void Postfix(ref EnginesRoot enginesRoot)
|
||||
{
|
||||
// register custom game engines
|
||||
GameEngineManager.RegisterEngines(enginesRoot);
|
||||
GameEngineManager.RegisterEngines(enginesRoot);
|
||||
// A new EnginesRoot is always created when ActivateGame is called
|
||||
// so all event emitters and handlers must be re-registered.
|
||||
EventManager.RegisterEngines(enginesRoot);
|
||||
EventManager.RegisterEngines(enginesRoot);
|
||||
Logging.Log("Dispatching Game Activated event");
|
||||
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()
|
|
@ -19,9 +19,7 @@ namespace GamecraftModdingAPI.Events
|
|||
{
|
||||
public static void Postfix()
|
||||
{
|
||||
// Event emitters and handlers should already be registered by GameActivatedPatch
|
||||
Logging.Log("Dispatching Game Reloaded event");
|
||||
EventManager.GetEventEmitter("GamecraftModdingAPIGameReloadedEventEmitter").Emit();
|
||||
GameActivatedComposePatch.IsGameReloading = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,25 +3,27 @@ using System.Collections.Generic;
|
|||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Reflection;
|
||||
|
||||
using Harmony;
|
||||
using RobocraftX;
|
||||
using RobocraftX.CR.MainGame;
|
||||
using Svelto.ECS;
|
||||
|
||||
using GamecraftModdingAPI.Utility;
|
||||
|
||||
namespace GamecraftModdingAPI.Events
|
||||
{
|
||||
/// <summary>
|
||||
/// Patch of RobocraftX.FullGameCompositionRoot.SwitchToGame()
|
||||
/// Patch of RobocraftX.FullGameCompositionRoot.ActivateGame()
|
||||
/// (scheduled for execution during RobocraftX.FullGameCompositionRoot.SwitchToGame())
|
||||
/// </summary>
|
||||
[HarmonyPatch(typeof(FullGameCompositionRoot), "SwitchToGame")]
|
||||
[HarmonyPatch(typeof(FullGameCompositionRoot), "SwitchToGame")]
|
||||
class GameSwitchedToPatch
|
||||
{
|
||||
public static void Postfix()
|
||||
public static void Prefix()
|
||||
{
|
||||
// Event emitters and handlers should already be registered by GameActivated event
|
||||
Logging.Log("Not dispatching Game Switched To event");
|
||||
//EventManager.GetEventEmitter("GamecraftModdingAPIGameSwitchedToEventEmitter").Emit();
|
||||
GameActivatedComposePatch.IsGameSwitching = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,7 +26,7 @@ namespace GamecraftModdingAPI.Tests
|
|||
{
|
||||
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;
|
||||
|
||||
|
@ -49,8 +49,9 @@ namespace GamecraftModdingAPI.Tests
|
|||
//MinimumSpecsCheckPatch.ForcePassMinimumSpecCheck = true;
|
||||
// disable some Gamecraft analytics
|
||||
//AnalyticsDisablerPatch.DisableAnalytics = true;
|
||||
// disable background music
|
||||
AudioTools.SetVolume(0.0f, "Music");
|
||||
// disable background 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"))
|
||||
{
|
||||
|
@ -75,27 +76,38 @@ namespace GamecraftModdingAPI.Tests
|
|||
EventType.GameSwitchedTo, "gameswitch API debug"));
|
||||
|
||||
// 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"));
|
||||
CommandManager.AddCommand(new SimpleCustomCommandEngine<float>((float d) => { UnityEngine.Camera.main.fieldOfView = d; },
|
||||
"SetFOV", "Set the player camera's field of view"));
|
||||
CommandManager.AddCommand(new SimpleCustomCommandEngine<float, float, float>(
|
||||
(x,y,z) => {
|
||||
bool success = GamecraftModdingAPI.Blocks.Movement.MoveConnectedBlocks(
|
||||
GamecraftModdingAPI.Blocks.BlockIdentifiers.LatestBlockID,
|
||||
new Unity.Mathematics.float3(x, y, z));
|
||||
if (!success)
|
||||
{
|
||||
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"));
|
||||
CommandManager.AddCommand(new SimpleCustomCommandEngine<float, float, float>(
|
||||
(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"));
|
||||
Analytics.DeltaDNAHelper.PlayerLifetimeParameters plp = new Analytics.DeltaDNAHelper.PlayerLifetimeParameters();
|
||||
CommandManager.AddCommand(new SimpleCustomCommandEngine<string>(
|
||||
(s) => { Analytics.DeltaDNAHelper.SendActionCompletedEvent(in plp, s.Replace(", ", " ")); },
|
||||
"SendAnalyticsAction", "Send an analytics action"));
|
||||
CommandManager.AddCommand(new SimpleCustomCommandEngine<float>((float d) => { UnityEngine.Camera.main.fieldOfView = d; },
|
||||
"SetFOV", "Set the player camera's field of view"));
|
||||
CommandManager.AddCommand(new SimpleCustomCommandEngine<float, float, float>(
|
||||
(x, y, z) => {
|
||||
bool success = GamecraftModdingAPI.Blocks.Movement.MoveConnectedBlocks(
|
||||
GamecraftModdingAPI.Blocks.BlockIdentifiers.LatestBlockID,
|
||||
new Unity.Mathematics.float3(x, y, z));
|
||||
if (!success)
|
||||
{
|
||||
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"));
|
||||
CommandManager.AddCommand(new SimpleCustomCommandEngine<float, float, float>(
|
||||
(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"));
|
||||
Analytics.DeltaDNAHelper.PlayerLifetimeParameters plp = new Analytics.DeltaDNAHelper.PlayerLifetimeParameters();
|
||||
CommandManager.AddCommand(new SimpleCustomCommandEngine<string>(
|
||||
(s) => { Analytics.DeltaDNAHelper.SendActionCompletedEvent(in plp, s.Replace(", ", " ")); },
|
||||
"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() { }
|
||||
|
|
10
GamecraftModdingAPI/Utility/Dependency.cs
Normal file
10
GamecraftModdingAPI/Utility/Dependency.cs
Normal file
|
@ -0,0 +1,10 @@
|
|||
using System;
|
||||
namespace GamecraftModdingAPI
|
||||
{
|
||||
public class Dependency
|
||||
{
|
||||
public Dependency()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue