Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of IQuit v1.1.0
IQuit.dll
Decompiled 2 years agousing System; using System.CodeDom.Compiler; using System.Collections; using System.ComponentModel; using System.Diagnostics; using System.Globalization; using System.Linq; using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using IQuit.Behaviors; using IQuit.NetcodePatcher; using Microsoft.CodeAnalysis; using Unity.Netcode; using UnityEngine; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("Sehelitar")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyCopyright("Sehelitar @ https://sehelitar.tv")] [assembly: AssemblyDescription("The Company can't fire you if you quit first!")] [assembly: AssemblyFileVersion("1.1.0")] [assembly: AssemblyInformationalVersion("1.1.0+ae0798a42a98941074bdad04a3d4378352e3d8f9")] [assembly: AssemblyProduct("IQuit")] [assembly: AssemblyTitle("IQuit")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.1.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] [module: NetcodePatchedAssembly] internal class <Module> { static <Module>() { NetworkVariableSerializationTypes.InitializeSerializer_UnmanagedByMemcpy<bool>(); NetworkVariableSerializationTypes.InitializeEqualityChecker_UnmanagedIEquatable<bool>(); } } 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 IQuit { [GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [DebuggerNonUserCode] [CompilerGenerated] internal class Locale { private static ResourceManager resourceMan; private static CultureInfo resourceCulture; [EditorBrowsable(EditorBrowsableState.Advanced)] internal static ResourceManager ResourceManager { get { if (resourceMan == null) { resourceMan = new ResourceManager("IQuit.Locale", typeof(Locale).Assembly); } return resourceMan; } } [EditorBrowsable(EditorBrowsableState.Advanced)] internal static CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } internal static string CommandDesc => ResourceManager.GetString("CommandDesc", resourceCulture); internal static string HostOnly => ResourceManager.GetString("HostOnly", resourceCulture); internal static string RequestDenied => ResourceManager.GetString("RequestDenied", resourceCulture); internal static string RequestGranted => ResourceManager.GetString("RequestGranted", resourceCulture); internal static string ReturnEquipment => ResourceManager.GetString("ReturnEquipment", resourceCulture); internal static string SendingResignation => ResourceManager.GetString("SendingResignation", resourceCulture); internal Locale() { } } [BepInPlugin("IQuit", "IQuit", "1.1.0")] [BepInProcess("Lethal Company.exe")] public class Plugin : BaseUnityPlugin { private static Harmony _globalHarmony; internal static ManualLogSource Log { get; private set; } internal static PluginConfigStruct GameConfig { get; private set; } private void Awake() { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Expected O, but got Unknown Log = ((BaseUnityPlugin)this).Logger; ((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin IQuit is loaded!"); PatchNetwork(); _globalHarmony = new Harmony("IQuit"); _globalHarmony.PatchAll(); PluginConfigStruct gameConfig = default(PluginConfigStruct); gameConfig.AllowOthers = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "AllowOthers", false, "Allow non-host players to quit."); gameConfig.FastReset = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "FastReset", true, "Instantly reset your game and bypass the eject sequence."); GameConfig = gameConfig; } private static void PatchNetwork() { try { Type[] types = Assembly.GetExecutingAssembly().GetTypes(); foreach (Type type in types) { MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic); foreach (MethodInfo methodInfo in methods) { if (methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false).Length != 0) { Log.LogInfo((object)("Initialize network patch for " + type.FullName)); methodInfo.Invoke(null, null); } } } } catch (Exception) { } } } internal struct PluginConfigStruct { public ConfigEntry<bool> AllowOthers; public ConfigEntry<bool> FastReset; } public static class PluginInfo { public const string PLUGIN_GUID = "IQuit"; public const string PLUGIN_NAME = "IQuit"; public const string PLUGIN_VERSION = "1.1.0"; } } namespace IQuit.Patches { [HarmonyPatch(typeof(Terminal))] internal class TerminalPatch { private static ResignationHandler? _resignationHandler; [HarmonyPatch("Awake")] [HarmonyPrefix] [HarmonyPriority(800)] private static void Awake(ref Terminal __instance) { TerminalNode val = ScriptableObject.CreateInstance<TerminalNode>(); val.clearPreviousText = true; val.terminalEvent = "iquit_goodbye"; val.displayText = Locale.SendingResignation + "\n\n"; TerminalKeyword val2 = ScriptableObject.CreateInstance<TerminalKeyword>(); val2.isVerb = false; val2.word = "iquit"; val2.specialKeywordResult = val; __instance.terminalNodes.allKeywords = CollectionExtensions.AddToArray<TerminalKeyword>(__instance.terminalNodes.allKeywords, val2); _resignationHandler = ((Component)__instance).gameObject.AddComponent<ResignationHandler>(); TerminalNode val3 = (from x in __instance.terminalNodes.specialNodes where ((Object)x).name == "HelpCommands" select (x)).FirstOrDefault(); if (!((Object)(object)val3 == (Object)null)) { string displayText = val3.displayText; val3.displayText = displayText.Substring(0, displayText.Length - 23) + ">IQUIT\r\n" + Locale.CommandDesc + "\r\n\r\n[numberOfItemsOnRoute]\r\n"; } } [HarmonyPatch("RunTerminalEvents")] [HarmonyPostfix] private static void RunTerminalEvents(ref Terminal __instance, ref TerminalNode node) { if (node.terminalEvent == "iquit_goodbye") { _resignationHandler?.HandleResignation(); } } } } namespace IQuit.Behaviors { public class ResignationHandler : NetworkBehaviour { private bool _fromSelf; private readonly NetworkVariable<bool> _allowOther = new NetworkVariable<bool>(Plugin.GameConfig.AllowOthers.Value, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0); private readonly NetworkVariable<bool> _fastReset = new NetworkVariable<bool>(Plugin.GameConfig.FastReset.Value, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0); private bool _isRunning; public void HandleResignation() { _fromSelf = true; PlayerQuitedServerRpc(); } [ServerRpc(RequireOwnership = false)] private void PlayerQuitedServerRpc() { //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(2700636679u, val, (RpcDelivery)0); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 2700636679u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost) && !_isRunning) { Plugin.Log.LogDebug((object)"[Event] PlayerQuitedServerRPC"); ResetClientRpc(!StartOfRound.Instance.firingPlayersCutsceneRunning && (_allowOther.Value || _fromSelf)); _fromSelf = false; } } } [ClientRpc] private void ResetClientRpc(bool granted) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) 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(4081331157u, val, (RpcDelivery)0); ((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref granted, default(ForPrimitives)); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 4081331157u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost)) { ((MonoBehaviour)this).StartCoroutine(ResetCoroutine(granted)); } } } private IEnumerator ResetCoroutine(bool granted) { if (_isRunning) { yield break; } _isRunning = true; Terminal terminal = Object.FindObjectOfType<Terminal>(); if (!_fastReset.Value || !StartOfRound.Instance.inShipPhase) { if (!_fastReset.Value) { terminal.screenText.ReleaseSelection(); terminal.screenText.DeactivateInputField(false); yield return (object)new WaitForSeconds(2f); terminal.screenText.ActivateInputField(); ((Selectable)terminal.screenText).Select(); } if (terminal.terminalInUse) { TerminalNode val = ScriptableObject.CreateInstance<TerminalNode>(); val.clearPreviousText = true; val.displayText = "// <size=20><color=" + (granted ? "#0000ff" : "#ff0000") + ">" + (granted ? Locale.RequestGranted : Locale.RequestDenied) + "</color></size> //\r\n" + (granted ? Locale.ReturnEquipment : Locale.HostOnly) + "\r\n\r\n"; terminal.LoadNewNode(val); } if (!granted) { yield break; } if (!_fastReset.Value) { yield return (object)new WaitForSeconds((float)((!_fastReset.Value) ? 5 : 0)); } } if (!StartOfRound.Instance.inShipPhase) { StartOfRound.Instance.firingPlayersCutsceneRunning = true; StartOfRound.Instance.ShipLeaveAutomatically(false); yield return (object)new WaitUntil((Func<bool>)(() => StartOfRound.Instance.inShipPhase)); StartOfRound.Instance.firingPlayersCutsceneRunning = false; } if (!_fastReset.Value) { if (((NetworkBehaviour)this).IsServer) { StartOfRound.Instance.ManuallyEjectPlayersServerRpc(); } yield return (object)new WaitForSeconds(10f); _isRunning = false; yield break; } terminal.ClearBoughtItems(); terminal.SetItemSales(); GameNetworkManager.Instance.localPlayerController.inSpecialInteractAnimation = true; GameNetworkManager.Instance.localPlayerController.DropAllHeldItems(true, false); SoundManager.Instance.SetDiageticMixerSnapshot(3, 2f); StartOfRound.Instance.shipDoorAudioSource.Stop(); StartOfRound.Instance.speakerAudioSource.Stop(); if (((NetworkBehaviour)this).IsServer) { GameNetworkManager.Instance.ResetSavedGameValues(); } StartOfRound.Instance.ResetShip(); yield return (object)new WaitForSeconds(0.1f); GameNetworkManager.Instance.localPlayerController.TeleportPlayer(StartOfRound.Instance.playerSpawnPositions[GameNetworkManager.Instance.localPlayerController.playerClientId].position, false, 0f, false, true); StartOfRound.Instance.currentPlanetPrefab.transform.position = ((Component)StartOfRound.Instance.planetContainer).transform.position; yield return (object)new WaitForSeconds(0.1f); if (((NetworkBehaviour)this).IsServer) { StartOfRound instance = StartOfRound.Instance; instance.playersRevived++; yield return (object)new WaitUntil((Func<bool>)(() => StartOfRound.Instance.playersRevived >= GameNetworkManager.Instance.connectedPlayers)); StartOfRound.Instance.playersRevived = 0; StartOfRound.Instance.EndPlayersFiredSequenceClientRpc(); } else { StartOfRound.Instance.PlayerHasRevivedServerRpc(); } _isRunning = false; } protected override void __initializeVariables() { if (_allowOther == null) { throw new Exception("ResignationHandler._allowOther cannot be null. All NetworkVariableBase instances must be initialized."); } ((NetworkVariableBase)_allowOther).Initialize((NetworkBehaviour)(object)this); ((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)_allowOther, "_allowOther"); base.NetworkVariableFields.Add((NetworkVariableBase)(object)_allowOther); if (_fastReset == null) { throw new Exception("ResignationHandler._fastReset cannot be null. All NetworkVariableBase instances must be initialized."); } ((NetworkVariableBase)_fastReset).Initialize((NetworkBehaviour)(object)this); ((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)_fastReset, "_fastReset"); base.NetworkVariableFields.Add((NetworkVariableBase)(object)_fastReset); ((NetworkBehaviour)this).__initializeVariables(); } [RuntimeInitializeOnLoadMethod] internal static void InitializeRPCS_ResignationHandler() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown NetworkManager.__rpc_func_table.Add(2700636679u, new RpcReceiveHandler(__rpc_handler_2700636679)); NetworkManager.__rpc_func_table.Add(4081331157u, new RpcReceiveHandler(__rpc_handler_4081331157)); } private static void __rpc_handler_2700636679(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; ((ResignationHandler)(object)target).PlayerQuitedServerRpc(); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_4081331157(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { bool granted = default(bool); ((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref granted, default(ForPrimitives)); target.__rpc_exec_stage = (__RpcExecStage)2; ((ResignationHandler)(object)target).ResetClientRpc(granted); target.__rpc_exec_stage = (__RpcExecStage)0; } } protected internal override string __getTypeName() { return "ResignationHandler"; } } } namespace IQuit.NetcodePatcher { [AttributeUsage(AttributeTargets.Module)] internal class NetcodePatchedAssemblyAttribute : Attribute { } }