Decompiled source of TrackCrafts v1.1.1
BepInEx\plugins\TrackCrafts.dll
Decompiled a day ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using BepInEx; using BepInEx.Core.Logging.Interpolation; using BepInEx.Logging; using BepInEx.Unity.IL2CPP; using HarmonyLib; using Il2CppInterop.Runtime.Injection; using Il2CppInterop.Runtime.InteropTypes.Arrays; using Il2CppSystem.Collections.Generic; using Microsoft.CodeAnalysis; using ProjectM; using ProjectM.Network; using ProjectM.UI; using Stunlock.Core; using TrackCrafts.Core; using TrackCrafts.Services; using TrackCrafts.UI; using Unity.Collections; using Unity.Entities; using UnityEngine; using UnityEngine.EventSystems; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: AssemblyCompany("TrackCrafts")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("TrackCrafts")] [assembly: AssemblyTitle("TrackCrafts")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.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 TrackCrafts { [BepInPlugin("com.armanckeser.TrackCrafts", "TrackCrafts", "1.1.1")] public class Plugin : BasePlugin { public static ManualLogSource Log; public static Plugin Instance; public static TrackCraftManager Manager; public static Dictionary<int, string> PrefabNames = new Dictionary<int, string>(); private Harmony _harmony; public static KeyCode ToggleHudKey = (KeyCode)283; public static KeyCode ClearAllKey = (KeyCode)282; public override void Load() { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Expected O, but got Unknown Instance = this; Log = ((BasePlugin)this).Log; ManualLogSource log = Log; bool flag = default(bool); BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(24, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("TrackCrafts v"); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>("1.1.1"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" loading..."); } log.LogInfo(val); LoadPrefabNames(); Manager = new TrackCraftManager(); _harmony = new Harmony("com.armanckeser.TrackCrafts"); _harmony.PatchAll(typeof(Plugin).Assembly); Log.LogInfo((object)"Registering IL2CPP types..."); ClassInjector.RegisterTypeInIl2Cpp<TrackCraftHUD>(); ClassInjector.RegisterTypeInIl2Cpp<InputHandler>(); Log.LogInfo((object)"IL2CPP types registered."); ((BasePlugin)this).AddComponent<TrackCraftHUD>(); ((BasePlugin)this).AddComponent<InputHandler>(); Log.LogInfo((object)"TrackCrafts loaded successfully."); } public override bool Unload() { Harmony harmony = _harmony; if (harmony != null) { harmony.UnpatchSelf(); } return true; } private void LoadPrefabNames() { //IL_012a: Unknown result type (might be due to invalid IL or missing references) //IL_0131: Expected O, but got Unknown //IL_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Expected O, but got Unknown bool flag = default(bool); try { string path = Path.Combine(Path.GetDirectoryName(typeof(Plugin).Assembly.Location), "TrackCrafts_names.json"); if (!File.Exists(path)) { Log.LogWarning((object)"TrackCrafts_names.json not found. Item names will use prefab names."); return; } foreach (string item in SplitJsonPairs(File.ReadAllText(path).Trim().TrimStart('{') .TrimEnd('}'))) { string[] array = item.Split(new char[1] { ':' }, 2); if (array.Length == 2) { string s = array[0].Trim().Trim('"'); string value = array[1].Trim().Trim('"'); if (int.TryParse(s, out var result)) { PrefabNames[result] = value; } } } ManualLogSource log = Log; BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(21, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Loaded "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted<int>(PrefabNames.Count); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" prefab names."); } log.LogInfo(val); } catch (Exception ex) { ManualLogSource log2 = Log; BepInExWarningLogInterpolatedStringHandler val2 = new BepInExWarningLogInterpolatedStringHandler(29, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("Failed to load prefab names: "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(ex.Message); } log2.LogWarning(val2); } } private static List<string> SplitJsonPairs(string json) { List<string> list = new List<string>(); int num = 0; int num2 = 0; bool flag = false; for (int i = 0; i < json.Length; i++) { char c = json[i]; if (c == '"' && (i == 0 || json[i - 1] != '\\')) { flag = !flag; } if (flag) { continue; } switch (c) { case '{': num++; break; case '}': num--; break; case ',': if (num == 0) { list.Add(json.Substring(num2, i - num2)); num2 = i + 1; } break; } } if (num2 < json.Length) { list.Add(json.Substring(num2)); } return list; } public static bool TryPinRecipeFromEntry(GameObject entryObject) { //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) try { if ((Object)(object)entryObject == (Object)null || Manager == null) { return false; } Manager.EnsureInitialized(); if (!TryResolveRecipeGuid(entryObject, out var recipeGuid, out var source)) { LogInfo("[Mouse3] No recipe guid on clicked UI entry: " + ((Object)entryObject).name); return false; } if (TryBuildRefinementModel(entryObject, recipeGuid, out var model)) { Manager.AddOrReplace(model); LogInfo("[Mouse3] Recipe tracked " + recipeGuid._Value + " from " + source + " (refinement-ui)"); return true; } if (!IconResolver.IsValidRecipeGuid(recipeGuid)) { LogWarning("[Mouse3] Invalid recipe guid from " + source + ": " + recipeGuid._Value); return false; } if (Manager.GetRecipe(recipeGuid) == null) { Manager.AddRecipe(recipeGuid); } ApplyUiIconFallback(entryObject, recipeGuid); LogInfo("[Mouse3] Recipe tracked " + recipeGuid._Value + " from " + source); return true; } catch (Exception ex) { LogError("[Mouse3] Pin from UI entry failed: " + ex.Message); return false; } } private static bool TryResolveRecipeGuid(GameObject entryObject, out PrefabGUID recipeGuid, out string source) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0091: 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) recipeGuid = default(PrefabGUID); source = "unknown"; WorkstationRecipeGridSelectionEntry componentInParent = entryObject.GetComponentInParent<WorkstationRecipeGridSelectionEntry>(); if ((Object)(object)componentInParent != (Object)null && componentInParent.EntryId._Value != 0) { recipeGuid = componentInParent.EntryId; source = "WorkstationRecipeGridSelectionEntry.EntryId"; return true; } RefinementstationRecipeEntry componentInParent2 = entryObject.GetComponentInParent<RefinementstationRecipeEntry>(); if ((Object)(object)componentInParent2 != (Object)null && componentInParent2.EntryId._Value != 0) { recipeGuid = componentInParent2.EntryId; source = "RefinementstationRecipeEntry.EntryId"; return true; } RefinementstationRecipeItem componentInParent3 = entryObject.GetComponentInParent<RefinementstationRecipeItem>(); if ((Object)(object)componentInParent3 != (Object)null && componentInParent3.Guid._Value != 0) { recipeGuid = componentInParent3.Guid; source = "RefinementstationRecipeItem.Guid"; return true; } return false; } private static bool TryBuildRefinementModel(GameObject entryObject, PrefabGUID recipeGuid, out TrackedRecipeModel model) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_0331: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_046b: Unknown result type (might be due to invalid IL or missing references) //IL_0243: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0142: Unknown result type (might be due to invalid IL or missing references) //IL_0280: Unknown result type (might be due to invalid IL or missing references) //IL_0151: Unknown result type (might be due to invalid IL or missing references) //IL_02a3: Unknown result type (might be due to invalid IL or missing references) //IL_015b: Unknown result type (might be due to invalid IL or missing references) //IL_0165: Unknown result type (might be due to invalid IL or missing references) //IL_02ec: Unknown result type (might be due to invalid IL or missing references) //IL_02f9: Unknown result type (might be due to invalid IL or missing references) //IL_03ca: Unknown result type (might be due to invalid IL or missing references) //IL_03d6: Unknown result type (might be due to invalid IL or missing references) //IL_019b: Unknown result type (might be due to invalid IL or missing references) model = null; try { RefinementstationRecipeEntry componentInParent = entryObject.GetComponentInParent<RefinementstationRecipeEntry>(); if ((Object)(object)componentInParent == (Object)null) { return false; } RefinementstationRecipeItem componentInParent2 = entryObject.GetComponentInParent<RefinementstationRecipeItem>(); PrefabGUID val = default(PrefabGUID); Sprite val2 = null; if ((Object)(object)componentInParent2 != (Object)null && componentInParent2.Guid._Value != 0 && (Object)(object)componentInParent.OutputParent != (Object)null && ((Component)componentInParent2).transform.IsChildOf(((Component)componentInParent.OutputParent).transform)) { val = componentInParent2.Guid; if ((Object)(object)componentInParent2.Icon != (Object)null) { val2 = componentInParent2.Icon.sprite; } } model = new TrackedRecipeModel { RecipePrefabGuid = recipeGuid, Quantity = 1 }; try { if ((Object)(object)componentInParent.RecipeName != (Object)null) { string text = componentInParent.RecipeName.GetText(); if (!string.IsNullOrWhiteSpace(text)) { model.RecipeName = text.Trim(); } } } catch { } try { if (val._Value != 0) { model.RecipeName = IconResolver.GetCleanItemName(val); if ((Object)(object)val2 != (Object)null) { model.RecipeIcon = IconResolver.SpriteToTexture2D(val2); } } if ((Object)(object)componentInParent.OutputParent != (Object)null) { Il2CppArrayBase<RefinementstationRecipeItem> componentsInChildren = ((Component)componentInParent.OutputParent).GetComponentsInChildren<RefinementstationRecipeItem>(true); for (int i = 0; i < componentsInChildren.Length; i++) { RefinementstationRecipeItem val3 = componentsInChildren[i]; if ((Object)(object)val3 == (Object)null || val3.Guid._Value == 0) { continue; } bool flag = val._Value != 0 && val3.Guid._Value == val._Value; if (flag || string.IsNullOrWhiteSpace(model.RecipeName) || model.RecipeName == "Unknown Recipe") { model.RecipeName = IconResolver.GetCleanItemName(val3.Guid); if ((Object)(object)val3.Icon != (Object)null && (Object)(object)val3.Icon.sprite != (Object)null) { model.RecipeIcon = IconResolver.SpriteToTexture2D(val3.Icon.sprite); } if (flag) { break; } } } } } catch { } if ((Object)(object)componentInParent.InputParent != (Object)null) { Il2CppArrayBase<RefinementstationRecipeItem> componentsInChildren2 = ((Component)componentInParent.InputParent).GetComponentsInChildren<RefinementstationRecipeItem>(true); for (int j = 0; j < componentsInChildren2.Length; j++) { RefinementstationRecipeItem val4 = componentsInChildren2[j]; if ((Object)(object)val4 == (Object)null || val4.Guid._Value == 0) { continue; } int num = ParseCountFromRefinementItem(val4); Texture2D icon = (((Object)(object)val4.Icon != (Object)null && (Object)(object)val4.Icon.sprite != (Object)null) ? IconResolver.SpriteToTexture2D(val4.Icon.sprite) : IconResolver.GetItemIconViaGameData(val4.Guid)); IngredientModel ingredientModel = FindIngredient(model, val4.Guid); if (ingredientModel != null) { ingredientModel.AmountPerCraft += num; if ((Object)(object)ingredientModel.Icon == (Object)null) { ingredientModel.Icon = icon; } } else { model.Ingredients.Add(new IngredientModel { ItemPrefabGuid = val4.Guid, ItemName = IconResolver.GetCleanItemName(val4.Guid), Icon = icon, AmountPerCraft = num }); } } } TrackedRecipeModel trackedRecipeModel = RecipeLookup.BuildTrackedRecipe(recipeGuid); if (trackedRecipeModel != null) { if ((string.IsNullOrWhiteSpace(model.RecipeName) || model.RecipeName == "Unknown Recipe") && !string.IsNullOrWhiteSpace(trackedRecipeModel.RecipeName)) { model.RecipeName = trackedRecipeModel.RecipeName; } if ((Object)(object)model.RecipeIcon == (Object)null) { model.RecipeIcon = trackedRecipeModel.RecipeIcon; } for (int k = 0; k < model.Ingredients.Count; k++) { IngredientModel ingredientModel2 = model.Ingredients[k]; for (int l = 0; l < trackedRecipeModel.Ingredients.Count; l++) { IngredientModel ingredientModel3 = trackedRecipeModel.Ingredients[l]; if (ingredientModel2.ItemPrefabGuid._Value == ingredientModel3.ItemPrefabGuid._Value) { if (ingredientModel2.AmountPerCraft < ingredientModel3.AmountPerCraft) { model.HasFloorBonus = true; } if ((Object)(object)ingredientModel2.Icon == (Object)null) { ingredientModel2.Icon = ingredientModel3.Icon; } break; } } } } if (string.IsNullOrWhiteSpace(model.RecipeName) || model.RecipeName == "Unknown Recipe") { model.RecipeName = IconResolver.GetCleanItemName(recipeGuid); } if (model.Ingredients.Count == 0) { return false; } model.Recalculate(InventoryQuery.GetPlayerItemCounts()); return true; } catch (Exception ex) { LogWarning("[Mouse3] Refinement model build failed: " + ex.Message); model = null; return false; } } private static IngredientModel FindIngredient(TrackedRecipeModel model, PrefabGUID guid) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) if (model == null) { return null; } for (int i = 0; i < model.Ingredients.Count; i++) { if (model.Ingredients[i].ItemPrefabGuid._Value == guid._Value) { return model.Ingredients[i]; } } return null; } private static int ParseCountFromRefinementItem(RefinementstationRecipeItem item) { try { if ((Object)(object)item != (Object)null && (Object)(object)item.Count != (Object)null) { string text = item.Count.GetText(); if (!string.IsNullOrEmpty(text)) { StringBuilder stringBuilder = new StringBuilder(text.Length); foreach (char c in text) { if (c >= '0' && c <= '9') { stringBuilder.Append(c); } } if (stringBuilder.Length > 0 && int.TryParse(stringBuilder.ToString(), out var result) && result > 0) { return result; } } } } catch { } return 1; } private static void ApplyUiIconFallback(GameObject entryObject, PrefabGUID recipeGuid) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Unknown result type (might be due to invalid IL or missing references) //IL_0183: 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) try { if (Manager == null) { return; } TrackedRecipeModel recipe = Manager.GetRecipe(recipeGuid); if (recipe == null) { return; } if ((Object)(object)recipe.RecipeIcon == (Object)null) { Sprite val = null; WorkstationRecipeGridSelectionEntry componentInParent = entryObject.GetComponentInParent<WorkstationRecipeGridSelectionEntry>(); if ((Object)(object)componentInParent != (Object)null && (Object)(object)componentInParent.ItemIcon != (Object)null) { val = componentInParent.ItemIcon.sprite; } if ((Object)(object)val == (Object)null) { RefinementstationRecipeItem componentInParent2 = entryObject.GetComponentInParent<RefinementstationRecipeItem>(); if ((Object)(object)componentInParent2 != (Object)null && (Object)(object)componentInParent2.Icon != (Object)null) { val = componentInParent2.Icon.sprite; } } if ((Object)(object)val != (Object)null) { recipe.RecipeIcon = IconResolver.SpriteToTexture2D(val); } } WorkstationRecipeGridSelectionEntry componentInParent3 = entryObject.GetComponentInParent<WorkstationRecipeGridSelectionEntry>(); if ((Object)(object)componentInParent3 != (Object)null) { TryApplyWorkstationRequirementIcons(componentInParent3, recipe); } TryApplyVisibleRequirementIcons(entryObject, recipe); RefinementstationRecipeEntry componentInParent4 = entryObject.GetComponentInParent<RefinementstationRecipeEntry>(); if (!((Object)(object)componentInParent4 != (Object)null) || !((Object)(object)componentInParent4.InputParent != (Object)null)) { return; } Il2CppArrayBase<RefinementstationRecipeItem> componentsInChildren = ((Component)componentInParent4.InputParent).GetComponentsInChildren<RefinementstationRecipeItem>(true); for (int i = 0; i < componentsInChildren.Length; i++) { RefinementstationRecipeItem val2 = componentsInChildren[i]; if ((Object)(object)val2 == (Object)null || val2.Guid._Value == 0 || (Object)(object)val2.Icon == (Object)null || (Object)(object)val2.Icon.sprite == (Object)null) { continue; } Texture2D val3 = IconResolver.SpriteToTexture2D(val2.Icon.sprite); if ((Object)(object)val3 == (Object)null) { continue; } for (int j = 0; j < recipe.Ingredients.Count; j++) { if (recipe.Ingredients[j].ItemPrefabGuid._Value == val2.Guid._Value && (Object)(object)recipe.Ingredients[j].Icon == (Object)null) { recipe.Ingredients[j].Icon = val3; break; } } } } catch { } } private static void TryApplyWorkstationRequirementIcons(WorkstationRecipeGridSelectionEntry wsEntry, TrackedRecipeModel tracked) { try { if ((Object)(object)wsEntry == (Object)null || tracked == null || tracked.Ingredients.Count == 0 || wsEntry.Requirements == null) { return; } bool[] array = new bool[tracked.Ingredients.Count]; bool flag = false; bool flag2 = false; int count = wsEntry.Requirements.Count; for (int i = 0; i < count; i++) { CostData val = wsEntry.Requirements[i]; if ((Object)(object)val.ItemSprite == (Object)null) { continue; } Texture2D val2 = IconResolver.SpriteToTexture2D(val.ItemSprite); if ((Object)(object)val2 == (Object)null) { continue; } int num = -1; for (int j = 0; j < tracked.Ingredients.Count; j++) { if (!array[j] && tracked.Ingredients[j].AmountPerCraft == val.Amount) { num = j; break; } } if (num < 0 && i < tracked.Ingredients.Count && !array[i]) { num = i; } if (num < 0) { for (int k = 0; k < tracked.Ingredients.Count; k++) { if (!array[k] && (Object)(object)tracked.Ingredients[k].Icon == (Object)null) { num = k; break; } } } if (num < 0) { continue; } IngredientModel ingredientModel = tracked.Ingredients[num]; ingredientModel.Icon = val2; if (val.Amount > 0 && ingredientModel.AmountPerCraft > 0) { if (val.Amount < ingredientModel.AmountPerCraft) { flag2 = true; } if (val.Amount <= ingredientModel.AmountPerCraft && val.Amount != ingredientModel.AmountPerCraft) { ingredientModel.AmountPerCraft = val.Amount; flag = true; } } array[num] = true; } bool flag3 = tracked.HasFloorBonus != flag2; tracked.HasFloorBonus = flag2; if (flag || flag3) { tracked.Recalculate(InventoryQuery.GetPlayerItemCounts()); } LogInfo("[Mouse3] Workstation UI costs applied: recipe=" + tracked.RecipeName + ", floorBonus=" + tracked.HasFloorBonus + ", amountsChanged=" + flag + ", requirements=" + count); } catch { } } private static void TryApplyVisibleRequirementIcons(GameObject entryObject, TrackedRecipeModel tracked) { try { if ((Object)(object)entryObject == (Object)null || tracked == null || tracked.Ingredients.Count == 0) { return; } Transform root = entryObject.transform.root; if ((Object)(object)root == (Object)null) { return; } List<(string, Texture2D)> list = new List<(string, Texture2D)>(); Il2CppArrayBase<RequirementEntry> componentsInChildren = ((Component)root).GetComponentsInChildren<RequirementEntry>(true); for (int i = 0; i < componentsInChildren.Length; i++) { RequirementEntry val = componentsInChildren[i]; if ((Object)(object)val == (Object)null || (Object)(object)val.Icon == (Object)null || (Object)(object)val.Icon.sprite == (Object)null) { continue; } Texture2D val2 = IconResolver.SpriteToTexture2D(val.Icon.sprite); if ((Object)(object)val2 == (Object)null) { continue; } string item = ""; try { if ((Object)(object)val.Name != (Object)null) { item = val.Name.GetText(); } } catch { } list.Add((item, val2)); } Il2CppArrayBase<WorkstationRequirementEntry> componentsInChildren2 = ((Component)root).GetComponentsInChildren<WorkstationRequirementEntry>(true); for (int j = 0; j < componentsInChildren2.Length; j++) { WorkstationRequirementEntry val3 = componentsInChildren2[j]; if ((Object)(object)val3 == (Object)null || (Object)(object)val3.Icon == (Object)null || (Object)(object)val3.Icon.sprite == (Object)null) { continue; } Texture2D val4 = IconResolver.SpriteToTexture2D(val3.Icon.sprite); if ((Object)(object)val4 == (Object)null) { continue; } string item2 = ""; try { if ((Object)(object)val3.Name != (Object)null) { item2 = val3.Name.GetText(); } } catch { } list.Add((item2, val4)); } Il2CppArrayBase<RecipeRequirementEntry> componentsInChildren3 = ((Component)root).GetComponentsInChildren<RecipeRequirementEntry>(true); for (int k = 0; k < componentsInChildren3.Length; k++) { RecipeRequirementEntry val5 = componentsInChildren3[k]; if ((Object)(object)val5 == (Object)null || (Object)(object)val5.ItemIcon == (Object)null || (Object)(object)val5.ItemIcon.sprite == (Object)null) { continue; } Texture2D val6 = IconResolver.SpriteToTexture2D(val5.ItemIcon.sprite); if ((Object)(object)val6 == (Object)null) { continue; } string item3 = ""; try { if ((Object)(object)val5.ItemNameText != (Object)null) { item3 = val5.ItemNameText.GetText(); } } catch { } list.Add((item3, val6)); } if (list.Count == 0) { return; } bool[] array = new bool[list.Count]; for (int l = 0; l < tracked.Ingredients.Count; l++) { if ((Object)(object)tracked.Ingredients[l].Icon != (Object)null) { continue; } string text = NormalizeItemName(tracked.Ingredients[l].ItemName); if (string.IsNullOrEmpty(text)) { continue; } for (int m = 0; m < list.Count; m++) { if (!array[m]) { string text2 = NormalizeItemName(list[m].Item1); if (!string.IsNullOrEmpty(text2) && (text == text2 || text.Contains(text2) || text2.Contains(text))) { tracked.Ingredients[l].Icon = list[m].Item2; array[m] = true; break; } } } } } catch { } } private static string NormalizeItemName(string value) { if (string.IsNullOrWhiteSpace(value)) { return string.Empty; } StringBuilder stringBuilder = new StringBuilder(value.Length); foreach (char c in value) { if (char.IsLetterOrDigit(c)) { stringBuilder.Append(char.ToLowerInvariant(c)); } } return stringBuilder.ToString(); } public static void LogInfo(string msg) { ManualLogSource log = Log; if (log != null) { log.LogInfo((object)msg); } } public static void LogWarning(string msg) { ManualLogSource log = Log; if (log != null) { log.LogWarning((object)msg); } } public static void LogError(string msg) { ManualLogSource log = Log; if (log != null) { log.LogError((object)msg); } } } public static class MyPluginInfo { public const string PLUGIN_GUID = "com.armanckeser.TrackCrafts"; public const string PLUGIN_NAME = "TrackCrafts"; public const string PLUGIN_VERSION = "1.1.1"; } public class InputHandler : MonoBehaviour { public static bool HudVisible = true; public InputHandler(IntPtr ptr) : base(ptr) { } public void Update() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) if (Input.GetKeyDown(Plugin.ToggleHudKey)) { HudVisible = !HudVisible; } if (Input.GetKeyDown(Plugin.ClearAllKey)) { Plugin.Manager?.ClearAll(); } } } } namespace TrackCrafts.UI { public class TrackCraftHUD : MonoBehaviour { private bool _collapsed; private int _editingQuantityIndex = -1; private string _quantityInput = ""; private float _refreshTimer; private const float RefreshInterval = 2f; private float _panelAlpha = 1f; private float _posX = 15f; private float _posY = 36f; private bool IsVisible => InputHandler.HudVisible; public TrackCraftHUD(IntPtr ptr) : base(ptr) { } public void Update() { TrackCraftManager manager = Plugin.Manager; if (manager == null) { return; } _refreshTimer += Time.deltaTime; if (!(_refreshTimer >= 2f)) { return; } _refreshTimer = 0f; try { manager.RefreshCounts(); } catch (Exception ex) { Plugin.LogWarning("[HUD] RefreshCounts error: " + ex.Message); } } public void OnGUI() { //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: 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_0127: Unknown result type (might be due to invalid IL or missing references) //IL_015a: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Expected O, but got Unknown //IL_0171: Unknown result type (might be due to invalid IL or missing references) TrackCraftManager manager = Plugin.Manager; if (!IsVisible || manager == null || manager.TrackedRecipes.Count == 0) { return; } bool flag = false; try { VanillaStyle.ResetStyles(); float num = Mathf.Min(600f, (float)Screen.height - _posY - 8f); if (num < 36f) { num = 36f; } int visibleRecipeCount = 0; float num2 = (_collapsed ? 32f : CalculateVisiblePanelHeight(num, out visibleRecipeCount)); Rect val = default(Rect); ((Rect)(ref val))..ctor(_posX, _posY, 380f, num2); Color color = GUI.color; GUI.color = new Color(1f, 1f, 1f, _panelAlpha); VanillaStyle.DrawPanel(val); GUI.color = color; GUILayout.BeginArea(new Rect(((Rect)(ref val)).x + 1f, ((Rect)(ref val)).y + 1f, ((Rect)(ref val)).width - 2f, ((Rect)(ref val)).height - 2f)); flag = true; DrawTitleBar(); if (!_collapsed) { for (int i = 0; i < visibleRecipeCount; i++) { DrawRecipeEntry(i); if (i < visibleRecipeCount - 1) { VanillaStyle.DrawSeparator(GUILayoutUtility.GetRect(360f, 1f)); } } int num3 = manager.TrackedRecipes.Count - visibleRecipeCount; if (num3 > 0) { GUILayout.Space(2f); GUIStyle val2 = new GUIStyle(); val2.fontSize = 11; val2.normal.textColor = VanillaStyle.TextSecondary; val2.alignment = (TextAnchor)4; GUILayout.Label($"+{num3} hidden (screen limit)", val2, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(18f) }); } } HandleClickAway(val); } catch (Exception value) { Plugin.LogError($"[HUD] OnGUI error: {value}"); } finally { if (flag) { try { GUILayout.EndArea(); } catch { } } } } private void DrawTitleBar() { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_0129: Unknown result type (might be due to invalid IL or missing references) //IL_015c: Unknown result type (might be due to invalid IL or missing references) //IL_0163: Expected O, but got Unknown //IL_017b: Unknown result type (might be due to invalid IL or missing references) //IL_01b5: Unknown result type (might be due to invalid IL or missing references) //IL_01da: Unknown result type (might be due to invalid IL or missing references) Rect rect = GUILayoutUtility.GetRect(0f, 30f, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) }); bool flag = ((Rect)(ref rect)).Contains(Event.current.mousePosition); Texture2D val = (flag ? VanillaStyle.TitleHoverTex : (_collapsed ? VanillaStyle.TitleCollapsedTex : VanillaStyle.TitleExpandedTex)); GUI.DrawTexture(rect, (Texture)(object)val); GUI.Label(new Rect(((Rect)(ref rect)).x + 8f, ((Rect)(ref rect)).y, ((Rect)(ref rect)).width - 140f, ((Rect)(ref rect)).height), "Track Crafts", VanillaStyle.TitleStyle); Rect val2 = new Rect(((Rect)(ref rect)).xMax - 112f, ((Rect)(ref rect)).y + 5f, 28f, ((Rect)(ref rect)).height - 10f); Rect val3 = default(Rect); ((Rect)(ref val3))..ctor(((Rect)(ref rect)).xMax - 82f, ((Rect)(ref rect)).y + 5f, 28f, ((Rect)(ref rect)).height - 10f); if (GUI.Button(val2, "A-", VanillaStyle.PresetBtnStyle)) { _panelAlpha = Mathf.Clamp(_panelAlpha - 0.1f, 0.35f, 1f); } if (GUI.Button(val3, "A+", VanillaStyle.PresetBtnStyle)) { _panelAlpha = Mathf.Clamp(_panelAlpha + 0.1f, 0.35f, 1f); } GUIStyle val4 = new GUIStyle(); val4.fontSize = 12; val4.fontStyle = (FontStyle)1; val4.normal.textColor = VanillaStyle.TextPrimary; val4.alignment = (TextAnchor)5; GUI.Label(new Rect(((Rect)(ref rect)).x + 8f, ((Rect)(ref rect)).y, ((Rect)(ref rect)).width - 12f, ((Rect)(ref rect)).height), _collapsed ? "[+]" : "[-]", val4); if ((int)Event.current.type == 0 && Event.current.button == 0 && flag) { _collapsed = !_collapsed; Event.current.Use(); } } private void DrawRecipeEntry(int index) { //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Expected O, but got Unknown //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Unknown result type (might be due to invalid IL or missing references) TrackCraftManager manager = Plugin.Manager; if (index < 0 || index >= manager.TrackedRecipes.Count) { return; } TrackedRecipeModel trackedRecipeModel = manager.TrackedRecipes[index]; GUILayout.Space(4f); GUILayout.BeginHorizontal((Il2CppReferenceArray<GUILayoutOption>)null); try { if ((Object)(object)trackedRecipeModel.RecipeIcon != (Object)null) { GUILayout.Label((Texture)(object)trackedRecipeModel.RecipeIcon, (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.Width(32f), GUILayout.Height(32f) }); } else { GUILayout.Space(36f); } GUILayout.Label(trackedRecipeModel.RecipeName, VanillaStyle.TitleStyle, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(32f) }); GUILayout.FlexibleSpace(); if (trackedRecipeModel.HasFloorBonus) { GUIStyle val = new GUIStyle(); val.fontSize = 11; val.fontStyle = (FontStyle)1; val.normal.textColor = VanillaStyle.TextGreen; val.alignment = (TextAnchor)2; GUILayout.Label("-25%", val, (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.Width(48f), GUILayout.Height(18f) }); } } finally { GUILayout.EndHorizontal(); } DrawQuantityRow(index); GUILayout.Space(4f); VanillaStyle.DrawSeparator(GUILayoutUtility.GetRect(360f, 1f)); GUILayout.Space(2f); int quantity = trackedRecipeModel.Quantity; for (int i = 0; i < trackedRecipeModel.Ingredients.Count; i++) { DrawIngredientRow(index, i, quantity); } GUILayout.Space(0f); DrawBottomRemoveButton(index); } private bool DrawBottomRemoveButton(int index) { //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_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) Rect rect = GUILayoutUtility.GetRect(364f, 24f); bool flag = ((Rect)(ref rect)).Contains(Event.current.mousePosition); GUI.DrawTexture(rect, (Texture)(object)(flag ? VanillaStyle.DangerHoverTex : VanillaStyle.DangerTex)); GUI.Label(rect, "Remove This Craft", VanillaStyle.DangerLabelStyle); if ((int)Event.current.type == 0 && Event.current.button == 0 && flag) { Plugin.Manager?.RemoveRecipe(index); Event.current.Use(); return true; } return false; } private void DrawQuantityRow(int index) { //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_017a: Unknown result type (might be due to invalid IL or missing references) //IL_01ad: Unknown result type (might be due to invalid IL or missing references) //IL_01e0: Unknown result type (might be due to invalid IL or missing references) //IL_02ac: 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_02d8: Unknown result type (might be due to invalid IL or missing references) //IL_0252: Unknown result type (might be due to invalid IL or missing references) //IL_0261: Unknown result type (might be due to invalid IL or missing references) //IL_0318: Unknown result type (might be due to invalid IL or missing references) //IL_02e6: Unknown result type (might be due to invalid IL or missing references) //IL_034a: Unknown result type (might be due to invalid IL or missing references) //IL_0293: Unknown result type (might be due to invalid IL or missing references) //IL_02a3: Unknown result type (might be due to invalid IL or missing references) //IL_037d: Unknown result type (might be due to invalid IL or missing references) //IL_03b0: Unknown result type (might be due to invalid IL or missing references) TrackCraftManager manager = Plugin.Manager; if (index < 0 || index >= manager.TrackedRecipes.Count) { return; } TrackedRecipeModel trackedRecipeModel = manager.TrackedRecipes[index]; Rect rect = GUILayoutUtility.GetRect(364f, 24f); float y = ((Rect)(ref rect)).y; float num = 22f; float num2 = 64f; float num3 = 22f; float num4 = 34f; float num5 = 2f; float num6 = ((Rect)(ref rect)).x + ((Rect)(ref rect)).width * 0.5f; Rect val = default(Rect); ((Rect)(ref val))..ctor(num6 - num2 * 0.5f, y, num2, num); Rect val2 = default(Rect); ((Rect)(ref val2))..ctor(((Rect)(ref val)).x - num5 - num3, y, num3, num); Rect val3 = default(Rect); ((Rect)(ref val3))..ctor(((Rect)(ref val)).xMax + num5, y, num3, num); Rect val4 = default(Rect); ((Rect)(ref val4))..ctor(((Rect)(ref val2)).x - num5 - num4, y, num4, num); Rect val5 = default(Rect); ((Rect)(ref val5))..ctor(((Rect)(ref val4)).x - num5 - num4, y, num4, num); Rect val6 = new Rect(((Rect)(ref val5)).x - num5 - num4, y, num4, num); Rect val7 = default(Rect); ((Rect)(ref val7))..ctor(((Rect)(ref val3)).xMax + num5, y, num4, num); Rect val8 = default(Rect); ((Rect)(ref val8))..ctor(((Rect)(ref val7)).xMax + num5, y, num4, num); Rect val9 = default(Rect); ((Rect)(ref val9))..ctor(((Rect)(ref val8)).xMax + num5, y, num4, num); if (GUI.Button(val6, "-100", VanillaStyle.PresetBtnStyle)) { int quantity = Mathf.Max(1, trackedRecipeModel.Quantity - 100); manager.SetQuantity(index, quantity); CancelEdit(); } if (GUI.Button(val5, "-50", VanillaStyle.PresetBtnStyle)) { int quantity2 = Mathf.Max(1, trackedRecipeModel.Quantity - 50); manager.SetQuantity(index, quantity2); CancelEdit(); } if (GUI.Button(val4, "-10", VanillaStyle.PresetBtnStyle)) { int quantity3 = Mathf.Max(1, trackedRecipeModel.Quantity - 10); manager.SetQuantity(index, quantity3); CancelEdit(); } if (GUI.Button(val2, "-", VanillaStyle.ButtonStyle)) { int quantity4 = Mathf.Max(1, trackedRecipeModel.Quantity - 1); manager.SetQuantity(index, quantity4); CancelEdit(); } if (_editingQuantityIndex == index) { GUI.DrawTexture(new Rect(((Rect)(ref val)).x - 1f, ((Rect)(ref val)).y - 1f, ((Rect)(ref val)).width + 2f, ((Rect)(ref val)).height + 2f), (Texture)(object)VanillaStyle.GoldBorderTex); GUI.DrawTexture(val, (Texture)(object)VanillaStyle.FieldTex); string text = (string.IsNullOrEmpty(_quantityInput) ? "_" : (_quantityInput + "_")); GUI.Label(val, text, VanillaStyle.QuantityLabelStyle); HandleQuantityKeyboardInput(index, val); } else { GUI.DrawTexture(val, (Texture)(object)VanillaStyle.FieldTex); GUI.Label(val, trackedRecipeModel.Quantity.ToString(), VanillaStyle.QuantityLabelStyle); if ((int)Event.current.type == 0 && ((Rect)(ref val)).Contains(Event.current.mousePosition)) { _editingQuantityIndex = index; _quantityInput = trackedRecipeModel.Quantity.ToString(); Event.current.Use(); } } if (GUI.Button(val3, "+", VanillaStyle.ButtonStyle)) { int quantity5 = Mathf.Max(1, trackedRecipeModel.Quantity + 1); manager.SetQuantity(index, quantity5); CancelEdit(); } if (GUI.Button(val7, "+10", VanillaStyle.PresetBtnStyle)) { int quantity6 = Mathf.Max(1, trackedRecipeModel.Quantity + 10); manager.SetQuantity(index, quantity6); CancelEdit(); } if (GUI.Button(val8, "+50", VanillaStyle.PresetBtnStyle)) { int quantity7 = Mathf.Max(1, trackedRecipeModel.Quantity + 50); manager.SetQuantity(index, quantity7); CancelEdit(); } if (GUI.Button(val9, "+100", VanillaStyle.PresetBtnStyle)) { int quantity8 = Mathf.Max(1, trackedRecipeModel.Quantity + 100); manager.SetQuantity(index, quantity8); CancelEdit(); } } private void DrawIngredientRow(int recipeIndex, int ingredientIndex, int quantity) { //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Expected O, but got Unknown //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_011f: Unknown result type (might be due to invalid IL or missing references) TrackCraftManager manager = Plugin.Manager; if (recipeIndex < 0 || recipeIndex >= manager.TrackedRecipes.Count) { return; } TrackedRecipeModel trackedRecipeModel = manager.TrackedRecipes[recipeIndex]; if (ingredientIndex < 0 || ingredientIndex >= trackedRecipeModel.Ingredients.Count) { return; } IngredientModel ingredientModel = trackedRecipeModel.Ingredients[ingredientIndex]; GUILayout.BeginHorizontal((Il2CppReferenceArray<GUILayoutOption>)null); try { GUILayout.Space(8f); if ((Object)(object)ingredientModel.Icon != (Object)null) { GUILayout.Label((Texture)(object)ingredientModel.Icon, (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.Width(24f), GUILayout.Height(24f) }); } else { GUI.DrawTexture(GUILayoutUtility.GetRect(24f, 24f), (Texture)(object)VanillaStyle.FieldTex); } GUILayout.Space(6f); GUILayout.Label(ingredientModel.ItemName, VanillaStyle.LabelStyle, (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.Width(150f), GUILayout.Height(28f) }); GUILayout.FlexibleSpace(); int num = ingredientModel.AmountPerCraft * quantity; int have = ingredientModel.Have; bool flag = have >= num; GUIStyle val = new GUIStyle(); val.fontSize = 12; val.normal.textColor = (flag ? VanillaStyle.TextGreen : VanillaStyle.TextRed); val.alignment = (TextAnchor)5; val.fontStyle = (FontStyle)1; GUILayout.Label($"{have} / {num}", val, (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.Width(90f), GUILayout.Height(28f) }); GUILayout.Space(8f); } finally { GUILayout.EndHorizontal(); } } private void HandleQuantityKeyboardInput(int index, Rect fieldRect) { //IL_000b: 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_0030: Invalid comparison between Unknown and I4 //IL_0015: 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_0043: Invalid comparison between Unknown and I4 //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Invalid comparison between Unknown and I4 //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Invalid comparison between Unknown and I4 //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Invalid comparison between Unknown and I4 //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Invalid comparison between Unknown and I4 //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Invalid comparison between Unknown and I4 //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Invalid comparison between Unknown and I4 Event current = Event.current; if (current == null) { return; } if ((int)current.type == 0 && !((Rect)(ref fieldRect)).Contains(current.mousePosition)) { ConfirmEdit(index); } else if (((int)current.type == 4 || (int)current.type == 5) && ((int)current.keyCode == 13 || (int)current.keyCode == 271)) { current.Use(); } else { if ((int)current.type != 4) { return; } if ((int)current.keyCode == 27) { CancelEdit(); current.Use(); return; } if ((int)current.keyCode == 8) { if (!string.IsNullOrEmpty(_quantityInput)) { _quantityInput = _quantityInput.Substring(0, _quantityInput.Length - 1); } current.Use(); return; } if ((int)current.keyCode == 127) { _quantityInput = ""; current.Use(); return; } char character = current.character; if (character < '0' || character > '9') { return; } if (_quantityInput.Length < 9) { _quantityInput += character; _quantityInput = _quantityInput.TrimStart('0'); if (_quantityInput.Length == 0) { _quantityInput = "0"; } } current.Use(); } } private void ConfirmEdit(int index) { if (int.TryParse(_quantityInput, out var result) && result > 0) { Plugin.Manager?.SetQuantity(index, result); } CancelEdit(); } private void CancelEdit() { _editingQuantityIndex = -1; _quantityInput = ""; } private void HandleClickAway(Rect panelRect) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) if (_editingQuantityIndex >= 0 && (int)Event.current.type == 0 && !((Rect)(ref panelRect)).Contains(Event.current.mousePosition)) { ConfirmEdit(_editingQuantityIndex); } } private float CalculateVisiblePanelHeight(float maxHeight, out int visibleRecipeCount) { TrackCraftManager manager = Plugin.Manager; visibleRecipeCount = 0; if (manager == null) { return 0f; } float num = 32f; float num2 = num; for (int i = 0; i < manager.TrackedRecipes.Count; i++) { float num3 = GetRecipeVisualHeight(manager.TrackedRecipes[i]); if (i < manager.TrackedRecipes.Count - 1) { num3 += 5f; } if (num2 + num3 > maxHeight) { break; } num2 += num3; visibleRecipeCount++; } if (visibleRecipeCount == 0 && manager.TrackedRecipes.Count > 0) { num2 = Mathf.Min(maxHeight, num + GetRecipeVisualHeight(manager.TrackedRecipes[0])); visibleRecipeCount = 1; } return Mathf.Min(maxHeight, num2); } private static float GetRecipeVisualHeight(TrackedRecipeModel recipe) { return 4f + 32f + 24f + 7f + (float)recipe.Ingredients.Count * 28f + 24f; } } public static class VanillaStyle { public static readonly Color PanelBg = new Color(0.06f, 0.06f, 0.08f, 0.88f); public static readonly Color PanelBorder = new Color(0.16f, 0.16f, 0.2f, 1f); public static readonly Color TitleBarBg = new Color(0.1f, 0.1f, 0.14f, 0.94f); public static readonly Color TitleExpandedBg = new Color(0.1f, 0.1f, 0.16f, 0.96f); public static readonly Color TitleCollapsedBg = new Color(0.08f, 0.12f, 0.24f, 0.96f); public static readonly Color TitleHoverBlue = new Color(0.14f, 0.24f, 0.46f, 0.98f); public static readonly Color TextPrimary = new Color(0.89f, 0.91f, 0.94f, 1f); public static readonly Color TextSecondary = new Color(0.63f, 0.63f, 0.7f, 1f); public static readonly Color TextGreen = new Color(0.29f, 0.87f, 0.5f, 1f); public static readonly Color TextRed = new Color(0.97f, 0.45f, 0.44f, 1f); public static readonly Color TextGold = new Color(0.83f, 0.65f, 0.2f, 1f); public static readonly Color ButtonBg = new Color(0.14f, 0.14f, 0.18f, 1f); public static readonly Color ButtonHover = new Color(0.22f, 0.22f, 0.28f, 1f); public static readonly Color ButtonActive = new Color(0.3f, 0.3f, 0.38f, 1f); public static readonly Color FieldBg = new Color(0.08f, 0.08f, 0.12f, 1f); public static readonly Color FieldEditBorder = new Color(0.83f, 0.65f, 0.2f, 1f); public static readonly Color SeparatorColor = new Color(0.2f, 0.2f, 0.25f, 0.8f); public static readonly Color CloseRed = new Color(0.65f, 0.22f, 0.22f, 1f); public static readonly Color DangerBg = new Color(0.3f, 0.09f, 0.11f, 0.95f); public static readonly Color DangerHover = new Color(0.74f, 0.14f, 0.18f, 0.98f); public const float PanelWidth = 380f; public const float PanelPadding = 10f; public const float RecipeIconSize = 32f; public const float ItemIconSize = 24f; public const float RowHeight = 28f; public const float ButtonHeight = 22f; public const float QuantityFieldWidth = 64f; public const float PresetButtonWidth = 36f; public const float CloseButtonSize = 20f; public const float BorderWidth = 1f; public const float MaxPanelHeight = 600f; private static Texture2D _panelTex; private static Texture2D _borderTex; private static Texture2D _titleTex; private static Texture2D _buttonTex; private static Texture2D _buttonHoverTex; private static Texture2D _buttonActiveTex; private static Texture2D _fieldTex; private static Texture2D _separatorTex; private static Texture2D _goldBorderTex; private static Texture2D _closeRedTex; private static Texture2D _titleExpandedTex; private static Texture2D _titleCollapsedTex; private static Texture2D _titleHoverTex; private static Texture2D _dangerTex; private static Texture2D _dangerHoverTex; private static GUIStyle _titleStyle; private static GUIStyle _labelStyle; private static GUIStyle _buttonStyle; private static GUIStyle _presetBtnStyle; private static GUIStyle _quantityFieldStyle; private static GUIStyle _quantityLabelStyle; private static GUIStyle _dangerLabelStyle; public static Texture2D PanelTex => _panelTex ?? (_panelTex = MakeTex(PanelBg)); public static Texture2D BorderTex => _borderTex ?? (_borderTex = MakeTex(PanelBorder)); public static Texture2D TitleTex => _titleTex ?? (_titleTex = MakeTex(TitleBarBg)); public static Texture2D ButtonTex => _buttonTex ?? (_buttonTex = MakeTex(ButtonBg)); public static Texture2D ButtonHoverTex => _buttonHoverTex ?? (_buttonHoverTex = MakeTex(ButtonHover)); public static Texture2D ButtonActiveTex => _buttonActiveTex ?? (_buttonActiveTex = MakeTex(ButtonActive)); public static Texture2D FieldTex => _fieldTex ?? (_fieldTex = MakeTex(FieldBg)); public static Texture2D SeparatorTex => _separatorTex ?? (_separatorTex = MakeTex(SeparatorColor)); public static Texture2D GoldBorderTex => _goldBorderTex ?? (_goldBorderTex = MakeTex(FieldEditBorder)); public static Texture2D CloseRedTex => _closeRedTex ?? (_closeRedTex = MakeTex(CloseRed)); public static Texture2D TitleExpandedTex => _titleExpandedTex ?? (_titleExpandedTex = MakeTex(TitleExpandedBg)); public static Texture2D TitleCollapsedTex => _titleCollapsedTex ?? (_titleCollapsedTex = MakeTex(TitleCollapsedBg)); public static Texture2D TitleHoverTex => _titleHoverTex ?? (_titleHoverTex = MakeTex(TitleHoverBlue)); public static Texture2D DangerTex => _dangerTex ?? (_dangerTex = MakeTex(DangerBg)); public static Texture2D DangerHoverTex => _dangerHoverTex ?? (_dangerHoverTex = MakeTex(DangerHover)); public static GUIStyle TitleStyle { get { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown //IL_0032: Unknown result type (might be due to invalid IL or missing references) if (_titleStyle == null) { _titleStyle = new GUIStyle(); _titleStyle.fontSize = 13; _titleStyle.fontStyle = (FontStyle)1; _titleStyle.normal.textColor = TextPrimary; _titleStyle.alignment = (TextAnchor)3; _titleStyle.padding = MakeOffset(6, 6, 2, 2); } return _titleStyle; } } public static GUIStyle LabelStyle { get { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown //IL_0027: Unknown result type (might be due to invalid IL or missing references) if (_labelStyle == null) { _labelStyle = new GUIStyle(); _labelStyle.fontSize = 12; _labelStyle.normal.textColor = TextPrimary; _labelStyle.alignment = (TextAnchor)3; } return _labelStyle; } } public static GUIStyle ButtonStyle { get { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Expected O, but got Unknown //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) if (_buttonStyle == null) { _buttonStyle = new GUIStyle(); _buttonStyle.fontSize = 11; _buttonStyle.normal.background = ButtonTex; _buttonStyle.normal.textColor = TextPrimary; _buttonStyle.hover.background = ButtonHoverTex; _buttonStyle.hover.textColor = TextPrimary; _buttonStyle.active.background = ButtonActiveTex; _buttonStyle.active.textColor = TextPrimary; _buttonStyle.border = MakeOffset(1, 1, 1, 1); _buttonStyle.padding = MakeOffset(4, 4, 2, 2); _buttonStyle.alignment = (TextAnchor)4; } return _buttonStyle; } } public static GUIStyle PresetBtnStyle { get { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Expected O, but got Unknown //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) if (_presetBtnStyle == null) { _presetBtnStyle = new GUIStyle(); _presetBtnStyle.fontSize = 10; _presetBtnStyle.normal.background = ButtonTex; _presetBtnStyle.normal.textColor = TextPrimary; _presetBtnStyle.hover.background = ButtonHoverTex; _presetBtnStyle.hover.textColor = TextPrimary; _presetBtnStyle.active.background = ButtonActiveTex; _presetBtnStyle.active.textColor = TextPrimary; _presetBtnStyle.border = MakeOffset(1, 1, 1, 1); _presetBtnStyle.padding = MakeOffset(2, 2, 1, 1); _presetBtnStyle.alignment = (TextAnchor)4; } return _presetBtnStyle; } } public static GUIStyle QuantityFieldStyle { get { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Expected O, but got Unknown //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) if (_quantityFieldStyle == null) { _quantityFieldStyle = new GUIStyle(); _quantityFieldStyle.fontSize = 13; _quantityFieldStyle.fontStyle = (FontStyle)1; _quantityFieldStyle.normal.background = FieldTex; _quantityFieldStyle.normal.textColor = TextPrimary; _quantityFieldStyle.focused.background = FieldTex; _quantityFieldStyle.focused.textColor = TextPrimary; _quantityFieldStyle.alignment = (TextAnchor)4; _quantityFieldStyle.border = MakeOffset(2, 2, 2, 2); } return _quantityFieldStyle; } } public static GUIStyle QuantityLabelStyle { get { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown //IL_0032: Unknown result type (might be due to invalid IL or missing references) if (_quantityLabelStyle == null) { _quantityLabelStyle = new GUIStyle(); _quantityLabelStyle.fontSize = 13; _quantityLabelStyle.fontStyle = (FontStyle)1; _quantityLabelStyle.normal.textColor = TextPrimary; _quantityLabelStyle.alignment = (TextAnchor)4; } return _quantityLabelStyle; } } public static GUIStyle DangerLabelStyle { get { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown //IL_0032: Unknown result type (might be due to invalid IL or missing references) if (_dangerLabelStyle == null) { _dangerLabelStyle = new GUIStyle(); _dangerLabelStyle.fontSize = 11; _dangerLabelStyle.fontStyle = (FontStyle)1; _dangerLabelStyle.normal.textColor = TextPrimary; _dangerLabelStyle.alignment = (TextAnchor)4; } return _dangerLabelStyle; } } private static RectOffset MakeOffset(int left, int right, int top, int bottom) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown return new RectOffset { left = left, right = right, top = top, bottom = bottom }; } public static Texture2D MakeTex(Color color) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown Texture2D val = new Texture2D(1, 1, (TextureFormat)4, false); val.SetPixel(0, 0, color); val.Apply(); ((Object)val).hideFlags = (HideFlags)61; return val; } public static void DrawPanel(Rect rect) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) GUI.DrawTexture(rect, (Texture)(object)BorderTex); GUI.DrawTexture(new Rect(((Rect)(ref rect)).x + 1f, ((Rect)(ref rect)).y + 1f, ((Rect)(ref rect)).width - 2f, ((Rect)(ref rect)).height - 2f), (Texture)(object)PanelTex); } public static void DrawSeparator(Rect rect) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) GUI.DrawTexture(new Rect(((Rect)(ref rect)).x + 8f, ((Rect)(ref rect)).y, ((Rect)(ref rect)).width - 16f, 1f), (Texture)(object)SeparatorTex); } public static void ResetStyles() { _titleStyle = null; _labelStyle = null; _buttonStyle = null; _presetBtnStyle = null; _quantityFieldStyle = null; _quantityLabelStyle = null; _dangerLabelStyle = null; } } } namespace TrackCrafts.Services { public static class IconResolver { private static PrefabCollectionSystem _prefabCollection; private static EntityManager _em; private static World _world; private static bool _initialized; private static readonly Dictionary<int, Texture2D> _iconCache = new Dictionary<int, Texture2D>(); public static bool IsReady { get { if (_initialized) { return _prefabCollection != null; } return false; } } public static void Initialize(World world) { _initialized = false; _prefabCollection = null; _world = null; TryBindWorld(world); if (_initialized) { return; } if (WorldLocator.TryGetClientWorld(out var world2)) { TryBindWorld(world2); if (_initialized) { return; } } try { for (int i = 0; i < World.All.Count && !TryBindWorld(World.All[i]); i++) { } } catch { } } private static bool TryBindWorld(World world) { //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) if (world == null || !world.IsCreated) { return false; } try { PrefabCollectionSystem existingSystemManaged = world.GetExistingSystemManaged<PrefabCollectionSystem>(); if (existingSystemManaged == null) { return false; } _world = world; _em = world.EntityManager; _prefabCollection = existingSystemManaged; _initialized = true; return true; } catch { return false; } } public static Entity GetPrefabEntity(PrefabGUID prefabGuid) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) if (!TryGetPrefabEntity(prefabGuid, out var entity)) { return Entity.Null; } return entity; } public static bool TryGetPrefabEntity(PrefabGUID prefabGuid, out Entity entity) { //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_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0029: 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_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) entity = Entity.Null; if (!_initialized || _prefabCollection == null) { return false; } try { NativeParallelHashMap<PrefabGUID, Entity> prefabGuidToEntityMap = _prefabCollection._PrefabGuidToEntityMap; if (prefabGuidToEntityMap.ContainsKey(prefabGuid)) { entity = prefabGuidToEntityMap[prefabGuid]; return entity != Entity.Null; } } catch { } return false; } public static bool IsValidRecipeGuid(PrefabGUID recipeGuid) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) if (!TryGetPrefabEntity(recipeGuid, out var entity)) { return false; } try { return ((EntityManager)(ref _em)).HasBuffer<RecipeRequirementBuffer>(entity) || ((EntityManager)(ref _em)).HasBuffer<RecipeOutputBuffer>(entity); } catch { return false; } } public static Texture2D GetItemIcon(PrefabGUID itemPrefabGuid) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) return GetItemIconViaGameData(itemPrefabGuid); } public static Texture2D GetItemIconViaGameData(PrefabGUID itemPrefabGuid) { //IL_0165: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_013d: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Unknown result type (might be due to invalid IL or missing references) if (!_initialized) { return null; } if (_iconCache.TryGetValue(itemPrefabGuid._Value, out var value)) { return value; } try { World world = World.DefaultGameObjectInjectionWorld; if (_world != null && _world.IsCreated) { world = _world; } else if (!WorldLocator.TryGetClientWorld(out world) || world == null) { return null; } GameDataSystem existingSystemManaged = world.GetExistingSystemManaged<GameDataSystem>(); if (existingSystemManaged == null) { return null; } ManagedDataRegistry managedDataRegistry = existingSystemManaged.ManagedDataRegistry; ItemDataComponent val = default(ItemDataComponent); if (managedDataRegistry.TryGet<ItemDataComponent>(itemPrefabGuid, ref val) && (Object)(object)val != (Object)null && (Object)(object)val.Icon != (Object)null) { Texture2D val2 = SpriteToTexture2D(val.Icon); _iconCache[itemPrefabGuid._Value] = val2; return val2; } ItemData val3 = default(ItemData); if (existingSystemManaged.ItemHashLookupMap.TryGetValue(itemPrefabGuid, ref val3)) { ItemDataComponent val4 = default(ItemDataComponent); if (val3.Entity != Entity.Null && managedDataRegistry.TryGet<ItemDataComponent>(val3.Entity, world.EntityManager, ref val4) && (Object)(object)val4 != (Object)null && (Object)(object)val4.Icon != (Object)null) { Texture2D val5 = SpriteToTexture2D(val4.Icon); _iconCache[itemPrefabGuid._Value] = val5; return val5; } _iconCache[itemPrefabGuid._Value] = null; } } catch (Exception ex) { Plugin.LogWarning($"GameData icon resolve failed for {itemPrefabGuid._Value}: {ex.Message}"); } return null; } public static Texture2D GetRecipeOutputIcon(PrefabGUID recipePrefabGuid) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_0032: 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_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) if (!_initialized) { return null; } Entity prefabEntity = GetPrefabEntity(recipePrefabGuid); if (prefabEntity == Entity.Null) { return null; } try { if (((EntityManager)(ref _em)).HasBuffer<RecipeOutputBuffer>(prefabEntity)) { DynamicBuffer<RecipeOutputBuffer> buffer = ((EntityManager)(ref _em)).GetBuffer<RecipeOutputBuffer>(prefabEntity, false); if (buffer.Length > 0) { return GetItemIconViaGameData(buffer[0].Guid); } } } catch { } return null; } public static string GetPrefabName(PrefabGUID prefabGuid) { //IL_0005: 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_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0036: 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_0084: Unknown result type (might be due to invalid IL or missing references) if (Plugin.PrefabNames.TryGetValue(prefabGuid._Value, out var value)) { return value; } if (_initialized && _prefabCollection != null) { try { PrefabLookupMap prefabLookupMap = ((PrefabCollectionSystem_Base)_prefabCollection).PrefabLookupMap; string name = ((PrefabLookupMap)(ref prefabLookupMap)).GetName(prefabGuid); if (!string.IsNullOrEmpty(name)) { return name; } } catch { } } if (_initialized && _prefabCollection != null) { try { Enumerator<string, PrefabGUID> enumerator = _prefabCollection.SpawnableNameToPrefabGuidDictionary.GetEnumerator(); while (enumerator.MoveNext()) { KeyValuePair<string, PrefabGUID> current = enumerator.Current; if (current.Value._Value == prefabGuid._Value) { return current.Key; } } } catch { } } return prefabGuid._Value.ToString(); } public static string GetCleanItemName(PrefabGUID prefabGuid) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) if (Plugin.PrefabNames.TryGetValue(prefabGuid._Value, out var value)) { return value; } string text = GetPrefabName(prefabGuid); string[] array = new string[17] { "Recipe_Ingredient_Mineral_", "Recipe_Ingredient_", "Recipe_Output_", "Recipe_", "Item_Ingredient_Mineral_", "Item_Ingredient_", "Item_Building_", "Item_Consumable_", "Item_Weapon_", "Item_Armor_", "Item_", "Ingredient_Mineral_", "Ingredient_", "Building_", "Consumable_", "Weapon_", "Armor_" }; for (int i = 0; i < array.Length; i++) { if (text.StartsWith(array[i], StringComparison.OrdinalIgnoreCase)) { text = text.Substring(array[i].Length); break; } } text = text.Replace("_T01", "").Replace("_T02", "").Replace("_T03", "") .Replace("_T04", ""); return text.Replace("_", " ").Trim(); } public static Texture2D SpriteToTexture2D(Sprite sprite) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_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_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Expected O, but got Unknown if ((Object)(object)sprite == (Object)null || (Object)(object)sprite.texture == (Object)null) { return null; } try { Rect val = sprite.rect; int num = (int)((Rect)(ref val)).width; val = sprite.rect; Texture2D val2 = new Texture2D(num, (int)((Rect)(ref val)).height); Texture2D texture = sprite.texture; val = sprite.textureRect; int num2 = (int)((Rect)(ref val)).x; val = sprite.textureRect; int num3 = (int)((Rect)(ref val)).y; val = sprite.textureRect; int num4 = (int)((Rect)(ref val)).width; val = sprite.textureRect; Il2CppStructArray<Color> pixels = texture.GetPixels(num2, num3, num4, (int)((Rect)(ref val)).height); val2.SetPixels(pixels); val2.Apply(); return val2; } catch { return ExtractViaRenderTexture(sprite); } } private static Texture2D ExtractViaRenderTexture(Sprite sprite) { //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_007c: 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_008a: 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_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Expected O, but got Unknown try { RenderTexture temporary = RenderTexture.GetTemporary(((Texture)sprite.texture).width, ((Texture)sprite.texture).height); Graphics.Blit((Texture)(object)sprite.texture, temporary); RenderTexture active = RenderTexture.active; RenderTexture.active = temporary; Rect textureRect = sprite.textureRect; int num = (int)((Rect)(ref textureRect)).width; textureRect = sprite.textureRect; Texture2D val = new Texture2D(num, (int)((Rect)(ref textureRect)).height, (TextureFormat)4, false); textureRect = sprite.textureRect; float x = ((Rect)(ref textureRect)).x; textureRect = sprite.textureRect; float y = ((Rect)(ref textureRect)).y; textureRect = sprite.textureRect; float width = ((Rect)(ref textureRect)).width; textureRect = sprite.textureRect; val.ReadPixels(new Rect(x, y, width, ((Rect)(ref textureRect)).height), 0, 0); val.Apply(); RenderTexture.active = active; RenderTexture.ReleaseTemporary(temporary); return val; } catch { return null; } } public static void ClearCache() { _iconCache.Clear(); } } public static class InventoryQuery { private static readonly Dictionary<int, int> CachedCounts = new Dictionary<int, int>(); private static float _nextScanTime; public static Dictionary<int, int> GetPlayerItemCounts() { //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0067: 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_0069: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) if (Time.time < _nextScanTime && CachedCounts.Count > 0) { return new Dictionary<int, int>(CachedCounts); } _nextScanTime = Time.time + 1.5f; CachedCounts.Clear(); try { if (!WorldLocator.TryGetClientWorld(out var world) || world == null) { return new Dictionary<int, int>(CachedCounts); } EntityManager entityManager = world.EntityManager; Entity localPlayerEntity = GetLocalPlayerEntity(entityManager); if (localPlayerEntity != Entity.Null && ((EntityManager)(ref entityManager)).HasBuffer<AttachedBuffer>(localPlayerEntity)) { DynamicBuffer<AttachedBuffer> buffer = ((EntityManager)(ref entityManager)).GetBuffer<AttachedBuffer>(localPlayerEntity, false); for (int i = 0; i < buffer.Length; i++) { CountInventoryItems(entityManager, buffer[i].Entity, CachedCounts); } } if (CachedCounts.Count == 0) { ScanAllVisibleInventories(entityManager, CachedCounts); } } catch (Exception ex) { Plugin.LogWarning("Inventory query failed: " + ex.Message); } return new Dictionary<int, int>(CachedCounts); } private static void ScanAllVisibleInventories(EntityManager em, Dictionary<int, int> counts) { //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_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) try { EntityQuery val = ((EntityManager)(ref em)).CreateEntityQuery((ComponentType[])(object)new ComponentType[1] { ComponentType.ReadOnly<InventoryBuffer>() }); NativeArray<Entity> val2 = ((EntityQuery)(ref val)).ToEntityArray(AllocatorHandle.op_Implicit((Allocator)2)); for (int i = 0; i < val2.Length; i++) { CountInventoryItems(em, val2[i], counts); } val2.Dispose(); } catch { } } private static void CountInventoryItems(EntityManager em, Entity inventoryEntity, Dictionary<int, int> counts) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0010: 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_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0067: 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) try { if (!((EntityManager)(ref em)).HasBuffer<InventoryBuffer>(inventoryEntity)) { return; } DynamicBuffer<InventoryBuffer> buffer = ((EntityManager)(ref em)).GetBuffer<InventoryBuffer>(inventoryEntity, false); for (int i = 0; i < buffer.Length; i++) { InventoryBuffer val = buffer[i]; if (val.Amount <= 0) { continue; } int value = val.ItemType._Value; if (value != 0) { if (counts.ContainsKey(value)) { counts[value] += val.Amount; } else { counts[value] = val.Amount; } } } } catch { } } public static Entity GetLocalPlayerEntity(EntityManager em) { //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_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_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_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0075: 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) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) try { EntityQuery val = ((EntityManager)(ref em)).CreateEntityQuery((ComponentType[])(object)new ComponentType[2] { ComponentType.ReadOnly<User>(), ComponentType.ReadOnly<LocalUser>() }); if (((EntityQuery)(ref val)).IsEmpty) { return Entity.Null; } NativeArray<Entity> val2 = ((EntityQuery)(ref val)).ToEntityArray(AllocatorHandle.op_Implicit((Allocator)2)); if (val2.Length == 0) { val2.Dispose(); return Entity.Null; } Entity val3 = val2[0]; val2.Dispose(); return ((EntityManager)(ref em)).GetComponentData<User>(val3).LocalCharacter._Entity; } catch { return Entity.Null; } } } public static class RecipeLookup { public static TrackedRecipeModel BuildTrackedRecipe(PrefabGUID recipePrefabGuid, int quantity = 1) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0066: 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_006d: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: 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_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: 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_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_0111: 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) //IL_011e: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Unknown result type (might be due to invalid IL or missing references) //IL_013d: Unknown result type (might be due to invalid IL or missing references) //IL_013f: Unknown result type (might be due to invalid IL or missing references) //IL_014f: Unknown result type (might be due to invalid IL or missing references) try { if (!IconResolver.IsReady) { return null; } Entity prefabEntity = IconResolver.GetPrefabEntity(recipePrefabGuid); if (prefabEntity == Entity.Null) { return null; } if (!WorldLocator.TryGetClientWorld(out var world) || world == null) { return null; } EntityManager entityManager = world.EntityManager; TrackedRecipeModel trackedRecipeModel = new TrackedRecipeModel { RecipePrefabGuid = recipePrefabGuid, Quantity = quantity }; if (((EntityManager)(ref entityManager)).HasBuffer<RecipeOutputBuffer>(prefabEntity)) { DynamicBuffer<RecipeOutputBuffer> buffer = ((EntityManager)(ref entityManager)).GetBuffer<RecipeOutputBuffer>(prefabEntity, false); if (buffer.Length > 0) { trackedRecipeModel.RecipeName = IconResolver.GetCleanItemName(buffer[0].Guid); trackedRecipeModel.RecipeIcon = IconResolver.GetItemIconViaGameData(buffer[0].Guid); } } if (string.IsNullOrEmpty(trackedRecipeModel.RecipeName) || trackedRecipeModel.RecipeName == "Unknown") { trackedRecipeModel.RecipeName = CleanRecipeName(IconResolver.GetPrefabName(recipePrefabGuid)); } if ((Object)(object)trackedRecipeModel.RecipeIcon == (Object)null) { trackedRecipeModel.RecipeIcon = IconResolver.GetRecipeOutputIcon(recipePrefabGuid); } if (((EntityManager)(ref entityManager)).HasBuffer<RecipeRequirementBuffer>(prefabEntity)) { DynamicBuffer<RecipeRequirementBuffer> buffer2 = ((EntityManager)(ref entityManager)).GetBuffer<RecipeRequirementBuffer>(prefabEntity, false); for (int i = 0; i < buffer2.Length; i++) { RecipeRequirementBuffer val = buffer2[i]; IngredientModel item = new IngredientModel { ItemPrefabGuid = val.Guid, ItemName = IconResolver.GetCleanItemName(val.Guid), Icon = IconResolver.GetItemIconViaGameData(val.Guid), AmountPerCraft = val.Amount }; trackedRecipeModel.Ingredients.Add(item); } } return trackedRecipeModel; } catch (Exception ex) { Plugin.LogWarning("Failed to build tracked recipe: " + ex.Message); return null; } } public static string CleanRecipeName(string rawName) { if (string.IsNullOrEmpty(rawName)) { return "Unknown Recipe"; } if (rawName.StartsWith("Recipe_")) { rawName = rawName.Substring(7); } return rawName.Replace("_", " "); } public static List<PrefabGUID> GetRecipeOutputs(PrefabGUID recipePrefabGuid) { //IL_0006: 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_000c: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_000e: 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_0036: 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) //IL_0043: 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_0056: 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) List<PrefabGUID> list = new List<PrefabGUID>(); try { Entity prefabEntity = IconResolver.GetPrefabEntity(recipePrefabGuid); if (prefabEntity == Entity.Null) { return list; } if (!WorldLocator.TryGetClientWorld(out var world) || world == null) { return list; } EntityManager entityManager = world.EntityManager; if (((EntityManager)(ref entityManager)).HasBuffer<RecipeOutputBuffer>(prefabEntity)) { DynamicBuffer<RecipeOutputBuffer> buffer = ((EntityManager)(ref entityManager)).GetBuffer<RecipeOutputBuffer>(prefabEntity, false); for (int i = 0; i < buffer.Length; i++) { list.Add(buffer[i].Guid); } } } catch { } return list; } } public static class WorldLocator { public static bool TryGetClientWorld(out World world) { world = null; try { World defaultGameObjectInjectionWorld = World.DefaultGameObjectInjectionWorld; if (defaultGameObjectInjectionWorld == null || !defaultGameObjectInjectionWorld.IsCreated) { return false; } try { ClientWorldManager existingSystemManaged = defaultGameObjectInjectionWorld.GetExistingSystemManaged<ClientWorldManager>(); if (existingSystemManaged != null) { World activeClientWorld = existingSystemManaged.ActiveClientWorld; if (activeClientWorld != null && activeClientWorld.IsCreated) { world = activeClientWorld; return true; } } } catch { } world = defaultGameObjectInjectionWorld; return true; } catch { return false; } } } } namespace TrackCrafts.Patches { [HarmonyPatch] public static class CraftingPatches { [HarmonyPatch(typeof(StartCraftingSystem), "OnUpdate")] [HarmonyPostfix] public static void OnStartCrafting_Postfix(StartCraftingSystem __instance) { } [HarmonyPatch(typeof(UpdateCraftingSystem), "OnUpdate")] [HarmonyPostfix] public static void OnUpdateCrafting_Postfix(UpdateCraftingSystem __instance) { } [HarmonyPatch(typeof(WorkstationRecipeGridSelectionEntry), "RefreshData")] [HarmonyPostfix] public static void WorkstationRecipeRefresh_Postfix(WorkstationRecipeGridSelectionEntry entry, Data data) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0016: 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_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) try { if (data.isHovered) { PrefabGUID val = ((data.EntryId._Value != 0) ? data.EntryId : entry.EntryId); if (val._Value != 0) { RecipeHoverState.SetHovered(val); } } } catch { } } [HarmonyPatch(typeof(RefinementstationRecipeEntry), "RefreshData")] [HarmonyPostfix] public static void RefinementRecipeRefresh_Postfix(RefinementstationRecipeEntry entry, Data data) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0016: 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_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) try { if (data.Highlight) { PrefabGUID val = ((data.EntryId._Value != 0) ? data.EntryId : entry.EntryId); if (val._Value != 0) { RecipeHoverState.SetHovered(val); } } } catch { } } } [HarmonyPatch(typeof(GridSelectionEntry), "OnPointerClick")] public static class GridSelectionEntryPatch { [HarmonyPostfix] public static void Postfix(GridSelectionEntry __instance, PointerEventData eventData) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Invalid comparison between Unknown and I4 try { if (eventData != null && (int)eventData.button == 2 && !((Object)(object)__instance == (Object)null)) { Plugin.LogInfo("[Mouse3] OnPointerClick on " + ((Object)((Component)__instance).gameObject).name); Plugin.TryPinRecipeFromEntry(((Component)__instance).gameObject); } } catch { } } } } namespace TrackCrafts.Core { public class IngredientModel { public PrefabGUID ItemPrefabGuid { get; set; } public string ItemName { get; set; } = "Unknown"; public Texture2D Icon { get; set; } public int AmountPerCraft { get; set; } public int TotalNeeded { get; set; } public int Have { get; set; } public int Missing { get; set; } public bool IsSatisfied => Missing <= 0; } public static class RecipeHoverState { private static int _hoveredRecipeGuid; private static float _hoveredAt; public static void SetHovered(PrefabGUID recipeGuid) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) if (recipeGuid._Value != 0) { _hoveredRecipeGuid = recipeGuid._Value; _hoveredAt = Time.realtimeSinceStartup; } } public static bool TryGetHovered(out PrefabGUID recipeGuid, float maxAgeSeconds = 0.4f) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) recipeGuid = default(PrefabGUID); if (_hoveredRecipeGuid == 0) { return false; } if (Time.realtimeSinceStartup - _hoveredAt > maxAgeSeconds) { return false; } recipeGuid._Value = _hoveredRecipeGuid; return true; } } public class TrackCraftManager { private bool _initialized; public List<TrackedRecipeModel> TrackedRecipes { get; } = new List<TrackedRecipeModel>(); public void EnsureInitialized() { if ((!_initialized || !IconResolver.IsReady) && WorldLocator.TryGetClientWorld(out var world) && world != null) { IconResolver.Initialize(world); _initialized = IconResolver.IsReady; } } public bool AddRecipe(PrefabGUID recipePrefabGuid, int quantity = 1) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) EnsureInitialized(); if (!IconResolver.IsReady) { Plugin.LogWarning("[TrackCraftManager] IconResolver not ready; cannot add recipe."); return false; } if (!IconResolver.IsValidRecipeGuid(recipePrefabGuid)) { Plugin.LogWarning("[TrackCraftManager] Rejected invalid recipe guid: " + recipePrefabGuid._Value); return false; } foreach (TrackedRecipeModel trackedRecipe in TrackedRecipes) { PrefabGUID recipePrefabGuid2 = trackedRecipe.RecipePrefabGuid; if (((PrefabGUID)(ref recipePrefabGuid2)).Equals(recipePrefabGuid)) { return false; } } TrackedRecipeModel trackedRecipeModel = RecipeLookup.BuildTrackedRecipe(recipePrefabGuid, quantity); if (trackedRecipeModel == null) { return false; } TrackedRecipes.Add(trackedRecipeModel); RefreshCounts(); return true; } public void RemoveRecipe(int index) { if (index >= 0 && index < TrackedRecipes.Count) { TrackedRecipes.RemoveAt(index); } } public TrackedRecipeModel GetRecipe(PrefabGUID recipePrefabGuid) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) for (int i = 0; i < TrackedRecipes.Count; i++) { if (TrackedRecipes[i].RecipePrefabGuid._Value == recipePrefabGuid._Value) { return TrackedRecipes[i]; } } return null; } public void AddOrReplace(TrackedRecipeModel model) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) if (model == null) { return; } for (int i = 0; i < TrackedRecipes.Count; i++) { if (TrackedRecipes[i].RecipePrefabGuid._Value == model.RecipePrefabGuid._Value