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 ReadyCompany v1.1.1
Enova.ReadyCompany.dll
Decompiled a year agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using CSync.Extensions; using CSync.Lib; using GameNetcodeStuff; using HarmonyLib; using HarmonyLib.Public.Patching; using LethalCompanyInputUtils.Api; using LethalConfig; using LethalConfig.ConfigItems; using LethalConfig.ConfigItems.Options; using LethalNetworkAPI; using LethalNetworkAPI.Utils; using LobbyCompatibility.Enums; using LobbyCompatibility.Features; using Microsoft.CodeAnalysis; using Mono.Cecil; using Mono.Cecil.Cil; using Mono.Collections.Generic; using MonoMod.Utils; using ReadyCompany.Config; using ReadyCompany.Patches; using ReadyCompany.Util; using TMPro; using Unity.Netcode; using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.InputSystem.Interactions; using UnityEngine.InputSystem.Utilities; using UnityEngine.Networking; using UnityEngine.SceneManagement; 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("AmazingAssets.TerrainToMesh")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp-firstpass")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: IgnoresAccessChecksTo("ClientNetworkTransform")] [assembly: IgnoresAccessChecksTo("DissonanceVoip")] [assembly: IgnoresAccessChecksTo("Facepunch Transport for Netcode for GameObjects")] [assembly: IgnoresAccessChecksTo("Facepunch.Steamworks.Win64")] [assembly: IgnoresAccessChecksTo("LethalCompanyInputUtils")] [assembly: IgnoresAccessChecksTo("Unity.AI.Navigation")] [assembly: IgnoresAccessChecksTo("Unity.Animation.Rigging")] [assembly: IgnoresAccessChecksTo("Unity.Animation.Rigging.DocCodeExamples")] [assembly: IgnoresAccessChecksTo("Unity.Burst")] [assembly: IgnoresAccessChecksTo("Unity.Burst.Unsafe")] [assembly: IgnoresAccessChecksTo("Unity.Collections")] [assembly: IgnoresAccessChecksTo("Unity.Collections.LowLevel.ILSupport")] [assembly: IgnoresAccessChecksTo("Unity.InputSystem")] [assembly: IgnoresAccessChecksTo("Unity.InputSystem.ForUI")] [assembly: IgnoresAccessChecksTo("Unity.Jobs")] [assembly: IgnoresAccessChecksTo("Unity.Mathematics")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.Common")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.MetricTypes")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStats")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Component")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Configuration")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Implementation")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsReporting")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetworkProfiler.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetworkSolutionInterface")] [assembly: IgnoresAccessChecksTo("Unity.Netcode.Components")] [assembly: IgnoresAccessChecksTo("Unity.Netcode.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.Networking.Transport")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Csg")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder.KdTree")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Poly2Tri")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Stl")] [assembly: IgnoresAccessChecksTo("Unity.Profiling.Core")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.ShaderLibrary")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.HighDefinition.Config.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.HighDefinition.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary")] [assembly: IgnoresAccessChecksTo("Unity.Services.Authentication")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Analytics")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Configuration")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Device")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Environments")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Environments.Internal")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Internal")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Networking")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Registration")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Scheduler")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Telemetry")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Threading")] [assembly: IgnoresAccessChecksTo("Unity.Services.QoS")] [assembly: IgnoresAccessChecksTo("Unity.Services.Relay")] [assembly: IgnoresAccessChecksTo("Unity.TextMeshPro")] [assembly: IgnoresAccessChecksTo("Unity.Timeline")] [assembly: IgnoresAccessChecksTo("Unity.VisualEffectGraph.Runtime")] [assembly: IgnoresAccessChecksTo("UnityEngine.AccessibilityModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.AIModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.AndroidJNIModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.AnimationModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.ARModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.AssetBundleModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.AudioModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.ClothModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.ClusterInputModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.ClusterRendererModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.ContentLoadModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.CoreModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.CrashReportingModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.DirectorModule")] [assembly: IgnoresAccessChecksTo("UnityEngine")] [assembly: IgnoresAccessChecksTo("UnityEngine.DSPGraphModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.GameCenterModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.GIModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.GridModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.HotReloadModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.ImageConversionModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.IMGUIModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.InputLegacyModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.InputModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.JSONSerializeModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.LocalizationModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.NVIDIAModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.ParticleSystemModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.PerformanceReportingModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.Physics2DModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.PhysicsModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.ProfilerModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.PropertiesModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.RuntimeInitializeOnLoadManagerInitializerModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.ScreenCaptureModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.SharedInternalsModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.SpriteMaskModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.SpriteShapeModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.StreamingModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.SubstanceModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.SubsystemsModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.TerrainModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.TerrainPhysicsModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.TextCoreFontEngineModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.TextCoreTextEngineModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.TextRenderingModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.TilemapModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.TLSModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.UI")] [assembly: IgnoresAccessChecksTo("UnityEngine.UIElementsModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.UIModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.UmbraModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.UnityAnalyticsCommonModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.UnityAnalyticsModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.UnityConnectModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.UnityCurlModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.UnityTestProtocolModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.UnityWebRequestAssetBundleModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.UnityWebRequestAudioModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.UnityWebRequestModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.UnityWebRequestTextureModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.UnityWebRequestWWWModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.VehiclesModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.VFXModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.VideoModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.VirtualTexturingModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.VRModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.WindModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.XRModule")] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("Enova.ReadyCompany")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.1.1.0")] [assembly: AssemblyInformationalVersion("1.1.1+4cf556d64ab61e03cd2f65d0f79d62f38f9b5b1e")] [assembly: AssemblyProduct("ReadyCompany")] [assembly: AssemblyTitle("Enova.ReadyCompany")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.1.1.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] 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 ReadyCompany { public class InteractionBarUI : MonoBehaviour { private Image image = null; internal IInputInteraction? ReadyInteraction; internal IInputInteraction? UnreadyInteraction; public static InteractionBarUI Instance { get; private set; } private void Awake() { if ((Object)(object)Instance == (Object)null) { Instance = this; } image = ((Component)this).GetComponent<Image>(); } private void Update() { //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) if (ReadyCompany.InputActions == null) { return; } float percentage = 0f; if (ReadyInteraction != null) { LNetworkVariable<ReadyMap> readyStatus = ReadyHandler.ReadyStatus; if (readyStatus != null) { ReadyMap value = readyStatus.Value; if (value != null && !value.LocalPlayerReady) { ((Graphic)image).color = ReadyCompany.Config.ReadyBarColor.Value; IInputInteraction? readyInteraction = ReadyInteraction; MultiTapInteraction val = (MultiTapInteraction)(object)((readyInteraction is MultiTapInteraction) ? readyInteraction : null); if (val != null) { percentage = (float)val.m_CurrentTapCount / (float)val.tapCount; } else { IInputInteraction? readyInteraction2 = ReadyInteraction; HoldInteraction val2 = (HoldInteraction)(object)((readyInteraction2 is HoldInteraction) ? readyInteraction2 : null); if (val2 != null) { percentage = (float)(Time.realtimeSinceStartupAsDouble - val2.m_TimePressed) / val2.durationOrDefault; } } goto IL_016e; } } } if (UnreadyInteraction != null) { LNetworkVariable<ReadyMap> readyStatus = ReadyHandler.ReadyStatus; if (readyStatus != null) { ReadyMap value = readyStatus.Value; if (value != null && value.LocalPlayerReady) { ((Graphic)image).color = ReadyCompany.Config.UnreadyBarColor.Value; IInputInteraction? unreadyInteraction = UnreadyInteraction; MultiTapInteraction val3 = (MultiTapInteraction)(object)((unreadyInteraction is MultiTapInteraction) ? unreadyInteraction : null); if (val3 != null) { percentage = (float)val3.m_CurrentTapCount / (float)val3.tapCount; } else { IInputInteraction? unreadyInteraction2 = UnreadyInteraction; HoldInteraction val4 = (HoldInteraction)(object)((unreadyInteraction2 is HoldInteraction) ? unreadyInteraction2 : null); if (val4 != null) { percentage = (float)(Time.realtimeSinceStartupAsDouble - val4.m_TimePressed) / val4.durationOrDefault; } } } } } goto IL_016e; IL_016e: UpdatePercentage(percentage); } public void UpdatePercentage(float percentage) { image.fillAmount = percentage; } } [BepInPlugin("Enova.ReadyCompany", "ReadyCompany", "1.1.1")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency("com.sigurd.csync", "5.0.0")] public class ReadyCompany : BaseUnityPlugin { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static GenericButtonHandler <>9__18_0; public static CanModifyDelegate <>9__18_1; public static CanModifyDelegate <>9__18_2; internal void <InitializeLethalConfig>b__18_0() { Config.LoadCustomSounds(); } internal CanModifyResult <InitializeLethalConfig>b__18_1() { //IL_0012: Unknown result type (might be due to invalid IL or missing references) return CanModifyResult.op_Implicit(Config.ReadyInteractionPreset.Value == InteractionPreset.Custom); } internal CanModifyResult <InitializeLethalConfig>b__18_2() { //IL_0012: Unknown result type (might be due to invalid IL or missing references) return CanModifyResult.op_Implicit(Config.UnreadyInteractionPreset.Value == InteractionPreset.Custom); } } internal static ReadyCompanyConfig Config; public static ReadyCompany Instance { get; private set; } internal static ManualLogSource Logger { get; private set; } internal static Harmony? Harmony { get; set; } internal static ReadyInputs? InputActions { get; set; } private void Awake() { Logger = ((BaseUnityPlugin)this).Logger; Instance = this; Config = new ReadyCompanyConfig(((BaseUnityPlugin)this).Config); if (Chainloader.PluginInfos.ContainsKey("ainavt.lc.lethalconfig")) { InitializeLethalConfig(); } if (Chainloader.PluginInfos.ContainsKey("BMX.LobbyCompatibility")) { InitializeLobbyCompatibility(); } ReadyHandler.InitializeEvents(); Patch(); Logger.LogInfo((object)"Enova.ReadyCompany v1.1.1 has loaded!"); } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] private static void InitializeLethalConfig() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Expected O, but got Unknown //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Expected O, but got Unknown //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Expected O, but got Unknown //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Expected O, but got Unknown //IL_006d: Expected O, but got Unknown //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Expected O, but got Unknown //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Expected O, but got Unknown //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Expected O, but got Unknown //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Expected O, but got Unknown //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Expected O, but got Unknown //IL_00ee: Expected O, but got Unknown //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Expected O, but got Unknown //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_0132: Expected O, but got Unknown //IL_0178: 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_0185: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Expected O, but got Unknown //IL_01b0: Expected O, but got Unknown //IL_01ab: Unknown result type (might be due to invalid IL or missing references) //IL_01b2: Expected O, but got Unknown //IL_01c4: Unknown result type (might be due to invalid IL or missing references) //IL_01c9: Unknown result type (might be due to invalid IL or missing references) //IL_01d1: Unknown result type (might be due to invalid IL or missing references) //IL_019a: Unknown result type (might be due to invalid IL or missing references) //IL_019f: Unknown result type (might be due to invalid IL or missing references) //IL_01a5: Expected O, but got Unknown //IL_01fc: Expected O, but got Unknown //IL_01f7: Unknown result type (might be due to invalid IL or missing references) //IL_01fe: Expected O, but got Unknown //IL_01e6: Unknown result type (might be due to invalid IL or missing references) //IL_01eb: Unknown result type (might be due to invalid IL or missing references) //IL_01f1: Expected O, but got Unknown BoolCheckBoxConfigItem val = new BoolCheckBoxConfigItem(Config.RequireReadyToStart.Entry, false); LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val); BoolCheckBoxConfigItem val2 = new BoolCheckBoxConfigItem(Config.AutoStartWhenReady.Entry, false); LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val2); ConfigEntry<int> entry = Config.PercentageForReady.Entry; IntSliderOptions val3 = new IntSliderOptions { RequiresRestart = false }; ((BaseRangeOptions<int>)val3).Min = 0; ((BaseRangeOptions<int>)val3).Max = 100; IntSliderConfigItem val4 = new IntSliderConfigItem(entry, val3); LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val4); EnumDropDownConfigItem<StatusPlacement> val5 = new EnumDropDownConfigItem<StatusPlacement>(Config.StatusPlacement, false); LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val5); BoolCheckBoxConfigItem val6 = new BoolCheckBoxConfigItem(Config.ShowPopup, false); LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val6); BoolCheckBoxConfigItem val7 = new BoolCheckBoxConfigItem(Config.PlaySound, false); LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val7); ConfigEntry<int> soundVolume = Config.SoundVolume; IntSliderOptions val8 = new IntSliderOptions { RequiresRestart = false }; ((BaseRangeOptions<int>)val8).Min = 0; ((BaseRangeOptions<int>)val8).Max = 100; IntSliderConfigItem val9 = new IntSliderConfigItem(soundVolume, val8); LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val9); object obj = <>c.<>9__18_0; if (obj == null) { GenericButtonHandler val10 = delegate { Config.LoadCustomSounds(); }; <>c.<>9__18_0 = val10; obj = (object)val10; } GenericButtonConfigItem val11 = new GenericButtonConfigItem("Customization", "Reload Custom Sounds", "Reloads any custom sounds from disk.", "Reload", (GenericButtonHandler)obj); LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val11); EnumDropDownConfigItem<InteractionPreset> val12 = new EnumDropDownConfigItem<InteractionPreset>(Config.ReadyInteractionPreset, false); LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val12); EnumDropDownConfigItem<InteractionPreset> val13 = new EnumDropDownConfigItem<InteractionPreset>(Config.UnreadyInteractionPreset, false); LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val13); ConfigEntry<string> customReadyInteractionString = Config.CustomReadyInteractionString; TextInputFieldOptions val14 = new TextInputFieldOptions { RequiresRestart = false }; object obj2 = <>c.<>9__18_1; if (obj2 == null) { CanModifyDelegate val15 = () => CanModifyResult.op_Implicit(Config.ReadyInteractionPreset.Value == InteractionPreset.Custom); <>c.<>9__18_1 = val15; obj2 = (object)val15; } ((BaseOptions)val14).CanModifyCallback = (CanModifyDelegate)obj2; TextInputFieldConfigItem val16 = new TextInputFieldConfigItem(customReadyInteractionString, val14); LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val16); ConfigEntry<string> customUnreadyInteractionString = Config.CustomUnreadyInteractionString; TextInputFieldOptions val17 = new TextInputFieldOptions { RequiresRestart = false }; object obj3 = <>c.<>9__18_2; if (obj3 == null) { CanModifyDelegate val18 = () => CanModifyResult.op_Implicit(Config.UnreadyInteractionPreset.Value == InteractionPreset.Custom); <>c.<>9__18_2 = val18; obj3 = (object)val18; } ((BaseOptions)val17).CanModifyCallback = (CanModifyDelegate)obj3; TextInputFieldConfigItem val19 = new TextInputFieldConfigItem(customUnreadyInteractionString, val17); LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val19); } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] private static void InitializeLobbyCompatibility() { PluginHelper.RegisterPlugin("Enova.ReadyCompany", new Version("1.1.1"), (CompatibilityLevel)2, (VersionStrictness)2); } 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("Enova.ReadyCompany"); } Logger.LogDebug((object)"Patching..."); Harmony.PatchAll(); JoinPatches.Init(); 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 ReadyHandler { private const string READY_STATUS_SIG = "Enova.ReadyCompany_readyStatusVar"; private const string READY_EVENT_SIG = "Enova.ReadyCompany_playerReadyEvent"; internal const string LEVER_DISABLED_TIP = "[ Lobby must be ready to start ]"; internal const string LEVER_WARNING_TIP = "[ WARNING: Lobby Not Ready ]"; private static readonly LNetworkMessage<bool> readyUpMessage = LNetworkMessage<bool>.Connect("Enova.ReadyCompany_playerReadyEvent", (Action<bool, ulong>)ReadyUpFromClient, (Action<bool>)null, (Action<bool, ulong>)null); private static readonly Dictionary<int, bool> _playerReadyMap = new Dictionary<int, bool>(); public static LNetworkVariable<ReadyMap> ReadyStatus { get; } = LNetworkVariable<ReadyMap>.Connect("Enova.ReadyCompany_readyStatusVar", (ReadyMap)null, (LNetworkVariableWritePerms)0, (Action<ReadyMap, ReadyMap>)ReadyStatusChanged); internal static bool ShouldPlaySound { get; set; } public static bool InVotingPhase { get { if ((Object)(object)StartOfRound.Instance == (Object)null || !LNetworkUtils.IsConnected) { return false; } if (!StartOfRound.Instance.shipLeftAutomatically && !StartOfRound.Instance.newGameIsLoading && !StartOfRound.Instance.shipIsLeaving && !StartOfRound.Instance.firingPlayersCutsceneRunning) { HUDManager instance = HUDManager.Instance; if ((instance == null || !((Behaviour)instance.loadingText).enabled) && ((StartOfRound.Instance.inShipPhase && !StartOfRound.Instance.shipHasLanded) || (!StartOfRound.Instance.currentLevel.spawnEnemiesAndScrap && !StartOfRound.Instance.currentLevel.planetHasTime && StartOfRound.Instance.shipHasLanded))) { return true; } } return false; } } public static ulong? ActualLocalClientId => StartOfRound.Instance?.localPlayerController?.actualClientId; public static int? LocalPlayerId { get { if (!ActualLocalClientId.HasValue) { return null; } StartOfRound instance = StartOfRound.Instance; if (instance != null) { instance.ClientPlayerList.TryGetValue(ActualLocalClientId.Value, out var value); if (true) { return value; } } return null; } } internal static bool LocalPlayerAbleToVote { get { PlayerControllerB val = StartOfRound.Instance?.localPlayerController; int result; if (val != null && !val.isTypingChat && !val.inTerminalMenu && !val.inSpecialMenu) { QuickMenuManager quickMenuManager = val.quickMenuManager; if (quickMenuManager != null) { result = ((!quickMenuManager.isMenuOpen) ? 1 : 0); goto IL_0043; } } result = 0; goto IL_0043; IL_0043: return (byte)result != 0; } } internal static bool LocalPlayerDead { get { PlayerControllerB val = StartOfRound.Instance?.localPlayerController; return val != null && val.isPlayerDead && !val.isPlayerControlled; } } public static event Action<ReadyMap>? NewReadyStatus; internal static void InitializeEvents() { ReadyStatus.Value = new ReadyMap(_playerReadyMap); SceneManager.sceneLoaded += OnSceneLoaded; NewReadyStatus += HUDPatches.UpdateTextBasedOnStatus; } private static void OnSceneLoaded(Scene scene, LoadSceneMode loadSceneMode) { InitializeInputActions(); SceneManager.sceneLoaded -= OnSceneLoaded; } private static void InitializeInputActions() { if (ReadyCompany.InputActions == null) { ReadyCompany.InputActions = new ReadyInputs(); ReadyCompany.InputActions.ReadyInput.performed += ReadyInputPerformed; ReadyCompany.InputActions.ReadyInput.started += delegate(CallbackContext context) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) InteractionBarUI.Instance.ReadyInteraction = InputStateChanged(context); }; ReadyCompany.InputActions.ReadyInput.canceled += delegate { InteractionBarUI.Instance.ReadyInteraction = InputStateChanged(null); }; ReadyCompany.InputActions.UnreadyInput.performed += UnreadyInputPerformed; ReadyCompany.InputActions.UnreadyInput.started += delegate(CallbackContext context) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) InteractionBarUI.Instance.UnreadyInteraction = InputStateChanged(context); }; ReadyCompany.InputActions.UnreadyInput.canceled += delegate { InteractionBarUI.Instance.UnreadyInteraction = InputStateChanged(null); }; ReadyCompany.Config.UpdateCustomInteractionStringsBasedOnPresets(); ReadyCompany.Config.UpdateBindingsInteractions(); } } private static IInputInteraction? InputStateChanged(CallbackContext? context) { //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)StartOfRound.Instance == (Object)null) { return null; } if (!LocalPlayerAbleToVote) { context?.Reset(); return null; } object result; if (!context.HasValue) { result = null; } else { CallbackContext valueOrDefault = context.GetValueOrDefault(); result = ((CallbackContext)(ref valueOrDefault)).interaction; } return (IInputInteraction?)result; } public static bool IsLobbyReady(ReadyMap? map) { return map != null && map.LobbySize > 0 && (float)map.PlayersReady / (float)map.LobbySize >= (float)ReadyCompany.Config.PercentageForReady.Value / 100f; } public static bool IsLobbyReady() { return IsLobbyReady(ReadyStatus.Value); } public static void ResetReadyUp() { ReadyCompany.Logger.LogDebug((object)$"ReadyUp reset: {ReadyStatus.Value}"); if ((Object)(object)NetworkManager.Singleton != (Object)null && LNetworkUtils.IsHostOrServer) { ReadyCompany.Logger.LogDebug((object)"Real reset!"); _playerReadyMap.Clear(); UpdateReadyMap(); } StartMatchLeverPatches.HasShownReadyWarning = false; ForceReadyStatusChanged(); ReadyCompany.Logger.LogDebug((object)$"Reset done: {ReadyStatus.Value}"); } internal static void OnClientConnected() { UpdateReadyMap(); } internal static void OnClientDisconnected() { UpdateReadyMap(); } private static void ReadyStatusChanged(ReadyMap oldValue, ReadyMap? newValue) { if (newValue == null) { ReadyCompany.Logger.LogDebug((object)"ReadyStatusChanged newValue is null"); return; } ReadyCompany.Logger.LogDebug((object)$"Readyup about to change: {newValue}"); ReadyStatusChangedReal(newValue); } internal static void ReadyStatusChangedReal(ReadyMap newValue) { if (!((Object)(object)StartOfRound.Instance == (Object)null) && !((Object)(object)HUDManager.Instance == (Object)null)) { ReadyCompany.Logger.LogDebug((object)$"Readyup changed: {newValue}"); PopupReadyStatus(newValue); ReadyHandler.NewReadyStatus?.Invoke(newValue); UpdateShipLever(newValue); } } internal static void ForceReadyStatusChanged() { if (LNetworkUtils.IsConnected) { ShouldPlaySound = false; ReadyStatusChangedReal(ReadyStatus.Value); } } internal static void PopupReadyStatus(ReadyMap map) { if (!((Object)(object)HUDManager.Instance == (Object)null) && InVotingPhase && map.LobbySize > 0) { AudioClip[] sfx = (AudioClip[])((!IsLobbyReady(map) || ReadyCompany.Config.CustomLobbyReadySounds.Count <= 0) ? ((ReadyCompany.Config.CustomPopupSounds.Count > 0) ? ((Array)ReadyCompany.Config.CustomPopupSounds.ToArray()) : ((Array)HUDManager.Instance.tipsSFX)) : ReadyCompany.Config.CustomLobbyReadySounds.ToArray()); string briefStatusDisplay = GetBriefStatusDisplay(map); CustomDisplayTip(IsLobbyReady() ? "Lobby is Ready!" : "Lobby not ready yet!", briefStatusDisplay, sfx); CustomDisplaySpectatorTip(briefStatusDisplay); } } private static void CustomDisplaySpectatorTip(string body) { HUDManager instance = HUDManager.Instance; if (!((Object)(object)instance == (Object)null)) { ((TMP_Text)instance.spectatorTipText).text = body; ((Behaviour)instance.spectatorTipText).enabled = true; } } private static void CustomDisplayTip(string headerText, string bodyText, AudioClip[]? sfx = null) { HUDManager instance = HUDManager.Instance; if ((Object)(object)instance == (Object)null) { return; } if (ReadyCompany.Config.ShowPopup.Value) { ((TMP_Text)instance.tipsPanelHeader).text = headerText; ((TMP_Text)instance.tipsPanelBody).text = bodyText; instance.tipsPanelAnimator.SetTrigger("TriggerHint"); } if (ReadyCompany.Config.PlaySound.Value && ShouldPlaySound) { if (sfx == null) { sfx = instance.tipsSFX; } if (sfx.Length == 0) { sfx = instance.tipsSFX; } Utils.PlayRandomClip(instance.UIAudio, sfx, (float)ReadyCompany.Config.SoundVolume.Value / 100f); } ShouldPlaySound = true; } internal static string GetBriefStatusDisplay(ReadyMap map) { if (map.LobbySize <= 0) { return string.Empty; } StringBuilder stringBuilder = new StringBuilder().Append($"{map.PlayersReady} / {map.LobbySize} Players are ready.").Append("\n"); if (ReadyCompany.Config.DeadPlayersCanVote.Value || !LocalPlayerDead) { stringBuilder.Append(map.LocalPlayerReady ? (ReadyCompany.InputActions?.UnreadyInputName + " to Unready!") : (ReadyCompany.InputActions?.ReadyInputName + " to Ready Up!")).Append(map.LocalPlayerReady ? " <color=\"green\">✓</color>" : " <color=\"red\">✖</color>"); } return stringBuilder.ToString(); } internal static bool ShouldOverrideLeverState(ReadyMap map) { return ReadyCompany.Config.RequireReadyToStart.Value && InVotingPhase && !IsLobbyReady(map) && !StartOfRound.Instance.travellingToNewLevel; } internal static void UpdateShipLever(ReadyMap map) { if (!((Object)(object)StartOfRound.Instance == (Object)null) && map.LobbySize > 0) { StartMatchLever val = Object.FindObjectOfType<StartMatchLever>(); val.updateInterval = 1E-09f; if (ReadyCompany.Config.AutoStartWhenReady.Value && InVotingPhase && !StartOfRound.Instance.travellingToNewLevel && IsLobbyReady(map)) { val.LeverAnimation(); val.PullLever(); } } } private static void ReadyUpFromClient(bool isReady, ulong clientId) { int key = TryGetPlayerIdFromClientId(clientId); _playerReadyMap[key] = isReady; UpdateReadyMap(); } public static void UpdateReadyMap() { if (LNetworkUtils.IsConnected && LNetworkUtils.IsHostOrServer) { VerifyReadyUpMap(); ReadyStatus.Value = new ReadyMap(_playerReadyMap); ReadyStatus.MakeDirty(); } } private static void VerifyReadyUpMap() { if (!InVotingPhase) { return; } StartOfRound roundManager = StartOfRound.Instance; int key; foreach (KeyValuePair<int, bool> item in _playerReadyMap.Where((KeyValuePair<int, bool> kvp) => kvp.Key != LocalPlayerId && !roundManager.ClientPlayerList.ContainsValue(kvp.Key)).ToList()) { item.Deconstruct(out key, out var _); int key2 = key; _playerReadyMap.Remove(key2); } if (!((Object)(object)roundManager != (Object)null)) { return; } foreach (KeyValuePair<ulong, int> clientPlayer in roundManager.ClientPlayerList) { clientPlayer.Deconstruct(out var _, out key); int num = key; _playerReadyMap.TryAdd(num, value: false); if (!ReadyCompany.Config.DeadPlayersCanVote.Value) { PlayerControllerB val = roundManager.allPlayerScripts[num]; if (val.isPlayerDead && !val.isPlayerControlled) { _playerReadyMap[num] = true; } } } int? localPlayerId = LocalPlayerId; if (localPlayerId.HasValue) { _playerReadyMap.TryAdd(localPlayerId.Value, value: false); } } private static void ReadyInputPerformed(CallbackContext context) { if (!LNetworkUtils.IsConnected || !LocalPlayerAbleToVote) { return; } LNetworkVariable<ReadyMap> readyStatus = ReadyStatus; if (readyStatus != null) { ReadyMap value = readyStatus.Value; if (value != null && !value.LocalPlayerReady) { ReadyCompany.InputActions.UnreadyInput.Disable(); ReadyCompany.InputActions.UnreadyInput.Enable(); } } readyUpMessage.SendServer(true); } private static void UnreadyInputPerformed(CallbackContext context) { if (!LNetworkUtils.IsConnected || !LocalPlayerAbleToVote) { return; } LNetworkVariable<ReadyMap> readyStatus = ReadyStatus; if (readyStatus != null) { ReadyMap value = readyStatus.Value; if (value != null && value.LocalPlayerReady) { ReadyCompany.InputActions.ReadyInput.Disable(); ReadyCompany.InputActions.ReadyInput.Enable(); } } readyUpMessage.SendServer(false); } private static int TryGetPlayerIdFromClientId(ulong clientId) { StartOfRound instance = StartOfRound.Instance; int value; return (instance != null && instance.ClientPlayerList.TryGetValue(clientId, out value)) ? value : (-1); } } [Serializable] public class ReadyMap : Dictionary<int, bool> { public int PlayersReady => this.Count((KeyValuePair<int, bool> kvp) => kvp.Value); public int LobbySize => base.Count; public bool LocalPlayerReady { get { bool value = default(bool); return ReadyHandler.LocalPlayerId.HasValue && TryGetValue(ReadyHandler.LocalPlayerId.Value, out value) && value; } } public ReadyMap(IDictionary<int, bool> readyMap) : base((IDictionary<int, bool>)readyMap.ToDictionary((KeyValuePair<int, bool> k) => k.Key, (KeyValuePair<int, bool> e) => e.Value)) { } public override bool Equals(object? obj) { if (obj == null) { return false; } if (this == obj) { return true; } if (obj.GetType() != GetType()) { return false; } ReadyMap first = (ReadyMap)obj; return first.SequenceEqual(this); } public override string ToString() { return string.Join(", ", base.Keys.Select((int k) => $"{k}: {base[k]}")); } } public static class MyPluginInfo { public const string PLUGIN_GUID = "Enova.ReadyCompany"; public const string PLUGIN_NAME = "ReadyCompany"; public const string PLUGIN_VERSION = "1.1.1"; } } namespace ReadyCompany.Util { public static class AudioUtility { private static AudioClip? LoadFromDiskToAudioClip(string path, AudioType type) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Invalid comparison between Unknown and I4 AudioClip result = null; UnityWebRequest audioClip = UnityWebRequestMultimedia.GetAudioClip(path, type); try { audioClip.SendWebRequest(); try { while (!audioClip.isDone) { } if ((int)audioClip.result != 1) { ReadyCompany.Logger.LogError((object)("Failed to load WAV AudioClip from path: " + path + " Full error: " + audioClip.error)); } else { result = DownloadHandlerAudioClip.GetContent(audioClip); } } catch (Exception ex) { ReadyCompany.Logger.LogError((object)(ex.Message + ", " + ex.StackTrace)); } return result; } finally { ((IDisposable)audioClip)?.Dispose(); } } public static AudioClip? GetAudioClip(string path) { //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Invalid comparison between Unknown and I4 //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Invalid comparison between Unknown and I4 //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Invalid comparison between Unknown and I4 //IL_0180: Unknown result type (might be due to invalid IL or missing references) //IL_0181: Unknown result type (might be due to invalid IL or missing references) //IL_0183: Unknown result type (might be due to invalid IL or missing references) //IL_0185: Unknown result type (might be due to invalid IL or missing references) //IL_0187: Unknown result type (might be due to invalid IL or missing references) //IL_018b: Invalid comparison between Unknown and I4 //IL_0192: Unknown result type (might be due to invalid IL or missing references) //IL_0196: Invalid comparison between Unknown and I4 //IL_019a: Unknown result type (might be due to invalid IL or missing references) //IL_019e: Invalid comparison between Unknown and I4 string fileName = Path.GetFileName(path); string[] array = path.Split('.'); AudioType val; if (array[^1].ToLower().Contains("wav")) { val = (AudioType)20; ReadyCompany.Logger.LogDebug((object)"File detected as a PCM WAVE file!"); } else if (array[^1].ToLower().Contains("ogg")) { val = (AudioType)14; ReadyCompany.Logger.LogDebug((object)"File detected as an Ogg Vorbis file!"); } else if (array[^1].ToLower().Contains("mp3")) { val = (AudioType)13; ReadyCompany.Logger.LogDebug((object)"File detected as a MPEG MP3 file!"); } else { val = (AudioType)20; ReadyCompany.Logger.LogWarning((object)("Failed to detect file type of a sound file! This may cause issues with other mod functionality. Sound defaulted to WAV. Sound: " + fileName)); } AudioClip val2 = null; ReadyCompany.Logger.LogDebug((object)("Loading AudioClip path: " + path)); AudioType val3 = val; AudioType val4 = val3; if ((int)val4 != 13) { if ((int)val4 != 14) { if ((int)val4 == 20) { val2 = LoadFromDiskToAudioClip(path, (AudioType)20); } } else { val2 = LoadFromDiskToAudioClip(path, (AudioType)14); } } else { val2 = LoadFromDiskToAudioClip(path, (AudioType)13); } ReadyCompany.Logger.LogDebug((object)$"Finished loading AudioClip {fileName} with length of {((val2 != null) ? new float?(val2.length) : null)}!"); if ((Object)(object)val2 == (Object)null) { return val2; } if (string.IsNullOrEmpty(val2.GetName())) { AudioType val5 = val; AudioType val6 = val5; if ((int)val6 != 13) { if ((int)val6 != 14) { if ((int)val6 == 20) { string text = fileName.Replace(".wav", ""); string[] array2 = text.Split('/'); if (array2.Length <= 1) { array2 = text.Split('\\'); } text = array2[^1]; ((Object)val2).name = text; } } else { string text = fileName.Replace(".ogg", ""); string[] array2 = text.Split('/'); if (array2.Length <= 1) { array2 = text.Split('\\'); } text = array2[^1]; ((Object)val2).name = text; } } else { string text = fileName.Replace(".mp3", ""); string[] array2 = text.Split('/'); if (array2.Length <= 1) { array2 = text.Split('\\'); } text = array2[^1]; ((Object)val2).name = text; } } return val2; } } public static class Utils { private static readonly MethodInfo BeginSendClientRpc = AccessTools.Method(typeof(NetworkBehaviour), "__beginSendClientRpc", (Type[])null, (Type[])null); private static readonly MethodInfo BeginSendServerRpc = AccessTools.Method(typeof(NetworkBehaviour), "__beginSendServerRpc", (Type[])null, (Type[])null); internal static bool TryGetRpcID(MethodInfo methodInfo, out uint rpcID) { //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0078: 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) Collection<Instruction> instructions = PatchManager.GetMethodPatcher((MethodBase)methodInfo).CopyOriginal().Definition.Body.Instructions; rpcID = 0u; for (int i = 0; i < instructions.Count; i++) { if (instructions[i].OpCode == OpCodes.Ldc_I4 && instructions[i - 1].OpCode == OpCodes.Ldarg_0) { rpcID = (uint)(int)instructions[i].Operand; } if (!(instructions[i].OpCode != OpCodes.Call)) { object operand = instructions[i].Operand; MethodReference val = (MethodReference)((operand is MethodReference) ? operand : null); if (val != null && (Extensions.Is((MemberReference)(object)val, (MemberInfo)BeginSendClientRpc) || Extensions.Is((MemberReference)(object)val, (MemberInfo)BeginSendServerRpc))) { ReadyCompany.Logger.LogDebug((object)$"Rpc Id found for {methodInfo.Name}: {rpcID}U"); return true; } } } ReadyCompany.Logger.LogFatal((object)("Cannot find Rpc ID for " + methodInfo.Name)); return false; } internal static void PlayRandomClip(AudioSource audioSource, AudioClip[] clipsArray, float oneShotVolume = 1f) { int num = Random.Range(0, Mathf.Min(1000, clipsArray.Length)); audioSource.PlayOneShot(clipsArray[num], oneShotVolume); } internal static void Reset(this CallbackContext context) { ((CallbackContext)(ref context)).action.Disable(); ((CallbackContext)(ref context)).action.Enable(); } internal static bool IsInside(this DirectoryInfo path, DirectoryInfo folder) { if (path.Parent == null) { return false; } if (string.Equals(path.Parent.FullName, folder.FullName, StringComparison.InvariantCultureIgnoreCase)) { return true; } return path.Parent.IsInside(folder); } internal static bool IsInside(this FileInfo path, DirectoryInfo folder) { if (path.Directory == null) { return false; } if (string.Equals(path.Directory.FullName, folder.FullName, StringComparison.InvariantCultureIgnoreCase)) { return true; } return path.Directory.IsInside(folder); } } } namespace ReadyCompany.Patches { [HarmonyPatch(typeof(HoldInteraction))] public class HoldInteractionPatches { [HarmonyPatch("Process")] [HarmonyPrefix] public static bool ProcessPrefix(HoldInteraction __instance, ref InputInteractionContext context) { if ((((InputInteractionContext)(ref context)).action == ReadyCompany.InputActions?.ReadyInput || ((InputInteractionContext)(ref context)).action == ReadyCompany.InputActions?.UnreadyInput) && !ReadyHandler.LocalPlayerAbleToVote) { ((InputInteractionContext)(ref context)).Canceled(); return false; } return true; } } [HarmonyPatch(typeof(HUDManager))] [HarmonyPriority(500)] [HarmonyWrapSafe] internal class HUDPatches { internal static TextMeshProUGUI? ReadyStatusTextMesh; private static RectTransform? _parentTransform; [HarmonyPatch("Awake")] [HarmonyPostfix] private static void Start(ref HUDManager __instance) { //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Expected O, but got Unknown //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Expected O, but got Unknown //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_0171: Unknown result type (might be due to invalid IL or missing references) //IL_021b: Unknown result type (might be due to invalid IL or missing references) //IL_0221: Expected O, but got Unknown //IL_023b: Unknown result type (might be due to invalid IL or missing references) //IL_0243: Unknown result type (might be due to invalid IL or missing references) //IL_024c: Unknown result type (might be due to invalid IL or missing references) //IL_0267: Unknown result type (might be due to invalid IL or missing references) //IL_027d: Unknown result type (might be due to invalid IL or missing references) //IL_02b6: Unknown result type (might be due to invalid IL or missing references) Transform parent = ((Component)__instance.HUDElements[2].canvasGroup).transform.parent; if (!((Object)(object)parent == (Object)null)) { GameObject val = new GameObject("ReadyStatusDisplay", new Type[2] { typeof(TextMeshProUGUI), typeof(CanvasGroup) }); val.transform.SetParent(parent); __instance.HUDElements = CollectionExtensions.AddToArray<HUDElement>(__instance.HUDElements, new HUDElement { canvasGroup = val.GetComponent<CanvasGroup>(), targetAlpha = 1f }); _parentTransform = val.GetComponent<RectTransform>(); RectTransform? parentTransform = _parentTransform; RectTransform? parentTransform2 = _parentTransform; RectTransform? parentTransform3 = _parentTransform; Vector2 val2 = default(Vector2); ((Vector2)(ref val2))..ctor(0.5f, 0f); parentTransform3.pivot = val2; Vector2 val5 = (parentTransform.anchorMax = (parentTransform2.anchorMin = val2)); _parentTransform.sizeDelta = new Vector2(208f, 38f); ((Transform)_parentTransform).localScale = Vector3.one; _parentTransform.anchoredPosition3D = new Vector3(0f, 115f, -0.075f); ReadyStatusTextMesh = val.GetComponent<TextMeshProUGUI>(); ((TMP_Text)ReadyStatusTextMesh).font = ((TMP_Text)__instance.controlTipLines[0]).font; ((TMP_Text)ReadyStatusTextMesh).fontSize = 16f; ((TMP_Text)ReadyStatusTextMesh).enableWordWrapping = false; ((Graphic)ReadyStatusTextMesh).color = ReadyCompany.Config.StatusColor.Value; ((TMP_Text)ReadyStatusTextMesh).alignment = (TextAlignmentOptions)258; ((TMP_Text)ReadyStatusTextMesh).overflowMode = (TextOverflowModes)0; ((Behaviour)ReadyStatusTextMesh).enabled = true; ((TMP_Text)ReadyStatusTextMesh).text = ""; ((TMP_Text)__instance.tipsPanelHeader).m_fontAsset.fallbackFontAssetTable.Add(((TMP_Text)ReadyStatusTextMesh).font); ((TMP_Text)__instance.tipsPanelBody).m_fontAsset.fallbackFontAssetTable.Add(((TMP_Text)ReadyStatusTextMesh).font); GameObject val6 = new GameObject("InteractionBar", new Type[2] { typeof(Image), typeof(InteractionBarUI) }); RectTransform component = val6.GetComponent<RectTransform>(); ((Vector2)(ref val5))..ctor(1f, 0f); component.pivot = val5; component.anchorMax = val5; component.anchorMin = Vector2.zero; component.anchoredPosition3D = new Vector3(-2f, 0f, 0f); component.sizeDelta = new Vector2(0f, 5f); Image component2 = val6.GetComponent<Image>(); component2.fillMethod = (FillMethod)0; component2.type = (Type)3; component2.sprite = CreateSpriteFromTexture(Texture2D.whiteTexture); ((Graphic)component2).color = Color.white; val6.transform.SetParent(((Component)_parentTransform).transform, false); UpdatePlacementBasedOnConfig(ReadyCompany.Config.StatusPlacement.Value); } } private static Sprite CreateSpriteFromTexture(Texture2D texture2D) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) Sprite val = Sprite.Create(texture2D, new Rect(0f, 0f, (float)((Texture)texture2D).width, (float)((Texture)texture2D).height), new Vector2(0.5f, 0.5f)); ((Object)val).name = ((Object)texture2D).name; return val; } public static void UpdateTextBasedOnStatus(ReadyMap status) { if ((Object)(object)ReadyStatusTextMesh != (Object)null) { ((TMP_Text)ReadyStatusTextMesh).text = ReadyHandler.GetBriefStatusDisplay(status); ((Component)ReadyStatusTextMesh).gameObject.SetActive(ReadyHandler.InVotingPhase); } } public static void UpdatePlacementBasedOnConfig(StatusPlacement placement) { //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_0147: Unknown result type (might be due to invalid IL or missing references) //IL_014f: Unknown result type (might be due to invalid IL or missing references) //IL_0151: Unknown result type (might be due to invalid IL or missing references) //IL_0152: Unknown result type (might be due to invalid IL or missing references) //IL_0159: Unknown result type (might be due to invalid IL or missing references) //IL_0174: Unknown result type (might be due to invalid IL or missing references) //IL_01b4: Unknown result type (might be due to invalid IL or missing references) //IL_01bc: Unknown result type (might be due to invalid IL or missing references) //IL_01be: Unknown result type (might be due to invalid IL or missing references) //IL_01bf: Unknown result type (might be due to invalid IL or missing references) //IL_01c6: Unknown result type (might be due to invalid IL or missing references) //IL_01e1: Unknown result type (might be due to invalid IL or missing references) //IL_0221: Unknown result type (might be due to invalid IL or missing references) //IL_0229: Unknown result type (might be due to invalid IL or missing references) //IL_022b: Unknown result type (might be due to invalid IL or missing references) //IL_022c: Unknown result type (might be due to invalid IL or missing references) //IL_0233: Unknown result type (might be due to invalid IL or missing references) //IL_024e: Unknown result type (might be due to invalid IL or missing references) //IL_028e: Unknown result type (might be due to invalid IL or missing references) //IL_0296: Unknown result type (might be due to invalid IL or missing references) //IL_0298: Unknown result type (might be due to invalid IL or missing references) //IL_0299: Unknown result type (might be due to invalid IL or missing references) //IL_02a0: Unknown result type (might be due to invalid IL or missing references) //IL_02bb: Unknown result type (might be due to invalid IL or missing references) //IL_02f8: Unknown result type (might be due to invalid IL or missing references) //IL_0300: Unknown result type (might be due to invalid IL or missing references) //IL_0302: Unknown result type (might be due to invalid IL or missing references) //IL_0303: Unknown result type (might be due to invalid IL or missing references) //IL_030a: Unknown result type (might be due to invalid IL or missing references) //IL_0325: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)ReadyStatusTextMesh == (Object)null) && !((Object)(object)_parentTransform == (Object)null)) { Vector2 val = default(Vector2); switch (placement) { default: { RectTransform? parentTransform19 = _parentTransform; RectTransform? parentTransform20 = _parentTransform; RectTransform? parentTransform21 = _parentTransform; ((Vector2)(ref val))..ctor(0.5f, 0f); parentTransform21.pivot = val; Vector2 anchorMax = (parentTransform20.anchorMin = val); parentTransform19.anchorMax = anchorMax; _parentTransform.anchoredPosition3D = new Vector3(0f, 110f, -0.075f); ((TMP_Text)ReadyStatusTextMesh).alignment = (TextAlignmentOptions)258; break; } case StatusPlacement.BelowHotbar: { RectTransform? parentTransform16 = _parentTransform; RectTransform? parentTransform17 = _parentTransform; RectTransform? parentTransform18 = _parentTransform; ((Vector2)(ref val))..ctor(0.5f, 0f); parentTransform18.pivot = val; Vector2 anchorMax = (parentTransform17.anchorMin = val); parentTransform16.anchorMax = anchorMax; _parentTransform.anchoredPosition3D = new Vector3(0f, 0f, -0.075f); ((TMP_Text)ReadyStatusTextMesh).alignment = (TextAlignmentOptions)258; break; } case StatusPlacement.RightHotbar: { RectTransform? parentTransform13 = _parentTransform; RectTransform? parentTransform14 = _parentTransform; RectTransform? parentTransform15 = _parentTransform; ((Vector2)(ref val))..ctor(1f, 0f); parentTransform15.pivot = val; Vector2 anchorMax = (parentTransform14.anchorMin = val); parentTransform13.anchorMax = anchorMax; _parentTransform.anchoredPosition3D = new Vector3(-75f, 55f, -0.075f); ((TMP_Text)ReadyStatusTextMesh).alignment = (TextAlignmentOptions)257; break; } case StatusPlacement.LeftHotbar: { RectTransform? parentTransform10 = _parentTransform; RectTransform? parentTransform11 = _parentTransform; RectTransform? parentTransform12 = _parentTransform; ((Vector2)(ref val))..ctor(0f, 0f); parentTransform12.pivot = val; Vector2 anchorMax = (parentTransform11.anchorMin = val); parentTransform10.anchorMax = anchorMax; _parentTransform.anchoredPosition3D = new Vector3(75f, 55f, -0.075f); ((TMP_Text)ReadyStatusTextMesh).alignment = (TextAlignmentOptions)260; break; } case StatusPlacement.TopScreen: { RectTransform? parentTransform7 = _parentTransform; RectTransform? parentTransform8 = _parentTransform; RectTransform? parentTransform9 = _parentTransform; ((Vector2)(ref val))..ctor(0.5f, 1f); parentTransform9.pivot = val; Vector2 anchorMax = (parentTransform8.anchorMin = val); parentTransform7.anchorMax = anchorMax; _parentTransform.anchoredPosition3D = new Vector3(0f, 0f, -0.075f); ((TMP_Text)ReadyStatusTextMesh).alignment = (TextAlignmentOptions)258; break; } case StatusPlacement.BottomRightScreen: { RectTransform? parentTransform4 = _parentTransform; RectTransform? parentTransform5 = _parentTransform; RectTransform? parentTransform6 = _parentTransform; ((Vector2)(ref val))..ctor(1f, 0f); parentTransform6.pivot = val; Vector2 anchorMax = (parentTransform5.anchorMin = val); parentTransform4.anchorMax = anchorMax; _parentTransform.anchoredPosition3D = new Vector3(0f, 0f, -0.075f); ((TMP_Text)ReadyStatusTextMesh).alignment = (TextAlignmentOptions)260; break; } case StatusPlacement.BottomLeftScreen: { RectTransform? parentTransform = _parentTransform; RectTransform? parentTransform2 = _parentTransform; RectTransform? parentTransform3 = _parentTransform; ((Vector2)(ref val))..ctor(0f, 0f); parentTransform3.pivot = val; Vector2 anchorMax = (parentTransform2.anchorMin = val); parentTransform.anchorMax = anchorMax; _parentTransform.anchoredPosition3D = new Vector3(0f, 0f, -0.075f); ((TMP_Text)ReadyStatusTextMesh).alignment = (TextAlignmentOptions)257; break; } } } } } [HarmonyPatch(typeof(InputActionMap))] [HarmonyPriority(500)] [HarmonyWrapSafe] internal class InputActionMapPatches { [HarmonyPatch("OnBindingModified")] [HarmonyPostfix] public static void OnBindingModifiedPatch(ref InputActionMap __instance) { InputActionMap obj = __instance; ReadyInputs? inputActions = ReadyCompany.InputActions; if (obj != ((inputActions != null) ? inputActions.ReadyInput.actionMap : null)) { InputActionMap obj2 = __instance; ReadyInputs? inputActions2 = ReadyCompany.InputActions; if (obj2 != ((inputActions2 != null) ? inputActions2.UnreadyInput.actionMap : null)) { return; } } ReadyHandler.ForceReadyStatusChanged(); } } internal class JoinPatches { internal static void Init() { //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Expected O, but got Unknown MethodInfo methodInfo = AccessTools.Method(typeof(StartOfRound), "SyncAlreadyHeldObjectsServerRpc", (Type[])null, (Type[])null); if (Utils.TryGetRpcID(methodInfo, out var rpcID)) { MethodInfo methodInfo2 = AccessTools.Method(typeof(StartOfRound), $"__rpc_handler_{rpcID}", (Type[])null, (Type[])null); MethodInfo methodInfo3 = AccessTools.Method(typeof(JoinPatches), "ClientConnectionCompleted1", (Type[])null, (Type[])null); ReadyCompany.Harmony.Patch((MethodBase)methodInfo2, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, new HarmonyMethod(methodInfo3), (HarmonyMethod)null); } } private static void ClientConnectionCompleted1(NetworkBehaviour target, __RpcParams rpcParams) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) StartOfRound val = (StartOfRound)target; if (((NetworkBehaviour)val).IsServer) { ulong senderClientId = rpcParams.Server.Receive.SenderClientId; ReadyHandler.OnClientConnected(); } } } [HarmonyPatch(typeof(MenuManager))] [HarmonyPriority(500)] [HarmonyWrapSafe] internal class MenuManagerPatches { [HarmonyPatch("Awake")] [HarmonyPostfix] public static void MainMenuLoaded() { ReadyHandler.ResetReadyUp(); } } [HarmonyPatch(typeof(PlayerControllerB))] [HarmonyPriority(500)] [HarmonyWrapSafe] internal class PlayerControllerBPatches { private static bool _localPlayerUsingControllerPreviously; [HarmonyPatch("ConnectClientToPlayerObject")] [HarmonyPostfix] public static void PlayerLoadedPatch() { if (LNetworkUtils.IsConnected && LNetworkUtils.IsHostOrServer) { ReadyHandler.ShouldPlaySound = false; ReadyHandler.ResetReadyUp(); } } [HarmonyPatch("Look_performed")] [HarmonyPostfix] public static void LookPerformedPatch() { if (!((Object)(object)StartOfRound.Instance == (Object)null)) { if (StartOfRound.Instance.localPlayerUsingController != _localPlayerUsingControllerPreviously) { ReadyHandler.ForceReadyStatusChanged(); } _localPlayerUsingControllerPreviously = StartOfRound.Instance.localPlayerUsingController; } } } [HarmonyPatch(typeof(StartMatchLever))] [HarmonyAfter(new string[] { "imabatby.lethallevelloader" })] [HarmonyWrapSafe] internal class StartMatchLeverPatches { public static bool HasShownReadyWarning; private static bool _shouldOverrideLeverState; private static string _previousHoverTip; private static string _previousDisabledHoverTip; private static bool _previousInteractableState; private static bool _justWroteInteractableState; [HarmonyPatch("Start")] [HarmonyPostfix] public static void StartPatch(InteractTrigger ___triggerScript) { _previousHoverTip = ___triggerScript.hoverTip; _previousDisabledHoverTip = ___triggerScript.disabledHoverTip; _previousInteractableState = ___triggerScript.interactable; } [HarmonyPatch("Update")] [HarmonyPostfix] public static void UpdatePatch(InteractTrigger ___triggerScript) { _shouldOverrideLeverState = ReadyHandler.ShouldOverrideLeverState(ReadyHandler.ReadyStatus.Value); bool flag = string.Equals(___triggerScript.hoverTip, "[ WARNING: Lobby Not Ready ]") || string.Equals(___triggerScript.hoverTip, "[ Lobby must be ready to start ]"); bool flag2 = string.Equals(___triggerScript.disabledHoverTip, "[ WARNING: Lobby Not Ready ]") || string.Equals(___triggerScript.disabledHoverTip, "[ Lobby must be ready to start ]"); if (!flag && !flag2) { _previousHoverTip = ___triggerScript.hoverTip; _previousDisabledHoverTip = ___triggerScript.disabledHoverTip; _previousInteractableState = ___triggerScript.interactable; } if (_previousInteractableState != ___triggerScript.interactable && !_justWroteInteractableState) { _previousInteractableState = ___triggerScript.interactable; } if (_shouldOverrideLeverState) { bool flag3 = (_previousInteractableState ? LNetworkUtils.IsHostOrServer : _previousInteractableState); ___triggerScript.hoverTip = (___triggerScript.disabledHoverTip = (flag3 ? "[ WARNING: Lobby Not Ready ]" : "[ Lobby must be ready to start ]")); ___triggerScript.interactable = flag3; _justWroteInteractableState = true; } else if (flag || flag2) { ___triggerScript.hoverTip = _previousHoverTip; ___triggerScript.disabledHoverTip = ((string.IsNullOrEmpty(_previousDisabledHoverTip) && !_previousInteractableState) ? _previousHoverTip : _previousDisabledHoverTip); ___triggerScript.interactable = _previousInteractableState; _justWroteInteractableState = false; } } [HarmonyPatch("BeginHoldingInteractOnLever")] [HarmonyPostfix] public static void OnHoldLeverPatch(StartMatchLever __instance) { if (_shouldOverrideLeverState) { __instance.triggerScript.timeToHold = 4f; if (!HasShownReadyWarning) { HUDManager.Instance.DisplayTip("HALT!", "The lobby is not ready!", true, false, "LC_Tip1"); HasShownReadyWarning = true; __instance.hasDisplayedTimeWarning = false; } } else if (ReadyHandler.InVotingPhase && TimeOfDay.Instance.daysUntilDeadline > 0) { __instance.triggerScript.timeToHold = 0.7f; } } } [HarmonyPatch(typeof(StartOfRound))] [HarmonyPriority(500)] [HarmonyWrapSafe] internal class StartOfRoundPatches { [HarmonyPatch("OnPlayerDC")] [HarmonyPostfix] public static void OnClientDisconnectedPatch() { if (LNetworkUtils.IsConnected && LNetworkUtils.IsHostOrServer) { ReadyHandler.OnClientDisconnected(); } } [HarmonyPatch("SetShipReadyToLand")] [HarmonyPatch("StartGame")] [HarmonyPatch("SwitchMapMonitorPurpose")] [HarmonyPatch("SceneManager_OnLoad")] [HarmonyPatch(/*Could not decode attribute arguments.*/)] [HarmonyPostfix] public static void NeedsResetPatches() { if (LNetworkUtils.IsConnected) { ReadyHandler.ResetReadyUp(); } if (!ReadyHandler.InVotingPhase && (Object)(object)HUDManager.Instance != (Object)null) { ((Behaviour)HUDManager.Instance.spectatorTipText).enabled = false; } } [HarmonyPatch("ArriveAtLevel")] [HarmonyPostfix] public static void OnShipArriveAtLevelPatch() { if (LNetworkUtils.IsConnected && LNetworkUtils.IsHostOrServer) { ReadyHandler.UpdateShipLever(ReadyHandler.ReadyStatus.Value); } } } } namespace ReadyCompany.Config { public enum InteractionPreset { Hold, LongHold, Press, DoubleTap, TripleTap, Custom } public class ReadyCompanyConfig : SyncedConfig2<ReadyCompanyConfig> { internal const string FEATURES_STRING = "Features"; internal const string CUSTOMIZATION_STRING = "Customization"; internal const string INTERACTION_STRING = "Interaction"; [field: SyncedEntryField] public SyncedEntry<bool> RequireReadyToStart { get; private set; } [field: SyncedEntryField] public SyncedEntry<bool> AutoStartWhenReady { get; private set; } [field: SyncedEntryField] public SyncedEntry<int> PercentageForReady { get; private set; } [field: SyncedEntryField] public SyncedEntry<bool> DeadPlayersCanVote { get; private set; } public ConfigEntry<Color> StatusColor { get; private set; } public ConfigEntry<StatusPlacement> StatusPlacement { get; private set; } public ConfigEntry<bool> ShowPopup { get; private set; } public ConfigEntry<bool> PlaySound { get; private set; } public ConfigEntry<int> SoundVolume { get; private set; } public ConfigEntry<Color> ReadyBarColor { get; private set; } public ConfigEntry<InteractionPreset> ReadyInteractionPreset { get; private set; } public ConfigEntry<string> CustomReadyInteractionString { get; private set; } public ConfigEntry<Color> UnreadyBarColor { get; private set; } public ConfigEntry<InteractionPreset> UnreadyInteractionPreset { get; private set; } public ConfigEntry<string> CustomUnreadyInteractionString { get; private set; } internal List<AudioClip> CustomPopupSounds { get; private set; } = new List<AudioClip>(); internal List<AudioClip> CustomLobbyReadySounds { get; private set; } = new List<AudioClip>(); public ReadyCompanyConfig(ConfigFile cfg) : base("Enova.ReadyCompany") { //IL_0164: Unknown result type (might be due to invalid IL or missing references) //IL_0212: Unknown result type (might be due to invalid IL or missing references) //IL_0233: Unknown result type (might be due to invalid IL or missing references) RequireReadyToStart = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, "Features", "RequireReadyToStart", false, "Require the lobby to be Ready to pull the ship lever."); AutoStartWhenReady = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, "Features", "AutoStartWhenReady", false, "Automatically pull the ship lever when the lobby is Ready."); PercentageForReady = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, "Features", "PercentageForReady", 100, "What percentage of ready players is needed for the lobby to be considered \"Ready\"."); DeadPlayersCanVote = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, "Features", "DeadPlayersCanVote", true, "Whether or not dead players are allowed to participate in the ready check or are forced to be ready. (During Company visits)"); RequireReadyToStart.Changed += delegate { ReadyHandler.UpdateReadyMap(); }; AutoStartWhenReady.Changed += delegate { ReadyHandler.UpdateReadyMap(); }; RequireReadyToStart.Changed += delegate { ReadyHandler.UpdateReadyMap(); }; DeadPlayersCanVote.Changed += delegate { ReadyHandler.UpdateReadyMap(); }; StatusColor = cfg.Bind<Color>("Customization", "StatusColor", new Color(0.9528f, 0.3941f, 0f, 1f), "The color of the ready status text."); StatusPlacement = cfg.Bind<StatusPlacement>("Customization", "StatusPlacement", global::ReadyCompany.Config.StatusPlacement.AboveHotbar, "Where to place the text showing the ready status."); ShowPopup = cfg.Bind<bool>("Customization", "ShowPopup", false, "Whether or not to show a popup when the ready status changes."); PlaySound = cfg.Bind<bool>("Customization", "PlaySound", true, "Whether or not to play a sound when the ready status changes."); SoundVolume = cfg.Bind<int>("Customization", "SoundVolume", 100, "The volume of the popup sound."); StatusPlacement.SettingChanged += delegate { HUDPatches.UpdatePlacementBasedOnConfig(StatusPlacement.Value); }; ReadyBarColor = cfg.Bind<Color>("Interaction", "ReadyBarColor", Color.white, "What color the bar should be when holding the bind."); UnreadyBarColor = cfg.Bind<Color>("Interaction", "UnreadyBarColor", Color.red, "What color the bar should be when holding the bind."); ReadyInteractionPreset = cfg.Bind<InteractionPreset>("Interaction", "ReadyInteractionPreset", InteractionPreset.LongHold, "How you want to press the ready bind to ready up."); UnreadyInteractionPreset = cfg.Bind<InteractionPreset>("Interaction", "UnreadyInteractionPreset", InteractionPreset.TripleTap, "How you want to press the unready bind to unready."); CustomReadyInteractionString = cfg.Bind<string>("Interaction", "CustomReadyInteractionString", "hold(duration = 1.5)", "Specify a custom interaction type for this input."); CustomUnreadyInteractionString = cfg.Bind<string>("Interaction", "CustomUnreadyInteractionString", "multiTap(tapTime = 0.2, tapCount = 3)", "Specify a custom interaction type for this input."); ReadyInteractionPreset.SettingChanged += delegate { SetInteractionStringBasedOnPreset(CustomReadyInteractionString, ReadyInteractionPreset.Value); }; UnreadyInteractionPreset.SettingChanged += delegate { SetInteractionStringBasedOnPreset(CustomUnreadyInteractionString, UnreadyInteractionPreset.Value); }; CustomReadyInteractionString.SettingChanged += delegate { UpdateBindingsInteractions(); }; CustomUnreadyInteractionString.SettingChanged += delegate { UpdateBindingsInteractions(); }; LoadCustomSounds(); ConfigManager.Register<ReadyCompanyConfig>((SyncedConfig2<ReadyCompanyConfig>)(object)this); } internal void LoadCustomSounds() { CustomPopupSounds.Clear(); CustomLobbyReadySounds.Clear(); DirectoryInfo directoryInfo = Directory.CreateDirectory(Path.Combine(Paths.ConfigPath, "Enova.ReadyCompany", "CustomSounds")); DirectoryInfo folder = directoryInfo.CreateSubdirectory("LobbyReady"); foreach (FileInfo item in directoryInfo.EnumerateFiles("*.*", SearchOption.AllDirectories)) { if (new string[3] { ".wav", ".mp3", ".ogg" }.Contains(item.Extension)) { AudioClip audioClip = AudioUtility.GetAudioClip(item.FullName); if ((Object)(object)audioClip == (Object)null) { ReadyCompany.Logger.LogError((object)$"Failed to load audio clip: {item}"); continue; } if (item.IsInside(folder)) { CustomLobbyReadySounds.Add(audioClip); continue; } ReadyCompany.Logger.LogDebug((object)$"Loading audioclip {item}"); CustomPopupSounds.Add(audioClip); } } } internal void UpdateCustomInteractionStringsBasedOnPresets() { SetInteractionStringBasedOnPreset(CustomReadyInteractionString, ReadyInteractionPreset.Value); SetInteractionStringBasedOnPreset(CustomUnreadyInteractionString, UnreadyInteractionPreset.Value); } private void SetInteractionStringBasedOnPreset(ConfigEntry<string> config, InteractionPreset value) { config.Value = GetInteractionStringBasedOnPreset(value) ?? config.Value; } private string? GetInteractionStringBasedOnPreset(InteractionPreset value) { if (1 == 0) { } string result = value switch { InteractionPreset.Hold => "hold(duration = 0.75)", InteractionPreset.LongHold => "hold(duration = 1.5)", InteractionPreset.Press => "press", InteractionPreset.DoubleTap => "multiTap(tapTime = 0.2, tapCount = 2)", InteractionPreset.TripleTap => "multiTap(tapTime = 0.2, tapCount = 3)", InteractionPreset.Custom => null, _ => throw new ArgumentOutOfRangeException("value", value, null), }; if (1 == 0) { } return result; } internal void UpdateBindingsInteractions() { if (ReadyCompany.InputActions != null) { ReadyCompany.Logger.LogDebug((object)"Update bindings!"); UpdateBindingInteraction(ReadyCompany.InputActions.ReadyInput, CustomReadyInteractionString.Value); UpdateBindingInteraction(ReadyCompany.InputActions.UnreadyInput, CustomUnreadyInteractionString.Value); } } internal void UpdateBindingInteraction(InputAction action, string interactions) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) Enumerator<InputBinding> enumerator = action.bindings.GetEnumerator(); try { while (enumerator.MoveNext()) { InputBinding current = enumerator.Current; BindingSyntax val = InputActionSetupExtensions.ChangeBinding(action, current); InputBinding val2 = current; ((InputBinding)(ref val2)).interactions = interactions; ((BindingSyntax)(ref val)).To(val2); } } finally { ((IDisposable)enumerator).Dispose(); } } } public class ReadyInputs : LcInputActions { [InputAction(/*Could not decode attribute arguments.*/)] public InputAction ReadyInput { get; set; } = null; [InputAction(/*Could not decode attribute arguments.*/)] public InputAction UnreadyInput { get; set; } = null; internal int CurrentBinding { get { StartOfRound instance = StartOfRound.Instance; return (instance != null && instance.localPlayerUsingController) ? 1 : 0; } } public string ReadyInputName { get { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) InputBinding val = ReadyInput.bindings[CurrentBinding]; return ((InputBinding)(ref val)).ToDisplayString((DisplayStringOptions)0, (InputControl)null); } } public string UnreadyInputName { get { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) InputBinding val = UnreadyInput.bindings[CurrentBinding]; return ((InputBinding)(ref val)).ToDisplayString((DisplayStringOptions)0, (InputControl)null); } } } public enum StatusPlacement { AboveHotbar, BelowHotbar, RightHotbar, LeftHotbar, TopScreen, BottomRightScreen, BottomLeftScreen } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } }