using 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)
{
}
}
}