Decompiled source of ShowNPCs v1.0.1

ShowNPCs.dll

Decompiled 10 hours ago
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.Logging;
using HarmonyLib;
using Splatform;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("ShowNPCs")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ShowNPCs")]
[assembly: AssemblyCopyright("Copyright ©  2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("4d612142-ebf0-4f83-98c9-187f17f8b27a")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace RevealNpcMapPins;

[BepInPlugin("com.Horhpeus.valheim.revealnpcpins", "Reveal NPC Map Pins", "1.0.1")]
public class RevealNpcMapPinsPlugin : BaseUnityPlugin
{
	public const string PluginGUID = "com.Horhpeus.valheim.revealnpcpins";

	public const string PluginName = "Reveal NPC Map Pins";

	public const string PluginVersion = "1.0.1";

	private Harmony _harmony;

	internal static ManualLogSource Log;

	private void Awake()
	{
		//IL_0011: Unknown result type (might be due to invalid IL or missing references)
		//IL_001b: Expected O, but got Unknown
		Log = ((BaseUnityPlugin)this).Logger;
		_harmony = new Harmony("com.Horhpeus.valheim.revealnpcpins");
		_harmony.PatchAll();
		Log.LogInfo((object)"Reveal NPC Map Pins loaded");
	}

	private void OnDestroy()
	{
		Harmony harmony = _harmony;
		if (harmony != null)
		{
			harmony.UnpatchSelf();
		}
	}
}
public static class MinimapHelpers
{
	public static Sprite GetLocationIcon(Minimap minimap, string prefab)
	{
		//IL_0033: Unknown result type (might be due to invalid IL or missing references)
		//IL_0039: Expected O, but got Unknown
		MethodInfo method = typeof(Minimap).GetMethod("GetLocationIcon", BindingFlags.Instance | BindingFlags.NonPublic);
		if (!(method != null))
		{
			return null;
		}
		return (Sprite)method.Invoke(minimap, new object[1] { prefab });
	}

	public static Vector3 FindClosestToOrigin(List<Vector3> vectors)
	{
		//IL_000b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0013: Unknown result type (might be due to invalid IL or missing references)
		//IL_0018: Unknown result type (might be due to invalid IL or missing references)
		//IL_002c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0031: 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_0041: Unknown result type (might be due to invalid IL or missing references)
		//IL_005e: Unknown result type (might be due to invalid IL or missing references)
		if (vectors == null || vectors.Count == 0)
		{
			return Vector3.zero;
		}
		Vector3 result = vectors[0];
		float num = ((Vector3)(ref result)).sqrMagnitude;
		foreach (Vector3 vector in vectors)
		{
			Vector3 current = vector;
			float sqrMagnitude = ((Vector3)(ref current)).sqrMagnitude;
			if (sqrMagnitude < num)
			{
				result = current;
				num = sqrMagnitude;
			}
		}
		return result;
	}

	public static void RemovePinsNearPosition(Minimap minimap, Vector3 position, float tolerance = 1f)
	{
		//IL_001f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0024: Unknown result type (might be due to invalid IL or missing references)
		List<PinData> pins = GetPins(minimap);
		if (pins == null)
		{
			return;
		}
		for (int num = pins.Count - 1; num >= 0; num--)
		{
			PinData val = pins[num];
			if (Vector3.Distance(val.m_pos, position) <= tolerance)
			{
				minimap.RemovePin(val);
			}
		}
	}

	public static List<PinData> GetPins(Minimap minimap)
	{
		FieldInfo field = typeof(Minimap).GetField("m_pins", BindingFlags.Instance | BindingFlags.NonPublic);
		if (field == null)
		{
			return null;
		}
		return (List<PinData>)field.GetValue(minimap);
	}
}
[HarmonyPatch(typeof(Minimap), "Awake")]
public static class Minimap_Awake_ReapplyNpcIcons
{
	private static void Postfix(Minimap __instance)
	{
		((MonoBehaviour)__instance).StartCoroutine(WaitForLocationsThenAddPins());
	}

	public static IEnumerator WaitForLocationsThenAddPins()
	{
		while ((Object)(object)ZoneSystem.instance == (Object)null || ZoneSystem.instance.m_locationInstances == null || ZoneSystem.instance.m_locationInstances.Count == 0 || (Object)(object)Minimap.instance == (Object)null)
		{
			yield return null;
		}
		Minimap minimap = Minimap.instance;
		yield return ((MonoBehaviour)minimap).StartCoroutine(AddNpcPinCoroutine(minimap, "Vendor_BlackForest"));
		yield return ((MonoBehaviour)minimap).StartCoroutine(AddNpcPinCoroutine(minimap, "Hildir_camp"));
		yield return ((MonoBehaviour)minimap).StartCoroutine(AddNpcPinCoroutine(minimap, "BogWitch_Camp"));
	}

	private static IEnumerator AddNpcPinCoroutine(Minimap minimap, string prefab, float retryDelay = 1f)
	{
		List<Vector3> positions = new List<Vector3>();
		int prevCount = -1;
		while (positions.Count == 0 || positions.Count != prevCount)
		{
			positions = (from kv in ZoneSystem.instance.m_locationInstances
				where kv.Value.m_location.m_prefabName == prefab
				select kv.Value.m_position).ToList();
			prevCount = positions.Count;
			yield return (object)new WaitForSeconds(retryDelay);
		}
		Vector3 val = MinimapHelpers.FindClosestToOrigin(positions);
		if (!(val == Vector3.zero))
		{
			MinimapHelpers.RemovePinsNearPosition(minimap, val);
			PinData obj = minimap.AddPin(val, (PinType)8, "", true, false, 0L, default(PlatformUserID));
			obj.m_icon = MinimapHelpers.GetLocationIcon(minimap, prefab);
			obj.m_doubleSize = true;
			RevealNpcMapPinsPlugin.Log.LogInfo((object)$"Added pin for {prefab} at {val}");
		}
	}
}