Decompiled source of AskaExpandedParty v0.4.0

BepInEx\plugins\AskaExpandedParty\AskaExpandedParty.dll

Decompiled 4 days ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Core.Logging.Interpolation;
using BepInEx.Logging;
using BepInEx.Unity.IL2CPP;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace AskaExpandedParty
{
	[BepInPlugin("com.community.askaexpandedparty", "Aska Expanded Party", "0.4.0")]
	public class ExpandedPartyPlugin : BasePlugin
	{
		public const string PluginGuid = "com.community.askaexpandedparty";

		public const string PluginName = "Aska Expanded Party";

		public const string PluginVersion = "0.4.0";

		internal static ManualLogSource Log;

		public static ConfigEntry<bool> CfgEnabled;

		public static ConfigEntry<int> CfgPartyCapacity;

		public static ConfigEntry<bool> CfgDebugLogging;

		public static ConfigEntry<bool> CfgScalePartyWidget;

		public static ConfigEntry<float> CfgTwoColumnLeftShift;

		public override void Load()
		{
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Expected O, but got Unknown
			//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: Expected O, but got Unknown
			//IL_024e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0255: Expected O, but got Unknown
			//IL_00df: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e5: Expected O, but got Unknown
			//IL_01e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ef: Expected O, but got Unknown
			Log = ((BasePlugin)this).Log;
			CfgEnabled = ((BasePlugin)this).Config.Bind<bool>("General", "Enabled", true, "Enable expanded player party capacity.");
			CfgPartyCapacity = ((BasePlugin)this).Config.Bind<int>("General", "PartyCapacity", 6, new ConfigDescription("Maximum number of NPC villagers allowed in the player party. Vanilla is 3.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(3, 20), Array.Empty<object>()));
			CfgDebugLogging = ((BasePlugin)this).Config.Bind<bool>("Diagnostics", "DebugLogging", false, "Log every party-capacity override.");
			CfgScalePartyWidget = ((BasePlugin)this).Config.Bind<bool>("UI", "ScalePartyWidget", true, "Scale the party HUD member container down when PartyCapacity is above 3.");
			CfgTwoColumnLeftShift = ((BasePlugin)this).Config.Bind<float>("UI", "TwoColumnLeftShift", 230f, new ConfigDescription("Pixels to shift the party HUD container left when it switches to two-column mode (party > 10). Default 230 pulls the right-edge widget toward screen center so the second column (left of the first) is fully visible. Reduce toward 0 if the widget sits too far from the right edge; increase up to 600 if the second column still clips.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 600f), Array.Empty<object>()));
			bool flag = default(bool);
			try
			{
				Harmony harmony = new Harmony("com.community.askaexpandedparty");
				Type type = AccessTools.TypeByName("SSSGame.PlayerParty");
				if (type == null)
				{
					Log.LogError((object)"Could not find SSSGame.PlayerParty. Mod cannot function.");
					return;
				}
				NativePartyHardcapPatch.Apply(type);
				PatchMethod(harmony, type, "Spawned", typeof(PlayerPartyLifecyclePatch), "SpawnedPostfix");
				PatchMethod(harmony, type, "Despawned", typeof(PlayerPartyLifecyclePatch), "DespawnedPostfix");
				PatchMethod(harmony, type, "GetAgentsCapacity", typeof(PlayerPartyCapacityPatch), "Postfix");
				Type type2 = AccessTools.TypeByName("SSSGame.PlayerPartyWidget");
				if (type2 != null)
				{
					PatchMethod(harmony, type2, "Activate", typeof(PlayerPartyWidgetPatch), "ActivatePostfix");
					PatchMethod(harmony, type2, "_OnVillagerAdded", typeof(PlayerPartyWidgetPatch), "OnVillagerAddedPrefix", "WidgetChangedPostfix");
					PatchMethod(harmony, type2, "_OnVillagerRemoved", typeof(PlayerPartyWidgetPatch), "WidgetChangedPostfix");
				}
				else
				{
					Log.LogWarning((object)"Could not find SSSGame.PlayerPartyWidget. Party HUD scaling disabled.");
				}
				ManualLogSource log = Log;
				BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(25, 3, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>("Aska Expanded Party");
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>("0.4.0");
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" loaded. PartyCapacity=");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<int>(CfgPartyCapacity.Value);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(".");
				}
				log.LogInfo(val);
			}
			catch (Exception ex)
			{
				ManualLogSource log2 = Log;
				BepInExErrorLogInterpolatedStringHandler val2 = new BepInExErrorLogInterpolatedStringHandler(33, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("Failed to apply Harmony patches: ");
					((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<Exception>(ex);
				}
				log2.LogError(val2);
			}
		}

		private static void PatchMethod(Harmony harmony, Type targetType, string methodName, Type patchClass, string postfixName)
		{
			PatchMethod(harmony, targetType, methodName, patchClass, null, postfixName);
		}

		private static void PatchMethod(Harmony harmony, Type targetType, string methodName, Type patchClass, string prefixName, string postfixName)
		{
			//IL_01ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f5: Expected O, but got Unknown
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Expected O, but got Unknown
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Expected O, but got Unknown
			//IL_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_0108: Expected O, but got Unknown
			//IL_015b: Unknown result type (might be due to invalid IL or missing references)
			//IL_016d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0188: Unknown result type (might be due to invalid IL or missing references)
			//IL_018f: Expected O, but got Unknown
			MethodInfo methodInfo = AccessTools.Method(targetType, methodName, (Type[])null, (Type[])null);
			bool flag = default(bool);
			if (methodInfo == null)
			{
				ManualLogSource log = Log;
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(27, 2, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Could not find ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(targetType.Name);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(".");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(methodName);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(". Skipping.");
				}
				log.LogWarning(val);
				return;
			}
			MethodInfo methodInfo2 = ((prefixName == null) ? null : patchClass.GetMethod(prefixName, BindingFlags.Static | BindingFlags.NonPublic));
			if (prefixName != null && methodInfo2 == null)
			{
				ManualLogSource log2 = Log;
				BepInExErrorLogInterpolatedStringHandler val2 = new BepInExErrorLogInterpolatedStringHandler(17, 2, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("Could not find ");
					((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(patchClass.Name);
					((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(".");
					((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(prefixName);
					((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(".");
				}
				log2.LogError(val2);
				return;
			}
			MethodInfo methodInfo3 = ((postfixName == null) ? null : patchClass.GetMethod(postfixName, BindingFlags.Static | BindingFlags.NonPublic));
			if (postfixName != null && methodInfo3 == null)
			{
				ManualLogSource log3 = Log;
				BepInExErrorLogInterpolatedStringHandler val2 = new BepInExErrorLogInterpolatedStringHandler(17, 2, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("Could not find ");
					((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(patchClass.Name);
					((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(".");
					((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(postfixName);
					((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(".");
				}
				log3.LogError(val2);
				return;
			}
			try
			{
				harmony.Patch((MethodBase)methodInfo, (methodInfo2 == null) ? ((HarmonyMethod)null) : new HarmonyMethod(methodInfo2), (methodInfo3 == null) ? ((HarmonyMethod)null) : new HarmonyMethod(methodInfo3), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
				ManualLogSource log4 = Log;
				BepInExInfoLogInterpolatedStringHandler val3 = new BepInExInfoLogInterpolatedStringHandler(13, 3, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val3).AppendLiteral("Patched ");
					((BepInExLogInterpolatedStringHandler)val3).AppendFormatted<string>(targetType.Name);
					((BepInExLogInterpolatedStringHandler)val3).AppendLiteral(".");
					((BepInExLogInterpolatedStringHandler)val3).AppendFormatted<string>(methodName);
					((BepInExLogInterpolatedStringHandler)val3).AppendLiteral(" -> ");
					((BepInExLogInterpolatedStringHandler)val3).AppendFormatted<string>(patchClass.Name);
				}
				log4.LogInfo(val3);
			}
			catch (Exception ex)
			{
				ManualLogSource log5 = Log;
				BepInExErrorLogInterpolatedStringHandler val2 = new BepInExErrorLogInterpolatedStringHandler(19, 3, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("Failed to patch ");
					((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(targetType.Name);
					((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(".");
					((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(methodName);
					((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(": ");
					((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(ex.Message);
				}
				log5.LogError(val2);
			}
		}
	}
	internal static class NativePartyHardcapPatch
	{
		private static bool _applied;

		internal static void Apply(Type playerPartyType)
		{
			//IL_0168: Unknown result type (might be due to invalid IL or missing references)
			//IL_016f: Expected O, but got Unknown
			//IL_0109: Unknown result type (might be due to invalid IL or missing references)
			//IL_0110: Expected O, but got Unknown
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Expected O, but got Unknown
			if (_applied)
			{
				return;
			}
			bool flag = default(bool);
			try
			{
				FieldInfo field = playerPartyType.GetField("NativeMethodInfoPtr_SetTaskAgent_Public_Virtual_Final_New_Boolean_ITaskAgent_0", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
				if (field == null)
				{
					ExpandedPartyPlugin.Log.LogError((object)"Could not find PlayerParty.SetTaskAgent native method info field.");
					return;
				}
				if (!(field.GetValue(null) is IntPtr intPtr) || intPtr == IntPtr.Zero)
				{
					ExpandedPartyPlugin.Log.LogError((object)"PlayerParty.SetTaskAgent native method info pointer is unavailable.");
					return;
				}
				IntPtr intPtr2 = Marshal.ReadIntPtr(intPtr);
				if (intPtr2 == IntPtr.Zero)
				{
					ExpandedPartyPlugin.Log.LogError((object)"PlayerParty.SetTaskAgent native method pointer is unavailable.");
					return;
				}
				int value = ExpandedPartyPlugin.CfgPartyCapacity.Value;
				if (!TryPatchImmediate(intPtr2, value, out var patchAddress))
				{
					ManualLogSource log = ExpandedPartyPlugin.Log;
					BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(74, 1, ref flag);
					if (flag)
					{
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Could not find PlayerParty.SetTaskAgent hardcoded party-size gate near 0x");
						((BepInExLogInterpolatedStringHandler)val).AppendFormatted<long>(intPtr2.ToInt64(), "X");
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral(".");
					}
					log.LogError(val);
					return;
				}
				_applied = true;
				ManualLogSource log2 = ExpandedPartyPlugin.Log;
				BepInExInfoLogInterpolatedStringHandler val2 = new BepInExInfoLogInterpolatedStringHandler(62, 2, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("Patched PlayerParty.SetTaskAgent native party limit to ");
					((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<int>(value);
					((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" at 0x");
					((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<long>(patchAddress.ToInt64(), "X");
					((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(".");
				}
				log2.LogInfo(val2);
			}
			catch (Exception ex)
			{
				ManualLogSource log3 = ExpandedPartyPlugin.Log;
				BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(61, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Failed to patch PlayerParty.SetTaskAgent native party limit: ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<Exception>(ex);
				}
				log3.LogError(val);
			}
		}

		private unsafe static bool TryPatchImmediate(IntPtr methodPointer, int limit, out IntPtr patchAddress)
		{
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Expected O, but got Unknown
			patchAddress = IntPtr.Zero;
			byte* ptr = (byte*)methodPointer.ToPointer();
			bool flag = default(bool);
			for (int i = 0; i < 4096; i++)
			{
				if (ptr[i] != 131 || ptr[i + 1] != 120 || ptr[i + 2] != 24 || ptr[i + 3] != 3 || !LooksLikeRejectedBranch(ptr + i + 4))
				{
					continue;
				}
				patchAddress = methodPointer + i + 3;
				if (!VirtualProtect(patchAddress, (UIntPtr)1uL, 64u, out var lpflOldProtect))
				{
					ManualLogSource log = ExpandedPartyPlugin.Log;
					BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(64, 1, ref flag);
					if (flag)
					{
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral("VirtualProtect failed while patching PlayerParty.SetTaskAgent: ");
						((BepInExLogInterpolatedStringHandler)val).AppendFormatted<int>(Marshal.GetLastWin32Error());
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral(".");
					}
					log.LogError(val);
					return false;
				}
				ptr[i + 3] = checked((byte)limit);
				VirtualProtect(patchAddress, (UIntPtr)1uL, lpflOldProtect, out var _);
				return true;
			}
			return false;
		}

		private unsafe static bool LooksLikeRejectedBranch(byte* branchBytes)
		{
			if (*branchBytes != 15 || branchBytes[1] != 141)
			{
				return *branchBytes == 125;
			}
			return true;
		}

		[DllImport("kernel32", SetLastError = true)]
		private static extern bool VirtualProtect(IntPtr lpAddress, UIntPtr dwSize, uint flNewProtect, out uint lpflOldProtect);
	}
	internal static class PlayerPartyCapacityPatch
	{
		private static bool _loggedOverride;

		internal static void Postfix(object __instance, ref int __result)
		{
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Expected O, but got Unknown
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Expected O, but got Unknown
			bool flag = default(bool);
			try
			{
				if (!ExpandedPartyPlugin.CfgEnabled.Value || !IsInGameplay() || !PlayerPartyLifecyclePatch.IsActiveParty(__instance))
				{
					return;
				}
				int value = ExpandedPartyPlugin.CfgPartyCapacity.Value;
				if (__result >= value)
				{
					return;
				}
				int num = __result;
				__result = value;
				if (ExpandedPartyPlugin.CfgDebugLogging.Value && !_loggedOverride)
				{
					_loggedOverride = true;
					ManualLogSource log = ExpandedPartyPlugin.Log;
					BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(35, 2, ref flag);
					if (flag)
					{
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral("PlayerParty.GetAgentsCapacity: ");
						((BepInExLogInterpolatedStringHandler)val).AppendFormatted<int>(num);
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" -> ");
						((BepInExLogInterpolatedStringHandler)val).AppendFormatted<int>(__result);
					}
					log.LogInfo(val);
				}
			}
			catch (Exception ex)
			{
				ManualLogSource log2 = ExpandedPartyPlugin.Log;
				BepInExWarningLogInterpolatedStringHandler val2 = new BepInExWarningLogInterpolatedStringHandler(57, 2, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("GetAgentsCapacity patch failed; leaving vanilla result ");
					((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<int>(__result);
					((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(": ");
					((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(ex.Message);
				}
				log2.LogWarning(val2);
			}
		}

		private static bool IsInGameplay()
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				Scene activeScene = SceneManager.GetActiveScene();
				return ((Scene)(ref activeScene)).name == "StreamingWorld";
			}
			catch
			{
				return false;
			}
		}
	}
	internal static class PlayerPartyLifecyclePatch
	{
		private static IntPtr _activePartyPtr;

		internal static void SpawnedPostfix(object __instance)
		{
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Expected O, but got Unknown
			try
			{
				if (__instance == null)
				{
					return;
				}
				if (!LooksRuntimeReady(__instance))
				{
					if (ExpandedPartyPlugin.CfgDebugLogging.Value)
					{
						ExpandedPartyPlugin.Log.LogInfo((object)"PlayerParty.Spawned observed but party is not runtime-ready yet.");
					}
				}
				else
				{
					_activePartyPtr = GetNativePointer(__instance);
					ExpandedPartyPlugin.Log.LogInfo((object)"PlayerParty spawned and expanded capacity is armed.");
				}
			}
			catch (Exception ex)
			{
				ManualLogSource log = ExpandedPartyPlugin.Log;
				bool flag = default(bool);
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(34, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("PlayerParty.Spawned patch failed: ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(ex.Message);
				}
				log.LogWarning(val);
			}
		}

		internal static void DespawnedPostfix(object __instance)
		{
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Expected O, but got Unknown
			try
			{
				if (__instance != null)
				{
					IntPtr nativePointer = GetNativePointer(__instance);
					if (nativePointer != IntPtr.Zero && nativePointer == _activePartyPtr)
					{
						_activePartyPtr = IntPtr.Zero;
						ExpandedPartyPlugin.Log.LogInfo((object)"PlayerParty despawned and expanded capacity is disarmed.");
					}
				}
			}
			catch (Exception ex)
			{
				ManualLogSource log = ExpandedPartyPlugin.Log;
				bool flag = default(bool);
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(36, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("PlayerParty.Despawned patch failed: ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(ex.Message);
				}
				log.LogWarning(val);
			}
		}

		internal static bool IsActiveParty(object party)
		{
			if (party == null || _activePartyPtr == IntPtr.Zero)
			{
				return false;
			}
			return GetNativePointer(party) == _activePartyPtr;
		}

		private static bool LooksRuntimeReady(object party)
		{
			if (GetPropertyValue(party, "session") != null && GetPropertyValue(party, "_networkParty") != null && GetPropertyValue(party, "_partyMembers") != null)
			{
				if (GetPropertyValue(party, "_pc") == null)
				{
					return InvokeMethod(party, "GetCharacter") != null;
				}
				return true;
			}
			return false;
		}

		private static object GetPropertyValue(object target, string name)
		{
			try
			{
				return target.GetType().GetProperty(name, BindingFlags.Instance | BindingFlags.Public)?.GetValue(target);
			}
			catch
			{
				return null;
			}
		}

		private static object InvokeMethod(object target, string name)
		{
			try
			{
				return target.GetType().GetMethod(name, BindingFlags.Instance | BindingFlags.Public)?.Invoke(target, null);
			}
			catch
			{
				return null;
			}
		}

		private static IntPtr GetNativePointer(object target)
		{
			try
			{
				if (target.GetType().GetProperty("Pointer", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)?.GetValue(target) is IntPtr result)
				{
					return result;
				}
				object obj = target.GetType().GetField("Pointer", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)?.GetValue(target);
				if (obj is IntPtr)
				{
					return (IntPtr)obj;
				}
			}
			catch
			{
			}
			return IntPtr.Zero;
		}
	}
	internal static class PlayerPartyWidgetPatch
	{
		private const int TwoColumnThreshold = 10;

		private const int MaxRowsPerColumn = 10;

		private const float ColumnGap = 16f;

		private static float? _originalSpacing;

		private static Vector2? _originalContentPosition;

		private static Vector2? _originalContentSize;

		private static bool? _originalLayoutEnabled;

		private static Vector2? _columnTemplateOrigin;

		private static float? _columnTemplateRowStep;

		private static float? _columnTemplateScale;

		private static Vector2? _columnTemplateContentSize;

		private static Vector2? _columnTemplateContentPosition;

		private static bool _columnTemplateValid;

		private static FitMode? _savedFitHorizontal;

		private static FitMode? _savedFitVertical;

		private static bool _contentSizeFitterNeutralized;

		private static bool _layoutElementSizesPinned;

		private static float _savedLayoutMinWidth;

		private static float _savedLayoutMinHeight;

		private static float _savedLayoutPreferredWidth;

		private static float _savedLayoutPreferredHeight;

		private static VerticalLayoutGroup _frozenParentLayout;

		private static Vector2? _twoColumnBasePosition;

		[ThreadStatic]
		private static bool _inPostfix;

		[ThreadStatic]
		private static bool _isEnsuringVisible;

		internal static void OnVillagerAddedPrefix(object __instance)
		{
			//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d1: Expected O, but got Unknown
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Expected O, but got Unknown
			if (!ExpandedPartyPlugin.CfgEnabled.Value || !ExpandedPartyPlugin.CfgScalePartyWidget.Value)
			{
				return;
			}
			bool flag = default(bool);
			try
			{
				object propertyValue = GetPropertyValue(__instance, "Content");
				Transform val = (Transform)((propertyValue is Transform) ? propertyValue : null);
				if ((Object)(object)val == (Object)null)
				{
					return;
				}
				VerticalLayoutGroup component = ((Component)val).GetComponent<VerticalLayoutGroup>();
				if ((Object)(object)component == (Object)null || val.childCount < 10 || !((Behaviour)component).enabled)
				{
					return;
				}
				((Behaviour)component).enabled = false;
				if (ExpandedPartyPlugin.CfgDebugLogging.Value)
				{
					ManualLogSource log = ExpandedPartyPlugin.Log;
					BepInExInfoLogInterpolatedStringHandler val2 = new BepInExInfoLogInterpolatedStringHandler(52, 1, ref flag);
					if (flag)
					{
						((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("PlayerPartyWidget disabled VLG before adding child ");
						((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<int>(val.childCount + 1);
						((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(".");
					}
					log.LogInfo(val2);
				}
			}
			catch (Exception ex)
			{
				if (ExpandedPartyPlugin.CfgDebugLogging.Value)
				{
					ManualLogSource log2 = ExpandedPartyPlugin.Log;
					BepInExWarningLogInterpolatedStringHandler val3 = new BepInExWarningLogInterpolatedStringHandler(30, 1, ref flag);
					if (flag)
					{
						((BepInExLogInterpolatedStringHandler)val3).AppendLiteral("OnVillagerAddedPrefix failed: ");
						((BepInExLogInterpolatedStringHandler)val3).AppendFormatted<string>(ex.Message);
					}
					log2.LogWarning(val3);
				}
			}
		}

		internal static void WidgetChangedPostfix(object __instance)
		{
			//IL_02af: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b6: Expected O, but got Unknown
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0102: Unknown result type (might be due to invalid IL or missing references)
			//IL_0104: Unknown result type (might be due to invalid IL or missing references)
			//IL_0179: Unknown result type (might be due to invalid IL or missing references)
			//IL_0180: Expected O, but got Unknown
			//IL_0255: Unknown result type (might be due to invalid IL or missing references)
			//IL_025a: Unknown result type (might be due to invalid IL or missing references)
			//IL_025c: Unknown result type (might be due to invalid IL or missing references)
			//IL_025e: 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_01f7: Expected O, but got Unknown
			//IL_0289: Unknown result type (might be due to invalid IL or missing references)
			//IL_0279: Unknown result type (might be due to invalid IL or missing references)
			if (_inPostfix)
			{
				return;
			}
			bool flag = default(bool);
			try
			{
				_inPostfix = true;
				if (!ExpandedPartyPlugin.CfgEnabled.Value || !ExpandedPartyPlugin.CfgScalePartyWidget.Value)
				{
					return;
				}
				int num = EnsureCurrentPartyMembersAreVisible(__instance);
				object propertyValue = GetPropertyValue(__instance, "Content");
				Transform val = (Transform)((propertyValue is Transform) ? propertyValue : null);
				if ((Object)(object)val == (Object)null)
				{
					return;
				}
				SyncChildOrderToParty(__instance, val);
				VerticalLayoutGroup component = ((Component)val).GetComponent<VerticalLayoutGroup>();
				if ((Object)(object)component == (Object)null)
				{
					return;
				}
				RectTransform component2 = ((Component)val).GetComponent<RectTransform>();
				if ((Object)(object)component2 == (Object)null)
				{
					return;
				}
				float valueOrDefault = _originalSpacing.GetValueOrDefault();
				if (!_originalSpacing.HasValue)
				{
					valueOrDefault = ((HorizontalOrVerticalLayoutGroup)component).spacing;
					_originalSpacing = valueOrDefault;
				}
				Vector2 valueOrDefault2 = _originalContentPosition.GetValueOrDefault();
				if (!_originalContentPosition.HasValue)
				{
					valueOrDefault2 = component2.anchoredPosition;
					_originalContentPosition = valueOrDefault2;
				}
				valueOrDefault2 = _originalContentSize.GetValueOrDefault();
				if (!_originalContentSize.HasValue)
				{
					Rect rect = component2.rect;
					valueOrDefault2 = ((Rect)(ref rect)).size;
					_originalContentSize = valueOrDefault2;
				}
				flag = _originalLayoutEnabled.GetValueOrDefault();
				if (!_originalLayoutEnabled.HasValue)
				{
					flag = ((Behaviour)component).enabled;
					_originalLayoutEnabled = flag;
				}
				int childCount = val.childCount;
				int num2 = Math.Max(num, childCount);
				if (ExpandedPartyPlugin.CfgDebugLogging.Value)
				{
					int count = GetCount(GetPropertyValue(__instance, "PartyMembers"));
					ManualLogSource log = ExpandedPartyPlugin.Log;
					BepInExInfoLogInterpolatedStringHandler val2 = new BepInExInfoLogInterpolatedStringHandler(106, 4, ref flag);
					if (flag)
					{
						((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("PlayerPartyWidget diag: content.childCount=");
						((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<int>(childCount);
						((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(", _partyMembers.Count=");
						((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<int>(num);
						((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(", PartyMembers.Count=");
						((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<int>(count);
						((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(", layoutMemberCount=");
						((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<int>(num2);
					}
					log.LogInfo(val2);
					if (num > childCount)
					{
						ManualLogSource log2 = ExpandedPartyPlugin.Log;
						BepInExWarningLogInterpolatedStringHandler val3 = new BepInExWarningLogInterpolatedStringHandler(148, 2, ref flag);
						if (flag)
						{
							((BepInExLogInterpolatedStringHandler)val3).AppendLiteral("PlayerPartyWidget is missing panels: party has ");
							((BepInExLogInterpolatedStringHandler)val3).AppendFormatted<int>(num);
							((BepInExLogInterpolatedStringHandler)val3).AppendLiteral(", but Content only has ");
							((BepInExLogInterpolatedStringHandler)val3).AppendFormatted<int>(childCount);
							((BepInExLogInterpolatedStringHandler)val3).AppendLiteral(". Layout will use the party count, but only existing panels can be positioned.");
						}
						log2.LogWarning(val3);
					}
				}
				if (childCount == 0)
				{
					return;
				}
				if (num2 <= 3)
				{
					RestoreVerticalLayout(val, component2, component, childCount);
					return;
				}
				Vector2 childSize = GetChildSize(val);
				if (!(childSize == Vector2.zero))
				{
					if (num2 > 10)
					{
						ApplyTwoColumnLayout(val, component2, component, childCount, num2, childSize);
					}
					else
					{
						ApplySingleColumnLayout(val, component2, component, childCount, num2, childSize.y);
					}
				}
			}
			catch (Exception ex)
			{
				if (ExpandedPartyPlugin.CfgDebugLogging.Value)
				{
					ManualLogSource log3 = ExpandedPartyPlugin.Log;
					BepInExWarningLogInterpolatedStringHandler val3 = new BepInExWarningLogInterpolatedStringHandler(38, 1, ref flag);
					if (flag)
					{
						((BepInExLogInterpolatedStringHandler)val3).AppendLiteral("PlayerPartyWidget scale patch failed: ");
						((BepInExLogInterpolatedStringHandler)val3).AppendFormatted<Exception>(ex);
					}
					log3.LogWarning(val3);
				}
			}
			finally
			{
				_inPostfix = false;
			}
		}

		internal static void ActivatePostfix(object __instance)
		{
			WidgetChangedPostfix(__instance);
		}

		private static void RestoreVerticalLayout(Transform content, RectTransform contentRect, VerticalLayoutGroup layoutGroup, int visiblePanelCount)
		{
			//IL_002d: 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_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			UnpinContentSize(content);
			((Behaviour)layoutGroup).enabled = _originalLayoutEnabled.GetValueOrDefault(true);
			((HorizontalOrVerticalLayoutGroup)layoutGroup).spacing = _originalSpacing.Value;
			contentRect.anchoredPosition = _originalContentPosition.Value;
			contentRect.SetSizeWithCurrentAnchors((Axis)0, _originalContentSize.Value.x);
			contentRect.SetSizeWithCurrentAnchors((Axis)1, _originalContentSize.Value.y);
			for (int i = 0; i < visiblePanelCount; i++)
			{
				Transform child = content.GetChild(i);
				child.localScale = Vector3.one;
				SetIgnoreLayout(child, ignoreLayout: false);
			}
			RestoreParentMasks(content);
			LayoutRebuilder.ForceRebuildLayoutImmediate(contentRect);
			_columnTemplateValid = false;
		}

		private static void ApplySingleColumnLayout(Transform content, RectTransform contentRect, VerticalLayoutGroup layoutGroup, int visiblePanelCount, int layoutMemberCount, float childHeight)
		{
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_0135: Unknown result type (might be due to invalid IL or missing references)
			//IL_0146: Unknown result type (might be due to invalid IL or missing references)
			//IL_015c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0168: Unknown result type (might be due to invalid IL or missing references)
			//IL_0183: Unknown result type (might be due to invalid IL or missing references)
			//IL_0188: Unknown result type (might be due to invalid IL or missing references)
			//IL_018c: Unknown result type (might be due to invalid IL or missing references)
			//IL_019c: Unknown result type (might be due to invalid IL or missing references)
			//IL_01db: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0203: Unknown result type (might be due to invalid IL or missing references)
			//IL_0265: Unknown result type (might be due to invalid IL or missing references)
			//IL_026a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0288: Unknown result type (might be due to invalid IL or missing references)
			//IL_028d: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b0: Unknown result type (might be due to invalid IL or missing references)
			UnpinContentSize(content);
			((Behaviour)layoutGroup).enabled = _originalLayoutEnabled.GetValueOrDefault(true);
			DisableParentMasks(content);
			float num = Math.Clamp(3f / (float)layoutMemberCount, 0.5f, 1f);
			((HorizontalOrVerticalLayoutGroup)layoutGroup).spacing = _originalSpacing.Value * num - childHeight * (1f - num);
			float num2 = Math.Min(24f, childHeight * 0.2f);
			contentRect.anchoredPosition = _originalContentPosition.Value + new Vector2(0f, num2);
			float val = (float)visiblePanelCount * childHeight * num + (float)Math.Max(0, visiblePanelCount - 1) * ((HorizontalOrVerticalLayoutGroup)layoutGroup).spacing;
			contentRect.SetSizeWithCurrentAnchors((Axis)1, Math.Max(_originalContentSize.Value.y, val));
			for (int i = 0; i < visiblePanelCount; i++)
			{
				Transform child = content.GetChild(i);
				child.localScale = new Vector3(num, num, 1f);
				SetIgnoreLayout(child, ignoreLayout: false);
			}
			if (layoutMemberCount != 10 || visiblePanelCount < 2)
			{
				return;
			}
			LayoutRebuilder.ForceRebuildLayoutImmediate(contentRect);
			RectTransform component = ((Component)content.GetChild(0)).GetComponent<RectTransform>();
			RectTransform component2 = ((Component)content.GetChild(1)).GetComponent<RectTransform>();
			if ((Object)(object)component != (Object)null && (Object)(object)component2 != (Object)null)
			{
				_columnTemplateOrigin = component.anchoredPosition;
				_columnTemplateScale = ((Transform)component).localScale.x;
				_columnTemplateRowStep = Mathf.Abs(component.anchoredPosition.y - component2.anchoredPosition.y);
				Rect rect = contentRect.rect;
				_columnTemplateContentSize = ((Rect)(ref rect)).size;
				_columnTemplateContentPosition = contentRect.anchoredPosition;
				_columnTemplateValid = true;
				if (ExpandedPartyPlugin.CfgDebugLogging.Value)
				{
					ManualLogSource log = ExpandedPartyPlugin.Log;
					string[] obj = new string[18]
					{
						"ColumnTemplate N=10: origin=", null, null, null, null, null, null, null, null, null,
						null, null, null, null, null, null, null, null
					};
					Vector2 val2 = _columnTemplateOrigin.Value;
					obj[1] = ((Vector2)(ref val2)).ToString("F2");
					obj[2] = ", contentPos=";
					val2 = _columnTemplateContentPosition.Value;
					obj[3] = ((Vector2)(ref val2)).ToString("F2");
					obj[4] = ", scale=";
					obj[5] = _columnTemplateScale.Value.ToString("F3");
					obj[6] = ", rowStep=";
					obj[7] = _columnTemplateRowStep.Value.ToString("F2");
					obj[8] = ", anchorMin=";
					val2 = component.anchorMin;
					obj[9] = ((object)(Vector2)(ref val2)).ToString();
					obj[10] = ", anchorMax=";
					val2 = component.anchorMax;
					obj[11] = ((object)(Vector2)(ref val2)).ToString();
					obj[12] = ", pivot=";
					val2 = component.pivot;
					obj[13] = ((object)(Vector2)(ref val2)).ToString();
					obj[14] = ", childHeight=";
					obj[15] = childHeight.ToString("F2");
					obj[16] = ", spacing=";
					obj[17] = ((HorizontalOrVerticalLayoutGroup)layoutGroup).spacing.ToString("F2");
					log.LogInfo((object)string.Concat(obj));
				}
			}
		}

		private static void ApplyTwoColumnLayout(Transform content, RectTransform contentRect, VerticalLayoutGroup layoutGroup, int visiblePanelCount, int layoutMemberCount, Vector2 childSize)
		{
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00da: Unknown result type (might be due to invalid IL or missing references)
			//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_0126: Unknown result type (might be due to invalid IL or missing references)
			//IL_012b: Unknown result type (might be due to invalid IL or missing references)
			//IL_012f: 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_010b: 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_0114: Unknown result type (might be due to invalid IL or missing references)
			//IL_0147: Unknown result type (might be due to invalid IL or missing references)
			//IL_014c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0226: Unknown result type (might be due to invalid IL or missing references)
			//IL_022f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0234: Unknown result type (might be due to invalid IL or missing references)
			//IL_047d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0493: Unknown result type (might be due to invalid IL or missing references)
			//IL_04a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_04b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_04be: Unknown result type (might be due to invalid IL or missing references)
			//IL_04ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f3: 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_01fd: Unknown result type (might be due to invalid IL or missing references)
			((Behaviour)layoutGroup).enabled = false;
			DisableParentMasks(content);
			Vector2 value = default(Vector2);
			float num;
			float num2;
			if (_columnTemplateValid && _columnTemplateOrigin.HasValue && _columnTemplateRowStep.HasValue && _columnTemplateScale.HasValue)
			{
				value = _columnTemplateOrigin.Value;
				num = _columnTemplateRowStep.Value;
				num2 = _columnTemplateScale.Value;
			}
			else
			{
				float num3 = _originalSpacing ?? ((HorizontalOrVerticalLayoutGroup)layoutGroup).spacing;
				num2 = Math.Clamp(0.3f, 0.5f, 1f);
				num = num2 * (childSize.y + num3);
				RectOffset padding = ((LayoutGroup)layoutGroup).padding;
				((Vector2)(ref value))..ctor((float)padding.left + childSize.x * 0.5f, 0f - ((float)padding.top + childSize.y * 0.5f));
			}
			float num4 = childSize.x * num2 + 16f;
			Vector2? columnTemplateContentSize = _columnTemplateContentSize;
			Vector2 val;
			if (!columnTemplateContentSize.HasValue)
			{
				Vector2? originalContentSize = _originalContentSize;
				if (!originalContentSize.HasValue)
				{
					Rect rect = contentRect.rect;
					val = ((Rect)(ref rect)).size;
				}
				else
				{
					val = originalContentSize.GetValueOrDefault();
				}
			}
			else
			{
				val = columnTemplateContentSize.GetValueOrDefault();
			}
			Vector2 size = val;
			PinContentSize(content, contentRect, size);
			Vector2 val2;
			if (_twoColumnBasePosition.HasValue)
			{
				val2 = _twoColumnBasePosition.Value;
			}
			else
			{
				VerticalLayoutGroup val3 = (((Object)(object)content.parent != (Object)null) ? ((Component)content.parent).GetComponent<VerticalLayoutGroup>() : null);
				RectTransform val4 = (((Object)(object)content.parent != (Object)null) ? ((Component)content.parent).GetComponent<RectTransform>() : null);
				if ((Object)(object)val3 != (Object)null && ((Behaviour)val3).enabled && (Object)(object)val4 != (Object)null)
				{
					LayoutRebuilder.ForceRebuildLayoutImmediate(val4);
					val2 = contentRect.anchoredPosition;
				}
				else
				{
					val2 = (Vector2)((_columnTemplateValid && _columnTemplateContentPosition.HasValue) ? _columnTemplateContentPosition.Value : (((??)_originalContentPosition) ?? contentRect.anchoredPosition));
				}
				_twoColumnBasePosition = val2;
			}
			FreezeParentLayout(content);
			float num5 = Mathf.Max(0f, ExpandedPartyPlugin.CfgTwoColumnLeftShift.Value);
			contentRect.anchoredPosition = val2 - new Vector2(num5, 0f);
			if (ExpandedPartyPlugin.CfgDebugLogging.Value)
			{
				ContentSizeFitter component = ((Component)content).GetComponent<ContentSizeFitter>();
				VerticalLayoutGroup val5 = (((Object)(object)content.parent != (Object)null) ? ((Component)content.parent).GetComponent<VerticalLayoutGroup>() : null);
				HorizontalLayoutGroup val6 = (((Object)(object)content.parent != (Object)null) ? ((Component)content.parent).GetComponent<HorizontalLayoutGroup>() : null);
				ManualLogSource log = ExpandedPartyPlugin.Log;
				string[] obj = new string[20]
				{
					"ContentDiag: pivot=", null, null, null, null, null, null, null, null, null,
					null, null, null, null, null, null, null, null, null, null
				};
				Vector2 pivot = contentRect.pivot;
				obj[1] = ((object)(Vector2)(ref pivot)).ToString();
				obj[2] = ", CSF=";
				object obj2;
				if (!((Object)(object)component == (Object)null))
				{
					FitMode val7 = component.horizontalFit;
					string? text = ((object)(FitMode)(ref val7)).ToString();
					val7 = component.verticalFit;
					obj2 = text + "/" + ((object)(FitMode)(ref val7)).ToString();
				}
				else
				{
					obj2 = "none";
				}
				obj[3] = (string)obj2;
				obj[4] = ", parent=";
				obj[5] = (((Object)(object)content.parent != (Object)null) ? ((Object)content.parent).name : "null");
				obj[6] = ", parentVLG=";
				obj[7] = ((Object)(object)val5 != (Object)null).ToString();
				obj[8] = " (enabled=";
				obj[9] = ((Object)(object)val5 != (Object)null && ((Behaviour)val5).enabled).ToString();
				obj[10] = "), parentHLG=";
				obj[11] = ((Object)(object)val6 != (Object)null).ToString();
				obj[12] = ", pinnedSize=";
				obj[13] = ((Vector2)(ref size)).ToString("F1");
				obj[14] = ", basePos=";
				obj[15] = ((Vector2)(ref val2)).ToString("F1");
				obj[16] = " (cached=";
				obj[17] = _twoColumnBasePosition.HasValue.ToString();
				obj[18] = "), leftShift=";
				obj[19] = num5.ToString("F1");
				log.LogInfo((object)string.Concat(obj));
			}
			for (int i = 0; i < visiblePanelCount; i++)
			{
				Transform child = content.GetChild(i);
				RectTransform component2 = ((Component)child).GetComponent<RectTransform>();
				if (!((Object)(object)component2 == (Object)null))
				{
					LayoutElement val8 = ((Component)child).GetComponent<LayoutElement>();
					if ((Object)(object)val8 == (Object)null)
					{
						val8 = ((Component)child).gameObject.AddComponent<LayoutElement>();
					}
					val8.ignoreLayout = true;
					int num6 = i / 10;
					int num7 = i % 10;
					component2.anchorMin = new Vector2(0f, 1f);
					component2.anchorMax = new Vector2(0f, 1f);
					child.localScale = new Vector3(num2, num2, 1f);
					component2.anchoredPosition = new Vector2(value.x + (float)num6 * num4, value.y - (float)num7 * num);
				}
			}
			if (ExpandedPartyPlugin.CfgDebugLogging.Value)
			{
				string text2 = (_columnTemplateValid ? "template" : "analytic");
				ExpandedPartyPlugin.Log.LogInfo((object)("TwoColumnLayout: source=" + text2 + ", perColumn=" + 10 + ", scale=" + num2.ToString("F3") + ", rowStep=" + num.ToString("F2") + ", colStep=" + num4.ToString("F2") + ", origin=" + ((Vector2)(ref value)).ToString("F2")));
			}
		}

		private static Vector2 GetChildSize(Transform content)
		{
			//IL_0008: 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_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			if (content.childCount == 0)
			{
				return Vector2.zero;
			}
			RectTransform component = ((Component)content.GetChild(0)).GetComponent<RectTransform>();
			if (!((Object)(object)component == (Object)null))
			{
				Rect rect = component.rect;
				return ((Rect)(ref rect)).size;
			}
			return Vector2.zero;
		}

		private static int EnsureCurrentPartyMembersAreVisible(object widgetInstance)
		{
			//IL_0195: Unknown result type (might be due to invalid IL or missing references)
			//IL_019c: Expected O, but got Unknown
			//IL_0134: Unknown result type (might be due to invalid IL or missing references)
			//IL_013b: Expected O, but got Unknown
			int partyMemberCount = GetPartyMemberCount(widgetInstance);
			if (_isEnsuringVisible || partyMemberCount == 0)
			{
				return partyMemberCount;
			}
			bool flag = default(bool);
			try
			{
				_isEnsuringVisible = true;
				object propertyValue = GetPropertyValue(widgetInstance, "_playerParty");
				object obj = ((propertyValue != null) ? GetPropertyValue(propertyValue, "_partyMembers") : null);
				object propertyValue2 = GetPropertyValue(widgetInstance, "PartyMembers");
				MethodInfo methodInfo = propertyValue2?.GetType().GetMethod("ContainsKey");
				MethodInfo method = widgetInstance.GetType().GetMethod("_OnVillagerAdded", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
				MethodInfo methodInfo2 = obj?.GetType().GetMethod("get_Item");
				if (obj == null || method == null || methodInfo2 == null)
				{
					return partyMemberCount;
				}
				int num = 0;
				for (int i = 0; i < partyMemberCount; i++)
				{
					object obj2 = methodInfo2.Invoke(obj, new object[1] { i });
					if (obj2 != null && (!(methodInfo != null) || propertyValue2 == null || !(bool)methodInfo.Invoke(propertyValue2, new object[1] { obj2 })))
					{
						method.Invoke(widgetInstance, new object[1] { obj2 });
						num++;
					}
				}
				if (ExpandedPartyPlugin.CfgDebugLogging.Value && num > 0)
				{
					ManualLogSource log = ExpandedPartyPlugin.Log;
					BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(87, 2, ref flag);
					if (flag)
					{
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral("PlayerPartyWidget ensured ");
						((BepInExLogInterpolatedStringHandler)val).AppendFormatted<int>(num);
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" missing party member panels were created (total in party: ");
						((BepInExLogInterpolatedStringHandler)val).AppendFormatted<int>(partyMemberCount);
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral(").");
					}
					log.LogInfo(val);
				}
			}
			catch (Exception ex)
			{
				if (ExpandedPartyPlugin.CfgDebugLogging.Value)
				{
					ManualLogSource log2 = ExpandedPartyPlugin.Log;
					BepInExWarningLogInterpolatedStringHandler val2 = new BepInExWarningLogInterpolatedStringHandler(44, 1, ref flag);
					if (flag)
					{
						((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("EnsureCurrentPartyMembersAreVisible failed: ");
						((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<Exception>(ex);
					}
					log2.LogWarning(val2);
				}
			}
			finally
			{
				_isEnsuringVisible = false;
			}
			return partyMemberCount;
		}

		private static void SyncChildOrderToParty(object widgetInstance, Transform content)
		{
			//IL_0167: Unknown result type (might be due to invalid IL or missing references)
			//IL_016e: Expected O, but got Unknown
			//IL_011a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0121: Expected O, but got Unknown
			bool flag = default(bool);
			try
			{
				object propertyValue = GetPropertyValue(widgetInstance, "_playerParty");
				object obj = ((propertyValue != null) ? GetPropertyValue(propertyValue, "_partyMembers") : null);
				object propertyValue2 = GetPropertyValue(widgetInstance, "PartyMembers");
				if (obj == null || propertyValue2 == null)
				{
					return;
				}
				int count = GetCount(obj);
				if (count == 0)
				{
					return;
				}
				MethodInfo method = obj.GetType().GetMethod("get_Item");
				MethodInfo method2 = propertyValue2.GetType().GetMethod("get_Item");
				if (method == null || method2 == null)
				{
					return;
				}
				int num = 0;
				for (int i = 0; i < count; i++)
				{
					object obj2 = method.Invoke(obj, new object[1] { i });
					if (obj2 != null)
					{
						object? obj3 = method2.Invoke(propertyValue2, new object[1] { obj2 });
						Transform val = (Transform)((obj3 is Transform) ? obj3 : null);
						if (!((Object)(object)val == (Object)null) && !((Object)(object)val.parent != (Object)(object)content) && val.GetSiblingIndex() != i)
						{
							val.SetSiblingIndex(i);
							num++;
						}
					}
				}
				if (ExpandedPartyPlugin.CfgDebugLogging.Value && num > 0)
				{
					ManualLogSource log = ExpandedPartyPlugin.Log;
					BepInExInfoLogInterpolatedStringHandler val2 = new BepInExInfoLogInterpolatedStringHandler(56, 1, ref flag);
					if (flag)
					{
						((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("PlayerPartyWidget reordered ");
						((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<int>(num);
						((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" panels to match party list.");
					}
					log.LogInfo(val2);
				}
			}
			catch (Exception ex)
			{
				if (ExpandedPartyPlugin.CfgDebugLogging.Value)
				{
					ManualLogSource log2 = ExpandedPartyPlugin.Log;
					BepInExWarningLogInterpolatedStringHandler val3 = new BepInExWarningLogInterpolatedStringHandler(30, 1, ref flag);
					if (flag)
					{
						((BepInExLogInterpolatedStringHandler)val3).AppendLiteral("SyncChildOrderToParty failed: ");
						((BepInExLogInterpolatedStringHandler)val3).AppendFormatted<Exception>(ex);
					}
					log2.LogWarning(val3);
				}
			}
		}

		private static int GetPartyMemberCount(object widgetInstance)
		{
			object propertyValue = GetPropertyValue(widgetInstance, "_playerParty");
			return GetCount((propertyValue != null) ? GetPropertyValue(propertyValue, "_partyMembers") : null);
		}

		private static int GetCount(object collection)
		{
			if (collection == null)
			{
				return 0;
			}
			try
			{
				object obj = collection.GetType().GetProperty("Count", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)?.GetValue(collection);
				return (obj != null) ? Convert.ToInt32(obj) : 0;
			}
			catch
			{
				return 0;
			}
		}

		private static void DisableParentMasks(Transform content)
		{
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Expected O, but got Unknown
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Expected O, but got Unknown
			Transform parent = content.parent;
			bool flag = default(bool);
			while ((Object)(object)parent != (Object)null)
			{
				RectMask2D component = ((Component)parent).GetComponent<RectMask2D>();
				if ((Object)(object)component != (Object)null && ((Behaviour)component).enabled)
				{
					((Behaviour)component).enabled = false;
					if (ExpandedPartyPlugin.CfgDebugLogging.Value)
					{
						ManualLogSource log = ExpandedPartyPlugin.Log;
						BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(23, 1, ref flag);
						if (flag)
						{
							((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Disabled RectMask2D on ");
							((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(((Object)parent).name);
						}
						log.LogInfo(val);
					}
				}
				Mask component2 = ((Component)parent).GetComponent<Mask>();
				if ((Object)(object)component2 != (Object)null && ((Behaviour)component2).enabled)
				{
					((Behaviour)component2).enabled = false;
					if (ExpandedPartyPlugin.CfgDebugLogging.Value)
					{
						ManualLogSource log2 = ExpandedPartyPlugin.Log;
						BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(17, 1, ref flag);
						if (flag)
						{
							((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Disabled Mask on ");
							((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(((Object)parent).name);
						}
						log2.LogInfo(val);
					}
				}
				parent = parent.parent;
			}
		}

		private static void RestoreParentMasks(Transform content)
		{
			Transform parent = content.parent;
			while ((Object)(object)parent != (Object)null)
			{
				RectMask2D component = ((Component)parent).GetComponent<RectMask2D>();
				if ((Object)(object)component != (Object)null)
				{
					((Behaviour)component).enabled = true;
				}
				Mask component2 = ((Component)parent).GetComponent<Mask>();
				if ((Object)(object)component2 != (Object)null)
				{
					((Behaviour)component2).enabled = true;
				}
				parent = parent.parent;
			}
		}

		private static void PinContentSize(Transform content, RectTransform contentRect, Vector2 size)
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: 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_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00df: Unknown result type (might be due to invalid IL or missing references)
			ContentSizeFitter component = ((Component)content).GetComponent<ContentSizeFitter>();
			if ((Object)(object)component != (Object)null && !_contentSizeFitterNeutralized)
			{
				_savedFitHorizontal = component.horizontalFit;
				_savedFitVertical = component.verticalFit;
				component.horizontalFit = (FitMode)0;
				component.verticalFit = (FitMode)0;
				_contentSizeFitterNeutralized = true;
			}
			LayoutElement val = ((Component)content).GetComponent<LayoutElement>();
			if ((Object)(object)val == (Object)null)
			{
				val = ((Component)content).gameObject.AddComponent<LayoutElement>();
			}
			if (!_layoutElementSizesPinned)
			{
				_savedLayoutMinWidth = val.minWidth;
				_savedLayoutMinHeight = val.minHeight;
				_savedLayoutPreferredWidth = val.preferredWidth;
				_savedLayoutPreferredHeight = val.preferredHeight;
				_layoutElementSizesPinned = true;
			}
			val.minWidth = size.x;
			val.minHeight = size.y;
			val.preferredWidth = size.x;
			val.preferredHeight = size.y;
			contentRect.SetSizeWithCurrentAnchors((Axis)0, size.x);
			contentRect.SetSizeWithCurrentAnchors((Axis)1, size.y);
		}

		private static void UnpinContentSize(Transform content)
		{
			//IL_0029: 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)
			if (_contentSizeFitterNeutralized)
			{
				ContentSizeFitter component = ((Component)content).GetComponent<ContentSizeFitter>();
				if ((Object)(object)component != (Object)null)
				{
					if (_savedFitHorizontal.HasValue)
					{
						component.horizontalFit = _savedFitHorizontal.Value;
					}
					if (_savedFitVertical.HasValue)
					{
						component.verticalFit = _savedFitVertical.Value;
					}
				}
				_contentSizeFitterNeutralized = false;
			}
			if (_layoutElementSizesPinned)
			{
				LayoutElement component2 = ((Component)content).GetComponent<LayoutElement>();
				if ((Object)(object)component2 != (Object)null)
				{
					component2.minWidth = _savedLayoutMinWidth;
					component2.minHeight = _savedLayoutMinHeight;
					component2.preferredWidth = _savedLayoutPreferredWidth;
					component2.preferredHeight = _savedLayoutPreferredHeight;
				}
				_layoutElementSizesPinned = false;
			}
			UnfreezeParentLayout();
			_twoColumnBasePosition = null;
		}

		private static void FreezeParentLayout(Transform content)
		{
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Expected O, but got Unknown
			if ((Object)(object)_frozenParentLayout != (Object)null || (Object)(object)content.parent == (Object)null)
			{
				return;
			}
			VerticalLayoutGroup component = ((Component)content.parent).GetComponent<VerticalLayoutGroup>();
			if (!((Object)(object)component != (Object)null) || !((Behaviour)component).enabled)
			{
				return;
			}
			((Behaviour)component).enabled = false;
			_frozenParentLayout = component;
			if (ExpandedPartyPlugin.CfgDebugLogging.Value)
			{
				ManualLogSource log = ExpandedPartyPlugin.Log;
				bool flag = default(bool);
				BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(36, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Froze parent VerticalLayoutGroup on ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(((Object)content.parent).name);
				}
				log.LogInfo(val);
			}
		}

		private static void UnfreezeParentLayout()
		{
			if ((Object)(object)_frozenParentLayout != (Object)null)
			{
				((Behaviour)_frozenParentLayout).enabled = true;
				_frozenParentLayout = null;
			}
		}

		private static void SetIgnoreLayout(Transform child, bool ignoreLayout)
		{
			LayoutElement component = ((Component)child).GetComponent<LayoutElement>();
			if ((Object)(object)component != (Object)null)
			{
				component.ignoreLayout = ignoreLayout;
			}
		}

		private static object GetPropertyValue(object target, string name)
		{
			if (target == null)
			{
				return null;
			}
			try
			{
				BindingFlags bindingAttr = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
				Type type = target.GetType();
				PropertyInfo property = type.GetProperty(name, bindingAttr);
				if (property != null)
				{
					return property.GetValue(target);
				}
				return type.GetField(name, bindingAttr)?.GetValue(target);
			}
			catch
			{
				return null;
			}
		}
	}
}