Decompiled source of ShiftMorePlayers v1.3.2

plugins/ShiftMorePlayers.dll

Decompiled a day ago
using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Core.Logging.Interpolation;
using BepInEx.Logging;
using BepInEx.Unity.IL2CPP;
using Fusion;
using HarmonyLib;
using Il2CppSystem;
using Microsoft.CodeAnalysis;
using Steamworks;
using TMPro;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("ShiftMorePlayers")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.3.2.0")]
[assembly: AssemblyInformationalVersion("1.3.2+bc4f59ce0b3de43097fa80dfaaf16befd1b294d3")]
[assembly: AssemblyProduct("ShiftMorePlayers")]
[assembly: AssemblyTitle("ShiftMorePlayers")]
[assembly: AssemblyVersion("1.3.2.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[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 ShiftMorePlayers
{
	public static class Patches
	{
		[HarmonyPatch(typeof(NetworkRunner), "StartGame")]
		public static class FusionStartGamePatch
		{
			public static void Prefix(StartGameArgs args)
			{
				//IL_004a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0051: Expected O, but got Unknown
				//IL_001c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0022: Expected O, but got Unknown
				int selectedMaxPlayers = Plugin.SelectedMaxPlayers;
				bool flag = default(bool);
				try
				{
					args.PlayerCount = new Nullable<int>(selectedMaxPlayers);
					ManualLogSource log = Plugin.Log;
					BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(47, 1, ref flag);
					if (flag)
					{
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[ShiftMorePlayers] StartGameArgs.PlayerCount = ");
						((BepInExLogInterpolatedStringHandler)val).AppendFormatted<int>(selectedMaxPlayers);
					}
					log.LogInfo(val);
				}
				catch (Exception ex)
				{
					ManualLogSource log2 = Plugin.Log;
					BepInExErrorLogInterpolatedStringHandler val2 = new BepInExErrorLogInterpolatedStringHandler(46, 1, ref flag);
					if (flag)
					{
						((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("[ShiftMorePlayers] Failed to set PlayerCount: ");
						((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(ex.Message);
					}
					log2.LogError(val2);
				}
			}
		}

		[HarmonyPatch(typeof(SteamMatchmaking), "CreateLobby")]
		public static class SteamCreateLobbyPatch
		{
			public static void Prefix(ref int cMaxMembers)
			{
				cMaxMembers = Plugin.SelectedMaxPlayers;
			}
		}

		[HarmonyPatch(typeof(PlatformManager_Steam), "HostLobby")]
		public static class HostLobbyPatch
		{
			public static void Postfix()
			{
				PlatformManager.s_MAXPLAYERS = Plugin.SelectedMaxPlayers;
			}
		}

		[HarmonyPatch(typeof(CreateLobbySettings), "StartLobby")]
		public static class StartLobbyPatch
		{
			public static void Prefix(CreateLobbySettings __instance)
			{
				//IL_002c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0032: Expected O, but got Unknown
				//IL_005e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0064: Expected O, but got Unknown
				bool flag = default(bool);
				try
				{
					Plugin.SelectedMaxPlayers = Math.Clamp(__instance.maxPlayersDropdown.value + 1, 1, Plugin.MaxPlayers.Value);
					ManualLogSource log = Plugin.Log;
					BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(47, 1, ref flag);
					if (flag)
					{
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[ShiftMorePlayers] Host selected max players = ");
						((BepInExLogInterpolatedStringHandler)val).AppendFormatted<int>(Plugin.SelectedMaxPlayers);
					}
					log.LogInfo(val);
				}
				catch (Exception ex)
				{
					ManualLogSource log2 = Plugin.Log;
					BepInExErrorLogInterpolatedStringHandler val2 = new BepInExErrorLogInterpolatedStringHandler(56, 1, ref flag);
					if (flag)
					{
						((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("[ShiftMorePlayers] Failed to read max players dropdown: ");
						((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(ex.Message);
					}
					log2.LogError(val2);
				}
			}
		}

		[HarmonyPatch(typeof(PlatformManager_Steam), "OnLobbyChatUpdate")]
		public static class LobbyChatUpdateLogPatch
		{
			public static void Postfix(LobbyChatUpdate_t callback)
			{
				//IL_0000: Unknown result type (might be due to invalid IL or missing references)
				//IL_0006: 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_0021: Expected O, but got Unknown
				//IL_0060: Unknown result type (might be due to invalid IL or missing references)
				//IL_0067: Expected O, but got Unknown
				//IL_0030: Unknown result type (might be due to invalid IL or missing references)
				bool flag = default(bool);
				try
				{
					int numLobbyMembers = SteamMatchmaking.GetNumLobbyMembers(new CSteamID(callback.m_ulSteamIDLobby));
					ManualLogSource log = Plugin.Log;
					BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(62, 2, ref flag);
					if (flag)
					{
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[ShiftMorePlayers] Lobby member change: state=");
						((BepInExLogInterpolatedStringHandler)val).AppendFormatted<EChatMemberStateChange>((EChatMemberStateChange)callback.m_rgfChatMemberStateChange);
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral(", members now = ");
						((BepInExLogInterpolatedStringHandler)val).AppendFormatted<int>(numLobbyMembers);
					}
					log.LogInfo(val);
				}
				catch (Exception ex)
				{
					ManualLogSource log2 = Plugin.Log;
					BepInExErrorLogInterpolatedStringHandler val2 = new BepInExErrorLogInterpolatedStringHandler(47, 1, ref flag);
					if (flag)
					{
						((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("[ShiftMorePlayers] LobbyChatUpdate log failed: ");
						((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(ex.Message);
					}
					log2.LogError(val2);
				}
			}
		}

		[HarmonyPatch(typeof(FusionNetworkManager), "SpawnPlayerInGameScene")]
		public static class SpawnPlayerLogPatch
		{
			public static void Postfix(PlayerRef player, int index)
			{
				//IL_000a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0010: Expected O, but got Unknown
				//IL_001f: Unknown result type (might be due to invalid IL or missing references)
				ManualLogSource log = Plugin.Log;
				bool flag = default(bool);
				BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(44, 2, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[ShiftMorePlayers] Spawned player ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<PlayerRef>(player);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" at index ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<int>(index);
				}
				log.LogInfo(val);
			}
		}

		[HarmonyPatch(typeof(CreateLobbySettings), "UpdateDropdownLanguage")]
		public static class ExtendMaxPlayersDropdownPatch
		{
			public static void Postfix(CreateLobbySettings __instance)
			{
				//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c0: Expected O, but got Unknown
				//IL_0056: Unknown result type (might be due to invalid IL or missing references)
				//IL_0060: Expected O, but got Unknown
				//IL_007e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0084: Expected O, but got Unknown
				bool flag = default(bool);
				try
				{
					TMP_Dropdown maxPlayersDropdown = __instance.maxPlayersDropdown;
					if ((Object)(object)maxPlayersDropdown == (Object)null || maxPlayersDropdown.options == null)
					{
						return;
					}
					int value = Plugin.MaxPlayers.Value;
					if (maxPlayersDropdown.options.Count < value)
					{
						while (maxPlayersDropdown.options.Count < value)
						{
							int num = maxPlayersDropdown.options.Count + 1;
							maxPlayersDropdown.options.Add(new OptionData(num.ToString()));
						}
						maxPlayersDropdown.RefreshShownValue();
						ManualLogSource log = Plugin.Log;
						BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(60, 1, ref flag);
						if (flag)
						{
							((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[ShiftMorePlayers] Max players dropdown extended to ");
							((BepInExLogInterpolatedStringHandler)val).AppendFormatted<int>(value);
							((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" options");
						}
						log.LogInfo(val);
					}
				}
				catch (Exception ex)
				{
					ManualLogSource log2 = Plugin.Log;
					BepInExErrorLogInterpolatedStringHandler val2 = new BepInExErrorLogInterpolatedStringHandler(58, 1, ref flag);
					if (flag)
					{
						((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("[ShiftMorePlayers] Failed to extend max players dropdown: ");
						((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(ex.Message);
					}
					log2.LogError(val2);
				}
			}
		}
	}
	[BepInPlugin("com.tntcrafthim.shiftmoreplayers", "ShiftMorePlayers", "1.3.2")]
	public class Plugin : BasePlugin
	{
		public const int DefaultMaxPlayers = 8;

		public const int TheoreticalMaxPlayers = 250;

		private const string CurrentConfigFileName = "com.tntcrafthim.shiftmoreplayers.cfg";

		private const string LegacyConfigFileName = "com.tntcraft.shiftmoreplayers.cfg";

		public static ConfigEntry<int> MaxPlayers;

		public static ManualLogSource Log;

		public static int SelectedMaxPlayers;

		public override void Load()
		{
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Expected O, but got Unknown
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Expected O, but got Unknown
			Log = ((BasePlugin)this).Log;
			MigrateLegacyConfig();
			MaxPlayers = ((BasePlugin)this).Config.Bind<int>("General", "MaxPlayers", 8, new ConfigDescription("Maximum players per session. Vanilla limit is 3. Only the host needs this mod for the limit to raise; clients joining a modded host work without it. The configurable maximum is Steam's theoretical 250-member lobby ceiling. Values above 10 exceed known gameplay data structures and may break interactions or monster detection.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(2, 250), Array.Empty<object>()));
			((BasePlugin)this).Config.Save();
			SelectedMaxPlayers = MaxPlayers.Value;
			TryPatch(typeof(Patches.FusionStartGamePatch));
			TryPatch(typeof(Patches.SteamCreateLobbyPatch));
			TryPatch(typeof(Patches.HostLobbyPatch));
			TryPatch(typeof(Patches.StartLobbyPatch));
			TryPatch(typeof(Patches.LobbyChatUpdateLogPatch));
			TryPatch(typeof(Patches.SpawnPlayerLogPatch));
			TryPatch(typeof(Patches.ExtendMaxPlayersDropdownPatch));
			ManualLogSource log = Log;
			bool flag = default(bool);
			BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(62, 1, ref flag);
			if (flag)
			{
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("ShiftMorePlayers loaded. Player limit raised to ");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<int>(MaxPlayers.Value);
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" (vanilla: 3).");
			}
			log.LogInfo(val);
		}

		private void MigrateLegacyConfig()
		{
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Expected O, but got Unknown
			string text = Path.Combine(Paths.ConfigPath, "com.tntcrafthim.shiftmoreplayers.cfg");
			string text2 = Path.Combine(Paths.ConfigPath, "com.tntcraft.shiftmoreplayers.cfg");
			if (!File.Exists(text) && File.Exists(text2))
			{
				File.Copy(text2, text);
				((BasePlugin)this).Config.Reload();
				ManualLogSource log = Log;
				bool flag = default(bool);
				BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(62, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Migrated legacy config to ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>("com.tntcrafthim.shiftmoreplayers.cfg");
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("; the old file was kept as a backup.");
				}
				log.LogInfo(val);
			}
		}

		private static void TryPatch(Type patchClass)
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Expected O, but got Unknown
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Expected O, but got Unknown
			bool flag = default(bool);
			try
			{
				Harmony.CreateAndPatchAll(patchClass, (string)null);
				ManualLogSource log = Log;
				BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(10, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Patch OK: ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(patchClass.Name);
				}
				log.LogInfo(val);
			}
			catch (Exception ex)
			{
				ManualLogSource log2 = Log;
				BepInExErrorLogInterpolatedStringHandler val2 = new BepInExErrorLogInterpolatedStringHandler(16, 2, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("Patch FAILED: ");
					((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(patchClass.Name);
					((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(": ");
					((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<Exception>(ex);
				}
				log2.LogError(val2);
			}
		}
	}
}