Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of SCP2006 v1.0.3
plugins/ProjectSCP.SCP2006.dll
Decompiled 5 months 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