using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Text; using BepInEx; using BepInEx.Logging; using Microsoft.CodeAnalysis; using Newtonsoft.Json; using On.RoR2; using On.RoR2.UI; using RoR2; using RoR2.UI; using RoR2ItemInfo.hud; using TMPro; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.Events; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("TooManyItems")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+0f0df431e3545b1424bdef3709dbdafb224afe8d")] [assembly: AssemblyProduct("TooManyItems")] [assembly: AssemblyTitle("TooManyItems")] [assembly: AssemblyVersion("1.0.0.0")] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } } namespace RoR2ItemInfo { public class StatEntry { [JsonProperty("stat")] public string Stat = null; [JsonProperty("value")] public string Value = null; [JsonProperty("stack")] public string Stack = null; [JsonProperty("add")] public string Add = null; } public class ItemData { [JsonProperty("name")] public string Name = null; [JsonProperty("item_id")] public string ItemId = null; [JsonProperty("rarity")] public string Rarity = null; [JsonProperty("category")] public string Category = null; [JsonProperty("caption")] public string Caption = null; [JsonProperty("description")] public string Description = null; [JsonProperty("token")] public string Token = null; [JsonProperty("desc_token")] public string DescToken = null; [JsonProperty("stats")] public List Stats = null; } public static class ItemDatabase { public static Dictionary ById = new Dictionary(); public static Dictionary ByToken = new Dictionary(); public static Dictionary ByName = new Dictionary(); public static void Load() { Assembly executingAssembly = Assembly.GetExecutingAssembly(); using Stream stream = executingAssembly.GetManifestResourceStream("TooManyItems.ror2_items.json"); using StreamReader streamReader = new StreamReader(stream); List list = JsonConvert.DeserializeObject>(streamReader.ReadToEnd()); if (list == null) { return; } foreach (ItemData item in list) { if (!string.IsNullOrEmpty(item.ItemId)) { ById[item.ItemId] = item; } if (!string.IsNullOrEmpty(item.Token)) { ByToken[item.Token] = item; } if (!string.IsNullOrEmpty(item.Name)) { ByName[item.Name] = item; } } Plugin.Log.LogInfo((object)$"ItemDatabase: loaded {ById.Count} items."); } } [BepInPlugin("me.garnet14.tooManyItems", "Too Many Items", "1.0.0")] public class Plugin : BaseUnityPlugin { public static ManualLogSource Log; private static BaseHUD? _overworldHUD; private static BaseHUD? _commandHUD; private void Awake() { Log = ((BaseUnityPlugin)this).Logger; ItemDatabase.Load(); _overworldHUD = new OverworldHUD(); _overworldHUD.Init(); _commandHUD = new ArtifactOfCommandHUD(); _commandHUD.Init(); Log.LogInfo((object)"RoR2 Item Info loaded!"); } } } namespace RoR2ItemInfo.hud { public class ArtifactOfCommandHUD : BaseHUD { protected override string GetPanelName() { return "ArtifactOfCommandInfoPanel"; } protected override float GetDefaultWidth() { return 400f; } public override void Init() { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Expected O, but got Unknown base.Init(); PickupPickerPanel.OnCreateButton += new hook_OnCreateButton(OnPickupPickerCreateButton); } private void OnPickupPickerCreateButton(orig_OnCreateButton orig, PickupPickerPanel self, int index, MPButton button) { //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: 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_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Expected O, but got Unknown //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Expected O, but got Unknown orig.Invoke(self, index, button); try { FieldInfo field = typeof(PickupPickerPanel).GetField("pickupOptions", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field == null || !(field.GetValue(self) is Option[] array) || index >= array.Length) { return; } PickupDef pickupDef = PickupCatalog.GetPickupDef(((Option)(ref array[index])).pickupIndex); if (pickupDef == null) { return; } ItemData data = ResolveFromPickupDef(pickupDef); if (data != null) { EnsurePanelOnTop(self); EventTrigger val = ((Component)button).gameObject.GetComponent() ?? ((Component)button).gameObject.AddComponent(); Entry val2 = new Entry { eventID = (EventTriggerType)0 }; ((UnityEvent)(object)val2.callback).AddListener((UnityAction)delegate { ShowPanel(getInfoText(data)); }); val.triggers.Add(val2); Entry val3 = new Entry { eventID = (EventTriggerType)1 }; ((UnityEvent)(object)val3.callback).AddListener((UnityAction)delegate { HidePanel(); }); val.triggers.Add(val3); } } catch (Exception arg) { Plugin.Log.LogError((object)$"ArtifactOfCommandHUD error: {arg}"); } } private void EnsurePanelOnTop(PickupPickerPanel pickerPanel) { //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_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)_panel == (Object)null)) { Canvas componentInParent = ((Component)pickerPanel).GetComponentInParent(); if ((Object)(object)componentInParent != (Object)null && (Object)(object)_panel.transform.parent != (Object)(object)((Component)componentInParent).transform) { _panel.transform.SetParent(((Component)componentInParent).transform, false); RectTransform component = _panel.GetComponent(); component.anchorMin = new Vector2(0f, 0.5f); component.anchorMax = new Vector2(0f, 0.5f); component.pivot = new Vector2(0f, 0.5f); component.anchoredPosition = new Vector2(350f, 0f); } } } private static ItemData? ResolveFromPickupDef(PickupDef pickupDef) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Invalid comparison between Unknown and I4 //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Invalid comparison between Unknown and I4 //IL_0014: 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) string text = null; if ((int)pickupDef.itemIndex != -1) { text = ItemCatalog.GetItemDef(pickupDef.itemIndex)?.nameToken; } else if ((int)pickupDef.equipmentIndex != -1) { text = EquipmentCatalog.GetEquipmentDef(pickupDef.equipmentIndex)?.nameToken; } if (text != null && ItemDatabase.ByToken.TryGetValue(text, out ItemData value)) { return value; } return null; } } public abstract class BaseHUD { protected GameObject? _panel; protected HGTextMeshProUGUI? _panelText; protected HUD? _hud; protected virtual float GetDefaultWidth() { return 360f; } public virtual void Init() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown HUD.Awake += new hook_Awake(OnHUDAwake); } private void OnHUDAwake(orig_Awake orig, HUD self) { orig.Invoke(self); _hud = self; CreatePanel(); } protected virtual void OnHUDUpdate(orig_Update orig, HUD self) { orig.Invoke(self); if ((Object)(object)_panel != (Object)null && !Object.op_Implicit((Object)(object)_panel)) { _panel = null; _panelText = null; } } protected virtual void CreatePanel(float posX = 8f, float posY = 0f, float width = 360f, float height = 200f) { if (!((Object)(object)_hud == (Object)null)) { Transform val = ((Component)_hud).transform.Find("MainContainer/MainUIArea/SpringCanvas/UpperLeftCluster"); if (!((Object)(object)val == (Object)null)) { _panel = Object.Instantiate(((Component)val).gameObject, val.parent); ((Object)_panel).name = GetPanelName(); CleanupPanel(); SetupPositionAndSize(posX, posY, width, height); SetupText(); _panel.SetActive(false); } } } protected abstract string GetPanelName(); protected virtual void CleanupPanel() { //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Expected O, but got Unknown //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_0132: 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_014d: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_panel == (Object)null) { return; } List list = new List(); foreach (Transform item in _panel.transform) { Transform val = item; list.Add(((Component)val).gameObject); } foreach (GameObject item2 in list) { Object.DestroyImmediate((Object)(object)item2); } VerticalLayoutGroup component = _panel.GetComponent(); if ((Object)(object)component != (Object)null) { Object.DestroyImmediate((Object)(object)component); } ContentSizeFitter component2 = _panel.GetComponent(); if ((Object)(object)component2 != (Object)null) { Object.DestroyImmediate((Object)(object)component2); } Canvas component3 = _panel.GetComponent(); if ((Object)(object)component3 != (Object)null) { Object.DestroyImmediate((Object)(object)component3); } Image component4 = _panel.GetComponent(); if ((Object)(object)component4 != (Object)null) { ((Graphic)component4).color = new Color(((Graphic)component4).color.r, ((Graphic)component4).color.g, ((Graphic)component4).color.b, 0.75f); } } protected virtual void SetupPositionAndSize(float posX, float posY, float width, float height) { //IL_002a: 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_0056: 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) if (!((Object)(object)_panel == (Object)null)) { RectTransform component = _panel.GetComponent(); component.anchorMin = new Vector2(0f, 0.5f); component.anchorMax = new Vector2(0f, 0.5f); component.pivot = new Vector2(0f, 0.5f); component.anchoredPosition = new Vector2(posX, posY); component.sizeDelta = new Vector2(width, height); } } protected virtual void SetupText() { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Expected O, but got Unknown //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0074: 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_00c5: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)_panel == (Object)null) && !((Object)(object)_hud == (Object)null)) { GameObject val = new GameObject("PanelText"); val.transform.SetParent(_panel.transform, false); RectTransform val2 = val.AddComponent(); val2.anchorMin = Vector2.zero; val2.anchorMax = Vector2.one; val2.offsetMin = new Vector2(12f, 12f); val2.offsetMax = new Vector2(-12f, -12f); _panelText = val.AddComponent(); ((TMP_Text)_panelText).fontSize = 14f; ((TMP_Text)_panelText).enableWordWrapping = true; ((Graphic)_panelText).color = Color.white; HGTextMeshProUGUI componentInChildren = ((Component)_hud).GetComponentInChildren(); if ((Object)(object)componentInChildren != (Object)null) { ((TMP_Text)_panelText).font = ((TMP_Text)componentInChildren).font; } } } protected virtual string getInfoText(ItemData data) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append(" " + data.Name + ""); stringBuilder.Append("\n" + data.Description + ""); if (data.Stats != null && data.Stats.Count > 0) { stringBuilder.Append("\n\n Stats"); foreach (StatEntry stat in data.Stats) { stringBuilder.Append("\n" + stat.Stat + ": " + stat.Value); if (!string.IsNullOrEmpty(stat.Add)) { stringBuilder.Append(" (" + stat.Add + " per stack)"); } } } return stringBuilder.ToString(); } public virtual void ShowPanel(string content) { //IL_0072: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)_panel == (Object)null) && !((Object)(object)_panelText == (Object)null)) { _panel.SetActive(true); ((TMP_Text)_panelText).text = content; ((TMP_Text)_panelText).ForceMeshUpdate(false, false); float num = ((TMP_Text)_panelText).preferredHeight + 24f; RectTransform component = _panel.GetComponent(); component.sizeDelta = new Vector2(GetDefaultWidth(), num); LayoutRebuilder.ForceRebuildLayoutImmediate(component); } } public virtual void HidePanel() { if ((Object)(object)_panel != (Object)null && _panel.activeSelf) { _panel.SetActive(false); } } } public class OverworldHUD : BaseHUD { private string? _lastItemId; private GameObject? _currentTarget; public override void Init() { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Expected O, but got Unknown //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Expected O, but got Unknown base.Init(); Interactor.FindBestInteractableObject += new hook_FindBestInteractableObject(OnFindBestInteractableObject); HUD.Update += new hook_Update(OnHUDUpdate); } protected override string GetPanelName() { return "OverworldItemInfoPanel"; } protected override void OnHUDUpdate(orig_Update orig, HUD self) { base.OnHUDUpdate(orig, self); if ((Object)(object)_currentTarget == (Object)null) { HidePanel(); } _currentTarget = null; } private GameObject? OnFindBestInteractableObject(orig_FindBestInteractableObject orig, Interactor self, Ray raycastRay, float maxRaycastDistance, Vector3 overlapPosition, float overlapRadius) { //IL_0003: 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) GameObject val = orig.Invoke(self, raycastRay, maxRaycastDistance * 2f, overlapPosition, overlapRadius); try { if ((Object)(object)val == (Object)null) { return val; } ItemData itemDataFromTarget = GetItemDataFromTarget(val); if (itemDataFromTarget == null) { HidePanel(); return val; } _currentTarget = val; if (_lastItemId == itemDataFromTarget.ItemId && (Object)(object)_panel != (Object)null) { _panel.SetActive(true); return val; } _lastItemId = itemDataFromTarget.ItemId; ShowPanel(getInfoText(itemDataFromTarget)); } catch (Exception arg) { Plugin.Log.LogError((object)$"OverworldHUD error: {arg}"); } return val; } private static ItemData? GetItemDataFromTarget(GameObject target) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) GenericPickupController component = target.GetComponent(); if ((Object)(object)component != (Object)null) { PickupDef pickupDef = PickupCatalog.GetPickupDef(component.pickupIndex); if (pickupDef != null) { return ResolveFromPickupDef(pickupDef); } } ShopTerminalBehavior component2 = target.GetComponent(); if ((Object)(object)component2 != (Object)null) { PickupDef pickupDef2 = PickupCatalog.GetPickupDef(component2.CurrentPickupIndex()); if (pickupDef2 != null) { return ResolveFromPickupDef(pickupDef2); } } return null; } private static ItemData? ResolveFromPickupDef(PickupDef pickupDef) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Invalid comparison between Unknown and I4 //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Invalid comparison between Unknown and I4 //IL_0014: 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) string text = null; if ((int)pickupDef.itemIndex != -1) { text = ItemCatalog.GetItemDef(pickupDef.itemIndex)?.nameToken; } else if ((int)pickupDef.equipmentIndex != -1) { text = EquipmentCatalog.GetEquipmentDef(pickupDef.equipmentIndex)?.nameToken; } if (text != null && ItemDatabase.ByToken.TryGetValue(text, out ItemData value)) { return value; } return null; } } }