Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of LoaderRuler v1.1.1
plugins/LoaderRuler.dll
Decompiled a year agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq.Expressions; 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.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using Dolso; using Dolso.RiskofOptions; using EntityStates; using EntityStates.Loader; using HG.GeneralSerializer; using HG.Reflection; using Mono.Cecil; using Mono.Cecil.Cil; using MonoMod.Cil; using MonoMod.RuntimeDetour; using RiskOfOptions; using RiskOfOptions.Components.Options; using RiskOfOptions.OptionConfigs; using RiskOfOptions.Options; using RoR2; using RoR2.Projectile; using RoR2.UI; using TMPro; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Events; using UnityEngine.ResourceManagement.AsyncOperations; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: OptIn] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("LoaderRuler")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+3d2a6753a22fa5569e757a66b68d86891bc97849")] [assembly: AssemblyProduct("LoaderRuler")] [assembly: AssemblyTitle("LoaderRuler")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] namespace Dolso { internal static class log { private static ManualLogSource logger; internal static void start(ManualLogSource logSource) { logger = logSource; } internal static void start(string name) { logger = Logger.CreateLogSource(name); } internal static void debug(object data) { logger.LogDebug(data); } internal static void info(object data) { logger.LogInfo(data); } internal static void message(object data) { logger.LogMessage(data); } internal static void warning(object data) { logger.LogWarning(data); } internal static void error(object data) { logger.LogError(data); } internal static void fatal(object data) { logger.LogFatal(data); } internal static void LogError(this ILCursor c, object data) { logger.LogError((object)string.Format($"ILCursor failure: {data}\n{c}")); } internal static void LogErrorCaller(this ILCursor c, object data, [CallerMemberName] string callerName = "") { logger.LogError((object)string.Format($"ILCursor failure in {callerName}: {data}\n{c}")); } } internal static class HookManager { internal const BindingFlags allFlags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic; private static readonly List<IDetour> hooks = new List<IDetour>(); private static ILHookConfig ilHookConfig = new ILHookConfig { ManualApply = true }; private static HookConfig onHookConfig = new HookConfig { ManualApply = true }; internal static void Hook(Type typeFrom, string methodFrom, Manipulator ilHook) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Expected O, but got Unknown try { ILHook val = new ILHook((MethodBase)typeFrom.GetMethod(methodFrom, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic), ilHook, ref ilHookConfig); try { val.Apply(); hooks.Add((IDetour)(object)val); } catch (Exception ex) { log.error($"Failed to apply ILHook: {val.Method.DeclaringType}.{val.Method.Name} - {((Delegate)(object)ilHook).Method.Name}\n{ex}"); } } catch (Exception ex2) { log.error($"Failed to make ILHook {typeFrom}.{methodFrom} - {((Delegate)(object)ilHook).Method.Name}\n{ex2}"); } } internal static void Hook(MethodBase methodFrom, Manipulator ilHook) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Expected O, but got Unknown try { ILHook val = new ILHook(methodFrom, ilHook, ref ilHookConfig); try { val.Apply(); hooks.Add((IDetour)(object)val); } catch (Exception ex) { log.error($"Failed to apply ILHook: {val.Method.DeclaringType}.{val.Method.Name} - {((Delegate)(object)ilHook).Method.Name}\n{ex}"); } } catch (Exception ex2) { log.error($"Failed to make ILHook {methodFrom.DeclaringType}.{methodFrom.Name} - {((Delegate)(object)ilHook).Method.Name}\n{ex2}"); } } internal static void Hook(Delegate from, Manipulator ilHook) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown try { ILHook val = new ILHook((MethodBase)from.Method, ilHook, ref ilHookConfig); try { val.Apply(); hooks.Add((IDetour)(object)val); } catch (Exception ex) { log.error($"Failed to apply ILHook: {val.Method.DeclaringType}.{val.Method.Name} - {((Delegate)(object)ilHook).Method.Name}\n{ex}"); } } catch (Exception ex2) { log.error($"Failed to make ILHook {from.Method.DeclaringType}.{from.Method.Name} - {((Delegate)(object)ilHook).Method.Name}\n{ex2}"); } } internal static void Hook<T>(Expression<Action<T>> from, Manipulator ilHook) { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Expected O, but got Unknown MethodInfo method = ((MethodCallExpression)from.Body).Method; try { ILHook val = new ILHook((MethodBase)method, ilHook, ref ilHookConfig); try { val.Apply(); hooks.Add((IDetour)(object)val); } catch (Exception ex) { log.error($"Failed to apply ILHook: {val.Method.DeclaringType}.{val.Method.Name} - {((Delegate)(object)ilHook).Method.Name}\n{ex}"); } } catch (Exception ex2) { log.error($"Failed to make ILHook: {method.DeclaringType}.{method.Name} - {((Delegate)(object)ilHook).Method.Name}\n{ex2}"); } } internal static void Hook(Type typeFrom, string methodFrom, Delegate onHook) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Expected O, but got Unknown try { Hook val = new Hook((MethodBase)typeFrom.GetMethod(methodFrom, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic), onHook, ref onHookConfig); try { val.Apply(); hooks.Add((IDetour)(object)val); } catch (Exception ex) { log.error($"Failed to apply onHook: {val.Method.DeclaringType}.{val.Method.Name} - {onHook.Method.Name}\n{ex}"); } } catch (Exception ex2) { log.error($"Failed to make onHook {typeFrom}.{methodFrom} - {onHook.Method.Name}\n{ex2}"); } } internal static void Hook(MethodInfo methodFrom, MethodInfo onHook) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Expected O, but got Unknown try { Hook val = new Hook((MethodBase)methodFrom, onHook, ref onHookConfig); try { val.Apply(); hooks.Add((IDetour)(object)val); } catch (Exception ex) { log.error($"Failed to apply onHook: {val.Method.DeclaringType}.{val.Method.Name} - {val.Target.Name}\n{ex}"); } } catch (Exception ex2) { log.error($"Failed to make onHook {methodFrom.DeclaringType}.{methodFrom.Name} - {onHook.Name}\n{ex2}"); } } internal static void Hook(MethodBase methodFrom, Delegate onHook) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Expected O, but got Unknown try { Hook val = new Hook(methodFrom, onHook, ref onHookConfig); try { val.Apply(); hooks.Add((IDetour)(object)val); } catch (Exception ex) { log.error($"Failed to apply onHook: {val.Method.DeclaringType}.{val.Method.Name} - {onHook.Method.Name}\n{ex}"); } } catch (Exception ex2) { log.error($"Failed to make onHook {methodFrom.DeclaringType}.{methodFrom.Name} - {onHook.Method.Name}\n{ex2}"); } } internal static void Hook(Delegate from, Delegate onHook) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown try { Hook val = new Hook((MethodBase)from.Method, onHook, ref onHookConfig); try { val.Apply(); hooks.Add((IDetour)(object)val); } catch (Exception ex) { log.error($"Failed to apply onHook: {val.Method.DeclaringType}.{val.Method.Name} - {onHook.Method.Name}\n{ex}"); } } catch (Exception ex2) { log.error($"Failed to make onHook {from.Method.DeclaringType}.{from.Method.Name} - {onHook.Method.Name}\n{ex2}"); } } internal static void Hook<T>(Expression<Action<T>> from, Delegate onto) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown try { Hook val = new Hook((MethodBase)((MethodCallExpression)from.Body).Method, onto, ref onHookConfig); try { val.Apply(); hooks.Add((IDetour)(object)val); } catch (Exception ex) { log.error($"Failed to apply onHook: {val.Method.DeclaringType}.{val.Method.Name} - {onto.Method.Name}\n{ex}"); } } catch (Exception ex2) { log.error($"Failed to make onHook {((MethodCallExpression)from.Body).Method.DeclaringType}.{((MethodCallExpression)from.Body).Method.Name} - {onto.Method.Name}\n{ex2}"); } } internal static void Hook(Type typeFrom, string methodFrom, Delegate onHook, object instance) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown try { Hook val = new Hook((MethodBase)typeFrom.GetMethod(methodFrom, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic), onHook.Method, instance, ref onHookConfig); try { val.Apply(); hooks.Add((IDetour)(object)val); } catch (Exception ex) { log.error($"Failed to apply onHook: {val.Method.DeclaringType}.{val.Method.Name} - {onHook.Method.Name}\n{ex}"); } } catch (Exception ex2) { log.error($"Failed to make onHook {typeFrom}.{methodFrom} - {onHook.Method.Name}\n{ex2}"); } } internal static void HookConfig<T>(this ConfigEntry<T> configEntry, Func<bool> enabled, Type typeFrom, string methodFrom, Manipulator ilHook) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown try { configEntry.AddHookConfig<T>(enabled, (IDetour)new ILHook((MethodBase)typeFrom.GetMethod(methodFrom, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic), ilHook, ref ilHookConfig)); } catch (Exception ex) { log.error($"Failed to ILHook {typeFrom}.{methodFrom} - {((Delegate)(object)ilHook).Method.Name}\n{ex}"); } } internal static void HookConfig<T>(this ConfigEntry<T> configEntry, Func<bool> enabled, MethodBase methodFrom, Manipulator ilHook) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Expected O, but got Unknown try { configEntry.AddHookConfig<T>(enabled, (IDetour)new ILHook(methodFrom, ilHook, ref ilHookConfig)); } catch (Exception ex) { log.error($"Failed to ILHook {methodFrom.DeclaringType}.{methodFrom.Name} - {((Delegate)(object)ilHook).Method.Name}\n{ex}"); } } internal static void HookConfig<T>(this ConfigEntry<T> configEntry, Func<bool> enabled, Type typeFrom, string methodFrom, Delegate onHook) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown try { configEntry.AddHookConfig<T>(enabled, (IDetour)new Hook((MethodBase)typeFrom.GetMethod(methodFrom, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic), onHook, ref onHookConfig)); } catch (Exception ex) { log.error($"Failed to onHook {typeFrom}.{methodFrom} - {onHook.Method.Name}\n{ex}"); } } internal static void HookConfig<T>(this ConfigEntry<T> configEntry, Func<bool> enabled, MethodBase methodFrom, Delegate onHook) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Expected O, but got Unknown try { configEntry.AddHookConfig<T>(enabled, (IDetour)new Hook(methodFrom, onHook, ref onHookConfig)); } catch (Exception ex) { log.error($"Failed to onHook {methodFrom.DeclaringType}.{methodFrom.Name} - {onHook.Method.Name}\n{ex}"); } } internal static void HookConfig(this ConfigEntry<bool> configEntry, Type typeFrom, string methodFrom, Manipulator ilHook) { configEntry.HookConfig<bool>(() => configEntry.Value, typeFrom, methodFrom, ilHook); } internal static void HookConfig(this ConfigEntry<bool> configEntry, MethodBase methodFrom, Manipulator ilHook) { configEntry.HookConfig<bool>(() => configEntry.Value, methodFrom, ilHook); } internal static void HookConfig(this ConfigEntry<bool> configEntry, Type typeFrom, string methodFrom, Delegate onHook) { configEntry.HookConfig<bool>(() => configEntry.Value, typeFrom, methodFrom, onHook); } internal static void HookConfig(this ConfigEntry<bool> configEntry, MethodBase methodFrom, Delegate onHook) { configEntry.HookConfig<bool>(() => configEntry.Value, methodFrom, onHook); } private static void AddHookConfig<T>(this ConfigEntry<T> configEntry, Func<bool> enabled, IDetour detour) { hooks.Add(detour); configEntry.SettingChanged += delegate { UpdateHook(detour, enabled()); }; if (enabled()) { detour.Apply(); } } private static void UpdateHook(IDetour hook, bool enabled) { if (enabled) { if (!hook.IsApplied) { hook.Apply(); } } else if (hook.IsApplied) { hook.Undo(); } } internal static void PriorityFirst() { ilHookConfig.Before = new string[1] { "*" }; onHookConfig.Before = new string[1] { "*" }; } internal static void PriorityLast() { ilHookConfig.After = new string[1] { "*" }; onHookConfig.After = new string[1] { "*" }; } internal static void PriorityNormal() { ilHookConfig.Before = null; onHookConfig.Before = null; ilHookConfig.After = null; onHookConfig.After = null; } internal static IDetour ManualDetour(Type typeFrom, string methodFrom, Delegate onHook) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Expected O, but got Unknown try { return (IDetour)new Hook((MethodBase)typeFrom.GetMethod(methodFrom, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic), onHook, ref onHookConfig); } catch (Exception ex) { log.error($"Failed to make onHook {typeFrom}.{methodFrom} - {onHook.Method.Name}\n{ex}"); } return null; } } internal static class Utilities { private static GameObject _prefabParent; internal static GameObject CreatePrefab(GameObject gameObject) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown if (!Object.op_Implicit((Object)(object)_prefabParent)) { _prefabParent = new GameObject("DolsoPrefabs"); Object.DontDestroyOnLoad((Object)(object)_prefabParent); ((Object)_prefabParent).hideFlags = (HideFlags)61; _prefabParent.SetActive(false); } return Object.Instantiate<GameObject>(gameObject, _prefabParent.transform); } internal static GameObject CreatePrefab(GameObject gameObject, string name) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown if (!Object.op_Implicit((Object)(object)_prefabParent)) { _prefabParent = new GameObject("DolsoPrefabs"); Object.DontDestroyOnLoad((Object)(object)_prefabParent); ((Object)_prefabParent).hideFlags = (HideFlags)61; _prefabParent.SetActive(false); } return Object.Instantiate<GameObject>(gameObject, _prefabParent.transform); } internal static MethodInfo GetGenericMethod<T>(this Type type, string methodName, params Type[] parameters) { return type.GetMethod(methodName, parameters).MakeGenericMethod(typeof(T)); } internal static AssetBundle LoadAssetBundle(string bundlePathName) { AssetBundle result = null; try { result = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), bundlePathName)); } catch (Exception ex) { log.error("Failed to load assetbundle\n" + ex); } return result; } internal static Obj GetAddressable<Obj>(string addressable) where Obj : Object { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) return Addressables.LoadAssetAsync<Obj>((object)addressable).WaitForCompletion(); } internal static GameObject GetAddressable(string addressable) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) return Addressables.LoadAssetAsync<GameObject>((object)addressable).WaitForCompletion(); } internal static void GetAddressable<Obj>(string addressable, Action<AsyncOperationHandle<Obj>> callback) where Obj : Object { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) AsyncOperationHandle<Obj> val = Addressables.LoadAssetAsync<Obj>((object)addressable); val.Completed += callback; } internal static void GetAddressable(string addressable, Action<AsyncOperationHandle<GameObject>> callback) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) AsyncOperationHandle<GameObject> val = Addressables.LoadAssetAsync<GameObject>((object)addressable); val.Completed += callback; } internal static void AddressableAddComp<Comp>(string addressable) where Comp : Component { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) AsyncOperationHandle<GameObject> val = Addressables.LoadAssetAsync<GameObject>((object)addressable); val.Completed += delegate(AsyncOperationHandle<GameObject> a) { a.Result.AddComponent<Comp>(); }; } internal static void AddressableAddCompSingle<Comp>(string addressable) where Comp : Component { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) AsyncOperationHandle<GameObject> val = Addressables.LoadAssetAsync<GameObject>((object)addressable); val.Completed += delegate(AsyncOperationHandle<GameObject> a) { if (!Object.op_Implicit((Object)(object)a.Result.GetComponent<Comp>())) { a.Result.AddComponent<Comp>(); } }; } internal static void SetStateConfigIndex(this EntityStateConfiguration stateConfig, string fieldName, string newValue) { ref SerializedField[] serializedFields = ref stateConfig.serializedFieldsCollection.serializedFields; for (int i = 0; i < serializedFields.Length; i++) { if (serializedFields[i].fieldName == fieldName) { serializedFields[i].fieldValue.stringValue = newValue; return; } } log.error("failed to find " + fieldName + " for " + ((Object)stateConfig).name); } internal static void SetStateConfigIndex(this EntityStateConfiguration stateConfig, string fieldName, Object newValue) { ref SerializedField[] serializedFields = ref stateConfig.serializedFieldsCollection.serializedFields; for (int i = 0; i < serializedFields.Length; i++) { if (serializedFields[i].fieldName == fieldName) { serializedFields[i].fieldValue.objectValue = newValue; return; } } log.error("failed to find " + fieldName + " for " + ((Object)stateConfig).name); } } public class TextHud { public static HUD hud; private static bool hudVisibility; private static Queue<TextHud> hudsToUpdate; private GameObject objhud; private readonly string hudName; private HGTextMeshProUGUI textMesh; private string textToUpdate; private ConfigEntry<int> fontsizeEntry; private ConfigEntry<Vector2> positionEntry; public ConfigEntry<bool> toggleEntry { get; private set; } public bool resetOnTargetChanged { set { if (value) { HUD.onHudTargetChangedGlobal += OnHudTargetChanged_DoReset; } else { HUD.onHudTargetChangedGlobal -= OnHudTargetChanged_DoReset; } } } public bool enabled { get { if (toggleEntry == null) { return true; } return toggleEntry.Value; } } public int fontSize { get { if (fontsizeEntry == null) { return -1; } return fontsizeEntry.Value; } } public Vector2 position { get { //IL_001e: 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) if (positionEntry == null) { return new Vector2(1776.5f, 173f); } return positionEntry.Value; } } public static event Action onAwake; public static event Action onOnDisable; public static event Action<bool> onVisibilityChanged; static TextHud() { //IL_0012: 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_0021: Unknown result type (might be due to invalid IL or missing references) //IL_004e: 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_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) hudVisibility = true; hudsToUpdate = new Queue<TextHud>(); HookConfig val = new HookConfig { ManualApply = false }; new Hook((MethodBase)typeof(HUD).GetMethod("Awake", BindingFlags.Instance | BindingFlags.NonPublic), typeof(TextHud).GetMethod("On_HUD_Awake", BindingFlags.Static | BindingFlags.NonPublic), val); new Hook((MethodBase)typeof(HUD).GetMethod("OnDisable", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic), typeof(TextHud).GetMethod("On_HUD_OnDisable", BindingFlags.Static | BindingFlags.NonPublic), val); RoR2Application.onLateUpdate += LateUpdate; } private TextHud(string name, ConfigFile configFile, Vector2? defaultPosition, bool? defaultToggle, int? defaultFontSize) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) hudName = name; if (defaultPosition.HasValue) { positionEntry = configFile.Bind<Vector2>(name, "Position", defaultPosition.Value, "Position of " + name + ", starting from bottom left corner"); } if (defaultToggle.HasValue) { toggleEntry = configFile.Bind<bool>(name, "Toggle", defaultToggle.Value, "Toggles " + name); } if (defaultFontSize.HasValue) { fontsizeEntry = configFile.Bind<int>(name, "Font size", defaultFontSize.Value, "Font size of " + name); } DoHooks(configFile); } public TextHud(ConfigFile configFile, string name) : this(name, configFile, null, null, null) { } public TextHud(ConfigFile configFile, string name, Vector2 defaultPosition) : this(name, configFile, defaultPosition, null, null) { }//IL_0003: Unknown result type (might be due to invalid IL or missing references) public TextHud(ConfigFile configFile, string name, Vector2 defaultPosition, bool defaultToggle) : this(name, configFile, defaultPosition, defaultToggle, null) { }//IL_0003: Unknown result type (might be due to invalid IL or missing references) public TextHud(ConfigFile configFile, string name, Vector2 defaultPosition, int defaultFontSize) : this(name, configFile, defaultPosition, null, defaultFontSize) { }//IL_0003: Unknown result type (might be due to invalid IL or missing references) public TextHud(ConfigFile configFile, string name, Vector2 defaultPosition, bool defaultToggle, int defaultFontSize) : this(name, configFile, defaultPosition, defaultToggle, defaultFontSize) { }//IL_0003: Unknown result type (might be due to invalid IL or missing references) public void UpdateText(string text) { if (!hudsToUpdate.Contains(this)) { hudsToUpdate.Enqueue(this); } textToUpdate = text; } public void UpdateText(StringBuilder text) { if (!hudsToUpdate.Contains(this)) { hudsToUpdate.Enqueue(this); } textToUpdate = text.ToString(); } private static void LateUpdate() { while (hudsToUpdate.Count > 0) { TextHud textHud = hudsToUpdate.Dequeue(); if (textHud.enabled) { if ((Object)(object)textHud.objhud == (Object)null) { textHud.InitHud(); } ((TMP_Text)textHud.textMesh).SetText(textHud.textToUpdate, true); } textHud.textToUpdate = null; } if (Object.op_Implicit((Object)(object)hud) && hud.mainUIPanel.activeInHierarchy != hudVisibility) { hudVisibility = hud.mainUIPanel.activeInHierarchy; TextHud.onVisibilityChanged?.Invoke(hudVisibility); } } public void DestroyHUD() { Object.Destroy((Object)(object)objhud); } private void InitHud() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0054: 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) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: 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) objhud = new GameObject(hudName); if (Object.op_Implicit((Object)(object)hud)) { objhud.transform.SetParent(hud.mainContainer.transform, false); } RectTransform obj = objhud.AddComponent<RectTransform>(); obj.anchorMin = Vector2.zero; obj.anchorMax = Vector2.zero; obj.sizeDelta = Vector2.zero; obj.pivot = new Vector2(0.5f, 0.5f); obj.anchoredPosition = position; textMesh = objhud.AddComponent<HGTextMeshProUGUI>(); ((TMP_Text)textMesh).fontSizeMin = 6f; if (fontSize >= 0) { ((TMP_Text)textMesh).fontSize = fontSize; } ((TMP_Text)textMesh).outlineColor = Color32.op_Implicit(Color.black); ((TMP_Text)textMesh).outlineWidth = 0.1f; ((TMP_Text)textMesh).enableWordWrapping = false; } private void DoHooks(ConfigFile configFile) { onAwake += HUDAwakened; HUD.onHudTargetChangedGlobal += OnHudTargetChanged_DoReset; onVisibilityChanged += OnHudVisibilityChanged; if (toggleEntry != null) { toggleEntry.SettingChanged += EntryToggle_Changed; } if (positionEntry != null) { positionEntry.SettingChanged += EntryPosition_Changed; } if (fontsizeEntry != null) { fontsizeEntry.SettingChanged += EntryFontSize_Changed; } } private void HUDAwakened() { if (Object.op_Implicit((Object)(object)objhud)) { objhud.transform.SetParent(hud.mainContainer.transform, false); } } private void OnHudTargetChanged_DoReset(HUD obj) { if (Object.op_Implicit((Object)(object)objhud)) { UpdateText(""); } } private void OnHudVisibilityChanged(bool visibility) { if (Object.op_Implicit((Object)(object)objhud)) { objhud.SetActive(visibility); } } private void EntryToggle_Changed(object sender, EventArgs e) { if (Object.op_Implicit((Object)(object)objhud) && !enabled) { Object.Destroy((Object)(object)objhud); } } private void EntryPosition_Changed(object sender, EventArgs e) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)objhud)) { objhud.GetComponent<RectTransform>().anchoredPosition = position; } } private void EntryFontSize_Changed(object sender, EventArgs e) { if (Object.op_Implicit((Object)(object)objhud) && fontSize > 0) { ((TMP_Text)textMesh).fontSize = fontSize; } } private static void On_HUD_Awake(Action<HUD> orig, HUD self) { orig(self); hud = self; TextHud.onAwake?.Invoke(); } private static void On_HUD_OnDisable(Action<HUD> orig, HUD self) { orig(self); hud = null; TextHud.onOnDisable?.Invoke(); } public void AddRoOVector2Option() { AddRoOVector2Option(hudName); } public void AddRoOVector2Option(string category) { //IL_0021: 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_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) new Vector2ScreenOption(positionEntry, hudName + " text", category, new Vector2ScreenOption.DotInfo(new Vector2(0f, 1f), new Vector2(0f, 0f), new Vector2(0.5f, 0.5f), Vector2.op_Implicit(Vector3.zero)), toggleEntry, fontsizeEntry); } } } namespace Dolso.RiskofOptions { internal static class RiskofOptions { internal const string rooGuid = "com.rune580.riskofoptions"; internal static bool enabled => Chainloader.PluginInfos.ContainsKey("com.rune580.riskofoptions"); internal static void SetSprite(Sprite sprite) { ModSettingsManager.SetModIcon(sprite); } internal static void SetSpriteDefaultIcon() { //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Expected O, but got Unknown //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) DirectoryInfo directoryInfo = new DirectoryInfo(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)); string path = ((!(directoryInfo.Name == "plugins")) ? directoryInfo.FullName : directoryInfo.Parent.FullName); Texture2D val = new Texture2D(256, 256); if (ImageConversion.LoadImage(val, File.ReadAllBytes(Path.Combine(path, "icon.png")))) { ModSettingsManager.SetModIcon(Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f))); } else { log.error("Failed to load icon.png"); } } internal static void AddBool(ConfigEntry<bool> entry) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Expected O, but got Unknown //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(entry, new CheckBoxConfig { description = ((ConfigEntryBase)(object)entry).DescWithDefault() })); } internal static void AddBool(ConfigEntry<bool> entry, string categoryName, string name) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: 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_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Expected O, but got Unknown //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(entry, new CheckBoxConfig { category = categoryName, name = name, description = ((ConfigEntryBase)(object)entry).DescWithDefault() })); } internal static void AddEnum<T>(ConfigEntry<T> entry) where T : Enum { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Expected O, but got Unknown //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown ModSettingsManager.AddOption((BaseOption)new ChoiceOption((ConfigEntryBase)(object)entry, new ChoiceConfig { description = ((ConfigEntryBase)(object)entry).DescWithDefault() })); } internal static void AddColor(ConfigEntry<Color> entry) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Expected O, but got Unknown //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown ModSettingsManager.AddOption((BaseOption)new ColorOption(entry, new ColorOptionConfig { description = ((ConfigEntryBase)(object)entry).DescWithDefault() })); } internal static void AddKey(ConfigEntry<KeyboardShortcut> entry) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Expected O, but got Unknown //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown ModSettingsManager.AddOption((BaseOption)new KeyBindOption(entry, new KeyBindConfig { description = ((ConfigEntryBase)(object)entry).DescWithDefault() })); } internal static void AddFloat(ConfigEntry<float> entry, float min, float max, string format = "{0:f2}") { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: 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_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Expected O, but got Unknown //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Expected O, but got Unknown ModSettingsManager.AddOption((BaseOption)new SliderOption(entry, new SliderConfig { min = min, max = max, formatString = format, description = ((ConfigEntryBase)(object)entry).DescWithDefault(format) })); } internal static void AddFloat(ConfigEntry<float> entry, string categoryName, float min, float max, string format = "{0:f2}") { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: 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_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001c: 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_0036: Expected O, but got Unknown //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Expected O, but got Unknown ModSettingsManager.AddOption((BaseOption)new SliderOption(entry, new SliderConfig { min = min, max = max, formatString = format, category = categoryName, description = ((ConfigEntryBase)(object)entry).DescWithDefault(format) })); } internal static void AddFloatField(ConfigEntry<float> entry, float min = float.MinValue, float max = float.MaxValue, string format = "{0:f2}") { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Expected O, but got Unknown //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Expected O, but got Unknown //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Expected O, but got Unknown //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Expected O, but got Unknown FloatFieldConfig val = new FloatFieldConfig(); ((NumericFieldConfig<float>)val).Min = min; ((NumericFieldConfig<float>)val).Max = max; ((BaseOptionConfig)val).description = ((ConfigEntryBase)(object)entry).DescWithDefault(format); ModSettingsManager.AddOption((BaseOption)new FloatFieldOption(entry, val)); } internal static void AddInt(ConfigEntry<int> entry, int min = int.MinValue, int max = int.MaxValue) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Expected O, but got Unknown //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Expected O, but got Unknown //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Expected O, but got Unknown //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown IntFieldConfig val = new IntFieldConfig(); ((NumericFieldConfig<int>)val).Min = min; ((NumericFieldConfig<int>)val).Max = max; ((BaseOptionConfig)val).description = ((ConfigEntryBase)(object)entry).DescWithDefault(); ModSettingsManager.AddOption((BaseOption)new IntFieldOption(entry, val)); } internal static void AddIntSlider(ConfigEntry<int> entry, int min, int max) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: 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_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Expected O, but got Unknown //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown ModSettingsManager.AddOption((BaseOption)new IntSliderOption(entry, new IntSliderConfig { min = min, max = max, description = ((ConfigEntryBase)(object)entry).DescWithDefault() })); } internal static void AddIntSlider(ConfigEntry<int> entry, string categoryName, int min, int max) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: 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_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Expected O, but got Unknown //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Expected O, but got Unknown ModSettingsManager.AddOption((BaseOption)new IntSliderOption(entry, new IntSliderConfig { min = min, max = max, category = categoryName, description = ((ConfigEntryBase)(object)entry).DescWithDefault() })); } internal static void AddString(ConfigEntry<string> entry) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: 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_000f: 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_0025: Expected O, but got Unknown //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown ModSettingsManager.AddOption((BaseOption)new StringInputFieldOption(entry, new InputFieldConfig { submitOn = (SubmitEnum)6, lineType = (LineType)0, description = ((ConfigEntryBase)(object)entry).DescWithDefault() })); } internal static void AddOption(ConfigEntry<bool> entry) { AddBool(entry); } internal static void AddOption(ConfigEntry<bool> entry, string categoryName, string name) { AddBool(entry, categoryName, name); } internal static void AddOption<T>(ConfigEntry<T> entry) where T : Enum { AddEnum<T>(entry); } internal static void AddOption(ConfigEntry<Color> entry) { AddColor(entry); } internal static void AddOption(ConfigEntry<KeyboardShortcut> entry) { AddKey(entry); } internal static void AddOption(ConfigEntry<int> entry) { AddInt(entry); } internal static void AddOption(ConfigEntry<string> entry) { AddString(entry); } private static string DescWithDefault(this ConfigEntryBase entry) { return $"{entry.Description.Description}\n[Default: {entry.DefaultValue}]"; } private static string DescWithDefault(this ConfigEntryBase entry, string format) { return string.Format("{1}\n[Default: " + format + "]", entry.DefaultValue, entry.Description.Description); } } public class RooSliderInput2 : MonoBehaviour { [Serializable] public class SliderInputEvent : UnityEvent<float> { } public Slider slider; public TMP_InputField inputField; public string formatString = "{0}"; public float sliderMin; public float sliderMax; public float valueMin; public float valueMax; public SliderInputEvent onValueChanged = new SliderInputEvent(); private float _value; public float Value { get { return _value; } set { if (_value != value) { _value = value; ((UnityEvent<float>)onValueChanged).Invoke(_value); } UpdateControls(); } } public void SetUnmappedValue(float value) { Value = value; } public void Setup(float min, float max) { valueMin = min; sliderMin = min; slider.minValue = min; valueMax = max; sliderMax = max; slider.maxValue = max; ((UnityEvent<float>)(object)slider.onValueChanged).AddListener((UnityAction<float>)SliderChanged); ((UnityEvent<string>)(object)inputField.onEndEdit).AddListener((UnityAction<string>)OnTextEdited); ((UnityEvent<string>)(object)inputField.onSubmit).AddListener((UnityAction<string>)OnTextEdited); } private void UpdateControls() { if (formatString.StartsWith("F")) { slider.value = Value; inputField.text = Value.ToString(formatString, CultureInfo.InvariantCulture); } else { int num = (int)Value; slider.value = num; inputField.text = string.Format(CultureInfo.InvariantCulture, formatString, num); } } private void SliderChanged(float newValue) { Value = newValue; } private void OnTextEdited(string newText) { if (float.TryParse(newText, out var result)) { result = Mathf.Clamp(result, slider.minValue, slider.maxValue); Value = result; } else { Value = _value; } } } public class Vector2ScreenBehaviour : MonoBehaviour { public static GameObject prefab; private static Sprite checkOn; private static Sprite checkOff; private ChildLocator childLocator; private RectTransform positionDot; private RectTransform positionRect; private Vector2ScreenOption option; private RooSliderInput2 sliderX; private RooSliderInput2 sliderY; private RooSliderInput2 sliderSize; private Image checkBox; private bool boxState; private ConfigEntry<Vector2> positionEntry => option.positionEntry; private Vector2ScreenOption.DotInfo dotinfo => option.dotInfo; private ConfigEntry<bool> toggleEntry => option.toggleEntry; private ConfigEntry<int> fontSizeEntry => option.fontSizeEntry; private ConfigEntry<float> scaleEntry => option.scaleEntry; public static void LoadAssets(string assetFolder) { AssetBundle obj = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), assetFolder, "dolso")); prefab = obj.LoadAsset<GameObject>("TextHud Screen"); obj.Unload(false); LoadImages(); } public static void LoadAssets(GameObject vector2WindowPrefab) { prefab = vector2WindowPrefab; LoadImages(); } private static void LoadImages() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) CarouselController component = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/UI/SettingsEntryButton, Bool.prefab").WaitForCompletion().GetComponent<CarouselController>(); checkOn = component.choices[1].customSprite; checkOff = component.choices[0].customSprite; } internal void SetStartingValues(Vector2ScreenOption option) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0029: 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_0055: Unknown result type (might be due to invalid IL or missing references) //IL_006b: 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) //IL_0097: 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) //IL_0166: Unknown result type (might be due to invalid IL or missing references) //IL_0241: Unknown result type (might be due to invalid IL or missing references) //IL_0250: Unknown result type (might be due to invalid IL or missing references) //IL_0255: Unknown result type (might be due to invalid IL or missing references) //IL_01af: Unknown result type (might be due to invalid IL or missing references) //IL_01b9: Expected O, but got Unknown //IL_0377: Unknown result type (might be due to invalid IL or missing references) //IL_037c: Unknown result type (might be due to invalid IL or missing references) this.option = option; positionDot.anchorMin = dotinfo.dotAnchor; positionDot.anchorMax = dotinfo.dotAnchor; positionDot.pivot = dotinfo.dotAnchor; positionRect.anchorMin = dotinfo.rectAnchor; positionRect.anchorMax = dotinfo.rectAnchor; positionRect.pivot = dotinfo.rectPivot; positionRect.sizeDelta = dotinfo.rectSize; sliderX = BuildSlider("PositionX"); CalcAndSetSliderMinMax(sliderX, 1920f, 0); sliderX.formatString = "F0"; ((UnityEvent<float>)sliderX.onValueChanged).AddListener((UnityAction<float>)XChanged); sliderY = BuildSlider("PositionY"); CalcAndSetSliderMinMax(sliderY, 1080f, 1); sliderY.formatString = "F0"; ((UnityEvent<float>)sliderY.onValueChanged).AddListener((UnityAction<float>)YChanged); sliderX.Value = positionEntry.Value.x; sliderY.Value = positionEntry.Value.y; if (toggleEntry != null) { boxState = toggleEntry.Value; ((UnityEvent)((Button)((Component)childLocator.FindChild("Toggle")).GetComponent<HGButton>()).onClick).AddListener(new UnityAction(ToggleChanged)); checkBox = ((Component)childLocator.FindChild("ToggleBox")).GetComponent<Image>(); checkBox.sprite = (boxState ? checkOn : checkOff); } else { ((Component)childLocator.FindChild("ToggleParent")).gameObject.SetActive(false); ((Component)childLocator.FindChild("ToggleText")).gameObject.SetActive(false); RectTransform component = ((Component)childLocator.FindChild("Size")).GetComponent<RectTransform>(); component.anchoredPosition += new Vector2(0f, 66f); } if (fontSizeEntry != null) { sliderSize = BuildSlider("Size"); sliderSize.Setup(5f, option.maxScale); sliderSize.formatString = "{0}"; ((UnityEvent<float>)sliderSize.onValueChanged).AddListener((UnityAction<float>)FontSizeChanged); sliderSize.Value = fontSizeEntry.Value; } else if (scaleEntry != null) { sliderSize = BuildSlider("Size"); sliderSize.Setup(0f, option.maxScale); sliderSize.formatString = "F1"; ((UnityEvent<float>)sliderSize.onValueChanged).AddListener((UnityAction<float>)ScaleChanged); sliderSize.slider.wholeNumbers = false; sliderSize.Value = scaleEntry.Value; } else { ((Component)childLocator.FindChild("Size")).gameObject.SetActive(false); SetSize(option.maxScale * Vector2.one); } } private void Awake() { //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Expected O, but got Unknown //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Expected O, but got Unknown //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Expected O, but got Unknown //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Expected O, but got Unknown childLocator = ((Component)this).GetComponent<ChildLocator>(); positionDot = ((Component)childLocator.FindChild("PositionDot")).GetComponent<RectTransform>(); positionRect = ((Component)childLocator.FindChild("PositionRect")).GetComponent<RectTransform>(); ((UnityEvent)((Button)((Component)childLocator.FindChild("Apply")).GetComponent<HGButton>()).onClick).AddListener(new UnityAction(Apply)); ((UnityEvent)((Button)((Component)childLocator.FindChild("Cancel")).GetComponent<HGButton>()).onClick).AddListener(new UnityAction(Close)); ((UnityEvent)((Button)((Component)childLocator.FindChild("Default")).GetComponent<HGButton>()).onClick).AddListener(new UnityAction(SetToDefault)); ((Component)this).GetComponent<RooEscapeRouter>().escapePressed.AddListener(new UnityAction(Close)); } private RooSliderInput2 BuildSlider(string childName) { Transform val = childLocator.FindChild(childName); RooSliderInput2 rooSliderInput = ((Component)val).gameObject.AddComponent<RooSliderInput2>(); rooSliderInput.slider = ((Component)val).GetComponentInChildren<Slider>(); rooSliderInput.inputField = ((Component)val).GetComponentInChildren<TMP_InputField>(); return rooSliderInput; } private void CalcAndSetSliderMinMax(RooSliderInput2 slider, float length, int index) { float num = (0f - ((Vector2)(ref dotinfo.rectSize))[index]) * (((Vector2)(ref dotinfo.dotAnchor))[index] - ((Vector2)(ref dotinfo.rectPivot))[index]); float min = (0f - length) * ((Vector2)(ref dotinfo.rectAnchor))[index] + num; float max = length * (1f - ((Vector2)(ref dotinfo.rectAnchor))[index]) + num; slider.Setup(min, max); } private void XChanged(float newValue) { //IL_0006: 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_001a: Unknown result type (might be due to invalid IL or missing references) Vector2 anchoredPosition = positionRect.anchoredPosition; anchoredPosition.x = newValue; positionRect.anchoredPosition = anchoredPosition; } private void YChanged(float newValue) { //IL_0006: 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_001a: Unknown result type (might be due to invalid IL or missing references) Vector2 anchoredPosition = positionRect.anchoredPosition; anchoredPosition.y = newValue; positionRect.anchoredPosition = anchoredPosition; } private void ToggleChanged() { boxState = !boxState; checkBox.sprite = (boxState ? checkOn : checkOff); } private void FontSizeChanged(float newValue) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) SetSize(newValue * Vector2.one); } private void ScaleChanged(float newValue) { //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) SetSize(newValue * dotinfo.rectSize); } private void SetToDefault() { //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_0017: 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) Vector2 val = (Vector2)((ConfigEntryBase)positionEntry).DefaultValue; sliderX.Value = val.x; sliderY.Value = val.y; if (toggleEntry != null) { boxState = (bool)((ConfigEntryBase)toggleEntry).DefaultValue; checkBox.sprite = (boxState ? checkOn : checkOff); } if (fontSizeEntry != null) { sliderSize.Value = (int)((ConfigEntryBase)fontSizeEntry).DefaultValue; } else if (scaleEntry != null) { sliderSize.Value = (float)((ConfigEntryBase)scaleEntry).DefaultValue; } } private void SetSize(Vector2 size) { //IL_0031: 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_0020: Unknown result type (might be due to invalid IL or missing references) if (((Vector2)(ref size)).sqrMagnitude < 16f) { positionDot.sizeDelta = ((Vector2)(ref size)).normalized * 4f; } else { positionDot.sizeDelta = size; } } private void Apply() { //IL_002c: Unknown result type (might be due to invalid IL or missing references) positionEntry.Value = new Vector2((float)Math.Round(sliderX.Value, 2), (float)Math.Round(sliderY.Value, 2)); if (toggleEntry != null) { toggleEntry.Value = boxState; } if (fontSizeEntry != null) { fontSizeEntry.Value = Mathf.RoundToInt(sliderSize.Value); } else if (scaleEntry != null) { scaleEntry.Value = sliderSize.Value; } Close(); } private void Close() { Object.DestroyImmediate((Object)(object)((Component)this).gameObject); } } public class Vector2ScreenOption { public class DotInfo { internal Vector2 dotAnchor; internal Vector2 rectAnchor; internal Vector2 rectPivot; internal Vector2 rectSize; public DotInfo(Vector2 dotAnchor, Vector2 rectAnchor, Vector2 rectPivot, Vector2 rectSize) { //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) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_000f: 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_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: 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) this.dotAnchor = dotAnchor; this.rectAnchor = rectAnchor; this.rectPivot = rectPivot; this.rectSize = rectSize; } } internal ConfigEntry<Vector2> positionEntry; internal ConfigEntry<bool> toggleEntry; internal ConfigEntry<int> fontSizeEntry; internal ConfigEntry<float> scaleEntry; internal DotInfo dotInfo; internal float maxScale; public Vector2ScreenOption(ConfigEntry<Vector2> positionEntry, DotInfo dotInfo, float dotSize = 16f) : this(positionEntry, ((ConfigEntryBase)positionEntry).Definition.Key, ((ConfigEntryBase)positionEntry).Definition.Section, dotInfo, null, null, null, dotSize) { } public Vector2ScreenOption(ConfigEntry<Vector2> positionEntry, string name, string category, DotInfo dotInfo, float dotSize = 16f) : this(positionEntry, name, category, dotInfo, null, null, null, dotSize) { } public Vector2ScreenOption(ConfigEntry<Vector2> positionEntry, DotInfo dotInfo, ConfigEntry<float> scaleEntry, float maxScale = 3f) : this(positionEntry, ((ConfigEntryBase)positionEntry).Definition.Key, ((ConfigEntryBase)positionEntry).Definition.Section, dotInfo, null, null, scaleEntry, maxScale) { } public Vector2ScreenOption(ConfigEntry<Vector2> positionEntry, string name, string category, DotInfo dotInfo, ConfigEntry<float> scaleEntry, float maxScale = 3f) : this(positionEntry, name, category, dotInfo, null, null, scaleEntry, maxScale) { } public Vector2ScreenOption(ConfigEntry<Vector2> positionEntry, string name, string category, DotInfo dotInfo, ConfigEntry<bool> toggleEntry = null, ConfigEntry<int> fontSizeEntry = null) : this(positionEntry, name, category, dotInfo, toggleEntry, fontSizeEntry, null, (fontSizeEntry == null) ? 16 : 36) { } private Vector2ScreenOption(ConfigEntry<Vector2> positionEntry, string name, string category, DotInfo dotInfo, ConfigEntry<bool> toggleEntry, ConfigEntry<int> fontSizeEntry, ConfigEntry<float> scaleEntry, float maxScale) { //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Expected O, but got Unknown //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Expected O, but got Unknown this.positionEntry = positionEntry; this.dotInfo = dotInfo; this.maxScale = maxScale; this.toggleEntry = toggleEntry; this.fontSizeEntry = fontSizeEntry; this.scaleEntry = scaleEntry; ModSettingsManager.AddOption((BaseOption)new GenericButtonOption(name, category, "Position of " + name, "Open", new UnityAction(CreateOptionWindow))); } private void CreateOptionWindow() { Object.Instantiate<GameObject>(Vector2ScreenBehaviour.prefab).AddComponent<Vector2ScreenBehaviour>().SetStartingValues(this); } } } namespace LoaderRuler { internal class Grapple { private static readonly IDetour[] hooks = (IDetour[])(object)new IDetour[2]; internal static TextHud grappleDurationHud; internal static TextHud grappleLengthHud; private static float lastHeight = 0f; private static bool eenabled { get { if (!grappleDurationHud.enabled) { return grappleLengthHud.enabled; } return true; } } [SetupElement] private static void SetupElement() { hooks[0] = HookManager.ManualDetour(typeof(ProjectileGrappleController), "OnDestroy", new Action<Action<ProjectileGrappleController>, ProjectileGrappleController>(On_Grapple_OnDestroy)); hooks[1] = HookManager.ManualDetour(typeof(BaseState), "FixedUpdate", new Action<Action<BaseState>, BaseState>(On_State_FixedUpdate)); grappleDurationHud.toggleEntry.SettingChanged += delegate { LoadElement(fromSetting: true); }; grappleLengthHud.toggleEntry.SettingChanged += delegate { LoadElement(fromSetting: true); }; LoadElement(fromSetting: false); } private static void LoadElement(bool fromSetting) { if (eenabled) { IDetour[] array = hooks; foreach (IDetour val in array) { if (!val.IsApplied) { val.Apply(); } } } else { if (!fromSetting) { return; } IDetour[] array = hooks; foreach (IDetour val2 in array) { if (val2.IsApplied) { val2.Undo(); } } } } private static void On_State_FixedUpdate(Action<BaseState> orig, BaseState self) { //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: 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_0138: Unknown result type (might be due to invalid IL or missing references) //IL_013d: Unknown result type (might be due to invalid IL or missing references) //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_014e: Unknown result type (might be due to invalid IL or missing references) //IL_0152: Unknown result type (might be due to invalid IL or missing references) //IL_01cd: Unknown result type (might be due to invalid IL or missing references) orig(self); BaseState val = (BaseState)(object)((self is BaseState) ? self : null); GameObject gameObject = val.owner.gameObject; HUD hud = TextHud.hud; if ((Object)(object)gameObject != (Object)(object)((hud != null) ? hud.targetBodyObject : null)) { return; } ProjectileSimple projectileSimple = val.grappleController.projectileSimple; float num = 1f - projectileSimple.stopwatch / projectileSimple.lifetime; Color val2 = default(Color); ((Color)(ref val2))..ctor(1f, 3f * num, 3f * num); float num2 = projectileSimple.lifetime - projectileSimple.stopwatch; grappleDurationHud.UpdateText(Util.GenerateColoredString(num2.ToString("0"), Color32.op_Implicit(val2))); if (!grappleLengthHud.enabled) { return; } float num3 = Vector3.Distance(val.aimOrigin, val.position); StringBuilder stringBuilder = new StringBuilder(); if (LRConfig.GLLengthToggle.Value) { if (num3 < 10f) { stringBuilder.AppendLine(num3.ToString("0.0")); } else { stringBuilder.AppendLine(num3.ToString("0")); } } if ((Object)(object)((EntityState)self).characterBody == (Object)(object)LocalUserManager.GetFirstLocalUser().cachedBody || LRConfig.GLEnergyToggle.Value) { Ray val3 = new Ray(val.owner.characterBody.footPosition, Vector3.down); LayerIndex world = LayerIndex.world; RaycastHit val4 = default(RaycastHit); if (Physics.Raycast(val3, ref val4, 300f, LayerMask.op_Implicit(((LayerIndex)(ref world)).mask), (QueryTriggerInteraction)2)) { lastHeight = ((RaycastHit)(ref val4)).distance; } float num4 = ((LRConfig.GLSlamToggle.Value && val.owner.characterMotor.airControl == GroundSlam.airControl) ? GroundSlam.verticalAcceleration : 0f); stringBuilder.Append(((((Vector3)(ref val.owner.characterMotor.velocity)).sqrMagnitude / 2f + val.grappleController.acceleration * num3 - (Physics.gravity.y + num4) * lastHeight) / 100f).ToString("0")); } grappleLengthHud.UpdateText(stringBuilder); } private static void On_Grapple_OnDestroy(Action<ProjectileGrappleController> orig, ProjectileGrappleController self) { orig(self); if (grappleDurationHud.enabled) { grappleDurationHud.UpdateText(""); } if (grappleLengthHud.enabled) { grappleLengthHud.UpdateText(""); } } } internal class LoaderFixes { private class ApplyListenersToLoaderChargingCrosshair : MonoBehaviour { public Image image; private void Awake() { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Expected O, but got Unknown //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Expected O, but got Unknown //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Expected O, but got Unknown //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Expected O, but got Unknown LoaderHookCrosshairController component = ((Component)this).GetComponent<LoaderHookCrosshairController>(); image = ((Component)((Component)this).transform.Find("HookIndicatorInRange(Clone)")).GetComponent<Image>(); component.onEnterRange = new UnityEvent(); component.onExitRange = new UnityEvent(); component.onEnterRange.AddListener(new UnityAction(EnableImage)); component.onExitRange.AddListener(new UnityAction(DisableImage)); } private void EnableImage() { ((Behaviour)image).enabled = LRConfig.improveCrosshair.Value; } private void DisableImage() { ((Behaviour)image).enabled = false; } } private static GameObject chargeFistCrosshair; private static BodyIndex loaderBodyIndex = (BodyIndex)(-1); [SetupElement] private static void SetupElement() { //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Expected O, but got Unknown //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Expected O, but got Unknown LRConfig.fixGrappleLength.HookConfig(typeof(FlyState), "FixedUpdateBehavior", (Delegate)new Action<Action<FlyState>, FlyState>(On_FlyState_FixedUpdate_ModifyDuration)); LRConfig.improveCrosshair.SettingChanged += delegate { LoadCrosshairToggle(fromSetting: true); }; LRConfig.improveCrosshair.HookConfig(typeof(CrosshairManager), "UpdateCrosshair", new Manipulator(IL_Crosshair_Update_DisableSprint)); LRConfig.improveCrosshair.HookConfig(typeof(LoaderHookCrosshairController), "Update", new Manipulator(IL_LoaderCrosshair_Update_FixLength)); LoadCrosshairToggle(fromSetting: false); } private static void LoadCrosshairToggle(bool fromSetting) { if (LRConfig.improveCrosshair.Value) { if (!Object.op_Implicit((Object)(object)chargeFistCrosshair)) { chargeFistCrosshair = Utilities.CreatePrefab(Utilities.GetAddressable("RoR2/Base/UI/StraightBracketCrosshair.prefab"), "LoaderChargingCrosshair"); chargeFistCrosshair.AddComponent<ApplyListenersToLoaderChargingCrosshair>(); chargeFistCrosshair.AddComponent<LoaderHookCrosshairController>().range = 80f; Object.Instantiate<GameObject>(((Component)Utilities.GetAddressable("RoR2/Base/Loader/LoaderCrosshair.prefab").transform.Find("HookIndicatorInRange")).gameObject, chargeFistCrosshair.transform); } EntityStateConfiguration addressable = Utilities.GetAddressable<EntityStateConfiguration>("RoR2/Base/Loader/EntityStates.Loader.BaseChargeFist.asset"); addressable.SetStateConfigIndex("crosshairOverridePrefab", (Object)(object)chargeFistCrosshair); if (fromSetting) { EntityStateCatalog.ApplyEntityStateConfiguration(addressable); } } else if (fromSetting) { EntityStateConfiguration addressable2 = Utilities.GetAddressable<EntityStateConfiguration>("RoR2/Base/Loader/EntityStates.Loader.BaseChargeFist.asset"); addressable2.SetStateConfigIndex("crosshairOverridePrefab", (Object)(object)Utilities.GetAddressable("RoR2/Base/UI/StraightBracketCrosshair.prefab")); EntityStateCatalog.ApplyEntityStateConfiguration(addressable2); } } private static void IL_Crosshair_Update_DisableSprint(ILContext il) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); if (!val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[2] { (Instruction x) => ILPatternMatchingExt.MatchLdarg(x, 1), (Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<CharacterBody>(x, "get_isSprinting") })) { log.error("Failed to IL hook sprint crosshair"); return; } val.Emit(OpCodes.Ldarg_1); val.EmitDelegate<Func<CharacterBody, bool>>((Func<CharacterBody, bool>)delegate(CharacterBody body) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Invalid comparison between Unknown and I4 //IL_000d: 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_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) if ((int)loaderBodyIndex == -1) { loaderBodyIndex = BodyCatalog.FindBodyIndex("LoaderBody"); } return (!LRConfig.improveCrosshair.Value || body.bodyIndex != loaderBodyIndex) ? true : false; }); val.Emit(OpCodes.And); } private static void IL_LoaderCrosshair_Update_FixLength(ILContext il) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Expected O, but got Unknown //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_010d: Unknown result type (might be due to invalid IL or missing references) //IL_01cc: Unknown result type (might be due to invalid IL or missing references) //IL_01fe: Unknown result type (might be due to invalid IL or missing references) //IL_0210: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); if (val.TryGotoNext(new Func<Instruction, bool>[2] { (Instruction a) => ILPatternMatchingExt.MatchCallOrCallvirt<GenericSkill>(a, "CanExecute"), (Instruction a) => ILPatternMatchingExt.MatchCallOrCallvirt<LoaderHookCrosshairController>(a, "SetAvailable") })) { int index = val.Index; val.Index = index + 1; val.Emit(OpCodes.Pop); Instruction next = val.Next; FieldReference val5 = default(FieldReference); if (val.TryGotoPrev(new Func<Instruction, bool>[2] { (Instruction a) => ILPatternMatchingExt.MatchLdarg(a, 0), (Instruction a) => ILPatternMatchingExt.MatchLdfld(a, ref val5) })) { val.Emit(OpCodes.Dup); val.EmitDelegate<Func<LoaderHookCrosshairController, bool>>((Func<LoaderHookCrosshairController, bool>)((LoaderHookCrosshairController self) => self.hudElement.targetCharacterBody.skillLocator.secondary.stateMachine.IsInMainState() || self.hudElement.targetCharacterBody.skillLocator.utility.stateMachine.IsInMainState())); val.Emit(OpCodes.Br, next); int flag = 0; ILLabel branchTarget = null; if (val.TryGotoNext(new Func<Instruction, bool>[2] { (Instruction a) => ILPatternMatchingExt.MatchLdcI4(a, 0), (Instruction a) => ILPatternMatchingExt.MatchStloc(a, ref flag) }) && val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[3] { (Instruction a) => ILPatternMatchingExt.MatchLdarg(a, 0), (Instruction a) => ILPatternMatchingExt.MatchLdfld<LoaderHookCrosshairController>(a, "isAvailable"), (Instruction a) => ILPatternMatchingExt.MatchBrfalse(a, ref branchTarget) })) { val.Emit(OpCodes.Ldarg_0); val.EmitDelegate<Func<LoaderHookCrosshairController, bool>>((Func<LoaderHookCrosshairController, bool>)delegate(LoaderHookCrosshairController self) { //IL_001d: 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_002d: 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) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005c: 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) //IL_006a: Unknown result type (might be due to invalid IL or missing references) CharacterBody targetCharacterBody = self.hudElement.targetCharacterBody; GameObject targetBodyObject = self.hudElement.targetBodyObject; Ray val2 = new Ray(targetCharacterBody.inputBank.aimOrigin, targetCharacterBody.inputBank.aimDirection); float num = self.range + 4f; LayerIndex val3 = LayerIndex.world; int num2 = LayerMask.op_Implicit(((LayerIndex)(ref val3)).mask); val3 = LayerIndex.entityPrecise; RaycastHit val4 = default(RaycastHit); return Util.CharacterSpherecast(targetBodyObject, val2, 0.25f, ref val4, num, LayerMask.op_Implicit(num2 | LayerMask.op_Implicit(((LayerIndex)(ref val3)).mask)), (QueryTriggerInteraction)1); }); val.Emit(OpCodes.Stloc, flag); val.Emit(OpCodes.Br, (object)branchTarget); return; } } } log.error("Failed to IL hook fix loader crosshair"); } private static void On_FlyState_FixedUpdate_ModifyDuration(Action<FlyState> orig, FlyState self) { //IL_000e: 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) if (((EntityState)self).isAuthority) { Vector3 velocity = ((EntityState)self).rigidbody.velocity; if (((Vector3)(ref velocity)).sqrMagnitude == 0f) { self.duration += Time.fixedDeltaTime / 2f; } } orig(self); } } internal static class LRConfig { public static ConfigFile configFile; private const string PUNCH = "PunchHud"; public static ConfigEntry<int> LRPunchHudCount; private const string GRAPPLE = "Grapple Length"; public static ConfigEntry<bool> GLLengthToggle; public static ConfigEntry<bool> GLEnergyToggle; public static ConfigEntry<bool> GLSlamToggle; private const string VELOCITY = "VelocityIndicator"; public static ConfigEntry<bool> velocityToggle; public static ConfigEntry<float> velocityScale; public static ConfigEntry<string> velocityIcon; public static ConfigEntry<bool> velocityStaticColor; public static ConfigEntry<Color> velocityColor; private const string SPEED = "Speed Text"; public static ConfigEntry<int> speedFontSize; public static ConfigEntry<float> speedDot; private const string FIXES = "Fixes"; public static ConfigEntry<bool> improveCrosshair; public static ConfigEntry<bool> fixGrappleLength; internal static void DoConfig(ConfigFile bepConfigFile) { //IL_001a: 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_0064: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_019a: Unknown result type (might be due to invalid IL or missing references) configFile = bepConfigFile; PunchText.punchTextHud = new TextHud(configFile, "PunchHud", new Vector2(650f, 250f), defaultToggle: true); Grapple.grappleDurationHud = new TextHud(configFile, "GrappleDurationHud", new Vector2(750f, 650f), defaultToggle: true, 15); Grapple.grappleLengthHud = new TextHud(configFile, "Grapple Length", new Vector2(1070f, 490f), defaultToggle: false, 15); SpeedText.speedTextHud = new TextHud(configFile, "Speed Text", new Vector2(870f, 590f), defaultToggle: true); LRPunchHudCount = configFile.Bind<int>("PunchHud", "Count", 3, "How many previous punches to display"); GLLengthToggle = configFile.Bind<bool>("Grapple Length", "Length text", false, "Display length text"); GLEnergyToggle = configFile.Bind<bool>("Grapple Length", "Energy text", true, "Display your \"energy\". Kinetic + grapple length * grapple acceleration + height * gravity"); GLSlamToggle = configFile.Bind<bool>("Grapple Length", "Include Slam energy", true, "If in slam state, include slam acceleration in gravity potential"); velocityToggle = configFile.Bind<bool>("VelocityIndicator", "Toggle", true, "Toggle display of velocity indicator, may require game restart"); velocityScale = configFile.Bind<float>("VelocityIndicator", "Scale", 0.25f, "Scale of icon"); velocityStaticColor = configFile.Bind<bool>("VelocityIndicator", "Static Color", false, "If color of icon should be static"); velocityColor = configFile.Bind<Color>("VelocityIndicator", "Color", new Color(0.49f, 1f, 0.49f, 0f), "Color rgba of icon. Static Color must be enabled for this to apply"); velocityIcon = configFile.Bind<string>("VelocityIndicator", "IconPath", "Textures/MiscIcons/texBarrelIcon", "Path to icon. Must be sprite or Texture2D.\nAddressables at: https://xiaoxiao921.github.io/GithubActionCacheTest/assetPathsDump.html filter for '.png', include full path."); speedFontSize = configFile.Bind<int>("Speed Text", "Font size", 15, "Base font size of speed text"); speedDot = configFile.Bind<float>("Speed Text", "Punch angle duration", 1f, "How long after punching should the 'angle :' portion linger"); improveCrosshair = configFile.Bind<bool>("Fixes", "Improve Crosshair", true, "Improves the grapple crosshair so that it correctly shows grapple range, work while charging fist, and not get overridden by sprinting"); fixGrappleLength = configFile.Bind<bool>("Fixes", "Fix Grapple Range", true, "Fixes grapple range getting reduced by network latency. Client-side"); if (RiskofOptions.enabled) { DoOptions(); } } private static void DoOptions() { RiskofOptions.SetSpriteDefaultIcon(); Vector2ScreenBehaviour.LoadAssets("Assets"); PunchText.punchTextHud.AddRoOVector2Option(); Grapple.grappleDurationHud.AddRoOVector2Option("Grapple"); Grapple.grappleLengthHud.AddRoOVector2Option("Grapple"); SpeedText.speedTextHud.AddRoOVector2Option(); RiskofOptions.AddOption(LRPunchHudCount); RiskofOptions.AddBool(GLLengthToggle, "Grapple", ((ConfigEntryBase)GLLengthToggle).Definition.Key); RiskofOptions.AddBool(GLEnergyToggle, "Grapple", ((ConfigEntryBase)GLEnergyToggle).Definition.Key); RiskofOptions.AddBool(GLSlamToggle, "Grapple", ((ConfigEntryBase)GLSlamToggle).Definition.Key); RiskofOptions.AddOption(velocityToggle); RiskofOptions.AddFloat(velocityScale, 0f, 1.5f); RiskofOptions.AddOption(velocityStaticColor); RiskofOptions.AddOption(velocityColor); RiskofOptions.AddOption(velocityIcon); RiskofOptions.AddOption(speedFontSize); RiskofOptions.AddFloat(speedDot, 0f, 3f); RiskofOptions.AddOption(improveCrosshair); RiskofOptions.AddOption(fixGrappleLength); } [ConCommand(/*Could not decode attribute arguments.*/)] private static void LRReloadConfig(ConCommandArgs args) { configFile.Reload(); } } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("dolso.loaderruler", "LoaderRuler", "1.1.1")] public class LRMain : BaseUnityPlugin { private void Awake() { log.start(((BaseUnityPlugin)this).Logger); LRConfig.DoConfig(((BaseUnityPlugin)this).Config); SetupElementAttribute.ScanAndExecute(); log.info("LoaderRuler finished"); } } internal class PunchText { internal class PunchTrack { internal string normal; internal bool slamedFirst; internal bool hasHit; internal void Reset(float dot) { //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) if (dot < 0f) { dot = 0f; } normal = (dot * 100f).ToString("0"); Color val = default(Color); ((Color)(ref val))..ctor(2f * (1f - dot), 2f * (dot - 0.5f), 0f); normal = Util.GenerateColoredString(normal, Color32.op_Implicit(val)); slamedFirst = false; hasHit = false; } internal PunchTrack() { normal = string.Empty; slamedFirst = false; hasHit = true; } } internal static TextHud punchTextHud; private static PunchTrack punchTrack = new PunchTrack(); private static List<string> textlist = new List<string>(); private static bool eenabled => punchTextHud.enabled; [SetupElement] private static void SetupElement() { punchTextHud.toggleEntry.SettingChanged += delegate { LoadElement(fromSetting: true); }; punchTextHud.toggleEntry.HookConfig(typeof(BaseSwingChargedFist), "OnEnter", (Delegate)new Action<Action<BaseSwingChargedFist>, BaseSwingChargedFist>(On_BaseSwingChargedFist_OnEnter_Start)); punchTextHud.toggleEntry.HookConfig(typeof(GroundSlam), "DetonateAuthority", (Delegate)new Func<Func<GroundSlam, Result>, GroundSlam, Result>(On_GroundSlam_DetonateAuthority_Failure)); LoadElement(fromSetting: false); } private static void LoadElement(bool fromSetting) { if (eenabled) { TextHud.onOnDisable += ClearTextList; BaseSwingChargedFist.onHitAuthorityGlobal += _BaseSwingChargedFist_OnMeleeHitAuthority_Hit; } else if (fromSetting) { TextHud.onOnDisable -= ClearTextList; BaseSwingChargedFist.onHitAuthorityGlobal -= _BaseSwingChargedFist_OnMeleeHitAuthority_Hit; } } private static void UpdatePunchText(string text) { int value = LRConfig.LRPunchHudCount.Value; if (textlist.Count >= value) { textlist.RemoveRange(value - 1, textlist.Count - value + 1); } textlist.Insert(0, text); string text2 = ""; foreach (string item in textlist) { text2 = text2 + "\n" + item; } punchTextHud.UpdateText(text2); } private static void On_BaseSwingChargedFist_OnEnter_Start(Action<BaseSwingChargedFist> orig, BaseSwingChargedFist self) { //IL_002a: 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_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0073: 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) if ((Object)(object)((EntityState)self).characterBody != (Object)(object)LocalUserManager.GetFirstLocalUser().cachedBody) { orig(self); return; } Vector3 normalized = ((Vector3)(ref ((EntityState)self).characterMotor.velocity)).normalized; Ray aimRay = ((BaseState)self).GetAimRay(); float dot = Vector3.Dot(normalized, ((Ray)(ref aimRay)).direction); orig(self); punchTrack.Reset(dot); SpeedText.recentNormal = punchTrack.normal; SpeedText.timestamp = TimeStamp.now + LRConfig.speedDot.Value; } private static Result On_GroundSlam_DetonateAuthority_Failure(Func<GroundSlam, Result> orig, GroundSlam self) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: 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_0014: Unknown result type (might be due to invalid IL or missing references) Result val = orig(self); if (!punchTrack.hasHit && val.hitCount > 0) { punchTrack.slamedFirst = true; } return val; } private static void _BaseSwingChargedFist_OnMeleeHitAuthority_Hit(BaseSwingChargedFist self) { //IL_0037: 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_003c: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)((EntityState)self).characterBody != (Object)(object)LocalUserManager.GetFirstLocalUser().cachedBody) && !punchTrack.hasHit) { Color val = (punchTrack.slamedFirst ? Color.gray : Color.white); int num = (punchTrack.slamedFirst ? 16 : ((int)(30.0 - 15.0 * Math.Cos(Math.Min(self.punchSpeed, 600f) * 0.005f)))); string arg = self.punchSpeed.ToString("0"); UpdatePunchText(Util.GenerateColoredString($"<size=16>{punchTrack.normal} : <size={num}>{arg}</size></size>", Color32.op_Implicit(val))); punchTrack.hasHit = true; } } private static void ClearTextList() { textlist.Clear(); } } [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] internal class SetupElementAttribute : Attribute { public static void ScanAndExecute() { Type[] types = Assembly.GetExecutingAssembly().GetTypes(); foreach (Type type in types) { MethodInfo[] methods = type.GetMethods(BindingFlags.Static | BindingFlags.NonPublic); foreach (MethodInfo methodInfo in methods) { if (methodInfo.IsDefined(typeof(SetupElementAttribute))) { try { methodInfo.Invoke(null, null); } catch (Exception ex) { log.error(type.Name + " failed to setup\r\n\r\n" + ex); } } } } } } internal class SpeedText : MonoBehaviour { internal static TextHud speedTextHud; internal static string recentNormal = ""; internal static TimeStamp timestamp = TimeStamp.negativeInfinity; private CharacterMotor motor; private Vector3 prevposition = Vector3.zero; private void OnEnable() { motor = ((Component)this).GetComponent<CharacterMotor>(); if (!Object.op_Implicit((Object)(object)motor)) { log.error("failed to get motor"); } } private void FixedUpdate() { //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0073: 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_008e: 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) if (!speedTextHud.enabled) { return; } HUD hud = TextHud.hud; if ((Object)(object)((hud != null) ? hud.targetBodyObject : null) != (Object)(object)((Component)this).gameObject) { return; } float num; if ((Object)(object)((Component)this).gameObject == (Object)(object)LocalUserManager.GetFirstLocalUser().cachedBodyObject && Object.op_Implicit((Object)(object)motor)) { num = ((Vector3)(ref motor.velocity)).magnitude; } else { Vector3 val = ((Component)this).transform.position - prevposition; num = ((Vector3)(ref val)).magnitude / Time.fixedDeltaTime; prevposition = ((Component)this).transform.position; } int num2 = (int)((double)LRConfig.speedFontSize.Value * (2.0 - Math.Cos(Math.Min(num, MathF.PI * 200f) * 0.005f))); if (recentNormal != "") { speedTextHud.UpdateText($"<size={LRConfig.speedFontSize.Value}>{recentNormal} : <size={num2}>{num:0}</size></size>"); if (((TimeStamp)(ref timestamp)).hasPassed) { recentNormal = ""; } } else { speedTextHud.UpdateText($"<size={num2}>{num:0}</size>"); } } } internal class VelocityVectorDisplay : MonoBehaviour { private static GameObject prefab; private GameObject indicator; private CharacterMotor motor; private Vector3 prevposition = Vector3.zero; private static bool eenabled { get { if (!LRConfig.velocityToggle.Value) { return SpeedText.speedTextHud.enabled; } return true; } } [SetupElement] private static void SetupElement() { LRConfig.velocityToggle.SettingChanged += delegate { LoadElement(fromSetting: true); }; SpeedText.speedTextHud.toggleEntry.SettingChanged += delegate { LoadElement(fromSetting: true); }; LoadElement(fromSetting: false); LRConfig.velocityIcon.SettingChanged += delegate { DoPrefab(); }; LRConfig.velocityScale.SettingChanged += delegate { DoPrefab(); }; } private static void LoadElement(bool fromSetting) { if (eenabled) { GameObject addressable = Utilities.GetAddressable("RoR2/Base/Loader/LoaderBody.prefab"); if (LRConfig.velocityToggle.Value) { if (!Object.op_Implicit((Object)(object)addressable.GetComponent<VelocityVectorDisplay>())) { addressable.AddComponent<VelocityVectorDisplay>(); } if (!Object.op_Implicit((Object)(object)prefab)) { DoPrefab(); } } if (SpeedText.speedTextHud.enabled && !Object.op_Implicit((Object)(object)addressable.GetComponent<SpeedText>())) { addressable.AddComponent<SpeedText>(); } } else if (fromSetting && Object.op_Implicit((Object)(object)prefab)) { Object.Destroy((Object)(object)prefab); } } internal static void DoPrefab() { //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_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Unknown result type (might be due to invalid IL or missing references) //IL_011f: 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_013b: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_0151: Unknown result type (might be due to invalid IL or missing references) //IL_015c: Expected O, but got Unknown //IL_0166: Expected O, but got Unknown //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) log.info("Loading sprite"); Sprite val = ((!LRConfig.velocityIcon.Value.Contains(".png")) ? LegacyResourcesAPI.Load<Sprite>(LRConfig.velocityIcon.Value) : Addressables.LoadAssetAsync<Sprite>((object)LRConfig.velocityIcon.Value).WaitForCompletion()); if (!Object.op_Implicit((Object)(object)val)) { Texture2D val2 = ((!LRConfig.velocityIcon.Value.Contains(".png")) ? LegacyResourcesAPI.Load<Texture2D>(LRConfig.velocityIcon.Value) : Addressables.LoadAssetAsync<Texture2D>((object)LRConfig.velocityIcon.Value).WaitForCompletion()); if (Object.op_Implicit((Object)(object)val2)) { Rect val3 = default(Rect); ((Rect)(ref val3))..ctor(0f, 0f, (float)((Texture)val2).width, (float)((Texture)val2).height); val = Sprite.Create(val2, val3, new Vector2(0.5f, 0.5f)); } } if (!Object.op_Implicit((Object)(object)val)) { Debug.LogError((object)"Failed to load sprite, using default instead"); val = LegacyResourcesAPI.Load<Sprite>("Textures/MiscIcons/texBarrelIcon"); } else { log.info("Loaded " + ((Object)val).name); } GameObject val4 = new GameObject("VelocitySprite") { layer = LayerIndex.ui.intVal }; Transform transform = val4.transform; transform.localScale *= LRConfig.velocityScale.Value / 10f; val4.AddComponent<SpriteRenderer>().sprite = val; prefab = Utilities.CreatePrefab(val4, "VelocitySprite"); Object.Destroy((Object)val4); } private void OnEnable() { //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Expected O, but got Unknown indicator = Object.Instantiate<GameObject>(prefab); if (!Object.op_Implicit((Object)(object)indicator)) { log.error("vi indicator did not instantiate"); return; } motor = ((Component)this).GetComponent<CharacterMotor>(); if (!Object.op_Implicit((Object)(object)motor)) { log.error("failed to get motor"); return; } UICamera.onUICameraPreCull += new UICameraDelegate(CamUpdate); CameraRigController.onCameraTargetChanged += CamTargetChanged; } private void OnDestroy() { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown Object.Destroy((Object)(object)indicator); UICamera.onUICameraPreCull -= new UICameraDelegate(CamUpdate); CameraRigController.onCameraTargetChanged -= CamTargetChanged; } internal void CamUpdate(UICamera uiCamera) { //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_008e: 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) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: 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_0079: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: 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_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_010e: 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_014e: Unknown result type (might be due to invalid IL or missing references) //IL_0153: Unknown result type (might be due to invalid IL or missing references) //IL_01b4: Unknown result type (might be due to invalid IL or missing references) //IL_01bc: Unknown result type (might be due to invalid IL or missing references) //IL_015f: Unknown result type (might be due to invalid IL or missing references) //IL_0163: Unknown result type (might be due to invalid IL or missing references) //IL_0198: Unknown result type (might be due to invalid IL or missing references) if (!LRConfig.velocityToggle.Value) { return; } CameraRigController cameraRigController = uiCamera.cameraRigController; if ((Object)(object)cameraRigController.target != (Object)(object)((Component)this).gameObject) { return; } Camera sceneCam = cameraRigController.sceneCam; Camera camera = uiCamera.camera; SpriteRenderer component = indicator.GetComponent<SpriteRenderer>(); float num; Vector3 normalized; if ((Object)(object)LocalUserManager.GetFirstLocalUser().cachedBodyObject == (Object)(object)((Component)this).gameObject) { num = ((Vector3)(ref motor.velocity)).magnitude; normalized = ((Vector3)(ref motor.velocity)).normalized; } else { Vector3 val = ((Component)this).transform.position - prevposition; num = ((Vector3)(ref val)).magnitude / Time.fixedDeltaTime; normalized = ((Vector3)(ref val)).normalized; prevposition = ((Component)this).transform.position; } Vector3 val2 = ((Component)cameraRigController).transform.position + normalized * 100f; Vector3 val3 = sceneCam.WorldToScreenPoint(val2); if (val3.z <= 0f) { ((Renderer)component).enabled = false; return; } val3.z = 1f; Vector3 val4 = camera.ScreenToWorldPoint(val3); InputBankTest component2 = ((Component)this).GetComponent<InputBankTest>(); if (LRConfig.velocityStaticColor.Value || !Object.op_Implicit((Object)(object)component2)) { component.color = LRConfig.velocityColor.Value + new Color(0f, 0f, 0f, num / 100f); } else { float num2 = Vector3.Dot(normalized, component2.aimDirection); component.color = new Color(2f * (1f - num2), 2f * (num2 - 0.5f), 0f, num / 100f); } ((Renderer)component).enabled = true; indicator.transform.SetPositionAndRotation(val4, ((Component)uiCamera).transform.rotation); } private void CamTargetChanged(CameraRigController camrig, GameObject target) { ((Renderer)indicator.GetComponent<SpriteRenderer>()).enabled = false; } } }