Organize anti-anticheat, add block IDs, fix crash when adding event handlers multiple times
This commit is contained in:
parent
f817becc6e
commit
4ac8d53a2d
6 changed files with 75 additions and 45 deletions
55
TechbloxModdingAPI/App/AntiAntiCheatPatch.cs
Normal file
55
TechbloxModdingAPI/App/AntiAntiCheatPatch.cs
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using HarmonyLib;
|
||||||
|
using Svelto.Tasks;
|
||||||
|
|
||||||
|
namespace TechbloxModdingAPI.App
|
||||||
|
{
|
||||||
|
public static class AntiAntiCheatPatch
|
||||||
|
{
|
||||||
|
private delegate bool AntiAnticheatDelegate(ref object __result);
|
||||||
|
|
||||||
|
private delegate bool AntiAnticheatDelegateBool(ref bool __result);
|
||||||
|
|
||||||
|
private delegate bool AntiAnticheatDelegateTask(ref IEnumerator<TaskContract> __result);
|
||||||
|
|
||||||
|
public static void Init(Harmony harmony)
|
||||||
|
{
|
||||||
|
var type = AccessTools.TypeByName("Techblox.Services.Eos.Anticheat.Client.Services.AnticheatClientService");
|
||||||
|
harmony.Patch(type.GetConstructors()[0], new HarmonyMethod(((Func<bool>) AntiAntiCheat).Method));
|
||||||
|
harmony.Patch(AccessTools.Method(type, "Shutdown"), new HarmonyMethod(((Func<bool>) AntiAntiCheat).Method));
|
||||||
|
harmony.Patch(AccessTools.Method(type, "StartProtectedSession"), new HarmonyMethod(((AntiAnticheatDelegate) AntiAntiCheat).Method));
|
||||||
|
harmony.Patch(AccessTools.Method(type, "StopProtectedSession"), new HarmonyMethod(((AntiAnticheatDelegateBool) AntiAntiCheat).Method));
|
||||||
|
harmony.Patch(AccessTools.Method("Techblox.Services.Eos.Anticheat.Client.EosGetPendingMessagesToSendServiceRequest:Execute"), new HarmonyMethod(((AntiAnticheatDelegateTask)AntiAntiCheatTask).Method));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool AntiAntiCheat() => false;
|
||||||
|
|
||||||
|
private static bool AntiAntiCheat(ref object __result)
|
||||||
|
{
|
||||||
|
var targetType =
|
||||||
|
AccessTools.TypeByName("Techblox.Services.Eos.Anticheat.Client.Services.StartProtectedSessionResult");
|
||||||
|
var target = Activator.CreateInstance(targetType);
|
||||||
|
targetType.GetField("Success").SetValue(target, true);
|
||||||
|
__result = target;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool AntiAntiCheat(ref bool __result)
|
||||||
|
{
|
||||||
|
__result = true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool AntiAntiCheatTask(ref IEnumerator<TaskContract> __result)
|
||||||
|
{
|
||||||
|
IEnumerator<TaskContract> Func()
|
||||||
|
{
|
||||||
|
yield return Yield.It;
|
||||||
|
}
|
||||||
|
|
||||||
|
__result = Func();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -273,6 +273,12 @@ namespace TechbloxModdingAPI.Blocks
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The grid block used by the world editor, named Small Grid like the other one
|
/// The grid block used by the world editor, named Small Grid like the other one
|
||||||
/// </summary>
|
/// </summary>
|
||||||
SmallGridInWorldEditor
|
SmallGridInWorldEditor,
|
||||||
|
SegoeUITextblock = 376,
|
||||||
|
GravtracTextblock,
|
||||||
|
HauserTextblock,
|
||||||
|
TechnopollasTextblock,
|
||||||
|
BitBlock = 385,
|
||||||
|
Timer
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,12 +1,10 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using HarmonyLib;
|
using HarmonyLib;
|
||||||
|
|
||||||
using RobocraftX;
|
using RobocraftX;
|
||||||
using RobocraftX.Services;
|
using RobocraftX.Services;
|
||||||
using Svelto.Context;
|
using Svelto.Context;
|
||||||
using Svelto.Tasks;
|
|
||||||
|
|
||||||
using TechbloxModdingAPI.App;
|
using TechbloxModdingAPI.App;
|
||||||
using TechbloxModdingAPI.Blocks;
|
using TechbloxModdingAPI.Blocks;
|
||||||
|
@ -72,26 +70,20 @@ namespace TechbloxModdingAPI
|
||||||
Block.Init();
|
Block.Init();
|
||||||
BlockGroup.Init();
|
BlockGroup.Init();
|
||||||
Wire.Init();
|
Wire.Init();
|
||||||
|
// init client
|
||||||
Logging.MetaDebugLog($"Initializing Client");
|
Logging.MetaDebugLog($"Initializing Client");
|
||||||
Client.Init();
|
Client.Init();
|
||||||
Game.Init();
|
Game.Init();
|
||||||
// init UI
|
// init UI
|
||||||
|
Logging.MetaDebugLog($"Initializing UI");
|
||||||
Interface.IMGUI.Constants.Init();
|
Interface.IMGUI.Constants.Init();
|
||||||
Interface.IMGUI.IMGUIManager.Init();
|
Interface.IMGUI.IMGUIManager.Init();
|
||||||
|
// init anti-anticheat
|
||||||
Logging.MetaDebugLog("Initializing anti-anticheat");
|
Logging.MetaDebugLog("Initializing anti-anticheat");
|
||||||
var type = AccessTools.TypeByName("Techblox.Services.Eos.Anticheat.Client.Services.AnticheatClientService");
|
AntiAntiCheatPatch.Init(harmony);
|
||||||
harmony.Patch(type.GetConstructors()[0], new HarmonyMethod(((Func<bool>) AntiAntiCheat).Method));
|
|
||||||
harmony.Patch(AccessTools.Method(type, "Shutdown"), new HarmonyMethod(((Func<bool>) AntiAntiCheat).Method));
|
|
||||||
harmony.Patch(AccessTools.Method(type, "StartProtectedSession"), new HarmonyMethod(((AntiAnticheatDelegate) AntiAntiCheat).Method));
|
|
||||||
harmony.Patch(AccessTools.Method(type, "StopProtectedSession"), new HarmonyMethod(((AntiAnticheatDelegateBool) AntiAntiCheat).Method));
|
|
||||||
harmony.Patch(AccessTools.Method("Techblox.Services.Eos.Anticheat.Client.EosGetPendingMessagesToSendServiceRequest:Execute"), new HarmonyMethod(((AntiAnticheatDelegateTask)AntiAntiCheatTask).Method));
|
|
||||||
Logging.MetaLog($"{currentAssembly.GetName().Name} v{currentAssembly.GetName().Version} initialized");
|
Logging.MetaLog($"{currentAssembly.GetName().Name} v{currentAssembly.GetName().Version} initialized");
|
||||||
}
|
}
|
||||||
|
|
||||||
public delegate bool AntiAnticheatDelegate(ref object __result);
|
|
||||||
public delegate bool AntiAnticheatDelegateBool(ref bool __result);
|
|
||||||
public delegate bool AntiAnticheatDelegateTask(ref IEnumerator<TaskContract> __result);
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Shuts down & cleans up the TechbloxModdingAPI.
|
/// Shuts down & cleans up the TechbloxModdingAPI.
|
||||||
/// Call this as late as possible before Techblox quits.
|
/// Call this as late as possible before Techblox quits.
|
||||||
|
@ -120,34 +112,5 @@ namespace TechbloxModdingAPI
|
||||||
ErrorBuilder.DisplayMustQuitError("Failed to patch Techblox!\n" +
|
ErrorBuilder.DisplayMustQuitError("Failed to patch Techblox!\n" +
|
||||||
"Make sure you're using the latest version of TechbloxModdingAPI or disable mods if the API isn't released yet.");
|
"Make sure you're using the latest version of TechbloxModdingAPI or disable mods if the API isn't released yet.");
|
||||||
}
|
}
|
||||||
|
|
||||||
private static bool AntiAntiCheat() => false;
|
|
||||||
|
|
||||||
private static bool AntiAntiCheat(ref object __result)
|
|
||||||
{
|
|
||||||
var targetType =
|
|
||||||
AccessTools.TypeByName("Techblox.Services.Eos.Anticheat.Client.Services.StartProtectedSessionResult");
|
|
||||||
var target = Activator.CreateInstance(targetType);
|
|
||||||
targetType.GetField("Success").SetValue(target, true);
|
|
||||||
__result = target;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static bool AntiAntiCheat(ref bool __result)
|
|
||||||
{
|
|
||||||
__result = true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static bool AntiAntiCheatTask(ref IEnumerator<TaskContract> __result)
|
|
||||||
{
|
|
||||||
IEnumerator<TaskContract> Func()
|
|
||||||
{
|
|
||||||
yield return Yield.It;
|
|
||||||
}
|
|
||||||
|
|
||||||
__result = Func();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
using RobocraftX.Character;
|
using RobocraftX.Character;
|
||||||
using RobocraftX.Character.Movement;
|
using RobocraftX.Character.Movement;
|
||||||
using Svelto.ECS;
|
using Svelto.ECS;
|
||||||
|
|
||||||
using TechbloxModdingAPI.Engines;
|
using TechbloxModdingAPI.Engines;
|
||||||
|
using TechbloxModdingAPI.Utility;
|
||||||
|
|
||||||
namespace TechbloxModdingAPI.Players
|
namespace TechbloxModdingAPI.Players
|
||||||
{
|
{
|
||||||
|
@ -21,7 +23,7 @@ namespace TechbloxModdingAPI.Players
|
||||||
|
|
||||||
public void MovedTo(ref CharacterPilotSeatEntityStruct entityComponent, ExclusiveGroupStruct previousGroup, EGID egid)
|
public void MovedTo(ref CharacterPilotSeatEntityStruct entityComponent, ExclusiveGroupStruct previousGroup, EGID egid)
|
||||||
{
|
{
|
||||||
var seatId = entityComponent.pilotSeatEntity.ToEGID(entitiesDB);
|
entitiesDB.TryGetEGID(entityComponent.pilotSeatEntity, out var seatId); //TODO: Can't get EGID
|
||||||
var player = EcsObjectBase.GetInstance(new EGID(egid.entityID, CharacterExclusiveGroups.OnFootGroup),
|
var player = EcsObjectBase.GetInstance(new EGID(egid.entityID, CharacterExclusiveGroups.OnFootGroup),
|
||||||
e => new Player(e.entityID));
|
e => new Player(e.entityID));
|
||||||
if (previousGroup == CharacterExclusiveGroups.InPilotSeatGroup)
|
if (previousGroup == CharacterExclusiveGroups.InPilotSeatGroup)
|
||||||
|
|
|
@ -10,12 +10,10 @@ using IllusionInjector;
|
||||||
using RobocraftX.FrontEnd;
|
using RobocraftX.FrontEnd;
|
||||||
using Unity.Mathematics;
|
using Unity.Mathematics;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using RobocraftX.Common.Input;
|
|
||||||
using Svelto.Tasks;
|
using Svelto.Tasks;
|
||||||
using Svelto.Tasks.Lean;
|
using Svelto.Tasks.Lean;
|
||||||
using TechbloxModdingAPI.Blocks;
|
using TechbloxModdingAPI.Blocks;
|
||||||
using TechbloxModdingAPI.Commands;
|
using TechbloxModdingAPI.Commands;
|
||||||
using TechbloxModdingAPI.Input;
|
|
||||||
using TechbloxModdingAPI.Players;
|
using TechbloxModdingAPI.Players;
|
||||||
using TechbloxModdingAPI.Tasks;
|
using TechbloxModdingAPI.Tasks;
|
||||||
using TechbloxModdingAPI.Utility;
|
using TechbloxModdingAPI.Utility;
|
||||||
|
|
|
@ -34,6 +34,12 @@ namespace TechbloxModdingAPI.Utility
|
||||||
Logging.LogWarning(wrappedException.ToString());
|
Logging.LogWarning(wrappedException.ToString());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
if (wrappers.ContainsKey(added))
|
||||||
|
{
|
||||||
|
original.eventHandler -= wrapped;
|
||||||
|
wrappers.Remove(added);
|
||||||
|
}
|
||||||
|
|
||||||
wrappers.Add(added, wrapped);
|
wrappers.Add(added, wrapped);
|
||||||
return new WrappedHandler<T> { eventHandler = original.eventHandler + wrapped };
|
return new WrappedHandler<T> { eventHandler = original.eventHandler + wrapped };
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue