Decompiled source of SCP2006 v1.0.3
plugins/ProjectSCP.SCP2006.dll
Decompiled a week ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Logging; using Dawn.Utils; using GameNetcodeStuff; using HarmonyLib; using Microsoft.CodeAnalysis; using ProjectSCP.SCP2006.NetcodePatcher; using Unity.Netcode; using UnityEngine; using UnityEngine.AI; using UnityEngine.Animations.Rigging; using UnityEngine.Events; using UnityEngine.UI; using UnityEngine.Video; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: IgnoresAccessChecksTo("AmazingAssets.TerrainToMesh")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp-firstpass")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: IgnoresAccessChecksTo("ClientNetworkTransform")] [assembly: IgnoresAccessChecksTo("com.github.teamxiaolan.dawnlib")] [assembly: IgnoresAccessChecksTo("com.olegknyazev.softmask")] [assembly: IgnoresAccessChecksTo("DissonanceVoip")] [assembly: IgnoresAccessChecksTo("EasyTextEffects")] [assembly: IgnoresAccessChecksTo("Facepunch Transport for Netcode for GameObjects")] [assembly: IgnoresAccessChecksTo("Facepunch.Steamworks.Win64")] [assembly: IgnoresAccessChecksTo("Unity.AI.Navigation")] [assembly: IgnoresAccessChecksTo("Unity.Animation.Rigging")] [assembly: IgnoresAccessChecksTo("Unity.Animation.Rigging.DocCodeExamples")] [assembly: IgnoresAccessChecksTo("Unity.Burst")] [assembly: IgnoresAccessChecksTo("Unity.Burst.Unsafe")] [assembly: IgnoresAccessChecksTo("Unity.Collections")] [assembly: IgnoresAccessChecksTo("Unity.Collections.LowLevel.ILSupport")] [assembly: IgnoresAccessChecksTo("Unity.InputSystem")] [assembly: IgnoresAccessChecksTo("Unity.InputSystem.ForUI")] [assembly: IgnoresAccessChecksTo("Unity.Jobs")] [assembly: IgnoresAccessChecksTo("Unity.Mathematics")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.Common")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.MetricTypes")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStats")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Component")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Configuration")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Implementation")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsReporting")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetworkProfiler.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetworkSolutionInterface")] [assembly: IgnoresAccessChecksTo("Unity.Netcode.Components")] [assembly: IgnoresAccessChecksTo("Unity.Netcode.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.Networking.Transport")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Csg")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder.KdTree")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Poly2Tri")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Stl")] [assembly: IgnoresAccessChecksTo("Unity.Profiling.Core")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.ShaderLibrary")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.HighDefinition.Config.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.HighDefinition.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary")] [assembly: IgnoresAccessChecksTo("Unity.Services.Authentication")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Analytics")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Components")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Configuration")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Device")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Environments")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Environments.Internal")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Internal")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Networking")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Registration")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Scheduler")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Telemetry")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Threading")] [assembly: IgnoresAccessChecksTo("Unity.Services.QoS")] [assembly: IgnoresAccessChecksTo("Unity.Services.Relay")] [assembly: IgnoresAccessChecksTo("Unity.TextMeshPro")] [assembly: IgnoresAccessChecksTo("Unity.Timeline")] [assembly: IgnoresAccessChecksTo("Unity.VisualEffectGraph.Runtime")] [assembly: IgnoresAccessChecksTo("UnityEngine.ARModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.NVIDIAModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.UI")] [assembly: AssemblyCompany("ProjectSCP.SCP2006")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.3.0")] [assembly: AssemblyInformationalVersion("1.0.3+d72387cdbb53ec93d08d22eec08bbb36dfba8ccb")] [assembly: AssemblyProduct("SCP2006")] [assembly: AssemblyTitle("ProjectSCP.SCP2006")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.3.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 SCP2006 { [HarmonyPatch] internal class Patches { [HarmonyPostfix] [HarmonyPatch(typeof(PlayerControllerB), "KillPlayer")] public static void KillPlayerPostfix(PlayerControllerB __instance) { try { SCP2006AI.onPlayerDeath.Invoke(__instance.actualClientId); } catch { } } } [BepInPlugin("ProjectSCP.SCP2006", "SCP2006", "1.0.3")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BaseUnityPlugin { public static Plugin PluginInstance; private readonly Harmony harmony = new Harmony("ProjectSCP.SCP2006"); public static ManualLogSource logger => ((BaseUnityPlugin)PluginInstance).Logger; public static PlayerControllerB localPlayer => GameNetworkManager.Instance.localPlayerController; public static bool IsServerOrHost => NetworkManager.Singleton.IsServer || NetworkManager.Singleton.IsHost; public static PlayerControllerB? PlayerFromId(ulong id) { return StartOfRound.Instance.allPlayerScripts.Where((PlayerControllerB x) => x.actualClientId == id).FirstOrDefault(); } private void Awake() { if ((Object)(object)PluginInstance == (Object)null) { PluginInstance = this; } harmony.PatchAll(); InitializeNetworkBehaviours(); logger.LogInfo((object)"ProjectSCP.SCP2006 v1.0.3 has loaded!"); } 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); } } } logger.LogDebug((object)"Finished initializing network behaviours"); } } [CreateAssetMenu(menuName = "SCP2006/ScareData")] public class ScareDef : ScriptableObject { public string enemyTypeName; public bool outside; public Sprite movieCover; public AudioClip[] scareSFX; public AudioClip[] baitSFX; public AudioClip[] encounterSFX; public string animState; public float animTime; public VideoClip video; } internal class ScareManager : NetworkBehaviour { private delegate void MethodDelegate(); public SCP2006AI scp; private List<MethodDelegate> scareMethods = new List<MethodDelegate>(); public bool scareFinished; private Coroutine? scareCoroutine; private Action? scareCleanup; private EnemyAI? mimicEnemy => scp.mimicEnemy; public ScareDef currentScareDef => scp.currentScareDef; public override void OnDestroy() { ((MonoBehaviour)this).StopAllCoroutines(); } public void Start() { scareMethods.Add(Centipede); scareMethods.Add(SandSpider); scareMethods.Add(HoarderBug); scareMethods.Add(Flowerman); scareMethods.Add(Crawler); scareMethods.Add(Blob); scareMethods.Add(DressGirl); scareMethods.Add(Puffer); scareMethods.Add(Nutcracker); scareMethods.Add(MouthDog); scareMethods.Add(ForestGiant); scareMethods.Add(SandWorm); scareMethods.Add(RadMech); scareMethods.Add(ClaySurgeon); scareMethods.Add(CaveDweller); scareMethods.Add(FlowerSnake); scareMethods.Add(GiantKiwi); scareMethods.Add(BaboonHawk); scareMethods.Add(SpringMan); scareMethods.Add(Jester); scareMethods.Add(MaskedPlayerEnemy); scareMethods.Add(Butler); } private void Centipede() { } private void SandSpider() { } private void HoarderBug() { } private void Flowerman() { } private void Crawler() { } private void Blob() { } private void DressGirl() { } private void Puffer() { } private void Nutcracker() { } private void MouthDog() { } private void ForestGiant() { } private void SandWorm() { } private void RadMech() { } private void ClaySurgeon() { } private void CaveDweller() { } private void FlowerSnake() { } private void GiantKiwi() { } private void BaboonHawk() { } private void SpringMan() { } private void Jester() { } private void MaskedPlayerEnemy() { } private void Butler() { } public void StartScare(ScareDef scareDef) { ScareDef scareDef2 = scareDef; scareFinished = false; scareMethods.Where((MethodDelegate x) => x.Method.Name == scareDef2.enemyTypeName).FirstOrDefault()?.Invoke(); } public void StopScare() { ((MonoBehaviour)this).StopCoroutine(scareCoroutine); scareCoroutine = null; scareCleanup?.Invoke(); scareCleanup = null; if ((Object)(object)mimicEnemy != (Object)null) { scp.DespawnMimicEnemy(); } } protected override void __initializeVariables() { ((NetworkBehaviour)this).__initializeVariables(); } protected override void __initializeRpcs() { ((NetworkBehaviour)this).__initializeRpcs(); } [MethodImpl(MethodImplOptions.NoInlining)] protected internal override string __getTypeName() { return "ScareManager"; } } internal class SCP2006AI : EnemyAI { public enum ReactionType { Yell, Sprint, FastTurn, Jump } public enum State { Roaming, Sneaking, Scaring, Reaction, Spotted, Wanting, Resting } public enum AudioArray { Bait, Scare, Hit, ReactionFailed, ReactionSuccess, Roaming, SeenSneaking, Sneaking, WatchingTape, Encounter, PlayerFollowing, PlayerKilledReaction, Bonus } [CompilerGenerated] private sealed class <<TryTestTransformationsIfDebugging>g__TestTransformations|113_0>d : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public SCP2006AI <>4__this; private ScareDef[] <>s__1; private int <>s__2; private ScareDef <scare>5__3; private int <index>5__4; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <<TryTestTransformationsIfDebugging>g__TestTransformations|113_0>d(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>s__1 = null; <scare>5__3 = null; <>1__state = -2; } private bool MoveNext() { //IL_0187: Unknown result type (might be due to invalid IL or missing references) //IL_0191: Expected O, but got Unknown //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Expected O, but got Unknown //IL_015b: Unknown result type (might be due to invalid IL or missing references) //IL_0165: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = null; <>1__state = 1; return true; case 1: <>1__state = -1; <>s__1 = <>4__this.scareDefs; <>s__2 = 0; break; case 2: <>1__state = -1; <index>5__4 = (((Object)(object)<>4__this.currentScareDef != (Object)null && <>4__this.currentScareDef.enemyTypeName != "") ? Random.Range(0, <>4__this.currentScareDef.scareSFX.Length) : Random.Range(0, <>4__this.scareSFX.Length)); <>4__this.ScareClientRpc(<index>5__4, Plugin.localPlayer.actualClientId); <>2__current = (object)new WaitForSeconds(<>4__this.currentScareDef.animTime + 3f); <>1__state = 3; return true; case 3: <>1__state = -1; <>4__this.DespawnMimicEnemy(); <>2__current = (object)new WaitForSeconds(3f); <>1__state = 4; return true; case 4: <>1__state = -1; <scare>5__3 = null; <>s__2++; break; } if (<>s__2 < <>s__1.Length) { <scare>5__3 = <>s__1[<>s__2]; <>4__this.currentScareDef = <scare>5__3; <>4__this.SpawnMimicEnemy(); <>2__current = (object)new WaitForSeconds(5f); <>1__state = 2; return true; } <>s__1 = null; 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(); } } public static int DEBUG_scareIndex = -1; public const bool DEBUG_testingTransformations = false; public static UnityEvent<ulong> onPlayerDeath = new UnityEvent<ulong>(); public GameObject DEBUG_hudOverlay; public ScareManager scareManager; public SmartAgentNavigator nav; public ParticleSystem particleSystem; public ScareDef[] scareDefs; public Transform turnCompass; public Transform handTransform; public Collider tapeTriggerCollider; private static Dictionary<ScareDef, int> learnedScares; public ScareDef currentScareDef; public AudioClip laughSFX; public AudioClip tapeGivenSFX; public AudioClip obscureNicheThingSFX; private Terminal terminalScript; private HashSet<string> triggeredActions = new HashSet<string>(); private int score = 0; private readonly Dictionary<string, int> points = new Dictionary<string, int> { { "Yell", 4 }, { "CameraTurn", 1 }, { "Jump", 1 }, { "Run", 3 }, { "Attack", 2 }, { "NoLineOfSight", 3 } }; private Vector3 mainEntranceOutsidePosition; private Vector3 mainEntranceInsidePosition; private List<EntranceTeleport> entrances = new List<EntranceTeleport>(); private bool watchingTV; private VHSTapeBehavior? heldTape; private bool facePlayer; private float turnCompassSpeed = 30f; private float timeSinceLearnScare; private float timeSinceLastSeen; private float timeSinceSwitchBehavior; private float timeSinceLastHit; private float timeSinceStartResting; private float idleTime; private float tapeRefusalCooldown; private int hashSpeed; private EnemyAI? seenEnemy; public EnemyAI? mimicEnemy; private bool spottedByOtherPlayer; private int currentFootstepSurfaceIndex; private int previousFootstepClip; private Vector2 lastCameraAngles; private Vector3 lastPosition; private bool refusedTape; private List<GameObject> ignoredNodes = new List<GameObject>(); private float currentSpeed; private bool waved; private bool annoyedByFollowingPlayer; private NetworkVariable<ulong> targetPlayerId = new NetworkVariable<ulong>(0uL, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0); private PlayerControllerB? closestVisiblePlayer; private PlayerControllerB? closestPlayerVisibleTo; private PlayerControllerB? closestPlayer; private float targetPlayerDistance; private float closestPlayerDistance; private float timePlayerFollowing; private float timeInLOSWithPlayer; private float timeHasLOSToPlayer; private float timeHasLOSToTargetPlayer; private float timeTargetPlayerHasLOS; private bool hasLOSToTargetPlayer; private bool targetPlayerHasLOS; private bool firstTimeEasterEggTriggered; private const float learnScareCooldown = 5f; private const float distanceToStartScare = 10f; private const float distanceToStopScare = 15f; private const float spottedLOSCooldown = 10f; private const float timeToStopScare = 15f; private const float lineOfSightOffset = 2f; private const float playerScreamMinVolume = 0.9f; private const float reactionDelay = 1f; private const int scareSuccessfulScore = 5; private const float maxTurnSpeed = 1000f; private const float reactionTime = 5f; private const float maxWantingTime = 15f; private const float roamingVoiceLineCooldown = 20f; private const float maxTapeWatchingTime = 60f; private const float maxIdleTime = 10f; private float scareCooldown = 60f; private bool faceEnemy; private const float maxScareCooldown = 60f; private const float waveCooldownOffset = -10f; private const float learnScareCooldownOffset = -20f; private const float scareSuccessCooldownOffset = 60f; private const float scareFailCooldownOffset = 30f; private const float spottedCooldownOffset = 30f; private const float minPlayerInLOSTimeToScare = 3f; private const float timeInLOSToBeSpotted = 1f; private const float minSneakTimeToScare = 10f; private const float maxTapeRefusalCooldown = 15f; private const float playerIsFollowingDistance = 7.5f; private const float timePlayerFollowingToGetAnnoyed = 5f; private const float maxSneakSpeed = 15f; private const float minSneakSpeed = 8f; private const float minSpottedTimeToRoam = 10f; private const float timeToStopSneaking = 60f; public AudioClip[] baitSFX; public AudioClip[] scareSFX; public AudioClip[] hitSFX; public AudioClip[] reactionFailedSFX; public AudioClip[] reactionSuccessSFX; public AudioClip[] roamingSFX; public AudioClip[] seenSneakingSFX; public AudioClip[] sneakingSFX; public AudioClip[] watchingTapeSFX; public AudioClip[] encounterSFX; public AudioClip[] playerFollowingSFX; public AudioClip[] playerKilledReactionSFX; public AudioClip[] bonusSFX; private Random audioRandom; private float timeSinceLastVoiceLine; private Dictionary<AudioArray, AudioClip[]> audioMap = new Dictionary<AudioArray, AudioClip[]>(); public static List<SCP2006AI> Instances { get; private set; } = new List<SCP2006AI>(); private bool isInsideFactory => !isOutside; private bool isOutside => nav.IsAgentOutside(); private PlayerControllerB? targetPlayer { get { return Plugin.PlayerFromId(targetPlayerId.Value); } set { targetPlayerId.Value = (((Object)(object)value != (Object)null) ? value.actualClientId : 0); } } private bool hasLOSToPlayer => (Object)(object)closestVisiblePlayer != (Object)null || hasLOSToTargetPlayer; private bool playerHasLOS => (Object)(object)closestPlayerVisibleTo != (Object)null || targetPlayerHasLOS; private bool inLOSWithPlayer => hasLOSToPlayer && (playerHasLOS || targetPlayerHasLOS); private void TryTestTransformationsIfDebugging() { if (!Utils.testing && false) { ((MonoBehaviour)this).StartCoroutine(TestTransformations()); } [IteratorStateMachine(typeof(<<TryTestTransformationsIfDebugging>g__TestTransformations|113_0>d))] IEnumerator TestTransformations() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <<TryTestTransformationsIfDebugging>g__TestTransformations|113_0>d(0) { <>4__this = this }; } } public override void Start() { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_011d: Expected O, but got Unknown //IL_0187: Unknown result type (might be due to invalid IL or missing references) //IL_018c: Unknown result type (might be due to invalid IL or missing references) ((EnemyAI)this).Start(); Plugin.logger.LogDebug((object)"SCP-2006 Spawned"); mainEntranceInsidePosition = RoundManager.FindMainEntrancePosition(true, false); mainEntranceOutsidePosition = RoundManager.FindMainEntrancePosition(true, true); entrances = Object.FindObjectsOfType<EntranceTeleport>(false).ToList(); InitializeAudioMap(); audioRandom = new Random(StartOfRound.Instance.randomMapSeed + base.thisEnemyIndex); onPlayerDeath.AddListener((UnityAction<ulong>)OnPlayerDeath); ignoredNodes = new List<GameObject>(); learnedScares = new Dictionary<ScareDef, int>(); hashSpeed = Animator.StringToHash("speed"); if (!learnedScares.ContainsKey(scareDefs[0])) { learnedScares.Add(scareDefs[0], 1); } if (!learnedScares.ContainsKey(scareDefs[1])) { learnedScares.Add(scareDefs[1], 1); } terminalScript = Object.FindObjectOfType<Terminal>(); TVSetUnlockable.onTapeEjected.AddListener(new UnityAction(OnRestingInterupted)); base.currentBehaviourStateIndex = 0; timeSinceSwitchBehavior = float.PositiveInfinity; nav.SetAllValues(false); nav.OnUseEntranceTeleport.AddListener((UnityAction<bool>)OnUseEntranceTeleport); nav.OnEnableOrDisableAgent.AddListener((UnityAction<bool>)OnEnableOrDisableAgent); if (Utils.isBeta) { Object.Instantiate<GameObject>(DEBUG_hudOverlay, Vector3.zero, Quaternion.identity); } TryTestTransformationsIfDebugging(); } public override void OnNetworkSpawn() { ((NetworkBehaviour)this).OnNetworkSpawn(); if (!Instances.Contains(this)) { Instances.Add(this); } } public override void OnNetworkDespawn() { ((NetworkBehaviour)this).OnNetworkDespawn(); Instances.Remove(this); } public void CustomEnemyAIUpdate() { if (base.inSpecialAnimation || StartOfRound.Instance.allPlayersDead) { nav.StopAgent(); base.agent.speed = 0f; } else if (base.updateDestinationInterval >= 0f) { base.updateDestinationInterval -= Time.deltaTime; } else { ((EnemyAI)this).DoAIInterval(); base.updateDestinationInterval = base.AIIntervalTime + Random.Range(-0.015f, 0.015f); } } public override void Update() { if (!base.isEnemyDead && !StartOfRound.Instance.allPlayersDead) { timeSinceLearnScare += Time.deltaTime; timeSinceLastSeen += Time.deltaTime; timeSinceSwitchBehavior += Time.deltaTime; timeSinceLastHit += Time.deltaTime; timeSinceStartResting += Time.deltaTime; timeSinceLastVoiceLine += Time.deltaTime; CustomEnemyAIUpdate(); timeInLOSWithPlayer = (inLOSWithPlayer ? (timeInLOSWithPlayer + Time.deltaTime) : 0f); timeHasLOSToPlayer = (hasLOSToPlayer ? (timeHasLOSToPlayer + Time.deltaTime) : 0f); timeHasLOSToTargetPlayer = (hasLOSToTargetPlayer ? (timeHasLOSToTargetPlayer + Time.deltaTime) : 0f); timeTargetPlayerHasLOS = (targetPlayerHasLOS ? (timeTargetPlayerHasLOS + Time.deltaTime) : 0f); if (scareCooldown > 0f) { scareCooldown -= Time.deltaTime; } if (tapeRefusalCooldown > 0f) { tapeRefusalCooldown -= Time.deltaTime; } else { refusedTape = false; } if (closestPlayerDistance <= 7.5f && (Object)(object)closestPlayer != (Object)(object)targetPlayer) { timePlayerFollowing += Time.deltaTime; } else { timePlayerFollowing = 0f; } } } public void LateUpdate() { //IL_01b4: Unknown result type (might be due to invalid IL or missing references) //IL_01ba: Unknown result type (might be due to invalid IL or missing references) //IL_01bf: 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_01fd: 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_004b: 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_0072: 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_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_0102: 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_0118: 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_016b: 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_018a: Unknown result type (might be due to invalid IL or missing references) //IL_018f: Unknown result type (might be due to invalid IL or missing references) //IL_01a0: Unknown result type (might be due to invalid IL or missing references) MimicEnemyUpdate(); if (((NetworkBehaviour)this).IsServer) { if (facePlayer) { if ((Object)(object)targetPlayer != (Object)null) { turnCompass.LookAt(((Component)targetPlayer.gameplayCamera).transform.position); ((Component)this).transform.rotation = Quaternion.Lerp(((Component)this).transform.rotation, Quaternion.Euler(new Vector3(0f, turnCompass.eulerAngles.y, 0f)), turnCompassSpeed * Time.deltaTime); } else if ((Object)(object)closestPlayer != (Object)null) { turnCompass.LookAt(((Component)closestPlayer.gameplayCamera).transform.position); ((Component)this).transform.rotation = Quaternion.Lerp(((Component)this).transform.rotation, Quaternion.Euler(new Vector3(0f, turnCompass.eulerAngles.y, 0f)), turnCompassSpeed * Time.deltaTime); } } if (faceEnemy && (Object)(object)seenEnemy != (Object)null) { turnCompass.LookAt(seenEnemy.eye.position); ((Component)this).transform.rotation = Quaternion.Lerp(((Component)this).transform.rotation, Quaternion.Euler(new Vector3(0f, turnCompass.eulerAngles.y, 0f)), turnCompassSpeed * Time.deltaTime); } } Vector3 val = ((Component)this).transform.position - lastPosition; currentSpeed = ((Vector3)(ref val)).magnitude / Time.deltaTime / 2f; base.creatureAnimator.SetFloat(hashSpeed, currentSpeed); lastPosition = ((Component)this).transform.position; idleTime = ((currentSpeed > 0.1f) ? 0f : (idleTime + Time.deltaTime)); tapeTriggerCollider.enabled = currentSpeed < 0.1f && base.currentBehaviourStateIndex == 5; } public void MimicEnemyUpdate() { //IL_00ea: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)mimicEnemy != (Object)null && ((Behaviour)mimicEnemy).enabled && (Object)(object)mimicEnemy.agent != (Object)null && ((Behaviour)mimicEnemy.agent).enabled) { mimicEnemy.agent.obstacleAvoidanceType = (ObstacleAvoidanceType)0; mimicEnemy.agent.speed = base.agent.speed; mimicEnemy.agent.angularSpeed = base.agent.angularSpeed; mimicEnemy.agent.acceleration = base.agent.acceleration; mimicEnemy.agent.stoppingDistance = base.agent.stoppingDistance; mimicEnemy.movingTowardsTargetPlayer = false; mimicEnemy.SetDestinationToPosition(((Component)this).transform.position, false); } } public override void DoAIInterval() { //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Unknown result type (might be due to invalid IL or missing references) //IL_017d: 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_01d7: Unknown result type (might be due to invalid IL or missing references) //IL_01e2: Unknown result type (might be due to invalid IL or missing references) //IL_094d: Unknown result type (might be due to invalid IL or missing references) //IL_0b86: Unknown result type (might be due to invalid IL or missing references) //IL_0b8b: Unknown result type (might be due to invalid IL or missing references) //IL_0b93: Unknown result type (might be due to invalid IL or missing references) //IL_0b98: Unknown result type (might be due to invalid IL or missing references) //IL_0aad: Unknown result type (might be due to invalid IL or missing references) //IL_0abc: Unknown result type (might be due to invalid IL or missing references) //IL_0c4b: Unknown result type (might be due to invalid IL or missing references) //IL_0b53: Unknown result type (might be due to invalid IL or missing references) //IL_0b04: Unknown result type (might be due to invalid IL or missing references) //IL_0b1f: Unknown result type (might be due to invalid IL or missing references) //IL_0342: Unknown result type (might be due to invalid IL or missing references) //IL_048d: Unknown result type (might be due to invalid IL or missing references) if (base.currentBehaviourStateIndex == 3 && (Object)(object)targetPlayer != (Object)null && (Object)(object)Plugin.localPlayer == (Object)(object)targetPlayer) { if (targetPlayer.isSprinting && !triggeredActions.Contains("Run")) { Plugin.logger.LogDebug((object)"Running on client reaction triggered"); TriggerReaction("Run"); TriggerReactionServerRpc("Run"); } if (targetPlayer.isJumping && !triggeredActions.Contains("Jump")) { Plugin.logger.LogDebug((object)"Jumping on client reaction triggered"); TriggerReaction("Jump"); TriggerReactionServerRpc("Jump"); } } if (!((NetworkBehaviour)this).IsServer) { return; } targetPlayerHasLOS = (Object)(object)targetPlayer != (Object)null && targetPlayer.HasLineOfSightToPosition(((Component)this).transform.position + Vector3.up * 2f, 45f, 60, -1f); hasLOSToTargetPlayer = (Object)(object)targetPlayer != (Object)null && HasLineOfSightToPlayer(targetPlayer); targetPlayerDistance = (((Object)(object)targetPlayer != (Object)null) ? Vector3.Distance(((Component)this).transform.position, ((Component)targetPlayer).transform.position) : (-1f)); closestPlayer = GetClosestPlayer(); closestVisiblePlayer = GetClosestPlayer(requireLineOfSight: true); closestPlayerDistance = (((Object)(object)closestPlayer != (Object)null) ? Vector3.Distance(((Component)closestPlayer).transform.position, ((Component)this).transform.position) : (-1f)); closestPlayerVisibleTo = GetClosestPlayerVisibleTo(); if (playerHasLOS) { timeSinceLastSeen = 0f; } UpdateTestingHUD(); switch (base.currentBehaviourStateIndex) { case 0: base.agent.speed = 5f; if ((Object)(object)heldTape != (Object)null && CanWatchTV() && timeSinceSwitchBehavior > 10f) { SwitchToBehaviourClientRpc(6); break; } CheckForPlayerWithTape(); if (!waved && inLOSWithPlayer && closestPlayerDistance < 5f) { waved = true; base.inSpecialAnimation = true; facePlayer = true; DoAnimationClientRpc("wave"); AddOffsetToScareCooldown(-10f); break; } if (scareCooldown <= 0f && !playerHasLOS) { targetPlayer = Utils.GetRandomPlayer(); if ((Object)(object)targetPlayer != (Object)null && SmartCanPathToPoint(((Component)targetPlayer).transform.position)) { currentScareDef = GetWeightedRandomScare(); PlayRandomClipClientRpc(AudioArray.Sneaking, targetPlayer.actualClientId); SwitchToBehaviourClientRpc(1); break; } } if (timeSinceLearnScare > 5f) { GameObject val2 = ((EnemyAI)this).CheckLineOfSight(GetLearnableEnemies(), 45f, 60, -1f, (Transform)null, (int[])null); if ((Object)(object)val2 != (Object)null && val2.TryGetComponent<EnemyAI>(ref seenEnemy)) { timeSinceLearnScare = 0f; ScareDef scareDef = scareDefs.Where((ScareDef x) => x.enemyTypeName == ((Object)seenEnemy.enemyType).name).FirstOrDefault(); if ((Object)(object)scareDef == (Object)null) { break; } AddScarePoint(scareDef); faceEnemy = true; LearnScareClientRpc(scareDef.enemyTypeName); AddOffsetToScareCooldown(-20f); } } if (HasReachedTargetNode()) { GameObject? randomNode = Utils.GetRandomNode(ignoredNodes.ToArray()); base.targetNode = ((randomNode != null) ? randomNode.transform : null); } if ((Object)(object)base.targetNode != (Object)null && !SetDestinationToPosition(base.targetNode.position)) { ignoredNodes.Add(((Component)base.targetNode).gameObject); base.targetNode = null; } else if (timeSinceLastVoiceLine > 20f) { timeSinceLastVoiceLine = 0f; PlayRandomClipClientRpc(AudioArray.Roaming); } break; case 1: facePlayer = true; if ((Object)(object)targetPlayer == (Object)null || !targetPlayer.isPlayerControlled) { targetPlayer = Utils.GetRandomPlayer(); break; } if (timeTargetPlayerHasLOS > 1f && targetPlayerDistance < 15f) { Plugin.logger.LogDebug((object)"Spotted by target player"); AddOffsetToScareCooldown(30f); SpottedClientRpc(AudioArray.SeenSneaking); break; } if (timeSinceSwitchBehavior > 10f && timeHasLOSToTargetPlayer > 3f && targetPlayerDistance <= 10f) { Plugin.logger.LogDebug((object)"Starting scare"); SpawnMimicEnemy(); SwitchToBehaviourClientRpc(2); break; } if (!annoyedByFollowingPlayer && timePlayerFollowing > 5f) { annoyedByFollowingPlayer = true; PlayRandomClipClientRpc(AudioArray.PlayerFollowing, targetPlayer.actualClientId, 0.5f); } SneakTargetPlayer(); break; case 2: base.agent.speed = 5f; base.agent.stoppingDistance = 15f; facePlayer = true; if ((Object)(object)targetPlayer == (Object)null || !targetPlayer.isPlayerControlled) { DespawnMimicEnemy(); SwitchToBehaviourClientRpc(0); } else if (targetPlayerHasLOS) { int scareSFXIndex = (((Object)(object)currentScareDef != (Object)null && currentScareDef.enemyTypeName != "") ? Random.Range(0, currentScareDef.scareSFX.Length) : Random.Range(0, scareSFX.Length)); triggeredActions.Clear(); score = 0; ScareClientRpc(scareSFXIndex, targetPlayer.actualClientId); } else if (targetPlayerDistance > 15f || timeSinceSwitchBehavior > 15f) { DespawnMimicEnemy(); SwitchToBehaviourClientRpc(1); } break; case 3: base.agent.speed = 0f; facePlayer = true; if ((Object)(object)targetPlayer == (Object)null || (Object)(object)currentScareDef == (Object)null || !targetPlayer.isPlayerControlled) { SwitchToBehaviourClientRpc(4); break; } if (timeSinceSwitchBehavior > 1f) { TrackCameraMovement(); if (!triggeredActions.Contains("NoLineOfSight") && !hasLOSToTargetPlayer) { TriggerReaction("NoLineOfSight"); } } if (timeSinceSwitchBehavior - 1f > currentScareDef.animTime + 5f) { DespawnMimicEnemy(); if (score >= 5) { AddScarePoint(currentScareDef); base.inSpecialAnimation = true; DoAnimationClientRpc("laugh"); AddOffsetToScareCooldown(60f); } else { RemoveScarePoint(currentScareDef); PlayRandomClipClientRpc(AudioArray.ReactionFailed); AddOffsetToScareCooldown(30f); } SwitchToBehaviourClientRpc(4); } break; case 4: base.agent.speed = 8f; if ((timeSinceLastSeen > 10f && timeSinceSwitchBehavior > 10f) || (Object)(object)closestPlayer == (Object)null) { SwitchToBehaviourClientRpc(0); break; } CheckForPlayerWithTape(); AvoidPlayer(closestPlayer); break; case 5: { base.agent.speed = 5f; base.agent.stoppingDistance = 5f; facePlayer = true; if (timeSinceSwitchBehavior > 15f || !GetClosestPlayerWithTape(10f, out PlayerControllerB playerWithTape) || !SetDestinationToPosition(((Component)playerWithTape).transform.position)) { tapeRefusalCooldown = 15f; refusedTape = true; SwitchToBehaviourClientRpc(4); } break; } case 6: { base.agent.speed = 5f; if (watchingTV) { if ((Object)(object)TVSetUnlockable.Instance == (Object)null || (Object)(object)TVSetUnlockable.Instance.tapeInVHS == (Object)null) { watchingTV = false; ((Behaviour)base.agent).enabled = true; RepositionAgent(); TVSetUnlockable.Instance?.SetTVSetInUseClientRpc(value: false); SwitchToBehaviourClientRpc(4); } else if (timeSinceStartResting > 60f) { AddScarePoint(TVSetUnlockable.Instance.tapeInVHS.currentScareDef); watchingTV = false; ((Behaviour)base.agent).enabled = true; RepositionAgent(); TVSetUnlockable.Instance.SetTVSetInUseClientRpc(value: false); SwitchToBehaviourClientRpc(4); AddOffsetToScareCooldown(60f); } break; } if (!CanWatchTV()) { SwitchToBehaviourClientRpc(0); break; } if ((Object)(object)TVSetUnlockable.Instance != (Object)null) { if (Vector3.Distance(((Component)this).transform.position, ((Component)TVSetUnlockable.Instance).transform.position) < 1f) { base.moveTowardsDestination = false; base.agent.ResetPath(); ((Behaviour)base.agent).enabled = false; ((Component)this).transform.position = TVSetUnlockable.Instance.sitPositonSCP2006.position; ((Component)this).transform.rotation = TVSetUnlockable.Instance.sitPositonSCP2006.rotation; WatchTapeClientRpc(); watchingTV = true; timeSinceStartResting = 0f; } else if (!SetDestinationToPosition(((Component)TVSetUnlockable.Instance).transform.position)) { SwitchToBehaviourClientRpc(0); } break; } Vector3 position = ((Component)terminalScript).transform.position; if (Vector3.Distance(((Component)this).transform.position, position) < 3f) { base.agent.ResetPath(); UnlockableItem val = StartOfRound.Instance.unlockablesList.unlockables.Where((UnlockableItem x) => x.unlockableName == "TVSet").First(); int num = StartOfRound.Instance.unlockablesList.unlockables.IndexOf(val); if (val.alreadyUnlocked || val.hasBeenUnlockedByPlayer) { StartOfRound.Instance.SpawnUnlockable(num, true); } else { StartOfRound.Instance.UnlockShipObject(num); } } else if (!SetDestinationToPosition(position)) { SwitchToBehaviourClientRpc(0); } break; } default: Plugin.logger.LogWarning((object)("Invalid state: " + base.currentBehaviourStateIndex)); break; } } private void UpdateTestingHUD() { if (Utils.isBeta && (Object)(object)TestingHUDOverlay.Instance != (Object)null) { TestingHUDOverlay.Instance.label1.text = "ScareCooldown: " + scareCooldown; Text label = TestingHUDOverlay.Instance.label2; State currentBehaviourStateIndex = (State)base.currentBehaviourStateIndex; label.text = currentBehaviourStateIndex.ToString(); TestingHUDOverlay.Instance.label3.text = "ClosestPlayer: " + closestPlayer?.playerUsername; TestingHUDOverlay.Instance.toggle1.isOn = isOutside; TestingHUDOverlay.Instance.toggle1Label.text = "isOutside"; TestingHUDOverlay.Instance.toggle2.isOn = base.inSpecialAnimation; TestingHUDOverlay.Instance.toggle2Label.text = "inSpecialAnimation"; } } private void OnUseEntranceTeleport(bool setOutside) { Plugin.logger.LogDebug((object)("EntranceTeleport used. isOutside = " + setOutside)); } private void OnEnableOrDisableAgent(bool agentEnabled) { Plugin.logger.LogDebug((object)("Agent enabled = " + agentEnabled)); } public PlayerControllerB? GetClosestPlayer(bool requireLineOfSight = false) { //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_005f: 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_008d: Unknown result type (might be due to invalid IL or missing references) PlayerControllerB result = null; float num = float.PositiveInfinity; PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; foreach (PlayerControllerB val in allPlayerScripts) { if (PlayerIsTargetable(val) && (!requireLineOfSight || !Physics.Linecast(((Component)this).transform.position + Vector3.up * 2f, ((Component)val).transform.position, 256))) { float num2 = Vector3.Distance(((Component)this).transform.position, ((Component)val).transform.position); if (num2 < num) { num = num2; result = val; } } } return result; } public bool SetDestinationToPosition(Vector3 position) { //IL_0006: 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_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_001f: 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) position = RoundManager.Instance.GetNavMeshPosition(position, RoundManager.Instance.navHit, 5f, -1); if (!SmartCanPathToPoint(position)) { return false; } return nav.DoPathingToDestination(position); } public bool SmartCanPathToPoint(Vector3 position) { //IL_000c: 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_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_003d: 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_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: 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_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_010e: 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_011e: 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_0127: 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_013d: Unknown result type (might be due to invalid IL or missing references) Vector3 navMeshPosition = RoundManager.Instance.GetNavMeshPosition(((Component)this).transform.position, RoundManager.Instance.navHit, 5f, -1); position = RoundManager.Instance.GetNavMeshPosition(position, RoundManager.Instance.navHit, 5f, -1); if (nav.CanPathToPoint(navMeshPosition, position) > 0f) { return true; } foreach (EntranceTeleport entrance in entrances) { if (!(isInsideFactory ? (!entrance.isEntranceToBuilding) : entrance.isEntranceToBuilding)) { continue; } Vector3 navMeshPosition2 = RoundManager.Instance.GetNavMeshPosition(entrance.entrancePoint.position, RoundManager.Instance.navHit, 5f, -1); if (!((Object)(object)entrance.exitPoint == (Object)null) || entrance.FindExitPoint()) { Vector3 navMeshPosition3 = RoundManager.Instance.GetNavMeshPosition(entrance.exitPoint.position, RoundManager.Instance.navHit, 5f, -1); if (nav.CanPathToPoint(navMeshPosition, navMeshPosition2) > 0f && nav.CanPathToPoint(navMeshPosition3, position) > 0f) { return true; } } } return false; } private void RepositionAgent() { //IL_000c: 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_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) Vector3 navMeshPosition = RoundManager.Instance.GetNavMeshPosition(((Component)this).transform.position, RoundManager.Instance.navHit, 5f, -1); base.agent.Warp(navMeshPosition); } private Vector3 GetPointOnPathTowardsPlayer(Vector3 enemyPos, Vector3 playerPos, float offsetFromPlayer) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0113: 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_0044: 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_009b: Unknown result type (might be due to invalid IL or missing references) //IL_010e: 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_00cc: 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_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) NavMeshPath val = new NavMeshPath(); if (!NavMesh.CalculatePath(enemyPos, playerPos, -1, val)) { return playerPos; } float num = 0f; for (int i = 0; i < val.corners.Length - 1; i++) { num += Vector3.Distance(val.corners[i], val.corners[i + 1]); } float num2 = Mathf.Max(0f, num - offsetFromPlayer); float num3 = 0f; for (int j = 0; j < val.corners.Length - 1; j++) { float num4 = Vector3.Distance(val.corners[j], val.corners[j + 1]); if (num3 + num4 >= num2) { float num5 = num2 - num3; float num6 = num5 / num4; return Vector3.Lerp(val.corners[j], val.corners[j + 1], num6); } num3 += num4; } return playerPos; } private void CheckForPlayerWithTape() { //IL_003e: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)heldTape == (Object)null && !refusedTape && CanWatchTV() && GetClosestPlayerWithTape(10f, out PlayerControllerB playerWithTape) && (Object)(object)playerWithTape != (Object)null && SetDestinationToPosition(((Component)playerWithTape).transform.position)) { targetPlayer = playerWithTape; SwitchToBehaviourClientRpc(5); } } public void AvoidPlayer(PlayerControllerB playerToAvoid) { //IL_0022: 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) GameObject farthestGameObjectFromPosition = Utils.insideAINodes.Where((GameObject x) => !ignoredNodes.Contains(x)).ToList().GetFarthestGameObjectFromPosition(((Component)playerToAvoid).transform.position); if ((Object)(object)farthestGameObjectFromPosition == (Object)null) { Plugin.logger.LogDebug((object)"Farthest node is null in AvoidPlayer"); } else if (!SetDestinationToPosition(farthestGameObjectFromPosition.transform.position)) { ignoredNodes.Add(farthestGameObjectFromPosition); } } private void SneakTargetPlayer() { //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_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_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_00f9: 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_00af: 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_0143: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)targetPlayer == (Object)null) { return; } nav.AdjustSpeedBasedOnDistance(base.agent.stoppingDistance, 15f, 8f, 15f, 1f); if (isOutside) { if (ShouldStopBecauseClose()) { nav.StopAgent(); } else { SetDestinationToPosition(((Component)targetPlayer).transform.position); } return; } if (targetPlayer.isInsideFactory != isInsideFactory) { SetDestinationToPosition(((Component)targetPlayer).transform.position); return; } Vector3 val = GetPointOnPathTowardsPlayer(((Component)this).transform.position, ((Component)targetPlayer).transform.position, 3f) + Vector3.up * 2f; if (!targetPlayer.HasLineOfSightToPosition(val, 45f, 60, -1f)) { if (ShouldStopBecauseClose()) { nav.StopAgent(); } else { SetDestinationToPosition(((Component)targetPlayer).transform.position); } return; } base.agent.speed = 15f; if (!targetPlayerHasLOS) { nav.StopAgent(); } else { AvoidPlayer(targetPlayer); } bool ShouldStopBecauseClose() { return hasLOSToTargetPlayer && targetPlayerDistance < 9f; } } public PlayerControllerB? GetClosestPlayerVisibleTo() { //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_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) PlayerControllerB result = null; float num = float.PositiveInfinity; PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; foreach (PlayerControllerB val in allPlayerScripts) { if (PlayerIsTargetable(val)) { float num2 = Vector3.Distance(((Component)val).transform.position, ((Component)this).transform.position); if (!(num2 > num) && val.HasLineOfSightToPosition(((Component)this).transform.position + Vector3.up * 2f, 45f, 60, -1f)) { num = num2; result = val; } } } return result; } private void AddOffsetToScareCooldown(float offset) { scareCooldown += offset; scareCooldown = Mathf.Min(scareCooldown, 60f); } private List<GameObject> GetLearnableEnemies() { List<GameObject> list = new List<GameObject>(); foreach (EnemyAI enemy in RoundManager.Instance.SpawnedEnemies) { ScareDef scareDef = scareDefs.FirstOrDefault((ScareDef x) => x.enemyTypeName == ((Object)enemy.enemyType).name); if (!((Object)(object)scareDef == (Object)null) && !learnedScares.ContainsKey(scareDef)) { list.Add(((Component)enemy).gameObject); } } return list; } public bool CanWatchTV() { //IL_0044: 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_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)TVSetUnlockable.Instance != (Object)null && TVSetUnlockable.Instance.inUse) { return false; } TVSetUnlockable? instance = TVSetUnlockable.Instance; Vector3 position = ((instance != null) ? ((Component)instance).transform.position : ((Component)terminalScript).transform.position); return SmartCanPathToPoint(position); } private bool GetClosestPlayerWithTape(float distance, out PlayerControllerB? playerWithTape) { //IL_0050: 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) playerWithTape = null; float num = distance; PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; foreach (PlayerControllerB val in allPlayerScripts) { if (!((Object)(object)val == (Object)null) && PlayerIsTargetable(val) && val.currentlyHeldObjectServer is VHSTapeBehavior) { float num2 = Vector3.Distance(((Component)this).transform.position, ((Component)val).transform.position); if (!(num2 > num)) { playerWithTape = val; num = num2; } } } return (Object)(object)playerWithTape != (Object)null; } public void TriggerReaction(string actionName) { if (!triggeredActions.Contains(actionName)) { triggeredActions.Add(actionName); if (points.TryGetValue(actionName, out var value)) { score += value; } Plugin.logger.LogDebug((object)$"Triggered {actionName}: +{points[actionName]} (total {score})"); } } private void AddScarePoint(ScareDef scareDef) { if (!((Object)(object)scareDef == (Object)null)) { if (!learnedScares.ContainsKey(scareDef)) { learnedScares.Add(scareDef, 0); } learnedScares[scareDef]++; Plugin.logger.LogDebug((object)("Added scare point for: " + (object)scareDef)); } } private void RemoveScarePoint(ScareDef scareDef) { if (learnedScares.ContainsKey(scareDef)) { learnedScares[scareDef]--; if (learnedScares[scareDef] < 1) { learnedScares.Remove(scareDef); } Plugin.logger.LogDebug((object)("Removed scare point for: " + (object)scareDef)); } } private ScareDef GetWeightedRandomScare() { if (Utils.testing && DEBUG_scareIndex >= 0) { return scareDefs[DEBUG_scareIndex]; } Dictionary<ScareDef, int> dictionary = learnedScares.Where<KeyValuePair<ScareDef, int>>((KeyValuePair<ScareDef, int> x) => x.Key.enemyTypeName == "" || x.Key.outside == isOutside).ToDictionary((KeyValuePair<ScareDef, int> x) => x.Key, (KeyValuePair<ScareDef, int> x) => x.Value); ScareDef[] array = dictionary.Keys.ToArray(); int[] weights = dictionary.Values.ToArray(); int randomWeightedIndex = GetRandomWeightedIndex(weights); return array[randomWeightedIndex]; } public int GetRandomWeightedIndex(int[] weights) { if (weights == null || weights.Length == 0) { Plugin.logger.LogDebug((object)"Could not get random weighted index; array is empty or null."); return -1; } int num = 0; for (int i = 0; i < weights.Length; i++) { if (weights[i] >= 0) { num += weights[i]; } } if (num <= 0) { return Random.Range(0, weights.Length); } float num2 = Random.Range(0f, 1f); float num3 = 0f; for (int j = 0; j < weights.Length; j++) { if (!((float)weights[j] <= 0f)) { num3 += (float)weights[j] / (float)num; if (num3 >= num2) { return j; } } } Plugin.logger.LogError((object)"Error while calculating random weighted index. Choosing randomly. Weights given:"); for (int k = 0; k < weights.Length; k++) { Plugin.logger.LogError((object)$"{weights[k]},"); } return Random.Range(0, weights.Length); } private bool HasReachedTargetNode() { //IL_001c: 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) if ((Object)(object)base.targetNode == (Object)null) { return true; } return Vector3.Distance(((Component)this).transform.position, base.targetNode.position) < 1f; } private bool HasLineOfSightToPlayer(PlayerControllerB player, float width = 45f, int range = 20, int proximityAwareness = -1) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Invalid comparison between Unknown and I4 //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_0048: 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_0063: 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_0084: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: 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_00ba: Unknown result type (might be due to invalid IL or missing references) if (isOutside && !base.enemyType.canSeeThroughFog && (int)TimeOfDay.Instance.currentLevelWeather == 3) { range = Mathf.Clamp(range, 0, 30); } Vector3 position = ((Component)player.gameplayCamera).transform.position; if (Vector3.Distance(position, base.eye.position) < (float)range && !Physics.Linecast(base.eye.position, position, StartOfRound.Instance.collidersAndRoomMaskAndDefault, (QueryTriggerInteraction)1)) { Vector3 val = position - base.eye.position; if (Vector3.Angle(base.eye.forward, val) < width || (proximityAwareness != -1 && Vector3.Distance(base.eye.position, position) < (float)proximityAwareness)) { return true; } } return false; } public override void DetectNoise(Vector3 noisePosition, float noiseLoudness, int timesPlayedInOneSpot = 0, int noiseID = 0) { //IL_0002: 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_0042: Unknown result type (might be due to invalid IL or missing references) ((EnemyAI)this).DetectNoise(noisePosition, noiseLoudness, timesPlayedInOneSpot, noiseID); if (base.currentBehaviourStateIndex == 3 && (Object)(object)targetPlayer != (Object)null && noiseLoudness >= 0.9f && noiseID == 75 && Vector3.Distance(((Component)targetPlayer).transform.position, noisePosition) < 1f) { TriggerReaction("Yell"); } } private void TrackCameraMovement() { //IL_002f: 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_0063: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) if (!triggeredActions.Contains("CameraTurn")) { Vector2 val = default(Vector2); ((Vector2)(ref val))..ctor(((Component)targetPlayer.gameplayCamera).transform.eulerAngles.x, ((Component)targetPlayer.gameplayCamera).transform.eulerAngles.y); float num = Mathf.DeltaAngle(lastCameraAngles.x, val.x); float num2 = Mathf.DeltaAngle(lastCameraAngles.y, val.y); Vector2 val2 = new Vector2(num, num2); float num3 = ((Vector2)(ref val2)).magnitude / Time.deltaTime; lastCameraAngles = val; if (num3 > 1000f && timeSinceSwitchBehavior > 1f) { TriggerReaction("CameraTurn"); } } } public bool PlayerIsTargetable(PlayerControllerB playerScript) { if ((Object)(object)playerScript != (Object)null && playerScript.isPlayerControlled && !playerScript.isPlayerDead && (Object)(object)playerScript.inAnimationWithEnemy == (Object)null && playerScript.sinkingValue < 0.73f) { return true; } return false; } private void GetCurrentMaterialStandingOn() { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_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_001d: 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) Ray val = default(Ray); ((Ray)(ref val))..ctor(((Component)this).transform.position + Vector3.up, -Vector3.up); RaycastHit val2 = default(RaycastHit); if (!Physics.Raycast(val, ref val2, 6f, StartOfRound.Instance.walkableSurfacesMask, (QueryTriggerInteraction)1) || ((Component)((RaycastHit)(ref val2)).collider).CompareTag(StartOfRound.Instance.footstepSurfaces[currentFootstepSurfaceIndex].surfaceTag)) { return; } for (int i = 0; i < StartOfRound.Instance.footstepSurfaces.Length; i++) { if (((Component)((RaycastHit)(ref val2)).collider).CompareTag(StartOfRound.Instance.footstepSurfaces[i].surfaceTag)) { currentFootstepSurfaceIndex = i; break; } } } public override void HitEnemy(int force = 0, PlayerControllerB? playerWhoHit = null, bool playHitSFX = true, int hitID = -1) { Plugin.logger.LogDebug((object)"In HitEnemy()"); if (base.currentBehaviourStateIndex == 3) { TriggerReaction("Attack"); } else { if (timeSinceLastHit < 3f || base.currentBehaviourStateIndex == 6) { return; } timeSinceLastHit = 0f; base.inSpecialAnimation = true; Plugin.logger.LogDebug((object)"DoAnimation: spotted"); base.creatureAnimator.SetTrigger("spotted"); PlayRandomClipOnLocalClient(AudioArray.Hit); if (((NetworkBehaviour)this).IsServer) { targetPlayer = null; if (base.currentBehaviourStateIndex != 4) { SwitchToBehaviourClientRpc(4); } } } } public void SetInSpecialAnimationFalse() { Plugin.logger.LogDebug((object)"inSpecialAnimation false"); base.inSpecialAnimation = false; } public void PlayFootstepSFX() { if (base.currentBehaviourStateIndex != 1) { GetCurrentMaterialStandingOn(); int num = Random.Range(0, StartOfRound.Instance.footstepSurfaces[currentFootstepSurfaceIndex].clips.Length); if (num == previousFootstepClip) { num = (num + 1) % StartOfRound.Instance.footstepSurfaces[currentFootstepSurfaceIndex].clips.Length; } base.creatureSFX.pitch = Random.Range(0.93f, 1.07f); base.creatureSFX.PlayOneShot(StartOfRound.Instance.footstepSurfaces[currentFootstepSurfaceIndex].clips[num], 0.6f); previousFootstepClip = num; } } public void PlayLaughSFX() { Plugin.logger.LogDebug((object)"PlayLaughSFX"); base.creatureVoice.PlayOneShot(laughSFX); } public void FinishLaughAnimation() { Plugin.logger.LogDebug((object)"FinishLaughAnimation called"); base.inSpecialAnimation = false; PlayRandomClipOnLocalClient(AudioArray.ReactionSuccess); } public void FinishWaveAnimation() { Plugin.logger.LogDebug((object)"FinishWaveAnimation called"); base.inSpecialAnimation = false; facePlayer = false; } public void FinishThinkAnimation() { Plugin.logger.LogDebug((object)"FinishThinkAnimation called"); base.inSpecialAnimation = false; faceEnemy = false; } public void GiveTape() { //IL_007c: 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_0092: Unknown result type (might be due to invalid IL or missing references) GrabbableObject currentlyHeldObjectServer = Plugin.localPlayer.currentlyHeldObjectServer; if (!((Object)(object)currentlyHeldObjectServer == (Object)null) && ((NetworkBehaviour)currentlyHeldObjectServer).NetworkObject.IsSpawned) { if (((Object)currentlyHeldObjectServer.itemProperties).name == "EasterEgg") { TriggerEasterEggServerRpc(); } else if (currentlyHeldObjectServer is VHSTapeBehavior) { Plugin.logger.LogDebug((object)"Giving tape to SCP-2006"); Plugin.localPlayer.DiscardHeldObject(false, (NetworkObject)null, default(Vector3), true); GiveTapeServerRpc(NetworkObjectReference.op_Implicit(((NetworkBehaviour)currentlyHeldObjectServer).NetworkObject)); } } } public void SpawnMimicEnemy() { //IL_008d: 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_00ce: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)mimicEnemy != (Object)null) { return; } if ((Object)(object)currentScareDef == (Object)null || currentScareDef.enemyTypeName == "") { SetDefaultScareClientRpc(Random.Range(0, baitSFX.Length)); return; } SpawnableEnemyWithRarity val = (from x in Utils.GetEnemies() where ((Object)x.enemyType).name == currentScareDef.enemyTypeName select x).First(); GameObject enemyPrefab = val.enemyType.enemyPrefab; GameObject val2 = Object.Instantiate<GameObject>(enemyPrefab, ((Component)this).transform.position, ((Component)this).transform.rotation, ((Component)this).transform); val2.GetComponent<NetworkObject>().Spawn(true); mimicEnemy = val2.GetComponent<EnemyAI>(); SpawnMimicEnemyClientRpc(NetworkObjectReference.op_Implicit(((NetworkBehaviour)mimicEnemy).NetworkObject), Random.Range(0, currentScareDef.baitSFX.Length)); } public void DespawnMimicEnemy() { if (!((Object)(object)mimicEnemy == (Object)null) && ((NetworkBehaviour)mimicEnemy).NetworkObject.IsSpawned) { Plugin.logger.LogDebug((object)("Despawning mimic enemy " + ((Object)mimicEnemy.enemyType).name)); ((NetworkBehaviour)mimicEnemy).NetworkObject.Despawn(true); mimicEnemy = null; ((EnemyAI)this).EnableEnemyMesh(true, false); DespawnMimicEnemyClientRpc(); } } public void DropTapeOnLocalClient(Vector3 position) { //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_006b: 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_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) if (!((Object)(object)heldTape == (Object)null)) { GrabbableObject val = (GrabbableObject)(object)heldTape; val.parentObject = null; ((Component)val).transform.SetParent(StartOfRound.Instance.propsContainer, true); val.EnablePhysics(true); val.fallTime = 0f; val.startFallingPosition = ((Component)val).transform.parent.InverseTransformPoint(((Component)val).transform.position); val.targetFloorPosition = ((Component)val).transform.parent.InverseTransformPoint(position); val.floorYRot = -1; val.DiscardItemFromEnemy(); val.isHeldByEnemy = false; HoarderBugAI.grabbableObjectsInMap.Add(((Component)val).gameObject); heldTape = null; } } public void OnRestingInterupted() { if (watchingTV && ((NetworkBehaviour)this).IsServer) { watchingTV = false; ((Behaviour)base.agent).enabled = true; RepositionAgent(); TVSetUnlockable.Instance?.SetTVSetInUseClientRpc(value: false); SwitchToBehaviourClientRpc(4); } } public void OnPlayerDeath(ulong clientId) { if (((NetworkBehaviour)this).IsServer) { scareManager.StopScare(); SpottedClientRpc(AudioArray.PlayerKilledReaction); } } public void SwitchToBehaviourStateOnLocalClient(int stateIndex) { if (base.currentBehaviourStateIndex != stateIndex) { ManualLogSource logger = Plugin.logger; State state = (State)stateIndex; logger.LogDebug((object)("Switching behavior to " + state)); base.previousBehaviourStateIndex = base.currentBehaviourStateIndex; base.currentBehaviourStateIndex = stateIndex; base.currentBehaviourState = base.enemyBehaviourStates[stateIndex]; ((EnemyAI)this).PlayAudioOfCurrentState(); ((EnemyAI)this).PlayAnimationOfCurrentState(); timeSinceSwitchBehavior = 0f; base.creatureAnimator.SetBool("sneaking", base.currentBehaviourStateIndex == 1); base.creatureAnimator.SetBool("wanting", base.currentBehaviourStateIndex == 5); base.creatureAnimator.SetBool("running", base.currentBehaviourStateIndex == 4); BehaviourSwitchCleanUp(); } } public void BehaviourSwitchCleanUp() { facePlayer = false; faceEnemy = false; spottedByOtherPlayer = false; ignoredNodes.Clear(); waved = false; annoyedByFollowingPlayer = false; if (((NetworkBehaviour)this).IsServer) { ((Behaviour)base.agent).enabled = true; base.agent.stoppingDistance = 0f; } } [ClientRpc] public void SwitchToBehaviourClientRpc(int stateIndex) { //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) { return; } if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(2440326435u, val, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val2, stateIndex); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2440326435u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsClient || networkManager.IsHost)) { ((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0; if (stateIndex != base.currentBehaviourStateIndex) { SwitchToBehaviourStateOnLocalClient(stateIndex); } } } [ClientRpc] public void WatchTapeClientRpc() { //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) //IL_014d: 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(46715836u, val, (RpcDelivery)0); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 46715836u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 || (!networkManager.IsClient && !networkManager.IsHost)) { return; } ((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0; if (!((Object)(object)heldTape == (Object)null) && !((Object)(object)TVSetUnlockable.Instance == (Object)null)) { VHSTapeBehavior tape = heldTape; Plugin.logger.LogDebug((object)"DoAnimation: rest"); base.creatureAnimator.SetTrigger("rest"); PlayRandomClipOnLocalClient(AudioArray.WatchingTape); if (Object.op_Implicit((Object)(object)TVSetUnlockable.Instance.tapeInVHS)) { TVSetUnlockable.Instance.EjectVHS(); } DropTapeOnLocalClient(TVSetUnlockable.Instance.insertTapePosition.position); TVSetUnlockable.Instance.InsertVHS(tape); TVSetUnlockable.Instance.inUse = true; } } [ClientRpc] public void SpottedClientRpc(AudioArray voiceLine) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: 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_007d: 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_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: 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(1152429834u, val, (RpcDelivery)0); ((FastBufferWriter)(ref val2)).WriteValueSafe<AudioArray>(ref voiceLine, default(ForEnums)); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 1152429834u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsClient || networkManager.IsHost)) { ((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0; base.inSpecialAnimation = true; PlayRandomClipOnLocalClient(voiceLine); Plugin.logger.LogDebug((object)"DoAnimation: spotted"); base.creatureAnimator.SetTrigger("spotted"); SwitchToBehaviourStateOnLocalClient(4); } } } [ClientRpc] public void SetDefaultScareClientRpc(int clipIndex) { //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) { return; } if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(3555159912u, val, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val2, clipIndex); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 3555159912u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsClient || networkManager.IsHost)) { ((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0; currentScareDef = scareDefs.Where((ScareDef x) => x.enemyTypeName == "").First(); base.creatureVoice.PlayOneShot(baitSFX[clipIndex]); } } [ClientRpc] public void SpawnMimicEnemyClientRpc(NetworkObjectReference netRef, int baitSFXIndex) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_007d: 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_008c: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(2907642434u, val, (RpcDelivery)0); ((FastBufferWriter)(ref val2)).WriteValueSafe<NetworkObjectReference>(ref netRef, default(ForNetworkSerializable)); BytePacker.WriteValueBitPacked(val2, baitSFXIndex); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2907642434u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 || (!networkManager.IsClient && !networkManager.IsHost)) { return; } ((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0; NetworkObject val3 = default(NetworkObject); if (!((NetworkObjectReference)(ref netRef)).TryGet(ref val3, (NetworkManager)null)) { Plugin.logger.LogError((object)"Couldnt find network object in SpawnMimicEnemyClientRpc"); } else if (!((Component)val3).TryGetComponent<EnemyAI>(ref mimicEnemy)) { Plugin.logger.LogError((object)"Couldnt find EnemyAI component in SpawnMimicEnemyClientRpc"); } else if (!((Object)(object)mimicEnemy == (Object)null)) { Collider[] componentsInChildren = ((Component)((Component)mimicEnemy).transform.root).gameObject.GetComponentsInChildren<Collider>(); foreach (Collider val4 in componentsInChildren) { val4.enabled = false; } particleSystem.Play(); ((EnemyAI)this).EnableEnemyMesh(false, false); currentScareDef = scareDefs.Where((ScareDef x) => x.enemyTypeName == ((Object)mimicEnemy.enemyType).name).First(); if (baitSFXIndex >= 0) { base.creatureVoice.pitch = Random.Range(0.94f, 1.06f); base.creatureVoice.PlayOneShot(currentScareDef.baitSFX[baitSFXIndex]); } } } [ClientRpc] public void DespawnMimicEnemyClientRpc() { //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(4284887980u, val, (RpcDelivery)0); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 4284887980u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsClient || networkManager.IsHost)) { ((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0; mimicEnemy = null; particleSystem.Play(); ((EnemyAI)this).EnableEnemyMesh(true, false); base.creatureVoice.Stop(true); } } } [ClientRpc] public void ScareClientRpc(int scareSFXIndex, ulong targetPlayerId) { //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) 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(2214336419u, val, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val2, scareSFXIndex); BytePacker.WriteValueBitPacked(val2, targetPlayerId); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2214336419u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 || (!networkManager.IsClient && !networkManager.IsHost)) { return; } ((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0; targetPlayer = Plugin.PlayerFromId(targetPlayerId); if ((Object)(object)targetPlayer == (Object)null) { Plugin.logger.LogError((object)"Couldnt get target player in ScareClientRpc"); return; } if ((Object)(object)currentScareDef == (Object)null || currentScareDef.enemyTypeName == "") { PlayRandomClipOnLocalClient(AudioArray.Scare); Plugin.logger.LogDebug((object)"DoAnimation: scare"); base.creatureAnimator.SetTrigger("scare"); } else { base.creatureVoice.Stop(true); if (currentScareDef.animState != "") { EnemyAI? obj = mimicEnemy; if (obj != null) { obj.creatureAnimator.Play(currentScareDef.animState); } } if (currentScareDef.scareSFX.Length != 0) { base.creatureVoice.pitch = Random.Range(0.94f, 1.06f); base.creatureVoice.PlayOneShot(currentScareDef.scareSFX[scareSFXIndex]); } } triggeredActions.Clear(); SwitchToBehaviourStateOnLocalClient(3); } [ClientRpc] public void DoAnimationClientRpc(string animationName, bool value) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: 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_011a: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: 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) //IL_00d5: 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(3075340707u, val, (RpcDelivery)0); bool flag = animationName != null; ((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref flag, default(ForPrimitives)); if (flag) { ((FastBufferWriter)(ref val2)).WriteValueSafe(animationName, false); } ((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref value, default(ForPrimitives)); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 3075340707u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsClient || networkManager.IsHost)) { ((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0; base.creatureAnimator.SetBool(animationName, value); Plugin.logger.LogDebug((object)("DoAnimation: " + animationName + ": " + value)); } } [ClientRpc] public void DoAnimationClientRpc(string animationName) { //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(4200062589u, val, (RpcDelivery)0); bool flag = animationName != null; ((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref flag, default(ForPrimitives)); if (flag) { ((FastBufferWriter)(ref val2)).WriteValueSafe(animationName, false); } ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 4200062589u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsClient || networkManager.IsHost)) { ((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0; base.creatureAnimator.SetTrigger(animationName); Plugin.logger.LogDebug((object)("DoAnimation: " + animationName)); } } [ServerRpc(RequireOwnership = false)] public void GiveTapeServerRpc(NetworkObjectReference netRef) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: 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_007d: 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_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: 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.IsClient || networkManager.IsHost)) { ServerRpcParams val = default(ServerRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(1139598068u, val, (RpcDelivery)0); ((FastBufferWriter)(ref val2)).WriteValueSafe<NetworkObjectReference>(ref netRef, default(ForNetworkSerializable)); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 1139598068u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost)) { ((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0; if (((NetworkBehaviour)this).IsServer) { GiveTapeClientRpc(netRef); } } } [ClientRpc] public void GiveTapeClientRpc(NetworkObjectReference netRef) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: 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_007d: 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_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: 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(321885874u, val, (RpcDelivery)0); ((FastBufferWriter)(ref val2)).WriteValueSafe<NetworkObjectReference>(ref netRef, default(ForNetworkSerializable)); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 321885874u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsClient || networkManager.IsHost)) { ((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0; NetworkObject val3 = default(NetworkObject); if (!((NetworkObjectReference)(ref netRef)).TryGet(ref val3, (NetworkManager)null)) { Plugin.logger.LogError((object)"Couldnt get network object from network object reference"); return; } VHSTapeBehavior vHSTapeBehavior = default(VHSTapeBehavior); if (!((Component)val3).TryGetComponent<VHSTapeBehavior>(ref vHSTapeBehavior)) { Plugin.logger.LogError((object)"Couldnt get VHSTapeBehavior component from network object"); return; } ((GrabbableObject)vHSTapeBehavior).parentObject = handTransform; ((GrabbableObject)vHSTapeBehavior).hasHitGround = false; ((GrabbableObject)vHSTapeBehavior).isHeldByEnemy = true; ((GrabbableObject)vHSTapeBehavior).GrabItemFromEnemy((EnemyAI)(object)this); ((GrabbableObject)vHSTapeBehavior).EnablePhysics(false); HoarderBugAI.grabbableObjectsInMap.Remove(((Component)vHSTapeBehavior).gameObject); heldTape = vHSTapeBehavior; base.creatureVoice.Stop(true); base.creatureVoice.PlayOneShot(tapeGivenSFX); SwitchToBehaviourStateOnLocalClient(6); } } [ClientRpc] public void DropTapeClientRpc(Vector3 position) { //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_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) //IL_00d5: 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(505270414u, val, (RpcDelivery)0); ((FastBufferWriter)(ref val2)).WriteValueSafe(ref position); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 505270414u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsClient || networkManager.IsHost)) { ((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0; DropTapeOnLocalClient(position); } } } [ServerRpc(RequireOwnership = false)] public void TriggerReactionServerRpc(string actionName) { //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.IsClient || networkManager.IsHost)) { ServerRpcParams val = default(ServerRpcParams); FastBufferWriter val2 = ((Net