using System; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text.RegularExpressions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("QuestTrackerMod")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+161a9c0b6bca194599e2e871872eff202a56cc0d")] [assembly: AssemblyProduct("QuestTrackerMod")] [assembly: AssemblyTitle("QuestTrackerMod")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [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] [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; } } [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 QuestTrackerMod { [BepInPlugin("com.github.antigravity.questtrackermod", "Quest Tracker Mod", "1.0.0")] public class Plugin : BaseUnityPlugin { public static ManualLogSource? Log; private Harmony? _harmony; public static ConfigEntry? CfgToggleKey; public static ConfigEntry? CfgPositionX; public static ConfigEntry? CfgPositionY; public static ConfigEntry? CfgWindowWidth; public static ConfigEntry? CfgWindowHeight; public static ConfigEntry? CfgAlmostDoneThreshold; public static ConfigEntry? CfgPinnedQuestIds; public static ConfigEntry? CfgHUDPositionX; public static ConfigEntry? CfgHUDPositionY; public static ConfigEntry? CfgHUDWidth; public static ConfigEntry? CfgHUDHeight; public static ConfigEntry? CfgCompactHUDMaxItems; public static ConfigEntry? CfgHideCompletedInAlmostDone; private void Awake() { //IL_01e8: Unknown result type (might be due to invalid IL or missing references) //IL_01ed: Unknown result type (might be due to invalid IL or missing references) //IL_01f3: Expected O, but got Unknown //IL_01ff: Unknown result type (might be due to invalid IL or missing references) //IL_0209: Expected O, but got Unknown Log = ((BaseUnityPlugin)this).Logger; Log.LogInfo((object)"Quest Tracker Mod initializing..."); CfgToggleKey = ((BaseUnityPlugin)this).Config.Bind("General", "ToggleKey", (KeyCode)113, "Key to cycle quest tracker views (Small Window -> Big Window -> Hidden)."); CfgPinnedQuestIds = ((BaseUnityPlugin)this).Config.Bind("General", "PinnedQuestIds", "", "Comma-separated list of pinned quest IDs."); CfgPositionX = ((BaseUnityPlugin)this).Config.Bind("Window", "PositionX", 120f, "X position of the main quest window."); CfgPositionY = ((BaseUnityPlugin)this).Config.Bind("Window", "PositionY", 90f, "Y position of the main quest window."); CfgWindowWidth = ((BaseUnityPlugin)this).Config.Bind("Window", "Width", 620f, "Width of the main quest window."); CfgWindowHeight = ((BaseUnityPlugin)this).Config.Bind("Window", "Height", 580f, "Height of the main quest window."); CfgHUDPositionX = ((BaseUnityPlugin)this).Config.Bind("CompactHUD", "PositionX", 1200f, "X position of the draggable small HUD window."); CfgHUDPositionY = ((BaseUnityPlugin)this).Config.Bind("CompactHUD", "PositionY", 50f, "Y position of the draggable small HUD window."); CfgHUDWidth = ((BaseUnityPlugin)this).Config.Bind("CompactHUD", "Width", 330f, "Width of the draggable small HUD window."); CfgHUDHeight = ((BaseUnityPlugin)this).Config.Bind("CompactHUD", "Height", 280f, "Height of the draggable small HUD window."); CfgCompactHUDMaxItems = ((BaseUnityPlugin)this).Config.Bind("CompactHUD", "MaxItems", 5, "Maximum number of quests to show in the small HUD."); CfgAlmostDoneThreshold = ((BaseUnityPlugin)this).Config.Bind("Filtering", "AlmostDoneThreshold", 0.5f, "Threshold percentage (0.0 to 1.0) to consider a quest 'Almost Done'."); CfgHideCompletedInAlmostDone = ((BaseUnityPlugin)this).Config.Bind("Filtering", "HideCompletedInAlmostDone", true, "Hide 100% completed quests in the 'Almost Done' tab."); try { GameObject val = new GameObject("QuestTrackerController"); Object.DontDestroyOnLoad((Object)val); val.AddComponent(); _harmony = new Harmony("com.github.antigravity.questtrackermod"); _harmony.PatchAll(); Log.LogInfo((object)"Quest Tracker Mod loaded successfully!"); } catch (Exception ex) { Log.LogError((object)("Failed to initialize Quest Tracker Mod: " + ex)); } } private void OnDestroy() { Harmony? harmony = _harmony; if (harmony != null) { harmony.UnpatchSelf(); } } } public enum QuestTrackerDisplayMode { SmallWindow, BigWindow, Hidden } public enum QuestTab { AlmostDone, All, InProgress, Completed } public class QuestDataModel { public QuestDefinition Definition; public string QuestId = ""; public string Title = ""; public string DescPattern = ""; public string CachedDescription = ""; public QuestCategory Category; public int CurrentProgress = -1; public int RequiredProgress = 1; public float Percent; public bool IsCompleted; public bool IsRewarded; public int Remaining; public bool IsPinned; public bool IsSessionQuest; public bool IsAlmostDone(float threshold) { if (!IsCompleted && !IsRewarded) { return Percent >= threshold; } return false; } public bool UpdateProgress(HashSet pinnedIds) { if ((Object)(object)Definition == (Object)null) { return false; } int num = 0; bool flag = false; bool flag2 = false; try { num = QuestProgressRepository.GetProgress(Definition); flag = QuestProgressRepository.IsCompleted(Definition); flag2 = QuestProgressRepository.IsRewarded(Definition); } catch { } if (num >= RequiredProgress) { flag = true; } bool flag3 = pinnedIds?.Contains(QuestId) ?? false; if (num == CurrentProgress && flag == IsCompleted && flag2 == IsRewarded && flag3 == IsPinned) { return false; } CurrentProgress = num; IsCompleted = flag; IsRewarded = flag2; IsPinned = flag3; Percent = Mathf.Clamp01((float)num / (float)RequiredProgress); Remaining = Mathf.Max(0, RequiredProgress - num); FormatDescriptionFast(); return true; } private void FormatDescriptionFast() { if (string.IsNullOrEmpty(DescPattern)) { CachedDescription = $"Progress: {CurrentProgress} / {RequiredProgress}"; } else { CachedDescription = $"{DescPattern} ({CurrentProgress} / {RequiredProgress})"; } } public static QuestDataModel CreateStaticModel(QuestDefinition q, HashSet pinnedIds) { //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) string questId = q.questId ?? ((Object)q).name ?? "Quest"; int num = 1; if ((Object)(object)q.condition != (Object)null && q.condition.RequiredProgress > 0) { num = q.condition.RequiredProgress; } string title = FormatTitleStatic(q); string descPattern = BuildDescPatternStatic(q, num); QuestDataModel questDataModel = new QuestDataModel(); questDataModel.Definition = q; questDataModel.QuestId = questId; questDataModel.Title = title; questDataModel.DescPattern = descPattern; questDataModel.Category = q.category; questDataModel.RequiredProgress = num; questDataModel.IsSessionQuest = !q.persistProgress; questDataModel.UpdateProgress(pinnedIds); return questDataModel; } private static string FormatTitleStatic(QuestDefinition q) { if ((Object)(object)q == (Object)null) { return "Unknown Quest"; } string text = "Objective"; if ((Object)(object)q.condition != (Object)null) { string name = ((object)q.condition).GetType().Name; string text2 = ExtractTargetNameFromConditionStatic(q.condition); switch (name) { case "HeroLevelQuestCondition": text = ((!string.IsNullOrEmpty(text2)) ? ("Hero Mastery: " + text2) : "Hero Mastery"); break; case "KillWithHeroTotalQuestCondition": text = ((!string.IsNullOrEmpty(text2)) ? ("Hero Slayer: " + text2) : "Hero Slayer"); break; case "KillWithWeaponQuestCondition": case "WeaponLevelQuestCondition": text = ((!string.IsNullOrEmpty(text2)) ? ("Weapon Master: " + text2) : "Weapon Master"); break; case "KillBossTotalQuestCondition": case "BossKillTimedQuestCondition": text = ((!string.IsNullOrEmpty(text2)) ? FormatBossTitleStatic(text2) : "Boss Hunter"); break; case "KillMobsTotalQuestCondition": text = "Monster Slayer"; break; case "KillSpecificMobsTotalQuestCondition": text = ((!string.IsNullOrEmpty(text2)) ? ("Huntsman: " + text2) : "Targeted Hunt"); break; case "OpenChestsTotalQuestCondition": text = "Treasure Hunter"; break; case "ClearLairsTotalQuestCondition": text = "Lair Purger"; break; case "ShrineActivateQuestCondition": text = "Beacon Pilgrim"; break; case "SurviveTimeQuestCondition": text = "Survivalist"; break; case "UseBellsTotalQuestCondition": text = "Bells"; break; case "UseFoxesTotalQuestCondition": text = "Fox Shrines"; break; case "ArtifactCollectQuestCondition": text = ((!string.IsNullOrEmpty(text2)) ? ("Relic Collector: " + text2) : "Relic Collector"); break; case "BoostLevelQuestCondition": text = ((!string.IsNullOrEmpty(text2)) ? ("Scroll: " + text2) : "Scroll Stacks"); break; case "BagCollectQuestCondition": text = "Loot Bags"; break; case "MapClearQuestCondition": text = "Stage Conqueror"; break; case "CompleteQuestsTotalQuestCondition": text = "Master Adventurer"; break; default: { string text3 = ((Object)q).name; if (string.IsNullOrEmpty(text3)) { text3 = q.questId; } text = CleanTextStatic(text3); break; } } } else { string text4 = ((Object)q).name; if (string.IsNullOrEmpty(text4)) { text4 = q.questId; } text = CleanTextStatic(text4); } return ApplySpecificRenamesStatic(text); } private static string FormatBossTitleStatic(string targetName) { if (string.IsNullOrEmpty(targetName)) { return "Boss Hunter"; } targetName = ApplySpecificRenamesStatic(targetName); if (targetName.StartsWith("Boss", StringComparison.OrdinalIgnoreCase)) { return "Defeat " + targetName; } return "Boss Hunter: " + targetName; } private static string BuildDescPatternStatic(QuestDefinition q, int req) { if ((Object)(object)q == (Object)null) { return "Progress:"; } string text = "Progress:"; if ((Object)(object)q.condition != (Object)null) { string name = ((object)q.condition).GetType().Name; string text2 = ExtractTargetNameFromConditionStatic(q.condition); switch (name) { case "KillMobsTotalQuestCondition": text = "Slay monsters"; break; case "KillSpecificMobsTotalQuestCondition": text = ((!string.IsNullOrEmpty(text2)) ? ("Slay " + text2) : "Slay target monsters"); break; case "KillBossTotalQuestCondition": if (!string.IsNullOrEmpty(text2)) { string text3 = (text2.StartsWith("Boss", StringComparison.OrdinalIgnoreCase) ? text2 : ("Boss " + text2)); text = "Defeat " + text3; } else { text = "Defeat Boss"; } break; case "BossKillTimedQuestCondition": { float singleFieldStatic = GetSingleFieldStatic(q.condition, "timeLimitSeconds", 180f); if (!string.IsNullOrEmpty(text2)) { string arg = (text2.StartsWith("Boss", StringComparison.OrdinalIgnoreCase) ? text2 : ("Boss " + text2)); text = $"Defeat {arg} under {singleFieldStatic:F0}s"; } else { text = $"Defeat Boss under {singleFieldStatic:F0}s"; } break; } case "HeroLevelQuestCondition": { int intFieldStatic2 = GetIntFieldStatic(q.condition, "requiredLevel", req); text = ((!string.IsNullOrEmpty(text2)) ? $"Reach Level {intFieldStatic2} with {text2}" : $"Reach Hero Level {intFieldStatic2}"); break; } case "KillWithHeroTotalQuestCondition": text = ((!string.IsNullOrEmpty(text2)) ? ("Slay monsters with " + text2) : "Slay monsters with hero"); break; case "KillWithWeaponQuestCondition": text = ((!string.IsNullOrEmpty(text2)) ? ("Slay monsters with " + text2) : "Slay monsters with weapon"); break; case "WeaponLevelQuestCondition": { int intFieldStatic3 = GetIntFieldStatic(q.condition, "requiredLevel", req); text = ((!string.IsNullOrEmpty(text2)) ? $"Upgrade {text2} to Level {intFieldStatic3}" : $"Upgrade weapon to Level {intFieldStatic3}"); break; } case "OpenChestsTotalQuestCondition": text = "Open treasure chests"; break; case "ClearLairsTotalQuestCondition": text = "Clear lairs"; break; case "ShrineActivateQuestCondition": text = "Activate beacon shrines"; break; case "SurviveTimeQuestCondition": { float singleFieldStatic2 = GetSingleFieldStatic(q.condition, "survivalSeconds", req); int num = (int)(singleFieldStatic2 / 60f); int num2 = (int)(singleFieldStatic2 % 60f); text = $"Survive for {num}m {num2:D2}s"; break; } case "UseBellsTotalQuestCondition": text = "Ring Bells"; break; case "UseFoxesTotalQuestCondition": text = "Use Fox Shrines"; break; case "ArtifactCollectQuestCondition": text = ((!string.IsNullOrEmpty(text2)) ? ("Collect artifact: " + text2) : "Collect artifacts"); break; case "BoostLevelQuestCondition": { int intFieldStatic = GetIntFieldStatic(q.condition, "requiredLevel", req); text = ((!string.IsNullOrEmpty(text2)) ? $"Reach {intFieldStatic} stacks of {text2}" : $"Reach {intFieldStatic} stacks"); break; } case "BagCollectQuestCondition": text = "Collect Bags"; break; case "MapClearQuestCondition": text = "Clear stages"; break; case "CompleteQuestsTotalQuestCondition": text = "Complete quests"; break; } } return ApplySpecificRenamesStatic(text); } private static bool ContainsCyrillicStatic(string text) { if (string.IsNullOrEmpty(text)) { return false; } foreach (char c in text) { if (c >= 'Ѐ' && c <= 'ӿ') { return true; } } return false; } private static string ExtractTargetNameFromConditionStatic(object condition) { if (condition == null) { return ""; } try { Type type = condition.GetType(); FieldInfo field = type.GetField("heroDefinition", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field != null) { object value = field.GetValue(condition); if (value != null) { string cleanNameFromObjectStatic = GetCleanNameFromObjectStatic(value); if (!string.IsNullOrEmpty(cleanNameFromObjectStatic)) { return ApplySpecificRenamesStatic(cleanNameFromObjectStatic); } } } FieldInfo field2 = type.GetField("artifactPreset", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field2 != null) { object value2 = field2.GetValue(condition); if (value2 != null) { string cleanNameFromObjectStatic2 = GetCleanNameFromObjectStatic(value2); if (!string.IsNullOrEmpty(cleanNameFromObjectStatic2)) { return ApplySpecificRenamesStatic(cleanNameFromObjectStatic2); } } } FieldInfo field3 = type.GetField("boostPreset", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field3 != null) { object value3 = field3.GetValue(condition); if (value3 != null) { string cleanNameFromObjectStatic3 = GetCleanNameFromObjectStatic(value3); if (!string.IsNullOrEmpty(cleanNameFromObjectStatic3)) { return ApplySpecificRenamesStatic(cleanNameFromObjectStatic3); } } } FieldInfo field4 = type.GetField("bossName", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field4 != null) { string text = (field4.GetValue(condition) as string) ?? ""; if (!string.IsNullOrEmpty(text)) { return ApplySpecificRenamesStatic(CleanTextStatic(text)); } } FieldInfo field5 = type.GetField("mobNames", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field5 != null && field5.GetValue(condition) is string[] array && array.Length != 0 && !string.IsNullOrEmpty(array[0])) { return ApplySpecificRenamesStatic(CleanTextStatic(array[0])); } FieldInfo field6 = type.GetField("weaponType", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field6 != null) { object value4 = field6.GetValue(condition); if (value4 != null) { string text2 = value4.ToString() ?? ""; if (!string.IsNullOrEmpty(text2)) { return ApplySpecificRenamesStatic(CleanTextStatic(text2)); } } } } catch { } return ""; } private static string GetCleanNameFromObjectStatic(object obj) { if (obj == null) { return ""; } try { Type type = obj.GetType(); PropertyInfo property = type.GetProperty("HeroName", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (property != null) { string text = (property.GetValue(obj) as string) ?? ""; if (!string.IsNullOrEmpty(text)) { return CleanTextStatic(text); } } FieldInfo field = type.GetField("displayName", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field != null) { string text2 = (field.GetValue(obj) as string) ?? ""; if (!string.IsNullOrEmpty(text2)) { return CleanTextStatic(text2); } } PropertyInfo property2 = type.GetProperty("name", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (property2 != null) { string text3 = (property2.GetValue(obj) as string) ?? ""; if (!string.IsNullOrEmpty(text3)) { return CleanTextStatic(text3); } } FieldInfo field2 = type.GetField("name", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field2 != null) { string text4 = (field2.GetValue(obj) as string) ?? ""; if (!string.IsNullOrEmpty(text4)) { return CleanTextStatic(text4); } } } catch { } return CleanTextStatic(obj.ToString() ?? ""); } private static string CleanTextStatic(string text) { if (string.IsNullOrEmpty(text)) { return ""; } if (ContainsCyrillicStatic(text)) { text = TranslateRussianTermStatic(text); } text = text.Replace("Quest_", "").Replace("quest_", "").Replace("Achievement_", "") .Replace("ach_", "") .Replace("QUEST_", "") .Replace("LOC_", "") .Replace("(Clone)", "") .Trim(); text = CleanBoostOrStatNameStatic(text); text = ApplySpecificRenamesStatic(text); if (text.Length > 0 && !ContainsCyrillicStatic(text)) { return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(text); } return "Objective"; } private static string CleanBoostOrStatNameStatic(string text) { if (string.IsNullOrEmpty(text)) { return ""; } string input = text; input = Regex.Replace(input, "\\b(common|uncommon|rare|epic|legendary|preset|buff|boost|stat|hero|unit|team|player)\\b", "", RegexOptions.IgnoreCase); input = Regex.Replace(input, "([a-z])([A-Z])", "$1 $2"); input = input.Replace("_", " ").Trim(); input = Regex.Replace(input, "herolifesteal|lifesteal", "Lifesteal", RegexOptions.IgnoreCase); input = Regex.Replace(input, "movementspeed|movespeed", "Movement Speed", RegexOptions.IgnoreCase); input = Regex.Replace(input, "attackspeed", "Attack Speed", RegexOptions.IgnoreCase); input = Regex.Replace(input, "critchance", "Critical Chance", RegexOptions.IgnoreCase); input = Regex.Replace(input, "critdamage", "Critical Damage", RegexOptions.IgnoreCase); input = Regex.Replace(input, "healthregen", "Health Regen", RegexOptions.IgnoreCase); input = Regex.Replace(input, "maxhp", "Max HP", RegexOptions.IgnoreCase); input = Regex.Replace(input, "pickuprange", "Pickup Range", RegexOptions.IgnoreCase); input = Regex.Replace(input, "cooldown", "Cooldown Reduction", RegexOptions.IgnoreCase); input = Regex.Replace(input, "\\bhero\\b", "", RegexOptions.IgnoreCase); input = Regex.Replace(input, "\\s+", " ").Trim(); if (string.IsNullOrWhiteSpace(input)) { return "Scroll"; } return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(input); } private static string ApplySpecificRenamesStatic(string text) { if (string.IsNullOrEmpty(text)) { return text; } text = Regex.Replace(text, "\\b(Storm\\s*Anchor)\\b", "Cursed Anchor", RegexOptions.IgnoreCase); text = Regex.Replace(text, "\\b(Black\\s*Hole)\\b", "Ancient Cube", RegexOptions.IgnoreCase); text = Regex.Replace(text, "\\b(Soup)\\b", "Ogre's Stew", RegexOptions.IgnoreCase); text = Regex.Replace(text, "\\b(Hammer\\s*Chaos)\\b", "Hammer of Chaos", RegexOptions.IgnoreCase); text = Regex.Replace(text, "\\b(Ice\\s*Zone)\\b", "Ice Walk", RegexOptions.IgnoreCase); text = Regex.Replace(text, "\\b(Ritual\\s*Niddle|Ritual\\s*Needle|Niddle)\\b", "Needle", RegexOptions.IgnoreCase); text = Regex.Replace(text, "\\b(Staff)\\b", "Follower of the Will", RegexOptions.IgnoreCase); text = Regex.Replace(text, "\\b(Toxic\\s*Bomb)\\b", "Acid Bomb", RegexOptions.IgnoreCase); return text; } private static string TranslateRussianTermStatic(string text) { if (string.IsNullOrEmpty(text)) { return ""; } if (text.Contains("Светоч") || text.Contains("светоч")) { return "Beacon Shrine"; } if (text.Contains("Логово") || text.Contains("логово")) { return "Lairs"; } if (text.Contains("Босс") || text.Contains("босс")) { return "Boss"; } if (text.Contains("Убить") || text.Contains("убить")) { return "Slay Monsters"; } if (text.Contains("Сундук") || text.Contains("сундук")) { return "Chests"; } if (text.Contains("Выжить") || text.Contains("выжить")) { return "Survive"; } if (text.Contains("Герой") || text.Contains("герой")) { return "Hero"; } if (text.Contains("Оружие") || text.Contains("оружие")) { return "Weapon"; } return ""; } private static int GetIntFieldStatic(object obj, string fieldName, int fallback) { try { FieldInfo field = obj.GetType().GetField(fieldName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field != null) { return (int)field.GetValue(obj); } } catch { } return fallback; } private static float GetSingleFieldStatic(object obj, string fieldName, float fallback) { try { FieldInfo field = obj.GetType().GetField(fieldName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field != null) { return (float)field.GetValue(obj); } } catch { } return fallback; } } public class QuestTrackerUI : MonoBehaviour { private const int MAIN_WINDOW_ID = 94821; private const int HUD_WINDOW_ID = 94822; private QuestTrackerDisplayMode _displayMode; private HashSet _pinnedQuestIds = new HashSet(); private List _models = new List(); private List _sortedModels = new List(); private Rect _windowRect = new Rect(120f, 90f, 620f, 580f); private Vector2 _scrollPos = Vector2.zero; private string _searchQuery = ""; private QuestTab _currentTab; private int _selectedCategoryIndex; private Rect _hudWindowRect = new Rect(1200f, 50f, 330f, 280f); private Vector2 _hudScrollPos = Vector2.zero; private bool _isResizingMain; private bool _isResizingHUD; private Vector2 _dragStartPos; private Vector2 _windowStartSize; private float _lastFetchTime = -10f; private const float REFRESH_INTERVAL = 0.5f; private bool _stylesInitialized; private GUIStyle? _windowStyle; private GUIStyle? _headerTitleStyle; private GUIStyle? _headerSubStyle; private GUIStyle? _tabStyle; private GUIStyle? _tabActiveStyle; private GUIStyle? _pillStyle; private GUIStyle? _pillActiveStyle; private GUIStyle? _cardBoxStyle; private GUIStyle? _questTitleStyle; private GUIStyle? _questDescStyle; private GUIStyle? _questRatioStyle; private GUIStyle? _badgeAlmostDoneStyle; private GUIStyle? _badgeActiveStyle; private GUIStyle? _badgeCompletedStyle; private GUIStyle? _badgePinnedStyle; private GUIStyle? _pinButtonStyle; private GUIStyle? _pinButtonActiveStyle; private GUIStyle? _searchStyle; private GUIStyle? _footerStyle; private GUIStyle? _hudWindowStyle; private GUIStyle? _hudTitleStyle; private GUIStyle? _hudItemStyle; private GUIStyle? _hudItemTitleStyle; private GUIStyle? _resizeGripStyle; private Texture2D? _bgTexture; private Texture2D? _hudBgTexture; private Texture2D? _cardBgTexture; private Texture2D? _barBgTexture; private Texture2D? _barFillAlmostDoneTexture; private Texture2D? _barFillActiveTexture; private Texture2D? _barFillCompletedTexture; private Texture2D? _tabActiveTex; private Texture2D? _tabInactiveTex; private Texture2D? _tabHoverTex; private Texture2D? _pillActiveTex; private Texture2D? _pillInactiveTex; private Texture2D? _pillHoverTex; private Texture2D? _pinActiveTex; private Texture2D? _pinInactiveTex; private Texture2D? _pinHoverTex; private void Start() { //IL_0063: 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_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) LoadPinnedQuestIds(); float num = Plugin.CfgPositionX?.Value ?? 120f; float num2 = Plugin.CfgPositionY?.Value ?? 90f; float num3 = Plugin.CfgWindowWidth?.Value ?? 620f; float num4 = Plugin.CfgWindowHeight?.Value ?? 580f; _windowRect = new Rect(num, num2, num3, num4); float num5 = Plugin.CfgHUDPositionX?.Value ?? ((float)Screen.width - 340f); float num6 = Plugin.CfgHUDPositionY?.Value ?? 50f; float num7 = Plugin.CfgHUDWidth?.Value ?? 330f; float num8 = Plugin.CfgHUDHeight?.Value ?? 280f; _hudWindowRect = new Rect(num5, num6, num7, num8); try { if ((Object)(object)QuestService.I != (Object)null) { QuestService.I.OnProgressChanged += OnQuestProgressUpdated; QuestService.I.OnQuestCompleted += OnQuestProgressUpdated; } } catch { } InitializeModelsOnce(); } private void LoadPinnedQuestIds() { _pinnedQuestIds.Clear(); string text = Plugin.CfgPinnedQuestIds?.Value ?? ""; if (string.IsNullOrEmpty(text)) { return; } string[] array = text.Split(new char[1] { ',' }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < array.Length; i++) { string text2 = array[i].Trim(); if (!string.IsNullOrEmpty(text2)) { _pinnedQuestIds.Add(text2); } } } private void SavePinnedQuestIds() { string value = string.Join(",", _pinnedQuestIds); if (Plugin.CfgPinnedQuestIds != null) { Plugin.CfgPinnedQuestIds.Value = value; } } private void TogglePinQuest(string questId) { if (!string.IsNullOrEmpty(questId)) { if (_pinnedQuestIds.Contains(questId)) { _pinnedQuestIds.Remove(questId); } else { _pinnedQuestIds.Add(questId); } SavePinnedQuestIds(); UpdateAllProgress(forceSort: true); } } private void OnQuestProgressUpdated(QuestDefinition quest) { _lastFetchTime = -10f; } private void Update() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) ConfigEntry? cfgToggleKey = Plugin.CfgToggleKey; if (Input.GetKeyDown((KeyCode)((cfgToggleKey == null) ? 113 : ((int)cfgToggleKey.Value)))) { _displayMode = (QuestTrackerDisplayMode)((int)(_displayMode + 1) % 3); if (_displayMode == QuestTrackerDisplayMode.BigWindow || _displayMode == QuestTrackerDisplayMode.SmallWindow) { UpdateAllProgress(forceSort: true); } } if (Time.time - _lastFetchTime >= 0.5f) { UpdateAllProgress(forceSort: false); } } private void InitializeModelsOnce() { if (_models.Count > 0) { return; } List list = FetchAllQuestDefinitions(); List list2 = new List(); foreach (QuestDefinition item in list) { if ((Object)(object)item != (Object)null) { list2.Add(QuestDataModel.CreateStaticModel(item, _pinnedQuestIds)); } } _models = list2; SortModels(); } private void UpdateAllProgress(bool forceSort) { _lastFetchTime = Time.time; if (_models.Count == 0) { InitializeModelsOnce(); return; } bool flag = false; foreach (QuestDataModel model in _models) { if (model.UpdateProgress(_pinnedQuestIds)) { flag = true; } } if (flag || forceSort || _sortedModels.Count != _models.Count) { SortModels(); } } private void SortModels() { _sortedModels = (from q in _models orderby q.IsPinned descending, (q.IsCompleted || q.IsRewarded) ? 1 : 0, q.Percent descending, q.Remaining, q.Title select q).ToList(); } private List FetchAllQuestDefinitions() { List list = new List(); try { if ((Object)(object)QuestService.I != (Object)null) { QuestDatabase databaseFromObject = GetDatabaseFromObject(QuestService.I); if ((Object)(object)databaseFromObject != (Object)null && databaseFromObject.Quests != null) { foreach (QuestDefinition quest in databaseFromObject.Quests) { if ((Object)(object)quest != (Object)null && !list.Contains(quest)) { list.Add(quest); } } } } } catch { } if (list.Count == 0) { try { if ((Object)(object)AchievementService.I != (Object)null) { QuestDatabase databaseFromObject2 = GetDatabaseFromObject(AchievementService.I); if ((Object)(object)databaseFromObject2 != (Object)null && databaseFromObject2.Quests != null) { foreach (QuestDefinition quest2 in databaseFromObject2.Quests) { if ((Object)(object)quest2 != (Object)null && !list.Contains(quest2)) { list.Add(quest2); } } } } } catch { } } if (list.Count == 0) { try { QuestDatabase[] array = Resources.FindObjectsOfTypeAll(); if (array != null) { QuestDatabase[] array2 = array; foreach (QuestDatabase val in array2) { if (!((Object)(object)val != (Object)null) || val.Quests == null) { continue; } foreach (QuestDefinition quest3 in val.Quests) { if ((Object)(object)quest3 != (Object)null && !list.Contains(quest3)) { list.Add(quest3); } } } } } catch { } } return list; } private static QuestDatabase? GetDatabaseFromObject(object obj) { if (obj == null) { return null; } try { Type type = obj.GetType(); FieldInfo fieldInfo = type.GetField("_database", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) ?? type.GetField("database", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (fieldInfo != null) { object? value = fieldInfo.GetValue(obj); return (QuestDatabase?)((value is QuestDatabase) ? value : null); } PropertyInfo propertyInfo = type.GetProperty("_database", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) ?? type.GetProperty("database", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (propertyInfo != null) { object? value2 = propertyInfo.GetValue(obj); return (QuestDatabase?)((value2 is QuestDatabase) ? value2 : null); } } catch { } return null; } private void OnGUI() { InitStylesIfNeeded(); HandleGlobalResizeDrag(); switch (_displayMode) { case QuestTrackerDisplayMode.SmallWindow: DrawDraggableSmallWindow(); break; case QuestTrackerDisplayMode.BigWindow: DrawFullMainWindow(); break; case QuestTrackerDisplayMode.Hidden: break; } } private void HandleGlobalResizeDrag() { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Invalid comparison between Unknown and I4 //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Invalid comparison between Unknown and I4 //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Invalid comparison between Unknown and I4 //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_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_0034: 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) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_015d: Unknown result type (might be due to invalid IL or missing references) //IL_0163: Invalid comparison between Unknown and I4 //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: 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_0101: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_011d: Unknown result type (might be due to invalid IL or missing references) //IL_0144: Unknown result type (might be due to invalid IL or missing references) Event current = Event.current; if (current == null) { return; } if (_isResizingMain) { if ((int)current.type == 3) { Vector2 val = GUIUtility.GUIToScreenPoint(current.mousePosition) - _dragStartPos; ((Rect)(ref _windowRect)).width = Mathf.Max(420f, _windowStartSize.x + val.x); ((Rect)(ref _windowRect)).height = Mathf.Max(320f, _windowStartSize.y + val.y); current.Use(); } else if ((int)current.type == 1) { _isResizingMain = false; if (Plugin.CfgWindowWidth != null) { Plugin.CfgWindowWidth.Value = ((Rect)(ref _windowRect)).width; } if (Plugin.CfgWindowHeight != null) { Plugin.CfgWindowHeight.Value = ((Rect)(ref _windowRect)).height; } current.Use(); } } else { if (!_isResizingHUD) { return; } if ((int)current.type == 3) { Vector2 val2 = GUIUtility.GUIToScreenPoint(current.mousePosition) - _dragStartPos; ((Rect)(ref _hudWindowRect)).width = Mathf.Max(260f, _windowStartSize.x + val2.x); ((Rect)(ref _hudWindowRect)).height = Mathf.Max(150f, _windowStartSize.y + val2.y); current.Use(); } else if ((int)current.type == 1) { _isResizingHUD = false; if (Plugin.CfgHUDWidth != null) { Plugin.CfgHUDWidth.Value = ((Rect)(ref _hudWindowRect)).width; } if (Plugin.CfgHUDHeight != null) { Plugin.CfgHUDHeight.Value = ((Rect)(ref _hudWindowRect)).height; } current.Use(); } } } private void DrawDraggableSmallWindow() { //IL_0007: 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_0028: Expected O, but got Unknown //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Invalid comparison between Unknown and I4 _hudWindowRect = GUI.Window(94822, _hudWindowRect, new WindowFunction(DrawCompactHUDContent), "", _hudWindowStyle); ((Rect)(ref _hudWindowRect)).x = Mathf.Clamp(((Rect)(ref _hudWindowRect)).x, 0f, (float)Screen.width - ((Rect)(ref _hudWindowRect)).width); ((Rect)(ref _hudWindowRect)).y = Mathf.Clamp(((Rect)(ref _hudWindowRect)).y, 0f, (float)Screen.height - ((Rect)(ref _hudWindowRect)).height); if ((int)Event.current.type == 1) { if (Plugin.CfgHUDPositionX != null) { Plugin.CfgHUDPositionX.Value = ((Rect)(ref _hudWindowRect)).x; } if (Plugin.CfgHUDPositionY != null) { Plugin.CfgHUDPositionY.Value = ((Rect)(ref _hudWindowRect)).y; } } } private void DrawCompactHUDContent(int windowID) { //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_02c9: Unknown result type (might be due to invalid IL or missing references) //IL_022d: Unknown result type (might be due to invalid IL or missing references) //IL_0232: Unknown result type (might be due to invalid IL or missing references) //IL_0239: Unknown result type (might be due to invalid IL or missing references) //IL_023f: Invalid comparison between Unknown and I4 //IL_0241: Unknown result type (might be due to invalid IL or missing references) //IL_0272: Unknown result type (might be due to invalid IL or missing references) float threshold = Plugin.CfgAlmostDoneThreshold?.Value ?? 0.5f; int count = Plugin.CfgCompactHUDMaxItems?.Value ?? 5; List first = _sortedModels.Where((QuestDataModel q) => q.IsPinned && !q.IsCompleted && !q.IsRewarded).ToList(); List second = _sortedModels.Where((QuestDataModel q) => !q.IsPinned && !q.IsCompleted && !q.IsRewarded && q.Percent >= threshold).ToList(); List list = first.Concat(second).Take(count).ToList(); float width = ((Rect)(ref _hudWindowRect)).width; GUILayout.BeginHorizontal(Array.Empty()); GUILayout.Label("PINNED & ALMOST DONE", _hudTitleStyle, Array.Empty()); GUILayout.FlexibleSpace(); GUILayout.Label("[Q] Cycle", _footerStyle, Array.Empty()); GUILayout.EndHorizontal(); GUILayout.Space(6f); _hudScrollPos = GUILayout.BeginScrollView(_hudScrollPos, false, true, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandHeight(true) }); if (list.Count == 0) { GUILayout.Label("No pinned or almost done quests!", _hudItemStyle, Array.Empty()); } else { foreach (QuestDataModel item in list) { GUILayout.BeginVertical(_cardBoxStyle, Array.Empty()); GUILayout.BeginHorizontal(Array.Empty()); if (item.IsPinned) { GUILayout.Label("PINNED", _badgePinnedStyle, (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.ExpandWidth(false), GUILayout.Height(16f) }); GUILayout.Space(4f); } GUILayout.Label(item.Title, _hudItemTitleStyle, Array.Empty()); GUILayout.FlexibleSpace(); GUILayout.Label($"{item.Percent * 100f:F0}%", _hudItemTitleStyle, Array.Empty()); GUILayout.EndHorizontal(); GUILayout.Label(item.CachedDescription, _hudItemStyle, Array.Empty()); GUILayout.Space(2f); Rect rect = GUILayoutUtility.GetRect(GUIContent.none, GUIStyle.none, (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.Height(6f), GUILayout.ExpandWidth(true) }); if ((int)Event.current.type == 7) { GUI.DrawTexture(rect, (Texture)(object)_barBgTexture); GUI.DrawTexture(new Rect(((Rect)(ref rect)).x, ((Rect)(ref rect)).y, ((Rect)(ref rect)).width * item.Percent, ((Rect)(ref rect)).height), (Texture)(object)_barFillAlmostDoneTexture); } GUILayout.EndVertical(); GUILayout.Space(3f); } } GUILayout.EndScrollView(); GUI.DragWindow(new Rect(0f, 0f, width - 20f, 30f)); DrawWindowResizeGrip(ref _hudWindowRect, ref _isResizingHUD); } private void DrawFullMainWindow() { //IL_0007: 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_0028: Expected O, but got Unknown //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Invalid comparison between Unknown and I4 _windowRect = GUI.Window(94821, _windowRect, new WindowFunction(DrawMainWindowContent), "", _windowStyle); ((Rect)(ref _windowRect)).x = Mathf.Clamp(((Rect)(ref _windowRect)).x, 0f, (float)Screen.width - ((Rect)(ref _windowRect)).width); ((Rect)(ref _windowRect)).y = Mathf.Clamp(((Rect)(ref _windowRect)).y, 0f, (float)Screen.height - ((Rect)(ref _windowRect)).height); if ((int)Event.current.type == 1) { if (Plugin.CfgPositionX != null) { Plugin.CfgPositionX.Value = ((Rect)(ref _windowRect)).x; } if (Plugin.CfgPositionY != null) { Plugin.CfgPositionY.Value = ((Rect)(ref _windowRect)).y; } } } private void DrawMainWindowContent(int windowID) { //IL_0310: Unknown result type (might be due to invalid IL or missing references) //IL_0326: Unknown result type (might be due to invalid IL or missing references) //IL_032b: Unknown result type (might be due to invalid IL or missing references) //IL_03d1: Unknown result type (might be due to invalid IL or missing references) float width = ((Rect)(ref _windowRect)).width; GUILayout.BeginHorizontal(Array.Empty()); GUILayout.BeginVertical(Array.Empty()); GUILayout.Label("QUEST TRACKER", _headerTitleStyle, Array.Empty()); GUILayout.Label("Real-time In-Game Quest Progress • Press [Q] to Cycle Views", _headerSubStyle, Array.Empty()); GUILayout.EndVertical(); GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); GUILayout.Space(8f); GUILayout.BeginHorizontal(Array.Empty()); GUILayout.Label("Search:", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(50f) }); _searchQuery = GUILayout.TextField(_searchQuery, _searchStyle, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(24f) }); if (!string.IsNullOrEmpty(_searchQuery) && GUILayout.Button("Clear", (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.Width(50f), GUILayout.Height(24f) })) { _searchQuery = ""; } GUILayout.EndHorizontal(); GUILayout.Space(8f); GUILayout.BeginHorizontal(Array.Empty()); if (DrawTabButton("ALMOST DONE", QuestTab.AlmostDone)) { _currentTab = QuestTab.AlmostDone; } if (DrawTabButton("ALL QUESTS", QuestTab.All)) { _currentTab = QuestTab.All; } if (DrawTabButton("IN PROGRESS", QuestTab.InProgress)) { _currentTab = QuestTab.InProgress; } if (DrawTabButton("COMPLETED", QuestTab.Completed)) { _currentTab = QuestTab.Completed; } GUILayout.EndHorizontal(); GUILayout.Space(6f); string[] array = new string[7] { "All", "Heroes", "Weapons", "Scrolls", "Artifacts", "Map", "General" }; GUILayout.BeginHorizontal(Array.Empty()); for (int i = 0; i < array.Length; i++) { GUIStyle val = ((_selectedCategoryIndex == i) ? _pillActiveStyle : _pillStyle); if (GUILayout.Button(array[i], val, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(22f) })) { _selectedCategoryIndex = i; } } GUILayout.EndHorizontal(); GUILayout.Space(8f); float threshold = Plugin.CfgAlmostDoneThreshold?.Value ?? 0.5f; bool hideCompletedInAlmostDone = Plugin.CfgHideCompletedInAlmostDone?.Value ?? true; List list = _sortedModels.Where(delegate(QuestDataModel q) { //IL_0095: 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) switch (_currentTab) { case QuestTab.AlmostDone: if (hideCompletedInAlmostDone && (q.IsCompleted || q.IsRewarded)) { return false; } if (!q.IsPinned && q.Percent < threshold) { return false; } break; case QuestTab.InProgress: if (q.IsCompleted || q.IsRewarded) { return false; } break; case QuestTab.Completed: if (!q.IsCompleted && !q.IsRewarded) { return false; } break; } if (_selectedCategoryIndex > 0) { QuestCategory val2 = (QuestCategory)(_selectedCategoryIndex - 1); if (q.Category != val2) { return false; } } if (!string.IsNullOrEmpty(_searchQuery)) { string value = _searchQuery.ToLowerInvariant(); bool num2 = q.Title.ToLowerInvariant().Contains(value); bool flag = q.CachedDescription.ToLowerInvariant().Contains(value); bool flag2 = q.QuestId.ToLowerInvariant().Contains(value); if (!num2 && !flag && !flag2) { return false; } } return true; }).ToList(); int count = list.Count; int num = _sortedModels.Count((QuestDataModel q) => q.IsAlmostDone(threshold)); int count2 = _pinnedQuestIds.Count; GUILayout.BeginHorizontal(Array.Empty()); GUILayout.Label($"Displaying {count} Quests • Pinned: {count2} • Almost Done: {num}", _footerStyle, Array.Empty()); GUILayout.FlexibleSpace(); GUILayout.Label("Press [Q] to cycle • Drag ◢ corner to resize", _footerStyle, Array.Empty()); GUILayout.EndHorizontal(); GUILayout.Space(6f); _scrollPos = GUILayout.BeginScrollView(_scrollPos, false, true, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandHeight(true) }); if (list.Count == 0) { GUILayout.Space(40f); GUILayout.BeginHorizontal(Array.Empty()); GUILayout.FlexibleSpace(); GUILayout.Label("No quests match your current filter.", _questTitleStyle, Array.Empty()); GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); } else { foreach (QuestDataModel item in list) { DrawPrettyQuestCard(item, threshold); GUILayout.Space(6f); } } GUILayout.EndScrollView(); GUI.DragWindow(new Rect(0f, 0f, width - 20f, 40f)); DrawWindowResizeGrip(ref _windowRect, ref _isResizingMain); } private void DrawWindowResizeGrip(ref Rect windowRect, ref bool isResizing) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0043: 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_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0063: 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_007a: 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) float num = 22f; Rect val = default(Rect); ((Rect)(ref val))..ctor(((Rect)(ref windowRect)).width - num - 2f, ((Rect)(ref windowRect)).height - num - 2f, num, num); GUI.Label(val, "◢", _resizeGripStyle); Event current = Event.current; if ((int)current.type == 0 && ((Rect)(ref val)).Contains(current.mousePosition)) { isResizing = true; _dragStartPos = GUIUtility.GUIToScreenPoint(current.mousePosition); _windowStartSize = new Vector2(((Rect)(ref windowRect)).width, ((Rect)(ref windowRect)).height); current.Use(); } } private bool DrawTabButton(string text, QuestTab tab) { GUIStyle val = ((_currentTab == tab) ? _tabActiveStyle : _tabStyle); return GUILayout.Button(text, val, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(28f) }); } private void DrawPrettyQuestCard(QuestDataModel quest, float threshold) { //IL_0248: Unknown result type (might be due to invalid IL or missing references) //IL_024d: Unknown result type (might be due to invalid IL or missing references) //IL_0253: Unknown result type (might be due to invalid IL or missing references) //IL_0259: Invalid comparison between Unknown and I4 //IL_025b: Unknown result type (might be due to invalid IL or missing references) //IL_0294: Unknown result type (might be due to invalid IL or missing references) GUILayout.BeginVertical(_cardBoxStyle, Array.Empty()); GUILayout.BeginHorizontal(Array.Empty()); if (quest.IsPinned) { GUILayout.Label("PINNED", _badgePinnedStyle, (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.ExpandWidth(false), GUILayout.Height(20f) }); GUILayout.Space(4f); } if (quest.IsCompleted || quest.IsRewarded) { GUILayout.Label("COMPLETED", _badgeCompletedStyle, (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.ExpandWidth(false), GUILayout.Height(20f) }); } else if (quest.Percent >= threshold) { GUILayout.Label($"ALMOST DONE ({quest.Percent * 100f:F0}%)", _badgeAlmostDoneStyle, (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.ExpandWidth(false), GUILayout.Height(20f) }); } else { GUILayout.Label($"ACTIVE ({quest.Percent * 100f:F0}%)", _badgeActiveStyle, (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.ExpandWidth(false), GUILayout.Height(20f) }); } GUILayout.Space(6f); GUILayout.Label(quest.Title, _questTitleStyle, Array.Empty()); GUILayout.FlexibleSpace(); GUIStyle val = (quest.IsPinned ? _pinButtonActiveStyle : _pinButtonStyle); if (GUILayout.Button(quest.IsPinned ? "[PINNED]" : "[PIN]", val, (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.Width(65f), GUILayout.Height(20f) })) { TogglePinQuest(quest.QuestId); } GUILayout.Space(8f); GUILayout.Label($"{quest.CurrentProgress} / {quest.RequiredProgress}", _questRatioStyle, Array.Empty()); GUILayout.EndHorizontal(); GUILayout.Space(3f); if (!string.IsNullOrEmpty(quest.CachedDescription)) { GUILayout.Label(quest.CachedDescription, _questDescStyle, Array.Empty()); GUILayout.Space(4f); } Rect rect = GUILayoutUtility.GetRect(GUIContent.none, GUIStyle.none, (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.Height(8f), GUILayout.ExpandWidth(true) }); if ((int)Event.current.type == 7) { GUI.DrawTexture(rect, (Texture)(object)_barBgTexture); float num = ((Rect)(ref rect)).width * quest.Percent; if (num > 0f) { Rect val2 = new Rect(((Rect)(ref rect)).x, ((Rect)(ref rect)).y, num, ((Rect)(ref rect)).height); Texture2D val3 = ((quest.IsCompleted || quest.IsRewarded) ? _barFillCompletedTexture : ((quest.Percent >= threshold) ? _barFillAlmostDoneTexture : _barFillActiveTexture)); GUI.DrawTexture(val2, (Texture)(object)val3); } } GUILayout.EndVertical(); } private void InitStylesIfNeeded() { //IL_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_0100: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0135: 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_0176: Unknown result type (might be due to invalid IL or missing references) //IL_018f: Unknown result type (might be due to invalid IL or missing references) //IL_01b7: Unknown result type (might be due to invalid IL or missing references) //IL_01d0: Unknown result type (might be due to invalid IL or missing references) //IL_0233: Unknown result type (might be due to invalid IL or missing references) //IL_023f: Unknown result type (might be due to invalid IL or missing references) //IL_024b: Unknown result type (might be due to invalid IL or missing references) //IL_02b8: Unknown result type (might be due to invalid IL or missing references) //IL_02c2: Expected O, but got Unknown //IL_02d0: Unknown result type (might be due to invalid IL or missing references) //IL_02da: Expected O, but got Unknown //IL_0398: Unknown result type (might be due to invalid IL or missing references) //IL_03c0: Unknown result type (might be due to invalid IL or missing references) //IL_03d9: Unknown result type (might be due to invalid IL or missing references) //IL_0401: Unknown result type (might be due to invalid IL or missing references) //IL_041a: Unknown result type (might be due to invalid IL or missing references) //IL_0441: Unknown result type (might be due to invalid IL or missing references) //IL_0468: Unknown result type (might be due to invalid IL or missing references) //IL_048f: Unknown result type (might be due to invalid IL or missing references) //IL_04b6: Unknown result type (might be due to invalid IL or missing references) //IL_04dd: Unknown result type (might be due to invalid IL or missing references) //IL_0504: Unknown result type (might be due to invalid IL or missing references) //IL_051e: Unknown result type (might be due to invalid IL or missing references) //IL_0528: Expected O, but got Unknown //IL_0562: Unknown result type (might be due to invalid IL or missing references) //IL_056c: Expected O, but got Unknown //IL_0577: Unknown result type (might be due to invalid IL or missing references) //IL_0581: Expected O, but got Unknown //IL_05b9: Unknown result type (might be due to invalid IL or missing references) //IL_05c3: Expected O, but got Unknown //IL_05ce: Unknown result type (might be due to invalid IL or missing references) //IL_05d8: Expected O, but got Unknown //IL_0610: Unknown result type (might be due to invalid IL or missing references) //IL_0625: Unknown result type (might be due to invalid IL or missing references) //IL_062f: Expected O, but got Unknown //IL_065b: Unknown result type (might be due to invalid IL or missing references) //IL_0670: Unknown result type (might be due to invalid IL or missing references) //IL_067a: Expected O, but got Unknown //IL_0692: Unknown result type (might be due to invalid IL or missing references) //IL_06a6: Unknown result type (might be due to invalid IL or missing references) //IL_06b0: Expected O, but got Unknown //IL_06d8: Unknown result type (might be due to invalid IL or missing references) //IL_06dd: Unknown result type (might be due to invalid IL or missing references) //IL_0703: Unknown result type (might be due to invalid IL or missing references) //IL_0708: Unknown result type (might be due to invalid IL or missing references) //IL_0742: Unknown result type (might be due to invalid IL or missing references) //IL_0747: Unknown result type (might be due to invalid IL or missing references) //IL_076d: Unknown result type (might be due to invalid IL or missing references) //IL_0772: Unknown result type (might be due to invalid IL or missing references) //IL_07ac: Unknown result type (might be due to invalid IL or missing references) //IL_07b1: Unknown result type (might be due to invalid IL or missing references) //IL_07d7: Unknown result type (might be due to invalid IL or missing references) //IL_07dc: Unknown result type (might be due to invalid IL or missing references) //IL_07f9: Unknown result type (might be due to invalid IL or missing references) //IL_0803: Expected O, but got Unknown //IL_0825: Unknown result type (might be due to invalid IL or missing references) //IL_082f: Expected O, but got Unknown //IL_083a: Unknown result type (might be due to invalid IL or missing references) //IL_0844: Expected O, but got Unknown //IL_0868: Unknown result type (might be due to invalid IL or missing references) //IL_087d: Unknown result type (might be due to invalid IL or missing references) //IL_0887: Expected O, but got Unknown //IL_08bf: Unknown result type (might be due to invalid IL or missing references) //IL_08d4: Unknown result type (might be due to invalid IL or missing references) //IL_08de: Expected O, but got Unknown //IL_090a: Unknown result type (might be due to invalid IL or missing references) //IL_091f: Unknown result type (might be due to invalid IL or missing references) //IL_0929: Expected O, but got Unknown //IL_0955: Unknown result type (might be due to invalid IL or missing references) //IL_0975: Unknown result type (might be due to invalid IL or missing references) //IL_097a: Unknown result type (might be due to invalid IL or missing references) //IL_099f: Unknown result type (might be due to invalid IL or missing references) //IL_09a4: Unknown result type (might be due to invalid IL or missing references) //IL_09c9: Unknown result type (might be due to invalid IL or missing references) //IL_09ce: Unknown result type (might be due to invalid IL or missing references) //IL_09f3: Unknown result type (might be due to invalid IL or missing references) //IL_09f8: Unknown result type (might be due to invalid IL or missing references) //IL_0a12: Unknown result type (might be due to invalid IL or missing references) //IL_0a1c: Expected O, but got Unknown //IL_0a54: Unknown result type (might be due to invalid IL or missing references) //IL_0a69: Unknown result type (might be due to invalid IL or missing references) //IL_0a73: Expected O, but got Unknown //IL_0a97: Unknown result type (might be due to invalid IL or missing references) //IL_0aac: Unknown result type (might be due to invalid IL or missing references) //IL_0ab6: Expected O, but got Unknown //IL_0ae2: Unknown result type (might be due to invalid IL or missing references) //IL_0af7: Unknown result type (might be due to invalid IL or missing references) //IL_0b01: Expected O, but got Unknown //IL_0b39: Unknown result type (might be due to invalid IL or missing references) if (!_stylesInitialized || !((Object)(object)_bgTexture != (Object)null) || !((Object)(object)_barFillAlmostDoneTexture != (Object)null) || !((Object)(object)_cardBgTexture != (Object)null) || !((Object)(object)_tabActiveTex != (Object)null) || !((Object)(object)_pinActiveTex != (Object)null)) { _stylesInitialized = true; Color col = default(Color); ((Color)(ref col))..ctor(0.06f, 0.08f, 0.12f, 0.95f); Color col2 = default(Color); ((Color)(ref col2))..ctor(0.05f, 0.07f, 0.1f, 0.92f); Color bg = default(Color); ((Color)(ref bg))..ctor(0.09f, 0.11f, 0.16f, 0.92f); Color border = default(Color); ((Color)(ref border))..ctor(0.18f, 0.22f, 0.3f, 0.8f); Color col3 = default(Color); ((Color)(ref col3))..ctor(0.14f, 0.17f, 0.23f, 1f); _bgTexture = MakeTex(2, 2, col); _hudBgTexture = MakeTex(2, 2, col2); _cardBgTexture = MakeBorderTex(4, 4, bg, border, 1); _barBgTexture = MakeTex(2, 2, col3); _barFillAlmostDoneTexture = MakeGradientTex(2, 16, new Color(1f, 0.75f, 0.15f, 1f), new Color(0.95f, 0.5f, 0.05f, 1f)); _barFillActiveTexture = MakeGradientTex(2, 16, new Color(0.1f, 0.7f, 1f, 1f), new Color(0.05f, 0.45f, 0.85f, 1f)); _barFillCompletedTexture = MakeGradientTex(2, 16, new Color(0.15f, 0.85f, 0.4f, 1f), new Color(0.05f, 0.6f, 0.25f, 1f)); Color col4 = default(Color); ((Color)(ref col4))..ctor(0.08f, 0.1f, 0.16f, 0.85f); Color col5 = default(Color); ((Color)(ref col5))..ctor(0.24f, 0.35f, 0.52f, 0.9f); Color col6 = default(Color); ((Color)(ref col6))..ctor(0.95f, 0.72f, 0.15f, 1f); Texture2D background = MakeTex(2, 2, col4); Texture2D background2 = MakeTex(2, 2, col5); Texture2D background3 = MakeTex(2, 2, col6); GUI.skin.verticalScrollbar.normal.background = background; GUI.skin.verticalScrollbar.hover.background = background; GUI.skin.verticalScrollbar.active.background = background; GUI.skin.verticalScrollbar.fixedWidth = 14f; GUI.skin.verticalScrollbar.margin = new RectOffset(0, 0, 0, 0); GUI.skin.verticalScrollbar.padding = new RectOffset(1, 1, 1, 1); GUI.skin.verticalScrollbarThumb.normal.background = background2; GUI.skin.verticalScrollbarThumb.hover.background = background3; GUI.skin.verticalScrollbarThumb.active.background = background3; GUI.skin.verticalScrollbarThumb.fixedWidth = 12f; GUI.skin.verticalScrollbarUpButton.fixedWidth = 0f; GUI.skin.verticalScrollbarUpButton.fixedHeight = 0f; GUI.skin.verticalScrollbarDownButton.fixedWidth = 0f; GUI.skin.verticalScrollbarDownButton.fixedHeight = 0f; _tabInactiveTex = MakeTex(2, 2, new Color(0.11f, 0.13f, 0.19f, 0.9f)); _tabHoverTex = MakeGradientTex(2, 16, new Color(0.18f, 0.24f, 0.36f, 1f), new Color(0.14f, 0.18f, 0.28f, 1f)); _tabActiveTex = MakeGradientTex(2, 16, new Color(0.2f, 0.45f, 0.85f, 1f), new Color(0.12f, 0.3f, 0.65f, 1f)); _pillInactiveTex = MakeTex(2, 2, new Color(0.11f, 0.13f, 0.18f, 0.7f)); _pillHoverTex = MakeTex(2, 2, new Color(0.2f, 0.26f, 0.38f, 0.9f)); _pillActiveTex = MakeTex(2, 2, new Color(0.95f, 0.72f, 0.15f, 0.95f)); _pinInactiveTex = MakeTex(2, 2, new Color(0.14f, 0.18f, 0.26f, 0.8f)); _pinHoverTex = MakeTex(2, 2, new Color(0.3f, 0.4f, 0.6f, 0.95f)); _pinActiveTex = MakeTex(2, 2, new Color(0.95f, 0.65f, 0.1f, 0.95f)); _windowStyle = new GUIStyle(GUI.skin.window); _windowStyle.normal.background = _bgTexture; _windowStyle.onNormal.background = _bgTexture; _windowStyle.padding = new RectOffset(14, 14, 12, 14); _hudWindowStyle = new GUIStyle(GUI.skin.window); _hudWindowStyle.normal.background = _hudBgTexture; _hudWindowStyle.onNormal.background = _hudBgTexture; _hudWindowStyle.padding = new RectOffset(10, 10, 8, 8); _headerTitleStyle = new GUIStyle(GUI.skin.label); _headerTitleStyle.fontSize = 17; _headerTitleStyle.fontStyle = (FontStyle)1; _headerTitleStyle.normal.textColor = new Color(1f, 0.82f, 0.25f, 1f); _headerSubStyle = new GUIStyle(GUI.skin.label); _headerSubStyle.fontSize = 11; _headerSubStyle.normal.textColor = new Color(0.68f, 0.74f, 0.82f, 1f); _searchStyle = new GUIStyle(GUI.skin.textField); _searchStyle.fontSize = 12; _searchStyle.normal.textColor = Color.white; _searchStyle.padding = new RectOffset(6, 6, 2, 2); _tabStyle = CreateCustomStyle(_tabInactiveTex, _tabHoverTex, _tabActiveTex, new Color(0.72f, 0.76f, 0.84f, 1f), Color.white, 12, isBold: false); _tabActiveStyle = CreateCustomStyle(_tabActiveTex, _tabActiveTex, _tabActiveTex, Color.white, Color.white, 12, isBold: true); _pillStyle = CreateCustomStyle(_pillInactiveTex, _pillHoverTex, _pillActiveTex, new Color(0.72f, 0.76f, 0.84f, 1f), Color.white, 11, isBold: false); _pillActiveStyle = CreateCustomStyle(_pillActiveTex, _pillActiveTex, _pillActiveTex, Color.black, Color.black, 11, isBold: true); _pinButtonStyle = CreateCustomStyle(_pinInactiveTex, _pinHoverTex, _pinActiveTex, new Color(0.75f, 0.8f, 0.9f, 1f), Color.white, 10, isBold: false); _pinButtonActiveStyle = CreateCustomStyle(_pinActiveTex, _pinActiveTex, _pinActiveTex, Color.black, Color.black, 10, isBold: true); _cardBoxStyle = new GUIStyle(GUI.skin.box); _cardBoxStyle.normal.background = _cardBgTexture; _cardBoxStyle.padding = new RectOffset(10, 10, 8, 8); _questTitleStyle = new GUIStyle(GUI.skin.label); _questTitleStyle.fontSize = 13; _questTitleStyle.fontStyle = (FontStyle)1; _questTitleStyle.normal.textColor = Color.white; _questRatioStyle = new GUIStyle(GUI.skin.label); _questRatioStyle.fontSize = 12; _questRatioStyle.fontStyle = (FontStyle)1; _questRatioStyle.normal.textColor = new Color(1f, 0.82f, 0.25f, 1f); _questDescStyle = new GUIStyle(GUI.skin.label); _questDescStyle.fontSize = 11; _questDescStyle.normal.textColor = new Color(0.78f, 0.82f, 0.88f, 1f); _footerStyle = new GUIStyle(GUI.skin.label); _footerStyle.fontSize = 10; _footerStyle.normal.textColor = new Color(0.65f, 0.7f, 0.78f, 1f); _badgeAlmostDoneStyle = MakeBadgeStyle(new Color(1f, 0.65f, 0.1f, 1f), Color.black); _badgeActiveStyle = MakeBadgeStyle(new Color(0.12f, 0.5f, 0.9f, 1f), Color.white); _badgeCompletedStyle = MakeBadgeStyle(new Color(0.15f, 0.75f, 0.35f, 1f), Color.black); _badgePinnedStyle = MakeBadgeStyle(new Color(0.95f, 0.65f, 0.1f, 1f), Color.black); _hudTitleStyle = new GUIStyle(GUI.skin.label); _hudTitleStyle.fontSize = 11; _hudTitleStyle.fontStyle = (FontStyle)1; _hudTitleStyle.normal.textColor = new Color(1f, 0.82f, 0.25f, 1f); _hudItemTitleStyle = new GUIStyle(GUI.skin.label); _hudItemTitleStyle.fontSize = 11; _hudItemTitleStyle.fontStyle = (FontStyle)1; _hudItemTitleStyle.normal.textColor = Color.white; _hudItemStyle = new GUIStyle(GUI.skin.label); _hudItemStyle.fontSize = 10; _hudItemStyle.normal.textColor = new Color(0.85f, 0.88f, 0.92f, 1f); _resizeGripStyle = new GUIStyle(GUI.skin.label); _resizeGripStyle.fontSize = 14; _resizeGripStyle.alignment = (TextAnchor)8; _resizeGripStyle.normal.textColor = new Color(0.65f, 0.72f, 0.85f, 0.8f); } } private GUIStyle CreateCustomStyle(Texture2D normalTex, Texture2D hoverTex, Texture2D activeTex, Color normalTextCol, Color hoverTextCol, int fontSize, bool isBold) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Expected O, but got Unknown //IL_005e: 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_0085: 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) //IL_009f: Unknown result type (might be due to invalid IL or missing references) GUIStyle val = new GUIStyle(GUI.skin.button); val.normal.background = normalTex; val.hover.background = hoverTex; val.active.background = activeTex; val.onNormal.background = normalTex; val.onHover.background = hoverTex; val.onActive.background = activeTex; val.normal.textColor = normalTextCol; val.hover.textColor = hoverTextCol; val.active.textColor = hoverTextCol; val.onNormal.textColor = normalTextCol; val.onHover.textColor = hoverTextCol; val.onActive.textColor = hoverTextCol; val.fontSize = fontSize; if (isBold) { val.fontStyle = (FontStyle)1; } val.alignment = (TextAnchor)4; val.wordWrap = false; return val; } private GUIStyle MakeBadgeStyle(Color bg, Color text) { //IL_000a: 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_0018: 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_0029: 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_0037: 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_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_0054: Expected O, but got Unknown //IL_0054: 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_0063: Expected O, but got Unknown GUIStyle val = new GUIStyle(GUI.skin.label); val.normal.background = MakeTex(2, 2, bg); val.normal.textColor = text; val.fontSize = 10; val.fontStyle = (FontStyle)1; val.alignment = (TextAnchor)4; val.padding = new RectOffset(6, 6, 2, 2); val.wordWrap = false; val.clipping = (TextClipping)1; return val; } private Texture2D MakeTex(int width, int height, Color col) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) Texture2D val = new Texture2D(width, height); ((Object)val).hideFlags = (HideFlags)32; Color[] array = (Color[])(object)new Color[width * height]; for (int i = 0; i < array.Length; i++) { array[i] = col; } val.SetPixels(array); val.Apply(); return val; } private Texture2D MakeGradientTex(int width, int height, Color top, Color bottom) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_0027: 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_002e: 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_003e: Unknown result type (might be due to invalid IL or missing references) Texture2D val = new Texture2D(width, height); ((Object)val).hideFlags = (HideFlags)32; Color[] array = (Color[])(object)new Color[width * height]; for (int i = 0; i < height; i++) { float num = (float)i / (float)(height - 1); Color val2 = Color.Lerp(bottom, top, num); for (int j = 0; j < width; j++) { array[i * width + j] = val2; } } val.SetPixels(array); val.Apply(); return val; } private Texture2D MakeBorderTex(int width, int height, Color bg, Color border, int borderWidth) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_004e: 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) //IL_0050: Unknown result type (might be due to invalid IL or missing references) Texture2D val = new Texture2D(width, height); ((Object)val).hideFlags = (HideFlags)32; Color[] array = (Color[])(object)new Color[width * height]; for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { bool flag = j < borderWidth || j >= width - borderWidth || i < borderWidth || i >= height - borderWidth; array[i * width + j] = (flag ? border : bg); } } val.SetPixels(array); val.Apply(); return val; } private void OnDestroy() { try { if ((Object)(object)QuestService.I != (Object)null) { QuestService.I.OnProgressChanged -= OnQuestProgressUpdated; QuestService.I.OnQuestCompleted -= OnQuestProgressUpdated; } } catch { } } } }