Decompiled source of MagicBullet v1.1.0

HowToFishMagicBullet.dll

Decompiled 3 hours ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("HowToFishMagicBullet")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("HowToFishMagicBullet")]
[assembly: AssemblyTitle("HowToFishMagicBullet")]
[assembly: AssemblyVersion("1.0.0.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace HowToFishMagicBullet
{
	[BepInPlugin("com.openai.howtofish.magicbullet", "How To Fish - Magic Bullet", "1.1.0")]
	public sealed class MagicBulletPlugin : BaseUnityPlugin
	{
		public const string PluginGuid = "com.openai.howtofish.magicbullet";

		public const string PluginName = "How To Fish - Magic Bullet";

		public const string PluginVersion = "1.1.0";

		internal static MagicBulletPlugin Instance;

		internal ConfigEntry<bool> Enabled;

		internal ConfigEntry<float> FovDegrees;

		internal ConfigEntry<float> FovStep;

		internal ConfigEntry<KeyCode> ToggleKey;

		internal ConfigEntry<KeyCode> FovDecreaseKey;

		internal ConfigEntry<KeyCode> FovIncreaseKey;

		internal ConfigEntry<float> MaxPredictionTime;

		private Harmony _harmony;

		private void Awake()
		{
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Expected O, but got Unknown
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Expected O, but got Unknown
			//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Expected O, but got Unknown
			//IL_0150: Unknown result type (might be due to invalid IL or missing references)
			//IL_015a: Expected O, but got Unknown
			Instance = this;
			Enabled = ((BaseUnityPlugin)this).Config.Bind<bool>("MagicBullet", "Enabled", true, "Enable magic bullet.");
			FovDegrees = ((BaseUnityPlugin)this).Config.Bind<float>("Targeting", "FOV", 35f, new ConfigDescription("Maximum angular distance from the crosshair, in degrees. This is the FOV radius.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 180f), Array.Empty<object>()));
			FovStep = ((BaseUnityPlugin)this).Config.Bind<float>("Targeting", "FOVStep", 5f, new ConfigDescription("Degrees changed per FOV hotkey press.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 30f), Array.Empty<object>()));
			MaxPredictionTime = ((BaseUnityPlugin)this).Config.Bind<float>("Targeting", "MaxPredictionTime", 2f, new ConfigDescription("Maximum movement/gravity prediction time in seconds.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 5f), Array.Empty<object>()));
			ToggleKey = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Hotkeys", "Toggle", (KeyCode)289, "Toggle magic bullet.");
			FovDecreaseKey = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Hotkeys", "FOVDecrease", (KeyCode)91, "Decrease FOV.");
			FovIncreaseKey = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Hotkeys", "FOVIncrease", (KeyCode)93, "Increase FOV.");
			_harmony = new Harmony("com.openai.howtofish.magicbullet");
			_harmony.PatchAll();
			((BaseUnityPlugin)this).Logger.LogInfo((object)"How To Fish - Magic Bullet 1.1.0 loaded.");
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Target whitelist: Fish (incl. Bowhead Whale & Mutated Whale) + Bird + Albatross. Forced headshot active.");
		}

		private void OnDestroy()
		{
			MagicBulletRuntime.ClearTarget();
			Harmony harmony = _harmony;
			if (harmony != null)
			{
				harmony.UnpatchSelf();
			}
		}

		private void Update()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: 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)
			if (Input.GetKeyDown(ToggleKey.Value))
			{
				Enabled.Value = !Enabled.Value;
				((BaseUnityPlugin)this).Config.Save();
				((BaseUnityPlugin)this).Logger.LogInfo((object)("Magic Bullet: " + (Enabled.Value ? "ON" : "OFF")));
			}
			if (Input.GetKeyDown(FovDecreaseKey.Value))
			{
				FovDegrees.Value = Mathf.Clamp(FovDegrees.Value - FovStep.Value, 1f, 180f);
				((BaseUnityPlugin)this).Config.Save();
				((BaseUnityPlugin)this).Logger.LogInfo((object)$"Magic Bullet FOV: {FovDegrees.Value:0.#}°");
			}
			if (Input.GetKeyDown(FovIncreaseKey.Value))
			{
				FovDegrees.Value = Mathf.Clamp(FovDegrees.Value + FovStep.Value, 1f, 180f);
				((BaseUnityPlugin)this).Config.Save();
				((BaseUnityPlugin)this).Logger.LogInfo((object)$"Magic Bullet FOV: {FovDegrees.Value:0.#}°");
			}
			MagicBulletRuntime.UpdateLiveTargeting();
		}

		private void OnGUI()
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Invalid comparison between Unknown and I4
			//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: 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_00e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e2: 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_00e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0106: 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)
			//IL_0114: Unknown result type (might be due to invalid IL or missing references)
			//IL_0116: Unknown result type (might be due to invalid IL or missing references)
			if ((int)Event.current.type != 7 || (Object)(object)Instance == (Object)null || !Enabled.Value || !Object.op_Implicit((Object)(object)Player.LocalPlayer))
			{
				return;
			}
			Camera aimCamera = MagicBulletRuntime.GetAimCamera();
			if (!Object.op_Implicit((Object)(object)aimCamera))
			{
				return;
			}
			Vector2 val = default(Vector2);
			((Vector2)(ref val))..ctor((float)Screen.width * 0.5f, (float)Screen.height * 0.5f);
			float num = Mathf.Clamp(FovDegrees.Value, 1f, 89f);
			float num2 = aimCamera.fieldOfView * 0.5f;
			float radius = Mathf.Tan(num * (MathF.PI / 180f)) / Mathf.Tan(num2 * (MathF.PI / 180f)) * ((float)Screen.height * 0.5f);
			DrawingUtils.DrawCircle(val, radius, Color.white, 2f);
			Creature currentTarget = MagicBulletRuntime.CurrentTarget;
			if (MagicBulletRuntime.IsAllowedTarget(currentTarget))
			{
				Vector3 val2 = MagicBulletRuntime.ResolveAimPoint(currentTarget);
				Vector3 val3 = aimCamera.WorldToScreenPoint(val2);
				if (val3.z > 0f)
				{
					Vector2 pointB = default(Vector2);
					((Vector2)(ref pointB))..ctor(val3.x, (float)Screen.height - val3.y);
					DrawingUtils.DrawLine(val, pointB, Color.white, 2f);
				}
			}
		}
	}
	internal static class DrawingUtils
	{
		private static Texture2D _whiteTexture;

		private static Texture2D WhiteTexture
		{
			get
			{
				//IL_0011: Unknown result type (might be due to invalid IL or missing references)
				//IL_001b: Expected O, but got Unknown
				//IL_0022: Unknown result type (might be due to invalid IL or missing references)
				if ((Object)(object)_whiteTexture == (Object)null)
				{
					_whiteTexture = new Texture2D(1, 1, (TextureFormat)4, false);
					_whiteTexture.SetPixel(0, 0, Color.white);
					_whiteTexture.Apply();
				}
				return _whiteTexture;
			}
		}

		public static void DrawLine(Vector2 pointA, Vector2 pointB, Color color, float width)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//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_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: 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_0035: 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_003b: 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)
			//IL_0042: 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_004e: 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_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			Vector2 val = pointB - pointA;
			float magnitude = ((Vector2)(ref val)).magnitude;
			if (!(magnitude < 0.001f))
			{
				float num = Mathf.Atan2(val.y, val.x) * 57.29578f;
				Color color2 = GUI.color;
				Matrix4x4 matrix = GUI.matrix;
				GUI.color = color;
				GUIUtility.RotateAroundPivot(num, pointA);
				GUI.DrawTexture(new Rect(pointA.x, pointA.y - width * 0.5f, magnitude, width), (Texture)(object)WhiteTexture);
				GUI.matrix = matrix;
				GUI.color = color2;
			}
		}

		public static void DrawCircle(Vector2 center, float radius, Color color, float width, int segments = 128)
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: 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_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_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: 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_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			if (!(radius <= 0.001f) && segments >= 3)
			{
				float num = 360f / (float)segments;
				Vector2 pointA = center + new Vector2(radius, 0f);
				for (int i = 1; i <= segments; i++)
				{
					float num2 = (float)i * num * (MathF.PI / 180f);
					Vector2 val = center + new Vector2(Mathf.Cos(num2) * radius, Mathf.Sin(num2) * radius);
					DrawLine(pointA, val, color, width);
					pointA = val;
				}
			}
		}
	}
	internal static class MagicBulletRuntime
	{
		internal static Creature CurrentTarget { get; private set; }

		private static MagicBulletPlugin Plugin => MagicBulletPlugin.Instance;

		internal static bool CanUse(Player owner, bool isLocal)
		{
			if ((Object)(object)Plugin != (Object)null && Plugin.Enabled.Value && isLocal && Object.op_Implicit((Object)(object)owner) && Object.op_Implicit((Object)(object)Player.LocalPlayer))
			{
				return (Object)(object)owner == (Object)(object)Player.LocalPlayer;
			}
			return false;
		}

		internal static void ClearTarget()
		{
			CurrentTarget = null;
		}

		internal static void UpdateLiveTargeting()
		{
			if ((Object)(object)Plugin == (Object)null || !Plugin.Enabled.Value || !Object.op_Implicit((Object)(object)Player.LocalPlayer))
			{
				CurrentTarget = null;
				return;
			}
			Camera aimCamera = GetAimCamera();
			if (!Object.op_Implicit((Object)(object)aimCamera))
			{
				CurrentTarget = null;
				return;
			}
			if ((Object)(object)CurrentTarget != (Object)null && !IsAllowedTarget(CurrentTarget))
			{
				CurrentTarget = null;
			}
			CurrentTarget = FindBestTarget(aimCamera);
		}

		internal static void BeginShot()
		{
			if ((Object)(object)Plugin == (Object)null || !Plugin.Enabled.Value || !Object.op_Implicit((Object)(object)Player.LocalPlayer))
			{
				CurrentTarget = null;
				return;
			}
			Camera aimCamera = GetAimCamera();
			if (!Object.op_Implicit((Object)(object)aimCamera))
			{
				CurrentTarget = null;
			}
			else
			{
				CurrentTarget = FindBestTarget(aimCamera);
			}
		}

		internal static void EndShot()
		{
		}

		internal static Camera GetAimCamera()
		{
			Player localPlayer = Player.LocalPlayer;
			if (Object.op_Implicit((Object)(object)localPlayer) && Object.op_Implicit((Object)(object)localPlayer.CurCam))
			{
				return localPlayer.CurCam;
			}
			return Camera.main;
		}

		internal static Vector3 ResolveAimPoint(Creature target)
		{
			//IL_000e: 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_0008: 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_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: 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_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_0037: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)target))
			{
				return Vector3.zero;
			}
			Vector3 val = Vector3.zero;
			if (Object.op_Implicit((Object)(object)((Item)target).Rig))
			{
				val = ((Component)target).transform.InverseTransformPoint(((Item)target).Rig.worldCenterOfMass);
			}
			Vector3 val2 = default(Vector3);
			((Vector3)(ref val2))..ctor(val.x, val.y, target.HeadPos + 0.15f);
			return ((Component)target).transform.TransformPoint(val2);
		}

		internal static Creature FindBestTarget(Camera cam)
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//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_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: 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_0077: Unknown result type (might be due to invalid IL or missing references)
			Creature[] array = Object.FindObjectsOfType<Creature>();
			Creature result = null;
			float num = float.MaxValue;
			float num2 = float.MaxValue;
			Vector3 position = ((Component)cam).transform.position;
			Vector3 forward = ((Component)cam).transform.forward;
			float value = Plugin.FovDegrees.Value;
			Creature[] array2 = array;
			foreach (Creature val in array2)
			{
				if (!IsAllowedTarget(val))
				{
					continue;
				}
				Vector3 val2 = ResolveAimPoint(val) - position;
				float sqrMagnitude = ((Vector3)(ref val2)).sqrMagnitude;
				if (!(sqrMagnitude <= 0.0001f))
				{
					float num3 = Vector3.Angle(forward, val2);
					if (!(num3 > value) && (num3 < num - 0.01f || (Mathf.Abs(num3 - num) <= 0.01f && sqrMagnitude < num2)))
					{
						result = val;
						num = num3;
						num2 = sqrMagnitude;
					}
				}
			}
			return result;
		}

		internal static bool IsAllowedTarget(Creature candidate)
		{
			if (!Object.op_Implicit((Object)(object)candidate) || !((Behaviour)candidate).isActiveAndEnabled || candidate.IsDead)
			{
				return false;
			}
			if (!(candidate is Fish) && !(candidate is Bird))
			{
				return candidate is Albatross;
			}
			return true;
		}

		internal static Vector3 RedirectVelocity(Vector3 projectileOrigin, Vector3 originalVelocity, WeaponInfo weaponInfo)
		{
			//IL_000e: 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_0020: 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_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: 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_004f: Unknown result type (might be due to invalid IL or missing references)
			Creature currentTarget = CurrentTarget;
			if (!IsAllowedTarget(currentTarget))
			{
				return originalVelocity;
			}
			float magnitude = ((Vector3)(ref originalVelocity)).magnitude;
			if (magnitude <= 0.001f)
			{
				return originalVelocity;
			}
			Vector3 val = PredictAimPoint(projectileOrigin, currentTarget, magnitude, (weaponInfo != null) ? weaponInfo.ProjectileGravity : 0f) - projectileOrigin;
			if (((Vector3)(ref val)).sqrMagnitude <= 0.0001f)
			{
				return originalVelocity;
			}
			return ((Vector3)(ref val)).normalized * magnitude;
		}

		private static Vector3 GetTargetVelocity(Creature target, Vector3 aimPoint)
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			Rigidbody rig = ((Item)target).Rig;
			if (!Object.op_Implicit((Object)(object)rig))
			{
				return Vector3.zero;
			}
			return rig.GetPointVelocity(aimPoint);
		}

		private static Vector3 PredictAimPoint(Vector3 origin, Creature target, float projectileSpeed, float gravityForce)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: 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_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: 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_005d: 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_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: 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_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: 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)
			Vector3 val = ResolveAimPoint(target);
			Vector3 targetVelocity = GetTargetVelocity(target, val);
			Vector3 relativePosition = val - origin;
			float num = SolveInterceptTime(relativePosition, targetVelocity, projectileSpeed);
			if (float.IsNaN(num) || float.IsInfinity(num) || num < 0f)
			{
				num = ((Vector3)(ref relativePosition)).magnitude / projectileSpeed;
			}
			num = Mathf.Clamp(num, 0f, Plugin.MaxPredictionTime.Value);
			Vector3 val2 = val + targetVelocity * num;
			if (gravityForce > 0f)
			{
				val2 += Vector3.up * (0.5f * gravityForce * num * num);
			}
			return val2;
		}

		private static float SolveInterceptTime(Vector3 relativePosition, Vector3 targetVelocity, float projectileSpeed)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			float num = Vector3.Dot(targetVelocity, targetVelocity) - projectileSpeed * projectileSpeed;
			float num2 = 2f * Vector3.Dot(relativePosition, targetVelocity);
			float num3 = Vector3.Dot(relativePosition, relativePosition);
			if (Mathf.Abs(num) < 0.0001f)
			{
				if (Mathf.Abs(num2) < 0.0001f)
				{
					if (!(num3 <= 0.0001f))
					{
						return Mathf.Sqrt(num3) / projectileSpeed;
					}
					return 0f;
				}
				float num4 = (0f - num3) / num2;
				if (!(num4 > 0f))
				{
					return Mathf.Sqrt(num3) / projectileSpeed;
				}
				return num4;
			}
			float num5 = num2 * num2 - 4f * num * num3;
			if (num5 < 0f)
			{
				return Mathf.Sqrt(num3) / projectileSpeed;
			}
			float num6 = Mathf.Sqrt(num5);
			float num7 = (0f - num2 - num6) / (2f * num);
			float num8 = (0f - num2 + num6) / (2f * num);
			bool flag = num7 > 0.0001f;
			bool flag2 = num8 > 0.0001f;
			if (flag && flag2)
			{
				return Mathf.Min(num7, num8);
			}
			if (flag)
			{
				return num7;
			}
			if (flag2)
			{
				return num8;
			}
			return Mathf.Sqrt(num3) / projectileSpeed;
		}
	}
	[HarmonyPatch(typeof(Weapon), "Shoot")]
	internal static class WeaponShootPatch
	{
		private static void Prefix()
		{
			MagicBulletRuntime.BeginShot();
		}

		private static void Postfix()
		{
			MagicBulletRuntime.EndShot();
		}
	}
	[HarmonyPatch(typeof(ProjectileManager), "AddProjectile")]
	internal static class AddProjectilePatch
	{
		private static void Prefix(Player owner, WeaponInfo weaponInfo, bool isLocal, Vector3 pos, ref Vector3 velocity)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			if (MagicBulletRuntime.CanUse(owner, isLocal))
			{
				velocity = MagicBulletRuntime.RedirectVelocity(pos, velocity, weaponInfo);
			}
		}
	}
	[HarmonyPatch(typeof(ProjectileManager), "AddProjectiles")]
	internal static class AddProjectilesPatch
	{
		private static void Prefix(Player owner, WeaponInfo weaponInfo, bool isLocal, Vector3 pos, Vector3[] velocities)
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			if (MagicBulletRuntime.CanUse(owner, isLocal) && velocities != null && velocities.Length != 0)
			{
				for (int i = 0; i < velocities.Length; i++)
				{
					velocities[i] = MagicBulletRuntime.RedirectVelocity(pos, velocities[i], weaponInfo);
				}
			}
		}
	}
	[HarmonyPatch(typeof(Creature), "LocalHit")]
	internal static class CreatureLocalHitPatch
	{
		private static void Prefix(Creature __instance, ref Vector3 point, Player player, ref int damage, bool rangedHit)
		{
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: 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_0098: 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_009e: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)MagicBulletPlugin.Instance) && MagicBulletPlugin.Instance.Enabled.Value && Object.op_Implicit((Object)(object)player) && Object.op_Implicit((Object)(object)Player.LocalPlayer) && !((Object)(object)player != (Object)(object)Player.LocalPlayer) && rangedHit && MagicBulletRuntime.IsAllowedTarget(__instance) && ((Component)__instance).transform.InverseTransformPoint(point).z <= __instance.HeadPos)
			{
				Vector3 val = ((Component)__instance).transform.InverseTransformPoint(point);
				val.z = __instance.HeadPos + 0.15f;
				point = ((Component)__instance).transform.TransformPoint(val);
			}
		}
	}
}