using System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Core.Logging.Interpolation; using BepInEx.Logging; using BepInEx.Unity.IL2CPP; using Fusion; using HarmonyLib; using Il2CppSystem; using Il2CppSystem.Collections.Generic; using Microsoft.CodeAnalysis; using Steamworks; using TMPro; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: AssemblyCompany("ShiftAtMidnightMorePlayers")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("ShiftAtMidnightMorePlayers")] [assembly: AssemblyTitle("ShiftAtMidnightMorePlayers")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [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 ShiftAtMidnightMorePlayers { [BepInPlugin("dev.fuzs.shiftatmidnight.moreplayers", "Shift At Midnight More Players", "1.0.3")] public sealed class Plugin : BasePlugin { public const string PluginGuid = "dev.fuzs.shiftatmidnight.moreplayers"; public const string PluginName = "Shift At Midnight More Players"; public const string PluginVersion = "1.0.3"; internal static ManualLogSource Logger; internal static readonly int[] AllowedPlayerCounts = new int[6] { 1, 2, 3, 6, 8, 16 }; internal static int DesiredLobbyMax = 3; public const int HardMaxPlayers = 16; public override void Load() { //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Expected O, but got Unknown Logger = ((BasePlugin)this).Log; try { DesiredLobbyMax = 3; ApplyHardCap(); Harmony.CreateAndPatchAll(typeof(Plugin).Assembly, "dev.fuzs.shiftatmidnight.moreplayers"); ((BasePlugin)this).Log.LogInfo((object)"Shift At Midnight More Players v1.0.3 carregado! Opções: 1, 2, 3, 6, 8 e 16."); } catch (Exception ex) { ManualLogSource log = ((BasePlugin)this).Log; bool flag = default(bool); BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(27, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Erro ao carregar o plugin:\n"); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex); } log.LogError(val); } } internal static void ApplyHardCap() { try { PlatformManager.s_MAXPLAYERS = 16; ManualLogSource logger = Logger; if (logger != null) { logger.LogInfo((object)("PlatformManager.s_MAXPLAYERS=" + 16)); } } catch (Exception ex) { ManualLogSource logger2 = Logger; if (logger2 != null) { logger2.LogWarning((object)("Não foi possível alterar PlatformManager.s_MAXPLAYERS ainda: " + ex.Message)); } } } internal static bool IsAllowedPlayerCount(int value) { for (int i = 0; i < AllowedPlayerCounts.Length; i++) { if (AllowedPlayerCounts[i] == value) { return true; } } return false; } internal static int ResolveLobbyMaxPlayers(int requested) { if (IsAllowedPlayerCount(requested)) { return requested; } if (requested <= 1) { return 1; } if (requested <= 2) { return 2; } if (requested <= 3) { return 3; } if (requested <= 6) { return 6; } if (requested <= 8) { return 8; } return 16; } internal static void SetDesiredLobbyMax(int requested) { DesiredLobbyMax = ResolveLobbyMaxPlayers(requested); } internal static void ForcePendingLobbyMax(string reason) { //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Expected O, but got Unknown //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Expected O, but got Unknown bool flag = default(bool); try { ApplyHardCap(); int num = (PendingLobbySettings.maxPlayers = (DesiredLobbyMax = ResolveLobbyMaxPlayers(DesiredLobbyMax))); PlatformManager.s_MAXPLAYERS = 16; ManualLogSource logger = Logger; if (logger != null) { BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(24, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("ForcePendingLobbyMax="); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(num); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" "); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("("); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(reason); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(")"); } logger.LogInfo(val); } } catch (Exception ex) { ManualLogSource logger2 = Logger; if (logger2 != null) { BepInExErrorLogInterpolatedStringHandler val2 = new BepInExErrorLogInterpolatedStringHandler(32, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("ForcePendingLobbyMax falhou "); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("("); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(reason); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("): "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(ex); } logger2.LogError(val2); } } } internal static int GetEffectiveLobbyMax() { int num = ResolveLobbyMaxPlayers(DesiredLobbyMax); try { int maxPlayers = PendingLobbySettings.maxPlayers; if (IsAllowedPlayerCount(maxPlayers) && maxPlayers > num) { return maxPlayers; } } catch { } return num; } } } namespace ShiftAtMidnightMorePlayers.Patches { [HarmonyPatch(typeof(CreateLobbySettings))] internal static class CreateLobbySettingsPatches { [HarmonyPostfix] [HarmonyPatch("OnEnable")] private static void OnEnablePostfix(CreateLobbySettings __instance) { try { Plugin.ApplyHardCap(); RebuildMaxPlayersDropdown(__instance); } catch (Exception value) { Plugin.Logger.LogError((object)("Patch de CreateLobbySettings.OnEnable " + $"falhou: {value}")); } } [HarmonyPostfix] [HarmonyPatch("UpdateDropdownLanguage")] private static void UpdateDropdownLanguagePostfix(CreateLobbySettings __instance) { try { RebuildMaxPlayersDropdown(__instance); } catch (Exception ex) { Plugin.Logger.LogError((object)("Patch de UpdateDropdownLanguage falhou: " + ex)); } } [HarmonyPrefix] [HarmonyPatch("ChangeMaxPlayers")] private static bool ChangeMaxPlayersPrefix(CreateLobbySettings __instance, int players) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown try { int num = ResolveFromDropdownOrArg(__instance, players); ApplyLobbyMax(__instance, num); ManualLogSource logger = Plugin.Logger; bool flag = default(bool); BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(43, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("ChangeMaxPlayers: índice/valor="); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(players); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(", "); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("resolvido="); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(num); } logger.LogInfo(val); } catch (Exception ex) { Plugin.Logger.LogError((object)("Patch de ChangeMaxPlayers falhou: " + ex)); } return false; } [HarmonyPrefix] [HarmonyPatch("StartLobby")] private static void StartLobbyPrefix(CreateLobbySettings __instance) { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Expected O, but got Unknown try { int num = ResolveFromDropdownOrArg(__instance, __instance.maxPlayers); ApplyLobbyMax(__instance, num); ManualLogSource logger = Plugin.Logger; bool flag = default(bool); BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(29, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("StartLobby prefix maxPlayers="); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(num); } logger.LogInfo(val); } catch (Exception ex) { Plugin.Logger.LogError((object)("StartLobby prefix falhou: " + ex)); } } [HarmonyPostfix] [HarmonyPatch("StartLobby")] private static void StartLobbyPostfix(CreateLobbySettings __instance) { try { int maxPlayers = ResolveFromDropdownOrArg(__instance, Plugin.DesiredLobbyMax); ApplyLobbyMax(__instance, maxPlayers); Plugin.ForcePendingLobbyMax("CreateLobbySettings.StartLobby postfix"); } catch (Exception ex) { Plugin.Logger.LogError((object)("StartLobby postfix falhou: " + ex)); } } private static int ResolveFromDropdownOrArg(CreateLobbySettings instance, int players) { TMP_Dropdown maxPlayersDropdown = instance.maxPlayersDropdown; if ((Object)(object)maxPlayersDropdown != (Object)null && maxPlayersDropdown.options != null && maxPlayersDropdown.options.Count > 0) { int value = maxPlayersDropdown.value; if (value >= 0 && value < maxPlayersDropdown.options.Count) { string text = maxPlayersDropdown.options[value].text; if (int.TryParse(text, out var result) && Plugin.IsAllowedPlayerCount(result)) { return result; } if (value >= 0 && value < Plugin.AllowedPlayerCounts.Length) { return Plugin.AllowedPlayerCounts[value]; } } } return Plugin.ResolveLobbyMaxPlayers(players); } private static void ApplyLobbyMax(CreateLobbySettings instance, int maxPlayers) { Plugin.SetDesiredLobbyMax(maxPlayers); instance.maxPlayers = Plugin.DesiredLobbyMax; PendingLobbySettings.maxPlayers = Plugin.DesiredLobbyMax; PlatformManager.s_MAXPLAYERS = 16; } private static void RebuildMaxPlayersDropdown(CreateLobbySettings instance) { TMP_Dropdown maxPlayersDropdown = instance.maxPlayersDropdown; if ((Object)(object)maxPlayersDropdown == (Object)null) { return; } int num = instance.maxPlayers; if (!Plugin.IsAllowedPlayerCount(num)) { num = Plugin.DesiredLobbyMax; } if (!Plugin.IsAllowedPlayerCount(num)) { num = 3; } maxPlayersDropdown.ClearOptions(); List val = new List(); for (int i = 0; i < Plugin.AllowedPlayerCounts.Length; i++) { val.Add(Plugin.AllowedPlayerCounts[i].ToString()); } maxPlayersDropdown.AddOptions(val); int num2 = 2; for (int j = 0; j < Plugin.AllowedPlayerCounts.Length; j++) { if (Plugin.AllowedPlayerCounts[j] == num) { num2 = j; break; } } maxPlayersDropdown.SetValueWithoutNotify(num2); maxPlayersDropdown.RefreshShownValue(); int num3 = Plugin.AllowedPlayerCounts[num2]; ApplyLobbyMax(instance, num3); Plugin.Logger.LogInfo((object)("Dropdown reconstruído: 1, 2, 3, 8 e 16. " + $"Selecionado={num3}")); } } [HarmonyPatch(typeof(NetworkRunner))] internal static class NetworkRunnerPatches { [HarmonyPrefix] [HarmonyPatch("StartGame")] private static void StartGamePrefix(ref StartGameArgs args) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Invalid comparison between Unknown and I4 //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Expected O, but got Unknown //IL_0071: Unknown result type (might be due to invalid IL or missing references) try { GameMode gameMode = args.GameMode; if ((int)gameMode != 5) { Plugin.ForcePendingLobbyMax("NetworkRunner.StartGame"); int effectiveLobbyMax = Plugin.GetEffectiveLobbyMax(); args.PlayerCount = new Nullable(effectiveLobbyMax); ManualLogSource logger = Plugin.Logger; bool flag = default(bool); BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(44, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("NetworkRunner.StartGame PlayerCount="); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(effectiveLobbyMax); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" (mode="); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(gameMode); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(")"); } logger.LogInfo(val); } } catch (Exception ex) { Plugin.Logger.LogError((object)("NetworkRunner.StartGame patch falhou: " + ex)); } } } [HarmonyPatch(typeof(FusionNetworkManager))] internal static class FusionNetworkManagerPatches { [HarmonyPrefix] [HarmonyPatch("StartAsHost")] private static void StartAsHostPrefix() { Plugin.ForcePendingLobbyMax("FusionNetworkManager.StartAsHost"); Plugin.Logger.LogInfo((object)("StartAsHost pending maxPlayers=" + Plugin.GetEffectiveLobbyMax())); } } [HarmonyPatch(typeof(PlatformManager))] internal static class PlatformManagerHostPatches { [HarmonyPrefix] [HarmonyPatch("HostLobby")] private static void HostLobbyPrefix() { Plugin.ForcePendingLobbyMax("PlatformManager.HostLobby"); } } [HarmonyPatch(typeof(PlatformManager_Steam))] internal static class PlatformManagerSteamHostPatches { [HarmonyPrefix] [HarmonyPatch("HostLobby")] private static void HostLobbyPrefix() { Plugin.ForcePendingLobbyMax("PlatformManager_Steam.HostLobby prefix"); } [HarmonyPostfix] [HarmonyPatch("HostLobby")] private static void HostLobbyPostfix() { Plugin.ForcePendingLobbyMax("PlatformManager_Steam.HostLobby postfix"); } } [HarmonyPatch(typeof(LobbyUIManager))] internal static class LobbyUIManagerHostPatches { [HarmonyPrefix] [HarmonyPatch("HostLobby")] private static void HostLobbyPrefix() { Plugin.ForcePendingLobbyMax("LobbyUIManager.HostLobby"); } } [HarmonyPatch(typeof(SteamMatchmaking))] internal static class SteamMatchmakingPatches { [HarmonyPrefix] [HarmonyPatch("CreateLobby")] private static void CreateLobbyPrefix(ref ELobbyType eLobbyType, ref int cMaxMembers) { int effectiveLobbyMax = Plugin.GetEffectiveLobbyMax(); Plugin.Logger.LogInfo((object)("SteamMatchmaking.CreateLobby cMaxMembers " + $"{cMaxMembers} -> {effectiveLobbyMax}")); cMaxMembers = effectiveLobbyMax; Plugin.ForcePendingLobbyMax("SteamMatchmaking.CreateLobby"); } [HarmonyPrefix] [HarmonyPatch("SetLobbyMemberLimit")] private static void SetLobbyMemberLimitPrefix(CSteamID steamIDLobby, ref int cMaxMembers) { int effectiveLobbyMax = Plugin.GetEffectiveLobbyMax(); if (cMaxMembers != effectiveLobbyMax) { Plugin.Logger.LogInfo((object)("SteamMatchmaking.SetLobbyMemberLimit " + $"{cMaxMembers} -> {effectiveLobbyMax}")); cMaxMembers = effectiveLobbyMax; } } [HarmonyPrefix] [HarmonyPatch("SetLobbyData")] private static void SetLobbyDataPrefix(CSteamID steamIDLobby, string pchKey, ref string pchValue) { //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Expected O, but got Unknown try { string maxPlayersKey = PlatformManager_Steam._maxPlayersKey; if (string.IsNullOrEmpty(maxPlayersKey) || pchKey == null || !string.Equals(pchKey, maxPlayersKey, StringComparison.Ordinal)) { return; } string text = Plugin.GetEffectiveLobbyMax().ToString(); if (!(pchValue == text)) { ManualLogSource logger = Plugin.Logger; bool flag = default(bool); BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(29, 3, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Steam SetLobbyData "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(pchKey); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(": "); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("'"); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(pchValue); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("' -> '"); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(text); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("'"); } logger.LogInfo(val); pchValue = text; } } catch (Exception ex) { Plugin.Logger.LogWarning((object)("SetLobbyData patch falhou: " + ex.Message)); } } } [HarmonyPatch(typeof(PlatformManager))] internal static class PlatformManagerPatches { [HarmonyPostfix] [HarmonyPatch("Awake")] private static void AwakePostfix() { Plugin.ApplyHardCap(); } [HarmonyPostfix] [HarmonyPatch("Init")] private static void InitPostfix() { Plugin.ApplyHardCap(); } } }