Decompiled source of ValkyrieFlyMount v1.0.10

ValkyrieFlyMount.dll

Decompiled 3 weeks ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using HarmonyLib;
using SoftReferenceableAssets;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("ValkyrieFlyMount")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ValkyrieFlyMount")]
[assembly: AssemblyCopyright("Copyright ©  2023")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("4c60a857-ac79-4677-abf0-ca105c4dbf4e")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace ValkyrieFlyMount;

[BepInPlugin("shudnal.ValkyrieFlyMount", "Valkyrie Fly Mount", "1.0.10")]
public class ValkyrieFlyMount : BaseUnityPlugin
{
	[HarmonyPatch(typeof(Menu), "OnSkip")]
	public static class Menu_OnSkip_IntroSkip
	{
		private static bool Prefix(Menu __instance)
		{
			if (!Object.op_Implicit((Object)(object)controlledValkyrie))
			{
				return true;
			}
			__instance.Hide();
			controlledValkyrie.DropPlayer(menuTeleportOnSkip.Value);
			return menuTeleportOnSkip.Value;
		}
	}

	[HarmonyPatch(typeof(Valkyrie), "Awake")]
	public static class Valkyrie_Awake_MountInitialization
	{
		private static bool Prefix(Valkyrie __instance)
		{
			//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fd: 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_011a: 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_0158: 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_0172: Unknown result type (might be due to invalid IL or missing references)
			//IL_0181: Unknown result type (might be due to invalid IL or missing references)
			//IL_01cb: 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_01db: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e8: 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_01fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0203: Unknown result type (might be due to invalid IL or missing references)
			//IL_021a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0220: Unknown result type (might be due to invalid IL or missing references)
			//IL_0225: Unknown result type (might be due to invalid IL or missing references)
			//IL_022a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0242: Unknown result type (might be due to invalid IL or missing references)
			//IL_0247: Unknown result type (might be due to invalid IL or missing references)
			//IL_024f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0254: Unknown result type (might be due to invalid IL or missing references)
			//IL_0259: Unknown result type (might be due to invalid IL or missing references)
			//IL_0282: Unknown result type (might be due to invalid IL or missing references)
			//IL_0287: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0195: Unknown result type (might be due to invalid IL or missing references)
			//IL_0196: Unknown result type (might be due to invalid IL or missing references)
			//IL_019b: Unknown result type (might be due to invalid IL or missing references)
			if (!modEnabled.Value)
			{
				return true;
			}
			__instance.m_nview = ((Component)__instance).GetComponent<ZNetView>();
			__instance.m_animator = ((Component)__instance).GetComponentInChildren<Animator>();
			if (!__instance.m_nview.IsOwner())
			{
				((Behaviour)__instance).enabled = false;
				return false;
			}
			if (!isFlyingMountValkyrie)
			{
				return true;
			}
			Rigidbody val = default(Rigidbody);
			if (!((Component)__instance).gameObject.TryGetComponent<Rigidbody>(ref val))
			{
				((Component)__instance).gameObject.AddComponent<Rigidbody>().useGravity = false;
			}
			__instance.m_startAltitude = 10f;
			__instance.m_textDuration = 0f;
			__instance.m_descentAltitude = 100f;
			__instance.m_attachOffset = new Vector3(-0.1f, 1.5f, 0.1f);
			__instance.m_speed = 10f;
			__instance.m_turnRate = 5f;
			__instance.m_dropHeight = 10f;
			Vector3 position = ((Component)Player.m_localPlayer).transform.position;
			position.y += __instance.m_startAltitude;
			((Component)__instance).transform.position = position;
			Vector3 val2 = default(Vector3);
			Quaternion rotation = default(Quaternion);
			GameCamera.m_instance.GetCameraPosition(Time.unscaledDeltaTime, ref val2, ref rotation);
			((Component)__instance).transform.rotation = rotation;
			Player.m_localPlayer.m_intro = true;
			__instance.m_targetPoint = new Vector3(0f, ZoneSystem.instance.GetGroundHeight(Vector3.zero) + 150f, 0f);
			LocationInstance val3 = default(LocationInstance);
			if (ZoneSystem.instance.FindClosestLocation("StartTemple", Vector3.zero, ref val3))
			{
				__instance.m_targetPoint = val3.m_position;
			}
			float num = Random.value * (float)Math.PI * 2f;
			Vector3 val4 = default(Vector3);
			((Vector3)(ref val4))..ctor(Mathf.Sin(num), 0f, Mathf.Cos(num));
			Vector3 val5 = Vector3.Cross(val4, Vector3.up);
			__instance.m_descentStart = __instance.m_targetPoint + val4 * __instance.m_startDescentDistance + val5 * 200f;
			__instance.m_descentStart.y = __instance.m_descentAltitude;
			Vector3 val6 = __instance.m_targetPoint - __instance.m_descentStart;
			val6.y = 0f;
			((Vector3)(ref val6)).Normalize();
			__instance.m_flyAwayPoint = __instance.m_targetPoint + val6 * __instance.m_startDescentDistance;
			__instance.m_flyAwayPoint.y = __instance.m_startAltitude;
			__instance.SyncPlayer(true);
			val2 = ((Component)__instance).transform.position;
			string? text = ((object)(Vector3)(ref val2)).ToString();
			val2 = ZNet.instance.GetReferencePosition();
			LogInfo("Setting up valkyrie " + text + "   " + ((object)(Vector3)(ref val2)).ToString());
			return false;
		}
	}

	[HarmonyPatch(typeof(Valkyrie), "LateUpdate")]
	public static class Valkyrie_LateUpdate_DismountCommand
	{
		private static void Postfix(Valkyrie __instance)
		{
			//IL_0034: 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_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			if (!modEnabled.Value || (Object)(object)__instance != (Object)(object)controlledValkyrie || !isFlyingMountValkyrie)
			{
				return;
			}
			KeyboardShortcut value = mountShortcut.Value;
			if (!((KeyboardShortcut)(ref value)).IsDown())
			{
				value = dismountShortcut.Value;
				if (!((KeyboardShortcut)(ref value)).IsDown() && (!ZInput.GetButton("Use") || !ZInput.GetButton("AltPlace")) && (!ZInput.GetButton("JoyUse") || !ZInput.GetButton("JoyAltPlace")))
				{
					return;
				}
			}
			__instance.DropPlayer(false);
		}
	}

	[HarmonyPatch(typeof(Valkyrie), "UpdateValkyrie")]
	public static class Valkyrie_UpdateValkyrie_MountControl
	{
		private static bool Prefix(Valkyrie __instance, float dt)
		{
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e1: 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_00e9: 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_00fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_032d: Unknown result type (might be due to invalid IL or missing references)
			//IL_032e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0334: Unknown result type (might be due to invalid IL or missing references)
			//IL_0339: Unknown result type (might be due to invalid IL or missing references)
			//IL_033e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0405: Unknown result type (might be due to invalid IL or missing references)
			//IL_0406: Unknown result type (might be due to invalid IL or missing references)
			//IL_040d: Unknown result type (might be due to invalid IL or missing references)
			//IL_041c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0422: Unknown result type (might be due to invalid IL or missing references)
			//IL_0427: Unknown result type (might be due to invalid IL or missing references)
			//IL_042c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0456: Unknown result type (might be due to invalid IL or missing references)
			//IL_0475: Unknown result type (might be due to invalid IL or missing references)
			//IL_047a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0495: Unknown result type (might be due to invalid IL or missing references)
			//IL_049a: Unknown result type (might be due to invalid IL or missing references)
			//IL_04a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0444: Unknown result type (might be due to invalid IL or missing references)
			//IL_044e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0453: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01af: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b4: 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_01dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e3: 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_0208: Unknown result type (might be due to invalid IL or missing references)
			//IL_020d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0212: Unknown result type (might be due to invalid IL or missing references)
			//IL_0235: Unknown result type (might be due to invalid IL or missing references)
			//IL_023c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0252: Unknown result type (might be due to invalid IL or missing references)
			//IL_0261: Unknown result type (might be due to invalid IL or missing references)
			//IL_0266: Unknown result type (might be due to invalid IL or missing references)
			//IL_026b: Unknown result type (might be due to invalid IL or missing references)
			if (!modEnabled.Value)
			{
				return true;
			}
			if (TextViewer.IsShowingIntro())
			{
				return true;
			}
			if ((Object)(object)__instance != (Object)(object)controlledValkyrie)
			{
				return true;
			}
			if (!isFlyingMountValkyrie)
			{
				return true;
			}
			Rigidbody val = default(Rigidbody);
			if (!((Component)__instance).TryGetComponent<Rigidbody>(ref val))
			{
				return true;
			}
			if (!ValkyrieFlyMount.isHovering && (DateTime.Now - ZInput.instance.GetLastInputTimer()).TotalSeconds > 60.0)
			{
				return true;
			}
			bool isHovering = ValkyrieFlyMount.isHovering;
			KeyboardShortcut value = hoverShortcut.Value;
			ValkyrieFlyMount.isHovering = isHovering ^ ((KeyboardShortcut)(ref value)).IsDown();
			Vector3 forward = ((Component)__instance).transform.forward;
			Vector3 val2 = (ValkyrieFlyMount.isHovering ? Vector3.zero : (forward / 4f));
			currentForce = Mathf.MoveTowards(currentForce, 0f, dt);
			if (CanOperateValkyrie())
			{
				bool flag = ZInput.GetButton("Forward") || ZInput.GetJoyLeftStickY(true) < 0f;
				bool flag2 = ZInput.GetButton("Backward") || ZInput.GetJoyLeftStickY(true) > 0f;
				if (flag && !flag2)
				{
					currentForce = Mathf.MoveTowards(currentForce, 1f, dt * 3f * forwardAccelerationMultiplier.Value);
				}
				else if (flag2 && !flag)
				{
					val2 -= forward / 4f;
				}
				if (ZInput.GetButton("Left") || ZInput.GetJoyLeftStickX(false) < 0f)
				{
					val2 -= ((Component)__instance).transform.right / (float)(flag ? 2 : (flag2 ? 10 : 5)) * horizontalAccelerationMultiplier.Value;
				}
				if (ZInput.GetButton("Right") || ZInput.GetJoyLeftStickX(false) > 0f)
				{
					val2 += ((Component)__instance).transform.right / (float)(flag ? 2 : (flag2 ? 10 : 5)) * horizontalAccelerationMultiplier.Value;
				}
				if (ZInput.GetButton("Jump") || ZInput.GetButton("JoyRTrigger"))
				{
					val2.y += (flag ? 0.8f : (flag2 ? 0.2f : 0.5f)) * verticalAccelerationMultiplier.Value;
				}
				if (ZInput.GetButton("Crouch") || ZInput.GetButton("JoyLTrigger"))
				{
					val2.y -= (flag ? 0.8f : (flag2 ? 0.2f : 0.5f)) * verticalAccelerationMultiplier.Value;
				}
				if (hoveringStoppedByMoving.Value && (flag || flag2))
				{
					ValkyrieFlyMount.isHovering = false;
				}
			}
			val2 += forward * currentForce;
			if (((Vector3)(ref val2)).magnitude > 1f)
			{
				((Vector3)(ref val2)).Normalize();
			}
			accelerationStaminaDepleted = accelerationStaminaDepleted || !((Character)Player.m_localPlayer).HaveStamina(0f);
			bool flag3 = ZInput.GetButton("Run") || ZInput.GetButton("JoyRun");
			if (flag3)
			{
				accelerationMultiplier = Mathf.MoveTowards(accelerationMultiplier, 1f, boostAccelerationMultiplier.Value * dt / 10f);
			}
			else
			{
				accelerationMultiplier = Mathf.MoveTowards(accelerationMultiplier, 0f, dt);
				accelerationStaminaDepleted = false;
			}
			float num = ((flag3 && !accelerationStaminaDepleted) ? (1.5f + accelerationMultiplier) : 1f);
			Vector3 val3 = 15f * val2 * num * forceMultiplier.Value - val.velocity;
			if (((Vector3)(ref val3)).magnitude > 15f)
			{
				val3 = ((Vector3)(ref val3)).normalized * 15f;
			}
			val.AddForce(val3, (ForceMode)2);
			Vector3 val4 = default(Vector3);
			Quaternion val5 = default(Quaternion);
			GameCamera.m_instance.GetCameraPosition(dt, ref val4, ref val5);
			Quaternion rotation = Quaternion.RotateTowards(((Component)__instance).transform.rotation, val5, __instance.m_turnRate * 15f * dt * rotationMultiplier.Value);
			((Component)__instance).transform.rotation = rotation;
			return false;
		}

		private static void Postfix(Valkyrie __instance)
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: 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_0047: 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)
			if (modEnabled.Value && !((Object)(object)__instance != (Object)(object)controlledValkyrie))
			{
				Vector3 position = ((Component)__instance).transform.position;
				float num = default(float);
				if (ZoneSystem.instance.GetGroundHeight(position, ref num))
				{
					position.y = Mathf.Min(Mathf.Max(position.y, Mathf.Max(num, ZoneSystem.instance.m_waterLevel) + 5f), maxAltitude.Value);
					((Component)__instance).transform.position = position;
				}
			}
		}
	}

	[HarmonyPatch(typeof(Valkyrie), "DropPlayer")]
	public static class Valkyrie_DropPlayer_Dismount
	{
		private static void Postfix(Valkyrie __instance)
		{
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0115: Unknown result type (might be due to invalid IL or missing references)
			if (modEnabled.Value && !((Object)(object)__instance != (Object)(object)controlledValkyrie) && isFlyingMountValkyrie)
			{
				isFlyingMountValkyrie = false;
				playerDropped = true;
				if (!((Character)Player.m_localPlayer).GetSEMan().HaveStatusEffect(slowFallHash))
				{
					castSlowFall = true;
					((Character)Player.m_localPlayer).GetSEMan().AddStatusEffect(slowFallHash, false, 0, 0f);
					LogInfo("Cast slow fall");
				}
				((Behaviour)Hud.instance.m_crosshair).enabled = crosshairState;
				Vector3 forward = ((Component)Player.m_localPlayer).transform.forward;
				forward.y = 0f;
				__instance.m_flyAwayPoint = ((Component)Player.m_localPlayer).transform.position + forward * 300f;
				__instance.m_flyAwayPoint.y = Mathf.Max(ZoneSystem.instance.GetGroundHeight(__instance.m_flyAwayPoint), ZoneSystem.instance.m_waterLevel) + Mathf.Max(((Component)Player.m_localPlayer).transform.position.y + 100f, 150f);
				__instance.m_speed = 15f;
				controlledValkyrie = null;
			}
		}
	}

	[HarmonyPatch(typeof(Player), "TeleportTo")]
	public static class Player_TeleportTo_TeleportDrop
	{
		private static void Prefix()
		{
			if (Object.op_Implicit((Object)(object)controlledValkyrie))
			{
				controlledValkyrie.DropPlayer(true);
			}
		}
	}

	[HarmonyPatch(typeof(Player), "InCutscene")]
	public static class Player_InCutscene_Taxi
	{
		private static void Postfix(Player __instance, ref bool __result)
		{
			if (modEnabled.Value && !((Object)(object)Player.m_localPlayer != (Object)(object)__instance) && isFlyingMountValkyrie)
			{
				__result = false;
			}
		}
	}

	[HarmonyPatch(typeof(Player), "CheckRun")]
	public static class Player_CheckRun_Taxi
	{
		private static void Prefix(Player __instance, ref float __state)
		{
			if (modEnabled.Value && !((Object)(object)Player.m_localPlayer != (Object)(object)__instance) && isFlyingMountValkyrie)
			{
				__state = Game.m_moveStaminaRate;
				Game.m_moveStaminaRate *= 2f;
			}
		}

		private static void Postfix(Player __instance, ref float __state)
		{
			if (modEnabled.Value && !((Object)(object)Player.m_localPlayer != (Object)(object)__instance) && isFlyingMountValkyrie)
			{
				Game.m_moveStaminaRate = __state;
			}
		}
	}

	[HarmonyPatch(typeof(Character), "Jump")]
	public static class Character_Jump_Taxi
	{
		private static void Prefix(Character __instance, ref float __state)
		{
			if (modEnabled.Value && !((Object)(object)Player.m_localPlayer != (Object)(object)__instance) && isFlyingMountValkyrie)
			{
				__state = __instance.m_jumpStaminaUsage;
				__instance.m_jumpStaminaUsage = 0f;
			}
		}

		private static void Postfix(Character __instance, ref float __state)
		{
			if (modEnabled.Value && !((Object)(object)Player.m_localPlayer != (Object)(object)__instance) && isFlyingMountValkyrie)
			{
				__instance.m_jumpStaminaUsage = __state;
			}
		}
	}

	[HarmonyPatch(typeof(Player), "Update")]
	public static class Player_Update_Taxi
	{
		private static void Postfix(Player __instance)
		{
			if (modEnabled.Value && !((Object)(object)Player.m_localPlayer != (Object)(object)__instance) && !isFlyingMountValkyrie && playerDropped && castSlowFall && ((Character)__instance).IsOnGround())
			{
				castSlowFall = false;
				playerDropped = false;
				if (((Character)__instance).GetSEMan().HaveStatusEffect(slowFallHash))
				{
					((Character)__instance).GetSEMan().RemoveStatusEffect(slowFallHash, true);
				}
				LogInfo("Remove slow fall");
			}
		}
	}

	[HarmonyPatch(typeof(Player), "UpdateBiome")]
	public static class Player_UpdateBiome_PreserveBiomeCalculation
	{
		private static void Prefix(ref Player __instance)
		{
			if (modEnabled.Value && !((Object)(object)Player.m_localPlayer != (Object)(object)__instance) && isFlyingMountValkyrie && ((Character)__instance).InIntro())
			{
				__instance.m_intro = false;
			}
		}

		private static void Postfix(ref Player __instance)
		{
			if (modEnabled.Value && !((Object)(object)Player.m_localPlayer != (Object)(object)__instance) && isFlyingMountValkyrie && !((Character)__instance).InIntro())
			{
				__instance.m_intro = true;
			}
		}
	}

	[HarmonyPatch(typeof(Player), "UpdateStats", new Type[] { typeof(float) })]
	public static class Player_UpdateStats_PreserveStatsCalculation
	{
		private static void Prefix(ref Player __instance)
		{
			if (modEnabled.Value && !((Object)(object)Player.m_localPlayer != (Object)(object)__instance) && isFlyingMountValkyrie && ((Character)__instance).InIntro())
			{
				__instance.m_intro = false;
			}
		}

		private static void Postfix(ref Player __instance)
		{
			if (modEnabled.Value && !((Object)(object)Player.m_localPlayer != (Object)(object)__instance) && isFlyingMountValkyrie && !((Character)__instance).InIntro())
			{
				__instance.m_intro = true;
			}
		}
	}

	[HarmonyPatch(typeof(Character), "Damage")]
	public static class Character_Damage_PlayerProtection
	{
		private static void Prefix(Character __instance, ref HitData hit, ZNetView ___m_nview)
		{
			if (modEnabled.Value && !((Object)(object)___m_nview == (Object)null) && isFlyingMountValkyrie && __instance.IsPlayer() && !((Object)(object)__instance != (Object)(object)Player.m_localPlayer) && (!hit.HaveAttacker() || !hit.GetAttacker().IsBoss()))
			{
				((DamageTypes)(ref hit.m_damage)).Modify(Math.Max(0.1f, 0f));
			}
		}
	}

	[HarmonyPatch(typeof(Hud), "UpdateCrosshair")]
	public static class Hud_UpdateCrosshair_ShowBowCrosshair
	{
		[HarmonyPriority(0)]
		private static void Prefix(Hud __instance, Player player)
		{
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Invalid comparison between Unknown and I4
			if (modEnabled.Value && isFlyingMountValkyrie && crosshairState)
			{
				bool flag = ((Humanoid)player).GetLeftItem() != null && (int)((Humanoid)player).GetLeftItem().m_shared.m_itemType == 4;
				if (((Behaviour)__instance.m_crosshair).enabled != flag)
				{
					((Behaviour)__instance.m_crosshair).enabled = flag;
				}
			}
		}
	}

	[HarmonyPatch(typeof(EnvMan), "GetEnvironmentOverride")]
	public static class EnvMan_GetEnvironmentOverride_EnableWeatherOnFlight
	{
		[HarmonyPriority(0)]
		private static void Prefix(ref Player __state)
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Invalid comparison between Unknown and I4
			if (modEnabled.Value && (int)SystemInfo.graphicsDeviceType != 4 && isFlyingMountValkyrie)
			{
				__state = Player.m_localPlayer;
				Player.m_localPlayer = null;
			}
		}

		[HarmonyPriority(800)]
		private static void Postfix(Player __state)
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Invalid comparison between Unknown and I4
			if (modEnabled.Value && (int)SystemInfo.graphicsDeviceType != 4 && isFlyingMountValkyrie)
			{
				Player.m_localPlayer = __state;
			}
		}
	}

	private const string pluginID = "shudnal.ValkyrieFlyMount";

	private const string pluginName = "Valkyrie Fly Mount";

	private const string pluginVersion = "1.0.10";

	private readonly Harmony harmony = new Harmony("shudnal.ValkyrieFlyMount");

	private static ConfigEntry<bool> modEnabled;

	private static ConfigEntry<bool> loggingEnabled;

	private static ConfigEntry<KeyboardShortcut> mountShortcut;

	private static ConfigEntry<KeyboardShortcut> dismountShortcut;

	private static ConfigEntry<bool> menuTeleportOnSkip;

	private static ConfigEntry<KeyboardShortcut> hoverShortcut;

	private static ConfigEntry<bool> hoveringStoppedByMoving;

	private static ConfigEntry<float> maxAltitude;

	private static ConfigEntry<float> forceMultiplier;

	private static ConfigEntry<float> rotationMultiplier;

	private static ConfigEntry<float> verticalAccelerationMultiplier;

	private static ConfigEntry<float> horizontalAccelerationMultiplier;

	private static ConfigEntry<float> boostAccelerationMultiplier;

	private static ConfigEntry<float> forwardAccelerationMultiplier;

	internal static ValkyrieFlyMount instance;

	internal static Valkyrie controlledValkyrie;

	private static bool isFlyingMountValkyrie = false;

	internal static bool playerDropped = false;

	internal static bool castSlowFall;

	internal static float accelerationMultiplier;

	internal static bool accelerationStaminaDepleted;

	internal static bool isHovering = false;

	internal static bool crosshairState;

	private static readonly int slowFallHash = StringExtensionMethods.GetStableHashCode("SlowFall");

	private static float currentForce = 0f;

	internal static SoftReference<GameObject> valkyriePrefab => Player.m_localPlayer.m_valkyrie;

	private void Awake()
	{
		harmony.PatchAll();
		instance = this;
		ConfigInit();
		Game.isModded = true;
	}

	private void OnDestroy()
	{
		((BaseUnityPlugin)this).Config.Save();
		instance = null;
		Harmony obj = harmony;
		if (obj != null)
		{
			obj.UnpatchSelf();
		}
	}

	public static void LogInfo(object data)
	{
		if (loggingEnabled.Value)
		{
			((BaseUnityPlugin)instance).Logger.LogInfo(data);
		}
	}

	private void ConfigInit()
	{
		//IL_0081: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
		//IL_0100: Unknown result type (might be due to invalid IL or missing references)
		((BaseUnityPlugin)this).Config.Bind<int>("General", "NexusID", 2520, "Nexus mod ID for updates");
		modEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Enabled", true, "Enable the mod.");
		loggingEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Logging enabled", false, "Enable logging.");
		mountShortcut = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("General", "Mount shortcut", new KeyboardShortcut((KeyCode)116, (KeyCode[])(object)new KeyCode[1] { (KeyCode)304 }), "Mount shortcut.");
		dismountShortcut = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("General", "Disount shortcut", new KeyboardShortcut((KeyCode)101, (KeyCode[])(object)new KeyCode[1] { (KeyCode)304 }), "Dismount shortcut.");
		menuTeleportOnSkip = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Teleport to bed on menu skip", false, "Teleport to current spawn point when using Skip intro menu button.");
		hoverShortcut = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("Hovering", "Hovering shortcut", new KeyboardShortcut((KeyCode)116, Array.Empty<KeyCode>()), "Hovering shortcut. Press while on valkyrie to stop moving forward automatically.");
		hoveringStoppedByMoving = ((BaseUnityPlugin)this).Config.Bind<bool>("Hovering", "Hovering stopped by moving", true, "If true - moving valkyrie will resume flying forward.\nIf false - only pressing hovering shortcut again will start valkyrie flying forward automatically.");
		maxAltitude = ((BaseUnityPlugin)this).Config.Bind<float>("Misc", "Maximum altitude", 1500f, "Height limit.");
		forceMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Misc", "Force multiplier", 1f, "Multiplier of force applied to move Valkyrie. Basically indirect speed multiplier");
		rotationMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Misc", "Rotation multiplier", 1f, "Multiplier of rotation delta. Basically angular velocity");
		verticalAccelerationMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Misc", "Vertical Acceleration multiplier", 1f, "Multiplier of vertical change of speed on Up and Down movement");
		horizontalAccelerationMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Misc", "Horizontal Acceleration multiplier", 1f, "Multiplier of horizontal change of speed on Left or Right movement");
		boostAccelerationMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Misc", "Boost Acceleration multiplier", 1f, "Multiplier of speed of boost speed increase");
		forwardAccelerationMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Misc", "Forward acceleration multiplier", 1f, "Multiplier of speed of regular movement speed increase");
	}

	public void LateUpdate()
	{
		//IL_000d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0013: Invalid comparison between Unknown and I4
		//IL_0037: Unknown result type (might be due to invalid IL or missing references)
		//IL_003c: Unknown result type (might be due to invalid IL or missing references)
		if (modEnabled.Value && (int)SystemInfo.graphicsDeviceType != 4 && !((Object)(object)Player.m_localPlayer == (Object)null))
		{
			KeyboardShortcut value = mountShortcut.Value;
			if (((KeyboardShortcut)(ref value)).IsDown() || (ZInput.GetButton("AltPlace") && ZInput.GetButton("Crouch") && ZInput.GetButton("Jump")) || (ZInput.GetButton("JoyAltPlace") && ZInput.GetButton("JoyCrouch") && ZInput.GetButton("JoyJump")))
			{
				SpawnValkyrie(Player.m_localPlayer);
			}
		}
	}

	public static bool CanOperateValkyrie()
	{
		Player localPlayer = Player.m_localPlayer;
		return !((Object)(object)localPlayer == (Object)null) && !((Character)localPlayer).IsDead() && !((Character)localPlayer).InCutscene() && !((Character)localPlayer).IsTeleporting() && ((Object)(object)Chat.instance == (Object)null || !Chat.instance.HasFocus()) && !Console.IsVisible() && !Menu.IsVisible() && (Object)(object)TextViewer.instance != (Object)null && !TextViewer.instance.IsVisible() && !TextInput.IsVisible() && !Minimap.IsOpen() && !GameCamera.InFreeFly() && !StoreGui.IsVisible() && !InventoryGui.IsVisible();
	}

	private void SpawnValkyrie(Player player)
	{
		//IL_012e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0133: Unknown result type (might be due to invalid IL or missing references)
		//IL_0137: Unknown result type (might be due to invalid IL or missing references)
		//IL_013d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0142: Unknown result type (might be due to invalid IL or missing references)
		//IL_0157: Unknown result type (might be due to invalid IL or missing references)
		//IL_0161: Unknown result type (might be due to invalid IL or missing references)
		//IL_016b: Expected O, but got Unknown
		//IL_0177: Unknown result type (might be due to invalid IL or missing references)
		//IL_017c: Unknown result type (might be due to invalid IL or missing references)
		if (isFlyingMountValkyrie)
		{
			return;
		}
		if ((Object)(object)controlledValkyrie != (Object)null)
		{
			((Character)player).Message((MessageType)2, Localization.instance.Localize("$hud_powernotready"), 0, (Sprite)null);
		}
		else if (CanOperateValkyrie() && !((Character)player).IsAttachedToShip() && !((Character)player).IsAttached() && !((Character)player).IsDead() && !((Character)player).IsRiding() && !player.IsSleeping() && !((Character)player).IsTeleporting() && !((Character)player).InPlaceMode() && !((Character)player).InBed() && !((Character)player).InCutscene() && !((Character)player).InInterior())
		{
			isFlyingMountValkyrie = true;
			if ((Object)(object)((Character)player).m_nview != (Object)null && ((Character)player).m_nview.IsValid())
			{
				((Character)player).Heal((((Character)player).GetMaxHealth() - ((Character)player).GetHealth()) * 0.3f, true);
				((Character)player).AddStamina(((Character)player).GetMaxStamina());
				((Character)player).SetCrouch(false);
			}
			crosshairState = ((Behaviour)Hud.instance.m_crosshair).enabled;
			((Behaviour)Hud.instance.m_crosshair).enabled = false;
			currentForce = 0f;
			isHovering = false;
			valkyriePrefab.Load();
			GameObject val = Object.Instantiate<GameObject>(valkyriePrefab.Asset);
			val.GetComponent<ZNetView>().HoldReferenceTo((IReferenceCounted)(object)valkyriePrefab);
			controlledValkyrie = val.GetComponent<Valkyrie>();
			valkyriePrefab.Release();
		}
	}
}