Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of InfinityInventory v1.6.3
InfinityInventory.dll
Decompiled 6 days ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using HarmonyLib; using Jotunn.GUI; using Jotunn.Managers; using Jotunn.Utils; using SimpleJson; using TMPro; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.Events; using UnityEngine.UI; using ValheimResourceInventoryMod; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("StorehouseCharacter")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("StorehouseCharacter")] [assembly: AssemblyCopyright("Copyright © 2026")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("7ebb018e-7e1a-4bf1-a422-e17e94e9900e")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")] [assembly: AssemblyVersion("1.0.0.0")] [HarmonyPatch(typeof(Inventory), "CountItems", new Type[] { typeof(string), typeof(int), typeof(bool) })] internal static class Inventory_CountItems_CustomResourcesPatch { private static void Postfix(Inventory __instance, string name, int quality, bool matchWorldLevel, ref int __result) { ResourceUI resourceUI = ResourceInventoryMod.ResourceUI; if (resourceUI == null || resourceUI.inventorySlots == null || string.IsNullOrEmpty(name)) { return; } Player localPlayer = Player.m_localPlayer; if ((Object)(object)localPlayer == (Object)null || __instance != ((Humanoid)localPlayer).GetInventory()) { return; } int num = 0; foreach (CustomInventorySlot inventorySlot in resourceUI.inventorySlots) { if (!(inventorySlot.SharedName == name)) { continue; } if (quality >= 0) { if (inventorySlot.Quality == quality) { num += inventorySlot.Stack; } } else { num += inventorySlot.Stack; } } if (num > 0) { __result += num; } } } namespace ValheimResourceInventoryMod; [HarmonyPatch(typeof(Player), "AutoPickup", new Type[] { typeof(float) })] internal static class AutoPickUpPatch { [CompilerGenerated] private sealed class <Transpiler>d__2 : IEnumerable<CodeInstruction>, IEnumerable, IEnumerator<CodeInstruction>, IDisposable, IEnumerator { private int <>1__state; private CodeInstruction <>2__current; private int <>l__initialThreadId; private IEnumerable<CodeInstruction> instructions; public IEnumerable<CodeInstruction> <>3__instructions; private MethodInfo <forceCanAdd>5__1; private MethodInfo <forceMax>5__2; private IEnumerator<CodeInstruction> <>s__3; private CodeInstruction <ci>5__4; private MethodInfo <mi>5__5; private Type <p0>5__6; private Type <p1>5__7; CodeInstruction IEnumerator<CodeInstruction>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <Transpiler>d__2(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void IDisposable.Dispose() { int num = <>1__state; if (num == -3 || num == 1) { try { } finally { <>m__Finally1(); } } <forceCanAdd>5__1 = null; <forceMax>5__2 = null; <>s__3 = null; <ci>5__4 = null; <mi>5__5 = null; <p0>5__6 = null; <p1>5__7 = null; <>1__state = -2; } private bool MoveNext() { try { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <forceCanAdd>5__1 = AccessTools.Method(typeof(AutoPickUpPatch), "ForceCanAddItem", (Type[])null, (Type[])null); <forceMax>5__2 = AccessTools.Method(typeof(AutoPickUpPatch), "ForceGetMaxCarryWeight", (Type[])null, (Type[])null); <>s__3 = instructions.GetEnumerator(); <>1__state = -3; break; case 1: <>1__state = -3; <mi>5__5 = null; <ci>5__4 = null; break; } if (<>s__3.MoveNext()) { <ci>5__4 = <>s__3.Current; object operand = <ci>5__4.operand; <mi>5__5 = operand as MethodInfo; if ((object)<mi>5__5 != null) { if (<mi>5__5.Name == "CanAddItem" && <mi>5__5.ReturnType == typeof(bool) && <mi>5__5.GetParameters().Length == 2) { <p0>5__6 = <mi>5__5.GetParameters()[0].ParameterType; <p1>5__7 = <mi>5__5.GetParameters()[1].ParameterType; if (<p0>5__6 == typeof(ItemData) && <p1>5__7 == typeof(int)) { <ci>5__4.opcode = OpCodes.Call; <ci>5__4.operand = <forceCanAdd>5__1; } <p0>5__6 = null; <p1>5__7 = null; } else if (<mi>5__5.Name == "GetMaxCarryWeight" && <mi>5__5.ReturnType == typeof(float) && <mi>5__5.GetParameters().Length == 0) { <ci>5__4.opcode = OpCodes.Call; <ci>5__4.operand = <forceMax>5__2; } } <>2__current = <ci>5__4; <>1__state = 1; return true; } <>m__Finally1(); <>s__3 = null; return false; } catch { //try-fault ((IDisposable)this).Dispose(); throw; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; if (<>s__3 != null) { <>s__3.Dispose(); } } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } [DebuggerHidden] IEnumerator<CodeInstruction> IEnumerable<CodeInstruction>.GetEnumerator() { <Transpiler>d__2 <Transpiler>d__; if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; <Transpiler>d__ = this; } else { <Transpiler>d__ = new <Transpiler>d__2(0); } <Transpiler>d__.instructions = <>3__instructions; return <Transpiler>d__; } [DebuggerHidden] IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable<CodeInstruction>)this).GetEnumerator(); } } private static bool ForceCanAddItem(Inventory inv, ItemData item, int stack) { return true; } private static float ForceGetMaxCarryWeight(Player p) { return 999999f; } [IteratorStateMachine(typeof(<Transpiler>d__2))] [HarmonyTranspiler] private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <Transpiler>d__2(-2) { <>3__instructions = instructions }; } } [Serializable] public class CustomInventorySlot { public string PrefabName; public string SharedName; public int Stack = 1; public int Quality = 1; public float Durability = 100f; public int Variant; public int WorldLevel; public long CrafterID; public string CrafterName = ""; public int MaxStackSize = 1; public Dictionary<string, string> CustomData = new Dictionary<string, string>(); public string Rarity = ""; private ItemType? _cachedItemType; private Color? _cachedRarityColor; private static readonly HashSet<ItemType> UniqueItemTypes = new HashSet<ItemType> { (ItemType)3, (ItemType)4, (ItemType)5, (ItemType)6, (ItemType)7, (ItemType)10, (ItemType)11, (ItemType)12, (ItemType)14, (ItemType)15, (ItemType)19, (ItemType)22, (ItemType)24, (ItemType)17, (ItemType)18, (ItemType)20 }; public bool IsUnique { get { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) ItemType itemType = GetItemType(); return UniqueItemTypes.Contains(itemType); } } public bool CanDoStackOperations() { return !IsUnique; } public bool CanStackWith(CustomInventorySlot other) { if (other == null) { return false; } if (SharedName != other.SharedName) { return false; } if (IsUnique || other.IsUnique) { return false; } return true; } public Color GetRarityColor() { //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_004e: 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_0034: 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_0048: Unknown result type (might be due to invalid IL or missing references) //IL_01aa: 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) //IL_01a6: Unknown result type (might be due to invalid IL or missing references) //IL_01a7: Unknown result type (might be due to invalid IL or missing references) if (_cachedRarityColor.HasValue) { return _cachedRarityColor.Value; } if (string.IsNullOrEmpty(Rarity)) { _cachedRarityColor = Color.white; return Color.white; } Color white = Color.white; string text = Rarity.ToLower(); if (text == "magic" || text.Contains("magic")) { ((Color)(ref white))..ctor(0.2f, 0.5f, 1f, 0.08f); } else if (text == "rare" || text.Contains("rare")) { ((Color)(ref white))..ctor(1f, 1f, 0.2f, 0.08f); } else if (text == "epic" || text.Contains("epic")) { ((Color)(ref white))..ctor(0.7f, 0.2f, 1f, 0.08f); } else if (text == "legendary" || text.Contains("legendary")) { ((Color)(ref white))..ctor(0f, 0.7f, 0.7f, 0.08f); } else if (text == "mythic" || text.Contains("mythic")) { ((Color)(ref white))..ctor(1f, 0.5f, 0f, 0.08f); } _cachedRarityColor = white; return white; } private ItemType GetItemType() { //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_0031: 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) //IL_0198: 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_00ba: 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_014e: Unknown result type (might be due to invalid IL or missing references) //IL_0170: Unknown result type (might be due to invalid IL or missing references) //IL_0175: Unknown result type (might be due to invalid IL or missing references) if (_cachedItemType.HasValue) { return _cachedItemType.Value; } if ((Object)(object)ObjectDB.instance == (Object)null) { return (ItemType)0; } if (!string.IsNullOrEmpty(PrefabName)) { GameObject itemPrefab = ObjectDB.instance.GetItemPrefab(PrefabName); if ((Object)(object)itemPrefab != (Object)null) { ItemDrop component = itemPrefab.GetComponent<ItemDrop>(); if (component?.m_itemData?.m_shared != null) { _cachedItemType = component.m_itemData.m_shared.m_itemType; return _cachedItemType.Value; } } } if (!string.IsNullOrEmpty(SharedName)) { foreach (GameObject item in ObjectDB.instance.m_items) { ItemDrop component2 = item.GetComponent<ItemDrop>(); if (component2?.m_itemData?.m_shared?.m_name == SharedName) { _cachedItemType = component2.m_itemData.m_shared.m_itemType; PrefabName = ((Object)item).name; return _cachedItemType.Value; } } } return (ItemType)0; } public CustomInventorySlot Clone() { return new CustomInventorySlot { PrefabName = PrefabName, SharedName = SharedName, Stack = Stack, Quality = Quality, Durability = Durability, Variant = Variant, WorldLevel = WorldLevel, CrafterID = CrafterID, CrafterName = CrafterName, MaxStackSize = MaxStackSize, CustomData = new Dictionary<string, string>(CustomData), _cachedItemType = _cachedItemType, Rarity = Rarity, _cachedRarityColor = _cachedRarityColor }; } public static CustomInventorySlot FromItemData(ItemData item) { //IL_00d9: Unknown result type (might be due to invalid IL or missing references) if (item == null) { return null; } CustomInventorySlot customInventorySlot = new CustomInventorySlot(); GameObject dropPrefab = item.m_dropPrefab; customInventorySlot.PrefabName = ((dropPrefab != null) ? ((Object)dropPrefab).name : null) ?? ""; customInventorySlot.SharedName = item.m_shared?.m_name ?? ""; customInventorySlot.Stack = item.m_stack; customInventorySlot.Quality = item.m_quality; customInventorySlot.Durability = item.m_durability; customInventorySlot.Variant = item.m_variant; customInventorySlot.WorldLevel = item.m_worldLevel; customInventorySlot.CrafterID = item.m_crafterID; customInventorySlot.CrafterName = item.m_crafterName; customInventorySlot.MaxStackSize = item.m_shared?.m_maxStackSize ?? 1; customInventorySlot._cachedItemType = item.m_shared?.m_itemType; CustomInventorySlot customInventorySlot2 = customInventorySlot; if (item.m_customData != null) { foreach (KeyValuePair<string, string> customDatum in item.m_customData) { customInventorySlot2.CustomData[customDatum.Key] = customDatum.Value; } string key = "randyknapp.mods.epicloot#EpicLoot.MagicItemComponent"; if (item.m_customData.TryGetValue(key, out var value)) { if (value.Contains("\"Rarity\": 0") || value.Contains("\"Rarity\":0")) { customInventorySlot2.Rarity = "Magic"; } else if (value.Contains("\"Rarity\": 1") || value.Contains("\"Rarity\":1")) { customInventorySlot2.Rarity = "Rare"; } else if (value.Contains("\"Rarity\": 2") || value.Contains("\"Rarity\":2")) { customInventorySlot2.Rarity = "Epic"; } else if (value.Contains("\"Rarity\": 3") || value.Contains("\"Rarity\":3")) { customInventorySlot2.Rarity = "Legendary"; } else if (value.Contains("\"Rarity\": 4") || value.Contains("\"Rarity\":4")) { customInventorySlot2.Rarity = "Mythic"; } } } return customInventorySlot2; } public ItemData ToItemData() { if ((Object)(object)ObjectDB.instance == (Object)null) { return null; } GameObject val = null; if (!string.IsNullOrEmpty(PrefabName)) { val = ObjectDB.instance.GetItemPrefab(PrefabName); } if ((Object)(object)val == (Object)null && !string.IsNullOrEmpty(SharedName)) { foreach (GameObject item in ObjectDB.instance.m_items) { if (item.GetComponent<ItemDrop>()?.m_itemData?.m_shared?.m_name == SharedName) { val = item; break; } } } if ((Object)(object)val == (Object)null) { return null; } ItemDrop component = val.GetComponent<ItemDrop>(); if (component?.m_itemData == null) { return null; } ItemData val2 = component.m_itemData.Clone(); val2.m_stack = Stack; val2.m_quality = Quality; val2.m_durability = Durability; val2.m_variant = Variant; val2.m_worldLevel = WorldLevel; val2.m_crafterID = CrafterID; val2.m_crafterName = CrafterName; val2.m_dropPrefab = val; val2.m_customData.Clear(); foreach (KeyValuePair<string, string> customDatum in CustomData) { val2.m_customData[customDatum.Key] = customDatum.Value; } return val2; } } [HarmonyPatch(typeof(CookingStation), "OnAddFoodSwitch")] internal static class CookingStation_OnAddFoodSwitch_Patch { private static bool Prefix(CookingStation __instance, Switch caller, Humanoid user, ItemData item, ref bool __result) { if ((Object)(object)__instance.m_addFoodSwitch == (Object)null) { return true; } if (item != null) { return true; } if (Traverse.Create((object)__instance).Method("HaveDoneItem", Array.Empty<object>()).GetValue<bool>()) { return true; } ResourceUI resourceUI = ResourceInventoryMod.ResourceUI; if (resourceUI == null || resourceUI.inventorySlots == null) { return true; } string text = ResourceUI.PrioritizedItemForCooking; bool flag = false; if (!string.IsNullOrEmpty(text)) { flag = resourceUI.IsItemValidForStation(text, __instance); } if (!flag) { string text2 = (ResourceUI.PrioritizedItemForCooking = resourceUI.FindFirstValidItemForStation(__instance)); text = text2; if (!string.IsNullOrEmpty(text2)) { Player localPlayer = Player.m_localPlayer; if (localPlayer != null) { ((Character)localPlayer).Message((MessageType)1, "Auto-prioritized: " + resourceUI.GetLocalizedName(text2), 0, (Sprite)null); } resourceUI.OnResourcesChanged(); } } if (!string.IsNullOrEmpty(text)) { CustomInventorySlot slotByName = GetSlotByName(resourceUI, text); if (slotByName != null && slotByName.Stack > 0) { return UsePriorityItem(__instance, user, slotByName, ref __result); } string text3 = (ResourceUI.PrioritizedItemForCooking = resourceUI.FindFirstValidItemForStation(__instance)); if (!string.IsNullOrEmpty(text3)) { Player localPlayer2 = Player.m_localPlayer; if (localPlayer2 != null) { ((Character)localPlayer2).Message((MessageType)1, "Switched to: " + resourceUI.GetLocalizedName(text3), 0, (Sprite)null); } resourceUI.OnResourcesChanged(); slotByName = GetSlotByName(resourceUI, text3); if (slotByName != null && slotByName.Stack > 0) { return UsePriorityItem(__instance, user, slotByName, ref __result); } } } return true; } private static CustomInventorySlot GetSlotByName(ResourceUI ui, string sharedName) { foreach (CustomInventorySlot inventorySlot in ui.inventorySlots) { if (inventorySlot.SharedName == sharedName) { return inventorySlot; } } return null; } private static bool UsePriorityItem(CookingStation __instance, Humanoid user, CustomInventorySlot slot, ref bool __result) { ResourceUI resourceUI = ResourceInventoryMod.ResourceUI; if (resourceUI == null) { return true; } if (__instance.m_requireFire && !Traverse.Create((object)__instance).Method("IsFireLit", Array.Empty<object>()).GetValue<bool>()) { ((Character)user).Message((MessageType)2, "$msg_needfire", 0, (Sprite)null); __result = false; return false; } int value = Traverse.Create((object)__instance).Method("GetFreeSlot", Array.Empty<object>()).GetValue<int>(); if (value == -1) { ((Character)user).Message((MessageType)2, "$msg_nocookroom", 0, (Sprite)null); __result = false; return false; } slot.Stack--; if (slot.Stack <= 0) { resourceUI.inventorySlots.Remove(slot); } string text = slot.PrefabName; if (string.IsNullOrEmpty(text)) { GameObject prefabBySharedNamePublic = resourceUI.GetPrefabBySharedNamePublic(slot.SharedName); if ((Object)(object)prefabBySharedNamePublic != (Object)null) { text = ((Object)prefabBySharedNamePublic).name; } } ZNetView value2 = Traverse.Create((object)__instance).Field("m_nview").GetValue<ZNetView>(); if ((Object)(object)value2 != (Object)null) { if (!value2.HasOwner()) { value2.ClaimOwnership(); } value2.InvokeRPC("RPC_AddItem", new object[1] { text }); } resourceUI.OnResourcesChanged(); Player localPlayer = Player.m_localPlayer; if (localPlayer != null) { ((Character)localPlayer).RaiseSkill((SkillType)105, 0.4f); } __result = true; return false; } } [HarmonyPatch(typeof(CookingStation), "Interact")] internal static class CookingStation_Interact_AutoPriority_Patch { private static bool Prefix(CookingStation __instance, Humanoid user, bool hold, bool alt, ref bool __result) { if ((Object)(object)__instance.m_addFoodSwitch != (Object)null) { return true; } if (hold || alt) { return true; } if (Traverse.Create((object)__instance).Method("HaveDoneItem", Array.Empty<object>()).GetValue<bool>()) { return true; } ResourceUI resourceUI = ResourceInventoryMod.ResourceUI; if (resourceUI == null || resourceUI.inventorySlots == null) { return true; } string text = ResourceUI.PrioritizedItemForCooking; bool flag = false; if (!string.IsNullOrEmpty(text)) { flag = resourceUI.IsItemValidForStation(text, __instance); } if (!flag) { string text2 = (ResourceUI.PrioritizedItemForCooking = resourceUI.FindFirstValidItemForStation(__instance)); text = text2; if (!string.IsNullOrEmpty(text2)) { Player localPlayer = Player.m_localPlayer; if (localPlayer != null) { ((Character)localPlayer).Message((MessageType)1, "Auto-prioritized: " + resourceUI.GetLocalizedName(text2), 0, (Sprite)null); } resourceUI.OnResourcesChanged(); } } if (!string.IsNullOrEmpty(text)) { CustomInventorySlot slotByName = GetSlotByName(resourceUI, text); if (slotByName != null && slotByName.Stack > 0) { return UsePriorityItem(__instance, user, slotByName, ref __result); } string text3 = (ResourceUI.PrioritizedItemForCooking = resourceUI.FindFirstValidItemForStation(__instance)); if (!string.IsNullOrEmpty(text3)) { Player localPlayer2 = Player.m_localPlayer; if (localPlayer2 != null) { ((Character)localPlayer2).Message((MessageType)1, "Switched to: " + resourceUI.GetLocalizedName(text3), 0, (Sprite)null); } resourceUI.OnResourcesChanged(); slotByName = GetSlotByName(resourceUI, text3); if (slotByName != null && slotByName.Stack > 0) { return UsePriorityItem(__instance, user, slotByName, ref __result); } } } return true; } private static CustomInventorySlot GetSlotByName(ResourceUI ui, string sharedName) { foreach (CustomInventorySlot inventorySlot in ui.inventorySlots) { if (inventorySlot.SharedName == sharedName) { return inventorySlot; } } return null; } private static bool UsePriorityItem(CookingStation __instance, Humanoid user, CustomInventorySlot slot, ref bool __result) { ResourceUI resourceUI = ResourceInventoryMod.ResourceUI; if (resourceUI == null) { return true; } if (__instance.m_requireFire && !Traverse.Create((object)__instance).Method("IsFireLit", Array.Empty<object>()).GetValue<bool>()) { ((Character)user).Message((MessageType)2, "$msg_needfire", 0, (Sprite)null); __result = false; return false; } int value = Traverse.Create((object)__instance).Method("GetFreeSlot", Array.Empty<object>()).GetValue<int>(); if (value == -1) { ((Character)user).Message((MessageType)2, "$msg_nocookroom", 0, (Sprite)null); __result = false; return false; } slot.Stack--; if (slot.Stack <= 0) { resourceUI.inventorySlots.Remove(slot); } string text = slot.PrefabName; if (string.IsNullOrEmpty(text)) { GameObject prefabBySharedNamePublic = resourceUI.GetPrefabBySharedNamePublic(slot.SharedName); if ((Object)(object)prefabBySharedNamePublic != (Object)null) { text = ((Object)prefabBySharedNamePublic).name; } } ZNetView value2 = Traverse.Create((object)__instance).Field("m_nview").GetValue<ZNetView>(); if ((Object)(object)value2 != (Object)null) { if (!value2.HasOwner()) { value2.ClaimOwnership(); } value2.InvokeRPC("RPC_AddItem", new object[1] { text }); } resourceUI.OnResourcesChanged(); Player localPlayer = Player.m_localPlayer; if (localPlayer != null) { ((Character)localPlayer).RaiseSkill((SkillType)105, 0.4f); } __result = true; return false; } } [HarmonyPatch(typeof(CookingStation), "OnInteract")] internal static class CookingStation_OnInteract_Priority_Patch { private static bool Prefix(CookingStation __instance, Humanoid user, ref bool __result) { if (!Input.GetKey((KeyCode)114)) { return true; } ItemData hoveredItem = GetHoveredItem(); if (hoveredItem != null && IsItemAllowed(__instance, hoveredItem)) { if (__instance.m_requireFire && !Traverse.Create((object)__instance).Method("IsFireLit", Array.Empty<object>()).GetValue<bool>()) { ((Character)user).Message((MessageType)2, "$msg_needfire", 0, (Sprite)null); __result = false; return false; } int value = Traverse.Create((object)__instance).Method("GetFreeSlot", Array.Empty<object>()).GetValue<int>(); if (value == -1) { ((Character)user).Message((MessageType)2, "$msg_nocookroom", 0, (Sprite)null); __result = false; return false; } ResourceUI resourceUI = ResourceInventoryMod.ResourceUI; if (user.GetInventory().HaveItem(hoveredItem.m_shared.m_name, true)) { return true; } if (resourceUI != null && resourceUI.inventorySlots != null) { CustomInventorySlot customInventorySlot = CookingStationPatchesHelper.FindSlotBySharedName(resourceUI, hoveredItem.m_shared.m_name); if (customInventorySlot != null && customInventorySlot.Stack > 0) { customInventorySlot.Stack--; if (customInventorySlot.Stack <= 0) { resourceUI.inventorySlots.Remove(customInventorySlot); } string name = ((Object)hoveredItem.m_dropPrefab).name; ZNetView value2 = Traverse.Create((object)__instance).Field("m_nview").GetValue<ZNetView>(); if ((Object)(object)value2 != (Object)null) { if (!value2.HasOwner()) { value2.ClaimOwnership(); } value2.InvokeRPC("RPC_AddItem", new object[1] { name }); } resourceUI.OnResourcesChanged(); Player localPlayer = Player.m_localPlayer; if (localPlayer != null) { ((Character)localPlayer).RaiseSkill((SkillType)105, 0.4f); } __result = true; return false; } } } return true; } private static ItemData GetHoveredItem() { if ((Object)(object)InventoryGui.instance == (Object)null) { return null; } InventoryGrid playerGrid = InventoryGui.instance.m_playerGrid; if ((Object)(object)playerGrid != (Object)null) { ItemData hoveredItemFromGrid = GetHoveredItemFromGrid(playerGrid); if (hoveredItemFromGrid != null) { return hoveredItemFromGrid; } } return null; } private static ItemData GetHoveredItemFromGrid(InventoryGrid grid) { //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_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_0072: 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_007b: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: 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) IList value = Traverse.Create((object)grid).Field("m_elements").GetValue<IList>(); if (value != null) { foreach (object item in value) { GameObject value2 = Traverse.Create(item).Field("m_go").GetValue<GameObject>(); Transform transform = value2.transform; RectTransform val = (RectTransform)(object)((transform is RectTransform) ? transform : null); Vector2 val2 = Vector2.op_Implicit(((Transform)val).InverseTransformPoint(Input.mousePosition)); Rect rect = val.rect; if (((Rect)(ref rect)).Contains(val2)) { Vector2i value3 = Traverse.Create((object)grid).Method("GetButtonPos", new Type[1] { typeof(GameObject) }, (object[])null).GetValue<Vector2i>(new object[1] { value2 }); Inventory inventory = grid.GetInventory(); return (inventory != null) ? inventory.GetItemAt(value3.x, value3.y) : null; } } } return null; } private static bool IsItemAllowed(CookingStation station, ItemData item) { string name = ((Object)item.m_dropPrefab).name; return Traverse.Create((object)station).Method("IsItemAllowed", new Type[1] { typeof(string) }, (object[])null).GetValue<bool>(new object[1] { name }); } } [HarmonyPatch(typeof(CookingStation), "OnAddFuelSwitch")] internal static class CookingStation_OnAddFuelSwitch_Patch { private static bool Prefix(CookingStation __instance, Switch sw, Humanoid user, ItemData item, ref bool __result) { ResourceUI resourceUI = ResourceInventoryMod.ResourceUI; if (resourceUI == null || resourceUI.inventorySlots == null) { return true; } string name = __instance.m_fuelItem.m_itemData.m_shared.m_name; if (item != null && item.m_shared.m_name != name) { ((Character)user).Message((MessageType)2, "$msg_wrongitem", 0, (Sprite)null); __result = false; return false; } float value = Traverse.Create((object)__instance).Method("GetFuel", Array.Empty<object>()).GetValue<float>(); if (value > (float)(__instance.m_maxFuel - 1)) { ((Character)user).Message((MessageType)2, "$msg_itsfull", 0, (Sprite)null); __result = false; return false; } if (user.GetInventory().HaveItem(name, true)) { return true; } CustomInventorySlot customInventorySlot = CookingStationPatchesHelper.FindSlotBySharedName(resourceUI, name); if (customInventorySlot != null && customInventorySlot.Stack > 0) { customInventorySlot.Stack--; if (customInventorySlot.Stack <= 0) { resourceUI.inventorySlots.Remove(customInventorySlot); } ((Character)user).Message((MessageType)2, "$msg_added " + name, 0, (Sprite)null); ZNetView value2 = Traverse.Create((object)__instance).Field("m_nview").GetValue<ZNetView>(); if ((Object)(object)value2 != (Object)null) { value2.InvokeRPC("RPC_AddFuel", Array.Empty<object>()); } resourceUI.OnResourcesChanged(); __result = true; return false; } ((Character)user).Message((MessageType)2, "$msg_donthaveany " + name, 0, (Sprite)null); __result = false; return false; } } [HarmonyPatch(typeof(CookingStation), "TryGetItems")] internal static class CookingStation_TryGetItems_Patch { private static void Postfix(CookingStation __instance, Player player, Switch switchRef, ref List<string> items) { ResourceUI resourceUI = ResourceInventoryMod.ResourceUI; if (resourceUI == null || resourceUI.inventorySlots == null) { return; } if ((Object)(object)switchRef == (Object)null || (Object)(object)switchRef == (Object)(object)__instance.m_addFoodSwitch) { foreach (ItemConversion item in __instance.m_conversion) { if (!((Object)(object)item.m_from == (Object)null)) { string name = item.m_from.m_itemData.m_shared.m_name; if (CookingStationPatchesHelper.FindSlotBySharedName(resourceUI, name) != null && !items.Contains(name)) { items.Add(name); } } } return; } if ((Object)(object)switchRef == (Object)(object)__instance.m_addFuelSwitch) { string name2 = __instance.m_fuelItem.m_itemData.m_shared.m_name; if (CookingStationPatchesHelper.FindSlotBySharedName(resourceUI, name2) != null && !items.Contains(name2)) { items.Add(name2); } } } } [HarmonyPatch(typeof(CookingStation), "CanUseItems")] internal static class CookingStation_CanUseItems_Patch { private static void Postfix(CookingStation __instance, Player player, Switch switchRef, bool sendErrorMessage, ref bool __result) { if (__result) { return; } ResourceUI resourceUI = ResourceInventoryMod.ResourceUI; if (resourceUI == null || resourceUI.inventorySlots == null) { return; } if ((Object)(object)switchRef == (Object)null || (Object)(object)switchRef == (Object)(object)__instance.m_addFoodSwitch) { if (__instance.m_requireFire && !Traverse.Create((object)__instance).Method("IsFireLit", Array.Empty<object>()).GetValue<bool>()) { __result = false; return; } int value = Traverse.Create((object)__instance).Method("GetFreeSlot", Array.Empty<object>()).GetValue<int>(); if (value != -1) { foreach (ItemConversion item in __instance.m_conversion) { if (!((Object)(object)item.m_from == (Object)null) && CookingStationPatchesHelper.FindSlotBySharedName(resourceUI, item.m_from.m_itemData.m_shared.m_name) != null) { __result = true; break; } } return; } __result = false; } else if ((Object)(object)switchRef == (Object)(object)__instance.m_addFuelSwitch) { float value2 = Traverse.Create((object)__instance).Method("GetFuel", Array.Empty<object>()).GetValue<float>(); if (value2 > (float)(__instance.m_maxFuel - 1)) { __result = false; } else if (CookingStationPatchesHelper.FindSlotBySharedName(resourceUI, __instance.m_fuelItem.m_itemData.m_shared.m_name) != null) { __result = true; } } } } [HarmonyPatch(typeof(CookingStation), "RPC_RemoveDoneItem")] internal static class CookingStation_RPC_RemoveDoneItem_Patch { private static bool Prefix(CookingStation __instance, long sender, Vector3 userPoint, int amount) { ResourceUI resourceUI = ResourceInventoryMod.ResourceUI; if (resourceUI == null || !resourceUI.IsInitialized) { return true; } ZNetView value = Traverse.Create((object)__instance).Field("m_nview").GetValue<ZNetView>(); Transform[] value2 = Traverse.Create((object)__instance).Field("m_slots").GetValue<Transform[]>(); if ((Object)(object)value == (Object)null || value2 == null) { return true; } for (int i = 0; i < value2.Length; i++) { string @string = value.GetZDO().GetString("slot" + i, ""); if (string.IsNullOrEmpty(@string) || !IsItemDone(__instance, @string)) { continue; } ItemConversion itemConversion = GetItemConversion(__instance, @string); if (itemConversion == null || !((Object)(object)itemConversion.m_to != (Object)null)) { break; } ItemData val = itemConversion.m_to.m_itemData.Clone(); val.m_stack = amount; resourceUI.AddItemFromPickup(val); try { if ((Object)(object)Player.m_localPlayer != (Object)null) { Player.m_localPlayer.AddKnownItem(val); } } catch (Exception ex) { Debug.LogWarning((object)("[CookingStation] AddKnownItem failed: " + ex.Message)); } value.GetZDO().Set("slot" + i, ""); value.GetZDO().Set("slot" + i, 0f); value.GetZDO().Set("slotstatus" + i, 0); value.InvokeRPC(ZNetView.Everybody, "RPC_SetSlotVisual", new object[2] { i, "" }); resourceUI.OnResourcesChanged(); Player localPlayer = Player.m_localPlayer; if (localPlayer != null) { ((Character)localPlayer).Message((MessageType)1, $"Picked up: {val.m_shared.m_name} x{amount}", 0, (Sprite)null); } return false; } return true; } private static bool IsItemDone(CookingStation station, string itemName) { ItemDrop overCookedItem = station.m_overCookedItem; string text = ((overCookedItem != null) ? ((Object)overCookedItem).name : null); if (itemName == text) { return true; } ItemConversion itemConversion = GetItemConversion(station, itemName); if (itemConversion == null) { return false; } return itemName == ((Object)itemConversion.m_to).name; } private static ItemConversion GetItemConversion(CookingStation station, string itemName) { foreach (ItemConversion item in station.m_conversion) { ItemDrop from = item.m_from; object obj; if (from == null) { obj = null; } else { GameObject gameObject = ((Component)from).gameObject; obj = ((gameObject != null) ? ((Object)gameObject).name : null); } if (!((string?)obj == itemName)) { ItemDrop to = item.m_to; object obj2; if (to == null) { obj2 = null; } else { GameObject gameObject2 = ((Component)to).gameObject; obj2 = ((gameObject2 != null) ? ((Object)gameObject2).name : null); } if (!((string?)obj2 == itemName)) { continue; } } return item; } return null; } } internal static class CookingStationPatchesHelper { public static CustomInventorySlot FindSlotBySharedName(ResourceUI ui, string sharedName) { foreach (CustomInventorySlot inventorySlot in ui.inventorySlots) { if (inventorySlot.SharedName == sharedName && inventorySlot.Quality <= 1 && inventorySlot.Stack > 0) { return inventorySlot; } } return null; } } [HarmonyPatch(typeof(Fermenter), "Interact")] internal static class Fermenter_Interact_Patch { private static bool Prefix(Fermenter __instance, Humanoid user, bool hold, bool alt, ref bool __result) { //IL_0088: Unknown result type (might be due to invalid IL or missing references) if (hold) { return true; } ResourceUI resourceUI = ResourceInventoryMod.ResourceUI; if (resourceUI == null || resourceUI.inventorySlots == null) { return true; } Traverse.Create((object)__instance).Method("UpdateCover", new Type[2] { typeof(float), typeof(bool) }, (object[])null).GetValue(new object[2] { 0f, true }); if (!PrivateArea.CheckAccess(((Component)__instance).transform.position, 0f, true, false)) { __result = true; return false; } switch (Traverse.Create((object)__instance).Method("GetStatus", Array.Empty<object>()).GetValue<int>()) { case 0: { bool value = Traverse.Create((object)__instance).Field("m_hasRoof").GetValue<bool>(); bool value2 = Traverse.Create((object)__instance).Field("m_exposed").GetValue<bool>(); if (!value) { ((Character)user).Message((MessageType)2, "$piece_fermenter_needroof", 0, (Sprite)null); __result = false; return false; } if (value2) { ((Character)user).Message((MessageType)2, "$piece_fermenter_exposed", 0, (Sprite)null); __result = false; return false; } Inventory inventory = user.GetInventory(); ItemData value3 = Traverse.Create((object)__instance).Method("FindCookableItem", new Type[1] { typeof(Inventory) }, (object[])null).GetValue<ItemData>(new object[1] { inventory }); if (value3 != null) { return true; } foreach (ItemConversion item in __instance.m_conversion) { if ((Object)(object)item.m_from == (Object)null) { continue; } string name = item.m_from.m_itemData.m_shared.m_name; CustomInventorySlot customInventorySlot = FermenterStationPatchesHelper.FindSlotBySharedName(resourceUI, name); if (customInventorySlot == null || customInventorySlot.Stack <= 0) { continue; } customInventorySlot.Stack--; if (customInventorySlot.Stack <= 0) { resourceUI.inventorySlots.Remove(customInventorySlot); } string name2 = ((Object)((Component)item.m_from).gameObject).name; ZNetView value4 = Traverse.Create((object)__instance).Field("m_nview").GetValue<ZNetView>(); if ((Object)(object)value4 != (Object)null) { value4.InvokeRPC("RPC_AddItem", new object[1] { name2 }); } resourceUI.OnResourcesChanged(); __result = true; return false; } ((Character)user).Message((MessageType)2, "$msg_noprocessableitems", 0, (Sprite)null); __result = false; return false; } case 3: return true; default: return true; } } } [HarmonyPatch(typeof(Fermenter), "UseItem")] internal static class Fermenter_UseItem_Patch { private static bool Prefix(Fermenter __instance, Humanoid user, ItemData item, ref bool __result) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) if (!PrivateArea.CheckAccess(((Component)__instance).transform.position, 0f, true, false)) { __result = false; return false; } ResourceUI resourceUI = ResourceInventoryMod.ResourceUI; if (resourceUI == null || resourceUI.inventorySlots == null) { return true; } if (Traverse.Create((object)__instance).Method("GetStatus", Array.Empty<object>()).GetValue<int>() != 0) { __result = false; return false; } string name = ((Object)item.m_dropPrefab).name; if (!Traverse.Create((object)__instance).Method("IsItemAllowed", new Type[1] { typeof(string) }, (object[])null).GetValue<bool>(new object[1] { name })) { __result = false; return false; } if (user.GetInventory().HaveItem(item.m_shared.m_name, true)) { return true; } CustomInventorySlot customInventorySlot = CookingStationPatchesHelper.FindSlotBySharedName(resourceUI, item.m_shared.m_name); if (customInventorySlot != null && customInventorySlot.Stack > 0) { customInventorySlot.Stack--; if (customInventorySlot.Stack <= 0) { resourceUI.inventorySlots.Remove(customInventorySlot); } ZNetView value = Traverse.Create((object)__instance).Field("m_nview").GetValue<ZNetView>(); if ((Object)(object)value != (Object)null) { value.InvokeRPC("RPC_AddItem", new object[1] { name }); } resourceUI.OnResourcesChanged(); __result = true; return false; } __result = false; return false; } } internal static class FermenterStationPatchesHelper { public static CustomInventorySlot FindSlotBySharedName(ResourceUI ui, string sharedName) { foreach (CustomInventorySlot inventorySlot in ui.inventorySlots) { if (inventorySlot.SharedName == sharedName && inventorySlot.Quality <= 1 && inventorySlot.Stack > 0) { return inventorySlot; } } return null; } } [HarmonyPatch(typeof(Fireplace), "Interact")] internal static class Fireplace_Interact_Patch { private static bool Prefix(Fireplace __instance, Humanoid user, bool hold, bool alt) { //IL_01af: Unknown result type (might be due to invalid IL or missing references) //IL_01ba: Unknown result type (might be due to invalid IL or missing references) if (hold || alt) { return true; } ResourceUI resourceUI = ResourceInventoryMod.ResourceUI; if (resourceUI == null || resourceUI.inventorySlots == null) { return true; } if (!__instance.m_canRefill) { return true; } ZNetView value = Traverse.Create((object)__instance).Field("m_nview").GetValue<ZNetView>(); if ((Object)(object)value == (Object)null) { return true; } float @float = value.GetZDO().GetFloat(ZDOVars.s_fuel, 0f); if ((float)Mathf.CeilToInt(@float) >= __instance.m_maxFuel) { return true; } string name = __instance.m_fuelItem.m_itemData.m_shared.m_name; Inventory inventory = user.GetInventory(); if (inventory.HaveItem(name, true)) { return true; } CustomInventorySlot customInventorySlot = null; foreach (CustomInventorySlot inventorySlot in resourceUI.inventorySlots) { if (inventorySlot.SharedName == name && inventorySlot.Quality <= 1) { customInventorySlot = inventorySlot; break; } } if (customInventorySlot != null && customInventorySlot.Stack > 0) { customInventorySlot.Stack--; if (customInventorySlot.Stack <= 0) { resourceUI.inventorySlots.Remove(customInventorySlot); } value.InvokeRPC("RPC_AddFuel", Array.Empty<object>()); __instance.m_fuelAddedEffects.Create(((Component)__instance).transform.position, ((Component)__instance).transform.rotation, (Transform)null, 1f, -1); ((Character)user).Message((MessageType)2, Localization.instance.Localize("$msg_fireadding", new string[1] { __instance.m_fuelItem.m_itemData.m_shared.m_name }), 0, (Sprite)null); resourceUI.OnResourcesChanged(); return false; } return true; } } [HarmonyPatch(typeof(Fireplace), "UseItem")] internal static class Fireplace_UseItem_Patch { private static bool Prefix(Fireplace __instance, Humanoid user, ItemData item, ref bool __result) { //IL_022c: Unknown result type (might be due to invalid IL or missing references) //IL_0231: Unknown result type (might be due to invalid IL or missing references) //IL_023e: Unknown result type (might be due to invalid IL or missing references) //IL_028d: Unknown result type (might be due to invalid IL or missing references) //IL_0335: Unknown result type (might be due to invalid IL or missing references) //IL_0366: Unknown result type (might be due to invalid IL or missing references) //IL_045f: Unknown result type (might be due to invalid IL or missing references) //IL_0464: Unknown result type (might be due to invalid IL or missing references) //IL_0466: Unknown result type (might be due to invalid IL or missing references) //IL_0473: Unknown result type (might be due to invalid IL or missing references) //IL_0478: Unknown result type (might be due to invalid IL or missing references) //IL_0493: Unknown result type (might be due to invalid IL or missing references) //IL_049e: Unknown result type (might be due to invalid IL or missing references) ResourceUI resourceUI = ResourceInventoryMod.ResourceUI; if (item.m_shared.m_name == __instance.m_fuelItem.m_itemData.m_shared.m_name && !__instance.m_infiniteFuel) { ZNetView value = Traverse.Create((object)__instance).Field("m_nview").GetValue<ZNetView>(); if ((Object)(object)value == (Object)null) { return true; } if ((float)Mathf.CeilToInt(value.GetZDO().GetFloat(ZDOVars.s_fuel, 0f)) >= __instance.m_maxFuel) { ((Character)user).Message((MessageType)2, Localization.instance.Localize("$msg_cantaddmore", new string[1] { item.m_shared.m_name }), 0, (Sprite)null); __result = true; return false; } if (user.GetInventory().HaveItem(item.m_shared.m_name, true)) { return true; } if (resourceUI != null && resourceUI.inventorySlots != null) { CustomInventorySlot customInventorySlot = null; foreach (CustomInventorySlot inventorySlot in resourceUI.inventorySlots) { if (inventorySlot.SharedName == item.m_shared.m_name && inventorySlot.Quality <= 1) { customInventorySlot = inventorySlot; break; } } if (customInventorySlot != null && customInventorySlot.Stack > 0) { customInventorySlot.Stack--; if (customInventorySlot.Stack <= 0) { resourceUI.inventorySlots.Remove(customInventorySlot); } value.InvokeRPC("RPC_AddFuel", Array.Empty<object>()); ((Character)user).Message((MessageType)2, Localization.instance.Localize("$msg_fireadding", new string[1] { item.m_shared.m_name }), 0, (Sprite)null); resourceUI.OnResourcesChanged(); __result = true; return false; } } } for (int i = 0; i < __instance.m_fireworkItemList.Length; i++) { FireworkItem val = __instance.m_fireworkItemList[i]; if (!(item.m_shared.m_name == val.m_fireworkItem.m_itemData.m_shared.m_name)) { continue; } if (!__instance.IsBurning()) { ((Character)user).Message((MessageType)2, "$msg_firenotburning", 0, (Sprite)null); __result = true; return false; } string name = val.m_fireworkItem.m_itemData.m_shared.m_name; int num = user.GetInventory().CountItems(name, -1, true); int num2 = 0; CustomInventorySlot customInventorySlot2 = null; if (resourceUI != null && resourceUI.inventorySlots != null) { foreach (CustomInventorySlot inventorySlot2 in resourceUI.inventorySlots) { if (inventorySlot2.SharedName == name) { customInventorySlot2 = inventorySlot2; num2 = inventorySlot2.Stack; break; } } } int num3 = num + num2; if (num3 < val.m_fireworkItemCount) { ((Character)user).Message((MessageType)2, "$msg_toofew " + name, 0, (Sprite)null); __result = true; return false; } int num4 = val.m_fireworkItemCount; if (num > 0) { int num5 = Mathf.Min(num, num4); user.GetInventory().RemoveItem(item.m_shared.m_name, num5, -1, true); num4 -= num5; } if (num4 > 0 && customInventorySlot2 != null) { customInventorySlot2.Stack -= num4; if (customInventorySlot2.Stack <= 0) { resourceUI.inventorySlots.Remove(customInventorySlot2); } resourceUI.OnResourcesChanged(); } ((Character)user).Message((MessageType)2, Localization.instance.Localize("$msg_throwinfire", new string[1] { item.m_shared.m_name }), 0, (Sprite)null); float num6 = Random.Range(0f - __instance.m_fireworksMaxRandomAngle, __instance.m_fireworksMaxRandomAngle); float num7 = Random.Range(0f - __instance.m_fireworksMaxRandomAngle, __instance.m_fireworksMaxRandomAngle); Quaternion val2 = Quaternion.Euler(num6, 0f, num7); val.m_fireworksEffects.Create(((Component)__instance).transform.position, val2, (Transform)null, 1f, -1); __instance.m_fuelAddedEffects.Create(((Component)__instance).transform.position, ((Component)__instance).transform.rotation, (Transform)null, 1f, -1); __result = true; return false; } return true; } } [HarmonyPatch(typeof(Fireplace), "TryGetItems")] internal static class Fireplace_TryGetItems_Patch { private static void Postfix(Fireplace __instance, Player player, ref List<string> items) { ResourceUI resourceUI = ResourceInventoryMod.ResourceUI; if (resourceUI == null || resourceUI.inventorySlots == null || __instance.m_infiniteFuel) { return; } string name = __instance.m_fuelItem.m_itemData.m_shared.m_name; foreach (CustomInventorySlot inventorySlot in resourceUI.inventorySlots) { if (inventorySlot.SharedName == name && inventorySlot.Stack > 0) { if (!items.Contains(name)) { items.Add(name); } break; } } } } [HarmonyPatch(typeof(Fireplace), "CanUseItems")] internal static class Fireplace_CanUseItems_Patch { private static void Postfix(Fireplace __instance, Player player, bool sendErrorMessage, ref bool __result) { if (__result) { return; } ResourceUI resourceUI = ResourceInventoryMod.ResourceUI; if (resourceUI == null || resourceUI.inventorySlots == null) { return; } if (__instance.m_infiniteFuel) { __result = false; return; } string name = __instance.m_fuelItem.m_itemData.m_shared.m_name; foreach (CustomInventorySlot inventorySlot in resourceUI.inventorySlots) { if (!(inventorySlot.SharedName == name) || inventorySlot.Stack <= 0) { continue; } ZNetView value = Traverse.Create((object)__instance).Field("m_nview").GetValue<ZNetView>(); if ((Object)(object)value == (Object)null) { break; } if ((float)Mathf.CeilToInt(value.GetZDO().GetFloat(ZDOVars.s_fuel, 0f)) >= __instance.m_maxFuel) { if (sendErrorMessage) { ((Character)player).Message((MessageType)2, Localization.instance.Localize("$msg_cantaddmore", new string[1] { __instance.m_fuelItem.m_itemData.m_shared.m_name }), 0, (Sprite)null); } __result = false; } else { __result = true; } break; } } } [HarmonyPatch(typeof(Smelter), "OnAddOre")] internal static class Smelter_OnAddOre_Patch { private static bool Prefix(Smelter __instance, Switch sw, Humanoid user, ItemData item, ref bool __result) { ResourceUI resourceUI = ResourceInventoryMod.ResourceUI; if (resourceUI == null || resourceUI.inventorySlots == null) { return true; } int value = Traverse.Create((object)__instance).Method("GetQueueSize", Array.Empty<object>()).GetValue<int>(); if (value >= __instance.m_maxOre) { ((Character)user).Message((MessageType)2, "$msg_itsfull", 0, (Sprite)null); __result = false; return false; } if (item != null) { string name = ((Object)item.m_dropPrefab).name; if (!Traverse.Create((object)__instance).Method("IsItemAllowed", new Type[1] { typeof(string) }, (object[])null).GetValue<bool>(new object[1] { name })) { ((Character)user).Message((MessageType)2, "$msg_wontwork", 0, (Sprite)null); __result = false; return false; } if (user.GetInventory().HaveItem(item.m_shared.m_name, true)) { return true; } CustomInventorySlot customInventorySlot = SmelterStationPatchesHelper.FindSlotBySharedName(resourceUI, item.m_shared.m_name); if (customInventorySlot != null && customInventorySlot.Stack > 0) { customInventorySlot.Stack--; if (customInventorySlot.Stack <= 0) { resourceUI.inventorySlots.Remove(customInventorySlot); } ((Character)user).Message((MessageType)2, "$msg_added " + item.m_shared.m_name, 0, (Sprite)null); ZNetView value2 = Traverse.Create((object)__instance).Field("m_nview").GetValue<ZNetView>(); if ((Object)(object)value2 != (Object)null) { if (!value2.IsOwner()) { value2.ClaimOwnership(); } value2.InvokeRPC("RPC_AddOre", new object[1] { name }); } Traverse.Create((object)__instance).Field("m_addedOreTime").SetValue((object)Time.time); if (__instance.m_addOreAnimationDuration > 0f) { SetAnimation(__instance, active: true); } resourceUI.OnResourcesChanged(); __result = true; return false; } ((Character)user).Message((MessageType)2, "$msg_donthaveany " + item.m_shared.m_name, 0, (Sprite)null); __result = false; return false; } Inventory inventory = user.GetInventory(); foreach (ItemConversion item2 in __instance.m_conversion) { if (!((Object)(object)item2.m_from == (Object)null)) { string name2 = item2.m_from.m_itemData.m_shared.m_name; if (inventory.HaveItem(name2, true)) { return true; } } } foreach (ItemConversion item3 in __instance.m_conversion) { if ((Object)(object)item3.m_from == (Object)null) { continue; } string name3 = item3.m_from.m_itemData.m_shared.m_name; string name4 = ((Object)((Component)item3.m_from).gameObject).name; CustomInventorySlot customInventorySlot2 = SmelterStationPatchesHelper.FindSlotBySharedName(resourceUI, name3); if (customInventorySlot2 == null || customInventorySlot2.Stack <= 0) { continue; } customInventorySlot2.Stack--; if (customInventorySlot2.Stack <= 0) { resourceUI.inventorySlots.Remove(customInventorySlot2); } ((Character)user).Message((MessageType)2, "$msg_added " + name3, 0, (Sprite)null); ZNetView value3 = Traverse.Create((object)__instance).Field("m_nview").GetValue<ZNetView>(); if ((Object)(object)value3 != (Object)null) { if (!value3.IsOwner()) { value3.ClaimOwnership(); } value3.InvokeRPC("RPC_AddOre", new object[1] { name4 }); } Traverse.Create((object)__instance).Field("m_addedOreTime").SetValue((object)Time.time); if (__instance.m_addOreAnimationDuration > 0f) { SetAnimation(__instance, active: true); } resourceUI.OnResourcesChanged(); __result = true; return false; } ((Character)user).Message((MessageType)2, "$msg_noprocessableitems", 0, (Sprite)null); __result = false; return false; } private static void SetAnimation(Smelter smelter, bool active) { Animator[] animators = smelter.m_animators; foreach (Animator val in animators) { if (((Component)val).gameObject.activeInHierarchy) { val.SetBool("active", active); val.SetFloat("activef", active ? 1f : 0f); } } } } [HarmonyPatch(typeof(Smelter), "OnAddFuel")] internal static class Smelter_OnAddFuel_Patch { private static bool Prefix(Smelter __instance, Switch sw, Humanoid user, ItemData item, ref bool __result) { ResourceUI resourceUI = ResourceInventoryMod.ResourceUI; if (resourceUI == null || resourceUI.inventorySlots == null) { return true; } string name = __instance.m_fuelItem.m_itemData.m_shared.m_name; if (item != null && item.m_shared.m_name != name) { ((Character)user).Message((MessageType)2, "$msg_wrongitem", 0, (Sprite)null); __result = false; return false; } float value = Traverse.Create((object)__instance).Method("GetFuel", Array.Empty<object>()).GetValue<float>(); if (value > (float)(__instance.m_maxFuel - 1)) { ((Character)user).Message((MessageType)2, "$msg_itsfull", 0, (Sprite)null); __result = false; return false; } if (user.GetInventory().HaveItem(name, true)) { return true; } CustomInventorySlot customInventorySlot = SmelterStationPatchesHelper.FindSlotBySharedName(resourceUI, name); if (customInventorySlot != null && customInventorySlot.Stack > 0) { customInventorySlot.Stack--; if (customInventorySlot.Stack <= 0) { resourceUI.inventorySlots.Remove(customInventorySlot); } ((Character)user).Message((MessageType)2, "$msg_added " + name, 0, (Sprite)null); ZNetView value2 = Traverse.Create((object)__instance).Field("m_nview").GetValue<ZNetView>(); if ((Object)(object)value2 != (Object)null) { if (!value2.IsOwner()) { value2.ClaimOwnership(); } value2.InvokeRPC("RPC_AddFuel", Array.Empty<object>()); } resourceUI.OnResourcesChanged(); __result = true; return false; } ((Character)user).Message((MessageType)2, "$msg_donthaveany " + name, 0, (Sprite)null); __result = false; return false; } } [HarmonyPatch(typeof(Smelter), "RPC_AddOre")] internal static class Smelter_RPC_AddOre_Patch { private static void Prefix(Smelter __instance, long sender, string name) { } private static void Postfix(Smelter __instance, long sender, string name) { int value = Traverse.Create((object)__instance).Method("GetQueueSize", Array.Empty<object>()).GetValue<int>(); } } internal static class SmelterStationPatchesHelper { public static CustomInventorySlot FindSlotBySharedName(ResourceUI ui, string sharedName) { foreach (CustomInventorySlot inventorySlot in ui.inventorySlots) { if (inventorySlot.SharedName == sharedName && inventorySlot.Quality <= 1 && inventorySlot.Stack > 0) { return inventorySlot; } } return null; } } [HarmonyPatch(typeof(InventoryGui))] public class InventoryGuiPatch { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static UnityAction <>9__2_0; internal void <CreateResourceButton>b__2_0() { ResourceInventoryMod.ResourceUI?.Toggle(); } } private static GameObject resourceButton; [HarmonyPatch("Awake")] [HarmonyPostfix] public static void PostfixAwake(InventoryGui __instance) { CreateResourceButton(__instance); } private static void CreateResourceButton(InventoryGui inventoryGui) { //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Expected O, but got Unknown //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: 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_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: 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) //IL_013b: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_0144: Unknown result type (might be due to invalid IL or missing references) //IL_0165: Unknown result type (might be due to invalid IL or missing references) //IL_0186: Unknown result type (might be due to invalid IL or missing references) //IL_0198: Unknown result type (might be due to invalid IL or missing references) //IL_01a5: Unknown result type (might be due to invalid IL or missing references) //IL_01ce: Unknown result type (might be due to invalid IL or missing references) //IL_01db: Unknown result type (might be due to invalid IL or missing references) //IL_01e8: Unknown result type (might be due to invalid IL or missing references) //IL_01f5: Unknown result type (might be due to invalid IL or missing references) //IL_0229: Unknown result type (might be due to invalid IL or missing references) //IL_026c: Unknown result type (might be due to invalid IL or missing references) //IL_0271: Unknown result type (might be due to invalid IL or missing references) //IL_0277: Expected O, but got Unknown Transform val = ((Component)inventoryGui).transform.Find("root"); if ((Object)(object)val == (Object)null) { return; } Transform val2 = val.Find("Player"); if ((Object)(object)val2 == (Object)null) { return; } resourceButton = new GameObject("ResourceButton", new Type[1] { typeof(RectTransform) }); resourceButton.transform.SetParent(val2, false); RectTransform component = resourceButton.GetComponent<RectTransform>(); Image val3 = resourceButton.AddComponent<Image>(); Button val4 = resourceButton.AddComponent<Button>(); component.anchorMin = new Vector2(0.5f, 0f); component.anchorMax = new Vector2(0.5f, 0f); component.pivot = new Vector2(2f, 1.5f); component.sizeDelta = new Vector2(120f, 35f); component.anchoredPosition = new Vector2(0f, 0f); val3.sprite = GUIManager.Instance.GetSprite("button"); val3.type = (Type)1; ((Graphic)val3).color = Color.white; ((Selectable)val4).transition = (Transition)1; ColorBlock colors = ((Selectable)val4).colors; ((ColorBlock)(ref colors)).normalColor = Color.white; ((ColorBlock)(ref colors)).highlightedColor = new Color(0.95f, 0.95f, 0.95f, 1f); ((ColorBlock)(ref colors)).pressedColor = new Color(0.85f, 0.85f, 0.85f, 1f); ((ColorBlock)(ref colors)).selectedColor = GUIManager.Instance.ValheimOrange; ((Selectable)val4).colors = colors; TextMeshProUGUI val5 = ResourceTMPHelper.CreateText("Text", resourceButton.transform); RectTransform rectTransform = ((TMP_Text)val5).rectTransform; rectTransform.anchorMin = Vector2.zero; rectTransform.anchorMax = Vector2.one; rectTransform.offsetMin = Vector2.zero; rectTransform.offsetMax = Vector2.zero; ((TMP_Text)val5).text = "Items"; ((TMP_Text)val5).fontSize = 16f; ((TMP_Text)val5).alignment = (TextAlignmentOptions)514; ((Graphic)val5).color = Color.white; ((TMP_Text)val5).enableWordWrapping = false; ((Graphic)val5).raycastTarget = false; resourceButton.AddComponent<DragWindowCntrl>(); ButtonClickedEvent onClick = val4.onClick; object obj = <>c.<>9__2_0; if (obj == null) { UnityAction val6 = delegate { ResourceInventoryMod.ResourceUI?.Toggle(); }; <>c.<>9__2_0 = val6; obj = (object)val6; } ((UnityEvent)onClick).AddListener((UnityAction)obj); resourceButton.SetActive(false); } [HarmonyPatch("Show")] [HarmonyPostfix] public static void PostfixShow(InventoryGui __instance, Container container, int activeGroup) { if ((Object)(object)resourceButton != (Object)null) { resourceButton.SetActive(true); resourceButton.transform.SetAsLastSibling(); } if (ResourceInventoryMod.AutoShowWithInventory.Value) { ResourceInventoryMod.ResourceUI?.Show(); } } [HarmonyPatch("Hide")] [HarmonyPostfix] public static void PostfixHide() { if ((Object)(object)resourceButton != (Object)null) { resourceButton.SetActive(false); } ResourceInventoryMod.ResourceUI?.Hide(); } } [HarmonyPatch(typeof(InventoryGui), "Hide")] internal static class InventoryGui_Hide_Patch { private static bool Prefix(InventoryGui __instance) { if (ResourceUI.Instance != null && ResourceUI.Instance.IsVisible() && ResourceUI.Instance.IsSearchFieldFocused()) { return false; } return true; } } [HarmonyPatch(typeof(InventoryGui), "Update")] internal static class InventoryGui_Update_Patch { private static void Postfix(InventoryGui __instance) { if (ResourceUI.Instance != null && ResourceUI.Instance.IsVisible() && ResourceUI.Instance.IsSearchFieldFocused() && !Input.GetKeyDown((KeyCode)101)) { } } } [HarmonyPatch(typeof(TMP_InputField), "KeyPressed")] internal static class TMP_InputField_KeyPressed_Patch { private static bool Prefix(TMP_InputField __instance, Event evt) { //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Invalid comparison between Unknown and I4 if (ResourceUI.Instance != null && ResourceUI.Instance.IsSearchFieldFocused() && (Object)(object)__instance == (Object)(object)ResourceUI.Instance.GetSearchInputField() && (int)evt.keyCode == 101) { return true; } return true; } } [HarmonyPatch(typeof(Inventory), "RemoveItem", new Type[] { typeof(string), typeof(int), typeof(int), typeof(bool) })] internal static class Inventory_RemoveItem_CustomResourcesPatch { private static void Prefix(Inventory __instance, string name, ref int amount, int itemQuality, bool worldLevelBased) { ResourceUI resourceUI = ResourceInventoryMod.ResourceUI; if (resourceUI == null || resourceUI.inventorySlots == null || string.IsNullOrEmpty(name)) { return; } int num = 0; List<CustomInventorySlot> list = new List<CustomInventorySlot>(); foreach (CustomInventorySlot inventorySlot in resourceUI.inventorySlots) { if (inventorySlot.SharedName == name && inventorySlot.Quality <= 1 && !inventorySlot.IsUnique) { num += inventorySlot.Stack; list.Add(inventorySlot); } } if (num <= 0) { return; } int num2 = __instance.CountItems(name, itemQuality, worldLevelBased); num2 -= num; if (num2 < 0) { num2 = 0; } if (amount <= num2) { return; } int num3 = amount - num2; amount = num2; int num4 = num3; int num5 = list.Count - 1; while (num5 >= 0 && num4 > 0) { CustomInventorySlot customInventorySlot = list[num5]; if (customInventorySlot.Stack <= num4) { num4 -= customInventorySlot.Stack; resourceUI.inventorySlots.Remove(customInventorySlot); } else { customInventorySlot.Stack -= num4; num4 = 0; } num5--; } resourceUI.OnResourcesChanged(); } } [HarmonyPatch(typeof(Humanoid), "Pickup", new Type[] { typeof(GameObject), typeof(bool), typeof(bool) })] public static class ItemPickupPatch { [HarmonyPrefix] private static bool PrefixPickup(Humanoid __instance, GameObject go, bool autoequip, bool autoPickupDelay, ref bool __result) { try { Player val = (Player)(object)((__instance is Player) ? __instance : null); if (val == null) { return true; } if ((Object)(object)go == (Object)null) { return true; } ItemDrop component = go.GetComponent<ItemDrop>(); if (component?.m_itemData == null) { return true; } if ((Object)(object)Player.m_localPlayer == (Object)null) { Debug.LogWarning((object)"[ItemPickupPatch] Player.m_localPlayer is null, using vanilla pickup"); return true; } if ((Object)(object)ObjectDB.instance == (Object)null) { Debug.LogWarning((object)"[ItemPickupPatch] ObjectDB not ready, using vanilla pickup"); return true; } if (ResourceInventoryMod.ResourceUI == null) { ResourceInventoryMod.ResourceUI = new ResourceUI(); } ResourceInventoryMod.ResourceUI.EnsureCreated(); if (!ResourceInventoryMod.ResourceUI.IsInitialized) { Debug.LogWarning((object)"[ItemPickupPatch] UI not ready, using vanilla pickup"); return true; } ResourceInventoryMod.ResourceUI.AddItemFromPickup(component.m_itemData); try { if ((Object)(object)Player.m_localPlayer != (Object)null) { Player.m_localPlayer.AddKnownItem(component.m_itemData); } } catch (Exception ex) { Debug.LogWarning((object)("[ItemPickupPatch] AddKnownItem failed: " + ex.Message)); } DestroyGroundItemSafely(go); try { if ((Object)(object)Player.m_localPlayer != (Object)null) { string name = component.m_itemData.m_shared.m_name; int quality = component.m_itemData.m_quality; int stack = component.m_itemData.m_stack; string text = "Picked up: " + name; if (quality > 1) { text += $" [{quality}★]"; } if (stack > 1) { text += $" x{stack}"; } ((Character)Player.m_localPlayer).Message((MessageType)1, text, 0, (Sprite)null); } } catch { } __result = true; return false; } catch (Exception arg) { Debug.LogError((object)$"[ItemPickupPatch] Error: {arg}"); return true; } } private static void DestroyGroundItemSafely(GameObject go) { if ((Object)(object)go == (Object)null) { return; } try { ZNetView component = go.GetComponent<ZNetView>(); if ((Object)(object)component != (Object)null && component.IsValid()) { component.ClaimOwnership(); ZNetScene instance = ZNetScene.instance; if (instance != null) { instance.Destroy(go); } } else { Object.Destroy((Object)(object)go); } } catch (Exception ex) { Debug.LogWarning((object)("[ItemPickupPatch] Failed to destroy item: " + ex.Message)); Object.Destroy((Object)(object)go); } } } public class MoveAmountDialog : MonoBehaviour { private RectTransform root; private RectTransform panelRect; private Slider amountSlider; private TextMeshProUGUI amountValueText; private TextMeshProUGUI maxText; private Button confirmButton; private Button cancelButton; private CustomInventorySlot slot; private string itemName; private int maxAmount; private ResourceUI resourceUI; private bool isClosing; private bool useLegacyMode = false; public static MoveAmountDialog Current { get; private set; } public static MoveAmountDialog Create(Transform parent, string itemName, int maxAmount, ResourceUI ui) { //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Expected O, but got Unknown if ((Object)(object)Current != (Object)null) { Current.Close(); } object obj = parent; if (obj == null) { GameObject customGUIFront = GUIManager.CustomGUIFront; obj = ((customGUIFront != null) ? customGUIFront.transform : null); } Transform val = (Transform)obj; if ((Object)(object)val == (Object)null) { return null; } GameObject val2 = new GameObject("MoveAmountDialog", new Type[2] { typeof(RectTransform), typeof(CanvasGroup) }); val2.transform.SetParent(val, false); val2.transform.SetAsLastSibling(); MoveAmountDialog moveAmountDialog = val2.AddComponent<MoveAmountDialog>(); moveAmountDialog.useLegacyMode = true; moveAmountDialog.BuildLegacy(itemName, maxAmount, ui); Current = moveAmountDialog; return moveAmountDialog; } public static MoveAmountDialog CreateForSlot(Transform parent, CustomInventorySlot slot, int maxAmount, ResourceUI ui) { //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Expected O, but got Unknown if ((Object)(object)Current != (Object)null) { Current.Close(); } object obj = parent; if (obj == null) { GameObject customGUIFront = GUIManager.CustomGUIFront; obj = ((customGUIFront != null) ? customGUIFront.transform : null); } Transform val = (Transform)obj; if ((Object)(object)val == (Object)null) { return null; } GameObject val2 = new GameObject("MoveAmountDialog", new Type[2] { typeof(RectTransform), typeof(CanvasGroup) }); val2.transform.SetParent(val, false); val2.transform.SetAsLastSibling(); MoveAmountDialog moveAmountDialog = val2.AddComponent<MoveAmountDialog>(); moveAmountDialog.useLegacyMode = false; moveAmountDialog.BuildForSlot(slot, maxAmount, ui); Current = moveAmountDialog; return moveAmountDialog; } private void BuildLegacy(string name, int max, ResourceUI ui) { itemName = name; maxAmount = Mathf.Max(1, max); resourceUI = ui; BuildUI(); } private void BuildForSlot(CustomInventorySlot itemSlot, int max, ResourceUI ui) { slot = itemSlot; itemName = slot.SharedName; maxAmount = Mathf.Max(1, max); resourceUI = ui; BuildUI(); } private void BuildUI() { //IL_0036: 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_0058: 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_0084: Unknown result type (might be due to invalid IL or missing references) CanvasGroup component = ((Component)this).GetComponent<CanvasGroup>(); component.alpha = 1f; component.interactable = true; component.blocksRaycasts = true; root = ((Component)this).GetComponent<RectTransform>(); root.anchorMin = Vector2.zero; root.anchorMax = Vector2.one; root.offsetMin = Vector2.zero; root.offsetMax = Vector2.zero; root.pivot = new Vector2(0.5f, 0.5f); CreateOverlay(); CreateDialogPanel(); GUIManager.BlockInput(true); } private void CreateOverlay() { //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Expected O, but got Unknown //IL_0054: 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_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Expected O, but got Unknown GameObject val = new GameObject("Overlay", new Type[3] { typeof(RectTransform), typeof(Image), typeof(Button) }); val.transform.SetParent(((Component)this).transform, false); RectTransform component = val.GetComponent<RectTransform>(); component.anchorMin = Vector2.zero; component.anchorMax = Vector2.one; component.offsetMin = Vector2.zero; component.offsetMax = Vector2.zero; Image component2 = val.GetComponent<Image>(); ((Graphic)component2).color = new Color(0f, 0f, 0f, 0.65f); ((Graphic)component2).raycastTarget = true; Button component3 = val.GetComponent<Button>(); ((Selectable)component3).transition = (Transition)0; ((UnityEvent)component3.onClick).AddListener(new UnityAction(Close)); } private void CreateDialogPanel() { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Expected O, but got Unknown //IL_0067: 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_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: 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_00fa: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("Panel", new Type[2] { typeof(RectTransform), typeof(Image) }); val.transform.SetParent(((Component)this).transform, false); val.transform.SetAsLastSibling(); panelRect = val.GetComponent<RectTransform>(); panelRect.anchorMin = new Vector2(0.5f, 0.5f); panelRect.anchorMax = new Vector2(0.5f, 0.5f); panelRect.pivot = new Vector2(0.5f, 0.5f); panelRect.sizeDelta = new Vector2(520f, 250f); panelRect.anchoredPosition = Vector2.zero; Image component = val.GetComponent<Image>(); component.sprite = GUIManager.Instance.GetSprite("woodpanel_trophys"); component.type = (Type)1; ((Graphic)component).color = Color.gray; ((Graphic)component).raycastTarget = true; Outline val2 = val.AddComponent<Outline>(); val.AddComponent<DragWindowCntrl>(); CreateTitle(val.transform); CreateSlider(val.transform); CreateButtons(val.transform); } private void CreateTitle(Transform parent) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Expected O, but got Unknown //IL_003f: 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_006b: 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_0097: 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) GameObject val = new GameObject("Title", new Type[1] { typeof(RectTransform) }); val.transform.SetParent(parent, false); RectTransform component = val.GetComponent<RectTransform>(); component.anchorMin = new Vector2(0.5f, 1f); component.anchorMax = new Vector2(0.5f, 1f); component.pivot = new Vector2(0.5f, 1f); component.sizeDelta = new Vector2(300f, 40f); component.anchoredPosition = new Vector2(0f, -20f); TextMeshProUGUI val2 = val.AddComponent<TextMeshProUGUI>(); string text = "Quantity"; if (!useLegacyMode && slot != null && slot.Quality > 1) { text = $"Quantity [{slot.Quality}★]"; } ((TMP_Text)val2).text = text; ((TMP_Text)val2).font = GUIManager.Instance.TMP_AveriaSansLibre; ((TMP_Text)val2).fontSize = 26f; ((Graphic)val2).color = GUIManager.Instance.ValheimOrange; ((TMP_Text)val2).alignment = (TextAlignmentOptions)514; ((Graphic)val2).raycastTarget = false; } private void CreateSlider(Transform parent) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Expected O, but got Unknown //IL_003f: 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_006b: 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_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_0133: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Expected O, but got Unknown //IL_0159: Unknown result type (might be due to invalid IL or missing references) //IL_016f: Unknown result type (might be due to invalid IL or missing references) //IL_0185: Unknown result type (might be due to invalid IL or missing references) //IL_019b: Unknown result type (might be due to invalid IL or missing references) //IL_01b1: Unknown result type (might be due to invalid IL or missing references) //IL_020c: Unknown result type (might be due to invalid IL or missing references) //IL_0245: Unknown result type (might be due to invalid IL or missing references) //IL_024c: Expected O, but got Unknown //IL_0270: Unknown result type (might be due to invalid IL or missing references) //IL_0287: Unknown result type (might be due to invalid IL or missing references) //IL_029e: Unknown result type (might be due to invalid IL or missing references) //IL_02b5: Unknown result type (might be due to invalid IL or missing references) //IL_02cc: Unknown result type (might be due to invalid IL or missing references) //IL_0322: Unknown result type (might be due to invalid IL or missing references) //IL_0375: Unknown result type (might be due to invalid IL or missing references) //IL_037c: Expected O, but got Unknown //IL_03a0: Unknown result type (might be due to invalid IL or missing references) //IL_03b7: Unknown result type (might be due to invalid IL or missing references) //IL_03ce: Unknown result type (might be due to invalid IL or missing references) //IL_03e5: Unknown result type (might be due to invalid IL or missing references) //IL_03fc: Unknown result type (might be due to invalid IL or missing references) //IL_0421: Unknown result type (might be due to invalid IL or missing references) //IL_04b2: Unknown result type (might be due to invalid IL or missing references) //IL_04b9: Expected O, but got Unknown //IL_04d9: Unknown result type (might be due to invalid IL or missing references) //IL_04e6: Unknown result type (might be due to invalid IL or missing references) //IL_04f3: Unknown result type (might be due to invalid IL or missing references) //IL_0500: Unknown result type (might be due to invalid IL or missing references) //IL_0530: Unknown result type (might be due to invalid IL or missing references) //IL_0537: Expected O, but got Unknown //IL_0557: Unknown result type (might be due to invalid IL or missing references) //IL_0564: Unknown result type (might be due to invalid IL or missing references) //IL_0571: Unknown result type (might be due to invalid IL or missing references) //IL_057e: Unknown result type (might be due to invalid IL or missing references) //IL_0599: Unknown result type (might be due to invalid IL or missing references) //IL_05ca: Unknown result type (might be due to invalid IL or missing references) //IL_05d1: Expected O, but got Unknown //IL_05f1: Unknown result type (might be due to invalid IL or missing references) //IL_05fe: Unknown result type (might be due to invalid IL or missing references) //IL_060b: Unknown result type (might be due to invalid IL or missing references) //IL_0618: Unknown result type (might be due to invalid IL or missing references) //IL_0648: Unknown result type (might be due to invalid IL or missing references) //IL_064f: Expected O, but got Unknown //IL_0679: Unknown result type (might be due to invalid IL or missing references) //IL_0690: Unknown result type (might be due to invalid IL or missing references) //IL_06a7: Unknown result type (might be due to invalid IL or missing references) //IL_06be: Unknown result type (might be due to invalid IL or missing references) //IL_06cb: Unknown result type (might be due to invalid IL or missing references) //IL_06f8: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("ValueText", new Type[1] { typeof(RectTransform) }); val.transform.SetParent(parent, false); RectTransform component = val.GetComponent<RectTransform>(); component.anchorMin = new Vector2(0.5f, 1f); component.anchorMax = new Vector2(0.5f, 1f); component.pivot = new Vector2(0.5f, 1f); component.sizeDelta = new Vector2(100f, 40f); component.anchoredPosition = new Vector2(0f, -120f); amountValueText = val.AddComponent<TextMeshProUGUI>(); ((TMP_Text)amountValueText).text = maxAmount.ToString(); ((TMP_Text)amountValueText).font = GUIManager.Instance.TMP_AveriaSansLibre; ((TMP_Text)amountValueText).fontSize = 24f; ((Graphic)amountValueText).color = Color.white; ((TMP_Text)amountValueText).alignment = (TextAlignmentOptions)514; ((Graphic)amountValueText).raycastTarget = false; GameObject val2 = new GameObject("MaxValueText", new Type[1] { typeof(RectTransform) }); val2.transform.SetParent(parent, false); RectTransform component2 = val2.GetComponent<RectTransform>(); component2.anchorMin = new Vector2(1f, 1f); component2.anchorMax = new Vector2(1f, 1f); component2.pivot = new Vector2(1f, 1f); component2.sizeDelta = new Vector2(60f, 30f); component2.anchoredPosition = new Vector2(-30f, -70f); TextMeshProUGUI val3 = val2.AddComponent<TextMeshProUGUI>(); ((TMP_Text)val3).text = maxAmount.ToString(); ((TMP_Text)val3).font = GUIManager.Instance.TMP_AveriaSansLibre; ((TMP_Text)val3).fontSize = 20f; ((Graphic)val3).color = new Color(0.8f, 0.8f, 0.8f, 0.8f); ((TMP_Text)val3).alignment = (TextAlignmentOptions)514; ((Graphic)val3).raycastTarget = false; GameObject val4 = new GameObject("MinValueText", new Type[1] { typeof(RectTransform) }); val4.transform.SetParent(parent, false); RectTransform component3 = val4.GetComponent<RectTransform>(); component3.anchorMin = new Vector2(0f, 1f); component3.anchorMax = new Vector2(0f, 1f); component3.pivot = new Vector2(0f, 1f); component3.sizeDelta = new Vector2(60f, 30f); component3.anchoredPosition = new Vector2(30f, -70f); TextMeshProUGUI val5 = val4.AddComponent<TextMeshProUGUI>(); ((TMP_Text)val5).text = "1"; ((TMP_Text)val5).font = GUIManager.Instance.TMP_AveriaSansLibre; ((TMP_Text)val5).fontSize = 20f; ((Graphic)val5).color = new Color(0.8f, 0.8f, 0.8f, 0.8f); ((TMP_Text)val5).alignment = (TextAlignmentOptions)514; ((Graphic)val5).raycastTarget = false; GameObject val6 = new GameObject("Slider", new Type[3] { typeof(RectTransform), typeof(Slider), typeof(Image) }); val6.transform.SetParent(parent, false); RectTransform component4 = val6.GetComponent<RectTransform>(); component4.anchorMin = new Vector2(0.5f, 1f); component4.anchorMax = new Vector2(0.5f, 1f); component4.pivot = new Vector2(0.5f, 1f); component4.sizeDelta = new Vector2(280f, 20f); component4.anchoredPosition = new Vector2(0f, -85f); Image component5 = val6.GetComponent<Image>(); ((Graphic)component5).color = new Color(0.2f, 0.2f, 0.25f); amountSlider = val6.GetComponent<Slider>(); amountSlider.minValue = 1f; amountSlider.maxValue = maxAmount; amountSlider.wholeNumbers = true; amountSlider.value = maxAmount; ((UnityEvent<float>)(object)amountSlider.onValueChanged).AddListener((UnityAction<float>)OnSliderValueChanged); GameObject val7 = new GameObject("FillArea", new Type[1] { typeof(RectTransform) }); val7.transform.SetParent(val6.transform, false); RectTransform component6 = val7.GetComponent<RectTransform>(); component6.anchorMin = Vector2.zero; component6.anchorMax = Vector2.one; component6.offsetMin = Vector2.zero; component6.offsetMax = Vector2.zero; GameObject val8 = new GameObject("Fill", new Type[2] { typeof(RectTransform), typeof(Image) }); val8.transform.SetParent(val7.transform, false); RectTransform component7 = val8.GetComponent<RectTransform>(); component7.anchorMin = Vector2.zero; component7.anchorMax = Vector2.one; component7.offsetMin = Vector2.zero; component7.offsetMax = Vector2.zero; Image component8 = val8.GetComponent<Image>(); ((Graphic)component8).color = GUIManager.Instance.ValheimOrange; amountSlider.fillRect = component7; GameObject val9 = new GameObject("HandleArea", new Type[1] { typeof(RectTransform) }); val9.transform.SetParent(val6.transform, false); RectTransform component9 = val9.GetComponent<RectTransform>(); component9.anchorMin = Vector2.zero; component9.anchorMax = Vector2.one; component9.offsetMin = Vector2.zero; component9.offsetMax = Vector2.zero; GameObject val10 = new GameObject("Handle", new Type[2] { typeof(RectTransform), typeof(Image) }); val10.transform.SetParent(val9.transform, false); RectTransform component10 = val10.GetComponent<RectTransform>(); component10.sizeDelta = new Vector2(20f, 30f); component10.anchorMin = new Vector2(0.5f, 0.5f); component10.anchorMax = new Vector2(0.5f, 0.5f); component10.pivot = new Vector2(0.5f, 0.5f); component10.anchoredPosition = Vector2.zero; Image component11 = val10.GetComponent<Image>(); component11.sprite = GUIManager.Instance.GetSprite("UISprite"); ((Graphic)component11).color = Color.white; amountSlider.handleRect = component10; } private void OnSliderValueChanged(float value) { if ((Object)(object)amountValueText != (Object)null) { ((TMP_Text)amountValueText).text = ((int)value).ToString(); } } private void CreateButtons(Transform parent) { //IL_0013: 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_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Expected O, but got Unknown //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Expected O, but got Unknown confirmButton = CreateButton(parent, "OK", new Vector2(-70f, -85f), new Vector2(110f, 40f), new UnityAction(OnConfirm)); cancelButton = CreateButton(parent, "Cancel", new Vector2(70f, -85f), new Vector2(110f, 40f), new UnityAction(Close)); } private Button CreateButton(Transform parent, string text, Vector2 position, Vector2 size, UnityAction action) { //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Expected O, but got Unknown //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: 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_0126: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Expected O, but got Unknown //IL_014c: Unknown result type (might be due to invalid IL or missing references) //IL_0159: Unknown result type (might be due to invalid IL or missing references) //IL_0166: Unknown result type (might be due to invalid IL or missing references) //IL_0173: Unknown result type (might be due to invalid IL or missing references) //IL_01c3: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject(text + "Button", new Type[3] { typeof(RectTransform), typeof(Image), typeof(Button) }); val.transform.SetParent(parent, false); RectTransform component = val.GetComponent<RectTransform>(); component.anchorMin = new Vector2(0.5f, 0.5f); component.anchorMax = new Vector2(0.5f, 0.5f); component.pivot = new Vector2(0.5f, 0.5f); component.sizeDelta = size; component.anchoredPosition = position; Image component2 = val.GetComponent<Image>(); component2.sprite = GUIManager.Instance.GetSprite("button"); component2.type = (Type)1; ((Graphic)component2).color = Color.white; ((Graphic)component2).raycastTarget = true; Button component3 = val.GetComponent<Button>(); ((Selectable)component3).targetGraphic = (Graphic)(object)component2; ((Selectable)component3).colors = GUIManager.Instance.ValheimButtonColorBlock; ((UnityEvent)component3.onClick).AddListener(action); GameObject val2 = new GameObject("Text", new Type[1] { typeof(RectTransform) }); val2.transform.SetParent(val.transform, false); RectTransform component4 = val2.GetComponent<RectTransform>(); component4.anchorMin = Vector2.zero; component4.anchorMax = Vector2.one; component4.offsetMin = Vector2.zero; component4.offsetMax = Vector2.zero; TextMeshProUGUI val3 = val2.AddComponent<TextMeshProUGUI>(); ((TMP_Text)val3).text = text; ((TMP_Text)val3).font = GUIManager.Instance.TMP_AveriaSansLibre; ((TMP_Text)val3).fontSize = 18f; ((TMP_Text)val3).alignment = (TextAlignmentOptions)514; ((Graphic)val3).color = GUIManager.Instance.ValheimOrange; ((Graphic)val3).raycastTarget = false; return component3; } private void OnConfirm() { if (resourceUI == null) { Close(); return; } int num = (int)amountSlider.value; num = Mathf.Clamp(num, 1, maxAmount); if (num > 0) { if (useLegacyMode) { resourceUI.MoveItemToInventory(itemName, num); } else if (slot != null) { resourceUI.MoveItemToInventory(slot, num); } } Close(); } public void Close() { if (!isClosing) { isClosing = true; GUIManager.BlockInput(false); if ((Object)(object)Current == (Object)(object)this) { Current = null; } Object.Destroy((Object)(object)((Component)this).gameObject); } } private void Update() { if (!((Object)(object)Current != (Object)(object)this)) { if (Input.GetKeyDown((KeyCode)27)) { Close(); } else if (Input.GetKeyDown((KeyCode)13) || Input.GetKeyDown((KeyCode)271)) { OnConfirm(); } } } private void OnDestroy() { GUIManager.BlockInput(false); if ((Object)(object)Current == (Object)(object)this) { Current = null; } } } public class MoveAmountToCustomDialog : MonoBehaviour { private RectTransform root; private Slider amountSlider; private TextMeshProUGUI amountValueText; private Button confirmButton; private Button cancelButton; private ItemData targetItemData; private int maxAmount; private ResourceUI resourceUI; private bool isClosing; private Vector2 targetScreenPosition; public static MoveAmountToCustomDialog Current { get; private set; } public static MoveAmountToCustomDialog CreateForItemData(Transform parent, ItemData item, int maxAmount, ResourceUI ui, Vector2 screenPosition) { //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Expected O, but got Unknown //IL_0094: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)Current != (Object)null) { Current.Close(); } object obj = parent; if (obj == null) { GameObject customGUIFront = GUIManager.CustomGUIFront; obj = ((customGUIFront != null) ? customGUIFront.transform : null); } Transform val = (Transform)obj; if ((Object)(object)val == (Object)null) { return null; } GameObject val2 = new GameObject("MoveAmountToCustomDialog", new Type[2] { typeof(RectTransform), typeof(CanvasGroup) }); val2.transform.SetParent(val, false); val2.transform.SetAsLastSibling(); MoveAmountToCustomDialog moveAmountToCustomDialog = val2.AddComponent<MoveAmountToCustomDialog>(); moveAmountToCustomDialog.Build(item, maxAmount, ui, screenPosition); Current = moveAmountToCustomDialog; return moveAmountToCustomDialog; } private void Build(ItemData item, int max, ResourceUI ui, Vector2 screenPosition) { //IL_001d: 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) targetItemData = item; maxAmount = Mathf.Max(1, max); resourceUI = ui; targetScreenPosition = screenPosition; BuildUI(); } private void BuildUI() { //IL_0036: 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_0058: 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_0084: Unknown result type (might be due to invalid IL or missing references) CanvasGroup component = ((Component)this).GetComponent<CanvasGroup>(); component.alpha = 1f; component.interactable = true; component.blocksRaycasts = true; root = ((Component)this).GetComponent<RectTransform>(); root.anchorMin = Vector2.zero; root.anchorMax = Vector2.one; root.offsetMin = Vector2.zero; root.offsetMax = Vector2.zero; root.pivot = new Vector2(0.5f, 0.5f); CreateOverlay(); CreateDialogPanel(); GUIManager.BlockInput(true); } private void CreateOverlay() { //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Expected O, but got Unknown //IL_0054: 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_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Expected O, but got Unknown GameObject val = new GameObject("Overlay", new Type[3] { typeof(RectTransform), typeof(Image), typeof(Button) }); val.transform.SetParent(((Component)this).transform, false); RectTransform component = val.GetComponent<RectTransform>(); component.anchorMin = Vector2.zero; component.anchorMax = Vector2.one; component.offsetMin = Vector2.zero; component.offsetMax = Vector2.zero; Image component2 = val.GetComponent<Image>(); ((Graphic)component2).color = new Color(0f, 0f, 0f, 0.65f); ((Graphic)component2).raycastTarget = true; Button component3 = val.GetComponent<Button>(); ((Selectable)component3).transition = (Transition)0; ((UnityEvent)component3.onClick).AddListener(new UnityAction(Close)); } private void CreateDialogPanel() { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Expected O, but got Unknown //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: 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) GameObject val = new GameObject("Panel", new Type[2] { typeof(RectTransform), typeof(Image) }); val.transform.SetParent(((Component)this).transform, false); val.transform.SetAsLastSibling(); RectTransform component = val.GetComponent<RectTransform>(); component.anchorMin = new Vector2(0.5f, 0.5f); component.anchorMax = new Vector2(0.5f, 0.5f); component.pivot = new Vector2(0.5f, 0.5f); component.sizeDelta = new Vector2(520f, 250f); component.anchoredPosition = CalculateDialogPosition(targetScreenPosition); Image component2 = val.GetComponent<Image>(); component2.sprite = GUIManager.Instance.GetSprite("woodpanel_trophys"); component2.type = (Type)1; ((Graphic)component2).color = Color.gray; ((Graphic)component2).raycastTarget = true; val.AddComponent<Outline>(); val.AddComponent<DragWindowCntrl>(); CreateTitle(val.transform); CreateSlider(val.transform); CreateButtons(val.transform); } private Vector2 CalculateDialogPosition(Vector2 screenPosition) { //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_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0052: 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_001a: 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_0087: 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_00c2: 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_00fd: 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_0107: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_0110: 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_013c: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Unknown result type (might be due to invalid IL or missing references) Canvas componentInParent = ((Component)this).GetComponentInParent<Canvas>(); if ((Object)(object)componentInParent == (Object)null) { return Vector2.zero; } Transform transform = ((Component)componentInParent).transform; RectTransform val = (RectTransform)(object)((transform is RectTransform) ? transform : null); Vector2 sizeDelta = val.sizeDelta; Vector2 val2 = default(Vector2); RectTransformUtility.ScreenPointToLocalPointInRectangle(val, screenPosition, componentInParent.worldCamera, ref val2); float num = 520f; float num2 = 250f; float num3 = ((val2.x > 0f) ? ((0f - num) / 2f - 50f) : (num / 2f + 50f)); float num4 = 0f; float num5 = (0f - sizeDelta.x) / 2f + num / 2f + 20f; float num6 = sizeDelta.x / 2f - num / 2f - 20f; float num7 = (0f - sizeDelta.y) / 2f + num2 / 2f + 20f; float num8 = sizeDelta.y / 2f - num2 / 2f - 20f; Vector2 val3 = val2 + new Vector2(num3, num4); val3.x = Mathf.Clamp(val3.x, num5, num6); val3.y = Mathf.Clamp(val3.y, num7, num8); return val3; } private void CreateTitle(Transform parent) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Expected O, but got Unknown //IL_003f: 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_006b: 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_0097: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("Title", new Type[1] { typeof(RectTransform) });