|
|
@@ -0,0 +1,159 @@ |
|
|
|
using System; |
|
|
|
using System.Collections; |
|
|
|
using System.Collections.Generic; |
|
|
|
using System.Linq; |
|
|
|
using System.Reflection; |
|
|
|
using System.Reflection.Emit; |
|
|
|
using System.Text.Formatting; |
|
|
|
using DataLoader; |
|
|
|
using GamecraftModdingAPI.Utility; |
|
|
|
using GPUInstancer; |
|
|
|
using HarmonyLib; |
|
|
|
using RobocraftX.Common; |
|
|
|
using RobocraftX.Schedulers; |
|
|
|
using Svelto.Tasks; |
|
|
|
using Svelto.Tasks.ExtraLean; |
|
|
|
using UnityEngine; |
|
|
|
using UnityEngine.AddressableAssets; |
|
|
|
|
|
|
|
namespace GamecraftModdingAPI.Blocks |
|
|
|
{ |
|
|
|
public class CustomBlock |
|
|
|
{ |
|
|
|
private static ushort nextID = 500; |
|
|
|
public static void RegisterCustomBlock(string path) |
|
|
|
{ |
|
|
|
var prefabData = new List<PrefabData>(); |
|
|
|
//category ID: |
|
|
|
//0 - regular |
|
|
|
//1 - joint |
|
|
|
//2 - controller |
|
|
|
uint prefabId = PrefabsID.FetchNewPrefabID(PrefabsID.GenerateDBID(0, nextID++)); |
|
|
|
prefabData.Add(new PrefabData() |
|
|
|
{ |
|
|
|
prefabName = path, |
|
|
|
prefabId = prefabId |
|
|
|
}); |
|
|
|
var loadTask = Addressables.LoadAssetAsync<GameObject>(path); |
|
|
|
AccessTools.Method("RobocraftX.Common.ECSGPUIResourceManager:RegisterPrefab") |
|
|
|
.Invoke(ECSGPUIResourceManager.Instance, new object[] {prefabId, loadTask.Result, 1}); |
|
|
|
} |
|
|
|
|
|
|
|
[HarmonyPatch] |
|
|
|
public static class Patch |
|
|
|
{ |
|
|
|
/*public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) |
|
|
|
{ |
|
|
|
var list = new List<CodeInstruction>(instructions); |
|
|
|
try |
|
|
|
{ |
|
|
|
*int index = -1; |
|
|
|
CodeInstruction loadTask = null; |
|
|
|
for (var i = 0; i < list.Count - 1; i++) |
|
|
|
{ |
|
|
|
if (list[i].opcode == OpCodes.Ldfld |
|
|
|
&& ((string) list[i].operand).Contains("renderingWorld") |
|
|
|
&& list[i + 1].opcode == OpCodes.Brfalse_S) |
|
|
|
index = i - 1; //It loads 'this' first |
|
|
|
if (list[i].opcode == OpCodes.Ldflda |
|
|
|
&& ((string) list[i].operand).Contains("loadTask")) |
|
|
|
loadTask = new CodeInstruction(list[i]); |
|
|
|
}* |
|
|
|
|
|
|
|
var array = new[] |
|
|
|
{ |
|
|
|
//Set Yield.It to be returned (current) |
|
|
|
new CodeInstruction(OpCodes.Ldarg_0), // this |
|
|
|
new CodeInstruction(OpCodes.Ldsfld, |
|
|
|
typeof(Yield).GetField("It", BindingFlags.Public | BindingFlags.Static)), |
|
|
|
new CodeInstruction(OpCodes.Stfld, "object RobocraftX.Common.ECSResourceManagerUtility/'<RegisterPrefabs>d__0'::'<>2__current'"), |
|
|
|
|
|
|
|
//Set which yield return we're at (state) |
|
|
|
new CodeInstruction(OpCodes.Ldarg_0), // this |
|
|
|
new CodeInstruction(OpCodes.Ldc_I4_1), |
|
|
|
//new CodeInstruction(OpCodes.Call, ((Action<StringBuffer>)AddInfo).Method) |
|
|
|
}; |
|
|
|
list.InsertRange(index, array); |
|
|
|
* |
|
|
|
IL_00ad: ldarg.0 // this |
|
|
|
IL_00ae: ldsfld class [Svelto.Tasks]Svelto.Tasks.Yield [Svelto.Tasks]Svelto.Tasks.Yield::It |
|
|
|
IL_00b3: stfld object RobocraftX.Common.ECSResourceManagerUtility/'<RegisterPrefabs>d__0'::'<>2__current' |
|
|
|
|
|
|
|
IL_0072: ldarg.0 // this |
|
|
|
IL_0073: ldnull |
|
|
|
IL_0074: stfld object RobocraftX.Common.ECSResourceManagerUtility/'<RegisterPrefabs>d__0'::'<>2__current' |
|
|
|
IL_0079: ldarg.0 // this |
|
|
|
IL_007a: ldc.i4.2 |
|
|
|
IL_007b: stfld object RobocraftX.Common.ECSResourceManagerUtility/'<RegisterPrefabs>d__0'::'<>1__state' |
|
|
|
IL_0080: ldc.i4.1 |
|
|
|
IL_0081: ret |
|
|
|
* |
|
|
|
yield break; |
|
|
|
} |
|
|
|
catch (Exception e) |
|
|
|
{ |
|
|
|
Logging.LogWarning("Failed to inject AddInfo method for the debug display!\n" + e); |
|
|
|
} |
|
|
|
}*/ |
|
|
|
|
|
|
|
public static void Prefix(ref Dictionary<string, BaseData> blocks) |
|
|
|
{ |
|
|
|
/*foreach (var block in blocks.Values.Cast<CubeListData>()) |
|
|
|
{ |
|
|
|
Console.WriteLine("Block info: " + block); |
|
|
|
}*/ |
|
|
|
|
|
|
|
/*var res = Addressables.LoadContentCatalogAsync("customCatalog.json"); |
|
|
|
while (!res.IsDone) yield return Yield.It;*/ |
|
|
|
|
|
|
|
blocks.Add("modded_ConsoleBlock", new CubeListData |
|
|
|
{ |
|
|
|
cubeType = CubeType.Block, |
|
|
|
cubeCategory = CubeCategory.ConsoleBlock, |
|
|
|
inventoryCategory = InventoryCategory.Logic, |
|
|
|
ID = 500, |
|
|
|
Path = "Assets/Cube.prefab", //Index out of range exception: Asset failed to load (wrong path) |
|
|
|
SpriteName = "CTR_CommandBlock", |
|
|
|
CubeNameKey = "strConsoleBlock", |
|
|
|
SelectableFaces = new[] {0, 1, 2, 3, 4, 5}, |
|
|
|
GridScale = new[] {1, 1, 1}, |
|
|
|
Mass = 1, |
|
|
|
JointBreakAngle = 1 |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
public static MethodBase TargetMethod() |
|
|
|
{ //General block registration |
|
|
|
return AccessTools.Method("RobocraftX.Blocks.BlocksCompositionRoot:RegisterPartPrefabs"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
[HarmonyPatch] |
|
|
|
public static class GOPatch |
|
|
|
{ |
|
|
|
public static void Prefix(uint prefabID, GameObject gameObject) |
|
|
|
{ |
|
|
|
Console.WriteLine("ID: " + prefabID + " - Name: " + gameObject.name); |
|
|
|
if (gameObject.name == "Cube") |
|
|
|
ECSGPUIResourceManager.Instance.RegisterRuntimePrefabs( |
|
|
|
new[] {new PrefabData {prefabId = 500, prefabName = "Assets/Cube.prefab"}}, |
|
|
|
new List<GameObject> {gameObject}, 1).Complete(); |
|
|
|
} |
|
|
|
|
|
|
|
public static MethodBase TargetMethod() |
|
|
|
{ |
|
|
|
return AccessTools.Method("RobocraftX.Common.ECSGPUIResourceManager:RegisterPrefab", |
|
|
|
new[] {typeof(uint), typeof(GameObject), typeof(uint)}); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public static IEnumerator Prep() |
|
|
|
{ |
|
|
|
Console.WriteLine("Loading custom catalog..."); |
|
|
|
var res = Addressables.LoadContentCatalogAsync("customCatalog.json"); |
|
|
|
while (!res.IsDone) yield return Yield.It; |
|
|
|
Console.WriteLine("Loaded custom catalog: " + res.Result.LocatorId); |
|
|
|
Addressables.AddResourceLocator(res.Result); |
|
|
|
} |
|
|
|
} |
|
|
|
} |