Please disclose if your mod was created primarily using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of ghostCodes v2.5.2
ghostCodes.dll
Decompiled a year 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.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using GameNetcodeStuff; using HarmonyLib; using LethalConfig; using Microsoft.CodeAnalysis; using OpenLib; using OpenLib.Common; using OpenLib.Compat; using OpenLib.ConfigManager; using OpenLib.CoreMethods; using OpenLib.Events; using TMPro; using TerminalStuff; using Unity.Netcode; using UnityEngine; using UnityEngine.Events; using UnityEngine.InputSystem; using UnityEngine.InputSystem.Controls; using UnityEngine.UI; using com.github.zehsteam.ToilHead.MonoBehaviours; using ghostCodes.Compatibility; using ghostCodes.Configs; using ghostCodes.Interactions; using ghostCodes.NetcodePatcher; using ghostCodes.Patches; using ghostCodes.PluginStuff; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("ghostcodes")] [assembly: AssemblyDescription("https://github.com/darmuh/ghostcodes")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("ghostcodes")] [assembly: AssemblyCopyright("")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("d54996ea-9c7b-47cf-b5cb-fdfe2c657f71")] [assembly: AssemblyFileVersion("2.5.2")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("2.5.2.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] [module: NetcodePatchedAssembly] internal class <Module> { static <Module>() { } } namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } } namespace ghostCodes { internal class Blastdoors { internal static void HandleHungryDoor(int randomObjectNum, StartOfRound instance) { if (CodeStuff.myTerminalObjects.Count != 0) { if (((Object)((Component)CodeStuff.myTerminalObjects[randomObjectNum]).gameObject).name.Contains("BigDoor")) { Plugin.MoreLogs("The door is hungy"); ((MonoBehaviour)instance).StartCoroutine(HungryDoor(randomObjectNum)); } else { CodeStuff.myTerminalObjects[randomObjectNum].CallFunctionFromTerminal(); } } } private static IEnumerator HungryDoor(int randomObjectNum) { float intervalTime = Random.Range(0.2f, 0.7f); int numBites = Random.Range(3, 9); if (((Object)((Component)CodeStuff.myTerminalObjects[randomObjectNum]).gameObject).name.Contains("BigDoor")) { int j; for (j = 0; j < numBites; j++) { CodeStuff.myTerminalObjects[randomObjectNum].CallFunctionFromTerminal(); yield return (object)new WaitForSeconds(intervalTime); j++; } } } } internal class Teleporters { internal static void InteractWithAnyTP(int tpNum) { if (tpNum == 0 && (Object)(object)Teleporter.NormalTP != (Object)null) { Plugin.MoreLogs("Messing with NormalTP"); Teleporter.NormalTP.PressTeleportButtonServerRpc(); Plugin.MoreLogs("NormalTP button pressed via ServerRpc"); } else if (tpNum == 1 && (Object)(object)Teleporter.InverseTP != (Object)null) { Plugin.MoreLogs("Messing with InverseTP"); Teleporter.InverseTP.PressTeleportButtonServerRpc(); Plugin.MoreLogs("InverseTP button pressed via ServerRpc"); } } } internal class TerminalAdditions { internal static TerminalNode rebootNode; internal static bool rebootCommandExpired = false; internal static int rebootCount; internal static int rebootTime; internal static int deathNoteStrikes = 0; public static bool isTerminalRebooting = false; internal static bool spookyColors = false; internal static bool credsCorrupted = false; internal static int OriginalCreds = 0; internal static Color OriginalColor; internal static string rebootConfirmName = "ghostCodes_confirm_reboot"; internal static string rebootDenyName = "ghostCodes_deny_reboot"; internal static AudioClip Shock; internal static AudioClip Reboot; internal static AudioClip Success; internal static void ResetBools() { isTerminalRebooting = false; rebootCommandExpired = false; spookyColors = false; rebootCount = 0; deathNoteStrikes = 0; } internal static IEnumerator RebootTerminalSpooky() { if (isTerminalRebooting) { yield break; } Plugin.MoreLogs("Start of spooky terminal reboot coroutine."); SoundSystem.PlayTerminalSound(Reboot); yield return (object)new WaitForSeconds(1f); SetTerminalText(StringStuff.reboot_3); yield return (object)new WaitForSeconds(1f); SetTerminalText(StringStuff.reboot_2); yield return (object)new WaitForSeconds(1f); SetTerminalText(StringStuff.reboot_1); Plugin.instance.Terminal.QuitTerminal(true); yield return (object)new WaitForEndOfFrame(); IsTerminalUsable(state: false); float originalAlpha = ((TMP_Text)Plugin.instance.Terminal.topRightText).alpha; ((TMP_Text)Plugin.instance.Terminal.topRightText).alpha = 0f; ((Component)Plugin.instance.Terminal.terminalUIScreen).gameObject.SetActive(true); Plugin.instance.Terminal.screenText.caretPosition = Plugin.instance.Terminal.screenText.text.Length; Bools.endAllCodes = true; isTerminalRebooting = true; yield return (object)new WaitForSeconds(1f); SetTerminalText(StringStuff.reboot_progress_1); ((MonoBehaviour)StartOfRound.Instance).StartCoroutine(RebootLoadingTextLoop()); yield return (object)new WaitForSeconds((float)rebootTime); isTerminalRebooting = false; DressGirl.StopGirlFromChasing(); Bools.endAllCodes = false; ((TMP_Text)Plugin.instance.Terminal.topRightText).alpha = originalAlpha; Plugin.instance.Terminal.terminalAudio.Stop(); SoundSystem.PlayTerminalSound(Success); SetTerminalText("\n\n\n\n\n\n\n\n\n\t\t>>Reboot <color=#ebe334>Complete.</color><<\n\n\n\n"); IsTerminalUsable(state: true); InitPlugin.RestartPlugin(); if (InteractionsConfig.TerminalRebootUses.Value > 0) { if (rebootCount >= InteractionsConfig.TerminalRebootUses.Value) { rebootCommandExpired = true; } else { rebootCount++; } } } internal static IEnumerator RebootLoadingTextLoop() { while (isTerminalRebooting) { int @int = NumberStuff.GetInt(0, StringStuff.rebootProgress.Count); SetTerminalText("<color=#b81b1b>" + StringStuff.rebootProgress[@int] + "</color>"); yield return (object)new WaitForSeconds(0.1f); } } internal static void SetTerminalText(string newText) { Plugin.instance.Terminal.currentText = newText; Plugin.instance.Terminal.screenText.text = newText; } internal static void IsTerminalUsable(bool state) { Plugin.instance.Terminal.terminalTrigger.interactable = state; Plugin.MoreLogs($"terminal interactable set to {state}"); } internal static string HandleRebootNode() { Plugin.MoreLogs("Handling reboot node"); if (StartOfRound.Instance.inShipPhase) { return "\n\n\n\n\n\n\t\tTerminal reboot is not necessary... (in orbit)\r\n"; } int @int = NumberStuff.GetInt(0, 100); if (InteractionsConfig.TerminalReboot.Value < @int || rebootCommandExpired) { string result = "\n\n\n\n\n\n\t\tTerminal reboot has failed...\r\n"; rebootCommandExpired = true; return result; } ((MonoBehaviour)StartOfRound.Instance).StartCoroutine(RebootTerminalSpooky()); Plugin.MoreLogs("rebooting terminal"); return ""; } internal static string AskTerminalReboot() { rebootTime = NumberStuff.GetInt(30, 88); return $"You have requested to reboot the terminal.\nTotal time to reboot is {rebootTime} seconds...\n\nPlease CONFIRM or DENY.\n\n"; } internal static void CreateAllNodes() { if (ModConfig.ModNetworking.Value) { CreateRebootNode(); CreateDeathNoteNode(); } } private static void CreateRebootNode() { if (InteractionsConfig.TerminalReboot.Value >= 1) { rebootNode = AddingThings.AddNodeManual("ghostCodes_reboot", "reboot", (Func<string>)AskTerminalReboot, true, 1, ConfigSetup.defaultListing, 0, (Func<string>)HandleRebootNode, (Func<string>)null, "", "Terminal Reboot has been cancelled.\r\n\r\n", false, 1, "", false, ""); } } private static void CreateDeathNoteNode() { if (InteractionsConfig.DeathNote.Value >= 1 && StartOfRound.Instance.allPlayerScripts.Any((PlayerControllerB x) => x.isPlayerControlled && (Object)(object)x != (Object)(object)StartOfRound.Instance.localPlayerController)) { Plugin.Spam("Adding deathnotemenu!"); DeathNote.DeathNoteMenu = AddingThings.AddNodeManual("DeathNoteMenu", "leave me alone", (Func<string>)OpenDeathNote, true, 0, ConfigSetup.defaultListing, 0, (Func<string>)null, (Func<string>)null, "", "", false, 1, "", false, ""); } } internal static string OpenDeathNote() { if (!CanUseDeathNote()) { return "Chill out, no one is after you lol\r\n\r\n"; } if (Plugin.instance.TerminalStuff) { TerminalStuff.StopShortCuts(stop: true); } DeathNote.currentPage = 1; ((MonoBehaviour)Plugin.instance.Terminal).StartCoroutine(DeathNote.MenuStart()); return DeathNote.GetPlayerList(0, 10, ref DeathNote.currentPage); } internal static bool CanUseDeathNote() { if ((Object)(object)Plugin.instance.DressGirl == (Object)null) { return false; } if (!Plugin.instance.DressGirl.hauntingLocalPlayer) { return false; } if (!StartOfRound.Instance.allPlayerScripts.Any((PlayerControllerB x) => x.isPlayerControlled && (Object)(object)x != (Object)(object)StartOfRound.Instance.localPlayerController)) { return false; } if (StartOfRound.Instance.shipIsLeaving) { return false; } return true; } internal static void DeathNoteFail() { if (InteractionsConfig.DeathNoteFailChase.boolValue && !((Object)(object)Plugin.instance.DressGirl == (Object)null)) { Plugin.MoreLogs("death note failed, beginning ghost girl chase"); Plugin.instance.DressGirl.BeginChasing(); } } internal static void CorruptedCredits(bool state) { //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) if (state) { Plugin.Spam("Credits corrupted!"); OriginalCreds = Plugin.instance.Terminal.groupCredits; OriginalColor = ((Graphic)Plugin.instance.Terminal.topRightText).color; Plugin.instance.Terminal.SyncGroupCreditsServerRpc(0, Plugin.instance.Terminal.numberOfItemsInDropship); ((Graphic)Plugin.instance.Terminal.topRightText).color = Color.red; credsCorrupted = true; } else { Plugin.Spam("Credits restored!"); Plugin.instance.Terminal.SyncGroupCreditsServerRpc(OriginalCreds, Plugin.instance.Terminal.numberOfItemsInDropship); ((Graphic)Plugin.instance.Terminal.topRightText).color = OriginalColor; credsCorrupted = false; } } internal static void RestoreCreds() { if (credsCorrupted) { CorruptedCredits(state: false); } } } internal class Bools { internal static bool lightsFlickering; internal static bool endFlicker; internal static bool appPullInvoked; public static bool endAllCodes; internal static bool IsCodeSent() { return Plugin.instance.CodeSent; } internal static bool IsInsideFactory() { return StartOfRound.Instance.localPlayerController.isInsideFactory; } internal static bool IsHourInRange(int hour, int startHour, int endHour) { if (hour > startHour) { return hour <= endHour; } return false; } internal static bool ShouldRunCodeLooper() { if (SetupConfig.GhostCodesSettings.CurrentMode.ToLower() != "hauntings") { return true; } if (!ModConfig.ModNetworking.Value) { return true; } if ((Object)(object)Plugin.instance.Terminal == (Object)null) { Plugin.MoreLogs("Terminal instance null"); return false; } return false; } internal static bool ShouldInitPlugin() { if ((Object)(object)Plugin.instance.Terminal == (Object)null) { Plugin.MoreLogs("Terminal instance null"); return false; } return true; } public static bool GhostCodesShouldNotBePresentEver() { if (((Object)StartOfRound.Instance.currentLevel).name == "CompanyBuildingLevel" || StartOfRound.Instance.currentLevel.riskLevel == "Safe") { return true; } if (StartOfRound.Instance.inShipPhase) { return true; } if (Plugin.instance.CodeCount > Plugin.instance.RandCodeAmount) { return true; } return false; } public static bool CanSendCodes() { if (endAllCodes || GhostCodesShouldNotBePresentEver()) { return false; } if (SetupConfig.GhostCodesSettings.CurrentMode.ToLower() != "hauntings") { return GameNetworkManager.Instance.gameHasStarted; } if ((Object)(object)Plugin.instance.DressGirl == (Object)null) { Plugin.MoreLogs("dressgirl instance is null"); return false; } if (GameNetworkManager.Instance.gameHasStarted) { return Plugin.instance.DressGirl.hauntingLocalPlayer == Object.op_Implicit((Object)(object)StartOfRound.Instance.localPlayerController); } return false; } internal static bool PlayerStillAliveAndControlled(PlayerControllerB player) { if ((Object)(object)player == (Object)null) { return false; } if (!player.isPlayerControlled) { return false; } if (player.isPlayerDead) { return false; } return true; } internal static bool KeepSendingCodes() { if (endAllCodes || GhostCodesShouldNotBePresentEver()) { return false; } if (StartOfRound.Instance.shipIsLeaving || StartOfRound.Instance.allPlayersDead) { return false; } if (SetupConfig.GhostCodesSettings.CurrentMode.ToLower() != "hauntings") { return true; } if ((Object)(object)Plugin.instance.DressGirl == (Object)null) { return false; } if (!Plugin.instance.DressGirl.hauntingLocalPlayer) { return false; } if (Plugin.instance.DressGirl.hauntingPlayer.isPlayerDead) { return false; } if (Coroutines.rapidFireStart && !DressGirl.girlIsChasing) { return false; } return true; } internal static bool DressGirlStartCodes() { if (endAllCodes || RapidFire.startRapidFire || GhostCodesShouldNotBePresentEver()) { return false; } if (StartOfRound.Instance.shipIsLeaving || StartOfRound.Instance.allPlayersDead) { return false; } if (!Plugin.instance.DressGirl.staringInHaunt || Plugin.instance.DressGirl.hauntingPlayer.isPlayerDead) { return false; } return true; } internal static bool IsThisaBigDoor(int randomObjectNum) { if (randomObjectNum < 0) { return false; } if (CodeStuff.myTerminalObjects.Count == 0) { return false; } if ((Object)(object)CodeStuff.myTerminalObjects[randomObjectNum] == (Object)null) { return false; } if ((Object)(object)((Component)CodeStuff.myTerminalObjects[randomObjectNum]).gameObject == (Object)null) { return false; } if (((Object)((Component)CodeStuff.myTerminalObjects[randomObjectNum]).gameObject).name.Contains("BigDoor")) { return true; } return false; } internal static bool AreEnoughPlayersDancing(int totalPlayers, int playersDancing, int requiredPercentage) { if (playersDancing > totalPlayers * (requiredPercentage / 100)) { return true; } return false; } internal static bool IsThisEffective(int percentChance) { int @int = NumberStuff.GetInt(0, 100); if (percentChance > @int) { return true; } return false; } internal static bool CheckForPlayerName(string playerName) { PlayerControllerB[] players = Plugin.instance.players; foreach (PlayerControllerB val in players) { if (playerName.Contains(val.playerUsername)) { return true; } } return false; } internal static bool AreAnyPlayersInShip() { PlayerControllerB[] players = Plugin.instance.players; foreach (PlayerControllerB val in players) { if (!val.isPlayerDead && val.isInHangarShipRoom) { return true; } } Plugin.MoreLogs("No players detected in ship"); return false; } internal static bool AreAnyPlayersInFacility() { PlayerControllerB[] players = Plugin.instance.players; foreach (PlayerControllerB val in players) { if (!val.isPlayerDead && val.isInsideFactory) { return true; } } Plugin.MoreLogs("No players detected in facility"); return false; } internal static bool IsAnyPlayerUsingTerminal(out PlayerControllerB terminalUser) { PlayerControllerB[] players = Plugin.instance.players; foreach (PlayerControllerB val in players) { if (!val.isPlayerDead && val.inTerminalMenu) { terminalUser = val; return true; } } terminalUser = null; return false; } } internal class CodeActions { internal static Random Rand = new Random(); internal static void InitPossibleActions(StartOfRound instance, int randomObjectNum = -1) { CodeHandling.possibleActions.Clear(); NetworkingRequiredActions(); ExternalModCheck(); CruiserStuff(); ShipStuff(); GhostGirlRequired(); AddRegularDoorStuff(); Maininteractions(); if (randomObjectNum >= 0 && CodeStuff.myTerminalObjects.Count > randomObjectNum) { TerminalObjectActions(instance, randomObjectNum); } } private static void Maininteractions() { if (InteractionsConfig.AffectAllBatteries.Value > 0) { CodeHandling.possibleActions.Add(new ActionPercentage("AffectAllBatteries", delegate { Items.AdjustAllPlayersBattery(); }, InteractionsConfig.AffectAllBatteries.Value)); } if (InteractionsConfig.AffectRandomPlayerBatteries.Value > 0) { CodeHandling.possibleActions.Add(new ActionPercentage("AffectRandomPlayerBatteries", delegate { Items.AffectRandomPlayersBatteries(); }, InteractionsConfig.AffectRandomPlayerBatteries.Value)); } if (InteractionsConfig.HauntFactoryScrap.Value > 0) { CodeHandling.possibleActions.Add(new ActionPercentage("HauntFactoryScrap", delegate { Items.HauntItemUse(isHeld: false); }, InteractionsConfig.HauntFactoryScrap.Value)); } if (InteractionsConfig.HauntHeldScrap.Value > 0) { CodeHandling.possibleActions.Add(new ActionPercentage("HauntHeldScrap", delegate { Items.HauntItemUse(isHeld: true); }, InteractionsConfig.HauntHeldScrap.Value)); } if (InteractionsConfig.SignalTranslator.Value > 0) { CodeHandling.possibleActions.Add(new ActionPercentage("SignalTranslator", delegate { SignalTranslator.MessWithSignalTranslator(); }, InteractionsConfig.SignalTranslator.Value)); } } private static void MessWithWalkies() { if (WalkieTalkie.allWalkieTalkies.Count == 0 || !SetupConfig.GhostCodesSettings.HauntingsMode) { return; } Plugin.Spam("Adding enabled walkie stuff"); if (InteractionsConfig.GarbleWalkies.Value > 0) { CodeHandling.possibleActions.Add(new ActionPercentage("GarbleWalkies", delegate { NetHandler.Instance.GarbleWalkiesServerRpc(); }, InteractionsConfig.GarbleWalkies.Value)); } if (InteractionsConfig.BreatheOnWalkies.Value > 0) { CodeHandling.possibleActions.Add(new ActionPercentage("BreatheOnWalkies", delegate { NetHandler.Instance.BreatheOnWalkiesServerRpc(); }, InteractionsConfig.BreatheOnWalkies.Value)); } } private static void GhostGirlRequired() { if (!SetupConfig.GhostCodesSettings.HauntingsMode) { return; } if (InteractionsConfig.PlayerLights.Value > 0 && !RapidFire.startRapidFire) { CodeHandling.possibleActions.Add(new ActionPercentage("ggFlashlight", delegate { Lights.GGFlashlight(); }, InteractionsConfig.PlayerLights.Value)); } if (InteractionsConfig.AffectHauntedPlayerBatteries.Value > 0) { CodeHandling.possibleActions.Add(new ActionPercentage("AffectHauntedPlayerBatteries", delegate { Items.AffectHauntedPlayersBatteries(); }, InteractionsConfig.AffectHauntedPlayerBatteries.Value)); } MessWithWalkies(); } private static void ShipStuff() { if (!Bools.AreAnyPlayersInShip()) { return; } Plugin.Spam("players detected on ship"); if (InteractionsConfig.LightsOnShip.Value > 0) { CodeHandling.possibleActions.Add(new ActionPercentage("MessWithShipLights", delegate { ghostCodes.ShipStuff.MessWithShipLights(); }, InteractionsConfig.LightsOnShip.Value)); } if (InteractionsConfig.DoorsOnShip.Value > 0) { CodeHandling.possibleActions.Add(new ActionPercentage("MessWithShipDoors", delegate { ghostCodes.ShipStuff.MessWithShipDoors(); }, InteractionsConfig.DoorsOnShip.Value)); } if (ModConfig.ModNetworking.Value && InteractionsConfig.ShockTerminalUser.Value > 0 && Bools.IsAnyPlayerUsingTerminal(out var terminalUser)) { CodeHandling.possibleActions.Add(new ActionPercentage("Shock Terminal User", delegate { ghostCodes.ShipStuff.ShockTerminal(); }, InteractionsConfig.ShockTerminalUser.Value)); Plugin.MoreLogs(terminalUser.playerUsername + " detected using terminal"); } if (InteractionsConfig.MonitorsOnShip.Value > 0 && ModConfig.ModNetworking.Value) { CodeHandling.possibleActions.Add(new ActionPercentage("MessWithMonitors", delegate { NetHandler.Instance.MessWithMonitorsServerRpc(); }, InteractionsConfig.MonitorsOnShip.Value)); } if (InteractionsConfig.TeleportPlayer.Value > 0 && (Object)(object)Teleporter.NormalTP != (Object)null) { Plugin.MoreLogs("Added MessWithNormalTP"); CodeHandling.possibleActions.Add(new ActionPercentage("MessWithNormalTP", delegate { Teleporters.InteractWithAnyTP(0); }, InteractionsConfig.TeleportPlayer.Value)); } if (InteractionsConfig.InverseTeleporter.Value > 0 && (Object)(object)Teleporter.InverseTP != (Object)null) { Plugin.MoreLogs("Added MessWithInverseTP"); CodeHandling.possibleActions.Add(new ActionPercentage("MessWithInverseTP", delegate { Teleporters.InteractWithAnyTP(1); }, InteractionsConfig.InverseTeleporter.Value)); } if (InteractionsConfig.CorruptedCredits.Value > 0 && !TerminalAdditions.credsCorrupted) { CodeHandling.possibleActions.Add(new ActionPercentage("CorruptedCredits", delegate { TerminalAdditions.CorruptedCredits(state: true); }, InteractionsConfig.CorruptedCredits.Value)); } if (InteractionsConfig.HeavyLever.Value > 0) { CodeHandling.possibleActions.Add(new ActionPercentage("HeavyLever", delegate { ghostCodes.ShipStuff.HeavyLeverFunc(); }, InteractionsConfig.HeavyLever.Value)); } if (InteractionsConfig.HauntedOrder.Value > 0 && Plugin.instance.Terminal.orderedItemsFromTerminal.Count == 0 && Plugin.instance.Terminal.numberOfItemsInDropship == 0) { CodeHandling.possibleActions.Add(new ActionPercentage("HauntedOrder", delegate { ghostCodes.ShipStuff.HauntedOrderFunc(); }, InteractionsConfig.HauntedOrder.Value)); } } private static void AddRegularDoorStuff() { if (!Bools.AreAnyPlayersInFacility() || Doors.AllDoors.Count == 0) { return; } if (InteractionsConfig.ToggleAllRegularDoors.Value > 0) { CodeHandling.possibleActions.Add(new ActionPercentage("ToggleAllRegularDoors", delegate { Doors.OpenOrCloseALLDoors(); }, InteractionsConfig.ToggleAllRegularDoors.Value)); } if (InteractionsConfig.ToggleRegularDoor.Value > 0) { CodeHandling.possibleActions.Add(new ActionPercentage("ToggleRegularDoor", delegate { Doors.OpenorClose1RandomDoor(); }, InteractionsConfig.ToggleRegularDoor.Value)); } if (InteractionsConfig.LockSingleDoor.Value > 0) { CodeHandling.possibleActions.Add(new ActionPercentage("LockONEdoor", delegate { Doors.LockorUnlockARandomDoor(stateLocked: true); }, InteractionsConfig.LockSingleDoor.Value)); } if (InteractionsConfig.UnlockSingleDoor.Value > 0) { CodeHandling.possibleActions.Add(new ActionPercentage("UnlockONEdoor", delegate { Doors.LockorUnlockARandomDoor(stateLocked: false); }, InteractionsConfig.UnlockSingleDoor.Value)); } if (InteractionsConfig.TryHauntSingleDoor.Value > 0) { CodeHandling.possibleActions.Add(new ActionPercentage("TryHauntSingleDoor", delegate { Doors.HauntDoors(0); }, InteractionsConfig.TryHauntSingleDoor.Value)); } if (InteractionsConfig.TryHauntHalfAllDoors.Value > 0) { CodeHandling.possibleActions.Add(new ActionPercentage("TryHauntHalfAllDoors", delegate { Doors.HauntDoors(50); }, InteractionsConfig.TryHauntHalfAllDoors.Value)); } if (InteractionsConfig.TryHauntAllDoors.Value > 0) { CodeHandling.possibleActions.Add(new ActionPercentage("TryHauntAllDoors", delegate { Doors.HauntDoors(100); }, InteractionsConfig.TryHauntAllDoors.Value)); } } private static void CruiserStuff() { if ((Object)(object)Plugin.instance.Cruiser == (Object)null || !Plugin.instance.Cruiser.ignitionStarted) { return; } Plugin.MoreLogs("Adding cruiser interactions!!"); if (InteractionsConfig.ChangeCruiserRadio.Value > 0) { CodeHandling.possibleActions.Add(new ActionPercentage("ChangeCruiserRadio", delegate { Plugin.instance.Cruiser.ChangeRadioStation(); }, InteractionsConfig.ChangeCruiserRadio.Value)); } if (InteractionsConfig.CruiserEjectDriver.Value > 0) { CodeHandling.possibleActions.Add(new ActionPercentage("CruiserEjectDriver", delegate { Plugin.instance.Cruiser.SpringDriverSeatServerRpc(); }, InteractionsConfig.CruiserEjectDriver.Value)); } if (InteractionsConfig.CruiserUseBoost.Value > 0 && ((NetworkBehaviour)Plugin.instance.Cruiser).IsOwner) { CodeHandling.possibleActions.Add(new ActionPercentage("CruiserUseBoost", delegate { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) Plugin.instance.Cruiser.UseTurboBoostLocalClient(default(Vector2)); }, InteractionsConfig.CruiserUseBoost.Value)); } if (InteractionsConfig.CruiserPush.Value > 0) { CodeHandling.possibleActions.Add(new ActionPercentage("CruiserPush", delegate { Cruiser.Push(); }, InteractionsConfig.CruiserPush.Value)); } if (InteractionsConfig.ToggleCruiserDoors.Value > 0) { CodeHandling.possibleActions.Add(new ActionPercentage("CruiserDoors", delegate { Cruiser.Doors(); }, InteractionsConfig.ToggleCruiserDoors.Value)); } if (InteractionsConfig.ToggleCruiserLights.Value > 0) { CodeHandling.possibleActions.Add(new ActionPercentage("ToggleCruiserLights", delegate { Cruiser.Headlights(1); }, InteractionsConfig.ToggleCruiserLights.Value)); } if (InteractionsConfig.FlickerCruiserLights.Value > 0) { CodeHandling.possibleActions.Add(new ActionPercentage("FlickerCruiserLights", delegate { Cruiser.Headlights(Rand.Next(11)); }, InteractionsConfig.FlickerCruiserLights.Value)); } if (InteractionsConfig.ToggleCruiserHood.Value > 0) { CodeHandling.possibleActions.Add(new ActionPercentage("ToggleCruiserHood", delegate { Plugin.instance.Cruiser.ToggleHoodOpenLocalClient(); }, InteractionsConfig.ToggleCruiserHood.Value)); } if (InteractionsConfig.CruiserWindshield.Value > 0) { CodeHandling.possibleActions.Add(new ActionPercentage("CruiserWindshield", delegate { Cruiser.Windshield(); }, InteractionsConfig.CruiserWindshield.Value)); } if (InteractionsConfig.CruiserShiftGears.Value > 0) { CodeHandling.possibleActions.Add(new ActionPercentage("CruiserShiftGears", delegate { Cruiser.GearShift(); }, InteractionsConfig.CruiserShiftGears.Value)); } } private static void ExternalModCheck() { Plugin.MoreLogs("Checking for any external mods to utilize ghost codes on"); if (!Plugin.instance.ToilHead || !ToilHead.CheckForToilHeadObjects()) { return; } Plugin.MoreLogs("Adding toilhead actions"); if (InteractionsConfig.ToilHeadTurretDisable.Value > 0) { CodeHandling.possibleActions.Add(new ActionPercentage("toilHeadDisable", delegate { ToilHead.HandleToilHeadCodeAction(); }, InteractionsConfig.ToilHeadTurretDisable.Value)); } if (InteractionsConfig.ToilHeadTurretBerserk.Value > 0) { CodeHandling.possibleActions.Add(new ActionPercentage("toilHeadBerserk", delegate { ToilHead.HandleToilHeadBerserkAction(); }, InteractionsConfig.ToilHeadTurretBerserk.Value)); } } private static void NetworkingRequiredActions() { if (ModConfig.ModNetworking.Value && InteractionsConfig.FlipBreaker.Value > 0) { CodeHandling.possibleActions.Add(new ActionPercentage("facilityLights", delegate { Lights.FlipLights(); }, InteractionsConfig.FlipBreaker.Value)); } } private static void TerminalObjectActions(StartOfRound instance, int randomObjectNum) { if (CodeStuff.myTerminalObjects.Count > 0) { CodeHandling.possibleActions.Add(new ActionPercentage("DefaultCodes", delegate { DefaultTerminalAction(randomObjectNum); }, 100f)); } if (!SetupConfig.IgnoreDoors.Value && Bools.IsThisaBigDoor(randomObjectNum)) { CodeHandling.possibleActions.Add(new ActionPercentage("hungryDoor", delegate { Blastdoors.HandleHungryDoor(randomObjectNum, instance); }, InteractionsConfig.HungryBlastDoor.Value)); } if (!SetupConfig.IgnoreTurrets.Value) { CodeHandling.possibleActions.Add(new ActionPercentage("TurretBerserk", delegate { Turrets.HandleTurretAction(); }, InteractionsConfig.TurretBerserk.Value)); } if (!SetupConfig.IgnoreLandmines.Value) { CodeHandling.possibleActions.Add(new ActionPercentage("MineBoom", delegate { Mines.HandleMineBoom(); }, InteractionsConfig.MineBoom.Value)); } } internal static void DefaultTerminalAction(int randomObjectNum) { if (randomObjectNum != -1 && CodeStuff.myTerminalObjects.Count > randomObjectNum) { CodeStuff.myTerminalObjects[randomObjectNum].CallFunctionFromTerminal(); } } } public class ActionPercentage { public Action Action { get; } public float Percentage { get; } public string Name { get; set; } public ActionPercentage(string name, Action action, float percentage) { Action = action; Percentage = percentage; Name = name; base..ctor(); } public static List<Action> ChooseActionsFromPercentages(List<ActionPercentage> actions) { Shuffle(actions); List<Action> list = new List<Action>(); int num = 0; foreach (ActionPercentage action in actions) { Plugin.Spam("Checking " + action.Name + " against percentage"); int num2 = NumberStuff.Rand.Next(101); float num3 = action.Percentage; if (RapidFire.startRapidFire) { num3 = NumberStuff.GetClampedInsanityPercent(num3, InsanityConfig.InsanityModeMultiplier.Value); } if (num < 3 && ((float)num2 <= num3 || Mathf.Approximately(num3, 100f))) { Plugin.Spam("Action " + action.Name + " was chosen!"); list.Add(action.Action); num++; } } return list; } private static void Shuffle<T>(List<T> list) { int num = list.Count; while (num > 1) { num--; int index = NumberStuff.Rand.Next(num); T value = list[index]; list[index] = list[num]; list[num] = value; } } } internal class CodeHandling { internal static List<ActionPercentage> possibleActions = new List<ActionPercentage>(); internal static List<Action> chosenActions = new List<Action>(); internal static void HandleGhostCodeSending(StartOfRound instance) { Misc.LogTime(); if (NumberStuff.TryGetObjectNum(out var randomObjectNum)) { chosenActions.Clear(); CodeActions.InitPossibleActions(instance, randomObjectNum); } else { Plugin.WARNING("Unable to get randomObjectNum!"); } if (possibleActions.Count >= 1 && !Bools.endAllCodes) { chosenActions = ActionPercentage.ChooseActionsFromPercentages(possibleActions); HandleChosenActions(randomObjectNum); SoundSystem.InsanityAmbient(); SoundSystem.HandleCodeEffects(); } } internal static void HandleRapidFireCodeChoices(StartOfRound instance, int number) { Misc.LogTime(); chosenActions.Clear(); CodeActions.InitPossibleActions(instance, number); if (possibleActions.Count >= 1 && !Bools.endAllCodes) { chosenActions = ActionPercentage.ChooseActionsFromPercentages(possibleActions); HandleChosenActions(number); SoundSystem.InsanityAmbient(); SoundSystem.HandleCodeEffects(); } } private static void HandleChosenActions(int randomObjectNum) { if (chosenActions == null && CodeStuff.myTerminalObjects.Count == 0) { Bools.endAllCodes = true; return; } if (chosenActions.Count > 0) { foreach (Action chosenAction in chosenActions) { chosenAction(); } return; } if (randomObjectNum != -1) { CodeStuff.myTerminalObjects[randomObjectNum].CallFunctionFromTerminal(); Plugin.GC.LogInfo((object)"No Special action chosen, calling function from terminal"); } } } internal class Coroutines { internal static bool rapidFireStart; internal static bool codeLooperStarted; internal static IEnumerator InitEnumerator(StartOfRound instance) { int wait = NumberStuff.GetWait(SetupConfig.RandomIntervals.Value, SetupConfig.FirstRandIntervalMin.Value, SetupConfig.FirstRandIntervalMax.Value, SetupConfig.FirstSetInterval.Value); InitPlugin.CodesInit(); Plugin.MoreLogs($"Codes Amount: {Plugin.instance.RandCodeAmount}"); if (SetupConfig.GhostCodesSettings.HauntingsMode && ModConfig.ModNetworking.Value) { Plugin.MoreLogs("The ghost girl has been enhanced, prepare for your next haunting! >:)"); TerminalAdditions.CreateAllNodes(); } else if (((NetworkBehaviour)GameNetworkManager.Instance.localPlayerController).IsHost) { yield return (object)new WaitForSeconds((float)wait); ((MonoBehaviour)StartOfRound.Instance).StartCoroutine(CodeLooper(instance)); Plugin.MoreLogs("The ghost is in the machine..."); TerminalAdditions.CreateAllNodes(); } else { Plugin.MoreLogs("Ghost Girl Enhanced is disabled and you are not the host."); TerminalAdditions.CreateAllNodes(); } } internal static IEnumerator RestartEnum(StartOfRound instance) { int @int = NumberStuff.GetInt(20, 100); yield return (object)new WaitForSeconds((float)@int); int wait = NumberStuff.GetWait(SetupConfig.RandomIntervals.Value, SetupConfig.FirstRandIntervalMin.Value, SetupConfig.FirstRandIntervalMax.Value, SetupConfig.FirstSetInterval.Value); Plugin.MoreLogs($"Codes: {Plugin.instance.CodeCount} / {Plugin.instance.RandCodeAmount}"); if (SetupConfig.GhostCodesSettings.HauntingsMode && ModConfig.ModNetworking.Value) { Plugin.MoreLogs("The ghost girl has been enhanced, prepare for your next haunting! >:)"); } else if (((NetworkBehaviour)GameNetworkManager.Instance.localPlayerController).IsHost) { yield return (object)new WaitForSeconds((float)wait); Bools.endAllCodes = false; rapidFireStart = false; RapidFire.startRapidFire = false; ((MonoBehaviour)instance).StartCoroutine(CodeLooper(instance)); Plugin.MoreLogs("The ghost is in the machine..."); } else { Plugin.MoreLogs("Ghost Girl Enhanced is disabled and you are not the host."); } } internal static IEnumerator CodeLooper(StartOfRound instance) { if (codeLooperStarted) { yield break; } Plugin.MoreLogs("CodeLooper coroutine initiated..."); codeLooperStarted = true; if (Bools.CanSendCodes()) { while (Bools.KeepSendingCodes()) { yield return (object)new WaitForSeconds(1f); if (!Bools.IsCodeSent()) { float randomWaitNum = NumberStuff.GetWait(SetupConfig.RandomIntervals.Value, SetupConfig.SecondRandIntervalMin.Value, SetupConfig.SecondRandIntervalMax.Value, SetupConfig.SecondSetInterval.Value); if (SetupConfig.GhostCodesSettings.InsanityMode) { InsanityStuff.ApplyInsanityMode(instance, ref randomWaitNum); if (RapidFire.startRapidFire) { Plugin.MoreLogs("startRapidFire detected from codeLooper"); codeLooperStarted = false; yield break; } } yield return (object)new WaitForSeconds(randomWaitNum); CodeHandling.HandleGhostCodeSending(instance); Plugin.instance.CodeCount++; Plugin.instance.CodeSent = true; Plugin.MoreLogs($"Code Sent, count: {Plugin.instance.CodeCount}"); } else { float randomWaitNum2 = NumberStuff.GetWait(SetupConfig.RandomIntervals.Value, SetupConfig.RandIntervalACMin.Value, SetupConfig.RandIntervalACMax.Value, SetupConfig.SetIntervalAC.Value); Plugin.MoreLogs($"ghostCode was just sent, waiting {randomWaitNum2}"); if (SetupConfig.GhostCodesSettings.InsanityMode) { InsanityStuff.ApplyInsanityMode(instance, ref randomWaitNum2); } yield return (object)new WaitForSeconds(randomWaitNum2); Plugin.instance.CodeSent = false; } if (StartOfRound.Instance.shipIsLeaving) { Plugin.MoreLogs($"Ship is leaving, {Plugin.instance.CodeCount} codes were sent."); codeLooperStarted = false; yield break; } } Plugin.MoreLogs($"the ghost is bored of sending codes, {Plugin.instance.CodeCount} codes were sent."); codeLooperStarted = false; } else { Plugin.MoreLogs("No codes can be sent at this time."); codeLooperStarted = false; } } private static void RapidFireStoppers(int startTime, int currentTime) { DressGirl.GGrapidFireChecks(); RapidFire.TimeCheck(startTime, currentTime); } internal static IEnumerator RapidFireStart(StartOfRound instance) { if (rapidFireStart) { yield break; } Plugin.MoreLogs("start of rapidFire"); int startTime = TimeOfDay.Instance.hour; rapidFireStart = true; if (Bools.CanSendCodes()) { while (Bools.KeepSendingCodes() && RapidFire.startRapidFire && !Bools.endAllCodes) { RapidFire.CheckInsanityToContinue(); RapidFire.HandleLights(); if (!Bools.IsCodeSent()) { if (CodeStuff.myTerminalObjects.Count == 0) { for (int j = 0; j < CodeHandling.possibleActions.Count; j++) { if (!Bools.KeepSendingCodes()) { break; } RapidFireStoppers(startTime, TimeOfDay.Instance.hour); CodeHandling.HandleRapidFireCodeChoices(instance, -1); yield return (object)new WaitForSeconds(Random.Range(0.5f, 3f)); } } else { for (int j = 0; j < CodeStuff.myTerminalObjects.Count; j++) { if (!Bools.KeepSendingCodes()) { break; } RapidFireStoppers(startTime, TimeOfDay.Instance.hour); CodeHandling.HandleRapidFireCodeChoices(instance, j); yield return (object)new WaitForSeconds(Random.Range(0.5f, 3f)); } } RapidFire.CountSentCodes(); Plugin.instance.CodeSent = true; } else { RapidFireStoppers(startTime, TimeOfDay.Instance.hour); float num = Random.Range(1f, 4f); RapidFireStoppers(startTime, TimeOfDay.Instance.hour); yield return (object)new WaitForSeconds(num); Plugin.instance.CodeSent = false; } if (RapidFire.LoopBreakers()) { yield break; } } if (!Bools.KeepSendingCodes()) { Plugin.GC.LogInfo((object)"end of rapidFire...."); } if (!RapidFire.startRapidFire && Bools.KeepSendingCodes() && !Bools.endAllCodes) { RapidFire.ReturnFromRapidFire(); RapidFire.startRapidFire = false; rapidFireStart = false; } else { _ = Bools.endAllCodes; RapidFire.startRapidFire = false; rapidFireStart = false; } } else { RapidFire.startRapidFire = false; rapidFireStart = false; } } internal static IEnumerator EmptyShip() { Plugin.MoreLogs("Emptying the ship of any players!"); PlayerControllerB localPlayer = StartOfRound.Instance.localPlayerController; Vector3 playerPosition = ((Component)localPlayer).transform.position; Vector3 shipDoorPosition = StartOfRound.Instance.shipDoorNode.position; float oldfriction = localPlayer.slideFriction; localPlayer.isPlayerSliding = true; localPlayer.slideFriction = localPlayer.maxSlideFriction * 2f; while (localPlayer.isInHangarShipRoom) { if (Physics.Linecast(playerPosition, shipDoorPosition, StartOfRound.Instance.collidersAndRoomMask)) { Vector3 val = Vector3.Normalize(shipDoorPosition - playerPosition); localPlayer.externalForces = val * 350f; Plugin.MoreLogs("applying external forces"); } yield return (object)new WaitForSeconds(0.1f); } localPlayer.isPlayerSliding = false; localPlayer.slideFriction = oldfriction; } internal static IEnumerator GhostGirlEnhanced(StartOfRound instance) { Plugin.MoreLogs("GhostGirl is being enhanced"); if (RapidFire.startRapidFire) { yield break; } while (Plugin.instance.DressGirl.staringInHaunt) { float num = Random.Range(1f, 4f); if (!Plugin.instance.CodeSent && !DressGirl.girlIsChasing) { CodeHandling.HandleGhostCodeSending(instance); Plugin.instance.CodeSent = true; } else { Plugin.GC.LogInfo((object)$"ghostCode was just sent, waiting {num}"); yield return (object)new WaitForSeconds(num); Plugin.instance.CodeSent = false; } if (RapidFire.LoopBreakers()) { yield break; } } Plugin.MoreLogs("End of GhostGirlEnhanced Coroutine..."); } } internal class Doors { internal static List<DoorLock> AllDoors = new List<DoorLock>(); internal static bool CustomHauntRunning = false; internal static Random Rand = new Random(); internal static void UpdateCacheDoorsList() { AllDoors = Object.FindObjectsOfType<DoorLock>().ToList(); } internal static void OpenOrCloseALLDoors() { Plugin.MoreLogs("All doors changing state"); for (int i = 0; i < AllDoors.Count; i++) { if (!((Object)(object)AllDoors[i] == (Object)null)) { AllDoors[i].OpenOrCloseDoor(StartOfRound.Instance.localPlayerController); } } Plugin.MoreLogs($"All {AllDoors.Count} doors have been opened or closed"); } internal static void OpenorClose1RandomDoor() { if (AllDoors.Count != 0) { int @int = NumberStuff.GetInt(0, AllDoors.Count); if (!((Object)(object)AllDoors[@int] == (Object)null)) { AllDoors[@int].OpenOrCloseDoor(StartOfRound.Instance.localPlayerController); Plugin.MoreLogs("Opened or Closed one door"); } } } internal static void LockorUnlockARandomDoor(bool stateLocked) { if (AllDoors.Count == 0) { return; } for (int i = 0; i < AllDoors.Count; i++) { int @int = NumberStuff.GetInt(0, AllDoors.Count); if (!((Object)(object)AllDoors[@int] == (Object)null)) { if (AllDoors[@int].isLocked && stateLocked) { AllDoors[@int].UnlockDoorServerRpc(); Plugin.MoreLogs("Unlocked random door"); break; } if (!AllDoors[@int].isLocked && !stateLocked) { AllDoors[@int].LockDoor(30f); Plugin.MoreLogs("Locked random door"); break; } } } } internal static void HauntDoors(int value) { if (AllDoors.Count == 0) { return; } float num = (float)value / 100f; Plugin.MoreLogs($"Attempting to Haunt {value}% of doors!"); float num2 = ((value != 0) ? ((float)AllDoors.Count * num) : 1f); for (int i = 0; i < (int)num2; i++) { if (!((Object)(object)AllDoors[i] == (Object)null)) { MonoBehaviour component = ((Component)AllDoors[i]).gameObject.GetComponent<MonoBehaviour>(); component.StopAllCoroutines(); component.StartCoroutine(CustomDoorHaunt(AllDoors[i])); } } Plugin.MoreLogs($"Attempted to haunt {(int)num2} doors!"); } internal static IEnumerator CustomDoorHaunt(DoorLock thisDoor) { int times = Rand.Next(9); for (int i = 0; i < times; i++) { float num = ((!thisDoor.isDoorOpened && Rand.Next(100) >= 92) ? Random.Range(2f, 7f) : ((!thisDoor.isDoorOpened) ? Random.Range(0.2f, 1.7f) : Random.Range(0.15f, 0.3f))); yield return (object)new WaitForSeconds(num); thisDoor.OpenOrCloseDoor(StartOfRound.Instance.localPlayerController); } yield return (object)new WaitForSeconds(0.2f); if (thisDoor.isDoorOpened) { thisDoor.OpenOrCloseDoor(StartOfRound.Instance.localPlayerController); } } } public class GamePatchStuff { [HarmonyPatch(typeof(StartOfRound), "PassTimeToNextDay")] public class NextDayPatch { private static void Postfix() { Plugin.Spam("Next day detected!"); OpenLibEvents.GhostCodesReset.Invoke(); } } [HarmonyPatch(typeof(TerminalAccessibleObject), "Start")] public class TerminalAccessibleObject_StartPatch { private static void Postfix(TerminalAccessibleObject __instance) { CodeStuff.NewUsableCode(__instance); } } [HarmonyPatch(typeof(TerminalAccessibleObject), "OnDestroy")] public class TerminalAccessibleObject_DestroyPatch { private static void Postfix(TerminalAccessibleObject __instance) { CodeStuff.RemoveUsableCode(__instance); } } [HarmonyPatch(/*Could not decode attribute arguments.*/)] public class ApparatusPullPatch { private static bool instructionAdded; [HarmonyTranspiler] private static IEnumerable<CodeInstruction> ApparatusPullPatch_Transpiler(IEnumerable<CodeInstruction> instructions) { CodeInstruction myMethod = CodeInstruction.Call("ghostCodes.Patches.OpenLibEvents:GetInvoke", (Type[])null, (Type[])null); foreach (CodeInstruction instruction in instructions) { if (!instructionAdded) { Plugin.GC.LogInfo((object)"Custom Instruction added in DisconnectFromMachinery enumerator"); yield return myMethod; yield return instruction; instructionAdded = true; } else { yield return instruction; } } Plugin.GC.LogInfo((object)"Transpiler Success! - Added ApparatusPull Invoke Event"); } } [HarmonyPatch(typeof(DressGirlAI), "Start")] public class DressGirlExists : DressGirlAI { private static void Postfix(DressGirlAI __instance) { Plugin.instance.DressGirl = __instance; Plugin.MoreLogs("Dressgirl instance detected."); } protected override void __initializeVariables() { ((DressGirlAI)this).__initializeVariables(); } protected internal override string __getTypeName() { return "DressGirlExists"; } } [HarmonyPatch(typeof(DressGirlAI), "SetHauntStarePosition")] public class StaringInHauntPatch : DressGirlAI { private static void Postfix(DressGirlAI __instance) { if (!(SetupConfig.GhostCodesSettings.CurrentMode.ToLower() != "hauntings")) { if ((Object)(object)__instance == (Object)null) { Plugin.GC.LogError((object)"Failed to grab dressgirl instance"); } else if (__instance.staringInHaunt && Bools.CanSendCodes() && Bools.DressGirlStartCodes()) { Plugin.instance.DressGirl = __instance; Plugin.GC.LogInfo((object)"The ghostGirl wants to play!"); ((MonoBehaviour)Plugin.instance.DressGirl).StartCoroutine(Coroutines.GhostGirlEnhanced(StartOfRound.Instance)); } } } protected override void __initializeVariables() { ((DressGirlAI)this).__initializeVariables(); } protected internal override string __getTypeName() { return "StaringInHauntPatch"; } } [HarmonyPatch(typeof(DressGirlAI), "FlipLightsBreakerServerRpc")] public class DressGirlRPCFix : DressGirlAI { private static void Postfix(DressGirlAI __instance) { if (SetupConfig.FixGhostGirlBreakers.Value) { Plugin.MoreLogs("Fixing lightbreaker Rpc"); __instance.FlipLightsBreakerClientRpc(); } } protected override void __initializeVariables() { ((DressGirlAI)this).__initializeVariables(); } protected internal override string __getTypeName() { return "DressGirlRPCFix"; } } [HarmonyPatch(typeof(DressGirlAI), "BeginChasing")] public class TheChaseBegins { private static void Postfix(DressGirlAI __instance) { DressGirl.BreakersFix(__instance); if (!(SetupConfig.GhostCodesSettings.CurrentMode.ToLower() != "hauntings")) { RapidFire.startRapidFire = true; DressGirl.girlIsChasing = true; Plugin.MoreLogs("Girl has begun chasing, setting rapidFire to TRUE"); ((MonoBehaviour)StartOfRound.Instance).StartCoroutine(Coroutines.RapidFireStart(StartOfRound.Instance)); } } } [HarmonyPatch(typeof(DressGirlAI), "StopChasing")] public class TheChaseEnds : DressGirlAI { private static void Postfix() { if (!(SetupConfig.GhostCodesSettings.CurrentMode.ToLower() != "hauntings")) { RapidFire.startRapidFire = false; DressGirl.girlIsChasing = false; Plugin.MoreLogs("Chase sequence has ended."); } } protected override void __initializeVariables() { ((DressGirlAI)this).__initializeVariables(); } protected internal override string __getTypeName() { return "TheChaseEnds"; } } [HarmonyPatch(typeof(VehicleController), "Awake")] public class GetVehicleController { private static void Postfix(VehicleController __instance) { Plugin.instance.Cruiser = __instance; Plugin.MoreLogs("Cruiser instance detected."); } } } internal class DressGirl : EnemyAI { internal static bool girlIsChasing; internal static void InitDressGirl() { Plugin.MoreLogs("Resetting DressGirl Variables..."); girlIsChasing = false; Plugin.instance.DressGirl = null; } internal static void ChangeHauntedPlayer(PlayerControllerB player) { Plugin.instance.DressGirl.hauntingPlayer = player; ((EnemyAI)Plugin.instance.DressGirl).ChangeOwnershipOfEnemy(Plugin.instance.DressGirl.hauntingPlayer.actualClientId); Plugin.instance.DressGirl.hauntingLocalPlayer = (Object)(object)GameNetworkManager.Instance.localPlayerController == (Object)(object)Plugin.instance.DressGirl.hauntingPlayer; } internal static void GGrapidFireChecks() { if (!((Object)(object)Plugin.instance.DressGirl == (Object)null) && SetupConfig.GhostCodesSettings.HauntingsMode) { Plugin.MoreLogs("Checking for rapidFire ending events"); DancingCheck(); ShowerStuff.CheckForHauntedPlayerInShower(); } } private static void DancingCheck() { if (InteractionsConfig.EmoteStopChasing.Value > 1 || !girlIsChasing) { return; } if (!Bools.IsThisEffective(InteractionsConfig.EmoteStopChasing.Value)) { Plugin.MoreLogs("Ghost girl doesn't want to see you dance!"); return; } int numberPlayersEmoting = NumberStuff.GetNumberPlayersEmoting(); int alivePlayers = NumberStuff.GetAlivePlayers(); if (Bools.AreEnoughPlayersDancing(alivePlayers, numberPlayersEmoting, InteractionsConfig.EmoteStopChaseRequiredPlayers.Value)) { Plugin.MoreLogs("Enough players emoting, stopping chase"); StopGirlFromChasing(); } else { Plugin.MoreLogs("You might wanna keep running..."); } } internal static void StopGirlFromChasing() { if (!((Object)(object)Plugin.instance.DressGirl == (Object)null) && Plugin.instance.DressGirl.hauntingLocalPlayer) { Plugin.instance.DressGirl.StopChasing(); Plugin.MoreLogs("initiating stop chase."); } } internal static void GirlDisappear() { if (!((Object)(object)Plugin.instance.DressGirl == (Object)null) && Plugin.instance.DressGirl.hauntingLocalPlayer) { Plugin.instance.DressGirl.DisappearDuringHaunt(); } } internal static void EndAllGirlStuff() { if (girlIsChasing) { StopGirlFromChasing(); } if (Plugin.instance.DressGirl.staringInHaunt) { GirlDisappear(); } } internal static void BreakersFix(DressGirlAI instance) { if (SetupConfig.FixGhostGirlBreakers.Value && ((EnemyAI)instance).currentBehaviourStateIndex != 1 && instance.timesChased == 1 && Random.Range(0, 100) < SetupConfig.VanillaBreakersChance.Value) { instance.FlipLightsBreakerServerRpc(); Plugin.GC.LogInfo((object)"patched updated breaker chance for vanilla"); } } protected override void __initializeVariables() { ((EnemyAI)this).__initializeVariables(); } protected internal override string __getTypeName() { return "DressGirl"; } } internal class InitPlugin { internal static void StartTheRound() { if (!(((Object)StartOfRound.Instance.currentLevel).name == "CompanyBuildingLevel") && !(StartOfRound.Instance.currentLevel.riskLevel == "Safe")) { InitMode(); BaseReset(); DressGirl.InitDressGirl(); StartPlugin(); Lights.InitLights(); } } private static void StartPlugin() { if (Bools.ShouldInitPlugin()) { ((MonoBehaviour)StartOfRound.Instance).StartCoroutine(Coroutines.InitEnumerator(StartOfRound.Instance)); } } internal static void RestartPlugin() { if (Bools.ShouldInitPlugin()) { ((MonoBehaviour)StartOfRound.Instance).StartCoroutine(Coroutines.RestartEnum(StartOfRound.Instance)); } } internal static void InitMode() { Plugin.MoreLogs("Initializing ghostCodes mode settings"); SetupConfig.GhostCodesSettings.UpdateSettings(StartOfRound.Instance.currentLevel); } internal static void BaseReset() { Bools.appPullInvoked = false; Plugin.instance.CodeSent = false; RapidFire.startRapidFire = false; Coroutines.rapidFireStart = false; Coroutines.codeLooperStarted = false; Plugin.instance.MaxSanity = 0f; Plugin.instance.GroupSanity = 0f; GetPlayersAtStart(); Plugin.instance.CodeCount = 0; Plugin.instance.RandCodeAmount = 0; ShipStuff.ResetLever(); TerminalAdditions.RestoreCreds(); } internal static void CodesInit() { Plugin.MoreLogs("Initializing GhostCode core variables"); Bools.endAllCodes = false; TerminalAdditions.ResetBools(); Doors.UpdateCacheDoorsList(); Plugin.instance.RandCodeAmount = NumberStuff.GetInt(SetupConfig.MinCodes.Value, SetupConfig.MaxCodes.Value); if (SetupConfig.SoloAssist.Value) { InsanityStuff.InitsoloAssist(); } } internal static void GetPlayersAtStart() { Plugin.instance.playersAtStart = 0; Plugin.instance.players = StartOfRound.Instance.allPlayerScripts; for (int i = 0; i < StartOfRound.Instance.allPlayerScripts.Count(); i++) { if (StartOfRound.Instance.allPlayerScripts[i].isPlayerControlled) { Plugin.instance.playersAtStart++; } } Plugin.MoreLogs($"Players at Start: {Plugin.instance.playersAtStart}"); if (Plugin.instance.playersAtStart > 1) { Plugin.MoreLogs("SoloAssist Buff disabled, more than one player detected."); } } } internal class InsanityStuff { internal static Dictionary<string, ConfigEntry<int>> stageKeyVal = new Dictionary<string, ConfigEntry<int>>(); internal static Stages stage1 = SetStageInfo("Stage 1", 0, 6, SoloAssistConfig.S1percent, SoloAssistConfig.S1inside, SoloAssistConfig.S1outside); internal static Stages stage2 = SetStageInfo("Stage 2", 7, 10, SoloAssistConfig.S2percent, SoloAssistConfig.S2inside, SoloAssistConfig.S2outside); internal static Stages stage3 = SetStageInfo("Stage 3", 11, 15, SoloAssistConfig.S3percent, SoloAssistConfig.S3inside, SoloAssistConfig.S3outside); internal static List<Stages> allStages = new List<Stages>(); public static void ApplyInsanityMode(StartOfRound instance, ref float randomWaitNum) { GetAllSanity(); float groupSanity = Plugin.instance.GroupSanity; float maxSanity = Plugin.instance.MaxSanity; if (RapidFire.startRapidFire && SetupConfig.RapidFireMaxHours.Value > 0) { Plugin.GC.LogInfo((object)"max insanity level reached!!! startRapidFire TRUE"); ((MonoBehaviour)instance).StartCoroutine(Coroutines.RapidFireStart(instance)); } else { AdjustWaitNum(groupSanity, maxSanity, ref randomWaitNum); Plugin.MoreLogs($"waiting {randomWaitNum}"); } } internal static void InitsoloAssist() { allStages.Clear(); allStages.Add(stage1); allStages.Add(stage2); allStages.Add(stage3); } internal static void GetAllSanity() { Plugin.instance.GroupSanity = 0f; Plugin.instance.MaxSanity = 0f; for (int i = 0; i < StartOfRound.Instance.allPlayerScripts.Count(); i++) { if (!StartOfRound.Instance.allPlayerScripts[i].isPlayerDead && StartOfRound.Instance.allPlayerScripts[i].isPlayerControlled) { Plugin.instance.GroupSanity += StartOfRound.Instance.allPlayerScripts[i].insanityLevel; Plugin.instance.MaxSanity += StartOfRound.Instance.allPlayerScripts[i].maxInsanityLevel; } } float groupSanity = Plugin.instance.GroupSanity; ApplyBonuses(ref groupSanity, Plugin.instance.MaxSanity); Plugin.instance.GroupSanity = groupSanity; CheckSanityRapidFire(); } private static void CheckSanityRapidFire() { if (SetupConfig.RapidFireMaxHours.Value >= 1) { if (Mathf.Round(Plugin.instance.GroupSanity) >= Mathf.Round(Plugin.instance.MaxSanity) * ((float)InsanityConfig.SanityMaxLevel.Value / 100f)) { RapidFire.startRapidFire = true; Plugin.MoreLogs("max sanity hit, CheckSanityRapidFire()"); Plugin.MoreLogs($"Group Sanity Level: {Mathf.Round(Plugin.instance.GroupSanity)}"); Plugin.MoreLogs($"Group Max Insanity level: {Mathf.Round(Plugin.instance.MaxSanity)}"); } else { RapidFire.startRapidFire = false; Plugin.MoreLogs($"Group Sanity Level: {Mathf.Round(Plugin.instance.GroupSanity)}"); Plugin.MoreLogs($"Group Max Insanity level: {Mathf.Round(Plugin.instance.MaxSanity)}"); } } } private static float AdjustWaitNum(float groupSanity, float maxSanity, ref float randomWaitNum) { if (SetupConfig.RapidFireMaxHours.Value < 1 && Mathf.Round(groupSanity) >= Mathf.Round(maxSanity) * ((float)InsanityConfig.SanityMaxLevel.Value / 100f)) { randomWaitNum *= (float)InsanityConfig.WaitMaxLevel.Value / 100f; Plugin.MoreLogs("Max Insanity Level reached (rapidFire disabled)"); return randomWaitNum; } if (Mathf.Round(groupSanity) >= Mathf.Round(maxSanity) * ((float)InsanityConfig.SanityLevel3.Value / 100f)) { randomWaitNum *= (float)InsanityConfig.WaitLevel3.Value / 100f; Plugin.MoreLogs("insanity level 3 reached"); return randomWaitNum; } if (Mathf.Round(groupSanity) >= Mathf.Round(maxSanity) * ((float)InsanityConfig.SanityLevel2.Value / 100f)) { randomWaitNum *= (float)InsanityConfig.WaitLevel2.Value / 100f; Plugin.MoreLogs("insanity level 2 reached"); return randomWaitNum; } if (Mathf.Round(groupSanity) >= Mathf.Round(maxSanity) * ((float)InsanityConfig.SanityLevel1.Value / 100f)) { randomWaitNum *= (float)InsanityConfig.WaitLevel1.Value / 100f; Plugin.MoreLogs("insanity level 1 reached"); return randomWaitNum; } Plugin.MoreLogs("insanity levels low"); return randomWaitNum; } private static Tuple<float, float> ApplyBonuses(ref float groupSanity, float maxSanity) { Plugin.MoreLogs($"Applying bonuses & debuffs\nplayersAtStart = {Plugin.instance.playersAtStart}"); if (SetupConfig.SoloAssist.Value && Plugin.instance.playersAtStart == 1) { Plugin.MoreLogs("SoloAssist Activated"); groupSanity = SoloAssist(ref groupSanity, maxSanity); } if (InsanityConfig.DeathBonus.Value > 0) { Plugin.MoreLogs("Death Bonus Activated"); groupSanity = ApplyDeathBonus(ref groupSanity, maxSanity); } if (InsanityConfig.GhostGirlBonus.Value > 0 && (Object)(object)Plugin.instance.DressGirl != (Object)null) { Plugin.MoreLogs("Ghost Girl Bonus Activated"); groupSanity = ApplyGirlBonus(ref groupSanity, maxSanity); } if (InsanityConfig.EmoteBuff.Value > 1) { Plugin.MoreLogs("Emote Buff Activated"); groupSanity = EmoteBuff(ref groupSanity); } return Tuple.Create(groupSanity, maxSanity); } private static float ApplyDeathBonus(ref float groupSanity, float maxSanity) { int num = Plugin.instance.players.Count((PlayerControllerB player) => player.isPlayerDead && player.isPlayerControlled); for (int i = 0; i < num; i++) { float num2 = groupSanity * ((float)InsanityConfig.DeathBonus.Value / 100f); Plugin.MoreLogs($"Dead Player detected. Adding {num2} to group sanity"); groupSanity = ApplyBonus(groupSanity, maxSanity, num2, (float _) => true); } Plugin.MoreLogs("Death bonus applied to insanity values"); return groupSanity; } private static float ApplyGirlBonus(ref float groupSanity, float maxSanity) { Plugin.MoreLogs("Ghost Girl Bonus applied to insanity values"); float num = groupSanity * ((float)InsanityConfig.GhostGirlBonus.Value / 100f); Plugin.MoreLogs($"Ghost Girl Bonus adding {num} to group sanity"); groupSanity = ApplyBonus(groupSanity, maxSanity, num, (float _) => true); return groupSanity; } private static float ApplyBonus(float groupSanity, float maxSanity, float bonusValue, Func<float, bool> condition) { if (condition(groupSanity) && maxSanity >= groupSanity + bonusValue) { groupSanity += bonusValue; } return groupSanity; } private static Stages SetStageInfo(string name, int startHour, int endHour, ConfigEntry<int> percentKey, ConfigEntry<int> insideKey, ConfigEntry<int> outsideKey) { return new Stages { Name = name, StartHour = startHour, EndHour = endHour, PercentKey = percentKey, InsideKey = insideKey, OutsideKey = outsideKey }; } private static float EmoteBuff(ref float groupSanity) { if (InsanityConfig.EmoteBuff.Value > 0) { PlayerControllerB[] players = Plugin.instance.players; foreach (PlayerControllerB val in players) { if (!val.isPlayerDead && val.performingEmote) { float num = groupSanity * ((float)InsanityConfig.EmoteBuff.Value / 100f); Plugin.MoreLogs($"Emote buff removing {num} from group sanity"); ApplySanityDebuff(ref groupSanity, num); } } } return groupSanity; } private static float SoloAssist(ref float groupSanity, float maxSanity) { if (SetupConfig.SoloAssist.Value && Plugin.instance.playersAtStart == 1) { int hour = TimeOfDay.Instance.hour; Plugin.GC.LogInfo((object)$"Hour: {hour}"); foreach (Stages allStage in allStages) { if (Bools.IsHourInRange(hour, allStage.StartHour, allStage.EndHour)) { float num = maxSanity * ((float)allStage.PercentKey.Value / 100f); float num2 = (Bools.IsInsideFactory() ? allStage.InsideKey.Value : allStage.OutsideKey.Value); Plugin.MoreLogs($"threshold: {num}, debuffAmount: {num2}, GroupSanity: {groupSanity}"); if (groupSanity >= num) { ApplySanityDebuff(ref groupSanity, num2); Plugin.MoreLogs(allStage.Name + " detected and debuffs applied"); } else { Plugin.MoreLogs("No solo assist buff added."); } break; } } } return groupSanity; } private static void ApplySanityDebuff(ref float groupSanity, float debuffAmount) { if (groupSanity > debuffAmount) { groupSanity -= debuffAmount; Plugin.GC.LogInfo((object)$"Subtracted {debuffAmount} from Group Sanity Level."); } else { groupSanity = 0f; Plugin.GC.LogInfo((object)$"Subtracted {debuffAmount} from Group Sanity Level which set value to 0."); } } } internal class Stages { internal string Name { get; set; } internal int StartHour { get; set; } internal int EndHour { get; set; } internal ConfigEntry<int> PercentKey { get; set; } internal ConfigEntry<int> InsideKey { get; set; } internal ConfigEntry<int> OutsideKey { get; set; } } internal class Lights { internal static bool activeLightsColor = false; internal static bool warningLights = false; internal static List<Light> allLightsFixed = new List<Light>(); internal static List<Animator> allPoweredLights = new List<Animator>(); internal static bool activeFlicker = false; internal static void InitLights() { activeLightsColor = false; warningLights = false; activeFlicker = false; allLightsFixed = new List<Light>(); allPoweredLights = new List<Animator>(); if (RoundManager.Instance.allPoweredLightsAnimators.Count == 0) { Plugin.WARNING("INTERIOR HAS NO POWERED LIGHT ANIMATORS!!!"); Plugin.WARNING("INTERIOR HAS NO POWERED LIGHT ANIMATORS!!!"); Plugin.WARNING("INTERIOR HAS NO POWERED LIGHT ANIMATORS!!!"); Plugin.WARNING("INTERIOR HAS NO POWERED LIGHT ANIMATORS!!!"); GameObject val = GameObject.Find("Systems/LevelGeneration"); if ((Object)(object)val != (Object)null) { allLightsFixed = val.GetComponentsInChildren<Light>(true).ToList(); Plugin.Spam($"Got [ {allLightsFixed.Count} ] lights from dungeon root!"); } else { Plugin.WARNING("Unable to get dungeonRoot lights!"); } } foreach (Animator allPoweredLightsAnimator in RoundManager.Instance.allPoweredLightsAnimators) { if ((Object)(object)((Component)allPoweredLightsAnimator).GetComponentInChildren<Light>(true) != (Object)null) { allPoweredLights.Add(allPoweredLightsAnimator); } List<Light> collection = ((Component)allPoweredLightsAnimator).GetComponentsInChildren<Light>(true).ToList(); allLightsFixed.AddRange(collection); } } internal static void GGFlashlight() { NetHandler.Instance.FlickerLightsServerRpc(flickerFlash: true, disableFlash: false); Plugin.MoreLogs("nosfaratu is that you??"); } internal static void FlipLights() { Plugin.MoreLogs("who turned out the lights??"); NetHandler.Instance.FacilityBreakerServerRpc(); } internal static IEnumerator ColorTransition(Light light, Color newColor, float duration) { //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) Color init = light.color; float counter = 0f; while (counter < duration) { counter += Time.deltaTime; float num = Mathf.Clamp01(counter / duration); light.color = Color.Lerp(init, newColor, num); yield return null; } } internal static IEnumerator PoweredLightsColor(PlayerControllerB HauntedPlayer) { if (activeLightsColor || SetupConfig.RapidLightsColorValue.Value.ToLower() == "nochange" || SetupConfig.RapidLightsColorValue.Value.ToLower() == "default" || SetupConfig.RapidLightsColorValue.Value.Length == 0) { yield break; } if (allLightsFixed.Count == 0) { Plugin.WARNING("NO LIGHTS DETECTED!"); Plugin.WARNING("NO LIGHTS DETECTED!"); Plugin.WARNING("NO LIGHTS DETECTED!"); yield break; } activeLightsColor = true; Plugin.Spam($"allLightsFixed Count: {allLightsFixed.Count}"); Dictionary<Light, Color> allLightsColors = new Dictionary<Light, Color>(); Color32 val = Color32.op_Implicit(Misc.HexToColor(SetupConfig.RapidLightsColorValue.Value)); for (int i = 0; i < allLightsFixed.Count; i++) { if (!allLightsColors.ContainsKey(allLightsFixed[i])) { allLightsColors.Add(allLightsFixed[i], allLightsFixed[i].color); } ((MonoBehaviour)StartOfRound.Instance).StartCoroutine(ColorTransition(allLightsFixed[i], Color32.op_Implicit(val), 5f)); } warningLights = true; Plugin.MoreLogs("Alarm lights set"); while (warningLights && Bools.PlayerStillAliveAndControlled(HauntedPlayer)) { yield return (object)new WaitForEndOfFrame(); } if (warningLights) { warningLights = false; } yield return (object)new WaitForSeconds(1f); for (int j = 0; j < allLightsFixed.Count; j++) { if (allLightsColors.TryGetValue(allLightsFixed[j], out var value)) { ((MonoBehaviour)StartOfRound.Instance).StartCoroutine(ColorTransition(allLightsFixed[j], value, 3f)); } else { Plugin.WARNING("Unable to get original light color!"); } } Plugin.MoreLogs("Lights set back to normal"); activeLightsColor = false; } internal static IEnumerator WhileLightsFlicker() { if (Bools.lightsFlickering || warningLights) { while (RapidFire.startRapidFire && !StartOfRound.Instance.localPlayerController.isPlayerDead && !Bools.endAllCodes) { yield return (object)new WaitForEndOfFrame(); } Plugin.Spam("End of LightsFlicker Coroutine!"); NetHandler.Instance.EndRapidFireLightsServerRpc(); } } internal static IEnumerator FlickerPoweredLights(PlayerControllerB HauntedPlayer) { if (Bools.lightsFlickering) { yield break; } if (allPoweredLights.Count == 0) { Plugin.WARNING("No powered lights!"); Plugin.WARNING("No powered lights!"); Plugin.WARNING("No powered lights!"); yield break; } Bools.lightsFlickering = true; Plugin.Spam("FlickerPoweredLights"); while (Bools.lightsFlickering && Bools.PlayerStillAliveAndControlled(HauntedPlayer)) { int num = 0; int maxLights = ((allPoweredLights.Count > 200) ? 85 : ((allPoweredLights.Count > 100) ? 50 : ((allPoweredLights.Count <= 50) ? 9 : 15))); foreach (Animator allPoweredLight in allPoweredLights) { if (num < maxLights) { allPoweredLight.SetTrigger("Flicker"); num++; } else { yield return (object)new WaitForSeconds(0.05f); num = 0; } } yield return (object)new WaitForSeconds(Random.Range(SetupConfig.RapidLightsMin.Value, SetupConfig.RapidLightsMax.Value)); } if (Bools.lightsFlickering) { Bools.lightsFlickering = false; } Plugin.Spam("EndAlarmLights"); yield return (object)new WaitForSeconds(0.3f); RoundManager.Instance.SwitchPower(true); Bools.lightsFlickering = false; } } internal class Mines { internal static void HandleMineBoom() { if (CodeStuff.myTerminalObjects.Count == 0) { return; } List<TerminalAccessibleObject> list = CodeStuff.myTerminalObjects.FindAll((TerminalAccessibleObject m) => (Object)(object)((Component)m).gameObject.GetComponent<Landmine>() != (Object)null && !((Component)m).gameObject.GetComponent<Landmine>().hasExploded); if (list.Count > 0) { int index = NumberStuff.Rand.Next(list.Count); Landmine component = ((Component)list[index]).gameObject.GetComponent<Landmine>(); if (!component.hasExploded) { component.ExplodeMineClientRpc(); component.ExplodeMineServerRpc(); Plugin.MoreLogs("WHAT THE FUUUUUU-"); } } else { Plugin.Spam("No landmines to go kaboom"); } } } internal class Misc { internal static List<PlayerControllerB> GetAllLivingPlayers() { List<PlayerControllerB> list = new List<PlayerControllerB>(); Plugin.MoreLogs("Getting alive players"); PlayerControllerB[] players = Plugin.instance.players; foreach (PlayerControllerB val in players) { if (!val.isPlayerDead && val.isPlayerControlled) { list.Add(val); } } return list; } internal static void LogTime() { string text = ((TMP_Text)HUDManager.Instance.clockNumber).text; string text2 = text.Replace("\n", "").Replace("\r", ""); Plugin.MoreLogs("TIME: " + text2); } internal static bool TryGetPlayerFromID(ulong playerID, out PlayerControllerB thePlayer) { PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; foreach (PlayerControllerB val in allPlayerScripts) { if (val.actualClientId == playerID) { thePlayer = val; return true; } } thePlayer = null; return false; } } public class NetHandler : NetworkBehaviour { public static NetHandler Instance { get; private set; } [ServerRpc(RequireOwnership = false)] public void BreatheOnWalkiesServerRpc() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost)) { ServerRpcParams val = default(ServerRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(2364017171u, val, (RpcDelivery)0); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 2364017171u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost) && !((Object)(object)Plugin.instance.DressGirl == (Object)null)) { Plugin.MoreLogs("SERVER: ghost breathing on all walkies"); BreatheOnWalkiesClientRpc(); } } } [ClientRpc] public void BreatheOnWalkiesClientRpc() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(3488792323u, val, (RpcDelivery)0); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 3488792323u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost)) { WalkieStuff.BreatheOnWalkiesFunc(); } } } [ServerRpc(RequireOwnership = false)] public void GarbleWalkiesServerRpc() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost)) { ServerRpcParams val = default(ServerRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(1741569032u, val, (RpcDelivery)0); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 1741569032u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost)) { Plugin.MoreLogs("SERVER: garbling all walkies"); GarbleWalkiesClientRpc(); } } } [ClientRpc] public void GarbleWalkiesClientRpc() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(1040546466u, val, (RpcDelivery)0); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 1040546466u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost)) { WalkieStuff.GarbleAllWalkiesFunc(); } } } [ServerRpc(RequireOwnership = false)] public void ChangeDressGirlToPlayerServerRpc(ulong playerID) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost)) { ServerRpcParams val = default(ServerRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(3358268268u, val, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val2, playerID); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 3358268268u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost) && !((Object)(object)Plugin.instance.DressGirl == (Object)null)) { Plugin.MoreLogs($"SERVER: Changing dressgirl to {playerID}"); ChangeDressGirlToPlayerClientRpc(playerID); } } } [ClientRpc] public void ChangeDressGirlToPlayerClientRpc(ulong playerID) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(2732348508u, val, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val2, playerID); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2732348508u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost)) { PlayerControllerB thePlayer; if ((Object)(object)Plugin.instance.DressGirl == (Object)null) { Plugin.MoreLogs("DressGirl instance is null"); } else if (Misc.TryGetPlayerFromID(playerID, out thePlayer)) { Plugin.instance.DressGirl.switchedHauntingPlayer = true; ((MonoBehaviour)Plugin.instance.DressGirl).StartCoroutine(Plugin.instance.DressGirl.setSwitchingHauntingPlayer()); DressGirl.ChangeHauntedPlayer(thePlayer); Plugin.MoreLogs($"Changing haunted player to {playerID}"); } } } [ServerRpc(RequireOwnership = false)] public void FlickerLightsServerRpc(bool flickerFlash, bool disableFlash) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost)) { ServerRpcParams val = default(ServerRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(1489712227u, val, (RpcDelivery)0); ((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref flickerFlash, default(ForPrimitives)); ((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref disableFlash, default(ForPrimitives)); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 1489712227u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost)) { FlickerLightsClientRpc(flickerFlash, disableFlash); } } } [ClientRpc] public void FlickerLightsClientRpc(bool flickerFlash, bool disableFlash) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(976836047u, val, (RpcDelivery)0); ((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref flickerFlash, default(ForPrimitives)); ((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref disableFlash, default(ForPrimitives)); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 976836047u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost)) { RoundManager.Instance.FlickerLights(flickerFlash, disableFlash); } } } [ServerRpc(RequireOwnership = false)] public void StartRapidFireLightsServerRpc(ulong clientID) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost)) { ServerRpcParams val = default(ServerRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(2243429670u, val, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val2, clientID); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 2243429670u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost)) { StartRapidFireLightsClientRpc(clientID); } } } [ClientRpc] public void StartRapidFireLightsClientRpc(ulong clientID) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(3441652457u, val, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val2, clientID); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 3441652457u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost) && Misc.TryGetPlayerFromID(clientID, out var thePlayer)) { Plugin.Spam("Starting RapidFireLight sequence from - " + thePlayer.playerUsername); ((MonoBehaviour)StartOfRound.Instance).StartCoroutine(Lights.PoweredLightsColor(thePlayer)); ((MonoBehaviour)StartOfRound.Instance).StartCoroutine(Lights.FlickerPoweredLights(thePlayer)); } } } [ServerRpc(RequireOwnership = false)] public void EndRapidFireLightsServerRpc() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost)) { ServerRpcParams val = default(ServerRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(801715303u, val, (RpcDelivery)0); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 801715303u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost)) { EndRapidFireLightsClientRpc(); } } } [ClientRpc] public void EndRapidFireLightsClientRpc() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(1901599655u, val, (RpcDelivery)0); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 1901599655u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost)) { Bools.lightsFlickering = false; Lights.warningLights = false; } } } [ServerRpc(RequireOwnership = false)] public void FacilityBreakerServerRpc() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost)) { ServerRpcParams val = default(ServerRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(1805593341u, val, (RpcDelivery)0); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 1805593341u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost)) { FacilityBreakerClientRpc(); } } } [ClientRpc] public void FacilityBreakerClientRpc() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(1895890339u, val, (RpcDelivery)0); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 1895890339u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage != 2 || (!networkManager.IsClient && !networkManager.IsHost)) { return; } BreakerBox val3 = Object.FindObjectOfType<BreakerBox>(); if ((Object)(object)val3 != (Object)null) { Plugin.GC.LogInfo((object)"flipping facility breaker for this client"); if (val3.isPowerOn) { val3.SetSwitchesOff(); RoundManager.Instance.TurnOnAllLights(false); GameNetworkManager.Instance.localPlayerController.JumpToFearLevel(0.2f, true); } else { val3.SwitchBreaker(true); RoundManager.Instance.TurnOnAllLights(true); } } } [ServerRpc(RequireOwnership = false)] public void ShockTerminalSoundServerRpc() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost)) { ServerRpcParams val = default(ServerRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(1506833215u, val, (RpcDelivery)0); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 1506833215u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost)) { ShockTerminalSoundClientRpc(); } } } [ClientRpc] public void ShockTerminalSoundClientRpc() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(711897171u, val, (RpcDelivery)0); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 711897171u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost)) { SoundSystem.PlayTerminalSound(TerminalAdditions.Shock); } } } [ServerRpc(RequireOwnership = false)] public void BatteryAdjustSoundServerRpc(int clientID) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost)) { ServerRpcParams val = default(ServerRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(1275206633u, val, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val2, clientID); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 1275206633u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost)) { BatteryAdjustSoundClientRpc(clientID); } } } [ClientRpc] public void BatteryAdjustSoundClientRpc(int clientID) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(224827583u, val, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val2, clientID); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 224827583u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost)) { int clientID2 = clientID; PlayerControllerB val3 = Misc.GetAllLivingPlayers().Find((PlayerControllerB x) => (int)x.actualClientId == clientID2); val3.itemAudio.PlayOneShot(Items.Adjuster, 0.8f); } } [ServerRpc(RequireOwnership = false)] public void BatteryAdjustServerRpc(int clientID) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (mi