using System;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using HarmonyLib;
using MelonLoader;
using SledBigLobbies;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("SledBigLobbies")]
[assembly: AssemblyFileVersion("0.1.0")]
[assembly: MelonInfo(typeof(Mod), "SledBigLobbies", "0.1.0", "Natebag", null)]
[assembly: MelonGame("The Sledding Corporation", "Sledding Game")]
[assembly: MelonColor(255, 255, 200, 80)]
[assembly: MelonAuthorColor(255, 80, 160, 255)]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")]
[assembly: AssemblyVersion("0.1.0.0")]
namespace SledBigLobbies;
public sealed class Mod : MelonMod
{
public const string Name = "SledBigLobbies";
public const string Version = "0.1.0";
public const string Author = "Natebag";
internal const int MaxPlayers = 60;
internal const int MinPlayers = 1;
internal const bool ForceCrossplay = true;
private static float _nextEnforce;
private static Type _lsmType;
private static MethodInfo _lsmGetInstance;
private static MethodInfo _lsmGetSettings;
private static bool _enforceLogged;
private static int _enforceCount;
private static float _enforceLogAt;
private static bool _uiSliderWarned;
private static bool _crossplayLogged;
private const int AttrTypeMaxPlayers = 9;
private static MethodInfo _objectOpImplicitFromInt;
private static MethodInfo _int32OpImplicitFromInt;
private static bool _boxLookupAttempted;
private static bool _shapeLogged;
private static bool _lobbyMutLogged;
private static bool _lsLoggedShape;
public override void OnUpdate()
{
EnforceLobbyCap();
}
private static void EnforceLobbyCap()
{
if (Time.time < _nextEnforce)
{
return;
}
_nextEnforce = Time.time + 0.5f;
try
{
if (_lsmType == null)
{
_lsmType = FindTypeByShortName("LobbySettingsManager");
if (_lsmType == null)
{
return;
}
_lsmGetInstance = _lsmType.GetMethod("get_Instance", BindingFlags.Static | BindingFlags.Public);
_lsmGetSettings = _lsmType.GetMethod("GetLobbySettings", BindingFlags.Instance | BindingFlags.Public);
}
if (_lsmGetInstance == null || _lsmGetSettings == null)
{
return;
}
object obj = _lsmGetInstance.Invoke(null, null);
if (obj == null)
{
return;
}
object obj2 = _lsmGetSettings.Invoke(obj, null);
if (obj2 == null)
{
return;
}
Type type = obj2.GetType();
int num = 60;
PropertyInfo property = type.GetProperty("maxPlayers", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
if (property != null && property.CanRead && property.CanWrite)
{
int num2 = (int)(property.GetValue(obj2) ?? ((object)0));
if (num2 < num)
{
property.SetValue(obj2, num);
LogEnforce($"enforce prop {num2}->{num}");
}
return;
}
FieldInfo field = type.GetField("maxPlayers", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
if (field != null)
{
int num3 = (int)(field.GetValue(obj2) ?? ((object)0));
if (num3 < num)
{
field.SetValue(obj2, num);
LogEnforce($"enforce field {num3}->{num}");
}
}
else if (!_enforceLogged)
{
_enforceLogged = true;
string value = string.Join(",", (from x in type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
select "p:" + x.Name).Concat(from x in type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
select "f:" + x.Name));
MelonLogger.Msg($"[SledBigLobbies] enforce: no maxPlayers member found on {type.FullName}; members=[{value}]");
}
}
catch (Exception ex)
{
LogEnforce("enforce error: " + ex.Message);
}
}
private static void LogEnforce(string msg)
{
_enforceCount++;
if (_enforceCount <= 3 || Time.time > _enforceLogAt + 1f)
{
_enforceLogAt = Time.time;
MelonLogger.Msg($"[SledBigLobbies] {msg} (#{_enforceCount})");
}
}
public override void OnInitializeMelon()
{
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Expected O, but got Unknown
//IL_0093: Unknown result type (might be due to invalid IL or missing references)
//IL_00a1: Expected O, but got Unknown
//IL_012b: Unknown result type (might be due to invalid IL or missing references)
//IL_0139: Expected O, but got Unknown
//IL_01c6: Unknown result type (might be due to invalid IL or missing references)
//IL_01d4: Expected O, but got Unknown
//IL_023c: Unknown result type (might be due to invalid IL or missing references)
//IL_024a: Expected O, but got Unknown
//IL_0298: Unknown result type (might be due to invalid IL or missing references)
//IL_02a6: Expected O, but got Unknown
//IL_03af: Unknown result type (might be due to invalid IL or missing references)
//IL_03bc: Expected O, but got Unknown
//IL_032a: Unknown result type (might be due to invalid IL or missing references)
//IL_0338: Expected O, but got Unknown
//IL_045f: Unknown result type (might be due to invalid IL or missing references)
//IL_046c: Expected O, but got Unknown
try
{
Harmony val = new Harmony("Natebag.SledBigLobbies");
int num = 0;
Type type = FindType("Assembly-CSharp", "_Scripts.Managers.LobbyManager") ?? FindType("Assembly-CSharp", "LobbyManager");
if (type == null)
{
((MelonBase)this).LoggerInstance.Warning("LobbyManager type not found — lobby cap won't be raised");
}
else
{
MethodInfo method = type.GetMethod("CreateLobby", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public);
if (method == null)
{
((MelonBase)this).LoggerInstance.Warning("LobbyManager.CreateLobby method not found");
}
else
{
MethodInfo method2 = typeof(Mod).GetMethod("CreateLobby_Prefix", BindingFlags.Static | BindingFlags.NonPublic);
val.Patch((MethodBase)method, new HarmonyMethod(method2), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
num++;
}
}
Type type2 = FindType("Il2CppFishyEOS", "FishNet.Transporting.FishyEOSPlugin.FishyEOS") ?? FindType("Fishnet.Plugins.FishyEOS", "FishNet.Transporting.FishyEOSPlugin.FishyEOS") ?? FindTypeByShortName("FishyEOS");
if (type2 != null)
{
MethodInfo method3 = type2.GetMethod("SetMaximumClients", BindingFlags.Instance | BindingFlags.Public, null, new Type[1] { typeof(int) }, null);
if (method3 != null)
{
MethodInfo method4 = typeof(Mod).GetMethod("SetMaximumClients_Prefix", BindingFlags.Static | BindingFlags.NonPublic);
val.Patch((MethodBase)method3, new HarmonyMethod(method4), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
num++;
}
}
Type type3 = FindType("Il2CppFishNet.Runtime", "FishNet.Transporting.Tugboat.Tugboat") ?? FindType("FishNet.Runtime", "FishNet.Transporting.Tugboat.Tugboat") ?? FindTypeByShortName("Tugboat");
if (type3 != null)
{
MethodInfo method5 = type3.GetMethod("SetMaximumClients", BindingFlags.Instance | BindingFlags.Public, null, new Type[1] { typeof(int) }, null);
if (method5 != null)
{
MethodInfo method6 = typeof(Mod).GetMethod("SetMaximumClients_Prefix", BindingFlags.Static | BindingFlags.NonPublic);
val.Patch((MethodBase)method5, new HarmonyMethod(method6), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
num++;
}
}
Type type4 = FindType("com.rlabrecque.steamworks.net", "Steamworks.SteamMatchmaking") ?? FindTypeByShortName("SteamMatchmaking");
if (type4 != null)
{
MethodInfo method7 = type4.GetMethod("CreateLobby", BindingFlags.Static | BindingFlags.Public);
if (method7 != null)
{
MethodInfo method8 = typeof(Mod).GetMethod("Steam_CreateLobby_Prefix", BindingFlags.Static | BindingFlags.NonPublic);
val.Patch((MethodBase)method7, new HarmonyMethod(method8), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
num++;
}
else
{
((MelonBase)this).LoggerInstance.Warning("SteamMatchmaking.CreateLobby not found");
}
MethodInfo method9 = type4.GetMethod("SetLobbyMemberLimit", BindingFlags.Static | BindingFlags.Public);
if (method9 != null)
{
MethodInfo method10 = typeof(Mod).GetMethod("Steam_SetLobbyMemberLimit_Prefix", BindingFlags.Static | BindingFlags.NonPublic);
val.Patch((MethodBase)method9, new HarmonyMethod(method10), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
num++;
}
else
{
((MelonBase)this).LoggerInstance.Warning("SteamMatchmaking.SetLobbyMemberLimit not found");
}
}
else
{
((MelonBase)this).LoggerInstance.Warning("SteamMatchmaking type not found — Steam lobby cap won't be raised");
}
if (type != null)
{
MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
foreach (MethodInfo methodInfo in methods)
{
if (!(methodInfo.Name != "AddAttribute") && methodInfo.GetParameters().Length >= 3)
{
MethodInfo method11 = typeof(Mod).GetMethod("AddAttribute_Prefix", BindingFlags.Static | BindingFlags.NonPublic);
val.Patch((MethodBase)methodInfo, new HarmonyMethod(method11), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
num++;
break;
}
}
}
Type type5 = FindType("Assembly-CSharp", "LobbySettings");
if (type5 != null)
{
int num2 = 0;
ConstructorInfo[] constructors = type5.GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
foreach (ConstructorInfo constructorInfo in constructors)
{
if (constructorInfo.GetParameters().Length >= 5)
{
MethodInfo method12 = typeof(Mod).GetMethod("LobbySettings_Ctor_Postfix", BindingFlags.Static | BindingFlags.NonPublic);
val.Patch((MethodBase)constructorInfo, (HarmonyMethod)null, new HarmonyMethod(method12), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
num2++;
}
}
if (num2 > 0)
{
num++;
}
else
{
((MelonBase)this).LoggerInstance.Warning("LobbySettings ctor with maxPlayers param not found");
}
}
else
{
((MelonBase)this).LoggerInstance.Warning("LobbySettings type not found");
}
Type type6 = FindType("Assembly-CSharp", "_Scripts.UI.Pre_Game.UICreateLobby") ?? FindTypeByShortName("UICreateLobby");
if (type6 != null)
{
MethodInfo method13 = type6.GetMethod("ShowPanel", BindingFlags.Instance | BindingFlags.Public);
if (method13 != null)
{
MethodInfo method14 = typeof(Mod).GetMethod("UICreateLobby_ShowPanel_Postfix", BindingFlags.Static | BindingFlags.NonPublic);
val.Patch((MethodBase)method13, (HarmonyMethod)null, new HarmonyMethod(method14), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
num++;
}
else
{
((MelonBase)this).LoggerInstance.Warning("UICreateLobby.ShowPanel not found — vanilla slider stays capped");
}
}
else
{
((MelonBase)this).LoggerInstance.Warning("UICreateLobby type not found — vanilla slider stays capped");
}
((MelonBase)this).LoggerInstance.Msg($"SledBigLobbies v{"0.1.0"} ready — host cap = {60}, {num} patches installed.");
if (num == 0)
{
((MelonBase)this).LoggerInstance.Warning("No patches installed — game may have updated; mod is no-op until updated.");
}
}
catch (Exception value)
{
((MelonBase)this).LoggerInstance.Error($"SledBigLobbies init failed: {value}");
}
}
private static void CreateLobby_Prefix(ref int maxPlayers)
{
try
{
int value = maxPlayers;
if (maxPlayers < 60)
{
maxPlayers = 60;
}
MelonLogger.Msg($"[SledBigLobbies] CreateLobby: maxPlayers {value}->{maxPlayers}");
}
catch
{
}
}
private static void UICreateLobby_ShowPanel_Postfix(object __instance)
{
try
{
object obj = ReadMember(__instance, "maxPlayersSlider");
if (obj == null)
{
if (!_uiSliderWarned)
{
MelonLogger.Warning("[SledBigLobbies] maxPlayersSlider not readable on UICreateLobby");
_uiSliderWarned = true;
}
return;
}
object obj2 = ReadMember(obj, "slider");
if (obj2 == null)
{
if (!_uiSliderWarned)
{
MelonLogger.Warning("[SledBigLobbies] inner slider not readable on MySliderUI");
_uiSliderWarned = true;
}
return;
}
PropertyInfo property = obj2.GetType().GetProperty("maxValue", BindingFlags.Instance | BindingFlags.Public);
PropertyInfo property2 = obj2.GetType().GetProperty("minValue", BindingFlags.Instance | BindingFlags.Public);
if (property == null)
{
if (!_uiSliderWarned)
{
MelonLogger.Warning("[SledBigLobbies] Slider.maxValue property missing");
_uiSliderWarned = true;
}
return;
}
float num = (float)(property.GetValue(obj2) ?? ((object)0f));
if (num < 60f)
{
property.SetValue(obj2, 60f);
MelonLogger.Msg($"[SledBigLobbies] UICreateLobby slider max: {num} -> {60}");
}
if (property2 != null)
{
float num2 = (float)(property2.GetValue(obj2) ?? ((object)0f));
if (num2 > 1f)
{
property2.SetValue(obj2, 1f);
MelonLogger.Msg($"[SledBigLobbies] UICreateLobby slider min: {num2} -> {1}");
}
}
TryForceCrossplay(__instance);
}
catch (Exception ex)
{
if (!_uiSliderWarned)
{
MelonLogger.Warning("[SledBigLobbies] UICreateLobby_ShowPanel_Postfix: " + ex.Message);
_uiSliderWarned = true;
}
}
}
private static void TryForceCrossplay(object createLobbyUI)
{
try
{
Type type = createLobbyUI.GetType();
bool value = false;
PropertyInfo property = type.GetProperty("_hasCrossplayPrivilege", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
if (property != null && property.CanWrite)
{
property.SetValue(createLobbyUI, true);
value = true;
}
else
{
FieldInfo field = type.GetField("_hasCrossplayPrivilege", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
if (field != null)
{
field.SetValue(createLobbyUI, true);
value = true;
}
}
object obj = null;
PropertyInfo property2 = type.GetProperty("crossplayToggle", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
if (property2 != null && property2.CanRead)
{
obj = property2.GetValue(createLobbyUI);
}
if (obj == null)
{
FieldInfo field2 = type.GetField("crossplayToggle", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
if (field2 != null)
{
obj = field2.GetValue(createLobbyUI);
}
}
bool value2 = false;
bool value3 = false;
if (obj != null)
{
object obj2 = obj.GetType().GetProperty("gameObject", BindingFlags.Instance | BindingFlags.Public)?.GetValue(obj);
if (obj2 != null)
{
MethodInfo method = obj2.GetType().GetMethod("SetActive", new Type[1] { typeof(bool) });
if (method != null)
{
method.Invoke(obj2, new object[1] { true });
value2 = true;
}
}
PropertyInfo property3 = obj.GetType().GetProperty("interactable", BindingFlags.Instance | BindingFlags.Public);
if (property3 != null && property3.CanWrite)
{
property3.SetValue(obj, true);
value3 = true;
}
}
if (!_crossplayLogged)
{
_crossplayLogged = true;
MelonLogger.Msg($"[SledBigLobbies] crossplay force: privilege={value} go.SetActive={value2} interactable={value3} (toggle={((obj != null) ? "found" : "null")})");
}
}
catch (Exception ex)
{
if (!_crossplayLogged)
{
_crossplayLogged = true;
MelonLogger.Warning("[SledBigLobbies] TryForceCrossplay: " + ex.Message);
}
}
}
private static object ReadMember(object owner, string name)
{
if (owner == null)
{
return null;
}
Type type = owner.GetType();
try
{
PropertyInfo property = type.GetProperty(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
if (property != null && property.CanRead)
{
return property.GetValue(owner);
}
}
catch
{
}
try
{
FieldInfo field = type.GetField(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
if (field != null)
{
return field.GetValue(owner);
}
}
catch
{
}
return null;
}
private static void SetMaximumClients_Prefix(ref int value)
{
try
{
int num = 60;
int value2 = value;
if (value < num)
{
value = num;
}
MelonLogger.Msg($"[SledBigLobbies] SetMaximumClients: vanilla wanted {value2}, rewrote to {value}");
}
catch
{
}
}
private static void Steam_CreateLobby_Prefix(ref int cMaxMembers)
{
try
{
int num = 60;
int value = cMaxMembers;
if (cMaxMembers < num)
{
cMaxMembers = num;
}
MelonLogger.Msg($"[SledBigLobbies] Steam CreateLobby: vanilla wanted cMaxMembers={value}, rewrote to {cMaxMembers}");
}
catch
{
}
}
private static void Steam_SetLobbyMemberLimit_Prefix(ref int cMaxMembers)
{
try
{
int num = 60;
int value = cMaxMembers;
if (cMaxMembers < num)
{
cMaxMembers = num;
}
MelonLogger.Msg($"[SledBigLobbies] Steam SetLobbyMemberLimit: vanilla wanted {value}, rewrote to {cMaxMembers}");
}
catch
{
}
}
private static void AddAttribute_Prefix(object lobby, object type, ref object value)
{
try
{
int num;
try
{
num = Convert.ToInt32(type);
}
catch
{
return;
}
if (num == 9)
{
EnsureBoxLookup();
MethodInfo methodInfo = _objectOpImplicitFromInt ?? _int32OpImplicitFromInt;
if (!(methodInfo == null))
{
int num2 = 60;
string value2 = value?.GetType().FullName ?? "(null)";
object obj2 = methodInfo.Invoke(null, new object[1] { num2 });
value = obj2;
MelonLogger.Msg($"[SledBigLobbies] AddAttribute MAXPLAYERS: replaced ({value2}) -> {methodInfo.DeclaringType?.Name}({num2})");
TryForceLobbyMaxMembers(lobby, (uint)num2);
}
}
}
catch (Exception ex)
{
MelonLogger.Warning("[SledBigLobbies] AddAttribute_Prefix: " + ex.Message);
}
}
private static void TryForceLobbyMaxMembers(object lobby, uint target)
{
if (lobby == null)
{
return;
}
try
{
Type type = lobby.GetType();
PropertyInfo property = type.GetProperty("MaxNumLobbyMembers", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
if (property != null && property.CanWrite)
{
property.SetValue(lobby, target);
if (!_lobbyMutLogged)
{
_lobbyMutLogged = true;
MelonLogger.Msg($"[SledBigLobbies] Lobby.MaxNumLobbyMembers <- {target} via property");
}
return;
}
FieldInfo field = type.GetField("MaxNumLobbyMembers", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
if (field != null)
{
field.SetValue(lobby, target);
if (!_lobbyMutLogged)
{
_lobbyMutLogged = true;
MelonLogger.Msg($"[SledBigLobbies] Lobby.MaxNumLobbyMembers <- {target} via field");
}
}
else if (!_lobbyMutLogged)
{
_lobbyMutLogged = true;
string value = string.Join(",", (from x in type.GetProperties(BindingFlags.Instance | BindingFlags.Public)
select "p:" + x.Name).Concat(from x in type.GetFields(BindingFlags.Instance | BindingFlags.Public)
select "f:" + x.Name));
MelonLogger.Msg($"[SledBigLobbies] no MaxNumLobbyMembers on Lobby type={type.FullName} members=[{value}]");
}
}
catch (Exception ex)
{
MelonLogger.Warning("[SledBigLobbies] TryForceLobbyMaxMembers: " + ex.Message);
}
}
private static void EnsureBoxLookup()
{
if (_boxLookupAttempted)
{
return;
}
_boxLookupAttempted = true;
try
{
Type type = null;
Type type2 = null;
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (Assembly assembly in assemblies)
{
if (type == null)
{
try
{
type = assembly.GetType("Il2CppSystem.Object");
}
catch
{
}
}
if (type2 == null)
{
try
{
type2 = assembly.GetType("Il2CppSystem.Int32");
}
catch
{
}
}
if (type != null && type2 != null)
{
break;
}
}
_objectOpImplicitFromInt = FindOpImplicitFromInt(type);
_int32OpImplicitFromInt = FindOpImplicitFromInt(type2);
if (_shapeLogged)
{
return;
}
_shapeLogged = true;
MelonLogger.Msg("[SledBigLobbies] box lookup: ObjectType=" + (type?.FullName ?? "null") + " Int32Type=" + (type2?.FullName ?? "null"));
MelonLogger.Msg($"[SledBigLobbies] box paths: Object.op_Implicit(int)={_objectOpImplicitFromInt != null}, Int32.op_Implicit(int)={_int32OpImplicitFromInt != null}");
if (!(_objectOpImplicitFromInt == null) || !(_int32OpImplicitFromInt == null) || !(type != null))
{
return;
}
string text = string.Join(",", from m in type.GetMethods(BindingFlags.Static | BindingFlags.Public)
where m.Name.StartsWith("op_")
select $"{m.Name}({string.Join(",", from p in m.GetParameters()
select p.ParameterType.Name)})->{m.ReturnType.Name}");
MelonLogger.Msg("[SledBigLobbies] Object op_* methods: [" + text + "]");
}
catch (Exception ex)
{
MelonLogger.Warning("[SledBigLobbies] EnsureBoxLookup: " + ex.Message);
}
}
private static void LobbySettings_Ctor_Postfix(object __instance)
{
try
{
if (__instance == null)
{
return;
}
Type type = __instance.GetType();
int num = 60;
int? value = null;
object obj = null;
PropertyInfo property = type.GetProperty("maxPlayers", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
if (property != null && property.CanRead && property.CanWrite)
{
try
{
value = (int)(property.GetValue(__instance) ?? ((object)0));
obj = property;
}
catch
{
}
}
if (obj == null)
{
FieldInfo field = type.GetField("maxPlayers", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
if (field != null)
{
try
{
value = (int)(field.GetValue(__instance) ?? ((object)0));
obj = field;
}
catch
{
}
}
}
if (!_lsLoggedShape)
{
_lsLoggedShape = true;
MelonLogger.Msg($"[SledBigLobbies] LobbySettings ctor: type={type.FullName} writeVia={obj?.GetType().Name ?? "(null)"} current={value}");
}
if (obj != null && value.HasValue && value.Value < num)
{
if (obj is PropertyInfo propertyInfo)
{
propertyInfo.SetValue(__instance, num);
}
else if (obj is FieldInfo fieldInfo)
{
fieldInfo.SetValue(__instance, num);
}
MelonLogger.Msg($"[SledBigLobbies] LobbySettings.maxPlayers: {value} -> {num}");
}
}
catch (Exception ex)
{
MelonLogger.Warning("[SledBigLobbies] LobbySettings_Ctor_Postfix: " + ex.Message);
}
}
private static MethodInfo FindOpImplicitFromInt(Type onType)
{
if (onType == null)
{
return null;
}
MethodInfo[] methods = onType.GetMethods(BindingFlags.Static | BindingFlags.Public);
foreach (MethodInfo methodInfo in methods)
{
if (!(methodInfo.Name != "op_Implicit"))
{
ParameterInfo[] parameters = methodInfo.GetParameters();
if (parameters.Length == 1 && parameters[0].ParameterType == typeof(int))
{
return methodInfo;
}
}
}
return null;
}
private static Type FindType(string asmHint, string fullName)
{
try
{
string[] array = new string[3]
{
fullName,
"Il2Cpp." + fullName,
"Il2Cpp" + fullName
};
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (Assembly assembly in assemblies)
{
string[] array2 = array;
foreach (string name in array2)
{
Type type;
try
{
type = assembly.GetType(name);
}
catch
{
continue;
}
if (type != null)
{
return type;
}
}
}
int num = fullName.LastIndexOf('.');
string text = ((num >= 0) ? fullName.Substring(num + 1) : fullName);
assemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (Assembly assembly2 in assemblies)
{
Type[] types;
try
{
types = assembly2.GetTypes();
}
catch (ReflectionTypeLoadException ex)
{
types = ex.Types;
}
catch
{
continue;
}
Type[] array3 = types;
foreach (Type type2 in array3)
{
if (!(type2 == null) && !(type2.Name != text) && type2.FullName != null && (type2.FullName.EndsWith("." + fullName) || type2.FullName.EndsWith(fullName) || type2.FullName == fullName))
{
return type2;
}
}
}
}
catch
{
}
return null;
}
private static Type FindTypeByShortName(string shortName)
{
try
{
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (Assembly assembly in assemblies)
{
Type[] types;
try
{
types = assembly.GetTypes();
}
catch (ReflectionTypeLoadException ex)
{
types = ex.Types;
}
catch
{
continue;
}
Type[] array = types;
foreach (Type type in array)
{
if (!(type == null) && type.Name == shortName)
{
return type;
}
}
}
}
catch
{
}
return null;
}
}