Please disclose if your mod was created primarily using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of HuntsmanEyesOpened v1.0.0
HuntsmanEyesOpened.dll
Decompiled 15 hours agousing 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; } } } }