using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text.Json; using AskaShared.Game; using BepInEx; using BepInEx.Configuration; using BepInEx.Core.Logging.Interpolation; using BepInEx.Logging; using BepInEx.Unity.IL2CPP; using Cinemachine; using Fusion; using HarmonyLib; using Il2CppInterop.Runtime; using Il2CppInterop.Runtime.Injection; using Il2CppInterop.Runtime.InteropTypes; using Il2CppInterop.Runtime.InteropTypes.Arrays; using Il2CppSystem; using Il2CppSystem.Collections.Generic; using Microsoft.CodeAnalysis; using SSSGame; using SSSGame.Controllers; using SSSGame.Network; using SSSGame.Render; using SSSGame.UI; using SandSailorStudio.Inventory; using SandSailorStudio.Localization; using SandSailorStudio.Storage; using SandSailorStudio.UI; using TMPro; using UnityEngine; using UnityEngine.Events; using UnityEngine.SceneManagement; using UnityEngine.UI; using UnityEngine.VFX; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: AssemblyCompany("Bifrost")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("0.2.0")] [assembly: AssemblyInformationalVersion("0.2.0+d91bb6825f5a0f8e79d1c5fedeec0b352ae58d6b")] [assembly: AssemblyProduct("Bifrost")] [assembly: AssemblyTitle("Bifrost")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.2.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace AskaTeleportation { internal static class ArchConfirmDialog { private const string Title = "Open Portal"; private const string ConfirmCaptionKey = "common.confirm"; private const string CancelCaptionKey = "common.cancel"; private const string Prefix = "[Portals][attune]"; private const float VanishGraceSeconds = 5f; private static Action _confirmHandler; private static Action _cancelHandler; private static Structure _arch; private static Menu _menu; private static bool _tracking; private static float _lastAliveAt; internal static bool IsOpen { get { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown try { return (Object)(object)_menu != (Object)null && _menu.IsActive; } catch (Exception ex) { ManualLogSource log = Plugin.Log; bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(35, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" reading the dialog's state threw: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex.Message); } log.LogWarning(val); return false; } } } internal static bool TryOpen(Structure arch) { //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Expected O, but got Unknown //IL_0220: Unknown result type (might be due to invalid IL or missing references) //IL_0227: Expected O, but got Unknown //IL_02d1: Unknown result type (might be due to invalid IL or missing references) //IL_02d8: Expected O, but got Unknown //IL_032b: Unknown result type (might be due to invalid IL or missing references) //IL_0332: Expected O, but got Unknown //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Expected O, but got Unknown //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Expected O, but got Unknown //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Expected O, but got Unknown //IL_018c: Unknown result type (might be due to invalid IL or missing references) //IL_0193: Expected O, but got Unknown //IL_01ce: Unknown result type (might be due to invalid IL or missing references) //IL_01d3: Unknown result type (might be due to invalid IL or missing references) //IL_01de: Unknown result type (might be due to invalid IL or missing references) //IL_01e5: Unknown result type (might be due to invalid IL or missing references) //IL_01f0: Unknown result type (might be due to invalid IL or missing references) //IL_01fb: Unknown result type (might be due to invalid IL or missing references) //IL_0202: Unknown result type (might be due to invalid IL or missing references) //IL_0209: Unknown result type (might be due to invalid IL or missing references) //IL_0212: Expected O, but got Unknown //IL_03d1: Unknown result type (might be due to invalid IL or missing references) //IL_03d8: Expected O, but got Unknown //IL_037f: Unknown result type (might be due to invalid IL or missing references) //IL_0386: Expected O, but got Unknown //IL_0441: Unknown result type (might be due to invalid IL or missing references) //IL_0448: Expected O, but got Unknown if ((Object)(object)arch == (Object)null) { return false; } bool flag = default(bool); BepInExInfoLogInterpolatedStringHandler val; if (_tracking) { if (!HasVanished()) { ManualLogSource log = Plugin.Log; val = new BepInExInfoLogInterpolatedStringHandler(44, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" a confirm dialog is already open - ignoring"); } log.LogInfo(val); return false; } ManualLogSource log2 = Plugin.Log; val = new BepInExInfoLogInterpolatedStringHandler(68, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" the previous confirm dialog vanished without a callback - reopening"); } log2.LogInfo(val); Forget(); } ItemCost portalCost = Plugin.PortalCost; if (portalCost == null || (!portalCost.IsFree && !portalCost.IsResolved)) { Toast("The portal cost is not configured.", (NotificationType)1); ManualLogSource log3 = Plugin.Log; BepInExWarningLogInterpolatedStringHandler val2 = new BepInExWarningLogInterpolatedStringHandler(25, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" refused: cost unresolved"); } log3.LogWarning(val2); return false; } MenuManager instance; try { instance = MenuManager.Instance; } catch (Exception ex) { ManualLogSource log4 = Plugin.Log; BepInExErrorLogInterpolatedStringHandler val3 = new BepInExErrorLogInterpolatedStringHandler(37, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral(" reading MenuManager.Instance threw: "); ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted(ex); } log4.LogError(val3); return false; } bool flag2 = default(bool); if ((Object)(object)instance == (Object)null) { ManualLogSource log5 = Plugin.Log; BepInExWarningLogInterpolatedStringHandler val2 = new BepInExWarningLogInterpolatedStringHandler(63, 1, ref flag2); if (flag2) { ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" there is no MenuManager - the confirm dialog cannot be opened."); } log5.LogWarning(val2); return false; } ConfirmActionMenu val4 = ResolvePrefab(instance, arch); if ((Object)(object)val4 == (Object)null) { ManualLogSource log6 = Plugin.Log; BepInExWarningLogInterpolatedStringHandler val2 = new BepInExWarningLogInterpolatedStringHandler(85, 1, ref flag2); if (flag2) { ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" no ConfirmActionMenu prefab could be resolved - the confirm dialog cannot be opened."); } log6.LogWarning(val2); return false; } string text = "Open this portal for " + portalCost.Describe() + "?"; ConfirmActionMenuParameters val5; try { val5 = new ConfirmActionMenuParameters { Title = "Open Portal", Message = text, ConfirmMessage = "common.confirm", CancelMessage = "common.cancel", CloseOnConfirm = true, HideCancelButton = false, DontCloseOnEscape = false }; } catch (Exception ex2) { ManualLogSource log7 = Plugin.Log; BepInExErrorLogInterpolatedStringHandler val3 = new BepInExErrorLogInterpolatedStringHandler(40, 2, ref flag2); if (flag2) { ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral(" building the confirm parameters threw: "); ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted(ex2); } log7.LogError(val3); return false; } _arch = arch; _confirmHandler = HandleConfirm; _cancelHandler = HandleCancel; try { val5.OnConfirm = DelegateSupport.ConvertDelegate>((Delegate)_confirmHandler); val5.OnCancel = DelegateSupport.ConvertDelegate>((Delegate)_cancelHandler); } catch (Exception ex3) { ManualLogSource log8 = Plugin.Log; BepInExErrorLogInterpolatedStringHandler val3 = new BepInExErrorLogInterpolatedStringHandler(48, 2, ref flag2); if (flag2) { ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral(" converting the confirm/cancel callbacks threw: "); ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted(ex3); } log8.LogError(val3); Forget(); return false; } Menu val6; try { val6 = instance.OpenMenuPrefab((Menu)(object)val4, (MenuParameters)(object)val5); } catch (Exception ex4) { ManualLogSource log9 = Plugin.Log; BepInExErrorLogInterpolatedStringHandler val3 = new BepInExErrorLogInterpolatedStringHandler(35, 2, ref flag2); if (flag2) { ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral(" opening the confirm dialog threw: "); ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted(ex4); } log9.LogError(val3); Forget(); return false; } if ((Object)(object)val6 == (Object)null) { ManualLogSource log10 = Plugin.Log; BepInExWarningLogInterpolatedStringHandler val2 = new BepInExWarningLogInterpolatedStringHandler(67, 1, ref flag2); if (flag2) { ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" OpenMenuPrefab returned nothing - the confirm dialog did not open."); } log10.LogWarning(val2); Forget(); return false; } _menu = val6; _tracking = true; _lastAliveAt = SafeNow(); ManualLogSource log11 = Plugin.Log; val = new BepInExInfoLogInterpolatedStringHandler(35, 3, ref flag2); if (flag2) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" dialog opened for the arch at "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ArchInteraction.PositionText(arch)); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(": '"); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(text); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("'"); } log11.LogInfo(val); if (!RawTextRenders("Open Portal")) { ManualLogSource log12 = Plugin.Log; BepInExWarningLogInterpolatedStringHandler val2 = new BepInExWarningLogInterpolatedStringHandler(152, 1, ref flag2); if (flag2) { ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" the localizer does not pass unknown keys through, so the dialog's title and message may not read as written - repeating the question as a notification."); } log12.LogWarning(val2); Toast(text); } return true; } private static void HandleConfirm(ConfirmActionMenu menu) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown Structure arch = _arch; Forget(); try { Attune(arch); } catch (Exception ex) { ManualLogSource log = Plugin.Log; bool flag = default(bool); BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(34, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" handling the confirmation threw: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex); } log.LogError(val); } } private static void HandleCancel(ConfirmActionMenu menu) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Expected O, but got Unknown Forget(); ManualLogSource log = Plugin.Log; bool flag = default(bool); BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(10, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" cancelled"); } log.LogInfo(val); } private static void Attune(Structure arch) { //IL_0165: Unknown result type (might be due to invalid IL or missing references) //IL_016c: Expected O, but got Unknown //IL_025e: Unknown result type (might be due to invalid IL or missing references) //IL_0265: Expected O, but got Unknown //IL_035c: Unknown result type (might be due to invalid IL or missing references) //IL_0363: Expected O, but got Unknown //IL_03d8: Unknown result type (might be due to invalid IL or missing references) //IL_03df: Expected O, but got Unknown //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Expected O, but got Unknown //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Expected O, but got Unknown //IL_0111: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Expected O, but got Unknown //IL_01d4: Unknown result type (might be due to invalid IL or missing references) //IL_01db: Expected O, but got Unknown //IL_02b2: Unknown result type (might be due to invalid IL or missing references) //IL_02b9: Expected O, but got Unknown if ((Object)(object)arch == (Object)null) { return; } PortalRegistry current = PortalRegistry.Current; if (current == null) { Toast("Portals are not ready yet.", (NotificationType)1); return; } bool flag = default(bool); if (!ArchTargeting.TrySnapshot(arch, out var snapshot)) { Toast("That portal cannot be opened any more.", (NotificationType)1); ManualLogSource log = Plugin.Log; BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(75, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" confirm refused: the arch is gone, dismantled or not built - nothing taken"); } log.LogWarning(val); return; } if (current.TryFindByArch(arch, out var record)) { Toast(record.Name + " is already open."); return; } ItemCost portalCost = Plugin.PortalCost; if (portalCost == null || (!portalCost.IsFree && !portalCost.IsResolved)) { Toast("The portal cost is not configured.", (NotificationType)1); ManualLogSource log2 = Plugin.Log; BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(33, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" confirm refused: cost unresolved"); } log2.LogWarning(val); return; } int num = 0; BepInExInfoLogInterpolatedStringHandler val3; if (!portalCost.IsFree) { ItemCollection val2 = PlayerInventory(); if (val2 == null) { Toast("Portals are not ready yet.", (NotificationType)1); ManualLogSource log3 = Plugin.Log; BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(37, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" confirm refused: no player inventory"); } log3.LogWarning(val); return; } int itemQuantity; try { itemQuantity = val2.GetItemQuantity(portalCost.Info); } catch (Exception ex) { Toast("Portals are not ready yet.", (NotificationType)1); ManualLogSource log4 = Plugin.Log; BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(41, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" confirm refused: inventory read failed: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex.Message); } log4.LogWarning(val); return; } if (itemQuantity < portalCost.Count) { Toast("Opening needs " + portalCost.Describe() + ".", (NotificationType)1); ManualLogSource log5 = Plugin.Log; val3 = new BepInExInfoLogInterpolatedStringHandler(31, 4, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral(" confirm refused: have "); ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted(itemQuantity); ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral(", need "); ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted(portalCost.Count); ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral(" "); ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted(portalCost.ItemName); } log5.LogInfo(val3); return; } try { num = val2.RemoveItems(portalCost.Info, portalCost.Count); } catch (Exception ex2) { ManualLogSource log6 = Plugin.Log; BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(39, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" confirm aborted: cost removal failed: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex2.Message); } log6.LogWarning(val); return; } if (num < portalCost.Count) { ManualLogSource log7 = Plugin.Log; BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(31, 4, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" confirm aborted: removed "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(num); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" of "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(portalCost.Count); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(portalCost.ItemName); } log7.LogWarning(val); Refund(val2, portalCost, num); Toast("Opening needs " + portalCost.Describe() + ".", (NotificationType)1); return; } } PortalRecord portalRecord = current.Attune(snapshot); try { PortalVisuals.Apply(portalRecord, arch); } catch (Exception ex3) { ManualLogSource log8 = Plugin.Log; BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(36, 3, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" the rune could not be applied to "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(portalRecord.Name); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(": "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex3.Message); } log8.LogWarning(val); } PortalNaming.ApplyPortalName(arch, portalRecord); Toast(portalRecord.Name + " opened."); ManualLogSource log9 = Plugin.Log; val3 = new BepInExInfoLogInterpolatedStringHandler(32, 4, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral(" confirmed: consumed "); ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted(num); ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral(" "); ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted(portalCost.IsFree ? "(free)" : portalCost.ItemName); ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral(", attuned "); ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted(portalRecord.Name); } log9.LogInfo(val3); if (current.Portals.Count >= 2) { PortalTool.RequestDestinationDialog(portalRecord); } } private static void Refund(ItemCollection inventory, ItemCost cost, int consumed) { //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Expected O, but got Unknown //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Expected O, but got Unknown //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Expected O, but got Unknown if (inventory == null || cost == null || consumed <= 0) { return; } bool flag = default(bool); try { int num = inventory.AddItems(cost.Info, consumed); if (num < consumed) { ManualLogSource log = Plugin.Log; BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(42, 5, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" refund incomplete: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(num); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" of "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(consumed); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(cost.ItemName); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" returned - "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(consumed - num); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" lost"); } log.LogError(val); } else { ManualLogSource log2 = Plugin.Log; BepInExInfoLogInterpolatedStringHandler val2 = new BepInExInfoLogInterpolatedStringHandler(11, 3, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" refunded "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(consumed); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(cost.ItemName); } log2.LogInfo(val2); } } catch (Exception ex) { ManualLogSource log3 = Plugin.Log; BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(24, 4, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" refund failed: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(consumed); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(cost.ItemName); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" lost: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex); } log3.LogError(val); } } private static ItemCollection PlayerInventory() { //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Expected O, but got Unknown try { Character localCharacter = PortalTool.LocalCharacter; if ((Object)(object)localCharacter == (Object)null) { return null; } InventoryComponent inventory = localCharacter.Inventory; return ((Object)(object)inventory != (Object)null) ? inventory.GetItemCollection() : null; } catch (Exception ex) { ManualLogSource log = Plugin.Log; bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(33, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" player inventory lookup failed: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex.Message); } log.LogWarning(val); return null; } } private static bool HasVanished() { //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Expected O, but got Unknown if (!_tracking) { return true; } float num = SafeNow(); bool flag; try { flag = (Object)(object)_menu != (Object)null && _menu.IsActive; } catch (Exception ex) { ManualLogSource log = Plugin.Log; bool flag2 = default(bool); BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(35, 2, ref flag2); if (flag2) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" reading the dialog's state threw: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex); } log.LogError(val); flag = false; } if (flag) { _lastAliveAt = num; return false; } return num - _lastAliveAt > 5f; } private static void Forget() { _tracking = false; _menu = null; _arch = null; } internal static void Reset() { Forget(); _lastAliveAt = 0f; } private static ConfirmActionMenu ResolvePrefab(MenuManager manager, Structure prefabSource) { //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Expected O, but got Unknown //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Expected O, but got Unknown //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Expected O, but got Unknown bool flag = default(bool); try { ConfirmActionMenu prefab = manager.GetPrefab(); if ((Object)(object)prefab != (Object)null) { return prefab; } ManualLogSource log = Plugin.Log; BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(106, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" MenuManager has no registered ConfirmActionMenu prefab - falling back to the arch's own dismantle dialog."); } log.LogInfo(val); } catch (Exception ex) { ManualLogSource log2 = Plugin.Log; BepInExWarningLogInterpolatedStringHandler val2 = new BepInExWarningLogInterpolatedStringHandler(104, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" MenuManager.GetPrefab() failed ("); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(ex.Message); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(") - falling back to the arch's own dismantle dialog."); } log2.LogWarning(val2); } try { if ((Object)(object)prefabSource != (Object)null) { ConfirmActionMenu confirmDismantleMenu = prefabSource._confirmDismantleMenu; if ((Object)(object)confirmDismantleMenu != (Object)null) { return confirmDismantleMenu; } } } catch (Exception ex2) { ManualLogSource log3 = Plugin.Log; BepInExErrorLogInterpolatedStringHandler val3 = new BepInExErrorLogInterpolatedStringHandler(51, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral(" reading the arch's dismantle dialog prefab threw: "); ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted(ex2); } log3.LogError(val3); } return null; } private static bool RawTextRenders(string sample) { //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Expected O, but got Unknown //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Expected O, but got Unknown //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown if (string.IsNullOrEmpty(sample)) { return true; } bool flag3 = default(bool); try { LocalizationManager instance = LocalizationManager.Instance; BepInExInfoLogInterpolatedStringHandler val; if ((Object)(object)instance == (Object)null) { ManualLogSource log = Plugin.Log; bool flag = default(bool); val = new BepInExInfoLogInterpolatedStringHandler(108, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" there is no LocalizationManager to check raw-text rendering against - assuming the text renders as written."); } log.LogInfo(val); return true; } string text = instance.Loc(sample, false); bool flag2 = string.Equals(text, sample, StringComparison.Ordinal); ManualLogSource log2 = Plugin.Log; val = new BepInExInfoLogInterpolatedStringHandler(54, 4, ref flag3); if (flag3) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" raw-text check: Loc(\""); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(sample); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\") -> \""); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(text); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\" (renders as written: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(flag2 ? "yes" : "NO"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(")."); } log2.LogInfo(val); return flag2; } catch (Exception ex) { ManualLogSource log3 = Plugin.Log; BepInExErrorLogInterpolatedStringHandler val2 = new BepInExErrorLogInterpolatedStringHandler(27, 2, ref flag3); if (flag3) { ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" the raw-text check threw: "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(ex); } log3.LogError(val2); return true; } } private static float SafeNow() { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Expected O, but got Unknown try { return Time.unscaledTime; } catch (Exception ex) { ManualLogSource log = Plugin.Log; bool flag = default(bool); BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(26, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" reading the clock threw: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex); } log.LogError(val); return 0f; } } private static void Toast(string message) { Toast(message, (NotificationType)0); } private static void Toast(string message, NotificationType type) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Expected O, but got Unknown //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Expected O, but got Unknown //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) bool flag = default(bool); if ((int)type == 1) { try { string text = message; int hashCode = message.GetHashCode(); float num = 1f; Color val = default(Color); ((Color)(ref val))..ctor(0.85f, 0.2f, 0.18f, 1f); NotificationMenu.DisplayStacking((NotificationType)1, (StackingType)0, ref text, ref hashCode, ref num, (Sprite)null, val, val); return; } catch (Exception ex) { ManualLogSource log = Plugin.Log; BepInExWarningLogInterpolatedStringHandler val2 = new BepInExWarningLogInterpolatedStringHandler(41, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" red notification failed, using default: "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(ex.Message); } log.LogWarning(val2); } } try { string text2 = message; NotificationMenu.Display(type, ref text2, false); } catch (Exception ex2) { ManualLogSource log2 = Plugin.Log; BepInExWarningLogInterpolatedStringHandler val2 = new BepInExWarningLogInterpolatedStringHandler(22, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" notification failed: "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(ex2.Message); } log2.LogWarning(val2); } } } internal static class ArchInteraction { internal const string HolderName = "PortalDeposit"; private const string AreaChildName = "ActivityInteractionArea"; private const string EyeOfOdinPathFragment = "InteractionAreaComplete/StorageInteraction"; internal static readonly List Pending = new List(); private static readonly HashSet _loggedFailures = new HashSet(); private static readonly HashSet _refileFailed = new HashSet(); private static readonly HashSet _injected = new HashSet(); internal static bool WidgetRefreshUnsafe(Structure arch) { try { return (Object)(object)arch != (Object)null && _refileFailed.Contains(((Object)arch).GetInstanceID()); } catch (Exception) { return true; } } private static void L(string message) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Expected O, but got Unknown ManualLogSource log = Plugin.Log; bool flag = default(bool); BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(18, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[Portals][attune] "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(message); } log.LogInfo(val); } private static void LogOnce(string key, string message) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Expected O, but got Unknown if (_loggedFailures.Add(key)) { ManualLogSource log = Plugin.Log; bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(18, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[Portals][attune] "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(message); } log.LogWarning(val); } } internal static bool IsInjected(Structure arch) { return (Object)(object)FindHolder(arch) != (Object)null; } internal static Interaction InjectedInteractionFor(Structure arch) { try { Transform val = FindHolder(arch); if ((Object)(object)val == (Object)null) { return null; } StorageInteraction val2 = FindStorage(val, (StorageInteractionType)4); return ((Object)(object)val2 != (Object)null) ? ((Il2CppObjectBase)val2).TryCast() : null; } catch (Exception ex) { LogOnce("injected-interaction-for", "InjectedInteractionFor failed: " + ex.Message); return null; } } internal static bool TryGetArch(InteractionSession session, out Structure arch) { arch = null; try { if (session == null) { return false; } return TryGetArch(session.Interaction, out arch); } catch (Exception ex) { LogOnce("try-get-arch", "TryGetArch failed: " + ex.Message); arch = null; return false; } } internal static bool TryGetArch(Interaction interaction, out Structure arch) { arch = null; try { if ((Object)(object)interaction == (Object)null) { return false; } if (!_injected.Contains(((Il2CppObjectBase)interaction).Pointer)) { return false; } Transform val = ((Component)interaction).transform; while ((Object)(object)val != (Object)null && ((Object)val).name != "PortalDeposit") { val = val.parent; } if ((Object)(object)val == (Object)null) { return false; } Structure componentInParent = ((Component)val).GetComponentInParent(); if ((Object)(object)componentInParent == (Object)null || !ArchTargeting.IsArch(componentInParent)) { return false; } arch = componentInParent; return true; } catch (Exception ex) { LogOnce("try-get-arch-interaction", "TryGetArch(Interaction) failed: " + ex.Message); arch = null; return false; } } internal static bool TryInject(Structure arch, out string reason) { //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Expected O, but got Unknown GameObject val = null; try { if ((Object)(object)arch == (Object)null) { reason = "no-arch"; return false; } if (!ArchTargeting.IsArch(arch)) { reason = "not-an-arch"; return false; } bool dismantled; bool isActive; try { dismantled = arch.Dismantled; isActive = arch.IsActive; } catch (Exception ex) { LogOnce("arch-state", "arch state unreadable: " + ex.Message); reason = "arch-state-unreadable"; return false; } if (dismantled) { reason = "dismantled"; return false; } if (!isActive) { reason = "not-built"; return false; } if (ArchTargeting.IsUnderConstruction(arch)) { reason = "not-built"; return false; } StructureInteractionArea val2 = FindArea(arch); if ((Object)(object)val2 == (Object)null) { reason = "no-interaction-area"; return false; } if ((Object)(object)((Component)val2).transform.Find("PortalDeposit") != (Object)null) { reason = "already-injected"; return false; } INetworkInteractable val3 = ResolveArchNi(val2); if (val3 == null) { reason = "no-network-interactable"; return false; } Pickable areaPickable = ResolveAreaPickable(val2); if (!FindEyeOfOdinSource(out var sourceActivation, out var sourceContainer) || (Object)(object)sourceActivation == (Object)null || (Object)(object)sourceContainer == (Object)null) { reason = "source-missing"; return false; } val = new GameObject("PortalDeposit"); val.SetActive(false); val.transform.SetParent(((Component)val2).transform, false); GameObject val4 = Object.Instantiate(sourceActivation, val.transform, false); ((Object)val4).name = "ActivationInteraction"; GameObject obj = Object.Instantiate(sourceContainer, val.transform, false); ((Object)obj).name = "Container"; ItemContainerComponent component = obj.GetComponent(); if ((Object)(object)component == (Object)null) { LogOnce("clone-container", "cloned Container has no ItemContainerComponent"); Cleanup(val); reason = "container-missing"; return false; } InitializeContainer(component); DestroyAll(val4); DestroyAll(val4); DestroyAll(val4); StorageInteraction val5 = KeepMenuStorageOnly(val4); if ((Object)(object)val5 == (Object)null) { LogOnce("clone-incomplete", "clone yielded no InventoryMenu StorageInteraction"); Cleanup(val); reason = "clone-incomplete"; return false; } RePointStorage(val5, component, ((Component)arch).gameObject); List list = new List { (Interaction)(object)val5 }; BindAreas(val2, list); val.SetActive(true); for (int i = 0; i < list.Count; i++) { try { list[i].InitializeInteractable(); } catch (Exception ex2) { LogOnce("init-interactable", "InitializeInteractable failed: " + ex2.Message); } } for (int j = 0; j < list.Count; j++) { Interaction it = list[j]; MoveToArchInteractable(val3, it); RegisterWithInteractable(val3, it); EnsurePickable(it, areaPickable); } val.SetActive(false); val.SetActive(true); RegisterWithArea(val2, list); ResyncContainer(val5, component); UnfileFromEyeCollection(component, val, arch); NoteInjected(list); L("injected arch at " + PositionText(arch)); reason = null; return true; } catch (Exception ex3) { LogOnce("inject", "injection failed: " + ex3.Message); Cleanup(val); reason = "exception"; return false; } } private static StorageInteraction KeepMenuStorageOnly(GameObject cloneActivation) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Invalid comparison between Unknown and I4 StorageInteraction val = null; Il2CppArrayBase components = cloneActivation.GetComponents(); int num = components?.Length ?? 0; for (int i = 0; i < num; i++) { StorageInteraction val2 = components[i]; if ((Object)(object)val2 == (Object)null) { continue; } if ((int)ReadStorageType(val2) == 4 && (Object)(object)val == (Object)null) { val = val2; continue; } try { Object.DestroyImmediate((Object)(object)val2); } catch (Exception ex) { LogOnce("destroy-storage", "destroying a cloned StorageInteraction failed: " + ex.Message); } } return val; } private static void RePointStorage(StorageInteraction storage, ItemContainerComponent container, GameObject archRoot) { if ((Object)(object)storage == (Object)null) { return; } try { storage.storageContainer = container; } catch (Exception ex) { LogOnce("storage-container", "storageContainer failed: " + ex.Message); } try { storage.Container = container.container; } catch (Exception ex2) { LogOnce("container", "Container failed: " + ex2.Message); } try { ((Interaction)storage).host = archRoot; } catch (Exception ex3) { LogOnce("host", "host failed: " + ex3.Message); } try { ((Interaction)storage).order = (InteractionOrder)0; } catch (Exception ex4) { LogOnce("order", "order failed: " + ex4.Message); } try { storage.openStructureOrder = (InteractionOrder)8; } catch (Exception ex5) { LogOnce("open-structure-order", "openStructureOrder failed: " + ex5.Message); } try { storage.openMilitiaOrder = (InteractionOrder)8; } catch (Exception ex6) { LogOnce("open-militia-order", "openMilitiaOrder failed: " + ex6.Message); } try { storage.villagerOrder = (InteractionOrder)8; } catch (Exception ex7) { LogOnce("villager-order", "villagerOrder failed: " + ex7.Message); } try { storage.villagerAbortOrder = (InteractionOrder)8; } catch (Exception ex8) { LogOnce("villager-abort-order", "villagerAbortOrder failed: " + ex8.Message); } } private static void InitializeContainer(ItemContainerComponent component) { bool flag = false; try { flag = component._initialized; } catch (Exception ex) { LogOnce("initialized-read", "_initialized read failed: " + ex.Message); } if (!flag) { try { component.Initialize(); } catch (Exception ex2) { LogOnce("container-init", "ItemContainerComponent.Initialize failed: " + ex2.Message); } } } private static void UnfileFromEyeCollection(ItemContainerComponent containerComponent, GameObject holder, Structure arch) { //IL_0124: Unknown result type (might be due to invalid IL or missing references) //IL_0129: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)containerComponent == (Object)null) { return; } ItemContainer val = null; try { val = containerComponent.container; } catch (Exception ex) { LogOnce("unfile-container-read", "container read failed: " + ex.Message); } InventoryComponent val2 = null; try { val2 = containerComponent.inventoryComponent; } catch (Exception ex2) { LogOnce("unfile-inventory-read", "inventoryComponent read failed: " + ex2.Message); } if (val == null || (Object)(object)val2 == (Object)null) { LogOnce("unfile-missing", "cannot unfile container: container or inventoryComponent is null"); return; } string text = "?"; try { text = PathOf(((Component)val2).transform); } catch (Exception ex3) { text = "EX: " + ex3.Message; } ItemCollection val3 = null; try { val3 = val2.GetItemCollection(); } catch (Exception ex4) { LogOnce("unfile-collection-read", "GetItemCollection failed: " + ex4.Message); } if (val3 == null) { LogOnce("unfile-collection-null", "Eye of Odin inventory has no ItemCollection"); return; } try { val3.RemoveContainer(val); } catch (Exception ex5) { LogOnce("unfile-remove", "RemoveContainer failed: " + ex5.Message); return; } bool flag = false; try { GameObject val4 = (((Object)(object)holder != (Object)null) ? holder : ((Component)arch).gameObject); ItemCollection val5 = new ItemCollection(); val5.Setup(val4, "PortalDeposit"); val5.AddContainer(val); flag = val.Inventory != null; } catch (Exception ex6) { LogOnce("refile", "re-filing the container into a private collection failed: " + ex6.Message); } if (!flag) { try { _refileFailed.Add(((Object)arch).GetInstanceID()); } catch (Exception ex7) { LogOnce("refile-mark", "marking the arch failed: " + ex7.Message); } L("container unfiled from " + text + " collection but NOT re-filed - the widget refresh is skipped for this arch"); } else { L("container unfiled from " + text + " collection and re-filed into a private one"); } } private static void BindAreas(StructureInteractionArea area, List injected) { IInteractionArea val = null; try { val = ((Il2CppObjectBase)area).TryCast(); } catch (Exception ex) { LogOnce("area-cast", "area TryCast failed: " + ex.Message); } if (val == null) { LogOnce("area-cast-null", "StructureInteractionArea does not cast to IInteractionArea"); return; } for (int i = 0; i < injected.Count; i++) { Interaction val2 = injected[i]; if ((Object)(object)val2 == (Object)null) { continue; } try { val2._interactionArea = val; } catch (Exception ex2) { LogOnce("bind-area", "binding Interaction._interactionArea failed: " + ex2.Message); } StorageInteraction val3 = null; try { val3 = ((Il2CppObjectBase)val2).TryCast(); } catch (Exception ex3) { LogOnce("bind-cast", "TryCast failed: " + ex3.Message); } if (!((Object)(object)val3 == (Object)null)) { try { val3._interactionArea = val; } catch (Exception ex4) { LogOnce("bind-shadow", "binding StorageInteraction._interactionArea failed: " + ex4.Message); } } } } private static void MoveToArchInteractable(INetworkInteractable archNi, Interaction it) { if ((Object)(object)it == (Object)null) { return; } INetworkInteractable val = null; try { val = it.interactable; } catch (Exception ex) { LogOnce("interactable-read", "interaction.interactable read failed: " + ex.Message); } if (val != null && SamePtr((Il2CppObjectBase)(object)val, (Il2CppObjectBase)(object)archNi)) { return; } if (val != null) { try { val.UnregisterInteraction(it); } catch (Exception ex2) { LogOnce("old-unregister", "unregistering from the source interactable failed: " + ex2.Message); } } bool flag = false; try { archNi.MoveInteractionToThis(it); flag = true; } catch (Exception ex3) { LogOnce("move-interaction", "MoveInteractionToThis failed: " + ex3.Message); } if (flag) { return; } try { it.interactable = archNi; } catch (Exception ex4) { LogOnce("interactable-write", "interaction.interactable write failed: " + ex4.Message); } } private static void RegisterWithInteractable(INetworkInteractable archNi, Interaction it) { if ((Object)(object)it == (Object)null) { return; } bool flag = false; try { flag = archNi.TryRegisterInteraction(it); } catch (Exception ex) { LogOnce("register-interactable", "TryRegisterInteraction failed: " + ex.Message); } if (flag) { return; } try { archNi.MoveInteractionToThis(it); } catch (Exception ex2) { LogOnce("register-move", "MoveInteractionToThis retry failed: " + ex2.Message); } try { archNi.TryRegisterInteraction(it); } catch (Exception ex3) { LogOnce("register-retry", "TryRegisterInteraction retry failed: " + ex3.Message); } } private static void EnsurePickable(Interaction it, Pickable areaPickable) { if ((Object)(object)it == (Object)null || (Object)(object)areaPickable == (Object)null) { return; } Pickable val = null; try { val = it.GetPickable(); } catch (Exception ex) { LogOnce("pickable-read", "GetPickable failed: " + ex.Message); } if ((Object)(object)val != (Object)null) { return; } try { it._cachedPickable = areaPickable; } catch (Exception ex2) { LogOnce("pickable-write", "_cachedPickable write failed: " + ex2.Message); } } private static void RegisterWithArea(StructureInteractionArea area, List injected) { List val = null; try { val = ((StandaloneInteractionArea)area).interactions; } catch (Exception ex) { LogOnce("area-list-read", "area.interactions read failed: " + ex.Message); } if (val == null) { try { val = (((StandaloneInteractionArea)area).interactions = new List()); } catch (Exception ex2) { LogOnce("area-list-create", "area.interactions create failed: " + ex2.Message); return; } } for (int i = 0; i < injected.Count; i++) { Interaction val3 = injected[i]; if (!((Object)(object)val3 == (Object)null)) { try { val.Add(val3); } catch (Exception ex3) { LogOnce("area-list-add", "area.interactions add failed: " + ex3.Message); } } } try { ((StandaloneInteractionArea)area).SetAreaDirty(); } catch (Exception ex4) { LogOnce("set-area-dirty", "SetAreaDirty failed: " + ex4.Message); } } private static void ResyncContainer(StorageInteraction menuStorage, ItemContainerComponent component) { ItemContainer val = null; try { val = component.container; } catch (Exception ex) { LogOnce("resync-read", "container re-read failed: " + ex.Message); } if (val == null || (Object)(object)menuStorage == (Object)null) { return; } try { menuStorage.storageContainer = component; } catch (Exception ex2) { LogOnce("resync-component", "storageContainer resync failed: " + ex2.Message); } try { menuStorage.Container = val; } catch (Exception ex3) { LogOnce("resync-container", "Container resync failed: " + ex3.Message); } } private static bool FindEyeOfOdinSource(out GameObject sourceActivation, out GameObject sourceContainer) { //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Invalid comparison between Unknown and I4 //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) sourceActivation = null; sourceContainer = null; try { Il2CppArrayBase val = Resources.FindObjectsOfTypeAll(); int num = val?.Length ?? 0; for (int i = 0; i < num; i++) { StorageInteraction val2 = val[i]; if ((Object)(object)val2 == (Object)null || (int)ReadStorageType(val2) != 1) { continue; } string text; try { text = PathOf(((Component)val2).transform); } catch { continue; } if (text.IndexOf("InteractionAreaComplete/StorageInteraction", StringComparison.Ordinal) < 0) { continue; } GameObject gameObject = ((Component)val2).gameObject; Transform parent = ((Component)val2).transform.parent; Transform val3 = (((Object)(object)parent != (Object)null) ? parent.Find("Container") : null); if (!((Object)(object)val3 == (Object)null)) { bool flag; try { Scene scene = gameObject.scene; flag = ((Scene)(ref scene)).IsValid(); } catch { flag = false; } if (flag || (Object)(object)sourceActivation == (Object)null) { sourceActivation = gameObject; sourceContainer = ((Component)val3).gameObject; } if (flag) { break; } } } return true; } catch (Exception ex) { LogOnce("source-search", "Eye of Odin source search failed: " + ex.Message); return false; } } private static StorageInteractionType ReadStorageType(StorageInteraction si) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) try { return si.storageType; } catch { return (StorageInteractionType)4; } } private static StructureInteractionArea FindArea(Structure arch) { try { Transform val = ((Component)arch).transform.Find("ActivityInteractionArea"); if ((Object)(object)val != (Object)null) { StructureInteractionArea component = ((Component)val).GetComponent(); if ((Object)(object)component != (Object)null) { return component; } } } catch (Exception ex) { LogOnce("area-find", "interaction-area lookup failed: " + ex.Message); } try { return ((Component)arch).GetComponentInChildren(true); } catch (Exception ex2) { LogOnce("area-search", "interaction-area search failed: " + ex2.Message); return null; } } private static Transform FindHolder(Structure arch) { try { if ((Object)(object)arch == (Object)null) { return null; } StructureInteractionArea val = FindArea(arch); return ((Object)(object)val != (Object)null) ? ((Component)val).transform.Find("PortalDeposit") : null; } catch (Exception ex) { LogOnce("holder-find", "holder lookup failed: " + ex.Message); return null; } } private static StorageInteraction FindStorage(Transform holder, StorageInteractionType want) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) Il2CppArrayBase componentsInChildren = ((Component)holder).GetComponentsInChildren(true); int num = componentsInChildren?.Length ?? 0; for (int i = 0; i < num; i++) { StorageInteraction val = componentsInChildren[i]; if ((Object)(object)val != (Object)null && ReadStorageType(val) == want) { return val; } } return null; } private static INetworkInteractable ResolveArchNi(StructureInteractionArea area) { NetworkObjectInteractable val = null; try { val = ((Component)area).gameObject.GetComponent(); } catch (Exception ex) { LogOnce("ni-get", "NetworkObjectInteractable lookup failed: " + ex.Message); } if ((Object)(object)val == (Object)null) { return null; } try { return ((Il2CppObjectBase)val).TryCast(); } catch (Exception ex2) { LogOnce("ni-cast", "NetworkObjectInteractable cast failed: " + ex2.Message); return null; } } private static Pickable ResolveAreaPickable(StructureInteractionArea area) { try { return ((Component)area).gameObject.GetComponent(); } catch (Exception ex) { LogOnce("pickable-get", "area Pickable lookup failed: " + ex.Message); return null; } } private static void DestroyAll(GameObject go) where T : Component { try { Il2CppArrayBase components = go.GetComponents(); int num = components?.Length ?? 0; for (int i = 0; i < num; i++) { T val = components[i]; if (!((Object)(object)val == (Object)null)) { try { Object.DestroyImmediate((Object)(object)val); } catch (Exception ex) { LogOnce("destroy-" + typeof(T).Name, "destroying " + typeof(T).Name + " failed: " + ex.Message); } } } } catch (Exception ex2) { LogOnce("destroy-all-" + typeof(T).Name, "sweeping " + typeof(T).Name + " failed: " + ex2.Message); } } private static void NoteInjected(List injected) { for (int i = 0; i < injected.Count; i++) { try { Interaction val = injected[i]; if ((Object)(object)val != (Object)null) { _injected.Add(((Il2CppObjectBase)val).Pointer); } } catch (Exception ex) { LogOnce("note-injected", "recording an injected interaction pointer failed: " + ex.Message); } } } private static void Cleanup(GameObject holder) { if ((Object)(object)holder == (Object)null) { return; } try { Il2CppArrayBase componentsInChildren = holder.GetComponentsInChildren(true); int num = componentsInChildren?.Length ?? 0; for (int i = 0; i < num; i++) { Interaction val = componentsInChildren[i]; if ((Object)(object)val != (Object)null) { _injected.Remove(((Il2CppObjectBase)val).Pointer); } } } catch (Exception ex) { LogOnce("cleanup-injected", "forgetting a half-built holder's interaction pointers failed: " + ex.Message); } try { holder.SetActive(false); ((Object)holder).name = "PortalDeposit(failed)"; Object.Destroy((Object)(object)holder); } catch (Exception ex2) { LogOnce("cleanup", "tearing down a half-built holder failed: " + ex2.Message); } } internal static string PositionText(Structure arch) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) try { Vector3 position = ((Component)arch).transform.position; return "(" + position.x.ToString("F1") + ", " + position.y.ToString("F1") + ", " + position.z.ToString("F1") + ")"; } catch { return "(unknown)"; } } private static string PathOf(Transform t) { string text = string.Empty; while ((Object)(object)t != (Object)null) { text = "/" + ((Object)t).name + text; t = t.parent; } return text; } private static bool SamePtr(Il2CppObjectBase a, Il2CppObjectBase b) { try { return a != null && b != null && a.Pointer == b.Pointer; } catch { return false; } } } internal static class ArchPromptConfig { private sealed class Entry { public PlayerStorageInteractionConfig Original; public PlayerStorageInteractionConfig Clone; public string CloneName; public string Label; } private sealed class ClonePair { public Entry Open; public Entry Destination; } [HarmonyPatch(typeof(PlayerStorageInteractionConfig), "CreateSession")] internal static class CreateSessionPostfixPatch { [HarmonyPostfix] public static void Postfix(PlayerStorageInteractionConfig __instance, Interaction interaction, InteractionSession __result) { try { if (!((Object)(object)__instance == (Object)null) && __result != null && ArchInteraction.TryGetArch(interaction, out var arch) && !((Object)(object)arch == (Object)null)) { PortalRecord record; bool attuned = PortalRegistry.Current?.TryFindByArch(arch, out record) ?? false; PlayerStorageInteractionConfig val = CloneFor(__instance, attuned); if ((Object)(object)val != (Object)null) { __result.Config = (InteractionConfiguration)(object)val; } } } catch (Exception ex) { WarnOnce("create-session", "prompt label not applied: " + ex.Message); } } } [HarmonyPatch(typeof(LocalizationManager))] internal static class LanguagePatch { [HarmonyPostfix] [HarmonyPatch("Awake")] public static void AwakePostfix(LocalizationManager __instance) { ReapplyAll(__instance, "Awake"); } [HarmonyPostfix] [HarmonyPatch("SetLanguage")] public static void SetLanguagePostfix(LocalizationManager __instance) { ReapplyAll(__instance, "SetLanguage"); } } [HarmonyPatch(typeof(LocalizationManager), "Loc", new Type[] { typeof(string), typeof(bool) })] internal static class LocPatch { [HarmonyPostfix] public static void Postfix(string key, ref string __result) { Substitute(key, ref __result); } } [HarmonyPatch(typeof(LocalizationManager))] internal static class LocOverloadPatch { [HarmonyPostfix] [HarmonyPatch("Loc", new Type[] { typeof(string), typeof(Il2CppReferenceArray) })] public static void LocPostfix(string key, ref string __result) { Substitute(key, ref __result); } [HarmonyPostfix] [HarmonyPatch("LocFallback")] public static void LocFallbackPostfix(string key, ref string __result) { Substitute(key, ref __result); } } private const string OpenLabel = "Open Portal"; private const string OpenCloneName = "PortalOpenInteractionConfig"; private const string DestinationLabel = "Change Destination"; private const string DestinationCloneName = "PortalDestinationInteractionConfig"; private const string MenuToken = "menu"; private const string Prefix = "[Portals][attune]"; private static readonly Dictionary _clones = new Dictionary(); private static readonly Dictionary _entries = new Dictionary(); private static readonly HashSet _logged = new HashSet(); internal static void Register() { Patch(typeof(CreateSessionPostfixPatch), "PlayerStorageInteractionConfig.CreateSession"); Patch(typeof(LanguagePatch), "LocalizationManager.Awake/SetLanguage"); Patch(typeof(LocPatch), "LocalizationManager.Loc(string, bool)"); Patch(typeof(LocOverloadPatch), "LocalizationManager.Loc(string, array)/LocFallback"); } private static void Patch(Type patchClass, string what) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown try { Harmony.CreateAndPatchAll(patchClass, (string)null); } catch (Exception ex) { ManualLogSource log = Plugin.Log; bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(15, 3, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(what); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" not patched: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex.Message); } log.LogWarning(val); } } private static void LogOnce(string key, string message) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown if (_logged.Add(key)) { ManualLogSource log = Plugin.Log; bool flag = default(bool); BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(1, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(message); } log.LogInfo(val); } } private static void WarnOnce(string key, string message) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown if (_logged.Add(key)) { ManualLogSource log = Plugin.Log; bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(1, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(message); } log.LogWarning(val); } } private static void Substitute(string key, ref string result) { if (key != null && _entries.Count != 0 && (string.IsNullOrEmpty(result) || !(result != key)) && _entries.TryGetValue(key, out var value)) { result = value; } } private static bool StillTheSameAsset(Entry entry, PlayerStorageInteractionConfig original) { //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Expected O, but got Unknown if (entry == null) { return true; } try { return (Object)(object)entry.Original != (Object)null && ((Il2CppObjectBase)entry.Original).Pointer == ((Il2CppObjectBase)original).Pointer; } catch (Exception ex) { ManualLogSource log = Plugin.Log; bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(43, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" re-checking a cached prompt config threw: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex.Message); } log.LogWarning(val); return false; } } private static PlayerStorageInteractionConfig CloneFor(PlayerStorageInteractionConfig original, bool attuned) { //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Expected O, but got Unknown IntPtr pointer = ((Il2CppObjectBase)original).Pointer; if (_clones.TryGetValue(pointer, out var value) && (!StillTheSameAsset(value.Open, original) || !StillTheSameAsset(value.Destination, original))) { ManualLogSource log = Plugin.Log; bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(76, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" the cached prompt-config clones no longer belong to this asset - rebuilding"); } log.LogWarning(val); _clones.Remove(pointer); value = null; } if (value == null) { value = new ClonePair(); _clones[pointer] = value; } Entry entry = (attuned ? value.Destination : value.Open); if (entry != null && (Object)(object)entry.Clone != (Object)null) { return entry.Clone; } if (!((InteractionConfiguration)original).Localized) { LogOnce("label-pending", "prompt label left (loc key) - the config is not localized yet"); return null; } string text = (attuned ? "PortalDestinationInteractionConfig" : "PortalOpenInteractionConfig"); string text2 = (attuned ? "Change Destination" : "Open Portal"); Object val2 = (Object)(object)Object.Instantiate(original); PlayerStorageInteractionConfig val3 = ((val2 != (Object)null) ? ((Il2CppObjectBase)val2).TryCast() : null); if ((Object)(object)val3 == (Object)null) { WarnOnce("label-clone-" + text, "prompt label not applied: the storage config could not be cloned for " + text2); return null; } ((Object)val3).hideFlags = (HideFlags)61; ((Object)val3).name = text; entry = new Entry { Original = original, Clone = val3, CloneName = text, Label = text2 }; if (attuned) { value.Destination = entry; } else { value.Open = entry; } LocalizationManager instance = LocalizationManager.Instance; int value2 = Apply(entry, instance); string key = ((InteractionConfiguration)val3).GetKey("menu"); string text3 = (((Object)(object)instance != (Object)null) ? Lookup(instance, key) : null); LogOnce("label-set-" + text, $"prompt label set: '{text2}', {value2} keys registered; '{key}' -> '{text3 ?? "(missing)"}' in the live table"); return val3; } private static void ReapplyAll(LocalizationManager lm, string source) { try { if ((Object)(object)lm == (Object)null || _clones.Count == 0) { return; } int num = 0; foreach (ClonePair value in _clones.Values) { num += Reapply(value.Open, lm); num += Reapply(value.Destination, lm); } if (num > 0) { LogOnce("reapply-" + source, $"prompt labels re-applied after {source}: {num} keys"); } } catch (Exception ex) { WarnOnce("reapply-" + source, "prompt label re-apply after " + source + " failed: " + ex.Message); } } private static int Reapply(Entry entry, LocalizationManager lm) { if (entry == null || (Object)(object)entry.Clone == (Object)null || (Object)(object)entry.Original == (Object)null) { return 0; } return Apply(entry, lm); } private static int Apply(Entry entry, LocalizationManager lm) { int result = 0; if ((Object)(object)lm != (Object)null) { result = RegisterKeys(entry, lm); ClearCache(lm); } entry.Clone.storageMenuMessage = entry.Label; return result; } private static int RegisterKeys(Entry entry, LocalizationManager lm) { int num = 0; try { string key = ((InteractionConfiguration)entry.Original).GetKey(string.Empty); Dictionary localizationStrings = ((InteractionConfiguration)entry.Original).GetLocalizationStrings(); if (localizationStrings != null && !string.IsNullOrEmpty(key)) { Enumerator enumerator = localizationStrings.GetEnumerator(); while (enumerator.MoveNext()) { string key2 = enumerator.Current.Key; if (key2 == null || !key2.StartsWith(key, StringComparison.Ordinal)) { continue; } string text = key2.Substring(key.Length); if (text.Length != 0 && !(text == "menu")) { string value = Lookup(lm, key2) ?? enumerator.Current.Value; if (!string.IsNullOrEmpty(value) && Write(lm, ((InteractionConfiguration)entry.Clone).GetKey(text), value)) { num++; } } } } else { WarnOnce("register-strings", "prompt keys: the original config listed no localization strings; only the menu key is registered"); } } catch (Exception ex) { WarnOnce("register-keys", "prompt keys not all registered: " + ex.Message); } if (Write(lm, ((InteractionConfiguration)entry.Clone).GetKey("menu"), entry.Label)) { num++; } return num; } private static string Lookup(LocalizationManager lm, string key) { try { Dictionary localizedStrings = lm.LocalizedStrings; if (localizedStrings != null && localizedStrings.ContainsKey(key)) { return localizedStrings[key]; } } catch (Exception ex) { WarnOnce("lookup", "live-table read failed, using the field text: " + ex.Message); } return null; } private static bool Write(LocalizationManager lm, string key, string value) { if (string.IsNullOrEmpty(key) || value == null) { return false; } bool flag = false; flag |= Put(lm._localizedStrings, key, value, "_localizedStrings"); flag |= Put(lm.LocalizedStrings, key, value, "LocalizedStrings"); flag |= Put(lm._localizedFallbackStrings, key, value, "_localizedFallbackStrings"); flag |= Put(lm.FallbackLocalizedStrings, key, value, "FallbackLocalizedStrings"); try { LocalizationManager._allKeys?.Add(key); } catch (Exception ex) { WarnOnce("all-keys", "key set not updated: " + ex.Message); } _entries[key] = value; return flag; } private static bool Put(Dictionary table, string key, string value, string which) { if (table == null) { return false; } try { table[key] = value; return true; } catch (Exception ex) { WarnOnce("put-" + which, "write into " + which + " failed: " + ex.Message); return false; } } private static void ClearCache(LocalizationManager lm) { try { lm._cache?.Clear(); } catch (Exception ex) { WarnOnce("cache-clear", "localization cache not cleared: " + ex.Message); } } } [HarmonyPatch(typeof(Structure))] public static class ArchSpawnPatch { [HarmonyPostfix] [HarmonyPatch("AfterSpawned")] public static void AfterSpawned(Structure __instance) { //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Expected O, but got Unknown try { if (!ArchTargeting.IsArch(__instance)) { return; } ArchTargeting.NoteLoaded(__instance); if (ArchInteraction.TryInject(__instance, out var reason) || (reason != "source-missing" && reason != "not-built")) { return; } for (int i = 0; i < ArchInteraction.Pending.Count; i++) { if ((Object)(object)ArchInteraction.Pending[i] == (Object)(object)__instance) { return; } } ArchInteraction.Pending.Add(__instance); } catch (Exception ex) { ManualLogSource log = Plugin.Log; bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(42, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[Portals][attune] arch spawn hook failed: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex.Message); } log.LogWarning(val); } } } internal readonly struct ArchSnapshot { internal Vector3 Position { get; } internal Vector3 OpeningAxis { get; } internal string Name { get; } internal int UniqueId { get; } internal ArchSnapshot(Vector3 position, Vector3 openingAxis, string name, int uniqueId) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) Position = position; OpeningAxis = openingAxis; Name = name; UniqueId = uniqueId; } } internal static class ArchTargeting { internal const string ArchTemplateName = "Item_Decoration_IvyArch"; private static PickingManager _pickingManager; internal static readonly List Loaded = new List(); private static readonly List _announced = new List(); internal static void NoteLoaded(Structure arch) { if ((Object)(object)arch == (Object)null || !IsArch(arch)) { return; } for (int i = 0; i < Loaded.Count; i++) { if ((Object)(object)Loaded[i] == (Object)(object)arch) { return; } } Loaded.Add(arch); } internal static void AnnounceOnce(Structure arch, int id) { //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Expected O, but got Unknown for (int num = _announced.Count - 1; num >= 0; num--) { if ((Object)(object)_announced[num] == (Object)null) { _announced.RemoveAt(num); } else if ((Object)(object)_announced[num] == (Object)(object)arch) { return; } } _announced.Add(arch); ManualLogSource log = Plugin.Log; bool flag = default(bool); BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(28, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[Portals][sync] arch id="); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(id); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" at "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ArchInteraction.PositionText(arch)); } log.LogInfo(val); } internal static int UniqueIdOf(Structure arch) { try { return ((Object)(object)arch != (Object)null) ? arch._uniqueId : 0; } catch { return 0; } } internal static string NameOf(Structure arch) { //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Expected O, but got Unknown //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Expected O, but got Unknown if ((Object)(object)arch == (Object)null) { return ""; } bool flag = default(bool); try { string customName = arch.GetCustomName(); if (!string.IsNullOrWhiteSpace(customName)) { return customName.Trim(); } } catch (Exception ex) { ManualLogSource log = Plugin.Log; BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(32, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[Portals] GetCustomName failed: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex.Message); } log.LogWarning(val); } try { string name = arch.GetName(); if (!string.IsNullOrWhiteSpace(name)) { return name.Trim(); } } catch (Exception ex2) { ManualLogSource log2 = Plugin.Log; BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(26, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[Portals] GetName failed: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex2.Message); } log2.LogWarning(val); } return ""; } internal static bool IsUnderConstruction(Structure arch) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Expected O, but got Unknown try { return (Object)(object)arch != (Object)null && (Object)(object)arch.buildSite != (Object)null; } catch (Exception ex) { ManualLogSource log = Plugin.Log; bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(33, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[Portals] buildSite read failed: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex.Message); } log.LogWarning(val); return false; } } internal static bool TrySnapshot(Structure arch, out ArchSnapshot snapshot) { //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Expected O, but got Unknown //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) snapshot = default(ArchSnapshot); if ((Object)(object)arch == (Object)null) { return false; } try { if (arch.Dismantled || !arch.IsActive) { return false; } if (IsUnderConstruction(arch)) { return false; } Vector3 position = ((Component)arch).transform.position; snapshot = new ArchSnapshot(position, OpeningAxis(arch), NameOf(arch), UniqueIdOf(arch)); return true; } catch (Exception ex) { ManualLogSource log = Plugin.Log; bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(32, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[Portals] arch snapshot failed: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex.Message); } log.LogWarning(val); snapshot = default(ArchSnapshot); return false; } } internal static bool IsArch(Structure s) { try { return (Object)(object)s != (Object)null && (Object)(object)s.Template != (Object)null && ((Object)s.Template).name == "Item_Decoration_IvyArch"; } catch { return false; } } internal static bool TryGetAimedStructure(out Structure s) { //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Expected O, but got Unknown s = null; try { PickingManager pickingManager = GetPickingManager(); if ((Object)(object)pickingManager == (Object)null) { return false; } Pickable selectedPickable = pickingManager.SelectedPickable; if ((Object)(object)selectedPickable == (Object)null) { return false; } GameObject gameObject = ((Component)selectedPickable).gameObject; if ((Object)(object)gameObject == (Object)null) { return false; } StructureInteraction val = gameObject.GetComponentInParent(); if ((Object)(object)val == (Object)null) { val = gameObject.GetComponentInChildren(true); } if ((Object)(object)val != (Object)null) { s = val.GetStructure(); } if ((Object)(object)s == (Object)null) { s = gameObject.GetComponentInParent(); } return (Object)(object)s != (Object)null; } catch (Exception ex) { ManualLogSource log = Plugin.Log; bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val2 = new BepInExWarningLogInterpolatedStringHandler(39, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("[Portals] TryGetAimedStructure failed: "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(ex.Message); } log.LogWarning(val2); s = null; return false; } } internal static List FindArches() { //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Expected O, but got Unknown List list = new List(); try { Il2CppArrayBase val = Object.FindObjectsOfType(); if (val == null) { return list; } foreach (Structure item in val) { if (IsArch(item)) { list.Add(item); } } } catch (Exception ex) { ManualLogSource log = Plugin.Log; bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val2 = new BepInExWarningLogInterpolatedStringHandler(29, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("[Portals] FindArches failed: "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(ex.Message); } log.LogWarning(val2); } return list; } internal static Vector3 OpeningAxis(Structure arch) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Expected O, but got Unknown //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_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_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) try { Vector3 forward = ((Component)arch).transform.forward; forward.y = 0f; return (((Vector3)(ref forward)).sqrMagnitude > 0.0001f) ? ((Vector3)(ref forward)).normalized : Vector3.forward; } catch (Exception ex) { ManualLogSource log = Plugin.Log; bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(30, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[Portals] OpeningAxis failed: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex.Message); } log.LogWarning(val); return Vector3.forward; } } private static PickingManager GetPickingManager() { if ((Object)(object)_pickingManager == (Object)null) { _pickingManager = Object.FindObjectOfType(); } return _pickingManager; } } internal static class ArchUsePatch { [HarmonyPatch(typeof(Interaction), "Use")] internal static class UsePrefixPatch { [HarmonyPrefix] public static bool Prefix(Interaction __instance, ref bool __result) { try { if (!ArchInteraction.TryGetArch(__instance, out var arch) || (Object)(object)arch == (Object)null) { return true; } __result = false; OnInteract(arch); return false; } catch (Exception ex) { WarnOnce("use-prefix", "Use prefix failed, deferring to the game: " + ex.Message); return true; } } } private const string Prefix = "[Portals][attune]"; private static readonly HashSet _logged = new HashSet(); internal static void Register() { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown try { Harmony.CreateAndPatchAll(typeof(UsePrefixPatch), (string)null); } catch (Exception ex) { ManualLogSource log = Plugin.Log; bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(30, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" Interaction.Use not patched: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex.Message); } log.LogWarning(val); } } private static void WarnOnce(string key, string message) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown if (_logged.Add(key)) { ManualLogSource log = Plugin.Log; bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(1, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(message); } log.LogWarning(val); } } internal static void OnInteract(Structure arch) { if (!((Object)(object)arch == (Object)null)) { PortalRegistry current = PortalRegistry.Current; PortalRecord record; if (current == null) { Toast("Portals are not ready yet.", (NotificationType)1); } else if (!current.TryFindByArch(arch, out record)) { ArchConfirmDialog.TryOpen(arch); } else if (current.Portals.Count < 2) { Toast("You need at least two Portals to travel the Bifrost", (NotificationType)1); Plugin.Log.LogInfo((object)"[Portals][destination] refused: only one portal"); } else { PortalTool.RequestDestinationDialog(record); } } } private static void Toast(string message) { Toast(message, (NotificationType)0); } internal static void Toast(string message, NotificationType type) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) if ((int)type == 1) { try { string text = message; int hashCode = message.GetHashCode(); float num = 1f; Color val = default(Color); ((Color)(ref val))..ctor(0.85f, 0.2f, 0.18f, 1f); NotificationMenu.DisplayStacking((NotificationType)1, (StackingType)0, ref text, ref hashCode, ref num, (Sprite)null, val, val); return; } catch (Exception ex) { WarnOnce("toast-red", "red notification failed, using default: " + ex.Message); } } try { string text2 = message; NotificationMenu.Display(type, ref text2, false); } catch (Exception ex2) { WarnOnce("toast", "notification failed: " + ex2.Message); } } } internal static class ArchWidgetPatch { [HarmonyPatch(typeof(PlayerStorageInteractionSession), "RefreshWidgetData")] internal static class RefreshWidgetDataPrefixPatch { [HarmonyPrefix] public static bool Prefix(PlayerStorageInteractionSession __instance) { try { Structure arch; return !ArchInteraction.TryGetArch((InteractionSession)(object)__instance, out arch) || !ArchInteraction.WidgetRefreshUnsafe(arch); } catch (Exception) { return true; } } } private const string Prefix = "[Portals][attune]"; internal static void Register() { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown try { Harmony.CreateAndPatchAll(typeof(RefreshWidgetDataPrefixPatch), (string)null); } catch (Exception ex) { ManualLogSource log = Plugin.Log; bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(64, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][attune]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" PlayerStorageInteractionSession.RefreshWidgetData not patched: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex.Message); } log.LogWarning(val); } } } [HarmonyPatch(typeof(Character))] public static class CharacterSpawnPatch { [HarmonyPostfix] [HarmonyPatch("Spawned")] public static void Spawned(Character __instance) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) Type[] components = new Type[2] { typeof(TeleportEngine), typeof(PortalTool) }; LocalPlayerTool.AttachOnSpawn(__instance, Plugin.Log, "Teleportation_Tool", Vector3.zero, components); } } internal static class ConfigRename { private const string Prefix = "[Portals][rename]"; private const string OldGuid = "mugsy33.teleportation"; private const string OldRegistryFolder = "Teleportation"; internal static void Run(ConfigFile config, ManualLogSource log) { MoveSettings(config, log); MoveDevSettings(log); MoveRegistry(log); } private static void MoveSettings(ConfigFile config, ManualLogSource log) { //IL_0201: Unknown result type (might be due to invalid IL or missing references) //IL_0208: Expected O, but got Unknown //IL_01b8: Unknown result type (might be due to invalid IL or missing references) //IL_01bf: Expected O, but got Unknown //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Expected O, but got Unknown //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Expected O, but got Unknown //IL_0133: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Expected O, but got Unknown //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Expected O, but got Unknown //IL_0179: Unknown result type (might be due to invalid IL or missing references) //IL_0180: Expected O, but got Unknown bool flag = false; string text = null; bool flag2 = default(bool); try { text = config.ConfigFilePath; string text2 = Path.Combine(Paths.ConfigPath, "mugsy33.teleportation.cfg"); string text3 = text2 + ".migrated"; if (File.Exists(text)) { if (File.Exists(text3)) { File.Delete(text3); BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(39, 2, ref flag2); if (flag2) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][rename]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" deleted the migrated legacy settings: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(text3); } log.LogInfo(val); } else if (File.Exists(text2)) { File.Move(text2, text3, overwrite: true); BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(29, 2, ref flag2); if (flag2) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][rename]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" legacy settings archived to "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(text3); } log.LogInfo(val); } } else if (File.Exists(text2)) { BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(24, 2, ref flag2); if (flag2) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][rename]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" legacy settings found: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(text2); } log.LogInfo(val); string text4 = text + ".tmp"; File.Copy(text2, text4, overwrite: true); File.Move(text4, text, overwrite: true); flag = true; val = new BepInExInfoLogInterpolatedStringHandler(19, 2, ref flag2); if (flag2) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][rename]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" settings moved to "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(text); } log.LogInfo(val); config.Reload(); File.Move(text2, text3, overwrite: true); val = new BepInExInfoLogInterpolatedStringHandler(29, 2, ref flag2); if (flag2) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][rename]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" legacy settings archived to "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(text3); } log.LogInfo(val); } } catch (Exception ex) { BepInExWarningLogInterpolatedStringHandler val2 = new BepInExWarningLogInterpolatedStringHandler(61, 2, ref flag2); if (flag2) { ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted("[Portals][rename]"); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" the settings could not be moved; the old file is untouched. "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(ex); } log.LogWarning(val2); if (!flag || text == null) { return; } try { File.Delete(text); } catch (Exception ex2) { val2 = new BepInExWarningLogInterpolatedStringHandler(54, 2, ref flag2); if (flag2) { ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted("[Portals][rename]"); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" the half-written settings file could not be removed: "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(ex2.Message); } log.LogWarning(val2); } } } private static void MoveDevSettings(ManualLogSource log) { //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Expected O, but got Unknown //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Expected O, but got Unknown bool flag = default(bool); try { string text = Path.Combine(Paths.ConfigPath, "mugsy33.teleportation.dev.cfg"); string text2 = Path.Combine(Paths.ConfigPath, "mugsy33.bifrost.dev.cfg"); if (File.Exists(text) && !File.Exists(text2)) { File.Move(text, text2); BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(23, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][rename]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" dev settings moved to "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(text2); } log.LogInfo(val); } } catch (Exception ex) { BepInExWarningLogInterpolatedStringHandler val2 = new BepInExWarningLogInterpolatedStringHandler(65, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted("[Portals][rename]"); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" the dev settings could not be moved; the old file is untouched. "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(ex); } log.LogWarning(val2); } } private static void MoveRegistry(ManualLogSource log) { //IL_0190: Unknown result type (might be due to invalid IL or missing references) //IL_0197: Expected O, but got Unknown //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Expected O, but got Unknown //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Expected O, but got Unknown //IL_0154: Unknown result type (might be due to invalid IL or missing references) //IL_015b: Expected O, but got Unknown bool flag = default(bool); try { string text = Path.Combine(Paths.ConfigPath, "Teleportation"); string text2 = Path.Combine(Paths.ConfigPath, "Bifrost"); if (!Directory.Exists(text)) { return; } Directory.CreateDirectory(text2); string[] files = Directory.GetFiles(text); int num = 0; BepInExInfoLogInterpolatedStringHandler val; for (int i = 0; i < files.Length; i++) { string fileName = Path.GetFileName(files[i]); string text3 = Path.Combine(text2, fileName); if (File.Exists(text3)) { val = new BepInExInfoLogInterpolatedStringHandler(46, 3, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][rename]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" kept the existing "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(fileName); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("; the legacy copy stays at "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(files[i]); } log.LogInfo(val); } else { File.Move(files[i], text3); num++; } } val = new BepInExInfoLogInterpolatedStringHandler(39, 4, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][rename]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" moved "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(num); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" of "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(files.Length); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" portal registry file(s) to "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(text2); } log.LogInfo(val); if (Directory.GetFiles(text).Length == 0 && Directory.GetDirectories(text).Length == 0) { Directory.Delete(text); val = new BepInExInfoLogInterpolatedStringHandler(33, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][rename]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" removed the empty legacy folder "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(text); } log.LogInfo(val); } } catch (Exception ex) { BepInExWarningLogInterpolatedStringHandler val2 = new BepInExWarningLogInterpolatedStringHandler(72, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted("[Portals][rename]"); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" the portal registries could not be moved; the old folder is untouched. "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(ex); } log.LogWarning(val2); } } } internal static class DestinationDialog { private enum State { Idle, WaitingForMenu, Ready } [HarmonyPatch(typeof(InputFieldConfirmActionMenu), "_OnConfirmButtonPressed")] internal static class ConfirmPressPatch { [HarmonyPrefix] public static bool Prefix(InputFieldConfirmActionMenu __instance) { //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Expected O, but got Unknown try { if (_state != State.Ready || _menuPointer == IntPtr.Zero || (Object)(object)__instance == (Object)null || ((Il2CppObjectBase)__instance).Pointer != _menuPointer) { return true; } } catch { return true; } try { return HandleConfirm(); } catch (Exception ex) { ManualLogSource log = Plugin.Log; bool flag = default(bool); BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(35, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted>((Func)Prefix); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" handling the confirm press threw: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex); } log.LogError(val); return false; } } } private const string Prefix = "[Portals][destination]"; private const string Title = "Select Destination"; private const string ConfirmCaptionKey = "common.confirm"; private const string CancelCaptionKey = "common.cancel"; private const string CloneName = "PortalDestinationDropdown"; private const string SourceCaptionName = "Description"; private const string FailureMessage = "The destination window could not be opened."; private const float ActivationTimeoutSeconds = 5f; private const float VanishGraceSeconds = 5f; private static readonly Vector2 FallbackAnchorMin = new Vector2(0.5f, 0f); private static readonly Vector2 FallbackAnchorMax = new Vector2(0.5f, 0f); private static readonly Vector2 FallbackPivot = new Vector2(0.5f, 0.5f); private static readonly Vector2 FallbackAnchoredPosition = new Vector2(0f, 65.1f); private static readonly Vector2 FallbackSizeDelta = new Vector2(160f, 30f); private static State _state = State.Idle; private static Menu _menu; private static InputFieldConfirmActionMenu _dialog; private static IntPtr _menuPointer; private static TMP_Dropdown _dropdown; private static Button _confirmButton; private static List _ordered; private static bool _hasBlank; private static int _selectedOrder; private static Action _onPick; private static float _openedAt; private static float _lastAliveAt; private static Action _cancelHandler; private static Action _valueChangedHandler; internal static bool IsOpen => _state != State.Idle; internal static bool TryOpen(PortalRecord current, IReadOnlyList choices, PortalRecord preselected, Action onPick) { //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Expected O, but got Unknown //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_0148: Expected O, but got Unknown //IL_022e: Unknown result type (might be due to invalid IL or missing references) //IL_0235: Expected O, but got Unknown //IL_02a7: Unknown result type (might be due to invalid IL or missing references) //IL_02ae: Expected O, but got Unknown //IL_02ff: Unknown result type (might be due to invalid IL or missing references) //IL_0306: Expected O, but got Unknown //IL_03ad: Unknown result type (might be due to invalid IL or missing references) //IL_03b4: Expected O, but got Unknown //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Expected O, but got Unknown //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Expected O, but got Unknown //IL_018f: Unknown result type (might be due to invalid IL or missing references) //IL_0196: Expected O, but got Unknown //IL_01bc: Unknown result type (might be due to invalid IL or missing references) //IL_01c1: Unknown result type (might be due to invalid IL or missing references) //IL_01cc: Unknown result type (might be due to invalid IL or missing references) //IL_01d7: Unknown result type (might be due to invalid IL or missing references) //IL_01e2: Unknown result type (might be due to invalid IL or missing references) //IL_01ed: Unknown result type (might be due to invalid IL or missing references) //IL_01f4: Unknown result type (might be due to invalid IL or missing references) //IL_01fb: Unknown result type (might be due to invalid IL or missing references) //IL_0202: Unknown result type (might be due to invalid IL or missing references) //IL_020d: Unknown result type (might be due to invalid IL or missing references) //IL_0218: Unknown result type (might be due to invalid IL or missing references) //IL_0220: Expected O, but got Unknown //IL_0352: Unknown result type (might be due to invalid IL or missing references) //IL_0359: Expected O, but got Unknown //IL_0438: Unknown result type (might be due to invalid IL or missing references) //IL_043f: Expected O, but got Unknown bool flag = default(bool); if (current == null || choices == null || choices.Count == 0 || onPick == null) { ManualLogSource log = Plugin.Log; BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(66, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][destination]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" the picker was asked for with nothing to pick from - not opening."); } log.LogWarning(val); return false; } BepInExInfoLogInterpolatedStringHandler val2; if (_state != State.Idle) { ManualLogSource log2 = Plugin.Log; val2 = new BepInExInfoLogInterpolatedStringHandler(52, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted("[Portals][destination]"); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" a destination window is already open ("); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(_state); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(") - ignoring."); } log2.LogInfo(val2); return false; } MenuManager instance; try { instance = MenuManager.Instance; } catch (Exception ex) { ManualLogSource log3 = Plugin.Log; BepInExErrorLogInterpolatedStringHandler val3 = new BepInExErrorLogInterpolatedStringHandler(37, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted("[Portals][destination]"); ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral(" reading MenuManager.Instance threw: "); ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted(ex); } log3.LogError(val3); return false; } bool flag2 = default(bool); if ((Object)(object)instance == (Object)null) { ManualLogSource log4 = Plugin.Log; BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(67, 1, ref flag2); if (flag2) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][destination]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" there is no MenuManager - the destination window cannot be opened."); } log4.LogWarning(val); return false; } InputFieldConfirmActionMenu prefab; try { prefab = instance.GetPrefab(); } catch (Exception ex2) { ManualLogSource log5 = Plugin.Log; BepInExErrorLogInterpolatedStringHandler val3 = new BepInExErrorLogInterpolatedStringHandler(61, 2, ref flag2); if (flag2) { ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted("[Portals][destination]"); ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral(" MenuManager.GetPrefab() threw: "); ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted(ex2); } log5.LogError(val3); return false; } if ((Object)(object)prefab == (Object)null) { ManualLogSource log6 = Plugin.Log; BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(97, 1, ref flag2); if (flag2) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][destination]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" MenuManager has no InputFieldConfirmActionMenu prefab - the destination window cannot be opened."); } log6.LogWarning(val); return false; } InputFieldConfirmActionMenuParameters val4; try { val4 = new InputFieldConfirmActionMenuParameters { Title = "Select Destination", Message = string.Empty, ConfirmMessage = "common.confirm", CancelMessage = "common.cancel", CloseOnConfirm = false, HideCancelButton = false, DontCloseOnEscape = false, defaultText = string.Empty, placeholderText = string.Empty, checkForProfanities = false }; } catch (Exception ex3) { ManualLogSource log7 = Plugin.Log; BepInExErrorLogInterpolatedStringHandler val3 = new BepInExErrorLogInterpolatedStringHandler(53, 2, ref flag2); if (flag2) { ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted("[Portals][destination]"); ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral(" building the destination window's parameters threw: "); ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted(ex3); } log7.LogError(val3); return false; } _cancelHandler = HandleCancel; try { ((ConfirmActionMenuParameters)val4).OnCancel = DelegateSupport.ConvertDelegate>((Delegate)_cancelHandler); } catch (Exception ex4) { ManualLogSource log8 = Plugin.Log; BepInExErrorLogInterpolatedStringHandler val3 = new BepInExErrorLogInterpolatedStringHandler(39, 2, ref flag2); if (flag2) { ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted("[Portals][destination]"); ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral(" converting the cancel callback threw: "); ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted(ex4); } log8.LogError(val3); Forget(); return false; } Menu val5; try { val5 = instance.OpenMenuPrefab((Menu)(object)prefab, (MenuParameters)(object)val4); } catch (Exception ex5) { ManualLogSource log9 = Plugin.Log; BepInExErrorLogInterpolatedStringHandler val3 = new BepInExErrorLogInterpolatedStringHandler(39, 2, ref flag2); if (flag2) { ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted("[Portals][destination]"); ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral(" opening the destination window threw: "); ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted(ex5); } log9.LogError(val3); Forget(); return false; } if ((Object)(object)val5 == (Object)null) { ManualLogSource log10 = Plugin.Log; BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(71, 1, ref flag2); if (flag2) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][destination]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" OpenMenuPrefab returned nothing - the destination window did not open."); } log10.LogWarning(val); Forget(); return false; } _menu = val5; try { _menuPointer = ((Il2CppObjectBase)val5).Pointer; _dialog = ((Il2CppObjectBase)val5).TryCast(); } catch (Exception ex6) { ManualLogSource log11 = Plugin.Log; BepInExErrorLogInterpolatedStringHandler val3 = new BepInExErrorLogInterpolatedStringHandler(32, 2, ref flag2); if (flag2) { ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted("[Portals][destination]"); ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral(" reading the opened menu threw: "); ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted(ex6); } log11.LogError(val3); CloseAndFail(); return false; } _onPick = onPick; _ordered = DestinationList.Order(choices); _selectedOrder = preselected?.AttunedOrder ?? current.DestinationOrder; _state = State.WaitingForMenu; _openedAt = SafeNow(); _lastAliveAt = _openedAt; ManualLogSource log12 = Plugin.Log; val2 = new BepInExInfoLogInterpolatedStringHandler(35, 3, ref flag2); if (flag2) { ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted("[Portals][destination]"); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" window opening for "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(current.Name); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" with "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(_ordered.Count); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" choices."); } log12.LogInfo(val2); return true; } internal static void Tick() { //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Expected O, but got Unknown //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Expected O, but got Unknown //IL_013c: Unknown result type (might be due to invalid IL or missing references) //IL_0143: Expected O, but got Unknown //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Expected O, but got Unknown if (_state == State.Idle) { return; } bool flag2 = default(bool); if (_state == State.WaitingForMenu) { bool flag; try { flag = (Object)(object)_menu != (Object)null && _menu.IsActive; } catch (Exception ex) { ManualLogSource log = Plugin.Log; BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(35, 2, ref flag2); if (flag2) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][destination]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" reading the window's state threw: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex); } log.LogError(val); flag = false; } if (flag) { try { Furnish(); } catch (Exception ex2) { ManualLogSource log2 = Plugin.Log; BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(40, 2, ref flag2); if (flag2) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][destination]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" building the destination window threw: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex2); } log2.LogError(val); CloseAndFail(); return; } _state = State.Ready; _lastAliveAt = SafeNow(); } else if (SafeNow() - _openedAt > 5f) { ManualLogSource log3 = Plugin.Log; BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(68, 2, ref flag2); if (flag2) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("[Portals][destination]"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" the window did not go active within "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(5f, "F0"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("s of unscaled time - giving up."); } log3.LogError(val); CloseAndFail(); } } else if (HasVanished()) { ManualLogSource log4 = Plugin.Log; BepInExInfoLogInterpolatedStringHandler val2 = new BepInExInfoLogInterpolatedStringHandler(76, 1, ref flag2); if (flag2) { ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted("[Portals][destination]"); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" the destination window vanished without a callback - dropping its tracking."); } log4.LogInfo(val2); Forget(); } } private static void Furnish() { //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: 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_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Expected O, but got Unknown //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004d: 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_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Expected O, but got Unknown //IL_0136: Unknown result type (might be due to invalid IL or missing references) //IL_013d: Expected O, but got Unknown //IL_01ed: Unknown result type (might be due to invalid IL or missing references) //IL_01ee: Unknown result type (might be due to invalid IL or missing references) //IL_01ef: Unknown result type (might be due to invalid IL or missing references) //IL_01f0: Unknown result type (might be due to invalid IL or missing references) //IL_01f2: Unknown result type (might be due to invalid IL or missing references) GameObject val = ResolveInputFieldDiv(); RectTransform val2 = (((Object)(object)val == (Object)null) ? null : AsRect(val.transform)); Vector2 anchorMin; Vector2 anchorMax; Vector2 pivot; Vector2 anchoredPosition; Vector2 sizeDelta; Transform val3; bool flag = default(bool); BepInExInfoLogInterpolatedStringHandler val4; if ((Object)(object)val2 != (Object)null && (Object)(object)((Transform)val2).parent != (Object)null) { anchorMin = val2.anchorMin; anchorMax = val2.anchorMax; pivot = val2.pivot; anchoredPosition = val2.anchoredPosition; sizeDelta = val2.sizeDelta; val3 = ((Transform)val2).parent; ManualLogSource log = Plugin.Log; val4 = new BepInExInfoLogInterpolatedStringHandler(49, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val4).AppendFormatted("[Portals][destination]"); ((BepInExLogInterpolatedStringHandler)val4).AppendLiteral(" placement read from the live InputFieldDiv rect."); } log.LogInfo(val4); } else { anchorMin = FallbackAnchorMin; anchorMax = FallbackAnchorMax; pivot = FallbackPivot; anchoredPosition = FallbackAnchoredPosition; sizeDelta = FallbackSizeDelta; val3 = FindPanel(); ManualLogSource log2 = Plugin.Log; BepInExWarningLogInterpolatedStringHandler val5 = new BepInExWarningLogInterpolatedStringHandler(98, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val5).AppendFormatted("[Portals][destination]"); ((BepInExLogInterpolatedStringHandler)val5).AppendLiteral(" the live InputFieldDiv rect could not be read - using the captured placement on the menu's Panel."); } log2.LogWarning(val5); } if ((Object)(object)val3 == (Object)null) { throw new InvalidOperationException("the destination window has no Panel to host the pulldown"); } string route; TMP_Dropdown obj = FindLiveDropdown(out route); if ((Object)(object)obj == (Object)null) { throw new InvalidOperationException("no live pulldown could be found to clone"); } ManualLogSource log3 = Plugin.Log; val4 = new BepInExInfoLogInterpolatedStringHandler(23, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val4).AppendFormatted("[Portals][destination]"); ((BepInExLogInterpolatedStringHandler)val4).AppendLiteral(" pulldown cloned from "); ((BepInExLogInterpolatedStringHandler)val4).AppendFormatted(route); ((BepInExLogInterpolatedStringHandler)val4).AppendLiteral("."); } log3.LogInfo(val4); GameObject obj2 = Object.Instantiate(((Component)obj).gameObject); if ((Object)(object)obj2 == (Object)null) { throw new InvalidOperationException("cloning the live pulldown returned nothing"); } ((Object)obj2).name = "PortalDestinationDropdown"; obj2.transform.SetParent(val3, false); obj2.SetActive(true); _dropdown = obj2.GetComponent(); if ((Object)(object)_dropdown == (Object)null) { throw new InvalidOperationException("the cloned pulldown carries no TMP_Dropdown"); } if ((Object)(object)val != (Object)null) { val.SetActive(false); } HideSourceCaption(obj2); PlaceClone(obj2, anchorMin, anchorMax, pivot, anchoredPosition, sizeDelta); PopulateOptions(); ResolveConfirmButton(); AttachValueChanged(); } private static void HideSourceCaption(GameObject cloneObject) { //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Expected O, but got Unknown try { Transform val = cloneObject.transform.Find("Description"); if ((Object)(object)val != (Object)null) { ((Component)val).gameObject.SetActive(false); } } catch (Exception ex) { ManualLogSource log = Plugin.Log; bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val2 = new BepInExWarningLogInterpolatedStringHandler(42, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted("[Portals][destination]"); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" hiding the clone's source caption threw: "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(ex.Message); } log.LogWarning(val2); } } private static void PlaceClone(GameObject cloneObject, Vector2 anchorMin, Vector2 anchorMax, Vector2 pivot, Vector2 anchoredPosition, Vector2 sizeDelta) { //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Expected O, but got Unknown //IL_007a: 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_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Expected O, but got Unknown //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Unknown result type (might be due to invalid IL or missing references) RectTransform val = AsRect(cloneObject.transform); if ((Object)(object)val == (Object)null) { throw new InvalidOperationException("the cloned pulldown's transform is not a RectTransform"); } bool flag = default(bool); try { ContentSizeFitter component = cloneObject.GetComponent(); if ((Object)(object)component != (Object)null) { ((Behaviour)component).enabled = false; } } catch (Exception ex) { ManualLogSource log = Plugin.Log; BepInExWarningLogInterpolatedStringHandler val2 = new BepInExWarningLogInterpolatedStringHandler(48, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted("[Portals][destination]"); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" disabling the clone's ContentSizeFitter threw: "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(ex.Message); } log.LogWarning(val2); } val.anchorMin = anchorMin; val.anchorMax = anchorMax; val.pivot = pivot; val.anchoredPosition = anchoredPosition; val.sizeDelta = sizeDelta; ManualLogSource log2 = Plugin.Log; BepInExInfoLogInterpolatedStringHandler val3 = new BepInExInfoLogInterpolatedStringHandler(75, 6, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted("[Portals][destination]"); ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral(" pulldown placed: anchoredPosition="); ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted(val.anchoredPosition); ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral(" sizeDelta="); ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted(val.sizeDelta); ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral(" "); ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral("anchorMin="); ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted(val.anchorMin); ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral(" anchorMax="); ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted(val.anchorMax); ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral(" pivot="); ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted(val.pivot); } log2.LogInfo(val3); } private static void PopulateOptions() { //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Expected O, but got Unknown //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Expected O, but got Unknown List list = DestinationList.Labels(_ordered); int num = -1; if (_selectedOrder > 0) { for (int i = 0; i < _ordered.Count; i++) { if (_ordered[i].AttunedOrder == _selectedOrder) { num = i; break; } } } _hasBlank = num < 0; _dropdown.options.Clear(); if (_hasBlank) { _dropdown.options.Add(new OptionData(string.Empty)); } for (int j = 0; j < list.Count; j++) { _dropdown.options.Add(new OptionData(list[j])); } _dropdown.value = ((!_hasBlank) ? num : 0); _dropdown.RefreshShownValue(); } private static void ResolveConfirmButton() { //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Expected O, but got Unknown //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Expected O, but got Unknown _confirmButton = null; RectTransform val = (((Object)(object)_dialog == (Object)null) ? null : ((ConfirmActionMenu)_dialog).ConfirmButton); bool flag = default(bool); if ((Object)(object)val == (Object)null) { ManualLogSource log = Plugin.Log; BepInExWarningLogInterpolatedStringHandler val2 = new BepInExWarningLogInterpolatedStringHandler(63, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted("[Portals][destination]"); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" the window exposes no ConfirmButton - confirm cannot be gated."); } log.LogWarning(val2); return; } _confirmButton = ((Component)val).GetComponent