using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using GameNetcodeStuff; using LethalLib.Modules; using Microsoft.CodeAnalysis; using SpinerVisual.NetcodePatcher; using Unity.Netcode; using UnityEngine; using UnityEngine.AI; using UnityEngine.InputSystem; [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("SpinerVisual")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("SpinerVisual")] [assembly: AssemblyTitle("SpinerVisual")] [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.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace Spiner { public class SpinerAI : EnemyAI, INoiseListener { public enum SpinerEvent { None, Kidnap, Death, Creep, Detection, Transport, Spin, Roam, Runaway } private enum State { Runaway, Patrol, Stalking, Kidnapping, Transport } [CompilerGenerated] private sealed class d__130 : IEnumerator, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public SpinerAI <>4__this; object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public d__130(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = (object)new WaitForSeconds(5f); <>1__state = 1; return true; case 1: <>1__state = -1; <>4__this.ChangeState(State.Patrol); return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [SerializeField] private AudioSource walkAudioSource = null; [SerializeField] private AudioSource sfxAudioSource = null; [SerializeField] private AudioClip kidnappingSound = null; [SerializeField] private AudioClip moveSound = null; [SerializeField] private AudioClip creepSound = null; [SerializeField] private AudioClip transportSound = null; [SerializeField] private AudioClip runawaySound = null; [SerializeField] private AudioClip detectionSound = null; [SerializeField] private AudioClip deathSound = null; [SerializeField] private AudioClip roamingSound = null; [SerializeField] private AudioClip roamingSound2 = null; [SerializeField] private AudioClip roamingSound3 = null; [SerializeField] private AudioClip quackKidnappingSound = null; [SerializeField] private AudioClip quackMoveSound = null; [SerializeField] private AudioClip quackCreepSound = null; [SerializeField] private AudioClip quackTransportSound = null; [SerializeField] private AudioClip quackRunawaySound = null; [SerializeField] private AudioClip quackDetectionSound = null; [SerializeField] private AudioClip quackDeathSound = null; [SerializeField] private AudioClip quackRoamingSound = null; [SerializeField] private AudioClip quackRoamingSound2 = null; [SerializeField] private AudioClip quackRoamingSound3 = null; private AudioClip currentKidnappingSound = null; private AudioClip currentMoveSound = null; private AudioClip currentCreepSound = null; private AudioClip currentTransportSound = null; private AudioClip currentRunawaySound = null; private AudioClip currentDetectionSound = null; private AudioClip currentDeathSound = null; private AudioClip currentRoamingSound = null; private AudioClip currentRoamingSound2 = null; private AudioClip currentRoamingSound3 = null; public string animStalk = "Stalk"; public string animWalk = "Walk"; public string animAttack = "Attack"; public string animGrab = "Grab"; public string animHurt = "Hurt"; public string animHurt2 = "Hurt2"; public string animHurt3 = "Hurt3"; public string animDeath = "Death"; public string animDeath2 = "Death2"; public string animSpin = "Spin"; public string animSpinTest = "Spintest"; private int spinerBehaviourStateIndex; [SerializeField] public Transform kidnapCarryPoint = null; private Random randomGenerator = new Random(); private bool isRunawayActive = false; private bool isPatrolActive = false; private bool isStalkingActive = false; private bool isKidnappingActive = false; private bool isTransportActive = false; private State previousState = State.Patrol; public float[] playerStealthMeters = new float[4]; public PlayerControllerB chasingPlayer = null; private int stalkingTargetId = -1; private int kidnappingTargetId = -1; private int transportingTargetId = -1; private Vector3 lastLoggedDestination = Vector3.zero; private bool overrideSpeed = false; private bool enableRpcLogging = true; private float transportReleaseTimer = 0f; private const float transportReleaseDelay = 15f; private bool hasReceivedDamageRecently = false; private bool isAvoidingThreat = false; private Vector3 currentAvoidPoint; private int hurtAnimIndex = 0; private Transform transportTargetNode; private float getPathToTransportNodeInterval; private int _cfgMaxHP; private float _cfgRoamVolume; private bool _cfgDarkMode; private float _cfgDarkReviveDelay; private float _cfgDarkKillTime; private bool _cfgApplied; private bool _cfgSoundStyle; private bool _feignDeathActive; private float _feignDeathTimer; private bool _phase2Lethal; private bool _killTimerActive; private float _kidnapKillTimer; private float stalkingMeter = 0f; private float stalkingMeterMax = 15f; private float stalkingMeterIncrement = 1f; private float stalkingMeterDecrement = 0.5f; private const float losCorridorOffset1 = 0.25f; private const float losCorridorOffset2 = 0.5f; private const float losLogInterval = 0.5f; private float _nextLosLogTime_ISee = 0f; private AudioClip _lastClip = null; private float _lastTime; private const float Phase2Pitch = 0.5f; private const float Phase2VolMult = 1f; private Vector3 _stuckLastPos; private float _stuckTimer; private float _stuckSampleT; private bool _stuckInit; [SerializeField] private float stuckSampleInterval = 0.25f; [SerializeField] private float stuckMinMoveDist = 0.5f; [SerializeField] private float stuckTimeToTrigger = 5f; private float nextLosAvgTime = 0f; private int losSum = 0; private int losCount = 0; private int losScore = 5; private bool stalkingMovementActive = false; private Vector3 stalkingMoveTarget = Vector3.zero; private int stalkingMoveMode = 0; private float _stalkMoveStartTime = 0f; private float _nextStalkMoveDbgTime = 0f; private const float stalkingMeterAbortThreshold = -3f; private float lastLoggedStalkingSecond = -1f; private float kidnappingTimeout = 5f; private float kidnappingTimer = 0f; private string _currentAnimState = ""; private bool _phase2AudioTintApplied = false; public override void OnNetworkSpawn() { ((NetworkBehaviour)this).OnNetworkSpawn(); _feignDeathActive = false; _killTimerActive = false; _phase2Lethal = false; _feignDeathTimer = 0f; _kidnapKillTimer = 0f; if (((NetworkBehaviour)this).IsServer) { string runtimeConfigJson = SpinerPlugin.GetRuntimeConfigJson(); ApplyRuntimeConfigClientRpc(runtimeConfigJson); _cfgMaxHP = SpinerPlugin.MaxHP.Value; _cfgRoamVolume = SpinerPlugin.RoamVolume.Value; _cfgDarkMode = SpinerPlugin.DarkMode.Value; _cfgDarkReviveDelay = SpinerPlugin.DarkReviveDelay.Value; _cfgDarkKillTime = SpinerPlugin.DarkKillTime.Value; _cfgSoundStyle = SpinerPlugin.SoundStyle.Value; _cfgApplied = true; ApplyLocalConfig(); } else { _cfgApplied = false; } } private void ApplyLocalConfig() { if (!_cfgApplied) { _cfgMaxHP = SpinerPlugin.MaxHP.Value; _cfgRoamVolume = SpinerPlugin.RoamVolume.Value; _cfgDarkMode = SpinerPlugin.DarkMode.Value; _cfgDarkReviveDelay = SpinerPlugin.DarkReviveDelay.Value; _cfgDarkKillTime = SpinerPlugin.DarkKillTime.Value; _cfgSoundStyle = SpinerPlugin.SoundStyle.Value; _cfgApplied = true; } base.enemyHP = _cfgMaxHP; ApplySoundStyle(); } public override void Start() { ((EnemyAI)this).Start(); if (!base.agent.isOnNavMesh) { LogCriticalReferences(); } if ((Object)(object)base.creatureAnimator == (Object)null) { base.creatureAnimator = ((Component)this).GetComponent(); if (!((Object)(object)base.creatureAnimator == (Object)null)) { } } playerStealthMeters = new float[StartOfRound.Instance.allPlayerScripts.Length]; randomGenerator = new Random(StartOfRound.Instance.randomMapSeed + base.thisEnemyIndex); spinerBehaviourStateIndex = 1; } public override void Update() { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_01af: Unknown result type (might be due to invalid IL or missing references) //IL_01b4: Unknown result type (might be due to invalid IL or missing references) //IL_01ce: 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) if (base.stunNormalizedTimer > 0f) { return; } if (base.agent.destination != lastLoggedDestination) { lastLoggedDestination = base.agent.destination; } ((EnemyAI)this).Update(); StuckSafeguardTick(); TickFeignDeath(); if (base.isEnemyDead) { return; } switch ((State)spinerBehaviourStateIndex) { case State.Runaway: if (previousState != 0) { previousState = State.Runaway; } break; case State.Patrol: { if (previousState != State.Patrol) { previousState = State.Patrol; } List allAlivePlayerObjects = GetAllAlivePlayerObjects(); GameObject val = ((EnemyAI)this).CheckLineOfSight(allAlivePlayerObjects, 45f, 50, 3f, base.eye, (int[])null); if (!((Object)(object)val != (Object)null)) { break; } PlayerControllerB component = val.GetComponent(); int num = Array.IndexOf(StartOfRound.Instance.allPlayerScripts, component); if (num >= 0) { if (((NetworkBehaviour)this).IsServer) { BeginSpinerStalkClientRpc(num); } else { BeginSpinerStalkServerRpc(num); } } break; } case State.Stalking: if (previousState != State.Stalking) { previousState = State.Stalking; } break; case State.Kidnapping: if (previousState != State.Kidnapping) { previousState = State.Kidnapping; } break; case State.Transport: if (previousState != State.Transport) { previousState = State.Transport; } break; } Vector3 velocity = base.agent.velocity; float magnitude = ((Vector3)(ref velocity)).magnitude; bool flag = magnitude > 0.5f; AnimatorStateInfo currentAnimatorStateInfo = base.creatureAnimator.GetCurrentAnimatorStateInfo(0); string text = (((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("walk") ? "walk" : "other"); bool flag2 = base.creatureAnimator.IsInTransition(0); SetAnimation(flag ? "Walk" : "Idle"); if (flag) { if (!walkAudioSource.isPlaying) { walkAudioSource.volume = 0.75f; walkAudioSource.Play(); } } else if (walkAudioSource.isPlaying) { walkAudioSource.Stop(); } } private List GetAllAlivePlayerObjects(PlayerControllerB? exclude = null) { List list = new List(); PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; foreach (PlayerControllerB val in allPlayerScripts) { if ((Object)(object)val != (Object)null && !val.isPlayerDead && (Object)(object)val != (Object)(object)exclude) { list.Add(((Component)val).gameObject); } } return list; } private List GetAllAliveEnemyObjects() { List list = new List(); EnemyAICollisionDetect[] array = Object.FindObjectsOfType(); foreach (EnemyAICollisionDetect val in array) { if ((Object)(object)val != (Object)null && (Object)(object)val.mainScript != (Object)null && (Object)(object)val.mainScript != (Object)(object)this && !val.mainScript.isEnemyDead) { list.Add(((Component)val).gameObject); } } return list; } private void ApplySoundStyle() { if (_cfgSoundStyle) { currentKidnappingSound = quackKidnappingSound; currentMoveSound = quackMoveSound; currentCreepSound = quackCreepSound; currentTransportSound = quackTransportSound; currentRunawaySound = quackRunawaySound; currentDetectionSound = quackDetectionSound; currentDeathSound = quackDeathSound; currentRoamingSound = quackRoamingSound; currentRoamingSound2 = quackRoamingSound2; currentRoamingSound3 = quackRoamingSound3; } else { currentKidnappingSound = kidnappingSound; currentMoveSound = moveSound; currentCreepSound = creepSound; currentTransportSound = transportSound; currentRunawaySound = runawaySound; currentDetectionSound = detectionSound; currentDeathSound = deathSound; currentRoamingSound = roamingSound; currentRoamingSound2 = roamingSound2; currentRoamingSound3 = roamingSound3; } } public override void DoAIInterval() { //IL_04ac: Unknown result type (might be due to invalid IL or missing references) //IL_04b2: Unknown result type (might be due to invalid IL or missing references) //IL_04d5: Unknown result type (might be due to invalid IL or missing references) //IL_04da: Unknown result type (might be due to invalid IL or missing references) //IL_0273: Unknown result type (might be due to invalid IL or missing references) //IL_0278: Unknown result type (might be due to invalid IL or missing references) //IL_027a: Unknown result type (might be due to invalid IL or missing references) //IL_0283: Unknown result type (might be due to invalid IL or missing references) //IL_0288: Unknown result type (might be due to invalid IL or missing references) //IL_028d: Unknown result type (might be due to invalid IL or missing references) //IL_0291: Unknown result type (might be due to invalid IL or missing references) //IL_0296: Unknown result type (might be due to invalid IL or missing references) //IL_04f3: Unknown result type (might be due to invalid IL or missing references) //IL_04fe: Unknown result type (might be due to invalid IL or missing references) //IL_0405: Unknown result type (might be due to invalid IL or missing references) //IL_0410: 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_02c4: Unknown result type (might be due to invalid IL or missing references) //IL_0521: Unknown result type (might be due to invalid IL or missing references) //IL_0433: Unknown result type (might be due to invalid IL or missing references) //IL_055d: Unknown result type (might be due to invalid IL or missing references) //IL_03ce: Unknown result type (might be due to invalid IL or missing references) //IL_03d0: 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_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_032a: Unknown result type (might be due to invalid IL or missing references) //IL_032f: Unknown result type (might be due to invalid IL or missing references) //IL_0331: Unknown result type (might be due to invalid IL or missing references) //IL_0333: 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_033c: Unknown result type (might be due to invalid IL or missing references) //IL_0341: 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_0487: Unknown result type (might be due to invalid IL or missing references) //IL_0359: Unknown result type (might be due to invalid IL or missing references) //IL_0360: Expected O, but got Unknown //IL_0360: Unknown result type (might be due to invalid IL or missing references) //IL_0364: Unknown result type (might be due to invalid IL or missing references) //IL_0375: Unknown result type (might be due to invalid IL or missing references) //IL_037b: Invalid comparison between Unknown and I4 //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) if (base.stunNormalizedTimer > 0f || base.isEnemyDead || StartOfRound.Instance.allPlayersDead) { return; } if (((NetworkBehaviour)this).IsServer && StartOfRound.Instance.shipIsLeaving && spinerBehaviourStateIndex != 0) { BeginSpinerRunawayServerRpc(); return; } if (((NetworkBehaviour)this).IsServer && hasReceivedDamageRecently && spinerBehaviourStateIndex != 0) { hasReceivedDamageRecently = false; BeginSpinerRunawayServerRpc(); } ((EnemyAI)this).DoAIInterval(); switch ((State)spinerBehaviourStateIndex) { case State.Patrol: if (!isPatrolActive) { StartPatrol(); } break; case State.Runaway: if (!isRunawayActive) { StartRunaway(); } break; case State.Stalking: if (!isStalkingActive) { if (stalkingTargetId != -1) { StartStalking(stalkingTargetId); } else { ChangeState(State.Patrol); } } else { LookAtPlayer(); StalkingBehavior(); } break; case State.Kidnapping: if (!isKidnappingActive) { if (kidnappingTargetId != -1) { StartKidnapping(kidnappingTargetId); } else { ChangeState(State.Patrol); } } else { PerformKidnapping(); } break; case State.Transport: { if (!isTransportActive) { if (transportingTargetId != -1) { StartTransport(transportingTargetId); } else { ChangeState(State.Patrol); } break; } PerformTransport(); if (spinerBehaviourStateIndex != 4 || !isTransportActive) { break; } List list = new List(); list.AddRange(GetAllAlivePlayerObjects(base.inSpecialAnimationWithPlayer)); list.AddRange(GetAllAliveEnemyObjects()); if (!isAvoidingThreat) { GameObject val = ((EnemyAI)this).CheckLineOfSight(list, 45f, 12, 2f, base.eye, (int[])null); if ((Object)(object)val != (Object)null) { Vector3 position = ((Component)this).transform.position; Vector3 val2 = position - val.transform.position; Vector3 normalized = ((Vector3)(ref val2)).normalized; normalized.y = 0f; if (((Vector3)(ref normalized)).sqrMagnitude > 0.01f) { bool flag = false; Vector3 val3 = Vector3.zero; float[] array = new float[5] { 5f, 7f, 9f, 11f, 13f }; float[] array2 = new float[9] { 0f, 20f, -20f, 40f, -40f, 60f, -60f, 90f, -90f }; float[] array3 = array; NavMeshHit val6 = default(NavMeshHit); foreach (float num in array3) { float[] array4 = array2; foreach (float num2 in array4) { Vector3 val4 = Quaternion.Euler(0f, num2, 0f) * normalized; Vector3 val5 = position + val4 * num; if (NavMesh.SamplePosition(val5, ref val6, 2.5f, -1)) { NavMeshPath val7 = new NavMeshPath(); if (NavMesh.CalculatePath(position, ((NavMeshHit)(ref val6)).position, -1, val7) && (int)val7.status == 0) { val3 = ((NavMeshHit)(ref val6)).position; flag = true; break; } } } if (flag) { break; } } if (flag) { currentAvoidPoint = val3; ((EnemyAI)this).SetDestinationToPosition(currentAvoidPoint, true); isAvoidingThreat = true; break; } } } if ((Object)(object)transportTargetNode == (Object)null || Vector3.Distance(((Component)this).transform.position, transportTargetNode.position) < 2f) { transportTargetNode = ((EnemyAI)this).ChooseFarthestNodeFromPosition(((Component)this).transform.position, false, 0, false, 50, false); } if ((Object)(object)transportTargetNode != (Object)null && Time.realtimeSinceStartup - getPathToTransportNodeInterval > 1f) { base.targetNode = transportTargetNode; ((EnemyAI)this).SetDestinationToPosition(transportTargetNode.position, true); getPathToTransportNodeInterval = Time.realtimeSinceStartup; } } else if (Vector3.Distance(((Component)this).transform.position, currentAvoidPoint) < 2f) { isAvoidingThreat = false; currentAvoidPoint = Vector3.zero; if ((Object)(object)transportTargetNode == (Object)null || Vector3.Distance(((Component)this).transform.position, transportTargetNode.position) < 2f) { transportTargetNode = ((EnemyAI)this).ChooseFarthestNodeFromPosition(((Component)this).transform.position, false, 0, false, 50, false); } if ((Object)(object)transportTargetNode != (Object)null) { base.targetNode = transportTargetNode; ((EnemyAI)this).SetDestinationToPosition(transportTargetNode.position, true); getPathToTransportNodeInterval = Time.realtimeSinceStartup; } } break; } } } private void ResetAllFlags() { //IL_002c: 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_0061: Unknown result type (might be due to invalid IL or missing references) isRunawayActive = false; isPatrolActive = false; isStalkingActive = false; isKidnappingActive = false; isTransportActive = false; stalkingMovementActive = false; stalkingMoveTarget = Vector3.zero; stalkingMoveMode = 0; _stalkMoveStartTime = 0f; overrideSpeed = false; base.agent.ResetPath(); base.agent.velocity = Vector3.zero; base.agent.isStopped = false; base.moveTowardsDestination = false; base.movingTowardsTargetPlayer = false; transportReleaseTimer = 0f; } private void UpdateSpeed() { if (!overrideSpeed) { switch ((State)spinerBehaviourStateIndex) { case State.Patrol: base.agent.speed = 1f; break; case State.Runaway: base.agent.speed = 6f; break; case State.Stalking: base.agent.speed = 2f; break; case State.Kidnapping: base.agent.speed = 6f; break; case State.Transport: base.agent.speed = 4f; break; } } } private void ChangeState(State newState, int playerId = -1) { if (spinerBehaviourStateIndex != (int)newState) { if (newState == State.Runaway && (Object)(object)base.inSpecialAnimationWithPlayer != (Object)null) { RequestReleaseTransportServer(); } switch ((State)spinerBehaviourStateIndex) { case State.Runaway: StopRunaway(); break; case State.Patrol: StopPatrol(); break; case State.Stalking: StopStalking(); break; case State.Kidnapping: StopKidnapping(); break; case State.Transport: StopTransport(); break; } ResetAllFlags(); spinerBehaviourStateIndex = (int)newState; UpdateSpeed(); switch (newState) { case State.Patrol: TriggerFx(SpinerEvent.Roam); StartPatrol(); break; case State.Stalking: TriggerFx(SpinerEvent.Creep); StartStalking(playerId); break; case State.Kidnapping: TriggerFx(SpinerEvent.Kidnap); StartKidnapping(playerId); break; case State.Transport: TriggerFx(SpinerEvent.Transport); StartTransport(playerId); break; case State.Runaway: TriggerFx(SpinerEvent.Runaway); StartRunaway(); break; } } } private void LogRPC(string direction, string rpcName) { if (enableRpcLogging) { string message = "[RPC] " + direction + " ▶ " + rpcName + " | " + $"OwnerClientId={((NetworkBehaviour)this).OwnerClientId} | " + $"IsHost={((NetworkBehaviour)this).IsHost}, IsServer={((NetworkBehaviour)this).IsServer}, IsClient={((NetworkBehaviour)this).IsClient}, IsOwner={((NetworkBehaviour)this).IsOwner} | " + $"CurrentState={(State)spinerBehaviourStateIndex}"; SpinerPlugin.LogInfo(message); } } public override void HitEnemy(int force = 1, PlayerControllerB? playerWhoHit = null, bool playHitSFX = false, int hitID = -1) { ((EnemyAI)this).HitEnemy(force, playerWhoHit, playHitSFX, hitID); if (base.isEnemyDead) { return; } base.enemyHP -= force; if (base.enemyHP <= 0 && !base.isEnemyDead && ((NetworkBehaviour)this).IsOwner) { SpinerPlugin.LogInfo("[Combat] Enemy HP reached 0 → Killing enemy."); ((EnemyAI)this).KillEnemyOnOwnerClient(false); return; } if (!base.isEnemyDead) { string[] array = new string[3] { "Hurt", "Hurt2", "Hurt3" }; string animType = array[hurtAnimIndex]; SetAnimation(animType); hurtAnimIndex = (hurtAnimIndex + 1) % array.Length; } if (((NetworkBehaviour)this).IsServer) { hasReceivedDamageRecently = true; } } public override void KillEnemy(bool destroy = false) { ChangeState(State.Patrol); if (_cfgDarkMode && !_feignDeathActive && !_phase2Lethal && !destroy) { StartFeignDeath(); return; } RequestReleaseTransportServer(); ((EnemyAI)this).CancelSpecialAnimationWithPlayer(); ((EnemyAI)this).KillEnemy(false); SetAnimation("Death"); } private void StartFeignDeath() { base.isEnemyDead = true; _feignDeathActive = true; _feignDeathTimer = _cfgDarkReviveDelay; SetAnimation("Death"); TriggerFx(SpinerEvent.Death); ((Behaviour)base.agent).enabled = false; RequestReleaseTransportServer(); ((EnemyAI)this).CancelSpecialAnimationWithPlayer(); } private void TickFeignDeath() { //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Unknown result type (might be due to invalid IL or missing references) //IL_0107: 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_014b: Unknown result type (might be due to invalid IL or missing references) if (!_feignDeathActive) { return; } _feignDeathTimer -= Time.deltaTime; if (_feignDeathTimer > 0f) { return; } _feignDeathActive = false; _phase2Lethal = true; base.isEnemyDead = false; if ((Object)(object)base.agent != (Object)null) { ((Behaviour)base.agent).enabled = true; if (!base.agent.isOnNavMesh) { base.agent.Warp(((Component)this).transform.position); } } base.enemyHP = _cfgMaxHP; SetAnimation("Resurrect"); ChangeState(State.Runaway); Renderer[] componentsInChildren = ((Component)this).GetComponentsInChildren(); foreach (Renderer val in componentsInChildren) { if (val.material.HasProperty("_Color")) { val.material.color = Color.Lerp(val.material.color, Color.black, 0.7f); } if (val.material.HasProperty("_EmissionColor")) { val.material.SetColor("_EmissionColor", val.material.GetColor("_EmissionColor") * 0.5f); } } } private void StuckSafeguardTick() { //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_0180: Unknown result type (might be due to invalid IL or missing references) //IL_0186: Unknown result type (might be due to invalid IL or missing references) //IL_0198: Unknown result type (might be due to invalid IL or missing references) //IL_019d: 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_020a: Unknown result type (might be due to invalid IL or missing references) //IL_020b: Unknown result type (might be due to invalid IL or missing references) //IL_020d: Unknown result type (might be due to invalid IL or missing references) //IL_0230: Unknown result type (might be due to invalid IL or missing references) //IL_0224: Unknown result type (might be due to invalid IL or missing references) //IL_0229: Unknown result type (might be due to invalid IL or missing references) //IL_0253: 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_024c: Unknown result type (might be due to invalid IL or missing references) //IL_026a: Unknown result type (might be due to invalid IL or missing references) //IL_026f: Unknown result type (might be due to invalid IL or missing references) //IL_028e: Unknown result type (might be due to invalid IL or missing references) //IL_029d: Unknown result type (might be due to invalid IL or missing references) //IL_02a2: Unknown result type (might be due to invalid IL or missing references) //IL_02ae: Unknown result type (might be due to invalid IL or missing references) if (!((NetworkBehaviour)this).IsServer || (Object)(object)base.agent == (Object)null || !((Behaviour)base.agent).enabled || base.isEnemyDead || _feignDeathActive || base.stunNormalizedTimer > 0f) { return; } State state = (State)spinerBehaviourStateIndex; if (state == State.Transport || state == State.Kidnapping) { return; } if (!_stuckInit) { _stuckInit = true; _stuckLastPos = ((Component)this).transform.position; _stuckTimer = 0f; _stuckSampleT = 0f; return; } _stuckSampleT += Time.deltaTime; if (_stuckSampleT < stuckSampleInterval) { return; } _stuckSampleT = 0f; if (base.agent.isStopped || base.agent.pathPending || !base.agent.hasPath || base.agent.remainingDistance <= base.agent.stoppingDistance + 0.1f) { return; } float num = Vector3.Distance(((Component)this).transform.position, _stuckLastPos); _stuckLastPos = ((Component)this).transform.position; if (num >= stuckMinMoveDist) { _stuckTimer = 0f; return; } _stuckTimer += stuckSampleInterval; if (!(_stuckTimer < stuckTimeToTrigger)) { _stuckTimer = 0f; Vector3 position = ((Component)this).transform.position; bool flag = false; Vector3 val = position; NavMeshHit val2 = default(NavMeshHit); NavMeshHit val3 = default(NavMeshHit); NavMeshHit val4 = default(NavMeshHit); if (NavMesh.SamplePosition(position, ref val2, 6f, -1)) { val = ((NavMeshHit)(ref val2)).position; flag = true; } else if (NavMesh.SamplePosition(position, ref val3, 12f, -1)) { val = ((NavMeshHit)(ref val3)).position; flag = true; } else if (NavMesh.SamplePosition(position, ref val4, 20f, -1)) { val = ((NavMeshHit)(ref val4)).position; flag = true; } if (flag) { base.agent.ResetPath(); base.agent.Warp(val); _stuckLastPos = ((Component)this).transform.position; ((EnemyAI)this).StartSearch(((Component)this).transform.position, (AISearchRoutine)null); } } } private void RequestReleaseTransportServer() { //IL_00ad: 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_00b2: 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_00b4: 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_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: 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_00e9: 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_0135: Unknown result type (might be due to invalid IL or missing references) //IL_0136: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_014a: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Unknown result type (might be due to invalid IL or missing references) //IL_016c: 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_0115: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_012f: Unknown result type (might be due to invalid IL or missing references) //IL_0134: Unknown result type (might be due to invalid IL or missing references) SpinerPlugin.LogWarning("[RELEASE SERVER] RequestReleaseTransportServer called | " + $"IsServer={((NetworkBehaviour)this).IsServer} | playerId={transportingTargetId} | " + $"hasPlayer={(Object)(object)base.inSpecialAnimationWithPlayer != (Object)null}"); if (((NetworkBehaviour)this).IsServer && !((Object)(object)base.inSpecialAnimationWithPlayer == (Object)null) && transportingTargetId >= 0) { PlayerControllerB inSpecialAnimationWithPlayer = base.inSpecialAnimationWithPlayer; Vector3 val = (((Object)(object)kidnapCarryPoint != (Object)null) ? kidnapCarryPoint.position : ((Component)inSpecialAnimationWithPlayer).transform.position); Vector3 val2 = val; NavMeshHit val3 = default(NavMeshHit); NavMeshHit val4 = default(NavMeshHit); NavMeshHit val5 = default(NavMeshHit); NavMeshHit val6 = default(NavMeshHit); if (NavMesh.SamplePosition(val, ref val3, 4f, -1)) { val2 = ((NavMeshHit)(ref val3)).position; } else if (NavMesh.SamplePosition(val, ref val4, 8f, -1)) { val2 = ((NavMeshHit)(ref val4)).position; } else if (NavMesh.SamplePosition(val, ref val5, 16f, -1)) { val2 = ((NavMeshHit)(ref val5)).position; } else if (NavMesh.SamplePosition(((Component)this).transform.position, ref val6, 16f, -1)) { val2 = ((NavMeshHit)(ref val6)).position; } val2 += Vector3.up * 0.1f; SpinerPlugin.LogWarning($"[RELEASE SERVER] Safe position computed: {val2}"); int num = transportingTargetId; ApplyReleaseTransportLocal(num, val2); SpinerPlugin.LogWarning($"[RELEASE SERVER] Broadcasting release to clients for player {num}"); ForceReleaseTransportClientRpc(num, val2); } } private void ApplyReleaseTransportLocal(int playerId, Vector3 safePos) { //IL_00f0: Unknown result type (might be due to invalid IL or missing references) SpinerPlugin.LogWarning("[RELEASE APPLY] Applying local release | " + string.Format("Instance={0} | playerId={1}", ((NetworkBehaviour)this).IsServer ? "SERVER" : "CLIENT", playerId)); transportReleaseTimer = 0f; StopLethalTimer(); isTransportActive = false; transportingTargetId = -1; if (playerId < 0 || playerId >= StartOfRound.Instance.allPlayerScripts.Length) { base.inSpecialAnimationWithPlayer = null; kidnapCarryPoint = null; return; } PlayerControllerB val = StartOfRound.Instance.allPlayerScripts[playerId]; if ((Object)(object)val == (Object)null) { base.inSpecialAnimationWithPlayer = null; kidnapCarryPoint = null; return; } if ((Object)(object)((Component)val).transform.parent != (Object)null) { ((Component)val).transform.SetParent((Transform)null, true); } val.inSpecialInteractAnimation = false; val.inAnimationWithEnemy = null; val.snapToServerPosition = false; ((Component)val).transform.position = safePos; if ((Object)(object)val == (Object)(object)GameNetworkManager.Instance.localPlayerController) { InputAction val2 = IngamePlayerSettings.Instance.playerInput.actions.FindAction("Jump", false); if (val2 != null) { val2.Enable(); } } if ((Object)(object)base.inSpecialAnimationWithPlayer == (Object)(object)val) { base.inSpecialAnimationWithPlayer = null; } kidnapCarryPoint = null; } private void StartRunaway() { //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0085: 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_008f: 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_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) if (!isRunawayActive) { stalkingTargetId = -1; kidnappingTargetId = -1; transportingTargetId = -1; chasingPlayer = null; isRunawayActive = true; UpdateSpeed(); Transform val = ((EnemyAI)this).ChooseFarthestNodeFromPosition(((Component)this).transform.position, false, 0, false, 50, false); if ((Object)(object)val != (Object)null) { ((EnemyAI)this).SetDestinationToPosition(val.position, true); } else { Vector3 val2 = ((Component)this).transform.position + Random.insideUnitSphere * 10f; val2.y = ((Component)this).transform.position.y; ((EnemyAI)this).SetDestinationToPosition(val2, true); } ((MonoBehaviour)this).StartCoroutine(ExitRunawayAfterDelay()); } } private void StopRunaway() { if (isRunawayActive) { isRunawayActive = false; } } public void StartPatrol() { //IL_003e: Unknown result type (might be due to invalid IL or missing references) if (!isPatrolActive) { stalkingTargetId = -1; kidnappingTargetId = -1; transportingTargetId = -1; chasingPlayer = null; isPatrolActive = true; UpdateSpeed(); ((EnemyAI)this).StartSearch(((Component)this).transform.position, (AISearchRoutine)null); } } public void StopPatrol() { if (isPatrolActive) { ((EnemyAI)this).StopSearch(base.currentSearch, true); isPatrolActive = false; } } private void StartStalking(int playerId) { stalkingTargetId = playerId; if (!isStalkingActive) { isStalkingActive = true; chasingPlayer = StartOfRound.Instance.allPlayerScripts[playerId]; LookAtPlayer(); UpdateSpeed(); StalkingBehavior(); } } private void StopStalking() { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) if (isStalkingActive) { isStalkingActive = false; stalkingTargetId = -1; stalkingMoveMode = 0; stalkingMovementActive = false; stalkingMoveTarget = Vector3.zero; ResetRotation(); } } private void StartKidnapping(int playerId) { kidnappingTargetId = playerId; if (!isKidnappingActive) { SpinerPlugin.LogInfo("[Kidnapping] \ud83d\udea8 Entering Kidnapping mode!"); isKidnappingActive = true; UpdateSpeed(); PerformKidnapping(); } } private void StopKidnapping() { if (isKidnappingActive) { isKidnappingActive = false; } } private void StartTransport(int playerId) { //IL_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)base.inSpecialAnimationWithPlayer == (Object)null && playerId >= 0 && playerId < StartOfRound.Instance.allPlayerScripts.Length) { base.inSpecialAnimationWithPlayer = StartOfRound.Instance.allPlayerScripts[playerId]; } transportingTargetId = playerId; transportTargetNode = null; getPathToTransportNodeInterval = 0f; if (isTransportActive) { return; } isTransportActive = true; kidnapCarryPoint = ((Component)this).transform.Find("KidnapCarryPoint"); if ((Object)(object)base.inSpecialAnimationWithPlayer != (Object)null && (Object)(object)kidnapCarryPoint != (Object)null) { ((Component)base.inSpecialAnimationWithPlayer).transform.SetParent(kidnapCarryPoint); ((Component)base.inSpecialAnimationWithPlayer).transform.localPosition = Vector3.zero; ((Component)base.inSpecialAnimationWithPlayer).transform.localRotation = Quaternion.identity; base.inSpecialAnimationWithPlayer.inSpecialInteractAnimation = true; base.inSpecialAnimationWithPlayer.inAnimationWithEnemy = (EnemyAI)(object)this; base.inSpecialAnimationWithPlayer.snapToServerPosition = true; if ((Object)(object)base.inSpecialAnimationWithPlayer == (Object)(object)GameNetworkManager.Instance.localPlayerController) { InputAction val = IngamePlayerSettings.Instance.playerInput.actions.FindAction("Jump", false); if (val != null) { val.Disable(); } } } UpdateSpeed(); } private void StopTransport() { //IL_0031: 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) if (isTransportActive) { isTransportActive = false; transportTargetNode = null; getPathToTransportNodeInterval = 0f; isAvoidingThreat = false; currentAvoidPoint = Vector3.zero; ((EnemyAI)this).StopSearch(base.currentSearch, true); } } [IteratorStateMachine(typeof(d__130))] private IEnumerator ExitRunawayAfterDelay() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__130(0) { <>4__this = this }; } private void StalkingBehavior() { //IL_02e0: Unknown result type (might be due to invalid IL or missing references) //IL_020c: 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_015f: Unknown result type (might be due to invalid IL or missing references) //IL_023d: Unknown result type (might be due to invalid IL or missing references) //IL_035e: 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_031f: Unknown result type (might be due to invalid IL or missing references) //IL_0321: 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_01d6: Unknown result type (might be due to invalid IL or missing references) //IL_018f: Unknown result type (might be due to invalid IL or missing references) //IL_0194: Unknown result type (might be due to invalid IL or missing references) //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_0198: 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_034e: Unknown result type (might be due to invalid IL or missing references) //IL_033d: Unknown result type (might be due to invalid IL or missing references) //IL_01c4: Unknown result type (might be due to invalid IL or missing references) //IL_01c6: 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_02b4: Unknown result type (might be due to invalid IL or missing references) //IL_026d: Unknown result type (might be due to invalid IL or missing references) //IL_0272: Unknown result type (might be due to invalid IL or missing references) //IL_0274: Unknown result type (might be due to invalid IL or missing references) //IL_0276: Unknown result type (might be due to invalid IL or missing references) //IL_02a2: Unknown result type (might be due to invalid IL or missing references) //IL_02a4: Unknown result type (might be due to invalid IL or missing references) //IL_0290: Unknown result type (might be due to invalid IL or missing references) if (((NetworkBehaviour)this).IsServer && isStalkingActive && stalkingTargetId >= 0 && stalkingTargetId < StartOfRound.Instance.allPlayerScripts.Length) { PlayerControllerB val = StartOfRound.Instance.allPlayerScripts[stalkingTargetId]; if ((Object)(object)val == (Object)null || val.isPlayerDead || !((Component)val).gameObject.activeInHierarchy || !val.isInsideFactory) { BeginSpinerPatrolServerRpc(); return; } } int num = ISeeMyTarget(); bool flag = MyTargetSeesMe(); bool inLosThisFrame = num > 0; UpdateStalkingMeter(inLosThisFrame); losSum += num; losCount++; if (Time.time >= nextLosAvgTime) { nextLosAvgTime = Time.time + 0.5f; float num2 = ((losCount > 0) ? ((float)losSum / (float)losCount) : 0f); losScore = Mathf.Clamp(Mathf.RoundToInt(num2), 0, 5); losSum = 0; losCount = 0; } if (losScore == 0) { if (stalkingMovementActive && stalkingMoveMode == 2) { HandleStalkingMovement(wantMove: true, stalkingMoveTarget); return; } if (!stalkingMovementActive || stalkingMoveMode != 1) { Vector3 approachPos = GetApproachPos(); if (approachPos == Vector3.zero) { stalkingMoveMode = 0; HandleStalkingMovement(wantMove: false, Vector3.zero, stopNow: true); return; } stalkingMoveTarget = approachPos; stalkingMoveMode = 1; } HandleStalkingMovement(wantMove: true, stalkingMoveTarget); } else if (losScore == 1) { if (flag) { stalkingMoveMode = 0; HandleStalkingMovement(wantMove: false, Vector3.zero, stopNow: true); return; } if (stalkingMovementActive && stalkingMoveMode == 2) { HandleStalkingMovement(wantMove: true, stalkingMoveTarget); return; } if (!stalkingMovementActive || stalkingMoveMode != 1) { Vector3 approachPos2 = GetApproachPos(); if (approachPos2 == Vector3.zero) { stalkingMoveMode = 0; HandleStalkingMovement(wantMove: false, Vector3.zero, stopNow: true); return; } stalkingMoveTarget = approachPos2; stalkingMoveMode = 1; } HandleStalkingMovement(wantMove: true, stalkingMoveTarget); } else if (losScore == 2) { stalkingMoveMode = 0; HandleStalkingMovement(wantMove: false, Vector3.zero, stopNow: true); } else if (flag) { if (!stalkingMovementActive || stalkingMoveMode != 2) { Vector3 hidePos = GetHidePos(); if (hidePos == Vector3.zero) { stalkingMoveMode = 0; HandleStalkingMovement(wantMove: false, Vector3.zero, stopNow: true); return; } stalkingMoveTarget = hidePos; stalkingMoveMode = 2; } HandleStalkingMovement(wantMove: true, stalkingMoveTarget); } else { stalkingMoveMode = 0; HandleStalkingMovement(wantMove: false, Vector3.zero, stopNow: true); } } private void HandleStalkingMovement(bool wantMove, Vector3 wantedTarget, bool stopNow = false) { //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_0022: 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_0055: Unknown result type (might be due to invalid IL or missing references) //IL_01ad: Unknown result type (might be due to invalid IL or missing references) //IL_01b3: 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_01de: 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_0204: 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_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Expected O, but got Unknown //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: 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_0101: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Invalid comparison between Unknown and I4 //IL_0261: 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_0294: Unknown result type (might be due to invalid IL or missing references) //IL_0124: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_0114: Unknown result type (might be due to invalid IL or missing references) //IL_0119: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Unknown result type (might be due to invalid IL or missing references) //IL_0152: Unknown result type (might be due to invalid IL or missing references) if (stopNow || !wantMove) { base.agent.ResetPath(); base.agent.velocity = Vector3.zero; base.agent.isStopped = false; base.moveTowardsDestination = false; base.movingTowardsTargetPlayer = false; stalkingMovementActive = false; stalkingMoveTarget = Vector3.zero; stalkingMoveMode = 0; _stalkMoveStartTime = 0f; } else { if (wantedTarget == Vector3.zero) { return; } if (!stalkingMovementActive) { base.agent.speed = 4f; NavMeshHit val = default(NavMeshHit); if (!NavMesh.SamplePosition(((Component)this).transform.position, ref val, 2f, -1)) { stalkingMoveTarget = Vector3.zero; return; } Vector3 position = ((NavMeshHit)(ref val)).position; NavMeshPath val2 = new NavMeshPath(); if (!NavMesh.CalculatePath(position, wantedTarget, -1, val2) || (int)val2.status > 0) { stalkingMoveTarget = Vector3.zero; return; } stalkingMoveTarget = wantedTarget; if (!((EnemyAI)this).SetDestinationToPosition(stalkingMoveTarget, true)) { stalkingMovementActive = false; stalkingMoveTarget = Vector3.zero; base.moveTowardsDestination = false; base.movingTowardsTargetPlayer = false; stalkingMoveMode = 0; _stalkMoveStartTime = 0f; } else { base.moveTowardsDestination = true; base.movingTowardsTargetPlayer = false; stalkingMovementActive = true; _stalkMoveStartTime = Time.time; } return; } float num = 1f; float num2 = Vector3.Distance(((Component)this).transform.position, stalkingMoveTarget); if (num2 <= num) { base.agent.ResetPath(); base.agent.velocity = Vector3.zero; base.moveTowardsDestination = false; base.movingTowardsTargetPlayer = false; stalkingMovementActive = false; stalkingMoveTarget = Vector3.zero; stalkingMoveMode = 0; _stalkMoveStartTime = 0f; return; } float num3 = 5f; if (_stalkMoveStartTime > 0f && Time.time - _stalkMoveStartTime >= num3) { base.agent.ResetPath(); base.agent.velocity = Vector3.zero; base.agent.isStopped = false; base.moveTowardsDestination = false; base.movingTowardsTargetPlayer = false; stalkingMovementActive = false; stalkingMoveTarget = Vector3.zero; stalkingMoveMode = 0; _stalkMoveStartTime = 0f; } } } private void LookAtPlayer() { //IL_001e: 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_002e: 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_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_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)chasingPlayer == (Object)null)) { Vector3 val = ((Component)chasingPlayer).transform.position - ((Component)this).transform.position; val.y = 0f; Quaternion rotation = Quaternion.LookRotation(val); ((Component)this).transform.rotation = rotation; } } private void ResetRotation() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) ((Component)this).transform.rotation = Quaternion.identity; } private void UpdateStalkingMeter(bool inLosThisFrame) { float num = stalkingMeter; if (inLosThisFrame) { stalkingMeter = Mathf.Min(stalkingMeter + stalkingMeterIncrement * Time.deltaTime, stalkingMeterMax); } else { stalkingMeter = Mathf.Max(stalkingMeter - stalkingMeterDecrement * Time.deltaTime, -3f); } float num2 = Mathf.Floor(stalkingMeter); if (num2 != lastLoggedStalkingSecond) { lastLoggedStalkingSecond = num2; SpinerPlugin.LogInfo(string.Format("[UpdateStalkingMeter] Meter: {0}s {1}", Mathf.RoundToInt(stalkingMeter), inLosThisFrame ? "(LOS)" : "(no LOS)")); } if (stalkingMeter <= 0f && num > 0f) { SpinerPlugin.LogInfo("[UpdateStalkingMeter] Meter reached 0."); lastLoggedStalkingSecond = -1f; } if (stalkingMeter >= stalkingMeterMax) { SpinerPlugin.LogInfo("[UpdateStalkingMeter] Meter full => switch to KIDNAPPING"); stalkingMeter = 0f; lastLoggedStalkingSecond = -1f; BeginSpinerKidnapServerRpc(stalkingTargetId); } if (stalkingMeter <= -3f) { SpinerPlugin.LogInfo("[UpdateStalkingMeter] Meter dropped too low => switch to PATROL"); stalkingMeter = 0f; lastLoggedStalkingSecond = -1f; BeginSpinerPatrolServerRpc(); } } private int ISeeMyTarget() { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0027: 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_004c: 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_004e: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_006d: 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_0077: 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_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0088: 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_00ad: 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_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_00df: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: 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_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: 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_0108: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_0112: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_011c: 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_011f: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Unknown result type (might be due to invalid IL or missing references) //IL_0132: Unknown result type (might be due to invalid IL or missing references) //IL_0134: Unknown result type (might be due to invalid IL or missing references) //IL_0136: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_0142: Unknown result type (might be due to invalid IL or missing references) //IL_0144: Unknown result type (might be due to invalid IL or missing references) //IL_0146: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Unknown result type (might be due to invalid IL or missing references) //IL_0152: 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_0156: Unknown result type (might be due to invalid IL or missing references) //IL_015b: Unknown result type (might be due to invalid IL or missing references) //IL_0160: Unknown result type (might be due to invalid IL or missing references) //IL_0162: Unknown result type (might be due to invalid IL or missing references) //IL_0164: Unknown result type (might be due to invalid IL or missing references) //IL_0166: Unknown result type (might be due to invalid IL or missing references) //IL_016b: Unknown result type (might be due to invalid IL or missing references) //IL_0170: Unknown result type (might be due to invalid IL or missing references) //IL_0172: Unknown result type (might be due to invalid IL or missing references) //IL_0174: Unknown result type (might be due to invalid IL or missing references) //IL_0176: Unknown result type (might be due to invalid IL or missing references) //IL_017b: 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_018e: Unknown result type (might be due to invalid IL or missing references) //IL_0190: Unknown result type (might be due to invalid IL or missing references) //IL_019e: Unknown result type (might be due to invalid IL or missing references) //IL_01a0: Unknown result type (might be due to invalid IL or missing references) //IL_01ae: 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_01be: Unknown result type (might be due to invalid IL or missing references) //IL_01c0: Unknown result type (might be due to invalid IL or missing references) //IL_01ce: Unknown result type (might be due to invalid IL or missing references) //IL_01d0: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)chasingPlayer == (Object)null) { return 0; } Vector3 position = base.eye.position; Vector3 val = ((Component)chasingPlayer).transform.position + Vector3.up * 1f; float num = Vector3.Distance(position, val); if (num > 50f) { return 0; } Vector3 val2 = val - position; Vector3 normalized = ((Vector3)(ref val2)).normalized; float num2 = Vector3.Angle(base.eye.forward, normalized); if (num2 > 70f) { return 0; } val2 = Vector3.Cross(Vector3.up, normalized); Vector3 val3 = ((Vector3)(ref val2)).normalized; if (((Vector3)(ref val3)).sqrMagnitude < 0.0001f) { val3 = base.eye.right; } Vector3 val4 = position; Vector3 val5 = position - val3 * 0.25f; Vector3 val6 = position - val3 * 0.5f; Vector3 val7 = position + val3 * 0.25f; Vector3 val8 = position + val3 * 0.5f; Vector3 val9 = val4 + normalized * num; Vector3 val10 = val5 + normalized * num; Vector3 val11 = val6 + normalized * num; Vector3 val12 = val7 + normalized * num; Vector3 val13 = val8 + normalized * num; int collidersAndRoomMaskAndDefault = StartOfRound.Instance.collidersAndRoomMaskAndDefault; bool flag = !Physics.Linecast(val4, val9, collidersAndRoomMaskAndDefault); bool flag2 = !Physics.Linecast(val5, val10, collidersAndRoomMaskAndDefault); bool flag3 = !Physics.Linecast(val6, val11, collidersAndRoomMaskAndDefault); bool flag4 = !Physics.Linecast(val7, val12, collidersAndRoomMaskAndDefault); bool flag5 = !Physics.Linecast(val8, val13, collidersAndRoomMaskAndDefault); int num3 = 0; if (flag) { num3++; } if (flag2) { num3++; } if (flag3) { num3++; } if (flag4) { num3++; } if (flag5) { num3++; } bool flag6 = num3 == 0; bool flag7 = !flag6; if (Time.time >= _nextLosLogTime_ISee) { _nextLosLogTime_ISee = Time.time + 0.5f; string arg = $"C:{(flag ? 1 : 0)} " + $"L:{(flag2 ? 1 : 0)}{(flag3 ? 1 : 0)} " + $"R:{(flag4 ? 1 : 0)}{(flag5 ? 1 : 0)}"; SpinerPlugin.LogInfo($"[ISeeMyTarget] LOS={flag7} | score={num3}/5 | {arg}"); } return num3; } private bool MyTargetSeesMe() { //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_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003f: 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_005c: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)chasingPlayer == (Object)null) { return false; } Transform transform = ((Component)chasingPlayer.gameplayCamera).transform; Vector3 position = base.eye.position; Vector3 position2 = transform.position; float num = Vector3.Distance(position2, position); if (num > 50f) { return false; } Vector3 val = position - position2; Vector3 normalized = ((Vector3)(ref val)).normalized; float num2 = Vector3.Angle(transform.forward, normalized); if (num2 > 70f) { return false; } bool flag = Physics.Linecast(position2, position, StartOfRound.Instance.collidersAndRoomMaskAndDefault); return !flag; } private Vector3 GetApproachPos() { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Expected O, but got Unknown //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: 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_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: 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) //IL_00e5: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)chasingPlayer == (Object)null) { return Vector3.zero; } Vector3 enemyPos = ((Component)this).transform.position; Transform p = ((Component)chasingPlayer).transform; float num = 2f; float radius = 2.5f; int samples = 15; float navSnap = 2.5f; Vector3 behindCenter = p.position - p.forward * num; NavMeshPath path = new NavMeshPath(); Vector3 val = TryCone(120f); if (val == Vector3.zero) { val = TryCone(180f); } if (val == Vector3.zero) { SpinerPlugin.LogInfo("[GetApproachPos] FAIL no pathComplete candidates (120->180)"); } return val; Vector3 TryCone(float angleDeg) { //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_0011: 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) //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_0124: Unknown result type (might be due to invalid IL or missing references) //IL_0128: 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_0067: 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_0070: 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_007d: 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_0089: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: 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_00cf: Invalid comparison between Unknown and I4 //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_0100: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) Vector3 val2 = -p.forward; Vector3 normalized = ((Vector3)(ref val2)).normalized; NavMeshHit val5 = default(NavMeshHit); for (int i = 0; i < samples; i++) { float num2 = ((samples == 1) ? 0.5f : ((float)i / (float)(samples - 1))); float num3 = Mathf.Lerp((0f - angleDeg) * 0.5f, angleDeg * 0.5f, num2); Vector3 val3 = Quaternion.Euler(0f, num3, 0f) * normalized; Vector3 val4 = behindCenter + val3 * radius; if (NavMesh.SamplePosition(val4, ref val5, navSnap, -1) && NavMesh.CalculatePath(enemyPos, ((NavMeshHit)(ref val5)).position, -1, path) && (int)path.status <= 0) { SpinerPlugin.LogInfo($"[GetApproachPos] PICK pos={((NavMeshHit)(ref val5)).position} | cone={angleDeg} | pathComplete"); return ((NavMeshHit)(ref val5)).position; } } return Vector3.zero; } } private Vector3 GetHidePos() { //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0047: 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_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Expected O, but got Unknown //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_02d5: Unknown result type (might be due to invalid IL or missing references) //IL_012a: Unknown result type (might be due to invalid IL or missing references) //IL_012f: Unknown result type (might be due to invalid IL or missing references) //IL_0132: Unknown result type (might be due to invalid IL or missing references) //IL_0134: Unknown result type (might be due to invalid IL or missing references) //IL_013c: 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) //IL_013f: 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_0146: Unknown result type (might be due to invalid IL or missing references) //IL_014a: Unknown result type (might be due to invalid IL or missing references) //IL_0170: Unknown result type (might be due to invalid IL or missing references) //IL_0175: Unknown result type (might be due to invalid IL or missing references) //IL_01e8: Unknown result type (might be due to invalid IL or missing references) //IL_01ed: Unknown result type (might be due to invalid IL or missing references) //IL_01f2: Unknown result type (might be due to invalid IL or missing references) //IL_01f4: Unknown result type (might be due to invalid IL or missing references) //IL_01f9: Unknown result type (might be due to invalid IL or missing references) //IL_01ff: Unknown result type (might be due to invalid IL or missing references) //IL_0204: Unknown result type (might be due to invalid IL or missing references) //IL_0209: Unknown result type (might be due to invalid IL or missing references) //IL_020b: 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_018b: Invalid comparison between Unknown and I4 //IL_025e: Unknown result type (might be due to invalid IL or missing references) //IL_0264: Unknown result type (might be due to invalid IL or missing references) //IL_026e: Unknown result type (might be due to invalid IL or missing references) //IL_0273: Unknown result type (might be due to invalid IL or missing references) //IL_0278: Unknown result type (might be due to invalid IL or missing references) //IL_027a: Unknown result type (might be due to invalid IL or missing references) //IL_0226: Unknown result type (might be due to invalid IL or missing references) //IL_022d: Unknown result type (might be due to invalid IL or missing references) //IL_02cc: Unknown result type (might be due to invalid IL or missing references) //IL_02d1: Unknown result type (might be due to invalid IL or missing references) //IL_0295: Unknown result type (might be due to invalid IL or missing references) //IL_029c: Unknown result type (might be due to invalid IL or missing references) //IL_0240: Unknown result type (might be due to invalid IL or missing references) //IL_0246: Invalid comparison between Unknown and I4 //IL_01a4: Unknown result type (might be due to invalid IL or missing references) //IL_01b6: Unknown result type (might be due to invalid IL or missing references) //IL_01b8: Unknown result type (might be due to invalid IL or missing references) //IL_02af: Unknown result type (might be due to invalid IL or missing references) //IL_02b5: Invalid comparison between Unknown and I4 //IL_0253: Unknown result type (might be due to invalid IL or missing references) //IL_0258: Unknown result type (might be due to invalid IL or missing references) //IL_02c2: Unknown result type (might be due to invalid IL or missing references) //IL_02c7: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)chasingPlayer == (Object)null) { return Vector3.zero; } SpinerPlugin.LogInfo("[SubState] ENTER HIDE"); Vector3 enemyPos = ((Component)this).transform.position; Vector3 position = ((Component)chasingPlayer).transform.position; Vector3 val = position - enemyPos; Vector3 dirToPlayer = ((Vector3)(ref val)).normalized; List possibleNodes = new List(); AddNodes(-60f, 60f, 6f, 15); AddNodes(-90f, -60f, 8f, 6); AddNodes(60f, 90f, 8f, 6); AddNodes(-120f, -90f, 10f, 6); AddNodes(90f, 120f, 10f, 6); SpinerPlugin.LogInfo($"[GetHidePos] {possibleNodes.Count} candidate nodes generated."); NavMeshPath val2 = new NavMeshPath(); foreach (Vector3 item in possibleNodes) { float num = Vector3.Distance(item, position); val = position - item; if (!Physics.Raycast(item, ((Vector3)(ref val)).normalized, num, StartOfRound.Instance.collidersRoomDefaultAndFoliage) || !NavMesh.CalculatePath(enemyPos, item, -1, val2) || (int)val2.status != 0) { continue; } SpinerPlugin.LogInfo($"[GetHidePos] PICK node={item} | pathComplete"); return item; } SpinerPlugin.LogInfo("[GetHidePos] No valid hiding spot found! Searching for alternative escape..."); Vector3 val3 = -dirToPlayer; Vector3 val4 = enemyPos + val3 * 6f; NavMeshHit val5 = default(NavMeshHit); if (NavMesh.SamplePosition(val4, ref val5, 3f, -1) && NavMesh.CalculatePath(enemyPos, ((NavMeshHit)(ref val5)).position, -1, val2) && (int)val2.status == 0) { return ((NavMeshHit)(ref val5)).position; } Vector3 val6 = enemyPos - dirToPlayer * 5f; NavMeshHit val7 = default(NavMeshHit); if (NavMesh.SamplePosition(val6, ref val7, 3f, -1) && NavMesh.CalculatePath(enemyPos, ((NavMeshHit)(ref val7)).position, -1, val2) && (int)val2.status == 0) { return ((NavMeshHit)(ref val7)).position; } return Vector3.zero; void AddNodes(float angleMin, float angleMax, float radius, int samples) { //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0046: 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_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_005c: 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_0093: 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_00ea: Unknown result type (might be due to invalid IL or missing references) NavMeshHit val10 = default(NavMeshHit); for (int i = 0; i < samples; i++) { float num2 = ((samples == 1) ? 0.5f : ((float)i / (float)(samples - 1))); float num3 = Mathf.Lerp(angleMin, angleMax, num2); Vector3 val8 = Quaternion.Euler(0f, num3, 0f) * -dirToPlayer; Vector3 val9 = enemyPos + val8 * radius; if (NavMesh.SamplePosition(val9, ref val10, 2f, -1)) { bool flag = false; for (int j = 0; j < possibleNodes.Count; j++) { Vector3 val11 = possibleNodes[j] - ((NavMeshHit)(ref val10)).position; if (((Vector3)(ref val11)).sqrMagnitude < 0.25f) { flag = true; break; } } if (!flag) { possibleNodes.Add(((NavMeshHit)(ref val10)).position); } } } } } private void PerformKidnapping() { //IL_0031: 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_00ce: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)chasingPlayer == (Object)null) { SpinerPlugin.LogWarning("[Kidnapping] No chasingPlayer assigned. Switching to Runaway."); ChangeState(State.Runaway); return; } float num = Vector3.Distance(((Component)this).transform.position, ((Component)chasingPlayer).transform.position); if (num > 50f || !chasingPlayer.isPlayerControlled || chasingPlayer.isPlayerDead) { kidnappingTimer += Time.deltaTime; if (kidnappingTimer >= kidnappingTimeout) { kidnappingTimer = 0f; ChangeState(State.Runaway); return; } } else { kidnappingTimer = 0f; } ((EnemyAI)this).SetDestinationToPosition(((Component)chasingPlayer).transform.position, true); } public override void OnCollideWithPlayer(Collider other) { ((EnemyAI)this).OnCollideWithPlayer(other); if (!((NetworkBehaviour)this).IsServer || base.isEnemyDead) { return; } State state = (State)spinerBehaviourStateIndex; if ((state != State.Patrol && state != State.Stalking && state != State.Kidnapping) || state == State.Transport || isTransportActive || (Object)(object)base.inSpecialAnimationWithPlayer != (Object)null) { return; } PlayerControllerB val = ((EnemyAI)this).MeetsStandardPlayerCollisionConditions(other, false, false); if ((Object)(object)val == (Object)null) { return; } int num = Array.IndexOf(StartOfRound.Instance.allPlayerScripts, val); if (num >= 0) { base.inSpecialAnimationWithPlayer = val; kidnappingTargetId = num; transportingTargetId = num; chasingPlayer = val; stalkingTargetId = num; SetAnimation("Grab"); if (_phase2Lethal && !_killTimerActive) { _killTimerActive = true; _kidnapKillTimer = _cfgDarkKillTime; } BeginSpinerTransportClientRpc(kidnappingTargetId); } } private void PerformTransport() { //IL_0292: Unknown result type (might be due to invalid IL or missing references) //IL_029d: Unknown result type (might be due to invalid IL or missing references) //IL_01c0: Unknown result type (might be due to invalid IL or missing references) //IL_01cb: Unknown result type (might be due to invalid IL or missing references) //IL_0167: 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_0186: Unknown result type (might be due to invalid IL or missing references) //IL_0190: Unknown result type (might be due to invalid IL or missing references) //IL_0199: Unknown result type (might be due to invalid IL or missing references) if (base.isEnemyDead) { RequestReleaseTransportServer(); return; } if ((Object)(object)base.inSpecialAnimationWithPlayer == (Object)null || base.inSpecialAnimationWithPlayer.isPlayerDead || !((Component)base.inSpecialAnimationWithPlayer).gameObject.activeInHierarchy || (Object)(object)base.inSpecialAnimationWithPlayer.inAnimationWithEnemy != (Object)(object)this) { RequestReleaseTransportServer(); ChangeState(State.Runaway); return; } if (_phase2Lethal) { if (!((NetworkBehaviour)this).IsServer) { return; } if (_killTimerActive && (Object)(object)base.inSpecialAnimationWithPlayer != (Object)null) { _kidnapKillTimer -= Time.deltaTime; if (_kidnapKillTimer % 1f > (_kidnapKillTimer - Time.deltaTime) % 1f && _kidnapKillTimer <= 0f) { _killTimerActive = false; SetAnimation("Spin"); PlayerControllerB inSpecialAnimationWithPlayer = base.inSpecialAnimationWithPlayer; if ((Object)(object)inSpecialAnimationWithPlayer != (Object)null && !inSpecialAnimationWithPlayer.isPlayerDead) { RequestReleaseTransportServer(); if (((NetworkBehaviour)this).IsServer) { KillCapturedClientRpc(inSpecialAnimationWithPlayer.playerClientId, 17); } if (((NetworkBehaviour)inSpecialAnimationWithPlayer).IsOwner) { inSpecialAnimationWithPlayer.KillPlayer(Vector3.up * 14f, true, (CauseOfDeath)17, 7, Vector3.zero); } ChangeState(State.Patrol); } return; } } float num = Vector3.Distance(((Component)base.inSpecialAnimationWithPlayer).transform.position, kidnapCarryPoint.position); if (num > 4f) { RequestReleaseTransportServer(); ChangeState(State.Runaway); } return; } int num2 = StartOfRound.Instance.allPlayerScripts.Count((PlayerControllerB p) => (Object)(object)p != (Object)null && p.isPlayerControlled && !p.isPlayerDead && (Object)(object)p != (Object)(object)base.inSpecialAnimationWithPlayer); if (num2 <= 0) { transportReleaseTimer += Time.deltaTime; if (transportReleaseTimer >= 15f) { RequestReleaseTransportServer(); ChangeState(State.Runaway); return; } } else if (transportReleaseTimer > 0f) { transportReleaseTimer = 0f; } float num3 = Vector3.Distance(((Component)base.inSpecialAnimationWithPlayer).transform.position, kidnapCarryPoint.position); if (num3 > 2.5f) { RequestReleaseTransportServer(); ChangeState(State.Runaway); } } private void StopLethalTimer() { _killTimerActive = false; _kidnapKillTimer = 0f; } [ClientRpc] private void ApplyRuntimeConfigClientRpc(string json) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: 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_0088: 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_00ff: 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) 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(4228702990u, val, (RpcDelivery)0); bool flag = json != null; ((FastBufferWriter)(ref val2)).WriteValueSafe(ref flag, default(ForPrimitives)); if (flag) { ((FastBufferWriter)(ref val2)).WriteValueSafe(json, false); } ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 4228702990u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsClient || networkManager.IsHost)) { ((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0; SpinerPlugin.SpinerRuntimeConfig spinerRuntimeConfig = JsonUtility.FromJson(json); _cfgMaxHP = spinerRuntimeConfig.maxHP; _cfgRoamVolume = spinerRuntimeConfig.roamVolume; _cfgDarkMode = spinerRuntimeConfig.darkMode; _cfgDarkReviveDelay = spinerRuntimeConfig.darkReviveDelay; _cfgDarkKillTime = spinerRuntimeConfig.darkKillTime; _cfgApplied = true; ApplyLocalConfig(); } } [ClientRpc] private void KillCapturedClientRpc(ulong targetId, int cause, ClientRpcParams rpcParams = default(ClientRpcParams)) { //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_0110: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_0122: 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)) { FastBufferWriter val = ((NetworkBehaviour)this).__beginSendClientRpc(1601466477u, rpcParams, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val, targetId); BytePacker.WriteValueBitPacked(val, cause); ((NetworkBehaviour)this).__endSendClientRpc(ref val, 1601466477u, rpcParams, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsClient || networkManager.IsHost)) { ((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0; PlayerControllerB localPlayerController = StartOfRound.Instance.localPlayerController; if ((Object)(object)localPlayerController != (Object)null && localPlayerController.playerClientId == targetId && !localPlayerController.isPlayerDead) { localPlayerController.KillPlayer(Vector3.up * 14f, true, (CauseOfDeath)cause, 7, Vector3.zero); } } } [ServerRpc(RequireOwnership = false)] private void BeginSpinerPatrolServerRpc() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0096: 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_007c: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: 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.IsClient || networkManager.IsHost)) { ServerRpcParams val = default(ServerRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(4149237383u, val, (RpcDelivery)0); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 4149237383u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost)) { ((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0; LogRPC("Server", "BeginSpinerPatrolServerRpc"); ChangeState(State.Patrol); BeginSpinerPatrolClientRpc(); } } } [ClientRpc] private void BeginSpinerPatrolClientRpc() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0096: 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_007c: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: 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(1689745625u, val, (RpcDelivery)0); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 1689745625u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsClient || networkManager.IsHost)) { ((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0; LogRPC("Client", "BeginSpinerPatrolClientRpc"); ChangeState(State.Patrol); } } } [ServerRpc(RequireOwnership = false)] private void BeginSpinerStalkServerRpc(int playerId) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: 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_0089: 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) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost)) { ServerRpcParams val = default(ServerRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(1741744632u, val, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val2, playerId); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 1741744632u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost)) { ((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0; LogRPC("Server", "BeginSpinerStalkServerRpc"); ChangeState(State.Stalking, playerId); BeginSpinerStalkClientRpc(playerId); } } } [ClientRpc] private void BeginSpinerStalkClientRpc(int playerId) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: 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_0089: 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) 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(3777187886u, val, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val2, playerId); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 3777187886u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsClient || networkManager.IsHost)) { ((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0; LogRPC("Client", "BeginSpinerStalkClientRpc"); ChangeState(State.Stalking, playerId); } } } [ServerRpc(RequireOwnership = false)] private void BeginSpinerKidnapServerRpc(int playerId) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: 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_0089: 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) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost)) { ServerRpcParams val = default(ServerRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(3037181123u, val, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val2, playerId); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 3037181123u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost)) { ((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0; LogRPC("Server", "BeginSpinerKidnapServerRpc"); ChangeState(State.Kidnapping, playerId); BeginSpinerKidnapClientRpc(playerId); } } } [ClientRpc] private void BeginSpinerKidnapClientRpc(int playerId) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: 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_0089: 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) 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(2547517339u, val, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val2, playerId); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2547517339u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsClient || networkManager.IsHost)) { ((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0; LogRPC("Client", "BeginSpinerKidnapClientRpc"); ChangeState(State.Kidnapping, playerId); } } } [ServerRpc(RequireOwnership = false)] private void BeginSpinerTransportServerRpc(int playerId) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: 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_0089: 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) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost)) { ServerRpcParams val = default(ServerRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(276269701u, val, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val2, playerId); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 276269701u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost)) { ((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0; LogRPC("Server", "BeginSpinerTransportServerRpc"); ChangeState(State.Transport, playerId); BeginSpinerTransportClientRpc(playerId); } } } [ClientRpc] private void BeginSpinerTransportClientRpc(int playerId) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: 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_0089: 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) 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(2242719271u, val, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val2, playerId); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2242719271u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsClient || networkManager.IsHost)) { ((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0; LogRPC("Client", "BeginSpinerTransportClientRpc"); ChangeState(State.Transport, playerId); } } } [ServerRpc(RequireOwnership = false)] private void BeginSpinerRunawayServerRpc() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0096: 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_007c: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: 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.IsClient || networkManager.IsHost)) { ServerRpcParams val = default(ServerRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(1984957057u, val, (RpcDelivery)0); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 1984957057u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost)) { ((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0; LogRPC("Server", "BeginSpinerRunawayServerRpc"); ChangeState(State.Runaway); BeginSpinerRunawayClientRpc(); } } } [ClientRpc] private void BeginSpinerRunawayClientRpc() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0096: 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_007c: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: 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(2415105479u, val, (RpcDelivery)0); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2415105479u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsClient || networkManager.IsHost)) { ((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0; LogRPC("Client", "BeginSpinerRunawayClientRpc"); ChangeState(State.Runaway); } } } [ClientRpc] private void ForceReleaseTransportClientRpc(int playerId, Vector3 safePos) { //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_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) 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(3591529785u, val, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val2, playerId); ((FastBufferWriter)(ref val2)).WriteValueSafe(ref safePos); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 3591529785u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsClient || networkManager.IsHost)) { ((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0; ApplyReleaseTransportLocal(playerId, safePos); } } } [ClientRpc] private void SyncAnimClientRpc(string animType) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: 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_0088: 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_00ff: 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) 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(3819458986u, val, (RpcDelivery)0); bool flag = animType != null; ((FastBufferWriter)(ref val2)).WriteValueSafe(ref flag, default(ForPrimitives)); if (flag) { ((FastBufferWriter)(ref val2)).WriteValueSafe(animType, false); } ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 3819458986u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsClient || networkManager.IsHost)) { ((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0; SetAnimation(animType, fromRpc: true); } } private void LogCriticalReferences() { } public void SetAnimation(string animType, bool fromRpc = false) { if ((Object)(object)base.creatureAnimator == (Object)null || string.IsNullOrEmpty(animType)) { return; } bool flag = animType == "Walk" || animType == "Idle"; if (!fromRpc && ((NetworkBehaviour)this).IsServer && !flag) { SyncAnimClientRpc(animType); } if (!fromRpc && !((NetworkBehaviour)this).IsServer && !flag) { return; } switch (animType) { case "Walk": if (!(_currentAnimState == "Walk")) { base.creatureAnimator.SetBool(animWalk, true); _currentAnimState = "Walk"; } return; case "Idle": if (!(_currentAnimState == "Idle")) { base.creatureAnimator.SetBool(animWalk, false); _currentAnimState = "Idle"; } return; case "Death": if (!(_currentAnimState == "Death")) { base.creatureAnimator.SetBool(animWalk, false); base.creatureAnimator.SetBool(animDeath, true); _currentAnimState = "Death"; } return; case "Resurrect": if (!(_currentAnimState == "Resurrect")) { base.creatureAnimator.SetBool(animWalk, false); base.creatureAnimator.SetBool(animDeath, false); _currentAnimState = "Resurrect"; } return; case "Death2": if (!(_currentAnimState == "Death2")) { base.creatureAnimator.SetBool(animWalk, false); base.creatureAnimator.SetBool(animDeath2, true); _currentAnimState = "Death2"; } return; } base.creatureAnimator.SetBool(animWalk, false); _currentAnimState = animType; if (1 == 0) { } string text = animType switch { "Stalk" => animStalk, "Attack" => animAttack, "Grab" => animGrab, "Hurt" => animHurt, "Hurt2" => animHurt2, "Hurt3" => animHurt3, "Spin" => animSpin, "SpinTest" => animSpinTest, _ => null, }; if (1 == 0) { } string text2 = text; if (!string.IsNullOrEmpty(text2)) { base.creatureAnimator.ResetTrigger(text2); base.creatureAnimator.SetTrigger(text2); } } private void TriggerFx(SpinerEvent fx) { AudioClip val = null; AudioSource val2 = sfxAudioSource; switch (fx) { default: return; case SpinerEvent.Kidnap: val = currentKidnappingSound; break; case SpinerEvent.Death: val = currentDeathSound; break; case SpinerEvent.Creep: val = currentCreepSound; break; case SpinerEvent.Transport: val = currentTransportSound; break; case SpinerEvent.Detection: val = currentDetectionSound; break; case SpinerEvent.Runaway: val = currentRunawaySound; break; case SpinerEvent.Roam: { AudioClip[] array = (AudioClip[])(object)new AudioClip[3] { currentRoamingSound, currentRoamingSound2, currentRoamingSound3 }; int num = Mathf.Abs((((Object)this).GetInstanceID() + Time.frameCount) % array.Length); val = array[num]; break; } case SpinerEvent.Spin: return; } if (!((Object)(object)val == (Object)null) && !((Object)(object)val2 == (Object)null)) { if (_phase2Lethal && !_phase2AudioTintApplied) { val2.pitch = 0.5f; _phase2AudioTintApplied = true; } if (!((Object)(object)val == (Object)(object)_lastClip) || !(Time.time - _lastTime < 0.05f)) { float num2 = (_phase2Lethal ? 1f : 1f); val2.PlayOneShot(val, num2); _lastClip = val; _lastTime = Time.time; } } } public override void OnDestroy() { if ((Object)(object)base.inSpecialAnimationWithPlayer != (Object)null) { RequestReleaseTransportServer(); } ((EnemyAI)this).OnDestroy(); } private void OnDisable() { if ((Object)(object)base.inSpecialAnimationWithPlayer != (Object)null) { RequestReleaseTransportServer(); } } protected override void __initializeVariables() { ((EnemyAI)this).__initializeVariables(); } protected override void __initializeRpcs() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Expected O, but got Unknown //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Expected O, but got Unknown //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Expected O, but got Unknown //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Expected O, but got Unknown //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Expected O, but got Unknown //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Expected O, but got Unknown //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Expected O, but got Unknown //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Expected O, but got Unknown //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Expected O, but got Unknown //IL_0125: Unknown result type (might be due to invalid IL or missing references) //IL_0134: Expected O, but got Unknown //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Expected O, but got Unknown //IL_015d: Unknown result type (might be due to invalid IL or missing references) //IL_016c: Expected O, but got Unknown //IL_0179: Unknown result type (might be due to invalid IL or missing references) //IL_0188: Expected O, but got Unknown ((NetworkBehaviour)this).__registerRpc(4228702990u, new RpcReceiveHandler(__rpc_handler_4228702990), "ApplyRuntimeConfigClientRpc"); ((NetworkBehaviour)this).__registerRpc(1601466477u, new RpcReceiveHandler(__rpc_handler_1601466477), "KillCapturedClientRpc"); ((NetworkBehaviour)this).__registerRpc(4149237383u, new RpcReceiveHandler(__rpc_handler_4149237383), "BeginSpinerPatrolServerRpc"); ((NetworkBehaviour)this).__registerRpc(1689745625u, new RpcReceiveHandler(__rpc_handler_1689745625), "BeginSpinerPatrolClientRpc"); ((NetworkBehaviour)this).__registerRpc(1741744632u, new RpcReceiveHandler(__rpc_handler_1741744632), "BeginSpinerStalkServerRpc"); ((NetworkBehaviour)this).__registerRpc(3777187886u, new RpcReceiveHandler(__rpc_handler_3777187886), "BeginSpinerStalkClientRpc"); ((NetworkBehaviour)this).__registerRpc(3037181123u, new RpcReceiveHandler(__rpc_handler_3037181123), "BeginSpinerKidnapServerRpc"); ((NetworkBehaviour)this).__registerRpc(2547517339u, new RpcReceiveHandler(__rpc_handler_2547517339), "BeginSpinerKidnapClientRpc"); ((NetworkBehaviour)this).__registerRpc(276269701u, new RpcReceiveHandler(__rpc_handler_276269701), "BeginSpinerTransportServerRpc"); ((NetworkBehaviour)this).__registerRpc(2242719271u, new RpcReceiveHandler(__rpc_handler_2242719271), "BeginSpinerTransportClientRpc"); ((NetworkBehaviour)this).__registerRpc(1984957057u, new RpcReceiveHandler(__rpc_handler_1984957057), "BeginSpinerRunawayServerRpc"); ((NetworkBehaviour)this).__registerRpc(2415105479u, new RpcReceiveHandler(__rpc_handler_2415105479), "BeginSpinerRunawayClientRpc"); ((NetworkBehaviour)this).__registerRpc(3591529785u, new RpcReceiveHandler(__rpc_handler_3591529785), "ForceReleaseTransportClientRpc"); ((NetworkBehaviour)this).__registerRpc(3819458986u, new RpcReceiveHandler(__rpc_handler_3819458986), "SyncAnimClientRpc"); ((EnemyAI)this).__initializeRpcs(); } private static void __rpc_handler_4228702990(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_002f: 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_0061: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { bool flag = default(bool); ((FastBufferReader)(ref reader)).ReadValueSafe(ref flag, default(ForPrimitives)); string json = null; if (flag) { ((FastBufferReader)(ref reader)).ReadValueSafe(ref json, false); } target.__rpc_exec_stage = (__RpcExecStage)1; ((SpinerAI)(object)target).ApplyRuntimeConfigClientRpc(json); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_1601466477(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0023: 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_003d: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0043: 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_0060: 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) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { ulong targetId = default(ulong); ByteUnpacker.ReadValueBitPacked(reader, ref targetId); int cause = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref cause); ClientRpcParams client = rpcParams.Client; target.__rpc_exec_stage = (__RpcExecStage)1; ((SpinerAI)(object)target).KillCapturedClientRpc(targetId, cause, client); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_4149237383(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { target.__rpc_exec_stage = (__RpcExecStage)1; ((SpinerAI)(object)target).BeginSpinerPatrolServerRpc(); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_1689745625(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { target.__rpc_exec_stage = (__RpcExecStage)1; ((SpinerAI)(object)target).BeginSpinerPatrolClientRpc(); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_1741744632(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0023: 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_0050: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { int playerId = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref playerId); target.__rpc_exec_stage = (__RpcExecStage)1; ((SpinerAI)(object)target).BeginSpinerStalkServerRpc(playerId); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_3777187886(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0023: 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_0050: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { int playerId = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref playerId); target.__rpc_exec_stage = (__RpcExecStage)1; ((SpinerAI)(object)target).BeginSpinerStalkClientRpc(playerId); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_3037181123(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0023: 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_0050: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { int playerId = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref playerId); target.__rpc_exec_stage = (__RpcExecStage)1; ((SpinerAI)(object)target).BeginSpinerKidnapServerRpc(playerId); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_2547517339(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0023: 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_0050: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { int playerId = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref playerId); target.__rpc_exec_stage = (__RpcExecStage)1; ((SpinerAI)(object)target).BeginSpinerKidnapClientRpc(playerId); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_276269701(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0023: 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_0050: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { int playerId = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref playerId); target.__rpc_exec_stage = (__RpcExecStage)1; ((SpinerAI)(object)target).BeginSpinerTransportServerRpc(playerId); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_2242719271(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0023: 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_0050: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { int playerId = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref playerId); target.__rpc_exec_stage = (__RpcExecStage)1; ((SpinerAI)(object)target).BeginSpinerTransportClientRpc(playerId); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_1984957057(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { target.__rpc_exec_stage = (__RpcExecStage)1; ((SpinerAI)(object)target).BeginSpinerRunawayServerRpc(); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_2415105479(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { target.__rpc_exec_stage = (__RpcExecStage)1; ((SpinerAI)(object)target).BeginSpinerRunawayClientRpc(); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_3591529785(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0023: 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) //IL_0061: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { int playerId = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref playerId); Vector3 safePos = default(Vector3); ((FastBufferReader)(ref reader)).ReadValueSafe(ref safePos); target.__rpc_exec_stage = (__RpcExecStage)1; ((SpinerAI)(object)target).ForceReleaseTransportClientRpc(playerId, safePos); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_3819458986(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_002f: 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_0061: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { bool flag = default(bool); ((FastBufferReader)(ref reader)).ReadValueSafe(ref flag, default(ForPrimitives)); string animType = null; if (flag) { ((FastBufferReader)(ref reader)).ReadValueSafe(ref animType, false); } target.__rpc_exec_stage = (__RpcExecStage)1; ((SpinerAI)(object)target).SyncAnimClientRpc(animType); target.__rpc_exec_stage = (__RpcExecStage)0; } } protected internal override string __getTypeName() { return "SpinerAI"; } } [BepInPlugin("Jeez.Spiner", "Spiner Mod", "1.0.7")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] public class SpinerPlugin : BaseUnityPlugin { [Serializable] public class SpinerRuntimeConfig { public int maxHP; public float roamVolume; public bool soundStyle; public bool darkMode; public float darkReviveDelay; public float darkKillTime; } internal static ManualLogSource Logger = null; public static AssetBundle? Assets; public static EnemyType? EnemyType; public static GameObject? enemyPrefab; public static TerminalNode? EnemyTerminalNode; public static TerminalKeyword? EnemyTerminalKeyword; public static ConfigEntry MaxHP = null; public static ConfigEntry RoamVolume = null; public static ConfigEntry SoundStyle = null; public static ConfigEntry DarkMode = null; public static ConfigEntry DarkReviveDelay = null; public static ConfigEntry DarkKillTime = null; public static ConfigEntry SpawnWeight = null; public static SpinerRuntimeConfig RuntimeConfig = new SpinerRuntimeConfig(); private void LoadAssets() { LogInfo("[Spiner] Starting to load AssetBundle..."); try { string filePath = GetFilePath("Spiner"); LogInfo("[Spiner] Loading AssetBundle from: " + filePath); Assets = AssetBundle.LoadFromFile(filePath); if ((Object)(object)Assets == (Object)null) { LogError("[Spiner] Failed to load AssetBundle: Spiner"); return; } LogAssetBundleContents(Assets); LogInfo("[Spiner] AssetBundle loaded successfully."); LogInfo("[Spiner] Loading enemy definition: SpinerObj.prefab"); enemyPrefab = Assets.LoadAsset("assets/modassets/Spiner/SpinerObj.prefab"); if ((Object)(object)enemyPrefab == (Object)null) { LogError("[Spiner] Failed to load SpinerObj.prefab from AssetBundle"); return; } LogInfo("[Spiner] Prefab loaded successfully."); LogInfo("[Spiner] Loading EnemyType definition: Spiner.asset"); EnemyType = Assets.LoadAsset("assets/modassets/Spiner/Spiner.asset"); if ((Object)(object)EnemyType == (Object)null) { LogError("[Spiner] Failed to load EnemyType from AssetBundle. Ensure it is properly configured."); return; } LogInfo("[Spiner] EnemyType loaded successfully."); EnemyType.enemyPrefab = enemyPrefab; LogInfo("[Spiner] EnemyType prefab assigned successfully."); } catch (Exception ex) { LogError("[Spiner] Failed to load assets: " + ex.Message); } } private void Awake() { Logger = ((BaseUnityPlugin)this).Logger; LogInfo("[Spiner] Plugin Awake - Initializing..."); MaxHP = ((BaseUnityPlugin)this).Config.Bind("Stats", "MaxHP", 5, "Spiner max HP"); RoamVolume = ((BaseUnityPlugin)this).Config.Bind("Audio", "RoamVolume", 0.8f, "Roam sound volume (0..1)"); SoundStyle = ((BaseUnityPlugin)this).Config.Bind("Audio", "QuackSounds", false, "Use quack sound pack instead of normal sounds"); DarkMode = ((BaseUnityPlugin)this).Config.Bind("DarkMode", "Enabled", true, "Enable Dark Mode (feint death + lethal phase 2)"); DarkReviveDelay = ((BaseUnityPlugin)this).Config.Bind("DarkMode", "ReviveDelaySec", 25f, "Seconds before revival"); DarkKillTime = ((BaseUnityPlugin)this).Config.Bind("DarkMode", "KillTimeSec", 20f, "Seconds before executing the captive in phase 2"); SpawnWeight = ((BaseUnityPlugin)this).Config.Bind("Spawns", "SpawnWeight", 40, "Spawn weight (0 = disabled)"); TryRegisterLethalConfigSliders(); InitializeNetworkBehaviours(); LoadAssets(); if ((Object)(object)Assets == (Object)null) { LogError("[Spiner] AssetBundle is null after LoadAssets() -> cannot load terminal assets."); return; } if ((Object)(object)enemyPrefab == (Object)null || (Object)(object)EnemyType == (Object)null) { LogError("[Spiner] Prefab or EnemyType is null. Registration aborted."); return; } EnemyTerminalNode = Assets.LoadAsset("assets/modassets/spiner/spiner tn.asset"); EnemyTerminalKeyword = Assets.LoadAsset("assets/modassets/spiner/spiner tk.asset"); if ((Object)(object)EnemyTerminalNode != (Object)null) { LogInfo($"[TERM] node ok | name={((Object)EnemyTerminalNode).name} | textLen={EnemyTerminalNode.displayText?.Length ?? 0}"); } if ((Object)(object)EnemyTerminalKeyword != (Object)null) { LogInfo($"[TERM] keyword ok | name={((Object)EnemyTerminalKeyword).name} | word={EnemyTerminalKeyword.word} | isVerb={EnemyTerminalKeyword.isVerb}"); } if ((Object)(object)EnemyTerminalNode == (Object)null || (Object)(object)EnemyTerminalKeyword == (Object)null) { LogWarning("[Spiner] Terminal description not found (no bestiary entry)."); } LogInfo("[Spiner] Registering enemy prefab in the network..."); NetworkPrefabs.RegisterNetworkPrefab(enemyPrefab); LogInfo("[Spiner] Enemy prefab registered successfully."); LogInfo("[Spiner] Registering enemy in the spawn system..."); int num = Mathf.Max(0, SpawnWeight.Value); if (num == 0) { LogInfo("[Spiner] SpawnWeight = 0 → Spiner désactivé."); } else { Enemies.RegisterEnemy(EnemyType, num, (LevelTypes)(-1), (SpawnType)0, EnemyTerminalNode, EnemyTerminalKeyword); LogInfo($"[Spiner] Enemy registered. weight={num}"); } LogInfo("[Spiner] Enemy registered successfully in the spawn system."); LogInfo("[Spiner] Plugin initialized successfully."); } public static void LogInfo(string message) { if (Logger != null) { string text = $"[Frame {Time.frameCount}] "; Logger.LogInfo((object)(text + message)); } } public static void LogWarning(string message) { if (Logger != null) { string text = $"[Frame {Time.frameCount}] "; Logger.LogWarning((object)(text + message)); } } public static void LogError(string message) { if (Logger != null) { string text = $"[Frame {Time.frameCount}] "; Logger.LogError((object)(text + message)); } } public static void LogDebug(string message) { if (Logger != null) { string text = $"[Frame {Time.frameCount}] "; Logger.LogDebug((object)(text + message)); } } private string GetFilePath(string path) { return Path.Combine(Path.GetDirectoryName(((object)this).GetType().Assembly.Location), path); } private static void InitializeNetworkBehaviours() { Type[] types = Assembly.GetExecutingAssembly().GetTypes(); Type[] array = types; foreach (Type type in array) { MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic); MethodInfo[] array2 = methods; foreach (MethodInfo methodInfo in array2) { object[] customAttributes = methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false); if (customAttributes.Length != 0) { methodInfo.Invoke(null, null); } } } } private void LogAssetBundleContents(AssetBundle assetBundle) { if ((Object)(object)assetBundle == (Object)null) { LogError("[Spiner] AssetBundle is null. Cannot list contents."); return; } try { string[] allAssetNames = assetBundle.GetAllAssetNames(); if (allAssetNames.Length == 0) { Logger.LogWarning((object)"[Spiner] AssetBundle contains no assets."); return; } LogInfo("[Spiner] Listing all assets in the AssetBundle:"); string[] array = allAssetNames; foreach (string text in array) { LogInfo("[Spiner] Found asset: " + text); } } catch (Exception ex) { LogError("[Spiner] Failed to list AssetBundle contents: " + ex.Message); } } public static string GetRuntimeConfigJson() { SpinerRuntimeConfig spinerRuntimeConfig = new SpinerRuntimeConfig { maxHP = MaxHP.Value, roamVolume = RoamVolume.Value, soundStyle = SoundStyle.Value, darkMode = DarkMode.Value, darkReviveDelay = DarkReviveDelay.Value, darkKillTime = DarkKillTime.Value }; return JsonUtility.ToJson((object)spinerRuntimeConfig); } private void TryRegisterLethalConfigSliders() { try { if (!Chainloader.PluginInfos.ContainsKey("ainavt.lc.lethalconfig")) { LogInfo("[Spiner] LethalConfig non détecté, sliders ignorés."); return; } Assembly assembly = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault((Assembly a) => a.GetName().Name == "LethalConfig"); if (assembly == null) { LogWarning("[Spiner] Assembly LethalConfig introuvable malgré le plugin. Pas de sliders."); return; } Type type = assembly.GetType("LethalConfig.LethalConfigManager"); Type type2 = assembly.GetType("LethalConfig.ConfigItems.BoolCheckBoxConfigItem"); Type type3 = assembly.GetType("LethalConfig.ConfigItems.FloatSliderConfigItem"); Type type4 = assembly.GetType("LethalConfig.ConfigItems.IntSliderConfigItem"); Type floatOptionsType = assembly.GetType("LethalConfig.ConfigItems.Options.FloatSliderOptions"); Type intOptionsType = assembly.GetType("LethalConfig.ConfigItems.Options.IntSliderOptions"); if (type == null || type2 == null || type3 == null || type4 == null || floatOptionsType == null || intOptionsType == null) { LogWarning("[Spiner] Types LethalConfig incomplets, pas de sliders."); return; } MethodInfo methodInfo = type.GetMethods(BindingFlags.Static | BindingFlags.Public).FirstOrDefault((MethodInfo m) => m.Name == "AddConfigItem" && m.GetParameters().Length == 1); if (methodInfo == null) { LogWarning("[Spiner] Aucune surcharge de LethalConfigManager.AddConfigItem(param unique) trouvée."); return; } object obj = Activator.CreateInstance(type2, DarkMode, true); methodInfo.Invoke(null, new object[1] { obj }); object obj2 = MakeFloatOptions(1f, 30f, restart: false); object obj3 = Activator.CreateInstance(type3, DarkReviveDelay, obj2); methodInfo.Invoke(null, new object[1] { obj3 }); object obj4 = MakeFloatOptions(1f, 60f, restart: false); object obj5 = Activator.CreateInstance(type3, DarkKillTime, obj4); methodInfo.Invoke(null, new object[1] { obj5 }); object obj6 = MakeIntOptions(1, 20, restart: false); object obj7 = Activator.CreateInstance(type4, MaxHP, obj6); methodInfo.Invoke(null, new object[1] { obj7 }); object obj8 = MakeFloatOptions(0f, 1f, restart: false); object obj9 = Activator.CreateInstance(type3, RoamVolume, obj8); methodInfo.Invoke(null, new object[1] { obj9 }); object obj10 = Activator.CreateInstance(type2, SoundStyle, true); methodInfo.Invoke(null, new object[1] { obj10 }); LogInfo("[Spiner] Sliders LethalConfig enregistrés via reflection."); object MakeFloatOptions(float min, float max, bool restart) { object obj12 = Activator.CreateInstance(floatOptionsType); floatOptionsType.GetProperty("Min").SetValue(obj12, min); floatOptionsType.GetProperty("Max").SetValue(obj12, max); floatOptionsType.GetProperty("RequiresRestart").SetValue(obj12, restart); return obj12; } object MakeIntOptions(int min, int max, bool restart) { object obj11 = Activator.CreateInstance(intOptionsType); intOptionsType.GetProperty("Min").SetValue(obj11, min); intOptionsType.GetProperty("Max").SetValue(obj11, max); intOptionsType.GetProperty("RequiresRestart").SetValue(obj11, restart); return obj11; } } catch (Exception arg) { LogError($"[Spiner] Erreur lors de l'initialisation LethalConfig (reflection) : {arg}"); } } } public static class PluginInfo { public const string PLUGIN_GUID = "SpinerVisual"; public const string PLUGIN_NAME = "SpinerVisual"; public const string PLUGIN_VERSION = "1.0.0"; } } namespace __GEN { internal class NetworkVariableSerializationHelper { [RuntimeInitializeOnLoadMethod] internal static void InitializeSerialization() { } } } namespace SpinerVisual.NetcodePatcher { [AttributeUsage(AttributeTargets.Module)] internal class NetcodePatchedAssemblyAttribute : Attribute { } }