Decompiled source of HuntsmanEyesOpened v1.0.0

HuntsmanEyesOpened.dll

Decompiled 15 hours ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Photon.Pun;
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: IgnoresAccessChecksTo("")]
[assembly: AssemblyCompany("REPOJP")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("zabuMod")]
[assembly: AssemblyTitle("zabuMod")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.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 REPOJP.HuntsmanEyesOpened
{
	[BepInPlugin("REPOJP.HuntsmanEyesOpened", "HuntsmanEyesOpened", "1.0.0")]
	public sealed class HuntsmanEyesOpenedPlugin : BaseUnityPlugin
	{
		public const string PluginGuid = "REPOJP.HuntsmanEyesOpened";

		public const string PluginName = "HuntsmanEyesOpened";

		public const string PluginVersion = "1.0.0";

		internal static HuntsmanEyesOpenedPlugin Instance;

		internal static ManualLogSource Log;

		internal static ConfigEntry<float> ViewAngle;

		internal static ConfigEntry<float> MaxSightDistance;

		internal static ConfigEntry<bool> KeepTouchReaction;

		internal static ConfigEntry<bool> KeepVanillaSoundReaction;

		internal static ConfigEntry<bool> EnforceSoundInvestigate;

		internal static ConfigEntry<float> SoundInvestigateRange;

		internal static ConfigEntry<int> DamagePerShot;

		internal static ConfigEntry<float> KnockbackMultiplier;

		internal static ConfigEntry<float> MinTimeBetweenAttacks;

		internal static ConfigEntry<float> VisualAttackDelay;

		private Harmony harmony;

		private void Awake()
		{
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Expected O, but got Unknown
			try
			{
				Instance = this;
				Log = ((BaseUnityPlugin)this).Logger;
				((Component)this).transform.parent = null;
				((Object)((Component)this).gameObject).hideFlags = (HideFlags)61;
				Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject);
				BindConfig();
				harmony = new Harmony("REPOJP.HuntsmanEyesOpened");
				harmony.PatchAll(Assembly.GetExecutingAssembly());
				((BaseUnityPlugin)this).Logger.LogInfo((object)"HuntsmanEyesOpened 1.0.0 loaded");
			}
			catch (Exception ex)
			{
				((BaseUnityPlugin)this).Logger.LogError((object)("Failed to initialize HuntsmanEyesOpened\n" + ex));
			}
		}

		private void BindConfig()
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Expected O, but got Unknown
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Expected O, but got Unknown
			//IL_0109: Unknown result type (might be due to invalid IL or missing references)
			//IL_0113: Expected O, but got Unknown
			//IL_0146: Unknown result type (might be due to invalid IL or missing references)
			//IL_0150: Expected O, but got Unknown
			//IL_0183: Unknown result type (might be due to invalid IL or missing references)
			//IL_018d: Expected O, but got Unknown
			//IL_01b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c3: Expected O, but got Unknown
			//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_0200: Expected O, but got Unknown
			ViewAngle = ((BaseUnityPlugin)this).Config.Bind<float>("Vision", "ViewAngle", 90f, new ConfigDescription("Frontal view angle in degrees.正面視野角", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 179f), Array.Empty<object>()));
			MaxSightDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Vision", "MaxSightDistance", 18f, new ConfigDescription("Maximum sight distance.最大視認距離", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 100f), Array.Empty<object>()));
			KeepTouchReaction = ((BaseUnityPlugin)this).Config.Bind<bool>("Reaction", "KeepTouchReaction", true, "Keep vanilla touch reaction.バニラ接触反応を維持");
			KeepVanillaSoundReaction = ((BaseUnityPlugin)this).Config.Bind<bool>("Reaction", "KeepVanillaSoundReaction", false, "Enable vanilla sound reaction.バニラ通りの音反応を有効化");
			EnforceSoundInvestigate = ((BaseUnityPlugin)this).Config.Bind<bool>("Reaction", "EnforceSoundInvestigate", true, "Always investigate the heard sound position when custom sound reaction is active.独自音反応時に音位置への調査移動を徹底");
			SoundInvestigateRange = ((BaseUnityPlugin)this).Config.Bind<float>("Reaction", "SoundInvestigateRange", 30f, new ConfigDescription("Maximum range for forced sound investigation.強制音調査を行う最大距離", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 100f), Array.Empty<object>()));
			MinTimeBetweenAttacks = ((BaseUnityPlugin)this).Config.Bind<float>("Reaction", "MinTimeBetweenAttacks", 5f, new ConfigDescription("Minimum time between attacks in seconds.攻撃間の最短時間", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.01f, 10f), Array.Empty<object>()));
			VisualAttackDelay = ((BaseUnityPlugin)this).Config.Bind<float>("Reaction", "VisualAttackDelay", 0f, new ConfigDescription("Delay from discovery to attack in seconds.発見から攻撃までの秒数", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 5f), Array.Empty<object>()));
			DamagePerShot = ((BaseUnityPlugin)this).Config.Bind<int>("Shot", "DamagePerShot", 30, new ConfigDescription("Damage per shot.1発あたりのダメージ量", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 9999), Array.Empty<object>()));
			KnockbackMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Shot", "KnockbackMultiplier", 5f, new ConfigDescription("Knockback multiplier.ノックバック倍率", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 20f), Array.Empty<object>()));
		}
	}
	internal static class HuntsmanVisionCore
	{
		private struct VisualTrackData
		{
			public int TargetId;

			public float FirstSeenTime;

			public Vector3 LastPoint;
		}

		private struct ShotResult
		{
			public bool HitPlayer;

			public PlayerAvatar Player;

			public Vector3 HitPoint;

			public Vector3 VisualPoint;
		}

		private static readonly FieldRef<EnemyHunter, bool> FieldStateImpulse = AccessTools.FieldRefAccess<EnemyHunter, bool>("stateImpulse");

		private static readonly FieldRef<EnemyHunter, float> FieldStateTimer = AccessTools.FieldRefAccess<EnemyHunter, float>("stateTimer");

		private static readonly FieldRef<EnemyHunter, bool> FieldShootFast = AccessTools.FieldRefAccess<EnemyHunter, bool>("shootFast");

		private static readonly FieldRef<EnemyHunter, int> FieldShotsFired = AccessTools.FieldRefAccess<EnemyHunter, int>("shotsFired");

		private static readonly FieldRef<EnemyHunter, int> FieldShotsFiredMax = AccessTools.FieldRefAccess<EnemyHunter, int>("shotsFiredMax");

		private static readonly FieldRef<EnemyHunter, Vector3> FieldInvestigatePoint = AccessTools.FieldRefAccess<EnemyHunter, Vector3>("investigatePoint");

		private static readonly FieldRef<EnemyHunter, bool> FieldInvestigatePathfindOnly = AccessTools.FieldRefAccess<EnemyHunter, bool>("investigatePathfindOnly");

		private static readonly FieldRef<EnemyHunter, bool> FieldInvestigatePointHasTransform = AccessTools.FieldRefAccess<EnemyHunter, bool>("investigatePointHasTransform");

		private static readonly FieldRef<EnemyHunter, Transform> FieldInvestigatePointTransform = AccessTools.FieldRefAccess<EnemyHunter, Transform>("investigatePointTransform");

		private static readonly FieldRef<EnemyHunter, Vector3> FieldInvestigatePointTransformPrevious = AccessTools.FieldRefAccess<EnemyHunter, Vector3>("investigatePointTransformPrevious");

		private static readonly FieldRef<EnemyHunter, int> FieldLeaveInterruptCounter = AccessTools.FieldRefAccess<EnemyHunter, int>("leaveInterruptCounter");

		private static readonly FieldRef<EnemyHunter, float> FieldLeaveInterruptTimer = AccessTools.FieldRefAccess<EnemyHunter, float>("leaveInterruptTimer");

		private static readonly FieldRef<EnemyHunter, PhotonView> FieldPhotonView = AccessTools.FieldRefAccess<EnemyHunter, PhotonView>("photonView");

		private static readonly FieldRef<PlayerHealth, int> FieldPlayerHealth = AccessTools.FieldRefAccess<PlayerHealth, int>("health");

		private static readonly MethodInfo MethodUpdateState = AccessTools.Method(typeof(EnemyHunter), "UpdateState", (Type[])null, (Type[])null);

		private static readonly MethodInfo MethodShootRpc = AccessTools.Method(typeof(EnemyHunter), "ShootRPC", (Type[])null, (Type[])null);

		private const float VisionCheckInterval = 0.05f;

		private const float MaxShotDistance = 50f;

		private static readonly Dictionary<int, float> NextVisionCheckTime = new Dictionary<int, float>();

		private static readonly Dictionary<int, float> NextAllowedAttackTime = new Dictionary<int, float>();

		private static readonly Dictionary<int, VisualTrackData> VisualTrackMap = new Dictionary<int, VisualTrackData>();

		internal static bool ShouldKeepTouchReaction()
		{
			return HuntsmanEyesOpenedPlugin.KeepTouchReaction.Value;
		}

		internal static bool ShouldBlockAimByCooldown(EnemyHunter hunter)
		{
			if (!ShouldProcessHunter(hunter))
			{
				return false;
			}
			return !CanStartNextAttack(hunter);
		}

		internal static void HandleUpdate(EnemyHunter hunter)
		{
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			if (!ShouldProcessHunter(hunter))
			{
				ClearVisualTrack(hunter);
			}
			else if (CanUseVisionInCurrentState(hunter) && ShouldRunVisionCheck(hunter))
			{
				if (TryFindVisiblePlayer(hunter, out PlayerAvatar bestPlayer, out Vector3 bestPoint))
				{
					HandleVisibleTarget(hunter, bestPlayer, bestPoint);
				}
				else
				{
					ClearVisualTrack(hunter);
				}
			}
		}

		internal static bool HandleOnInvestigate(EnemyHunter hunter)
		{
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: 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_002f: 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)
			//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)
			//IL_0105: Unknown result type (might be due to invalid IL or missing references)
			if (!ShouldProcessHunter(hunter))
			{
				return true;
			}
			Vector3 onInvestigateTriggeredPosition = hunter.enemy.StateInvestigate.onInvestigateTriggeredPosition;
			if ((int)hunter.currentState == 9 && Vector3.Distance(((Component)hunter).transform.position, onInvestigateTriggeredPosition) < 5f)
			{
				FieldLeaveInterruptCounter.Invoke(hunter) = FieldLeaveInterruptCounter.Invoke(hunter) + 1;
				FieldLeaveInterruptTimer.Invoke(hunter) = 3f;
			}
			if (HuntsmanEyesOpenedPlugin.KeepVanillaSoundReaction.Value)
			{
				return true;
			}
			if (!CanReactToInvestigate(hunter))
			{
				return false;
			}
			if (!HuntsmanEyesOpenedPlugin.EnforceSoundInvestigate.Value)
			{
				return false;
			}
			float num = Mathf.Clamp(HuntsmanEyesOpenedPlugin.SoundInvestigateRange.Value, 0f, 100f);
			if (num > 0f && Vector3.Distance(((Component)hunter).transform.position, onInvestigateTriggeredPosition) > num)
			{
				return false;
			}
			BeginForcedSoundInvestigate(hunter, onInvestigateTriggeredPosition);
			return false;
		}

		internal static bool HandleStateShoot(EnemyHunter hunter)
		{
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			if (!ShouldProcessHunter(hunter) || (Object)(object)hunter.gunAimTransform == (Object)null)
			{
				return true;
			}
			if (FieldStateImpulse.Invoke(hunter))
			{
				ShotResult shotResult = BuildShotResult(hunter);
				SendShootVisual(hunter, shotResult.VisualPoint);
				if (shotResult.HitPlayer && (Object)(object)shotResult.Player != (Object)null)
				{
					ApplyCustomPlayerHit(hunter, shotResult.Player, shotResult.HitPoint);
				}
				RegisterAttackTime(hunter);
				FieldStateImpulse.Invoke(hunter) = false;
				FieldStateTimer.Invoke(hunter) = 2f;
				hunter.enemy.NavMeshAgent.Warp(((Component)hunter.enemy.Rigidbody).transform.position, false);
				hunter.enemy.NavMeshAgent.ResetPath();
			}
			FieldStateTimer.Invoke(hunter) = FieldStateTimer.Invoke(hunter) - Time.deltaTime;
			if (FieldStateTimer.Invoke(hunter) <= 0f)
			{
				InvokeUpdateState(hunter, (State)7);
			}
			return false;
		}

		private static bool ShouldProcessHunter(EnemyHunter hunter)
		{
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Invalid comparison between Unknown and I4
			if ((Object)(object)hunter == (Object)null || (Object)(object)hunter.enemy == (Object)null || (Object)(object)hunter.enemy.Rigidbody == (Object)null)
			{
				return false;
			}
			if (!SemiFunc.IsMasterClientOrSingleplayer())
			{
				return false;
			}
			if (hunter.enemy.IsStunned())
			{
				return false;
			}
			if ((int)hunter.enemy.CurrentState == 11)
			{
				return false;
			}
			if (hunter.enemy.Rigidbody.timeSinceStun > 0f && hunter.enemy.Rigidbody.timeSinceStun <= 1.5f)
			{
				return false;
			}
			return true;
		}

		private static bool CanUseVisionInCurrentState(EnemyHunter hunter)
		{
			//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_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_000a: 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_000e: Invalid comparison between Unknown and I4
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Invalid comparison between Unknown and I4
			State currentState = hunter.currentState;
			State val = currentState;
			if (val - 1 <= 3 || val - 7 <= 2)
			{
				return true;
			}
			return false;
		}

		private static bool CanReactToInvestigate(EnemyHunter hunter)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Invalid comparison between Unknown and I4
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Invalid comparison between Unknown and I4
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Invalid comparison between Unknown and I4
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Invalid comparison between Unknown and I4
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Invalid comparison between Unknown and I4
			if ((int)hunter.currentState == 1)
			{
				return true;
			}
			if ((int)hunter.currentState == 2)
			{
				return true;
			}
			if ((int)hunter.currentState == 4)
			{
				return true;
			}
			if ((int)hunter.currentState == 7 && FieldShotsFired.Invoke(hunter) < FieldShotsFiredMax.Invoke(hunter))
			{
				return true;
			}
			if ((int)hunter.currentState == 9 && FieldLeaveInterruptCounter.Invoke(hunter) >= 3)
			{
				return true;
			}
			return false;
		}

		private static bool ShouldRunVisionCheck(EnemyHunter hunter)
		{
			int instanceID = ((Object)hunter).GetInstanceID();
			if (NextVisionCheckTime.TryGetValue(instanceID, out var value) && Time.time < value)
			{
				return false;
			}
			NextVisionCheckTime[instanceID] = Time.time + 0.05f;
			return true;
		}

		private static void BeginImmediateVisualAttack(EnemyHunter hunter, PlayerAvatar player, Vector3 targetPoint)
		{
			//IL_0003: 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_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Invalid comparison between Unknown and I4
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Invalid comparison between Unknown and I4
			SetInvestigateTarget(hunter, player, targetPoint, pathfindOnly: false, shootFast: true);
			SyncInvestigationPoint(hunter, targetPoint);
			if ((int)hunter.currentState != 5 && (int)hunter.currentState != 6)
			{
				InvokeUpdateState(hunter, (State)5);
			}
			ClearVisualTrack(hunter);
		}

		private static void HandleVisibleTarget(EnemyHunter hunter, PlayerAvatar player, Vector3 targetPoint)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: 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)
			UpdateVisualTrack(hunter, player, targetPoint);
			if (CanStartNextAttack(hunter) && HasReachedVisualAttackDelay(hunter, player))
			{
				BeginImmediateVisualAttack(hunter, player, targetPoint);
			}
			else
			{
				BeginVisualTrackOnly(hunter, player, targetPoint);
			}
		}

		private static void BeginVisualTrackOnly(EnemyHunter hunter, PlayerAvatar player, Vector3 targetPoint)
		{
			//IL_0003: 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_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Invalid comparison between Unknown and I4
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Invalid comparison between Unknown and I4
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Invalid comparison between Unknown and I4
			SetInvestigateTarget(hunter, player, targetPoint, pathfindOnly: false, shootFast: true);
			SyncInvestigationPoint(hunter, targetPoint);
			if ((int)hunter.currentState != 3 && (int)hunter.currentState != 4 && (int)hunter.currentState != 6)
			{
				InvokeUpdateState(hunter, (State)3);
			}
		}

		private static void BeginForcedSoundInvestigate(EnemyHunter hunter, Vector3 investigatePoint)
		{
			//IL_0003: 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_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Invalid comparison between Unknown and I4
			SetInvestigateTarget(hunter, null, investigatePoint, pathfindOnly: true, shootFast: false);
			SyncInvestigationPoint(hunter, investigatePoint);
			ClearVisualTrack(hunter);
			if ((int)hunter.currentState != 3)
			{
				InvokeUpdateState(hunter, (State)3);
			}
		}

		private static void UpdateVisualTrack(EnemyHunter hunter, PlayerAvatar player, Vector3 targetPoint)
		{
			//IL_006b: 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_005c: 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)
			int instanceID = ((Object)hunter).GetInstanceID();
			int num = (((Object)(object)player != (Object)null) ? ((Object)player).GetInstanceID() : 0);
			if (!VisualTrackMap.TryGetValue(instanceID, out var value) || value.TargetId != num)
			{
				VisualTrackData visualTrackData = default(VisualTrackData);
				visualTrackData.TargetId = num;
				visualTrackData.FirstSeenTime = Time.time;
				visualTrackData.LastPoint = targetPoint;
				value = visualTrackData;
			}
			else
			{
				value.LastPoint = targetPoint;
			}
			VisualTrackMap[instanceID] = value;
		}

		private static bool HasReachedVisualAttackDelay(EnemyHunter hunter, PlayerAvatar player)
		{
			if (!VisualTrackMap.TryGetValue(((Object)hunter).GetInstanceID(), out var value))
			{
				return false;
			}
			int num = (((Object)(object)player != (Object)null) ? ((Object)player).GetInstanceID() : 0);
			if (value.TargetId != num)
			{
				return false;
			}
			float num2 = Mathf.Clamp(HuntsmanEyesOpenedPlugin.VisualAttackDelay.Value, 0f, 5f);
			return Time.time >= value.FirstSeenTime + num2;
		}

		private static void ClearVisualTrack(EnemyHunter hunter)
		{
			if (!((Object)(object)hunter == (Object)null))
			{
				VisualTrackMap.Remove(((Object)hunter).GetInstanceID());
			}
		}

		private static void SetInvestigateTarget(EnemyHunter hunter, PlayerAvatar player, Vector3 targetPoint, bool pathfindOnly, bool shootFast)
		{
			//IL_0019: 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_00a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: 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)
			FieldInvestigatePathfindOnly.Invoke(hunter) = pathfindOnly;
			FieldInvestigatePoint.Invoke(hunter) = targetPoint;
			FieldShootFast.Invoke(hunter) = shootFast;
			Transform playerTargetTransform = GetPlayerTargetTransform(player);
			if ((Object)(object)playerTargetTransform != (Object)null && !pathfindOnly)
			{
				FieldInvestigatePointHasTransform.Invoke(hunter) = true;
				FieldInvestigatePointTransform.Invoke(hunter) = playerTargetTransform;
				FieldInvestigatePointTransformPrevious.Invoke(hunter) = playerTargetTransform.position;
			}
			else
			{
				FieldInvestigatePointHasTransform.Invoke(hunter) = false;
				FieldInvestigatePointTransform.Invoke(hunter) = null;
				FieldInvestigatePointTransformPrevious.Invoke(hunter) = Vector3.zero;
			}
		}

		private static bool TryFindVisiblePlayer(EnemyHunter hunter, out PlayerAvatar bestPlayer, out Vector3 bestPoint)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: 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_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d6: 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)
			//IL_0100: Unknown result type (might be due to invalid IL or missing references)
			//IL_0101: 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)
			//IL_0117: 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_0142: Unknown result type (might be due to invalid IL or missing references)
			bestPlayer = null;
			bestPoint = Vector3.zero;
			if ((Object)(object)hunter.investigateRayTransform == (Object)null)
			{
				return false;
			}
			Vector3 position = hunter.investigateRayTransform.position;
			Vector3 forward = hunter.investigateRayTransform.forward;
			float num = Mathf.Clamp(HuntsmanEyesOpenedPlugin.MaxSightDistance.Value, 1f, 100f);
			float num2 = Mathf.Clamp(HuntsmanEyesOpenedPlugin.ViewAngle.Value, 1f, 179f) * 0.5f;
			float num3 = float.MaxValue;
			PlayerAvatar[] array = Object.FindObjectsOfType<PlayerAvatar>();
			foreach (PlayerAvatar val in array)
			{
				if (!IsValidPlayerTarget(val))
				{
					continue;
				}
				Transform playerTargetTransform = GetPlayerTargetTransform(val);
				if (!((Object)(object)playerTargetTransform == (Object)null))
				{
					Vector3 position2 = playerTargetTransform.position;
					Vector3 val2 = position2 - position;
					float magnitude = ((Vector3)(ref val2)).magnitude;
					if (!(magnitude <= 0.001f) && !(magnitude > num) && !(Vector3.Angle(forward, val2) > num2) && HasClearSightToPlayer(val, position, position2) && magnitude < num3)
					{
						num3 = magnitude;
						bestPlayer = val;
						bestPoint = position2;
					}
				}
			}
			return (Object)(object)bestPlayer != (Object)null;
		}

		private static bool IsValidPlayerTarget(PlayerAvatar player)
		{
			if ((Object)(object)player == (Object)null || (Object)(object)player.playerHealth == (Object)null)
			{
				return false;
			}
			int num = 0;
			try
			{
				num = FieldPlayerHealth.Invoke(player.playerHealth);
			}
			catch
			{
				return false;
			}
			return num > 0;
		}

		private static Transform GetPlayerTargetTransform(PlayerAvatar player)
		{
			if ((Object)(object)player == (Object)null)
			{
				return null;
			}
			if ((Object)(object)player.PlayerVisionTarget != (Object)null && (Object)(object)player.PlayerVisionTarget.VisionTransform != (Object)null)
			{
				return player.PlayerVisionTarget.VisionTransform;
			}
			return ((Component)player).transform;
		}

		private static bool HasClearSightToPlayer(PlayerAvatar player, Vector3 origin, Vector3 targetPoint)
		{
			//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_0003: 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_0029: 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_0032: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = targetPoint - origin;
			float magnitude = ((Vector3)(ref val)).magnitude;
			if (magnitude <= 0.001f)
			{
				return false;
			}
			RaycastHit[] array = Physics.RaycastAll(origin, ((Vector3)(ref val)).normalized, magnitude, LayerMask.op_Implicit(SemiFunc.LayerMaskGetVisionObstruct()), (QueryTriggerInteraction)1);
			if (array == null || array.Length == 0)
			{
				return true;
			}
			Array.Sort(array, CompareHitsByDistance);
			for (int i = 0; i < array.Length; i++)
			{
				Transform transform = ((RaycastHit)(ref array[i])).transform;
				if (!((Object)(object)transform == (Object)null))
				{
					if (IsTransformFromPlayer(player, transform))
					{
						return true;
					}
					if (!((Object)(object)((Component)transform).GetComponentInParent<EnemyRigidbody>() != (Object)null))
					{
						return false;
					}
				}
			}
			return true;
		}

		private static bool IsTransformFromPlayer(PlayerAvatar player, Transform hitTransform)
		{
			if ((Object)(object)player == (Object)null || (Object)(object)hitTransform == (Object)null)
			{
				return false;
			}
			if ((Object)(object)((Component)hitTransform).GetComponentInParent<PlayerAvatar>() == (Object)(object)player)
			{
				return true;
			}
			PlayerController componentInParent = ((Component)hitTransform).GetComponentInParent<PlayerController>();
			if ((Object)(object)componentInParent != (Object)null && (Object)(object)componentInParent.playerAvatarScript == (Object)(object)player)
			{
				return true;
			}
			PlayerTumble componentInParent2 = ((Component)hitTransform).GetComponentInParent<PlayerTumble>();
			if ((Object)(object)componentInParent2 != (Object)null && (Object)(object)componentInParent2.playerAvatar == (Object)(object)player)
			{
				return true;
			}
			return false;
		}

		private static int CompareHitsByDistance(RaycastHit x, RaycastHit y)
		{
			return ((RaycastHit)(ref x)).distance.CompareTo(((RaycastHit)(ref y)).distance);
		}

		private static ShotResult BuildShotResult(EnemyHunter hunter)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: 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)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: 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_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_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_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: 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_007b: 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_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: 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_01d3: 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_01f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0204: Unknown result type (might be due to invalid IL or missing references)
			//IL_0209: Unknown result type (might be due to invalid IL or missing references)
			//IL_020f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0214: 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_011e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0146: Unknown result type (might be due to invalid IL or missing references)
			//IL_014b: Unknown result type (might be due to invalid IL or missing references)
			//IL_016e: Unknown result type (might be due to invalid IL or missing references)
			//IL_015e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0173: Unknown result type (might be due to invalid IL or missing references)
			//IL_0177: Unknown result type (might be due to invalid IL or missing references)
			//IL_0178: Unknown result type (might be due to invalid IL or missing references)
			//IL_019e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a0: 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_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_01ab: 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)
			ShotResult result = default(ShotResult);
			Vector3 position = hunter.gunAimTransform.position;
			Vector3 forward = hunter.gunAimTransform.forward;
			result.VisualPoint = (result.HitPoint = position + forward * 50f) - forward * 0.1f;
			float num = 1f;
			if (FieldShootFast.Invoke(hunter))
			{
				num = 1.5f;
			}
			if (Vector3.Distance(((Component)hunter).transform.position, FieldInvestigatePoint.Invoke(hunter)) > 10f)
			{
				num = 0.5f;
			}
			RaycastHit[] array = Physics.SphereCastAll(position, num, forward, 50f, LayerMask.GetMask(new string[2] { "Player", "PhysGrabObject" }), (QueryTriggerInteraction)1);
			if (array != null && array.Length != 0)
			{
				Array.Sort(array, CompareHitsByDistance);
				for (int i = 0; i < array.Length; i++)
				{
					PlayerAvatar player = TryGetPlayerFromHit(array[i]);
					if (IsValidPlayerTarget(player))
					{
						Vector3 val = ((((RaycastHit)(ref array[i])).point != Vector3.zero) ? ((RaycastHit)(ref array[i])).point : GetPlayerTargetTransform(player).position);
						if (HasClearSightToPlayer(player, position, val))
						{
							result.HitPlayer = true;
							result.Player = player;
							result.HitPoint = val;
							result.VisualPoint = GetSafeVisualPoint(position, forward, val);
							return result;
						}
					}
				}
			}
			RaycastHit val2 = default(RaycastHit);
			if (Physics.Raycast(position, forward, ref val2, 50f, LayerMask.op_Implicit(SemiFunc.LayerMaskGetShouldHits()), (QueryTriggerInteraction)1))
			{
				result.HitPoint = ((RaycastHit)(ref val2)).point;
				result.VisualPoint = ((RaycastHit)(ref val2)).point - forward * 0.1f;
			}
			return result;
		}

		private static PlayerAvatar TryGetPlayerFromHit(RaycastHit hit)
		{
			if ((Object)(object)((RaycastHit)(ref hit)).transform == (Object)null)
			{
				return null;
			}
			if (((Component)((RaycastHit)(ref hit)).transform).gameObject.layer == LayerMask.NameToLayer("Player"))
			{
				PlayerController componentInParent = ((Component)((RaycastHit)(ref hit)).transform).GetComponentInParent<PlayerController>();
				if ((Object)(object)componentInParent != (Object)null)
				{
					return componentInParent.playerAvatarScript;
				}
				return ((Component)((RaycastHit)(ref hit)).transform).GetComponentInParent<PlayerAvatar>();
			}
			PlayerTumble componentInParent2 = ((Component)((RaycastHit)(ref hit)).transform).GetComponentInParent<PlayerTumble>();
			if ((Object)(object)componentInParent2 != (Object)null)
			{
				return componentInParent2.playerAvatar;
			}
			return null;
		}

		private static Vector3 GetSafeVisualPoint(Vector3 origin, Vector3 forward, Vector3 targetPoint)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: 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_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)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: 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_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: 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_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_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			float num = 1.25f;
			Vector3 val = targetPoint - ((Vector3)(ref forward)).normalized * num;
			if (Vector3.Distance(origin, val) < 0.5f)
			{
				val = origin + ((Vector3)(ref forward)).normalized * 0.5f;
			}
			return val;
		}

		private static void SendShootVisual(EnemyHunter hunter, Vector3 hitPosition)
		{
			//IL_0033: 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_006b: 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)
			PhotonView val = FieldPhotonView.Invoke(hunter);
			if (SemiFunc.IsMultiplayer() && (Object)(object)val != (Object)null)
			{
				val.RPC("ShootRPC", (RpcTarget)0, new object[1] { hitPosition });
			}
			else if (MethodShootRpc != null)
			{
				MethodShootRpc.Invoke(hunter, new object[2]
				{
					hitPosition,
					(object)default(PhotonMessageInfo)
				});
			}
		}

		private static void ApplyCustomPlayerHit(EnemyHunter hunter, PlayerAvatar player, Vector3 hitPoint)
		{
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)player == (Object)null) && !((Object)(object)player.playerHealth == (Object)null) && !((Object)(object)hunter.hurtCollider == (Object)null))
			{
				int num = Mathf.Max(0, HuntsmanEyesOpenedPlugin.DamagePerShot.Value);
				if (num > 0)
				{
					player.playerHealth.HurtOther(num, ((Component)player).transform.position, true, -1);
				}
				ApplyKnockbackAndTumble(hunter, player, hitPoint);
			}
		}

		private static void ApplyKnockbackAndTumble(EnemyHunter hunter, PlayerAvatar player, Vector3 hitPoint)
		{
			//IL_003e: 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_0043: 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_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_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_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: 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_01f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0156: Unknown result type (might be due to invalid IL or missing references)
			//IL_015d: 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_0185: Unknown result type (might be due to invalid IL or missing references)
			//IL_018a: Unknown result type (might be due to invalid IL or missing references)
			//IL_018f: 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_01a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a2: 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_01ab: 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_01bd: 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_01c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d0: Unknown result type (might be due to invalid IL or missing references)
			HurtCollider hurtCollider = hunter.hurtCollider;
			float num = Mathf.Max(0f, HuntsmanEyesOpenedPlugin.KnockbackMultiplier.Value);
			Vector3 val = (((Object)(object)hunter.gunAimTransform != (Object)null) ? hunter.gunAimTransform.position : ((Component)hunter).transform.position);
			Vector3 val2 = ((Component)player.localCamera).transform.position - val;
			Vector3 normalized = ((Vector3)(ref val2)).normalized;
			normalized = SemiFunc.ClampDirection(normalized, ((Component)hunter).transform.forward, hurtCollider.hitSpread);
			bool flag = false;
			if (hurtCollider.playerTumbleTime > 0f && (Object)(object)player.playerHealth != (Object)null && FieldPlayerHealth.Invoke(player.playerHealth) > 0)
			{
				player.tumble.TumbleRequest(true, false);
				player.tumble.TumbleOverrideTime(hurtCollider.playerTumbleTime);
				if (hurtCollider.playerTumbleImpactHurtTime > 0f)
				{
					player.tumble.ImpactHurtSet(hurtCollider.playerTumbleImpactHurtTime, hurtCollider.playerTumbleImpactHurtDamage);
				}
				if (hurtCollider.playerTumbleEnemyHurtDisableTime > 0f)
				{
					player.tumble.OverrideEnemyHurt(hurtCollider.playerTumbleEnemyHurtDisableTime);
				}
				flag = true;
			}
			if (flag)
			{
				if (hurtCollider.playerTumbleForce > 0f)
				{
					player.tumble.TumbleForce(normalized * hurtCollider.playerTumbleForce * num);
				}
				if (hurtCollider.playerTumbleTorque > 0f)
				{
					Vector3 torqueAxisVector = GetTorqueAxisVector(player, hurtCollider.playerTumbleTorqueAxis);
					val2 = ((Component)player.localCamera).transform.position - val;
					Vector3 val3 = Vector3.Cross(((Vector3)(ref val2)).normalized, torqueAxisVector) * hurtCollider.playerTumbleTorque * num;
					player.tumble.TumbleTorque(val3);
				}
			}
			else if (hurtCollider.playerHitForce > 0f)
			{
				player.ForceImpulse(normalized * hurtCollider.playerHitForce * num);
			}
		}

		private static Vector3 GetTorqueAxisVector(PlayerAvatar player, TorqueAxis axis)
		{
			//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_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Expected I4, but got Unknown
			//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_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: 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_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: 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_0072: 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_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: 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_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			return (Vector3)((int)axis switch
			{
				0 => ((Component)player).transform.up, 
				1 => -((Component)player).transform.up, 
				2 => -((Component)player).transform.right, 
				3 => ((Component)player).transform.right, 
				4 => ((Component)player).transform.forward, 
				5 => -((Component)player).transform.forward, 
				_ => ((Component)player).transform.up, 
			});
		}

		private static bool CanStartNextAttack(EnemyHunter hunter)
		{
			if (!NextAllowedAttackTime.TryGetValue(((Object)hunter).GetInstanceID(), out var value))
			{
				return true;
			}
			return Time.time >= value;
		}

		private static void RegisterAttackTime(EnemyHunter hunter)
		{
			float num = Mathf.Clamp(HuntsmanEyesOpenedPlugin.MinTimeBetweenAttacks.Value, 0.01f, 10f);
			NextAllowedAttackTime[((Object)hunter).GetInstanceID()] = Time.time + num;
		}

		private static void SyncInvestigationPoint(EnemyHunter hunter, Vector3 point)
		{
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			PhotonView val = FieldPhotonView.Invoke(hunter);
			if (SemiFunc.IsMultiplayer() && (Object)(object)val != (Object)null)
			{
				val.RPC("UpdateInvestigationPoint", (RpcTarget)1, new object[1] { point });
			}
		}

		private static void InvokeUpdateState(EnemyHunter hunter, State state)
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			if (MethodUpdateState != null)
			{
				MethodUpdateState.Invoke(hunter, new object[1] { state });
			}
		}
	}
	[HarmonyPatch(typeof(EnemyHunter), "Update")]
	internal static class EnemyHunterUpdatePatch
	{
		private static void Postfix(EnemyHunter __instance)
		{
			try
			{
				HuntsmanVisionCore.HandleUpdate(__instance);
			}
			catch (Exception ex)
			{
				HuntsmanEyesOpenedPlugin.Log.LogError((object)("Update postfix failed\n" + ex));
			}
		}
	}
	[HarmonyPatch(typeof(EnemyHunter), "OnInvestigate")]
	internal static class EnemyHunterOnInvestigatePatch
	{
		private static bool Prefix(EnemyHunter __instance)
		{
			try
			{
				return HuntsmanVisionCore.HandleOnInvestigate(__instance);
			}
			catch (Exception ex)
			{
				HuntsmanEyesOpenedPlugin.Log.LogError((object)("OnInvestigate override failed\n" + ex));
				return true;
			}
		}
	}
	[HarmonyPatch(typeof(EnemyHunter), "UpdateState")]
	internal static class EnemyHunterUpdateStatePatch
	{
		private static void Prefix(EnemyHunter __instance, ref State _state)
		{
			try
			{
				if ((int)_state == 5 && HuntsmanVisionCore.ShouldBlockAimByCooldown(__instance))
				{
					_state = (State)3;
				}
			}
			catch (Exception ex)
			{
				HuntsmanEyesOpenedPlugin.Log.LogError((object)("UpdateState cooldown guard failed\n" + ex));
			}
		}
	}
	[HarmonyPatch(typeof(EnemyHunter), "OnTouchPlayer")]
	internal static class EnemyHunterOnTouchPlayerPatch
	{
		private static bool Prefix()
		{
			return HuntsmanVisionCore.ShouldKeepTouchReaction();
		}
	}
	[HarmonyPatch(typeof(EnemyHunter), "OnTouchPlayerGrabbedObject")]
	internal static class EnemyHunterOnTouchPlayerGrabbedObjectPatch
	{
		private static bool Prefix()
		{
			return HuntsmanVisionCore.ShouldKeepTouchReaction();
		}
	}
	[HarmonyPatch(typeof(EnemyHunter), "OnGrabbed")]
	internal static class EnemyHunterOnGrabbedPatch
	{
		private static bool Prefix()
		{
			return HuntsmanVisionCore.ShouldKeepTouchReaction();
		}
	}
	[HarmonyPatch(typeof(EnemyHunter), "StateShoot")]
	internal static class EnemyHunterStateShootPatch
	{
		private static bool Prefix(EnemyHunter __instance)
		{
			try
			{
				return HuntsmanVisionCore.HandleStateShoot(__instance);
			}
			catch (Exception ex)
			{
				HuntsmanEyesOpenedPlugin.Log.LogError((object)("StateShoot override failed\n" + ex));
				return true;
			}
		}
	}
}