Decompiled source of ItemInfoDisplayForkedCNPlus v1.1.3
plugins/com.github.cherrycove.ItemInfoDisplay.dll
Decompiled 2 weeks ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.CodeDom.Compiler; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using ItemInfoDisplay.Properties; using Microsoft.CodeAnalysis; using Newtonsoft.Json; using Peak.Afflictions; using Photon.Pun; using TMPro; using UnityEngine; using Zorro.Core; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("com.github.cherrycove.ItemInfoDisplay")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.1.3.0")] [assembly: AssemblyInformationalVersion("1.1.3+8a24bb456c9fb3c6b6cb1b296e4805c98b79d3a1")] [assembly: AssemblyProduct("com.github.cherrycove.ItemInfoDisplay")] [assembly: AssemblyTitle("ItemInfoDisplay")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.1.3.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace BepInEx { [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] [Conditional("CodeGeneration")] internal sealed class BepInAutoPluginAttribute : Attribute { public BepInAutoPluginAttribute(string? id = null, string? name = null, string? version = null) { } } } namespace BepInEx.Preloader.Core.Patching { [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] [Conditional("CodeGeneration")] internal sealed class PatcherAutoPluginAttribute : Attribute { public PatcherAutoPluginAttribute(string? id = null, string? name = null, string? version = null) { } } } namespace ItemInfoDisplay { [BepInPlugin("com.github.cherrycove.ItemInfoDisplay", "ItemInfoDisplay", "1.1.3")] public class Plugin : BaseUnityPlugin { private static class ItemInfoDisplayUpdatePatch { [HarmonyPatch(typeof(CharacterItems), "Update")] [HarmonyPostfix] private static void ItemInfoDisplayUpdate(CharacterItems __instance) { try { if ((Object)(object)guiManager == (Object)null) { AddDisplayObject(); return; } if (configEnableTestMode.Value && (Object)(object)Character.localCharacter != (Object)null && __instance.character == Character.localCharacter) { HandleTestModeInput(); } if ((Object)(object)Character.observedCharacter.data.currentItem != (Object)null) { UpdateLanternRefreshFlag(Character.observedCharacter.data.currentItem); if (hasChanged) { hasChanged = false; ProcessItemGameObject(); } else if (Mathf.Abs(Character.observedCharacter.data.sinceItemAttach - lastKnownSinceItemAttach) >= configForceUpdateTime.Value) { hasChanged = true; lastKnownSinceItemAttach = Character.observedCharacter.data.sinceItemAttach; } if (!((Component)itemInfoDisplayTextMesh).gameObject.activeSelf) { ((Component)itemInfoDisplayTextMesh).gameObject.SetActive(true); } } else if (((Component)itemInfoDisplayTextMesh).gameObject.activeSelf) { ((Component)itemInfoDisplayTextMesh).gameObject.SetActive(false); } } catch (Exception ex) { Log.LogError((object)(ex.Message + ex.StackTrace)); } } } private static class ItemInfoDisplayEquipPatch { [HarmonyPatch(typeof(CharacterItems), "Equip")] [HarmonyPostfix] private static void ItemInfoDisplayEquip(CharacterItems __instance) { try { if (Character.observedCharacter == __instance.character) { hasChanged = true; } } catch (Exception ex) { Log.LogError((object)(ex.Message + ex.StackTrace)); } } } private static class ItemInfoDisplayFinishCookingPatch { [HarmonyPatch(typeof(ItemCooking), "FinishCooking")] [HarmonyPostfix] private static void ItemInfoDisplayFinishCooking(ItemCooking __instance) { try { if (Character.observedCharacter == ((ItemComponent)__instance).item.holderCharacter) { hasChanged = true; } } catch (Exception ex) { Log.LogError((object)(ex.Message + ex.StackTrace)); } } } private static class ItemInfoDisplayReduceUsesRPCPatch { [HarmonyPatch(typeof(Action_ReduceUses), "ReduceUsesRPC")] [HarmonyPostfix] private static void ItemInfoDisplayReduceUsesRPC(Action_ReduceUses __instance) { try { if (Character.observedCharacter == ((ItemActionBase)__instance).character) { hasChanged = true; } } catch (Exception ex) { Log.LogError((object)(ex.Message + ex.StackTrace)); } } } private static GUIManager guiManager; private static TextMeshProUGUI itemInfoDisplayTextMesh; private static Dictionary<string, string> effectColors = new Dictionary<string, string>(); private static float lastKnownSinceItemAttach; private static bool hasChanged; private static ConfigEntry<float> configFontSize; private static ConfigEntry<float> configOutlineWidth; private static ConfigEntry<float> configLineSpacing; private static ConfigEntry<float> configSizeDeltaX; private static ConfigEntry<float> configForceUpdateTime; private static ConfigEntry<bool> configEnableTestMode; private static List<Item> allItemPrefabs = new List<Item>(); private static int currentTestItemIndex = 0; private static bool testModeInitialized = false; private static bool testModeInputDisabled = false; private static bool inputSystemChecked = false; private static bool inputSystemAvailable = false; private static PropertyInfo inputSystemKeyboardCurrentProp; private static PropertyInfo inputSystemKeyboardItemProp; private static PropertyInfo inputSystemKeyControlPressedProp; private static Type inputSystemKeyType; private static bool legacyInputAvailable = true; private static HashSet<string> missingEffectColors = new HashSet<string>(); private static int lastLanternItemId = 0; private static int lastLanternRemainingSeconds = -1; private static Dictionary<string, string> itemNameKeyMap = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); private static bool itemNameKeyMapInitialized = false; private static bool cookingMultiplierResolved = false; private static Func<ItemCooking, float>? cookingMultiplierGetter; private static string? cookingMultiplierSource; public const string Id = "com.github.cherrycove.ItemInfoDisplay"; internal static ManualLogSource Log { get; private set; } = null; public static string Name => "ItemInfoDisplay"; public static string Version => "1.1.3"; private void Awake() { Log = ((BaseUnityPlugin)this).Logger; InitEffectColors(effectColors); lastKnownSinceItemAttach = 0f; hasChanged = true; configFontSize = ((BaseUnityPlugin)this).Config.Bind<float>("ItemInfoDisplay", "Font Size", 20f, "Customize the Font Size for description text."); configOutlineWidth = ((BaseUnityPlugin)this).Config.Bind<float>("ItemInfoDisplay", "Outline Width", 0.08f, "Customize the Outline Width for item description text."); configLineSpacing = ((BaseUnityPlugin)this).Config.Bind<float>("ItemInfoDisplay", "Line Spacing", -35f, "Customize the Line Spacing for item description text."); configSizeDeltaX = ((BaseUnityPlugin)this).Config.Bind<float>("ItemInfoDisplay", "Size Delta X", 550f, "Customize the horizontal length of the container for the mod. Increasing moves text left, decreasing moves text right."); configForceUpdateTime = ((BaseUnityPlugin)this).Config.Bind<float>("ItemInfoDisplay", "Force Update Time", 1f, "Customize the time in seconds until the mod forces an update for the item."); configEnableTestMode = ((BaseUnityPlugin)this).Config.Bind<bool>("ItemInfoDisplay", "Enable Test Mode", false, "Enable test mode to cycle through all items with F9/F10 keys."); Harmony.CreateAndPatchAll(typeof(ItemInfoDisplayUpdatePatch), (string)null); Harmony.CreateAndPatchAll(typeof(ItemInfoDisplayEquipPatch), (string)null); Harmony.CreateAndPatchAll(typeof(ItemInfoDisplayFinishCookingPatch), (string)null); Harmony.CreateAndPatchAll(typeof(ItemInfoDisplayReduceUsesRPCPatch), (string)null); Log.LogInfo((object)("Plugin " + Name + " is loaded!")); } private static void ProcessItemGameObject() { Item currentItem = Character.observedCharacter.data.currentItem; ProcessItemGameObject(currentItem); } private static void ProcessItemGameObject(Item item) { //IL_0565: Unknown result type (might be due to invalid IL or missing references) //IL_056c: Expected O, but got Unknown //IL_05f3: Unknown result type (might be due to invalid IL or missing references) //IL_05fa: Expected O, but got Unknown //IL_064a: Unknown result type (might be due to invalid IL or missing references) //IL_0651: Expected O, but got Unknown //IL_069b: Unknown result type (might be due to invalid IL or missing references) //IL_06a2: Expected O, but got Unknown //IL_071a: Unknown result type (might be due to invalid IL or missing references) //IL_0721: Expected O, but got Unknown //IL_07bc: Unknown result type (might be due to invalid IL or missing references) //IL_07c3: Expected O, but got Unknown //IL_0884: Unknown result type (might be due to invalid IL or missing references) //IL_088b: Expected O, but got Unknown //IL_08ca: Unknown result type (might be due to invalid IL or missing references) //IL_08d1: Expected O, but got Unknown //IL_0adf: Unknown result type (might be due to invalid IL or missing references) //IL_0ae6: Expected O, but got Unknown //IL_0bf6: Unknown result type (might be due to invalid IL or missing references) //IL_0bfd: Expected O, but got Unknown //IL_0cbe: Unknown result type (might be due to invalid IL or missing references) //IL_0cc5: Expected O, but got Unknown //IL_094d: Unknown result type (might be due to invalid IL or missing references) //IL_0952: Unknown result type (might be due to invalid IL or missing references) //IL_0e7c: Unknown result type (might be due to invalid IL or missing references) //IL_0e83: Expected O, but got Unknown //IL_0f88: Unknown result type (might be due to invalid IL or missing references) //IL_0f8f: Expected O, but got Unknown //IL_10e2: Unknown result type (might be due to invalid IL or missing references) //IL_10e9: Expected O, but got Unknown //IL_11de: Unknown result type (might be due to invalid IL or missing references) //IL_11e5: Expected O, but got Unknown //IL_127e: Unknown result type (might be due to invalid IL or missing references) //IL_1285: Expected O, but got Unknown //IL_12ff: Unknown result type (might be due to invalid IL or missing references) //IL_1306: Expected O, but got Unknown //IL_1602: Unknown result type (might be due to invalid IL or missing references) //IL_1609: Expected O, but got Unknown //IL_181e: Unknown result type (might be due to invalid IL or missing references) //IL_1825: Expected O, but got Unknown //IL_19c8: Unknown result type (might be due to invalid IL or missing references) //IL_19cf: Expected O, but got Unknown //IL_1b17: Unknown result type (might be due to invalid IL or missing references) //IL_1b1e: Expected O, but got Unknown //IL_1bb4: Unknown result type (might be due to invalid IL or missing references) //IL_1bbb: Expected O, but got Unknown //IL_1d88: Unknown result type (might be due to invalid IL or missing references) //IL_1d8f: Expected O, but got Unknown //IL_1e9b: Unknown result type (might be due to invalid IL or missing references) //IL_1ea2: Expected O, but got Unknown //IL_214f: Unknown result type (might be due to invalid IL or missing references) //IL_2156: Expected O, but got Unknown //IL_2260: Unknown result type (might be due to invalid IL or missing references) //IL_2267: Expected O, but got Unknown GameObject gameObject = ((Component)item).gameObject; Component[] source = (from c in gameObject.GetComponents(typeof(Component)) where (Object)(object)c != (Object)null select c).ToArray(); Component[] array = source.Where(IsComponentActiveForDisplay).ToArray(); bool isConsumable = IsConsumableForCookingDelta(array); Action_ModifyStatus[] array2 = array.OfType<Action_ModifyStatus>().ToArray(); bool suppressNoEffectHint = array.OfType<Action_RaycastDart>().Any(); Component[] array3 = (from c in array where ((object)c).GetType() != typeof(Action_ModifyStatus) group c by ((object)c).GetType() into g select g.First()).ToArray(); ItemCooking val = null; if (array3 != null) { foreach (Component obj in array3) { ItemCooking val2 = (ItemCooking)(object)((obj is ItemCooking) ? obj : null); if (val2 != null) { val = val2; break; } } } bool flag = false; bool flag2 = false; bool flag3 = false; bool suppressThrowAchievement = false; List<AdditionalCookingBehavior> list = new List<AdditionalCookingBehavior>(); if ((Object)(object)val != (Object)null && val.additionalCookingBehaviors != null) { AdditionalCookingBehavior[] additionalCookingBehaviors = val.additionalCookingBehaviors; foreach (AdditionalCookingBehavior val3 in additionalCookingBehaviors) { if (val3 == null) { continue; } list.Add(val3); if (val3 is CookingBehavior_Explode) { flag = true; continue; } if (val3 is CookingBehavior_Wreck) { flag2 = true; continue; } CookingBehavior_EnableScripts val4 = (CookingBehavior_EnableScripts)(object)((val3 is CookingBehavior_EnableScripts) ? val3 : null); if (val4 != null) { if (flag3 || val4.scriptsToEnable == null) { continue; } MonoBehaviour[] scriptsToEnable = val4.scriptsToEnable; foreach (MonoBehaviour val5 in scriptsToEnable) { if ((Object)(object)val5 != (Object)null && ContainsExplodeKeyword(((object)val5).GetType().Name)) { flag3 = true; break; } } if (!flag3 && ScriptsContainSpawnExplosion(val4.scriptsToEnable)) { flag3 = true; } continue; } CookingBehavior_RunActions val6 = (CookingBehavior_RunActions)(object)((val3 is CookingBehavior_RunActions) ? val3 : null); if (val6 != null) { if (flag || val6.actionsToRun == null) { continue; } ItemAction[] actionsToRun = val6.actionsToRun; foreach (ItemAction val7 in actionsToRun) { if (!((Object)(object)val7 == (Object)null)) { if (ContainsExplodeKeyword(((object)val7).GetType().Name)) { flag = true; break; } Action_Spawn val8 = (Action_Spawn)(object)((val7 is Action_Spawn) ? val7 : null); if (val8 != null && (Object)(object)val8.objectToSpawn != (Object)null && ContainsExplodeKeyword(((Object)val8.objectToSpawn).name)) { flag = true; break; } if (val7 is Action_RaycastDart) { flag3 = true; } } } } else if (!flag3 && HasExplodeOnUseBehavior(val3)) { flag3 = true; } } } if ((Object)(object)val != (Object)null && !flag && (Object)(object)val.explosionPrefab != (Object)null) { flag = true; } float cookingEffectMultiplier = GetCookingEffectMultiplier(val); bool flag4 = false; string text = ""; string text2 = ""; string text3 = ""; string suffixCooked = ""; string text4 = ""; ((TMP_Text)itemInfoDisplayTextMesh).text = ""; text2 = ((Ascents.itemWeightModifier <= 0) ? (text2 + GetText("WEIGHT", effectColors["Weight"], ((float)item.carryWeight * 2.5f).ToString("F1").Replace(".0", "")) + "</color>") : (text2 + GetText("WEIGHT", effectColors["Weight"], ((float)(item.carryWeight + Ascents.itemWeightModifier) * 2.5f).ToString("F1").Replace(".0", "")) + "</color>")); if (((Object)gameObject).name.Equals("Bugle(Clone)")) { TextMeshProUGUI obj2 = itemInfoDisplayTextMesh; ((TMP_Text)obj2).text = ((TMP_Text)obj2).text + GetText("Bugle") + "\n"; } else if (((Object)gameObject).name.Equals("Pirate Compass(Clone)")) { TextMeshProUGUI obj3 = itemInfoDisplayTextMesh; ((TMP_Text)obj3).text = ((TMP_Text)obj3).text + GetText("Pirate Compass", effectColors["Injury"]); } else if (((Object)gameObject).name.Equals("Compass(Clone)")) { TextMeshProUGUI obj4 = itemInfoDisplayTextMesh; ((TMP_Text)obj4).text = ((TMP_Text)obj4).text + GetText("Compass", effectColors["Injury"]); } else if (((Object)gameObject).name.Equals("Shell Big(Clone)")) { TextMeshProUGUI obj5 = itemInfoDisplayTextMesh; ((TMP_Text)obj5).text = ((TMP_Text)obj5).text + GetText("Shell Big", effectColors["Hunger"]); } for (int m = 0; m < array3.Length; m++) { if (((object)array3[m]).GetType() == typeof(ItemUseFeedback)) { ItemUseFeedback val9 = (ItemUseFeedback)array3[m]; if (val9.useAnimation.Equals("Eat") || val9.useAnimation.Equals("Drink") || val9.useAnimation.Equals("Heal")) { flag4 = true; } } else if (((object)array3[m]).GetType() == typeof(Action_Consume)) { flag4 = true; } else if (((object)array3[m]).GetType() == typeof(Action_RestoreHunger)) { Action_RestoreHunger val10 = (Action_RestoreHunger)array3[m]; float num = ApplyCookingMultiplier(val10.restorationAmount, cookingEffectMultiplier); text += ProcessEffect(num * -1f, "Hunger"); } else if (((object)array3[m]).GetType() == typeof(Action_GiveExtraStamina)) { Action_GiveExtraStamina val11 = (Action_GiveExtraStamina)array3[m]; float amount = ApplyCookingMultiplier(val11.amount, cookingEffectMultiplier); text += ProcessEffect(amount, "Extra Stamina"); } else if (((object)array3[m]).GetType() == typeof(Action_InflictPoison)) { Action_InflictPoison val12 = (Action_InflictPoison)array3[m]; float amountPerSecond = ApplyCookingMultiplier(val12.poisonPerSecond, cookingEffectMultiplier); text += GetText("InflictPoison", val12.delay.ToString(), ProcessEffectOverTime(amountPerSecond, 1f, val12.inflictionTime, "Poison")); } else if (((object)array3[m]).GetType() == typeof(Action_AddOrRemoveThorns)) { Action_AddOrRemoveThorns val13 = (Action_AddOrRemoveThorns)array3[m]; float amount2 = ApplyCookingMultiplier((float)val13.thornCount * 0.05f, cookingEffectMultiplier); text += ProcessEffect(amount2, "Thorns"); } else if (((object)array3[m]).GetType() == typeof(Action_RandomMushroomEffect)) { string addition = BuildRandomMushroomEffectText(array3[m]); ((TMP_Text)itemInfoDisplayTextMesh).text = AppendWithSectionSpacing(((TMP_Text)itemInfoDisplayTextMesh).text, addition); } else if (((object)array3[m]).GetType() == typeof(Action_ApplyMassAffliction)) { Action_ApplyMassAffliction val14 = (Action_ApplyMassAffliction)array3[m]; text4 += GetText("ApplyMassAffliction"); text4 += ProcessAffliction(((Action_ApplyAffliction)val14).affliction, cookingEffectMultiplier); if (((Action_ApplyAffliction)val14).extraAfflictions == null || ((Action_ApplyAffliction)val14).extraAfflictions.Length == 0) { continue; } for (int n = 0; n < ((Action_ApplyAffliction)val14).extraAfflictions.Length; n++) { if (text4.EndsWith('\n')) { text4 = text4.Remove(text4.Length - 1); } text4 = text4 + ",\n" + ProcessAffliction(((Action_ApplyAffliction)val14).extraAfflictions[n], cookingEffectMultiplier); } } else if (((object)array3[m]).GetType() == typeof(Action_ApplyAffliction)) { Action_ApplyAffliction val15 = (Action_ApplyAffliction)array3[m]; text4 += ProcessAffliction(val15.affliction, cookingEffectMultiplier); } else if (((object)array3[m]).GetType() == typeof(Action_ClearAllStatus)) { Action_ClearAllStatus val16 = (Action_ClearAllStatus)array3[m]; string text5 = GetText("ClearAllStatus_Base", effectColors["ItemInfoDisplayPositive"]); if (val16.excludeCurse) { text5 += GetText("ClearAllStatus_ExceptCurse", effectColors["Curse"]); } if (val16.otherExclusions.Count > 0) { foreach (STATUSTYPE otherExclusion in val16.otherExclusions) { STATUSTYPE current = otherExclusion; text5 = text5 + ", " + effectColors[((object)(STATUSTYPE)(ref current)).ToString()] + GetText("Effect_" + ((object)(STATUSTYPE)(ref current)).ToString().ToUpper()).ToUpper() + "</color>"; } } text5 = text5.Replace(", <#E13542>" + GetText("Effect_CRAB").ToUpper() + "</color>", "") + "\n"; TextMeshProUGUI obj6 = itemInfoDisplayTextMesh; ((TMP_Text)obj6).text = ((TMP_Text)obj6).text + text5; } else if (((object)array3[m]).GetType() == typeof(Action_BecomeSkeleton)) { ((TMP_Text)itemInfoDisplayTextMesh).text = AppendWithSectionSpacing(((TMP_Text)itemInfoDisplayTextMesh).text, GetText("BecomeSkeleton", effectColors["ItemInfoDisplayPositive"], effectColors["Curse"], effectColors["Injury"], effectColors["Curse"])); } else if (((object)array3[m]).GetType() == typeof(Action_ConsumeAndSpawn)) { Action_ConsumeAndSpawn val17 = (Action_ConsumeAndSpawn)array3[m]; if (((object)val17.itemToSpawn).ToString().Contains("Peel")) { TextMeshProUGUI obj7 = itemInfoDisplayTextMesh; ((TMP_Text)obj7).text = ((TMP_Text)obj7).text + GetText("ConsumeAndSpawn_Peel"); } } else if (((object)array3[m]).GetType() == typeof(Action_ReduceUses)) { if (item?.data?.data != null && item.data.data.TryGetValue((DataEntryKey)2, out var value)) { OptionableIntItemData val18 = (OptionableIntItemData)(object)((value is OptionableIntItemData) ? value : null); if (val18 != null && val18.HasData && val18.Value > 1) { text3 += GetText("ReduceUses", val18.Value.ToString()); } } } else if (((object)array3[m]).GetType() == typeof(Lantern)) { Lantern lantern = (Lantern)array3[m]; if (((Object)gameObject).name.Equals("Torch(Clone)")) { TextMeshProUGUI obj8 = itemInfoDisplayTextMesh; ((TMP_Text)obj8).text = ((TMP_Text)obj8).text + GetText("Torch"); } else { text4 += GetText("Lantern"); } if (!((Object)gameObject).name.Equals("Torch(Clone)")) { int lanternRemainingSecondsInt = GetLanternRemainingSecondsInt(item, lantern); text4 += GetText("LanternRemaining", lanternRemainingSecondsInt.ToString()); text4 = AppendLanternStatusPerSecond(gameObject, text4); } } else if (((object)array3[m]).GetType() == typeof(Action_RaycastDart)) { Action_RaycastDart effect = (Action_RaycastDart)array3[m]; flag4 = true; text4 += BuildRaycastDartSection(effect, cookingEffectMultiplier); } else if (((object)array3[m]).GetType() == typeof(MagicBugle)) { TextMeshProUGUI obj9 = itemInfoDisplayTextMesh; ((TMP_Text)obj9).text = ((TMP_Text)obj9).text + GetText("MagicBugle"); } else if (((object)array3[m]).GetType() == typeof(ClimbingSpikeComponent)) { TextMeshProUGUI obj10 = itemInfoDisplayTextMesh; ((TMP_Text)obj10).text = ((TMP_Text)obj10).text + GetText("ClimbingSpike", effectColors["Extra Stamina"]); } else if (((object)array3[m]).GetType() == typeof(Action_Flare)) { TextMeshProUGUI obj11 = itemInfoDisplayTextMesh; ((TMP_Text)obj11).text = ((TMP_Text)obj11).text + GetText("Flare"); } else if (((object)array3[m]).GetType() == typeof(Backpack)) { TextMeshProUGUI obj12 = itemInfoDisplayTextMesh; ((TMP_Text)obj12).text = ((TMP_Text)obj12).text + GetText("Backpack"); } else if (((object)array3[m]).GetType() == typeof(BananaPeel)) { TextMeshProUGUI obj13 = itemInfoDisplayTextMesh; ((TMP_Text)obj13).text = ((TMP_Text)obj13).text + GetText("BananaPeel", effectColors["Hunger"]); } else if (((object)array3[m]).GetType() == typeof(Constructable)) { Constructable val19 = (Constructable)array3[m]; if ((Object)(object)val19.constructedPrefab != (Object)null && ((Object)val19.constructedPrefab).name.Equals("PortableStovetop_Placed")) { Campfire component = val19.constructedPrefab.GetComponent<Campfire>(); if ((Object)(object)component != (Object)null) { TextMeshProUGUI obj14 = itemInfoDisplayTextMesh; ((TMP_Text)obj14).text = ((TMP_Text)obj14).text + GetText("Constructable_PortableStovetop_Placed", effectColors["Injury"], component.burnsFor.ToString()); } else { TextMeshProUGUI obj15 = itemInfoDisplayTextMesh; ((TMP_Text)obj15).text = ((TMP_Text)obj15).text + GetText("Constructable"); } } else { TextMeshProUGUI obj16 = itemInfoDisplayTextMesh; ((TMP_Text)obj16).text = ((TMP_Text)obj16).text + GetText("Constructable"); } } else if (((object)array3[m]).GetType() == typeof(RopeSpool)) { RopeSpool val20 = (RopeSpool)array3[m]; if (val20.isAntiRope) { TextMeshProUGUI obj17 = itemInfoDisplayTextMesh; ((TMP_Text)obj17).text = ((TMP_Text)obj17).text + GetText("RopeSpool_AntiRope"); } else { TextMeshProUGUI obj18 = itemInfoDisplayTextMesh; ((TMP_Text)obj18).text = ((TMP_Text)obj18).text + GetText("RopeSpool"); } TextMeshProUGUI obj19 = itemInfoDisplayTextMesh; ((TMP_Text)obj19).text = ((TMP_Text)obj19).text + GetText("RopeSpool_TIP", (val20.minSegments / 4f).ToString("F2").Replace(".0", ""), ((float)Rope.MaxSegments / 4f).ToString("F1").Replace(".0", "")); if (configForceUpdateTime.Value <= 1f) { text3 += GetText("RopeSpool_Left", (val20.RopeFuel / 4f).ToString("F2").Replace(".00", "")); } } else if (((object)array3[m]).GetType() == typeof(RopeShooter)) { RopeShooter val21 = (RopeShooter)array3[m]; if ((Object)(object)val21.ropeAnchorWithRopePref != (Object)null && ((Object)val21.ropeAnchorWithRopePref).name.Equals("RopeAnchorForRopeShooterAnti")) { TextMeshProUGUI obj20 = itemInfoDisplayTextMesh; ((TMP_Text)obj20).text = ((TMP_Text)obj20).text + GetText("RopeShooter_Anti", (val21.maxLength / 4f).ToString("F1").Replace(".0", "")); } else { TextMeshProUGUI obj21 = itemInfoDisplayTextMesh; ((TMP_Text)obj21).text = ((TMP_Text)obj21).text + GetText("RopeShooter", (val21.maxLength / 4f).ToString("F1").Replace(".0", "")); } } else if (((object)array3[m]).GetType() == typeof(Antigrav)) { Antigrav val22 = (Antigrav)array3[m]; if (val22.intensity != 0f) { text4 += GetText("Antigrav", effectColors["Injury"]); } } else if (((object)array3[m]).GetType() == typeof(Action_Balloon)) { text4 += GetText("Balloon"); } else if (((object)array3[m]).GetType() == typeof(VineShooter)) { VineShooter val23 = (VineShooter)array3[m]; TextMeshProUGUI obj22 = itemInfoDisplayTextMesh; ((TMP_Text)obj22).text = ((TMP_Text)obj22).text + GetText("VineShooter", (val23.maxLength / 1.6666666f).ToString("F1").Replace(".0", "")); } else if (((object)array3[m]).GetType() == typeof(ShelfShroom)) { ShelfShroom val24 = (ShelfShroom)array3[m]; if ((Object)(object)val24.instantiateOnBreak == (Object)null) { Log.LogWarning((object)"[ItemInfoDisplay] ShelfShroom instantiateOnBreak was null. Skipping detailed info."); } else if (((Object)val24.instantiateOnBreak).name.Equals("HealingPuffShroomSpawn")) { TextMeshProUGUI obj23 = itemInfoDisplayTextMesh; ((TMP_Text)obj23).text = ((TMP_Text)obj23).text + GetText("HealingPuffShroom", effectColors["Hunger"]); ((TMP_Text)itemInfoDisplayTextMesh).text = AppendHealingPuffShroomEffectInfo(gameObject, ((TMP_Text)itemInfoDisplayTextMesh).text); } else if (((Object)val24.instantiateOnBreak).name.Equals("ShelfShroomSpawn")) { TextMeshProUGUI obj24 = itemInfoDisplayTextMesh; ((TMP_Text)obj24).text = ((TMP_Text)obj24).text + GetText("ShelfShroomSpawn", effectColors["Hunger"]); } else if (((Object)val24.instantiateOnBreak).name.Equals("BounceShroomSpawn")) { TextMeshProUGUI obj25 = itemInfoDisplayTextMesh; ((TMP_Text)obj25).text = ((TMP_Text)obj25).text + GetText("BounceShroomSpawn", effectColors["Hunger"]); } } else if (((object)array3[m]).GetType() == typeof(ScoutEffigy)) { TextMeshProUGUI obj26 = itemInfoDisplayTextMesh; ((TMP_Text)obj26).text = ((TMP_Text)obj26).text + GetText("ScoutEffigy", effectColors["Extra Stamina"]); } else if (((object)array3[m]).GetType() == typeof(Action_Die)) { TextMeshProUGUI obj27 = itemInfoDisplayTextMesh; ((TMP_Text)obj27).text = ((TMP_Text)obj27).text + GetText("Action_Die", effectColors["Curse"]); } else if (((object)array3[m]).GetType() == typeof(Action_SpawnGuidebookPage)) { flag4 = true; TextMeshProUGUI obj28 = itemInfoDisplayTextMesh; ((TMP_Text)obj28).text = ((TMP_Text)obj28).text + GetText("SpawnGuidebookPage"); } else if (((object)array3[m]).GetType() == typeof(Action_Guidebook)) { TextMeshProUGUI obj29 = itemInfoDisplayTextMesh; ((TMP_Text)obj29).text = ((TMP_Text)obj29).text + GetText("Guidebook"); } else if (((object)array3[m]).GetType() == typeof(Action_CallScoutmaster)) { ((TMP_Text)itemInfoDisplayTextMesh).text = AppendWithSectionSpacing(((TMP_Text)itemInfoDisplayTextMesh).text, GetText("CallScoutmaster", effectColors["Injury"]) ?? ""); } else if (((object)array3[m]).GetType() == typeof(Action_MoraleBoost)) { Action_MoraleBoost val25 = (Action_MoraleBoost)array3[m]; float num2 = ApplyCookingMultiplier(val25.baselineStaminaBoost, cookingEffectMultiplier); if (val25.boostRadius < 0f) { TextMeshProUGUI obj30 = itemInfoDisplayTextMesh; ((TMP_Text)obj30).text = ((TMP_Text)obj30).text + GetText("MoraleBoost_Self", effectColors["ItemInfoDisplayPositive"], effectColors["Extra Stamina"], (num2 * 100f).ToString("F1").Replace(".0", "")); } else if (val25.boostRadius > 0f) { TextMeshProUGUI obj31 = itemInfoDisplayTextMesh; ((TMP_Text)obj31).text = ((TMP_Text)obj31).text + GetText("MoraleBoost_Nearby", effectColors["ItemInfoDisplayPositive"], effectColors["Extra Stamina"], (num2 * 100f).ToString("F1").Replace(".0", "")); } } else if (((object)array3[m]).GetType() == typeof(Breakable)) { ((TMP_Text)itemInfoDisplayTextMesh).text = AppendWithSectionSpacing(((TMP_Text)itemInfoDisplayTextMesh).text, GetText("Breakable", effectColors["Hunger"]) ?? ""); } else if (((object)array3[m]).GetType() == typeof(Bonkable)) { ((TMP_Text)itemInfoDisplayTextMesh).text = AppendWithSectionSpacing(((TMP_Text)itemInfoDisplayTextMesh).text, GetText("Bonkable", effectColors["Hunger"], effectColors["Injury"]) ?? ""); } else if (((object)array3[m]).GetType() == typeof(MagicBean)) { MagicBean val26 = (MagicBean)array3[m]; TextMeshProUGUI obj32 = itemInfoDisplayTextMesh; ((TMP_Text)obj32).text = ((TMP_Text)obj32).text + GetText("MagicBean", effectColors["Hunger"], (val26.plantPrefab.maxLength / 2f).ToString("F1").Replace(".0", "")); } else if (((object)array3[m]).GetType() == typeof(BingBong)) { TextMeshProUGUI obj33 = itemInfoDisplayTextMesh; ((TMP_Text)obj33).text = ((TMP_Text)obj33).text + GetText("BingBong"); } else if (((object)array3[m]).GetType() == typeof(Action_Passport)) { TextMeshProUGUI obj34 = itemInfoDisplayTextMesh; ((TMP_Text)obj34).text = ((TMP_Text)obj34).text + GetText("Passport") + "\n"; } else if (((object)array3[m]).GetType() == typeof(Actions_Binoculars)) { TextMeshProUGUI obj35 = itemInfoDisplayTextMesh; ((TMP_Text)obj35).text = ((TMP_Text)obj35).text + GetText("Binoculars"); } else if (((object)array3[m]).GetType() == typeof(Action_WarpToRandomPlayer)) { TextMeshProUGUI obj36 = itemInfoDisplayTextMesh; ((TMP_Text)obj36).text = ((TMP_Text)obj36).text + GetText("WarpToRandomPlayer"); } else if (((object)array3[m]).GetType() == typeof(Action_WarpToBiome)) { Action_WarpToBiome val27 = (Action_WarpToBiome)array3[m]; TextMeshProUGUI obj37 = itemInfoDisplayTextMesh; ((TMP_Text)obj37).text = ((TMP_Text)obj37).text + GetText("WarpToBiome", ((object)(Segment)(ref val27.segmentToWarpTo)).ToString().ToUpper()); } else if (((object)array3[m]).GetType() == typeof(Parasol)) { TextMeshProUGUI obj38 = itemInfoDisplayTextMesh; ((TMP_Text)obj38).text = ((TMP_Text)obj38).text + GetText("Parasol") + "\n"; } else if (((object)array3[m]).GetType() == typeof(Frisbee)) { TextMeshProUGUI obj39 = itemInfoDisplayTextMesh; ((TMP_Text)obj39).text = ((TMP_Text)obj39).text + GetText("Frisbee", effectColors["Hunger"]); } else if (((object)array3[m]).GetType() == typeof(Action_ConstructableScoutCannonScroll)) { TextMeshProUGUI obj40 = itemInfoDisplayTextMesh; ((TMP_Text)obj40).text = ((TMP_Text)obj40).text + GetText("ConstructableScoutCannonScroll"); } else if (((object)array3[m]).GetType() == typeof(Dynamite)) { Dynamite val28 = (Dynamite)array3[m]; TextMeshProUGUI obj41 = itemInfoDisplayTextMesh; ((TMP_Text)obj41).text = ((TMP_Text)obj41).text + GetText("Dynamite", effectColors["Injury"], (val28.explosionPrefab.GetComponent<AOE>().statusAmount * 100f).ToString("F1").Replace(".0", "")); } else if (((object)array3[m]).GetType() == typeof(Scorpion)) { Scorpion val29 = (Scorpion)array3[m]; if (configForceUpdateTime.Value <= 1f) { Character val30 = item.holderCharacter ?? Character.observedCharacter; float num3 = (((Object)(object)val30 != (Object)null && val30.refs != null && (Object)(object)val30.refs.afflictions != (Object)null) ? val30.refs.afflictions.statusSum : 0f); float num4 = Mathf.Max(0.5f, 1f - num3 + 0.05f) * 100f; TextMeshProUGUI obj42 = itemInfoDisplayTextMesh; ((TMP_Text)obj42).text = ((TMP_Text)obj42).text + GetText("Scorpion_Dynamic", effectColors["Poison"], effectColors["Curse"], effectColors["Heat"], num4.ToString("F1").Replace(".0", ""), val29.totalPoisonTime.ToString("F1").Replace(".0", "")); } else { TextMeshProUGUI obj43 = itemInfoDisplayTextMesh; ((TMP_Text)obj43).text = ((TMP_Text)obj43).text + GetText("Scorpion_Static", effectColors["Poison"], effectColors["Curse"], effectColors["Heat"], val29.totalPoisonTime.ToString("F1").Replace(".0", "")); } } else if (((object)array3[m]).GetType() == typeof(Action_Spawn)) { Action_Spawn val31 = (Action_Spawn)array3[m]; if ((Object)(object)val31.objectToSpawn != (Object)null && ((Object)val31.objectToSpawn).name.Equals("VFX_Sunscreen")) { Transform val32 = val31.objectToSpawn.transform.Find("AOE"); AOE val33 = (((Object)(object)val32 != (Object)null) ? ((Component)val32).GetComponent<AOE>() : null); RemoveAfterSeconds val34 = (((Object)(object)val32 != (Object)null) ? ((Component)val32).GetComponent<RemoveAfterSeconds>() : null); if ((Object)(object)val33 != (Object)null && (Object)(object)val34 != (Object)null) { TextMeshProUGUI obj44 = itemInfoDisplayTextMesh; ((TMP_Text)obj44).text = ((TMP_Text)obj44).text + GetText("VFX_Sunscreen", val34.seconds.ToString("F1").Replace(".0", ""), ProcessAffliction(val33.affliction, cookingEffectMultiplier)); } } } else if (((object)array3[m]).GetType() == typeof(CactusBall)) { CactusBall val35 = (CactusBall)array3[m]; TextMeshProUGUI obj45 = itemInfoDisplayTextMesh; ((TMP_Text)obj45).text = ((TMP_Text)obj45).text + GetText("CactusBall", effectColors["Thorns"], effectColors["Hunger"], (((StickyItemComponent)val35).throwChargeRequirement * 100f).ToString("F1").Replace(".0", "")); } else if (((object)array3[m]).GetType() == typeof(BingBongShieldWhileHolding)) { TextMeshProUGUI obj46 = itemInfoDisplayTextMesh; ((TMP_Text)obj46).text = ((TMP_Text)obj46).text + GetText("BingBongShieldWhileHolding", effectColors["Shield"]); } else if (((object)array3[m]).GetType() == typeof(RescueHook)) { TextMeshProUGUI obj47 = itemInfoDisplayTextMesh; ((TMP_Text)obj47).text = ((TMP_Text)obj47).text + GetText("RescueHook"); } else if (((object)array3[m]).GetType() == typeof(Beehive)) { TextMeshProUGUI obj48 = itemInfoDisplayTextMesh; ((TMP_Text)obj48).text = ((TMP_Text)obj48).text + GetText("Beehive", effectColors["Injury"], effectColors["Poison"]); } else if (((object)array3[m]).GetType() == typeof(BugPhobia)) { ((TMP_Text)itemInfoDisplayTextMesh).text = AppendWithSectionSpacing(((TMP_Text)itemInfoDisplayTextMesh).text, GetText("BugPhobia")); } else if (((object)array3[m]).GetType() == typeof(Mandrake)) { TextMeshProUGUI obj49 = itemInfoDisplayTextMesh; ((TMP_Text)obj49).text = ((TMP_Text)obj49).text + GetText("Mandrake", effectColors["Drowsy"], effectColors["Heat"]); suppressThrowAchievement = true; } else if (((object)array3[m]).GetType() == typeof(Snowball)) { TextMeshProUGUI obj50 = itemInfoDisplayTextMesh; ((TMP_Text)obj50).text = ((TMP_Text)obj50).text + GetText("Snowball", effectColors["Cold"]); } else if (((object)array3[m]).GetType() == typeof(StickyItemComponent)) { StickyItemComponent val36 = (StickyItemComponent)array3[m]; string text6 = GetText("StickyItemComponent", effectColors["Hunger"]); if (val36.addWeightToStuckPlayer > 0) { text6 += GetText("StickyItemComponent_Weight", effectColors["Weight"], ((float)val36.addWeightToStuckPlayer * 2.5f).ToString("F1").Replace(".0", "")); } if (val36.addThornsToStuckPlayer > 0) { text6 += GetText("StickyItemComponent_Thorns", effectColors["Thorns"], val36.addThornsToStuckPlayer.ToString()); } TextMeshProUGUI obj51 = itemInfoDisplayTextMesh; ((TMP_Text)obj51).text = ((TMP_Text)obj51).text + text6; } else { if (!(((object)array3[m]).GetType() == typeof(ItemCooking))) { continue; } val = (ItemCooking)array3[m]; bool flag5 = val.wreckWhenCooked || flag2; bool flag6 = !flag && !flag5; bool hasDeltaHeader; List<string> list2 = BuildNextCookDeltaLines(val, list, flag3, flag5, cookingEffectMultiplier, isConsumable, flag6, suppressThrowAchievement, suppressNoEffectHint, out hasDeltaHeader); bool flag7 = flag6 && val.timesCookedLocal == 0; string text7 = null; bool flag8 = false; if (flag7 && !hasDeltaHeader && list2.Count == 1 && IsCookNextHintLine(list2[0])) { text7 = list2[0]; flag8 = true; } bool flag9 = false; if (!val.canBeCooked) { suffixCooked += GetText("COOK_DISABLED", effectColors["Curse"]); } else if (flag5 && val.timesCookedLocal >= 1) { suffixCooked += GetText("COOKED_BROKEN", effectColors["Curse"]); } else if (val.timesCookedLocal >= 12) { suffixCooked += GetText("COOKED_MAX", effectColors["Curse"], val.timesCookedLocal.ToString()); } else if (val.timesCookedLocal == 0) { if (flag6) { suffixCooked = suffixCooked + GetText("COOK", effectColors["Extra Stamina"]) + "</color>"; if (hasDeltaHeader) { suffixCooked = suffixCooked + " " + GetText("COOK_NEXT_DELTA"); flag9 = true; } else if (!string.IsNullOrWhiteSpace(text7)) { suffixCooked = suffixCooked + " " + text7; } } } else if (val.timesCookedLocal <= 2) { suffixCooked += GetText("COOKED", effectColors["Extra Stamina"], val.timesCookedLocal.ToString()); if (hasDeltaHeader) { suffixCooked = suffixCooked + " " + GetText("COOK_NEXT_DELTA"); flag9 = true; } } else if (val.timesCookedLocal == 3) { suffixCooked += GetText("COOKED", effectColors["Injury"], val.timesCookedLocal.ToString()); if (hasDeltaHeader) { suffixCooked = suffixCooked + " " + GetText("COOK_NEXT_DELTA"); flag9 = true; } } else if (val.timesCookedLocal >= 4) { suffixCooked += GetText("COOKED", effectColors["Poison"], val.timesCookedLocal.ToString()); if (hasDeltaHeader) { suffixCooked = suffixCooked + " " + GetText("COOK_NEXT_DELTA"); flag9 = true; } } if (val.canBeCooked && val.timesCookedLocal < 12 && list2.Count > 0) { if (flag8 && text7 != null && list2.Count == 1 && list2[0] == text7) { list2.Clear(); } if (hasDeltaHeader && !flag9) { list2.Insert(0, GetText("COOK_NEXT_DELTA")); } AppendCookDeltaLines(ref suffixCooked, list2); } } } if (array2.Length != 0) { Dictionary<string, float> dictionary = new Dictionary<string, float>(); Action_ModifyStatus[] array4 = array2; foreach (Action_ModifyStatus val37 in array4) { if (!((Object)(object)val37 == (Object)null)) { float num6 = ApplyCookingMultiplier(val37.changeAmount, cookingEffectMultiplier); string key = ((object)(STATUSTYPE)(ref val37.statusType)).ToString(); if (dictionary.TryGetValue(key, out var value2)) { dictionary[key] = value2 + num6; } else { dictionary[key] = num6; } } } foreach (KeyValuePair<string, float> item2 in dictionary) { text += ProcessEffect(item2.Value, item2.Key); } } if (text.Length > 0 && flag4) { ((TMP_Text)itemInfoDisplayTextMesh).text = text + "\n" + ((TMP_Text)itemInfoDisplayTextMesh).text; } if (text4.Length > 0) { TextMeshProUGUI obj52 = itemInfoDisplayTextMesh; ((TMP_Text)obj52).text = ((TMP_Text)obj52).text + "\n" + text4; } string text8 = text2 + text3; if (!string.IsNullOrEmpty(suffixCooked)) { if (!string.IsNullOrEmpty(text8)) { text8 += "\n\n"; } text8 += suffixCooked; } if (!string.IsNullOrEmpty(text8)) { if (((TMP_Text)itemInfoDisplayTextMesh).text.Length > 0 && !((TMP_Text)itemInfoDisplayTextMesh).text.EndsWith("\n\n")) { if (((TMP_Text)itemInfoDisplayTextMesh).text.EndsWith("\n")) { TextMeshProUGUI obj53 = itemInfoDisplayTextMesh; ((TMP_Text)obj53).text = ((TMP_Text)obj53).text + "\n"; } else { TextMeshProUGUI obj54 = itemInfoDisplayTextMesh; ((TMP_Text)obj54).text = ((TMP_Text)obj54).text + "\n\n"; } } TextMeshProUGUI obj55 = itemInfoDisplayTextMesh; ((TMP_Text)obj55).text = ((TMP_Text)obj55).text + text8; } while (((TMP_Text)itemInfoDisplayTextMesh).text.Contains("\n\n\n")) { ((TMP_Text)itemInfoDisplayTextMesh).text = ((TMP_Text)itemInfoDisplayTextMesh).text.Replace("\n\n\n", "\n\n"); } } private static string AppendWithSectionSpacing(string target, string addition) { if (string.IsNullOrEmpty(addition)) { return target; } if (target.Length > 0 && !target.EndsWith("\n\n")) { target += (target.EndsWith("\n") ? "\n" : "\n\n"); } target += addition; return target; } private static string AppendHealingPuffShroomEffectInfo(GameObject itemGameObj, string target) { return AppendStatusFieldInfo(itemGameObj, target); } private static string AppendStatusFieldInfo(GameObject source, string target) { if ((Object)(object)source == (Object)null) { return target; } StatusField[] array = source.GetComponentsInChildren<StatusField>(true); if (array == null) { array = Array.Empty<StatusField>(); } Dictionary<string, float> dictionary = new Dictionary<string, float>(); Dictionary<string, float> dictionary2 = new Dictionary<string, float>(); StatusField[] array2 = array; foreach (StatusField val in array2) { if ((Object)(object)val == (Object)null) { continue; } string text = ((object)(STATUSTYPE)(ref val.statusType)).ToString(); if (!string.IsNullOrEmpty(text)) { dictionary[text] = (dictionary.TryGetValue(text, out var value) ? (value + val.statusAmountPerSecond) : val.statusAmountPerSecond); if (val.statusAmountOnEntry != 0f) { dictionary2[text] = (dictionary2.TryGetValue(text, out var value2) ? (value2 + val.statusAmountOnEntry) : val.statusAmountOnEntry); } } if (val.additionalStatuses == null) { continue; } foreach (StatusFieldStatus additionalStatus in val.additionalStatuses) { string text2 = ((object)(STATUSTYPE)(ref additionalStatus.statusType)).ToString(); if (!string.IsNullOrEmpty(text2)) { dictionary[text2] = (dictionary.TryGetValue(text2, out var value3) ? (value3 + additionalStatus.statusAmountPerSecond) : additionalStatus.statusAmountPerSecond); } } } if (dictionary.Count == 0 && dictionary2.Count == 0) { dictionary2["Injury"] = -0.15f; dictionary["Injury"] = -0.025f; dictionary["Poison"] = -0.05f; } List<string> list = new List<string>(); string text3 = GetText("HealingPuffShroom_FollowupPerSecond"); foreach (KeyValuePair<string, float> item in dictionary2.OrderBy((KeyValuePair<string, float> k) => k.Key)) { string text4 = ToInlineText(ProcessEffectOnEntry(item.Value, item.Key)); if (!string.IsNullOrWhiteSpace(text4)) { list.Add("• " + text4 + text3); } } foreach (KeyValuePair<string, float> item2 in dictionary.OrderBy((KeyValuePair<string, float> k) => k.Key)) { string text5 = ToInlineText(ProcessEffectPerSecond(item2.Value, item2.Key)); if (!string.IsNullOrWhiteSpace(text5)) { list.Add("• " + text5); } } if (list.Count > 0) { target = target + string.Join("\n", list) + "\n"; } return target; } private static string AppendLanternStatusPerSecond(GameObject itemGameObj, string target) { if ((Object)(object)itemGameObj == (Object)null) { return target; } StatusField[] componentsInChildren = itemGameObj.GetComponentsInChildren<StatusField>(true); if (componentsInChildren == null || componentsInChildren.Length == 0) { return target; } Dictionary<string, float> dictionary = new Dictionary<string, float>(); Dictionary<string, float> dictionary2 = new Dictionary<string, float>(); StatusField[] array = componentsInChildren; foreach (StatusField val in array) { if ((Object)(object)val == (Object)null) { continue; } string text = ((object)(STATUSTYPE)(ref val.statusType)).ToString(); if (!string.IsNullOrEmpty(text)) { dictionary[text] = (dictionary.TryGetValue(text, out var value) ? (value + val.statusAmountPerSecond) : val.statusAmountPerSecond); if (val.statusAmountOnEntry != 0f) { dictionary2[text] = (dictionary2.TryGetValue(text, out var value2) ? (value2 + val.statusAmountOnEntry) : val.statusAmountOnEntry); } } foreach (StatusFieldStatus additionalStatus in val.additionalStatuses) { string text2 = ((object)(STATUSTYPE)(ref additionalStatus.statusType)).ToString(); if (!string.IsNullOrEmpty(text2)) { dictionary[text2] = (dictionary.TryGetValue(text2, out var value3) ? (value3 + additionalStatus.statusAmountPerSecond) : additionalStatus.statusAmountPerSecond); } } } AddFaerieLanternSporesPerSecond(itemGameObj, dictionary); foreach (KeyValuePair<string, float> item in dictionary.OrderBy((KeyValuePair<string, float> k) => k.Key)) { target += ProcessEffectPerSecond(item.Value, item.Key); } foreach (KeyValuePair<string, float> item2 in dictionary2.OrderBy((KeyValuePair<string, float> k) => k.Key)) { target += ProcessEffectOnEntry(item2.Value, item2.Key); } if (TryGetDispelFogFieldInfo(itemGameObj, out var innerRadius, out var outerRadius)) { target += GetText("DispelFogField_Strength", effectColors["ItemInfoDisplayPositive"], GetEffectColor("Spores"), innerRadius.ToString("F1").Replace(".0", ""), outerRadius.ToString("F1").Replace(".0", "")); } return target; } private static void AddFaerieLanternSporesPerSecond(GameObject itemGameObj, Dictionary<string, float> totals) { if (totals != null && !((Object)(object)itemGameObj == (Object)null) && IsFaerieLantern(itemGameObj)) { totals["Spores"] = (totals.TryGetValue("Spores", out var value) ? (value + -0.025f) : (-0.025f)); } } private static bool IsFaerieLantern(GameObject itemGameObj) { if ((Object)(object)itemGameObj == (Object)null) { return false; } string text = ((Object)itemGameObj).name ?? string.Empty; return text.StartsWith("Lantern_Faerie", StringComparison.OrdinalIgnoreCase); } private static bool TryGetDispelFogFieldInfo(GameObject itemGameObj, out float innerRadius, out float outerRadius) { innerRadius = 0f; outerRadius = 0f; if ((Object)(object)itemGameObj == (Object)null) { return false; } Component[] componentsInChildren = itemGameObj.GetComponentsInChildren<Component>(true); Component[] array = componentsInChildren; foreach (Component val in array) { if (!((Object)(object)val == (Object)null) && ((object)val).GetType().Name == "DispelFogField") { Type type = ((object)val).GetType(); FieldInfo field = type.GetField("innerRadius", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); FieldInfo field2 = type.GetField("outerRadius", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field != null) { innerRadius = (float)field.GetValue(val); } if (field2 != null) { outerRadius = (float)field2.GetValue(val); } return true; } } return false; } private static string BuildRandomMushroomEffectText(object effect) { if (effect is Action_RandomMushroomEffect) { return BuildRandomMushroomEffectListText(); } if (effect == null) { return GetText("RandomMushroomEffect"); } HashSet<string> hashSet = new HashSet<string>(); CollectStatusTypes(effect, hashSet); if (hashSet.Count == 0) { return GetText("RandomMushroomEffect"); } List<string> list = new List<string>(); foreach (string item in hashSet) { list.Add(FormatEffectNameWithColor(item)); } string text = string.Join(", ", list); return GetText("RandomMushroomEffect_List", text); } private static string BuildRandomMushroomEffectListText() { string text = GetText("RandomMushroomEffect_Title"); text += GetText("RandomMushroomEffect_0", effectColors["Extra Stamina"], "4"); text += GetText("RandomMushroomEffect_1", effectColors["ItemInfoDisplayPositive"], "50", "150", "5", "1"); text += GetText("RandomMushroomEffect_2", effectColors["ItemInfoDisplayPositive"], "3", "15"); text += GetText("RandomMushroomEffect_3", effectColors["ItemInfoDisplayPositive"], "10"); text += GetText("RandomMushroomEffect_4", effectColors["ItemInfoDisplayPositive"], effectColors["Hunger"], effectColors["Injury"], effectColors["Poison"], "<#CCCCCC>"); text += GetText("RandomMushroomEffect_5", effectColors["Spores"]); text += GetText("RandomMushroomEffect_6", effectColors["ItemInfoDisplayNegative"], "60"); text += GetText("RandomMushroomEffect_7", effectColors["ItemInfoDisplayNegative"]); text += GetText("RandomMushroomEffect_8", effectColors["ItemInfoDisplayNegative"], effectColors["Spores"]); return text + GetText("RandomMushroomEffect_9", effectColors["ItemInfoDisplayNegative"], "60"); } private static void CollectStatusTypes(object value, HashSet<string> statusTypes) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) if (value == null) { return; } if (value is STATUSTYPE val) { statusTypes.Add(((object)(STATUSTYPE)(ref val)).ToString()); return; } Affliction val2 = (Affliction)((value is Affliction) ? value : null); if (val2 != null) { AfflictionType afflictionType = val2.GetAfflictionType(); statusTypes.Add(((object)(AfflictionType)(ref afflictionType)).ToString()); return; } if (value is IEnumerable enumerable && !(value is string)) { foreach (object item in enumerable) { CollectStatusTypes(item, statusTypes); } return; } Type type = value.GetType(); if (!type.IsClass) { return; } FieldInfo[] fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); foreach (FieldInfo fieldInfo in fields) { if (!(fieldInfo.FieldType == typeof(string))) { object value2 = fieldInfo.GetValue(value); CollectStatusTypes(value2, statusTypes); } } PropertyInfo[] properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); foreach (PropertyInfo propertyInfo in properties) { if (propertyInfo.CanRead && propertyInfo.GetIndexParameters().Length == 0 && !(propertyInfo.PropertyType == typeof(string))) { object obj = null; try { obj = propertyInfo.GetValue(value, null); } catch { continue; } CollectStatusTypes(obj, statusTypes); } } } private static string FormatEffectNameWithColor(string effect) { string text; try { text = GetText("Effect_" + effect.ToUpper()).ToUpper(); } catch { text = effect.ToUpper(); } return GetEffectColor(effect) + text + "</color>"; } private static string ProcessEffect(float amount, string effect) { string text = ""; string text2 = string.Empty; string key = string.Empty; if (amount == 0f) { return text; } if (amount > 0f) { text2 = ((!effect.Equals("Extra Stamina")) ? effectColors["ItemInfoDisplayNegative"] : effectColors["ItemInfoDisplayPositive"]); key = "GAIN"; } else if (amount < 0f) { text2 = ((!effect.Equals("Extra Stamina")) ? effectColors["ItemInfoDisplayPositive"] : effectColors["ItemInfoDisplayNegative"]); key = "REMOVE"; } return text + GetText("ProcessEffect", text2, GetText(key), GetEffectColor(effect), (Mathf.Abs(amount) * 100f).ToString("F1").Replace(".0", ""), GetText("Effect_" + effect.ToUpper()).ToUpper()); } private static string ProcessEffectOverTime(float amountPerSecond, float rate, float time, string effect) { string text = ""; string text2 = string.Empty; string key = string.Empty; if (amountPerSecond == 0f || time == 0f) { return text; } if (amountPerSecond > 0f) { text2 = ((!effect.Equals("Extra Stamina")) ? effectColors["ItemInfoDisplayNegative"] : effectColors["ItemInfoDisplayPositive"]); key = "GAIN"; } else if (amountPerSecond < 0f) { text2 = ((!effect.Equals("Extra Stamina")) ? effectColors["ItemInfoDisplayPositive"] : effectColors["ItemInfoDisplayNegative"]); key = "REMOVE"; } return text + GetText("ProcessEffectOverTime", text2, GetText(key), GetEffectColor(effect), (Mathf.Abs(amountPerSecond) * time * (1f / rate) * 100f).ToString("F1").Replace(".0", ""), GetText("Effect_" + effect.ToUpper()).ToUpper(), time.ToString()); } private static string ProcessEffectPerSecond(float amountPerSecond, string effect) { string text = ""; string text2 = string.Empty; string key = string.Empty; if (amountPerSecond == 0f) { return text; } if (amountPerSecond > 0f) { text2 = ((!effect.Equals("Extra Stamina")) ? effectColors["ItemInfoDisplayNegative"] : effectColors["ItemInfoDisplayPositive"]); key = "GAIN"; } else if (amountPerSecond < 0f) { text2 = ((!effect.Equals("Extra Stamina")) ? effectColors["ItemInfoDisplayPositive"] : effectColors["ItemInfoDisplayNegative"]); key = "REMOVE"; } string text3 = (Mathf.Abs(amountPerSecond) * 100f).ToString("F1").Replace(".0", ""); return text + GetText("ProcessEffectPerSecond", text2, GetText(key), GetEffectColor(effect), text3, GetText("Effect_" + effect.ToUpper()).ToUpper()); } private static string ProcessEffectPerSecondOverTime(float amountPerSecond, float time, string effect) { string text = ""; string text2 = string.Empty; string key = string.Empty; if (amountPerSecond == 0f || time <= 0f) { return text; } if (amountPerSecond > 0f) { text2 = ((!effect.Equals("Extra Stamina")) ? effectColors["ItemInfoDisplayNegative"] : effectColors["ItemInfoDisplayPositive"]); key = "GAIN"; } else if (amountPerSecond < 0f) { text2 = ((!effect.Equals("Extra Stamina")) ? effectColors["ItemInfoDisplayPositive"] : effectColors["ItemInfoDisplayNegative"]); key = "REMOVE"; } string text3 = (Mathf.Abs(amountPerSecond) * 100f).ToString("F1").Replace(".0", ""); string text4 = time.ToString("F1").Replace(".0", ""); return text + GetText("ProcessEffectPerSecondOverTime", text2, GetText(key), GetEffectColor(effect), text3, GetText("Effect_" + effect.ToUpper()).ToUpper(), text4); } private static string ProcessEffectOnEntry(float amount, string effect) { string text = ""; string text2 = string.Empty; string key = string.Empty; if (amount == 0f) { return text; } if (amount > 0f) { text2 = ((!effect.Equals("Extra Stamina")) ? effectColors["ItemInfoDisplayNegative"] : effectColors["ItemInfoDisplayPositive"]); key = "GAIN"; } else if (amount < 0f) { text2 = ((!effect.Equals("Extra Stamina")) ? effectColors["ItemInfoDisplayPositive"] : effectColors["ItemInfoDisplayNegative"]); key = "REMOVE"; } return text + GetText("ProcessEffectOnEntry", text2, GetText(key), GetEffectColor(effect), (Mathf.Abs(amount) * 100f).ToString("F1").Replace(".0", ""), GetText("Effect_" + effect.ToUpper()).ToUpper()); } private static string ProcessEffectInline(float amount, string effect) { string text = ProcessEffect(amount, effect); if (string.IsNullOrEmpty(text)) { return text; } text = text.Replace("\r\n", " ").Replace("\n", " ").Replace("\r", " "); return text.Trim(); } private static float ApplyCookingMultiplier(float amount, float cookingMultiplier) { if (amount == 0f || cookingMultiplier == 1f || float.IsNaN(cookingMultiplier) || float.IsInfinity(cookingMultiplier)) { return amount; } return amount * cookingMultiplier; } private static float GetCookingEffectMultiplier(ItemCooking? itemCooking) { if ((Object)(object)itemCooking == (Object)null || itemCooking.timesCookedLocal <= 0) { return 1f; } EnsureCookingMultiplierGetter(); if (cookingMultiplierGetter == null) { return 1f; } try { float num = cookingMultiplierGetter(itemCooking); if (float.IsNaN(num) || float.IsInfinity(num) || num == 0f) { return 1f; } return num; } catch { return 1f; } } private static void EnsureCookingMultiplierGetter() { if (cookingMultiplierResolved) { return; } cookingMultiplierResolved = true; Type typeFromHandle = typeof(ItemCooking); BindingFlags bindingAttr = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic; string[] array = new string[7] { "GetCookedEffectMultiplier", "GetCookedMultiplier", "GetCookingEffectMultiplier", "GetCookingMultiplier", "GetCookMultiplier", "GetEffectMultiplier", "GetCookedStatusMultiplier" }; string[] array2 = array; foreach (string b in array2) { MethodInfo[] methods = typeFromHandle.GetMethods(bindingAttr); foreach (MethodInfo methodInfo in methods) { if (!string.Equals(methodInfo.Name, b, StringComparison.OrdinalIgnoreCase) || methodInfo.ReturnType != typeof(float)) { continue; } ParameterInfo[] parameters = methodInfo.GetParameters(); if (parameters.Length == 0) { MethodInfo captured2 = methodInfo; cookingMultiplierGetter = (ItemCooking itemCooking) => (float)captured2.Invoke(itemCooking, null); cookingMultiplierSource = typeFromHandle.Name + "." + captured2.Name + "()"; Log.LogInfo((object)("[ItemInfoDisplay] Cooking multiplier resolved via " + cookingMultiplierSource + ".")); return; } if (parameters.Length == 1 && parameters[0].ParameterType == typeof(int)) { MethodInfo captured = methodInfo; cookingMultiplierGetter = (ItemCooking itemCooking) => (float)captured.Invoke(itemCooking, new object[1] { itemCooking.timesCookedLocal }); cookingMultiplierSource = typeFromHandle.Name + "." + captured.Name + "(int)"; Log.LogInfo((object)("[ItemInfoDisplay] Cooking multiplier resolved via " + cookingMultiplierSource + ".")); return; } } } FieldInfo[] fields = typeFromHandle.GetFields(bindingAttr); foreach (FieldInfo fieldInfo in fields) { if (IsLikelyCookingMultiplierMember(fieldInfo.Name)) { Func<ItemCooking, float> func = TryCreateMultiplierGetter(fieldInfo, fieldInfo.FieldType, fieldInfo.IsStatic); if (func != null) { cookingMultiplierGetter = func; cookingMultiplierSource = typeFromHandle.Name + "." + fieldInfo.Name; Log.LogInfo((object)("[ItemInfoDisplay] Cooking multiplier resolved via " + cookingMultiplierSource + ".")); return; } } } PropertyInfo[] properties = typeFromHandle.GetProperties(bindingAttr); foreach (PropertyInfo propertyInfo in properties) { if (propertyInfo.CanRead && propertyInfo.GetIndexParameters().Length == 0 && IsLikelyCookingMultiplierMember(propertyInfo.Name)) { bool isStatic = propertyInfo.GetMethod != null && propertyInfo.GetMethod.IsStatic; Func<ItemCooking, float> func2 = TryCreateMultiplierGetter(propertyInfo, propertyInfo.PropertyType, isStatic); if (func2 != null) { cookingMultiplierGetter = func2; cookingMultiplierSource = typeFromHandle.Name + "." + propertyInfo.Name; Log.LogInfo((object)("[ItemInfoDisplay] Cooking multiplier resolved via " + cookingMultiplierSource + ".")); break; } } } } private static bool IsLikelyCookingMultiplierMember(string name) { if (string.IsNullOrWhiteSpace(name)) { return false; } string text = name.ToLowerInvariant(); if (!text.Contains("cook")) { return false; } if (!text.Contains("mult") && !text.Contains("scale")) { return text.Contains("effect"); } return true; } private static Func<ItemCooking, float>? TryCreateMultiplierGetter(MemberInfo member, Type memberType, bool isStatic) { MemberInfo member2 = member; if (memberType == typeof(float)) { return delegate(ItemCooking itemCooking) { object memberValue4 = GetMemberValue(member2, isStatic, itemCooking); return (memberValue4 is float) ? ((float)memberValue4) : 1f; }; } if (memberType == typeof(float[])) { return delegate(ItemCooking itemCooking) { object memberValue3 = GetMemberValue(member2, isStatic, itemCooking); return (memberValue3 is float[] values2) ? GetMultiplierFromList(values2, itemCooking.timesCookedLocal) : 1f; }; } if (memberType == typeof(List<float>)) { return delegate(ItemCooking itemCooking) { object memberValue2 = GetMemberValue(member2, isStatic, itemCooking); return (memberValue2 is List<float> values) ? GetMultiplierFromList(values, itemCooking.timesCookedLocal) : 1f; }; } if (memberType == typeof(AnimationCurve)) { return delegate(ItemCooking itemCooking) { object memberValue = GetMemberValue(member2, isStatic, itemCooking); AnimationCurve val = (AnimationCurve)((memberValue is AnimationCurve) ? memberValue : null); return (val != null) ? val.Evaluate((float)itemCooking.timesCookedLocal) : 1f; }; } return null; } private static object GetMemberValue(MemberInfo member, bool isStatic, ItemCooking itemCooking) { try { if (member is FieldInfo fieldInfo) { return fieldInfo.GetValue(isStatic ? null : itemCooking); } if (member is PropertyInfo propertyInfo) { return propertyInfo.GetValue(isStatic ? null : itemCooking, null); } } catch { return null; } return null; } private static float GetMultiplierFromList(IReadOnlyList<float> values, int timesCooked) { if (values == null || values.Count == 0) { return 1f; } int index = Mathf.Clamp(timesCooked, 0, values.Count - 1); return values[index]; } private static string GetNextCookHint(int nextTimesCooked) { if (nextTimesCooked >= 12) { return GetText("COOK_NEXT_NONE", effectColors["Curse"]); } return nextTimesCooked switch { 1 => GetText("COOK_NEXT_BUFF", effectColors["Extra Stamina"]), 2 => GetText("COOK_NEXT_SAME", effectColors["ItemInfoDisplayPositive"]), 3 => GetText("COOK_NEXT_NERF", effectColors["Injury"]), _ => GetText("COOK_NEXT_POISON", effectColors["Poison"]), }; } private static List<string> BuildNextCookDeltaLines(ItemCooking itemCooking, IReadOnlyList<AdditionalCookingBehavior> cookingBehaviors, bool hasCookUseExplosion, bool breaksWhenCooked, float cookingMultiplier, bool isConsumable, bool allowCookPreview, bool suppressThrowAchievement, bool suppressNoEffectHint, out bool hasDeltaHeader) { List<string> list = new List<string>(); hasDeltaHeader = false; if ((Object)(object)itemCooking == (Object)null || !itemCooking.canBeCooked || itemCooking.timesCookedLocal >= 12) { return list; } if (suppressNoEffectHint) { return list; } int nextCooked = itemCooking.timesCookedLocal + 1; bool flag = WillExplodeOnNextCook(itemCooking, cookingBehaviors, nextCooked); List<string> list2 = new List<string>(); if (allowCookPreview && !breaksWhenCooked && !itemCooking.ignoreDefaultCookBehavior && !flag) { list2.AddRange(BuildDefaultNextCookDeltaEffects(itemCooking, nextCooked, cookingMultiplier, isConsumable)); } List<string> list3 = new List<string>(); List<string> list4 = new List<string>(); List<string> list5 = new List<string>(); List<string> list6 = new List<string>(); foreach (AdditionalCookingBehavior cookingBehavior in cookingBehaviors) { if (cookingBehavior == null || !WillTriggerBehavior(cookingBehavior, itemCooking.timesCookedLocal, nextCooked)) { continue; } CookingBehavior_Explode val = (CookingBehavior_Explode)(object)((cookingBehavior is CookingBehavior_Explode) ? cookingBehavior : null); if (val != null) { if (CanExplodeWhenCooked(val, itemCooking)) { list4.Add(TrimLeadingSeparator(GetText("COOK_EXPLODE", effectColors["Injury"]))); } continue; } if (cookingBehavior is CookingBehavior_Wreck) { list4.Add(TrimLeadingSeparator(GetText("COOK_BROKEN", effectColors["Curse"]))); continue; } CookingBehavior_AdjustStatusInstantly val2 = (CookingBehavior_AdjustStatusInstantly)(object)((cookingBehavior is CookingBehavior_AdjustStatusInstantly) ? cookingBehavior : null); if (val2 != null) { float amount = ApplyCookingMultiplier(val2.amount, cookingMultiplier); AppendHint(list3, ProcessEffectInline(amount, ((object)(STATUSTYPE)(ref val2.statusType)).ToString())); continue; } CookingBehavior_ChangeAfflictionTime val3 = (CookingBehavior_ChangeAfflictionTime)(object)((cookingBehavior is CookingBehavior_ChangeAfflictionTime) ? cookingBehavior : null); if (val3 != null) { list4.Add(TrimLeadingSeparator(BuildAfflictionTimeChangeHint(val3))); continue; } CookingBehavior_RunActions val4 = (CookingBehavior_RunActions)(object)((cookingBehavior is CookingBehavior_RunActions) ? cookingBehavior : null); if (val4 != null) { if (val4.actionsToRun == null) { continue; } ItemAction[] actionsToRun = val4.actionsToRun; foreach (ItemAction val5 in actionsToRun) { if (!suppressThrowAchievement || !(val5 is Action_ThrowAchievement)) { string hint2 = BuildActionEffectInline(val5, cookingMultiplier); AppendHint(list3, hint2); } } continue; } CookingBehavior_EnableScripts val6 = (CookingBehavior_EnableScripts)(object)((cookingBehavior is CookingBehavior_EnableScripts) ? cookingBehavior : null); if (val6 != null) { AddScriptEffectHints(list5, val6.scriptsToEnable, cookingMultiplier, suppressThrowAchievement, allowCookPreview); } else if (cookingBehavior is CookingBehavior_MessUpAudio || cookingBehavior is CookingBehavior_ModifyAudioSourcePitch) { list4.Add(TrimLeadingSeparator(GetText("COOK_AUDIO", effectColors["ItemInfoDisplayPositive"]))); } else if (IsDisableScriptsBehavior(cookingBehavior)) { AddScriptEffectHints(list6, GetBehaviorScripts(cookingBehavior), cookingMultiplier, suppressThrowAchievement, allowCookPreview); } else if (IsModifyBugleWobbleBehavior(cookingBehavior)) { list4.Add(TrimLeadingSeparator(GetText("COOK_BUGLE_WOBBLE", effectColors["ItemInfoDisplayPositive"]))); } } if (list5.Count > 0 && list6.Count > 0) { List<string> list7 = list5.Intersect(list6).ToList(); foreach (string duplicatedHint in list7) { list5.RemoveAll((string hint) => hint == duplicatedHint); list6.RemoveAll((string hint) => hint == duplicatedHint); } } if (list5.Count > 0) { list4.Add(TrimLeadingSeparator(GetText("COOK_ENABLE")) + string.Join(" ", list5)); } if (list6.Count > 0) { list4.Add(TrimLeadingSeparator(GetText("COOK_DISABLE")) + string.Join(" ", list6)); } if (allowCookPreview && hasCookUseExplosion) { list4.Add(TrimLeadingSeparator(GetText("COOK_USE_EXPLODE", effectColors["Injury"]))); } if (breaksWhenCooked && list4.Count == 0) { list4.Add(TrimLeadingSeparator(GetText("COOK_BROKEN", effectColors["Curse"]))); } if (allowCookPreview && list2.Count > 0) { foreach (string item in list2) { if (!string.IsNullOrWhiteSpace(item)) { list.Add("• " + item); } } hasDeltaHeader = true; } if (list3.Count > 0) { string text = TrimLeadingSeparator(GetText("COOK_ON_COOK")); foreach (string item2 in list3) { if (!string.IsNullOrWhiteSpace(item2)) { list.Add(text + item2); } } } if (list4.Count > 0) { list.AddRange(list4.Where((string line) => !string.IsNullOrWhiteSpace(line))); } if (allowCookPreview && !suppressNoEffectHint && list2.Count == 0 && !flag && !breaksWhenCooked && !hasCookUseExplosion && list3.Count == 0 && list4.Count == 0) { string text2 = TrimLeadingSeparator(GetText("COOK_NEXT_NONE", effectColors["Curse"])); if (!string.IsNullOrWhiteSpace(text2) && !list.Contains(text2)) { list.Insert(0, text2); } } return list; } private static List<string> BuildDefaultNextCookDeltaEffects(ItemCooking itemCooking, int nextCooked, float cookingMultiplier, bool isConsumable) { //IL_0174: Unknown result type (might be due to invalid IL or missing references) List<string> list = new List<string>(); if ((Object)(object)itemCooking == (Object)null || !isConsumable) { return list; } Action_RestoreHunger component = ((Component)itemCooking).GetComponent<Action_RestoreHunger>(); bool flag = (Object)(object)component != (Object)null && IsComponentActiveForDisplay((Component)(object)component); Action_GiveExtraStamina component2 = ((Component)itemCooking).GetComponent<Action_GiveExtraStamina>(); bool flag2 = (Object)(object)component2 != (Object)null && IsComponentActiveForDisplay((Component)(object)component2); Action_InflictPoison component3 = ((Component)itemCooking).GetComponent<Action_InflictPoison>(); bool flag3 = (Object)(object)component3 != (Object)null && IsComponentActiveForDisplay((Component)(object)component3); if (!flag && !flag2 && !flag3) { return list; } if (flag) { float restorationAmount = component.restorationAmount; float num = restorationAmount; if (nextCooked < 2) { num = restorationAmount * 2f; } else if (nextCooked > 2) { num = Mathf.Max(restorationAmount - 0.05f, 0f); } float num2 = ApplyCookingMultiplier(num - restorationAmount, cookingMultiplier); if (Mathf.Abs(num2) > 0.0001f) { list.Add(ProcessEffectInline(num2 * -1f, "Hunger")); } } float num3 = 0f; bool flag4 = false; if (flag2) { num3 = component2.amount; flag4 = true; } if (flag4) { float num4 = num3; if (nextCooked < 2) { num4 = Mathf.Max(0.1f, num3 * 1.5f); } else if (nextCooked > 2) { num4 = 0f; } float num5 = ApplyCookingMultiplier(num4 - num3, cookingMultiplier); if (Mathf.Abs(num5) > 0.0001f) { list.Add(ProcessEffectInline(num5, "Extra Stamina")); } } if (nextCooked > 3) { float num6 = ApplyCookingMultiplier(0.1f, cookingMultiplier); if (Mathf.Abs(num6) > 0.0001f) { STATUSTYPE val = (STATUSTYPE)3; list.Add(ProcessEffectInline(num6, ((object)(STATUSTYPE)(ref val)).ToString())); } } return list; } private static bool WillExplodeOnNextCook(ItemCooking itemCooking, IReadOnlyList<AdditionalCookingBehavior> cookingBehaviors, int nextCooked) { if ((Object)(object)itemCooking == (Object)null) { return false; } foreach (AdditionalCookingBehavior cookingBehavior in cookingBehaviors) { CookingBehavior_Explode val = (CookingBehavior_Explode)(object)((cookingBehavior is CookingBehavior_Explode) ? cookingBehavior : null); if (val != null && WillTriggerBehavior(cookingBehavior, itemCooking.timesCookedLocal, nextCooked) && CanExplodeWhenCooked(val, itemCooking)) { return true; } } return false; } private static bool WillTriggerBehavior(AdditionalCookingBehavior behavior, int currentCooked, int nextCooked) { if (behavior == null) { return false; } if (nextCooked < behavior.cookedAmountToTrigger) { return false; } if (behavior.onlyOnce && currentCooked >= behavior.cookedAmountToTrigger) { return false; } return true; } private static bool CanExplodeWhenCooked(CookingBehavior_Explode explode, ItemCooking itemCooking) { if (explode == null || (Object)(object)itemCooking == (Object)null) { return false; } if (!explode.dontRunIfOutOfFuel) { return true; } try { FloatItemData data = ((ItemComponent)itemCooking).item.GetData<FloatItemData>((DataEntryKey)10); return data != null && data.Value > 0f; } catch { return true; } } private static bool IsDisableScriptsBehavior(AdditionalCookingBehavior behavior) { if (behavior != null) { return ((object)behavior).GetType().Name.IndexOf("DisableScripts", StringComparison.OrdinalIgnoreCase) >= 0; } return false; } private static bool IsModifyBugleWobbleBehavior(AdditionalCookingBehavior behavior) { if (behavior != null) { return ((object)behavior).GetType().Name.IndexOf("ModifyBugleWobble", StringComparison.OrdinalIgnoreCase) >= 0; } return false; } private static void AppendHint(List<string> target, string hint) { if (!string.IsNullOrWhiteSpace(hint) && !target.Contains(hint)) { target.Add(hint); } } private static string BuildRaycastDartSection(Action_RaycastDart? effect, float cookingMultiplier) { string text = GetText("RaycastDart"); if ((Object)(object)effect == (Object)null || effect.afflictionsOnHit == null || effect.afflictionsOnHit.Length == 0) { return text; } List<string> list = new List<string>(); Affliction[] afflictionsOnHit = effect.afflictionsOnHit; foreach (Affliction val in afflictionsOnHit) { if (val != null) { string text2 = ToInlineText(ProcessAffliction(val, cookingMultiplier)).TrimEnd(',', ','); if (!string.IsNullOrWhiteSpace(text2)) { list.Add(text2); } } } if (list.Count == 0) { return text; } StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append(text); stringBuilder.Append('\n'); for (int j = 0; j < list.Count; j++) { bool flag = j < list.Count - 1; stringBuilder.Append("• "); stringBuilder.Append(list[j]); if (flag) { stringBuilder.Append(','); } stringBuilder.Append('\n'); } return stringBuilder.ToString(); } private static bool IsComponentActiveForDisplay(Component component) { if ((Object)(object)component == (Object)null) { return false; } if (component is ItemCooking) { return true; } Behaviour val = (Behaviour)(object)((component is Behaviour) ? component : null); if (val != null) { return val.isActiveAndEnabled; } return true; } private static bool IsConsumableForCookingDelta(IEnumerable<Component> components) { if (components == null) { return false; } foreach (Component component in components) { if ((Object)(object)component == (Object)null) { continue; } ItemUseFeedback val = (ItemUseFeedback)(object)((component is ItemUseFeedback) ? component : null); if (val != null) { if (val.useAnimation.Equals("Eat") || val.useAnimation.Equals("Drink") || val.useAnimation.Equals("Heal")) { return true; } continue; } if (component is Action_Consume) { return true; } if (component is Action_ConsumeAndSpawn) { return true; } if (component is Action_RaycastDart) { return true; } if (component is Action_SpawnGuidebookPage) { return true; } if (component is Action_RestoreHunger) { return true; } if (component is Action_GiveExtraStamina) { return true; } } return false; } private static void AppendCookDeltaLines(ref string suffixCooked, IReadOnlyList<string> lines) { if (lines == null || lines.Count == 0) { return; } string text = string.Join("\n", lines.Where((string line) => !string.IsNullOrWhiteSpace(line))); if (string.IsNullOrWhiteSpace(text)) { return; } if (!string.IsNullOrEmpty(suffixCooked) && !suffixCooked.EndsWith("\n\n")) { if (suffixCooked.EndsWith("\n")) { suffixCooked += "\n"; } else { suffixCooked += "\n\n"; } } suffixCooked += text; } private static bool IsCookNextHintLine(string line) { if (string.IsNullOrWhiteSpace(line)) { return false; } if (line.IndexOf("NEXT COOK", StringComparison.OrdinalIgnoreCase) < 0 && !line.Contains("下次烹饪", StringComparison.Ordinal)) { return line.Contains("下次烹飪", StringComparison.Ordinal); } return true; } private static string TrimLeadingSeparator(string text) { if (string.IsNullOrEmpty(text)) { return string.Empty; } if (text.StartsWith(" | ", StringComparison.Ordinal)) { return text.Substring(3); } if (text.StartsWith("| ", StringComparison.Ordinal)) { return text.Substring(2); } if (text.StartsWith("|", StringComparison.Ordinal)) { return text.Substring(1); } return text; } private static string BuildAfflictionTimeChangeHint(CookingBehavior_ChangeAfflictionTime change) { //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) if (change == null) { return string.Empty; } string text = Mathf.Abs(change.change).ToString("F1").Replace(".0", ""); string text2 = ((change.change >= 0f) ? "+" : "-"); string name = "Affliction"; try { if ((Object)(object)change.action != (Object)null && change.action.affliction != null) { AfflictionType afflictionType = change.action.affliction.GetAfflictionType(); name = ((object)(AfflictionType)(ref afflictionType)).ToString(); } } catch { name = "Affliction"; } name = GetAfflictionDisplayName(name); return GetText("COOK_AFFLICTION_TIME", name, text2, text); } private static string GetAfflictionDisplayName(string name) { if (string.IsNullOrWhiteSpace(name)) { return string.Empty; } string text = name.Trim(); if (!(text == "Invincibility")) { if (text == "Numb") { return GetText("AFFLICTION_NAME_NUMB"); } return name; } return GetText("AFFLICTION_NAME_INVINCIBILITY"); } private static void AddScriptEffectHints(List<string> target, IEnumerable<MonoBehaviour> scripts, float cookingMultiplier, bool suppressThrowAchievement, bool allowCookPreview) { if (scripts == null) { return; } foreach (MonoBehaviour script in scripts) { if ((Object)(object)script == (Object)null || (suppressThrowAchievement && script is Action_ThrowAchievement)) { continue; } ItemAction val = (ItemAction)(object)((script is ItemAction) ? script : null); if (val != null) { if (!allowCookPreview || !(val is Action_Spawn)) { AppendHint(target, BuildActionEffectInline(val, cookingMultiplier)); } } else { AppendHint(target, GetFriendlyActionName(((object)script).GetType())); } } } private static List<MonoBehaviour> GetBehaviorScripts(object behavior) { List<MonoBehaviour> list = new List<MonoBehaviour>(); if (behavior == null) { return list; } BindingFlags bindingAttr = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; Type type = behavior.GetType(); FieldInfo[] fields = type.GetFields(bindingAttr); foreach (FieldInfo fieldInfo in fields) { if (NameContainsActionOrScript(fieldInfo.Name)) { AddScriptsFromValue(list, fieldInfo.GetValue(behavior)); } } PropertyInfo[] properties = type.GetProperties(bindingAttr); foreach (PropertyInfo propertyInfo in properties) { if (propertyInfo.CanRead && propertyInfo.GetIndexParameters().Length == 0 && NameContainsActionOrScript(propertyInfo.Name)) { object obj = null; try { obj = propertyInfo.GetValue(behavior, null); } catch { continue; } AddScriptsFromValue(list, obj); } } return list; } private static void AddScriptsFromValue(List<MonoBehaviour> scripts, object value) { MonoBehaviour val = (MonoBehaviour)((value is MonoBehaviour) ? value : null); if (val != null) { scripts.Add(val); } else if (value is MonoBehaviour[] source) { scripts.AddRange(source.Where((MonoBehaviour s) => (Object)(object)s != (Object)null)); } else if (value is IEnumerable<MonoBehaviour> source2) { scripts.AddRange(source2.Where((MonoBehaviour s) => (Object)(object)s != (Object)null)); } } private static string BuildActionEffectInline(ItemAction action, float cookingMultiplier) { //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Invalid comparison between Unknown and I4 //IL_02d0: Unknown result type (might be due to invalid IL or missing references) //IL_02d5: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)action == (Object)null) { return string.Empty; } Action_RestoreHunger val = (Action_RestoreHunger)(object)((action is Action_RestoreHunger) ? action : null); if (val != null) { float num = ApplyCookingMultiplier(val.restorationAmount, cookingMultiplier); return ProcessEffectInline(num * -1f, "Hunger"); } Action_GiveExtraStamina val2 = (Action_GiveExtraStamina)(object)((action is Action_GiveExtraStamina) ? action : null); if (val2 != null) { float amount = ApplyCookingMultiplier(val2.amount, cookingMultiplier); return ProcessEffectInline(amount, "Extra Stamina"); } Action_ModifyStatus val3 = (Action_ModifyStatus)(object)((action is Action_ModifyStatus) ? action : null); if (val3 != null) { float num2 = ApplyCookingMultiplier(val3.changeAmount, cookingMultiplier); if ((int)val3.statusType == 5 && num2 > 0f && num2 <= 0.5001f) { num2 = 0.25f; } string text = ProcessEffectInline(num2, ((object)(STATUSTYPE)(ref val3.statusType)).ToString()); if (val3.ifSkeleton) { text = text + " " + GetText("COOK_IF_SKELETON"); } return text; } Action_InflictPoison val4 = (Action_InflictPoison)(object)((action is Action_InflictPoison) ? action : null); if (val4 != null) { float amountPerSecond = ApplyCookingMultiplier(val4.poisonPerSecond, cookingMultiplier); string text2 = GetText("InflictPoison", val4.delay.ToString(), ProcessEffectOverTime(amountPerSecond, 1f, val4.inflictionTime, "Poison")); return ToInlineText(text2); } Action_AddOrRemoveThorns val5 = (Action_AddOrRemoveThorns)(object)((action is Action_AddOrRemoveThorns) ? action : null); if (val5 != null) { float amount2 = ApplyCookingMultiplier((float)val5.thornCount * 0.05f, cookingMultiplier); return ProcessEffectInline(amount2, "Thorns"); } Action_ThrowAchievement val6 = (Action_ThrowAchievement)(object)((action is Action_ThrowAchievement) ? action : null); if (val6 != null) { string text3 = ((object)(ACHIEVEMENTTYPE)(ref val6.achievementType)).ToString().Replace('_', ' '); if (string.IsNullOrWhiteSpace(text3)) { return string.Empty; } return GetText("COOK_ACTION_THROW_ACHIEVEMENT", effectColors["ItemInfoDisplayPositive"], effectColors["ItemInfoDisplayPositive"], text3); } Action_Numb val7 = (Action_Numb)(object)((action is Action_Numb) ? action : null); if (val7 != null) { string text4 = ApplyCookingMultiplier(val7.numbAmount, cookingMultiplier).ToString("F1").Replace(".0", ""); if (string.IsNullOrWhiteSpace(text4)) { return string.Empty; } return GetText("COOK_ACTION_NUMB", effectColors["ItemInfoDisplayNegative"], text4); } Action_ClearAllStatus val8 = (Action_ClearAllStatus)(object)((action is Action_ClearAllStatus) ? action : null); if (val8 != null) { string text5 = GetText("ClearAllStatus_Base", effectColors["ItemInfoDisplayPositive"]); if (val8.excludeCurse) { text5 += GetText("ClearAllStatus_ExceptCurse", effectColors["Curse"]); } if (val8.otherExclusions.Count > 0) { foreach (STATUSTYPE otherExclusion in val8.otherExclusions) { STATUSTYPE current = otherExclusion; text5 = text5 + ", " + effectColors[((object)(STATUSTYPE)(ref current)).ToString()] + GetText("Effect_" + ((object)(STATUSTYPE)(ref current)).ToString().ToUpper()).ToUpper() + "</color>"; } } text5 = text5.Replace(", <#E13542>" + GetText("Effect_CRAB").ToUpper() + "</color>", ""); return ToInlineText(text5); } if (action is Action_BecomeSkeleton) { return GetText("COOK_ACTION_BECOME_SKELETON", effectColors["Curse"]); } Action_ApplyAffliction val9 = (Action_ApplyAffliction)(object)((action is Action_ApplyAffliction) ? action : null); if (val9 != null) { List<string> list = new List<string>(); if (val9.affliction != null) { list.Add(ToInlineText(ProcessAffliction(val9.affliction, cookingMultiplier))); } if (val9.extraAfflictions != null) { Affliction[] extraAfflictions = val9.extraAfflictions; foreach (Affliction val10 in extraAfflictions) { if (val10 != null) { list.Add(ToInlineText(ProcessAffliction(val10, cookingMultiplier))); } } } return string.Join(" ", list.Where((string p) => !string.IsNullOrWhiteSpace(p))); } Action_ApplyMassAffliction val11 = (Action_ApplyMassAffliction)(object)((action is Action_ApplyMassAffliction) ? action : null); if (val11 != null) { string text6 = GetText("ApplyMassAffliction"); text6 += ProcessAffliction(((Action_ApplyAffliction)val11).affliction, cookingMultiplier); if (((Action_ApplyAffliction)val11).extraAfflictions != null && ((Action_ApplyAffliction)val11).extraAfflictions.Length != 0) { for (int j = 0; j < ((Action_ApplyAffliction)val11).extraAfflictions.Length; j++) { text6 += ProcessAffliction(((Action_ApplyAffliction)val11).extraAfflictions[j], cookingMultiplier); } } return ToInlineText(text6); } Action_ConsumeAndSpawn val12 = (Action_ConsumeAndSpawn)(object)((action is Action_ConsumeAndSpawn) ? action : null); if (val12 != null && (Object)(object)val12.itemToSpawn != (Object)null && ((object)val12.itemToSpawn).ToString().Contains("Peel")) { return ToInlineText(GetText("ConsumeAndSpawn_Peel")); } if (action is Action_Die) { return GetText("COOK_ACTION_DIE", effectColors["Injury"]); } Action_RaycastDart val13 = (Action_RaycastDart)(object)((action is Action_RaycastDart) ? action : null); if (val13 != null) { List<string> list2 = new List<string>(); if (val13.afflictionsOnHit != null) { Affliction[] afflictionsOnHit = val13.afflictionsOnHit; foreach (Affliction val14 in afflictionsOnHit) { if (val14 != null) { string text7 = ToInlineText(ProcessAffliction(val14, cookingMultiplier)); if (!string.IsNullOrWhiteSpace(text7)) { list2.Add(text7); } } } } if (list2.Count > 0) { return string.Join(" ", list2); } return ToInlineText(GetText("RaycastDart")); } return GetFriendlyActionName(((object)action).GetType()); } private static string GetFriendlyActionName(Type type) { if (type == null) { return string.Empty; } string localizedActionName = GetLocalizedActionName(type); if (!string.IsNullOrWhiteSpace(localizedActionName)) { return localizedActionName; } string text = type.Name; if (text.StartsWith("Action_", StringComparison.Ordinal)) { text = text.Substring("Action_".Length); } return text.Replace('_', ' '); } private static string GetLocalizedActionName(Type type) { if (type == null) { return string.Empty; } string text = ("Mod_" + Name + "_" + type.Name).ToUpper(); if (!LocalizedText.MAIN_TABLE.ContainsKey(text)) { return string.Empty; } string text2 = LocalizedText.GetText(text, true); if (string.IsNullOrWhiteSpace(text2)) { return string.Empty; } text2 = text2.Trim(); if (text2.StartsWith("LOC:", StringComparison.OrdinalIgnoreCase)) { return string.Empty; } if (string.Equals(text2, text, StringComparison.OrdinalIgnoreCase)) { return string.Empty; } return text2; } private static string ToInlineText(string text) { if (string.IsNullOrWhiteSpace(text)) { return string.Empty; } string text2 = text.Replace("\r\n", " ").Replace("\n", " ").Replace("\r", " "); return text2.Trim(); } private static bool HasExplodeOnUseBehavior(object behavior) { if (behavior == null) { return false; } string name = behavior.GetType().Name; if (ContainsExplodeKeyword(name) && !string.Equals(name, "CookingBehavior_Explode", StringComparison.OrdinalIgnoreCase)) { return true; } if (name.IndexOf("RunActions", StringComparison.OrdinalIgnoreCase) >= 0 || name.IndexOf("EnableScripts", StringComparison.OrdinalIgnoreCase) >= 0 || name.IndexOf("DisableScripts", StringComparison.OrdinalIgnoreCase) >= 0) { return BehaviorContainsExplodeTarget(behavior); } return false; } private static bool BehaviorContainsExplodeTarget(object behavior) { if (behavior == null) { return false; } BindingFlags bindingAttr = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; Type type = behavior.GetType(); FieldInfo[] fields = type.GetFields(bindingAttr); foreach (FieldInfo fieldInfo in fields) { if (NameContainsActionOrScript(fieldInfo.Name) && ValueContainsExplodeKeyword(fieldInfo.GetValue(behavior))) { return true; } } PropertyInfo[] properties = type.GetProperties(bindingAttr); foreach (PropertyInfo propertyInfo in properties) { if (propertyInfo.CanRead && propertyInfo.GetIndexParameters().Length == 0 && NameContainsActionOrScript(propertyInfo.Name)) { object obj = null; try { obj = propertyInfo.GetValue(behavior, null); } catch { continue; } if (ValueContainsExplodeKeyword(obj)) { return true; } } } return false; } private static bool NameContainsActionOrScript(string name) { if (string.IsNullOrWhiteSpace(name)) { return false; } string text = name.ToLowerInvariant(); if (!text.Contains("action")) { return text.Contains("script"); } return true; } private static bool ValueContainsExplodeKeyword(object value) { if (value == null) { return false; } if (value is string text) { return ContainsExplodeKeyword(text); } Object val = (Object)((value is Object) ? value : null); if (val != null) { return ContainsExplodeKeyword(((object)val).GetType().Name); } if (value is IEnumerable enumerable) { foreach (object item in enumerable) { if (ValueContainsExplodeKeyword(item)) { return true; } } return false; } return ContainsExplodeKeyword(value.GetType().Name); } private static bool ContainsExplodeKeyword(string text) { if (string.IsNullOrWhiteSpace(text)) { return false; } if (text.IndexOf("Explode", StringComparison.OrdinalIgnoreCase) < 0) { return text.IndexOf("Explosion", StringComparison.OrdinalIgnoreCase) >= 0; } return true; } private static bool ScriptsContainSpawnExplosion(IEnumerable<MonoBehaviour> scripts) { if (scripts == null) { return false; } foreach (MonoBehaviour script in scripts) { Action_Spawn val = (Action_Spawn)(object)((script is Action_Spawn) ? script : null); if (val == null || (Object)(object)val.objectToSpawn == (Object)null) { continue; } if (ContainsExplodeKeyword(((Object)val.objectToSpawn).name)) { return true; } try { Component[] components = val.objectToSpawn.GetComponents<Component>(); foreach (Component val2 in components) { if ((Object)(object)val2 != (Object)null && ContainsExplodeKeyword(((object)val2).GetType().Name)) { return true; } } } catch { } } return false; } private static string GetEffectColor(string effect) { if (effectColors.TryGetValue(effect, out string value)) { return value; } if (!missingEffectColors.Contains(effect)) { missingEffectColors.Add(effect); Log.LogWarning((object)("[ItemInfoDisplay] Missing effect color mapping for '" + effect + "'. Using fallback.")); } return "<#CCCCCC>"; } private static float GetLanternRemainingSeconds(Item item, Lantern lantern) { try { if (item?.data?.data != null && item.data.data.ContainsKey((DataEntryKey)10)) { object obj = item.data.data[(DataEntryKey)10]; FloatItemData val = (FloatItemData)((obj is FloatItemData) ? obj : null); if (val != null) { return val.Value; } } } catch { } if (!((Object)(object)lantern != (Object)null)) { return 0f; } return lantern.startingFuel; } private static void UpdateLanternRefreshFlag(Item item) { Lantern val = (((Object)(object)item != (Object)null) ? ((Component)item).GetComponent<Lantern>() : null); if ((Object)(object)val == (Object)null) { lastLanternItemId = 0; lastLanternRemainingSeconds = -1; return; } int lanternRemainingSecondsInt = GetLanternRemainingSecondsInt(item, val); int instanceID = ((Object)item).GetInstanceID(); if (instanceID != lastLanternItemId) { lastLanternItemId = instanceID; lastLanternRemainingSeconds = lanternRemainingSecondsInt; hasChanged = true; } else if (lanternRemainingSecondsInt != lastLanternRemainingSeconds) { lastLanternRemainingSeconds = lanternRemainingSecondsInt; hasChanged = true; } } private static int GetLanternRemainingSecondsInt(Item item, Lantern lantern) { float lanternRemainingSeconds = GetLanternRemainingSeconds(item, lantern); int num = Mathf.CeilToInt(lanternRemainingSeconds); return Mathf.Max(0, num); } private static float GetAfflictionTotalTime(Affliction affliction) { if (affliction == null) { return 0f; } BindingFlags bindingAttr = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; Type type = ((object)affliction).GetType(); try { FieldInfo field = type.GetField("totalTime", bindingAttr); if (field != null && field.FieldType == typeof(float)) { return (float)field.GetValue(affliction); } PropertyInfo property = type.GetProperty("totalTime", bindingAttr); if (property != null && property.PropertyType == typeof(float)) { return (float)property.GetValue(affliction, null); } } catch { return 0f; } return 0f; } private static string ProcessAffliction(Affliction affliction, float cookingMultiplier) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Invalid comparison between Unknown and I4 //IL_0168: Unknown result type (might be due to invalid IL or missing references) //IL_016e: Invalid comparison between Unknown and I4 //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Expected O, but got Unknown //IL_01e5: Unknown result type (might be due to invalid IL or missing references) //IL_01ec: Invalid comparison between Unknown and I4 //IL_0171: Unknown result type (might be due to invalid IL or missing references) //IL_0178: Expected O, but got Unknown //IL_026e: Unknown result type (might be due to invalid IL or missing references) //IL_0274: Invalid comparison between Unknown and I4 //IL_01ef: Unknown result type (might be due to invalid IL or missing references) //IL_01f6: Expected O, but got Unknown //IL_03b4: Unknown result type (might be due to invalid IL or missing references) //IL_03ba: Invalid comparison between Unknown and I4 //IL_027a: Unknown result type (might be due to invalid IL or missing references) //IL_0281: Expected O, but got Unknown //IL_04fb: 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_03c0: Unknown result type (might be due to invalid IL or missing references) //IL_03c7: Expected O, but got Unknown //IL_0583: Unknown result type (might be due to invalid IL or missing references) //IL_058a: Invalid comparison between Unknown and I4 //IL_06a7: Unknown result type (might be due to invalid IL or missing references) //IL_06ad: Invalid comparison between Unknown and I4 //IL_0590: Unknown result type (might be due to invalid IL or missing references) //IL_0597: Expected O, but got Unknown //IL_07b9: Unknown result type (might be due to invalid IL or mi