Decompiled source of Shambler Enemy v1.0.8
Shambler.dll
Decompiled a month ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text.RegularExpressions; using System.Threading.Tasks; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using GameNetcodeStuff; using HarmonyLib; using LethalConfig; using LethalConfig.ConfigItems; using LethalConfig.ConfigItems.Options; using LethalLib.Modules; using Microsoft.CodeAnalysis; using On; using On.GameNetcodeStuff; using Shambler; using Shambler.NetcodePatcher; using Shambler.src.Soul_Devourer; using SolidLib.Registry; using SoulDev; using Unity.Netcode; using UnityEngine; using UnityEngine.AI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("bcs4313")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyDescription("Shambler Enemy for Lethal Company.")] [assembly: AssemblyFileVersion("1.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+de30a7b4fd06f505c14721da353043ab3517b186")] [assembly: AssemblyProduct("Shambler")] [assembly: AssemblyTitle("Shambler")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] [module: NetcodePatchedAssembly] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [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 SoulDev { internal class EntityWarp { public struct entrancePack { public EntranceTeleport tele; public Vector3 navPosition; } public static EntranceTeleport[] mapEntrances; public static entrancePack findNearestEntrance(EnemyAI __instance) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) float num = 100000000f; EntranceTeleport val = null; EntranceTeleport[] array = mapEntrances; for (int i = 0; i < array.Length; i++) { if (__instance.isOutside == array[i].isEntranceToBuilding && Vector3.Distance(((Component)__instance).transform.position, ((Component)array[i]).transform.position) < num) { num = Vector3.Distance(((Component)__instance).transform.position, ((Component)array[i]).transform.position); val = array[i]; } } entrancePack result = default(entrancePack); NavMeshHit val2 = default(NavMeshHit); if ((Object)(object)val != (Object)null && NavMesh.SamplePosition(((Component)val).transform.position, ref val2, 10f, -1)) { result.navPosition = ((NavMeshHit)(ref val2)).position; } result.tele = val; return result; } public static void SendEnemyInside(EnemyAI __instance) { //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) __instance.isOutside = false; __instance.allAINodes = GameObject.FindGameObjectsWithTag("AINode"); EntranceTeleport tele = findNearestEntrance(__instance).tele; if (!Object.op_Implicit((Object)(object)tele)) { Debug.LogError((object)"MOAI EntranceTeleport: Failed to find entrance teleport."); } Transform entrancePoint = tele.entrancePoint; if (!Object.op_Implicit((Object)(object)entrancePoint)) { Debug.LogError((object)"MOAI EntranceTeleport: Failed to find best exit position."); } NavMeshHit val = default(NavMeshHit); if (NavMesh.SamplePosition(((Component)entrancePoint).transform.position, ref val, 10f, -1)) { __instance.serverPosition = ((NavMeshHit)(ref val)).position; ((Component)__instance).transform.position = ((NavMeshHit)(ref val)).position; __instance.agent.Warp(__instance.serverPosition); __instance.SyncPositionToClients(); } else { Debug.LogError((object)"MOAI EntranceTeleport: Failed to find exit NavmeshHit position"); } } public static Transform findExitPoint(EntranceTeleport referenceDoor) { return referenceDoor.exitPoint; } public static void SendEnemyOutside(EnemyAI __instance, bool SpawnOnDoor = true) { //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) __instance.isOutside = true; __instance.allAINodes = GameObject.FindGameObjectsWithTag("OutsideAINode"); EntranceTeleport tele = findNearestEntrance(__instance).tele; if (!Object.op_Implicit((Object)(object)tele)) { Debug.LogError((object)"MOAI EntranceTeleport: Failed to find entrance teleport."); } Transform entrancePoint = tele.entrancePoint; if (!Object.op_Implicit((Object)(object)entrancePoint)) { Debug.LogError((object)"MOAI EntranceTeleport: Failed to find best exit position."); } NavMeshHit val = default(NavMeshHit); if (NavMesh.SamplePosition(((Component)entrancePoint).transform.position, ref val, 10f, -1)) { __instance.serverPosition = ((NavMeshHit)(ref val)).position; ((Component)__instance).transform.position = ((NavMeshHit)(ref val)).position; __instance.agent.Warp(__instance.serverPosition); __instance.SyncPositionToClients(); } else { Debug.LogError((object)"MOAI EntranceTeleport: Failed to find exit NavmeshHit position"); } } } internal class ShamblerEnemy : EnemyAI { public enum State { SearchingForPlayer, HeadingToEntrance, Crouching, Leaping, ClosingDistance, StabbingCapturedPlayer, HeadingToNest, PlantingStake, SneakyStab } protected Animator animator; private Vector3 nestSpot = Vector3.zero; public static List<ulong> stuckPlayerIds = new List<ulong>(); protected float baseLeapChance = 100f; protected float leaptime = 0f; protected Vector3 leapPos; protected EntranceTeleport nearestEntrance = null; public Vector3 nearestEntranceNavPosition = Vector3.zero; protected PlayerControllerB mostRecentPlayer = null; protected int entranceDelay = 0; protected float chanceToLocateEntrancePlayerBonus = 0f; protected float chanceToLocateEntrance = 0f; public List<EnemyAI> unreachableEnemies = new List<EnemyAI>(); public Vector3 itemNavmeshPosition = Vector3.zero; protected int sourcecycle = 75; protected float stamina = 0f; protected bool recovering = false; public int provokePoints = 0; public Transform turnCompass; protected float timeSinceHittingLocalPlayer; protected float timeSinceNewRandPos; protected Vector3 positionRandomness; protected Vector3 StalkPos; protected Random enemyRandom; protected bool isDeadAnimationDone; private bool markDead = false; public AudioSource creatureLeapLand; public AudioSource creatureAnger; private float angerSoundTimer = 0f; public AudioSource creatureLaugh; public AudioSource creaturePlant; public AudioSource creatureSneakyStab; public AudioSource creatureDeath; public AudioSource creatureTakeDmg; public AudioSource[] creatureSteps; protected float runAnimationCoefficient = 14f; protected float walkAnimationCoefficient = 3f; [Header("AI Debug")] public bool debugThoughts = true; public bool debugDrawGoal = true; private Vector3 lastGoal = Vector3.zero; private float lastGoalScore = 0f; private bool usingCustomGoal = false; private float sizeCheckCooldown = 2f; private bool stepSoundCycle1 = false; private bool stepSoundCycle2 = false; public float stabTimeout = 6f; private bool doneStab = false; private bool isStabbing = false; public Transform stabPoint; public AudioSource creatureStab; private bool doneLeap = false; private bool isLeaping = false; private float leapTimer = 9f; private float leapAnimationLength = 0.5f; private float leapPeakHeight = 3f; public List<ulong> EscapingEmployees = new List<ulong>(); public PlayerControllerB capturedPlayer = null; public PlayerControllerB stabbedPlayer = null; private bool stabbedCapturedPlayer = false; public Transform capturePoint; public float captureRange = 5.35f; public float timeTillStab = 0f; private float crouchTimer = 0f; private float maxLeapDistance = 25f; public float crouchTimeout = 6f; private float spottedCooldown = 0f; private LayerMask WorldMask; private Vector3 stickyGoal = Vector3.zero; private float stickyScore = float.NegativeInfinity; private float stickyPickedAt = -999f; private float lastGoalDist = 9999f; private float stuckTimer = 0f; [SerializeField] private float goalMinLockSeconds = 1.2f; [SerializeField] private float goalRepathCooldown = 0.6f; [SerializeField] private float goalBetterBy = 0.35f; [SerializeField] private float goalArrivalTol = 0.9f; [SerializeField] private float stuckSpeedThresh = 0.15f; [SerializeField] private float stuckSeconds = 1.1f; private float coverLockUntil = -999f; private float lastSeenTime = -999f; [SerializeField] private float coverDwellSeconds = 5f; [SerializeField] private float seenGrace = 0.9f; public Transform footLCol; public Transform footRCol; public Transform armLCol; public Transform armRCol; public Transform headCol; [SerializeField] private float coverRequiredFraction = 0.7f; private float maxStabDistance = 4f; private float alertLevel = 0f; private float alertDecay = 1.5f; private float sneakyAlertLevel = 70f; private float alertRate = 1f; private float headingToNestTimeout = 6f; private float headingToNestDistance = 0f; private bool isPlanting = false; private bool donePlant = false; public GameObject heldStakeRef; public float plantCooldown = 5f; public float plantTime = -1f; private PlayerControllerB RageTarget = null; private void Think(string msg) { if (debugThoughts) { Debug.Log((object)$"[Shambler@{Time.time:F1}] {msg}"); } } private void OnDrawGizmosSelected() { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0042: 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_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) if (debugDrawGoal && !(lastGoal == Vector3.zero)) { Gizmos.color = Color.cyan; Gizmos.DrawLine(((Component)this).transform.position + Vector3.up * 0.5f, lastGoal + Vector3.up * 0.5f); Gizmos.DrawSphere(lastGoal, 0.25f); } } public void LogDebug(string text) { Plugin.Logger.LogInfo((object)text); } public void facePosition(Vector3 pos) { //IL_0001: 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_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_001f: 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_002f: 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_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) Vector3 val = pos - ((Component)this).transform.position; val.y = 0f; if (val != Vector3.zero) { Quaternion val2 = Quaternion.LookRotation(val); ((Component)this).transform.rotation = Quaternion.Euler(0f, ((Quaternion)(ref val2)).eulerAngles.y, 0f); } } public override void OnDestroy() { ((EnemyAI)this).OnDestroy(); } public PlayerControllerB getNearestPlayer(bool addFilter = true) { //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) PlayerControllerB[] allPlayerScripts = RoundManager.Instance.playersManager.allPlayerScripts; PlayerControllerB result = null; float num = 1E+09f; foreach (PlayerControllerB val in allPlayerScripts) { if (Object.op_Implicit((Object)(object)val) && !val.isPlayerDead && val.isPlayerControlled) { float num2 = Vector3.Distance(((Component)this).transform.position, ((Component)val).transform.position); if (num2 < num && (PlayerQualifies(val) || !addFilter)) { num = num2; result = val; } } } return result; } public void SetAudioVolumes() { } public override void Start() { //IL_0053: 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_008b: 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_011e: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Unknown result type (might be due to invalid IL or missing references) //IL_0159: Unknown result type (might be due to invalid IL or missing references) //IL_0183: Unknown result type (might be due to invalid IL or missing references) //IL_0188: 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_01d7: Unknown result type (might be due to invalid IL or missing references) //IL_01dc: Unknown result type (might be due to invalid IL or missing references) //IL_01e6: Unknown result type (might be due to invalid IL or missing references) //IL_01eb: Unknown result type (might be due to invalid IL or missing references) //IL_0202: Unknown result type (might be due to invalid IL or missing references) //IL_020a: 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_0219: Unknown result type (might be due to invalid IL or missing references) //IL_021e: Unknown result type (might be due to invalid IL or missing references) //IL_0223: Unknown result type (might be due to invalid IL or missing references) //IL_0225: Unknown result type (might be due to invalid IL or missing references) //IL_0227: Unknown result type (might be due to invalid IL or missing references) //IL_022c: Unknown result type (might be due to invalid IL or missing references) //IL_02cd: Unknown result type (might be due to invalid IL or missing references) ((EnemyAI)this).Start(); if (((NetworkBehaviour)RoundManager.Instance).IsHost && Object.FindObjectsOfType<ShamblerEnemy>().Length > Plugin.maxCount.Value) { Object.Destroy((Object)(object)((Component)this).gameObject); Debug.Log((object)"Shambler: Destroyed self (enemy count too high)"); } maxStabDistance = 5f * ((Component)this).transform.localScale.x; maxLeapDistance = 20f * ((Component)this).transform.localScale.x; captureRange = 5.35f * ((Component)this).transform.localScale.x; nestSpot = ((Component)this).transform.position; EntityWarp.mapEntrances = Object.FindObjectsOfType<EntranceTeleport>(false); mostRecentPlayer = getNearestPlayer(); animator = ((Component)this).gameObject.GetComponent<Animator>(); if (((NetworkBehaviour)RoundManager.Instance).IsHost) { DoAnimationClientRpc(0); } stamina = 120f; timeSinceHittingLocalPlayer = 0f; timeSinceNewRandPos = 0f; positionRandomness = new Vector3(0f, 0f, 0f); enemyRandom = new Random(StartOfRound.Instance.randomMapSeed + base.thisEnemyIndex); isDeadAnimationDone = false; base.currentBehaviourStateIndex = 0; ((EnemyAI)this).StartSearch(((Component)this).transform.position, (AISearchRoutine)null); moaiSoundPlayClientRpc("creatureVoice"); base.enemyHP = Plugin.health.Value; WorldMask = BuildWorldMask(); Think($"WorldMask={((LayerMask)(ref WorldMask)).value} built."); PlayerControllerB nearestPlayer = getNearestPlayer(); if (Object.op_Implicit((Object)(object)nearestPlayer)) { Vector3 val = (Object.op_Implicit((Object)(object)nearestPlayer.playerEye) ? ((Component)nearestPlayer.playerEye).transform.position : (((Component)nearestPlayer).transform.position + Vector3.up * 1.6f)); Vector3 val2 = ((Component)this).transform.position + Vector3.up * 1.2f; RaycastHit val3 = default(RaycastHit); bool flag = Physics.Linecast(val, val2, ref val3, LayerMask.op_Implicit(WorldMask), (QueryTriggerInteraction)1); Think(string.Format("Initial LOS blocked={0}, hit={1}, layer={2}", flag, Object.op_Implicit((Object)(object)((RaycastHit)(ref val3)).collider) ? ((Object)((RaycastHit)(ref val3)).collider).name : "none", Object.op_Implicit((Object)(object)((RaycastHit)(ref val3)).collider) ? LayerMask.LayerToName(((Component)((RaycastHit)(ref val3)).collider).gameObject.layer) : "none")); } if (base.currentBehaviourStateIndex == 3 && Object.op_Implicit((Object)(object)base.targetPlayer)) { facePosition(((Component)base.targetPlayer).transform.position); } } private static bool IsPlayerStaked(PlayerControllerB p) { if ((Object)(object)p == (Object)null || (Object)(object)((NetworkBehaviour)p).NetworkObject == (Object)null) { return false; } return stuckPlayerIds.Contains(((NetworkBehaviour)p).NetworkObject.NetworkObjectId); } public override void Update() { //IL_0035: 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_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_014e: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_0165: Unknown result type (might be due to invalid IL or missing references) //IL_016a: Unknown result type (might be due to invalid IL or missing references) //IL_0218: Unknown result type (might be due to invalid IL or missing references) //IL_021d: Unknown result type (might be due to invalid IL or missing references) //IL_03a8: Unknown result type (might be due to invalid IL or missing references) //IL_03ad: Unknown result type (might be due to invalid IL or missing references) //IL_0234: Unknown result type (might be due to invalid IL or missing references) //IL_0239: Unknown result type (might be due to invalid IL or missing references) //IL_059d: Unknown result type (might be due to invalid IL or missing references) ((EnemyAI)this).Update(); sizeCheckCooldown -= Time.deltaTime; if (sizeCheckCooldown < 0f) { if (((Component)this).transform.localScale.x > 1f || ((Component)this).transform.localScale.y > 1f || ((Component)this).transform.localScale.z > 1f) { ((Component)this).transform.localScale = new Vector3(1f, 1f, 1f); maxStabDistance = 5f * ((Component)this).transform.localScale.x; maxLeapDistance = 20f * ((Component)this).transform.localScale.x; captureRange = 5.35f * ((Component)this).transform.localScale.x; } sizeCheckCooldown = 2f; } AnimatorStateInfo currentAnimatorStateInfo; if (!base.isEnemyDead && base.enemyHP <= 0 && !markDead) { animator.speed = 1f; ((EnemyAI)this).KillEnemyOnOwnerClient(false); stopAllSound(); currentAnimatorStateInfo = animator.GetCurrentAnimatorStateInfo(0); if (!((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("Death")) { currentAnimatorStateInfo = animator.GetCurrentAnimatorStateInfo(0); if (!((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("Exit")) { animator.Play("Death"); } } base.isEnemyDead = true; base.enemyHP = 0; moaiSoundPlayClientRpc("creatureDeath"); deadEventClientRpc(); markDead = true; ((Collider)((Component)this).GetComponent<BoxCollider>()).enabled = false; } if (base.isEnemyDead) { if (Object.op_Implicit((Object)(object)stabbedPlayer)) { stabbedPlayer = null; } if (Object.op_Implicit((Object)(object)capturedPlayer)) { capturedPlayer = null; } currentAnimatorStateInfo = animator.GetCurrentAnimatorStateInfo(0); if (!((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("Death")) { currentAnimatorStateInfo = animator.GetCurrentAnimatorStateInfo(0); if (!((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("StayDead")) { animator.Play("StayDead"); } } return; } if (Object.op_Implicit((Object)(object)stabbedPlayer)) { if (!stabbedPlayer.playerCollider.enabled || !stabbedPlayer.isPlayerDead) { } stabbedPlayer.fallValue = 0f; stabbedPlayer.fallValueUncapped = 0f; if (!stabbedPlayer.isPlayerDead) { } } if (Object.op_Implicit((Object)(object)capturedPlayer)) { if (!capturedPlayer.playerCollider.enabled || !capturedPlayer.isPlayerDead) { } capturedPlayer.fallValue = 0f; capturedPlayer.fallValueUncapped = 0f; if (!capturedPlayer.isPlayerDead) { } } if (base.isEnemyDead) { if (!isDeadAnimationDone) { animator.speed = 1f; isDeadAnimationDone = true; stopAllSound(); base.creatureVoice.PlayOneShot(base.dieSFX); } return; } AnimatorStateInfo currentAnimatorStateInfo2 = animator.GetCurrentAnimatorStateInfo(0); if (((AnimatorStateInfo)(ref currentAnimatorStateInfo2)).IsName("Walk")) { float num = ((AnimatorStateInfo)(ref currentAnimatorStateInfo2)).normalizedTime - Mathf.Floor(((AnimatorStateInfo)(ref currentAnimatorStateInfo2)).normalizedTime); if (num < 0.1f) { stepSoundCycle1 = false; stepSoundCycle2 = false; } if (num > 0.15f && !stepSoundCycle1) { moaiSoundPlayClientRpc("step"); stepSoundCycle1 = true; } if (num > 0.5f && !stepSoundCycle2) { moaiSoundPlayClientRpc("step"); stepSoundCycle2 = true; } } else { stepSoundCycle1 = (stepSoundCycle2 = false); } if (alertLevel > sneakyAlertLevel && ((NetworkBehaviour)RoundManager.Instance).IsHost && angerSoundTimer <= 0f) { angerSoundTimer = 5f; moaiSoundPlayClientRpc("creatureAnger"); } if (angerSoundTimer >= 0f) { angerSoundTimer -= Time.deltaTime; } if ((Object)(object)base.targetPlayer != (Object)null && base.targetPlayer.isPlayerDead) { base.targetPlayer = null; } base.movingTowardsTargetPlayer = (Object)(object)base.targetPlayer != (Object)null && !usingCustomGoal; timeSinceHittingLocalPlayer += Time.deltaTime; timeSinceNewRandPos += Time.deltaTime; if ((Object)(object)base.targetPlayer != (Object)null && ((EnemyAI)this).PlayerIsTargetable(base.targetPlayer, false, false)) { Transform obj = turnCompass; if (obj != null) { obj.LookAt(((Component)base.targetPlayer.gameplayCamera).transform.position); } } if (base.stunNormalizedTimer > 0f && !((NetworkBehaviour)RoundManager.Instance).IsHost) { } } private void LateUpdate() { //IL_002f: 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) if (!base.isEnemyDead) { if (Object.op_Implicit((Object)(object)capturedPlayer)) { ((Component)capturedPlayer).transform.position = capturePoint.position; } if (Object.op_Implicit((Object)(object)stabbedPlayer)) { ((Component)stabbedPlayer).transform.position = stabPoint.position; } timeTillStab -= Time.deltaTime; } } public override void DoAIInterval() { //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) ((EnemyAI)this).DoAIInterval(); if (base.isEnemyDead) { return; } if (provokePoints > 0) { provokePoints--; } if (spottedCooldown > 0f) { spottedCooldown = Mathf.Max(0f, spottedCooldown - 1f); } if (entranceDelay > 0) { entranceDelay--; } if (sourcecycle > 0) { sourcecycle--; } else { sourcecycle = 75; unreachableEnemies.Clear(); } if (stamina <= 0f) { recovering = true; } else if (stamina > 60f) { recovering = false; } if (sourcecycle % 5 == 0) { EntityWarp.entrancePack entrancePack = EntityWarp.findNearestEntrance((EnemyAI)(object)this); nearestEntrance = entrancePack.tele; nearestEntranceNavPosition = entrancePack.navPosition; if (stamina < 120f) { stamina += 8f; } mostRecentPlayer = getNearestPlayer(); } if ((Object)(object)base.targetPlayer != (Object)null) { mostRecentPlayer = base.targetPlayer; } AIInterval(); if (alertLevel > 0f) { alertLevel = Mathf.Max(0f, alertLevel - alertDecay); } alertLevel = Mathf.Min(100f, alertLevel); } public void AIInterval() { if (Object.op_Implicit((Object)(object)capturedPlayer) && !stabbedCapturedPlayer && timeTillStab < 0f && base.currentBehaviourStateIndex != 5) { ((EnemyAI)this).StopSearch(base.currentSearch, true); ((EnemyAI)this).SwitchToBehaviourClientRpc(5); isStabbing = false; doneStab = false; } switch (base.currentBehaviourStateIndex) { case 0: usingCustomGoal = false; baseSearchingForPlayer(); break; case 1: usingCustomGoal = false; baseHeadingToEntrance(); break; case 2: baseCrouching(); break; case 4: baseClosingDistance(); break; case 3: baseLeaping(); break; case 5: baseStabbingCapturedPlayer(); break; case 6: baseHeadingToNest(); break; case 7: basePlantingStake(); break; case 8: baseSneakyStab(); break; default: LogDebug("This Behavior State doesn't exist!"); break; } } public void baseSneakyStab() { //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_016f: Unknown result type (might be due to invalid IL or missing references) //IL_021d: Unknown result type (might be due to invalid IL or missing references) base.agent.speed = 0f; stabTimeout -= 0.2f; setAnimationSpeedClientRpc(1f); base.agent.updateRotation = false; if (Object.op_Implicit((Object)(object)getNearestPlayer())) { facePosition(((Component)getNearestPlayer()).transform.position); } if (base.isEnemyDead) { base.agent.updateRotation = true; isStabbing = false; doneStab = false; ((EnemyAI)this).SwitchToBehaviourClientRpc(0); ((EnemyAI)this).StartSearch(((Component)this).transform.position, (AISearchRoutine)null); Think("Switched to searching for player"); } if (!isStabbing) { ((MonoBehaviour)this).StartCoroutine(DoSneakyStab()); stabTimeout = 6f; isStabbing = true; } else if (doneStab) { base.agent.updateRotation = true; isStabbing = false; doneStab = false; if (!Object.op_Implicit((Object)(object)stabbedPlayer)) { stabbedPlayer = getNearestPlayer(); if ((Object)(object)stabbedPlayer != (Object)null) { SetStabbedPlayerClientRpc(((NetworkBehaviour)stabbedPlayer).NetworkObject.NetworkObjectId); } } ((EnemyAI)this).SwitchToBehaviourClientRpc(0); ((EnemyAI)this).StartSearch(((Component)this).transform.position, (AISearchRoutine)null); Think("Switched to searching for player"); } else { if (!(stabTimeout < 0f)) { return; } base.agent.updateRotation = true; isStabbing = false; doneStab = false; if (!Object.op_Implicit((Object)(object)stabbedPlayer)) { stabbedPlayer = getNearestPlayer(); if ((Object)(object)stabbedPlayer != (Object)null) { SetStabbedPlayerClientRpc(((NetworkBehaviour)stabbedPlayer).NetworkObject.NetworkObjectId); } } ((EnemyAI)this).SwitchToBehaviourClientRpc(0); ((EnemyAI)this).StartSearch(((Component)this).transform.position, (AISearchRoutine)null); Think("Switched to searching for player"); } } [ClientRpc] public void SetCapturedPlayerClientRpc(ulong playerid, bool reset = false) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: 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_0071: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(2925436343u, val, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val2, playerid); ((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref reset, default(ForPrimitives)); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2925436343u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 || (!networkManager.IsClient && !networkManager.IsHost)) { return; } ((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0; if (reset) { capturedPlayer = null; } RoundManager instance = RoundManager.Instance; PlayerControllerB[] allPlayerScripts = instance.playersManager.allPlayerScripts; PlayerControllerB[] array = allPlayerScripts; foreach (PlayerControllerB val3 in array) { if (((NetworkBehaviour)val3).NetworkObject.NetworkObjectId == playerid) { capturedPlayer = val3; } } } [ClientRpc] public void SetStabbedPlayerClientRpc(ulong playerid, bool reset = false) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: 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_0071: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(3110006365u, val, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val2, playerid); ((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref reset, default(ForPrimitives)); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 3110006365u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 || (!networkManager.IsClient && !networkManager.IsHost)) { return; } ((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0; if (reset) { stabbedPlayer = null; } RoundManager instance = RoundManager.Instance; PlayerControllerB[] allPlayerScripts = instance.playersManager.allPlayerScripts; PlayerControllerB[] array = allPlayerScripts; foreach (PlayerControllerB val3 in array) { if (((NetworkBehaviour)val3).NetworkObject.NetworkObjectId == playerid) { stabbedPlayer = val3; } } } [ClientRpc] public void DmgPlayerClientRpc(ulong playerid, int amount) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: 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_0071: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0096: 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_0121: Unknown result type (might be due to invalid IL or missing references) //IL_0127: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(3897930302u, val, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val2, playerid); BytePacker.WriteValueBitPacked(val2, amount); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 3897930302u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 || (!networkManager.IsClient && !networkManager.IsHost)) { return; } ((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0; RoundManager instance = RoundManager.Instance; PlayerControllerB[] allPlayerScripts = instance.playersManager.allPlayerScripts; PlayerControllerB[] array = allPlayerScripts; foreach (PlayerControllerB val3 in array) { if (((NetworkBehaviour)val3).NetworkObject.NetworkObjectId == playerid) { val3.DamagePlayer(30, true, true, (CauseOfDeath)0, 0, false, default(Vector3)); } } } public IEnumerator DoSneakyStab() { if (Object.op_Implicit((Object)(object)getNearestPlayer())) { Think("DoSneakyStab"); DoAnimationClientRpc(7); animPlayClientRpc("SneakyStab"); moaiSoundPlayClientRpc("creatureSneakyStab"); yield return (object)new WaitForSeconds(0.4f); stabbedPlayer = getNearestPlayer(); if ((Object)(object)stabbedPlayer != (Object)null) { SetStabbedPlayerClientRpc(((NetworkBehaviour)stabbedPlayer).NetworkObject.NetworkObjectId); } capturedPlayer = null; SetCapturedPlayerClientRpc(0uL, reset: true); stabbedCapturedPlayer = true; DmgPlayerClientRpc(((NetworkBehaviour)stabbedPlayer).NetworkObject.NetworkObjectId, 30); yield return (object)new WaitForSeconds(0.65f); doneStab = true; Think("Stab Done"); yield break; } base.agent.updateRotation = true; isStabbing = false; doneStab = false; if (!Object.op_Implicit((Object)(object)stabbedPlayer)) { stabbedPlayer = getNearestPlayer(); if ((Object)(object)stabbedPlayer != (Object)null) { SetStabbedPlayerClientRpc(((NetworkBehaviour)stabbedPlayer).NetworkObject.NetworkObjectId); } } ((EnemyAI)this).SwitchToBehaviourClientRpc(0); ((EnemyAI)this).StartSearch(((Component)this).transform.position, (AISearchRoutine)null); Think("Switched to searching for player"); } public void baseStabbingCapturedPlayer() { //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Unknown result type (might be due to invalid IL or missing references) base.agent.speed = 0f; setAnimationSpeedClientRpc(1f); if (base.isEnemyDead) { base.agent.updateRotation = true; isStabbing = false; doneStab = false; ((EnemyAI)this).SwitchToBehaviourClientRpc(0); ((EnemyAI)this).StartSearch(((Component)this).transform.position, (AISearchRoutine)null); Think("Switched to searching for player"); } if (!isStabbing) { ((MonoBehaviour)this).StartCoroutine(DoStab()); isStabbing = true; } else { if (!doneStab) { return; } base.agent.updateRotation = true; isStabbing = false; doneStab = false; capturedPlayer = null; SetCapturedPlayerClientRpc(0uL, reset: true); if (!Object.op_Implicit((Object)(object)stabbedPlayer)) { stabbedPlayer = getNearestPlayer(); if ((Object)(object)stabbedPlayer != (Object)null) { SetStabbedPlayerClientRpc(((NetworkBehaviour)stabbedPlayer).NetworkObject.NetworkObjectId); } } ((EnemyAI)this).SwitchToBehaviourClientRpc(0); DoAnimationClientRpc(0); animPlayClientRpc("Idle"); ((EnemyAI)this).StartSearch(((Component)this).transform.position, (AISearchRoutine)null); Think("Switched to searching for player"); } } public IEnumerator DoStab() { Think("DoStab"); DoAnimationClientRpc(5); animPlayClientRpc("StabVictimHeld"); moaiSoundPlayClientRpc("creatureStab"); if (Object.op_Implicit((Object)(object)capturedPlayer)) { SetColliderClientRpc(((NetworkBehaviour)capturedPlayer).NetworkObject.NetworkObjectId, value: false); } yield return (object)new WaitForSeconds(1.1f); stabbedPlayer = capturedPlayer; if ((Object)(object)stabbedPlayer != (Object)null) { SetStabbedPlayerClientRpc(((NetworkBehaviour)stabbedPlayer).NetworkObject.NetworkObjectId); } capturedPlayer = null; SetCapturedPlayerClientRpc(0uL); stabbedCapturedPlayer = true; DmgPlayerClientRpc(((NetworkBehaviour)stabbedPlayer).NetworkObject.NetworkObjectId, 30); yield return (object)new WaitForSeconds(1.3f); if (Object.op_Implicit((Object)(object)stabbedPlayer)) { SetColliderClientRpc(((NetworkBehaviour)stabbedPlayer).NetworkObject.NetworkObjectId, value: false); } doneStab = true; Think("Stab Done"); } public void baseLeaping() { //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_0138: Unknown result type (might be due to invalid IL or missing references) //IL_0181: Unknown result type (might be due to invalid IL or missing references) base.agent.updateRotation = false; base.agent.speed = 0f; setAnimationSpeedClientRpc(1f); base.targetPlayer = getNearestPlayer(); leapTimer -= 0.2f; if ((Object)(object)base.targetPlayer == (Object)null) { base.agent.updateRotation = true; ((EnemyAI)this).SwitchToBehaviourClientRpc(0); ((EnemyAI)this).StartSearch(((Component)this).transform.position, (AISearchRoutine)null); Think("Switched to searching for player"); } facePosition(((Component)base.targetPlayer).transform.position); if (!isLeaping && Vector3.Distance(((Component)this).transform.position, ((Component)base.targetPlayer).transform.position) <= maxLeapDistance) { DoGroundHopClientRpc(((Component)base.targetPlayer).transform.position, ((Component)this).transform.position); isLeaping = true; } else if (doneLeap) { base.agent.updateRotation = true; ((EnemyAI)this).SwitchToBehaviourClientRpc(0); ((EnemyAI)this).StartSearch(((Component)this).transform.position, (AISearchRoutine)null); Think("Switched to searching for player"); } else if (leapTimer < 0f) { base.agent.updateRotation = true; ((EnemyAI)this).SwitchToBehaviourClientRpc(0); ((EnemyAI)this).StartSearch(((Component)this).transform.position, (AISearchRoutine)null); Think("Switched to searching for player"); } } public IEnumerator DoGroundHop(Vector3 targetPos, Vector3 shamblerStartPos) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) Think("DoGroundHop"); if (((NetworkBehaviour)RoundManager.Instance).IsHost) { animPlayClientRpc("Leap-Land"); moaiSoundPlayClientRpc("creatureLeapLand"); } ((Component)this).transform.position = shamblerStartPos; float duration = leapAnimationLength + Vector3.Distance(((Component)this).transform.position, targetPos) / maxLeapDistance * 0.5f; float elapsed = 0f; float arcPeak = leapPeakHeight; while (elapsed < duration) { float t = elapsed / duration; float height = Mathf.Sin(t * MathF.PI) * arcPeak; ((Component)this).transform.position = Vector3.Lerp(shamblerStartPos, targetPos, t) + Vector3.up * height; elapsed += Time.deltaTime; yield return null; } ((Component)this).transform.position = targetPos; Think("Landing..."); if (((NetworkBehaviour)RoundManager.Instance).IsHost) { animPlayClientRpc("Land-Capture"); AttemptCapturePlayer(); DoAnimationClientRpc(4); yield return (object)new WaitForSeconds(1.2f); doneLeap = true; } Think("Leap Done"); } [ClientRpc] public void DoGroundHopClientRpc(Vector3 targetPos, Vector3 shamblerStartPos) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: 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_0096: 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_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(2556090093u, val, (RpcDelivery)0); ((FastBufferWriter)(ref val2)).WriteValueSafe(ref targetPos); ((FastBufferWriter)(ref val2)).WriteValueSafe(ref shamblerStartPos); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2556090093u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsClient || networkManager.IsHost)) { ((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0; ((MonoBehaviour)this).StartCoroutine(DoGroundHop(targetPos, shamblerStartPos)); } } } public void ClaimHuman() { } public void StakeNotify(PlayerControllerB player) { if ((Object)(object)player != (Object)null) { EscapingEmployees.Add(((NetworkBehaviour)player).NetworkObject.NetworkObjectId); } } public void StakeUnNotify(PlayerControllerB player) { if ((Object)(object)player != (Object)null) { EscapingEmployees.Remove(((NetworkBehaviour)player).NetworkObject.NetworkObjectId); } else { EscapingEmployees.Clear(); } } public void AttemptCapturePlayer() { //IL_0032: 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) Think("Shambler: Attempt Capture Player"); PlayerControllerB[] allPlayerScripts = RoundManager.Instance.playersManager.allPlayerScripts; PlayerControllerB[] array = allPlayerScripts; foreach (PlayerControllerB val in array) { if (Vector3.Distance(((Component)val).transform.position, ((Component)this).transform.position) < captureRange) { if ((Object)(object)val != (Object)(object)capturedPlayer) { Think("Shambler: I GOTCHA"); capturedPlayer = val; stabbedCapturedPlayer = false; attachPlayerClientRpc(((NetworkBehaviour)capturedPlayer).NetworkObject.NetworkObjectId, lastHit: false, 50); timeTillStab = (float)(2.0 + 30.0 * enemyRandom.NextDouble() * enemyRandom.NextDouble() * enemyRandom.NextDouble()); DmgPlayerClientRpc(((NetworkBehaviour)val).NetworkObject.NetworkObjectId, 20); return; } DmgPlayerClientRpc(((NetworkBehaviour)val).NetworkObject.NetworkObjectId, 70); } } Think("Shambler: OHHHH I MISSED!"); } public void baseCrouching() { //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_0147: Unknown result type (might be due to invalid IL or missing references) base.agent.speed = 0f; setAnimationSpeedClientRpc(1f); DoAnimationClientRpc(2); animPlayClientRpc("Crouching"); Debug.Log((object)("Crouching... timer: " + crouchTimer)); crouchTimeout -= 0.2f; PlayerControllerB val = (((Object)(object)base.targetPlayer != (Object)null && ((EnemyAI)this).PlayerIsTargetable(base.targetPlayer, false, false)) ? base.targetPlayer : getNearestPlayer()); if (Vector3.Distance(((Component)this).transform.position, ((Component)val).transform.position) > maxLeapDistance) { ((EnemyAI)this).StartSearch(((Component)this).transform.position, (AISearchRoutine)null); ((EnemyAI)this).SwitchToBehaviourClientRpc(0); return; } crouchTimer -= 0.2f; if (crouchTimer <= 0f) { Think("Switched to leap mode"); doneLeap = false; isLeaping = false; leapTimer = 9f; ((EnemyAI)this).SwitchToBehaviourClientRpc(3); } else if (crouchTimeout <= 0f) { ((EnemyAI)this).StartSearch(((Component)this).transform.position, (AISearchRoutine)null); ((EnemyAI)this).SwitchToBehaviourClientRpc(0); } } private LayerMask BuildWorldMask() { //IL_0189: Unknown result type (might be due to invalid IL or missing references) //IL_018e: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Unknown result type (might be due to invalid IL or missing references) string[] array = new string[7] { "Default", "Room", "Colliders", "MiscLevelGeometry", "Terrain", "Railing", "DecalStickableSurface" }; string[] array2 = new string[8] { "Player", "Enemy", "Enemies", "Players", "Ragdoll", "Trigger", "Ignore Raycast", "UI" }; int num = 0; string[] array3 = array; foreach (string text in array3) { int num2 = LayerMask.NameToLayer(text); if (num2 >= 0) { num |= 1 << num2; } else { Debug.LogWarning((object)("[WorldMask] Include layer \"" + text + "\" not found.")); } } string[] array4 = array2; foreach (string text2 in array4) { int num3 = LayerMask.NameToLayer(text2); if (num3 >= 0) { num &= ~(1 << num3); } } num &= ~(1 << ((Component)this).gameObject.layer); if (num == 0) { Debug.LogWarning((object)"[WorldMask] Mask resolved to 0; falling back to Physics.DefaultRaycastLayers."); num = -5 & ~(1 << ((Component)this).gameObject.layer); } Debug.Log((object)$"[WorldMask] Built mask={num} (self layer excluded: {LayerMask.LayerToName(((Component)this).gameObject.layer)})"); return LayerMask.op_Implicit(num); } private float CoverScoreAllPlayers(Vector3 pos) { //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) PlayerControllerB[] allPlayerScripts = RoundManager.Instance.playersManager.allPlayerScripts; int num = 0; float num2 = 0f; foreach (PlayerControllerB val in allPlayerScripts) { if (!((Object)(object)val == (Object)null) && val.isPlayerControlled && !val.isPlayerDead && !OccludedFromPlayer_Multi(pos, val)) { num++; Vector3 val2 = pos - ((Component)val).transform.position; Vector3 normalized = ((Vector3)(ref val2)).normalized; float num3 = Mathf.Max(0f, Vector3.Dot(((Component)val).transform.forward, normalized)); if (num3 > num2) { num2 = num3; } } } return (num == 0) ? 2f : (-0.9f * (float)num - 0.8f * num2); } private bool TryFindCoverAgainstPlayer(PlayerControllerB ply, Vector3 around, float searchRadius, float backoff, out Vector3 coverPos) { //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_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //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_0069: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: 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_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) coverPos = Vector3.zero; if ((Object)(object)ply == (Object)null) { return false; } Vector3 val = (((Object)(object)ply.playerEye != (Object)null) ? ((Component)ply.playerEye).transform.position : (((Component)ply).transform.position + Vector3.up * 1.6f)); Vector3 val2 = around - val; float num = Mathf.Max(searchRadius, ((Vector3)(ref val2)).magnitude + searchRadius); RaycastHit val3 = default(RaycastHit); if (Physics.Raycast(val, ((Vector3)(ref val2)).normalized, ref val3, num, LayerMask.op_Implicit(WorldMask), (QueryTriggerInteraction)1)) { Vector3 pos = ((RaycastHit)(ref val3)).point + ((RaycastHit)(ref val3)).normal * backoff; if (TrySampleNavmesh(pos, 2.5f, out var hitPos) && OccludedFromPlayer_Multi(hitPos, ply)) { coverPos = hitPos; return true; } } return false; } private bool TryFindGroupCover(Vector3 center, float minR, float maxR, int rings, int samplesPerRing, out Vector3 best) { //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_0071: 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_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_0143: Unknown result type (might be due to invalid IL or missing references) best = Vector3.zero; float num = float.NegativeInfinity; Vector3 val = default(Vector3); for (int i = 0; i < rings; i++) { float num2 = ((rings == 1) ? 1f : ((float)i / (float)(rings - 1))); float num3 = Mathf.Lerp(minR, maxR, num2); for (int j = 0; j < samplesPerRing; j++) { float num4 = (float)j / (float)samplesPerRing * MathF.PI * 2f; ((Vector3)(ref val))..ctor(Mathf.Cos(num4), 0f, Mathf.Sin(num4)); Vector3 pos = center + val * num3; if (!TrySampleNavmesh(pos, 2.5f, out var hitPos)) { continue; } float num5 = CoverScoreAllPlayers(hitPos); if (!(num5 <= 0.1f)) { float num6 = 9.5f; float num7 = Vector3.Distance(hitPos, center); float num8 = 1f - Mathf.Clamp01(Mathf.Abs(num7 - num6) / num6); float num9 = Vector3.Distance(((Component)this).transform.position, hitPos); float num10 = 1f - Mathf.Clamp01(num9 / 25f); float num11 = 1.4f * num5 + 0.8f * num8 + 0.3f * num10; if (num11 > num) { num = num11; best = hitPos; } } } } return num > float.NegativeInfinity; } private bool TryGetMostDangerousViewer(out PlayerControllerB danger, out float align) { //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) danger = null; align = 0f; PlayerControllerB[] allPlayerScripts = RoundManager.Instance.playersManager.allPlayerScripts; foreach (PlayerControllerB val in allPlayerScripts) { if (!((Object)(object)val == (Object)null) && val.isPlayerControlled && !val.isPlayerDead && !OccludedFromPlayer_Multi(((Component)this).transform.position, val)) { Vector3 val2 = ((Component)this).transform.position - ((Component)val).transform.position; Vector3 normalized = ((Vector3)(ref val2)).normalized; float num = Mathf.Max(0f, Vector3.Dot(((Component)val).transform.forward, normalized)); if (num > align) { align = num; danger = val; } } } return (Object)(object)danger != (Object)null; } private bool ReachedGoal(Vector3 goal) { //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_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) if (goal == Vector3.zero) { return false; } return Vector3.Distance(((Component)this).transform.position, goal) <= goalArrivalTol; } private bool PathBadOrPartial() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Invalid comparison between Unknown and I4 //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Invalid comparison between Unknown and I4 return (int)base.agent.pathStatus == 1 || (int)base.agent.pathStatus == 2; } private bool CooldownsAllowRepath() { if (Time.time - stickyPickedAt < goalMinLockSeconds) { return false; } if (Time.time - stickyPickedAt < goalRepathCooldown) { return false; } return true; } private void ApplyStickyDestination(Vector3 goal) { //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_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0030: 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_0028: Unknown result type (might be due to invalid IL or missing references) if (!(goal == Vector3.zero)) { if (stickyGoal != goal) { base.agent.SetDestination(goal); } stickyGoal = goal; usingCustomGoal = true; base.movingTowardsTargetPlayer = false; } } public void DistanceBasedPace(PlayerControllerB ply) { //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_0095: 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_003d: Unknown result type (might be due to invalid IL or missing references) if (ply.isSprinting) { base.agent.speed = 8.2f * Plugin.moaiGlobalSpeed.Value * Math.Max(1f, 16f / Vector3.Distance(((Component)this).transform.position, ((Component)ply).transform.position) * 0.5f + 1f); } else { base.agent.speed = 6f * Plugin.moaiGlobalSpeed.Value * Math.Max(1f, 16f / Vector3.Distance(((Component)this).transform.position, ((Component)ply).transform.position) * 0.5f + 1f); } } public Vector3 chooseTravelGoal(out float outScore) { //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_06ea: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Unknown result type (might be due to invalid IL or missing references) //IL_0257: Unknown result type (might be due to invalid IL or missing references) //IL_0282: Unknown result type (might be due to invalid IL or missing references) //IL_0284: Unknown result type (might be due to invalid IL or missing references) //IL_0143: Unknown result type (might be due to invalid IL or missing references) //IL_014f: Unknown result type (might be due to invalid IL or missing references) //IL_0154: Unknown result type (might be due to invalid IL or missing references) //IL_0159: Unknown result type (might be due to invalid IL or missing references) //IL_016d: Unknown result type (might be due to invalid IL or missing references) //IL_0174: Unknown result type (might be due to invalid IL or missing references) //IL_017e: Unknown result type (might be due to invalid IL or missing references) //IL_0183: Unknown result type (might be due to invalid IL or missing references) //IL_0188: Unknown result type (might be due to invalid IL or missing references) //IL_018d: Unknown result type (might be due to invalid IL or missing references) //IL_028f: 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_01b9: Unknown result type (might be due to invalid IL or missing references) //IL_01bb: Unknown result type (might be due to invalid IL or missing references) //IL_0201: Unknown result type (might be due to invalid IL or missing references) //IL_0208: Unknown result type (might be due to invalid IL or missing references) //IL_0212: Unknown result type (might be due to invalid IL or missing references) //IL_0217: Unknown result type (might be due to invalid IL or missing references) //IL_021c: Unknown result type (might be due to invalid IL or missing references) //IL_021f: Unknown result type (might be due to invalid IL or missing references) //IL_01f2: Unknown result type (might be due to invalid IL or missing references) //IL_01f4: Unknown result type (might be due to invalid IL or missing references) //IL_02f0: Unknown result type (might be due to invalid IL or missing references) //IL_02f1: Unknown result type (might be due to invalid IL or missing references) //IL_02f4: Unknown result type (might be due to invalid IL or missing references) //IL_02f9: Unknown result type (might be due to invalid IL or missing references) //IL_0305: Unknown result type (might be due to invalid IL or missing references) //IL_0306: Unknown result type (might be due to invalid IL or missing references) //IL_0309: Unknown result type (might be due to invalid IL or missing references) //IL_030e: Unknown result type (might be due to invalid IL or missing references) //IL_031a: Unknown result type (might be due to invalid IL or missing references) //IL_031b: Unknown result type (might be due to invalid IL or missing references) //IL_031e: Unknown result type (might be due to invalid IL or missing references) //IL_0323: Unknown result type (might be due to invalid IL or missing references) //IL_0328: Unknown result type (might be due to invalid IL or missing references) //IL_0332: Unknown result type (might be due to invalid IL or missing references) //IL_0337: Unknown result type (might be due to invalid IL or missing references) //IL_0343: Unknown result type (might be due to invalid IL or missing references) //IL_0344: Unknown result type (might be due to invalid IL or missing references) //IL_0347: Unknown result type (might be due to invalid IL or missing references) //IL_034c: Unknown result type (might be due to invalid IL or missing references) //IL_0351: Unknown result type (might be due to invalid IL or missing references) //IL_035b: Unknown result type (might be due to invalid IL or missing references) //IL_0360: Unknown result type (might be due to invalid IL or missing references) //IL_036c: Unknown result type (might be due to invalid IL or missing references) //IL_0372: Unknown result type (might be due to invalid IL or missing references) //IL_0377: Unknown result type (might be due to invalid IL or missing references) //IL_037c: Unknown result type (might be due to invalid IL or missing references) //IL_037d: Unknown result type (might be due to invalid IL or missing references) //IL_0382: Unknown result type (might be due to invalid IL or missing references) //IL_0389: Unknown result type (might be due to invalid IL or missing references) //IL_038e: Unknown result type (might be due to invalid IL or missing references) //IL_039a: Unknown result type (might be due to invalid IL or missing references) //IL_03a0: Unknown result type (might be due to invalid IL or missing references) //IL_03a5: Unknown result type (might be due to invalid IL or missing references) //IL_03aa: Unknown result type (might be due to invalid IL or missing references) //IL_03ab: Unknown result type (might be due to invalid IL or missing references) //IL_03b0: Unknown result type (might be due to invalid IL or missing references) //IL_03b7: Unknown result type (might be due to invalid IL or missing references) //IL_03bc: Unknown result type (might be due to invalid IL or missing references) //IL_03c8: Unknown result type (might be due to invalid IL or missing references) //IL_03c9: Unknown result type (might be due to invalid IL or missing references) //IL_03d2: Unknown result type (might be due to invalid IL or missing references) //IL_03d7: Unknown result type (might be due to invalid IL or missing references) //IL_03e3: Unknown result type (might be due to invalid IL or missing references) //IL_03e4: Unknown result type (might be due to invalid IL or missing references) //IL_03ed: Unknown result type (might be due to invalid IL or missing references) //IL_03f2: Unknown result type (might be due to invalid IL or missing references) //IL_02bd: Unknown result type (might be due to invalid IL or missing references) //IL_02bf: Unknown result type (might be due to invalid IL or missing references) //IL_0247: Unknown result type (might be due to invalid IL or missing references) //IL_0249: Unknown result type (might be due to invalid IL or missing references) //IL_0414: Unknown result type (might be due to invalid IL or missing references) //IL_043c: Unknown result type (might be due to invalid IL or missing references) //IL_0441: Unknown result type (might be due to invalid IL or missing references) //IL_0470: Unknown result type (might be due to invalid IL or missing references) //IL_0475: Unknown result type (might be due to invalid IL or missing references) //IL_0488: Unknown result type (might be due to invalid IL or missing references) //IL_048d: Unknown result type (might be due to invalid IL or missing references) //IL_0491: Unknown result type (might be due to invalid IL or missing references) //IL_04ab: Unknown result type (might be due to invalid IL or missing references) //IL_04ad: Unknown result type (might be due to invalid IL or missing references) //IL_04ae: Unknown result type (might be due to invalid IL or missing references) //IL_04b3: Unknown result type (might be due to invalid IL or missing references) //IL_04b7: Unknown result type (might be due to invalid IL or missing references) //IL_04bc: Unknown result type (might be due to invalid IL or missing references) //IL_04be: Unknown result type (might be due to invalid IL or missing references) //IL_04bf: Unknown result type (might be due to invalid IL or missing references) //IL_06e4: Unknown result type (might be due to invalid IL or missing references) //IL_06e6: Unknown result type (might be due to invalid IL or missing references) //IL_062c: Unknown result type (might be due to invalid IL or missing references) //IL_0633: Unknown result type (might be due to invalid IL or missing references) //IL_0638: Unknown result type (might be due to invalid IL or missing references) //IL_063d: Unknown result type (might be due to invalid IL or missing references) //IL_04df: Unknown result type (might be due to invalid IL or missing references) //IL_04e1: Unknown result type (might be due to invalid IL or missing references) //IL_0504: Unknown result type (might be due to invalid IL or missing references) //IL_067e: Unknown result type (might be due to invalid IL or missing references) //IL_0683: Unknown result type (might be due to invalid IL or missing references) //IL_068a: Unknown result type (might be due to invalid IL or missing references) //IL_068f: Unknown result type (might be due to invalid IL or missing references) //IL_0699: Unknown result type (might be due to invalid IL or missing references) //IL_069e: Unknown result type (might be due to invalid IL or missing references) //IL_06a7: Unknown result type (might be due to invalid IL or missing references) //IL_06ac: Unknown result type (might be due to invalid IL or missing references) //IL_06ae: Unknown result type (might be due to invalid IL or missing references) //IL_055f: Unknown result type (might be due to invalid IL or missing references) //IL_0564: Unknown result type (might be due to invalid IL or missing references) //IL_0582: Unknown result type (might be due to invalid IL or missing references) //IL_0584: Unknown result type (might be due to invalid IL or missing references) //IL_06cf: Unknown result type (might be due to invalid IL or missing references) //IL_06d4: Unknown result type (might be due to invalid IL or missing references) //IL_05f6: Unknown result type (might be due to invalid IL or missing references) //IL_05f8: Unknown result type (might be due to invalid IL or missing references) outScore = float.NegativeInfinity; PlayerControllerB val = (((Object)(object)base.targetPlayer != (Object)null && ((EnemyAI)this).PlayerIsTargetable(base.targetPlayer, false, false)) ? base.targetPlayer : getNearestPlayer()); if ((Object)(object)val == (Object)null) { Think("chooseTravelGoal: no valid player — staying put."); return ((Component)this).transform.position; } DistanceBasedPace(val); if (alertLevel >= sneakyAlertLevel) { DistanceBasedPace(val); return ((Component)getNearestPlayer()).transform.position; } bool flag = alertLevel < sneakyAlertLevel; Vector3 position = ((Component)val).transform.position; Vector3 forward = ((Component)val).transform.forward; Vector3 right = ((Component)val).transform.right; if (flag && spottedCooldown <= 0f && TryGetMostDangerousViewer(out var danger, out var align)) { float num = Vector3.Distance(((Component)this).transform.position, ((Component)danger).transform.position); if (align >= 0.6f && num <= 20f) { Vector3 val2 = ((Component)this).transform.position - ((Component)danger).transform.position; val2.y = 0f; Vector3 val3 = ((Component)this).transform.position + ((Vector3)(ref val2)).normalized * 8f; if (TryFindCoverAgainstPlayer(danger, val3, 16f, 1.2f, out var coverPos)) { spottedCooldown = 3f; outScore = 5f; return coverPos; } if (TryFindGroupCover(val3, 8f, 16f, 3, 16, out var best)) { spottedCooldown = 3f; outScore = 4f; return best; } Vector3 pos = ((Component)this).transform.position + ((Vector3)(ref val2)).normalized * 6f; if (TrySampleNavmesh(pos, 3f, out var hitPos)) { spottedCooldown = 2f; outScore = 2f; return hitPos; } } } if (flag && TryFindCoverAgainstPlayer(val, position, 18f, 1.1f, out var coverPos2)) { outScore = 3.5f; DistanceBasedPace(val); return coverPos2; } if (flag && TryFindGroupCover(position, 1.1f, 14f, 3, 16, out var best2)) { outScore = 3f; DistanceBasedPace(val); return best2; } float num2 = 7.5f; float num3 = 11f; float num4 = 9f; float num5 = 0f; float maxDist = 6f; List<Vector3> list = new List<Vector3>(8) { position - forward * num2, position - forward * num3, position - forward * num4 + right * (num4 * 0.75f), position - forward * num4 - right * (num4 * 0.75f), position + Quaternion.AngleAxis(35f, Vector3.up) * -forward * num5, position + Quaternion.AngleAxis(-35f, Vector3.up) * -forward * num5, position - forward * (num5 * 0.6f), position - forward * (num5 * 1.3f) }; for (int i = 0; i < list.Count; i++) { List<Vector3> list2 = list; int index = i; list2[index] += new Vector3(Random.Range(-0.75f, 0.75f), 0f, Random.Range(-0.75f, 0.75f)); } float num6 = float.NegativeInfinity; Vector3 hitPos2 = ((Component)this).transform.position; foreach (Vector3 item in list) { if (TrySampleNavmesh(item, maxDist, out var hitPos3)) { Vector3 val4 = hitPos3 - position; Vector3 normalized = ((Vector3)(ref val4)).normalized; float num7 = Mathf.Clamp01(0f - Vector3.Dot(forward, normalized)); float num8 = (flag ? 9.5f : 6.5f); float num9 = Vector3.Distance(hitPos3, position); float num10 = 1f - Mathf.Clamp01(Mathf.Abs(num9 - num8) / num8); float num11 = CoverScoreAllPlayers(hitPos3); float num12 = (flag ? num11 : Mathf.Max(num11, -0.4f)); bool flag2 = num11 <= 0.1f; if (Time.time - lastSeenTime < seenGrace && flag2) { num12 -= 1.2f; } float num13 = Vector3.Distance(((Component)this).transform.position, hitPos3); float num14 = 1f - Mathf.Clamp01(num13 / 30f); float num15 = Mathf.Abs(Vector3.Dot(normalized, right)); float num16 = (flag ? (0.15f * num15) : (0.35f * num15)); float num17 = (flag ? 1f : 0.6f); float num18 = num17 * num7 + 1f * num10 + 1.2f * num12 + 0.3f * num14 + 0.4f * num16; if (num18 > num6) { num6 = num18; hitPos2 = hitPos3; } } } if (num6 == float.NegativeInfinity) { Vector3 val5 = position - ((Component)this).transform.position; val5.y = 0f; if (((Vector3)(ref val5)).sqrMagnitude > 0.01f) { val5 = Quaternion.AngleAxis(20f * ((Random.value > 0.5f) ? 1f : (-1f)), Vector3.up) * ((Vector3)(ref val5)).normalized * 4f; if (!TrySampleNavmesh(((Component)this).transform.position + val5, 6f, out hitPos2)) { hitPos2 = ((Component)this).transform.position; } } } DistanceBasedPace(val); outScore = num6; return hitPos2; } private bool TrySampleNavmesh(Vector3 pos, float maxDist, out Vector3 hitPos, int areaMask = -1) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) NavMeshHit val = default(NavMeshHit); if (NavMesh.SamplePosition(pos, ref val, maxDist, areaMask)) { hitPos = ((NavMeshHit)(ref val)).position; return true; } hitPos = Vector3.zero; return false; } private IEnumerable<PlayerControllerB> AllActivePlayers() { PlayerControllerB[] arr = RoundManager.Instance.playersManager.allPlayerScripts; foreach (PlayerControllerB p in arr) { if ((Object)(object)p != (Object)null && p.isPlayerControlled && !p.isPlayerDead) { yield return p; } } } private bool PlayerHasLOSTo(Vector3 candidatePos, PlayerControllerB ply, LayerMask mask, float raise = 1.4f) { //IL_003b: 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_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0040: 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_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_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_0058: Unknown result type (might be due to invalid IL or missing references) Vector3 val = (((Object)(object)ply.playerEye != (Object)null) ? ((Component)ply.playerEye).transform.position : (((Component)ply).transform.position + Vector3.up * 1.6f)); Vector3 val2 = candidatePos + Vector3.up * raise; RaycastHit val3 = default(RaycastHit); return !Physics.Linecast(val, val2, ref val3, LayerMask.op_Implicit(mask), (QueryTriggerInteraction)1); } private bool IsVisibleToAnyPlayers(Vector3 pos) { //IL_003b: Unknown result type (might be due to invalid IL or missing references) PlayerControllerB[] allPlayerScripts = RoundManager.Instance.playersManager.allPlayerScripts; foreach (PlayerControllerB val in allPlayerScripts) { if (!((Object)(object)val == (Object)null) && val.isPlayerControlled && !val.isPlayerDead && !OccludedFromPlayer_Multi(pos, val)) { return true; } } return false; } private bool IsOccludedFromAllPlayers(Vector3 pos) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return !IsVisibleToAnyPlayers(pos); } private Vector3[] BuildPointsForCandidate(Vector3 candidatePos, PlayerControllerB ply) { //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_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0050: 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_005f: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_002f: 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_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_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_0089: 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_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: 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_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_0122: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_0127: Unknown result type (might be due to invalid IL or missing references) //IL_0151: Unknown result type (might be due to invalid IL or missing references) //IL_0144: 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_0180: 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_0185: 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_01a3: Unknown result type (might be due to invalid IL or missing references) //IL_01b5: Unknown result type (might be due to invalid IL or missing references) //IL_01e0: Unknown result type (might be due to invalid IL or missing references) //IL_01d3: Unknown result type (might be due to invalid IL or missing references) //IL_01e5: 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_01f3: Unknown result type (might be due to invalid IL or missing references) //IL_01f8: Unknown result type (might be due to invalid IL or missing references) //IL_01ff: Unknown result type (might be due to invalid IL or missing references) //IL_0202: Unknown result type (might be due to invalid IL or missing references) //IL_0207: Unknown result type (might be due to invalid IL or missing references) //IL_020e: Unknown result type (might be due to invalid IL or missing references) //IL_0212: Unknown result type (might be due to invalid IL or missing references) //IL_0217: Unknown result type (might be due to invalid IL or missing references) //IL_021e: Unknown result type (might be due to invalid IL or missing references) //IL_0222: Unknown result type (might be due to invalid IL or missing references) //IL_0227: Unknown result type (might be due to invalid IL or missing references) //IL_022e: Unknown result type (might be due to invalid IL or missing references) //IL_0232: Unknown result type (might be due to invalid IL or missing references) //IL_0237: Unknown result type (might be due to invalid IL or missing references) Vector3 val = (((Object)(object)ply != (Object)null && (Object)(object)ply.playerEye != (Object)null) ? ((Component)ply.playerEye).transform.position : (((Object)(object)ply != (Object)null) ? (((Component)ply).transform.position + Vector3.up * 1.6f) : (candidatePos + Vector3.up * 1.6f))); Vector3 val2 = candidatePos - val; Vector3 fwd = ((Vector3)(ref val2)).normalized; if (((Vector3)(ref fwd)).sqrMagnitude < 0.0001f) { fwd = Vector3.forward; } val2 = Vector3.Cross(Vector3.up, fwd); Vector3 right = ((Vector3)(ref val2)).normalized; val2 = Vector3.Cross(fwd, right); Vector3 up = ((Vector3)(ref val2)).normalized; Vector3 lp2 = (Vector3)(Object.op_Implicit((Object)(object)footLCol) ? footLCol.localPosition : new Vector3(-0.25f, 0.1f, 0f)); Vector3 lp3 = (Vector3)(Object.op_Implicit((Object)(object)footRCol) ? footRCol.localPosition : new Vector3(0.25f, 0.1f, 0f)); Vector3 lp4 = (Vector3)(Object.op_Implicit((Object)(object)armLCol) ? armLCol.localPosition : new Vector3(-0.45f, 1.2f, 0f)); Vector3 lp5 = (Vector3)(Object.op_Implicit((Object)(object)armRCol) ? armRCol.localPosition : new Vector3(0.45f, 1.2f, 0f)); Vector3 lp6 = (Vector3)(Object.op_Implicit((Object)(object)headCol) ? headCol.localPosition : new Vector3(0f, 1.7f, 0f)); return (Vector3[])(object)new Vector3[5] { ToWorld(lp2), ToWorld(lp3), ToWorld(lp4), ToWorld(lp5), ToWorld(lp6) }; Vector3 ToWorld(Vector3 lp) { //IL_0001: 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_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_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_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_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) return candidatePos + right * lp.x + up * lp.y + fwd * lp.z; } } private bool OccludedFromPlayer_Multi(Vector3 candidatePos, PlayerControllerB ply) { //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_002f: 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_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0067: 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) if ((Object)(object)ply == (Object)null) { return true; } Vector3 val = (((Object)(object)ply.playerEye != (Object)null) ? ((Component)ply.playerEye).transform.position : (((Component)ply).transform.position + Vector3.up * 1.6f)); Vector3[] array = BuildPointsForCandidate(candidatePos, ply); int num = 0; for (int i = 0; i < array.Length; i++) { if (Physics.Linecast(val, array[i], LayerMask.op_Implicit(WorldMask), (QueryTriggerInteraction)1)) { num++; } } float num2 = (float)num / (float)array.Length; return num2 >= coverRequiredFraction; } public void baseClosingDistance() { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_0171: Unknown result type (might be due to invalid IL or missing references) //IL_0151: 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_01b2: Unknown result type (might be due to invalid IL or missing references) //IL_0231: Unknown result type (might be due to invalid IL or missing references) //IL_023c: Unknown result type (might be due to invalid IL or missing references) //IL_02e9: Unknown result type (might be due to invalid IL or missing references) //IL_02ee: Unknown result type (might be due to invalid IL or missing references) //IL_02a1: Unknown result type (might be due to invalid IL or missing references) //IL_02a6: Unknown result type (might be due to invalid IL or missing references) //IL_0300: Unknown result type (might be due to invalid IL or missing references) //IL_0306: Unknown result type (might be due to invalid IL or missing references) //IL_02b8: Unknown result type (might be due to invalid IL or missing references) //IL_02be: Unknown result type (might be due to invalid IL or missing references) //IL_031e: Unknown result type (might be due to invalid IL or missing references) //IL_0323: Unknown result type (might be due to invalid IL or missing references) //IL_02d8: Unknown result type (might be due to invalid IL or missing references) //IL_036b: Unknown result type (might be due to invalid IL or missing references) //IL_039a: Unknown result type (might be due to invalid IL or missing references) //IL_039f: Unknown result type (might be due to invalid IL or missing references) //IL_03cc: Unknown result type (might be due to invalid IL or missing references) //IL_03d1: Unknown result type (might be due to invalid IL or missing references) //IL_03e7: Unknown result type (might be due to invalid IL or missing references) //IL_04ac: Unknown result type (might be due to invalid IL or missing references) //IL_04b1: Unknown result type (might be due to invalid IL or missing references) //IL_04c3: Unknown result type (might be due to invalid IL or missing references) //IL_04c9: Unknown result type (might be due to invalid IL or missing references) //IL_04e3: Unknown result type (might be due to invalid IL or missing references) //IL_0439: Unknown result type (might be due to invalid IL or missing references) //IL_0504: Unknown result type (might be due to invalid IL or missing references) //IL_050f: Unknown result type (might be due to invalid IL or missing references) //IL_047d: Unknown result type (might be due to invalid IL or missing references) //IL_0588: Unknown result type (might be due to invalid IL or missing references) //IL_058d: Unknown result type (might be due to invalid IL or missing references) lookStep(); base.agent.speed = 6f * Plugin.moaiGlobalSpeed.Value; Vector3 velocity = base.agent.velocity; if (((Vector3)(ref velocity)).magnitude > base.agent.speed / 4f) { if (((NetworkBehaviour)RoundManager.Instance).IsServer) { DoAnimationClientRpc(1); } velocity = base.agent.velocity; setAnimationSpeedClientRpc(((Vector3)(ref velocity)).magnitude / walkAnimationCoefficient); } else { velocity = base.agent.velocity; if (((Vector3)(ref velocity)).magnitude <= base.agent.speed / 8f) { if (((NetworkBehaviour)RoundManager.Instance).IsServer) { DoAnimationClientRpc(0); } setAnimationSpeedClientRpc(1f); } } PlayerControllerB val = (((Object)(object)base.targetPlayer != (Object)null && ((EnemyAI)this).PlayerIsTargetable(base.targetPlayer, false, false)) ? base.targetPlayer : getNearestPlayer()); if ((Object)(object)val == (Object)null || (Object)(object)getNearestPlayer() == (Object)null) { Think("No valid player; switching to Search."); usingCustomGoal = false; ((EnemyAI)this).StartSearch(((Component)this).transform.position, (AISearchRoutine)null); ((EnemyAI)this).SwitchToBehaviourClientRpc(0); return; } bool flag = IsVisibleToAnyPlayers(((Component)this).transform.position); if (flag) { lastSeenTime = Time.time; } if (alertLevel >= 70f && (double)Vector3.Distance(((Component)getNearestPlayer()).transform.position, ((Component)this).transform.position) < (double)maxLeapDistance / 1.5) { ((EnemyAI)this).SwitchToBehaviourClientRpc(2); crouchTimer = (float)(0.5 + enemyRandom.NextDouble() * 1.5); crouchTimeout = 7f; return; } if (alertLevel <= 70f && Vector3.Distance(((Component)getNearestPlayer()).transform.position, ((Component)this).transform.position) < maxStabDistance) { doneStab = false; isStabbing = false; ((EnemyAI)this).SwitchToBehaviourClientRpc(8); return; } if (!flag && Time.time < coverLockUntil) { usingCustomGoal = true; base.movingTowardsTargetPlayer = false; if (stickyGoal != Vector3.zero && base.agent.destination != stickyGoal) { base.agent.SetDestination(stickyGoal); } return; } float num = ((stickyGoal == Vector3.zero) ? 9999f : Vector3.Distance(((Component)this).transform.position, stickyGoal)); velocity = base.agent.velocity; float magnitude = ((Vector3)(ref velocity)).magnitude; if (magnitude < stuckSpeedThresh && num > goalArrivalTol) { stuckTimer += Time.deltaTime; } else { stuckTimer = 0f; } bool flag2 = ReachedGoal(stickyGoal); bool flag3 = stuckTimer >= stuckSeconds; bool flag4 = flag2 || flag3 || PathBadOrPartial() || stickyGoal == Vector3.zero; if (flag4 || CooldownsAllowRepath()) { float outScore; Vector3 val2 = chooseTravelGoal(out outScore); bool flag5 = outScore > stickyScore + goalBetterBy; if (IsVisibleToAnyPlayers(val2) && Time.time - lastSeenTime < seenGrace) { flag5 = outScore > stickyScore + (goalBetterBy + 1f); } if (flag4 || flag5) { if (IsOccludedFromAllPlayers(val2)) { coverLockUntil = Time.time + coverDwellSeconds; } else { coverLockUntil = -999f; } stickyScore = outScore; stickyPickedAt = Time.time; ApplyStickyDestination(val2); } else { usingCustomGoal = true; base.movingTowardsTargetPlayer = false; } } else { usingCustomGoal = true; base.movingTowardsTargetPlayer = false; } if (stickyGoal != Vector3.zero && base.agent.destination != stickyGoal) { base.agent.SetDestination(stickyGoal); } lastGoalDist = num; if ((Object)(object)val == (Object)null || Vector3.Distance(((Component)this).transform.position, ((Component)val).transform.position) > 62f || stamina <= 0f) { Think("Exiting sneak (reason=" + (((Object)(object)val == (Object)null) ? "no target" : ((stamina <= 0f) ? "tired" : "too far")) + ")"); base.targetPlayer = null; usingCustomGoal = false; stickyGoal = Vector3.zero; stickyScore = float.NegativeInfinity; ((EnemyAI)this).SwitchToBehaviourClientRpc(0); } } public void lookStep() { //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) PlayerControllerB[] allPlayerScripts = RoundManager.Instance.playersManager.allPlayerScripts; float num = 0f; PlayerControllerB[] array = allPlayerScripts; foreach (PlayerControllerB val in array) { if (!((Object)(object)val == (Object)null) && !val.isPlaye