using 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.Configuration; using BepInEx.Core.Logging.Interpolation; using BepInEx.Logging; using BepInEx.Unity.IL2CPP; using Game.Data; using Game.PlayerOperations; using Game.UI; using HarmonyLib; using Il2CppInterop.Runtime; using Il2CppInterop.Runtime.InteropTypes.Arrays; using Il2CppSystem; using TMPro; using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.InputSystem.Controls; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] [assembly: AssemblyCompany("InfernoProtocol.UtilityWheel")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("0.2.2.0")] [assembly: AssemblyInformationalVersion("0.2.2+477d00f8c6e6102e4d9ad948d3169f90685e9781")] [assembly: AssemblyProduct("InfernoProtocol.UtilityWheel")] [assembly: AssemblyTitle("InfernoProtocol.UtilityWheel")] [assembly: AssemblyVersion("0.2.2.0")] namespace InfernoProtocol.UtilityWheel; internal static class PluginInfo { internal const string Guid = "com.holden.infernoprotocol.utilitywheel"; internal const string Name = "Utility Wheel"; internal const string Version = "0.2.2"; } public sealed class UtilityWheelController : MonoBehaviour { private sealed class WeaponEntry { internal int Slot; internal string Name; internal Sprite Icon; } private sealed class SlotVisual { internal Image Sector; internal Image Panel; internal Image Icon; internal Image CurrentMarker; internal RectTransform Rect; } private readonly List _weapons = new List(); private readonly List _slotVisuals = new List(); private readonly List _disabledMaps = new List(); private readonly Dictionary _sectorSprites = new Dictionary(); private CanvasGroup _canvasGroup; private RectTransform _wheelRoot; private Image _scrim; private Image _wheelBackdrop; private Image _centerPanel; private TextMeshProUGUI _nameLabel; private TextMeshProUGUI _hintLabel; private TextMeshProUGUI _titleLabel; private Sprite _circleSprite; private WheelColors _colors; private int _selectedIndex = -1; private bool _open; private bool _suppressUntilRelease; private bool _built; private float _targetAlpha; internal static bool IsActivationHeld { get; private set; } internal static bool IsCommittingSelection { get; private set; } internal static bool ActivationControlIsPressed { get { Gamepad current = Gamepad.current; bool num = current != null && ((UtilityWheelPlugin.ControllerButton.Value == ControllerWheelButton.RightShoulder) ? current.rightShoulder.isPressed : current.leftShoulder.isPressed); Keyboard current2 = Keyboard.current; if (!num) { if (UtilityWheelPlugin.KeyboardFallback.Value && current2 != null) { return ((ButtonControl)current2.tabKey).isPressed; } return false; } return true; } } private static string ButtonHint { get { if (UtilityWheelPlugin.ControllerButton.Value != ControllerWheelButton.RightShoulder) { return "LB"; } return "RB"; } } public UtilityWheelController(IntPtr pointer) : base(pointer) { } private void Update() { ReadActivation(out var held, out var pressed); IsActivationHeld = held; if (_suppressUntilRelease) { if (!held) { _suppressUntilRelease = false; } FadeOverlay(); return; } if (!UtilityWheelPlugin.Enabled.Value) { if (_open) { Close(equip: false); } FadeOverlay(); return; } if (!_open && pressed && CanOpen()) { Open(); } if (_open) { Gamepad current = Gamepad.current; if (current != null && current.buttonEast.wasPressedThisFrame) { Close(equip: false); _suppressUntilRelease = held; } else if (!held) { Close(equip: true); } else if (!CanRemainOpen()) { Close(equip: false); _suppressUntilRelease = true; } else { UpdateSelection(); } } FadeOverlay(); } private void OnDestroy() { if (_open) { RestoreInputMaps(restore: true); } foreach (Sprite[] value in _sectorSprites.Values) { for (int i = 0; i < value.Length; i++) { if ((Object)(object)value[i] != (Object)null) { Object.Destroy((Object)(object)value[i].texture); Object.Destroy((Object)(object)value[i]); } } } if ((Object)(object)_circleSprite != (Object)null) { Object.Destroy((Object)(object)_circleSprite.texture); Object.Destroy((Object)(object)_circleSprite); } IsActivationHeld = false; IsCommittingSelection = false; } private void Open() { if (!_built) { BuildOverlay(); } _colors = UtilityWheelTheme.Load(); CollectWeapons(); ApplyPalette(); BuildSlots(); _open = true; _targetAlpha = 1f; ((Component)_canvasGroup).gameObject.SetActive(true); DisableInputMaps(); UpdateSelectionText(); } private void Close(bool equip) { //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Expected O, but got Unknown if (!_open) { return; } _open = false; _targetAlpha = 0f; RestoreInputMaps(!Cursor.visible); if (!equip || _selectedIndex < 0 || _selectedIndex >= _weapons.Count) { return; } try { IsCommittingSelection = true; Player.OnInventorySlotSelected((byte)_weapons[_selectedIndex].Slot); } catch (Exception ex) { ManualLogSource modLog = UtilityWheelPlugin.ModLog; bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(33, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Could not equip wheel selection: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex.Message); } modLog.LogWarning(val); } finally { IsCommittingSelection = false; } } private static bool CanOpen() { try { return Player.isLocalPlayerLoaded && (Object)(object)Player.localPlayer != (Object)null && !Cursor.visible && !PlayerInventoryUI.isOpen && !SkillWheelManager.isOpen && !IsArtisticStudioOpen(); } catch { return false; } } private static bool CanRemainOpen() { try { return (Object)(object)Player.localPlayer != (Object)null && !Cursor.visible && !PlayerInventoryUI.isOpen && !IsArtisticStudioOpen(); } catch { return false; } } private static bool IsArtisticStudioOpen() { return (Object)(object)GameObject.Find("Artistic_InputBlocker") != (Object)null; } private static void ReadActivation(out bool held, out bool pressed) { held = false; pressed = false; Gamepad current = Gamepad.current; if (current != null) { ButtonControl val = ((UtilityWheelPlugin.ControllerButton.Value == ControllerWheelButton.RightShoulder) ? current.rightShoulder : current.leftShoulder); held = val.isPressed; pressed = val.wasPressedThisFrame; } Keyboard current2 = Keyboard.current; if (UtilityWheelPlugin.KeyboardFallback.Value && current2 != null) { held |= ((ButtonControl)current2.tabKey).isPressed; pressed |= ((ButtonControl)current2.tabKey).wasPressedThisFrame; } } private unsafe void CollectWeapons() { //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0069: 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_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) _weapons.Clear(); Player localPlayer = Player.localPlayer; if ((Object)(object)localPlayer == (Object)null || localPlayer.inventory == null) { return; } int num = localPlayer.inventory.Count; Il2CppReferenceArray inventorySlotsUI = Player.inventorySlotsUI; if (inventorySlotsUI != null && ((Il2CppArrayBase)(object)inventorySlotsUI).Length > 0) { num = Mathf.Min(num, ((Il2CppArrayBase)(object)inventorySlotsUI).Length); } for (int i = 0; i < num; i++) { ItemData val = localPlayer.inventory[i]; if (val.count == 0) { continue; } ItemDatabaseEntry itemInfo; try { itemInfo = ItemDatabase.GetItemInfo(val.item); } catch { continue; } if (itemInfo != null) { string text; try { text = ItemDatabase.GetItemName(val.item); } catch { text = ((object)(*(Items*)(&val.item))/*cast due to .constrained prefix*/).ToString(); } _weapons.Add(new WeaponEntry { Slot = i, Name = (string.IsNullOrWhiteSpace(text) ? ((object)(*(Items*)(&val.item))/*cast due to .constrained prefix*/).ToString() : text), Icon = itemInfo.icon }); } } byte currentSlot = Player.localCurrentInventorySlot; _selectedIndex = _weapons.FindIndex((WeaponEntry weapon) => weapon.Slot == currentSlot); } private void UpdateSelection() { //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) //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_003e: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_0066: 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_008c: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: 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) if (_weapons.Count == 0) { return; } Vector2 val = Vector2.zero; if (Gamepad.current != null) { val = ((InputControl)(object)Gamepad.current.rightStick).ReadValue(); } else if (Mouse.current != null) { val = ((InputControl)(object)((Pointer)Mouse.current).position).ReadValue() - new Vector2((float)Screen.width * 0.5f, (float)Screen.height * 0.5f); val /= Mathf.Max(1f, (float)Mathf.Min(Screen.width, Screen.height) * 0.35f); } if (!(((Vector2)(ref val)).magnitude < UtilityWheelPlugin.StickDeadzone.Value)) { float num = Mathf.Repeat(Mathf.Atan2(val.x, val.y) * 57.29578f, 360f); float num2 = 360f / (float)_weapons.Count; int num3 = Mathf.FloorToInt((num + num2 * 0.5f) / num2) % _weapons.Count; if (num3 != _selectedIndex) { _selectedIndex = num3; RefreshHighlights(); UpdateSelectionText(); } } } private void BuildOverlay() { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Expected O, but got Unknown //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Expected O, but got Unknown //IL_012b: 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_015f: Unknown result type (might be due to invalid IL or missing references) //IL_0179: Unknown result type (might be due to invalid IL or missing references) //IL_0189: 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_025f: Unknown result type (might be due to invalid IL or missing references) //IL_029f: Unknown result type (might be due to invalid IL or missing references) //IL_02ae: Unknown result type (might be due to invalid IL or missing references) //IL_030d: Unknown result type (might be due to invalid IL or missing references) //IL_031c: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("UtilityWheel_Canvas", (Type[])(object)new Type[4] { Il2CppType.Of(), Il2CppType.Of(), Il2CppType.Of(), Il2CppType.Of() }); val.transform.SetParent(((Component)this).transform, false); Canvas component = val.GetComponent(); component.renderMode = (RenderMode)0; component.sortingOrder = 32000; CanvasScaler component2 = val.GetComponent(); component2.uiScaleMode = (ScaleMode)1; component2.referenceResolution = new Vector2(1920f, 1080f); component2.matchWidthOrHeight = 0.5f; _canvasGroup = val.GetComponent(); _canvasGroup.alpha = 0f; _canvasGroup.interactable = false; _canvasGroup.blocksRaycasts = false; RectTransform component3 = val.GetComponent(); Stretch(component3); _scrim = CreateImage("ScreenScrim", (Transform)(object)component3, null); Stretch(((Graphic)_scrim).rectTransform); GameObject val2 = new GameObject("Wheel", (Type[])(object)new Type[1] { Il2CppType.Of() }); val2.transform.SetParent((Transform)(object)component3, false); _wheelRoot = val2.GetComponent(); _wheelRoot.anchorMin = new Vector2(0.5f, 0.5f); _wheelRoot.anchorMax = new Vector2(0.5f, 0.5f); _wheelRoot.pivot = new Vector2(0.5f, 0.5f); _wheelRoot.sizeDelta = new Vector2(620f, 620f); _wheelRoot.anchoredPosition = Vector2.zero; _circleSprite = CreateCircleSprite(); _wheelBackdrop = CreateImage("WheelBackdrop", (Transform)(object)_wheelRoot, _circleSprite); SetCenteredSize(((Graphic)_wheelBackdrop).rectTransform, 600f, 600f); _centerPanel = CreateImage("CenterPanel", (Transform)(object)_wheelRoot, _circleSprite); SetCenteredSize(((Graphic)_centerPanel).rectTransform, 220f, 220f); _titleLabel = CreateText("Title", (Transform)(object)((Graphic)_centerPanel).rectTransform, 14f, (FontStyles)1); ((TMP_Text)_titleLabel).text = "UTILITY WHEEL"; SetAnchored(((TMP_Text)_titleLabel).rectTransform, new Vector2(0f, 46f), new Vector2(190f, 26f)); _nameLabel = CreateText("WeaponName", (Transform)(object)((Graphic)_centerPanel).rectTransform, 22f, (FontStyles)1); SetAnchored(((TMP_Text)_nameLabel).rectTransform, new Vector2(0f, 6f), new Vector2(190f, 58f)); _hintLabel = CreateText("Hint", (Transform)(object)((Graphic)_centerPanel).rectTransform, 11f, (FontStyles)0); ((TMP_Text)_hintLabel).text = "RELEASE " + ButtonHint + " TO EQUIP\nB CANCEL"; SetAnchored(((TMP_Text)_hintLabel).rectTransform, new Vector2(0f, -52f), new Vector2(190f, 38f)); val.SetActive(false); _built = true; } private void BuildSlots() { //IL_017e: Unknown result type (might be due to invalid IL or missing references) //IL_018a: Unknown result type (might be due to invalid IL or missing references) //IL_01ab: Unknown result type (might be due to invalid IL or missing references) //IL_0227: Unknown result type (might be due to invalid IL or missing references) //IL_0236: Unknown result type (might be due to invalid IL or missing references) for (int i = 0; i < _slotVisuals.Count; i++) { if ((Object)(object)_slotVisuals[i].Sector != (Object)null) { Object.Destroy((Object)(object)((Component)_slotVisuals[i].Sector).gameObject); } if ((Object)(object)_slotVisuals[i].Panel != (Object)null) { Object.Destroy((Object)(object)((Component)_slotVisuals[i].Panel).gameObject); } } _slotVisuals.Clear(); if (_weapons.Count == 0) { ((TMP_Text)_nameLabel).text = "HOTBAR EMPTY"; ((TMP_Text)_hintLabel).text = "ADD AN ITEM TO YOUR HOTBAR\nB CANCEL"; return; } Sprite[] sectorSprites = GetSectorSprites(_weapons.Count); float num = 360f / (float)_weapons.Count; Vector2 position = default(Vector2); for (int j = 0; j < _weapons.Count; j++) { Image val = CreateImage("Sector_" + j, (Transform)(object)_wheelRoot, sectorSprites[j]); SetCenteredSize(((Graphic)val).rectTransform, 590f, 590f); ((Component)val).transform.SetAsFirstSibling(); float num2 = (float)j * num * ((float)Math.PI / 180f); ((Vector2)(ref position))..ctor(Mathf.Sin(num2) * 208f, Mathf.Cos(num2) * 208f); Image val2 = CreateImage("Weapon_" + j, (Transform)(object)_wheelRoot, _circleSprite); SetAnchored(((Graphic)val2).rectTransform, position, new Vector2(86f, 86f)); Outline obj = ((Component)val2).gameObject.AddComponent(); ((Shadow)obj).effectDistance = new Vector2(1.5f, -1.5f); ((Shadow)obj).useGraphicAlpha = true; Image val3 = CreateImage("Icon", (Transform)(object)((Graphic)val2).rectTransform, _weapons[j].Icon); SetCenteredSize(((Graphic)val3).rectTransform, 62f, 62f); val3.preserveAspect = true; Image val4 = CreateImage("CurrentMarker", (Transform)(object)((Graphic)val2).rectTransform, _circleSprite); SetAnchored(((Graphic)val4).rectTransform, new Vector2(0f, -36f), new Vector2(9f, 9f)); _slotVisuals.Add(new SlotVisual { Sector = val, Panel = val2, Icon = val3, CurrentMarker = val4, Rect = ((Graphic)val2).rectTransform }); } ((Component)_centerPanel).transform.SetAsLastSibling(); RefreshHighlights(); } private void ApplyPalette() { //IL_001a: 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_0040: 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_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) ((Graphic)_scrim).color = new Color(0f, 0f, 0f, 0.34f); ((Graphic)_wheelBackdrop).color = new Color(_colors.Panel.r, _colors.Panel.g, _colors.Panel.b, 0.28f); ((Graphic)_centerPanel).color = _colors.Panel; ((Graphic)_titleLabel).color = _colors.Accent; ((Graphic)_nameLabel).color = _colors.Text; ((Graphic)_hintLabel).color = _colors.Muted; } private void RefreshHighlights() { //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_0068: 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_0088: 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) //IL_00cb: 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_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_0121: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Unknown result type (might be due to invalid IL or missing references) //IL_0169: Unknown result type (might be due to invalid IL or missing references) //IL_0173: Unknown result type (might be due to invalid IL or missing references) //IL_0162: Unknown result type (might be due to invalid IL or missing references) //IL_01da: Unknown result type (might be due to invalid IL or missing references) //IL_019e: Unknown result type (might be due to invalid IL or missing references) //IL_01ae: Unknown result type (might be due to invalid IL or missing references) //IL_01be: 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) int localCurrentInventorySlot = Player.localCurrentInventorySlot; for (int i = 0; i < _slotVisuals.Count; i++) { bool flag = i == _selectedIndex; bool active = i < _weapons.Count && _weapons[i].Slot == localCurrentInventorySlot; SlotVisual slotVisual = _slotVisuals[i]; ((Graphic)slotVisual.Sector).color = (Color)(flag ? _colors.AccentSoft : new Color(_colors.PanelSoft.r, _colors.PanelSoft.g, _colors.PanelSoft.b, _colors.PanelSoft.a * 0.66f)); ((Graphic)slotVisual.Panel).color = (Color)(flag ? new Color(_colors.Accent.r, _colors.Accent.g, _colors.Accent.b, 0.42f) : _colors.PanelSoft); ((Graphic)slotVisual.Icon).color = (Color)(flag ? Color.white : new Color(1f, 1f, 1f, 0.78f)); ((Graphic)slotVisual.CurrentMarker).color = _colors.Accent; ((Component)slotVisual.CurrentMarker).gameObject.SetActive(active); ((Transform)slotVisual.Rect).localScale = (flag ? (Vector3.one * 1.16f) : Vector3.one); Outline component = ((Component)slotVisual.Panel).GetComponent(); if ((Object)(object)component != (Object)null) { ((Shadow)component).effectColor = (Color)(flag ? _colors.Accent : new Color(_colors.Muted.r, _colors.Muted.g, _colors.Muted.b, 0.45f)); } } } private void UpdateSelectionText() { if (_selectedIndex >= 0 && _selectedIndex < _weapons.Count) { ((TMP_Text)_nameLabel).text = _weapons[_selectedIndex].Name.ToUpperInvariant(); ((TMP_Text)_hintLabel).text = "RELEASE " + ButtonHint + " TO EQUIP\nB CANCEL"; } else if (_weapons.Count > 0) { ((TMP_Text)_nameLabel).text = "SELECT ITEM"; ((TMP_Text)_hintLabel).text = "RIGHT STICK TO SELECT\nB CANCEL"; } } private void DisableInputMaps() { _disabledMaps.Clear(); DisableMap(PlayerInputDispatcher.movementMap); DisableMap(PlayerInputDispatcher.inventoryMap); DisableMap(PlayerInputDispatcher.skillMap); DisableMap(PlayerInputDispatcher.drawingMap); DisableMap(PlayerInputDispatcher.placeableMap); } private void DisableMap(InputActionMap map) { if (map != null && map.enabled) { map.Disable(); _disabledMaps.Add(map); } } private void RestoreInputMaps(bool restore) { if (restore) { for (int i = 0; i < _disabledMaps.Count; i++) { InputActionMap val = _disabledMaps[i]; if (val != null) { val.Enable(); } } } _disabledMaps.Clear(); } private void FadeOverlay() { if (_built && !((Object)(object)_canvasGroup == (Object)null) && ((Component)_canvasGroup).gameObject.activeSelf) { _canvasGroup.alpha = Mathf.MoveTowards(_canvasGroup.alpha, _targetAlpha, Time.unscaledDeltaTime * 9f); if (!_open && _canvasGroup.alpha <= 0.001f) { _canvasGroup.alpha = 0f; ((Component)_canvasGroup).gameObject.SetActive(false); } } } private Sprite[] GetSectorSprites(int count) { if (_sectorSprites.TryGetValue(count, out var value)) { return value; } value = (Sprite[])(object)new Sprite[count]; for (int i = 0; i < count; i++) { value[i] = CreateSectorSprite(count, i); } _sectorSprites[count] = value; return value; } private static Sprite CreateSectorSprite(int count, int index) { //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0037: 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_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Expected O, but got Unknown //IL_01d8: Unknown result type (might be due to invalid IL or missing references) //IL_01e7: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Unknown result type (might be due to invalid IL or missing references) //IL_0104: 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) float num = 360f / (float)count; float num2 = (float)index * num; float num3 = Mathf.Max(2f, num * 0.5f - 1.25f); Texture2D val = new Texture2D(256, 256, (TextureFormat)4, false) { name = $"UtilityWheel_Sector_{count}_{index}", filterMode = (FilterMode)1, wrapMode = (TextureWrapMode)1, hideFlags = (HideFlags)61 }; Color32[] array = (Color32[])(object)new Color32[65536]; Vector2 val2 = default(Vector2); ((Vector2)(ref val2))..ctor(128f, 128f); float num4 = 126f; float num5 = num4 * 0.39f; Vector2 val3 = default(Vector2); for (int i = 0; i < 256; i++) { for (int j = 0; j < 256; j++) { ((Vector2)(ref val3))..ctor((float)j + 0.5f - val2.x, (float)i + 0.5f - val2.y); float magnitude = ((Vector2)(ref val3)).magnitude; float num6 = Mathf.Repeat(Mathf.Atan2(val3.x, val3.y) * 57.29578f, 360f); float num7 = num3 - Mathf.Abs(Mathf.DeltaAngle(num6, num2)); float num8 = Mathf.Min(num4 - magnitude, magnitude - num5); float num9 = Mathf.Clamp01(Mathf.Min(num7 * 0.85f, num8)); array[i * 256 + j] = new Color32(byte.MaxValue, byte.MaxValue, byte.MaxValue, (byte)Mathf.RoundToInt(num9 * 255f)); } } val.SetPixels32(Il2CppStructArray.op_Implicit(array)); val.Apply(false, true); return Sprite.Create(val, new Rect(0f, 0f, 256f, 256f), new Vector2(0.5f, 0.5f), 100f); } private static Sprite CreateCircleSprite() { //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_0016: 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_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Expected O, but got Unknown //IL_00fa: 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_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_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) Texture2D val = new Texture2D(64, 64, (TextureFormat)4, false) { name = "UtilityWheel_Circle", filterMode = (FilterMode)1, wrapMode = (TextureWrapMode)1, hideFlags = (HideFlags)61 }; Color32[] array = (Color32[])(object)new Color32[4096]; Vector2 val2 = default(Vector2); ((Vector2)(ref val2))..ctor(32f, 32f); float num = 31f; for (int i = 0; i < 64; i++) { for (int j = 0; j < 64; j++) { float num2 = Vector2.Distance(new Vector2((float)j + 0.5f, (float)i + 0.5f), val2); float num3 = Mathf.Clamp01(num + 0.75f - num2); array[i * 64 + j] = new Color32(byte.MaxValue, byte.MaxValue, byte.MaxValue, (byte)Mathf.RoundToInt(num3 * 255f)); } } val.SetPixels32(Il2CppStructArray.op_Implicit(array)); val.Apply(false, true); return Sprite.Create(val, new Rect(0f, 0f, 64f, 64f), new Vector2(0.5f, 0.5f), 100f); } private static Image CreateImage(string name, Transform parent, Sprite sprite) { //IL_001f: 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) GameObject val = new GameObject(name, (Type[])(object)new Type[3] { Il2CppType.Of(), Il2CppType.Of(), Il2CppType.Of() }); val.transform.SetParent(parent, false); Image component = val.GetComponent(); component.sprite = sprite; component.type = (Type)0; ((Graphic)component).raycastTarget = false; return component; } private static TextMeshProUGUI CreateText(string name, Transform parent, float size, FontStyles style) { //IL_001f: 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_003e: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject(name, (Type[])(object)new Type[3] { Il2CppType.Of(), Il2CppType.Of(), Il2CppType.Of() }); val.transform.SetParent(parent, false); TextMeshProUGUI component = val.GetComponent(); ((TMP_Text)component).fontSize = size; ((TMP_Text)component).fontStyle = style; ((TMP_Text)component).alignment = (TextAlignmentOptions)514; ((TMP_Text)component).enableWordWrapping = true; ((TMP_Text)component).overflowMode = (TextOverflowModes)1; ((Graphic)component).raycastTarget = false; ((TMP_Text)component).characterSpacing = 1.1f; return component; } private static void Stretch(RectTransform rect) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_000c: 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_0022: Unknown result type (might be due to invalid IL or missing references) rect.anchorMin = Vector2.zero; rect.anchorMax = Vector2.one; rect.offsetMin = Vector2.zero; rect.offsetMax = Vector2.zero; } private static void SetCenteredSize(RectTransform rect, float width, float height) { //IL_0001: 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) SetAnchored(rect, Vector2.zero, new Vector2(width, height)); } private static void SetAnchored(RectTransform rect, Vector2 position, Vector2 size) { //IL_000b: 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_0035: 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) //IL_0047: Unknown result type (might be due to invalid IL or missing references) rect.anchorMin = new Vector2(0.5f, 0.5f); rect.anchorMax = new Vector2(0.5f, 0.5f); rect.pivot = new Vector2(0.5f, 0.5f); rect.anchoredPosition = position; rect.sizeDelta = size; } } internal enum ControllerWheelButton { LeftShoulder, RightShoulder } [BepInPlugin("com.holden.infernoprotocol.utilitywheel", "Utility Wheel", "0.2.2")] public sealed class UtilityWheelPlugin : BasePlugin { [HarmonyPatch] private static class UtilityWheelPatches { [HarmonyPrefix] [HarmonyPatch(typeof(Player), "OnInventorySlotSelected")] private static bool BeforeNativeSlotSelection() { return !ShouldSuppressNativeSelection; } [HarmonyPrefix] [HarmonyPatch(typeof(SkillWheelManager), "OpenWheel")] private static bool BeforeSkillWheelOpen() { if (Enabled != null && Enabled.Value) { return !UtilityWheelController.ActivationControlIsPressed; } return true; } } private static UtilityWheelController _controller; private Harmony _harmony; internal static ManualLogSource ModLog { get; private set; } internal static ConfigEntry Enabled { get; private set; } internal static ConfigEntry ControllerButton { get; private set; } internal static ConfigEntry KeyboardFallback { get; private set; } internal static ConfigEntry MatchBetterUI { get; private set; } internal static ConfigEntry FallbackPalette { get; private set; } internal static ConfigEntry Opacity { get; private set; } internal static ConfigEntry StickDeadzone { get; private set; } internal static bool ShouldSuppressNativeSelection { get { if (Enabled != null && Enabled.Value && UtilityWheelController.ActivationControlIsPressed) { return !UtilityWheelController.IsCommittingSelection; } return false; } } public override void Load() { //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Expected O, but got Unknown //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Expected O, but got Unknown //IL_0127: Unknown result type (might be due to invalid IL or missing references) //IL_0131: Expected O, but got Unknown //IL_0147: Unknown result type (might be due to invalid IL or missing references) //IL_0151: Expected O, but got Unknown //IL_0171: Unknown result type (might be due to invalid IL or missing references) //IL_0177: Expected O, but got Unknown ModLog = ((BasePlugin)this).Log; Enabled = ((BasePlugin)this).Config.Bind("General", "Enabled", true, "Enables the controller utility wheel."); ControllerButton = ((BasePlugin)this).Config.Bind("Input", "ControllerButton", ControllerWheelButton.LeftShoulder, "Button held to open the wheel: LeftShoulder or RightShoulder."); KeyboardFallback = ((BasePlugin)this).Config.Bind("Input", "KeyboardTabFallback", true, "Also allows holding Tab to open the wheel for testing or keyboard play."); MatchBetterUI = ((BasePlugin)this).Config.Bind("Appearance", "MatchBetterUIPalette", true, "Reads BetterUI's remembered crafting color when BetterUI is installed."); FallbackPalette = ((BasePlugin)this).Config.Bind("Appearance", "FallbackPalette", 0, new ConfigDescription("Palette used without BetterUI: 0 green, 1 blue, 2 cyan, 3 violet, 4 amber.", (AcceptableValueBase)(object)new AcceptableValueRange(0, 4), Array.Empty())); Opacity = ((BasePlugin)this).Config.Bind("Appearance", "WheelOpacity", 0.72f, new ConfigDescription("Opacity of the radial panels.", (AcceptableValueBase)(object)new AcceptableValueRange(0.35f, 0.95f), Array.Empty())); StickDeadzone = ((BasePlugin)this).Config.Bind("Input", "StickDeadzone", 0.32f, new ConfigDescription("Right-stick distance required to change selection.", (AcceptableValueBase)(object)new AcceptableValueRange(0.15f, 0.75f), Array.Empty())); _controller = ((BasePlugin)this).AddComponent(); _harmony = new Harmony("com.holden.infernoprotocol.utilitywheel"); _harmony.PatchAll(typeof(UtilityWheelPatches)); ManualLogSource log = ((BasePlugin)this).Log; bool flag = default(bool); BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(27, 3, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("Utility Wheel"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("0.2.2"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" loaded. Hold "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ControllerButton.Value); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" to open it."); } log.LogInfo(val); } public override bool Unload() { Harmony harmony = _harmony; if (harmony != null) { harmony.UnpatchSelf(); } _harmony = null; if ((Object)(object)_controller != (Object)null) { Object.Destroy((Object)(object)_controller); _controller = null; } return true; } } internal readonly struct WheelColors { internal Color Accent { get; } internal Color AccentSoft { get; } internal Color Panel { get; } internal Color PanelSoft { get; } internal Color Text { get; } internal Color Muted { get; } internal WheelColors(Color accent, Color accentSoft, Color panel, Color panelSoft, Color text, Color muted) { //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) //IL_000f: 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_0016: 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_001e: 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_0026: 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) Accent = accent; AccentSoft = accentSoft; Panel = panel; PanelSoft = panelSoft; Text = text; Muted = muted; } } internal static class UtilityWheelTheme { internal static WheelColors Load() { //IL_008c: 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_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: 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_00e0: Unknown result type (might be due to invalid IL or missing references) int num = Mathf.Clamp(UtilityWheelPlugin.FallbackPalette.Value, 0, 4); if (UtilityWheelPlugin.MatchBetterUI.Value) { num = ReadBetterUIPalette(num); } float shift = num switch { 1 => 0.25f, 2 => 0.13f, 3 => 0.43f, 4 => -0.23f, _ => 0f, }; float num2 = Mathf.Clamp(UtilityWheelPlugin.Opacity.Value, 0.35f, 0.95f); return new WheelColors(ShiftedHex("6DFF83", 1f, shift), ShiftedHex("6DFF83", Mathf.Min(0.52f, num2), shift), ShiftedHex("020805", num2 * 0.78f, shift), ShiftedHex("0C2113", num2, shift), ShiftedHex("D9FFD7", 1f, shift), ShiftedHex("8FBC91", 1f, shift)); } private static int ReadBetterUIPalette(int fallback) { //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Expected O, but got Unknown try { string path = Path.Combine(Paths.ConfigPath, "com.holden.infernoprotocol.betterui.cfg"); if (!File.Exists(path)) { return fallback; } string[] array = File.ReadAllLines(path); for (int i = 0; i < array.Length; i++) { string text = array[i].Trim(); if (text.StartsWith("ColorPalette", StringComparison.OrdinalIgnoreCase)) { int num = text.IndexOf('='); if (num >= 0 && int.TryParse(text.Substring(num + 1).Trim(), out var result)) { return Mathf.Clamp(result, 0, 4); } } } } catch (Exception ex) { ManualLogSource modLog = UtilityWheelPlugin.ModLog; bool flag = default(bool); BepInExDebugLogInterpolatedStringHandler val = new BepInExDebugLogInterpolatedStringHandler(33, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Could not read BetterUI palette: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex.Message); } modLog.LogDebug(val); } return fallback; } private static Color ShiftedHex(string hex, float alpha, float shift) { //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_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0037: 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_0015: Unknown result type (might be due to invalid IL or missing references) Color val = Hex(hex, alpha); if (Mathf.Abs(shift) < 0.001f) { return val; } float num = default(float); float num2 = default(float); float num3 = default(float); Color.RGBToHSV(val, ref num, ref num2, ref num3); Color result = Color.HSVToRGB(Mathf.Repeat(num + shift, 1f), num2, num3); result.a = alpha; return result; } private static Color Hex(string value, float alpha) { //IL_0022: 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) Color white = default(Color); if (!ColorUtility.TryParseHtmlString("#" + value, ref white)) { white = Color.white; } white.a = alpha; return white; } }