Decompiled source of GhostMode v2.7.1
GhostMode.dll
Decompiled 3 months ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using GameNetcodeStuff; using HarmonyLib; using OPJosMod.GhostMode.CustomRpc; using OPJosMod.GhostMode.Enemy.Patches; using OPJosMod.GhostMode.Patches; using OPJosMod.Utils; using Steamworks; using TMPro; using Unity.Netcode; using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.InputSystem.Controls; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("OPJosMod")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("OPJosMod")] [assembly: AssemblyCopyright("Copyright © 2024")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("70095872-b952-4e27-bbc4-3d70d0238f39")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyVersion("1.0.0.0")] namespace OPJosMod { public static class ConfigVariables { public static bool seeOtherGhosts; public static float waitTimeBetweenInteractions; public static Key startGhostModeButton; public static Key teleportBodyButton; public static Key toggleBrightModeButton; public static Key teleportFrontDoorButton; public static Key switchToSpectateButton; public static Key toggleNoClipButton; public static float noClipSpeed; public static OPnessModes OPness; public static Key teleportShipButton; public static bool enemiesDetectYou; public static bool canPickupScrap; public static bool canPressTeleportButtons; public static Key teleportToPlayerForwardButton; public static Key teleportToPlayerBackwardButton; public static Key noClipForwardButton; public static Key noClipBackwardButton; public static Key noClipLeftButton; public static Key noClipRightButton; public static Key noClipUpButton; public static Key noClipDownButton; } public enum OPnessModes { Limited, Balanced, Unrestricted } } namespace OPJosMod.Utils { public class GeneralUtils { public static bool twoPointsAreClose(Vector3 point1, Vector3 point2, float closeThreshold) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) bool flag = true; float num = Vector3.Distance(point1, point2); if (num <= closeThreshold) { return true; } return false; } public static string simplifyObjectNames(string ogName) { string text = ogName; int num = text.IndexOf("("); if (num != -1) { text = text.Substring(0, num).Trim(); } return text; } } public class ReflectionUtils { public static void InvokeMethod(object obj, string methodName, object[] parameters) { Type type = obj.GetType(); MethodInfo method = type.GetMethod(methodName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); method.Invoke(obj, parameters); } public static void InvokeMethod(object obj, Type forceType, string methodName, object[] parameters) { MethodInfo method = forceType.GetMethod(methodName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); method.Invoke(obj, parameters); } public static void SetPropertyValue(object obj, string propertyName, object value) { Type type = obj.GetType(); PropertyInfo property = type.GetProperty(propertyName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); property.SetValue(obj, value); } public static T InvokeMethod<T>(object obj, string methodName, object[] parameters) { Type type = obj.GetType(); MethodInfo method = type.GetMethod(methodName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); return (T)method.Invoke(obj, parameters); } public static T GetFieldValue<T>(object obj, string fieldName) { Type type = obj.GetType(); FieldInfo field = type.GetField(fieldName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); return (T)field.GetValue(obj); } public static void SetFieldValue(object obj, string fieldName, object value) { Type type = obj.GetType(); FieldInfo field = type.GetField(fieldName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); field.SetValue(obj, value); } } } namespace OPJosMod.GhostMode { public static class GlobalVariables { public static bool ModActivated; } [BepInPlugin("OpJosMod.GhostMode", "GhostMode", "2.7.0")] public class OpJosMod : BaseUnityPlugin { private const string modGUID = "OpJosMod.GhostMode"; private const string modName = "GhostMode"; private const string modVersion = "2.7.0"; private readonly Harmony harmony = new Harmony("OpJosMod.GhostMode"); private static OpJosMod Instance; internal ManualLogSource mls; private void Awake() { if ((Object)(object)Instance == (Object)null) { Instance = this; } mls = Logger.CreateLogSource("OpJosMod.GhostMode"); mls.LogInfo((object)"mod has started"); setupConfig(); CompleteRecievedTasks.SetLogSource(mls); PatchesForRPC.SetLogSource(mls); RpcMessageHandler.SetLogSource(mls); PlayerControllerBPatch.SetLogSource(mls); StartOfRoundPatch.SetLogSource(mls); EnemyAIPatch.SetLogSource(mls); HUDManagerPatch.SetLogSource(mls); CentipedeAIPatch.SetLogSource(mls); MouthDogAIPatch.SetLogSource(mls); ForestGiantAIPatch.SetLogSource(mls); SandSpiderAIPatch.SetLogSource(mls); NutcrackerEnemyAIPatch.SetLogSource(mls); StartMatchLeverPatch.SetLogSource(mls); LandminePatch.SetLogSource(mls); FlowermanAIPatch.SetLogSource(mls); CrawlerAIPatch.SetLogSource(mls); TurretPatch.SetLogSource(mls); MaskedPlayerEnemyPatch.SetLogSource(mls); JesterAIPatch.SetLogSource(mls); ShovelPatch.SetLogSource(mls); RadMechAIPatch.SetLogSource(mls); ButlerEnemyAIPatch.SetLogSource(mls); SpikeRoofTrapPatch.SetLogSource(mls); harmony.PatchAll(); } private void setupConfig() { //IL_0297: Unknown result type (might be due to invalid IL or missing references) //IL_029c: Unknown result type (might be due to invalid IL or missing references) //IL_02a3: Unknown result type (might be due to invalid IL or missing references) //IL_02a8: Unknown result type (might be due to invalid IL or missing references) //IL_02af: Unknown result type (might be due to invalid IL or missing references) //IL_02b4: Unknown result type (might be due to invalid IL or missing references) //IL_02bb: Unknown result type (might be due to invalid IL or missing references) //IL_02c0: Unknown result type (might be due to invalid IL or missing references) //IL_02c7: Unknown result type (might be due to invalid IL or missing references) //IL_02cc: Unknown result type (might be due to invalid IL or missing references) //IL_02d3: Unknown result type (might be due to invalid IL or missing references) //IL_02d8: Unknown result type (might be due to invalid IL or missing references) //IL_02df: Unknown result type (might be due to invalid IL or missing references) //IL_02e4: Unknown result type (might be due to invalid IL or missing references) //IL_02eb: Unknown result type (might be due to invalid IL or missing references) //IL_02f0: Unknown result type (might be due to invalid IL or missing references) //IL_02f7: Unknown result type (might be due to invalid IL or missing references) //IL_02fc: Unknown result type (might be due to invalid IL or missing references) //IL_0326: Unknown result type (might be due to invalid IL or missing references) //IL_032b: Unknown result type (might be due to invalid IL or missing references) //IL_0332: Unknown result type (might be due to invalid IL or missing references) //IL_0337: Unknown result type (might be due to invalid IL or missing references) //IL_033e: Unknown result type (might be due to invalid IL or missing references) //IL_0343: Unknown result type (might be due to invalid IL or missing references) //IL_034a: Unknown result type (might be due to invalid IL or missing references) //IL_034f: Unknown result type (might be due to invalid IL or missing references) //IL_0356: Unknown result type (might be due to invalid IL or missing references) //IL_035b: Unknown result type (might be due to invalid IL or missing references) //IL_0362: Unknown result type (might be due to invalid IL or missing references) //IL_0367: Unknown result type (might be due to invalid IL or missing references) ConfigEntry<OPnessModes> val = ((BaseUnityPlugin)this).Config.Bind<OPnessModes>("OP-Ness", "OPness", OPnessModes.Balanced, "(limited, balanced, unrestricted) The three modes of ghost mode. (limited -> almost no interactions allowed.) (balanced -> delays on lots of interactions. completly restricted from a few.) (unrestricted -> no restrictions on what you can interact with at all)"); ConfigEntry<float> val2 = ((BaseUnityPlugin)this).Config.Bind<float>("GhostMode interaction delay", "GhostModeInteractionDelay", 45f, "How long you must wait between interactions when in ghost mode. Set to -1 to remove the ability to interact at all"); ConfigEntry<Key> val3 = ((BaseUnityPlugin)this).Config.Bind<Key>("Start Ghost Mode Button", "StartGhostModeButton", (Key)30, "Button to turn into ghost"); ConfigEntry<bool> val4 = ((BaseUnityPlugin)this).Config.Bind<bool>("Can Grab Scrap", "CanGrabScrap", true, "this setting only has an effect if you are in balanced mode"); ConfigEntry<bool> val5 = ((BaseUnityPlugin)this).Config.Bind<bool>("Can Press Teleport Buttons", "CanPressTeleportButtons", false, "this setting only has an effect if you are in balanced mode"); ConfigEntry<Key> val6 = ((BaseUnityPlugin)this).Config.Bind<Key>("Teleport to Dead Body Button", "TeleportToDeadBodyButton", (Key)65, "Button to teleport to your dead body"); ConfigEntry<Key> val7 = ((BaseUnityPlugin)this).Config.Bind<Key>("Toggle Bright Mode Button", "ToggleBrightModeButton", (Key)16, "Button to toggle on bright mode"); ConfigEntry<Key> val8 = ((BaseUnityPlugin)this).Config.Bind<Key>("Teleport to Front Door Button", "TeleportToFrontDoorButton", (Key)63, "Button to teleport to the front door"); ConfigEntry<Key> val9 = ((BaseUnityPlugin)this).Config.Bind<Key>("Teleport to Ship Button", "TeleportToShipButton", (Key)64, "Button to teleport you to the ship"); ConfigEntry<Key> val10 = ((BaseUnityPlugin)this).Config.Bind<Key>("Switch to Spectate Mode Button", "SwitchToSpectateModeButton", (Key)29, "Button to switch back to specate mode"); ConfigEntry<bool> val11 = ((BaseUnityPlugin)this).Config.Bind<bool>("Enemies Detect Ghost", "EnemiesDetectGhost", false, "Enemies are able to detect you as a ghost, true or false"); ConfigEntry<Key> val12 = ((BaseUnityPlugin)this).Config.Bind<Key>("Teleport to Player 1", "TeleportToPlayerForward", (Key)62, "Button to other players forward in the list of players"); ConfigEntry<Key> val13 = ((BaseUnityPlugin)this).Config.Bind<Key>("Teleport to Player 2", "TeleportToPlayerBackward", (Key)61, "Button to teleport you to other players backwards in the list of players"); ConfigEntry<Key> val14 = ((BaseUnityPlugin)this).Config.Bind<Key>("Toggle NoClip Mode Button", "ToggleNoClipModeButton", (Key)40, "Button to enter/leave no clip mode"); ConfigEntry<float> val15 = ((BaseUnityPlugin)this).Config.Bind<float>("NoClip Flight Speed", "NoClipFlightSpeed", 0.27f, "How fast you move while in no clip"); ConfigEntry<Key> val16 = ((BaseUnityPlugin)this).Config.Bind<Key>("NoClip Forward Button", "NoClipForwardButton", (Key)37, "Button to move forward in no clip mode"); ConfigEntry<Key> val17 = ((BaseUnityPlugin)this).Config.Bind<Key>("NoClip Backward Button", "NoClipBackwardButton", (Key)33, "Button to move backwards in no clip mode"); ConfigEntry<Key> val18 = ((BaseUnityPlugin)this).Config.Bind<Key>("NoClip Left Button", "NoClipLeftButton", (Key)15, "Button to move left in no clip mode"); ConfigEntry<Key> val19 = ((BaseUnityPlugin)this).Config.Bind<Key>("NoClip Right Button", "NoClipRightButton", (Key)18, "Button to move right in no clip mode"); ConfigEntry<Key> val20 = ((BaseUnityPlugin)this).Config.Bind<Key>("NoClip Up Button", "NoClipUpButton", (Key)1, "Button to move up in no clip mode"); ConfigEntry<Key> val21 = ((BaseUnityPlugin)this).Config.Bind<Key>("NoClip Down Button", "NoClipDownButton", (Key)51, "Button to move down in no clip mode"); ConfigVariables.waitTimeBetweenInteractions = val2.Value; ConfigVariables.canPickupScrap = val4.Value; ConfigVariables.canPressTeleportButtons = val5.Value; ConfigVariables.startGhostModeButton = val3.Value; ConfigVariables.teleportBodyButton = val6.Value; ConfigVariables.toggleBrightModeButton = val7.Value; ConfigVariables.teleportFrontDoorButton = val8.Value; ConfigVariables.switchToSpectateButton = val10.Value; ConfigVariables.toggleNoClipButton = val14.Value; ConfigVariables.teleportShipButton = val9.Value; ConfigVariables.teleportToPlayerForwardButton = val12.Value; ConfigVariables.teleportToPlayerBackwardButton = val13.Value; ConfigVariables.noClipSpeed = val15.Value; ConfigVariables.OPness = val.Value; ConfigVariables.enemiesDetectYou = val11.Value; ConfigVariables.noClipForwardButton = val16.Value; ConfigVariables.noClipBackwardButton = val17.Value; ConfigVariables.noClipLeftButton = val18.Value; ConfigVariables.noClipRightButton = val19.Value; ConfigVariables.noClipUpButton = val20.Value; ConfigVariables.noClipDownButton = val21.Value; ((BaseUnityPlugin)this).Config.Save(); } } } namespace OPJosMod.GhostMode.Patches { [HarmonyPatch(typeof(Shovel))] internal class ShovelPatch { private static ManualLogSource mls; public static void SetLogSource(ManualLogSource logSource) { mls = logSource; } [HarmonyPatch("HitShovel")] [HarmonyPrefix] private static bool hitShovelPatch(Shovel __instance) { //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Unknown result type (might be due to invalid IL or missing references) if (!PlayerControllerBPatch.isGhostMode) { return true; } if (ConfigVariables.OPness == OPnessModes.Unrestricted) { return true; } try { GameObject val = null; PlayerControllerB fieldValue = ReflectionUtils.GetFieldValue<PlayerControllerB>(__instance, "previousPlayerHeldBy"); RaycastHit[] fieldValue2 = ReflectionUtils.GetFieldValue<RaycastHit[]>(__instance, "objectsHitByShovel"); List<RaycastHit> fieldValue3 = ReflectionUtils.GetFieldValue<List<RaycastHit>>(__instance, "objectsHitByShovelList"); int fieldValue4 = ReflectionUtils.GetFieldValue<int>(__instance, "shovelMask"); fieldValue.activatingItem = false; fieldValue.twoHanded = false; fieldValue2 = Physics.SphereCastAll(((Component)fieldValue.gameplayCamera).transform.position + ((Component)fieldValue.gameplayCamera).transform.right * -0.35f, 0.8f, ((Component)fieldValue.gameplayCamera).transform.forward, 1.5f, fieldValue4, (QueryTriggerInteraction)2); fieldValue3 = fieldValue2.OrderBy((RaycastHit x) => ((RaycastHit)(ref x)).distance).ToList(); IHittable val3 = default(IHittable); for (int i = 0; i < fieldValue3.Count; i++) { RaycastHit val2 = fieldValue3[i]; if (((Component)((RaycastHit)(ref val2)).transform).TryGetComponent<IHittable>(ref val3)) { mls.LogMessage((object)("Hit object: " + ((Object)((Component)((RaycastHit)(ref val2)).transform).gameObject).name)); val = ((Component)((RaycastHit)(ref val2)).transform).gameObject; } } if ((Object)(object)val != (Object)null && ((Object)val).name.Contains("Player")) { mls.LogMessage((object)"dont actaully hit the player"); return false; } } catch (Exception ex) { mls.LogError((object)ex); return true; } return true; } } [HarmonyPatch(typeof(StartMatchLever))] internal class StartMatchLeverPatch { private static ManualLogSource mls; public static void SetLogSource(ManualLogSource logSource) { mls = logSource; } [HarmonyPatch("Update")] [HarmonyPrefix] private static void updatePatch(StartMatchLever __instance) { if (PlayerControllerBPatch.isGhostMode && ConfigVariables.OPness != OPnessModes.Unrestricted) { __instance.triggerScript.hoverTip = "Can't use this as ghost!"; __instance.triggerScript.interactable = false; } } } [HarmonyPatch(typeof(HUDManager))] internal class HUDManagerPatch { private static ManualLogSource mls; public static int livingPlayersCount = 0; public static List<string> playerNotes = new List<string>(); public static TextMeshProUGUI mcPlayerNotes; public static void SetLogSource(ManualLogSource logSource) { mls = logSource; } [HarmonyPatch("Update")] [HarmonyPrefix] private static void updatePatch(HUDManager __instance) { if (PlayerControllerBPatch.isGhostMode && !((Object)(object)GameNetworkManager.Instance == (Object)null) && !((Object)(object)GameNetworkManager.Instance.localPlayerController == (Object)null) && !((Object)(object)GameNetworkManager.Instance.localPlayerController == (Object)null)) { if (livingPlayersCount != RoundManager.Instance.playersManager.livingPlayers) { mls.LogMessage((object)"Adding boxes"); __instance.gameOverAnimator.SetTrigger("gameOver"); ((TMP_Text)__instance.spectatingPlayerText).text = ""; ((TMP_Text)__instance.holdButtonToEndGameEarlyText).text = ""; ((Component)__instance.holdButtonToEndGameEarlyMeter).gameObject.SetActive(false); ((TMP_Text)__instance.holdButtonToEndGameEarlyVotesText).text = ""; updateBoxesSpectateUI(__instance); } FieldInfo field = typeof(HUDManager).GetField("updateSpectateBoxesInterval", BindingFlags.Instance | BindingFlags.NonPublic); float num = (float)field.GetValue(__instance); MethodInfo method = typeof(HUDManager).GetMethod("UpdateSpectateBoxSpeakerIcons", BindingFlags.Instance | BindingFlags.NonPublic); if (num >= 0.35f) { field.SetValue(__instance, 0f); method.Invoke(__instance, null); } else { num += Time.deltaTime; field.SetValue(__instance, num); } livingPlayersCount = RoundManager.Instance.playersManager.livingPlayers; } } public static void updateBoxesSpectateUI(HUDManager __instance) { //IL_019a: Unknown result type (might be due to invalid IL or missing references) //IL_01a6: Unknown result type (might be due to invalid IL or missing references) //IL_0237: Unknown result type (might be due to invalid IL or missing references) //IL_011d: Unknown result type (might be due to invalid IL or missing references) //IL_0129: Unknown result type (might be due to invalid IL or missing references) PlayerControllerB playerScript; for (int i = 0; i < StartOfRound.Instance.allPlayerScripts.Length; i++) { playerScript = StartOfRound.Instance.allPlayerScripts[i]; if (!playerScript.isPlayerDead) { continue; } FieldInfo field = typeof(HUDManager).GetField("spectatingPlayerBoxes", BindingFlags.Instance | BindingFlags.NonPublic); Dictionary<Animator, PlayerControllerB> dictionary = (Dictionary<Animator, PlayerControllerB>)field.GetValue(__instance); FieldInfo field2 = typeof(HUDManager).GetField("yOffsetAmount", BindingFlags.Instance | BindingFlags.NonPublic); float num = (float)field2.GetValue(__instance); FieldInfo field3 = typeof(HUDManager).GetField("boxesAdded", BindingFlags.Instance | BindingFlags.NonPublic); int num2 = (int)field3.GetValue(__instance); if (dictionary.Values.Contains(playerScript)) { GameObject gameObject = ((Component)dictionary.FirstOrDefault((KeyValuePair<Animator, PlayerControllerB> x) => (Object)(object)x.Value == (Object)(object)playerScript).Key).gameObject; if (!gameObject.activeSelf) { RectTransform component = gameObject.GetComponent<RectTransform>(); component.anchoredPosition = new Vector2(component.anchoredPosition.x, num); field3.SetValue(__instance, num2++); gameObject.SetActive(true); field2.SetValue(__instance, num - 70f); } } else { GameObject val = Object.Instantiate<GameObject>(__instance.spectatingPlayerBoxPrefab, __instance.SpectateBoxesContainer, false); val.SetActive(true); RectTransform component2 = val.GetComponent<RectTransform>(); component2.anchoredPosition = new Vector2(component2.anchoredPosition.x, num); field2.SetValue(__instance, num - 70f); field3.SetValue(__instance, num2++); dictionary.Add(val.GetComponent<Animator>(), playerScript); field.SetValue(__instance, dictionary); ((TMP_Text)val.GetComponentInChildren<TextMeshProUGUI>()).text = playerScript.playerUsername; if (!GameNetworkManager.Instance.disableSteam) { HUDManager.FillImageWithSteamProfile(val.GetComponent<RawImage>(), SteamId.op_Implicit(playerScript.playerSteamId), true); } } mls.LogMessage((object)$"boxes count:{dictionary.Count}"); } } [HarmonyPatch("FillEndGameStats")] [HarmonyPrefix] private static void fillEndGameStatsPatchPre(HUDManager __instance, ref EndOfGameStats stats) { } } [HarmonyPatch(typeof(EnemyAI))] internal class EnemyAIPatch { private static ManualLogSource mls; public static void SetLogSource(ManualLogSource logSource) { mls = logSource; } [HarmonyPatch("OnCollideWithPlayer")] [HarmonyPrefix] private static bool onCollideWithPlayerPatch(EnemyAI __instance, ref Collider other) { if (PlayerControllerBPatch.isGhostMode) { PlayerControllerB component = ((Component)other).gameObject.GetComponent<PlayerControllerB>(); if (StartOfRound.Instance.localPlayerController.playerClientId == component.playerClientId) { return false; } } return true; } [HarmonyPatch("PlayerIsTargetable")] [HarmonyPrefix] private static void playerIsTargetablePatch(ref bool cannotBeInShip, ref PlayerControllerB playerScript) { if (PlayerControllerBPatch.isGhostMode && ((NetworkBehaviour)playerScript).IsOwner && !ConfigVariables.enemiesDetectYou) { playerScript.isInHangarShipRoom = true; cannotBeInShip = true; } } [HarmonyPatch("GetAllPlayersInLineOfSight")] [HarmonyPostfix] private static void getAllPlayersInLineOfSightPatch(EnemyAI __instance, ref PlayerControllerB[] __result) { if (!PlayerControllerBPatch.isGhostMode || ConfigVariables.enemiesDetectYou) { return; } PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; ulong playerClientId = StartOfRound.Instance.localPlayerController.playerClientId; if (__result == null || __result.Length == 0) { return; } int num = -1; for (int i = 0; i < __result.Length; i++) { if ((Object)(object)__result[i] == (Object)(object)allPlayerScripts[playerClientId]) { num = i; break; } } if (num == -1) { return; } PlayerControllerB[] array = (PlayerControllerB[])(object)new PlayerControllerB[__result.Length - 1]; int num2 = 0; for (int j = 0; j < __result.Length; j++) { if (j != num) { array[num2] = __result[j]; num2++; } } __result = array; } [HarmonyPatch("KillEnemy")] [HarmonyPrefix] private static bool killEnemyPatch(EnemyAI __instance) { return stopKill(__instance); } [HarmonyPatch("KillEnemyOnOwnerClient")] [HarmonyPrefix] private static bool patchKillEnemyOnOwnerClient(EnemyAI __instance) { return stopKill(__instance); } [HarmonyPatch("CheckLineOfSightForClosestPlayer")] [HarmonyPrefix] private static bool checkLineOfSightForClosestPlayerPatch(EnemyAI __instance) { if (PlayerControllerBPatch.isGhostMode && !ConfigVariables.enemiesDetectYou && getClosestPlayerIncludingGhost(__instance).playerClientId == StartOfRound.Instance.localPlayerController.playerClientId) { mls.LogMessage((object)"enemy can't see if player is in line of sight"); return false; } return true; } public static PlayerControllerB getClosestPlayerIncludingGhost(EnemyAI enemy) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) PlayerControllerB val = null; PlayerControllerB[] array = Object.FindObjectsOfType<PlayerControllerB>(); float num = float.PositiveInfinity; PlayerControllerB[] array2 = array; foreach (PlayerControllerB val2 in array2) { float num2 = Vector3.Distance(((Component)enemy).transform.position, ((Component)val2).transform.position); if (num2 < num) { num = num2; val = val2; } } if (!((Object)(object)val != (Object)null)) { mls.LogError((object)"No EnemyAI found in the scene."); } return val; } public static void makeEnemiesDropFocus(PlayerControllerB player) { mls.LogMessage((object)("enemies dropped focus on " + ((Object)player).name)); EnemyAI[] array = Object.FindObjectsOfType<EnemyAI>(); EnemyAI[] array2 = array; foreach (EnemyAI val in array2) { if (val.targetPlayer.playerClientId == StartOfRound.Instance.localPlayerController.playerClientId) { val.targetPlayer = null; } } } public static bool ghostOnlyPlayerInFacility() { int num = 0; for (int i = 0; i < StartOfRound.Instance.allPlayerScripts.Length; i++) { if (StartOfRound.Instance.allPlayerScripts[i].isPlayerControlled && StartOfRound.Instance.allPlayerScripts[i].isInsideFactory && StartOfRound.Instance.allPlayerScripts[i].playerClientId != StartOfRound.Instance.localPlayerController.playerClientId) { num++; } } if (num == 0) { mls.LogMessage((object)"ghost only one in facility"); return true; } return false; } private static bool stopKill(EnemyAI enemy) { mls.LogMessage((object)"enemy ai tried hit killEnemyPatch"); if (PlayerControllerBPatch.isGhostMode && enemy.GetClosestPlayer(false, false, false).playerClientId == StartOfRound.Instance.localPlayerController.playerClientId) { mls.LogMessage((object)"enemy ai tried to direclty kill player"); return false; } return true; } } [HarmonyPatch(typeof(StartOfRound))] internal class StartOfRoundPatch { private static ManualLogSource mls; public static void SetLogSource(ManualLogSource logSource) { mls = logSource; } [HarmonyPatch("ReviveDeadPlayers")] [HarmonyPrefix] private static void reviveDeadPlayersPatch(StartOfRound __instance) { mls.LogMessage((object)"revive dead players patch hit in start of round class"); PlayerControllerBPatch.resetGhostModeVars(__instance.localPlayerController); } [HarmonyPatch("OnPlayerConnectedClientRpc")] [HarmonyPrefix] private static void onPlayerConnectedClientRpcPatch(StartOfRound __instance, ref ulong clientId) { mls.LogMessage((object)$"player connected patch hit in start of round class, clientId: {clientId}"); if ((Object)(object)__instance.localPlayerController == (Object)null) { PlayerControllerBPatch.resetGhostModeVars(null); } } [HarmonyPatch("ShipLeave")] [HarmonyPrefix] public static void shipLeavePatch(StartOfRound __instance) { mls.LogMessage((object)"rekill player locally called from start of round, because ship is taking off"); if (PlayerControllerBPatch.isGhostMode) { PlayerControllerBPatch.resetGhostModeVars(__instance.localPlayerController); PlayerControllerBPatch.setToSpectatemode(__instance.localPlayerController); } } [HarmonyPatch("StartGame")] [HarmonyPrefix] public static void startGamePatch(StartOfRound __instance) { mls.LogMessage((object)"rekill player locally called from start of round, because level is starting"); if (PlayerControllerBPatch.isGhostMode) { PlayerControllerBPatch.resetGhostModeVars(__instance.localPlayerController); } } [HarmonyPatch("UpdatePlayerVoiceEffects")] [HarmonyPrefix] public static bool updatePlayerVoiceEffectsPatch(StartOfRound __instance) { if (PlayerControllerBPatch.isGhostMode) { for (int i = 0; i < __instance.allPlayerScripts.Length; i++) { PlayerControllerB val = __instance.allPlayerScripts[i]; if ((Object)(object)val == (Object)(object)GameNetworkManager.Instance.localPlayerController) { continue; } if (val.voicePlayerState == null || val.currentVoiceChatIngameSettings._playerState == null || (Object)(object)val.currentVoiceChatAudioSource == (Object)null || (Object)(object)val.currentVoiceChatIngameSettings == (Object)null) { __instance.RefreshPlayerVoicePlaybackObjects(); if (val.voicePlayerState == null || (Object)(object)val.currentVoiceChatAudioSource == (Object)null) { continue; } } AudioSource currentVoiceChatAudioSource = StartOfRound.Instance.allPlayerScripts[i].currentVoiceChatAudioSource; if (__instance.allPlayerScripts[i].isPlayerDead) { val.currentVoiceChatIngameSettings.set2D = true; currentVoiceChatAudioSource.volume = 1f; ((Behaviour)((Component)currentVoiceChatAudioSource).GetComponent<AudioLowPassFilter>()).enabled = false; ((Behaviour)((Component)currentVoiceChatAudioSource).GetComponent<AudioHighPassFilter>()).enabled = false; currentVoiceChatAudioSource.panStereo = 0f; } else { val.currentVoiceChatIngameSettings.set2D = false; currentVoiceChatAudioSource.volume = 0.8f; } } return false; } return true; } } [HarmonyPatch(typeof(PlayerControllerB))] internal class PlayerControllerBPatch { private static ManualLogSource mls; public static bool allowKill = true; public static bool isGhostMode = false; private static float lastTimeJumped = Time.time; private static Vector3 deathLocation; private static int consecutiveDeathExceptions = 0; private static int maxConsecutiveDeathExceptions = 3; private static float exceptionCooldownTime = 2f; private static float lastExceptionTime = 0f; private static Vector3[] lastSafeLocations = (Vector3[])(object)new Vector3[10]; private static int safeLocationsIndex = 0; private static float timeWhenSafe = Time.time; private static Ray interactRay; private static RaycastHit hit; private static int interactableObjectsMask = 832; private static bool isTogglingBrightMode = false; private static Coroutine togglingBrightModeCoroutine; private static bool isBrightModeOn = false; private static LightType OGnightVisionType; private static float OGnightVisionIntensity; private static float OGnightVisionRange; private static float OGnightVisionShadowStrength; private static float OGnightVisionBounceIntensity; private static float OGnightVisionInnerSpotAngle; private static float OGnightVisionSpotAngle; private static bool setupValuesYet = false; private static float maxSpeed = 10f; private static int tpPlayerIndex = 0; private static Coroutine tpCoroutine; private static bool isTeleporting = false; private static bool isTogglingCollisions = false; private static Coroutine togglingCollisionsCoroutine; private static bool collisionsOn = true; public static float lastInteractedTime = Time.time; public static void SetLogSource(ManualLogSource logSource) { mls = logSource; } public static void resetGhostModeVars(PlayerControllerB __instance) { try { mls.LogMessage((object)"hit reset ghost vars function"); allowKill = true; isGhostMode = false; isTogglingBrightMode = false; consecutiveDeathExceptions = 0; lastSafeLocations = (Vector3[])(object)new Vector3[10]; timeWhenSafe = Time.time; tpPlayerIndex = 0; tpCoroutine = null; isTeleporting = false; isTogglingCollisions = false; isTogglingBrightMode = false; isBrightModeOn = false; collisionsOn = true; if ((Object)(object)__instance != (Object)null) { ((MonoBehaviour)__instance).StopAllCoroutines(); if ((Object)(object)__instance.nightVision != (Object)null) { ((Component)__instance.nightVision).gameObject.SetActive(true); } FieldInfo field = typeof(PlayerControllerB).GetField("isJumping", BindingFlags.Instance | BindingFlags.NonPublic); FieldInfo field2 = typeof(PlayerControllerB).GetField("playerSlidingTimer", BindingFlags.Instance | BindingFlags.NonPublic); FieldInfo field3 = typeof(PlayerControllerB).GetField("isFallingFromJump", BindingFlags.Instance | BindingFlags.NonPublic); FieldInfo field4 = typeof(PlayerControllerB).GetField("sprintMultiplier", BindingFlags.Instance | BindingFlags.NonPublic); if (field != null && field2 != null && field3 != null && field4 != null) { field2.SetValue(__instance, 0f); field.SetValue(__instance, false); field3.SetValue(__instance, false); __instance.fallValue = 0f; __instance.fallValueUncapped = 0f; field4.SetValue(__instance, 1f); } else { mls.LogError((object)"private fields not found"); } setNightVisionMode(__instance, 0); __instance.hasBegunSpectating = false; StartOfRound.Instance.SwitchCamera(GameNetworkManager.Instance.localPlayerController.gameplayCamera); HUDManager.Instance.HideHUD(false); ((TMP_Text)HUDManager.Instance.spectatingPlayerText).text = ""; HUDManager.Instance.RemoveSpectateUI(); showAliveUI(__instance, show: true); } } catch (Exception arg) { mls.LogMessage((object)$"error durign resetign ghost values: {arg}"); } } private static void setNightVisionMode(PlayerControllerB __instance, int mode) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) switch (mode) { case 0: mls.LogMessage((object)"setting default night vision values"); __instance.nightVision.type = OGnightVisionType; __instance.nightVision.intensity = OGnightVisionIntensity; __instance.nightVision.range = OGnightVisionRange; __instance.nightVision.shadowStrength = OGnightVisionShadowStrength; __instance.nightVision.bounceIntensity = OGnightVisionBounceIntensity; __instance.nightVision.innerSpotAngle = OGnightVisionInnerSpotAngle; __instance.nightVision.spotAngle = OGnightVisionSpotAngle; break; case 1: __instance.nightVision.type = (LightType)2; __instance.nightVision.intensity = 44444f; __instance.nightVision.range = 99999f; __instance.nightVision.shadowStrength = 0f; __instance.nightVision.bounceIntensity = 5555f; __instance.nightVision.innerSpotAngle = 999f; __instance.nightVision.spotAngle = 9999f; break; } } private static void showAliveUI(PlayerControllerB __instance, bool show) { ((Component)HUDManager.Instance.Clock.canvasGroup).gameObject.SetActive(show); ((Component)HUDManager.Instance.selfRedCanvasGroup).gameObject.SetActive(show); ((Component)__instance.sprintMeterUI).gameObject.SetActive(show); ((Component)HUDManager.Instance.weightCounter).gameObject.SetActive(show); if (!show) { TextMeshProUGUI[] controlTipLines = HUDManager.Instance.controlTipLines; foreach (TextMeshProUGUI val in controlTipLines) { ((TMP_Text)val).text = ""; } } } private static Vector3 getTeleportLocation(PlayerControllerB __instance) { //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_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0044: 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_0048: Unknown result type (might be due to invalid IL or missing references) Vector3 position = default(Vector3); ((Vector3)(ref position))..ctor(0f, 0f, 0f); if ((Object)(object)__instance.deadBody != (Object)null) { position = ((Component)__instance.deadBody).transform.position; return position; } position = deathLocation; return position; } private static void ChangeAudioListenerToObject(PlayerControllerB __instance, GameObject addToObject) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) ((Component)__instance.activeAudioListener).transform.SetParent(addToObject.transform); ((Component)__instance.activeAudioListener).transform.localEulerAngles = Vector3.zero; ((Component)__instance.activeAudioListener).transform.localPosition = Vector3.zero; StartOfRound.Instance.audioListener = __instance.activeAudioListener; } [HarmonyPatch("KillPlayer")] [HarmonyPrefix] private static bool patchKillPlayer(PlayerControllerB __instance) { //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Unknown result type (might be due to invalid IL or missing references) float time = Time.time; if (__instance.playerClientId == GameNetworkManager.Instance.localPlayerController.playerClientId) { if (!allowKill) { if (time - lastExceptionTime > exceptionCooldownTime) { consecutiveDeathExceptions = 0; } consecutiveDeathExceptions++; lastExceptionTime = time; if (consecutiveDeathExceptions >= maxConsecutiveDeathExceptions) { mls.LogMessage((object)"Too many consecutive death exceptions. Stuck in death loop."); Vector3 position = lastSafeLocations[(safeLocationsIndex - 9 + lastSafeLocations.Length) % lastSafeLocations.Length]; ((Component)__instance).transform.position = position; } mls.LogMessage((object)"Didn't allow kill, player should be dead on server already"); return false; } allowKill = false; deathLocation = ((Component)__instance).transform.position; consecutiveDeathExceptions = 0; mls.LogMessage((object)"called kill player"); savePostGameNotes(); } mls.LogMessage((object)"kill patch was called as, __instance.playerClientId == GameNetworkManager.Instance.localPlayerController.playerClientId"); return true; } private static void savePostGameNotes() { } [HarmonyPatch("Update")] [HarmonyPostfix] private static void updatePatch(PlayerControllerB __instance, ref Light ___nightVision) { //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_01d6: Unknown result type (might be due to invalid IL or missing references) if (!setupValuesYet && allowKill) { mls.LogMessage((object)"setting default night vision values"); setupValuesYet = true; OGnightVisionType = __instance.nightVision.type; OGnightVisionIntensity = __instance.nightVision.intensity; OGnightVisionRange = __instance.nightVision.range; OGnightVisionShadowStrength = __instance.nightVision.shadowStrength; OGnightVisionBounceIntensity = __instance.nightVision.bounceIntensity; OGnightVisionInnerSpotAngle = __instance.nightVision.innerSpotAngle; OGnightVisionSpotAngle = __instance.nightVision.spotAngle; } if (Time.time - timeWhenSafe >= 1f) { lastSafeLocations[safeLocationsIndex] = ((Component)__instance).transform.position; safeLocationsIndex = (safeLocationsIndex + 1) % lastSafeLocations.Length; timeWhenSafe = Time.time; } if (allowKill) { return; } __instance.sprintMeter = 1f; if (__instance.isSprinting) { FieldInfo field = typeof(PlayerControllerB).GetField("sprintMultiplier", BindingFlags.Instance | BindingFlags.NonPublic); if (field != null) { object value = field.GetValue(__instance); if (value is float) { if ((float)value < maxSpeed) { float num = (float)value * 1.015f; field.SetValue(__instance, num); } } else { mls.LogError((object)"current spritnMultiplier isn't a float?"); } } else { mls.LogError((object)"private field not found"); } } if (!isGhostMode) { try { if (((ButtonControl)Keyboard.current[ConfigVariables.startGhostModeButton]).wasPressedThisFrame) { mls.LogMessage((object)"attempting to revive"); reviveDeadPlayer(__instance); } } catch { } } else { listenForGhostHotkeys(__instance); } if (__instance.playersManager.livingPlayers == 0 || StartOfRound.Instance.shipIsLeaving) { HUDManager.Instance.DisplayTip("Ship is leaving", "just wait", false, false, "LC_Tip1"); if (isGhostMode) { setToSpectatemode(__instance); } resetGhostModeVars(__instance); } if (__instance.criticallyInjured) { __instance.criticallyInjured = false; __instance.bleedingHeavily = false; HUDManager.Instance.UpdateHealthUI(100, false); } } private static void listenForGhostHotkeys(PlayerControllerB __instance) { //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_024d: Unknown result type (might be due to invalid IL or missing references) //IL_028a: Unknown result type (might be due to invalid IL or missing references) //IL_040a: Unknown result type (might be due to invalid IL or missing references) //IL_0582: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Unknown result type (might be due to invalid IL or missing references) //IL_018b: 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_03c7: Unknown result type (might be due to invalid IL or missing references) //IL_0542: Unknown result type (might be due to invalid IL or missing references) if (StartOfRound.Instance.localPlayerController.inTerminalMenu || StartOfRound.Instance.localPlayerController.isTypingChat) { return; } if (!collisionsOn) { handleNoClipControls(__instance); } try { if (((ButtonControl)Keyboard.current[ConfigVariables.toggleNoClipButton]).wasPressedThisFrame && !isTogglingCollisions) { isTogglingCollisions = true; togglingCollisionsCoroutine = ((MonoBehaviour)__instance).StartCoroutine(toggleCollisions(__instance)); } } catch { } try { if (((ButtonControl)Keyboard.current[ConfigVariables.teleportBodyButton]).wasPressedThisFrame) { mls.LogMessage((object)"attempt to tp to dead body"); string message = "(Teleported to: your dead body)"; tpCoroutine = ((MonoBehaviour)__instance).StartCoroutine(specialTeleportPlayer(__instance, ((Component)__instance.deadBody).transform.position, message)); } } catch { } try { if (((ButtonControl)Keyboard.current[ConfigVariables.teleportFrontDoorButton]).wasPressedThisFrame) { mls.LogMessage((object)"attempt to tp to front door"); string message2 = "(Teleported to: Front Door)"; tpCoroutine = ((MonoBehaviour)__instance).StartCoroutine(specialTeleportPlayer(__instance, RoundManager.FindMainEntrancePosition(true, true), message2)); } } catch { } try { if (((ButtonControl)Keyboard.current[ConfigVariables.teleportShipButton]).wasPressedThisFrame) { mls.LogMessage((object)"attempt to tp to ship"); string message3 = "(Teleported to: Ship)"; tpCoroutine = ((MonoBehaviour)__instance).StartCoroutine(specialTeleportPlayer(__instance, RoundManager.Instance.playersManager.playerSpawnPositions[0].position, message3)); } } catch { } try { InputAction val = IngamePlayerSettings.Instance.playerInput.actions.FindAction("Jump", false); if (val == null || !collisionsOn) { return; } if (val.IsPressed()) { __instance.fallValue = __instance.jumpForce; __instance.fallValueUncapped = __instance.jumpForce; } else if (val.WasReleasedThisFrame()) { ReflectionUtils.SetPropertyValue(__instance, "isJumping", false); ReflectionUtils.SetPropertyValue(__instance, "isFallingFromJump", true); } } catch { } try { if (((ButtonControl)Keyboard.current[ConfigVariables.switchToSpectateButton]).wasPressedThisFrame) { mls.LogMessage((object)"attempt to switch back to spectate mode"); setToSpectatemode(__instance); } } catch { } try { if (((ButtonControl)Keyboard.current[ConfigVariables.teleportToPlayerBackwardButton]).wasPressedThisFrame) { if (isTeleporting) { return; } isTeleporting = true; PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; for (int i = 0; i < allPlayerScripts.Length; i++) { tpPlayerIndex = (tpPlayerIndex - 1 + allPlayerScripts.Length) % allPlayerScripts.Length; mls.LogMessage((object)$"tp index:{tpPlayerIndex}"); if (!__instance.playersManager.allPlayerScripts[tpPlayerIndex].isPlayerDead && __instance.playersManager.allPlayerScripts[tpPlayerIndex].isPlayerControlled && __instance.playersManager.allPlayerScripts[tpPlayerIndex].playerClientId != StartOfRound.Instance.localPlayerController.playerClientId) { string text = "(Teleported to:" + __instance.playersManager.allPlayerScripts[tpPlayerIndex].playerUsername + ")"; mls.LogMessage((object)$"tp index:{tpPlayerIndex} playerName:{text}"); tpCoroutine = ((MonoBehaviour)__instance).StartCoroutine(specialTeleportPlayer(__instance, ((Component)__instance.playersManager.allPlayerScripts[tpPlayerIndex]).transform.position, text)); return; } } } } catch { } try { if (((ButtonControl)Keyboard.current[ConfigVariables.teleportToPlayerForwardButton]).wasPressedThisFrame) { if (isTeleporting) { return; } isTeleporting = true; PlayerControllerB[] allPlayerScripts2 = StartOfRound.Instance.allPlayerScripts; for (int j = 0; j < allPlayerScripts2.Length; j++) { tpPlayerIndex = (tpPlayerIndex + 1) % allPlayerScripts2.Length; mls.LogMessage((object)$"tp index:{tpPlayerIndex}"); if (!__instance.playersManager.allPlayerScripts[tpPlayerIndex].isPlayerDead && __instance.playersManager.allPlayerScripts[tpPlayerIndex].isPlayerControlled && __instance.playersManager.allPlayerScripts[tpPlayerIndex].playerClientId != StartOfRound.Instance.localPlayerController.playerClientId) { string text2 = "(Teleported to:" + __instance.playersManager.allPlayerScripts[tpPlayerIndex].playerUsername + ")"; mls.LogMessage((object)$"tp index:{tpPlayerIndex} playerName:{text2}"); tpCoroutine = ((MonoBehaviour)__instance).StartCoroutine(specialTeleportPlayer(__instance, ((Component)__instance.playersManager.allPlayerScripts[tpPlayerIndex]).transform.position, text2)); return; } } } } catch { } try { if (((ButtonControl)Keyboard.current[ConfigVariables.toggleBrightModeButton]).wasPressedThisFrame && !isTogglingBrightMode) { isTogglingBrightMode = true; togglingBrightModeCoroutine = ((MonoBehaviour)__instance).StartCoroutine(toggleBrightMode(__instance)); } } catch { } } [HarmonyPatch("Interact_performed")] [HarmonyPrefix] private static bool interact_performedPatch(PlayerControllerB __instance) { if (!isGhostMode) { return true; } if (((NetworkBehaviour)__instance).IsOwner && !__instance.isPlayerDead && (!((NetworkBehaviour)__instance).IsServer || __instance.isHostPlayerObject)) { if (!canUse(__instance)) { return false; } if (shouldHaveDelay(__instance)) { if (!(Time.time - lastInteractedTime > ConfigVariables.waitTimeBetweenInteractions)) { return false; } lastInteractedTime = Time.time; } } return true; } private static bool shouldHaveDelay(PlayerControllerB __instance, bool showDebug = true) { if (!isGhostMode || ConfigVariables.OPness == OPnessModes.Unrestricted) { return false; } if ((Object)(object)__instance.hoveringOverTrigger != (Object)null && (Object)(object)((Component)__instance.hoveringOverTrigger).gameObject != (Object)null) { string text = GeneralUtils.simplifyObjectNames(((Object)((Component)__instance.hoveringOverTrigger).gameObject).name); if (showDebug) { mls.LogMessage((object)("tried to interact with: " + text)); } string[] source = new string[6] { "Cube", "EntranceTeleportA", "StartGameLever", "TerminalScript", "ButtonGlass", "Trigger" }; if (source.Contains(text)) { return false; } } else if (showDebug) { mls.LogMessage((object)"faliled to find interacted with name"); } return true; } private static bool canUse(PlayerControllerB __instance) { //IL_00d3: 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_00ed: Unknown result type (might be due to invalid IL or missing references) if (!isGhostMode || ConfigVariables.OPness == OPnessModes.Unrestricted) { return true; } if (ConfigVariables.OPness == OPnessModes.Limited) { return false; } List<string> list = new List<string> { "LadderTrigger", "RagdollGrabbableObject" }; if (!ConfigVariables.canPressTeleportButtons) { list.Add("RedButton"); } if ((Object)(object)__instance.hoveringOverTrigger != (Object)null && (Object)(object)((Component)__instance.hoveringOverTrigger).gameObject != (Object)null) { string item = GeneralUtils.simplifyObjectNames(((Object)((Component)__instance.hoveringOverTrigger).gameObject).name); if (list.Contains(item)) { return false; } } Ray val = default(Ray); ((Ray)(ref val))..ctor(((Component)__instance.gameplayCamera).transform.position, ((Component)__instance.gameplayCamera).transform.forward); RaycastHit val2 = default(RaycastHit); Physics.Raycast(val, ref val2, __instance.grabDistance, interactableObjectsMask); Collider collider = ((RaycastHit)(ref val2)).collider; GrabbableObject val3 = ((collider != null) ? ((Component)collider).GetComponent<GrabbableObject>() : null); if ((Object)(object)val3 != (Object)null) { string item2 = GeneralUtils.simplifyObjectNames(((Object)val3).name); if (list.Contains(item2) || !ConfigVariables.canPickupScrap) { return false; } } return true; } [HarmonyPatch("SetHoverTipAndCurrentInteractTrigger")] [HarmonyPostfix] private static void setHoverTipAndCurrentInteractTriggerPatch(PlayerControllerB __instance) { if (!isGhostMode) { return; } if (shouldHaveDelay(__instance, showDebug: false)) { float num = lastInteractedTime; float waitTimeBetweenInteractions = ConfigVariables.waitTimeBetweenInteractions; float num2 = waitTimeBetweenInteractions - (Time.time - num); if (Time.time - num <= waitTimeBetweenInteractions && ((TMP_Text)__instance.cursorTip).text != "") { ((TMP_Text)__instance.cursorTip).text = $"Wait: {(int)num2}"; } } if (!canUse(__instance) && ((TMP_Text)__instance.cursorTip).text != "") { ((TMP_Text)__instance.cursorTip).text = "Can't use as a ghost!"; } } private static bool IsPlayerNearGround(PlayerControllerB __instance) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_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) interactRay = new Ray(((Component)__instance).transform.position, Vector3.down); return Physics.Raycast(interactRay, 0.15f, StartOfRound.Instance.allPlayersCollideWithMask, (QueryTriggerInteraction)1); } private static void PlayerHitGroundEffects(PlayerControllerB __instance) { //IL_01bd: 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_011a: Unknown result type (might be due to invalid IL or missing references) //IL_0143: Unknown result type (might be due to invalid IL or missing references) //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_018e: Unknown result type (might be due to invalid IL or missing references) //IL_0194: Unknown result type (might be due to invalid IL or missing references) //IL_0172: Unknown result type (might be due to invalid IL or missing references) //IL_0178: Unknown result type (might be due to invalid IL or missing references) __instance.GetCurrentMaterialStandingOn(); if (__instance.fallValue < -9f) { if (__instance.fallValue < -16f) { __instance.movementAudio.PlayOneShot(StartOfRound.Instance.playerHitGroundHard, 1f); WalkieTalkie.TransmitOneShotAudio(__instance.movementAudio, StartOfRound.Instance.playerHitGroundHard, 1f); } else if (__instance.fallValue < -2f) { __instance.movementAudio.PlayOneShot(StartOfRound.Instance.playerHitGroundSoft, 1f); } __instance.LandFromJumpServerRpc(__instance.fallValue < -16f); } if (__instance.takingFallDamage && !__instance.jetpackControls && !__instance.disablingJetpackControls && !__instance.isSpeedCheating && allowKill) { Debug.Log((object)$"Fall damage: {__instance.fallValueUncapped}"); if (__instance.fallValueUncapped < -48.5f) { __instance.DamagePlayer(100, true, true, (CauseOfDeath)2, 0, false, default(Vector3)); } else if (__instance.fallValueUncapped < -45f) { __instance.DamagePlayer(80, true, true, (CauseOfDeath)2, 0, false, default(Vector3)); } else if (__instance.fallValueUncapped < -40f) { __instance.DamagePlayer(50, true, true, (CauseOfDeath)2, 0, false, default(Vector3)); } else { __instance.DamagePlayer(30, true, true, (CauseOfDeath)2, 0, false, default(Vector3)); } } if (__instance.fallValue < -16f) { RoundManager.Instance.PlayAudibleNoise(((Component)__instance).transform.position, 7f, 0.5f, 0, false, 0); } } [HarmonyPatch("DamagePlayer")] [HarmonyPrefix] private static void damagePlayerPatch(PlayerControllerB __instance, ref int damageNumber) { if (!allowKill) { __instance.health = 100; __instance.criticallyInjured = false; __instance.bleedingHeavily = false; int num = 100 - damageNumber; __instance.DamagePlayerServerRpc(-num, __instance.health); } } [HarmonyPatch("DamagePlayer")] [HarmonyPostfix] private static void damagePlayerPostPatch(PlayerControllerB __instance, ref int damageNumber) { if (!allowKill) { HUDManager.Instance.UpdateHealthUI(100, false); } } private static void handleNoClipControls(PlayerControllerB __instance) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_0173: Unknown result type (might be due to invalid IL or missing references) //IL_01df: Unknown result type (might be due to invalid IL or missing references) //IL_022f: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Unknown result type (might be due to invalid IL or missing references) //IL_0121: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Unknown result type (might be due to invalid IL or missing references) //IL_0127: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_0131: Unknown result type (might be due to invalid IL or missing references) //IL_0136: Unknown result type (might be due to invalid IL or missing references) //IL_0147: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Unknown result type (might be due to invalid IL or missing references) //IL_0153: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Unknown result type (might be due to invalid IL or missing references) //IL_018f: Unknown result type (might be due to invalid IL or missing references) //IL_0194: Unknown result type (might be due to invalid IL or missing references) //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_0198: Unknown result type (might be due to invalid IL or missing references) //IL_019d: Unknown result type (might be due to invalid IL or missing references) //IL_01a2: Unknown result type (might be due to invalid IL or missing references) //IL_01b3: Unknown result type (might be due to invalid IL or missing references) //IL_01b8: Unknown result type (might be due to invalid IL or missing references) //IL_01bf: Unknown result type (might be due to invalid IL or missing references) //IL_01c4: Unknown result type (might be due to invalid IL or missing references) //IL_01f5: Unknown result type (might be due to invalid IL or missing references) //IL_01fa: Unknown result type (might be due to invalid IL or missing references) //IL_0203: Unknown result type (might be due to invalid IL or missing references) //IL_0208: Unknown result type (might be due to invalid IL or missing references) //IL_020f: Unknown result type (might be due to invalid IL or missing references) //IL_0214: Unknown result type (might be due to invalid IL or missing references) //IL_0245: Unknown result type (might be due to invalid IL or missing references) //IL_024a: Unknown result type (might be due to invalid IL or missing references) //IL_024f: Unknown result type (might be due to invalid IL or missing references) //IL_0258: Unknown result type (might be due to invalid IL or missing references) //IL_025d: Unknown result type (might be due to invalid IL or missing references) //IL_0264: Unknown result type (might be due to invalid IL or missing references) //IL_0269: Unknown result type (might be due to invalid IL or missing references) try { if (((ButtonControl)Keyboard.current[ConfigVariables.noClipForwardButton]).isPressed) { Quaternion rotation = ((Component)__instance).transform.rotation; Vector3 val = rotation * Vector3.forward; ((Vector3)(ref val)).Normalize(); Transform transform = ((Component)__instance).transform; transform.position += val * ConfigVariables.noClipSpeed; } } catch { } try { if (((ButtonControl)Keyboard.current[ConfigVariables.noClipLeftButton]).isPressed) { Quaternion rotation2 = ((Component)__instance).transform.rotation; Quaternion val2 = Quaternion.AngleAxis(-90f, Vector3.up); Vector3 val3 = val2 * rotation2 * Vector3.forward; ((Vector3)(ref val3)).Normalize(); Transform transform2 = ((Component)__instance).transform; transform2.position += val3 * ConfigVariables.noClipSpeed; } } catch { } try { if (((ButtonControl)Keyboard.current[ConfigVariables.noClipRightButton]).isPressed) { Quaternion rotation3 = ((Component)__instance).transform.rotation; Quaternion val4 = Quaternion.AngleAxis(90f, Vector3.up); Vector3 val5 = val4 * rotation3 * Vector3.forward; ((Vector3)(ref val5)).Normalize(); Transform transform3 = ((Component)__instance).transform; transform3.position += val5 * ConfigVariables.noClipSpeed; } } catch { } try { if (((ButtonControl)Keyboard.current[ConfigVariables.noClipBackwardButton]).isPressed) { Quaternion rotation4 = ((Component)__instance).transform.rotation; Vector3 val6 = rotation4 * Vector3.back; ((Vector3)(ref val6)).Normalize(); Transform transform4 = ((Component)__instance).transform; transform4.position += val6 * ConfigVariables.noClipSpeed; } } catch { } try { if (((ButtonControl)Keyboard.current[ConfigVariables.noClipUpButton]).isPressed) { Vector3 up = Vector3.up; Transform transform5 = ((Component)__instance).transform; transform5.position += up * ConfigVariables.noClipSpeed; } } catch { } try { if (((ButtonControl)Keyboard.current[ConfigVariables.noClipDownButton]).isPressed) { Vector3 val7 = -Vector3.up; Transform transform6 = ((Component)__instance).transform; transform6.position += val7 * ConfigVariables.noClipSpeed; } } catch { } } private static void reviveDeadPlayer(PlayerControllerB __instance) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Unknown result type (might be due to invalid IL or missing references) try { PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; ulong playerClientId = StartOfRound.Instance.localPlayerController.playerClientId; Vector3 teleportLocation = getTeleportLocation(allPlayerScripts[playerClientId]); mls.LogMessage((object)$"Reviving player {playerClientId}"); allPlayerScripts[playerClientId].velocityLastFrame = new Vector3(0f, 0f, 0f); allPlayerScripts[playerClientId].isSprinting = false; allPlayerScripts[playerClientId].ResetPlayerBloodObjects(allPlayerScripts[playerClientId].isPlayerDead); allPlayerScripts[playerClientId].isClimbingLadder = false; allPlayerScripts[playerClientId].ResetZAndXRotation(); ((Collider)allPlayerScripts[playerClientId].thisController).enabled = true; allPlayerScripts[playerClientId].health = 100; allPlayerScripts[playerClientId].disableLookInput = false; if (allPlayerScripts[playerClientId].isPlayerDead) { allPlayerScripts[playerClientId].isPlayerDead = false; allPlayerScripts[playerClientId].isPlayerControlled = true; allPlayerScripts[playerClientId].isInElevator = true; allPlayerScripts[playerClientId].isInHangarShipRoom = true; allPlayerScripts[playerClientId].isInsideFactory = false; StartOfRound.Instance.SetPlayerObjectExtrapolate(false); ((Component)allPlayerScripts[playerClientId]).transform.position = teleportLocation; allPlayerScripts[playerClientId].setPositionOfDeadPlayer = false; allPlayerScripts[playerClientId].DisablePlayerModel(StartOfRound.Instance.allPlayerObjects[playerClientId], true, true); ((Behaviour)allPlayerScripts[playerClientId].helmetLight).enabled = false; allPlayerScripts[playerClientId].Crouch(false); allPlayerScripts[playerClientId].criticallyInjured = false; if ((Object)(object)allPlayerScripts[playerClientId].playerBodyAnimator != (Object)null) { allPlayerScripts[playerClientId].playerBodyAnimator.SetBool("Limp", false); } allPlayerScripts[playerClientId].bleedingHeavily = false; allPlayerScripts[playerClientId].activatingItem = false; allPlayerScripts[playerClientId].twoHanded = false; allPlayerScripts[playerClientId].inSpecialInteractAnimation = false; allPlayerScripts[playerClientId].disableSyncInAnimation = false; allPlayerScripts[playerClientId].inAnimationWithEnemy = null; allPlayerScripts[playerClientId].holdingWalkieTalkie = false; allPlayerScripts[playerClientId].speakingToWalkieTalkie = false; allPlayerScripts[playerClientId].isSinking = false; allPlayerScripts[playerClientId].isUnderwater = false; allPlayerScripts[playerClientId].sinkingValue = 0f; allPlayerScripts[playerClientId].statusEffectAudio.Stop(); allPlayerScripts[playerClientId].DisableJetpackControlsLocally(); allPlayerScripts[playerClientId].health = 100; if (((NetworkBehaviour)allPlayerScripts[playerClientId]).IsOwner) { HUDManager.Instance.gasHelmetAnimator.SetBool("gasEmitting", false); allPlayerScripts[playerClientId].hasBegunSpectating = false; HUDManager.Instance.RemoveSpectateUI(); HUDManager.Instance.gameOverAnimator.SetTrigger("revive"); allPlayerScripts[playerClientId].hinderedMultiplier = 1f; allPlayerScripts[playerClientId].isMovementHindered = 0; allPlayerScripts[playerClientId].sourcesCausingSinking = 0; allPlayerScripts[playerClientId].reverbPreset = StartOfRound.Instance.shipReverb; } } SoundManager.Instance.earsRingingTimer = 0f; allPlayerScripts[playerClientId].voiceMuffledByEnemy = false; SoundManager.Instance.playerVoicePitchTargets[playerClientId] = 1f; SoundManager.Instance.SetPlayerPitch(1f, (int)playerClientId); PlayerControllerB localPlayerController = GameNetworkManager.Instance.localPlayerController; localPlayerController.bleedingHeavily = false; localPlayerController.criticallyInjured = false; localPlayerController.playerBodyAnimator.SetBool("Limp", false); localPlayerController.health = 100; HUDManager.Instance.UpdateHealthUI(100, false); localPlayerController.spectatedPlayerScript = null; ((Behaviour)HUDManager.Instance.audioListenerLowPass).enabled = false; StartOfRound.Instance.SetSpectateCameraToGameOverMode(false, localPlayerController); isGhostMode = true; ((TMP_Text)HUDManager.Instance.spectatingPlayerText).text = ""; ((TMP_Text)HUDManager.Instance.holdButtonToEndGameEarlyText).text = ""; ((Component)HUDManager.Instance.holdButtonToEndGameEarlyMeter).gameObject.SetActive(false); ((TMP_Text)HUDManager.Instance.holdButtonToEndGameEarlyVotesText).text = ""; showAliveUI(localPlayerController, show: false); FieldInfo field = typeof(PlayerControllerB).GetField("sprintMultiplier", BindingFlags.Instance | BindingFlags.NonPublic); if (field != null) { field.SetValue(localPlayerController, 1f); } HUDManagerPatch.updateBoxesSpectateUI(HUDManager.Instance); if (!ConfigVariables.enemiesDetectYou) { EnemyAIPatch.makeEnemiesDropFocus(__instance); } } catch (Exception ex) { mls.LogError((object)ex); } } public static void rekillPlayerLocally(PlayerControllerB __instance) { //IL_004b: Unknown result type (might be due to invalid IL or missing references) mls.LogMessage((object)"try to rekill player locally"); __instance.DropAllHeldItemsServerRpc(); __instance.DisableJetpackControlsLocally(); __instance.isPlayerDead = true; __instance.isPlayerControlled = false; ((Renderer)__instance.thisPlayerModelArms).enabled = false; __instance.localVisor.position = __instance.playersManager.notSpawnedPosition.position; __instance.DisablePlayerModel(((Component)__instance).gameObject, false, false); __instance.isInsideFactory = false; __instance.IsInspectingItem = false; __instance.inTerminalMenu = false; __instance.twoHanded = false; __instance.carryWeight = 1f; __instance.fallValue = 0f; __instance.fallValueUncapped = 0f; __instance.takingFallDamage = false; __instance.isSinking = false; __instance.isUnderwater = false; StartOfRound.Instance.drowningTimer = 1f; HUDManager.Instance.setUnderwaterFilter = false; __instance.sourcesCausingSinking = 0; __instance.sinkingValue = 0f; __instance.hinderedMultiplier = 1f; __instance.isMovementHindered = 0; __instance.inAnimationWithEnemy = null; HUDManager.Instance.SetNearDepthOfFieldEnabled(true); HUDManager.Instance.HUDAnimator.SetBool("biohazardDamage", false); StartOfRound.Instance.SwitchCamera(StartOfRound.Instance.spectateCamera); } public static void setToSpectatemode(PlayerControllerB __instance) { __instance = StartOfRound.Instance.localPlayerController; showAliveUI(__instance, show: false); rekillPlayerLocally(__instance); __instance.hasBegunSpectating = true; HUDManager.Instance.gameOverAnimator.SetTrigger("gameOver"); isGhostMode = false; ChangeAudioListenerToObject(__instance, ((Component)__instance.playersManager.spectateCamera).gameObject); if (isBrightModeOn) { togglingBrightModeCoroutine = ((MonoBehaviour)__instance).StartCoroutine(toggleBrightMode(__instance)); } } private static IEnumerator specialTeleportPlayer(PlayerControllerB __instance, Vector3 newPos, string message) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) if (tpCoroutine != null) { ((MonoBehaviour)__instance).StopCoroutine(tpCoroutine); } ((TMP_Text)HUDManager.Instance.spectatingPlayerText).text = message; GameNetworkManager.Instance.localPlayerController.TeleportPlayer(newPos, false, 0f, false, true); yield return (object)new WaitForSeconds(1.5f); ((TMP_Text)HUDManager.Instance.spectatingPlayerText).text = ""; isTeleporting = false; } private static IEnumerator toggleCollisions(PlayerControllerB __instance) { if (togglingCollisionsCoroutine != null) { ((MonoBehaviour)__instance).StopCoroutine(togglingCollisionsCoroutine); } __instance = StartOfRound.Instance.localPlayerController; yield return (object)new WaitForSeconds(0.1f); if (collisionsOn) { mls.LogMessage((object)"collisions are off"); HUDManager.Instance.DisplayTip("NoClip", "On", false, false, "LC_Tip1"); collisionsOn = false; __instance.playerCollider.enabled = false; } else { mls.LogMessage((object)"collisions are on"); HUDManager.Instance.DisplayTip("NoClip", "Off", false, false, "LC_Tip1"); collisionsOn = true; __instance.playerCollider.enabled = true; } isTogglingCollisions = false; } private static IEnumerator toggleBrightMode(PlayerControllerB __instance) { if (togglingBrightModeCoroutine != null) { ((MonoBehaviour)__instance).StopCoroutine(togglingBrightModeCoroutine); } __instance = StartOfRound.Instance.localPlayerController; yield return (object)new WaitForSeconds(0.1f); if (isBrightModeOn) { mls.LogMessage((object)"turn off bright mode"); isBrightModeOn = false; setNightVisionMode(__instance, 0); __instance.isInsideFactory = false; ((Component)__instance.nightVision).gameObject.SetActive(false); } else { mls.LogMessage((object)"turn on bright mode"); isBrightModeOn = true; setNightVisionMode(__instance, 1); __instance.isInsideFactory = true; ((Component)__instance.nightVision).gameObject.SetActive(true); } isTogglingBrightMode = false; } } } namespace OPJosMod.GhostMode.Enemy.Patches { [HarmonyPatch(typeof(CrawlerAI))] internal class CrawlerAIPatch { private static ManualLogSource mls; public static void SetLogSource(ManualLogSource logSource) { mls = logSource; } [HarmonyPatch("Update")] [HarmonyPrefix] private static void updatePatch(CrawlerAI __instance) { if (PlayerControllerBPatch.isGhostMode && !ConfigVariables.enemiesDetectYou && EnemyAIPatch.getClosestPlayerIncludingGhost((EnemyAI)(object)__instance).playerClientId == StartOfRound.Instance.localPlayerController.playerClientId) { ((EnemyAI)__instance).currentBehaviourStateIndex = 0; } } } [HarmonyPatch(typeof(FlowermanAI))] internal class FlowermanAIPatch { private static ManualLogSource mls; public static void SetLogSource(ManualLogSource logSource) { mls = logSource; } [HarmonyPatch("AvoidClosestPlayer")] [HarmonyPrefix] private static bool avoidClosestPlayerPatch(FlowermanAI __instance) { if (PlayerControllerBPatch.isGhostMode && !ConfigVariables.enemiesDetectYou && EnemyAIPatch.getClosestPlayerIncludingGhost((EnemyAI)(object)__instance).playerClientId == StartOfRound.Instance.localPlayerController.playerClientId) { return false; } return true; } [HarmonyPatch("AddToAngerMeter")] [HarmonyPrefix] private static bool addToAngerMeterPatch(FlowermanAI __instance) { if (PlayerControllerBPatch.isGhostMode && !ConfigVariables.enemiesDetectYou) { bool result = false; PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; foreach (PlayerControllerB val in allPlayerScripts) { if (val.isInsideFactory && val.playerClientId != StartOfRound.Instance.localPlayerController.playerClientId) { result = true; break; } } return result; } return true; } [HarmonyPatch("OnCollideWithPlayer")] [HarmonyPrefix] private static bool onCollideWithPlayerPatch(ref Collider other) { if (PlayerControllerBPatch.isGhostMode) { PlayerControllerB component = ((Component)other).gameObject.GetComponent<PlayerControllerB>(); if (StartOfRound.Instance.localPlayerController.playerClientId == component.playerClientId) { return false; } } return true; } } [HarmonyPatch(typeof(ButlerEnemyAI))] internal class ButlerEnemyAIPatch { private static ManualLogSource mls; private static bool dontCallForgetPlayers; public static void SetLogSource(ManualLogSource logSource) { mls = logSource; } [HarmonyPatch("OnCollideWithPlayer")] [HarmonyPrefix] private static bool onCollideWithPlayerPatch(ref Collider other) { if (PlayerControllerBPatch.isGhostMode) { PlayerControllerB component = ((Component)other).gameObject.GetComponent<PlayerControllerB>(); if (StartOfRound.Instance.localPlayerController.playerClientId == component.playerClientId) { return false; } } return true; } [HarmonyPatch("CheckLOS")] [HarmonyPrefix] private static bool patchCheckLOS(ButlerEnemyAI __instance) { //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_0133: 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) if (PlayerControllerBPatch.isGhostMode && !ConfigVariables.enemiesDetectYou) { bool[] fieldValue = ReflectionUtils.GetFieldValue<bool[]>(__instance, "seenPlayers"); Vector3[] fieldValue2 = ReflectionUtils.GetFieldValue<Vector3[]>(__instance, "lastSeenPlayerPositions"); float[] fieldValue3 = ReflectionUtils.GetFieldValue<float[]>(__instance, "timeOfLastSeenPlayers"); PlayerControllerB fieldValue4 = ReflectionUtils.GetFieldValue<PlayerControllerB>(__instance, "watchingPlayer"); int num = 0; float num2 = 10000f; int num3 = -1; for (int i = 0; i < StartOfRound.Instance.allPlayerScripts.Length; i++) { if (StartOfRound.Instance.allPlayerScripts[i].isPlayerDead || !StartOfRound.Instance.allPlayerScripts[i].isPlayerControlled) { fieldValue[i] = false; continue; } if (((EnemyAI)__instance).CheckLineOfSightForPosition(((Component)StartOfRound.Instance.allPlayerScripts[i].gameplayCamera).transform.position, 110f, 60, 2f, (Transform)null)) { num++; fieldValue2[i] = ((Component)StartOfRound.Instance.allPlayerScripts[i].gameplayCamera).transform.position; fieldValue[i] = true; fieldValue3[i] = Time.realtimeSinceStartup; } else if (fieldValue[i]) { num++; } if (fieldValue[i]) { float num4 = Vector3.Distance(((EnemyAI)__instance).eye.position, ((Component)StartOfRound.Instance.allPlayerScripts[i].gameplayCamera).transform.position); if (num4 < num2) { num2 = num4; num3 = i; } } } if (((EnemyAI)__instance).currentBehaviourStateIndex == 2) { return true; } if (num3 != -1) { fieldValue4 = StartOfRound.Instance.allPlayerScripts[num3]; if (((EnemyAI)__instance).currentBehaviourStateIndex != 2 && (Object)(object)fieldValue4 != (Object)null && fieldValue4.playerClientId == StartOfRound.Instance.localPlayerController.playerClientId) { dontCallForgetPlayers = true; return false; } } } return true; } [HarmonyPatch("ForgetSeenPlayers")] [HarmonyPrefix] private static bool patchForgetSeenPlayers(ButlerEnemyAI __instance) { if (dontCallForgetPlayers) { return false; } return true; } [HarmonyPatch("Update")] [HarmonyPostfix] private static void patchUpdate(ButlerEnemyAI __instance) { dontCallForgetPlayers = false; } } [HarmonyPatch(typeof(SpikeRoofTrap))] internal class SpikeRoofTrapPatch { private static ManualLogSource mls; public static void SetLogSource(ManualLogSource logSource) { mls = logSource; } [HarmonyPatch("OnTriggerStay")] [HarmonyPrefix] private static bool patchOnTriggerStay(SpikeRoofTrap __instance, ref Collider other) { if (PlayerControllerBPatch.isGhostMode) { if (!__instance.trapActive || !__instance.slammingDown || Time.realtimeSinceStartup - __instance.timeSinceMovingUp < 0.75f) { return true; } PlayerControllerB component = ((Component)other).gameObject.GetComponent<PlayerControllerB>(); if ((Object)(object)component != (Object)null && (Object)(object)component == (Object)(object)GameNetworkManager.Instance.localPlayerController && !component.isPlayerDead) { return false; } } return true; } } [HarmonyPatch(typeof(RadMechAI))] internal class RadMechAIPatch { private static ManualLogSource mls; private static int visibleThreatsMask = 524296; public static void SetLogSource(ManualLogSource logSource) { mls = logSource; } [HarmonyPatch("OnCollideWithPlayer")] [HarmonyPrefix] private static bool onCollideWithPlayerPatch(ref Collider other) { if (PlayerControllerBPatch.isGhostMode) { PlayerControllerB component = ((Component)other).gameObject.GetComponent<PlayerControllerB>(); if (StartOfRound.Instance.localPlayerController.playerClientId == component.playerClientId) { return false; } } return true; } [HarmonyPatch("CheckSightForThreat")] [HarmonyPrefix] private static bool patchCheckSightForThreat(RadMechAI __instance) { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_010d: 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_0136: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Unknown result type (might be due to invalid IL or missing references) //IL_0146: Unknown result type (might be due to invalid IL or missing references) //IL_017a: Unknown result type (might be due to invalid IL or missing references) //IL_017f: Unknown result type (might be due to invalid IL or missing references) //IL_0189: Unknown result type (might be due to invalid IL or missing references) //IL_018e: Unknown result type (might be due to invalid IL or missing references) //IL_01a5: Unknown result type (might be due to invalid IL or missing references) //IL_01aa: Unknown result type (might be due to invalid IL or missing references) //IL_01b4: Unknown result type (might be due to invalid IL or missing references) //IL_01b9: Unknown result type (might be due to invalid IL or missing references) //IL_01e6: Unknown result type (might be due to invalid IL or missing references) //IL_01eb: Unknown result type (might be due to invalid IL or missing references) //IL_01f5: Unknown result type (might be due to invalid IL or missing references) //IL_01fa: Unknown result type (might be due to invalid IL or missing references) if (PlayerControllerBPatch.isGhostMode && !ConfigVariables.enemiesDetectYou) { Collider fieldValue = ReflectionUtils.GetFieldValue<Collider>(__instance, "targetedThreatCollider"); int num = Physics.OverlapSphereNonAlloc(((EnemyAI)__instance).eye.position + ((EnemyAI)__instance).eye.forward * 58f + -((EnemyAI)__instance).eye.up * 10f, 60f, RoundManager.Instance.tempColliderResults, visibleThreatsMask, (QueryTriggerInteraction)2); Collider val = null; RaycastHit val2 = default(RaycastHit); IVisibleThreat val3 = default(IVisibleThreat); for (int i = 0; i < num; i++) { if ((Object)(object)RoundManager.Instance.tempColliderResults[i] == (Object)(object)__instance.ownCollider) { continue; } if ((Object)(object)RoundManager.Instance.tempColliderResults[i] == (Object)(object)fieldValue && ((EnemyAI)__instance).currentBehaviourStateIndex == 1) { val = RoundManager.Instance.tempColliderResults[i]; continue; } float num2 = Vector3.Distance(((EnemyAI)__instance).eye.position, ((Component)RoundManager.Instance.tempColliderResults[i]).transform.position); float num3 = Vector3.Angle(((Component)RoundManager.Instance.tempColliderResults[i]).transform.position - ((EnemyAI)__instance).eye.position, ((EnemyAI)__instance).eye.forward); if (num2 > 2f && num3 > __instance.fov) { continue; } if (Physics.Linecast(((Component)__instance).transform.position + Vector3.up * 0.7f, ((Component)RoundManager.Instance.tempColliderResults[i]).transform.position + Vector3.up * 0.5f, ref val2, StartOfRound.Instance.collidersAndRoomMaskAndDefault, (QueryTriggerInteraction)1)) { if (((EnemyAI)__instance).debugEnemyAI) { Debug.DrawRay(((RaycastHit)(ref val2)).point, Vector3.up * 0.5f, Color.magenta, ((EnemyAI)__instance).AIIntervalTime); } continue; } EnemyAI component = ((Component)((Component)RoundManager.Instance.tempColliderResults[i]).transform).GetComponent<EnemyAI>(); if (((Object)(object)component != (Object)null && ((object)component).GetType() == typeof(RadMechAI)) || !((Component)((Component)RoundManager.Instance.tempColliderResults[i]).transform).TryGetComponent<IVisibleThreat>(ref val3)) { continue; } float visibility = val3.GetVisibility(); if (!(visibility < 0.2f) && (!(visibility <= 0.58f) || !(num2 > 30f)) && val3 is PlayerControllerB) { PlayerControllerB val4 = (PlayerControllerB)(object)((val3 is PlayerControllerB) ? val3 : null); if ((Object)(object)val4 != (Object)null && val4.playerClientId == StartOfRound.Instance.localPlayerController.playerClientId) { return false; } } } } return true; } } [HarmonyPatch(typeof(Landmine))] internal class LandminePatch { private static ManualLogSource mls; public static void SetLogSource(ManualLogSource logSource) { mls = logSource; } [HarmonyPatch("OnTriggerEnter")] [HarmonyPrefix] private static bool onTriggerEnterPatch(ref Collider other) { if (PlayerControllerBPatch.isGhostMode && !ConfigVariables.enemiesDetectYou && ((Component)other).CompareTag("Player")) { PlayerControllerB component = ((Component)other).gameObject.GetComponent<PlayerControllerB>(); if (!((Object)(object)component != (Object)(object)GameNetworkManager.Instance.localPlayerController) && (Object)(object)component != (Object)null && !component.isPlayerDead) { mls.LogMessage((object)"ghost stepped on mine, do nothing"); return false; } } return true; } [HarmonyPatch("OnTriggerExit")] [HarmonyPrefix] private static bool onTriggerExitPatch(ref Collider other) { if (PlayerControllerBPatch.isGhostMode && !ConfigVariables.enemiesDetectYou && ((Component)other).CompareTag("Player")) { PlayerControllerB component = ((Component)other).gameObject.GetComponent<PlayerControllerB>(); if ((Object)(object)component != (Object)null && !component.isPlayerDead && !((Object)(object)component != (Object)(object)GameNetworkManager.Instance.localPlayerController)) { mls.LogMessage((object)"ghost stepped off mine, do nothing"); return false; } } return true; } } [HarmonyPatch(typeof(MaskedPlayerEnemy))] internal class MaskedPlayerEnemyPatch { private static ManualLogSource mls; public static void SetLogSource(ManualLogSource logSource) { mls = logSource; } } [HarmonyPatch(typeof(JesterAI))] internal class JesterAIPatch { private static ManualLogSource mls; public static void SetLogSource(ManualLogSource logSource) { mls = logSource; } [HarmonyPatch("Update")] [HarmonyPrefix] private static void updatePatch(JesterAI __instance) { if (PlayerControllerBPatch.isGhostMode && !ConfigVariables.enemiesDetectYou && (((EnemyAI)__instance).currentBehaviourStateIndex == 2 || ((EnemyAI)__instance).currentBehaviourStateIndex == 1) && EnemyAIPatch.ghostOnlyPlayerInFacility() && EnemyAIPatch.getClosestPlayerIncludingGhost((EnemyAI)(object)__instance).playerClientId == StartOfRound.Instance.localPlayerController.playerClientId) { mls.LogMessage((object)"swaping jester back to state 0"); ((EnemyAI)__instance).SwitchToBehaviourState(1); } } } [HarmonyPatch(typeof(Turret))] internal class TurretPatch { private static ManualLogSource mls; private static RaycastHit hit; private static Ray shootRay; public static void SetLogSource(ManualLogSource logSource) { mls = logSource; } [HarmonyPatch(typeof(Turret), "CheckForPlayersInLineOfSight")] [HarmonyPrefix] private static bool checkForPlayersInLineOfSightPatch(Turret __instance, ref float radius, ref bool angleRangeCheck) { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_020b: Unknown result type (might be due to invalid IL or missing references) //IL_0210: Unknown result type (might be due to invalid IL or missing references) //IL_0211: Unknown result type (might be due to invalid IL or missing references) //IL_0216: Unknown result type (might be due to invalid IL or missing references) //IL_0186: Unknown result type (might be due to invalid IL or missing references) //IL_018c: Invalid comparison between Unknown and I4 //IL_018f: Unknown result type (might be due to invalid IL or missing references) //IL_0195: Invalid comparison between Unknown and I4 //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_0124: Unknown result type (might be due to invalid IL or missing references) //IL_012e: Unknown result type (might be due to invalid IL or missing references) //IL_0133: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Unknown result type (might be due to invalid IL or missing references) //IL_0143: Unknown result type (might be due to invalid IL or missing references) //IL_014e: Unknown result type (might be due to invalid IL or missing references) //IL_01e1: Unknown result type (might be due to invalid IL or missing references) //IL_01eb: Unknown result type (might be due to invalid IL or missing references) if (PlayerControllerBPatch.isGhostMode && !ConfigVariables.enemiesDetectYou) { bool fieldValue = ReflectionUtils.GetFieldValue<bool>(__instance, "enteringBerserkMode"); Vector3 val = __instance.aimPoint.forward; val = Quaternion.Euler(0f, (float)(int)(0f - __instance.rotationRange) / radius, 0f) * val; float num = __instance.rotationRange / radius * 2f; for (int i = 0; i <= 6; i++) { shootRay = new Ray(__instance.centerPoint.position, val); if (Physics.Raycast(shootRay, ref hit, 30f, 1051400, (QueryTriggerInteraction)1)) { if (((Component)((RaycastHit)(ref hit)).transform).CompareTag("Player")) { PlayerControllerB component = ((Component)((RaycastHit)(ref hit)).transform).GetComponent<PlayerControllerB>(); if (component.playerClientId == StartOfRound.Instance.localPlayerController.playerClientId) { return false; } if (!((Object)(object)component == (Object)null)) { if (angleRangeCheck && Vector3.Angle(((Component)component).transform.position + Vector3.up * 1.75f - __instance.centerPoint.position, __instance.forwardFacingPos.forward) > __instance.rotationRange) { return true; } return Object.op_Implicit((Object)(object)component); } continue; } if (((int)__instance.turretMode == 2 || ((int)__instance.turretMode == 3 && !fieldValue)) && ((Component)((RaycastHit)(ref hit)).transform).tag.StartsWith("PlayerRagdoll")) { Rigidbody component2 = ((Component)((RaycastHit)(ref hit)).transform).GetComponent<Rigidbody>(); if ((Object)(object)component2 != (Object)null) { component2.AddForce(((Vector3)(ref val)).normalized * 42f, (ForceMode)1); } } } val = Quaternion.Euler(0f, num / 6f, 0f) * val; } } return true; } } [HarmonyPatch(typeof(NutcrackerEnemyAI))] internal class NutcrackerEnemyAIPatch { private static ManualLogSource mls; public static void SetLogSource(ManualLogSource logSource) { mls = logSource; } [HarmonyPatch("SwitchTargetToPlayer")] [HarmonyPrefix] private static bool switchTargetToPlayerPatch(NutcrackerEnemyAI __instance, ref int playerId) { if (PlayerControllerBPatch.isGhostMode && !ConfigVariables.enemiesDetectYou && (int)StartOfRound.Instance.localPlayerController.playerClientId == playerId) { mls.LogMessage((object)"kept nutcracker from switching target to current player"); __instance.StopInspection(); ((EnemyAI)__instance).currentBehaviourStateIndex = 0; return false; } return true; } } [HarmonyPatch(typeof(SandSpiderAI))] internal class SandSpiderAIPatch { private static ManualLogSource mls; public static void SetLogSource(ManualLogSource logSource) { mls = logSource; } [HarmonyPatch("TriggerChaseWithPlayer")] [HarmonyPrefix] private static bool triggerChaseWithPlayerPatch(ref PlayerControllerB playerScript) { if (PlayerControllerBPatch.isGhostMode && StartOfRound.Instance.localPlayerController.playerClientId == playerScript.playerClientId && !ConfigVariables.enemiesDetectYou) { mls.LogMessage((object)"spider supposed to trigger chase with player"); return false; } return true; } } [HarmonyPatch(typeof(ForestGiantAI))] internal class ForestGiantAIPatch { private static ManualLogSource mls; public static void SetLogSource(ManualLogSource logSource) { mls = logSource; } [HarmonyPatch("OnCollideWithPlayer")] [HarmonyPrefix] private static bool onCollideWithPlayerPatch(ref Collider other) { if (PlayerControllerBPatch.isGhostMode) { PlayerControllerB component = ((Component)other).gameObject.GetComponent<PlayerControllerB>(); if (StartOfRound.Instance.localPlayerController.playerClientId == component.playerClientId) { return false; } } return true; } } [HarmonyPatch(typeof(MouthDogAI))] internal class MouthDogAIPatch { private static ManualLogSource mls; public static void SetLogSource(ManualLogSource logSource) { mls = logSource; } [HarmonyPatch("DetectNoise")] [HarmonyPrefix] private static bool detectNoisePatch(ref Vector3 noisePosition) { //IL_0039: 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) if (PlayerControllerBPatch.isGhostMode && !ConfigVariables.enemiesDetectYou) { PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; ulong playerClientId = StartOfRound.Instance.localPlayerController.playerClientId; PlayerControllerB val = allPlayerScripts[playerClientId]; if (GeneralUtils.twoPointsAreClose(noisePosition, ((Component)val).transform.position, 5f)) { mls.LogMessage((object)"noise was close to you, so don't detect this noise"); return false; } } return true; } } [HarmonyPatch(typeof(CentipedeAI))] internal class CentipedeAIPatch { private static ManualLogSource mls; public static void SetLogSource(ManualLogSource logSource) { mls = logSource; } [HarmonyPatch("Update")] [HarmonyPrefix] private static bool updatePrePatch(CentipedeAI __instance) { if (PlayerControllerBPatch.isGhostMode && !ConfigVariables.enemiesDetectYou && EnemyAIPatch.getClosestPlayerIncludingGhost((EnemyAI)(object)__instance).playerClientId == StartOfRound.Instance.localPlayerController.playerClientId && ((EnemyAI)__instance).currentBehaviourStateIndex == 1) { return false; } return true; } } } namespace OPJosMod.GhostMode.CustomRpc { public static class CompleteRecievedTasks { private static ManualLogSource mls; public static void SetLogSource(ManualLogSource logSource) { mls = logSource; } public static void ModActivated(string modName) { if (mls.SourceName == modName) { mls.LogMessage((object)"Mod Activated"); GlobalVariables.ModActivated = true; } } public static void TurnOffGhostMode(string clientID) { //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_01a2: Unknown result type (might be due to invalid IL or missing references) //IL_01ad: Expected O, but got Unknown //IL_0182: Unknown result type (might be due to invalid IL or missing references) //IL_018c: Expected O, but got Unknown //IL_01e6: Unknown result type (might be due to invalid IL or missing references) //IL_01f0: Expected O, but got Unknown if (!int.TryParse(clientID, out var result) || (int)StartOfRound.Instance.localPlayerController.playerClientId != result || PlayerControllerBPatch.allowKill) { return; } mls.LogMessage((object)"Revived on Other Client, turning off ghost mode."); PlayerControllerB localPlayerController = StartOfRound.Instance.localPlayerController; localPlayerController.TeleportPlayer(((Component)localPlayerController.deadBody).transform.position, false, 0f, false, true); int livingPlayers = RoundManager.Instance.playersManager.allPlayerScripts.Where((PlayerControllerB x) => !x.playerUsername.Contains("Player") && !x.isPlayerDead).ToList().Count(); StartOfRound.Instance.livingPlayers = livingPlayers; RagdollGrabbableObject val = null; float num = float.MaxValue; RagdollGrabbableObject[] array = Object.FindObjectsOfType<RagdollGrabbableObject>(); RagdollGrabbableObject[] array2 = array; foreach (RagdollGrabbableObject val2 in array2) { float num2 = Vector3.Distance(((Component)val2).transform.position, ((Component)localPlayerController).transform.position); if (num2 < num) { val = val2; num = num2; } } if ((Object)(object)val != (Object)null) { if (!((GrabbableObject)val).isHeld) { if (((NetworkBehaviour)StartOfRound.Instance).IsServer) { if (((NetworkBehaviour)val).NetworkObject.IsSpawned) { ((NetworkBehaviour)val).NetworkObject.Despawn(true); } else { Object.Destroy((Object)((Component)val).gameObject); } } } else if (((GrabbableObject)val).isHeld && (Object)((GrabbableObject)val).playerHeldBy != (Object)null) { ((GrabbableObject)val).playerHeldBy.DropAllHeldItems(true, false); } if ((Object)(object)val.ragdoll != (Object)n