Decompiled source of Valheim Compass v1.0.0

BepInEx/plugins/ValheimCompass.dll

Decompiled 2 weeks ago
using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using HarmonyLib;
using Jotunn.Managers;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("ValheimCompass")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("ValheimCompass")]
[assembly: AssemblyTitle("ValheimCompass")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace ValheimCompass;

[BepInPlugin("hilario.valheimcompass", "Valheim Compass", "1.0.0")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[DefaultExecutionOrder(10000)]
public class ValheimCompassPlugin : BaseUnityPlugin
{
	[HarmonyPatch(typeof(Vegvisir), "Interact")]
	private static class VegvisirInteractPatch
	{
		[HarmonyPrefix]
		private unsafe static bool Prefix(Vegvisir __instance, Humanoid character, bool hold, ref bool __result)
		{
			//IL_0064: 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_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ef: 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)
			if (!Game.m_noMap)
			{
				return true;
			}
			if (hold)
			{
				return true;
			}
			Player val = (Player)(object)((character is Player) ? character : null);
			if (val == null || (Object)(object)val != (Object)(object)Player.m_localPlayer)
			{
				return true;
			}
			try
			{
				if (!TryGetVegvisirTarget(__instance, val, out var targetPosition, out var targetName))
				{
					return true;
				}
				Vector3 val2 = targetPosition - ((Component)val).transform.position;
				val2.y = 0f;
				if (((Vector3)(ref val2)).sqrMagnitude < 0.001f)
				{
					return true;
				}
				ValheimCompassPlugin.vegvisirTargetDirection = ((Vector3)(ref val2)).normalized;
				vegvisirRotationLocked = true;
				vegvisirRotationLockGrace = 0.35f;
				ApplyVegvisirKeys(__instance, val);
				CaptureVegvisirVisualOffset(val);
				vegvisirSitWasActive = false;
				vegvisirSequenceStage = 1;
				vegvisirSequenceTimer = 0f;
				__result = true;
				string text = targetName;
				Vector3 vegvisirTargetDirection = ValheimCompassPlugin.vegvisirTargetDirection;
				Debug.Log((object)("[Valheim Compass] VEGVISIR NO-CAMERA TURN | Target: " + text + " | Direction: " + ((object)(*(Vector3*)(&vegvisirTargetDirection))/*cast due to .constrained prefix*/).ToString()));
				return false;
			}
			catch (Exception ex)
			{
				Debug.LogError((object)("[Valheim Compass] Vegvisir no-camera handling failed: " + ex));
				return true;
			}
		}
	}

	public const string PluginGUID = "hilario.valheimcompass";

	public const string PluginName = "Valheim Compass";

	public const string PluginVersion = "1.0.0";

	private Transform wristBone;

	private Player lastPlayer;

	private GameObject bracerRoot;

	private Harmony harmony;

	private bool bracerBuilt = false;

	private float cameraStartupTimer = 0f;

	private bool cameraStartupFinished = false;

	private float sittingCameraBlend = 0f;

	private float sittingCameraBlendVelocity = 0f;

	private float vegvisirAutoSitZoomBlend = 0f;

	private float vegvisirAutoSitZoomVelocity = 0f;

	private AssetBundle compassBundle;

	private GameObject shipCompassPrefab;

	private Transform compassBody;

	private Transform compassCap;

	private Transform compassNeedle;

	private static Vector3 vegvisirTargetDirection = Vector3.zero;

	private static bool vegvisirRotationLocked = false;

	private static float vegvisirRotationLockGrace = 0f;

	private static Quaternion vegvisirVisualOffset = Quaternion.identity;

	private static bool vegvisirVisualOffsetCaptured = false;

	private static bool vegvisirCameraHandoffPending = false;

	private static int vegvisirSequenceStage = 0;

	private static float vegvisirSequenceTimer = 0f;

	private static Vector3 vegvisirCameraStartPosition = Vector3.zero;

	private static Quaternion vegvisirCameraStartRotation = Quaternion.identity;

	private static float vegvisirCameraOrbitRadius = 0f;

	private static float vegvisirCameraHeightOffset = 0f;

	private static Quaternion vegvisirCameraTargetRotation = Quaternion.identity;

	private static bool vegvisirSitWasActive = false;

	private Ship lastControlledShip;

	private GameObject shipCompassMount;

	private GameObject shipCompassAnchor;

	private static GameObject GetPlayerVisual(Player player)
	{
		if ((Object)(object)player == (Object)null)
		{
			return null;
		}
		FieldInfo fieldInfo = AccessTools.Field(typeof(Character), "m_visual");
		if (fieldInfo == null)
		{
			return null;
		}
		object? value = fieldInfo.GetValue(player);
		return (GameObject)((value is GameObject) ? value : null);
	}

	private static void CaptureVegvisirVisualOffset(Player player)
	{
		//IL_0025: Unknown result type (might be due to invalid IL or missing references)
		//IL_002a: Unknown result type (might be due to invalid IL or missing references)
		//IL_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)
		//IL_004a: 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)
		//IL_0059: Unknown result type (might be due to invalid IL or missing references)
		//IL_0070: Unknown result type (might be due to invalid IL or missing references)
		//IL_0075: Unknown result type (might be due to invalid IL or missing references)
		//IL_0098: Unknown result type (might be due to invalid IL or missing references)
		//IL_009d: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
		GameObject playerVisual = GetPlayerVisual(player);
		if ((Object)(object)playerVisual == (Object)null)
		{
			vegvisirVisualOffsetCaptured = false;
			return;
		}
		vegvisirVisualOffset = Quaternion.Inverse(((Component)player).transform.rotation) * playerVisual.transform.rotation;
		vegvisirVisualOffsetCaptured = true;
		Quaternion val = Quaternion.LookRotation(vegvisirTargetDirection, Vector3.up);
		Debug.Log((object)("[Valheim Compass] VEGVISIR VISUAL TARGET | PlayerYaw: " + ((Component)player).transform.eulerAngles.y.ToString("F1") + " | VisualYaw: " + playerVisual.transform.eulerAngles.y.ToString("F1") + " | TargetYaw: " + ((Quaternion)(ref val)).eulerAngles.y.ToString("F1")));
	}

	private static void ApplyVegvisirVisualFacing(Player player)
	{
		//IL_006c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0071: Unknown result type (might be due to invalid IL or missing references)
		//IL_0076: Unknown result type (might be due to invalid IL or missing references)
		//IL_007b: Unknown result type (might be due to invalid IL or missing references)
		//IL_007c: Unknown result type (might be due to invalid IL or missing references)
		//IL_007d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0082: Unknown result type (might be due to invalid IL or missing references)
		//IL_0087: Unknown result type (might be due to invalid IL or missing references)
		//IL_0094: Unknown result type (might be due to invalid IL or missing references)
		//IL_0099: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
		if (!vegvisirRotationLocked || (Object)(object)player == (Object)null || ((Vector3)(ref vegvisirTargetDirection)).sqrMagnitude < 0.001f)
		{
			return;
		}
		GameObject playerVisual = GetPlayerVisual(player);
		if ((Object)(object)playerVisual == (Object)null)
		{
			return;
		}
		if (!vegvisirVisualOffsetCaptured)
		{
			CaptureVegvisirVisualOffset(player);
			if (!vegvisirVisualOffsetCaptured)
			{
				return;
			}
		}
		Quaternion val = Quaternion.LookRotation(vegvisirTargetDirection, Vector3.up);
		Quaternion val2 = val * vegvisirVisualOffset;
		playerVisual.transform.rotation = Quaternion.RotateTowards(playerVisual.transform.rotation, val2, 360f * Time.deltaTime);
	}

	private static bool TryGetVegvisirTarget(Vegvisir stone, Player player, out Vector3 targetPosition, out string targetName)
	{
		//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_005e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0063: 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_00bc: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
		//IL_010c: Unknown result type (might be due to invalid IL or missing references)
		//IL_010e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0113: Unknown result type (might be due to invalid IL or missing references)
		targetPosition = Vector3.zero;
		targetName = "";
		if ((Object)(object)stone == (Object)null || (Object)(object)player == (Object)null || (Object)(object)ZoneSystem.instance == (Object)null || stone.m_locations == null || stone.m_locations.Count == 0)
		{
			return false;
		}
		Vector3 position = ((Component)stone).transform.position;
		float num = float.MaxValue;
		bool flag = false;
		foreach (VegvisrLocation location in stone.m_locations)
		{
			if (location == null || string.IsNullOrEmpty(location.m_locationName))
			{
				continue;
			}
			LocationInstance val = default(LocationInstance);
			if (ZoneSystem.instance.FindClosestLocation(location.m_locationName, position, ref val))
			{
				Vector3 val2 = val.m_position - position;
				val2.y = 0f;
				float sqrMagnitude = ((Vector3)(ref val2)).sqrMagnitude;
				if (!flag || sqrMagnitude < num)
				{
					flag = true;
					num = sqrMagnitude;
					targetPosition = val.m_position;
					targetName = (string.IsNullOrEmpty(location.m_pinName) ? location.m_locationName : location.m_pinName);
				}
			}
		}
		return flag;
	}

	private static void ApplyVegvisirKeys(Vegvisir stone, Player player)
	{
		if (!string.IsNullOrEmpty(stone.m_setsGlobalKey) && (Object)(object)ZoneSystem.instance != (Object)null)
		{
			ZoneSystem.instance.SetGlobalKey(stone.m_setsGlobalKey);
		}
		if (!string.IsNullOrEmpty(stone.m_setsPlayerKey))
		{
			((Humanoid)player).AddUniqueKey(stone.m_setsPlayerKey);
		}
	}

	private void Awake()
	{
		//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d2: Expected O, but got Unknown
		((BaseUnityPlugin)this).Logger.LogInfo((object)"Valheim Compass loaded successfully!");
		string text = Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location), "valheimcompass");
		compassBundle = AssetBundle.LoadFromFile(text);
		if ((Object)(object)compassBundle == (Object)null)
		{
			((BaseUnityPlugin)this).Logger.LogError((object)("Failed to load AssetBundle: " + text));
			return;
		}
		((BaseUnityPlugin)this).Logger.LogInfo((object)"Valheim Compass AssetBundle loaded successfully!");
		shipCompassPrefab = compassBundle.LoadAsset<GameObject>("assets/bracelet/prefabs/shipcompassholder.prefab");
		if ((Object)(object)shipCompassPrefab == (Object)null)
		{
			((BaseUnityPlugin)this).Logger.LogError((object)"ShipCompassHolder was NOT found in AssetBundle!");
		}
		else
		{
			((BaseUnityPlugin)this).Logger.LogInfo((object)"ShipCompassHolder loaded successfully!");
		}
		harmony = new Harmony("hilario.valheimcompass");
		harmony.PatchAll();
	}

	private void Update()
	{
		//IL_0161: Unknown result type (might be due to invalid IL or missing references)
		//IL_0186: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ab: Unknown result type (might be due to invalid IL or missing references)
		if (!bracerBuilt)
		{
			BuildBracer();
			bracerBuilt = (Object)(object)bracerRoot != (Object)null;
		}
		if (!bracerBuilt || (Object)(object)bracerRoot == (Object)null)
		{
			return;
		}
		Player localPlayer = Player.m_localPlayer;
		if ((Object)(object)localPlayer == (Object)null)
		{
			lastPlayer = null;
			wristBone = null;
			cameraStartupTimer = 0f;
			cameraStartupFinished = false;
			return;
		}
		EnsureShipCompassMountExists();
		UpdateShipHelmTest(localPlayer);
		UpdateVegvisirRotationLock(localPlayer);
		if ((Object)(object)bracerRoot.transform.parent != (Object)null && (Object)(object)bracerRoot.transform.parent == (Object)(object)wristBone)
		{
			UpdateCompassNeedle(localPlayer);
			UpdateDefaultCamera(localPlayer);
			return;
		}
		Animator componentInChildren = ((Component)localPlayer).GetComponentInChildren<Animator>();
		if (!((Object)(object)componentInChildren == (Object)null))
		{
			Transform boneTransform = componentInChildren.GetBoneTransform((HumanBodyBones)15);
			if (!((Object)(object)boneTransform == (Object)null))
			{
				lastPlayer = localPlayer;
				wristBone = boneTransform;
				bracerRoot.transform.SetParent(wristBone, false);
				bracerRoot.transform.localPosition = new Vector3(-0.0004f, 0.0015f, 0.0028f);
				bracerRoot.transform.localRotation = Quaternion.Euler(0f, 90f, -85f);
				bracerRoot.transform.localScale = new Vector3(0.0021f, 0.0021f, 0.0021f);
				bracerRoot.SetActive(true);
				((BaseUnityPlugin)this).Logger.LogInfo((object)("Prebuilt bracer attached to left hand: " + ((Object)wristBone).name));
			}
		}
	}

	private void LateUpdate()
	{
		//IL_0153: Unknown result type (might be due to invalid IL or missing references)
		//IL_0158: Unknown result type (might be due to invalid IL or missing references)
		//IL_019c: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a7: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ae: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b3: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c5: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ca: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e2: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e7: Unknown result type (might be due to invalid IL or missing references)
		//IL_01fe: Unknown result type (might be due to invalid IL or missing references)
		//IL_0219: Unknown result type (might be due to invalid IL or missing references)
		//IL_021e: Unknown result type (might be due to invalid IL or missing references)
		Player localPlayer = Player.m_localPlayer;
		if ((Object)(object)localPlayer == (Object)null)
		{
			return;
		}
		ApplyVegvisirVisualFacing(localPlayer);
		GameCamera instance = GameCamera.instance;
		if ((Object)(object)instance == (Object)null)
		{
			return;
		}
		FieldInfo field = typeof(GameCamera).GetField("m_camera", BindingFlags.Instance | BindingFlags.NonPublic);
		if (field == null)
		{
			return;
		}
		object? value = field.GetValue(instance);
		Camera val = (Camera)((value is Camera) ? value : null);
		if ((Object)(object)val == (Object)null)
		{
			return;
		}
		UpdateVegvisirCameraAndSit(localPlayer, val);
		bool flag = vegvisirSequenceStage == 4 || vegvisirSequenceStage == 5;
		float num = (((((Character)localPlayer).IsSitting() && !((Character)localPlayer).IsAttached()) || flag) ? 1f : 0f);
		sittingCameraBlend = Mathf.SmoothDamp(sittingCameraBlend, num, ref sittingCameraBlendVelocity, 0.45f);
		float num2 = (flag ? 1f : 0f);
		vegvisirAutoSitZoomBlend = Mathf.SmoothDamp(vegvisirAutoSitZoomBlend, num2, ref vegvisirAutoSitZoomVelocity, 0.75f);
		if (sittingCameraBlend < 0.001f && !((Character)localPlayer).IsSitting() && !flag)
		{
			sittingCameraBlend = 0f;
			return;
		}
		((Component)val).transform.RotateAround(((Component)localPlayer).transform.position, Vector3.up, -145f * sittingCameraBlend);
		float num3 = 1.45f * sittingCameraBlend;
		num3 += -1f * vegvisirAutoSitZoomBlend * sittingCameraBlend;
		Transform transform = ((Component)val).transform;
		transform.position += ((Component)val).transform.forward * num3;
		Transform transform2 = ((Component)val).transform;
		transform2.position += Vector3.down * (0.3f * vegvisirAutoSitZoomBlend * sittingCameraBlend);
		((Component)val).transform.rotation = ((Component)val).transform.rotation * Quaternion.Euler(30f * sittingCameraBlend, 0f, 0f);
		if (vegvisirCameraHandoffPending)
		{
			HandoffVegvisirCamera(val);
			vegvisirCameraHandoffPending = false;
			((BaseUnityPlugin)this).Logger.LogInfo((object)"VEGVISIR CAMERA HANDED OFF AFTER FINAL POSITION");
		}
	}

	private void UpdateDefaultCamera(Player player)
	{
		if (cameraStartupFinished)
		{
			return;
		}
		cameraStartupTimer += Time.deltaTime;
		if (cameraStartupTimer < 3f)
		{
			return;
		}
		GameCamera instance = GameCamera.instance;
		if ((Object)(object)instance == (Object)null)
		{
			return;
		}
		FieldInfo field = typeof(GameCamera).GetField("m_distance", BindingFlags.Instance | BindingFlags.NonPublic);
		if (!(field == null))
		{
			field.SetValue(instance, 3f);
			if (cameraStartupTimer >= 4f)
			{
				cameraStartupFinished = true;
				((BaseUnityPlugin)this).Logger.LogInfo((object)"CAMERA STARTUP FINISHED AT DISTANCE 3");
			}
		}
	}

	private void UpdateVegvisirCameraAndSit(Player player, Camera mainCamera)
	{
		//IL_012d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0132: Unknown result type (might be due to invalid IL or missing references)
		//IL_0134: Unknown result type (might be due to invalid IL or missing references)
		//IL_0139: Unknown result type (might be due to invalid IL or missing references)
		//IL_013b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0140: Unknown result type (might be due to invalid IL or missing references)
		//IL_0170: Unknown result type (might be due to invalid IL or missing references)
		//IL_0175: Unknown result type (might be due to invalid IL or missing references)
		//IL_017a: Unknown result type (might be due to invalid IL or missing references)
		//IL_017e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0183: Unknown result type (might be due to invalid IL or missing references)
		//IL_0187: Unknown result type (might be due to invalid IL or missing references)
		//IL_018c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0163: Unknown result type (might be due to invalid IL or missing references)
		//IL_0168: Unknown result type (might be due to invalid IL or missing references)
		//IL_016d: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b0: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b2: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b9: Unknown result type (might be due to invalid IL or missing references)
		//IL_01be: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c3: Unknown result type (might be due to invalid IL or missing references)
		//IL_01cd: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d2: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d7: Unknown result type (might be due to invalid IL or missing references)
		//IL_01df: 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_01f2: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f9: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a3: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a5: 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_007e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0083: Unknown result type (might be due to invalid IL or missing references)
		//IL_0088: Unknown result type (might be due to invalid IL or missing references)
		//IL_008a: Unknown result type (might be due to invalid IL or missing references)
		//IL_008c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0091: 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_009e: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
		//IL_02f2: Unknown result type (might be due to invalid IL or missing references)
		//IL_02f7: Unknown result type (might be due to invalid IL or missing references)
		//IL_02fc: Unknown result type (might be due to invalid IL or missing references)
		//IL_0301: Unknown result type (might be due to invalid IL or missing references)
		//IL_0323: 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_0328: Unknown result type (might be due to invalid IL or missing references)
		//IL_0330: Unknown result type (might be due to invalid IL or missing references)
		//IL_0360: Unknown result type (might be due to invalid IL or missing references)
		//IL_0396: Unknown result type (might be due to invalid IL or missing references)
		//IL_03e7: Unknown result type (might be due to invalid IL or missing references)
		//IL_03f1: Unknown result type (might be due to invalid IL or missing references)
		//IL_0413: Unknown result type (might be due to invalid IL or missing references)
		if (vegvisirSequenceStage == 0 || (Object)(object)player == (Object)null || (Object)(object)mainCamera == (Object)null || ((Vector3)(ref vegvisirTargetDirection)).sqrMagnitude < 0.001f)
		{
			return;
		}
		vegvisirSequenceTimer += Time.deltaTime;
		if (vegvisirSequenceStage == 1)
		{
			bool flag = false;
			GameObject playerVisual = GetPlayerVisual(player);
			if ((Object)(object)playerVisual != (Object)null && vegvisirVisualOffsetCaptured)
			{
				Quaternion val = Quaternion.LookRotation(vegvisirTargetDirection, Vector3.up);
				Quaternion val2 = val * vegvisirVisualOffset;
				flag = Quaternion.Angle(playerVisual.transform.rotation, val2) <= 2f;
			}
			if (!flag && vegvisirSequenceTimer < 0.65f)
			{
				return;
			}
			CaptureVegvisirCameraTurn(player, mainCamera);
			vegvisirSequenceStage = 2;
			vegvisirSequenceTimer = 0f;
		}
		if (vegvisirSequenceStage == 2)
		{
			float num = Mathf.Clamp01(vegvisirSequenceTimer / 0.65f);
			float num2 = num * num * (3f - 2f * num);
			Vector3 position = ((Component)player).transform.position;
			Vector3 val3 = vegvisirCameraStartPosition - position;
			val3.y = 0f;
			if (((Vector3)(ref val3)).sqrMagnitude < 0.001f)
			{
				val3 = -vegvisirTargetDirection;
			}
			Vector3 val4 = -vegvisirTargetDirection;
			Vector3 val5 = Vector3.Slerp(((Vector3)(ref val3)).normalized, val4, num2);
			if (((Vector3)(ref val5)).sqrMagnitude < 0.001f)
			{
				val5 = val4;
			}
			((Vector3)(ref val5)).Normalize();
			Vector3 position2 = position + val5 * vegvisirCameraOrbitRadius + Vector3.up * vegvisirCameraHeightOffset;
			((Component)mainCamera).transform.position = position2;
			((Component)mainCamera).transform.rotation = Quaternion.Slerp(vegvisirCameraStartRotation, vegvisirCameraTargetRotation, num2);
			if (num < 1f)
			{
				return;
			}
			vegvisirSequenceStage = 3;
			vegvisirSequenceTimer = 0f;
			((BaseUnityPlugin)this).Logger.LogInfo((object)"VEGVISIR CAMERA FACING BOSS");
		}
		if (vegvisirSequenceStage == 3)
		{
			HoldVegvisirCameraAtTarget(player, mainCamera);
			if (vegvisirSequenceTimer < 0.15f)
			{
				return;
			}
			bool flag2 = StartVegvisirSit(player);
			vegvisirSitWasActive = false;
			vegvisirSequenceStage = 4;
			vegvisirSequenceTimer = 0f;
			((BaseUnityPlugin)this).Logger.LogInfo((object)(flag2 ? "VEGVISIR AUTO SIT STARTED" : "VEGVISIR AUTO SIT METHOD NOT FOUND"));
		}
		if (vegvisirSequenceStage == 4)
		{
			HoldVegvisirCameraAtTarget(player, mainCamera);
			if (sittingCameraBlend < 0.99f || vegvisirAutoSitZoomBlend < 0.97f || vegvisirSequenceTimer < 1.1f)
			{
				return;
			}
			Quaternion val6 = Quaternion.LookRotation(vegvisirTargetDirection, Vector3.up);
			GameObject playerVisual2 = GetPlayerVisual(player);
			Quaternion rotation = (((Object)(object)playerVisual2 != (Object)null) ? playerVisual2.transform.rotation : Quaternion.identity);
			((Component)player).transform.rotation = val6;
			FieldInfo fieldInfo = AccessTools.Field(typeof(Character), "m_lookYaw");
			if (fieldInfo != null)
			{
				fieldInfo.SetValue(player, val6);
			}
			FieldInfo fieldInfo2 = AccessTools.Field(typeof(Character), "m_lookDir");
			if (fieldInfo2 != null)
			{
				fieldInfo2.SetValue(player, vegvisirTargetDirection);
			}
			FieldInfo fieldInfo3 = AccessTools.Field(typeof(Character), "m_body");
			if (fieldInfo3 != null)
			{
				object? value = fieldInfo3.GetValue(player);
				Rigidbody val7 = (Rigidbody)((value is Rigidbody) ? value : null);
				if (val7 != null)
				{
					val7.rotation = val6;
					val7.angularVelocity = Vector3.zero;
				}
			}
			if ((Object)(object)playerVisual2 != (Object)null)
			{
				playerVisual2.transform.rotation = rotation;
			}
			vegvisirCameraHandoffPending = true;
			vegvisirSitWasActive = ((Character)player).IsSitting();
			vegvisirSequenceStage = 5;
			vegvisirSequenceTimer = 0f;
		}
		else if (vegvisirSequenceStage == 5)
		{
			if (((Character)player).IsSitting())
			{
				vegvisirSitWasActive = true;
			}
			else if (vegvisirSitWasActive || (!((Character)player).InEmote() && vegvisirSequenceTimer > 0.25f))
			{
				vegvisirSequenceStage = 0;
				vegvisirSequenceTimer = 0f;
				vegvisirSitWasActive = false;
				((BaseUnityPlugin)this).Logger.LogInfo((object)"VEGVISIR AUTO SIT FINISHED");
			}
		}
	}

	private static void CaptureVegvisirCameraTurn(Player player, Camera mainCamera)
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_000c: 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_0023: Unknown result type (might be due to invalid IL or missing references)
		//IL_0028: Unknown result type (might be due to invalid IL or missing references)
		//IL_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)
		//IL_0039: Unknown result type (might be due to invalid IL or missing references)
		//IL_007a: Unknown result type (might be due to invalid IL or missing references)
		//IL_007f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0084: Unknown result type (might be due to invalid IL or missing references)
		//IL_0089: Unknown result type (might be due to invalid IL or missing references)
		//IL_008a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0090: Unknown result type (might be due to invalid IL or missing references)
		//IL_0096: Unknown result type (might be due to invalid IL or missing references)
		//IL_009b: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f8: 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_00ff: Unknown result type (might be due to invalid IL or missing references)
		//IL_0104: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
		Vector3 position = ((Component)player).transform.position;
		vegvisirCameraStartPosition = ((Component)mainCamera).transform.position;
		vegvisirCameraStartRotation = ((Component)mainCamera).transform.rotation;
		Vector3 val = vegvisirCameraStartPosition - position;
		vegvisirCameraHeightOffset = val.y;
		val.y = 0f;
		vegvisirCameraOrbitRadius = ((Vector3)(ref val)).magnitude;
		if (vegvisirCameraOrbitRadius < 0.25f)
		{
			vegvisirCameraOrbitRadius = 0.25f;
		}
		Vector3 val2 = vegvisirCameraStartRotation * Vector3.forward;
		Vector2 val3 = new Vector2(val2.x, val2.z);
		float num = ((Vector2)(ref val3)).magnitude;
		if (num < 0.001f)
		{
			num = 1f;
		}
		Vector3 val4 = vegvisirTargetDirection * num;
		val4.y = val2.y;
		if (((Vector3)(ref val4)).sqrMagnitude < 0.001f)
		{
			val4 = vegvisirTargetDirection;
		}
		((Vector3)(ref val4)).Normalize();
		vegvisirCameraTargetRotation = Quaternion.LookRotation(val4, Vector3.up);
	}

	private static void HoldVegvisirCameraAtTarget(Player player, Camera mainCamera)
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_000c: 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_000e: 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_001d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0022: 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_0036: Unknown result type (might be due to invalid IL or missing references)
		//IL_003d: Unknown result type (might be due to invalid IL or missing references)
		//IL_004a: Unknown result type (might be due to invalid IL or missing references)
		Vector3 position = ((Component)player).transform.position;
		Vector3 position2 = position - vegvisirTargetDirection * vegvisirCameraOrbitRadius + Vector3.up * vegvisirCameraHeightOffset;
		((Component)mainCamera).transform.position = position2;
		((Component)mainCamera).transform.rotation = vegvisirCameraTargetRotation;
	}

	private static void HandoffVegvisirCamera(Camera mainCamera)
	{
		//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_003d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0042: Unknown result type (might be due to invalid IL or missing references)
		//IL_0049: 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_0082: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)mainCamera == (Object)null)
		{
			return;
		}
		GameCamera instance = GameCamera.instance;
		if (!((Object)(object)instance == (Object)null))
		{
			Vector3 position = ((Component)mainCamera).transform.position;
			Quaternion rotation = ((Component)mainCamera).transform.rotation;
			((Component)instance).transform.position = position;
			((Component)instance).transform.rotation = rotation;
			FieldInfo fieldInfo = AccessTools.Field(typeof(GameCamera), "m_tmpPos");
			if (fieldInfo != null)
			{
				fieldInfo.SetValue(instance, position);
			}
			FieldInfo fieldInfo2 = AccessTools.Field(typeof(GameCamera), "m_tmpRot");
			if (fieldInfo2 != null)
			{
				fieldInfo2.SetValue(instance, rotation);
			}
		}
	}

	private static bool StartVegvisirSit(Player player)
	{
		if ((Object)(object)player == (Object)null)
		{
			return false;
		}
		try
		{
			player.StartEmote("sit", false);
			return true;
		}
		catch (Exception ex)
		{
			Debug.LogError((object)("[Valheim Compass] Could not start sit emote: " + ex));
			return false;
		}
	}

	private static bool VegvisirPlayerHasMovementInput(Player player)
	{
		//IL_0049: Unknown result type (might be due to invalid IL or missing references)
		//IL_004e: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)player == (Object)null)
		{
			return false;
		}
		FieldInfo fieldInfo = AccessTools.Field(typeof(Character), "m_moveDir");
		if (fieldInfo == null)
		{
			return false;
		}
		if (!(fieldInfo.GetValue(player) is Vector3 val) || 1 == 0)
		{
			return false;
		}
		return ((Vector3)(ref val)).sqrMagnitude > 0.01f;
	}

	private void UpdateVegvisirRotationLock(Player player)
	{
		//IL_0091: 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_00c5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
		//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d4: 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_00e7: 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_0102: Unknown result type (might be due to invalid IL or missing references)
		//IL_0131: Unknown result type (might be due to invalid IL or missing references)
		//IL_0166: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b7: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c0: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f1: 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_01e2: Unknown result type (might be due to invalid IL or missing references)
		if (!vegvisirRotationLocked || (Object)(object)player == (Object)null || vegvisirSequenceStage != 0)
		{
			return;
		}
		if (vegvisirRotationLockGrace > 0f)
		{
			vegvisirRotationLockGrace -= Time.deltaTime;
			return;
		}
		FieldInfo fieldInfo = AccessTools.Field(typeof(Character), "m_moveDir");
		if (fieldInfo == null || !(fieldInfo.GetValue(player) is Vector3 val) || 1 == 0 || ((Vector3)(ref val)).sqrMagnitude <= 0.01f)
		{
			return;
		}
		Quaternion val2 = Quaternion.LookRotation(vegvisirTargetDirection, Vector3.up);
		GameObject playerVisual = GetPlayerVisual(player);
		Quaternion rotation = (((Object)(object)playerVisual != (Object)null) ? playerVisual.transform.rotation : Quaternion.identity);
		((Component)player).transform.rotation = val2;
		FieldInfo fieldInfo2 = AccessTools.Field(typeof(Character), "m_lookYaw");
		if (fieldInfo2 != null)
		{
			fieldInfo2.SetValue(player, val2);
		}
		FieldInfo fieldInfo3 = AccessTools.Field(typeof(Character), "m_lookDir");
		if (fieldInfo3 != null)
		{
			fieldInfo3.SetValue(player, vegvisirTargetDirection);
		}
		FieldInfo fieldInfo4 = AccessTools.Field(typeof(Character), "m_body");
		if (fieldInfo4 != null)
		{
			object? value = fieldInfo4.GetValue(player);
			Rigidbody val3 = (Rigidbody)((value is Rigidbody) ? value : null);
			if (val3 != null)
			{
				val3.rotation = val2;
				val3.angularVelocity = Vector3.zero;
			}
		}
		if ((Object)(object)playerVisual != (Object)null)
		{
			playerVisual.transform.rotation = rotation;
		}
		vegvisirRotationLocked = false;
		vegvisirTargetDirection = Vector3.zero;
		vegvisirVisualOffsetCaptured = false;
		((BaseUnityPlugin)this).Logger.LogInfo((object)"VEGVISIR FACING HANDED TO REAL PLAYER");
	}

	private void EnsureShipCompassMountExists()
	{
		if ((Object)(object)shipCompassMount != (Object)null)
		{
			return;
		}
		Ship[] array = Object.FindObjectsByType<Ship>((FindObjectsSortMode)0);
		Ship[] array2 = array;
		foreach (Ship val in array2)
		{
			if (!((Object)(object)val == (Object)null) && ((Object)((Component)val).gameObject).name.StartsWith("VikingShip"))
			{
				CreateShipCompassMount(val);
				((BaseUnityPlugin)this).Logger.LogInfo((object)"LONGSHIP FOUND - COMPASS HOLDER CREATED");
				break;
			}
		}
	}

	private void UpdateShipHelmTest(Player player)
	{
		if ((Object)(object)player == (Object)null)
		{
			return;
		}
		Ship controlledShip = player.GetControlledShip();
		if ((Object)(object)controlledShip != (Object)null)
		{
			if ((Object)(object)lastControlledShip != (Object)(object)controlledShip)
			{
				lastControlledShip = controlledShip;
				((BaseUnityPlugin)this).Logger.LogInfo((object)("SHIP HELM ENTERED | Ship: " + ((Object)((Component)controlledShip).gameObject).name));
				MoveCompassToShip();
			}
		}
		else if ((Object)(object)lastControlledShip != (Object)null)
		{
			((BaseUnityPlugin)this).Logger.LogInfo((object)"SHIP HELM LEFT");
			ReturnCompassToBracelet();
			lastControlledShip = null;
		}
	}

	private void CreateShipCompassMount(Ship ship)
	{
		//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
		//IL_011b: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)ship == (Object)null || (Object)(object)shipCompassMount != (Object)null)
		{
			return;
		}
		if ((Object)(object)shipCompassPrefab == (Object)null)
		{
			((BaseUnityPlugin)this).Logger.LogError((object)"ShipCompassHolder prefab is null!");
			return;
		}
		Transform val = ((Component)ship).transform.Find("interactive/controlls/attachpoint");
		if ((Object)(object)val == (Object)null)
		{
			((BaseUnityPlugin)this).Logger.LogError((object)"Could not find Longship helm attachpoint!");
			return;
		}
		shipCompassMount = Object.Instantiate<GameObject>(shipCompassPrefab);
		((Object)shipCompassMount).name = "ValheimShipCompassHolder";
		shipCompassMount.transform.SetParent(val, false);
		shipCompassMount.transform.localPosition = new Vector3(-0.3f, 0.3f, 0.2f);
		shipCompassMount.transform.localRotation = Quaternion.Euler(0f, -90f, 0f);
		shipCompassMount.transform.localScale = new Vector3(0.2f, 0.5f, 0.2f);
		ApplyShipHolderWoodMaterial();
		CreateShipCompassAnchor();
		((BaseUnityPlugin)this).Logger.LogInfo((object)"REAL SHIP COMPASS HOLDER CREATED");
	}

	private void ApplyShipHolderWoodMaterial()
	{
		//IL_0121: Unknown result type (might be due to invalid IL or missing references)
		//IL_0128: Expected O, but got Unknown
		//IL_0155: Unknown result type (might be due to invalid IL or missing references)
		//IL_0162: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)shipCompassMount == (Object)null)
		{
			return;
		}
		GameObject prefab = PrefabManager.Instance.GetPrefab("piece_chest_wood");
		if ((Object)(object)prefab == (Object)null)
		{
			((BaseUnityPlugin)this).Logger.LogError((object)"Could not find piece_chest_wood!");
			return;
		}
		Renderer[] componentsInChildren = prefab.GetComponentsInChildren<Renderer>(true);
		Material val = null;
		Renderer[] array = componentsInChildren;
		foreach (Renderer val2 in array)
		{
			if (((Object)((Component)val2).gameObject).name == "woodchesttop_closed")
			{
				val = val2.sharedMaterial;
				break;
			}
		}
		if ((Object)(object)val == (Object)null)
		{
			((BaseUnityPlugin)this).Logger.LogError((object)"Could not find chest lid wood material!");
			return;
		}
		Renderer[] componentsInChildren2 = shipCompassMount.GetComponentsInChildren<Renderer>(true);
		Renderer[] array2 = componentsInChildren2;
		foreach (Renderer val3 in array2)
		{
			if (((Object)((Component)val3).gameObject).name == "CompassBase" || ((Object)((Component)val3).gameObject).name == "CompassSupport")
			{
				Material val4 = new Material(val3.sharedMaterial);
				if ((Object)(object)val.mainTexture != (Object)null)
				{
					val4.mainTexture = val.mainTexture;
					val4.mainTextureScale = new Vector2(0.9f, 0.35f);
					val4.mainTextureOffset = Vector2.zero;
				}
				val3.material = val4;
			}
		}
		((BaseUnityPlugin)this).Logger.LogInfo((object)"SHIP COMPASS HOLDER WOOD MATERIAL APPLIED");
	}

	private void CreateShipCompassAnchor()
	{
		//IL_0069: Unknown result type (might be due to invalid IL or missing references)
		//IL_0073: Expected O, but got Unknown
		//IL_00a0: 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_00db: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)shipCompassMount == (Object)null) && !((Object)(object)shipCompassAnchor != (Object)null))
		{
			Transform val = shipCompassMount.transform.Find("CompassTray");
			if ((Object)(object)val == (Object)null)
			{
				((BaseUnityPlugin)this).Logger.LogError((object)"CompassTray was NOT found in ShipCompassHolder!");
				return;
			}
			shipCompassAnchor = new GameObject("ShipCompassAnchor");
			shipCompassAnchor.transform.SetParent(val, false);
			shipCompassAnchor.transform.localPosition = new Vector3(0.09f, -1.81f, -0.165f);
			shipCompassAnchor.transform.localRotation = Quaternion.identity;
			shipCompassAnchor.transform.localScale = new Vector3(0.85f, 1f, 0.85f);
		}
	}

	private void MoveCompassToShip()
	{
		if (!((Object)(object)shipCompassAnchor == (Object)null))
		{
			if ((Object)(object)compassBody != (Object)null)
			{
				compassBody.SetParent(shipCompassAnchor.transform, false);
			}
			if ((Object)(object)compassCap != (Object)null)
			{
				compassCap.SetParent(shipCompassAnchor.transform, false);
			}
			if ((Object)(object)compassNeedle != (Object)null)
			{
				compassNeedle.SetParent(shipCompassAnchor.transform, false);
			}
			((BaseUnityPlugin)this).Logger.LogInfo((object)"REAL COMPASS MOVED TO SHIP");
		}
	}

	private void ReturnCompassToBracelet()
	{
		if (!((Object)(object)bracerRoot == (Object)null))
		{
			if ((Object)(object)compassBody != (Object)null)
			{
				compassBody.SetParent(bracerRoot.transform, false);
			}
			if ((Object)(object)compassCap != (Object)null)
			{
				compassCap.SetParent(bracerRoot.transform, false);
			}
			if ((Object)(object)compassNeedle != (Object)null)
			{
				compassNeedle.SetParent(bracerRoot.transform, false);
			}
			((BaseUnityPlugin)this).Logger.LogInfo((object)"REAL COMPASS RETURNED TO BRACELET");
		}
	}

	private void UpdateCompassNeedle(Player player)
	{
		//IL_0066: 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)
		//IL_0044: Unknown result type (might be due to invalid IL or missing references)
		//IL_0049: Unknown result type (might be due to invalid IL or missing references)
		//IL_004e: 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_0089: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)compassNeedle == (Object)null) && !((Object)(object)player == (Object)null))
		{
			float y;
			if (vegvisirRotationLocked && ((Vector3)(ref vegvisirTargetDirection)).sqrMagnitude > 0.001f)
			{
				Quaternion val = Quaternion.LookRotation(vegvisirTargetDirection, Vector3.up);
				y = ((Quaternion)(ref val)).eulerAngles.y;
			}
			else
			{
				y = ((Component)player).transform.eulerAngles.y;
			}
			compassNeedle.localRotation = Quaternion.Euler(-90f, y + 180f, 0f);
		}
	}

	private void BuildBracer()
	{
		if ((Object)(object)compassBundle == (Object)null)
		{
			return;
		}
		GameObject val = compassBundle.LoadAsset<GameObject>("Left_Bracelet_06");
		if ((Object)(object)val == (Object)null)
		{
			((BaseUnityPlugin)this).Logger.LogError((object)"Could not find Left_Bracelet_06 in AssetBundle!");
			return;
		}
		bracerRoot = Object.Instantiate<GameObject>(val);
		((Object)bracerRoot).name = "ValheimCompassBracer";
		Object.DontDestroyOnLoad((Object)(object)bracerRoot);
		compassBody = bracerRoot.transform.Find("Compass");
		compassCap = bracerRoot.transform.Find("CompassCap");
		compassNeedle = bracerRoot.transform.Find("CompassNeedle");
		((BaseUnityPlugin)this).Logger.LogInfo((object)("COMPASS PARTS | Body: " + ((Object)(object)compassBody != (Object)null) + " | Cap: " + ((Object)(object)compassCap != (Object)null) + " | Needle: " + ((Object)(object)compassNeedle != (Object)null)));
		if ((Object)(object)compassNeedle == (Object)null)
		{
			((BaseUnityPlugin)this).Logger.LogError((object)"CompassNeedle was NOT found!");
		}
		else
		{
			((BaseUnityPlugin)this).Logger.LogInfo((object)"CompassNeedle found successfully!");
		}
		bracerRoot.SetActive(false);
		((BaseUnityPlugin)this).Logger.LogInfo((object)"Left_Bracelet_06 instantiated successfully!");
	}
}