Decompiled source of RadiusDetectionPatchForPinAssistant v1.5.0

BepInEx/plugins/PinAssistantRadiusPatch.dll

Decompiled a month ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using HarmonyLib;
using Splatform;
using UnityEngine;
using WxAxW.PinAssistant.Core;
using WxAxW.PinAssistant.Utils;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("PinAssistantRadiusPatch")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("PinAssistantRadiusPatch")]
[assembly: AssemblyCopyright("Copyright ©  2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("1e2fbbcd-1b9c-4956-8b09-1d343d666154")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace PinAssistantRadiusPatch;

[BepInPlugin("Mervil.pinassistantradiuspatch", "PinAssistant Radius Detection Patch", "1.5.0")]
public class MervilsRadiusPlugin : BaseUnityPlugin
{
	internal static ConfigEntry<bool> radiusDetectionEnabled;

	internal static ConfigEntry<float> radiusDetectionInterval;

	internal static ConfigEntry<bool> useFullExplorationRadius;

	internal static ConfigEntry<float> radiusDetectionRadius;

	internal static ConfigEntry<KeyboardShortcut> radiusDetectionToggleKey;

	internal static ConfigEntry<bool> radiusDebugMode;

	private void Awake()
	{
		//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fb: Expected O, but got Unknown
		radiusDetectionEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "RadiusDetectionEnabled", true, "Enable radius-based object detection. If false, only direct visualization detection will be used.");
		radiusDetectionInterval = ((BaseUnityPlugin)this).Config.Bind<float>("General", "RadiusDetectionInterval", 1f, "Time in seconds between automatic radius detection scans.");
		useFullExplorationRadius = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "UsePlayerExploreRadius", true, "If true, radius detection uses the player's current map exploration radius. If false, it uses the configured RadiusDetectionRadius.");
		radiusDetectionRadius = ((BaseUnityPlugin)this).Config.Bind<float>("General", "RadiusDetectionRadius", 50f, "The radius around the player to detect pins (in Unity units, ~meters).");
		radiusDetectionToggleKey = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("Hotkeys", "RadiusDetectionToggleKey", new KeyboardShortcut((KeyCode)292, (KeyCode[])(object)new KeyCode[1] { (KeyCode)306 }), "Hotkey to toggle radius detection on/off.");
		radiusDebugMode = ((BaseUnityPlugin)this).Config.Bind<bool>("Debug", "RadiusDebugMode", false, "Enable debug logging.");
		Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), "Mervil.pinassistantradiuspatch");
		GameObject val = new GameObject("RadiusPinDetector");
		val.AddComponent<RadiusPinDetector>();
		Object.DontDestroyOnLoad((Object)(object)val);
	}
}
public class RadiusPinDetector : MonoBehaviour
{
	private class PinState
	{
		public string NormalizedName;

		public string PrefabName;

		public ZDOID ZdoID;

		public bool Mobile;

		public Vector3 LastPosition;

		public GameObject PinnedObject;

		public PinData Pin;

		public bool WasManuallyRemoved;

		public bool WasBlackListed;

		public string MatchedTrackedObjectName;
	}

	private struct ExactMatchStatus
	{
		public bool Current;

		public bool Previous;
	}

	private struct BlackListData
	{
		public string OriginalString;

		public HashSet<string> ParsedWords;
	}

	[CompilerGenerated]
	private sealed class <RadiusDetectorCoroutine>d__38 : IEnumerator<object>, IDisposable, IEnumerator
	{
		private int <>1__state;

		private object <>2__current;

		public RadiusPinDetector <>4__this;

		private GameObject[] <allObjects>5__1;

		private int <currentIndex>5__2;

		private int <allObjectsLength>5__3;

		private PlatformUserID <localPlatformID>5__4;

		private float <batchStartTime>5__5;

		private int <batchSize>5__6;

		private Vector3 <playerPos>5__7;

		private float <scanRadius>5__8;

		private float <elapsed>5__9;

		private float <waitTime>5__10;

		private Dictionary<string, TrieNode<TrackedObject>>.Enumerator <>s__11;

		private KeyValuePair<string, TrieNode<TrackedObject>> <kvp>5__12;

		private string <trackedObjectKey>5__13;

		private TrackedObject <trackedObject>5__14;

		private string <customName>5__15;

		private PinType <icon>5__16;

		private string <trackedObjectGroupKey>5__17;

		private Exception <ex>5__18;

		private HashSet<string> <currentAltKeys>5__19;

		private HashSet<string> <normalizedKeys>5__20;

		private bool <setHasChanged>5__21;

		private Dictionary<string, string> <oldGroupKeyToTrackedObject>5__22;

		private int <preRestorationCount>5__23;

		private Dictionary<string, TrieNode<TrackedObject>>.Enumerator <>s__24;

		private KeyValuePair<string, TrieNode<TrackedObject>> <kvp>5__25;

		private string <key>5__26;

		private TrackedObject <trackedObject>5__27;

		private bool <currentExactMatch>5__28;

		private bool <needsUpdate>5__29;

		private string <currentBlackListWords>5__30;

		private bool <needsBlackListUpdate>5__31;

		private Exception <ex>5__32;

		private bool <hadPreviousValue>5__33;

		private bool <previousExactMatch>5__34;

		private Exception <ex>5__35;

		private bool <hadPreviousBlackList>5__36;

		private HashSet<string> <parsedWords>5__37;

		private string[] <words>5__38;

		private string[] <>s__39;

		private int <>s__40;

		private string <word>5__41;

		private string <trimmed>5__42;

		private string <customName>5__43;

		private PinType <icon>5__44;

		private string <trackedObjectGroupKey>5__45;

		private Exception <ex>5__46;

		private Exception <ex>5__47;

		private List<PinData> <stampList>5__48;

		private List<PinData> <pinsList>5__49;

		private int <stamped>5__50;

		private List<PinData>.Enumerator <>s__51;

		private PinData <pin>5__52;

		private string <trackedObjectGroupKey>5__53;

		private int <archivedCount>5__54;

		private Dictionary<string, int> <archivedByType>5__55;

		private Dictionary<PinData, PinState> <pinToPinState>5__56;

		private Dictionary<ZDOID, PinState>.Enumerator <>s__57;

		private KeyValuePair<ZDOID, PinState> <kvp>5__58;

		private List<PinData>.Enumerator <>s__59;

		private PinData <pin>5__60;

		private string <trackedObjectNameToArchiveUnder>5__61;

		private PinState <existingPinState>5__62;

		private string <trackedObjectGroupKey>5__63;

		private PinState <archivedPinState>5__64;

		private Exception <ex>5__65;

		private Dictionary<ZDO, ZNetView> <instanceDict>5__66;

		private Exception <ex>5__67;

		private Exception <ex>5__68;

		object IEnumerator<object>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <RadiusDetectorCoroutine>d__38(int <>1__state)
		{
			this.<>1__state = <>1__state;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			<allObjects>5__1 = null;
			<localPlatformID>5__4 = default(PlatformUserID);
			<>s__11 = default(Dictionary<string, TrieNode<TrackedObject>>.Enumerator);
			<kvp>5__12 = default(KeyValuePair<string, TrieNode<TrackedObject>>);
			<trackedObjectKey>5__13 = null;
			<trackedObject>5__14 = null;
			<customName>5__15 = null;
			<trackedObjectGroupKey>5__17 = null;
			<ex>5__18 = null;
			<currentAltKeys>5__19 = null;
			<normalizedKeys>5__20 = null;
			<oldGroupKeyToTrackedObject>5__22 = null;
			<>s__24 = default(Dictionary<string, TrieNode<TrackedObject>>.Enumerator);
			<kvp>5__25 = default(KeyValuePair<string, TrieNode<TrackedObject>>);
			<key>5__26 = null;
			<trackedObject>5__27 = null;
			<currentBlackListWords>5__30 = null;
			<ex>5__32 = null;
			<ex>5__35 = null;
			<parsedWords>5__37 = null;
			<words>5__38 = null;
			<>s__39 = null;
			<word>5__41 = null;
			<trimmed>5__42 = null;
			<customName>5__43 = null;
			<trackedObjectGroupKey>5__45 = null;
			<ex>5__46 = null;
			<ex>5__47 = null;
			<stampList>5__48 = null;
			<pinsList>5__49 = null;
			<>s__51 = default(List<PinData>.Enumerator);
			<pin>5__52 = null;
			<trackedObjectGroupKey>5__53 = null;
			<archivedByType>5__55 = null;
			<pinToPinState>5__56 = null;
			<>s__57 = default(Dictionary<ZDOID, PinState>.Enumerator);
			<kvp>5__58 = default(KeyValuePair<ZDOID, PinState>);
			<>s__59 = default(List<PinData>.Enumerator);
			<pin>5__60 = null;
			<trackedObjectNameToArchiveUnder>5__61 = null;
			<existingPinState>5__62 = null;
			<trackedObjectGroupKey>5__63 = null;
			<archivedPinState>5__64 = null;
			<ex>5__65 = null;
			<instanceDict>5__66 = null;
			<ex>5__67 = null;
			<ex>5__68 = null;
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			//IL_167a: Unknown result type (might be due to invalid IL or missing references)
			//IL_1684: Expected O, but got Unknown
			//IL_150a: Unknown result type (might be due to invalid IL or missing references)
			//IL_14f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_150f: Unknown result type (might be due to invalid IL or missing references)
			//IL_15b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_1608: Unknown result type (might be due to invalid IL or missing references)
			//IL_040f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0419: Expected O, but got Unknown
			//IL_037d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0387: Expected O, but got Unknown
			//IL_0b6a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0b6f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0b7c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_04fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0501: 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_010f: Unknown result type (might be due to invalid IL or missing references)
			//IL_051e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0dae: Unknown result type (might be due to invalid IL or missing references)
			//IL_0db3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0dd6: Unknown result type (might be due to invalid IL or missing references)
			//IL_0e08: Unknown result type (might be due to invalid IL or missing references)
			//IL_0e0d: Unknown result type (might be due to invalid IL or missing references)
			//IL_029e: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a8: Expected O, but got Unknown
			//IL_0fab: Unknown result type (might be due to invalid IL or missing references)
			//IL_0fb0: Unknown result type (might be due to invalid IL or missing references)
			//IL_1027: Unknown result type (might be due to invalid IL or missing references)
			//IL_1149: Unknown result type (might be due to invalid IL or missing references)
			//IL_114e: Unknown result type (might be due to invalid IL or missing references)
			//IL_1179: Unknown result type (might be due to invalid IL or missing references)
			//IL_117e: Unknown result type (might be due to invalid IL or missing references)
			//IL_1133: Unknown result type (might be due to invalid IL or missing references)
			switch (<>1__state)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				goto IL_02b9;
			case 1:
				<>1__state = -1;
				goto IL_02b9;
			case 2:
				<>1__state = -1;
				goto IL_1695;
			case 3:
				<>1__state = -1;
				goto IL_1695;
			case 4:
				<>1__state = -1;
				break;
			case 5:
				{
					<>1__state = -1;
					goto IL_1695;
				}
				IL_02b9:
				if ((Object)(object)<>4__this.m_player == (Object)null || (Object)(object)<>4__this.m_minimap == (Object)null || (Object)(object)<>4__this.znetScene == (Object)null)
				{
					if ((Object)(object)<>4__this.m_player == (Object)null && (Object)(object)Player.m_localPlayer != (Object)null)
					{
						<>4__this.m_player = Player.m_localPlayer;
						<>4__this.m_localPlayerID = <>4__this.m_player.GetPlayerID();
						<localPlatformID>5__4 = ((IUser)PlatformManager.DistributionPlatform.LocalUser).PlatformUserID;
						ModAuthorID = new PlatformUserID("PinAssistantRadiusPatch", ((object)(PlatformUserID)(ref <localPlatformID>5__4)).ToString());
						if (MervilsRadiusPlugin.radiusDebugMode.Value)
						{
							Debug.Log((object)("[RadiusPinDetector][INIT] Player found: " + ((Object)<>4__this.m_player).name));
							Debug.Log((object)$"[RadiusPinDetector][INIT] Initialized ModAuthorID: {ModAuthorID}");
						}
						<localPlatformID>5__4 = default(PlatformUserID);
					}
					if ((Object)(object)<>4__this.m_minimap == (Object)null && (Object)(object)Minimap.instance != (Object)null)
					{
						<>4__this.m_minimap = Minimap.instance;
						<>4__this.minimapPinsField = typeof(Minimap).GetField("m_pins", BindingFlags.Instance | BindingFlags.NonPublic);
						if (MervilsRadiusPlugin.radiusDebugMode.Value)
						{
							Debug.Log((object)"[RadiusPinDetector][INIT] Minimap instance found.");
						}
					}
					if ((Object)(object)<>4__this.znetScene == (Object)null && (Object)(object)ZNetScene.instance != (Object)null)
					{
						<>4__this.znetScene = ZNetScene.instance;
						<>4__this.znetInstancesField = typeof(ZNetScene).GetField("m_instances", BindingFlags.Instance | BindingFlags.NonPublic);
						<>4__this.locationProxyInstanceField = typeof(LocationProxy).GetField("m_instance", BindingFlags.Instance | BindingFlags.NonPublic);
						if (MervilsRadiusPlugin.radiusDebugMode.Value)
						{
							Debug.Log((object)"[RadiusPinDetector][INIT] ZNetScene.instance is ready!");
						}
					}
					if (((Object)(object)<>4__this.m_player == (Object)null || (Object)(object)<>4__this.m_minimap == (Object)null || (Object)(object)<>4__this.znetScene == (Object)null) && MervilsRadiusPlugin.radiusDebugMode.Value)
					{
						Debug.Log((object)"[RadiusPinDetector][WAIT] Waiting for asset initiation...");
					}
					<>2__current = (object)new WaitForSeconds(5f);
					<>1__state = 1;
					return true;
				}
				if (!<>4__this.InitializePinAssistantReferences())
				{
					return false;
				}
				<allObjects>5__1 = Array.Empty<GameObject>();
				<currentIndex>5__2 = 0;
				<allObjectsLength>5__3 = 0;
				goto IL_1695;
				IL_1695:
				if (!<>4__this.AreCoreReferencesValid() && !<>4__this.ReInitializeCoreReferences())
				{
					if (MervilsRadiusPlugin.radiusDebugMode.Value)
					{
						Debug.Log((object)"[RadiusPinDetector][WAIT] Core references still unavailable, waiting 5 seconds...");
					}
					<>2__current = (object)new WaitForSeconds(5f);
					<>1__state = 2;
					return true;
				}
				if (!<>4__this.ArePinAssistantReferencesValid())
				{
					if (MervilsRadiusPlugin.radiusDebugMode.Value)
					{
						Debug.Log((object)"[RadiusPinDetector][WAIT] PinAssistant references invalid, refreshing...");
					}
					if (!<>4__this.InitializePinAssistantReferences())
					{
						return false;
					}
				}
				<batchStartTime>5__5 = Time.realtimeSinceStartup;
				if (!MervilsRadiusPlugin.radiusDetectionEnabled.Value)
				{
					<>2__current = (object)new WaitForSeconds(MervilsRadiusPlugin.radiusDetectionInterval.Value);
					<>1__state = 3;
					return true;
				}
				try
				{
					PinAssistantReflectionHelper.AltDictionaryInstance = PinAssistantReflectionHelper.AltDictionaryProperty.GetValue(PinAssistantReflectionHelper.TrackedObjectsInstance) as Dictionary<string, TrieNode<TrackedObject>>;
					if (PinAssistantReflectionHelper.AltDictionaryInstance != null && <>4__this.groupKeyToTrackedObject.Count == 0)
					{
						<>s__11 = PinAssistantReflectionHelper.AltDictionaryInstance.GetEnumerator();
						try
						{
							while (<>s__11.MoveNext())
							{
								<kvp>5__12 = <>s__11.Current;
								<trackedObjectKey>5__13 = NormalizeName(<kvp>5__12.Key);
								<trackedObject>5__14 = <kvp>5__12.Value?.Value;
								if (<trackedObject>5__14 != null)
								{
									try
									{
										<customName>5__15 = NormalizeName(<trackedObject>5__14.Name);
										<icon>5__16 = <trackedObject>5__14.Icon;
										if (<customName>5__15 != null)
										{
											<trackedObjectGroupKey>5__17 = GetTrackedObjectGroupKey(<customName>5__15, <icon>5__16);
											<>4__this.groupKeyToTrackedObject[<trackedObjectGroupKey>5__17] = <trackedObjectKey>5__13;
											<trackedObjectGroupKey>5__17 = null;
										}
										<customName>5__15 = null;
									}
									catch (Exception ex)
									{
										<ex>5__18 = ex;
										if (MervilsRadiusPlugin.radiusDebugMode.Value)
										{
											Debug.LogWarning((object)$"[RadiusPinDetector][WARN] Failed to build pin key mapping for '{<trackedObjectKey>5__13}': {<ex>5__18}.");
										}
									}
								}
								<trackedObjectKey>5__13 = null;
								<trackedObject>5__14 = null;
								<kvp>5__12 = default(KeyValuePair<string, TrieNode<TrackedObject>>);
							}
						}
						finally
						{
							((IDisposable)<>s__11).Dispose();
						}
						<>s__11 = default(Dictionary<string, TrieNode<TrackedObject>>.Enumerator);
					}
					if (PinAssistantReflectionHelper.AltDictionaryInstance != null)
					{
						<currentAltKeys>5__19 = new HashSet<string>(PinAssistantReflectionHelper.AltDictionaryInstance.Keys, StringComparer.OrdinalIgnoreCase);
						<normalizedKeys>5__20 = <currentAltKeys>5__19.Select((string k) => NormalizeName(k)).ToHashSet<string>(StringComparer.OrdinalIgnoreCase);
						<setHasChanged>5__21 = !<normalizedKeys>5__20.SetEquals(<>4__this.allowedNames.Where((string name) => !name.EndsWith("_frac")));
						<oldGroupKeyToTrackedObject>5__22 = null;
						<preRestorationCount>5__23 = 0;
						if (<setHasChanged>5__21)
						{
							<oldGroupKeyToTrackedObject>5__22 = new Dictionary<string, string>(<>4__this.groupKeyToTrackedObject, StringComparer.OrdinalIgnoreCase);
							<>4__this.allowedNames.Clear();
							<>4__this.groupKeyToTrackedObject.Clear();
							<preRestorationCount>5__23 = <>4__this.removedPinsForRestoration.Count;
						}
						<>s__24 = PinAssistantReflectionHelper.AltDictionaryInstance.GetEnumerator();
						try
						{
							while (<>s__24.MoveNext())
							{
								<kvp>5__25 = <>s__24.Current;
								<key>5__26 = NormalizeName(<kvp>5__25.Key);
								<trackedObject>5__27 = <kvp>5__25.Value?.Value;
								if (<trackedObject>5__27 != null)
								{
									<currentExactMatch>5__28 = true;
									try
									{
										<currentExactMatch>5__28 = <trackedObject>5__27.IsExactMatchOnly;
									}
									catch (Exception ex)
									{
										<ex>5__32 = ex;
										if (MervilsRadiusPlugin.radiusDebugMode.Value)
										{
											Debug.LogWarning((object)$"[RadiusPinDetector][WARN] Failed to read IsExactMatchOnly for '{<key>5__26}': {<ex>5__32}. Defaulting to true.");
										}
									}
									<needsUpdate>5__29 = !<>4__this.exactMatchStatus.ContainsKey(<key>5__26) || <>4__this.exactMatchStatus[<key>5__26].Current != <currentExactMatch>5__28;
									if (<needsUpdate>5__29)
									{
										<hadPreviousValue>5__33 = <>4__this.exactMatchStatus.ContainsKey(<key>5__26);
										<previousExactMatch>5__34 = !<hadPreviousValue>5__33 || <>4__this.exactMatchStatus[<key>5__26].Current;
										<>4__this.exactMatchStatus[<key>5__26] = new ExactMatchStatus
										{
											Current = <currentExactMatch>5__28,
											Previous = <previousExactMatch>5__34
										};
										if ((<hadPreviousValue>5__33 & <previousExactMatch>5__34) && !<currentExactMatch>5__28)
										{
											<>4__this.RestoreManuallyRemovedPins(<key>5__26);
										}
									}
									<currentBlackListWords>5__30 = string.Empty;
									try
									{
										<currentBlackListWords>5__30 = <trackedObject>5__27.BlackListWords ?? string.Empty;
									}
									catch (Exception ex)
									{
										<ex>5__35 = ex;
										if (MervilsRadiusPlugin.radiusDebugMode.Value)
										{
											Debug.LogWarning((object)$"[RadiusPinDetector][WARN] Failed to read BlackListWords for '{<key>5__26}': {<ex>5__35}. Defaulting to empty.");
										}
									}
									<needsBlackListUpdate>5__31 = !<>4__this.blackListWords.ContainsKey(<key>5__26) || <>4__this.blackListWords[<key>5__26].OriginalString != <currentBlackListWords>5__30;
									if (<needsBlackListUpdate>5__31)
									{
										<hadPreviousBlackList>5__36 = <>4__this.blackListWords.ContainsKey(<key>5__26);
										<parsedWords>5__37 = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
										if (!string.IsNullOrWhiteSpace(<currentBlackListWords>5__30))
										{
											<words>5__38 = <currentBlackListWords>5__30.Split(new char[1] { ',' });
											<>s__39 = <words>5__38;
											for (<>s__40 = 0; <>s__40 < <>s__39.Length; <>s__40++)
											{
												<word>5__41 = <>s__39[<>s__40];
												<trimmed>5__42 = <word>5__41.Trim();
												if (!string.IsNullOrEmpty(<trimmed>5__42))
												{
													<parsedWords>5__37.Add(<trimmed>5__42.ToLowerInvariant());
												}
												<trimmed>5__42 = null;
												<word>5__41 = null;
											}
											<>s__39 = null;
											<words>5__38 = null;
										}
										<>4__this.blackListWords[<key>5__26] = new BlackListData
										{
											OriginalString = <currentBlackListWords>5__30,
											ParsedWords = <parsedWords>5__37
										};
										if (<hadPreviousBlackList>5__36)
										{
											<>4__this.UpdatePinsForBlackListChange(<key>5__26);
										}
										<parsedWords>5__37 = null;
									}
									if (<setHasChanged>5__21)
									{
										<>4__this.allowedNames.Add(<key>5__26);
										<>4__this.allowedNames.Add(<key>5__26 + "_frac");
										<customName>5__43 = NormalizeName(<trackedObject>5__27.Name);
										if (<customName>5__43 != null)
										{
											try
											{
												<icon>5__44 = <trackedObject>5__27.Icon;
												<trackedObjectGroupKey>5__45 = GetTrackedObjectGroupKey(<customName>5__43, <icon>5__44);
												<>4__this.groupKeyToTrackedObject[<trackedObjectGroupKey>5__45] = <key>5__26;
												<trackedObjectGroupKey>5__45 = null;
											}
											catch (Exception ex)
											{
												<ex>5__46 = ex;
												if (MervilsRadiusPlugin.radiusDebugMode.Value)
												{
													Debug.LogWarning((object)$"[RadiusPinDetector][WARN] Failed to read Icon for '{<key>5__26}': {<ex>5__46}. Skipping pin key mapping.");
												}
											}
										}
										if (<>4__this.removedPinsForRestoration.ContainsKey(<key>5__26))
										{
											try
											{
												<>4__this.RestoreRemovedPins(<key>5__26);
											}
											catch (Exception ex)
											{
												<ex>5__47 = ex;
												Debug.LogError((object)$"[RadiusPinDetector][ERROR] Failed to restore pins for '{<key>5__26}': {<ex>5__47}. Continuing with other objects.");
												<>4__this.removedPinsForRestoration.Remove(<key>5__26);
											}
										}
										<customName>5__43 = null;
									}
									<currentBlackListWords>5__30 = null;
								}
								<key>5__26 = null;
								<trackedObject>5__27 = null;
								<kvp>5__25 = default(KeyValuePair<string, TrieNode<TrackedObject>>);
							}
						}
						finally
						{
							((IDisposable)<>s__24).Dispose();
						}
						<>s__24 = default(Dictionary<string, TrieNode<TrackedObject>>.Enumerator);
						if (<setHasChanged>5__21)
						{
							if (MervilsRadiusPlugin.radiusDebugMode.Value)
							{
								Debug.Log((object)string.Format("[RadiusPinDetector][INFO] AltDictionary contains {0} entries: {1}", PinAssistantReflectionHelper.AltDictionaryInstance.Count, string.Join(", ", PinAssistantReflectionHelper.AltDictionaryInstance.Keys)));
								Debug.Log((object)$"[RadiusPinDetector][INFO] AllowedNames updated to match. Total entries: {<>4__this.allowedNames.Count}. Pins restored from archive: {<preRestorationCount>5__23 - <>4__this.removedPinsForRestoration.Count}.");
							}
							<stampList>5__48 = <>4__this.GetPinsList();
							if (<stampList>5__48 != null)
							{
								<stamped>5__50 = 0;
								<>s__51 = <stampList>5__48.GetEnumerator();
								try
								{
									while (<>s__51.MoveNext())
									{
										<pin>5__52 = <>s__51.Current;
										if (<pin>5__52.m_author == PlatformUserID.None)
										{
											<trackedObjectGroupKey>5__53 = GetTrackedObjectGroupKey(<pin>5__52.m_name, <pin>5__52.m_type);
											if (<>4__this.groupKeyToTrackedObject.ContainsKey(<trackedObjectGroupKey>5__53))
											{
												<pin>5__52.m_author = ModAuthorID;
											}
											<trackedObjectGroupKey>5__53 = null;
										}
										<pin>5__52 = null;
									}
								}
								finally
								{
									((IDisposable)<>s__51).Dispose();
								}
								<>s__51 = default(List<PinData>.Enumerator);
								if (MervilsRadiusPlugin.radiusDebugMode.Value && <stamped>5__50 > 0)
								{
									Debug.Log((object)$"[RadiusPinDetector][INIT] Retroactively stamped {<stamped>5__50} existing pins with mod author ID");
								}
							}
							<pinsList>5__49 = <>4__this.GetPinsList();
							if (<pinsList>5__49 != null)
							{
								<archivedCount>5__54 = 0;
								<archivedByType>5__55 = new Dictionary<string, int>();
								<pinToPinState>5__56 = new Dictionary<PinData, PinState>();
								<>s__57 = <>4__this.alreadyPinned.GetEnumerator();
								try
								{
									while (<>s__57.MoveNext())
									{
										<kvp>5__58 = <>s__57.Current;
										if (<kvp>5__58.Value.Pin != null)
										{
											<pinToPinState>5__56[<kvp>5__58.Value.Pin] = <kvp>5__58.Value;
										}
										<kvp>5__58 = default(KeyValuePair<ZDOID, PinState>);
									}
								}
								finally
								{
									((IDisposable)<>s__57).Dispose();
								}
								<>s__57 = default(Dictionary<ZDOID, PinState>.Enumerator);
								<>s__59 = <pinsList>5__49.ToList().GetEnumerator();
								try
								{
									while (<>s__59.MoveNext())
									{
										<pin>5__60 = <>s__59.Current;
										if (<pin>5__60.m_author == ModAuthorID)
										{
											<trackedObjectNameToArchiveUnder>5__61 = null;
											<existingPinState>5__62 = null;
											if (<pinToPinState>5__56.TryGetValue(<pin>5__60, out <existingPinState>5__62))
											{
												<trackedObjectNameToArchiveUnder>5__61 = <existingPinState>5__62.MatchedTrackedObjectName;
											}
											if (<trackedObjectNameToArchiveUnder>5__61 == null)
											{
												<trackedObjectGroupKey>5__63 = GetTrackedObjectGroupKey(<pin>5__60.m_name, <pin>5__60.m_type);
												if (<>4__this.groupKeyToTrackedObject.ContainsKey(<trackedObjectGroupKey>5__63))
												{
													continue;
												}
												if (<oldGroupKeyToTrackedObject>5__22 != null && <oldGroupKeyToTrackedObject>5__22.ContainsKey(<trackedObjectGroupKey>5__63))
												{
													<trackedObjectNameToArchiveUnder>5__61 = <oldGroupKeyToTrackedObject>5__22[<trackedObjectGroupKey>5__63];
												}
												<trackedObjectGroupKey>5__63 = null;
											}
											if (<trackedObjectNameToArchiveUnder>5__61 != null && !<>4__this.allowedNames.Contains(<trackedObjectNameToArchiveUnder>5__61))
											{
												if (!<>4__this.removedPinsForRestoration.ContainsKey(<trackedObjectNameToArchiveUnder>5__61))
												{
													<>4__this.removedPinsForRestoration[<trackedObjectNameToArchiveUnder>5__61] = new List<PinState>();
												}
												if (<existingPinState>5__62 != null)
												{
													<archivedPinState>5__64 = <existingPinState>5__62;
													<>4__this.alreadyPinned.Remove(<existingPinState>5__62.ZdoID);
												}
												else
												{
													<archivedPinState>5__64 = new PinState
													{
														ZdoID = ZDOID.None,
														NormalizedName = <trackedObjectNameToArchiveUnder>5__61,
														PrefabName = <trackedObjectNameToArchiveUnder>5__61,
														Mobile = false,
														LastPosition = <pin>5__60.m_pos,
														PinnedObject = null,
														Pin = <pin>5__60,
														WasManuallyRemoved = false,
														WasBlackListed = false,
														MatchedTrackedObjectName = <trackedObjectNameToArchiveUnder>5__61
													};
												}
												<>4__this.removedPinsForRestoration[<trackedObjectNameToArchiveUnder>5__61].Add(<archivedPinState>5__64);
												<archivedCount>5__54++;
												if (!<archivedByType>5__55.ContainsKey(<trackedObjectNameToArchiveUnder>5__61))
												{
													<archivedByType>5__55[<trackedObjectNameToArchiveUnder>5__61] = 0;
												}
												<archivedByType>5__55[<trackedObjectNameToArchiveUnder>5__61]++;
												Minimap.instance.RemovePin(<pin>5__60);
												<archivedPinState>5__64 = null;
											}
											<trackedObjectNameToArchiveUnder>5__61 = null;
											<existingPinState>5__62 = null;
										}
										<pin>5__60 = null;
									}
								}
								finally
								{
									((IDisposable)<>s__59).Dispose();
								}
								<>s__59 = default(List<PinData>.Enumerator);
								if (MervilsRadiusPlugin.radiusDebugMode.Value && <archivedCount>5__54 > 0)
								{
									Debug.Log((object)string.Format("[RadiusPinDetector][CLEANUP] Archived {0} pins: {1}", <archivedCount>5__54, string.Join(", ", <archivedByType>5__55.Select((KeyValuePair<string, int> kvp) => $"{kvp.Key}({kvp.Value})"))));
								}
								<archivedByType>5__55 = null;
								<pinToPinState>5__56 = null;
							}
							<stampList>5__48 = null;
							<pinsList>5__49 = null;
						}
						<currentAltKeys>5__19 = null;
						<normalizedKeys>5__20 = null;
						<oldGroupKeyToTrackedObject>5__22 = null;
					}
					else if (MervilsRadiusPlugin.radiusDebugMode.Value)
					{
						Debug.LogWarning((object)"[RadiusPinDetector][WARN] AltDictionary is null! PinAssistant's tracked objects cannot be read.");
					}
				}
				catch (Exception ex)
				{
					<ex>5__65 = ex;
					Debug.LogError((object)$"[RadiusPinDetector][ERROR] PinAssistant reflection failed: {<ex>5__65}. Continuing with existing allowedNames.");
				}
				try
				{
					if ((<allObjects>5__1.Length == 0 || <currentIndex>5__2 >= <allObjectsLength>5__3) && (Object)(object)<>4__this.znetScene != (Object)null && <>4__this.znetInstancesField != null)
					{
						<instanceDict>5__66 = <>4__this.znetInstancesField.GetValue(<>4__this.znetScene) as Dictionary<ZDO, ZNetView>;
						if (<instanceDict>5__66 != null)
						{
							<allObjects>5__1 = (from z in <instanceDict>5__66.Values
								where (Object)(object)z != (Object)null && (Object)(object)((Component)z).gameObject != (Object)null
								select ((Component)z).gameObject).ToArray();
						}
						<instanceDict>5__66 = null;
					}
				}
				catch (Exception ex)
				{
					<ex>5__67 = ex;
					Debug.LogError((object)$"[RadiusPinDetector][ERROR] ZNetScene object retrieval failed: {<ex>5__67}. Using empty object array for this cycle.");
					<allObjects>5__1 = Array.Empty<GameObject>();
				}
				<currentIndex>5__2 = 0;
				<allObjectsLength>5__3 = <allObjects>5__1.Length;
				<batchSize>5__6 = Mathf.Clamp(<allObjectsLength>5__3 / 60, 50, 200);
				<playerPos>5__7 = (((Object)(object)<>4__this.m_player != (Object)null) ? ((Component)<>4__this.m_player).transform.position : Vector3.zero);
				<>4__this.scanCyclePinsCreated = 0;
				<>4__this.scanCycleObjectsCorrelated = 0;
				<>4__this.scanCycleObjectsClustered = 0;
				<>4__this.scanCycleSkippedAlreadyPinned = 0;
				<>4__this.scanCycleSkippedPreviouslyFound = 0;
				<>4__this.scanCycleObjectsBlackListed = 0;
				<>4__this.scanCycleSkippedByType.Clear();
				<scanRadius>5__8 = <>4__this.ResolveScanRadius();
				<>4__this.UpdateRedundancyDistances();
				break;
			}
			if (<currentIndex>5__2 < <allObjectsLength>5__3)
			{
				<>4__this.ProcessAllObjectsInBatches(<allObjects>5__1, ref <currentIndex>5__2, <batchSize>5__6, <allObjectsLength>5__3, <scanRadius>5__8, <playerPos>5__7, <>4__this.allowedNames);
				<>2__current = null;
				<>1__state = 4;
				return true;
			}
			try
			{
				<>4__this.CleanUpPinCache(<>4__this.allowedNames, <playerPos>5__7, <scanRadius>5__8);
			}
			catch (Exception ex)
			{
				<ex>5__68 = ex;
				Debug.LogError((object)$"[RadiusPinDetector][ERROR] CleanUpPinCache failed: {<ex>5__68}. Continuing to next scan cycle.");
			}
			<elapsed>5__9 = Time.realtimeSinceStartup - <batchStartTime>5__5;
			<waitTime>5__10 = Mathf.Max(0f, MervilsRadiusPlugin.radiusDetectionInterval.Value - <elapsed>5__9);
			<>2__current = (object)new WaitForSeconds(<waitTime>5__10);
			<>1__state = 5;
			return true;
		}

		bool IEnumerator.MoveNext()
		{
			//ILSpy generated this explicit interface implementation from .override directive in MoveNext
			return this.MoveNext();
		}

		[DebuggerHidden]
		void IEnumerator.Reset()
		{
			throw new NotSupportedException();
		}
	}

	private static PlatformUserID ModAuthorID = PlatformUserID.None;

	private Player m_player;

	private long m_localPlayerID = 0L;

	private Minimap m_minimap;

	private FieldInfo minimapPinsField;

	private ZNetScene znetScene;

	private FieldInfo znetInstancesField;

	private FieldInfo locationProxyInstanceField;

	private float redundancyDistanceSame = 1f;

	private float redundancyDistanceAny = 1f;

	private float lastRedundancyRefreshTime = 0f;

	private const float redundancyRefreshInterval = 5f;

	private ConfigEntry<float> cachedSameConfigEntry;

	private ConfigEntry<float> cachedAnyConfigEntry;

	private Dictionary<ZDOID, PinState> alreadyPinned = new Dictionary<ZDOID, PinState>();

	private Dictionary<ZDOID, PinState> foundAndNotPinned = new Dictionary<ZDOID, PinState>();

	private Dictionary<string, bool> prefabMobilityCache = new Dictionary<string, bool>(StringComparer.OrdinalIgnoreCase);

	private Dictionary<string, List<PinState>> removedPinsForRestoration = new Dictionary<string, List<PinState>>(StringComparer.OrdinalIgnoreCase);

	private Dictionary<Vector3, PinData> existingPinsForCorrelation = new Dictionary<Vector3, PinData>();

	private Dictionary<Vector3, PinData> nearbyOrphanedPins = new Dictionary<Vector3, PinData>();

	private Dictionary<string, string> groupKeyToTrackedObject = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);

	private HashSet<string> allowedNames = new HashSet<string>(StringComparer.OrdinalIgnoreCase);

	private Dictionary<string, ExactMatchStatus> exactMatchStatus = new Dictionary<string, ExactMatchStatus>(StringComparer.OrdinalIgnoreCase);

	private Dictionary<string, BlackListData> blackListWords = new Dictionary<string, BlackListData>(StringComparer.OrdinalIgnoreCase);

	private int scanCyclePinsCreated = 0;

	private int scanCycleObjectsCorrelated = 0;

	private int scanCycleObjectsClustered = 0;

	private int scanCycleSkippedAlreadyPinned = 0;

	private int scanCycleSkippedPreviouslyFound = 0;

	private int scanCycleObjectsBlackListed = 0;

	private Dictionary<string, int> scanCycleSkippedByType = new Dictionary<string, int>();

	private static readonly Type[] MobileTypes = new Type[6]
	{
		typeof(Humanoid),
		typeof(Character),
		typeof(AnimalAI),
		typeof(RandomFlyingBird),
		typeof(Vagon),
		typeof(Ship)
	};

	private static bool IsMobile(GameObject targetObject)
	{
		Type[] mobileTypes = MobileTypes;
		foreach (Type type in mobileTypes)
		{
			if ((Object)(object)targetObject.GetComponent(type) != (Object)null)
			{
				return true;
			}
		}
		return false;
	}

	private void Start()
	{
		((MonoBehaviour)this).StartCoroutine(RadiusDetectorCoroutine());
	}

	private void Update()
	{
		//IL_000d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0012: Unknown result type (might be due to invalid IL or missing references)
		if (MervilsRadiusPlugin.radiusDetectionToggleKey == null)
		{
			return;
		}
		KeyboardShortcut value = MervilsRadiusPlugin.radiusDetectionToggleKey.Value;
		if (((KeyboardShortcut)(ref value)).IsDown())
		{
			MervilsRadiusPlugin.radiusDetectionEnabled.Value = !MervilsRadiusPlugin.radiusDetectionEnabled.Value;
			if (MervilsRadiusPlugin.radiusDebugMode.Value)
			{
				Debug.Log((object)$"[RadiusPinDetector][INFO] Radius detection toggled: {MervilsRadiusPlugin.radiusDetectionEnabled.Value}");
			}
		}
	}

	[IteratorStateMachine(typeof(<RadiusDetectorCoroutine>d__38))]
	private IEnumerator RadiusDetectorCoroutine()
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <RadiusDetectorCoroutine>d__38(0)
		{
			<>4__this = this
		};
	}

	private bool InitializePinAssistantReferences()
	{
		//IL_071e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0723: Unknown result type (might be due to invalid IL or missing references)
		//IL_074c: Unknown result type (might be due to invalid IL or missing references)
		//IL_061f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0624: Unknown result type (might be due to invalid IL or missing references)
		//IL_0768: Unknown result type (might be due to invalid IL or missing references)
		//IL_0634: Unknown result type (might be due to invalid IL or missing references)
		Type type = null;
		Type type2 = null;
		Assembly pinAssistantAssembly = PinAssistantReflectionHelper.GetPinAssistantAssembly();
		if (pinAssistantAssembly != null)
		{
			type = pinAssistantAssembly.GetType("WxAxW.PinAssistant.Core.TrackingHandler");
			type2 = pinAssistantAssembly.GetType("WxAxW.PinAssistant.Configuration.ModConfig");
		}
		else
		{
			if (MervilsRadiusPlugin.radiusDebugMode.Value)
			{
				Debug.LogWarning((object)"[RadiusPinDetector][WARN] PinAssistant assembly not found via helper in Coroutine. Attempting full assembly scan.");
			}
			Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
			foreach (Assembly assembly in assemblies)
			{
				if (type == null)
				{
					type = assembly.GetType("WxAxW.PinAssistant.Core.TrackingHandler");
				}
				if (type2 == null)
				{
					type2 = assembly.GetType("WxAxW.PinAssistant.Configuration.ModConfig");
				}
				if (type != null && type2 != null)
				{
					break;
				}
			}
		}
		if (type == null)
		{
			Debug.LogError((object)"[RadiusPinDetector][ERROR] Could not find WxAxW.PinAssistant.Core.TrackingHandler type.");
			return false;
		}
		if (type2 == null)
		{
			Debug.LogError((object)"[RadiusPinDetector][ERROR] Could not find WxAxW.PinAssistant.Core.ModConfig type.");
			return false;
		}
		PropertyInfo property = type.GetProperty("Instance", BindingFlags.Static | BindingFlags.Public);
		if (property == null)
		{
			Debug.LogError((object)"[RadiusPinDetector][ERROR] TrackingHandler.Instance property not found.");
			return false;
		}
		PinAssistantReflectionHelper.TrackingHandlerInstance = property.GetValue(null);
		if (PinAssistantReflectionHelper.TrackingHandlerInstance == null)
		{
			Debug.LogError((object)"[RadiusPinDetector][ERROR] TrackingHandler.Instance is null.");
			return false;
		}
		PropertyInfo property2 = type2.GetProperty("Instance", BindingFlags.Static | BindingFlags.Public);
		if (property2 == null)
		{
			Debug.LogError((object)"[RadiusPinDetector][ERROR] ModConfig.Instance property not found.");
			return false;
		}
		PinAssistantReflectionHelper.ModConfigInstance = property2.GetValue(null);
		if (PinAssistantReflectionHelper.ModConfigInstance == null)
		{
			Debug.LogError((object)"[RadiusPinDetector][ERROR] ModConfig.Instance is null.");
			return false;
		}
		PinAssistantReflectionHelper.AddObjAsPinMethod = type.GetMethod("AddObjAsPin", BindingFlags.Instance | BindingFlags.Public);
		if (PinAssistantReflectionHelper.AddObjAsPinMethod == null)
		{
			Debug.LogError((object)"[RadiusPinDetector][ERROR] AddObjAsPin method not found on TrackingHandler.");
			return false;
		}
		PinAssistantReflectionHelper.AddObjAsPinDelegate = delegate(string name, GameObject gameObj)
		{
			PinAssistantReflectionHelper.AddObjAsPinMethod.Invoke(PinAssistantReflectionHelper.TrackingHandlerInstance, new object[2] { name, gameObj });
		};
		PinAssistantReflectionHelper.TrackedObjectsField = type.GetField("m_trackedObjects", BindingFlags.Instance | BindingFlags.NonPublic);
		if (PinAssistantReflectionHelper.TrackedObjectsField == null)
		{
			Debug.LogError((object)"[RadiusPinDetector][ERROR] m_trackedObjects field not found on TrackingHandler.");
			return false;
		}
		PinAssistantReflectionHelper.TrackedObjectsInstance = PinAssistantReflectionHelper.TrackedObjectsField.GetValue(PinAssistantReflectionHelper.TrackingHandlerInstance);
		if (PinAssistantReflectionHelper.TrackedObjectsInstance == null)
		{
			if (MervilsRadiusPlugin.radiusDebugMode.Value)
			{
				Debug.LogWarning((object)"[RadiusPinDetector][WARN] m_trackedObjects from TrackingHandler is null.");
			}
			return false;
		}
		PinAssistantReflectionHelper.AltDictionaryProperty = PinAssistantReflectionHelper.TrackedObjectsInstance.GetType().GetProperty("AltDictionary", BindingFlags.Instance | BindingFlags.Public);
		if (PinAssistantReflectionHelper.AltDictionaryProperty == null)
		{
			Debug.LogError((object)"[RadiusPinDetector][ERROR] AltDictionary property not found on m_trackedObjects object.");
			return false;
		}
		PinAssistantReflectionHelper.AltDictionaryInstance = PinAssistantReflectionHelper.AltDictionaryProperty.GetValue(PinAssistantReflectionHelper.TrackedObjectsInstance) as Dictionary<string, TrieNode<TrackedObject>>;
		if (PinAssistantReflectionHelper.AltDictionaryInstance == null)
		{
			Debug.LogWarning((object)"[RadiusPinDetector][WARN] AltDictionary is null during initialization.");
		}
		Type type3 = pinAssistantAssembly?.GetType("WxAxW.PinAssistant.Core.PinHandler");
		if (type3 == null)
		{
			Debug.LogError((object)"[RadiusPinDetector][ERROR] Could not find WxAxW.PinAssistant.Core.PinHandler type.");
			return false;
		}
		PropertyInfo property3 = type3.GetProperty("Instance", BindingFlags.Static | BindingFlags.Public);
		if (property3 == null)
		{
			Debug.LogError((object)"[RadiusPinDetector][ERROR] PinHandler.Instance property not found.");
			return false;
		}
		PinAssistantReflectionHelper.PinHandlerInstance = property3.GetValue(null);
		if (PinAssistantReflectionHelper.PinHandlerInstance == null)
		{
			Debug.LogError((object)"[RadiusPinDetector][ERROR] PinHandler.Instance is null.");
			return false;
		}
		PinAssistantReflectionHelper.M_PinsField = type3.GetField("m_monitoredPins", BindingFlags.Instance | BindingFlags.NonPublic);
		if (PinAssistantReflectionHelper.M_PinsField == null)
		{
			Debug.LogError((object)"[RadiusPinDetector][ERROR] Could not find PinHandler.m_monitoredPins field via reflection.");
			return false;
		}
		PinAssistantReflectionHelper.RedundancySameProp = type2.GetProperty("RedundancyDistanceSameConfig", BindingFlags.Instance | BindingFlags.Public);
		if (PinAssistantReflectionHelper.RedundancySameProp == null)
		{
			Debug.LogError((object)"[RadiusPinDetector][ERROR] RedundancyDistanceSameConfig property not found on ModConfig.");
			return false;
		}
		PinAssistantReflectionHelper.RedundancyAnyProp = type2.GetProperty("RedundancyDistanceAnyConfig", BindingFlags.Instance | BindingFlags.Public);
		if (PinAssistantReflectionHelper.RedundancyAnyProp == null)
		{
			Debug.LogError((object)"[RadiusPinDetector][ERROR] RedundancyDistanceAnyConfig property not found on ModConfig.");
			return false;
		}
		Type type4 = pinAssistantAssembly?.GetType("WxAxW.PinAssistant.Components.TrackObjectUI");
		if (type4 == null)
		{
			Debug.LogError((object)"[RadiusPinDetector][ERROR] Could not find WxAxW.PinAssistant.Components.TrackObjectUI type.");
			return false;
		}
		PinAssistantReflectionHelper.TrackObjectUIInstance = type4.GetProperty("Instance", BindingFlags.Static | BindingFlags.Public)?.GetValue(null);
		if (PinAssistantReflectionHelper.TrackObjectUIInstance == null)
		{
			Debug.LogError((object)"[RadiusPinDetector][ERROR] TrackObjectUI.Instance property not found or is null.");
			return false;
		}
		PinAssistantReflectionHelper.TrackObjectUI_m_edittingObject = type4.GetField("m_edittingObject", BindingFlags.Instance | BindingFlags.NonPublic);
		if (PinAssistantReflectionHelper.TrackObjectUI_m_edittingObject == null)
		{
			Debug.LogError((object)"[RadiusPinDetector][ERROR] TrackObjectUI.m_edittingObject field not found.");
			return false;
		}
		try
		{
			Type type5 = pinAssistantAssembly.GetType("WxAxW.PinAssistant.Patches.MinimapPatches");
			if (type5 != null)
			{
				EventInfo @event = type5.GetEvent("OnPinAdd", BindingFlags.Static | BindingFlags.Public);
				if (@event != null)
				{
					Delegate handler = Delegate.CreateDelegate(@event.EventHandlerType, this, "OnPinAddedByPinAssistant");
					@event.AddEventHandler(null, handler);
					if (MervilsRadiusPlugin.radiusDebugMode.Value)
					{
						Debug.Log((object)"[RadiusPinDetector][INIT] Subscribed to PinAssistant's OnPinAdd event");
					}
				}
				else
				{
					Debug.LogWarning((object)"[RadiusPinDetector][WARN] Could not find OnPinAdd event in MinimapPatches");
				}
			}
		}
		catch (Exception arg)
		{
			Debug.LogError((object)$"[RadiusPinDetector][ERROR] Failed to subscribe to OnPinAdd event: {arg}");
		}
		groupKeyToTrackedObject.Clear();
		if (PinAssistantReflectionHelper.AltDictionaryInstance != null)
		{
			foreach (KeyValuePair<string, TrieNode<TrackedObject>> item in PinAssistantReflectionHelper.AltDictionaryInstance)
			{
				string text = NormalizeName(item.Key);
				TrackedObject val = item.Value?.Value;
				if (val == null)
				{
					continue;
				}
				try
				{
					string text2 = NormalizeName(val.Name);
					PinType icon = val.Icon;
					if (text2 != null)
					{
						string trackedObjectGroupKey = GetTrackedObjectGroupKey(text2, icon);
						groupKeyToTrackedObject[trackedObjectGroupKey] = text;
					}
				}
				catch (Exception arg2)
				{
					if (MervilsRadiusPlugin.radiusDebugMode.Value)
					{
						Debug.LogWarning((object)$"[RadiusPinDetector][WARN] Failed to build pin key mapping for '{text}': {arg2}.");
					}
				}
			}
			if (MervilsRadiusPlugin.radiusDebugMode.Value)
			{
				Debug.Log((object)$"[RadiusPinDetector][INIT] Built groupKeyToTrackedObject mapping with {groupKeyToTrackedObject.Count} entries.");
			}
		}
		existingPinsForCorrelation.Clear();
		alreadyPinned.Clear();
		foundAndNotPinned.Clear();
		List<PinData> pinsList = GetPinsList();
		if (pinsList != null)
		{
			foreach (PinData item2 in pinsList)
			{
				if (item2.m_author == ModAuthorID && item2.m_ownerID == 0 && !existingPinsForCorrelation.ContainsKey(item2.m_pos))
				{
					existingPinsForCorrelation[item2.m_pos] = item2;
				}
			}
			if (MervilsRadiusPlugin.radiusDebugMode.Value)
			{
				Debug.Log((object)$"[RadiusPinDetector][INIT] Collected {existingPinsForCorrelation.Count} existing pins for correlation.");
			}
		}
		return true;
	}

	private void OnPinAddedByPinAssistant(PinData pin)
	{
		//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_0017: 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_0032: Unknown result type (might be due to invalid IL or missing references)
		//IL_004f: 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)
		if (!(ModAuthorID == PlatformUserID.None) && pin.m_author == PlatformUserID.None)
		{
			string trackedObjectGroupKey = GetTrackedObjectGroupKey(pin.m_name, pin.m_type);
			if (groupKeyToTrackedObject.ContainsKey(trackedObjectGroupKey))
			{
				pin.m_author = ModAuthorID;
			}
		}
	}

	private bool ReInitializeCoreReferences()
	{
		if (MervilsRadiusPlugin.radiusDebugMode.Value)
		{
			Debug.Log((object)"[RadiusPinDetector][WAIT] Core game references lost, refreshing them...");
		}
		if ((Object)(object)m_player == (Object)null && (Object)(object)Player.m_localPlayer != (Object)null)
		{
			m_player = Player.m_localPlayer;
			m_localPlayerID = m_player.GetPlayerID();
			if (MervilsRadiusPlugin.radiusDebugMode.Value)
			{
				Debug.Log((object)("[RadiusPinDetector][INIT] Player reference refreshed: " + ((Object)m_player).name));
			}
		}
		if ((Object)(object)m_minimap == (Object)null && (Object)(object)Minimap.instance != (Object)null)
		{
			m_minimap = Minimap.instance;
			if (MervilsRadiusPlugin.radiusDebugMode.Value)
			{
				Debug.Log((object)"[RadiusPinDetector][INIT] Minimap reference refreshed.");
			}
		}
		if ((Object)(object)znetScene == (Object)null && (Object)(object)ZNetScene.instance != (Object)null)
		{
			znetScene = ZNetScene.instance;
			if (MervilsRadiusPlugin.radiusDebugMode.Value)
			{
				Debug.Log((object)"[RadiusPinDetector][INIT] ZNetScene reference refreshed.");
			}
		}
		return (Object)(object)m_player != (Object)null && (Object)(object)m_minimap != (Object)null && (Object)(object)znetScene != (Object)null;
	}

	private void ProcessAllObjectsInBatches(GameObject[] allObjects, ref int currentIndex, int batchSize, int allObjectsLength, float scanRadius, Vector3 playerPos, HashSet<string> allowedNames)
	{
		//IL_0007: 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)
		//IL_0123: 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)
		//IL_012e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0133: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ed: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e6: 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)
		//IL_01f4: 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_0211: Unknown result type (might be due to invalid IL or missing references)
		//IL_0249: Unknown result type (might be due to invalid IL or missing references)
		//IL_0524: Unknown result type (might be due to invalid IL or missing references)
		//IL_040a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0417: Unknown result type (might be due to invalid IL or missing references)
		//IL_0419: Unknown result type (might be due to invalid IL or missing references)
		//IL_044d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0452: Unknown result type (might be due to invalid IL or missing references)
		//IL_045d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0622: Unknown result type (might be due to invalid IL or missing references)
		//IL_0485: Unknown result type (might be due to invalid IL or missing references)
		//IL_06fa: Unknown result type (might be due to invalid IL or missing references)
		//IL_06fc: Unknown result type (might be due to invalid IL or missing references)
		//IL_0726: Unknown result type (might be due to invalid IL or missing references)
		//IL_072b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0554: Unknown result type (might be due to invalid IL or missing references)
		//IL_055b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0560: Unknown result type (might be due to invalid IL or missing references)
		//IL_0565: Unknown result type (might be due to invalid IL or missing references)
		//IL_0765: Unknown result type (might be due to invalid IL or missing references)
		//IL_058d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0592: Unknown result type (might be due to invalid IL or missing references)
		//IL_0661: Unknown result type (might be due to invalid IL or missing references)
		//IL_066f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0671: Unknown result type (might be due to invalid IL or missing references)
		//IL_069b: Unknown result type (might be due to invalid IL or missing references)
		//IL_06a0: Unknown result type (might be due to invalid IL or missing references)
		//IL_05b4: Unknown result type (might be due to invalid IL or missing references)
		//IL_05b9: Unknown result type (might be due to invalid IL or missing references)
		//IL_05c2: Unknown result type (might be due to invalid IL or missing references)
		//IL_05da: Unknown result type (might be due to invalid IL or missing references)
		//IL_05e1: Unknown result type (might be due to invalid IL or missing references)
		//IL_05e6: Unknown result type (might be due to invalid IL or missing references)
		//IL_0602: Unknown result type (might be due to invalid IL or missing references)
		if (currentIndex == 0 && existingPinsForCorrelation.Count > 0)
		{
			nearbyOrphanedPins = existingPinsForCorrelation.Where(delegate(KeyValuePair<Vector3, PinData> pin)
			{
				//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_000d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0012: Unknown result type (might be due to invalid IL or missing references)
				Vector3 val6 = pin.Key - playerPos;
				return ((Vector3)(ref val6)).sqrMagnitude <= scanRadius * scanRadius;
			}).ToDictionary((KeyValuePair<Vector3, PinData> pin) => pin.Key, (KeyValuePair<Vector3, PinData> pin) => pin.Value);
			if (MervilsRadiusPlugin.radiusDebugMode.Value)
			{
				Debug.Log((object)$"[RadiusPinDetector][SCAN] Found {nearbyOrphanedPins.Count} orphaned pins within scan radius");
			}
		}
		int num = Math.Min(currentIndex + batchSize, allObjectsLength);
		for (int i = currentIndex; i < num; i++)
		{
			GameObject gameObject = allObjects[i];
			if ((Object)(object)gameObject == (Object)null || !gameObject.activeInHierarchy)
			{
				continue;
			}
			Vector3 val = gameObject.transform.position - playerPos;
			if (((Vector3)(ref val)).sqrMagnitude > scanRadius * scanRadius)
			{
				continue;
			}
			ZNetView component = gameObject.GetComponent<ZNetView>();
			if ((Object)(object)component == (Object)null)
			{
				continue;
			}
			LocationProxy component2 = gameObject.GetComponent<LocationProxy>();
			if ((Object)(object)component2 != (Object)null && locationProxyInstanceField != null)
			{
				object? value = locationProxyInstanceField.GetValue(component2);
				GameObject val2 = (GameObject)((value is GameObject) ? value : null);
				if (!((Object)(object)val2 != (Object)null))
				{
					continue;
				}
				gameObject = val2;
			}
			ZDOID val3 = component.GetZDO()?.m_uid ?? ZDOID.None;
			if (val3 == ZDOID.None)
			{
				continue;
			}
			if (alreadyPinned.TryGetValue(val3, out var value2) && !value2.Mobile)
			{
				scanCycleSkippedAlreadyPinned++;
				continue;
			}
			if (foundAndNotPinned.TryGetValue(val3, out var value3) && !value3.Mobile)
			{
				scanCycleSkippedPreviouslyFound++;
				string normalizedName = value3.NormalizedName;
				if (!scanCycleSkippedByType.ContainsKey(normalizedName))
				{
					scanCycleSkippedByType[normalizedName] = 0;
				}
				scanCycleSkippedByType[normalizedName]++;
				continue;
			}
			string text;
			if ((Object)(object)component2 != (Object)null)
			{
				text = ((Object)gameObject).name;
			}
			else
			{
				ZDO zDO = component.GetZDO();
				int num2 = ((zDO != null) ? zDO.GetPrefab() : 0);
				object obj;
				if (num2 == 0)
				{
					obj = null;
				}
				else
				{
					ZNetScene instance = ZNetScene.instance;
					obj = ((instance != null) ? instance.GetPrefab(num2) : null);
				}
				GameObject val4 = (GameObject)obj;
				text = ((val4 != null) ? ((Object)val4).name : null) ?? ((Object)gameObject).name;
			}
			string text2 = NormalizeName(text);
			if (text2.EndsWith("_frac"))
			{
				string undamagedName = text2.Substring(0, text2.Length - 5);
				if (MervilsRadiusPlugin.radiusDebugMode.Value)
				{
					Debug.Log((object)("[RadiusPinDetector][DETECT] Found damaged resource node '" + text2 + "', looking for pin from '" + undamagedName + "'"));
				}
				KeyValuePair<ZDOID, PinState> keyValuePair = alreadyPinned.FirstOrDefault(delegate(KeyValuePair<ZDOID, PinState> kvp)
				{
					//IL_0020: Unknown result type (might be due to invalid IL or missing references)
					//IL_0035: Unknown result type (might be due to invalid IL or missing references)
					//IL_003a: Unknown result type (might be due to invalid IL or missing references)
					//IL_003f: Unknown result type (might be due to invalid IL or missing references)
					int result;
					if (kvp.Value.NormalizedName == undamagedName)
					{
						Vector3 val5 = kvp.Value.LastPosition - gameObject.transform.position;
						result = ((((Vector3)(ref val5)).sqrMagnitude < 0.1f) ? 1 : 0);
					}
					else
					{
						result = 0;
					}
					return (byte)result != 0;
				});
				if (keyValuePair.Value != null)
				{
					PinState value4 = keyValuePair.Value;
					alreadyPinned.Remove(keyValuePair.Key);
					value4.ZdoID = val3;
					value4.NormalizedName = text2;
					value4.PinnedObject = gameObject;
					value4.LastPosition = gameObject.transform.position;
					alreadyPinned[val3] = value4;
					if (MervilsRadiusPlugin.radiusDebugMode.Value)
					{
						Debug.Log((object)$"[RadiusPinDetector][DETECT] Transferred pin from {undamagedName} to {text2} (ID={val3})");
					}
					continue;
				}
			}
			string matchingTrackedObjectName = GetMatchingTrackedObjectName(text2);
			if (matchingTrackedObjectName == null)
			{
				continue;
			}
			bool value5 = false;
			if (!prefabMobilityCache.TryGetValue(text2, out value5))
			{
				value5 = IsMobile(gameObject);
				if (MervilsRadiusPlugin.radiusDebugMode.Value)
				{
					Debug.Log((object)$"[RadiusPinDetector][DETECT] First '{text2}' found. Is Mobile: {value5}");
				}
				prefabMobilityCache[text2] = value5;
			}
			PinState value6 = null;
			if (alreadyPinned.TryGetValue(val3, out value6))
			{
				if (!value6.Mobile)
				{
					continue;
				}
				val = gameObject.transform.position - value6.LastPosition;
				if (!(((Vector3)(ref val)).sqrMagnitude > 1f))
				{
					continue;
				}
				value6.LastPosition = gameObject.transform.position;
				if (value6.Pin != null)
				{
					Vector3 position = gameObject.transform.position;
					value6.Pin.m_pos = new Vector3(position.x, value6.Pin.m_pos.y, position.z);
					if (MervilsRadiusPlugin.radiusDebugMode.Value)
					{
						Debug.Log((object)$"[RadiusPinDetector][SCAN] Mobile object '{text2}' (ID={val3}) moved; pin updated.");
					}
				}
				continue;
			}
			if (foundAndNotPinned.TryGetValue(val3, out value6))
			{
				if (value6.WasManuallyRemoved)
				{
					if (!(value6.MatchedTrackedObjectName != matchingTrackedObjectName))
					{
						continue;
					}
					foundAndNotPinned.Remove(val3);
					value6 = new PinState
					{
						ZdoID = val3,
						NormalizedName = text2,
						PrefabName = text,
						Mobile = value5,
						LastPosition = gameObject.transform.position,
						PinnedObject = gameObject,
						Pin = null,
						WasManuallyRemoved = false,
						WasBlackListed = false,
						MatchedTrackedObjectName = matchingTrackedObjectName
					};
				}
				else if (!value5)
				{
					continue;
				}
			}
			else
			{
				value6 = new PinState
				{
					ZdoID = val3,
					NormalizedName = text2,
					PrefabName = text,
					Mobile = value5,
					LastPosition = gameObject.transform.position,
					PinnedObject = gameObject,
					Pin = null,
					WasManuallyRemoved = false,
					WasBlackListed = false,
					MatchedTrackedObjectName = matchingTrackedObjectName
				};
			}
			AttemptToPinObject(gameObject, val3, text2, matchingTrackedObjectName, value5, value6, text);
		}
		if (num >= allObjectsLength && MervilsRadiusPlugin.radiusDebugMode.Value)
		{
			Debug.Log((object)$"[RadiusPinDetector][SCAN] Scan complete - New Created: {scanCyclePinsCreated}, Correlated: {scanCycleObjectsCorrelated}, Clustered: {scanCycleObjectsClustered}, Blacklisted: {scanCycleObjectsBlackListed}, Already Pinned: {scanCycleSkippedAlreadyPinned}, Skipped: {scanCycleSkippedPreviouslyFound}");
			if (scanCycleSkippedByType.Count > 0)
			{
				Debug.Log((object)("[RadiusPinDetector][SCAN] Objects skipped (previously found, not pinned): " + string.Join(", ", scanCycleSkippedByType.Select((KeyValuePair<string, int> kvp) => $"{kvp.Key}({kvp.Value})"))));
			}
		}
		currentIndex = num;
	}

	private int RemoveSharedPinAtPosition(List<PinData> pinsList, Vector3 position, string trackedObjectName)
	{
		//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_004b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0050: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
		if (pinsList == null)
		{
			return 0;
		}
		long num = (((Object)(object)Player.m_localPlayer != (Object)null) ? Player.m_localPlayer.GetPlayerID() : 0);
		PinData val = null;
		foreach (PinData pins in pinsList)
		{
			Vector3 val2 = pins.m_pos - position;
			if (((Vector3)(ref val2)).sqrMagnitude < 0.1f && pins.m_ownerID != 0L && pins.m_ownerID != num && string.Equals(pins.m_name, trackedObjectName, StringComparison.OrdinalIgnoreCase))
			{
				val = pins;
				break;
			}
		}
		if (val != null)
		{
			Minimap.instance.RemovePin(val);
			pinsList.Remove(val);
			if (MervilsRadiusPlugin.radiusDebugMode.Value)
			{
				Debug.Log((object)$"[RadiusPinDetector][PIN] Removed shared pin '{val.m_name}' at {position} to allow mod pin creation");
			}
		}
		return pinsList.Count;
	}

	private bool AttemptToPinObject(GameObject gameObject, ZDOID objID, string normalizedPrefab, string matchedTrackedObjectName, bool isMobile, PinState pinState, string prefabName)
	{
		//IL_02d9: Unknown result type (might be due to invalid IL or missing references)
		//IL_02e6: 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_002b: Unknown result type (might be due to invalid IL or missing references)
		//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
		//IL_006a: Unknown result type (might be due to invalid IL or missing references)
		//IL_007d: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e9: 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_020f: Unknown result type (might be due to invalid IL or missing references)
		//IL_030e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0177: Unknown result type (might be due to invalid IL or missing references)
		//IL_0152: Unknown result type (might be due to invalid IL or missing references)
		//IL_015f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0347: Unknown result type (might be due to invalid IL or missing references)
		//IL_0366: Unknown result type (might be due to invalid IL or missing references)
		//IL_0229: Unknown result type (might be due to invalid IL or missing references)
		//IL_0286: Unknown result type (might be due to invalid IL or missing references)
		//IL_0253: Unknown result type (might be due to invalid IL or missing references)
		//IL_0262: Unknown result type (might be due to invalid IL or missing references)
		//IL_02c0: Unknown result type (might be due to invalid IL or missing references)
		//IL_029f: Unknown result type (might be due to invalid IL or missing references)
		PinData val = null;
		if (nearbyOrphanedPins.Count > 0)
		{
			Vector3 objectPos = gameObject.transform.position;
			KeyValuePair<Vector3, PinData> keyValuePair = nearbyOrphanedPins.FirstOrDefault(delegate(KeyValuePair<Vector3, PinData> kvp)
			{
				//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_000d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0012: Unknown result type (might be due to invalid IL or missing references)
				Vector3 val2 = kvp.Key - objectPos;
				return ((Vector3)(ref val2)).sqrMagnitude < 0.1f;
			});
			if (keyValuePair.Value != null)
			{
				val = keyValuePair.Value;
				existingPinsForCorrelation.Remove(keyValuePair.Key);
				nearbyOrphanedPins.Remove(keyValuePair.Key);
				scanCycleObjectsCorrelated++;
			}
		}
		if (pinState == null)
		{
			pinState = new PinState
			{
				ZdoID = objID,
				NormalizedName = normalizedPrefab,
				PrefabName = prefabName,
				Mobile = isMobile,
				LastPosition = gameObject.transform.position,
				PinnedObject = gameObject,
				Pin = val,
				WasManuallyRemoved = false,
				WasBlackListed = false,
				MatchedTrackedObjectName = matchedTrackedObjectName
			};
		}
		else
		{
			pinState.Pin = val;
			if (string.IsNullOrEmpty(pinState.PrefabName))
			{
				pinState.PrefabName = prefabName;
			}
		}
		if (val == null)
		{
			List<PinData> pinsList = GetPinsList();
			if (pinsList == null)
			{
				alreadyPinned.Remove(objID);
				foundAndNotPinned.Remove(objID);
				return false;
			}
			int beforeCount = RemoveSharedPinAtPosition(pinsList, gameObject.transform.position, matchedTrackedObjectName);
			try
			{
				string arg = ((Object)gameObject).name;
				if (normalizedPrefab.EndsWith("_frac"))
				{
					arg = prefabName.Replace("_frac", "") + "(clone)";
				}
				PinAssistantReflectionHelper.AddObjAsPinDelegate?.Invoke(arg, gameObject);
			}
			catch (Exception arg2)
			{
				Debug.LogError((object)$"[RadiusPinDetector][ERROR] AddObjAsPin failed for '{((gameObject != null) ? ((Object)gameObject).name : null)}' (ID={objID}): {arg2}.");
				alreadyPinned.Remove(objID);
				foundAndNotPinned.Remove(objID);
				return false;
			}
			try
			{
				pinState.Pin = CaptureNewlyCreatedPin(gameObject.transform.position, beforeCount, pinsList);
				if (pinState.Pin != null)
				{
					alreadyPinned[objID] = pinState;
					foundAndNotPinned.Remove(objID);
					scanCyclePinsCreated++;
					return true;
				}
				alreadyPinned.Remove(objID);
				if (!isMobile)
				{
					foundAndNotPinned[objID] = pinState;
					scanCycleObjectsClustered++;
				}
				else
				{
					foundAndNotPinned.Remove(objID);
				}
				return false;
			}
			catch (Exception arg3)
			{
				alreadyPinned.Remove(objID);
				foundAndNotPinned.Remove(objID);
				if (MervilsRadiusPlugin.radiusDebugMode.Value)
				{
					Debug.LogWarning((object)$"[RadiusPinDetector][WARN] Failed to capture PinData for '{((gameObject != null) ? ((Object)gameObject).name : null)}' (ID={objID}): {arg3}");
				}
				return false;
			}
		}
		if (val != null && pinState != null && pinState.Pin != null)
		{
			alreadyPinned[objID] = pinState;
			if (MervilsRadiusPlugin.radiusDebugMode.Value)
			{
				Debug.Log((object)$"[RadiusPinDetector][SCAN] An orphaned pin was correlated to {normalizedPrefab} (ID={objID})");
			}
			return true;
		}
		return false;
	}

	private void CleanUpPinCache(HashSet<string> allowedNames, Vector3 playerPos, float scanRadius)
	{
		//IL_0007: 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_0115: Unknown result type (might be due to invalid IL or missing references)
		//IL_0148: 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_026b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0270: Unknown result type (might be due to invalid IL or missing references)
		//IL_0200: Unknown result type (might be due to invalid IL or missing references)
		//IL_0215: Unknown result type (might be due to invalid IL or missing references)
		//IL_023e: Unknown result type (might be due to invalid IL or missing references)
		//IL_029e: Unknown result type (might be due to invalid IL or missing references)
		//IL_02a3: Unknown result type (might be due to invalid IL or missing references)
		//IL_0598: Unknown result type (might be due to invalid IL or missing references)
		//IL_03e1: Unknown result type (might be due to invalid IL or missing references)
		//IL_03e6: Unknown result type (might be due to invalid IL or missing references)
		//IL_050e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0315: Unknown result type (might be due to invalid IL or missing references)
		//IL_0451: Unknown result type (might be due to invalid IL or missing references)
		//IL_0456: Unknown result type (might be due to invalid IL or missing references)
		//IL_045f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0641: Unknown result type (might be due to invalid IL or missing references)
		//IL_0646: Unknown result type (might be due to invalid IL or missing references)
		//IL_047b: Unknown result type (might be due to invalid IL or missing references)
		//IL_066c: Unknown result type (might be due to invalid IL or missing references)
		//IL_04da: Unknown result type (might be due to invalid IL or missing references)
		//IL_04ad: Unknown result type (might be due to invalid IL or missing references)
		int num = 0;
		int num2 = 0;
		if ((Object)(object)ZNetScene.instance == (Object)null)
		{
			if (MervilsRadiusPlugin.radiusDebugMode.Value)
			{
				Debug.Log((object)"[RadiusPinDetector][CLEANUP] ZNetScene.instance is null, skipping cleanup.");
			}
			return;
		}
		HashSet<ZDOID> activeZDOIDs = (from zdo in (znetInstancesField?.GetValue(ZNetScene.instance) as Dictionary<ZDO, ZNetView>)?.Keys
			where zdo != null
			select zdo.m_uid).ToHashSet();
		List<PinData> pinsList = GetPinsList();
		Dictionary<Vector3, List<PinData>> pinsByPosition = new Dictionary<Vector3, List<PinData>>();
		if (pinsList != null)
		{
			foreach (PinData item in pinsList)
			{
				if (!pinsByPosition.ContainsKey(item.m_pos))
				{
					pinsByPosition[item.m_pos] = new List<PinData>();
				}
				pinsByPosition[item.m_pos].Add(item);
			}
		}
		var list = (from item in alreadyPinned.Select(delegate(KeyValuePair<ZDOID, PinState> pair)
			{
				//IL_0003: 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_0026: Unknown result type (might be due to invalid IL or missing references)
				//IL_003a: 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_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_009c: Unknown result type (might be due to invalid IL or missing references)
				//IL_007e: Unknown result type (might be due to invalid IL or missing references)
				//IL_006c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0156: 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_00fa: 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_019f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0190: Unknown result type (might be due to invalid IL or missing references)
				ZDOID key = pair.Key;
				PinState value3 = pair.Value;
				string normalizedName = value3.NormalizedName;
				if (activeZDOIDs != null && !activeZDOIDs.Contains(key))
				{
					Vector3 val4 = value3.LastPosition - playerPos;
					if (((Vector3)(ref val4)).sqrMagnitude <= scanRadius * scanRadius)
					{
						return new
						{
							Key = key,
							Name = normalizedName,
							IsDestroyed = true,
							ShouldRemove = true,
							PinState = value3,
							WasManuallyRemoved = false
						};
					}
					return new
					{
						Key = key,
						Name = normalizedName,
						IsDestroyed = true,
						ShouldRemove = false,
						PinState = value3,
						WasManuallyRemoved = false
					};
				}
				ZNetScene instance2 = ZNetScene.instance;
				GameObject val5 = ((instance2 != null) ? instance2.FindInstance(key) : null);
				if ((Object)(object)val5 == (Object)null || (Object)(object)val5.gameObject == (Object)null)
				{
					if ((value3.MatchedTrackedObjectName == null || !allowedNames.Contains(value3.MatchedTrackedObjectName)) && !allowedNames.Contains(normalizedName))
					{
						return new
						{
							Key = key,
							Name = normalizedName,
							IsDestroyed = false,
							ShouldRemove = true,
							PinState = value3,
							WasManuallyRemoved = false
						};
					}
					return new
					{
						Key = key,
						Name = normalizedName,
						IsDestroyed = false,
						ShouldRemove = false,
						PinState = value3,
						WasManuallyRemoved = false
					};
				}
				if ((value3.MatchedTrackedObjectName == null || !allowedNames.Contains(value3.MatchedTrackedObjectName)) && !allowedNames.Contains(normalizedName))
				{
					return new
					{
						Key = key,
						Name = normalizedName,
						IsDestroyed = false,
						ShouldRemove = true,
						PinState = value3,
						WasManuallyRemoved = false
					};
				}
				return (value3.Pin != null && !pinsByPosition.ContainsKey(value3.Pin.m_pos)) ? new
				{
					Key = key,
					Name = normalizedName,
					IsDestroyed = false,
					ShouldRemove = true,
					PinState = value3,
					WasManuallyRemoved = true
				} : new
				{
					Key = key,
					Name = normalizedName,
					IsDestroyed = false,
					ShouldRemove = false,
					PinState = value3,
					WasManuallyRemoved = false
				};
			})
			where item.ShouldRemove
			select item).ToList();
		foreach (var item2 in list)
		{
			PinState pinState = item2.PinState;
			if (item2.WasManuallyRemoved)
			{
				pinState.WasManuallyRemoved = true;
				pinState.Pin = null;
				foundAndNotPinned[item2.Key] = pinState;
				alreadyPinned.Remove(item2.Key);
				if (MervilsRadiusPlugin.radiusDebugMode.Value)
				{
					Debug.Log((object)$"[RadiusPinDetector][CLEANUP] Detected manually removed pin for '{item2.Name}' (ID={item2.Key}), moved to foundAndNotPinned");
				}
				continue;
			}
			Vector3 removedPosition = Vector3.zero;
			string text = null;
			if (item2.IsDestroyed && pinState.Pin != null)
			{
				removedPosition = pinState.Pin.m_pos;
				text = pinState.MatchedTrackedObjectName ?? item2.Name;
			}
			if (pinState.Pin != null)
			{
				string b = pinState.MatchedTrackedObjectName ?? item2.Name;
				long num3 = (((Object)(object)Player.m_localPlayer != (Object)null) ? Player.m_localPlayer.GetPlayerID() : 0);
				if (pinsByPosition.TryGetValue(pinState.Pin.m_pos, out var value))
				{
					foreach (PinData item3 in value.ToList())
					{
						if (item3.m_ownerID != 0L && item3.m_ownerID != num3 && string.Equals(item3.m_name, b, StringComparison.OrdinalIgnoreCase))
						{
							Minimap.instance.RemovePin(item3);
							pinsList?.Remove(item3);
							value.Remove(item3);
						}
					}
				}
				Minimap.instance.RemovePin(pinState.Pin);
				pinState.Pin = null;
				num++;
			}
			if (item2.IsDestroyed && removedPosition != Vector3.zero)
			{
				List<ZDOID> list2 = (from kvp in foundAndNotPinned.Where(delegate(KeyValuePair<ZDOID, PinState> kvp)
					{
						//IL_0007: Unknown result type (might be due to invalid IL or missing references)
						//IL_000d: Unknown result type (might be due to invalid IL or missing references)
						//IL_0012: Unknown result type (might be due to invalid IL or missing references)
						//IL_0017: Unknown result type (might be due to invalid IL or missing references)
						Vector3 val3 = kvp.Value.LastPosition - removedPosition;
						return ((Vector3)(ref val3)).sqrMagnitude < redundancyDistanceSame * redundancyDistanceSame;
					})
					select kvp.Key).ToList();
				foreach (ZDOID item4 in list2)
				{
					if (foundAndNotPinned.TryGetValue(item4, out var value2))
					{
						ZNetScene instance = ZNetScene.instance;
						GameObject val = ((instance != null) ? instance.FindInstance(item4) : null);
						if ((Object)(object)val != (Object)null && (Object)(object)val.gameObject != (Object)null)
						{
							AttemptToPinObject(val.gameObject, item4, value2.NormalizedName, value2.MatchedTrackedObjectName, value2.Mobile, value2, value2.PrefabName);
						}
						foundAndNotPinned.Remove(item4);
						num2++;
					}
				}
			}
			alreadyPinned.Remove(item2.Key);
		}
		var list3 = foundAndNotPinned.Select((KeyValuePair<ZDOID, PinState> pair) => new
		{
			Key = pair.Key,
			PinState = pair.Value
		}).Where(item =>
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			if (item.Key == ZDOID.None)
			{
				return true;
			}
			if (activeZDOIDs != null && !activeZDOIDs.Contains(item.Key))
			{
				Vector3 val2 = item.PinState.LastPosition - playerPos;
				if (((Vector3)(ref val2)).sqrMagnitude <= scanRadius * scanRadius)
				{
					return true;
				}
				return false;
			}
			return ((item.PinState.MatchedTrackedObjectName == null || !allowedNames.Contains(item.PinState.MatchedTrackedObjectName)) && !allowedNames.Contains(item.PinState.NormalizedName)) ? true : false;
		}).ToList();
		foreach (var item5 in list3)
		{
			if (foundAndNotPinned.Remove(item5.Key))
			{
				num2++;
			}
		}
		if (MervilsRadiusPlugin.radiusDebugMode.Value && (num > 0 || num2 > 0))
		{
			Debug.Log((object)$"[RadiusPinDetector][CLEANUP] Removed {num} pins, cleared {num2} foundAndNotPinned entries");
		}
		if (nearbyOrphanedPins.Count <= 0)
		{
			return;
		}
		int num4 = 0;
		foreach (PinData value4 in nearbyOrphanedPins.Values)
		{
			if (value4.m_author == ModAuthorID)
			{
				Minimap.instance.RemovePin(value4);
				existingPinsForCorrelation.Remove(value4.m_pos);
				num4++;
			}
		}
		if (MervilsRadiusPlugin.radiusDebugMode.Value && num4 > 0)
		{
			Debug.Log((object)$"[RadiusPinDetector][CLEANUP] Removed {num4} orphaned pins");
		}
		nearbyOrphanedPins.Clear();
	}

	private void RestoreRemovedPins(string trackedObjectName)
	{
		//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
		//IL_012e: 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_01b6: Unknown result type (might be due to invalid IL or missing references)
		//IL_01bb: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a6: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d4: Unknown result type (might be due to invalid IL or missing references)
		if (!removedPinsForRestoration.TryGetValue(trackedObjectName, out var value))
		{
			return;
		}
		if (MervilsRadiusPlugin.radiusDebugMode.Value)
		{
			Debug.Log((object)$"[RadiusPinDetector][RESTORE] Restoring {value.Count} pins for retracked object '{trackedObjectName}'.");
		}
		foreach (PinState item in value)
		{
			string normalizedName = item.NormalizedName;
			string matchingTrackedObjectName = GetMatchingTrackedObjectName(normalizedName);
			if (matchingTrackedObjectName != trackedObjectName)
			{
				if (MervilsRadiusPlugin.radiusDebugMode.Value)
				{
					Debug.Log((object)("[RadiusPinDetector][RESTORE] Skipping archived pin for '" + normalizedName + "' - no longer matches tracked object '" + trackedObjectName + "' (possibly blacklisted)."));
				}
			}
			else if (item.Pin != null)
			{
				try
				{
					Minimap.instance.AddPin(item.Pin.m_pos, item.Pin.m_type, item.Pin.m_name, item.Pin.m_save, item.Pin.m_checked, item.Pin.m_ownerID, item.Pin.m_author);
				}
				catch (Exception arg)
				{
					Debug.LogError((object)$"[RadiusPinDetector][ERROR] Failed to add pin to minimap for '{trackedObjectName}': {arg}. Skipping this pin.");
					continue;
				}
				List<PinData> pinsList = GetPinsList();
				int beforeCount = (pinsList?.Count ?? 1) - 1;
				PinData val = CaptureNewlyCreatedPin(item.Pin.m_pos, beforeCount, pinsList);
				if (val != null)
				{
					item.Pin = val;
					existingPinsForCorrelation[val.m_pos] = val;
				}
				if (item.ZdoID != ZDOID.None)
				{
					alreadyPinned[item.ZdoID] = item;
				}
			}
		}
		removedPinsForRestoration.Remove(trackedObjectName);
		if (MervilsRadiusPlugin.radiusDebugMode.Value)
		{
			Debug.Log((object)("[RadiusPinDetector][RESTORE] Cleared archived pins for '" + trackedObjectName + "' from restoration cache."));
		}
	}

	private void RestoreManuallyRemovedPins(string trackedObjectName)
	{
		//IL_0026: Unknown result type (might be due to invalid IL or missing references)
		//IL_002b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0056: Unknown result type (might be due to invalid IL or missing references)
		//IL_0079: 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_00b9: 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)
		List<ZDOID> list = new List<ZDOID>();
		foreach (KeyValuePair<ZDOID, PinState> item in foundAndNotPinned.ToList())
		{
			ZDOID key = item.Key;
			PinState value = item.Value;
			if (value.WasManuallyRemoved && value.MatchedTrackedObjectName == trackedObjectName)
			{
				list.Add(key);
				if (MervilsRadiusPlugin.radiusDebugMode.Value)
				{
					Debug.Log((object)$"[RadiusPinDetector][RESTORE] Will restore manually removed pin for '{value.NormalizedName}' (ID={key}) when ExactMatch changed from ON to OFF for '{trackedObjectName}'");
				}
			}
		}
		foreach (ZDOID item2 in list)
		{
			foundAndNotPinned.Remove(item2);
		}
		if (MervilsRadiusPlugin.radiusDebugMode.Value && list.Count > 0)
		{
			Debug.Log((object)$"[RadiusPinDetector][RESTORE] Removed {list.Count} manually removed pins from foundAndNotPinned for '{trackedObjectName}' - they will be re-pinned on next scan");
		}
	}

	private void UpdatePinsForBlackListChange(string trackedObjectName)
	{
		//IL_0031: Unknown result type (might be due to invalid IL or missing references)
		//IL_0036: Unknown result type (might be due to invalid IL or missing references)
		//IL_006b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0096: 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)
		//IL_00e4: 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_0180: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d5: Unknown result type (might be due to invalid IL or missing references)
		//IL_01da: Unknown result type (might be due to invalid IL or missing references)
		//IL_0210: 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_0275: Unknown result type (might be due to invalid IL or missing references)
		//IL_027a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0283: Unknown result type (might be due to invalid IL or missing references)
		//IL_02d5: Unknown result type (might be due to invalid IL or missing references)
		//IL_02da: Unknown result type (might be due to invalid IL or missing references)
		//IL_031f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0384: Unknown result type (might be due to invalid IL or missing references)
		//IL_0389: Unknown result type (might be due to invalid IL or missing references)
		//IL_0392: Unknown result type (might be due to invalid IL or missing references)
		//IL_0343: Unknown result type (might be due to invalid IL or missing references)
		int num = 0;
		int num2 = 0;
		int num3 = 0;
		List<(ZDOID, PinState)> list = new List<(ZDOID, PinState)>();
		foreach (KeyValuePair<ZDOID, PinState> item in alreadyPinned.ToList())
		{
			ZDOID key = item.Key;
			PinState value = item.Value;
			if (value.MatchedTrackedObjectName == trackedObjectName && IsBlackListed(value.NormalizedName, trackedObjectName))
			{
				list.Add((key, value));
				if (MervilsRadiusPlugin.radiusDebugMode.Value)
				{
					Debug.Log((object)$"[RadiusPinDetector][BLACKLIST] Pin for '{value.NormalizedName}' (ID={key}) is now blacklisted for '{trackedObjectName}'");
				}
			}
		}
		foreach (var (key2, pinState) in list)
		{
			if (alreadyPinned.ContainsKey(key2))
			{
				pinState.WasBlackListed = true;
				if (!removedPinsForRestoration.ContainsKey(trackedObjectName))
				{
					removedPinsForRestoration[trackedObjectName] = new List<PinState>();
				}
				removedPinsForRestoration[trackedObjectName].Add(pinState);
				if (pinState.Pin != null)
				{
					Minimap.instance.RemovePin(pinState.Pin);
					pinState.Pin = null;
				}
				alreadyPinned.Remove(key2);
				num++;
			}
		}
		List<ZDOID> list2 = new List<ZDOID>();
		foreach (KeyValuePair<ZDOID, PinState> item2 in foundAndNotPinned.ToList())
		{
			ZDOID key3 = item2.Key;
			PinState value2 = item2.Value;
			if (value2.MatchedTrackedObjectName == trackedObjectName && IsBlackListed(value2.NormalizedName, trackedObjectName))
			{
				list2.Add(key3);
				if (MervilsRadiusPlugin.radiusDebugMode.Value)
				{
					Debug.Log((object)$"[RadiusPinDetector][BLACKLIST] FoundAndNotPinned entry for '{value2.NormalizedName}' (ID={key3}) is now blacklisted for '{trackedObjectName}'");
				}
			}
		}
		foreach (ZDOID item3 in list2)
		{
			foundAndNotPinned.Remove(item3);
			num2++;
		}
		List<ZDOID> list3 = new List<ZDOID>();
		foreach (KeyValuePair<ZDOID, PinState> item4 in foundAndNotPinned.ToList())
		{
			ZDOID key4 = item4.Key;
			PinState value3 = item4.Value;
			if (value3.WasManuallyRemoved && value3.MatchedTrackedObjectName == trackedObjectName && !IsBlackListed(value3.NormalizedName, trackedObjectName))
			{
				list3.Add(key4);
				if (MervilsRadiusPlugin.radiusDebugMode.Value)
				{
					Debug.Log((object)$"[RadiusPinDetector][BLACKLIST] Manually removed pin for '{value3.NormalizedName}' (ID={key4}) now passes blacklist for '{trackedObjectName}', will be re-evaluated");
				}
			}
		}
		foreach (ZDOID item5 in list3)
		{
			foundAndNotPinned.Remove(item5);
			num3++;
		}
		if (removedPinsForRestoration.ContainsKey(trackedObjectName))
		{
			RestoreRemovedPins(trackedObjectName);
		}
		if (MervilsRadiusPlugin.radiusDebugMode.Value && (num > 0 || num2 > 0 || num3 > 0))
		{
			Debug.Log((object)$"[RadiusPinDetector][BLACKLIST] Blacklist change for '{trackedObjectName}': Archived {num} pins, cleared {num2} foundAndNotPinned entries, re-evaluating {num3} manually removed pins");
		}
	}

	private PinData CaptureNewlyCreatedPin(Vector3 expectedPosition, int beforeCount, List<PinData> pinsList)
	{
		//IL_002d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0032: 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_0038: Unknown result type (might be due to invalid IL or missing references)
		if (pinsList == null)
		{
			return null;
		}
		float num = 0.1f;
		float num2 = num * num;
		for (int i = beforeCount; i < pinsList.Count; i++)
		{
			PinData val = pinsList[i];
			if (val != null)
			{
				Vector3 val2 = val.m_pos - expectedPosition;
				if (((Vector3)(ref val2)).sqrMagnitude < num2)
				{
					return val;
				}
			}
		}
		return null;
	}

	private float ResolveScanRadius()
	{
		if (!MervilsRadiusPlugin.useFullExplorationRadius.Value)
		{
			if (MervilsRadiusPlugin.radiusDebugMode.Value)
			{
				Debug.Log((object)$"[RadiusPinDetector][RADIUS] Using configured radius: {MervilsRadiusPlugin.radiusDetectionRadius.Value}");
			}
			return Mathf.Max(1f, MervilsRadiusPlugin.radiusDetectionRadius.Value);
		}
		float lastCapturedRadius = PinAssistantPatches.ValheimMinimapPatches.GetLastCapturedRadius();
		if (MervilsRadiusPlugin.radiusDebugMode.Value)
		{
			Debug.Log((object)$"[RadiusPinDetector][RADIUS] Player's exploration radius is: {lastCapturedRadius}");
		}
		return Mathf.Max(1f, lastCapturedRadius);
	}

	private static string NormalizeName(string raw)
	{
		if (string.IsNullOrEmpty(raw))
		{
			return string.Empty;
		}
		string text = raw.ToLowerInvariant();
		return text.Replace("(clone)", "").Trim();
	}

	private static string GetTrackedObjectGroupKey(string pinName, PinType pinType)
	{
		return NormalizeName(pinName) + "_" + ((object)(PinType)(ref pinType)).ToString();
	}

	private string GetMatchingTrackedObjectName(string normalizedPrefabName)
	{
		if (allowedNames.Contains(normalizedPrefabName))
		{
			if (IsBlackListed(normalizedPrefabName, normalizedPrefabName))
			{
				scanCycleObjectsBlackListed++;
				return null;
			}
			return normalizedPrefabName;
		}
		foreach (string allowedName in allowedNames)
		{
			if (exactMatchStatus.ContainsKey(allowedName) && !exactMatchStatus[allowedName].Current && normalizedPrefabName.Contains(allowedName))
			{
				if (!IsBlackListed(normalizedPrefabName, allowedName))
				{
					return allowedName;
				}
				scanCycleObjectsBlackListed++;
			}
		}
		return null;
	}

	private bool IsBlackListed(string normalizedPrefabName, string trackedObjectName)
	{
		if (!blackListWords.ContainsKey(trackedObjectName))
		{
			return false;
		}
		BlackListData blackListData = blackListWords[trackedObjectName];
		if (blackListData.ParsedWords.Count == 0)
		{
			return false;
		}
		foreach (string parsedWord in blackListData.ParsedWords)
		{
			if (normalizedPrefabName.Contains(parsedWord))
			{
				return true;
			}
		}
		return false;
	}

	private List<PinData> GetPinsList()
	{
		if (minimapPinsField == null)
		{
			Debug.LogError((object)"[RadiusPinDetector][ERROR] GetPinsList: minimapPinsField is null! Reflection failed during initialization.");
			return null;
		}
		if ((Object)(object)m_minimap == (Object)null)
		{
			Debug.LogError((object)"[RadiusPinDetector][ERROR] GetPinsList: m_minimap is null! Minimap instance lost.");
			return null;
		}
		List<PinData> list = minimapPinsField.GetValue(m_minimap) as List<PinData>;
		if (list == null)
		{
			Debug.LogError((object)"[RadiusPinDetector][ERROR] GetPinsList: Reflection returned null. Field exists but value is null. This should never happen!");
			Debug.LogError((object)("[RadiusPinDetector][ERROR] Raw field value: " + (minimapPinsField.GetValue(m_minimap)?.GetType()?.Name ?? "null")));
		}
		return list;
	}

	private void UpdateRedundancyDistances()
	{
		if (Time.time - lastRedundancyRefreshTime < 5f)
		{
			return;
		}
		lastRedundancyRefreshTime = Time.time;
		if (PinAssistantReflectionHelper.RedundancySameProp == null && PinAssistantReflectionHelper.RedundancyAnyProp == null)
		{
			if (MervilsRadiusPlugin.radiusDebugMode.Value)
			{
				Debug.LogWarning((object)"[RadiusPinDetector][WARN] Unable to update redundancy distances -- Properties are null.");
			}
			return;
		}
		float num = redundancyDistanceSame;
		float num2 = redundancyDistanceAny;
		if (cachedSameConfigEntry == null && PinAssistantReflectionHelper.RedundancySameProp != null)
		{
			cachedSameConfigEntry = PinAssistantReflectionHelper.RedundancySameProp.GetValue(PinAssistantReflectionHelper.ModConfigInstance) as ConfigEntry<float>;
		}
		if (cachedAnyConfigEntry == null && PinAssistantReflectionHelper.RedundancyAnyProp != null)
		{
			cachedAnyConfigEntry = PinAssistantReflectionHelper.RedundancyAnyProp.GetValue(PinAssistantReflectionHelper.ModConfigInstance) as ConfigEntry<float>;
		}
		if (cachedSameConfigEntry != null)
		{
			redundancyDistanceSame = cachedSameConfigEntry.Value;
		}
		if (cachedAnyConfigEntry != null)
		{
			redundancyDistanceAny = cachedAnyConfigEntry.Value;
		}
		if (redundancyDistanceSame != num || redundancyDistanceAny != num2)
		{
			foundAndNotPinned.Clear();
			if (MervilsRadiusPlugin.radiusDebugMode.Value)
			{
				Debug.Log((object)$"[RadiusPinDetector][SCAN] Redundancy distances changed (old: same={num}, any={num2} | new: same={redundancyDistanceSame}, any={redundancyDistanceAny}). Clearing foundAndNotPinned cache.");
			}
		}
	}

	private bool AreCoreReferencesValid()
	{
		return (Object)(object)m_player != (Object)null && (Object)(object)m_minimap != (Object)null && (Object)(object)znetScene != (Object)null;
	}

	private bool ArePinAssistantReferencesValid()
	{
		if (PinAssistantReflectionHelper.TrackingHandlerInstance == null)
		{
			if (MervilsRadiusPlugin.radiusDebugMode.Value)
			{
				Debug.Log((object)"[RadiusPinDetector][DEBUG] TrackingHandlerInstance is null");
			}
			return false;
		}
		if (PinAssistantReflectionHelper.PinHandlerInstance == null)
		{
			if (MervilsRadiusPlugin.radiusDebugMode.Value)
			{
				Debug.Log((object)"[RadiusPinDetector][DEBUG] PinHandlerInstance is null");
			}
			return false;
		}
		if (PinAssistantReflectionHelper.ModConfigInstance == null)
		{
			if (MervilsRadiusPlugin.radiusDebugMode.Value)
			{
				Debug.Log((object)"[RadiusPinDetector][DEBUG] ModConfigInstance is null");
			}
			return false;
		}
		if (PinAssistantReflectionHelper.TrackObjectUIInstance == null)
		{
			if (MervilsRadiusPlugin.radiusDebugMode.Value)
			{
				Debug.Log((object)"[RadiusPinDetector][DEBUG] TrackObjectUIInstance is null");
			}
			return false;
		}
		if (PinAssistantReflectionHelper.TrackedObjectsInstance == null)
		{
			if (MervilsRadiusPlugin.radiusDebugMode.Value)
			{
				Debug.Log((object)"[RadiusPinDetector][DEBUG] TrackedObjectsInstance is null");
			}
			return false;
		}
		if (PinAssistantReflectionHelper.AltDictionaryInstance == null)
		{
			if (MervilsRadiusPlugin.radiusDebugMode.Value)
			{
				Debug.Log((object)"[RadiusPinDetector][DEBUG] AltDictionaryInstance is null");
			}
			return false;
		}
		object trackObjectUIInstance = PinAssistantReflectionHelper.TrackObjectUIInstance;
		Object val = (Object)((trackObjectUIInstance is Object) ? trackObjectUIInstance : null);
		if (val != null && val == (Object)null)
		{
			return false;
		}
		try
		{
			int count = PinAssistantReflectionHelper.AltDictionaryInstance.Count;
			return true;
		}
		catch
		{
			return false;
		}
	}
}
public static class PinAssistantReflectionHelper
{
	public static MethodInfo AddObjAsPinMethod;

	public static Action<string, GameObject> AddObjAsPinDelegate;

	public static FieldInfo M_PinsField;

	public static FieldInfo TrackedObjectsField;

	public static FieldInfo TrackObjectUI_m_edittingObject;

	public static PropertyInfo AltDictionaryProperty;

	public static PropertyInfo RedundancySameProp;

	public static PropertyInfo RedundancyAnyProp;

	public static object TrackingHandlerInstance;

	public static object PinHandlerInstance;

	public static object ModConfigInstance;

	public static object TrackObjectUIInstance;

	public static object TrackedObjectsInstance;

	public static Dictionary<string, TrieNode<TrackedObject>> AltDictionaryInstance;

	private static Assembly s_pinAssistantAssembly;

	public static Assembly GetPinAssistantAssembly()
	{
		if (s_pinAssistantAssembly == null)
		{
			s_pinAssistantAssembly = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault((Assembly a) => a.GetName().Name == "WxAxW.PinAssistant");
		}
		return s_pinAssistantAssembly;
	}
}
public static class PinAssistantPatches
{
	public static class PinHandlerPatches
	{
		[HarmonyPatch]
		public static class CheckPinPositionExist
		{
			[HarmonyTargetMethod]
			private static MethodBase TargetMethod()
			{
				return (PinAssistantReflectionHelper.GetPinAssistantAssembly()?.GetType("WxAxW.PinAssistant.Core.PinHandler"))?.GetMethod("CheckPinPositionExist", BindingFlags.Instance | BindingFlags.NonPublic);
			}

			[HarmonyPrefix]
			public static bool Prefix(object __instance, Vector3 pinPos, ref bool __result, ref bool __runOriginal)
			{
				//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
				if (!MervilsRadiusPlugin.radiusDetectionEnabled.Value)
				{
					__runOriginal = true;
					return true;
				}
				long num = 0L;
				bool flag = false;
				if ((Object)(object)Player.m_localPlayer != (Object)null)
				{
					num = Player.m_localPlayer.GetPlayerID();
					flag = true;
				}
				if (!flag)
				{
					if (MervilsRadiusPlugin.radiusDebugMode.Value)
					{
						Debug.LogWarning((object)"[RadiusPinDetector][WARN] PatchCheckPinPositionExist: Local player not yet available. Letting original method run for now.");
					}
					__runOriginal = true;
					return true;
				}
				if (PinAssistantReflectionHelper.M_PinsField == null)
				{
					Debug.LogError((object)"[RadiusPinDetector][ERROR] PatchCheckPinPositionExist: PinAssistantReflectionHelper.M_PinsField is null. Letting original method run.");
					__runOriginal = true;
					return true;
				}
				if (!(PinAssistantReflectionHelper.M_PinsField.GetValue(PinAssistantReflectionHelper.PinHandlerInstance) is Dictionary<Vector3, PinData> dictionary))
				{
					if (MervilsRadiusPlugin.radiusDebugMode.Value)
					{
						Debug.LogWarning((object)"[RadiusPinDetector][WARN] PatchCheckPinPositionExist: PinHandler's m_monitoredPins dictionary is null. Letting original method run.");
					}
					__runOriginal = true;
					return true;
				}
				if (dictionary.TryGetValue(pinPos, out var value))
				{
					if (value.m_ownerID == 0L || value.m_ownerID == num)
					{
						__result = true;
					}
					else
					{
						__result = false;
					}
				}
				else
				{
					__result = false;
				}
				__runOriginal = false;
				return false;
			}
		}

		[HarmonyPatch]
		public static class CheckValidPinPosition
		{
			[HarmonyTargetMethod]
			private static MethodBase TargetMethod()
			{
				return (PinAssistantReflectionHelper.GetPinAssistantAssembly()?.GetType("WxAxW.PinAssistant.Core.PinHandler"))?.GetMethod("CheckValidPinPosition", BindingFlags.Instance | BindingFlags.NonPublic);
			}

			[HarmonyPrefix]
			public static bool Prefix(object __instance, Vector3 pinToAdd, string pinName, float redundancyDistance, bool allPins, ref bool __result, ref bool __runOriginal)
			{
				//IL_0137: Unknown result type (might be due to invalid IL or missing references)
				//IL_013a: Unknown result type (might be due to invalid IL or missing references)
				if (!MervilsRadiusPlugin.radiusDetectionEnabled.Value)
				{
					__runOriginal = true;
					return true;
				}
				long num = 0L;
				bool flag = false;
				if ((Object)(object)Player.m_localPlayer != (Object)null)
				{
					num = Player.m_localPlayer.GetPlayerID();
					flag = true;
				}
				if (!flag)
				{
					if (MervilsRadiusPlugin.radiusDebugMode.Value)
					{
						Debug.LogWarning((object)"[RadiusPinDetector][WARN] PatchCheckValidPinPosition: Local player not yet available. Letting original method run for now.");
					}
					__runOriginal = true;
					return true;
				}
				if (PinAssistantReflectionHelper.M_PinsField == null)
				{
					Debug.LogError((object)"[RadiusPinDetector][ERROR] PatchCheckValidPinPosition: PinAssistantReflectionHelper.M_PinsField is null. Letting original method run.");
					__runOr