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}");
}
}
}