Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of VRJesterMod v1.0.1
plugins/VRJesterMod.dll
Decompiled a year agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using BepInEx; using BepInEx.Logging; using Microsoft.CodeAnalysis; using Newtonsoft.Json; using Rewired.Utils; using RoR2; using UnityEngine; using UnityEngine.XR; using VRJester.Core; using VRJester.Core.Radix; using VRJester.Core.Recog; using VRJester.Utils; using VRJester.Utils.VRData; using VRJester.Vox; using Valve.VR; using WindowsInput; using WindowsInput.Native; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")] [assembly: AssemblyCompany("VRJesterMod")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+e07bef45b54d27ac35b6fc0daa65970a4b67b019")] [assembly: AssemblyProduct("VRJesterMod")] [assembly: AssemblyTitle("VRJesterMod")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class IsReadOnlyAttribute : Attribute { } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } internal static class IsExternalInit { } } namespace VRJester { public class Config { public string GESTURE_NAME = "GESTURE 1"; public bool RECORD_MODE = false; public bool READ_DATA = false; public bool WRITE_DATA = false; public bool DEBUG_MODE = false; public float VHERE_RADIUS = 0.3f; public int INTERVAL_DELAY = 20; public int MAX_LISTENING_TIME = 400; public Dictionary<string, Dictionary<string, string>> GESTURE_ACTIONS = new Dictionary<string, Dictionary<string, string>>(); public static Config ReadConfig() { try { StringBuilder stringBuilder = new StringBuilder(); StreamReader streamReader = new StreamReader(Constants.CONFIG_PATH); string text = streamReader.ReadLine(); stringBuilder.Append(text); while (text != null) { text = streamReader.ReadLine(); stringBuilder.Append(text); } streamReader.Close(); Console.ReadLine(); return JsonConvert.DeserializeObject<Config>(stringBuilder.ToString()); } catch (FileNotFoundException) { Log.Error("An error occurred reading config json! Attempting to generate new config..."); WriteConfig(); } catch (JsonException) { Log.Error("An error occurred reading config json! Check if VRJesterAPI.cfg is malformed."); } return new Config(); } public static Config ReadConfig(string configPath) { try { StringBuilder stringBuilder = new StringBuilder(); StreamReader streamReader = new StreamReader(configPath); string text = streamReader.ReadLine(); stringBuilder.Append(text); while (text != null) { text = streamReader.ReadLine(); stringBuilder.Append(text); } streamReader.Close(); Console.ReadLine(); return JsonConvert.DeserializeObject<Config>(stringBuilder.ToString()); } catch (FileNotFoundException) { Log.Error("An error occurred reading config json! Attempting to generate new config..."); WriteConfig(); } catch (JsonException) { Log.Error("An error occurred reading config json! Check if VRJesterAPI.cfg is malformed."); } return ReadConfig(); } public static void WriteConfig() { //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Expected O, but got Unknown //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Expected O, but got Unknown try { Config config = new Config(); Dictionary<string, string> value = new Dictionary<string, string> { ["KEY_BIND"] = "R", ["KEY_ACTION"] = "click" }; config.GESTURE_ACTIONS["STRIKE"] = value; Dictionary<string, string> value2 = new Dictionary<string, string> { ["KEY_BIND"] = "M2", ["KEY_ACTION"] = "hold" }; config.GESTURE_ACTIONS["UPPERCUT"] = value2; Dictionary<string, string> value3 = new Dictionary<string, string> { ["KEY_BIND"] = "LSHIFT", ["KEY_ACTION"] = "click" }; config.GESTURE_ACTIONS["BURST"] = value3; using StreamWriter streamWriter = new StreamWriter(Constants.CONFIG_PATH); JsonTextWriter val = new JsonTextWriter((TextWriter)streamWriter); try { ((JsonWriter)val).Formatting = (Formatting)1; JsonSerializer val2 = new JsonSerializer(); val2.Serialize((JsonWriter)(object)val, (object)config); } finally { ((IDisposable)val)?.Dispose(); } } catch (IOException ex) { Log.Error("An error occurred writing config json!"); Log.Error(ex.ToString()); Log.Error(ex.StackTrace); } } public static void WriteConfig(Config config) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Expected O, but got Unknown //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown try { using StreamWriter streamWriter = new StreamWriter(Constants.CONFIG_PATH); JsonTextWriter val = new JsonTextWriter((TextWriter)streamWriter); try { ((JsonWriter)val).Formatting = (Formatting)1; JsonSerializer val2 = new JsonSerializer(); val2.Serialize((JsonWriter)(object)val, (object)config); } finally { ((IDisposable)val)?.Dispose(); } } catch (IOException ex) { Log.Error("An error occurred writing config json!"); Log.Error(ex.StackTrace); } } public static void WriteGestureStore() { List<GestureComponent> hmdGesture = new List<GestureComponent>(); List<GestureComponent> list = new List<GestureComponent>(); List<GestureComponent> list2 = new List<GestureComponent>(); List<GestureComponent> list3 = new List<GestureComponent>(); List<GestureComponent> list4 = new List<GestureComponent>(); List<GestureComponent> list5 = new List<GestureComponent>(); List<GestureComponent> list6 = new List<GestureComponent>(); IDictionary<string, int> devicesInProximity = new Dictionary<string, int>(); string direction = "*"; GestureComponent item = new GestureComponent("RIGHT_CONTROLLER", "forward", 0L, 0.0, direction, devicesInProximity); GestureComponent item2 = new GestureComponent("RIGHT_CONTROLLER", "up", 0L, 0.0, direction, devicesInProximity); GestureComponent item3 = new GestureComponent("RIGHT_CONTROLLER", "forward", 2000L, 0.0, direction, devicesInProximity); GestureComponent item4 = new GestureComponent("LEFT_CONTROLLER", "forward", 0L, 0.0, direction, devicesInProximity); GestureComponent item5 = new GestureComponent("LEFT_CONTROLLER", "up", 0L, 0.0, direction, devicesInProximity); GestureComponent item6 = new GestureComponent("LEFT_CONTROLLER", "forward", 2000L, 0.0, direction, devicesInProximity); list.Add(item); list4.Add(item4); Gesture gesture = new Gesture(hmdGesture, list, list4); gesture.validDevices.Add("RIGHT_CONTROLLER"); gesture.validDevices.Add("LEFT_CONTROLLER"); GestureHandler.gestures.Store(gesture, "STRIKE"); list2.Add(item); list2.Add(item2); list5.Add(item4); list5.Add(item5); Gesture gesture2 = new Gesture(hmdGesture, list2, list5); gesture2.validDevices.Add("RIGHT_CONTROLLER"); gesture2.validDevices.Add("LEFT_CONTROLLER"); GestureHandler.gestures.Store(gesture2, "UPPERCUT"); list3.Add(item3); list6.Add(item6); Gesture gesture3 = new Gesture(hmdGesture, list3, list6); GestureHandler.gestures.Store(gesture3, "BURST"); GestureHandler.gestures.Write(); } } public abstract class Constants { public const string CONFIG_FILE = "VRJesterMod.cfg"; public static readonly string CONFIG_PATH = Path.Combine(Paths.ConfigPath, "VRJesterMod.cfg"); public const string GESTURE_STORE_FILE = "VRGestureStore.json"; public static readonly string GESTURE_STORE_PATH = Path.Combine(Paths.ConfigPath, "VRGestureStore.json"); public const string DEV_ROOT_PATH = ""; public const string DEV_CONFIG_PATH = ""; public const string DEV_GESTURE_STORE_PATH = ""; public const string DEV_ARCHIVE_PATH = ""; public const string SAMPLE_GESTURE_NAME = "GESTURE 1"; public const bool RECORD_MODE = false; public const bool READ_DATA = false; public const bool WRITE_DATA = false; public const bool DEBUG_MODE = false; public const float VOX_LENGTH = 0.6f; public const float VHERE_RADIUS = 0.3f; public const int INTERVAL_DELAY = 20; public const int MAX_LISTENING_TIME = 400; public const double VERTICAL_DEGREE_SPAN = 0.85; public const float CARDINAL_DEGREE_SPAN = 45f; public const float DIRECTION_DEGREE_SPAN = 30f; public const string HMD = "HEAD_MOUNTED_DISPLAY"; public const string RC = "RIGHT_CONTROLLER"; public const string LC = "LEFT_CONTROLLER"; public const string C2 = "EXTRA_TRACKER"; public static IList<string> DEVICES = new List<string>(3) { "HEAD_MOUNTED_DISPLAY", "RIGHT_CONTROLLER", "LEFT_CONTROLLER" }; } public class GestureHandler : MonoBehaviour { public static Config config = Config.ReadConfig(); private static VRDataState vrDataState; private static string previousGesture = ""; private static Gesture gesture; public static Gestures gestures = new Gestures(config, Constants.GESTURE_STORE_PATH); public static readonly Recognition recognition = new Recognition(gestures); private static readonly int DELAY = config.INTERVAL_DELAY; private static int sleep = DELAY; private static int limiter = config.MAX_LISTENING_TIME; public static Config ReloadConfigs() { config = Config.ReadConfig(); gestures.Load(); VRJesterMod.SetupKeyBinds(); return config; } private void Update() { if (Input.GetKeyDown((KeyCode)103)) { ReloadConfigs(); } if (VRJesterMod.VR_LOADED) { if (Input.GetKeyDown((KeyCode)103)) { Log.Info("Reloading configs..."); ReloadConfigs(); ResetJesterListener(); } HandleVrGesture(); } } private void HandleVrGesture() { vrDataState = new VRDataState(); if (gesture == null) { gesture = new Gesture(vrDataState); } else { gesture.Track(vrDataState); } Dictionary<string, string> dictionary = recognition.Recognize(gesture); if (sleep != 0 && dictionary.Count != 0 && !previousGesture.Equals(dictionary["gestureName"])) { previousGesture = dictionary["gestureName"]; ((MonoBehaviour)this).StartCoroutine(TriggerAction(previousGesture)); sleep = DELAY; limiter = config.MAX_LISTENING_TIME; } if (sleep == 0) { ResetJesterListener(); sleep = DELAY; } sleep--; } private static void ResetJesterListener() { gesture = null; previousGesture = ""; limiter = config.MAX_LISTENING_TIME; } private static IEnumerator TriggerAction(string gestureName) { config.GESTURE_ACTIONS.TryGetValue(gestureName, out var gestureAction); gestureAction.TryGetValue("KEY_BIND", out var keyBind); gestureAction.TryGetValue("KEY_ACTION", out var keyAction); VRJesterMod.KEY_MAPPINGS.TryGetValue(keyBind, out var keyCode); if ((int)keyCode < 5) { yield return MousePress(keyCode, keyAction); } else { yield return KeyboardPress(keyCode, keyAction); } } private static IEnumerator MousePress(VirtualKeyCode keyCode, string keyAction) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) if (keyAction.ToLower() == "click" && (int)keyCode == 1) { VRJesterMod.SIM.Mouse.LeftButtonDown(); yield return null; yield return null; VRJesterMod.SIM.Mouse.LeftButtonUp(); } else if (keyAction.ToLower() == "click" && (int)keyCode == 2) { VRJesterMod.SIM.Mouse.RightButtonDown(); yield return null; yield return null; VRJesterMod.SIM.Mouse.RightButtonUp(); } else if (keyAction.ToLower() == "hold" && (int)keyCode == 1) { VRJesterMod.SIM.Mouse.LeftButtonDown(); } else if (keyAction.ToLower() == "release" && (int)keyCode == 1) { VRJesterMod.SIM.Mouse.LeftButtonUp(); } else if (keyAction.ToLower() == "hold" && (int)keyCode == 2) { VRJesterMod.SIM.Mouse.RightButtonDown(); } else if (keyAction.ToLower() == "release" && (int)keyCode == 2) { VRJesterMod.SIM.Mouse.RightButtonUp(); } } private static IEnumerator KeyboardPress(VirtualKeyCode keyCode, string keyAction) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) if (keyAction.ToLower() == "click") { VRJesterMod.SIM.Keyboard.KeyDown(keyCode); yield return null; yield return null; VRJesterMod.SIM.Keyboard.KeyUp(keyCode); } else if (keyAction.ToLower() == "hold") { VRJesterMod.SIM.Keyboard.KeyDown(keyCode); } else if (keyAction.ToLower() == "release") { VRJesterMod.SIM.Keyboard.KeyUp(keyCode); } } } internal static class Log { private static ManualLogSource _logSource; internal static void Init(ManualLogSource logSource) { _logSource = logSource; } internal static void Debug(object data) { _logSource.LogDebug(data); } internal static void Error(object data) { _logSource.LogError(data); } internal static void Fatal(object data) { _logSource.LogFatal(data); } internal static void Info(object data) { _logSource.LogInfo(data); } internal static void Message(object data) { _logSource.LogMessage(data); } internal static void Warning(object data) { _logSource.LogWarning(data); } } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("com.cali.vrjester", "VRJesterMod", "1.0.0")] public class VRJesterMod : BaseUnityPlugin { public const string PluginAuthor = "Caliburs"; public static CVRSystem VR_SYSTEM = null; public static bool VR_LOADED = false; public static Dictionary<string, VirtualKeyCode> KEY_MAPPINGS = new Dictionary<string, VirtualKeyCode>(); public static InputSimulator SIM = new InputSimulator(); public void Awake() { Log.Init(((BaseUnityPlugin)this).Logger); ((Component)this).gameObject.AddComponent(typeof(GestureHandler)); SetupConfig(); SetupClient(); RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, (Action)delegate { ((MonoBehaviour)this).StartCoroutine(InitVRJester()); }); } private IEnumerator InitVRJester() { yield return null; EVRInitError eError = (EVRInitError)0; CVRSystem VR_SYSTEM = OpenVR.Init(ref eError, (EVRApplicationType)3, ""); if (!ExtensionMethods.IsNullOrDestroyed((object)VR_SYSTEM)) { Log.Info("OpenVR Background Process Initialized..."); Log.Info("Is tracked device connected ? " + VR_SYSTEM.IsTrackedDeviceConnected(0u)); VR_LOADED = true; } else { Log.Info("Running in Non-VR Mode..."); VR_LOADED = false; } } private static void SetupConfig() { Log.Info("Setting up config files..."); if (!File.Exists(Constants.CONFIG_PATH)) { Config.WriteConfig(); } if (!File.Exists(Constants.GESTURE_STORE_PATH)) { Config.WriteGestureStore(); } } private static void SetupClient() { Log.Info("Setting up client..."); GestureHandler.config = Config.ReadConfig(); GestureHandler.gestures.Load(); SetupKeyBinds(); } public static void SetupKeyBinds() { //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_0133: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Unknown result type (might be due to invalid IL or missing references) //IL_0180: Unknown result type (might be due to invalid IL or missing references) //IL_0185: Unknown result type (might be due to invalid IL or missing references) //IL_018d: Unknown result type (might be due to invalid IL or missing references) Log.Info("Setting up key bindings..."); foreach (Dictionary<string, string> value6 in GestureHandler.config.GESTURE_ACTIONS.Values) { value6.TryGetValue("KEY_BIND", out var value); if (value.Length == 1) { VirtualKeyCode value2 = (VirtualKeyCode)Enum.Parse(typeof(VirtualKeyCode), "VK_" + value.ToUpper()); KEY_MAPPINGS[value] = value2; Log.Debug("Storing key bind: " + value + " -> " + ((object)(VirtualKeyCode)(ref value2)).ToString()); continue; } if (value.Length == 0) { Log.Debug("Key bind not found!"); continue; } if (value.ToUpper() == "M1") { VirtualKeyCode value3 = (VirtualKeyCode)1; KEY_MAPPINGS[value] = value3; Log.Debug("Storing key bind: " + value + " -> " + ((object)(VirtualKeyCode)(ref value3)).ToString()); continue; } if (value.ToUpper() == "M2") { VirtualKeyCode value4 = (VirtualKeyCode)2; KEY_MAPPINGS[value] = value4; Log.Debug("Storing key bind: " + value + " -> " + ((object)(VirtualKeyCode)(ref value4)).ToString()); continue; } try { VirtualKeyCode value5 = (VirtualKeyCode)Enum.Parse(typeof(VirtualKeyCode), value.ToUpper()); KEY_MAPPINGS[value] = value5; Log.Debug("Storing key bind: " + value + " -> " + ((object)(VirtualKeyCode)(ref value5)).ToString()); } catch (ArgumentException) { Log.Warning("Key bind not found! Failed to store key bind: " + value); } } } } } namespace VRJester.Vox { public class Vhere { private readonly VRDevice vrDevice; public readonly Config config; private int id; private int previousId; private string movementDirection = "idle"; private GestureTrace gestureTrace; public Vector3 centroid; public Quaternion faceDirection; public float sphereRadius = 0.3f; public GestureTrace Trace => gestureTrace; public int Id { get { return id; } set { id = value; } } public int PreviousId { get { return previousId; } set { previousId = value; } } public VRDevice VrDevice => vrDevice; public Vhere(VRDevice vrDevice, VRPose centroidPose, Quaternion faceDirection, string configPath) { //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) config = Config.ReadConfig(configPath); if (config.VHERE_RADIUS != sphereRadius) { sphereRadius = config.VHERE_RADIUS; } id = 0; previousId = id; this.vrDevice = vrDevice; this.faceDirection = faceDirection; gestureTrace = new GestureTrace(Convert.ToString(id), vrDevice, centroidPose, faceDirection); UpdateVherePosition(centroidPose.Position); } public bool HasPoint(Vector3 point) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) double num = Math.Pow(point.x - centroid.x, 2.0); double num2 = Math.Pow(point.y - centroid.y, 2.0); double num3 = Math.Pow(point.z - centroid.z, 2.0); double num4 = Math.Sqrt(num + num2 + num3); return num4 <= (double)sphereRadius; } public void UpdateProximity(VRDataState vrDataState, VRDevice vrDevice) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) Vector3 position = VRDataState.GetVRPose(vrDataState, vrDevice).Position; if (HasPoint(position)) { IDictionary<string, int> devicesInProximity = gestureTrace.DevicesInProximity; devicesInProximity.TryGetValue(vrDevice.ToString(), out var value); gestureTrace.UpdateDeviceInProximity(vrDevice.ToString(), value); } } public VRPose GenerateVhere(VRDataState vrDataState) { //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) VRPose vRPose = default(VRPose); for (int i = 0; i < Enum.GetValues(typeof(VRDevice)).Length; i++) { VRDevice vRDevice = Enum.GetValues(typeof(VRDevice)).Cast<VRDevice>().ToList()[i]; if (vrDevice == vRDevice) { vRPose = VRDataState.GetVRPose(vrDataState, vrDevice); } else { UpdateProximity(vrDataState, vRDevice); } } if (!HasPoint(vRPose.Position)) { UpdateVherePosition(vRPose.Position); Id++; gestureTrace.movement = movementDirection; movementDirection = "idle"; } else { gestureTrace.AddPose(vRPose); } return vRPose; } public void UpdateVherePosition(Vector3 dif) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) centroid = dif; } public GestureTrace BeginTrace(VRPose pose) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) gestureTrace = new GestureTrace(Convert.ToString(id), vrDevice, pose, faceDirection); return gestureTrace; } } } namespace VRJester.Utils { public class Calcs { public static double GetMagnitude2D(Vector3 v) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) return Math.Sqrt(Math.Pow(v.x, 2.0) + Math.Pow(v.z, 2.0)); } public static double GetMagnitude3D(Vector3 v) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) return Math.Sqrt(Math.Pow(v.x, 2.0) + Math.Pow(v.y, 2.0) + Math.Pow(v.z, 2.0)); } public static double GetAngle2D(Vector3 v1, Vector3 v2) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) Vector3 val = default(Vector3); ((Vector3)(ref val))..ctor(1f, 0f, 1f); double num = Vector3.Dot(Vector3.Scale(v1, val), Vector3.Scale(v2, val)); double d = num / (GetMagnitude2D(v1) * GetMagnitude2D(v2)); return ConvertToDegrees(Math.Acos(d)); } public static double GetAngle3D(Vector3 v1, Vector3 v2) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) double num = Vector3.Dot(v1, v2); double d = num / (GetMagnitude3D(v1) * GetMagnitude3D(v2)); return ConvertToDegrees(Math.Acos(d)); } public static double ConvertToDegrees(double radians) { return 180.0 / Math.PI * radians; } } } namespace VRJester.Utils.VRData { public class GestureFactory { public string vrDevice; public string movement; public long elapsedTime; public double speed; public string direction; public IDictionary<string, int> devicesInProximity; public GestureFactory(string vrDevice, string movement, long elapsedTime, double speed, string direction, IDictionary<string, int> devicesInProximity) { this.vrDevice = vrDevice; this.movement = movement; this.elapsedTime = elapsedTime; this.speed = speed; this.direction = direction; this.devicesInProximity = devicesInProximity; base..ctor(); } public GestureComponent CreateGestureComponent() { return new GestureComponent(vrDevice, movement, elapsedTime, speed, direction, devicesInProximity); } } public struct VRPose { public Vector3 Position { get; set; } public Quaternion Direction { get; set; } public VRPose(Vector3 position, Quaternion direction) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) Position = position; Direction = direction; } public override readonly string ToString() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) return $"Pose[ position: {Position} | rotation: {Direction} ]"; } } public class VRDataState { private readonly VRPose hmd; private readonly VRPose rc; private readonly VRPose lc; public VRPose Hmd => hmd; public VRPose Rc => rc; public VRPose Lc => lc; public VRDataState() { hmd = SetVRPose(VRDevice.HEAD_MOUNTED_DISPLAY); rc = SetVRPose(VRDevice.RIGHT_CONTROLLER); lc = SetVRPose(VRDevice.LEFT_CONTROLLER); } public override string ToString() { return "data:\r\n\t hmd: " + hmd.ToString() + "\r\n\t rc: " + rc.ToString() + "\r\n\t lc: " + lc; } public VRPose SetVRPose(VRDevice vrDevice) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) XRNode val; switch (vrDevice) { case VRDevice.HEAD_MOUNTED_DISPLAY: val = (XRNode)3; break; case VRDevice.RIGHT_CONTROLLER: val = (XRNode)5; break; case VRDevice.LEFT_CONTROLLER: val = (XRNode)4; break; default: Log.Info("VRDevice not yet supported. Defaulting to HMD instead"); val = (XRNode)3; break; } InputDevice deviceAtXRNode = InputDevices.GetDeviceAtXRNode(val); Vector3 position = default(Vector3); ((InputDevice)(ref deviceAtXRNode)).TryGetFeatureValue(CommonUsages.devicePosition, ref position); Quaternion direction = default(Quaternion); ((InputDevice)(ref deviceAtXRNode)).TryGetFeatureValue(CommonUsages.deviceRotation, ref direction); return new VRPose(position, direction); } public static VRPose GetVRPose(VRDataState vrDataState, VRDevice vrDevice) { switch (vrDevice) { case VRDevice.HEAD_MOUNTED_DISPLAY: return vrDataState.hmd; case VRDevice.RIGHT_CONTROLLER: return vrDataState.rc; case VRDevice.LEFT_CONTROLLER: return vrDataState.lc; default: Log.Error("VRDevice not yet supported!"); return default(VRPose); } } } public enum VRDevice { HEAD_MOUNTED_DISPLAY, RIGHT_CONTROLLER, LEFT_CONTROLLER } } namespace VRJester.Core { public class Gesture { private readonly IList<Vhere> vhereList = new List<Vhere>(); public List<GestureComponent> hmdGesture = new List<GestureComponent>(); public List<GestureComponent> rcGesture = new List<GestureComponent>(); public List<GestureComponent> lcGesture = new List<GestureComponent>(); public IList<string> validDevices = new List<string>(); public Gesture(VRDataState vrDataState) { //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) VRPose hmd = vrDataState.Hmd; VRPose rc = vrDataState.Rc; VRPose lc = vrDataState.Lc; Vhere item = new Vhere(VRDevice.HEAD_MOUNTED_DISPLAY, hmd, hmd.Direction, Constants.CONFIG_PATH); Vhere item2 = new Vhere(VRDevice.RIGHT_CONTROLLER, rc, hmd.Direction, Constants.CONFIG_PATH); Vhere item3 = new Vhere(VRDevice.LEFT_CONTROLLER, lc, hmd.Direction, Constants.CONFIG_PATH); vhereList.Add(item); vhereList.Add(item2); vhereList.Add(item3); } public Gesture(List<GestureComponent> hmdGesture, List<GestureComponent> rcGesture, List<GestureComponent> lcGesture) { if (hmdGesture != null) { this.hmdGesture = hmdGesture; } if (rcGesture != null) { this.rcGesture = rcGesture; } if (lcGesture != null) { this.lcGesture = lcGesture; } } public Gesture(Dictionary<string, List<GestureComponent>> gesture) { foreach (string key in gesture.Keys) { IList<string> list = key.Split(new char[1] { '|' }); if (list.Contains("HEAD_MOUNTED_DISPLAY")) { IDictionary<string, string> newValues = new Dictionary<string, string> { ["VrDevice"] = "HEAD_MOUNTED_DISPLAY" }; if (list.Count > 1) { validDevices.Add("HEAD_MOUNTED_DISPLAY"); } hmdGesture = GestureComponent.Copy(gesture[key], newValues); } if (list.Contains("RIGHT_CONTROLLER")) { IDictionary<string, string> newValues2 = new Dictionary<string, string> { ["VrDevice"] = "RIGHT_CONTROLLER" }; if (list.Count > 1) { validDevices.Add("RIGHT_CONTROLLER"); } rcGesture = GestureComponent.Copy(gesture[key], newValues2); } if (list.Contains("LEFT_CONTROLLER")) { IDictionary<string, string> newValues3 = new Dictionary<string, string> { ["VrDevice"] = "LEFT_CONTROLLER" }; if (list.Count > 1) { validDevices.Add("LEFT_CONTROLLER"); } lcGesture = GestureComponent.Copy(gesture[key], newValues3); } } } public override string ToString() { return "Gesture:\r\n hmdGesture: " + string.Join(",", hmdGesture) + "\r\n rcGesture: " + string.Join(",", rcGesture) + "\r\n lcGesture: " + string.Join(",", lcGesture); } public void Track(VRDataState vrDataRoomPre) { foreach (Vhere vhere in vhereList) { VRPose vRPose = vhere.GenerateVhere(vrDataRoomPre); int id = vhere.Id; if (vhere.PreviousId != id) { vhere.PreviousId = id; GestureTrace trace = vhere.Trace; trace.CompleteTrace(vRPose); vhere.BeginTrace(vRPose); switch (vhere.VrDevice) { case VRDevice.HEAD_MOUNTED_DISPLAY: hmdGesture.Add(trace.ToGestureComponent()); break; case VRDevice.RIGHT_CONTROLLER: rcGesture.Add(trace.ToGestureComponent()); break; case VRDevice.LEFT_CONTROLLER: lcGesture.Add(trace.ToGestureComponent()); break; } } } } public List<GestureComponent> GetGesture(string vrDevice) { List<GestureComponent> result = new List<GestureComponent>(); switch (vrDevice) { case "HEAD_MOUNTED_DISPLAY": result = hmdGesture; break; case "RIGHT_CONTROLLER": result = rcGesture; break; case "LEFT_CONTROLLER": result = lcGesture; break; } return result; } } public class GestureComponent : ICloneable { public readonly string VrDevice; public readonly string Movement; public readonly string Direction; public readonly long ElapsedTime; public readonly double Speed; public readonly IDictionary<string, int> DevicesInProximity; public GestureComponent(string VrDevice, string Movement, long ElapsedTime, double Speed, string Direction, IDictionary<string, int> DevicesInProximity) { this.VrDevice = VrDevice; this.Movement = Movement; this.Direction = Direction; this.ElapsedTime = ElapsedTime; this.Speed = Speed; this.DevicesInProximity = DevicesInProximity; base..ctor(); } public object Clone() { return MemberwiseClone(); } public override string ToString() { return string.Format("GCPath[ {0} | Movement={1} | Direction={2} | Time={3:D} | Speed={4:F} | Proximity Devices:{5}]", VrDevice, Movement, Direction, ElapsedTime, Speed, string.Join(",", DevicesInProximity)); } public override int GetHashCode() { int hashCode = Movement.GetHashCode(); long elapsedTime = ElapsedTime; int num = hashCode - elapsedTime.GetHashCode(); double speed = Speed; return num - speed.GetHashCode() + Direction.GetHashCode() - string.Join("", DevicesInProximity.Keys).GetHashCode(); } public override bool Equals(object obj) { if (this == obj) { return true; } if (obj.GetType() != typeof(GestureComponent)) { return false; } GestureComponent gestureComponent = (GestureComponent)obj; return VrDevice == gestureComponent.VrDevice && Movement == gestureComponent.Movement && Direction == gestureComponent.Direction && object.Equals(ElapsedTime, gestureComponent.ElapsedTime) && object.Equals(Speed, gestureComponent.Speed) && DevicesInProximity.Keys.SequenceEqual(gestureComponent.DevicesInProximity.Keys); } public bool Matches(GestureComponent gesturePath) { return VrDevice.Equals(gesturePath.VrDevice) && Movement.Equals(gesturePath.Movement) && ElapsedTime <= gesturePath.ElapsedTime && Speed <= gesturePath.Speed && IsWithinDirection(Direction, gesturePath.Direction) && IsWithinProximity(DevicesInProximity, gesturePath.DevicesInProximity); } public static bool StartsWith(List<GestureComponent> gesture, List<GestureComponent> subGesture) { try { return gesture.GetRange(0, subGesture.Count).Equals(subGesture); } catch (IndexOutOfRangeException) { return false; } } public static bool MatchesWith(List<GestureComponent> gesture, List<GestureComponent> subGesture) { try { for (int i = 0; i < subGesture.Count; i++) { if (!subGesture[i].Matches(gesture[i])) { return false; } } return true; } catch (IndexOutOfRangeException) { return false; } catch (ArgumentOutOfRangeException) { return false; } } private static bool IsWithinDirection(string Direction, string otherDirection) { if (Direction.Equals("*")) { return true; } return Direction.Equals(otherDirection); } private static bool IsWithinProximity(IDictionary<string, int> devices, IDictionary<string, int> otherDevices) { if (devices.Count == 0) { return true; } return object.Equals(devices.Keys, otherDevices.Keys); } public static List<GestureComponent> Concat(List<GestureComponent> gestureComponent1, List<GestureComponent> gestureComponent2) { if (gestureComponent1 == null) { gestureComponent1 = new List<GestureComponent>(); } if (gestureComponent2 == null) { gestureComponent2 = new List<GestureComponent>(); } return gestureComponent1.Concat(gestureComponent2).ToList(); } public static List<GestureComponent> Copy(List<GestureComponent> gesture, IDictionary<string, string> newValues) { List<GestureComponent> list = new List<GestureComponent>(); foreach (GestureComponent item2 in gesture) { newValues.TryGetValue("VrDevice", out var value); string vrDevice = ((value == null) ? item2.VrDevice : value); string movement = item2.Movement; string direction = item2.Direction; long elapsedTime = item2.ElapsedTime; double speed = item2.Speed; IDictionary<string, int> devicesInProximity = item2.DevicesInProximity; GestureComponent item = new GestureComponent(vrDevice, movement, elapsedTime, speed, direction, devicesInProximity); list.Add(item); } return list; } } public static class Extensions { public static bool IsEqual(this List<GestureComponent> gesture, List<GestureComponent> otherGesture) { bool result = true; if (gesture.Count == otherGesture.Count) { for (int i = 0; i < gesture.Count; i++) { if (gesture[i].Equals(otherGesture[i])) { result = true; continue; } result = false; break; } } else { result = false; } return result; } public static int HashCode(this List<GestureComponent> gesture) { int num = 1; foreach (GestureComponent item in gesture) { num = 31 * num + (item?.GetHashCode() ?? 0); } return num; } } public class Gestures { private readonly string gestureStorePath; public readonly GestureStore gestureStore; public Dictionary<string, string> gestureNameSpace; public Dictionary<int, string> hmdGestureMapping; public Dictionary<int, string> rcGestureMapping; public Dictionary<int, string> lcGestureMapping; public RadixTree hmdGestures; public RadixTree rcGestures; public RadixTree lcGestures; public Dictionary<string, IList<string>> eitherDeviceGestures; public Config config; public Gestures(Config config, string gestureStorePath) { this.gestureStorePath = gestureStorePath; gestureStore = new GestureStore(); gestureNameSpace = new Dictionary<string, string>(); hmdGestureMapping = new Dictionary<int, string>(); rcGestureMapping = new Dictionary<int, string>(); lcGestureMapping = new Dictionary<int, string>(); hmdGestures = new RadixTree("HEAD_MOUNTED_DISPLAY"); rcGestures = new RadixTree("RIGHT_CONTROLLER"); lcGestures = new RadixTree("LEFT_CONTROLLER"); eitherDeviceGestures = new Dictionary<string, IList<string>>(); this.config = config; base..ctor(); } public GestureStore Read() { try { StringBuilder stringBuilder = new StringBuilder(); StreamReader streamReader = new StreamReader(gestureStorePath); string text = streamReader.ReadLine(); stringBuilder.Append(text); while (text != null) { text = streamReader.ReadLine(); stringBuilder.Append(text); } streamReader.Close(); Console.ReadLine(); return JsonConvert.DeserializeObject<GestureStore>(stringBuilder.ToString()); } catch (Exception ex) when (ex is FileNotFoundException || ex is JsonException) { Log.Error("An error occurred reading gesture store json!"); Log.Error(ex); } return null; } public void Load() { GestureStore gestureStore = Read(); Clear(); if (gestureStore == null) { return; } HashSet<string> hashSet = new HashSet<string>(gestureStore.GESTURES.Keys); foreach (string item in hashSet) { try { Gesture gesture = new Gesture(gestureStore.GESTURES[item]); Store(gesture, item); } catch (NullReferenceException data) { Log.Error(data); Log.Error("SKIPPING LOADING GESTURE: " + item); } } } public void Store(Gesture gesture, string name) { StringBuilder stringBuilder = new StringBuilder(); foreach (string dEVICE in Constants.DEVICES) { if (gesture.validDevices.Count > 0) { eitherDeviceGestures[name] = gesture.validDevices; string value = StoreToMapping(gesture, name, dEVICE); if (!stringBuilder.ToString().Contains(value)) { stringBuilder.Append(value); } } else { stringBuilder.Append(StoreToMapping(gesture, name, dEVICE)); } } string key = stringBuilder.ToString(); gestureNameSpace[key] = name; } public void Store(RadixTree gestureTree, Dictionary<int, string> gestureMapping, List<GestureComponent> gesture, string name) { gestureTree.Insert(gesture); gestureMapping[gesture.HashCode()] = name; string key = gesture.HashCode().ToString() ?? ""; gestureNameSpace[key] = name; } public string StoreToMapping(Gesture gesture, string name, string vrDevice) { string text = ""; RadixTree radixTree = GetRadixTree(vrDevice); List<GestureComponent> gesture2 = gesture.GetGesture(vrDevice); Dictionary<int, string> gestureMapping = GetGestureMapping(vrDevice); if (gesture2.Count > 0) { radixTree.Insert(gesture2); if (!gestureMapping.ContainsKey(gesture2.HashCode())) { gestureMapping.Add(gesture2.HashCode(), name); } text += gesture2.HashCode(); } return text; } public void Write() { //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Expected O, but got Unknown //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Expected O, but got Unknown WriteGestures("HEAD_MOUNTED_DISPLAY", hmdGestures.root, new List<GestureComponent>()); WriteGestures("RIGHT_CONTROLLER", rcGestures.root, new List<GestureComponent>()); WriteGestures("LEFT_CONTROLLER", lcGestures.root, new List<GestureComponent>()); try { using StreamWriter streamWriter = new StreamWriter(gestureStorePath); JsonTextWriter val = new JsonTextWriter((TextWriter)streamWriter); try { ((JsonWriter)val).Formatting = (Formatting)1; JsonSerializer val2 = new JsonSerializer(); val2.Serialize((JsonWriter)(object)val, (object)gestureStore); } finally { ((IDisposable)val)?.Dispose(); } } catch (IOException ex) { Log.Error("An error occurred writing config json!"); Log.Error(ex.StackTrace); } } private void WriteGestures(string vrDevice, Node current, List<GestureComponent> result) { if (current.isGesture) { GetGestureMapping(vrDevice).TryGetValue(result.HashCode(), out var value); eitherDeviceGestures.TryGetValue(value, out var value2); gestureStore.AddGesture(vrDevice, value, result, value2); } foreach (Branch value3 in current.paths.Values) { WriteGestures(vrDevice, value3.next, GestureComponent.Concat(result, value3.gesture)); } } public void Clear() { gestureNameSpace = new Dictionary<string, string>(); hmdGestures = new RadixTree("HEAD_MOUNTED_DISPLAY"); rcGestures = new RadixTree("RIGHT_CONTROLLER"); lcGestures = new RadixTree("LEFT_CONTROLLER"); hmdGestureMapping = new Dictionary<int, string>(); rcGestureMapping = new Dictionary<int, string>(); lcGestureMapping = new Dictionary<int, string>(); eitherDeviceGestures = new Dictionary<string, IList<string>>(); } private Dictionary<int, string> GetGestureMapping(string vrDevice) { Dictionary<int, string> result = new Dictionary<int, string>(); switch (vrDevice) { case "HEAD_MOUNTED_DISPLAY": result = hmdGestureMapping; break; case "RIGHT_CONTROLLER": result = rcGestureMapping; break; case "LEFT_CONTROLLER": result = lcGestureMapping; break; } return result; } private RadixTree GetRadixTree(string vrDevice) { RadixTree result = null; switch (vrDevice) { case "HEAD_MOUNTED_DISPLAY": result = hmdGestures; break; case "RIGHT_CONTROLLER": result = rcGestures; break; case "LEFT_CONTROLLER": result = lcGestures; break; } return result; } } public class GestureStore { public Dictionary<string, Dictionary<string, List<GestureComponent>>> GESTURES = new Dictionary<string, Dictionary<string, List<GestureComponent>>>(); public virtual void AddGesture(string vrDevice, string gestureName, List<GestureComponent> gesture, IList<string> validDevices) { GESTURES.TryGetValue(gestureName, out var value); if (ExtensionMethods.IsNullOrDestroyed((object)value)) { value = new Dictionary<string, List<GestureComponent>>(); } if (validDevices != null) { vrDevice = string.Join("|", validDevices); List<GestureComponent> value2 = GestureComponent.Copy(gesture, new Dictionary<string, string> { { "VrDevice", vrDevice } }); value[vrDevice] = value2; GESTURES[gestureName] = value; } else { value[vrDevice] = gesture; GESTURES[gestureName] = value; } } } public class GestureTrace { public string voxId; public string vrDevice; public string movement = "idle"; public string direction = "*"; public long elapsedTime = 0L; public double speed; public readonly IDictionary<string, int> devicesInProximity = new Dictionary<string, int>(); private Vector3 front; private Vector3 back; private Vector3 right; private Vector3 left; private readonly IList<VRPose> poses = new List<VRPose>(); public Quaternion faceDirection; public string VoxId => voxId; public string VrDevice => vrDevice; public string Movement { get { return movement; } set { movement = value; } } public long ElapsedTime { get { return elapsedTime; } set { if (elapsedTime == 0) { elapsedTime = value; } else { elapsedTime = (value - elapsedTime) / 1000000; } } } public double Speed => speed; public string Direction { get { return direction; } set { direction = value; } } public IDictionary<string, int> DevicesInProximity => devicesInProximity; public GestureTrace(string voxId, VRDevice vrDevice, VRPose pose, Quaternion faceDirection) { //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) this.voxId = voxId; this.vrDevice = vrDevice.ToString(); this.faceDirection = faceDirection; SetMovementBuckets(faceDirection); ElapsedTime = NanoTime(); poses.Add(pose); } public override string ToString() { return $"VRDEVICE: {vrDevice} | MOVED: {movement} | Time Elapsed: {elapsedTime:D}ms"; } public GestureComponent ToGestureComponent() { return new GestureComponent(VrDevice, Movement, ElapsedTime, Speed, Direction, DevicesInProximity); } public void SetTrajectory(Vector3 gestureVector, ref string gestureTrajectory) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_0146: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Unknown result type (might be due to invalid IL or missing references) if ((double)gestureVector.y > 0.85) { gestureTrajectory = "up"; return; } if ((double)gestureVector.y < -0.85) { gestureTrajectory = "down"; return; } if (Calcs.GetAngle2D(front, gestureVector) <= 45.0) { gestureTrajectory = "forward"; return; } if (Calcs.GetAngle2D(back, gestureVector) <= 45.0) { gestureTrajectory = "back"; return; } if (Calcs.GetAngle2D(right, gestureVector) <= 45.0) { gestureTrajectory = "right"; return; } if (Calcs.GetAngle2D(left, gestureVector) <= 45.0) { gestureTrajectory = "left"; return; } Log.Warning("NO MOVEMENT RECOGNIZED!"); Vector3 val = front; string? text = ((object)(Vector3)(ref val)).ToString(); val = gestureVector; Log.Warning("VECTORS: " + text + " | " + ((object)(Vector3)(ref val)).ToString()); Log.Warning("ANGLE BETWEEN FACING DIRECTION AND VECTOR: " + Calcs.GetAngle2D(front, gestureVector)); } public void SetSpeed(Vector3 end) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) speed = Calcs.GetMagnitude3D(end - poses[0].Position) / (double)elapsedTime * 1000000000000.0; } public void UpdateDeviceInProximity(string vrDevice, int? times) { devicesInProximity[vrDevice] = times.Value + 1; } public void AddPose(VRPose pose) { poses.Add(pose); } public void CompleteTrace(VRPose end) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) Vector3 position = poses[0].Position; Vector3 gestureVector = Vector3.Normalize(end.Position - position); Vector3 gestureVector2 = Vector3.Normalize(end.Direction * Vector3.forward); SetTrajectory(gestureVector, ref movement); SetTrajectory(gestureVector2, ref direction); SetSpeed(end.Position); ElapsedTime = NanoTime(); } private void SetMovementBuckets(Quaternion faceDirection) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) front = faceDirection * Vector3.forward; back = faceDirection * Vector3.back; right = faceDirection * Vector3.right; left = faceDirection * Vector3.left; } private static long NanoTime() { long num = 10000 * Stopwatch.GetTimestamp(); num /= 10000; return num * 100; } } } namespace VRJester.Core.Recog { public class Recognition { public Gestures gestures; public Recognition(Gestures gestures) { this.gestures = gestures; base..ctor(); } public virtual Dictionary<string, string> Recognize(Gesture gesture) { Dictionary<string, string> dictionary = new Dictionary<string, string>(); string text = ""; List<GestureComponent> list = gestures.hmdGestures.Search(gesture.hmdGesture); List<GestureComponent> list2 = gestures.rcGestures.Search(gesture.rcGesture); List<GestureComponent> list3 = gestures.lcGestures.Search(gesture.lcGesture); if (list != null) { text += list.HashCode(); gestures.hmdGestureMapping.TryGetValue(list.HashCode(), out var value); dictionary["HEAD_MOUNTED_DISPLAY"] = value; } if (list2 != null) { text += list2.HashCode(); gestures.hmdGestureMapping.TryGetValue(list2.HashCode(), out var value2); dictionary["RIGHT_CONTROLLER"] = value2; } if (list3 != null) { text += list3.HashCode(); gestures.hmdGestureMapping.TryGetValue(list3.HashCode(), out var value3); dictionary["LEFT_CONTROLLER"] = value3; } gestures.gestureNameSpace.TryGetValue(text, out var value4); dictionary["gestureName"] = value4; if (GestureHandler.config.DEBUG_MODE) { DebugLog(gesture, list, list2, list3, text, dictionary); } return (value4 != null) ? dictionary : new Dictionary<string, string>(); } public virtual void DebugLog(Gesture gesture, List<GestureComponent> foundHmdGesture, List<GestureComponent> foundRcGesture, List<GestureComponent> foundLcGesture, string id, Dictionary<string, string> ctx) { Log.Debug("TOTAL GESTURES IN NAMESPACE: " + gestures.gestureNameSpace.Count); foreach (KeyValuePair<string, string> item in gestures.gestureNameSpace) { Log.Debug("ID: " + item.Key + " -> " + item.Value); } if (gesture.hmdGesture.Any() || gesture.rcGesture.Any() || gesture.lcGesture.Any()) { Log.Debug(gesture); } if (!ExtensionMethods.IsNullOrDestroyed((object)foundHmdGesture)) { Log.Debug("foundHmdGesture: " + string.Join(", ", foundHmdGesture)); } if (!ExtensionMethods.IsNullOrDestroyed((object)foundRcGesture)) { Log.Debug("foundRcGesture: " + string.Join(", ", foundRcGesture)); } if (!ExtensionMethods.IsNullOrDestroyed((object)foundLcGesture)) { Log.Debug("foundLcGesture: " + string.Join(", ", foundLcGesture)); } if (id != "") { Log.Debug("RECOGNIZE ID: " + id); } if (ctx.Count != 0) { Log.Debug("RECOGNIZED: " + ctx["gestureName"]); } } } } namespace VRJester.Core.Radix { public class Branch { public List<GestureComponent> gesture; public Node next; public Branch(List<GestureComponent> gesture, Node next) { this.gesture = gesture; this.next = next; base..ctor(); } public Branch(List<GestureComponent> gesture) : this(gesture, new Node(isGesture: true)) { } public override string ToString() { return "Branch[gesture=" + string.Join(", ", gesture) + "]"; } } internal class MetaData { internal long elapsedTime; internal double speed; internal IDictionary<string, int> devicesInProximity; protected internal MetaData(long elapsedTime, double speed, IDictionary<string, int> devicesInProximity) { this.elapsedTime = elapsedTime; this.speed = speed; this.devicesInProximity = devicesInProximity; } protected internal virtual bool IsClosestFit(long maxTime, double maxSpeed) { return ClosestTime(maxTime) && ClosestSpeed(maxSpeed); } protected internal virtual bool ClosestTime(long maxTime) { return elapsedTime >= maxTime; } protected internal virtual bool ClosestSpeed(double maxSpeed) { return speed >= maxSpeed; } } public class Node { public bool isGesture; public Dictionary<GestureComponent, Branch> paths; public Node(bool isGesture) { this.isGesture = isGesture; paths = new Dictionary<GestureComponent, Branch>(); base..ctor(); } public virtual Branch GetTransition(GestureComponent transitionGestureComponent) { Branch value; return paths.TryGetValue(transitionGestureComponent, out value) ? value : null; } public virtual void AddGestureComponent(List<GestureComponent> gestureComponent, Node next) { paths[gestureComponent[0]] = new Branch(gestureComponent, next); } public virtual int TotalGestureComponent() { return paths.Count; } public virtual Branch GetMatchedPath(GestureComponent transitionPath) { Branch result = null; long maxTime = 0L; double maxSpeed = 0.0; foreach (GestureComponent key in paths.Keys) { if (key.Matches(transitionPath)) { MetaData metaData = new MetaData(key.ElapsedTime, key.Speed, key.DevicesInProximity); if (metaData.IsClosestFit(maxTime, maxSpeed)) { maxTime = key.ElapsedTime; maxSpeed = key.Speed; result = paths[key]; } } } return result; } public override string ToString() { return "Node[ isGesture=" + isGesture + ", paths=" + paths?.ToString() + "]"; } } public class RadixTree { public string vrDevice; private const int NO_MISMATCH = -1; public Node root; public RadixTree(string vrDevice) { this.vrDevice = vrDevice; root = new Node(isGesture: false); base..ctor(); } private int GetFirstMismatchGestureComponent(List<GestureComponent> gesture, List<GestureComponent> edgeGestureComponent) { int num = Math.Min(gesture.Count, edgeGestureComponent.Count); for (int i = 1; i < num; i++) { if (!gesture[i].Equals(edgeGestureComponent[i])) { return i; } } return -1; } public virtual void PrintAllGestures(Dictionary<int, string> gestureMapping) { PrintAllGestures(root, new List<GestureComponent>(), gestureMapping); } private void PrintAllGestures(Node current, List<GestureComponent> result, Dictionary<int, string> gestureMapping) { if (current.isGesture) { gestureMapping.TryGetValue(result.HashCode(), out var value); string text = string.Join(",", result.Select((GestureComponent c) => c.ToString())); Log.Info(value + ": " + text); } foreach (Branch value2 in current.paths.Values) { PrintAllGestures(value2.next, GestureComponent.Concat(result, value2.gesture), gestureMapping); } } public virtual void PrintAllPaths() { PrintAllPaths(root, ""); } private void PrintAllPaths(Node current, string indent) { int num = current.TotalGestureComponent() - 1; int num2 = 0; foreach (Branch value in current.paths.Values) { if (num2 == num) { Log.Info(indent.Replace("+", "L") + string.Join(",", value.gesture)); } else { Log.Info(indent.Replace("+", "|") + string.Join(",", value.gesture)); } int num3 = ((indent.Length / 2 == 0) ? 4 : (indent.Length / 2)); int num4 = value.gesture.ToString().Length / 3; string text = new string(new char[num3]).Replace("\0", " "); string text2 = new string(new char[num4]).Replace("\0", "-"); string indent2 = text + "+" + text2 + "->"; num2++; PrintAllPaths(value.next, indent2); } } public virtual void Insert(List<GestureComponent> gesture) { Node next = root; int num; for (int i = 0; i < gesture.Count; i += num) { GestureComponent gestureComponent = gesture[i]; Branch transition = next.GetTransition(gestureComponent); List<GestureComponent> range = gesture.GetRange(i, gesture.Count - i); if (transition == null) { next.paths[gestureComponent] = new Branch(range); break; } num = GetFirstMismatchGestureComponent(range, transition.gesture); if (num == -1) { if (range.Count == transition.gesture.Count) { transition.next.isGesture = true; break; } if (range.Count < transition.gesture.Count) { List<GestureComponent> range2 = transition.gesture.GetRange(range.Count - 1, range.Count); transition.gesture = range; Node node = new Node(isGesture: true); Node next2 = transition.next; transition.next = node; node.AddGestureComponent(range2, next2); break; } num = transition.gesture.Count; } else { List<GestureComponent> range3 = transition.gesture.GetRange(num, transition.gesture.Count); transition.gesture = transition.gesture.GetRange(0, num); Node next3 = transition.next; transition.next = new Node(isGesture: false); transition.next.AddGestureComponent(range3, next3); } next = transition.next; } } public virtual void Delete(List<GestureComponent> gesture) { root = Delete(root, gesture); } private Node Delete(Node current, List<GestureComponent> gesture) { if (gesture.Count == 0) { if (current.paths.Count == 0 && current != root) { return null; } current.isGesture = false; return current; } GestureComponent gestureComponent = gesture[0]; Branch transition = current.GetTransition(gestureComponent); if (transition == null || !GestureComponent.StartsWith(gesture, transition.gesture)) { return current; } Node node = Delete(transition.next, gesture.GetRange(transition.gesture.Count, gesture.Count)); if (node == null) { current.paths.Remove(gestureComponent); if (current.TotalGestureComponent() == 0 && !current.isGesture && current != root) { return null; } } else if (node.TotalGestureComponent() == 1 && !node.isGesture) { current.paths.Remove(gestureComponent); foreach (Branch value in node.paths.Values) { current.AddGestureComponent(GestureComponent.Concat(transition.gesture, value.gesture), value.next); } } return current; } public virtual List<GestureComponent> Search(List<GestureComponent> gesture) { List<GestureComponent> list = null; Node next = root; int num = 0; while (num < gesture.Count) { GestureComponent transitionPath = gesture[num]; Branch matchedPath = next.GetMatchedPath(transitionPath); if (matchedPath == null) { return null; } List<GestureComponent> range = gesture.GetRange(num, gesture.Count - num); if (!GestureComponent.MatchesWith(range, matchedPath.gesture)) { return null; } num += matchedPath.gesture.Count; next = matchedPath.next; list = GestureComponent.Concat(list, matchedPath.gesture); } return list; } } }
patchers/VRJesterPatcher.dll
Decompiled a year agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Logging; using Mono.Cecil; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")] [assembly: AssemblyCompany("VRJesterPatcher")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+e07bef45b54d27ac35b6fc0daa65970a4b67b019")] [assembly: AssemblyProduct("VRJesterPatcher")] [assembly: AssemblyTitle("VRJesterPatcher")] [assembly: AssemblyVersion("1.0.0.0")] namespace VRJesterPatcher; public static class VRJesterPatcher { private static readonly ManualLogSource Logger = Logger.CreateLogSource("VRJesterPatcher"); internal static string VRPatcherPath => Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); internal static string ManagedPath => Paths.ManagedPath; [Obsolete("Should not be used!", true)] public static IEnumerable<string> TargetDLLs { get; } = new string[0]; [Obsolete("Should not be used!", true)] public static void Initialize() { Logger.LogInfo((object)"Checking for VRJester Libraries..."); string[] fileNames = new string[1] { "WindowsInput.dll" }; if (CopyFiles(ManagedPath, fileNames, "libs.")) { Logger.LogInfo((object)"Successfully copied VRJester plugins!"); } else { Logger.LogInfo((object)"VRJester plugins already present"); } Logger.LogInfo((object)"Checking for binding files..."); } private static bool CopyFiles(string destinationPath, string[] fileNames, string embedFolder) { DirectoryInfo directoryInfo = new DirectoryInfo(destinationPath); FileInfo[] files = directoryInfo.GetFiles(); bool result = false; Assembly executingAssembly = Assembly.GetExecutingAssembly(); string name = executingAssembly.GetName().Name; foreach (string fileName in fileNames) { if (Array.Exists(files, (FileInfo file) => fileName == file.Name)) { continue; } result = true; using Stream stream = executingAssembly.GetManifestResourceStream(name + "." + embedFolder + fileName); using FileStream destination = new FileStream(Path.Combine(directoryInfo.FullName, fileName), FileMode.Create, FileAccess.ReadWrite, FileShare.Delete); Logger.LogInfo((object)("Copying " + fileName)); stream.CopyTo(destination); } return result; } [Obsolete("Should not be used!", true)] public static void Patch(AssemblyDefinition ad) { } }