Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of Valheim Compass v1.0.0
BepInEx/plugins/ValheimCompass.dll
Decompiled 2 weeks agousing 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!"); } }