Add account superuser and game framework events
This commit is contained in:
parent
42029cf0fd
commit
4a51207dc6
6 changed files with 250 additions and 4 deletions
|
@ -29,14 +29,43 @@ namespace CLre.API.App
|
|||
add => FrontEndGuiEngine_SetMainMenuEnabled_Patch.postMenuEnabled += value;
|
||||
remove => FrontEndGuiEngine_SetMainMenuEnabled_Patch.postMenuEnabled -= value;
|
||||
}
|
||||
|
||||
public static event EventHandler<MenuReady> MenuReady
|
||||
{
|
||||
add => MenuReadyEngine.menuEngineReady += value;
|
||||
remove => MenuReadyEngine.menuEngineReady -= value;
|
||||
}
|
||||
|
||||
public static event EventHandler<GameReady> GameReady
|
||||
{
|
||||
add => GameReadyEngine.gameEngineReady += value;
|
||||
remove => GameReadyEngine.gameEngineReady -= value;
|
||||
}
|
||||
|
||||
public static event EventHandler<GameReady> GameFrameworkReady
|
||||
{
|
||||
add => GameFrameworkEngine.gameFrameworkReady += value;
|
||||
remove => GameFrameworkEngine.gameFrameworkReady += value;
|
||||
}
|
||||
|
||||
public static event EventHandler<GameExit> GameFrameworkExit
|
||||
{
|
||||
add => GameFrameworkEngine.gameFrameworkExit += value;
|
||||
remove => GameFrameworkEngine.gameFrameworkExit += value;
|
||||
}
|
||||
|
||||
public static string Version
|
||||
{
|
||||
get => Game.Utilities.VersionReader.GetVersion();
|
||||
}
|
||||
|
||||
static Client()
|
||||
{
|
||||
new MenuReadyEngine();
|
||||
new GameReadyEngine();
|
||||
new GameFrameworkEngine();
|
||||
}
|
||||
}
|
||||
|
||||
public struct SetupEventArgs {}
|
||||
|
||||
[HarmonyPatch(typeof(FrontEnd.MainFrontEnd), "SetupContainer")]
|
||||
class FrontEnd_SetupContainer_Patch
|
||||
|
|
62
CLre/API/App/ClientEngines.cs
Normal file
62
CLre/API/App/ClientEngines.cs
Normal file
|
@ -0,0 +1,62 @@
|
|||
using System;
|
||||
using CLre.API.Engines;
|
||||
using Svelto.Context;
|
||||
using Svelto.ECS;
|
||||
|
||||
namespace CLre.API.App
|
||||
{
|
||||
class GameReadyEngine : GameObsoleteEnginePostBuild, IWaitForFrameworkInitialization
|
||||
{
|
||||
internal static event EventHandler<GameReady> gameEngineReady;
|
||||
|
||||
public override void Ready()
|
||||
{
|
||||
if (gameEngineReady != null) gameEngineReady(this, new GameReady { });
|
||||
}
|
||||
|
||||
public override IEntitiesDB entitiesDB { get; set; }
|
||||
public override IEntityFactory entityFactory { get; set; }
|
||||
|
||||
public void OnFrameworkInitialized()
|
||||
{
|
||||
// TODO framework init event
|
||||
}
|
||||
}
|
||||
|
||||
class GameFrameworkEngine : GameObsoleteEnginePostBuild, IWaitForFrameworkInitialization, IWaitForFrameworkDestruction
|
||||
{
|
||||
internal static event EventHandler<GameReady> gameFrameworkReady;
|
||||
|
||||
internal static event EventHandler<GameExit> gameFrameworkExit;
|
||||
|
||||
public override void Ready()
|
||||
{
|
||||
}
|
||||
|
||||
public override IEntitiesDB entitiesDB { get; set; }
|
||||
public override IEntityFactory entityFactory { get; set; }
|
||||
|
||||
public void OnFrameworkInitialized()
|
||||
{
|
||||
if (gameFrameworkReady != null) gameFrameworkReady(this, new GameReady { });
|
||||
}
|
||||
|
||||
public void OnFrameworkDestroyed()
|
||||
{
|
||||
if (gameFrameworkExit != null) gameFrameworkExit(this, new GameExit { });
|
||||
}
|
||||
}
|
||||
|
||||
class MenuReadyEngine : FrontEndObsoleteEnginePostBuild
|
||||
{
|
||||
internal static event EventHandler<MenuReady> menuEngineReady;
|
||||
|
||||
public override void Ready()
|
||||
{
|
||||
if (menuEngineReady != null) menuEngineReady(this, new MenuReady { });
|
||||
}
|
||||
|
||||
public override IEntitiesDB entitiesDB { get; set; }
|
||||
public override IEntityFactory entityFactory { get; set; }
|
||||
}
|
||||
}
|
11
CLre/API/App/ClientEventArgs.cs
Normal file
11
CLre/API/App/ClientEventArgs.cs
Normal file
|
@ -0,0 +1,11 @@
|
|||
namespace CLre.API.App
|
||||
{
|
||||
|
||||
public struct SetupEventArgs {}
|
||||
|
||||
public struct GameReady{}
|
||||
|
||||
public struct GameExit{}
|
||||
|
||||
public struct MenuReady{}
|
||||
}
|
28
CLre/API/Characters/AccountUtilityPatches.cs
Normal file
28
CLre/API/Characters/AccountUtilityPatches.cs
Normal file
|
@ -0,0 +1,28 @@
|
|||
using System.Reflection;
|
||||
using HarmonyLib;
|
||||
using User.Server;
|
||||
|
||||
namespace CLre.API.Characters
|
||||
{
|
||||
[HarmonyPatch]
|
||||
class AccountUtility_GetUserFlags_Patch
|
||||
{
|
||||
internal static bool superuser = false;
|
||||
|
||||
private static UserFlags superFlags = UserFlags.userlogged | UserFlags.BucketB | UserFlags.BucketA |
|
||||
UserFlags.NoDrop | UserFlags.GiveInv | UserFlags.Dev | UserFlags.None;
|
||||
|
||||
[HarmonyPrefix]
|
||||
public static bool BeforeMethodCall(ref UserFlags __result)
|
||||
{
|
||||
if (superuser) __result = superFlags;
|
||||
return !superuser;
|
||||
}
|
||||
|
||||
[HarmonyTargetMethod]
|
||||
public static MethodBase Target()
|
||||
{
|
||||
return AccessTools.Method("Game.Utilities.Account.AccountUtility:GetUserFlags");
|
||||
}
|
||||
}
|
||||
}
|
107
CLre/API/Characters/Character.cs
Normal file
107
CLre/API/Characters/Character.cs
Normal file
|
@ -0,0 +1,107 @@
|
|||
using System;
|
||||
using System.Reflection;
|
||||
using CLre.API.Engines;
|
||||
using HarmonyLib;
|
||||
using NetworkFramework.Shared;
|
||||
using Svelto.ECS;
|
||||
using Svelto.Obsolete.ECS;
|
||||
|
||||
namespace CLre.API.Characters
|
||||
{
|
||||
public class Character
|
||||
{
|
||||
private bool isCurrent;
|
||||
|
||||
private readonly CharacterEngine _characterEngine = new CharacterEngine();
|
||||
|
||||
private static readonly FieldInfo _AccountUtility__username =
|
||||
AccessTools.Field(AccessTools.TypeByName("Game.Utilities.Account.AccountUtility"), "_username");
|
||||
|
||||
public string Username
|
||||
{
|
||||
get
|
||||
{
|
||||
if (isCurrent)
|
||||
{
|
||||
return _AccountUtility__username.GetValue(null) as string;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// When enabled, all user flags for the current user are set to one, so they unlock all client functionality
|
||||
/// </summary>
|
||||
public bool Superuser
|
||||
{
|
||||
get => AccountUtility_GetUserFlags_Patch.superuser;
|
||||
set => AccountUtility_GetUserFlags_Patch.superuser = value;
|
||||
}
|
||||
|
||||
public static Character Local()
|
||||
{
|
||||
Character localChar = new Character();
|
||||
localChar.isCurrent = true;
|
||||
return localChar;
|
||||
}
|
||||
}
|
||||
|
||||
internal class CharacterEngine : GameObsoleteEnginePostBuild
|
||||
{
|
||||
|
||||
public override void Ready()
|
||||
{
|
||||
}
|
||||
|
||||
public override IEntitiesDB entitiesDB { get; set; }
|
||||
public override IEntityFactory entityFactory { get; set; }
|
||||
|
||||
public bool GetGodModeRequested()
|
||||
{
|
||||
if (entitiesDB == null) return false;
|
||||
// TODO cache this conversion operation
|
||||
// equivalent to
|
||||
// return DEPRECATED_SveltoExtensions.GetFirstNodeDeprecatedMethod<Game.GodMode.ClientGodModeRequestNode>()?.godModeRequestComponent.value
|
||||
Type cgmrd = AccessTools.TypeByName("Game.GodMode.ClientGodModeRequestNode");
|
||||
Type igmrc = AccessTools.TypeByName("Game.GodMode.IGodModeRequestComponent");
|
||||
MethodInfo cgmrdFirstNode = AccessTools.Method(typeof(DEPRECATED_SveltoExtensions), "GetFirstNoteDeprecatedMethod")
|
||||
.MakeGenericMethod(cgmrd);
|
||||
FieldInfo cgmrdIField = AccessTools.Field(cgmrd, "godModeRequestComponent");
|
||||
MethodInfo igmrcReqGodMode = AccessTools.PropertyGetter(igmrc, "requestGodMode");
|
||||
// op start
|
||||
object firstNode = cgmrdFirstNode.Invoke(null, new []{entitiesDB});
|
||||
if (firstNode != null)
|
||||
{
|
||||
object godModeRequestComponent = cgmrdIField.GetValue(firstNode);
|
||||
ObsoleteDispatchOnSet<SerialisedBool> requestGodMode = (ObsoleteDispatchOnSet<SerialisedBool>)igmrcReqGodMode.Invoke(godModeRequestComponent, new object[]{});
|
||||
return requestGodMode.value;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public void SetGodModeRequested(bool val)
|
||||
{
|
||||
if (entitiesDB == null) return;
|
||||
// TODO cache this conversion operation
|
||||
//DEPRECATED_SveltoExtensions.GetFirstNodeDeprecatedMethod<Game.GodMode.ClientGodModeRequestNode>()
|
||||
Type cgmrd = AccessTools.TypeByName("Game.GodMode.ClientGodModeRequestNode");
|
||||
Type igmrc = AccessTools.TypeByName("Game.GodMode.IGodModeRequestComponent");
|
||||
MethodInfo cgmrdFirstNode = AccessTools.Method(typeof(DEPRECATED_SveltoExtensions), "GetFirstNoteDeprecatedMethod")
|
||||
.MakeGenericMethod(cgmrd);
|
||||
FieldInfo cgmrdIField = AccessTools.Field(cgmrd, "godModeRequestComponent");
|
||||
MethodInfo igmrcReqGodMode = AccessTools.PropertyGetter(igmrc, "requestGodMode");
|
||||
// operation start
|
||||
object firstNode = cgmrdFirstNode.Invoke(null, new []{entitiesDB});
|
||||
Utility.Logging.MetaLog($"firstNode is null? {firstNode == null}");
|
||||
if (firstNode != null)
|
||||
{
|
||||
Utility.Logging.MetaLog($"firstNode is type {firstNode.GetType().FullName}");
|
||||
object godModeRequestComponent = cgmrdIField.GetValue(firstNode);
|
||||
ObsoleteDispatchOnSet<SerialisedBool> requestGodMode = (ObsoleteDispatchOnSet<SerialisedBool>)igmrcReqGodMode.Invoke(godModeRequestComponent, new object[]{});
|
||||
requestGodMode.value = val;
|
||||
Utility.Logging.MetaLog($"SetGodModeRequested completed successfully");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
13
CLre/CLre.cs
13
CLre/CLre.cs
|
@ -3,13 +3,14 @@ using System.Diagnostics;
|
|||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using CLre.API.Characters;
|
||||
using HarmonyLib;
|
||||
using Svelto.ECS;
|
||||
using UnityEngine;
|
||||
|
||||
namespace CLre
|
||||
{
|
||||
public class CLre : IllusionPlugin.IEnhancedPlugin // the Illusion Plugin Architecture (IPA) will ignore classes that don't implement IPlugin'
|
||||
public class CLre : IllusionPlugin.IEnhancedPlugin // the Illusion Plugin Architecture (IPA) will ignore classes that don't implement IPlugin
|
||||
{
|
||||
public override string Name { get; } = Assembly.GetExecutingAssembly().GetName().Name;
|
||||
|
||||
|
@ -40,7 +41,7 @@ namespace CLre
|
|||
// misc
|
||||
LogIPAPlugins();
|
||||
Fixes.BugfixAttributeUtility.LogBugfixes();
|
||||
|
||||
|
||||
// Log info
|
||||
API.Utility.Logging.MetaLog($"{Name} init complete.");
|
||||
|
||||
|
@ -55,6 +56,14 @@ namespace CLre
|
|||
? EasyAntiCheat.Client.Hydra.Runtime.Integrity.ViolationMessage
|
||||
: ""));
|
||||
};
|
||||
|
||||
API.App.Client.MenuReady += (_, __) => { API.Utility.Logging.MetaLog("Menu engine ready event fired!"); };
|
||||
API.App.Client.GameReady += (_, __) => { API.Utility.Logging.MetaLog("Game engine ready event fired!"); };
|
||||
API.App.Client.GameFrameworkReady += (_, __) => { API.Utility.Logging.MetaLog("Game framework ready event fired!"); };
|
||||
API.App.Client.GameFrameworkExit += (_, __) => { API.Utility.Logging.MetaLog("Game framework exit event fired!"); };
|
||||
|
||||
Character c = Character.Local();
|
||||
c.Superuser = true;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue