@@ -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> | |||
/// The grid block used by the world editor, named Small Grid like the other one | |||
/// </summary> | |||
SmallGridInWorldEditor | |||
SmallGridInWorldEditor, | |||
SegoeUITextblock = 376, | |||
GravtracTextblock, | |||
HauserTextblock, | |||
TechnopollasTextblock, | |||
BitBlock = 385, | |||
Timer | |||
} | |||
} |
@@ -1,12 +1,10 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Reflection; | |||
using HarmonyLib; | |||
using RobocraftX; | |||
using RobocraftX.Services; | |||
using Svelto.Context; | |||
using Svelto.Tasks; | |||
using TechbloxModdingAPI.App; | |||
using TechbloxModdingAPI.Blocks; | |||
@@ -72,26 +70,20 @@ namespace TechbloxModdingAPI | |||
Block.Init(); | |||
BlockGroup.Init(); | |||
Wire.Init(); | |||
// init client | |||
Logging.MetaDebugLog($"Initializing Client"); | |||
Client.Init(); | |||
Game.Init(); | |||
// init UI | |||
Logging.MetaDebugLog($"Initializing UI"); | |||
Interface.IMGUI.Constants.Init(); | |||
Interface.IMGUI.IMGUIManager.Init(); | |||
// init anti-anticheat | |||
Logging.MetaDebugLog("Initializing anti-anticheat"); | |||
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)); | |||
AntiAntiCheatPatch.Init(harmony); | |||
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> | |||
/// Shuts down & cleans up the TechbloxModdingAPI. | |||
/// Call this as late as possible before Techblox quits. | |||
@@ -120,34 +112,5 @@ namespace TechbloxModdingAPI | |||
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."); | |||
} | |||
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.Movement; | |||
using Svelto.ECS; | |||
using TechbloxModdingAPI.Engines; | |||
using TechbloxModdingAPI.Utility; | |||
namespace TechbloxModdingAPI.Players | |||
{ | |||
@@ -21,7 +23,7 @@ namespace TechbloxModdingAPI.Players | |||
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), | |||
e => new Player(e.entityID)); | |||
if (previousGroup == CharacterExclusiveGroups.InPilotSeatGroup) | |||
@@ -10,12 +10,10 @@ using IllusionInjector; | |||
using RobocraftX.FrontEnd; | |||
using Unity.Mathematics; | |||
using UnityEngine; | |||
using RobocraftX.Common.Input; | |||
using Svelto.Tasks; | |||
using Svelto.Tasks.Lean; | |||
using TechbloxModdingAPI.Blocks; | |||
using TechbloxModdingAPI.Commands; | |||
using TechbloxModdingAPI.Input; | |||
using TechbloxModdingAPI.Players; | |||
using TechbloxModdingAPI.Tasks; | |||
using TechbloxModdingAPI.Utility; | |||
@@ -34,6 +34,12 @@ namespace TechbloxModdingAPI.Utility | |||
Logging.LogWarning(wrappedException.ToString()); | |||
} | |||
}; | |||
if (wrappers.ContainsKey(added)) | |||
{ | |||
original.eventHandler -= wrapped; | |||
wrappers.Remove(added); | |||
} | |||
wrappers.Add(added, wrapped); | |||
return new WrappedHandler<T> { eventHandler = original.eventHandler + wrapped }; | |||
} | |||