using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Logging; using GameNetcodeStuff; using HarmonyLib; using LCAutoRevive.Compat; using LCAutoRevive.Input; using LCAutoRevive.Network; using LCAutoRevive.Patches; using LCAutoRevive.Utils; using LethalCompanyInputUtils.Api; using Microsoft.CodeAnalysis; using TMPro; using Tomatobird.AutoRevive.NetcodePatcher; using Unity.Netcode; using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("Tomatobird.AutoRevive")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("0.3.0.0")] [assembly: AssemblyInformationalVersion("0.3.0+435ede64621ad09469983f35c504a8c7e6b3b78a")] [assembly: AssemblyProduct("LCAutoRevive")] [assembly: AssemblyTitle("Tomatobird.AutoRevive")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.3.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] [module: NetcodePatchedAssembly] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace LCAutoRevive { [BepInPlugin("Tomatobird.AutoRevive", "LCAutoRevive", "0.3.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class LCAutoRevive : BaseUnityPlugin { internal static float reviveDelay; internal static bool waitForInput; internal static bool preventShipLeave; internal static float fontSize; internal static float reviveDelayPenalty; internal static int reviveLimit; public static LCAutoRevive Instance { get; private set; } internal static ManualLogSource Logger { get; private set; } internal static Harmony? Harmony { get; set; } private void Awake() { Logger = ((BaseUnityPlugin)this).Logger; if ((Object)(object)Instance == (Object)null) { Instance = this; } reviveDelay = ((BaseUnityPlugin)this).Config.Bind("General", "ReviveDelay", 15f, "Time until reviving is allowed.").Value; reviveDelayPenalty = ((BaseUnityPlugin)this).Config.Bind("General", "ReviveDelayPenalty", 0f, "Increase in revive delay per death. 0 to disable.").Value; reviveLimit = ((BaseUnityPlugin)this).Config.Bind("General", "ReviveLimit", 0, "Amount of revives allowed per day. 0 to disable.").Value; waitForInput = ((BaseUnityPlugin)this).Config.Bind("General", "WaitForInput", true, "Should player revival require pressing the revive button after timer is up?").Value; preventShipLeave = ((BaseUnityPlugin)this).Config.Bind("General", "PreventShipLeave", true, "Should ship leaving be prevented when all players are dead? Ship will leave anyway if no players have revives left.").Value; fontSize = ((BaseUnityPlugin)this).Config.Bind("General", "FontSize", 24f, "Size of the revive timer text.").Value; Patch(); Logger.LogInfo((object)"Tomatobird.AutoRevive v0.3.0 has loaded!"); } internal static void Patch() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected O, but got Unknown if (Harmony == null) { Harmony = new Harmony("Tomatobird.AutoRevive"); } Logger.LogDebug((object)"Patching..."); Harmony.PatchAll(typeof(GameNetworkManagerPatch)); Harmony.PatchAll(typeof(HUDPatcher)); Harmony.PatchAll(typeof(PlayerControllerBPatcher)); Harmony.PatchAll(typeof(StartOfRoundPatcher)); Logger.LogDebug((object)"Finished patching!"); } internal static void Unpatch() { Logger.LogDebug((object)"Unpatching..."); Harmony? harmony = Harmony; if (harmony != null) { harmony.UnpatchSelf(); } Logger.LogDebug((object)"Finished unpatching!"); } } public static class MyPluginInfo { public const string PLUGIN_GUID = "Tomatobird.AutoRevive"; public const string PLUGIN_NAME = "LCAutoRevive"; public const string PLUGIN_VERSION = "0.3.0"; } } namespace LCAutoRevive.Utils { internal class HUDHandler : MonoBehaviour { [CompilerGenerated] private sealed class d__16 : IEnumerator, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public HUDHandler <>4__this; private float 5__1; private float 5__2; private PlayerControllerB[] <>s__3; private int <>s__4; private PlayerControllerB 5__5; object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public d__16(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>s__3 = null; 5__5 = null; <>1__state = -2; } private bool MoveNext() { //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Expected O, but got Unknown //IL_01cf: Unknown result type (might be due to invalid IL or missing references) //IL_01d4: Unknown result type (might be due to invalid IL or missing references) switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>4__this.isRunning = true; 5__1 = ((LCAutoRevive.reviveDelayPenalty >= 0f) ? (LCAutoRevive.reviveDelay + LCAutoRevive.reviveDelayPenalty * (float)<>4__this.reviveCount) : LCAutoRevive.reviveDelay); 5__2 = 0.1f; break; case 1: <>1__state = -1; if (5__2 > 0f) { 5__2 -= Time.deltaTime; break; } if (StartOfRound.Instance.shipIsLeaving || StartOfRound.Instance.inShipPhase) { ((TMP_Text)<>4__this.text).text = <>4__this.EditText("", showRevives: false); <>4__this.isRunning = false; <>4__this.reviveCount = 0; return false; } 5__2 = 0.1f; 5__1 -= 0.1f + (5__2 - 0.1f) + Time.deltaTime; ((TMP_Text)<>4__this.text).text = <>4__this.EditText($"Reviving... {Mathf.CeilToInt(5__1)}", showRevives: true); break; } if (5__1 >= 0f) { <>2__current = (object)new WaitForEndOfFrame(); <>1__state = 1; return true; } <>4__this.canRevive = true; if (InputUtilsCompat.Enabled && InputUtilsCompat.ReviveKey != null && LCAutoRevive.waitForInput) { ((TMP_Text)<>4__this.text).text = <>4__this.EditText("Press " + InputUtilsCompat.ReviveKey.controls[0].displayName + " to revive", showRevives: true); } else { ((TMP_Text)<>4__this.text).text = <>4__this.EditText("Reviving now", showRevives: true); if (!StartOfRound.Instance.shipIsLeaving && !StartOfRound.Instance.inShipPhase) { <>s__3 = StartOfRound.Instance.allPlayerScripts; for (<>s__4 = 0; <>s__4 < <>s__3.Length; <>s__4++) { 5__5 = <>s__3[<>s__4]; if ((Object)(object)5__5 == (Object)(object)StartOfRound.Instance.localPlayerController && 5__5.isPlayerDead) { NetworkHandler.Instance.RevivePlayerServerRpc((int)5__5.playerClientId); <>4__this.canRevive = false; <>4__this.reviveCount++; break; } 5__5 = null; } <>s__3 = null; } } <>4__this.isRunning = false; return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } internal GameObject deathCountDownTextObject = null; internal GameObject reviveCounterTextObject = null; internal TextMeshProUGUI text = null; internal TextMeshProUGUI reviveText = null; internal bool isRunning = false; internal bool canRevive = false; internal bool isPermaDead = false; internal int reviveCount = 0; private Color textColor = new Color(1f, 0.5647f, 0f, 1f); public static HUDHandler Instance { get; private set; } public void Awake() { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected O, but got Unknown //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Unknown result type (might be due to invalid IL or missing references) //IL_012e: Unknown result type (might be due to invalid IL or missing references) //IL_014e: Unknown result type (might be due to invalid IL or missing references) //IL_016e: Unknown result type (might be due to invalid IL or missing references) //IL_018e: Unknown result type (might be due to invalid IL or missing references) Instance = this; deathCountDownTextObject = new GameObject("ReviveCountDownText"); deathCountDownTextObject.transform.parent = ((Component)HUDManager.Instance.gameOverAnimator).transform.Find("SpectateUI"); text = deathCountDownTextObject.AddComponent(); TMP_FontAsset font = ((TMP_Text)HUDManager.Instance.EndOfRunStatsText).font; if ((Object)(object)font != (Object)null) { ((TMP_Text)text).font = font; } ((Graphic)text).color = textColor; ((TMP_Text)text).alignment = (TextAlignmentOptions)1026; ((Transform)((TMP_Text)text).rectTransform).localScale = Vector3.one; ((TMP_Text)text).rectTransform.anchoredPosition = new Vector2(0f, -170f); ((TMP_Text)text).rectTransform.anchoredPosition3D = new Vector3(0f, -170f, 0f); ((TMP_Text)text).rectTransform.anchorMax = new Vector2(1f, 0f); ((TMP_Text)text).rectTransform.anchorMin = new Vector2(0f, 0f); ((TMP_Text)text).rectTransform.offsetMax = new Vector2(0f, -170f); ((TMP_Text)text).rectTransform.offsetMin = new Vector2(0f, -170f); ((TMP_Text)text).rectTransform.sizeDelta = new Vector2(0f, 0f); ((TMP_Text)text).fontSize = LCAutoRevive.fontSize; ((TMP_Text)text).enableWordWrapping = false; ((TMP_Text)text).text = EditText("Initiating...", showRevives: false); if (InputUtilsCompat.Enabled && InputUtilsCompat.ReviveKey != null && LCAutoRevive.waitForInput) { InputUtilsCompat.ReviveKey.performed += OnActionPerformed; } } public void OnActionPerformed(CallbackContext context) { if (StartOfRound.Instance.shipIsLeaving || StartOfRound.Instance.inShipPhase || !canRevive || !Application.isFocused || (LCAutoRevive.reviveLimit > 0 && reviveCount >= LCAutoRevive.reviveLimit)) { return; } PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; foreach (PlayerControllerB val in allPlayerScripts) { if ((Object)(object)val == (Object)(object)StartOfRound.Instance.localPlayerController && val.isPlayerDead && !val.isTypingChat) { NetworkHandler.Instance.RevivePlayerServerRpc((int)val.playerClientId); canRevive = false; reviveCount++; break; } } } public void StartPlayerRevivalCountDown() { if (isRunning || isPermaDead) { return; } canRevive = false; if (reviveCount >= LCAutoRevive.reviveLimit && LCAutoRevive.reviveLimit > 0) { ((TMP_Text)text).text = EditText("Out of revives", showRevives: false); PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; foreach (PlayerControllerB val in allPlayerScripts) { if ((Object)(object)val == (Object)(object)StartOfRound.Instance.localPlayerController) { NetworkHandler.Instance.PermaDeadPlayerServerRpc((int)val.playerClientId); isPermaDead = true; break; } } } else { ((MonoBehaviour)this).StartCoroutine(WaitForPlayerRevival()); } } [IteratorStateMachine(typeof(d__16))] private IEnumerator WaitForPlayerRevival() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__16(0) { <>4__this = this }; } internal string EditText(string s, bool showRevives) { string text = s; if (LCAutoRevive.reviveLimit > reviveCount && showRevives) { text += $"\nRevives left: {LCAutoRevive.reviveLimit - reviveCount}"; } return text; } internal void ShipLeave() { canRevive = false; reviveCount = 0; if (!((Object)(object)text == (Object)null)) { ((TMP_Text)text).text = EditText("", showRevives: false); } } } public static class RevivePlayer { public static void ReiveDeadPlayer(int playerId) { //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_017d: Unknown result type (might be due to invalid IL or missing references) //IL_0275: Unknown result type (might be due to invalid IL or missing references) //IL_027a: Unknown result type (might be due to invalid IL or missing references) //IL_0530: Unknown result type (might be due to invalid IL or missing references) //IL_0536: Unknown result type (might be due to invalid IL or missing references) //IL_053a: Unknown result type (might be due to invalid IL or missing references) //IL_0540: Unknown result type (might be due to invalid IL or missing references) //IL_0544: Unknown result type (might be due to invalid IL or missing references) //IL_054a: Unknown result type (might be due to invalid IL or missing references) //IL_054e: Unknown result type (might be due to invalid IL or missing references) //IL_0554: Unknown result type (might be due to invalid IL or missing references) //IL_0558: Unknown result type (might be due to invalid IL or missing references) //IL_055e: Unknown result type (might be due to invalid IL or missing references) PlayerControllerB val = StartOfRound.Instance.allPlayerScripts[playerId]; if ((Object)(object)val == (Object)null) { return; } val.ResetPlayerBloodObjects(val.isPlayerDead); if (!val.isPlayerDead) { return; } val.isClimbingLadder = false; if (val.inSpecialInteractAnimation) { bool num = (Object)(object)val.currentTriggerInAnimationWith == (Object)null; InteractTrigger currentTriggerInAnimationWith = val.currentTriggerInAnimationWith; if (!(num | !Object.op_Implicit((Object)(object)((currentTriggerInAnimationWith != null) ? ((Component)currentTriggerInAnimationWith).GetComponentInChildren() : null)))) { goto IL_00d5; } } val.clampLooking = false; ((Component)val.gameplayCamera).transform.localEulerAngles = new Vector3(((Component)val.gameplayCamera).transform.localEulerAngles.x, 0f, ((Component)val.gameplayCamera).transform.localEulerAngles.z); val.inVehicleAnimation = false; goto IL_00d5; IL_00d5: val.overridePoisonValue = false; val.disableMoveInput = false; val.ResetZAndXRotation(); ((Collider)val.thisController).enabled = true; val.health = 100; val.hasBeenCriticallyInjured = false; val.disableLookInput = false; val.disableInteract = false; ((Behaviour)val.nightVisionRadar).enabled = false; if (val.isPlayerDead) { val.isPlayerDead = false; val.enemyWaitingForBodyRagdoll = null; val.isPlayerControlled = true; val.isInElevator = true; val.isInHangarShipRoom = true; val.isInsideFactory = false; val.parentedToElevatorLastFrame = false; val.overrideGameOverSpectatePivot = null; StartOfRound.Instance.SetPlayerObjectExtrapolate(false); val.TeleportPlayer(StartOfRound.Instance.GetPlayerSpawnPosition(playerId, false), false, 0f, false, true); val.setPositionOfDeadPlayer = false; val.DisablePlayerModel(((Component)val).gameObject, true, true); ((Behaviour)val.helmetLight).enabled = false; val.Crouch(false); val.criticallyInjured = false; if ((Object)(object)val.playerBodyAnimator != (Object)null) { val.playerBodyAnimator.SetBool("Limp", false); } val.bleedingHeavily = false; val.activatingItem = false; val.twoHanded = false; val.inShockingMinigame = false; val.inSpecialInteractAnimation = false; val.freeRotationInInteractAnimation = false; val.disableSyncInAnimation = false; val.inAnimationWithEnemy = null; val.holdingWalkieTalkie = false; val.speakingToWalkieTalkie = false; val.isSinking = false; val.isUnderwater = false; val.sinkingValue = 0f; val.statusEffectAudio.Stop(); val.DisableJetpackControlsLocally(); val.health = 100; val.mapRadarDotAnimator.SetBool("dead", false); val.externalForceAutoFade = Vector3.zero; ((Renderer)val.thisPlayerModel).enabled = true; StartOfRound.Instance.allPlayersDead = false; if (((NetworkBehaviour)val).IsOwner) { HUDManager.Instance.SetCracksOnVisor(100f); HUDManager.Instance.gasHelmetAnimator.SetBool("gasEmitting", false); val.hasBegunSpectating = false; HUDManager.Instance.RemoveSpectateUI(); HUDManager.Instance.gameOverAnimator.SetTrigger("revive"); HUDManager.Instance.UpdateHealthUI(100, false); val.spectatedPlayerScript = null; val.hinderedMultiplier = 1f; val.isMovementHindered = 0; val.sourcesCausingSinking = 0; StartOfRound.Instance.SendChangedWeightEvent(); val.reverbPreset = StartOfRound.Instance.shipReverb; HUDManager.Instance.HideHUD(false); SoundManager.Instance.earsRingingTimer = 0f; TimeOfDay.Instance.DisableAllWeather(false); StartOfRound.Instance.SetSpectateCameraToGameOverMode(false, val); ((Behaviour)HUDManager.Instance.audioListenerLowPass).enabled = false; val.sprintMeter = 1f; } else { ((Renderer)val.thisPlayerModelLOD1).enabled = true; ((Renderer)val.thisPlayerModelLOD2).enabled = true; } val.voiceMuffledByEnemy = false; SoundManager.Instance.playerVoicePitchTargets[val.playerClientId] = 1f; SoundManager.Instance.SetPlayerPitch(1f, (int)val.playerClientId); if ((Object)(object)val.currentVoiceChatIngameSettings == (Object)null) { StartOfRound.Instance.RefreshPlayerVoicePlaybackObjects(); } if ((Object)(object)val.currentVoiceChatIngameSettings != (Object)null) { if ((Object)(object)val.currentVoiceChatIngameSettings.voiceAudio == (Object)null) { val.currentVoiceChatIngameSettings.InitializeComponents(); } if ((Object)(object)val.currentVoiceChatIngameSettings.voiceAudio == (Object)null) { return; } ((Component)val.currentVoiceChatIngameSettings.voiceAudio).GetComponent().overridingLowPass = false; } } RagdollGrabbableObject[] array = Object.FindObjectsOfType(); for (int i = 0; i < array.Length; i++) { if (array[i].bodyID != playerId) { continue; } if (!((GrabbableObject)array[i]).isHeld) { if (((NetworkBehaviour)StartOfRound.Instance).IsServer) { if (((NetworkBehaviour)array[i]).NetworkObject.IsSpawned) { ((NetworkBehaviour)array[i]).NetworkObject.Despawn(true); } else { Object.Destroy((Object)(object)((Component)array[i]).gameObject); } break; } } else if (((GrabbableObject)array[i]).isHeld && (Object)(object)((GrabbableObject)array[i]).playerHeldBy != (Object)null) { ((GrabbableObject)array[i]).playerHeldBy.DropAllHeldItems(true, false, false, false, default(Vector3), default(Vector3), default(Vector3), default(Vector3), default(Vector3)); break; } } DeadBodyInfo[] array2 = Object.FindObjectsOfType(true); for (int j = 0; j < array2.Length; j++) { Object.Destroy((Object)(object)((Component)array2[j]).gameObject); } StartOfRound.Instance.livingPlayers = StartOfRound.Instance.connectedPlayersAmount + 1; StartOfRound.Instance.UpdatePlayerVoiceEffects(); } } } namespace LCAutoRevive.Patches { [HarmonyPatch(typeof(GameNetworkManager))] internal class GameNetworkManagerPatch { [HarmonyPatch("Start")] [HarmonyPostfix] private static void StartPostfix() { NetworkHandler.CreateAndRegisterPrefab(); } [HarmonyPatch("Disconnect")] [HarmonyPostfix] private static void DisconnectPostfix() { NetworkHandler.DespawnNetworkHandler(); } } [HarmonyPatch(typeof(HUDManager))] internal class HUDPatcher { [HarmonyPatch("Start")] [HarmonyPostfix] internal static void SpectateUIStartPatch(HUDManager __instance) { ((Component)__instance.gameOverAnimator).gameObject.AddComponent(); } } [HarmonyPatch(typeof(PlayerControllerB))] internal class PlayerControllerBPatcher { [HarmonyPatch("KillPlayer")] [HarmonyPostfix] internal static void KillPlayerPostfix(PlayerControllerB __instance) { if (((NetworkBehaviour)__instance).IsOwner && __instance.isPlayerDead && __instance.AllowPlayerDeath()) { HUDHandler.Instance.StartPlayerRevivalCountDown(); } } } [HarmonyPatch(typeof(StartOfRound))] internal class StartOfRoundPatcher { [HarmonyPatch("Awake")] [HarmonyPrefix] private static void AwakePrefix() { NetworkHandler.SpawnNetworkHandler(); } [HarmonyPatch("ShipLeaveAutomatically")] [HarmonyPrefix] internal static bool ShipLeaveAutomaticallyPatch(StartOfRound __instance, ref bool leavingOnMidnight) { if (!LCAutoRevive.preventShipLeave || NetworkHandler.Instance.AllPlayersPermaDead()) { return true; } if (!leavingOnMidnight) { __instance.allPlayersDead = false; return false; } return true; } [HarmonyPatch("OnPlayerDC")] [HarmonyPostfix] internal static void OnPlayerDCPostFix(StartOfRound __instance, ref int playerObjectNumber, ref ulong clientId) { if (__instance.allPlayerObjects[playerObjectNumber].GetComponent().disconnectedMidGame && ((NetworkBehaviour)__instance).IsServer) { NetworkHandler.Instance.DisconnectPermaDeadPlayer((int)clientId); } } [HarmonyPatch("ReviveDeadPlayers")] [HarmonyPostfix] internal static void ReviveDeadPlayersPostfix() { HUDHandler.Instance.canRevive = false; HUDHandler.Instance.isRunning = false; HUDHandler.Instance.isPermaDead = false; HUDHandler.Instance.reviveCount = 0; NetworkHandler.Instance.ResetPermaDeadPlayers(); } [HarmonyPatch("ShipLeave")] [HarmonyPostfix] internal static void ShipLeavePostfix(StartOfRound __instance) { if (__instance.shipIsLeaving) { HUDHandler.Instance.ShipLeave(); } } } } namespace LCAutoRevive.Network { internal class NetworkHandler : NetworkBehaviour { private static GameObject? prefab = null; internal static List PermaDeadPlayers = new List(); internal static bool allPlayersDead; public static NetworkHandler Instance { get; private set; } = null; public static void CreateAndRegisterPrefab() { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Expected O, but got Unknown //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)prefab != (Object)null)) { prefab = new GameObject("Tomatobird.AutoRevive Prefab"); GameObject? obj = prefab; ((Object)obj).hideFlags = (HideFlags)(((Object)obj).hideFlags | 0x3D); NetworkObject obj2 = prefab.AddComponent(); FieldInfo field = typeof(NetworkObject).GetField("GlobalObjectIdHash", BindingFlags.Instance | BindingFlags.NonPublic); field.SetValue(obj2, GetHash("Tomatobird.AutoRevive Prefab")); prefab.AddComponent(); NetworkManager.Singleton.AddNetworkPrefab(prefab); LCAutoRevive.Logger.LogInfo((object)"Prefab changes done."); } } public static void SpawnNetworkHandler() { if (NetworkManager.Singleton.IsServer || NetworkManager.Singleton.IsHost) { GameObject obj = Object.Instantiate(prefab); if (obj != null) { obj.GetComponent().Spawn(false); } LCAutoRevive.Logger.LogInfo((object)"Spawned network handler."); } } public static void DespawnNetworkHandler() { if ((Object)(object)Instance != (Object)null && ((Component)Instance).gameObject.GetComponent().IsSpawned && (NetworkManager.Singleton.IsServer || NetworkManager.Singleton.IsHost)) { ((Component)Instance).gameObject.GetComponent().Despawn(true); LCAutoRevive.Logger.LogInfo((object)"Despawned network handler."); } } private void Awake() { Instance = this; } public void ResetPermaDeadPlayers() { PermaDeadPlayers = new List(); allPlayersDead = false; } public int GetPermaDeadPlayerCount(bool onPlayerDC) { return onPlayerDC ? (PermaDeadPlayers.Count + 1) : PermaDeadPlayers.Count; } public bool AllPlayersPermaDead() { return allPlayersDead; } public void CheckIfAllPlayersDead(bool onPlayerDC) { if (GetPermaDeadPlayerCount(onPlayerDC) >= GameNetworkManager.Instance.connectedPlayers && !allPlayersDead) { allPlayersDead = true; AllPlayersDeadClientRpc(); } } [ServerRpc(RequireOwnership = false)] public void RevivePlayerServerRpc(int 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) //IL_00ce: 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(3047310335u, val, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val2, playerid); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 3047310335u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost)) { base.__rpc_exec_stage = (__RpcExecStage)0; RevivePlayerClientRpc(playerid); } } } [ClientRpc] public void RevivePlayerClientRpc(int 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) //IL_00ce: 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.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(632973755u, val, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val2, playerid); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 632973755u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsClient || networkManager.IsHost)) { base.__rpc_exec_stage = (__RpcExecStage)0; RevivePlayer.ReiveDeadPlayer(playerid); } } } [ServerRpc(RequireOwnership = false)] public void PermaDeadPlayerServerRpc(int 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) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost)) { ServerRpcParams val = default(ServerRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(2091644702u, val, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val2, playerid); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 2091644702u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost)) { base.__rpc_exec_stage = (__RpcExecStage)0; if (!PermaDeadPlayers.Contains(playerid)) { PermaDeadPlayers.Add(playerid); LCAutoRevive.Logger.LogDebug((object)$"Player {playerid} added to the permanently dead players list."); } CheckIfAllPlayersDead(onPlayerDC: false); } } public void DisconnectPermaDeadPlayer(int playerid) { if (PermaDeadPlayers.Contains(playerid)) { bool flag = PermaDeadPlayers.Remove(playerid); LCAutoRevive.Logger.LogInfo((object)$"Player {playerid} removed from list? {flag}"); CheckIfAllPlayersDead(onPlayerDC: false); } else { CheckIfAllPlayersDead(onPlayerDC: true); } } [ClientRpc] public void AllPlayersDeadClientRpc() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(3770377985u, val, (RpcDelivery)0); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 3770377985u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsClient || networkManager.IsHost)) { base.__rpc_exec_stage = (__RpcExecStage)0; allPlayersDead = true; StartOfRound.Instance.ShipLeaveAutomatically(false); } } } protected internal static uint GetHash(string value) { return value?.Aggregate(17u, (uint current, char c) => (current * 31) ^ c) ?? 0; } protected override void __initializeVariables() { ((NetworkBehaviour)this).__initializeVariables(); } protected override void __initializeRpcs() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Expected O, but got Unknown //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Expected O, but got Unknown //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Expected O, but got Unknown ((NetworkBehaviour)this).__registerRpc(3047310335u, new RpcReceiveHandler(__rpc_handler_3047310335), "RevivePlayerServerRpc"); ((NetworkBehaviour)this).__registerRpc(632973755u, new RpcReceiveHandler(__rpc_handler_632973755), "RevivePlayerClientRpc"); ((NetworkBehaviour)this).__registerRpc(2091644702u, new RpcReceiveHandler(__rpc_handler_2091644702), "PermaDeadPlayerServerRpc"); ((NetworkBehaviour)this).__registerRpc(3770377985u, new RpcReceiveHandler(__rpc_handler_3770377985), "AllPlayersDeadClientRpc"); ((NetworkBehaviour)this).__initializeRpcs(); } private static void __rpc_handler_3047310335(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { int playerid = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref playerid); target.__rpc_exec_stage = (__RpcExecStage)1; ((NetworkHandler)(object)target).RevivePlayerServerRpc(playerid); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_632973755(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { int playerid = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref playerid); target.__rpc_exec_stage = (__RpcExecStage)1; ((NetworkHandler)(object)target).RevivePlayerClientRpc(playerid); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_2091644702(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { int playerid = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref playerid); target.__rpc_exec_stage = (__RpcExecStage)1; ((NetworkHandler)(object)target).PermaDeadPlayerServerRpc(playerid); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_3770377985(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { target.__rpc_exec_stage = (__RpcExecStage)1; ((NetworkHandler)(object)target).AllPlayersDeadClientRpc(); target.__rpc_exec_stage = (__RpcExecStage)0; } } protected internal override string __getTypeName() { return "NetworkHandler"; } } } namespace LCAutoRevive.Input { public class ReviveKey : LcInputActions { public static readonly ReviveKey Instance = new ReviveKey(); [InputAction(/*Could not decode attribute arguments.*/)] public InputAction? ReviveButton { get; set; } } } namespace LCAutoRevive.Compat { internal static class InputUtilsCompat { public static bool Enabled => Chainloader.PluginInfos.ContainsKey("com.rune580.LethalCompanyInputUtils"); public static InputAction? ReviveKey => global::LCAutoRevive.Input.ReviveKey.Instance.ReviveButton; } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } } namespace __GEN { internal class NetworkVariableSerializationHelper { [RuntimeInitializeOnLoadMethod] internal static void InitializeSerialization() { } } } namespace Tomatobird.AutoRevive.NetcodePatcher { [AttributeUsage(AttributeTargets.Module)] internal class NetcodePatchedAssemblyAttribute : Attribute { } }