@@ -175,7 +175,7 @@ namespace TechbloxModdingAPI.App | |||
public static MethodBase TargetMethod() | |||
{ | |||
return AccessTools.Method(typeof(FullGameCompositionRoot), "GoToMenu"); | |||
return AccessTools.Method(typeof(FullGameCompositionRoot), "SwitchToMenu"); | |||
} | |||
} | |||
@@ -22,7 +22,7 @@ namespace TechbloxModdingAPI.Blocks | |||
base(new EGID(id, CommonExclusiveGroups.ENGINE_BLOCK_BUILD_GROUP)) | |||
{ | |||
} | |||
/* | |||
/// <summary> | |||
/// Gets or sets the Engine's On property. May not be saved. | |||
/// </summary> | |||
@@ -34,6 +34,7 @@ namespace TechbloxModdingAPI.Blocks | |||
} | |||
set | |||
{ | |||
Techblox.BlockColours.BlockColoursCompositionRoot | |||
BlockEngine.GetBlockInfo<Techblox.EngineBlock.EngineBlockComponent>(this).engineOn = value; | |||
} | |||
} | |||
@@ -377,6 +378,6 @@ namespace TechbloxModdingAPI.Blocks | |||
{ | |||
BlockEngine.GetBlockInfo<Techblox.EngineBlock.EngineBlockReadonlyComponent>(this).manualToAutoGearCoolOffTime = value; | |||
} | |||
} | |||
}*/ | |||
} | |||
} |
@@ -173,7 +173,8 @@ namespace TechbloxModdingAPI.Blocks.Engines | |||
foreach (var block in blocks) | |||
{ | |||
GhostChildUtility.BuildGhostChild(in playerID, block.Id, in pos, in rot, entitiesDB, | |||
BuildGhostBlueprintFactory, false, bssesopt.Get().buildingDroneReference); | |||
BuildGhostBlueprintFactory, false, bssesopt.Get().buildingDroneReference, | |||
FullGameFields._managers.blockLabelResourceManager); | |||
} | |||
} | |||
@@ -272,7 +273,8 @@ namespace TechbloxModdingAPI.Blocks.Engines | |||
uint ghostChildBlockId = CommonExclusiveGroups.GetNewGhostChildBlockID(); | |||
var ghostEntityReference = GhostBlockUtils.GetGhostEntityReference(sourceId.entityID, entitiesDB); | |||
var entityInitializer = BuildGhostBlueprintFactory.Build( | |||
new EGID(ghostChildBlockId, BoxSelectExclusiveGroups.GhostChildEntitiesExclusiveGroup), /*dbStruct.DBID*/ (uint)BlockIDs.Cube); | |||
new EGID(ghostChildBlockId, BoxSelectExclusiveGroups.GhostChildEntitiesExclusiveGroup), /*dbStruct.DBID*/ (uint)BlockIDs.Cube, | |||
FullGameFields._managers.blockLabelResourceManager); | |||
entityInitializer.Init(dbStruct); | |||
entityInitializer.Init(new GFXPrefabEntityStructGPUI( | |||
PrefabsID.GetOrCreatePrefabID((ushort)entityInitializer.Get<PrefabAssetIDComponent>().prefabAssetID, | |||
@@ -1,4 +1,5 @@ | |||
using RobocraftX.Common; | |||
using RobocraftX.DOTS; | |||
using Svelto.ECS; | |||
using Svelto.ECS.EntityStructs; | |||
using Unity.Mathematics; | |||
@@ -39,7 +40,7 @@ namespace TechbloxModdingAPI.Blocks.Engines | |||
ref PositionEntityStruct posStruct = ref this.entitiesDB.QueryEntityOrDefault<PositionEntityStruct>(block); | |||
ref GridRotationStruct gridStruct = ref this.entitiesDB.QueryEntityOrDefault<GridRotationStruct>(block); | |||
ref LocalTransformEntityStruct transStruct = ref this.entitiesDB.QueryEntityOrDefault<LocalTransformEntityStruct>(block); | |||
ref UECSPhysicsEntityStruct phyStruct = ref this.entitiesDB.QueryEntityOrDefault<UECSPhysicsEntityStruct>(block); | |||
ref DOTSPhysicsEntityStruct phyStruct = ref this.entitiesDB.QueryEntityOrDefault<DOTSPhysicsEntityStruct>(block); | |||
// main (persistent) position | |||
posStruct.position = vector; | |||
// placement grid position | |||
@@ -49,7 +50,7 @@ namespace TechbloxModdingAPI.Blocks.Engines | |||
// collision position | |||
if (phyStruct.ID != default) | |||
{ //It exists | |||
FullGameFields._physicsWorld.EntityManager.SetComponentData(phyStruct.uecsEntity, new Translation | |||
FullGameFields._physicsWorld.EntityManager.SetComponentData(phyStruct.dotsEntity, new Translation | |||
{ | |||
Value = posStruct.position | |||
}); | |||
@@ -1,5 +1,5 @@ | |||
using RobocraftX.Common; | |||
using RobocraftX.UECS; | |||
using RobocraftX.DOTS; | |||
using Svelto.ECS; | |||
using Svelto.ECS.EntityStructs; | |||
using Unity.Mathematics; | |||
@@ -40,7 +40,7 @@ namespace TechbloxModdingAPI.Blocks.Engines | |||
ref RotationEntityStruct rotStruct = ref this.entitiesDB.QueryEntityOrDefault<RotationEntityStruct>(block); | |||
ref GridRotationStruct gridStruct = ref this.entitiesDB.QueryEntityOrDefault<GridRotationStruct>(block); | |||
ref LocalTransformEntityStruct transStruct = ref this.entitiesDB.QueryEntityOrDefault<LocalTransformEntityStruct>(block); | |||
ref UECSPhysicsEntityStruct phyStruct = ref this.entitiesDB.QueryEntityOrDefault<UECSPhysicsEntityStruct>(block); | |||
ref DOTSPhysicsEntityStruct phyStruct = ref this.entitiesDB.QueryEntityOrDefault<DOTSPhysicsEntityStruct>(block); | |||
// main (persistent) rotation | |||
Quaternion newRotation = rotStruct.rotation; | |||
newRotation.eulerAngles = vector; | |||
@@ -52,7 +52,7 @@ namespace TechbloxModdingAPI.Blocks.Engines | |||
// collision rotation | |||
if (phyStruct.ID != default) | |||
{ //It exists | |||
FullGameFields._physicsWorld.EntityManager.SetComponentData(phyStruct.uecsEntity, | |||
FullGameFields._physicsWorld.EntityManager.SetComponentData(phyStruct.dotsEntity, | |||
new Unity.Transforms.Rotation | |||
{ | |||
Value = rotStruct.rotation | |||
@@ -2,7 +2,7 @@ | |||
using HarmonyLib; | |||
using RobocraftX.Common; | |||
using RobocraftX.UECS; | |||
using RobocraftX.DOTS; | |||
using Svelto.ECS; | |||
using Unity.Entities; | |||
@@ -13,7 +13,7 @@ namespace TechbloxModdingAPI.Blocks.Engines | |||
{ | |||
public class ScalingEngine : IApiEngine | |||
{ | |||
private static IReactOnAddAndRemove<UECSPhysicsEntityCreationStruct> physicsEngine; | |||
private static IReactOnAddAndRemove<DOTSPhysicsEntityCreationStruct> physicsEngine; | |||
public void Ready() | |||
{ | |||
@@ -34,16 +34,16 @@ namespace TechbloxModdingAPI.Blocks.Engines | |||
if (_entityManager == default) | |||
_entityManager = FullGameFields._physicsWorld.EntityManager; | |||
//Assuming the block exists | |||
var entity = entitiesDB.QueryEntity<UECSPhysicsEntityStruct>(egid).uecsEntity; | |||
var pes = new UECSPhysicsEntityCreationStruct(); | |||
physicsEngine.Add(ref pes, egid); //Create new UECS entity | |||
var entity = entitiesDB.QueryEntity<DOTSPhysicsEntityStruct>(egid).dotsEntity; | |||
var pes = new DOTSPhysicsEntityCreationStruct(); | |||
physicsEngine.Add(ref pes, egid); //Create new DOTS entity | |||
_entityManager.DestroyEntity(entity); | |||
} | |||
[HarmonyPatch] | |||
class PhysicsEnginePatch | |||
{ | |||
static void Postfix(IReactOnAddAndRemove<UECSPhysicsEntityCreationStruct> __instance) | |||
static void Postfix(IReactOnAddAndRemove<DOTSPhysicsEntityCreationStruct> __instance) | |||
{ | |||
physicsEngine = __instance; | |||
Logging.MetaDebugLog("Physics engine injected."); | |||
@@ -51,7 +51,7 @@ namespace TechbloxModdingAPI.Blocks.Engines | |||
static MethodBase TargetMethod(Harmony instance) | |||
{ | |||
return AccessTools.Method("RobocraftX.StateSync.HandleUECSPhysicEntitiesWithPrefabCreationEngine" + | |||
return AccessTools.Method("RobocraftX.StateSync.HandleDOTSPhysicEntitiesWithPrefabCreationEngine" + | |||
":Ready"); | |||
} | |||
} | |||
@@ -1,34 +0,0 @@ | |||
using System; | |||
using System.Reflection; | |||
using HarmonyLib; | |||
using Svelto.ECS; | |||
using RobocraftX.CR.MainGame; | |||
using RobocraftX.Multiplayer; | |||
using RobocraftX.StateSync; | |||
using TechbloxModdingAPI.Utility; | |||
namespace TechbloxModdingAPI.Commands | |||
{ | |||
/// <summary> | |||
/// Patch of RobocraftX.CR.MainGame.MainGameCompositionRoot.DeterministicCompose<T>() | |||
/// Initializes custom commands | |||
/// </summary> | |||
[HarmonyPatch] | |||
static class CommandPatch | |||
{ | |||
public static void Postfix(StateSyncRegistrationHelper stateSyncReg) | |||
{ | |||
/*CommandLineCompositionRoot.Compose(contextHolder, stateSyncReg.enginesRoot, reloadGame, multiplayerParameters, | |||
stateSyncReg); - uREPL C# compilation not supported anymore */ | |||
var enginesRoot = stateSyncReg.enginesRoot; | |||
CommandManager.RegisterEngines(enginesRoot); | |||
} | |||
public static MethodInfo TargetMethod() | |||
{ | |||
return AccessTools.Method(typeof(MainGameCompositionRoot), "DeterministicCompose") | |||
.MakeGenericMethod(typeof(object)); | |||
} | |||
} | |||
} |
@@ -6,12 +6,13 @@ using RobocraftX.FrontEnd; | |||
using RobocraftX.StateSync; | |||
using Svelto.ECS; | |||
using Svelto.ECS.Schedulers; | |||
using TechbloxModdingAPI.Commands; | |||
using TechbloxModdingAPI.Utility; | |||
namespace TechbloxModdingAPI.Engines | |||
{ | |||
[HarmonyPatch] | |||
class GameLoadedEnginePatch | |||
static class GameLoadedTimeStoppedEnginePatch | |||
{ | |||
public static EntitiesSubmissionScheduler Scheduler { get; private set; } | |||
public static void Postfix(StateSyncRegistrationHelper stateSyncReg) | |||
@@ -19,11 +20,30 @@ namespace TechbloxModdingAPI.Engines | |||
// register all game engines, including deterministic | |||
GameEngineManager.RegisterEngines(stateSyncReg); | |||
Scheduler = stateSyncReg.enginesRoot.scheduler; | |||
// register command engines | |||
/*CommandLineCompositionRoot.Compose(contextHolder, stateSyncReg.enginesRoot, reloadGame, multiplayerParameters, | |||
stateSyncReg); - uREPL C# compilation not supported anymore */ | |||
CommandManager.RegisterEngines(stateSyncReg.enginesRoot); | |||
} | |||
public static MethodBase TargetMethod() | |||
{ | |||
return AccessTools.Method(typeof(MainGameCompositionRoot), "DeterministicCompose").MakeGenericMethod(typeof(object)); | |||
return AccessTools.Method(typeof(MainGameCompositionRoot), "DeterministicTimeStoppedCompose").MakeGenericMethod(typeof(object)); | |||
} | |||
} | |||
[HarmonyPatch] | |||
static class GameLoadedTimeRunningEnginePatch | |||
{ | |||
public static EntitiesSubmissionScheduler Scheduler { get; private set; } | |||
public static void Postfix(StateSyncRegistrationHelper stateSyncReg) | |||
{ | |||
GameLoadedTimeStoppedEnginePatch.Postfix(stateSyncReg); | |||
} | |||
public static MethodBase TargetMethod() | |||
{ | |||
return AccessTools.Method(typeof(MainGameCompositionRoot), "DeterministicTimeRunningCompose").MakeGenericMethod(typeof(object)); | |||
} | |||
} | |||
@@ -1,15 +1,15 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Reflection; | |||
using HarmonyLib; | |||
using RobocraftX; | |||
using RobocraftX.Schedulers; | |||
using RobocraftX.Services; | |||
using Svelto.Context; | |||
using Svelto.Tasks.ExtraLean; | |||
using Svelto.Tasks; | |||
using TechbloxModdingAPI.App; | |||
using TechbloxModdingAPI.Blocks; | |||
using TechbloxModdingAPI.Events; | |||
using TechbloxModdingAPI.Tasks; | |||
using TechbloxModdingAPI.Utility; | |||
@@ -78,9 +78,20 @@ namespace TechbloxModdingAPI | |||
// init UI | |||
Interface.IMGUI.Constants.Init(); | |||
Interface.IMGUI.IMGUIManager.Init(); | |||
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)); | |||
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. | |||
@@ -109,5 +120,34 @@ 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; | |||
} | |||
} | |||
} |
@@ -187,8 +187,6 @@ namespace TechbloxModdingAPI | |||
public float Mass => | |||
1f / playerEngine.GetCharacterStruct<RigidBodyEntityStruct>(Id).Get().physicsMass.InverseMass; | |||
private float _ping = -1f; | |||
/// <summary> | |||
/// The player's latest network ping time. | |||
/// </summary> | |||
@@ -197,12 +195,7 @@ namespace TechbloxModdingAPI | |||
{ | |||
get | |||
{ | |||
var opt = playerEngine.GetPlayerStruct<PlayerNetworkStatsEntityStruct>(Id, Type); | |||
if (opt) | |||
{ | |||
_ping = opt.Get().lastPingTimeSinceLevelLoad ?? _ping; | |||
} | |||
return _ping; | |||
return playerEngine.GetPing() / 1000f; | |||
} | |||
} | |||
@@ -10,6 +10,7 @@ using RobocraftX.Physics; | |||
using RobocraftX.Blocks.Ghost; | |||
using Gamecraft.GUI.HUDFeedbackBlocks; | |||
using RobocraftX.Blocks; | |||
using RobocraftX.Multiplayer; | |||
using RobocraftX.PilotSeat; | |||
using Svelto.ECS; | |||
using Techblox.Camera; | |||
@@ -227,5 +228,12 @@ namespace TechbloxModdingAPI.Players | |||
opt.Get().instantExit = true; | |||
entitiesDB.PublishEntityChange<CharacterPilotSeatEntityStruct>(egid); | |||
} | |||
public uint GetPing() | |||
{ | |||
return entitiesDB | |||
.QueryUniqueEntity<NetworkStatsEntityStruct>(MultiplayerExclusiveGroups.MultiplayerStateGroup) | |||
.networkStats.PingMs; | |||
} | |||
} | |||
} |
@@ -360,15 +360,6 @@ namespace TechbloxModdingAPI.Tests | |||
return modsString = sb.ToString(); | |||
} | |||
public override void OnUpdate() | |||
{ | |||
if (UnityEngine.Input.GetKeyDown(KeyCode.End)) | |||
{ | |||
Console.WriteLine("Pressed button to toggle console"); | |||
FakeInput.CustomInput(new LocalCosmeticInputEntityComponent {commandLineToggleInput = true}); | |||
} | |||
} | |||
[HarmonyPatch] | |||
public class MinimumSpecsPatch | |||
{ | |||
@@ -1,20 +1,12 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Text; | |||
using System.Threading.Tasks; | |||
using DataLoader; | |||
using DataLoader; | |||
using HarmonyLib; | |||
using RobocraftX; | |||
using RobocraftX.Common.Utilities; | |||
using RobocraftX.CR.MainGame; | |||
using RobocraftX.GUI; | |||
using RobocraftX.Multiplayer; | |||
using RobocraftX.Rendering; | |||
using Svelto.Context; | |||
using Svelto.DataStructures; | |||
using Svelto.ECS; | |||
using Svelto.ECS.Schedulers; | |||
using UnityEngine; | |||
using Unity.Entities; | |||
using Unity.Physics.Systems; | |||
@@ -128,11 +120,11 @@ namespace TechbloxModdingAPI.Utility | |||
} | |||
} | |||
public static ECSGameObjectResourceManager _eCsGameObjectResourceManager | |||
public static ECSResourceManagers _managers | |||
{ | |||
get | |||
{ | |||
return (ECSGameObjectResourceManager)fgcr?.Field("_eCsGameObjectResourceManager").GetValue(); | |||
return (ECSResourceManagers)fgcr?.Field("_managers").GetValue(); | |||
} | |||
} | |||