using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Pigeon;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Controls;
using UnityEngine.UI;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyCompany("CompareUpgrades")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("CompareUpgrades")]
[assembly: AssemblyTitle("CompareUpgrades")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Embedded]
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
public static class CompareController
{
private static UpgradeInstance lockedUpgrade;
private static SelectionMark lockMark;
private static GearUpgradeUI markedUi;
public static UpgradeInstance LockedUpgrade => lockedUpgrade;
public static bool HasLock => lockedUpgrade != null;
public static void Tick()
{
if (!IsGearDetailsOpen(out var _))
{
if (HasLock)
{
ClearLock();
}
}
else if (lockedUpgrade != null && (Object)(object)lockedUpgrade.Upgrade == (Object)null)
{
ClearLock();
}
else
{
HandleHotkey();
UpdateComparisonView();
UpdateLockMark();
}
}
public static void OnGearWindowReset()
{
ClearLock();
}
public static void Shutdown()
{
ClearLock();
CompareDisplay.Destroy();
}
public static void OnMainHoverRefreshed()
{
if (HasLock && CompareDisplay.IsVisible)
{
CompareDisplay.RefreshIfVisible();
}
}
private static void HandleHotkey()
{
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
Keyboard current = Keyboard.current;
if (current == null)
{
return;
}
Key compareKey = CompareUpgradesPlugin.CompareKey;
if ((int)compareKey == 0)
{
return;
}
KeyControl val = current[compareKey];
if (val == null || !((ButtonControl)val).wasPressedThisFrame || IsSearchFocused())
{
return;
}
if (HasLock)
{
ClearLock();
return;
}
GearUpgradeUI hoveredUpgradeUi = GetHoveredUpgradeUi();
if ((Object)(object)hoveredUpgradeUi != (Object)null && ((HoverInfoUpgrade)hoveredUpgradeUi).Upgrade != null)
{
Lock(((HoverInfoUpgrade)hoveredUpgradeUi).Upgrade, hoveredUpgradeUi);
}
}
private static void UpdateComparisonView()
{
if (!HasLock)
{
CompareDisplay.Hide();
return;
}
GearUpgradeUI hoveredUpgradeUi = GetHoveredUpgradeUi();
bool num = (Object)(object)hoveredUpgradeUi != (Object)null && ((HoverInfoUpgrade)hoveredUpgradeUi).Upgrade != null && ((HoverInfoUpgrade)hoveredUpgradeUi).Upgrade != lockedUpgrade;
HoverInfoDisplay instance = HoverInfoDisplay.Instance;
bool flag = (Object)(object)instance != (Object)null && ((Component)instance).gameObject.activeSelf && !CompareDisplay.IsCompareInstance(instance) && (Object)(object)instance.SelectedInfo != (Object)null;
if (num && flag)
{
CompareDisplay.Show(lockedUpgrade);
CompareDisplay.TickPosition();
}
else
{
CompareDisplay.Hide();
}
}
private static void Lock(UpgradeInstance upgrade, GearUpgradeUI ui)
{
lockedUpgrade = upgrade;
CompareDisplay.EnsureCreated();
ApplyLockMark(ui);
ManualLogSource log = CompareUpgradesPlugin.Log;
if (log != null)
{
log.LogInfo((object)("Locked upgrade for comparison: " + GetUpgradeName(upgrade)));
}
}
private static void ClearLock()
{
if (lockedUpgrade != null)
{
ManualLogSource log = CompareUpgradesPlugin.Log;
if (log != null)
{
log.LogInfo((object)"Unlocked upgrade comparison.");
}
}
lockedUpgrade = null;
CompareDisplay.Hide();
ReleaseLockMark();
}
private static void UpdateLockMark()
{
if (!HasLock)
{
ReleaseLockMark();
return;
}
GearUpgradeUI val = FindUiForLocked();
if ((Object)(object)val != (Object)(object)markedUi)
{
ApplyLockMark(val);
}
}
private static void ApplyLockMark(GearUpgradeUI ui)
{
//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_004d: Expected O, but got Unknown
ReleaseLockMark();
markedUi = ui;
if ((Object)(object)ui == (Object)null || (Object)(object)Menu.Instance == (Object)null)
{
return;
}
try
{
lockMark = Menu.Instance.GetSelectionMark();
lockMark.Setup((RectTransform)((Component)ui).transform, Vector2.zero, true);
}
catch
{
lockMark = null;
}
}
private static void ReleaseLockMark()
{
if ((Object)(object)lockMark != (Object)null)
{
try
{
lockMark.Release();
}
catch
{
}
lockMark = null;
}
markedUi = null;
}
private static GearUpgradeUI FindUiForLocked()
{
if (lockedUpgrade == null)
{
return null;
}
GearUpgradeUI hoveredUpgradeUi = GetHoveredUpgradeUi();
if ((Object)(object)hoveredUpgradeUi != (Object)null && ((HoverInfoUpgrade)hoveredUpgradeUi).Upgrade == lockedUpgrade)
{
return hoveredUpgradeUi;
}
if ((Object)(object)markedUi != (Object)null && Object.op_Implicit((Object)(object)markedUi) && ((Component)markedUi).gameObject.activeInHierarchy && ((HoverInfoUpgrade)markedUi).Upgrade == lockedUpgrade)
{
return markedUi;
}
return null;
}
private static GearUpgradeUI GetHoveredUpgradeUi()
{
GearUpgradeUI val = default(GearUpgradeUI);
if (UIRaycaster.RaycastForComponent<GearUpgradeUI>(ref val) && (Object)(object)val != (Object)null)
{
return val;
}
return null;
}
private static bool IsGearDetailsOpen(out GearDetailsWindow window)
{
window = null;
if ((Object)(object)Menu.Instance == (Object)null || !Menu.Instance.IsOpen)
{
return false;
}
if ((Object)(object)Menu.Instance.WindowSystem == (Object)null)
{
return false;
}
Window top = Menu.Instance.WindowSystem.GetTop();
window = (GearDetailsWindow)(object)((top is GearDetailsWindow) ? top : null);
return (Object)(object)window != (Object)null;
}
private static bool IsSearchFocused()
{
GameObject val = (((Object)(object)EventSystem.current != (Object)null) ? EventSystem.current.currentSelectedGameObject : null);
if ((Object)(object)val == (Object)null)
{
return false;
}
if ((Object)(object)val.GetComponent<InputField>() != (Object)null)
{
return true;
}
MonoBehaviour[] components = val.GetComponents<MonoBehaviour>();
for (int i = 0; i < components.Length; i++)
{
if (!((Object)(object)components[i] == (Object)null))
{
string name = ((object)components[i]).GetType().Name;
if (name == "TMP_InputField" || name == "InputField")
{
return true;
}
}
}
return false;
}
private static string GetUpgradeName(UpgradeInstance upgrade)
{
try
{
if ((Object)(object)((upgrade != null) ? upgrade.Upgrade : null) != (Object)null)
{
return upgrade.Upgrade.GetInstanceName(upgrade);
}
}
catch
{
}
return "(unknown)";
}
}
public static class CompareDisplay
{
private const float Gap = 24f;
private const float EdgePadding = 20f;
private static HoverInfoDisplay clone;
private static LockedUpgradeProxy proxy;
private static GameObject proxyRoot;
private static bool visible;
private static UpgradeInstance shownUpgrade;
public static HoverInfoDisplay Clone => clone;
public static bool IsVisible => visible;
public static bool IsCompareInstance(HoverInfoDisplay display)
{
if ((Object)(object)clone != (Object)null)
{
return (Object)(object)display == (Object)(object)clone;
}
return false;
}
public static void EnsureCreated()
{
if ((Object)(object)clone != (Object)null)
{
return;
}
HoverInfoDisplay instance = HoverInfoDisplay.Instance;
if ((Object)(object)instance == (Object)null)
{
return;
}
Transform parent = ((Component)instance).transform.parent;
if (!((Object)(object)parent == (Object)null))
{
clone = Object.Instantiate<HoverInfoDisplay>(instance, parent);
((Object)((Component)clone).gameObject).name = "CompareUpgrades_HoverInfoDisplay";
RestoreMainInstance(instance);
DisableRaycasts(((Component)clone).gameObject);
try
{
clone.Deactivate();
}
catch
{
((Component)clone).gameObject.SetActive(false);
}
EnsureProxy();
ManualLogSource log = CompareUpgradesPlugin.Log;
if (log != null)
{
log.LogInfo((object)"Created comparison hover display.");
}
}
}
public static void Show(UpgradeInstance upgrade)
{
if (upgrade == null)
{
return;
}
EnsureCreated();
if ((Object)(object)clone == (Object)null || (Object)(object)proxy == (Object)null)
{
return;
}
bool num = !visible || shownUpgrade != upgrade || !((Component)clone).gameObject.activeSelf;
proxy.SetLockedUpgrade(upgrade);
shownUpgrade = upgrade;
if (num)
{
try
{
clone.ShowInfo((HoverInfo)(object)proxy);
}
catch (Exception ex)
{
ManualLogSource log = CompareUpgradesPlugin.Log;
if (log != null)
{
log.LogWarning((object)("ShowInfo on compare display failed: " + ex.Message));
}
return;
}
}
visible = ((Component)clone).gameObject.activeSelf;
if (visible)
{
PositionBesideMain();
}
}
public static void RefreshIfVisible()
{
if (!visible || (Object)(object)clone == (Object)null || (Object)(object)proxy == (Object)null || shownUpgrade == null)
{
return;
}
try
{
clone.Refresh();
PositionBesideMain();
}
catch (Exception ex)
{
ManualLogSource log = CompareUpgradesPlugin.Log;
if (log != null)
{
log.LogWarning((object)("Refresh compare display failed: " + ex.Message));
}
}
}
public static void Hide()
{
if ((Object)(object)clone == (Object)null)
{
visible = false;
shownUpgrade = null;
return;
}
if (((Component)clone).gameObject.activeSelf)
{
try
{
clone.Deactivate();
}
catch
{
((Component)clone).gameObject.SetActive(false);
}
}
visible = false;
shownUpgrade = null;
}
public static void TickPosition()
{
if (visible && !((Object)(object)clone == (Object)null) && ((Component)clone).gameObject.activeSelf)
{
PositionBesideMain();
}
}
public static void Destroy()
{
Hide();
if ((Object)(object)clone != (Object)null)
{
Object.Destroy((Object)(object)((Component)clone).gameObject);
clone = null;
}
if ((Object)(object)proxyRoot != (Object)null)
{
Object.Destroy((Object)(object)proxyRoot);
proxyRoot = null;
proxy = null;
}
shownUpgrade = null;
visible = false;
}
private static void EnsureProxy()
{
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_001d: Expected O, but got Unknown
if (!((Object)(object)proxy != (Object)null))
{
proxyRoot = new GameObject("CompareUpgrades_LockedProxy");
Object.DontDestroyOnLoad((Object)(object)proxyRoot);
((Object)proxyRoot).hideFlags = (HideFlags)61;
proxy = proxyRoot.AddComponent<LockedUpgradeProxy>();
}
}
private static void RestoreMainInstance(HoverInfoDisplay main)
{
try
{
PropertyInfo propertyInfo = AccessTools.Property(typeof(HoverInfoDisplay), "Instance");
if (propertyInfo != null)
{
propertyInfo.SetValue(null, main, null);
return;
}
}
catch (Exception ex)
{
ManualLogSource log = CompareUpgradesPlugin.Log;
if (log != null)
{
log.LogWarning((object)("Failed to restore HoverInfoDisplay.Instance via AccessTools: " + ex.Message));
}
}
try
{
typeof(HoverInfoDisplay).GetProperty("Instance", BindingFlags.Static | BindingFlags.Public)?.SetValue(null, main, null);
}
catch (Exception arg)
{
ManualLogSource log2 = CompareUpgradesPlugin.Log;
if (log2 != null)
{
log2.LogError((object)$"Failed to restore HoverInfoDisplay.Instance: {arg}");
}
}
}
private static void DisableRaycasts(GameObject root)
{
Graphic[] componentsInChildren = root.GetComponentsInChildren<Graphic>(true);
for (int i = 0; i < componentsInChildren.Length; i++)
{
componentsInChildren[i].raycastTarget = false;
}
CanvasGroup[] componentsInChildren2 = root.GetComponentsInChildren<CanvasGroup>(true);
for (int j = 0; j < componentsInChildren2.Length; j++)
{
componentsInChildren2[j].blocksRaycasts = false;
componentsInChildren2[j].interactable = false;
}
}
private static void PositionBesideMain()
{
//IL_0075: Unknown result type (might be due to invalid IL or missing references)
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
//IL_007d: Unknown result type (might be due to invalid IL or missing references)
//IL_0082: Unknown result type (might be due to invalid IL or missing references)
//IL_0085: Unknown result type (might be due to invalid IL or missing references)
//IL_008a: Unknown result type (might be due to invalid IL or missing references)
//IL_008d: Unknown result type (might be due to invalid IL or missing references)
//IL_0092: Unknown result type (might be due to invalid IL or missing references)
//IL_0096: Unknown result type (might be due to invalid IL or missing references)
//IL_009b: Unknown result type (might be due to invalid IL or missing references)
//IL_009f: Unknown result type (might be due to invalid IL or missing references)
//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
//IL_00de: Unknown result type (might be due to invalid IL or missing references)
//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
//IL_0101: Unknown result type (might be due to invalid IL or missing references)
//IL_0103: Unknown result type (might be due to invalid IL or missing references)
//IL_012a: Unknown result type (might be due to invalid IL or missing references)
//IL_010c: Unknown result type (might be due to invalid IL or missing references)
//IL_010e: Unknown result type (might be due to invalid IL or missing references)
//IL_0110: Unknown result type (might be due to invalid IL or missing references)
//IL_012c: Unknown result type (might be due to invalid IL or missing references)
//IL_0130: Unknown result type (might be due to invalid IL or missing references)
//IL_0137: Unknown result type (might be due to invalid IL or missing references)
//IL_013e: Unknown result type (might be due to invalid IL or missing references)
//IL_0150: Unknown result type (might be due to invalid IL or missing references)
//IL_0126: Unknown result type (might be due to invalid IL or missing references)
//IL_0119: Unknown result type (might be due to invalid IL or missing references)
//IL_011b: Unknown result type (might be due to invalid IL or missing references)
//IL_011d: Unknown result type (might be due to invalid IL or missing references)
//IL_011f: Unknown result type (might be due to invalid IL or missing references)
HoverInfoDisplay instance = HoverInfoDisplay.Instance;
if ((Object)(object)instance == (Object)null || (Object)(object)clone == (Object)null || (Object)(object)instance == (Object)(object)clone || !((Component)instance).gameObject.activeSelf)
{
return;
}
RectTransform rectTransform = instance.RectTransform;
RectTransform rectTransform2 = clone.RectTransform;
if (!((Object)(object)rectTransform == (Object)null) && !((Object)(object)rectTransform2 == (Object)null))
{
Transform parent = ((Transform)rectTransform).parent;
RectTransform val = (RectTransform)(object)((parent is RectTransform) ? parent : null);
if (!((Object)(object)val == (Object)null))
{
Vector2 anchoredPosition = rectTransform.anchoredPosition;
Vector2 sizeDelta = rectTransform.sizeDelta;
Vector2 sizeDelta2 = rectTransform2.sizeDelta;
Rect rect = val.rect;
Vector2 size = ((Rect)(ref rect)).size;
Vector2 val2 = default(Vector2);
((Vector2)(ref val2))..ctor(anchoredPosition.x + (sizeDelta.x + sizeDelta2.x) * 0.5f + 24f, anchoredPosition.y);
Vector2 val3 = default(Vector2);
((Vector2)(ref val3))..ctor(anchoredPosition.x - (sizeDelta.x + sizeDelta2.x) * 0.5f - 24f, anchoredPosition.y);
Vector2 val4 = (Fits(val2, sizeDelta2, size) ? val2 : (Fits(val3, sizeDelta2, size) ? val3 : Clamp(val2, sizeDelta2, size)));
val4.y = ClampY(val4.y, sizeDelta2.y, size.y);
rectTransform2.anchoredPosition = val4;
}
}
}
private static bool Fits(Vector2 center, Vector2 size, Vector2 bounds)
{
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
//IL_0020: Unknown result type (might be due to invalid IL or missing references)
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
//IL_0047: Unknown result type (might be due to invalid IL or missing references)
//IL_0055: Unknown result type (might be due to invalid IL or missing references)
//IL_005b: Unknown result type (might be due to invalid IL or missing references)
float num = bounds.x * 0.5f;
float num2 = bounds.y * 0.5f;
float num3 = center.x - size.x * 0.5f;
float num4 = center.x + size.x * 0.5f;
float num5 = center.y - size.y * 0.5f;
float num6 = center.y + size.y * 0.5f;
if (num3 >= 0f - num + 20f && num4 <= num - 20f && num5 >= 0f - num2 + 20f)
{
return num6 <= num2 - 20f;
}
return false;
}
private static Vector2 Clamp(Vector2 center, Vector2 size, Vector2 bounds)
{
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
//IL_0057: Unknown result type (might be due to invalid IL or missing references)
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
//IL_0073: Unknown result type (might be due to invalid IL or missing references)
//IL_0090: Unknown result type (might be due to invalid IL or missing references)
float num = bounds.x * 0.5f;
float num2 = bounds.y * 0.5f;
center.x = Mathf.Clamp(center.x, 0f - num + size.x * 0.5f + 20f, num - size.x * 0.5f - 20f);
center.y = Mathf.Clamp(center.y, 0f - num2 + size.y * 0.5f + 20f, num2 - size.y * 0.5f - 20f);
return center;
}
private static float ClampY(float y, float height, float boundsY)
{
float num = boundsY * 0.5f;
return Mathf.Clamp(y, 0f - num + height * 0.5f + 20f, num - height * 0.5f - 20f);
}
}
internal static class ComparePatches
{
[HarmonyPatch(typeof(HoverInfoDisplay), "UpdatePosition")]
[HarmonyPrefix]
private static bool UpdatePositionPrefix(HoverInfoDisplay __instance)
{
if (CompareDisplay.IsCompareInstance(__instance))
{
return false;
}
return true;
}
[HarmonyPatch(typeof(HoverInfoDisplay), "Refresh")]
[HarmonyPostfix]
private static void RefreshPostfix(HoverInfoDisplay __instance)
{
if (!CompareDisplay.IsCompareInstance(__instance))
{
CompareController.OnMainHoverRefreshed();
}
}
[HarmonyPatch(typeof(GearDetailsWindow), "Setup")]
[HarmonyPostfix]
private static void GearDetailsSetupPostfix()
{
CompareController.OnGearWindowReset();
}
[HarmonyPatch(typeof(GearDetailsWindow), "OnCloseCallback")]
[HarmonyPostfix]
private static void GearDetailsClosePostfix()
{
CompareController.OnGearWindowReset();
}
}
public sealed class LockedUpgradeProxy : HoverInfoUpgrade
{
public override bool EnableHoverInfoEvents => false;
public override bool GetPrimaryBinding(out InputAction binding, out string label)
{
binding = null;
label = null;
return false;
}
public override bool GetSecondaryBinding(out InputAction binding, out string label)
{
binding = null;
label = null;
return false;
}
public override int GetAdditionalBindingCount()
{
return 0;
}
public override bool HasUnlockAction(out UnlockActionParams data)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
data = default(UnlockActionParams);
return false;
}
public override bool HasUnlockInfo(out string text)
{
text = null;
return false;
}
public void SetLockedUpgrade(UpgradeInstance upgrade)
{
((HoverInfoUpgrade)this).Upgrade = upgrade;
}
}
[BepInPlugin("sparroh.compareupgrades", "CompareUpgrades", "2.0.0")]
[MycoMod(/*Could not decode attribute arguments.*/)]
public class CompareUpgradesPlugin : BaseUnityPlugin
{
public const string PluginGUID = "sparroh.compareupgrades";
public const string PluginName = "CompareUpgrades";
public const string PluginVersion = "2.0.0";
internal static ManualLogSource Log;
internal static CompareUpgradesPlugin Instance;
private ConfigEntry<Key> compareKey;
private Harmony harmony;
internal static Key CompareKey
{
get
{
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
if (!((Object)(object)Instance != (Object)null))
{
return (Key)17;
}
return Instance.compareKey.Value;
}
}
private void Awake()
{
//IL_0039: Unknown result type (might be due to invalid IL or missing references)
//IL_0043: Expected O, but got Unknown
Instance = this;
Log = ((BaseUnityPlugin)this).Logger;
compareKey = ((BaseUnityPlugin)this).Config.Bind<Key>("Keybinds", "Compare Key", (Key)17, "Hotkey to lock/unlock an upgrade for side-by-side comparison while the gear details window is open.");
try
{
harmony = new Harmony("sparroh.compareupgrades");
harmony.PatchAll(typeof(ComparePatches));
Log.LogInfo((object)"CompareUpgrades v2.0.0 loaded.");
}
catch (Exception arg)
{
Log.LogError((object)$"Failed to initialize: {arg}");
}
}
private void Update()
{
try
{
CompareController.Tick();
}
catch (Exception arg)
{
Log.LogError((object)$"CompareController tick failed: {arg}");
}
}
private void OnDestroy()
{
try
{
CompareController.Shutdown();
}
catch (Exception arg)
{
Log.LogError((object)$"Shutdown failed: {arg}");
}
try
{
Harmony obj = harmony;
if (obj != null)
{
obj.UnpatchSelf();
}
}
catch (Exception arg2)
{
Log.LogError((object)$"Unpatch failed: {arg2}");
}
Instance = null;
}
}
namespace CompareUpgrades
{
public static class MyPluginInfo
{
public const string PLUGIN_GUID = "CompareUpgrades";
public const string PLUGIN_NAME = "CompareUpgrades";
public const string PLUGIN_VERSION = "1.0.0";
}
}
namespace System.Runtime.CompilerServices
{
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
internal sealed class IgnoresAccessChecksToAttribute : Attribute
{
public IgnoresAccessChecksToAttribute(string assemblyName)
{
}
}
}