Some mods target the Mono version of the game, which is available by opting into the Steam beta branch "alternate"
Decompiled source of BiggerLobbies v1.0.0
mods/BiggerLobbies_Il2cpp.dll
Decompiled 2 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BiggerLobbies; using BiggerLobbies.Integrations; using HarmonyLib; using Il2Cpp; using Il2CppInterop.Runtime.InteropTypes.Arrays; using Il2CppScheduleOne.DevUtilities; using Il2CppScheduleOne.Networking; using Il2CppScheduleOne.UI.Multiplayer; using Il2CppSteamworks; using Il2CppSystem; using Il2CppTMPro; using MelonLoader; using Microsoft.CodeAnalysis; using UnityEngine; 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: MelonInfo(typeof(Core), "BiggerLobbies", "1.0.0", "Bars", null)] [assembly: MelonGame("TVGS", "Schedule I")] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("BiggerLobbies_Il2cpp")] [assembly: AssemblyConfiguration("Il2cpp")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("BiggerLobbies_Il2cpp")] [assembly: AssemblyTitle("BiggerLobbies_Il2cpp")] [assembly: NeutralResourcesLanguage("en-US")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.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; } } } namespace BiggerLobbies { public class Core : MelonMod { public static Core? Instance { get; private set; } public override void OnInitializeMelon() { Instance = this; HarmonyPatches.SetModInstance(this); } public override void OnApplicationQuit() { Instance = null; } } } namespace BiggerLobbies.Utils { public static class Constants { public static class Game { public const string GAME_STUDIO = "TVGS"; public const string GAME_NAME = "Schedule I"; } public const string MOD_NAME = "BiggerLobbies"; public const string MOD_VERSION = "1.0.0"; public const string MOD_AUTHOR = "Bars"; public const int MAX_PLAYERS = 20; } } namespace BiggerLobbies.Integrations { [HarmonyPatch] public static class HarmonyPatches { [CompilerGenerated] private sealed class <WaitForLobby>d__7 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public LobbyInterface lobbyInterface; private Lobby <lobby>5__1; private GridLayoutGroup <gridGroup>5__2; private Transform <entries>5__3; private int <slotCount>5__4; private RectTransform[] <newSlots>5__5; private CSteamID[] <newPlayers>5__6; private int <copyLength>5__7; private Transform <template>5__8; private int <slotsToAdd>5__9; private int <i>5__10; private GameObject <newEntry>5__11; private int <newIndex>5__12; private int <j>5__13; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <WaitForLobby>d__7(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <lobby>5__1 = null; <gridGroup>5__2 = null; <entries>5__3 = null; <newSlots>5__5 = null; <newPlayers>5__6 = null; <template>5__8 = null; <newEntry>5__11 = null; <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; break; case 1: <>1__state = -1; break; } if ((Object)(object)Singleton<Lobby>.Instance == (Object)null) { <>2__current = null; <>1__state = 1; return true; } <lobby>5__1 = Singleton<Lobby>.Instance; if (((Il2CppArrayBase<CSteamID>)(object)<lobby>5__1.Players).Length != 20) { <newPlayers>5__6 = (CSteamID[])(object)new CSteamID[20]; <copyLength>5__7 = Math.Min(((Il2CppArrayBase<CSteamID>)(object)<lobby>5__1.Players).Length, 20); Array.Copy(Il2CppArrayBase<CSteamID>.op_Implicit((Il2CppArrayBase<CSteamID>)(object)<lobby>5__1.Players), <newPlayers>5__6, <copyLength>5__7); <lobby>5__1.Players = Il2CppStructArray<CSteamID>.op_Implicit(<newPlayers>5__6); <newPlayers>5__6 = null; } if (!SteamManager.Initialized) { ((Component)lobbyInterface).gameObject.SetActive(false); return false; } <gridGroup>5__2 = ((Component)lobbyInterface).GetComponentInChildren<GridLayoutGroup>(); if ((Object)(object)<gridGroup>5__2 == (Object)null) { MelonLogger.Error("Could not find GridLayoutGroup in LobbyInterface"); return false; } <entries>5__3 = ((Component)<gridGroup>5__2).transform; if (<entries>5__3.childCount > 1) { <template>5__8 = <entries>5__3.GetChild(1); <slotsToAdd>5__9 = 16; <i>5__10 = 0; while (<i>5__10 < <slotsToAdd>5__9) { <newEntry>5__11 = Object.Instantiate<GameObject>(((Component)<template>5__8).gameObject, <entries>5__3); <newIndex>5__12 = <entries>5__3.childCount - 1; ((Object)<newEntry>5__11).name = ((Object)((Component)<template>5__8).gameObject).name + " (" + <newIndex>5__12 + ")"; <newEntry>5__11 = null; <i>5__10++; } <template>5__8.SetSiblingIndex(20); <template>5__8 = null; } <slotCount>5__4 = <entries>5__3.childCount - 1; <newSlots>5__5 = (RectTransform[])(object)new RectTransform[<slotCount>5__4]; <j>5__13 = 1; while (<j>5__13 < <entries>5__3.childCount) { <newSlots>5__5[<j>5__13 - 1] = ((Component)<entries>5__3.GetChild(<j>5__13)).GetComponent<RectTransform>(); <j>5__13++; } lobbyInterface.PlayerSlots = Il2CppReferenceArray<RectTransform>.op_Implicit(<newSlots>5__5); ((TMP_Text)lobbyInterface.LobbyTitle).text = "Lobby (" + <lobby>5__1.PlayerCount + "/" + 20 + ")"; ((Behaviour)lobbyInterface).enabled = true; return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private static Core? _modInstance; public static void SetModInstance(Core modInstance) { _modInstance = modInstance; } [HarmonyPostfix] [HarmonyPatch(typeof(Lobby), "Start")] private static void Lobby_Start_Postfix(Lobby __instance) { try { if (((Il2CppArrayBase<CSteamID>)(object)__instance.Players).Length != 20) { CSteamID[] array = (CSteamID[])(object)new CSteamID[20]; int length = Math.Min(((Il2CppArrayBase<CSteamID>)(object)__instance.Players).Length, 20); Array.Copy(Il2CppArrayBase<CSteamID>.op_Implicit((Il2CppArrayBase<CSteamID>)(object)__instance.Players), array, length); __instance.Players = Il2CppStructArray<CSteamID>.op_Implicit(array); } } catch (Exception arg) { MelonLogger.Error($"Failed to resize Lobby.Players array: {arg}"); } } [HarmonyPrefix] [HarmonyPatch(typeof(Lobby), "CreateLobby")] private static bool Lobby_CreateLobby_Prefix(Lobby __instance) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) try { SteamMatchmaking.CreateLobby((ELobbyType)1, 20); return false; } catch (Exception arg) { MelonLogger.Error($"Failed to patch CreateLobby: {arg}"); return true; } } [HarmonyPrefix] [HarmonyPatch(typeof(Lobby), "TryOpenInviteInterface")] private static bool Lobby_TryOpenInviteInterface_Prefix(Lobby __instance) { //IL_0026: 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_004f: Unknown result type (might be due to invalid IL or missing references) try { if (!__instance.IsInLobby) { MelonLogger.Msg("Not currently in a lobby, creating one..."); SteamMatchmaking.CreateLobby((ELobbyType)1, 20); } int numLobbyMembers = SteamMatchmaking.GetNumLobbyMembers(__instance.LobbySteamID); if (numLobbyMembers >= 20) { MelonLogger.Warning("Lobby already at max capacity!"); return false; } SteamFriends.ActivateGameOverlayInviteDialog(__instance.LobbySteamID); return false; } catch (Exception arg) { MelonLogger.Error($"Failed to patch TryOpenInviteInterface: {arg}"); return true; } } [HarmonyPostfix] [HarmonyPatch(typeof(Lobby), "OnLobbyCreated")] private static void Lobby_OnLobbyCreated_Postfix(Lobby __instance, LobbyCreated_t result) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Invalid comparison between Unknown and I4 //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001b: 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_0034: Unknown result type (might be due to invalid IL or missing references) try { if ((int)result.m_eResult == 1) { CSteamID val = (CSteamID)result.m_ulSteamIDLobby; string text = 20.ToString(); SteamMatchmaking.SetLobbyData(val, "max_players", text); SteamMatchmaking.SetLobbyData(val, "num_slots", text); MelonLogger.Msg($"Set lobby max_players and num_slots to {20}"); } } catch (Exception arg) { MelonLogger.Error($"Failed to set lobby max_players/num_slots: {arg}"); } } [HarmonyPostfix] [HarmonyPatch(typeof(LobbyInterface), "Awake")] private static void LobbyInterface_Awake_Postfix(LobbyInterface __instance) { try { if (_modInstance != null) { MelonCoroutines.Start(WaitForLobby(__instance)); } } catch (Exception arg) { MelonLogger.Error($"Failed to start WaitForLobby coroutine: {arg}"); } } [IteratorStateMachine(typeof(<WaitForLobby>d__7))] private static IEnumerator WaitForLobby(LobbyInterface lobbyInterface) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <WaitForLobby>d__7(0) { lobbyInterface = lobbyInterface }; } [HarmonyPostfix] [HarmonyPatch(typeof(LobbyInterface), "Awake")] private static void LobbyInterface_Awake_Postfix_UpdateTitle(LobbyInterface __instance) { try { if (!((Object)(object)__instance.Lobby != (Object)null)) { return; } Action originalDelegate = __instance.Lobby.onLobbyChange; __instance.Lobby.onLobbyChange = null; __instance.Lobby.onLobbyChange = Action.op_Implicit((Action)delegate { if ((Delegate)(object)originalDelegate != (Delegate)null) { originalDelegate.Invoke(); } else { __instance.UpdateButtons(); __instance.UpdatePlayers(); } ((TMP_Text)__instance.LobbyTitle).text = "Lobby (" + __instance.Lobby.PlayerCount + "/" + 20 + ")"; }); } catch (Exception arg) { MelonLogger.Error($"Failed to patch onLobbyChange delegate: {arg}"); } } [HarmonyPostfix] [HarmonyPatch(typeof(LobbyInterface), "UpdateButtons")] private static void LobbyInterface_UpdateButtons_Postfix(LobbyInterface __instance) { try { ((Component)__instance.InviteButton).gameObject.SetActive(__instance.Lobby.IsHost && __instance.Lobby.PlayerCount < 20); } catch (Exception arg) { MelonLogger.Error($"Failed to patch UpdateButtons: {arg}"); } } } }
mods/BiggerLobbies_Mono.dll
Decompiled 2 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BiggerLobbies; using BiggerLobbies.Integrations; using HarmonyLib; using MelonLoader; using Microsoft.CodeAnalysis; using ScheduleOne.DevUtilities; using ScheduleOne.Networking; using ScheduleOne.UI.Multiplayer; using Steamworks; using TMPro; using UnityEngine; 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: MelonInfo(typeof(Core), "BiggerLobbies", "1.0.0", "Bars", null)] [assembly: MelonGame("TVGS", "Schedule I")] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("BiggerLobbies_Mono")] [assembly: AssemblyConfiguration("Mono")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("BiggerLobbies_Mono")] [assembly: AssemblyTitle("BiggerLobbies_Mono")] [assembly: NeutralResourcesLanguage("en-US")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.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; } } } namespace BiggerLobbies { public class Core : MelonMod { public static Core? Instance { get; private set; } public override void OnInitializeMelon() { Instance = this; HarmonyPatches.SetModInstance(this); } public override void OnApplicationQuit() { Instance = null; } } } namespace BiggerLobbies.Utils { public static class Constants { public static class Game { public const string GAME_STUDIO = "TVGS"; public const string GAME_NAME = "Schedule I"; } public const string MOD_NAME = "BiggerLobbies"; public const string MOD_VERSION = "1.0.0"; public const string MOD_AUTHOR = "Bars"; public const int MAX_PLAYERS = 20; } } namespace BiggerLobbies.Integrations { [HarmonyPatch] public static class HarmonyPatches { [CompilerGenerated] private sealed class <WaitForLobby>d__7 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public LobbyInterface lobbyInterface; private Lobby <lobby>5__1; private GridLayoutGroup <gridGroup>5__2; private Transform <entries>5__3; private int <slotCount>5__4; private RectTransform[] <newSlots>5__5; private CSteamID[] <newPlayers>5__6; private int <copyLength>5__7; private Transform <template>5__8; private int <slotsToAdd>5__9; private int <i>5__10; private GameObject <newEntry>5__11; private int <newIndex>5__12; private int <j>5__13; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <WaitForLobby>d__7(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <lobby>5__1 = null; <gridGroup>5__2 = null; <entries>5__3 = null; <newSlots>5__5 = null; <newPlayers>5__6 = null; <template>5__8 = null; <newEntry>5__11 = null; <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; break; case 1: <>1__state = -1; break; } if ((Object)(object)Singleton<Lobby>.Instance == (Object)null) { <>2__current = null; <>1__state = 1; return true; } <lobby>5__1 = Singleton<Lobby>.Instance; if (<lobby>5__1.Players.Length != 20) { <newPlayers>5__6 = (CSteamID[])(object)new CSteamID[20]; <copyLength>5__7 = Math.Min(<lobby>5__1.Players.Length, 20); Array.Copy(<lobby>5__1.Players, <newPlayers>5__6, <copyLength>5__7); <lobby>5__1.Players = <newPlayers>5__6; <newPlayers>5__6 = null; } if (!SteamManager.Initialized) { ((Component)lobbyInterface).gameObject.SetActive(false); return false; } <gridGroup>5__2 = ((Component)lobbyInterface).GetComponentInChildren<GridLayoutGroup>(); if ((Object)(object)<gridGroup>5__2 == (Object)null) { MelonLogger.Error("Could not find GridLayoutGroup in LobbyInterface"); return false; } <entries>5__3 = ((Component)<gridGroup>5__2).transform; if (<entries>5__3.childCount > 1) { <template>5__8 = <entries>5__3.GetChild(1); <slotsToAdd>5__9 = 16; <i>5__10 = 0; while (<i>5__10 < <slotsToAdd>5__9) { <newEntry>5__11 = Object.Instantiate<GameObject>(((Component)<template>5__8).gameObject, <entries>5__3); <newIndex>5__12 = <entries>5__3.childCount - 1; ((Object)<newEntry>5__11).name = ((Object)((Component)<template>5__8).gameObject).name + " (" + <newIndex>5__12 + ")"; <newEntry>5__11 = null; <i>5__10++; } <template>5__8.SetSiblingIndex(20); <template>5__8 = null; } <slotCount>5__4 = <entries>5__3.childCount - 1; <newSlots>5__5 = (RectTransform[])(object)new RectTransform[<slotCount>5__4]; <j>5__13 = 1; while (<j>5__13 < <entries>5__3.childCount) { <newSlots>5__5[<j>5__13 - 1] = ((Component)<entries>5__3.GetChild(<j>5__13)).GetComponent<RectTransform>(); <j>5__13++; } lobbyInterface.PlayerSlots = <newSlots>5__5; ((TMP_Text)lobbyInterface.LobbyTitle).text = "Lobby (" + <lobby>5__1.PlayerCount + "/" + 20 + ")"; ((Behaviour)lobbyInterface).enabled = true; return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private static Core? _modInstance; public static void SetModInstance(Core modInstance) { _modInstance = modInstance; } [HarmonyPostfix] [HarmonyPatch(typeof(Lobby), "Start")] private static void Lobby_Start_Postfix(Lobby __instance) { try { if (__instance.Players.Length != 20) { CSteamID[] array = (CSteamID[])(object)new CSteamID[20]; int length = Math.Min(__instance.Players.Length, 20); Array.Copy(__instance.Players, array, length); __instance.Players = array; } } catch (Exception arg) { MelonLogger.Error($"Failed to resize Lobby.Players array: {arg}"); } } [HarmonyPrefix] [HarmonyPatch(typeof(Lobby), "CreateLobby")] private static bool Lobby_CreateLobby_Prefix(Lobby __instance) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) try { SteamMatchmaking.CreateLobby((ELobbyType)1, 20); return false; } catch (Exception arg) { MelonLogger.Error($"Failed to patch CreateLobby: {arg}"); return true; } } [HarmonyPrefix] [HarmonyPatch(typeof(Lobby), "TryOpenInviteInterface")] private static bool Lobby_TryOpenInviteInterface_Prefix(Lobby __instance) { //IL_0026: 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_004f: Unknown result type (might be due to invalid IL or missing references) try { if (!__instance.IsInLobby) { MelonLogger.Msg("Not currently in a lobby, creating one..."); SteamMatchmaking.CreateLobby((ELobbyType)1, 20); } int numLobbyMembers = SteamMatchmaking.GetNumLobbyMembers(__instance.LobbySteamID); if (numLobbyMembers >= 20) { MelonLogger.Warning("Lobby already at max capacity!"); return false; } SteamFriends.ActivateGameOverlayInviteDialog(__instance.LobbySteamID); return false; } catch (Exception arg) { MelonLogger.Error($"Failed to patch TryOpenInviteInterface: {arg}"); return true; } } [HarmonyPostfix] [HarmonyPatch(typeof(Lobby), "OnLobbyCreated")] private static void Lobby_OnLobbyCreated_Postfix(Lobby __instance, LobbyCreated_t result) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Invalid comparison between Unknown and I4 //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001b: 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_0034: Unknown result type (might be due to invalid IL or missing references) try { if ((int)result.m_eResult == 1) { CSteamID val = (CSteamID)result.m_ulSteamIDLobby; string text = 20.ToString(); SteamMatchmaking.SetLobbyData(val, "max_players", text); SteamMatchmaking.SetLobbyData(val, "num_slots", text); MelonLogger.Msg($"Set lobby max_players and num_slots to {20}"); } } catch (Exception arg) { MelonLogger.Error($"Failed to set lobby max_players/num_slots: {arg}"); } } [HarmonyPostfix] [HarmonyPatch(typeof(LobbyInterface), "Awake")] private static void LobbyInterface_Awake_Postfix(LobbyInterface __instance) { try { if (_modInstance != null) { MelonCoroutines.Start(WaitForLobby(__instance)); } } catch (Exception arg) { MelonLogger.Error($"Failed to start WaitForLobby coroutine: {arg}"); } } [IteratorStateMachine(typeof(<WaitForLobby>d__7))] private static IEnumerator WaitForLobby(LobbyInterface lobbyInterface) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <WaitForLobby>d__7(0) { lobbyInterface = lobbyInterface }; } [HarmonyPostfix] [HarmonyPatch(typeof(LobbyInterface), "Awake")] private static void LobbyInterface_Awake_Postfix_UpdateTitle(LobbyInterface __instance) { try { if (!((Object)(object)__instance.Lobby != (Object)null)) { return; } Action originalDelegate = __instance.Lobby.onLobbyChange; __instance.Lobby.onLobbyChange = null; __instance.Lobby.onLobbyChange = delegate { if (originalDelegate != null) { originalDelegate(); } else { __instance.UpdateButtons(); __instance.UpdatePlayers(); } ((TMP_Text)__instance.LobbyTitle).text = "Lobby (" + __instance.Lobby.PlayerCount + "/" + 20 + ")"; }; } catch (Exception arg) { MelonLogger.Error($"Failed to patch onLobbyChange delegate: {arg}"); } } [HarmonyPostfix] [HarmonyPatch(typeof(LobbyInterface), "UpdateButtons")] private static void LobbyInterface_UpdateButtons_Postfix(LobbyInterface __instance) { try { ((Component)__instance.InviteButton).gameObject.SetActive(__instance.Lobby.IsHost && __instance.Lobby.PlayerCount < 20); } catch (Exception arg) { MelonLogger.Error($"Failed to patch UpdateButtons: {arg}"); } } } }