Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of Better Lobbies v2.0.1
plugins/Better_Lobbies.dll
Decompiled 2 years agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Logging; using Microsoft.CodeAnalysis; using On; using Steamworks; using Steamworks.Data; using TMPro; using Unity.Netcode; using UnityEngine; using UnityEngine.Events; using UnityEngine.InputSystem.Utilities; using UnityEngine.ProBuilder; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [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("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.ARModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.NVIDIAModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.UI")] [assembly: AssemblyCompany("Ryokune")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyDescription("Enhance your multiplayer experience by having additional lobby related QoL features in game!")] [assembly: AssemblyFileVersion("2.0.1.0")] [assembly: AssemblyInformationalVersion("2.0.1+160a4c9a0984fdc8422ef5f8b0e6e81b5d28ddb8")] [assembly: AssemblyProduct("Better_Lobbies")] [assembly: AssemblyTitle("ryokune.better_lobbies")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/VisualError/Better-Lobbies")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("2.0.0.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; } } } [AttributeUsage(AttributeTargets.Method)] internal class HookInitAttribute : Attribute { } [BepInPlugin("ryokune.better_lobbies", "Better_Lobbies", "2.0.1")] public class Plugin : BaseUnityPlugin { public static ManualLogSource Log; private void Awake() { Log = ((BaseUnityPlugin)this).Logger; Log.LogInfo((object)"Plugin Better_Lobbies is loaded!"); Hook(); } private static void Hook() { Log.LogInfo((object)"Starting Hooks!"); Type[] types = Assembly.GetExecutingAssembly().GetTypes(); Type[] array = types; foreach (Type type in array) { MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); MethodInfo[] array2 = methods; foreach (MethodInfo methodInfo in array2) { if (methodInfo.GetCustomAttribute<HookInitAttribute>() != null) { Log.LogDebug((object)("Hooking " + type.Name)); methodInfo.Invoke(null, null); } } } } } internal static class LCMPluginInfo { public const string PLUGIN_GUID = "ryokune.better_lobbies"; public const string PLUGIN_NAME = "Better_Lobbies"; public const string PLUGIN_VERSION = "2.0.1"; } namespace Better_Lobbies.Hooks { internal class EnterLobbyCode { [CompilerGenerated] private static class <>O { public static hook_Awake <0>__InitializeField; public static UnityAction<string> <1>__onSubmit; public static UnityAction<string> <2>__onEndEdit; public static UnityAction<string> <3>__onDeselect; public static OnValidateInput <4>__ValidateInput; } private static GameObject? FieldObj; internal static TMP_InputField? InputField; private static bool stop; [HookInit] internal static void Init() { //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_001b: Expected O, but got Unknown object obj = <>O.<0>__InitializeField; if (obj == null) { hook_Awake val = InitializeField; <>O.<0>__InitializeField = val; obj = (object)val; } MenuManager.Awake += (hook_Awake)obj; } private static void InitializeField(orig_Awake orig, MenuManager self) { orig.Invoke(self); GetFieldObj(); if (!((Object)(object)FieldObj == (Object)null) && !FieldObj.activeInHierarchy) { FieldObj.SetActive(true); GetInputField(FieldObj); InitializeInputField(InputField); Plugin.Log.LogInfo((object)"Initialized Lobby search field!"); } } private static void GetFieldObj() { if ((Object)(object)FieldObj == (Object)null) { FieldObj = GameObject.Find("/Canvas/MenuContainer/LobbyList/JoinCode"); Plugin.Log.LogDebug((object)$"Trying to find Lobby Code Field OBJ. Got: {(Object)(object)FieldObj != (Object)null}"); } } private static void GetInputField(GameObject gameObject) { if ((Object)(object)InputField == (Object)null) { InputField = gameObject.GetComponent<TMP_InputField>(); Plugin.Log.LogDebug((object)$"Trying to find Input Field. Got: {(Object)(object)InputField != (Object)null}"); } } private static void InitializeInputField(TMP_InputField? field) { //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Expected O, but got Unknown //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Expected O, but got Unknown if (!((Object)(object)field == (Object)null)) { ((Selectable)field).interactable = true; ((TMP_Text)((Component)field.placeholder).gameObject.GetComponent<TextMeshProUGUI>()).text = "Search or Enter a room code..."; ((UnityEventBase)field.onEndEdit).m_PersistentCalls.Clear(); ((UnityEventBase)field.onEndTextSelection).m_PersistentCalls.Clear(); ((UnityEventBase)field.onSubmit).m_PersistentCalls.Clear(); ((UnityEvent<string>)(object)field.onSubmit).AddListener((UnityAction<string>)onSubmit); ((UnityEvent<string>)(object)field.onEndEdit).AddListener((UnityAction<string>)onEndEdit); ((UnityEvent<string>)(object)field.onDeselect).AddListener((UnityAction<string>)onDeselect); OnValidateInput onValidateInput = field.onValidateInput; object obj = <>O.<4>__ValidateInput; if (obj == null) { OnValidateInput val = ValidateInput; <>O.<4>__ValidateInput = val; obj = (object)val; } field.onValidateInput = (OnValidateInput)Delegate.Combine((Delegate?)(object)onValidateInput, (Delegate?)obj); } } private static void onEndEdit(string value) { stop = false; } private static void onDeselect(string value) { stop = false; if ((Object)(object)InputField != (Object)null) { InputField.text = ""; } } private static char ValidateInput(string text, int charIndex, char addedChar) { Plugin.Log.LogWarning((object)addedChar); if (addedChar == '"') { stop = true; } if ((!char.IsDigit(addedChar) && !char.IsControl(addedChar)) || stop) { return '\0'; } return addedChar; } private static void onSubmit(string value) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_004a: 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_0052: Unknown result type (might be due to invalid IL or missing references) if (!ulong.TryParse(value, out var result)) { SteamLobbyManager? instance = SteamLobbyManager.Instance; if (instance != null) { instance.LoadServerList(); } } Lobby val = default(Lobby); ((Lobby)(ref val))..ctor(SteamId.op_Implicit(result)); if (Utility.IsNullOrWhiteSpace(((Lobby)(ref val)).GetData("vers"))) { SteamLobbyManager? instance2 = SteamLobbyManager.Instance; if (instance2 != null) { instance2.LoadServerList(); } } else { LobbySlot.JoinLobbyAfterVerifying(val, ((Lobby)(ref val)).Owner.Id); } } } internal class InGameMenu { [CompilerGenerated] private static class <>O { public static hook_Start <0>__InsertCustomUI; public static hook_OpenQuickMenu <1>__OpenQuickMenu; public static hook_CloseQuickMenu <2>__QuickMenuManager_CloseQuickMenu; } private static GameObject? QuickMenu; private static GameObject? DebugMenu; private static GameObject? LobbyCodeObj; private static GameObject? QuitObj; private static TextMeshProUGUI? LobbyCodeTextMesh; private static RectTransform? LobbyCodeRect; private static RectTransform? ResumeRect; [HookInit] private static void Init() { //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_001b: Expected O, but got Unknown //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Expected O, but got Unknown //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Expected O, but got Unknown object obj = <>O.<0>__InsertCustomUI; if (obj == null) { hook_Start val = InsertCustomUI; <>O.<0>__InsertCustomUI = val; obj = (object)val; } QuickMenuManager.Start += (hook_Start)obj; object obj2 = <>O.<1>__OpenQuickMenu; if (obj2 == null) { hook_OpenQuickMenu val2 = OpenQuickMenu; <>O.<1>__OpenQuickMenu = val2; obj2 = (object)val2; } QuickMenuManager.OpenQuickMenu += (hook_OpenQuickMenu)obj2; object obj3 = <>O.<2>__QuickMenuManager_CloseQuickMenu; if (obj3 == null) { hook_CloseQuickMenu val3 = QuickMenuManager_CloseQuickMenu; <>O.<2>__QuickMenuManager_CloseQuickMenu = val3; obj3 = (object)val3; } QuickMenuManager.CloseQuickMenu += (hook_CloseQuickMenu)obj3; } private static void QuickMenuManager_CloseQuickMenu(orig_CloseQuickMenu orig, QuickMenuManager self) { orig.Invoke(self); if ((Object)(object)LobbyCodeTextMesh != (Object)null) { ((TMP_Text)LobbyCodeTextMesh).text = "> Lobby Code"; } } private static void OpenQuickMenu(orig_OpenQuickMenu orig, QuickMenuManager self) { orig.Invoke(self); AdjustLobbyCode(); AddCrewCount(); } private static void AddCrewCount() { //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_005b: 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_007a: Unknown result type (might be due to invalid IL or missing references) GameObject? quickMenu = QuickMenu; TextMeshProUGUI val = ((quickMenu != null) ? ((Component)quickMenu.transform.Find("PlayerList/Image/Header")).GetComponentInChildren<TextMeshProUGUI>() : null); if (!((Object)(object)val == (Object)null)) { object arg = (StartOfRound.Instance?.connectedPlayersAmount ?? 0) + 1; Lobby value = GameNetworkManager.Instance.currentLobby.Value; object arg2 = ((Lobby)(ref value)).MaxMembers; value = GameNetworkManager.Instance.currentLobby.Value; ((TMP_Text)val).text = string.Format("CREW ({0}/{1}):\n{2}", arg, arg2, ((Lobby)(ref value)).GetData("name")); } } private static void AdjustLobbyCode() { //IL_0061: 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_00d2: 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_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)LobbyCodeRect == (Object)null || (Object)(object)LobbyCodeObj == (Object)null) { return; } if ((Object)(object)DebugMenu != (Object)null && DebugMenu.activeSelf) { LobbyCodeObj.transform.SetParent(DebugMenu.transform); ((Transform)LobbyCodeRect).localPosition = new Vector3(125f, 185f, 0f); ((Transform)LobbyCodeRect).localScale = new Vector3(1f, 1f, 1f); } else if ((Object)(object)ResumeRect != (Object)null && (Object)(object)QuitObj != (Object)null) { GameObject? lobbyCodeObj = LobbyCodeObj; if (lobbyCodeObj != null) { lobbyCodeObj.transform.SetParent(QuitObj.transform.parent); } ((Transform)LobbyCodeRect).localPosition = ((Transform)ResumeRect).localPosition + new Vector3(0f, -55.5941f, 0f); ((Transform)LobbyCodeRect).localScale = ((Transform)ResumeRect).localScale; } } private static void InsertCustomUI(orig_Start orig, QuickMenuManager self) { //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_0146: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Expected O, but got Unknown orig.Invoke(self); QuickMenu = GameObject.Find("/Systems/UI/Canvas/QuickMenu/"); Transform obj = QuickMenu.transform.Find("DebugMenu"); DebugMenu = ((obj != null) ? ((Component)obj).gameObject : null); Transform obj2 = QuickMenu.transform.Find("MainButtons/Quit/"); QuitObj = ((obj2 != null) ? ((Component)obj2).gameObject : null); if (!((Object)(object)QuitObj == (Object)null)) { ResumeRect = QuitObj.GetComponent<RectTransform>(); LobbyCodeObj = Object.Instantiate<GameObject>(QuitObj.gameObject, QuitObj.transform.parent); LobbyCodeTextMesh = LobbyCodeObj.GetComponentInChildren<TextMeshProUGUI>(); Button LobbyCodeButton = LobbyCodeObj.GetComponent<Button>(); LobbyCodeRect = LobbyCodeObj.GetComponent<RectTransform>(); ((Transform)LobbyCodeRect).localPosition = QuitObj.transform.localPosition + new Vector3(0f, -55.5941f, 0f); ((Transform)LobbyCodeRect).localScale = QuitObj.transform.localScale; ((UnityEventBase)LobbyCodeButton.onClick).m_PersistentCalls.Clear(); ((UnityEvent)LobbyCodeButton.onClick).AddListener((UnityAction)delegate { ((MonoBehaviour)LobbyCodeButton).StartCoroutine(CopyCode(LobbyCodeTextMesh)); }); ((Object)LobbyCodeObj).name = "CopyLobbyCode"; ((TMP_Text)LobbyCodeTextMesh).text = "> Lobby Code"; } } private static IEnumerator CopyCode(TextMeshProUGUI textMesh) { if (!GameNetworkManager.Instance.currentLobby.HasValue) { ((TMP_Text)textMesh).text = "Can't get Lobby code!"; } else { ((TMP_Text)textMesh).text = "(Copied to clipboard!)"; Lobby value = GameNetworkManager.Instance.currentLobby.Value; SteamId id = ((Lobby)(ref value)).Id; string text = ((object)(SteamId)(ref id)).ToString(); string[] obj = new string[5] { "Lobby Code: ", text, "\nLobby Name: \"", null, null }; value = GameNetworkManager.Instance.currentLobby.Value; obj[3] = ((Lobby)(ref value)).GetData("name"); obj[4] = "\""; GUIUtility.systemCopyBuffer = string.Concat(obj); Plugin.Log.LogInfo((object)("Lobby code copied to clipboard: " + text)); } yield return (object)new WaitForSeconds(1.2f); ((TMP_Text)textMesh).text = "> Lobby Code"; } } internal class LobbyConnection { [CompilerGenerated] private static class <>O { public static hook_OnEnable <0>__GameNetworkManager_OnEnable; public static Action<Lobby> <1>__SetPreviouslyJoinedLobby; } internal static Lobby? PreviousLobby; [HookInit] private static void Init() { //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_001b: Expected O, but got Unknown object obj = <>O.<0>__GameNetworkManager_OnEnable; if (obj == null) { hook_OnEnable val = GameNetworkManager_OnEnable; <>O.<0>__GameNetworkManager_OnEnable = val; obj = (object)val; } GameNetworkManager.OnEnable += (hook_OnEnable)obj; } private static void GameNetworkManager_OnEnable(orig_OnEnable orig, GameNetworkManager self) { orig.Invoke(self); SteamMatchmaking.OnLobbyEntered += SetPreviouslyJoinedLobby; } private static void SetPreviouslyJoinedLobby(Lobby obj) { //IL_0019: 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_0038: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) if (!NetworkManager.Singleton.IsHost && !NetworkManager.Singleton.IsServer) { PreviousLobby = obj; ManualLogSource log = Plugin.Log; Lobby value = PreviousLobby.Value; log.LogDebug((object)$"Setting previously joined lobby to {((Lobby)(ref value)).Id}"); } } } internal class LobbyList { [CompilerGenerated] private static class <>O { public static hook_loadLobbyListAndFilter <0>__SteamLobbyManager_loadLobbyListAndFilter; } [HookInit] private static void Init() { //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_001b: Expected O, but got Unknown object obj = <>O.<0>__SteamLobbyManager_loadLobbyListAndFilter; if (obj == null) { hook_loadLobbyListAndFilter val = SteamLobbyManager_loadLobbyListAndFilter; <>O.<0>__SteamLobbyManager_loadLobbyListAndFilter = val; obj = (object)val; } SteamLobbyManager.loadLobbyListAndFilter += (hook_loadLobbyListAndFilter)obj; } private static IEnumerator SteamLobbyManager_loadLobbyListAndFilter(orig_loadLobbyListAndFilter orig, SteamLobbyManager self, Lobby[] lobbyList) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0052: 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_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) if (LobbyConnection.PreviousLobby.HasValue) { if (!lobbyList.Contains(LobbyConnection.PreviousLobby.Value)) { ArrayUtility.Add<Lobby>(lobbyList, lobbyList[0]); Plugin.Log.LogInfo((object)"Adding private lobby as rejoinable"); } else { int num = MiscHelpers.IndexOf<Lobby>((IEnumerable<Lobby>)lobbyList, LobbyConnection.PreviousLobby.Value); lobbyList[num] = lobbyList[0]; } lobbyList[0] = LobbyConnection.PreviousLobby.Value; } return orig.Invoke(self, lobbyList); } } internal class LobbySlot { [CompilerGenerated] private static class <>O { public static hook_Awake <0>__LobbySlot_Awake; } [HookInit] private static void Init() { //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_001b: Expected O, but got Unknown object obj = <>O.<0>__LobbySlot_Awake; if (obj == null) { hook_Awake val = LobbySlot_Awake; <>O.<0>__LobbySlot_Awake = val; obj = (object)val; } LobbySlot.Awake += (hook_Awake)obj; } private static void LobbySlot_Awake(orig_Awake orig, LobbySlot self) { //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Expected O, but got Unknown LobbySlot self2 = self; orig.Invoke(self2); ((TMP_Text)self2.playerCount).text = $"{((Lobby)(ref self2.thisLobby)).MemberCount} / {((Lobby)(ref self2.thisLobby)).MaxMembers}"; Button componentInChildren = ((Component)self2).GetComponentInChildren<Button>(); if ((Object)(object)componentInChildren != (Object)null) { Button val = Object.Instantiate<Button>(componentInChildren, ((Component)componentInChildren).transform.parent); ((Object)val).name = "LobbyCode"; RectTransform component = ((Component)val).GetComponent<RectTransform>(); component.anchoredPosition -= new Vector2(78f, 0f); TextMeshProUGUI TextMesh = ((Component)val).GetComponentInChildren<TextMeshProUGUI>(); ((TMP_Text)TextMesh).text = "Code"; ((UnityEventBase)val.onClick).m_PersistentCalls.Clear(); ((UnityEvent)val.onClick).AddListener((UnityAction)delegate { ((MonoBehaviour)self2).StartCoroutine(CopyCode(self2, TextMesh)); }); ((MonoBehaviour)self2).StartCoroutine(InitializeRejoin(self2, componentInChildren)); } } private static IEnumerator CopyCode(LobbySlot lobbySlot, TextMeshProUGUI textMesh) { string text = ((object)(SteamId)(ref lobbySlot.lobbyId)).ToString(); if (Utility.IsNullOrWhiteSpace(text)) { ((TMP_Text)textMesh).text = "Can't get Lobby code!"; } else { GUIUtility.systemCopyBuffer = "Lobby Code: " + text + "\nLobby Name: \"" + ((TMP_Text)lobbySlot.LobbyName).text + "\""; Plugin.Log.LogInfo((object)("Lobby code copied to clipboard: " + text)); ((TMP_Text)textMesh).text = "Copied!"; } yield return (object)new WaitForSeconds(1.2f); ((TMP_Text)textMesh).text = "Code"; } private static IEnumerator InitializeRejoin(LobbySlot lobbySlot, Button joinButton) { LobbySlot lobbySlot2 = lobbySlot; if (LobbyConnection.PreviousLobby.HasValue) { yield return (object)new WaitUntil((Func<bool>)(() => SteamId.op_Implicit(((Lobby)(ref lobbySlot2.thisLobby)).Id) != 0)); Lobby value = LobbyConnection.PreviousLobby.Value; if (SteamId.op_Implicit(((Lobby)(ref value)).Id) == SteamId.op_Implicit(lobbySlot2.lobbyId)) { TextMeshProUGUI componentInChildren = ((Component)joinButton).GetComponentInChildren<TextMeshProUGUI>(); ((TMP_Text)componentInChildren).text = "Rejoin"; } } } } internal class SteamLobbyManager { [CompilerGenerated] private static class <>O { public static hook_OnEnable <0>__SteamLobbyManager_OnEnable; } internal static SteamLobbyManager? Instance; [HookInit] private static void Init() { //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_001b: Expected O, but got Unknown object obj = <>O.<0>__SteamLobbyManager_OnEnable; if (obj == null) { hook_OnEnable val = SteamLobbyManager_OnEnable; <>O.<0>__SteamLobbyManager_OnEnable = val; obj = (object)val; } SteamLobbyManager.OnEnable += (hook_OnEnable)obj; } private static void SteamLobbyManager_OnEnable(orig_OnEnable orig, SteamLobbyManager self) { orig.Invoke(self); Instance = self; } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } }