using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Text; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using Microsoft.CodeAnalysis; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Peak; using TMPro; using UnityEngine; using UnityEngine.UI; using UnityEngine.UI.ProceduralImage; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyVersion("0.0.0.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace PeakItemTooltip { public class ItemInfo { [JsonProperty("type")] [JsonConverter(typeof(StringOrStringArrayConverter))] public List Types = new List(); [JsonProperty("description")] public string Description = ""; } public class StringOrStringArrayConverter : JsonConverter { public override bool CanConvert(Type objectType) { return objectType == typeof(List); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Invalid comparison between Unknown and I4 //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Invalid comparison between Unknown and I4 List list = new List(); if ((int)reader.TokenType == 11) { return list; } if ((int)reader.TokenType == 2) { foreach (JToken item in JArray.Load(reader)) { string text = ((object)item)?.ToString(); if (!string.IsNullOrEmpty(text)) { list.Add(text); } } } else { string text2 = reader.Value?.ToString(); if (!string.IsNullOrEmpty(text2)) { list.Add(text2); } } return list; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { List list = value as List; if (list != null && list.Count == 1) { writer.WriteValue(list[0]); return; } writer.WriteStartArray(); if (list != null) { foreach (string item in list) { writer.WriteValue(item); } } writer.WriteEndArray(); } } public class DescriptionFile { [JsonProperty("types")] public Dictionary Types = new Dictionary(); [JsonProperty("items")] public Dictionary Items = new Dictionary(); } public class Descriptions { public const string FileName = "peak-item-tooltip.descriptions.json"; private readonly string _path; private Dictionary _items = new Dictionary(StringComparer.OrdinalIgnoreCase); private Dictionary _types = new Dictionary(StringComparer.OrdinalIgnoreCase); private Dictionary _typeColours = new Dictionary(StringComparer.OrdinalIgnoreCase); private DateTime _lastWriteUtc; private const string DefaultFileContents = "{\n \"types\": {\n },\n \"items\": {\n \"EXAMPLE_KEY\": {\n \"type\": \"\",\n \"description\": \"\"\n }\n }\n }\n "; public string Path_ => _path; public Descriptions() { _path = Path.Combine(Paths.ConfigPath, "peak-item-tooltip.descriptions.json"); } public void Initialize() { try { if (!File.Exists(_path)) { string contents = LoadEmbeddedDefault() ?? "{\n \"types\": {\n },\n \"items\": {\n \"EXAMPLE_KEY\": {\n \"type\": \"\",\n \"description\": \"\"\n }\n }\n }\n "; File.WriteAllText(_path, contents); Plugin.Log.LogInfo((object)("Created description file at " + _path)); } } catch (Exception ex) { Plugin.Log.LogWarning((object)("Could not create description file: " + ex.Message)); } Load(); } public void MaybeReload() { try { if (File.Exists(_path) && File.GetLastWriteTimeUtc(_path) != _lastWriteUtc) { Load(); } } catch (Exception ex) { Plugin.Log.LogWarning((object)("Description reload check failed: " + ex.Message)); } } public bool TryGet(string key, out ItemInfo info) { if (!string.IsNullOrEmpty(key)) { return _items.TryGetValue(key, out info); } info = null; return false; } public bool TryGetTypeColour(string typeName, out Color colour) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) if (!string.IsNullOrEmpty(typeName)) { return _typeColours.TryGetValue(typeName, out colour); } colour = default(Color); return false; } private void Load() { //IL_00f4: Unknown result type (might be due to invalid IL or missing references) try { DescriptionFile descriptionFile = JsonConvert.DeserializeObject(File.ReadAllText(_path)) ?? new DescriptionFile(); Dictionary dictionary = new Dictionary(StringComparer.OrdinalIgnoreCase); if (descriptionFile.Items != null) { foreach (KeyValuePair item in descriptionFile.Items) { if (item.Value != null) { dictionary[item.Key] = item.Value; } } } Dictionary dictionary2 = new Dictionary(StringComparer.OrdinalIgnoreCase); Dictionary dictionary3 = new Dictionary(StringComparer.OrdinalIgnoreCase); if (descriptionFile.Types != null) { Color value = default(Color); foreach (KeyValuePair type in descriptionFile.Types) { if (!string.IsNullOrEmpty(type.Key) && type.Value != null) { dictionary2[type.Key] = type.Value; if (ColorUtility.TryParseHtmlString(type.Value, ref value)) { dictionary3[type.Key] = value; } } } } _items = dictionary; _types = dictionary2; _typeColours = dictionary3; _lastWriteUtc = File.GetLastWriteTimeUtc(_path); Plugin.Log.LogInfo((object)string.Format("Loaded {0} item description(s) and {1} type(s) from {2}", _items.Count, _types.Count, "peak-item-tooltip.descriptions.json")); } catch (Exception ex) { Plugin.Log.LogWarning((object)("Failed to parse peak-item-tooltip.descriptions.json: " + ex.Message + " (keeping previous data)")); } } private static string LoadEmbeddedDefault() { try { Assembly assembly = typeof(Descriptions).Assembly; string text = assembly.GetManifestResourceNames().FirstOrDefault((string n) => n.EndsWith("default-descriptions.json", StringComparison.OrdinalIgnoreCase)); if (text == null) { return null; } using Stream stream = assembly.GetManifestResourceStream(text); using StreamReader streamReader = new StreamReader(stream); return streamReader.ReadToEnd(); } catch (Exception ex) { Plugin.Log.LogWarning((object)("Could not read embedded default descriptions: " + ex.Message)); return null; } } } public static class ItemModifiers { private static readonly Dictionary Colours = new Dictionary { { (STATUSTYPE)0, Hex("#E4463B") }, { (STATUSTYPE)1, Hex("#F2C43D") }, { (STATUSTYPE)2, Hex("#4FA3FF") }, { (STATUSTYPE)3, Hex("#A65AD8") }, { (STATUSTYPE)4, Hex("#FF7043") }, { (STATUSTYPE)5, Hex("#B5179E") }, { (STATUSTYPE)6, Hex("#5AD1C4") }, { (STATUSTYPE)7, Hex("#B0A08A") }, { (STATUSTYPE)8, Hex("#FF8C1A") }, { (STATUSTYPE)9, Hex("#6FBF4B") }, { (STATUSTYPE)10, Hex("#9CCC65") }, { (STATUSTYPE)11, Hex("#D0D0D0") }, { (STATUSTYPE)12, Hex("#C9A66B") }, { (STATUSTYPE)13, Hex("#9E9E9E") }, { (STATUSTYPE)14, Hex("#4CAF50") } }; private static readonly Color StaminaColour = Hex("#7CD64B"); private static readonly Color Fallback = Color.white; public static string Format(Item item) { //IL_0036: 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_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_0116: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)item == (Object)null) { return ""; } StringBuilder stringBuilder = new StringBuilder(); bool first = true; Action_RestoreHunger[] componentsInChildren = ((Component)item).GetComponentsInChildren(true); foreach (Action_RestoreHunger val in componentsInChildren) { if (!((Object)(object)val == (Object)null)) { AppendLine(stringBuilder, ref first, ColourFor((STATUSTYPE)1), 0f - val.restorationAmount, "Hunger"); } } Action_InflictPoison[] componentsInChildren2 = ((Component)item).GetComponentsInChildren(true); foreach (Action_InflictPoison val2 in componentsInChildren2) { if (!((Object)(object)val2 == (Object)null)) { AppendLine(stringBuilder, ref first, ColourFor((STATUSTYPE)3), val2.poisonPerSecond * val2.inflictionTime, "Poison"); } } Action_ModifyStatus[] componentsInChildren3 = ((Component)item).GetComponentsInChildren(true); foreach (Action_ModifyStatus val3 in componentsInChildren3) { if (!((Object)(object)val3 == (Object)null)) { AppendLine(stringBuilder, ref first, ColourFor(val3.statusType), val3.changeAmount, ((object)Unsafe.As(ref val3.statusType)/*cast due to .constrained prefix*/).ToString()); } } Action_GiveExtraStamina[] componentsInChildren4 = ((Component)item).GetComponentsInChildren(true); foreach (Action_GiveExtraStamina val4 in componentsInChildren4) { if (!((Object)(object)val4 == (Object)null)) { AppendLine(stringBuilder, ref first, StaminaColour, val4.amount, "Extra Stamina"); } } AppendPetrify(stringBuilder, ref first, item); return stringBuilder.ToString(); } private static void AppendPetrify(StringBuilder sb, ref bool first, Item item) { //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_012f: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Unknown result type (might be due to invalid IL or missing references) Color colour = ColourFor((STATUSTYPE)13); MonoBehaviour[] componentsInChildren = ((Component)item).GetComponentsInChildren(true); foreach (MonoBehaviour val in componentsInChildren) { if ((Object)(object)val == (Object)null) { continue; } FieldInfo[] fields = ((object)val).GetType().GetFields(BindingFlags.Instance | BindingFlags.Public); foreach (FieldInfo fieldInfo in fields) { if (!fieldInfo.Name.StartsWith("petrify", StringComparison.OrdinalIgnoreCase)) { continue; } int signedPoints; if (fieldInfo.FieldType == typeof(int)) { signedPoints = (int)fieldInfo.GetValue(val); } else { if (!(fieldInfo.FieldType == typeof(float))) { continue; } signedPoints = Mathf.RoundToInt((float)fieldInfo.GetValue(val) * 100f); } AppendPoints(sb, ref first, colour, signedPoints, PetrifyLabel(fieldInfo.Name)); } } Action_HealingGem[] componentsInChildren2 = ((Component)item).GetComponentsInChildren(true); foreach (Action_HealingGem val2 in componentsInChildren2) { if (!((Object)(object)val2 == (Object)null)) { int lowPoints = Mathf.RoundToInt(val2.minPetrify * 100f); int highPoints = Mathf.RoundToInt(val2.maxPetrify * 100f); AppendPointsRange(sb, ref first, colour, lowPoints, highPoints, "Petrify"); } } } private static string PetrifyLabel(string fieldName) { string text = ((fieldName.Length > "petrify".Length) ? fieldName.Substring("petrify".Length) : ""); if (string.IsNullOrEmpty(text)) { return "Petrify"; } StringBuilder stringBuilder = new StringBuilder(); string text2 = text; foreach (char c in text2) { if (char.IsUpper(c) && stringBuilder.Length > 0) { stringBuilder.Append(' '); } stringBuilder.Append(char.ToLowerInvariant(c)); } return "Petrify (" + stringBuilder?.ToString() + ")"; } private static void AppendLine(StringBuilder sb, ref bool first, Color colour, float signedFraction, string label) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) AppendPoints(sb, ref first, colour, Mathf.RoundToInt(signedFraction * 100f), label); } private static void AppendPoints(StringBuilder sb, ref bool first, Color colour, int signedPoints, string label) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) if (signedPoints != 0) { string value = ((signedPoints > 0) ? "+" : "-"); string value2 = ColorUtility.ToHtmlStringRGB(colour); if (!first) { sb.Append('\n'); } first = false; sb.Append("') .Append(value) .Append(Mathf.Abs(signedPoints)) .Append(' ') .Append(label) .Append(""); } } private static void AppendPointsRange(StringBuilder sb, ref bool first, Color colour, int lowPoints, int highPoints, string label) { //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) if (lowPoints == highPoints) { AppendPoints(sb, ref first, colour, highPoints, label); } else if (highPoints != 0) { string value = ColorUtility.ToHtmlStringRGB(colour); if (!first) { sb.Append('\n'); } first = false; sb.Append("') .Append('+') .Append(lowPoints) .Append('–') .Append(highPoints) .Append(' ') .Append(label) .Append(""); } } private static Color ColourFor(STATUSTYPE type) { //IL_0005: 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_000f: Unknown result type (might be due to invalid IL or missing references) if (!Colours.TryGetValue(type, out var value)) { return Fallback; } return value; } private static Color Hex(string s) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) Color result = default(Color); ColorUtility.TryParseHtmlString(s, ref result); return result; } } public class PluginConfig { public readonly ConfigEntry Enabled; public readonly ConfigEntry HotReload; public readonly ConfigEntry ShowWhileHolding; public readonly ConfigEntry OffsetX; public readonly ConfigEntry OffsetY; public readonly ConfigEntry Scale; public readonly ConfigEntry Width; public readonly ConfigEntry BackgroundOpacity; public readonly ConfigEntry ShowIcon; public readonly ConfigEntry ShowName; public readonly ConfigEntry ShowType; public readonly ConfigEntry ShowDescription; public readonly ConfigEntry ShowModifiers; public readonly ConfigEntry IconSize; public readonly ConfigEntry NameFontSize; public readonly ConfigEntry TypeFontSize; public readonly ConfigEntry DescriptionFontSize; public readonly ConfigEntry ModifierFontSize; public PluginConfig(ConfigFile cfg) { //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Expected O, but got Unknown //IL_011d: Unknown result type (might be due to invalid IL or missing references) //IL_0127: Expected O, but got Unknown Enabled = cfg.Bind("Widget", "Enabled", true, "Master toggle for the hover info widget."); HotReload = cfg.Bind("Advanced", "HotReload", true, "Watch the config and descriptions files for changes and apply them live without restarting the game. Handy while tuning; safe to disable if you never edit these files mid-session. Note: turning this back ON requires a game restart to take effect (while off, nothing is watching the file)."); ShowWhileHolding = cfg.Bind("Widget", "ShowWhileHolding", true, "Also show the tooltip for the item you are holding. If off, it only appears when hovering."); OffsetX = cfg.Bind("Widget", "OffsetX", -710f, "Horizontal offset from the screen center; positive = right (1920x1080 reference pixels)."); OffsetY = cfg.Bind("Widget", "OffsetY", -220f, "Vertical offset from the screen center; positive = up (1920x1080 reference pixels)."); Scale = cfg.Bind("Widget", "Scale", 1.15f, new ConfigDescription("Overall scale multiplier.", (AcceptableValueBase)(object)new AcceptableValueRange(0.1f, 5f), Array.Empty())); Width = cfg.Bind("Widget", "Width", 320f, "Widget width in reference pixels; the description wraps to this width."); BackgroundOpacity = cfg.Bind("Widget", "BackgroundOpacity", 0.75f, new ConfigDescription("Background panel opacity.", (AcceptableValueBase)(object)new AcceptableValueRange(0f, 1f), Array.Empty())); ShowIcon = cfg.Bind("Fields", "ShowIcon", true, "Show the item icon."); ShowName = cfg.Bind("Fields", "ShowName", true, "Show the item name."); ShowType = cfg.Bind("Fields", "ShowType", true, "Show the item type (e.g. Mystical, Consumable)."); ShowDescription = cfg.Bind("Fields", "ShowDescription", true, "Show the description."); ShowModifiers = cfg.Bind("Fields", "ShowModifiers", true, "Show item stat modifiers (e.g. +10 Poison)."); IconSize = cfg.Bind("Fields", "IconSize", 48f, "Icon width/height in reference pixels."); NameFontSize = cfg.Bind("Fields", "NameFontSize", 22f, "Name font size."); TypeFontSize = cfg.Bind("Fields", "TypeFontSize", 15f, "Type font size."); DescriptionFontSize = cfg.Bind("Fields", "DescriptionFontSize", 16f, "Description font size."); ModifierFontSize = cfg.Bind("Fields", "ModifierFontSize", 16f, "Modifier font size."); } } [BepInPlugin("peak-item-tooltip", "peak-item-tooltip", "0.1.0")] public class Plugin : BaseUnityPlugin { public const string PluginGuid = "peak-item-tooltip"; public const string PluginName = "peak-item-tooltip"; public const string PluginVersion = "0.1.0"; internal static ManualLogSource Log; private Descriptions _descriptions; private PluginConfig _config; private Widget _widget; private Item _lastItem; private float _nextContentRefresh; private const float ContentRefreshInterval = 0.25f; private bool _configDirty; private float _nextReloadCheck; private const float ReloadCheckInterval = 1f; private DateTime _configWriteUtc; private void Awake() { Log = ((BaseUnityPlugin)this).Logger; _descriptions = new Descriptions(); _descriptions.Initialize(); _config = new PluginConfig(((BaseUnityPlugin)this).Config); _widget = new Widget(_config); _configWriteUtc = SafeConfigWriteTime(); Log.LogInfo((object)"peak-item-tooltip [0.1.0] loaded •ᴗ•"); } private void Update() { if (_config.HotReload.Value && Time.unscaledTime >= _nextReloadCheck) { _nextReloadCheck = Time.unscaledTime + 1f; _descriptions.MaybeReload(); MaybeReloadConfig(); } Item val = ResolveTargetItem(); if ((Object)(object)val == (Object)null) { _widget.Hide(); _lastItem = null; _configDirty = false; return; } bool num = (Object)(object)val != (Object)(object)_lastItem; bool flag = Time.unscaledTime >= _nextContentRefresh; if (num || flag || _configDirty) { _lastItem = val; _nextContentRefresh = Time.unscaledTime + 0.25f; _configDirty = false; _widget.Show(val, _descriptions); } } private Item ResolveTargetItem() { Interaction instance = Interaction.instance; if ((Object)(object)instance == (Object)null) { return null; } if (_config.ShowWhileHolding.Value) { Character localCharacter = Character.localCharacter; Item val = (((Object)(object)localCharacter != (Object)null && (Object)(object)localCharacter.data != (Object)null) ? localCharacter.data.currentItem : null); if ((Object)(object)val != (Object)null) { return val; } } IInteractible currentHovered = instance.currentHovered; return (Item)(object)((currentHovered is Item) ? currentHovered : null); } private void MaybeReloadConfig() { try { DateTime dateTime = SafeConfigWriteTime(); if (dateTime != _configWriteUtc) { _configWriteUtc = dateTime; ((BaseUnityPlugin)this).Config.Reload(); _configDirty = true; } } catch (Exception ex) { Log.LogWarning((object)("Config reload check failed: " + ex.Message)); } } private DateTime SafeConfigWriteTime() { string configFilePath = ((BaseUnityPlugin)this).Config.ConfigFilePath; if (!File.Exists(configFilePath)) { return default(DateTime); } return File.GetLastWriteTimeUtc(configFilePath); } } public class Widget { private readonly PluginConfig _cfg; private GameObject _canvasGo; private GameObject _rootGo; private RectTransform _root; private ProceduralImage _background; private ProceduralImage _border; private GameObject _iconGo; private RawImage _icon; private LayoutElement _iconLayout; private TextMeshProUGUI _name; private TextMeshProUGUI _type; private TextMeshProUGUI _description; private TextMeshProUGUI _modifiers; private static readonly Color TypeFallbackColour = new Color(0.7f, 0.7f, 0.7f, 1f); private const float CornerRadius = 12f; private const float BorderWidth = 2f; private static readonly Color BorderColour = Color.white; private bool _built; private bool _visible; public bool Visible => _visible; public Widget(PluginConfig cfg) { _cfg = cfg; } public void Show(Item item, Descriptions descriptions) { if (!_cfg.Enabled.Value) { Hide(); return; } EnsureBuilt(); string key = ((item.UIData != null) ? item.UIData.itemName : null); if (!descriptions.TryGet(key, out var info)) { Hide(); return; } Texture2D val = null; try { val = ((item.UIData != null) ? item.UIData.GetIcon() : null); } catch { val = null; } _icon.texture = (Texture)(object)val; ((TMP_Text)_name).text = item.GetItemName((ItemInstanceData)null); ((TMP_Text)_description).text = info.Description; ((TMP_Text)_type).text = FormatTypes(info.Types, descriptions); ((TMP_Text)_modifiers).text = ItemModifiers.Format(item); ApplyConfig(); SetVisible(v: true); } public void Hide() { if (!_built) { _visible = false; } else { SetVisible(v: false); } } public void ApplyConfig() { //IL_002f: 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_007d: 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_0097: Unknown result type (might be due to invalid IL or missing references) //IL_009c: 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 (_built) { _root.anchoredPosition = new Vector2(_cfg.OffsetX.Value, _cfg.OffsetY.Value); float value = _cfg.Scale.Value; ((Transform)_root).localScale = new Vector3(value, value, 1f); _root.sizeDelta = new Vector2(_cfg.Width.Value, _root.sizeDelta.y); Color color = ((Graphic)_background).color; color.a = _cfg.BackgroundOpacity.Value; ((Graphic)_background).color = color; _iconGo.SetActive(_cfg.ShowIcon.Value && (Object)(object)_icon.texture != (Object)null); ((Component)_name).gameObject.SetActive(_cfg.ShowName.Value); ((Component)_type).gameObject.SetActive(_cfg.ShowType.Value && !string.IsNullOrEmpty(((TMP_Text)_type).text)); ((Component)_description).gameObject.SetActive(_cfg.ShowDescription.Value); ((Component)_modifiers).gameObject.SetActive(_cfg.ShowModifiers.Value && !string.IsNullOrEmpty(((TMP_Text)_modifiers).text)); _iconLayout.preferredWidth = _cfg.IconSize.Value; _iconLayout.preferredHeight = _cfg.IconSize.Value; ((TMP_Text)_name).fontSize = _cfg.NameFontSize.Value; ((TMP_Text)_type).fontSize = _cfg.TypeFontSize.Value; ((TMP_Text)_description).fontSize = _cfg.DescriptionFontSize.Value; ((TMP_Text)_modifiers).fontSize = _cfg.ModifierFontSize.Value; LayoutRebuilder.ForceRebuildLayoutImmediate(_root); } } private void SetVisible(bool v) { _visible = v; if ((Object)(object)_rootGo != (Object)null) { _rootGo.SetActive(v); } } private void EnsureBuilt() { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Expected O, but got Unknown //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Expected O, but got Unknown //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Unknown result type (might be due to invalid IL or missing references) //IL_016e: Unknown result type (might be due to invalid IL or missing references) //IL_018c: Unknown result type (might be due to invalid IL or missing references) //IL_0196: Expected O, but got Unknown //IL_01e0: Unknown result type (might be due to invalid IL or missing references) //IL_01e6: Expected O, but got Unknown //IL_0238: Unknown result type (might be due to invalid IL or missing references) //IL_0242: Expected O, but got Unknown //IL_02ed: Unknown result type (might be due to invalid IL or missing references) //IL_0334: Unknown result type (might be due to invalid IL or missing references) //IL_0381: Unknown result type (might be due to invalid IL or missing references) //IL_03ba: Unknown result type (might be due to invalid IL or missing references) //IL_03e6: Unknown result type (might be due to invalid IL or missing references) //IL_03ec: Expected O, but got Unknown //IL_0405: Unknown result type (might be due to invalid IL or missing references) //IL_0410: Unknown result type (might be due to invalid IL or missing references) //IL_041b: Unknown result type (might be due to invalid IL or missing references) //IL_0425: Unknown result type (might be due to invalid IL or missing references) //IL_044d: Unknown result type (might be due to invalid IL or missing references) //IL_048d: Unknown result type (might be due to invalid IL or missing references) if (!_built) { _canvasGo = new GameObject("PeakItemTooltipCanvas"); Object.DontDestroyOnLoad((Object)(object)_canvasGo); Canvas obj = _canvasGo.AddComponent(); obj.renderMode = (RenderMode)0; obj.sortingOrder = 5000; CanvasScaler obj2 = _canvasGo.AddComponent(); obj2.uiScaleMode = (ScaleMode)1; obj2.referenceResolution = new Vector2(1920f, 1080f); obj2.screenMatchMode = (ScreenMatchMode)0; obj2.matchWidthOrHeight = 0.5f; _rootGo = new GameObject("Widget"); _rootGo.transform.SetParent(_canvasGo.transform, false); _root = _rootGo.AddComponent(); _root.anchorMin = new Vector2(0.5f, 0.5f); _root.anchorMax = new Vector2(0.5f, 0.5f); _root.pivot = new Vector2(0.5f, 0.5f); _background = _rootGo.AddComponent(); ((Graphic)_background).color = new Color(0f, 0f, 0f, _cfg.BackgroundOpacity.Value); ((Graphic)_background).raycastTarget = false; _rootGo.AddComponent().Radius = new Vector4(12f, 12f, 12f, 12f); VerticalLayoutGroup obj3 = _rootGo.AddComponent(); ((LayoutGroup)obj3).padding = new RectOffset(12, 12, 10, 10); ((HorizontalOrVerticalLayoutGroup)obj3).spacing = 6f; ((HorizontalOrVerticalLayoutGroup)obj3).childControlWidth = true; ((HorizontalOrVerticalLayoutGroup)obj3).childControlHeight = true; ((HorizontalOrVerticalLayoutGroup)obj3).childForceExpandWidth = true; ((HorizontalOrVerticalLayoutGroup)obj3).childForceExpandHeight = false; ((LayoutGroup)obj3).childAlignment = (TextAnchor)0; ContentSizeFitter obj4 = _rootGo.AddComponent(); obj4.horizontalFit = (FitMode)0; obj4.verticalFit = (FitMode)2; GameObject val = new GameObject("Header"); val.transform.SetParent((Transform)(object)_root, false); val.AddComponent(); HorizontalLayoutGroup obj5 = val.AddComponent(); ((HorizontalOrVerticalLayoutGroup)obj5).spacing = 8f; ((HorizontalOrVerticalLayoutGroup)obj5).childControlWidth = true; ((HorizontalOrVerticalLayoutGroup)obj5).childControlHeight = true; ((HorizontalOrVerticalLayoutGroup)obj5).childForceExpandWidth = false; ((HorizontalOrVerticalLayoutGroup)obj5).childForceExpandHeight = false; ((LayoutGroup)obj5).childAlignment = (TextAnchor)3; _iconGo = new GameObject("Icon"); _iconGo.transform.SetParent(val.transform, false); _iconGo.AddComponent(); _icon = _iconGo.AddComponent(); ((Graphic)_icon).raycastTarget = false; _iconLayout = _iconGo.AddComponent(); _iconLayout.preferredWidth = _cfg.IconSize.Value; _iconLayout.preferredHeight = _cfg.IconSize.Value; TMP_FontAsset gameFont = GetGameFont(); _name = MakeText("Name", val.transform, gameFont, _cfg.NameFontSize.Value, (FontStyles)0, Color.white); ((Component)_name).gameObject.AddComponent().flexibleWidth = 1f; _type = MakeText("Type", (Transform)(object)_root, gameFont, _cfg.TypeFontSize.Value, (FontStyles)2, TypeFallbackColour); ((TMP_Text)_type).textWrappingMode = (TextWrappingModes)1; _description = MakeText("Description", (Transform)(object)_root, gameFont, _cfg.DescriptionFontSize.Value, (FontStyles)0, new Color(0.85f, 0.85f, 0.85f, 1f)); ((TMP_Text)_description).textWrappingMode = (TextWrappingModes)1; _modifiers = MakeText("Modifiers", (Transform)(object)_root, gameFont, _cfg.ModifierFontSize.Value, (FontStyles)0, Color.white); ((TMP_Text)_modifiers).textWrappingMode = (TextWrappingModes)1; ((TMP_Text)_modifiers).richText = true; GameObject val2 = new GameObject("Border"); val2.transform.SetParent((Transform)(object)_root, false); RectTransform obj6 = val2.AddComponent(); obj6.anchorMin = Vector2.zero; obj6.anchorMax = Vector2.one; obj6.offsetMin = Vector2.zero; obj6.offsetMax = Vector2.zero; val2.AddComponent().ignoreLayout = true; _border = val2.AddComponent(); ((Graphic)_border).color = BorderColour; _border.BorderWidth = 2f; ((Graphic)_border).raycastTarget = false; val2.AddComponent().Radius = new Vector4(12f, 12f, 12f, 12f); _built = true; SetVisible(v: false); } } private static string FormatTypes(List types, Descriptions descriptions) { //IL_003c: 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_003e: 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) if (types == null) { return ""; } StringBuilder stringBuilder = new StringBuilder(); bool flag = true; foreach (string type in types) { if (!string.IsNullOrEmpty(type)) { Color colour; Color val = (descriptions.TryGetTypeColour(type, out colour) ? colour : TypeFallbackColour); if (!flag) { stringBuilder.Append(" / "); } flag = false; stringBuilder.Append("') .Append(type) .Append(""); } } return stringBuilder.ToString(); } private static TextMeshProUGUI MakeText(string name, Transform parent, TMP_FontAsset font, float size, FontStyles style, Color colour) { //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_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject(name); val.transform.SetParent(parent, false); TextMeshProUGUI val2 = val.AddComponent(); if ((Object)(object)font != (Object)null) { ((TMP_Text)val2).font = font; } ((TMP_Text)val2).fontSize = size; ((TMP_Text)val2).fontStyle = style; ((Graphic)val2).color = colour; ((Graphic)val2).raycastTarget = false; return val2; } private static TMP_FontAsset GetGameFont() { if ((Object)(object)GUIManager.instance != (Object)null && (Object)(object)GUIManager.instance.interactNameText != (Object)null) { return ((TMP_Text)GUIManager.instance.interactNameText).font; } return null; } } }