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 testmodding v1.0.1
item/controltest.dll
Decompiled 2 years ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using ControlCompany.Core; using ControlCompany.Core.Config; using ControlCompany.Core.Enemy; using ControlCompany.Core.Enemy.NonStandardEnemy; using ControlCompany.Core.Extentions; using ControlCompany.Core.Input; using ControlCompany.Core.UI; using ControlCompany.Patches; using Dissonance; using GameNetcodeStuff; using HarmonyLib; using Microsoft.CodeAnalysis; using Unity.Netcode; using UnityEngine; using UnityEngine.AI; using UnityEngine.InputSystem; using UnityEngine.InputSystem.Controls; using UnityEngine.Rendering.HighDefinition; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("controltest")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("controltest")] [assembly: AssemblyTitle("controltest")] [assembly: AssemblyVersion("1.0.0.0")] 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; } } } namespace ControlCompany { [BepInPlugin("ControlCompany.ControlCompany", "ControlCompany", "1.2.1")] public class ControlCompanyPlugin : BaseUnityPlugin { private const string modGUID = "ControlCompany.ControlCompany"; private const string modName = "ControlCompany"; private const string modVersion = "1.2.1"; private readonly Harmony harmony = new Harmony("ControlCompany.ControlCompany"); public static ControlCompanyPlugin Instance; internal ManualLogSource logger; private bool isInitialized = false; private bool ranInitializationScripts = false; private void Awake() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Expected O, but got Unknown //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Expected O, but got Unknown if ((Object)Instance == (Object)null) { Instance = this; } logger = Logger.CreateLogSource("ControlCompany.ControlCompany"); logger.LogInfo((object)"Loaded ControlCompany. Patching."); ApplyPatches(); logger.LogInfo((object)"Completed patching. Initializing."); GameObject val = new GameObject("control_company_config_manager"); val.AddComponent<ConfigManager>(); ((Object)val).hideFlags = (HideFlags)61; Object.DontDestroyOnLoad((Object)val); logger.LogInfo((object)"Completed initialization."); isInitialized = true; } private void ApplyPatches() { harmony.PatchAll(typeof(ControlCompanyPlugin)); harmony.PatchAll(typeof(HUDManagerPatch)); harmony.PatchAll(typeof(StartOfRoundPatch)); harmony.PatchAll(typeof(PlayerControllerBPatch)); harmony.PatchAll(typeof(EnemyAIPatch)); harmony.PatchAll(typeof(TimeOfDayPatch)); harmony.PatchAll(typeof(SoundManagerPatch)); harmony.PatchAll(typeof(LobbyListPatch)); } } } namespace ControlCompany.Core { internal static class Constants { public static Dictionary<int, string> ALL_LAYERS_DICT = (from index in Enumerable.Range(0, 32) where !string.IsNullOrEmpty(LayerMask.LayerToName(index)) select index).ToDictionary((int index) => index, (int index) => LayerMask.LayerToName(index)); public static string PLAYER_LOS_LAYERNAME = "LineOfSight"; public static int PLAYER_LOS_LAYERINDEX = LayerMask.NameToLayer(PLAYER_LOS_LAYERNAME); public static LayerMask PLAYER_LOS_LAYERMASK = LayerMask.op_Implicit(LayerMask.GetMask(new string[1] { PLAYER_LOS_LAYERNAME })); public static string PLAYER_LAYERNAME = "Player"; public static int PLAYER_LAYERINDEX = LayerMask.NameToLayer(PLAYER_LAYERNAME); public static LayerMask PLAYER_LAYERMASK = LayerMask.op_Implicit(LayerMask.GetMask(new string[1] { PLAYER_LAYERNAME })); public static string PLAYER_VISOR_LAYERNAME = "HelmetVisor"; public static int PLAYER_VISOR_LAYERINDEX = LayerMask.NameToLayer(PLAYER_VISOR_LAYERNAME); public static LayerMask PLAYER_VISOR_LAYERMASK = LayerMask.op_Implicit(LayerMask.GetMask(new string[1] { PLAYER_VISOR_LAYERNAME })); public static string ITERACTABLE_OBJ_LAYERNAME = "InteractableObject"; public static int ITERACTABLE_OBJ_LAYERINDEX = LayerMask.NameToLayer(ITERACTABLE_OBJ_LAYERNAME); public static LayerMask ITERACTABLE_OBJ_LAYERMASK = LayerMask.op_Implicit(LayerMask.GetMask(new string[1] { ITERACTABLE_OBJ_LAYERNAME })); public static string PROPS_OBJ_LAYERNAME = "Props"; public static int PROPS_OBJ_LAYERINDEX = LayerMask.NameToLayer(PROPS_OBJ_LAYERNAME); public static LayerMask PROPS_LAYERMASK = LayerMask.op_Implicit(LayerMask.GetMask(new string[1] { PROPS_OBJ_LAYERNAME })); public static string ENEMIES_OBJ_LAYERNAME = "Enemies"; public static int ENEMIES_OBJ_LAYERINDEX = LayerMask.NameToLayer(ENEMIES_OBJ_LAYERNAME); public static LayerMask ENEMIES_LAYERMASK = LayerMask.op_Implicit(LayerMask.GetMask(new string[1] { ENEMIES_OBJ_LAYERNAME })); public static string PLAYER_RAGDOLL_LAYERNAME = "PlayerRagdoll"; public static int PLAYER_RAGDOLL_LAYERINDEX = LayerMask.NameToLayer(PLAYER_RAGDOLL_LAYERNAME); public static LayerMask PLAYER_RAGDOLL_LAYERMASK = LayerMask.op_Implicit(LayerMask.GetMask(new string[1] { PLAYER_RAGDOLL_LAYERNAME })); public static string PHYSICS_OBJECT_LAYERNAME = "PhysicsObject"; public static int PHYSICS_OBJECT_LAYERINDEX = LayerMask.NameToLayer(PHYSICS_OBJECT_LAYERNAME); public static LayerMask PHYSICS_OBJECT_LAYERMASK = LayerMask.op_Implicit(LayerMask.GetMask(new string[1] { PHYSICS_OBJECT_LAYERNAME })); } internal class ControlCenter : MonoBehaviour { public enum Mode { HOST, GHOST, ENEMY } public static ControlCenter Instance; private CustomPlayerController ghostController; private GameObject ghost; private EnemyController currentControlledEnemy; private int currentTargetIndex = 0; private PlayerControllerB currentTarget; private Mode currentMode = Mode.HOST; private bool allowAllEnemies = false; private bool initialMicPushToTalkSetting = false; private bool isExtendedModeEnabled = false; private bool scrapSpawnMode = false; private int currentSpawnScrapPage = 0; private const int scrapSpawnPageSize = 10; private int currentSpawnEnemiesPage = 0; private const int spawnEnemiesPageSize = 12; private List<ControllableEnemy> currentSpawnableEnemyList = new List<ControllableEnemy>(); private bool loadedConfig = false; private bool showUI = true; private float gameStartedTime = 0f; private bool inRoundEndPhase = false; private bool isGhostIndoors = false; private List<ControllableEnemy> allIndoorEnemies = new List<ControllableEnemy>(); private List<ControllableEnemy> allOutdoorEnemies = new List<ControllableEnemy>(); private List<ControllableEnemy> indoorEnemiesOfLevel = new List<ControllableEnemy>(); private List<ControllableEnemy> outdoorEnemiesOfLevel = new List<ControllableEnemy>(); public Mode CurrentMode => currentMode; public EnemyController CurrentControlledEnemy => currentControlledEnemy; public bool IsGhostIndoors { get { return isGhostIndoors; } set { isGhostIndoors = value; } } private void Awake() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown if ((Object)Instance == (Object)null) { Instance = this; } } private void OnEnable() { if (!loadedConfig) { loadedConfig = true; ConfigManager.Instance.LoadPlayerConfig(reload: true); } } private void Update() { //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Expected O, but got Unknown //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Expected O, but got Unknown //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Expected O, but got Unknown //IL_015f: Unknown result type (might be due to invalid IL or missing references) //IL_016a: Expected O, but got Unknown //IL_01ef: Unknown result type (might be due to invalid IL or missing references) //IL_01fa: Expected O, but got Unknown //IL_018a: Unknown result type (might be due to invalid IL or missing references) //IL_0195: Expected O, but got Unknown //IL_0264: Unknown result type (might be due to invalid IL or missing references) //IL_026f: Expected O, but got Unknown if (!IsGameStarted()) { return; } if (((ButtonControl)InputKeys.TOGGLE_UI_KEY).wasPressedThisFrame) { showUI = !showUI; } gameStartedTime += Time.deltaTime; if (inRoundEndPhase) { return; } if (((Object)currentTarget == (Object)null || !currentTarget.isPlayerControlled || currentTarget.isPlayerDead) && GetAlivePlayers().Count > 0) { SetNextTargetPlayer(1); } if ((Object)ghost == (Object)null) { GameObject val = new GameObject("ghost"); ghostController = val.AddComponent<CustomPlayerController>(); ghostController.Initialize(GetHostPlayer().playerActions, CustomPlayerController.CameraMode.FIRST_PERSON); ghost = val; ghost.SetActive(false); ControlCompanyPlugin.Instance.logger.LogInfo((object)"Creating ghost"); } if (currentMode != 0) { GetHostPlayer().isTypingChat = true; } if (IsListeningFromHost() && !IsHostDead() && currentMode != 0) { if ((Object)ghostController != (Object)null) { ((Behaviour)ghostController.AudioListener).enabled = false; } if ((Object)currentControlledEnemy != (Object)null) { ((Behaviour)currentControlledEnemy.AudioListener).enabled = false; } ((Behaviour)GetHostPlayer().activeAudioListener).enabled = true; ChangeAudioListener(GetHostPlayer().activeAudioListener); } else if (currentMode == Mode.GHOST) { if ((Object)ghostController != (Object)null && ghostController.IsInitialized) { ((Behaviour)GetHostPlayer().activeAudioListener).enabled = false; ((Behaviour)ghostController.AudioListener).enabled = true; ChangeAudioListener(ghostController.AudioListener); } } else if (currentMode == Mode.ENEMY) { if (((Object)currentControlledEnemy != (Object)null) & currentControlledEnemy.IsInitialized) { ((Behaviour)GetHostPlayer().activeAudioListener).enabled = false; ((Behaviour)currentControlledEnemy.AudioListener).enabled = true; ChangeAudioListener(currentControlledEnemy.AudioListener); } } else if (currentMode == Mode.HOST) { ChangeAudioListener(GetHostPlayer().activeAudioListener); } InputUpdate(); } private void InputUpdate() { //IL_0208: Unknown result type (might be due to invalid IL or missing references) //IL_0163: Unknown result type (might be due to invalid IL or missing references) //IL_02b3: Unknown result type (might be due to invalid IL or missing references) //IL_02be: Expected O, but got Unknown //IL_0594: Unknown result type (might be due to invalid IL or missing references) //IL_04da: Unknown result type (might be due to invalid IL or missing references) //IL_04ea: Unknown result type (might be due to invalid IL or missing references) //IL_049f: Unknown result type (might be due to invalid IL or missing references) //IL_04af: Unknown result type (might be due to invalid IL or missing references) //IL_0466: Unknown result type (might be due to invalid IL or missing references) //IL_0476: Unknown result type (might be due to invalid IL or missing references) //IL_0401: Unknown result type (might be due to invalid IL or missing references) //IL_0411: Unknown result type (might be due to invalid IL or missing references) //IL_03cc: Unknown result type (might be due to invalid IL or missing references) //IL_03d8: Unknown result type (might be due to invalid IL or missing references) if (!IsGameStarted() || inRoundEndPhase || (ConfigManager.Instance.DisableWhileUsingTerminal && GetHostPlayer().inTerminalMenu)) { return; } if (((ButtonControl)InputKeys.EXTENDED_MODE_KEY).wasPressedThisFrame) { isExtendedModeEnabled = !isExtendedModeEnabled; allowAllEnemies = isExtendedModeEnabled; SetNextSpawnEnemiesPage(0); } switch (currentMode) { case Mode.ENEMY: if (!currentControlledEnemy.IsAIControlled && currentControlledEnemy.CanControlEnemy()) { if (InputKeys.ENEMY_PRIMARY_SKILL_BUTTON.wasPressedThisFrame) { currentControlledEnemy.UsePrimarySkill(); } else if (InputKeys.ENEMY_PRIMARY_SKILL_BUTTON.wasReleasedThisFrame) { currentControlledEnemy.ReleasePrimarySkill(); } else if (InputKeys.ENEMY_SECONDARY_SKILL_BUTTON.wasPressedThisFrame) { currentControlledEnemy.UseSecondarySkill(); } else if (InputKeys.ENEMY_SECONDARY_SKILL_BUTTON.wasReleasedThisFrame) { currentControlledEnemy.ReleaseSecondarySkill(); } currentControlledEnemy.SetLockEnemyRotation(((ButtonControl)InputKeys.LOCK_ENEMY_ROTATION_KEY).isPressed); } if (((ButtonControl)InputKeys.EXIT_KEY).wasPressedThisFrame) { EnableGhost(enable: true, ((Component)currentControlledEnemy).transform.position); ghostController.EnableLight(isGhostIndoors); currentControlledEnemy.DestroyAndCleanUp(); currentMode = Mode.GHOST; } else if (((ButtonControl)InputKeys.ENEMY_TOGGLE_AI_KEY).wasPressedThisFrame) { currentControlledEnemy.ToggleAIControl(); } else if (((ButtonControl)InputKeys.ENEMY_TOGGLE_LIGHT_KEY).wasPressedThisFrame) { currentControlledEnemy.ToggleLight(); } break; case Mode.HOST: if (((ButtonControl)InputKeys.HOST_GHOST_MODE_KEY).wasPressedThisFrame) { isGhostIndoors = IsTargetInside(); EnableGhost(enable: true, ((Component)currentTarget).gameObject.transform.position); ghostController.EnableLight(isGhostIndoors); EnableHostPlayer(enable: false); currentMode = Mode.GHOST; } else if (((ButtonControl)InputKeys.CYCLE_KEY_LEFT).wasPressedThisFrame) { SetNextTargetPlayer(-1); } else if (((ButtonControl)InputKeys.CYCLE_KEY_RIGHT).wasPressedThisFrame) { SetNextTargetPlayer(1); } if (!isExtendedModeEnabled) { break; } if (((ButtonControl)InputKeys.HOST_TELEPORT_TO_ENTRANCE_KEY).wasPressedThisFrame) { if (!GetHostPlayer().isPlayerDead) { EntranceTeleport mainEntrance = GetMainEntrance(getMainEntranceThatIsOutside: true); if ((Object)mainEntrance != (Object)null) { mainEntrance.TeleportPlayer(); } } } else if (((ButtonControl)InputKeys.HOST_GIVE_CREDITS_KEY).wasPressedThisFrame) { Terminal val2 = Object.FindObjectOfType<Terminal>(); val2.groupCredits += 100; } break; case Mode.GHOST: if (!scrapSpawnMode) { List<ControllableEnemy> pagedSpawnableEnemies = GetPagedSpawnableEnemies(); for (int i = 0; i < InputKeys.GHOST_SPAWN_ENEMY_KEYS.Count && i < pagedSpawnableEnemies.Count; i++) { if (!((ButtonControl)InputKeys.GHOST_SPAWN_ENEMY_KEYS[i]).wasPressedThisFrame) { continue; } if (ConfigManager.Instance.UseEnemySpawningBehaviour) { Random random = new Random(StartOfRound.Instance.randomMapSeed + 888); if (isGhostIndoors) { RoundManager.Instance.RefreshEnemyVents(); EnemyVent[] allEnemyVents = RoundManager.Instance.allEnemyVents; if (allEnemyVents.Count() > 0) { EnemyVent val = allEnemyVents[random.Next(allEnemyVents.Count())]; currentControlledEnemy = SpawnControllableEnemy(pagedSpawnableEnemies[i], val.floorNode.position, val.floorNode.rotation); } else { currentControlledEnemy = SpawnControllableEnemy(pagedSpawnableEnemies[i], ghost.transform.position, ghost.transform.rotation); } } else { GameObject[] array = GameObject.FindGameObjectsWithTag("OutsideAINode"); if (array.Count() > 0) { currentControlledEnemy = SpawnControllableEnemy(pagedSpawnableEnemies[i], array[random.Next(array.Count())].transform.position, ghost.transform.rotation); } else { currentControlledEnemy = SpawnControllableEnemy(pagedSpawnableEnemies[i], ghost.transform.position, ghost.transform.rotation); } } } else { currentControlledEnemy = SpawnControllableEnemy(pagedSpawnableEnemies[i], ghost.transform.position, ghost.transform.rotation); } EnableGhost(enable: false); currentMode = Mode.ENEMY; break; } } else { List<Item> list = ExtensionMethods.Chunk(GetSpawnableScraps(), 10).ToList()[currentSpawnScrapPage].ToList(); for (int j = 0; j < InputKeys.GHOST_SPAWN_ENEMY_KEYS.Count && j < list.Count; j++) { if (((ButtonControl)InputKeys.GHOST_SPAWN_ENEMY_KEYS[j]).wasPressedThisFrame) { SpawnScrap(list[j], ghost.transform.position); break; } } } if (((ButtonControl)InputKeys.EXIT_KEY).wasPressedThisFrame) { EnableGhost(enable: false); EnableHostPlayer(enable: true); currentMode = Mode.HOST; GetHostPlayer().isTypingChat = false; } else if (((ButtonControl)InputKeys.CYCLE_KEY_LEFT).wasPressedThisFrame) { SetNextSpawnEnemiesPage(-1); } else if (((ButtonControl)InputKeys.CYCLE_KEY_RIGHT).wasPressedThisFrame) { SetNextSpawnEnemiesPage(1); } if (((ButtonControl)Keyboard.current.upArrowKey).wasPressedThisFrame) { } if (scrapSpawnMode && ((ButtonControl)Keyboard.current.downArrowKey).wasPressedThisFrame) { int num = Mathf.CeilToInt((float)GetSpawnableScraps().Count / 10f); ControlCompanyPlugin.Instance.logger.LogMessage((object)$"Total scraps: {GetSpawnableScraps().Count()}, final page of scrap: {num}"); currentSpawnScrapPage++; if (currentSpawnScrapPage >= num) { currentSpawnScrapPage = 0; } } break; } } private void ChangeAudioListener(AudioListener audioListener) { StartOfRound.Instance.audioListener = audioListener; } private EntranceTeleport GetMainEntrance(bool getMainEntranceThatIsOutside) { EntranceTeleport[] array = Object.FindObjectsOfType<EntranceTeleport>(false); EntranceTeleport[] array2 = array; foreach (EntranceTeleport val in array2) { if (val.entranceId != 0) { continue; } if (getMainEntranceThatIsOutside) { if (val.isEntranceToBuilding) { return val; } } else if (!val.isEntranceToBuilding) { return val; } } return null; } private bool IsTargetInside() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown return (Object)currentTarget != (Object)null && currentTarget.isInsideFactory; } private void OnGUI() { if (!IsGameStarted() || !showUI || inRoundEndPhase || (ConfigManager.Instance.DisableWhileUsingTerminal && GetHostPlayer().inTerminalMenu)) { return; } switch (currentMode) { case Mode.ENEMY: UIManager.Instance.RenderEnemyControls(((InputControl)InputKeys.ENEMY_PRIMARY_SKILL_BUTTON).shortDisplayName, ((InputControl)InputKeys.ENEMY_SECONDARY_SKILL_BUTTON).shortDisplayName, ((InputControl)InputKeys.ENEMY_TOGGLE_AI_KEY).displayName, ((InputControl)InputKeys.EXIT_KEY).displayName, ((InputControl)InputKeys.HOST_LISTEN_KEY).displayName, currentControlledEnemy, GetHostPlayer()); break; case Mode.HOST: UIManager.Instance.RenderHostControls(((InputControl)InputKeys.HOST_GHOST_MODE_KEY).displayName, ((InputControl)InputKeys.CYCLE_KEY_LEFT).displayName, ((InputControl)InputKeys.CYCLE_KEY_RIGHT).displayName, currentTarget, isExtendedModeEnabled, ((InputControl)InputKeys.HOST_GIVE_CREDITS_KEY).displayName, ((InputControl)InputKeys.HOST_TELEPORT_TO_ENTRANCE_KEY).displayName, ((InputControl)InputKeys.TOGGLE_UI_KEY).displayName); break; case Mode.GHOST: { bool showEnemyPaging = GetSpawnableEnemies(isGhostIndoors).Count > 12; List<IEnumerable<Item>> list = ExtensionMethods.Chunk(GetSpawnableScraps(), 10).ToList(); List<Item> scraps = ((list.Count > 0) ? list[currentSpawnScrapPage].ToList() : new List<Item>()); UIManager.Instance.RenderGhostControls(InputKeys.GHOST_SPAWN_ENEMY_KEYS.Select((KeyControl key) => ((InputControl)key).displayName).ToList(), ((InputControl)InputKeys.EXIT_KEY).displayName, ((InputControl)InputKeys.CYCLE_KEY_LEFT).displayName, ((InputControl)InputKeys.CYCLE_KEY_RIGHT).displayName, ((InputControl)InputKeys.HOST_LISTEN_KEY).displayName, showEnemyPaging, GetPagedSpawnableEnemies(), scraps, GetHostPlayer(), scrapSpawnMode); break; } } } private bool IsHostDead() { return GetHostPlayer().isPlayerDead; } private void EnableGhost(bool enable) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) EnableGhost(enable, Vector3.zero); } private void EnableGhost(bool enable, Vector3 position) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) if (enable) { ghost.transform.position = position + new Vector3(0f, 0.5f, 0f); ghost.transform.rotation = Quaternion.identity; ghost.SetActive(true); ChangeAudioListener(ghostController.AudioListener); SetNextSpawnEnemiesPage(0); } else { ghost.SetActive(false); } } private void EnableHostPlayer(bool enable) { //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_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_0043: 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) PlayerControllerB hostPlayer = GetHostPlayer(); MovementActions val; if (enable) { if (ConfigManager.Instance.ForcePushToTalkWhileInMonsterMode) { ResetMicPushToTalk(); } ((Behaviour)GetHostPlayer().activeAudioListener).enabled = true; MovementActions movement = hostPlayer.playerActions.Movement; val = movement; ((MovementActions)(ref val)).PingScan.Enable(); ChangeAudioListener(hostPlayer.activeAudioListener); ((Behaviour)StartOfRound.Instance.activeCamera).enabled = true; } else { if (ConfigManager.Instance.ForcePushToTalkWhileInMonsterMode) { ForceMicPushToTalk(); } ((Behaviour)GetHostPlayer().activeAudioListener).enabled = false; MovementActions movement = hostPlayer.playerActions.Movement; val = movement; ((MovementActions)(ref val)).PingScan.Disable(); ((Behaviour)StartOfRound.Instance.activeCamera).enabled = false; } } private void EnablePlayer2DMics(bool enable, List<PlayerControllerB> players) { //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Expected O, but got Unknown //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Expected O, but got Unknown foreach (PlayerControllerB player in players) { if (player.isHostPlayerObject) { continue; } AudioSource currentVoiceChatAudioSource = player.currentVoiceChatAudioSource; if (enable) { if ((Object)currentVoiceChatAudioSource != (Object)null) { currentVoiceChatAudioSource.spatialBlend = 0f; } player.currentVoiceChatIngameSettings.set2D = true; player.voicePlayerState.Volume = 1f; } else { if ((Object)currentVoiceChatAudioSource != (Object)null) { currentVoiceChatAudioSource.spatialBlend = 1f; } player.currentVoiceChatIngameSettings.set2D = false; player.voicePlayerState.Volume = 0f; } } } private void SetNextTargetPlayer(int direction) { List<PlayerControllerB> alivePlayers = GetAlivePlayers(); if (alivePlayers.Count == 0) { SetCurrentTargetToHost(); ControlCompanyPlugin.Instance.logger.LogMessage((object)"Alive player count is zero"); } else { currentTargetIndex += direction; if (currentTargetIndex >= alivePlayers.Count) { currentTargetIndex = 0; } else if (currentTargetIndex < 0) { currentTargetIndex = alivePlayers.Count - 1; } currentTargetIndex = Mathf.Clamp(currentTargetIndex, 0, alivePlayers.Count - 1); currentTarget = alivePlayers[currentTargetIndex]; } ControlCompanyPlugin.Instance.logger.LogMessage((object)$"Current target index: {currentTargetIndex}"); ControlCompanyPlugin.Instance.logger.LogMessage((object)("Setting next target to: " + currentTarget?.playerUsername)); } public void SetCurrentTargetToHost() { currentTargetIndex = 0; currentTarget = GetHostPlayer(); ControlCompanyPlugin.Instance.logger.LogMessage((object)"Setting next target to host"); } private void SetNextSpawnEnemiesPage(int direction) { List<ControllableEnemy> spawnableEnemies = GetSpawnableEnemies(isGhostIndoors); if (spawnableEnemies == null || spawnableEnemies.Count == 0) { currentSpawnableEnemyList = new List<ControllableEnemy>(); return; } if (spawnableEnemies.Count > 12) { List<IEnumerable<ControllableEnemy>> list = ExtensionMethods.Chunk(spawnableEnemies, 12).ToList(); currentSpawnEnemiesPage += direction; if (currentSpawnEnemiesPage >= list.Count) { currentSpawnEnemiesPage = 0; } else if (currentSpawnEnemiesPage < 0) { currentSpawnEnemiesPage = list.Count - 1; } currentSpawnEnemiesPage = Mathf.Clamp(currentSpawnEnemiesPage, 0, list.Count - 1); } else { currentSpawnEnemiesPage = 0; } currentSpawnableEnemyList = ExtensionMethods.Chunk(GetSpawnableEnemies(isGhostIndoors), 12).ToList()[currentSpawnEnemiesPage].ToList(); } public List<SpawnableEnemyWithRarity> GetDaytimeEnemies() { return new List<SpawnableEnemyWithRarity>(GetCurrentLevel().DaytimeEnemies); } public void StartOfRoundInitialization() { allIndoorEnemies = GetAllIndoorEnemiesAcrossAllMapsList(); allOutdoorEnemies = GetAllOutdoorEnemiesAcrossAllMapsList(); indoorEnemiesOfLevel = new List<ControllableEnemy>(GetCurrentLevel().Enemies.Select((SpawnableEnemyWithRarity enemy) => ControllableEnemy.FromSpawnableEnemy(enemy))); outdoorEnemiesOfLevel = new List<ControllableEnemy>(GetCurrentLevel().OutsideEnemies.Select((SpawnableEnemyWithRarity enemy) => ControllableEnemy.FromSpawnableEnemy(enemy))); ControllableEnemy maskedEnemy = GetMaskedEnemy(); indoorEnemiesOfLevel.Add(maskedEnemy); outdoorEnemiesOfLevel.Add(maskedEnemy); allIndoorEnemies.Add(maskedEnemy); allOutdoorEnemies.Add(maskedEnemy); ControllableEnemy companyMonsterEnemy = GetCompanyMonsterEnemy(); if (companyMonsterEnemy != null) { indoorEnemiesOfLevel.Add(companyMonsterEnemy); outdoorEnemiesOfLevel.Add(companyMonsterEnemy); allIndoorEnemies.Add(companyMonsterEnemy); allOutdoorEnemies.Add(companyMonsterEnemy); } ControllableEnemy secretEnemy = GetSecretEnemy(); if (secretEnemy != null) { indoorEnemiesOfLevel.Insert(0, secretEnemy); allIndoorEnemies.Insert(0, secretEnemy); } indoorEnemiesOfLevel = indoorEnemiesOfLevel.DedupeBy((ControllableEnemy enemy) => enemy.EnemyName).ToList(); outdoorEnemiesOfLevel = outdoorEnemiesOfLevel.DedupeBy((ControllableEnemy enemy) => enemy.EnemyName).ToList(); allIndoorEnemies = allIndoorEnemies.DedupeBy((ControllableEnemy enemy) => enemy.EnemyName).ToList(); allOutdoorEnemies = allOutdoorEnemies.DedupeBy((ControllableEnemy enemy) => enemy.EnemyName).ToList(); gameStartedTime = 0f; SetCurrentTargetToHost(); ResetToDefault(); inRoundEndPhase = false; initialMicPushToTalkSetting = IngamePlayerSettings.Instance.settings.pushToTalk; ControlCompanyPlugin.Instance.logger.LogMessage((object)"Start of round initialization completed."); } public void EndOfRoundCleanUp() { ResetToDefault(); inRoundEndPhase = true; ControlCompanyPlugin.Instance.logger.LogMessage((object)"End of round clean up completed."); } private void ResetToDefault() { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Expected O, but got Unknown //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Expected O, but got Unknown //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Expected O, but got Unknown StartOfRound.Instance.audioListener = GetHostPlayer().activeAudioListener; GetHostPlayer().isTypingChat = false; currentMode = Mode.HOST; if ((Object)ghost != (Object)null) { Object.Destroy((Object)ghost); ghost = null; } if ((Object)currentControlledEnemy != (Object)null) { currentControlledEnemy.DestroyAndCleanUp(); } currentSpawnableEnemyList = new List<ControllableEnemy>(); currentSpawnEnemiesPage = 0; EnableHostPlayer(enable: true); ControlCompanyPlugin.Instance.logger.LogMessage((object)"Reset to default."); } public bool IsListeningFromHost() { return ((ButtonControl)InputKeys.HOST_LISTEN_KEY).isPressed; } public PlayerControllerB GetHostPlayer() { return RoundManager.Instance.playersManager.allPlayerObjects[0].GetComponentInChildren<PlayerControllerB>(); } public List<PlayerControllerB> GetDeadPlayers() { return (from player in GetAllPlayers() where player.isPlayerDead select player).ToList(); } public List<PlayerControllerB> GetAlivePlayers() { return (from player in GetAllPlayers() where !player.isPlayerDead select player).ToList(); } public List<PlayerControllerB> GetAllPlayers() { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Expected O, but got Unknown List<PlayerControllerB> list = new List<PlayerControllerB>(); GameObject[] allPlayerObjects = RoundManager.Instance.playersManager.allPlayerObjects; for (int i = 0; i < allPlayerObjects.Length; i++) { PlayerControllerB componentInChildren = allPlayerObjects[i].GetComponentInChildren<PlayerControllerB>(); if ((Object)componentInChildren != (Object)null && componentInChildren.isPlayerControlled) { list.Add(componentInChildren); } } return list; } public bool DoesCurrentLevelExist() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown return (Object)GetCurrentLevel() != (Object)null; } public bool IsGameStarted() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Expected O, but got Unknown //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Expected O, but got Unknown //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Expected O, but got Unknown return (Object)RoundManager.Instance != (Object)null && (Object)RoundManager.Instance.currentLevel != (Object)null && (Object)GameNetworkManager.Instance != (Object)null && GameNetworkManager.Instance.gameHasStarted && (Object)StartOfRound.Instance != (Object)null && !StartOfRound.Instance.inShipPhase; } public SelectableLevel GetCurrentLevel() { return RoundManager.Instance.currentLevel; } public StartOfRound GetPlayersManager() { return RoundManager.Instance.playersManager; } public List<Item> GetSpawnableScraps() { return StartOfRound.Instance.allItemsList.itemsList; } public List<ControllableEnemy> GetPagedSpawnableEnemies() { return currentSpawnableEnemyList; } public List<ControllableEnemy> GetSpawnableEnemies(bool isIndoor) { List<ControllableEnemy> list = ((!isIndoor) ? GetSpawnableOutdoorEnemies() : GetSpawnableIndoorEnemies()); if (list == null || list.Count == 0) { list = new List<ControllableEnemy>(); } return list; } public List<ControllableEnemy> GetSpawnableIndoorEnemies() { return allowAllEnemies ? GetIndoorEnemyList() : GetAllowListedIndoorEnemies(); } public List<ControllableEnemy> GetAllowListedIndoorEnemies() { return (from enemy in GetIndoorEnemyList() where enemy.Allowlisted select enemy).ToList(); } public List<ControllableEnemy> GetIndoorEnemyList() { return allowAllEnemies ? allIndoorEnemies : indoorEnemiesOfLevel; } public List<ControllableEnemy> GetAllIndoorEnemiesAcrossAllMapsList() { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Expected O, but got Unknown //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Expected O, but got Unknown HashSet<string> hashSet = new HashSet<string>(); List<ControllableEnemy> list = new List<ControllableEnemy>(); SelectableLevel[] levels = StartOfRound.Instance.levels; SelectableLevel[] array = levels; foreach (SelectableLevel val in array) { if (!((Object)val != (Object)null)) { continue; } foreach (SpawnableEnemyWithRarity enemy in val.Enemies) { if ((Object)enemy.enemyType != (Object)null && !hashSet.Contains(enemy.enemyType.enemyName)) { hashSet.Add(enemy.enemyType.enemyName); list.Add(ControllableEnemy.FromSpawnableEnemy(enemy)); } } } return list; } public List<ControllableEnemy> GetSpawnableOutdoorEnemies() { return allowAllEnemies ? GetOutdoorEnemyList() : GetAllowListedOutdoorEnemies(); } public List<ControllableEnemy> GetAllowListedOutdoorEnemies() { return (from enemy in GetOutdoorEnemyList() where enemy.Allowlisted select enemy).ToList(); } public List<ControllableEnemy> GetOutdoorEnemyList() { return allowAllEnemies ? allOutdoorEnemies : outdoorEnemiesOfLevel; } public List<ControllableEnemy> GetAllOutdoorEnemiesAcrossAllMapsList() { //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Expected O, but got Unknown //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Expected O, but got Unknown if (GetCurrentLevel().OutsideEnemies.Count == 0) { return new List<ControllableEnemy>(); } HashSet<string> hashSet = new HashSet<string>(); List<ControllableEnemy> list = new List<ControllableEnemy>(); SelectableLevel[] levels = StartOfRound.Instance.levels; SelectableLevel[] array = levels; foreach (SelectableLevel val in array) { if (!((Object)val != (Object)null)) { continue; } foreach (SpawnableEnemyWithRarity outsideEnemy in val.OutsideEnemies) { if ((Object)outsideEnemy.enemyType != (Object)null && !hashSet.Contains(outsideEnemy.enemyType.enemyName)) { hashSet.Add(outsideEnemy.enemyType.enemyName); list.Add(ControllableEnemy.FromSpawnableEnemy(outsideEnemy)); } } } return list; } public ControllableEnemy GetMaskedEnemy() { //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Expected O, but got Unknown //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Expected O, but got Unknown SelectableLevel[] levels = StartOfRound.Instance.levels; SelectableLevel[] array = levels; foreach (SelectableLevel val in array) { foreach (SpawnableEnemyWithRarity enemy in val.Enemies) { EnemyType enemyType = enemy.enemyType; object obj; if ((Object)(object)enemyType == (Object)null) { obj = null; } else { GameObject enemyPrefab = enemyType.enemyPrefab; obj = (((Object)(object)enemyPrefab != (Object)null) ? enemyPrefab.GetComponent<EnemyAI>() : null); } EnemyAI val2 = (EnemyAI)obj; if ((Object)val2 != (Object)null && ((object)val2).GetType() == typeof(MaskedPlayerEnemy)) { return ControllableEnemy.FromSpawnableEnemy(enemy); } } } return null; } private ControllableEnemy GetSecretEnemy() { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown Object[] array = Resources.FindObjectsOfTypeAll(typeof(EnemyAI)); Object[] array2 = array; for (int i = 0; i < array2.Length; i++) { EnemyAI val = (EnemyAI)array2[i]; if (((object)val).GetType() == typeof(TestEnemy)) { return ControllableEnemy.FromEnemyAI(val); } } return null; } private GameObject SpawnScrap(Item scrap, Vector3 position) { //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_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) GameObject val = Object.Instantiate<GameObject>(scrap.spawnPrefab, position, Quaternion.identity); GrabbableObject componentInChildren = val.GetComponentInChildren<GrabbableObject>(); ((Component)componentInChildren).transform.rotation = Quaternion.Euler(componentInChildren.itemProperties.restingRotation); val.GetComponentInChildren<NetworkObject>().Spawn(true); return val; } private EnemyController SpawnControllableEnemy(ControllableEnemy controllableEnemy, Vector3 position, Quaternion rotation) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003b: 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_0077: Expected O, but got Unknown //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) Vector3 val = (controllableEnemy.OverrideEnemySpawnLocation ? controllableEnemy.EnemySpawnLocationOverride : (position + new Vector3(0f, 0.5f, 0f))); GameObject val2 = (GameObject)(controllableEnemy.OverrideEnemyPrefab ? ((object)controllableEnemy.EnemyGameObject) : ((object)Object.Instantiate<GameObject>(controllableEnemy.EnemyPrefab, val, Quaternion.identity))); if (!controllableEnemy.OverrideEnemyPrefab) { val2.GetComponentInChildren<NetworkObject>().Spawn(true); } GameObject val3 = new GameObject("enemy_controller"); val3.transform.position = val; val3.transform.rotation = rotation; if (controllableEnemy.CreateAndAttachEnemyControllerFunc == null) { throw new Exception("Controllable enemy does not have a function defined to create and attach an enemy controller!"); } EnemyController enemyController = controllableEnemy.CreateAndAttachEnemyControllerFunc(val2, val3); enemyController.InitializeEnemyController(GetHostPlayer().playerActions, val2); enemyController.EnableLight(isGhostIndoors); ChangeAudioListener(enemyController.AudioListener); return enemyController; } private GameObject GetTurretPrefab() { //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Expected O, but got Unknown SelectableLevel[] levels = StartOfRound.Instance.levels; SelectableLevel[] array = levels; foreach (SelectableLevel val in array) { SpawnableMapObject[] spawnableMapObjects = val.spawnableMapObjects; SpawnableMapObject[] array2 = spawnableMapObjects; foreach (SpawnableMapObject val2 in array2) { object obj; if (val2 == null) { obj = null; } else { GameObject prefabToSpawn = val2.prefabToSpawn; obj = (((Object)(object)prefabToSpawn != (Object)null) ? prefabToSpawn.GetComponentInChildren<Turret>() : null); } if ((Object)obj != (Object)null) { return val2.prefabToSpawn; } } } return null; } private EnemyController SpawnControllableTurret(Vector3 position, Quaternion rotation) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Expected O, but got Unknown //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Expected O, but got Unknown //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0071: 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) GameObject turretPrefab = GetTurretPrefab(); if ((Object)turretPrefab == (Object)null) { ControlCompanyPlugin.Instance.logger.LogDebug((object)"Cannot find turret prefab in current level"); return null; } GameObject val = Object.Instantiate<GameObject>(turretPrefab, position, rotation); val.GetComponentInChildren<NetworkObject>().Spawn(true); GameObject val2 = new GameObject("enemy_controller"); val2.transform.position = position + new Vector3(0f, 0.5f, 0f); val2.transform.rotation = rotation; TurretEnemyController turretEnemyController = val2.AddComponent<TurretEnemyController>(); turretEnemyController.InitializeEnemyController(GetHostPlayer().playerActions, val); turretEnemyController.EnableLight(enable: true); return turretEnemyController; } private ControllableEnemy GetCompanyMonsterEnemy() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Expected O, but got Unknown //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Expected O, but got Unknown //IL_0082: 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) DepositItemsDesk val = Object.FindObjectOfType<DepositItemsDesk>(); if ((Object)val == (Object)null) { return null; } GameObject val2 = GameObject.Find("BellDinger"); return new ControllableEnemy { EnemyName = "Company Monster", OverrideEnemyPrefab = true, EnemyGameObject = ((Component)val).gameObject, Allowlisted = true, OverrideEnemySpawnLocation = true, EnemySpawnLocationOverride = (((Object)val2 != (Object)null) ? val2.transform.position : ((Component)val).transform.position), CreateAndAttachEnemyControllerFunc = (GameObject enemyGameObject, GameObject enemyController) => enemyController.AddComponent<CompanyMonsterController>() }; } private DissonanceComms GetMic() { return StartOfRound.Instance.voiceChatModule; } private void ForceMicPushToTalk() { IngamePlayerSettings.Instance.settings.pushToTalk = true; } private void ResetMicPushToTalk() { IngamePlayerSettings.Instance.settings.pushToTalk = initialMicPushToTalkSetting; } } internal class DoorOpener : MonoBehaviour { public void DetectAndOpenDoors(float range) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Expected O, but got Unknown Collider[] array = Physics.OverlapSphere(((Component)this).transform.position, range); for (int i = 0; i < array.Length; i++) { DoorLock componentInChildren = ((Component)array[i]).GetComponentInChildren<DoorLock>(); if ((Object)componentInChildren != (Object)null) { OpenDoor(componentInChildren); } } } public void OpenDoor(DoorLock doorLock) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Expected O, but got Unknown if ((Object)doorLock != (Object)null && !doorLock.GetFieldValue<bool>("isDoorOpened")) { doorLock.OpenDoorAsEnemyServerRpc(); ((Component)doorLock).gameObject.GetComponent<AnimatedObjectTrigger>().TriggerAnimationNonPlayer(false, true, false); } } } internal class EnemyController : CustomPlayerController { protected GameObject enemyGameObject; protected bool isAIControlled = false; protected bool controlEnemyRotation = true; protected bool controlEnemyMovement = true; protected bool lockEnemyRotationInput = false; public bool IsAIControlled => isAIControlled; public virtual void InitializeEnemyController(PlayerActions playerActions, GameObject enemyGameObject) { } public virtual bool CanControlEnemy() { return true; } public void SetLockEnemyRotation(bool lockEnemyRotationInput) { this.lockEnemyRotationInput = lockEnemyRotationInput; } public void UsePrimarySkill() { CheckInitialized(); if (!isAIControlled) { UsePrimarySkillAction(); } } protected virtual void UsePrimarySkillAction() { } public void ReleasePrimarySkill() { CheckInitialized(); if (!isAIControlled) { ReleasePrimarySkillAction(); } } protected virtual void ReleasePrimarySkillAction() { } public void UseSecondarySkill() { CheckInitialized(); if (!isAIControlled) { UseSecondarySkillAction(); } } protected virtual void UseSecondarySkillAction() { } public void ReleaseSecondarySkill() { CheckInitialized(); if (!isAIControlled) { ReleaseSecondarySkillAction(); } } protected virtual void ReleaseSecondarySkillAction() { } protected virtual void EnableAIControl(bool enabled) { CheckInitialized(); isAIControlled = enabled; ControlCompanyPlugin.Instance.logger.LogMessage((object)$"Enable AI control: {enabled}"); if (IsAIControlled) { ToggleAIControlTrue(); } else { ToggleAIControlFalse(); } } protected virtual void ToggleAIControlTrue() { } protected virtual void ToggleAIControlFalse() { } public virtual void ToggleAIControl() { CheckInitialized(); isAIControlled = !isAIControlled; EnableAIControl(isAIControlled); } public virtual void DestroyAndCleanUp() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown if (ShouldDestroyEnemyGameObjectOnCleanUp()) { Object.Destroy((Object)enemyGameObject); } Object.Destroy((Object)((Component)this).gameObject); } protected virtual bool ShouldDestroyEnemyGameObjectOnCleanUp() { return true; } public virtual string GetPrimarySkillName() { return ""; } public virtual string GetSecondarySkillName() { return ""; } protected void CheckInitialized() { if (!isInitialized) { throw new Exception("Not initialized yet."); } } protected virtual void OnControllerColliderHit(ControllerColliderHit hit) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Expected O, but got Unknown DoorLock component = hit.gameObject.GetComponent<DoorLock>(); if ((Object)component != (Object)null) { doorOpener.OpenDoor(component); } } } internal class EnemyAIController : EnemyController { private EnemyAI enemyAI; private NavMeshAgent enemyAIAgent; private float originalAgentAngularSpeed; private float originalAgentSpeed; private Vector3 enemyPositionOffset = Vector3.zero; private bool useLerpRotation = false; public EnemyAI EnemyAI => enemyAI; public override void InitializeEnemyController(PlayerActions playerActions, GameObject enemyGameObject) { //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Expected O, but got Unknown //IL_00a1: 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_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Expected O, but got Unknown if (!isInitialized) { List<Collider> list = enemyGameObject.GetComponentsInChildren<Collider>().ToList(); Initialize(playerActions, CameraMode.THIRD_PERSON, list); CharacterController val = characterController; ((Collider)val).excludeLayers = LayerMask.op_Implicit(LayerMask.op_Implicit(((Collider)val).excludeLayers) | (1 << LayerMask.op_Implicit(Constants.ITERACTABLE_OBJ_LAYERMASK))); enemyAI = GetEnemyAIFromEnemyGameObject(enemyGameObject); if ((Object)enemyAI == (Object)null) { throw new Exception("Enemy gameobject does not have EnemyAI script attached."); } ((Component)enemyAI).gameObject.LogLayer(); enemyGameObject.transform.position = ((Component)this).transform.position; enemyGameObject.transform.rotation = ((Component)this).transform.rotation; base.enemyGameObject = enemyGameObject; enemyAIAgent = enemyGameObject.GetComponentInChildren<NavMeshAgent>(); if ((Object)enemyAIAgent != (Object)null) { originalAgentAngularSpeed = enemyAIAgent.angularSpeed; originalAgentSpeed = enemyAIAgent.speed; } ConfigureEnemyAttributes(enemyAI); EnableAIControl(enabled: false); } } protected override void LateUpdate() { //IL_0135: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_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_0097: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_009d: 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_0113: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_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) if (!isInitialized) { return; } base.LateUpdate(); if (!isAIControlled) { if (!CanControlEnemy()) { return; } if (controlEnemyMovement) { enemyGameObject.transform.position = ((Component)this).transform.position + enemyPositionOffset; } if (!controlEnemyRotation || lockEnemyRotationInput) { return; } Vector3 velocity = characterController.velocity; Vector3 val = velocity; if (((Vector3)(ref val)).sqrMagnitude > 0.1f) { if (useLerpRotation) { enemyGameObject.transform.rotation = Quaternion.Lerp(enemyGameObject.transform.rotation, ((Component)this).transform.rotation, 8f * Time.deltaTime); } else { enemyGameObject.transform.rotation = ((Component)this).transform.rotation; } } } else { ((Component)this).transform.position = enemyGameObject.transform.position; } } protected EnemyAI GetEnemyAIFromEnemyGameObject(GameObject enemyObj) { return enemyObj.GetComponentInChildren<EnemyAI>(); } private void ConfigureEnemyAttributes(EnemyAI enemyAI) { //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) EnemyAttributes enemyAttributes = enemyAI.GetEnemyAttributes(); base.WalkSpeed = enemyAttributes.WalkSpeed; base.RunSpeed = enemyAttributes.RunSpeed; SetCamDistance(enemyAttributes.CamDistance); SetCamHeight(enemyAttributes.CamHeight); controlEnemyRotation = enemyAttributes.PlayerControlsRotation; controlEnemyMovement = true; enemyPositionOffset = enemyAttributes.EnemyPositionOffset; useLerpRotation = enemyAttributes.UseLerpRotation; } protected virtual void ConfigureEnemyHandicap(EnemyAI enemyAI) { } public override bool CanControlEnemy() { return !enemyAI.isEnemyDead; } protected override void Move() { if (!enemyAI.isEnemyDead) { base.Move(); } } public void SwitchAIState(int stateIndex) { CheckInitialized(); if (!isAIControlled) { enemyAI.SwitchToBehaviourState(stateIndex); } } protected override void ToggleAIControlTrue() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown //IL_0059: Unknown result type (might be due to invalid IL or missing references) if ((Object)enemyAIAgent != (Object)null) { enemyAIAgent.angularSpeed = originalAgentAngularSpeed; enemyAIAgent.speed = originalAgentSpeed; enemyAIAgent.isStopped = false; enemyAIAgent.Warp(enemyGameObject.transform.position); enemyAIAgent.updatePosition = true; } } protected override void ToggleAIControlFalse() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Expected O, but got Unknown if ((Object)enemyAI != (Object)null) { try { enemyAI.ChangeOwnershipOfEnemy(ControlCenter.Instance.GetHostPlayer().actualClientId); } catch (Exception ex) { ControlCompanyPlugin.Instance.logger.LogDebug((object)("Cannot give host control: " + ex.Message)); } } if ((Object)enemyAIAgent != (Object)null) { enemyAIAgent.angularSpeed = 0f; enemyAIAgent.speed = 0f; enemyAIAgent.isStopped = true; enemyAIAgent.updatePosition = false; } ((Component)this).transform.SetParent((Transform)null); } protected override bool ShouldDestroyEnemyGameObjectOnCleanUp() { return !enemyAI.isEnemyDead; } public override string GetSecondarySkillName() { return "Secondary Skill"; } protected override void UseSecondarySkillAction() { enemyAI.SwitchToBehaviourState(1); } protected override void EnableAIControl(bool enabled) { base.EnableAIControl(enabled); canMove = !isAIControlled; } } internal class CustomPlayerController : MonoBehaviour { public enum CameraMode { THIRD_PERSON, FIRST_PERSON } protected bool isInitialized = false; protected bool hasControl = false; protected bool canMove = false; protected bool canRotate = false; protected bool canJump = false; protected CameraMode camMode; protected CharacterController characterController; protected GameObject cameraGameObjectParent; protected GameObject cameraGameObject; protected Camera camera; protected Light light; protected PlayerActions playerActions; protected DoorOpener doorOpener; private AudioListener audioListener; private float runSpeed = 9f; private float walkSpeed = 7f; private float camDistance = -3.5f; private float camHeight = 2f; private float gravity = -20f; private float jumpHeight = 4.5f; private float currentYVelocity; private List<Collider> collidersToIgnore = new List<Collider>(); public float RunSpeed { get { return runSpeed; } set { runSpeed = value; } } public float WalkSpeed { get { return walkSpeed; } set { walkSpeed = value; } } public float Gravity { get { return gravity; } set { gravity = value; } } public AudioListener AudioListener { get { return audioListener; } set { audioListener = value; } } public bool IsInitialized { get { return isInitialized; } set { isInitialized = value; } } public void Initialize(PlayerActions playerActions, CameraMode camMode, List<Collider> collidersToIgnore = null) { if (!isInitialized) { this.playerActions = playerActions; this.camMode = camMode; if (collidersToIgnore != null) { this.collidersToIgnore = collidersToIgnore; } characterController = InitializeCharacterController(); camera = InitializeCamera(); light = InitializeLight(((Component)camera).gameObject); doorOpener = ((Component)this).gameObject.AddComponent<DoorOpener>(); EnableControl(enable: true); isInitialized = true; } } public void EnableLight(bool enable) { ((Behaviour)light).enabled = enable; } public void ToggleLight() { ((Behaviour)light).enabled = !((Behaviour)light).enabled; } public void EnableControl(bool enable) { hasControl = enable; canMove = enable; canRotate = enable; canJump = enable; } public bool IsMoving() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_000d: 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) Vector3 velocity = characterController.velocity; Vector3 val = velocity; return ((Vector3)(ref val)).sqrMagnitude > 0f; } public void SetCamHeight(float camHeight) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) this.camHeight = camHeight; cameraGameObjectParent.transform.localPosition = new Vector3(0f, camHeight, 0f); } public void SetCamDistance(float camDistance) { //IL_002d: Unknown result type (might be due to invalid IL or missing references) this.camDistance = camDistance; cameraGameObject.transform.localPosition = new Vector3(0f, 0f, (camMode == CameraMode.THIRD_PERSON) ? camDistance : 0f); } protected virtual void LateUpdate() { if (isInitialized && hasControl) { if (canMove) { Move(); } if (canRotate) { Rotate(); } if (((ButtonControl)InputKeys.CONTROLLER_USE_KEY).wasPressedThisFrame) { doorOpener.DetectAndOpenDoors(3f); } } } protected virtual void Move() { //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_0114: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_014f: Unknown result type (might be due to invalid IL or missing references) //IL_0154: Unknown result type (might be due to invalid IL or missing references) bool flag = IngamePlayerSettings.Instance.playerInput.actions.FindAction("Sprint", false).ReadValue<float>() > 0f; Vector3 val = Vector2.op_Implicit(IngamePlayerSettings.Instance.playerInput.actions.FindAction("Move", false).ReadValue<Vector2>()); Vector3 val2 = ((Component)this).transform.right * val.x; Vector3 val3 = ((Component)this).transform.forward * val.y; bool isGrounded = characterController.isGrounded; if (isGrounded && currentYVelocity < 0f) { currentYVelocity = 0f; } if (canJump && isGrounded && ((ButtonControl)InputKeys.CONTROLLER_JUMP_KEY).wasPressedThisFrame) { currentYVelocity += Mathf.Sqrt(jumpHeight * (0f - gravity)); } currentYVelocity += gravity * Time.deltaTime; characterController.Move(((val2 + val3) * (flag ? runSpeed : walkSpeed) + new Vector3(0f, currentYVelocity, 0f)) * Time.deltaTime); } protected virtual void Rotate() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_000d: 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_0016: 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_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) MovementActions movement = playerActions.Movement; MovementActions val = movement; Vector2 val2 = ((MovementActions)(ref val)).Look.ReadValue<Vector2>() * 0.008f * (float)IngamePlayerSettings.Instance.settings.lookSensitivity; if (IngamePlayerSettings.Instance.settings.invertYAxis) { val2.y *= -1f; } ((Component)this).transform.Rotate(new Vector3(0f, val2.x, 0f)); cameraGameObjectParent.transform.Rotate(new Vector3(0f - val2.y, 0f, 0f)); } private Light InitializeLight(GameObject lightParent) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Expected O, but got Unknown //IL_0033: 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) GameObject val = new GameObject("controller_light"); val.transform.SetParent(lightParent.transform); val.transform.localPosition = new Vector3(0f, 0.5f, 0f); val.transform.localRotation = Quaternion.identity; Light val2 = val.AddComponent<Light>(); val2.range = 15f; val2.intensity = 225f; val2.cullingMask = -1; return val2; } private CharacterController InitializeCharacterController() { //IL_001e: 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_0032: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_005c: 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_0071: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Unknown result type (might be due to invalid IL or missing references) //IL_011b: Expected O, but got Unknown CharacterController controller = ((Component)this).gameObject.AddComponent<CharacterController>(); ((Collider)controller).excludeLayers = LayerMask.op_Implicit(LayerMask.op_Implicit(GetLayerMask(LayerMask.op_Implicit(Constants.PLAYER_LOS_LAYERMASK))) | LayerMask.op_Implicit(GetLayerMask(LayerMask.op_Implicit(Constants.ITERACTABLE_OBJ_LAYERMASK))) | LayerMask.op_Implicit(GetLayerMask(LayerMask.op_Implicit(Constants.ENEMIES_LAYERMASK))) | LayerMask.op_Implicit(GetLayerMask(LayerMask.op_Implicit(Constants.PROPS_LAYERMASK))) | LayerMask.op_Implicit(GetLayerMask(LayerMask.op_Implicit(Constants.PLAYER_RAGDOLL_LAYERMASK)))); controller.center = new Vector3(0f, 0.55f, 0f); controller.height = 0.4f; ControlCenter.Instance.GetAllPlayers().ForEach(delegate(PlayerControllerB p) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Expected O, but got Unknown if ((Object)p != (Object)null) { ((Component)p).GetComponentsInChildren<Collider>().ToList().ForEach(delegate(Collider c) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown Physics.IgnoreCollision(c, (Collider)controller); }); } }); if (collidersToIgnore.Count() > 0) { foreach (Collider item in collidersToIgnore) { Physics.IgnoreCollision(item, (Collider)controller); } } controller.slopeLimit = 60f; controller.stepOffset = 0.4f; return controller; static LayerMask GetLayerMask(int layer) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) return LayerMask.op_Implicit(1 << layer); } } private Camera InitializeCamera() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Expected O, but got Unknown //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Expected O, but got Unknown //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("controller_cam_parent"); val.transform.SetParent(((Component)this).transform); val.transform.localRotation = Quaternion.identity; val.transform.localPosition = new Vector3(0f, camHeight, 0f); GameObject val2 = new GameObject("controller_cam"); val2.transform.SetParent(val.transform); val2.transform.localRotation = Quaternion.identity; val2.transform.localPosition = new Vector3(0f, 0f, (camMode == CameraMode.THIRD_PERSON) ? camDistance : 0f); Camera val3 = val2.AddComponent<Camera>(); audioListener = val2.AddComponent<AudioListener>(); cameraGameObject = val2; cameraGameObjectParent = val; Camera gameplayCamera = ControlCenter.Instance.GetHostPlayer().gameplayCamera; val3.cullingMask = gameplayCamera.cullingMask; val3.farClipPlane = gameplayCamera.farClipPlane; HDAdditionalCameraData component = ((Component)gameplayCamera).gameObject.GetComponent<HDAdditionalCameraData>(); CopyHDCameraData(val3, component); return val3; } private void CopyHDCameraData(Camera cam, HDAdditionalCameraData dataToCopy) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Expected O, but got Unknown //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Expected O, but got Unknown //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Expected O, but got Unknown //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) if ((Object)dataToCopy != (Object)null) { HDAdditionalCameraData val = ((Component)cam).gameObject.GetComponent<HDAdditionalCameraData>(); if ((Object)val == (Object)null) { val = ((Component)cam).gameObject.AddComponent<HDAdditionalCameraData>(); } if ((Object)val != (Object)null) { val.customRenderingSettings = true; val.renderingPathCustomFrameSettingsOverrideMask.mask = dataToCopy.renderingPathCustomFrameSettingsOverrideMask.mask; SetCustomPass(val, dataToCopy); SetVolumetricFog(val, dataToCopy); SetLOD(val, dataToCopy); SetAliasing(val, dataToCopy); SetShadowQuality(val, dataToCopy); } } } private void SetCustomPass(HDAdditionalCameraData camData, HDAdditionalCameraData dataToCopy) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) FrameSettings renderingPathCustomFrameSettings = camData.renderingPathCustomFrameSettings; FrameSettings renderingPathCustomFrameSettings2 = dataToCopy.renderingPathCustomFrameSettings; ((FrameSettings)(ref renderingPathCustomFrameSettings)).SetEnabled((FrameSettingsField)6, ((FrameSettings)(ref renderingPathCustomFrameSettings2)).IsEnabled((FrameSettingsField)6)); } private void SetVolumetricFog(HDAdditionalCameraData camData, HDAdditionalCameraData dataToCopy) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_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) FrameSettings renderingPathCustomFrameSettings = camData.renderingPathCustomFrameSettings; FrameSettings renderingPathCustomFrameSettings2 = dataToCopy.renderingPathCustomFrameSettings; ((FrameSettings)(ref renderingPathCustomFrameSettings)).SetEnabled((FrameSettingsField)28, ((FrameSettings)(ref renderingPathCustomFrameSettings2)).IsEnabled((FrameSettingsField)28)); } private void SetLOD(HDAdditionalCameraData camData, HDAdditionalCameraData dataToCopy) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) camData.renderingPathCustomFrameSettings.lodBiasMode = dataToCopy.renderingPathCustomFrameSettings.lodBiasMode; camData.renderingPathCustomFrameSettings.lodBias = dataToCopy.renderingPathCustomFrameSettings.lodBias; } private void SetAliasing(HDAdditionalCameraData camData, HDAdditionalCameraData dataToCopy) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) camData.antialiasing = dataToCopy.antialiasing; } private void SetShadowQuality(HDAdditionalCameraData camData, HDAdditionalCameraData dataToCopy) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_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) FrameSettings renderingPathCustomFrameSettings = camData.renderingPathCustomFrameSettings; FrameSettings renderingPathCustomFrameSettings2 = dataToCopy.renderingPathCustomFrameSettings; ((FrameSettings)(ref renderingPathCustomFrameSettings)).SetEnabled((FrameSettingsField)20, ((FrameSettings)(ref renderingPathCustomFrameSettings2)).IsEnabled((FrameSettingsField)20)); } } } namespace ControlCompany.Core.Config { internal class ConfigManager : MonoBehaviour { public static ConfigManager Instance; private bool isInitialized; private bool loadedConfig = false; private const string KEYBIND_CONFIG = "Keybinds"; private const string KEYBIND_CONFIG_HOST_MODE = "Keybinds.PlayerMode"; private const string KEYBIND_CONFIG_GHOST_MODE = "Keybinds.GhostMode"; private const string KEYBIND_CONFIG_ENEMY_MODE = "Keybinds.MonsterMode"; private const string GENERAL_CONIG = "General"; private bool forcePushToTalkWhileInMonsterMode = true; private bool disableModForSelf = false; private bool useEnemySpawningBehaviour = false; private bool disableWhileUsingTerminal = true; public bool ForcePushToTalkWhileInMonsterMode => forcePushToTalkWhileInMonsterMode; public bool DisableModForSelf => disableModForSelf; public bool UseEnemySpawningBehaviour => useEnemySpawningBehaviour; public bool DisableWhileUsingTerminal => disableWhileUsingTerminal; private void Awake() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown if ((Object)Instance == (Object)null) { Instance = this; } } private void Update() { if (!loadedConfig && ((BaseUnityPlugin)ControlCompanyPlugin.Instance).Config != null) { loadedConfig = true; ControlCompanyPlugin.Instance.logger.LogInfo((object)"Initial keybind load"); LoadPlayerConfig(reload: false); } } public void LoadPlayerConfig(bool reload) { ConfigFile config = ((BaseUnityPlugin)ControlCompanyPlugin.Instance).Config; if (config != null) { if (reload) { config.Reload(); } LoadConfig(config); } } private void LoadConfig(ConfigFile config) { ControlCompanyPlugin.Instance.logger.LogInfo((object)"Loading config"); useEnemySpawningBehaviour = config.Bind<bool>("General", "use_enemy_spawning_behaviour", false, (ConfigDescription)null).Value; disableWhileUsingTerminal = config.Bind<bool>("General", "disable_while_using_terminal", true, (ConfigDescription)null).Value; disableModForSelf = config.Bind<bool>("General", "disable_mod_for_self", false, (ConfigDescription)null).Value; forcePushToTalkWhileInMonsterMode = config.Bind<bool>("General", "force_push_to_talk_in_monster_mode", true, (ConfigDescription)null).Value; ConfigEntry<string> keyEntry = config.Bind<string>("Keybinds", "extended_mode_key", "0", (ConfigDescription)null); ConfigEntry<string> keyEntry2 = config.Bind<string>("Keybinds", "exit_mode_key", "esc", (ConfigDescription)null); ConfigEntry<string> keyEntry3 = config.Bind<string>("Keybinds", "open_door", "e", (ConfigDescription)null); ConfigEntry<string> keyEntry4 = config.Bind<string>("Keybinds", "toggle_ui", "u", (ConfigDescription)null); ConfigEntry<string> keyEntry5 = config.Bind<string>("Keybinds", "cycle_left_key", "o", (ConfigDescription)null); ConfigEntry<string> keyEntry6 = config.Bind<string>("Keybinds", "cycle_right_key", "p", (ConfigDescription)null); ConfigEntry<string> keyEntry7 = config.Bind<string>("Keybinds", "listen_from_player", "alt", (ConfigDescription)null); InputKeys.CONTROLLER_USE_KEY = GetKeyControlFromConfig(keyEntry3, InputKeys.CONTROLLER_USE_KEY); InputKeys.EXTENDED_MODE_KEY = GetKeyControlFromConfig(keyEntry, InputKeys.EXTENDED_MODE_KEY); InputKeys.EXIT_KEY = GetKeyControlFromConfig(keyEntry2, InputKeys.EXIT_KEY); InputKeys.TOGGLE_UI_KEY = GetKeyControlFromConfig(keyEntry4, InputKeys.TOGGLE_UI_KEY); InputKeys.CYCLE_KEY_LEFT = GetKeyControlFromConfig(keyEntry5, InputKeys.CYCLE_KEY_LEFT); InputKeys.CYCLE_KEY_RIGHT = GetKeyControlFromConfig(keyEntry6, InputKeys.CYCLE_KEY_RIGHT); InputKeys.HOST_LISTEN_KEY = GetKeyControlFromConfig(keyEntry7, InputKeys.HOST_LISTEN_KEY); ConfigEntry<string> keyEntry8 = config.Bind<string>("Keybinds.PlayerMode", "ghost_mode_key", "f1", (ConfigDescription)null); InputKeys.HOST_GHOST_MODE_KEY = GetKeyControlFromConfig(keyEntry8, InputKeys.HOST_GHOST_MODE_KEY); ConfigEntry<string> keyEntry9 = config.Bind<string>("Keybinds.PlayerMode", "extended_teleport_to_entrance_key", "9", (ConfigDescription)null); ConfigEntry<string> keyEntry10 = config.Bind<string>("Keybinds.PlayerMode", "extended_give_credits_key", "8", (ConfigDescription)null); InputKeys.HOST_TELEPORT_TO_ENTRANCE_KEY = GetKeyControlFromConfig(keyEntry9, InputKeys.HOST_TELEPORT_TO_ENTRANCE_KEY); InputKeys.HOST_GIVE_CREDITS_KEY = GetKeyControlFromConfig(keyEntry10, InputKeys.HOST_GIVE_CREDITS_KEY); ConfigEntry<string> keyEntry11 = config.Bind<string>("Keybinds.GhostMode", "jump", "space", (ConfigDescription)null); InputKeys.CONTROLLER_JUMP_KEY = GetKeyControlFromConfig(keyEntry11, InputKeys.CONTROLLER_JUMP_KEY); ConfigEntry<string> keyEntry12 = config.Bind<string>("Keybinds.GhostMode", "control_enemy_1", "f1", (ConfigDescription)null); ConfigEntry<string> keyEntry13 = config.Bind<string>("Keybinds.GhostMode", "control_enemy_2", "f2", (ConfigDescription)null); ConfigEntry<string> keyEntry14 = config.Bind<string>("Keybinds.GhostMode", "control_enemy_3", "f3", (ConfigDescription)null); ConfigEntry<string> keyEntry15 = config.Bind<string>("Keybinds.GhostMode", "control_enemy_4", "f4", (ConfigDescription)null); ConfigEntry<string> keyEntry16 = config.Bind<string>("Keybinds.GhostMode", "control_enemy_5", "f5", (ConfigDescription)null); ConfigEntry<string> keyEntry17 = config.Bind<string>("Keybinds.GhostMode", "control_enemy_6", "f6", (ConfigDescription)null); ConfigEntry<string> keyEntry18 = config.Bind<string>("Keybinds.GhostMode", "control_enemy_7", "f7", (ConfigDescription)null); ConfigEntry<string> keyEntry19 = config.Bind<string>("Keybinds.GhostMode", "control_enemy_8", "f8", (ConfigDescription)null); ConfigEntry<string> keyEntry20 = config.Bind<string>("Keybinds.GhostMode", "control_enemy_9", "f9", (ConfigDescription)null); ConfigEntry<string> keyEntry21 = config.Bind<string>("Keybinds.GhostMode", "control_enemy_10", "f10", (ConfigDescription)null); ConfigEntry<string> keyEntry22 = config.Bind<string>("Keybinds.GhostMode", "control_enemy_11", "f11", (ConfigDescription)null); ConfigEntry<string> keyEntry23 = config.Bind<string>("Keybinds.GhostMode", "control_enemy_12", "f12", (ConfigDescription)null); InputKeys.GHOST_SPAWN_ENEMY_1 = GetKeyControlFromConfig(keyEntry12, InputKeys.GHOST_SPAWN_ENEMY_1); InputKeys.GHOST_SPAWN_ENEMY_2 = GetKeyControlFromConfig(keyEntry13, InputKeys.GHOST_SPAWN_ENEMY_2); InputKeys.GHOST_SPAWN_ENEMY_3 = GetKeyControlFromConfig(keyEntry14, InputKeys.GHOST_SPAWN_ENEMY_3); InputKeys.GHOST_SPAWN_ENEMY_4 = GetKeyControlFromConfig(keyEntry15, InputKeys.GHOST_SPAWN_ENEMY_4); InputKeys.GHOST_SPAWN_ENEMY_5 = GetKeyControlFromConfig(keyEntry16, InputKeys.GHOST_SPAWN_ENEMY_5); InputKeys.GHOST_SPAWN_ENEMY_6 = GetKeyControlFromConfig(keyEntry17, InputKeys.GHOST_SPAWN_ENEMY_6); InputKeys.GHOST_SPAWN_ENEMY_7 = GetKeyControlFromConfig(keyEntry18, InputKeys.GHOST_SPAWN_ENEMY_7); InputKeys.GHOST_SPAWN_ENEMY_8 = GetKeyControlFromConfig(keyEntry19, InputKeys.GHOST_SPAWN_ENEMY_8); InputKeys.GHOST_SPAWN_ENEMY_9 = GetKeyControlFromConfig(keyEntry20, InputKeys.GHOST_SPAWN_ENEMY_9); InputKeys.GHOST_SPAWN_ENEMY_10 = GetKeyControlFromConfig(keyEntry21, InputKeys.GHOST_SPAWN_ENEMY_10); InputKeys.GHOST_SPAWN_ENEMY_11 = GetKeyControlFromConfig(keyEntry22, InputKeys.GHOST_SPAWN_ENEMY_11); InputKeys.GHOST_SPAWN_ENEMY_12 = GetKeyControlFromConfig(keyEntry23, InputKeys.GHOST_SPAWN_ENEMY_12); InputKeys.GHOST_SPAWN_ENEMY_KEYS = new List<KeyControl> { InputKeys.GHOST_SPAWN_ENEMY_1, InputKeys.GHOST_SPAWN_ENEMY_2, InputKeys.GHOST_SPAWN_ENEMY_3, InputKeys.GHOST_SPAWN_ENEMY_4, InputKeys.GHOST_SPAWN_ENEMY_5, InputKeys.GHOST_SPAWN_ENEMY_6, InputKeys.GHOST_SPAWN_ENEMY_7, InputKeys.GHOST_SPAWN_ENEMY_8, InputKeys.GHOST_SPAWN_ENEMY_9, InputKeys.GHOST_SPAWN_ENEMY_10, InputKeys.GHOST_SPAWN_ENEMY_11, InputKeys.GHOST_SPAWN_ENEMY_12 }; ConfigEntry<string> keyEntry24 = config.Bind<string>("Keybinds.MonsterMode", "toggle_ai_key", "f1", (ConfigDescription)null); InputKeys.ENEMY_TOGGLE_AI_KEY = GetKeyControlFromConfig(keyEntry24, InputKeys.ENEMY_TOGGLE_AI_KEY); ConfigEntry<string> keyEntry25 = config.Bind<string>("Keybinds.MonsterMode", "toggle_light", "l", (ConfigDescription)null); InputKeys.ENEMY_TOGGLE_LIGHT_KEY = GetKeyControlFromConfig(keyEntry25, InputKeys.ENEMY_TOGGLE_LIGHT_KEY); ControlCompanyPlugin.Instance.logger.LogInfo((object)"Done loading keybinds"); } private KeyControl GetKeyControlFromConfig(ConfigEntry<string> keyEntry, KeyControl defaultKey) { try { KeyControl val = Keyboard.current.FindKeyOnCurrentKeyboardLayout(keyEntry.Value); if (val != null) { return val; } ControlCompanyPlugin.Instance.logger.LogWarning((object)$"Cannot rebind key for {((ConfigEntryBase)keyEntry).Definition.Key} to {keyEntry.Value}: Cannot find key {((ConfigEntryBase)keyEntry).Definition.Key} on keyboard layout. Using default key ${defaultKey}"); return defaultKey; } catch (Exception ex) { ControlCompanyPlugin.Instance.logger.LogWarning((object)$"Cannot rebind key for {((ConfigEntryBase)keyEntry).Definition.Key} to {keyEntry.Value}: {ex.Message}. Using default key ${defaultKey}"); return defaultKey; } } } public class EnemyAttributes { public float WalkSpeed { get; set; } = 5f; public float RunSpeed { get; set; } = 7f; public bool PlayerControlsRotation { get; set; } = true; public float CamHeight { get; set; } = 2f; public float CamDistance { get; set; } = -3.5f; public string EnemyName { get; set; } = ""; public Vector3 EnemyPositionOffset { get; set; } = Vector3.zero; public bool UseLerpRotation { get; set; } = true; } internal static class EnemyConfiguration { public static HashSet<Type> ALLOWLISTED_ENEMIES = new HashSet<Type> { typeof(BlobAI), typeof(NutcrackerEnemyAI), typeof(HoarderBugAI), typeof(CrawlerAI), typeof(PufferAI), typeof(CentipedeAI), typeof(JesterAI), typeof(ForestGiantAI), typeof(BaboonBirdAI), typeof(FlowermanAI), typeof(MaskedPlayerEnemy), typeof(SpringManAI), typeof(SandWormAI), typeof(MouthDogAI) }; public static HashSet<Type> EXPERIMENTAL_ENEMIES = new HashSet<Type>(); public const float DEFAULT_WALK_SPEED = 5f; public const float DEFAULT_RUN_SPEED = 7f; public const float DEFAULT_CAM_DISTANCE = -3.5f; public const float DEFAULT_CAM_HEIGHT = 2f; public const bool DEFAULT_PLAYER_CONTROLS_ROTATION = true; public static Dictionary<Type, EnemyAttributes> ENEMY_ATTRIBUTES = new Dictionary<Type, EnemyAttributes> { { typeof(BlobAI), new EnemyAttributes { WalkSpeed = 1f, RunSpeed = 2f, PlayerControlsRotation = false, EnemyName = "Blob" } }, { typeof(CrawlerAI), new EnemyAttributes { WalkSpeed = 6f, RunSpeed = 12f, EnemyName = "Thumper" } }, { typeof(JesterAI), new EnemyAttributes { WalkSpeed = 4f, RunSpeed = 6f, EnemyName = "Jester" } }, { typeof(ForestGiantAI), new EnemyAttributes { WalkSpeed = 6f, RunSpeed = 8f, CamDistance = -7f, CamHeight = 10f, EnemyName = "Forest Keeper" } }, { typeof(MouthDogAI), new EnemyAttributes { WalkSpeed = 3f, RunSpeed = 7f, CamDistance = -5f, CamHeight = 5f, EnemyName = "Eyeless Dog" } }, { typeof(FlowermanAI), new EnemyAttributes { EnemyName = "Bracken", RunSpeed = 8f } }, { typeof(PufferAI), new EnemyAttributes { EnemyName = "Spore Lizard" } }, { typeof(HoarderBugAI), new EnemyAttributes { EnemyName = "Hoarding Bug" } }, { typeof(CentipedeAI), new EnemyAttributes { EnemyName = "Snare Flea", CamHeight = 1.5f, CamDistance = -3f } }, { typeof(SpringManAI), new EnemyAttributes { EnemyName = "Coil-Head", WalkSpeed = 5f, RunSpeed = 6f } }, { typeof(SandSpiderAI), new EnemyAttributes { EnemyName = "Bunker Spider" } }, { typeof(DressGirlAI), new EnemyAttributes { EnemyName = "Ghost Girl" } }, { typeof(MaskedPlayerEnemy), new EnemyAttributes { EnemyName = "Masked", UseLerpRotation = false } }, { typeof(TestEnemy), new EnemyAttributes { WalkSpeed = 6f, RunSpeed = 8f, EnemyName = "Obunga", EnemyPositionOffset = new Vector3(0f, 1.5f, 0f), CamDistance = -4f, CamHeight = 3f } } }; private static readonly EnemyAttributes DEFAULT_ATTRIBUTES = new EnemyAttributes(); public static Dictionary<Type, Func<GameObject, EnemyAIController>> ENEMY_CONTROLLERS = new Dictionary<Type, Func<GameObject, EnemyAIController>> { { typeof(NutcrackerEnemyAI), (GameObject controller) => controller.AddComponent<NutcrackerEnemyController>() }, { typeof(CentipedeAI), (GameObject controller) => controller.AddComponent<CentipedeEnemyController>() }, { typeof(PufferAI), (GameObject controller) => controller.AddComponent<PufferEnemyController>() }, { typeof(JesterAI), (GameObject controller) => controller.AddComponent<JesterEnemyController>() }, { typeof(ForestGiantAI), (GameObject controller) => controller.AddComponent<ForestGiantEnemyController>() }, { typeof(MouthDogAI), (GameObject controller) => controller.AddComponent<MouthDogEnemyController>() }, { typeof(HoarderBugAI), (GameObject controller) => controller.AddComponent<HoardingBugEnemyController>() }, { typeof(FlowermanAI), (GameObject controller) => controller.AddComponent<FlowermanEnemyController>() }, { typeof(BaboonBirdAI), (GameObject controller) => controller.AddComponent<BaboonBirdEnemyController>() }, { typeof(BlobAI), (GameObject controller) => controller.AddComponent<BlobEnemyController>() }, { typeof(MaskedPlayerEnemy), (GameObject controller) => controller.AddComponent<MaskedPlayerEnemyController>() }, { typeof(SpringManAI), (GameObject controller) => controller.AddComponent<SpringManEnemyController>() }, { typeof(SandWormAI), (GameObject controller) => controller.AddComponent<SandWormEnemyController>() }, { typeof(TestEnemy), (GameObject controller) => controller.AddComponent<SecretTestEnemyController>() } }; public static EnemyAttributes GetEnemyAttributes(this EnemyAI enemyAI) { return ExtensionMethods.GetValueOrDefault(ENEMY_ATTRIBUTES, ((object)enemyAI).GetType(), DEFAULT_ATTRIBUTES); } public static bool IsEnemyAllowlisted(this EnemyAI enemyAI) { return ALLOWLISTED_ENEMIES.Contains(((object)enemyAI).GetType()); } public static bool IsEnemyExperimental(this EnemyAI enemyAI) { return EXPERIMENTAL_ENEMIES.Contains(((object)enemyAI).GetType()); } public static string GetEnemyName(this EnemyAI enemyAI) { EnemyAttributes valueOrDefault = ExtensionMethods.GetValueOrDefault(ENEMY_ATTRIBUTES, ((object)enemyAI).GetType(), null); if (valueOrDefault == null) { return enemyAI.enemyType?.enemyName ?? ((Object)((Component)enemyAI).gameObject).name; } return valueOrDefault.EnemyName; } public static EnemyAIController GetAndAttachEnemyController(this EnemyAI enemyAI, GameObject controller) { Func<GameObject, EnemyAIController> valueOrDefault = ExtensionMethods.GetValueOrDefault(ENEMY_CONTROLLERS, ((object)enemyAI).GetType(), (GameObject c) => c.AddComponent<EnemyAIController>()); return valueOrDefault(controller); } } } namespace ControlCompany.Core.Enemy { internal class SecretTestEnemyController : EnemyAIController { private TestEnemy testEnemy; public override void InitializeEnemyController(PlayerActions playerActions, GameObject enemyGameObject) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Expected O, but got Unknown testEnemy = (TestEnemy)GetEnemyAIFromEnemyGameObject(enemyGameObject); base.InitializeEnemyController(playerActions, enemyGameObject); } protected override void UseSecondarySkillAction() { } public override string GetSecondarySkillName() { return ""; } } internal class ControllableEnemy { public GameObject EnemyPrefab { get; set; } public string EnemyName { get; set; } public bool OverrideEnemyPrefab { get; set; } public GameObject EnemyGameObject { get; set; } public bool OverrideEnemySpawnLocation { get; set; } public bool Allowlisted { get; set; } public Vector3 EnemySpawnLocationOverride { get; set; } public Func<GameObject, GameObject, EnemyController> CreateAndAttachEnemyControllerFunc { get; set; } public static ControllableEnemy FromSpawnableEnemy(SpawnableEnemyWithRarity spawnableEnemy) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown GameObject enemyPrefab = spawnableEnemy.enemyType.enemyPrefab; EnemyAI componentInChildren = enemyPrefab.GetComponentInChildren<EnemyAI>(); string enemyName = (((Object)componentInChildren == (Object)null) ? spawnableEnemy.enemyType.enemyName : componentInChildren.GetEnemyName()); return new ControllableEnemy { EnemyName = enemyName, EnemyPrefab = enemyPrefab, OverrideEnemyPrefab = false, OverrideEnemySpawnLocation = false, Allowlisted = componentInChildren.IsEnemyAllowlisted(), CreateAndAttachEnemyControllerFunc = delegate(GameObject enemyGameObject, GameObject enemyController) { EnemyAI componentInChildren2 = enemyGameObject.GetComponentInChildren<EnemyAI>(); return componentInChildren2.GetAndAttachEnemyController(enemyController); } }; } public static ControllableEnemy FromEnemyAI(EnemyAI enemyAI) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Expected O, but got Unknown GameObject enemyPrefab = enemyAI.enemyType.enemyPrefab; string enemyName = (((Object)enemyAI == (Object)null) ? enemyAI.enemyType.enemyName : enemyAI.GetEnemyName()); return new ControllableEnemy { EnemyName = enemyName, EnemyPrefab = enemyPrefab, OverrideEnemyPrefab = false, OverrideEnemySpawnLocation = false, Allowlisted = enemyAI.IsEnemyAllowlisted(), CreateAndAttachEnemyControllerFunc = delegate(GameObject enemyGameObject, GameObject enemyController) { EnemyAI componentInChildren = enemyGameObject.GetComponentInChildren<EnemyAI>(); return componentInChildren.GetAndAttachEnemyController(enemyController); } }; } } internal class SandWormEnemyController : EnemyAIController { private SandWormAI sandWormAI; private bool usedEmerge = false; public override void InitializeEnemyController(PlayerActions playerActions, GameObject enemyGameObject) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Expected O, but got Unknown sandWormAI = (SandWormAI)GetEnemyAIFromEnemyGameObject(enemyGameObject); base.InitializeEnemyController(playerActions, enemyGameObject); } protected override void Move() { if (!IsEmerged() && !usedEmerge) { base.Move(); } } protected override void LateUpdate() { base.LateUpdate(); controlEnemyRotation = !IsEmerged() && !usedEmerge; if (IsEmerged()) { usedEmerge = true; } } protected override void UseSecondarySkillAction() { if (!IsEmerged() && !usedEmerge) { usedEmerge = true; sandWormAI.StartEmergeAnimation(); } } public override string GetSecondarySkillName() { return usedEmerge ? "" : "Emerge"; } private bool IsEmerged() { return sandWormAI.inEmergingState || sandWormAI.emerged; } } internal class SpringManEnemyController : EnemyAIController { private SpringManAI springMan; private float initialWalkSpeed; private float initialRunSpeed; private bool holdingForceMove = false; public override void InitializeEnemyController(PlayerActions playerActions, GameObject enemyGameObject) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Expected O, but got Unknown springMan = (SpringManAI)GetEnemyAIFromEnemyGameObject(enemyGameObject); base.InitializeEnemyController(playerActions, enemyGameObject); initialWalkSpeed = base.WalkSpeed; initialRunSpeed = base.RunSpeed; } protected override void LateUpdate() { base.LateUpdate(); bool flag = springMan.GetFieldValue<bool>("hasStopped") || springMan.GetFieldValue<bool>("stoppingMovement"); controlEnemyRotation = !flag || holdingForceMove; float fieldValue = springMan.GetFieldValue<float>("currentAnimSpeed"); base.WalkSpeed = initialWalkSpeed * (1f + fieldValue / 6f); base.RunSpeed = initialRunSpeed * (1f + fieldValue / 6f); } protected override void Move() { if ((!springMan.GetFieldValue<bool>("hasStopped") && !springMan.GetFieldValue<bool>("stoppingMovement")) || holdingForceMove) { base.Move(); } } protected override void UseSecondarySkillAction() { holdingForceMove = true; } protected override void ReleaseSecondarySkillAction() { CheckInitialized(); if (!isAIControlled) { holdingForceMove = false; } } public override string GetSecondarySkillName() { return "(HOLD) Force move"; } } internal class MaskedPlayerEnemyController : EnemyAIController { private MaskedPlayerEnemy maskedEnemy; private float entranceDoorOpenRange = 2.5f; private float useEntranceDoorCooldown = 2f; private float timeSinceLastEntranceDoorUse = 0f; private bool canUseEntranceDoorOnCollision = true; public override void InitializeEnemyController(PlayerActions playerActions, GameObject enemyGameObject) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Expected O, but got Unknown maskedEnemy = (MaskedPlayerEnemy)GetEnemyAIFromEnemyGameObject(enemyGameObject); base.InitializeEnemyController(playerActions, enemyGameObject); canJump = true; } protected override void LateUpdate() { //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Unknown result type (might be due to invalid IL or missing references) base.LateUpdate(); bool fieldValue = maskedEnemy.GetFieldValue<bool>("inKillAnimation"); bool fieldValue2 = maskedEnemy.GetFieldValue<bool>("crouching"); controlEnemyRotation = !fieldValue && !fieldValue2; if (!canUseEntranceDoorOnCollision) { timeSinceLastEntranceDoorUse += Time.deltaTime; if (timeSinceLastEntranceDoorUse >= useEntranceDoorCooldown) { canUseEntranceDoorOnCollision = true; timeSinceLastEntranceDoorUse = 0f; } } MovementActions movement = playerActions.Movement; MovementActions val = movement; if (((MovementActions)(ref val)).Interact.WasPressedThisFrame()) { ScanNearbyAndOpenMainEntranceDoor(); return; } movement = playerActions.Movement; val = movement; if (((MovementActions)(ref val)).Crouch.WasPressedThisFrame()) { Crouch(!fieldValue2); } } protected override void Move() { bool fieldValue = maskedEnemy.GetFieldValue<bool>("inKillAnimation"); bool fieldValue2 = maskedEnemy.GetFieldValue<bool>("crouching"); if (!fieldValue && !fieldValue2) { base.Move(); } } protected override void UseSecondarySkillAction() { } private void Crouch(bool crouching) { maskedEnemy.SetCrouchingServerRpc(crouching); } private void ScanNearbyAndOpenMainEntranceDoor() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Expected O, but got Unknown Collider[] array = Physics.OverlapSphere(((Component)this).transform.position, entranceDoorOpenRange); for (int i = 0; i < array.Length; i++) { EntranceTeleport componentInChildren = ((Component)array[i]).GetComponentInChildren<EntranceTeleport>(); if ((Object)componentInChildren != (Object)null && componentInChildren.entranceId == 0) { UseEntranceDoor(); } } } private void UseEntranceDoor() { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0029: 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) ((Collider)characterController).enabled = false; Vector3 position = RoundManager.FindMainEntrancePosition(true, !((EnemyAI)maskedEnemy).isOutside); ((Component)this).transform.position = position; maskedEnemy.Call("TeleportMaskedEnemyAndSync", RoundManager.FindMainEntrancePosition(true, !((EnemyAI)maskedEnemy).isOutside), !((EnemyAI)maskedEnemy).isOutside); ((Collider)characterController).enabled = true; canUseEntranceDoorOnCollision = false; ControlCenter.Instance.IsGhostIndoors = !((EnemyAI)maskedEnemy).isOutside; } protected override void OnControllerColliderHit(ControllerColliderHit hit) { //IL_0021: Unknown result type (might be due to invali