using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Reflection.Emit; using System.Text.Formatting; using GamecraftModdingAPI.Blocks; using GamecraftModdingAPI.Engines; using GamecraftModdingAPI.Players; using HarmonyLib; using RobocraftX.GUI.Debug; using Svelto.ECS; using Svelto.ECS.Experimental; namespace GamecraftModdingAPI.Utility { public class DebugInterfaceEngine : IApiEngine { private static Dictionary> _extraInfo=new Dictionary>(); public void Ready() { SetInfo("lookedAt", LookedAt); } public EntitiesDB entitiesDB { get; set; } public void Dispose() { } public void SetInfo(string id, Func contentGetter) => _extraInfo[id] = contentGetter; public bool RemoveInfo(string id) => _extraInfo.Remove(id); private Player player; private string LookedAt() { if (player == null) player = new Player(PlayerType.Local); Block block = player.GetBlockLookedAt(); if (block == null) return "Block: none"; return "Block: " + block.Type + "\nColor: " + block.Color + "\n" + "At: " + block.Position; } public string Name { get; } = "GamecraftModdingAPIDebugInterfaceGameEngine"; public bool isRemovable { get; } = true; [HarmonyPatch] private class Patch { public static IEnumerable Transpiler(IEnumerable instructions) { var list = new List(instructions); try { //Before setting the text from the StringBuffer int index = list.FindLastIndex(inst => inst.opcode == OpCodes.Ldfld); var array = new CodeInstruction[] { new CodeInstruction(OpCodes.Ldloc_0), //StringBuffer new CodeInstruction(OpCodes.Call, ((Action)AddInfo).Method) }; list.InsertRange(index, array); } catch (Exception e) { Console.WriteLine(e); } return list; } public static void AddInfo(StringBuffer sb) { foreach (var info in _extraInfo.Values) sb.Append(info() + "\n"); } public static MethodInfo TargetMethod() { return AccessTools.Method("RobocraftX.GUI.Debug.DebugDisplayEngine:UpdateDisplay"); } } } }