using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Threading; using System.Threading.Tasks; using Systems.SceneManagement; using AttributeNetworkWrapperV2; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using CielaSpike; using Crosstales; using DG.Tweening; using DG.Tweening.Core; using DG.Tweening.Plugins.Options; using DiscordRPC; using DiscordRPC.Events; using DiscordRPC.IO; using DiscordRPC.Logging; using DiscordRPC.Message; using Eflatun.SceneReference; using HarmonyLib; using IEVO.UI.uGUIDirectedNavigation; using Lachee.Discord; using Microsoft.CodeAnalysis; using Newtonsoft.Json; using PAMultiplayer.AttributeNetworkWrapperOverrides; using PAMultiplayer.Managers; using PAMultiplayer.Patch; using PAMultiplayer.UI; using PaApi; using Rewired; using SimpleJSON; using Steamworks; using Steamworks.Data; using Steamworks.Ugc; using TMPro; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.Events; using UnityEngine.Localization.PropertyVariants; using UnityEngine.Networking; using UnityEngine.SceneManagement; using UnityEngine.UI; using VGFunctions; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("PAMultiplayer")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyDescription("Multiplayer Mod")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+2449a663dd6a8aa20bf6670ef118ae704f14f34d")] [assembly: AssemblyProduct("PAMultiplayer")] [assembly: AssemblyTitle("PAMultiplayer")] [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.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace AttributeNetworkWrapperV2 { public static class RpcFuncRegistersGenerated { static RpcFuncRegistersGenerated() { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Expected O, but got Unknown //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Expected O, but got Unknown //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Expected O, but got Unknown //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Expected O, but got Unknown //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Expected O, but got Unknown //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Expected O, but got Unknown //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Expected O, but got Unknown //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Expected O, but got Unknown //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Expected O, but got Unknown //IL_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Expected O, but got Unknown //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_0114: Expected O, but got Unknown //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Expected O, but got Unknown //IL_0137: Unknown result type (might be due to invalid IL or missing references) //IL_0142: Expected O, but got Unknown //IL_014e: Unknown result type (might be due to invalid IL or missing references) //IL_0159: Expected O, but got Unknown //IL_0165: Unknown result type (might be due to invalid IL or missing references) //IL_0170: Expected O, but got Unknown //IL_017c: Unknown result type (might be due to invalid IL or missing references) //IL_0187: Expected O, but got Unknown //IL_0193: Unknown result type (might be due to invalid IL or missing references) //IL_019e: Expected O, but got Unknown //IL_01aa: Unknown result type (might be due to invalid IL or missing references) //IL_01b5: Expected O, but got Unknown //IL_01c1: Unknown result type (might be due to invalid IL or missing references) //IL_01cc: Expected O, but got Unknown //IL_01d8: Unknown result type (might be due to invalid IL or missing references) //IL_01e3: Expected O, but got Unknown //IL_01ef: Unknown result type (might be due to invalid IL or missing references) //IL_01fa: Expected O, but got Unknown //IL_0206: Unknown result type (might be due to invalid IL or missing references) //IL_0211: Expected O, but got Unknown //IL_021d: Unknown result type (might be due to invalid IL or missing references) //IL_0228: Expected O, but got Unknown //IL_0234: Unknown result type (might be due to invalid IL or missing references) //IL_023f: Expected O, but got Unknown //IL_024b: Unknown result type (might be due to invalid IL or missing references) //IL_0256: Expected O, but got Unknown //IL_0262: Unknown result type (might be due to invalid IL or missing references) //IL_026d: Expected O, but got Unknown //IL_0279: Unknown result type (might be due to invalid IL or missing references) //IL_0284: Expected O, but got Unknown //IL_0290: Unknown result type (might be due to invalid IL or missing references) //IL_029b: Expected O, but got Unknown //IL_02a7: Unknown result type (might be due to invalid IL or missing references) //IL_02b2: Expected O, but got Unknown //IL_02be: Unknown result type (might be due to invalid IL or missing references) //IL_02c9: Expected O, but got Unknown //IL_02d5: Unknown result type (might be due to invalid IL or missing references) //IL_02e0: Expected O, but got Unknown RpcHandler.RegisterRpc((ushort)58818, new RpcDelegate(PaMNetworkManager.Deserialize_Server_SendModVer_58818), (CallType)0); RpcHandler.RegisterRpc((ushort)34771, new RpcDelegate(ChallengeManager.Deserialize_Server_UnknownLevelIds_34771), (CallType)0); RpcHandler.RegisterRpc((ushort)7811, new RpcDelegate(VoterCell.Deserialize_Server_LevelVoted_7811), (CallType)0); RpcHandler.RegisterRpc((ushort)65336, new RpcDelegate(NetworkManager.Deserialize_Server_PlayerPos_65336), (CallType)0); RpcHandler.RegisterRpc((ushort)28267, new RpcDelegate(PointsManager.Deserialize_Client_SendResults_28267), (CallType)0); RpcHandler.RegisterRpc((ushort)34247, new RpcDelegate(GameManagerPatch.Deserialize_Server_RequestLobbyState_34247), (CallType)0); RpcHandler.RegisterRpc((ushort)54552, new RpcDelegate(Player_Patch.Deserialize_Server_PlayerDamaged_54552), (CallType)0); RpcHandler.RegisterRpc((ushort)59657, new RpcDelegate(Player_Patch.Deserialize_Server_PlayerBoost_59657), (CallType)0); RpcHandler.RegisterRpc((ushort)42018, new RpcDelegate(PaMNetworkManager.Deserialize_Client_RegisterPlayerId_42018), (CallType)1); RpcHandler.RegisterRpc((ushort)14931, new RpcDelegate(PaMNetworkManager.Deserialize_Client_SetMainLobbyData_14931), (CallType)1); RpcHandler.RegisterRpc((ushort)37620, new RpcDelegate(PaMNetworkManager.Deserialize_Client_AskForMod_37620), (CallType)1); RpcHandler.RegisterRpc((ushort)8766, new RpcDelegate(PaMNetworkManager.Deserialize_Client_MissingMod_8766), (CallType)1); RpcHandler.RegisterRpc((ushort)56878, new RpcDelegate(ChallengeManager.Deserialize_Client_AudioData_56878), (CallType)1); RpcHandler.RegisterRpc((ushort)11993, new RpcDelegate(GameManagerPatch.Deserialize_Client_LobbyState_11993), (CallType)1); RpcHandler.RegisterRpc((ushort)22680, new RpcDelegate(PaMNetworkManager.Deserialize_Multi_RegisterJoinedPlayerId_22680), (CallType)2); RpcHandler.RegisterRpc((ushort)54154, new RpcDelegate(PaMNetworkManager.Deserialize_Multi_UpdateLobbyState_54154), (CallType)2); RpcHandler.RegisterRpc((ushort)43472, new RpcDelegate(PaMNetworkManager.Deserialize_Multi_UpdateModifier_43472), (CallType)2); RpcHandler.RegisterRpc((ushort)18518, new RpcDelegate(PaMNetworkManager.Deserialize_Multi_PlayerLeft_18518), (CallType)2); RpcHandler.RegisterRpc((ushort)65375, new RpcDelegate(ChallengeManager.Deserialize_Multi_StartVoting_65375), (CallType)2); RpcHandler.RegisterRpc((ushort)27550, new RpcDelegate(ChallengeManager.Deserialize_Multi_VoteWinner_27550), (CallType)2); RpcHandler.RegisterRpc((ushort)47253, new RpcDelegate(ChallengeManager.Deserialize_Multi_CheckLevelIds_47253), (CallType)2); RpcHandler.RegisterRpc((ushort)13413, new RpcDelegate(NetworkManager.Deserialize_Multi_PlayerPos_13413), (CallType)2); RpcHandler.RegisterRpc((ushort)49432, new RpcDelegate(PointsManager.Deserialize_Multi_SetPlayerResults_49432), (CallType)2); RpcHandler.RegisterRpc((ushort)10245, new RpcDelegate(GameManagerPatch.Deserialize_Multi_LatePlayerJoin_10245), (CallType)2); RpcHandler.RegisterRpc((ushort)62198, new RpcDelegate(GameManagerPatch.Deserialize_Multi_NextQueueLevel_62198), (CallType)2); RpcHandler.RegisterRpc((ushort)65142, new RpcDelegate(GameManagerPatch.Deserialize_Multi_OpenChallenge_65142), (CallType)2); RpcHandler.RegisterRpc((ushort)40080, new RpcDelegate(Player_Patch.Deserialize_Multi_PlayerDamaged_40080), (CallType)2); RpcHandler.RegisterRpc((ushort)5034, new RpcDelegate(Player_Patch.Deserialize_Multi_DamageAll_5034), (CallType)2); RpcHandler.RegisterRpc((ushort)29337, new RpcDelegate(Player_Patch.Deserialize_Multi_PlayerBoost_29337), (CallType)2); RpcHandler.RegisterRpc((ushort)16372, new RpcDelegate(CheckpointHandler.Deserialize_Multi_CheckpointHit_16372), (CallType)2); RpcHandler.RegisterRpc((ushort)11649, new RpcDelegate(RewindHandler.Deserialize_Multi_RewindToCheckpoint_11649), (CallType)2); RpcHandler.RegisterRpc((ushort)34174, new RpcDelegate(PauseLobbyPatch.Deserialize_Multi_StartLevel_34174), (CallType)2); } } } namespace PAMultiplayer { public static class MPUtility { public static void SetFullTextGradient(TMP_TextInfo textInfo, Color32 colorLeft, Color32 colorRight) { //IL_0017: 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_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_0114: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_0131: Unknown result type (might be due to invalid IL or missing references) //IL_0148: Unknown result type (might be due to invalid IL or missing references) //IL_014a: Unknown result type (might be due to invalid IL or missing references) //IL_0154: Unknown result type (might be due to invalid IL or missing references) //IL_0156: Unknown result type (might be due to invalid IL or missing references) //IL_0160: Unknown result type (might be due to invalid IL or missing references) //IL_0162: Unknown result type (might be due to invalid IL or missing references) //IL_016b: Unknown result type (might be due to invalid IL or missing references) //IL_016d: Unknown result type (might be due to invalid IL or missing references) float num = float.MaxValue; float num2 = float.MinValue; for (int i = 0; i < textInfo.characterCount; i++) { if (textInfo.characterInfo[i].isVisible) { int materialReferenceIndex = textInfo.characterInfo[i].materialReferenceIndex; int vertexIndex = textInfo.characterInfo[i].vertexIndex; Vector3[] vertices = textInfo.meshInfo[materialReferenceIndex].vertices; float x = vertices[vertexIndex].x; num = Mathf.Min(num, x); x = vertices[vertexIndex + 2].x; num2 = Mathf.Max(num2, x); } } for (int j = 0; j < textInfo.characterCount; j++) { if (textInfo.characterInfo[j].isVisible) { int materialReferenceIndex2 = textInfo.characterInfo[j].materialReferenceIndex; int vertexIndex2 = textInfo.characterInfo[j].vertexIndex; Vector3[] vertices2 = textInfo.meshInfo[materialReferenceIndex2].vertices; Color32 val = Color32.Lerp(colorLeft, colorRight, Mathf.InverseLerp(num, num2, vertices2[vertexIndex2].x)); Color32 val2 = Color32.Lerp(colorLeft, colorRight, Mathf.InverseLerp(num, num2, vertices2[vertexIndex2 + 2].x)); Color32[] colors = textInfo.meshInfo[materialReferenceIndex2].colors32; colors[vertexIndex2] = val; colors[vertexIndex2 + 1] = val; colors[vertexIndex2 + 2] = val2; colors[vertexIndex2 + 3] = val2; } } } } [BepInPlugin("me.ytarame.Multiplayer", "Multiplayer", "1.3.1")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class PAM : BaseUnityPlugin { internal static ManualLogSource Logger; private Harmony _harmony; public const string Guid = "me.ytarame.Multiplayer"; private const string Name = "Multiplayer"; public const string Version = "1.3.1"; internal static GameObject ErrorScreenPrefab { get; private set; } internal static GameObject LobbyScreenPrefab { get; private set; } internal static GameObject LobbyPlayerEntryPrefab { get; private set; } internal static GameObject LobbyQueueEntryPrefab { get; private set; } private void Awake() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown //IL_00c8: Unknown result type (might be due to invalid IL or missing references) Logger = ((BaseUnityPlugin)this).Logger; _harmony = new Harmony("me.ytarame.Multiplayer"); _harmony.PatchAll(); Settings.Initialize(((BaseUnityPlugin)this).Config); using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("PAMultiplayer.Assets.lobbymenuv2")) { AssetBundle obj = AssetBundle.LoadFromMemory(ExtensionMethods.CTReadFully(stream)); Object obj2 = obj.LoadAsset(obj.GetAllAssetNames()[0]); ErrorScreenPrefab = (GameObject)(object)((obj2 is GameObject) ? obj2 : null); Object obj3 = obj.LoadAsset(obj.GetAllAssetNames()[2]); LobbyScreenPrefab = (GameObject)(object)((obj3 is GameObject) ? obj3 : null); Object obj4 = obj.LoadAsset(obj.GetAllAssetNames()[3]); LobbyPlayerEntryPrefab = (GameObject)(object)((obj4 is GameObject) ? obj4 : null); Object obj5 = obj.LoadAsset(obj.GetAllAssetNames()[4]); LobbyQueueEntryPrefab = (GameObject)(object)((obj5 is GameObject) ? obj5 : null); obj.Unload(false); } SettingsHelper.RegisterModSettings("me.ytarame.Multiplayer", "Multiplayer", (Color?)Color.red, ((BaseUnityPlugin)this).Config, (Action)delegate(SettingsBuilder builder) { builder.Label("TRANSPARENT NANOS - and related settings"); builder.Toggle("Transparent Nanos", "Remote players are transparent", "Remote players are opaque", Settings.Transparent, (Action)null); builder.Slider("Transparent Opacity", Settings.TransparentAlpha, (VisualType)1, new string[3] { "35%", "50%", "85%" }); builder.Spacer(); builder.Label("MISCELLANEOUS - other settings"); builder.Slider("No Repeats in Challenge", Settings.NoRepeat, (VisualType)1, new string[5] { "0 Rounds", "1 Round", "2 Rounds", "3 Rounds", "Infinite" }); builder.Toggle("Chat Enabled", "Chat appears above their nano and terminal", "Player chat is not shown", Settings.Chat, (Action)null); builder.Toggle("Disable Rich Text", "Chat Rich text enabled", "Chat rich text disabled", Settings.DisableRichText, (Action)null); builder.Toggle("Linked Health Hit Popup", "Popup for which player caused the hit", "No popup appears", Settings.Linked, (Action)null); builder.Toggle("Allow hidden workshop levels", "Non public levels are allowed", "Only public are allowed", Settings.AllowNonPublicLevels, (Action)null); }); Logger.LogInfo((object)"Multiplayer 1.3.1 has loaded!"); } } internal static class Settings { public static ConfigEntry ChallengeBlacklist; public static ConfigEntry WarpSfx { get; private set; } public static ConfigEntry HitSfx { get; private set; } public static ConfigEntry Transparent { get; private set; } public static ConfigEntry TransparentAlpha { get; private set; } public static ConfigEntry NoRepeat { get; private set; } public static ConfigEntry Chat { get; private set; } public static ConfigEntry DisableRichText { get; private set; } public static ConfigEntry Linked { get; private set; } public static ConfigEntry AllowNonPublicLevels { get; private set; } public static ConfigEntry Score { get; private set; } internal static void Initialize(ConfigFile config) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Expected O, but got Unknown //IL_0032: Expected O, but got Unknown //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Expected O, but got Unknown //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Expected O, but got Unknown //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Expected O, but got Unknown //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Expected O, but got Unknown //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Expected O, but got Unknown //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Expected O, but got Unknown //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Expected O, but got Unknown //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_0112: Expected O, but got Unknown //IL_0122: Unknown result type (might be due to invalid IL or missing references) //IL_012e: Expected O, but got Unknown //IL_013e: Unknown result type (might be due to invalid IL or missing references) //IL_014f: Unknown result type (might be due to invalid IL or missing references) //IL_0159: Expected O, but got Unknown //IL_0159: Expected O, but got Unknown if (WarpSfx == null) { ChallengeBlacklist = config.Bind(new ConfigDefinition("Challenge", "BlackList"), "", new ConfigDescription("List of level id's that are never chosen in challenge, separated by '/'. like id/id2/id3, no spaces", (AcceptableValueBase)null, Array.Empty())); WarpSfx = config.Bind(new ConfigDefinition("General", "Player Warp SFX"), 1, (ConfigDescription)null); HitSfx = config.Bind(new ConfigDefinition("General", "Player Hit SFX"), 0, (ConfigDescription)null); Transparent = config.Bind(new ConfigDefinition("General", "Transparent Nanos"), true, (ConfigDescription)null); TransparentAlpha = config.Bind(new ConfigDefinition("General", "Transparent Alpha"), 0, (ConfigDescription)null); NoRepeat = config.Bind(new ConfigDefinition("General", "No Repeat"), 0, (ConfigDescription)null); Chat = config.Bind(new ConfigDefinition("General", "Chat Enabled"), true, (ConfigDescription)null); DisableRichText = config.Bind(new ConfigDefinition("General", "Disable Rich Text"), false, (ConfigDescription)null); Linked = config.Bind(new ConfigDefinition("General", "Linked Health Popup"), true, (ConfigDescription)null); AllowNonPublicLevels = config.Bind(new ConfigDefinition("General", "Allow Private Levels"), false, (ConfigDescription)null); Score = config.Bind(new ConfigDefinition("General", "Score"), 0, new ConfigDescription("I know you're thinking about it, dont do it... be legitimate...", (AcceptableValueBase)null, Array.Empty())); } } } public static class MyPluginInfo { public const string PLUGIN_GUID = "PAMultiplayer"; public const string PLUGIN_NAME = "PAMultiplayer"; public const string PLUGIN_VERSION = "1.0.0"; } } namespace PAMultiplayer.UI { public class ErrorScreen : MonoBehaviour { private UI_Menu _menu; private TextMeshProUGUI _text; private MultiElementButton _button; private string _errorMessage; private GameObject _last; public static void CreateErrorScreen(string errorMessage) { Transform parent = ((Component)SingletonBase.Inst).transform.parent; GameObject obj = Object.Instantiate(PAM.ErrorScreenPrefab, parent); obj.transform.SetSiblingIndex(0); obj.AddComponent()._errorMessage = errorMessage; } private void Start() { ((TMP_Text)_text).text = _errorMessage; SingletonBase.Inst.RefreshTextCache(_text, _errorMessage); _last = EventSystem.current.currentSelectedGameObject; _menu.ShowBase(); _menu.SwapView("main"); ((Selectable)((SerializableDictionary)(object)_menu.AllViews)["main"].PossibleFirstButtons[0]).Select(); } private void Awake() { //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Expected O, but got Unknown _menu = ((Component)this).GetComponent(); _text = ((Component)((Component)this).transform.Find("ErrorMessage")).GetComponent(); _button = ((Component)((Component)this).transform.Find("Close/Close")).GetComponent(); ((UnityEvent)((Button)_button).onClick).AddListener(new UnityAction(Close)); } private void Close() { _menu.HideAll(); Object.Destroy((Object)(object)((Component)this).gameObject, 1f); if (Object.op_Implicit((Object)(object)_last)) { EventSystem.current.SetSelectedGameObject(_last); } } } } namespace PAMultiplayer.Patch { [HarmonyPatch(typeof(DebugController))] public static class DebugControllerPatch { [HarmonyPatch("Awake")] [HarmonyPostfix] private static void PostAwake(DebugController __instance) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Expected O, but got Unknown //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Expected O, but got Unknown //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Expected O, but got Unknown //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Expected O, but got Unknown //IL_010d: Unknown result type (might be due to invalid IL or missing references) //IL_0114: Expected O, but got Unknown //IL_01d2: Unknown result type (might be due to invalid IL or missing references) //IL_01d9: Expected O, but got Unknown //IL_0201: Unknown result type (might be due to invalid IL or missing references) //IL_0208: Expected O, but got Unknown //IL_0230: Unknown result type (might be due to invalid IL or missing references) //IL_0237: Expected O, but got Unknown //IL_030e: Unknown result type (might be due to invalid IL or missing references) //IL_0315: Expected O, but got Unknown DebugCommand item = new DebugCommand("Ping", "Prints current ping (multiplayer mod, any)", (Action)delegate { if (!GlobalsManager.IsMultiplayer) { __instance.AddLog("-1 ms"); } else { __instance.AddLog($"{PaMNetworkManager.PamInstance.GetPing()} ms"); } }); __instance.CommandList.Add(item); DebugCommand item2 = new DebugCommand("MPLeaderboard", "Top 10 leaderboard, page starts at 0 (multiplayer mod, any)", "int(page)", (Action)async delegate(int page) { _ = 1; try { Leaderboard? val5 = await SteamUserStats.FindOrCreateLeaderboardAsync("MP_MOD_Points", (LeaderboardSort)2, (LeaderboardDisplay)1); if (!val5.HasValue) { __instance.AddLog("Failed to get leaderboard"); } else { Leaderboard value3 = val5.Value; LeaderboardEntry[] array3 = await ((Leaderboard)(ref value3)).GetScoresAsync(10, 1 + 10 * page); if (array3 == null) { __instance.AddLog("Failed to get leaderboard"); } else { for (int k = 0; k < array3.Length; k++) { LeaderboardEntry val6 = array3[k]; __instance.AddLog($"{val6.GlobalRank}. {((Friend)(ref val6.User)).Name} // {val6.Score}"); } } } } catch (Exception ex3) { PAM.Logger.LogError((object)ex3); } }); __instance.CommandList.Add(item2); DebugCommand item3 = new DebugCommand("MPFriendLeaderboard", "Top 10 friends only leaderboard, page starts at 0 (multiplayer mod, any)", (Action)async delegate { _ = 1; try { Leaderboard? val3 = await SteamUserStats.FindOrCreateLeaderboardAsync("MP_MOD_Points", (LeaderboardSort)2, (LeaderboardDisplay)1); if (!val3.HasValue) { __instance.AddLog("Failed to get leaderboard"); } else { Leaderboard value2 = val3.Value; LeaderboardEntry[] array2 = await ((Leaderboard)(ref value2)).GetScoresFromFriendsAsync(); if (array2 == null) { __instance.AddLog("Failed to get leaderboard"); } else { for (int j = 0; j < array2.Length; j++) { LeaderboardEntry val4 = array2[j]; __instance.AddLog($"{val4.GlobalRank}. {((Friend)(ref val4.User)).Name} // {val4.Score}"); } } } } catch (Exception ex2) { PAM.Logger.LogError((object)ex2); } }); __instance.CommandList.Add(item3); DebugCommand item4 = new DebugCommand("SelfMPLeaderboard", "your leaderboard (multiplayer mod, any)", (Action)async delegate { _ = 1; try { Leaderboard? val = await SteamUserStats.FindOrCreateLeaderboardAsync("MP_MOD_Points", (LeaderboardSort)2, (LeaderboardDisplay)1); if (!val.HasValue) { __instance.AddLog("Failed to get leaderboard"); } else { Leaderboard value = val.Value; LeaderboardEntry[] array = await ((Leaderboard)(ref value)).GetScoresAroundUserAsync(-5, 5); if (array == null) { __instance.AddLog("Failed to get leaderboard"); } else { for (int i = 0; i < array.Length; i++) { LeaderboardEntry val2 = array[i]; __instance.AddLog($"{val2.GlobalRank}. {((Friend)(ref val2.User)).Name} // {val2.Score}"); } } } } catch (Exception ex) { PAM.Logger.LogError((object)ex); } }); __instance.CommandList.Add(item4); DebugCommand item5 = new DebugCommand("KillAll", "Kills all players (multiplayer mod, any)", (Action)delegate { if (GlobalsManager.IsMultiplayer) { if (GlobalsManager.IsHosting) { __instance.AddLog("Is host, Killing all players."); int index = 0; if (DataManager.inst.GetSettingEnum("ArcadeHealthMod", 0) <= 1) { index = SingletonBase.Inst.currentCheckpointIndex; } RewindHandler.CallRpc_Multi_RewindToCheckpoint(index); } else { __instance.AddLog("Is client, Killing self only."); if (GlobalsManager.LocalPlayerObj.IsValidPlayer()) { GlobalsManager.LocalPlayerObj.Health = 1; GlobalsManager.LocalPlayerObj.PlayerHit(); } } return; } __instance.AddLog("Killing All Players."); foreach (VGPlayerData player in SingletonBase.Inst.players) { if (player.PlayerObject.IsValidPlayer()) { player.PlayerObject.Health = 1; player.PlayerObject.PlayerHit(); } } }); __instance.CommandList.Add(item5); DebugCommand item6 = new DebugCommand("ForceDisconnect", "Disconnects you from the lobby (multiplayer mod, any)", (Action)delegate { __instance.AddLog("Attempting to disconnect from the lobby."); GlobalsManager.LocalPlayerObjectId = 0; SteamManager.Inst.EndServer(); SteamManager.Inst.EndClient(); GlobalsManager.Players.Clear(); }); __instance.CommandList.Add(item6); Action action = delegate(string message) { __instance.OnToggleDebug(); if (!GlobalsManager.IsMultiplayer) { __instance.AddLog("Not currently in a lobby."); } else { PAM.Logger.LogInfo((object)("Sending message: [" + message + "]")); if (message.Length > 25) { PAM.Logger.LogInfo((object)"Message is longer than 25 characters. Cutting message."); message = message.Substring(0, 25); } ((Lobby)(ref SteamLobbyManager.Inst.CurrentLobby)).SendChatString(message); } }; DebugCommand item7 = new DebugCommand("chat", "Makes your Nano say something. (multiplayer mod, any)", "string(message)", action); __instance.CommandList.Add(item7); DebugCommand item8 = new DebugCommand("c", "Same as Chat (multiplayer mod, any)", "string(message)", action); __instance.CommandList.Add(item8); DebugCommand item9 = new DebugCommand("AddQueue", "Adds a level to the queue, the level has to be downloaded. (multiplayer mod, host)", "string(level_id)", (Action)delegate(string levelId) { if (GlobalsManager.IsMultiplayer && !GlobalsManager.IsHosting) { __instance.AddLog("You're not the host."); } else if (Object.op_Implicit((Object)(object)SingletonBase.Inst.GetLocalCustomLevel(levelId.ToString()))) { GlobalsManager.Queue.Insert(0, SingletonBase.Inst.CurrentArcadeLevel.TrackName); GlobalsManager.Queue.Add(levelId); __instance.AddLog("Adding level with id [" + levelId + "] to queue."); ((Lobby)(ref SteamLobbyManager.Inst.CurrentLobby)).SetData("LevelQueue", JsonConvert.SerializeObject((object)GlobalsManager.GetQueueLevelNames())); GlobalsManager.Queue.RemoveAt(0); } else { __instance.AddLog("Level with id [" + levelId + "] wasn't found downloaded."); } }); __instance.CommandList.Add(item9); DebugCommand item10 = new DebugCommand("ToggleTransparency", "toggles Transparent Nanos. (multiplayer mod, any)", (Action)delegate { if (!GlobalsManager.IsMultiplayer) { __instance.AddLog("Not in multiplayer, not toggling transparency."); } else { bool flag2 = !Settings.Transparent.Value; Settings.Transparent.Value = flag2; foreach (VGPlayerData player2 in SingletonBase.Inst.players) { if (player2.PlayerObject.IsValidPlayer() && !player2.PlayerObject.IsLocalPlayer()) { foreach (PlayerTrailReference item19 in player2.PlayerObject.Player_Trail.Trail) { ((Renderer)item19.Render_Trail).enabled = flag2; } } } __instance.AddLog($"Toggle Transparency to [{flag2}]."); } }); __instance.CommandList.Add(item10); DebugCommand item11 = new DebugCommand("ToggleLinked", "Toggles the modifier Linked Health. (multiplayer mod, host)", (Action)delegate { bool flag = !DataManager.inst.GetSettingBool("mp_linkedHealth", false); DataManager.inst.UpdateSettingBool("mp_linkedHealth", flag); if (GlobalsManager.IsMultiplayer) { ((Lobby)(ref SteamLobbyManager.Inst.CurrentLobby)).SetData("LinkedMod", flag.ToString()); PaMNetworkManager.CallRpc_Multi_UpdateModifier(2, flag ? ((byte)1) : ((byte)0)); } __instance.AddLog($"Toggle Linked Health to [{flag}]."); }); __instance.CommandList.Add(item11); DebugCommand item12 = new DebugCommand("PlayerList", "shows all player ids. (multiplayer mod, any)", (Action)delegate { if (!GlobalsManager.IsMultiplayer) { __instance.AddLog("Not in multiplayer."); return; } __instance.AddLog("Showing all players."); if (GlobalsManager.IsHosting) { foreach (KeyValuePair item20 in PaMNetworkManager.PamInstance.SteamIdToNetId) { __instance.AddLog($"ID [{item20.Value}], Name [{GlobalsManager.Players[item20.Key].Name}]"); } return; } foreach (KeyValuePair player3 in GlobalsManager.Players) { __instance.AddLog(player3.Value.Name); } }); __instance.CommandList.Add(item12); DebugCommand item13 = new DebugCommand("Kick", "attempts to kick a player from the lobby. (multiplayer mod, host)", "int(player_id)", (Action)delegate(int playerId) { if (!GlobalsManager.IsMultiplayer || !GlobalsManager.IsHosting) { __instance.AddLog("Not in multiplayer or not the host. not kicking player."); } else { ((NetworkManager)PaMNetworkManager.PamInstance).KickClient(playerId); __instance.AddLog("Attempting to kick player from server."); } }); __instance.CommandList.Add(item13); DebugCommand item14 = new DebugCommand("SetLobbyPrivacy", "set the lobby privacy setting. (multiplayer mod, host)", "bool(private)", (Action)delegate(string isPrivateStr) { if (!bool.TryParse(isPrivateStr.ToLower(), out var result)) { __instance.AddLog("Invalid parameter, pass \"true\" or \"false\"."); } else if (!GlobalsManager.IsMultiplayer || !GlobalsManager.IsHosting) { __instance.AddLog("Not in multiplayer or not the host."); } else if (result) { ((Lobby)(ref SteamLobbyManager.Inst.CurrentLobby)).SetFriendsOnly(); __instance.AddLog("Lobby was made private."); } else { ((Lobby)(ref SteamLobbyManager.Inst.CurrentLobby)).SetPublic(); __instance.AddLog("Lobby was made public."); } }); __instance.CommandList.Add(item14); DebugCommand item15 = new DebugCommand("SetLobbySize", "attempts to change the lobby size. (multiplayer mod, host) | 1 - 4 players. | 2 - 8 players. | 3 - 12 players. | 4 - 16 players.", "int(player_count)", (Action)delegate(int playerCount) { if (!GlobalsManager.IsMultiplayer || !GlobalsManager.IsHosting) { __instance.AddLog("Not in multiplayer or not the host."); } else { playerCount = Mathf.Clamp(playerCount * 4, 4, 16); if (((Lobby)(ref SteamLobbyManager.Inst.CurrentLobby)).MemberCount < playerCount) { __instance.AddLog("Tried to set lobby size to less than the lobby player count."); } else { ((Lobby)(ref SteamLobbyManager.Inst.CurrentLobby)).MaxMembers = playerCount; LobbyCreationManager.Instance.PlayerCount = playerCount; __instance.AddLog($"Set lobby max players to [{playerCount}]"); } } }); __instance.CommandList.Add(item15); DebugCommand item16 = new DebugCommand("DebugErrorScreen", "Creates a error screen. (multiplayer mod, any)", (Action)delegate { ErrorScreen.CreateErrorScreen("Test error Screen, Test error message.\n\nFun fact: I have no idea what I am doing anymore"); }); __instance.CommandList.Add(item16); DebugCommand item17 = new DebugCommand("DebugPacketLoss", "sets packet loss 0-100. (multiplayer mod, any)", "int(loss%)", (Action)delegate(int loss) { SteamNetworkingUtils.FakeRecvPacketLoss = loss; SteamNetworkingUtils.FakeSendPacketLoss = loss; }); __instance.CommandList.Add(item17); DebugCommand item18 = new DebugCommand("DebugSetPacketDelay", "sets delay on packets. (multiplayer mod, any)", "int(ms delay)", (Action)delegate(int ms) { SteamNetworkingUtils.FakeRecvPacketLag = ms; SteamNetworkingUtils.FakeSendPacketLag = ms; }); __instance.CommandList.Add(item18); } [HarmonyPatch("HandleInput")] [HarmonyPrefix] private static void PreHandleInput(ref string _input) { if (_input.Length >= 5 && _input.ToLower().Substring(0, 5) == "chat ") { _input = "chat " + _input.Substring(5).Replace(' ', '_'); } if (_input.Length >= 2 && _input.ToLower().Substring(0, 2) == "c ") { _input = "c " + _input.Substring(2).Replace(' ', '_'); } } } [HarmonyPatch(typeof(DiscordManager))] public static class DiscordManagerPatch { [HarmonyPatch("Awake")] [HarmonyPrefix] private static void stopPresence(DiscordManager __instance) { JsonConvert.DefaultSettings = null; ((Component)__instance).gameObject.AddComponent(); Object.Destroy((Object)(object)__instance); } } [HarmonyPatch(typeof(GameManager))] public class GameManagerPatch { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static UnityAction <>9__1_0; public static UnityAction <>9__1_1; public static Func <>9__1_2; public static Func <>9__1_3; public static Func <>9__1_4; public static Func <>9__12_0; public static Func <>9__12_1; public static Func <>9__12_2; public static Func <>9__12_3; public static Func <>9__12_4; public static Func <>9__12_5; public static Func <>9__12_6; public static Func <>9__12_10; public static Func <>9__12_8; public static Func <>9__12_9; public static Comparison <>9__12_7; internal void b__1_0() { GlobalsManager.IsReloadingLobby = true; } internal void b__1_1() { SingletonBase.Inst.CloseUI(); GlobalsManager.IsReloadingLobby = true; if (GlobalsManager.IsMultiplayer) { SteamLobbyManager.Inst.UnloadAll(); } if (GlobalsManager.IsChallenge) { if (GlobalsManager.IsMultiplayer && GlobalsManager.IsHosting) { CallRpc_Multi_OpenChallenge(); } SingletonBase.Inst.LoadSceneGroup("Challenge"); } else { string text = GlobalsManager.Queue[0]; SingletonBase.Inst.CurrentArcadeLevel = SingletonBase.Inst.GetLocalCustomLevel(text); GlobalsManager.LevelId = text; SingletonBase.Inst.LoadSceneGroup("Arcade_Level"); PAM.Logger.LogInfo((object)"Skipping to next level in queue!"); } } internal async Task b__1_2() { while (!SteamLobbyManager.Inst.InLobby) { await Task.Delay(100); } } internal async Task b__1_3() { while (true) { if (PaMNetworkManager.PamInstance != null) { NetworkManager instance = NetworkManager.Instance; if (instance == null || instance.TransportActive) { break; } } await Task.Delay(100); } } internal async Task b__1_4() { while (!GlobalsManager.HasLoadedAllInfo) { await Task.Delay(100); } } internal bool b__12_0() { return SteamLobbyManager.Inst.InLobby; } internal bool b__12_1() { return NetworkManager.Instance.TransportActive; } internal bool b__12_2() { return GlobalsManager.HasLoadedMainLobbyInfo; } internal bool b__12_3() { return GlobalsManager.HasLoadedAllInfo; } internal async Task b__12_4() { while (GlobalsManager.LobbyState == SteamLobbyManager.LobbyState.Challenge) { await Task.Delay(100); } } internal bool b__12_5() { return GlobalsManager.LobbyState != SteamLobbyManager.LobbyState.Challenge; } internal async Task b__12_6() { while (!GlobalsManager.HasLoadedMidLobbyInfo) { await Task.Delay(100); } } internal async Task b__12_8() { SimpleCoroutineAwaiter val = IEnumeratorAwaitExtensions.GetAwaiter(new WaitUntil((Func)(() => !GlobalsManager.IsDownloading))); if (!val.IsCompleted) { await val; object obj = default(object); val = (SimpleCoroutineAwaiter)obj; } val.GetResult(); } internal bool b__12_10() { return !GlobalsManager.IsDownloading; } internal bool b__12_9() { return !GlobalsManager.IsDownloading; } internal int b__12_7(Checkpoint x, Checkpoint y) { return x.time.CompareTo(y.time); } } [CompilerGenerated] private sealed class d__12 : IEnumerator, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public VGLevel _level; private GameManager 5__2; private VGLevel 5__3; private Task 5__4; private Item 5__5; private VGLevel 5__6; private bool 5__7; private ulong 5__8; private Task 5__9; object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public d__12(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { //IL_001b: Unknown result type (might be due to invalid IL or missing references) 5__2 = null; 5__3 = null; 5__4 = null; 5__5 = default(Item); 5__6 = null; 5__9 = null; <>1__state = -2; } private bool MoveNext() { //IL_03c0: Unknown result type (might be due to invalid IL or missing references) //IL_03c5: Unknown result type (might be due to invalid IL or missing references) //IL_03d0: Unknown result type (might be due to invalid IL or missing references) //IL_03d7: Unknown result type (might be due to invalid IL or missing references) //IL_04a5: Unknown result type (might be due to invalid IL or missing references) //IL_04aa: Unknown result type (might be due to invalid IL or missing references) //IL_050d: Unknown result type (might be due to invalid IL or missing references) //IL_0183: Unknown result type (might be due to invalid IL or missing references) //IL_018d: Expected O, but got Unknown //IL_01bd: Unknown result type (might be due to invalid IL or missing references) //IL_01c7: Expected O, but got Unknown //IL_0413: Unknown result type (might be due to invalid IL or missing references) //IL_0424: Unknown result type (might be due to invalid IL or missing references) //IL_0455: Unknown result type (might be due to invalid IL or missing references) //IL_045a: Unknown result type (might be due to invalid IL or missing references) //IL_02fd: Unknown result type (might be due to invalid IL or missing references) //IL_0307: Expected O, but got Unknown //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_05a9: Unknown result type (might be due to invalid IL or missing references) //IL_05bb: Unknown result type (might be due to invalid IL or missing references) //IL_05c5: Expected O, but got Unknown //IL_09fd: Unknown result type (might be due to invalid IL or missing references) //IL_0a02: Unknown result type (might be due to invalid IL or missing references) //IL_0a09: Unknown result type (might be due to invalid IL or missing references) //IL_0a15: Expected O, but got Unknown //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_0153: Expected O, but got Unknown //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Expected O, but got Unknown //IL_025c: Unknown result type (might be due to invalid IL or missing references) //IL_0266: Expected O, but got Unknown //IL_06ab: Unknown result type (might be due to invalid IL or missing references) //IL_06b5: Expected O, but got Unknown //IL_0607: Unknown result type (might be due to invalid IL or missing references) //IL_060c: Unknown result type (might be due to invalid IL or missing references) //IL_0610: Unknown result type (might be due to invalid IL or missing references) //IL_0616: Invalid comparison between Unknown and I4 //IL_039f: Unknown result type (might be due to invalid IL or missing references) //IL_03a9: Expected O, but got Unknown //IL_061a: Unknown result type (might be due to invalid IL or missing references) //IL_061f: Unknown result type (might be due to invalid IL or missing references) //IL_062f: Unknown result type (might be due to invalid IL or missing references) //IL_0634: Unknown result type (might be due to invalid IL or missing references) //IL_0641: Unknown result type (might be due to invalid IL or missing references) //IL_0646: Unknown result type (might be due to invalid IL or missing references) PublishedFileId id; Item? result2; bool value; switch (<>1__state) { default: return false; case 0: <>1__state = -1; 5__2 = SingletonBase.Inst; 5__2.LoadTimer = new Stopwatch(); 5__2.LoadTimer.Start(); if (!GlobalsManager.IsReloadingLobby) { if (GlobalsManager.IsHosting) { GlobalsManager.HasLoadedMidLobbyInfo = true; GlobalsManager.HasLoadedMainLobbyInfo = true; GlobalsManager.LobbyState = SteamLobbyManager.LobbyState.Lobby; SteamLobbyManager.Inst.CreateLobby(); <>2__current = (object)new WaitUntil((Func)(() => SteamLobbyManager.Inst.InLobby)); <>1__state = 1; return true; } SteamManager.Inst.StartClient(((Lobby)(ref SteamLobbyManager.Inst.CurrentLobby)).Owner.Id); <>2__current = (object)new WaitUntil((Func)(() => NetworkManager.Instance.TransportActive)); <>1__state = 2; return true; } goto IL_02d5; case 1: <>1__state = -1; ((Lobby)(ref SteamLobbyManager.Inst.CurrentLobby)).SetData("LobbyState", ((ushort)0).ToString()); goto IL_02d5; case 2: <>1__state = -1; <>2__current = (object)new WaitUntil((Func)(() => GlobalsManager.HasLoadedMainLobbyInfo)); <>1__state = 3; return true; case 3: <>1__state = -1; <>2__current = (object)new WaitUntil((Func)(() => GlobalsManager.HasLoadedAllInfo)); <>1__state = 4; return true; case 4: <>1__state = -1; if (GlobalsManager.LobbyState == SteamLobbyManager.LobbyState.Challenge) { ((Lobby)(ref SteamLobbyManager.Inst.CurrentLobby)).SetMemberData("IsLoaded", "1"); SingletonBase.Inst.manager.AddToLoadingTasks("Challenge Level Vote", Task.Run(async delegate { while (GlobalsManager.LobbyState == SteamLobbyManager.LobbyState.Challenge) { await Task.Delay(100); } }), (string)null, (string)null, (Func)null); GlobalsManager.HasLoadedMidLobbyInfo = true; <>2__current = (object)new WaitUntil((Func)(() => GlobalsManager.LobbyState != SteamLobbyManager.LobbyState.Challenge)); <>1__state = 5; return true; } if (GlobalsManager.LobbyState == SteamLobbyManager.LobbyState.Playing) { GlobalsManager.HasLoadedMidLobbyInfo = false; GlobalsManager.JoinedMidLevel = true; SingletonBase.Inst.manager.AddToLoadingTasks("Lobby State", Task.Run(async delegate { while (!GlobalsManager.HasLoadedMidLobbyInfo) { await Task.Delay(100); } }), (string)null, (string)null, (Func)null); } else { GlobalsManager.HasLoadedMidLobbyInfo = true; GlobalsManager.JoinedMidLevel = false; } goto IL_02d5; case 5: <>1__state = -1; return false; case 6: <>1__state = -1; if (SteamWorkshopFacepunch.inst.isLoadingLevels) { goto IL_02d5; } goto IL_0323; case 7: { <>1__state = -1; 5__5 = 5__4.Result; if (((Item)(ref 5__5)).Id == PublishedFileId.op_Implicit(0uL)) { return false; } 5__6 = ScriptableObject.CreateInstance(); 5__6.InitArcadeData(((Item)(ref 5__5)).Directory); InitSteamInfo(ref 5__6, ((Item)(ref 5__5)).Id, ((Item)(ref 5__5)).Directory, 5__5); SingletonBase.Inst.ArcadeLevels.Add(5__6); GameManager obj2 = 5__2; FileManager inst2 = FileManager.inst; id = ((Item)(ref 5__5)).Id; <>2__current = ((MonoBehaviour)obj2).StartCoroutine(inst2.LoadAlbumArt(((object)(PublishedFileId)(ref id)).ToString(), ((Item)(ref 5__5)).Directory)); <>1__state = 8; return true; } case 8: { <>1__state = -1; GameManager obj = 5__2; FileManager inst = FileManager.inst; id = ((Item)(ref 5__5)).Id; <>2__current = ((MonoBehaviour)obj).StartCoroutine(inst.LoadMusic(((object)(PublishedFileId)(ref id)).ToString(), ((Item)(ref 5__5)).Directory)); <>1__state = 9; return true; } case 9: <>1__state = -1; _level = 5__6; SingletonBase.Inst.CurrentArcadeLevel = 5__6; 5__4 = null; 5__5 = default(Item); 5__6 = null; goto IL_0538; case 10: { <>1__state = -1; if (GlobalsManager.IsHosting) { 5__7 = true; if (ulong.TryParse(GlobalsManager.LevelId, out 5__8)) { 5__9 = SteamUGC.QueryFileAsync(PublishedFileId.op_Implicit(5__8)); goto IL_05d6; } goto IL_066c; } if (int.TryParse(((Lobby)(ref SteamLobbyManager.Inst.CurrentLobby)).GetData("seed"), out var result)) { SteamLobbyManager.Inst.RandSeed = result; } RNGSync.Seed = SteamLobbyManager.Inst.RandSeed; ObjectManager.inst.seed = SteamLobbyManager.Inst.RandSeed; goto IL_08a9; } case 11: <>1__state = -1; goto IL_05d6; case 12: <>1__state = -1; if (GlobalsManager.IsChallenge) { CallRpc_Multi_OpenChallenge(); SingletonBase.Inst.LoadSceneGroup("Challenge"); } else { GlobalsManager.Queue.Remove(GlobalsManager.LevelId); if (GlobalsManager.Queue.Count == 0) { SingletonBase.Inst.LoadSceneGroup("Arcade"); SteamManager.Inst.EndServer(); return false; } string text = GlobalsManager.Queue[0]; SingletonBase.Inst.CurrentArcadeLevel = SingletonBase.Inst.GetLocalCustomLevel(text); GlobalsManager.LevelId = text; } SingletonBase.Inst.LoadSceneGroup("Arcade_Level"); return false; case 13: <>1__state = -1; <>2__current = ((MonoBehaviour)5__2).StartCoroutine(5__2.LoadObjects(_level)); <>1__state = 14; return true; case 14: <>1__state = -1; <>2__current = ((MonoBehaviour)5__2).StartCoroutine(5__2.LoadTweens()); <>1__state = 15; return true; case 15: { <>1__state = -1; Comparison comparison = (Checkpoint x, Checkpoint y) => x.time.CompareTo(y.time); DataManager.inst.gameData.beatmapData.checkpoints.Sort(comparison); if (SingletonBase.Inst.players.Count == 0) { SingletonBase.Inst.players.Add(new VGPlayerData { PlayerID = 0, ControllerID = 0 }); } 5__2.PlayGame(); return false; } IL_0665: 5__9 = null; goto IL_066c; IL_066c: if (5__7) { PAM.Logger.LogError((object)"tried playing local or non public level while [Allow hidden levels] is disabled"); GlobalsManager.IsReloadingLobby = true; SteamLobbyManager.Inst.UnloadAll(); SingletonBase.Inst.manager.ClearLoadingTasks(); <>2__current = (object)new WaitForSeconds(1f); <>1__state = 12; return true; } PAM.Logger.LogError((object)Random.seed.ToString()); SteamLobbyManager.Inst.RandSeed = Random.seed; ObjectManager.inst.seed = Random.seed; RNGSync.Seed = SteamLobbyManager.Inst.RandSeed; if (GlobalsManager.IsReloadingLobby) { ((Lobby)(ref SteamLobbyManager.Inst.CurrentLobby)).SetData("LevelId", GlobalsManager.LevelId); ((Lobby)(ref SteamLobbyManager.Inst.CurrentLobby)).SetData("seed", SteamLobbyManager.Inst.RandSeed.ToString()); PaMNetworkManager.CallRpc_Multi_UpdateLobbyState(0); ((Lobby)(ref SteamLobbyManager.Inst.CurrentLobby)).SetData("LobbyState", ((ushort)0).ToString()); if (!GlobalsManager.IsChallenge) { ((Lobby)(ref SteamLobbyManager.Inst.CurrentLobby)).SetData("LevelQueue", JsonConvert.SerializeObject((object)GlobalsManager.GetQueueLevelNames())); } PAM.Logger.LogError((object)SteamLobbyManager.Inst.RandSeed); CallRpc_Multi_NextQueueLevel(5__8, SteamLobbyManager.Inst.RandSeed); } goto IL_08a9; IL_0538: 5__2.LoadMetadata(_level); <>2__current = ((MonoBehaviour)5__2).StartCoroutine(5__2.LoadAudio(_level)); <>1__state = 10; return true; IL_0323: if (!Object.op_Implicit((Object)(object)5__3)) { GlobalsManager.IsDownloading = true; SingletonBase.Inst.manager.AddToLoadingTasks("Downloading Level", Task.Run(async delegate { SimpleCoroutineAwaiter val = IEnumeratorAwaitExtensions.GetAwaiter(new WaitUntil((Func)(() => !GlobalsManager.IsDownloading))); if (!val.IsCompleted) { await val; object obj3 = default(object); val = (SimpleCoroutineAwaiter)obj3; } val.GetResult(); }), (string)null, (string)null, (Func)null); 5__4 = DownloadLevel(); <>2__current = (object)new WaitUntil((Func)(() => !GlobalsManager.IsDownloading)); <>1__state = 7; return true; } _level = 5__3; SingletonBase.Inst.CurrentArcadeLevel = _level; goto IL_0538; IL_08a9: try { 5__2.LoadData(_level); } catch (Exception ex) { PAM.Logger.LogFatal((object)"LEVEL FAILED TO LOAD, going back to menu"); PAM.Logger.LogDebug((object)ex); GlobalsManager.IsReloadingLobby = false; if (!GlobalsManager.IsHosting) { SteamManager.Inst.EndClient(); } SingletonBase.Inst.manager.ClearLoadingTasks(); SingletonBase.Inst.LoadSceneGroup("Menu"); return false; } <>2__current = ((MonoBehaviour)5__2).StartCoroutine(5__2.LoadBackgrounds(_level)); <>1__state = 13; return true; IL_05d6: if (!5__9.IsCompleted) { <>2__current = (object)new WaitForUpdate(); <>1__state = 11; return true; } result2 = 5__9.Result; value = Settings.AllowNonPublicLevels.Value; if (result2.HasValue) { Item value2 = result2.Value; if ((int)((Item)(ref value2)).Result == 1) { value2 = result2.Value; if (((Item)(ref value2)).IsPublic || value) { goto IL_0651; } value2 = result2.Value; if (!((Item)(ref value2)).IsFriendsOnly) { value2 = result2.Value; if (!((Item)(ref value2)).IsPrivate) { goto IL_0651; } } goto IL_0665; } } if (value) { 5__7 = false; } goto IL_0665; IL_02d5: 5__3 = SingletonBase.Inst.GetLocalCustomLevel(GlobalsManager.LevelId); if (!Object.op_Implicit((Object)(object)5__3)) { <>2__current = (object)new WaitForSeconds(1f); <>1__state = 6; return true; } goto IL_0323; IL_0651: 5__7 = false; goto IL_0665; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class d__3 : IEnumerator, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; private UnityWebRequest 5__2; object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public d__3(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { 5__2 = null; <>1__state = -2; } private bool MoveNext() { //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Invalid comparison between Unknown and I4 //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0191: Unknown result type (might be due to invalid IL or missing references) //IL_0193: Unknown result type (might be due to invalid IL or missing references) //IL_016c: Unknown result type (might be due to invalid IL or missing references) //IL_016e: Unknown result type (might be due to invalid IL or missing references) //IL_0175: Unknown result type (might be due to invalid IL or missing references) //IL_0177: Unknown result type (might be due to invalid IL or missing references) switch (<>1__state) { default: return false; case 0: <>1__state = -1; 5__2 = UnityWebRequest.Get("https://raw.githubusercontent.com/aiden-ytarame/PAMultiplayer/master/ColoredNames.json"); <>2__current = 5__2.SendWebRequest(); <>1__state = 1; return true; case 1: { <>1__state = -1; if ((int)5__2.result != 1) { PAM.Logger.LogError((object)"Failed to fetch external data :("); return false; } JSONNode obj = JSON.Parse(5__2.downloadHandler.text); LobbyScreenManager.SpecialColors.Clear(); Enumerator enumerator = obj.GetEnumerator(); Color val = default(Color); Color val2 = default(Color); while (((Enumerator)(ref enumerator)).MoveNext()) { KeyValuePair current = ((Enumerator)(ref enumerator)).Current; if (!ulong.TryParse(current.Key, out var result) || !current.Value.HasKey("color")) { continue; } string text = JSONNode.op_Implicit(current.Value["color"]); string text2 = JSONNode.op_Implicit(current.Value["color2"]); if (!string.IsNullOrEmpty(text) && ColorUtility.TryParseHtmlString("#" + text, ref val)) { PAM.Logger.LogInfo((object)("Loaded custom color for " + current.Value["name"].Value)); if (!string.IsNullOrEmpty(text2) && ColorUtility.TryParseHtmlString("#" + text2, ref val2)) { LobbyScreenManager.SpecialColors.Add(result, (Color[])(object)new Color[2] { val, val2 }); } else { LobbyScreenManager.SpecialColors.Add(result, (Color[])(object)new Color[1] { val }); } } } GlobalsManager.HasLoadedExternalInfo = 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(); } } [CompilerGenerated] private sealed class d__14 : IEnumerator, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public d__14(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; SingletonBase.Inst.manager.ClearLoadingTasks(); <>2__current = (object)new WaitForSeconds(1f); <>1__state = 1; return true; case 1: { <>1__state = -1; VGLevel localCustomLevel = SingletonBase.Inst.GetLocalCustomLevel(GlobalsManager.LevelId); if (Object.op_Implicit((Object)(object)localCustomLevel)) { SingletonBase.Inst.CurrentArcadeLevel = localCustomLevel; SingletonBase.Inst.LoadSceneGroup("Arcade_Level"); return false; } GlobalsManager.IsDownloading = true; PAM.Logger.LogError((object)"You did not have the lobby's level downloaded!, Downloading Level..."); SingletonBase.Inst.LoadSceneGroup("Arcade_Level"); 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 bool paused; [HarmonyPatch("Start")] [HarmonyPrefix] private static void PreStart(GameManager __instance) { if (Object.op_Implicit((Object)(object)SingletonBase.Inst)) { __instance.IsArcade = SingletonBase.Inst.IsArcade; } else { __instance.IsArcade = true; } } [HarmonyPatch("Start")] [HarmonyPostfix] private static void PostStart(ref GameManager __instance) { //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Expected O, but got Unknown //IL_011c: Unknown result type (might be due to invalid IL or missing references) //IL_0121: Unknown result type (might be due to invalid IL or missing references) //IL_0127: Expected O, but got Unknown //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Expected O, but got Unknown if (!__instance.IsArcade) { return; } Transform val = ((Component)SingletonBase.Inst).transform.Find("Pause Menu"); Transform val2 = val.Find("Restart"); Transform val3 = val.Find("Skip Queue Level"); if (!Object.op_Implicit((Object)(object)val3)) { val3 = Object.Instantiate(val2, val); ((Object)val3).name = "Skip Queue Level"; val3.SetSiblingIndex(2); SingletonBase.Inst.RefreshTextCache(((Component)val3.Find("Title Wrapper/Title")).GetComponent(), "Skip Level"); SingletonBase.Inst.RefreshTextCache(((Component)val3.Find("Content/Text")).GetComponent(), "Skips the current level in queue"); ((SerializableDictionary)(object)SingletonBase.Inst.PauseMenu.AllViews)["main"].Elements.Add((UIElement)(object)((Component)val3).GetComponent()); ButtonClickedEvent onClick = ((Button)((Component)val2).GetComponent()).onClick; object obj = <>c.<>9__1_0; if (obj == null) { UnityAction val4 = delegate { GlobalsManager.IsReloadingLobby = true; }; <>c.<>9__1_0 = val4; obj = (object)val4; } ((UnityEvent)onClick).AddListener((UnityAction)obj); } MultiElementButton component = ((Component)val3).GetComponent(); ((Button)component).onClick = new ButtonClickedEvent(); ButtonClickedEvent onClick2 = ((Button)component).onClick; object obj2 = <>c.<>9__1_1; if (obj2 == null) { UnityAction val5 = delegate { SingletonBase.Inst.CloseUI(); GlobalsManager.IsReloadingLobby = true; if (GlobalsManager.IsMultiplayer) { SteamLobbyManager.Inst.UnloadAll(); } if (GlobalsManager.IsChallenge) { if (GlobalsManager.IsMultiplayer && GlobalsManager.IsHosting) { CallRpc_Multi_OpenChallenge(); } SingletonBase.Inst.LoadSceneGroup("Challenge"); } else { string text = GlobalsManager.Queue[0]; SingletonBase.Inst.CurrentArcadeLevel = SingletonBase.Inst.GetLocalCustomLevel(text); GlobalsManager.LevelId = text; SingletonBase.Inst.LoadSceneGroup("Arcade_Level"); PAM.Logger.LogInfo((object)"Skipping to next level in queue!"); } }; <>c.<>9__1_1 = val5; obj2 = (object)val5; } ((UnityEvent)onClick2).AddListener((UnityAction)obj2); DirectedNavigation component2 = ((Component)val3).GetComponent(); if (Object.op_Implicit((Object)(object)component2)) { component2.ConfigUp.Type = (Value)1; } ((Component)val3).gameObject.SetActive(GlobalsManager.Queue.Count >= 2 || GlobalsManager.IsChallenge); ((Component)__instance).gameObject.AddComponent(); if (!GlobalsManager.IsMultiplayer) { ((Component)val2).gameObject.SetActive(true); return; } ((Component)val2).gameObject.SetActive(false); GlobalsManager.HitsQueue.Clear(); ((Component)__instance).gameObject.AddComponent(); ((MonoBehaviour)__instance).StartCoroutine(FetchExternalData()); if (GlobalsManager.IsHosting) { SingletonBase.Inst.manager.AddToLoadingTasks("Creating Lobby", Task.Run(async delegate { while (!SteamLobbyManager.Inst.InLobby) { await Task.Delay(100); } }), (string)null, (string)null, (Func)null); return; } SingletonBase.Inst.manager.AddToLoadingTasks("Connecting to Server", Task.Run(async delegate { while (true) { if (PaMNetworkManager.PamInstance != null) { NetworkManager instance = NetworkManager.Instance; if (instance == null || instance.TransportActive) { break; } } await Task.Delay(100); } }), (string)null, (string)null, (Func)null); SingletonBase.Inst.manager.AddToLoadingTasks("Server Info", Task.Run(async delegate { while (!GlobalsManager.HasLoadedAllInfo) { await Task.Delay(100); } }), (string)null, (string)null, (Func)null); ((Component)val3).gameObject.SetActive(false); } [HarmonyPatch("OnDestroy")] [HarmonyPostfix] private static void PostDestroy() { GlobalsManager.HitsQueue.Clear(); for (int i = 0; i < SingletonBase.Inst.CameraParentedRoot.childCount; i++) { Object.Destroy((Object)(object)((Component)SingletonBase.Inst.CameraParentedRoot.GetChild(i)).gameObject); } if (!GlobalsManager.IsReloadingLobby) { GlobalsManager.IsChallenge = false; GlobalsManager.IsMultiplayer = false; } } [IteratorStateMachine(typeof(d__3))] private static IEnumerator FetchExternalData() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__3(0); } [HarmonyPatch("Pause")] [HarmonyPrefix] private static bool PrePause(ref GameManager __instance, bool _showUI) { if (!GlobalsManager.IsMultiplayer) { return true; } if (!GlobalsManager.HasStarted) { return true; } if (paused) { __instance.UnPause(); paused = false; return false; } __instance.Paused = false; paused = true; return false; } [HarmonyPatch("UnPause")] [HarmonyPostfix] private static void PostUnPause() { if (GlobalsManager.IsMultiplayer) { paused = false; } } [HarmonyPatch("OnDestroy")] [HarmonyPostfix] private static void PostOnDestroy() { if (MultiplayerDiscordManager.IsInitialized) { MultiplayerDiscordManager.Instance.SetMenuPresence(); } } [HarmonyPatch("PlayGame")] [HarmonyPostfix] private static void PostPlay(GameManager __instance) { //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_015c: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Unknown result type (might be due to invalid IL or missing references) //IL_0168: Unknown result type (might be due to invalid IL or missing references) //IL_0170: Expected O, but got Unknown //IL_0185: Unknown result type (might be due to invalid IL or missing references) GlobalsManager.IsReloadingLobby = false; GlobalsManager.Queue.Remove(GlobalsManager.LevelId); if (!GlobalsManager.IsMultiplayer) { if (MultiplayerDiscordManager.IsInitialized) { if (SingletonBase.Inst.IsEditor) { MultiplayerDiscordManager.Instance.SetLevelPresence("Editing " + SingletonBase.Inst.TrackName, "", "palogo"); } else if (!__instance.IsArcade) { MultiplayerDiscordManager.Instance.SetLevelPresence("Playing Story Mode!", SingletonBase.Inst.TrackName + " by " + SingletonBase.Inst.ArtistName, "palogo"); } else { setupLevelPresence("Playing Singleplayer!"); } } return; } if (GlobalsManager.LobbyState != SteamLobbyManager.LobbyState.Playing) { __instance.Pause(false); __instance.Paused = true; ((Component)__instance).gameObject.AddComponent(); } else { __instance.Pause(false); __instance.Paused = true; GlobalsManager.HasStarted = true; } EventManager.inst.HasJiggle = false; foreach (VGPlayerData player in SingletonBase.Inst.players) { VGPlayer playerObject = player.PlayerObject; if (playerObject != null) { playerObject.PlayerDeath(0f); } } SingletonBase.Inst.players.Clear(); if (GlobalsManager.IsHosting) { if (!GlobalsManager.Players.ContainsKey(SteamId.op_Implicit(GlobalsManager.LocalPlayerId))) { VGPlayerData val = new VGPlayerData { PlayerID = 0, ControllerID = 0 }; SingletonBase.Inst.players.Add(val); GlobalsManager.Players.TryAdd(SteamId.op_Implicit(GlobalsManager.LocalPlayerId), new PlayerData(val, SteamClient.Name)); } else { foreach (KeyValuePair player2 in GlobalsManager.Players) { SingletonBase.Inst.players.Add(player2.Value.VGPlayerData); } } ((Lobby)(ref SteamLobbyManager.Inst.CurrentLobby)).SetMemberData("IsLoaded", "1"); } else { if (NetworkManager.Instance == null) { SingletonBase.Inst.manager.ClearLoadingTasks(); SingletonBase.Inst.LoadSceneGroup("Menu"); return; } ((Lobby)(ref SteamLobbyManager.Inst.CurrentLobby)).SetMemberData("IsLoaded", "1"); foreach (KeyValuePair player3 in GlobalsManager.Players) { SingletonBase.Inst.players.Add(player3.Value.VGPlayerData); } if (GlobalsManager.LobbyState != SteamLobbyManager.LobbyState.Playing) { GlobalsManager.HasLoadedMidLobbyInfo = true; SingletonBase.Inst.RespawnPlayers(); } else { CallRpc_Server_RequestLobbyState(); } } if (MultiplayerDiscordManager.IsInitialized) { setupLevelPresence("Playing Multiplayer!"); } static async void setupLevelPresence(string state) { if (Object.op_Implicit((Object)(object)SingletonBase.Inst.CurrentArcadeLevel)) { Item? val2; Item value; if (SingletonBase.Inst.CurrentArcadeLevel.SteamInfo != null) { val2 = await SteamUGC.QueryFileAsync(SingletonBase.Inst.CurrentArcadeLevel.SteamInfo.ItemID); } else { value = default(Item); val2 = value; } Item? val3 = val2; string levelCoverUrl = "null_level"; if (val3.HasValue) { value = val3.Value; if ((int)((Item)(ref value)).Result == 1) { value = val3.Value; levelCoverUrl = ((Item)(ref value)).PreviewImageUrl; } } MultiplayerDiscordManager.Instance.SetLevelPresence(state, SingletonBase.Inst.TrackName + " by " + SingletonBase.Inst.ArtistName, levelCoverUrl); } } } [ServerRpc(/*Could not decode attribute arguments.*/)] private static async void Server_RequestLobbyState(ClientNetworkConnection conn) { try { LevelEndScreen endScreen = Object.FindFirstObjectByType(); if (!Object.op_Implicit((Object)(object)endScreen)) { return; } while ((int)SingletonBase.Inst.CurGameState == 2) { await Task.Delay(200); } List list = new List(); List list2 = new List(); foreach (KeyValuePair player in GlobalsManager.Players) { list.Add(player.Key); if (Object.op_Implicit((Object)(object)player.Value.VGPlayerData.PlayerObject)) { list2.Add((short)player.Value.VGPlayerData.PlayerObject.Health); } else { list2.Add(0); } } CallRpc_Client_LobbyState(conn, endScreen.Hits.Count, SingletonBase.Inst.CurrentSongTime, list, list2.ToArray()); if (conn.TryGetSteamId(out var steamId)) { CallRpc_Multi_LatePlayerJoin(steamId); } } catch (Exception ex) { PAM.Logger.LogError((object)ex); } } [ClientRpc(/*Could not decode attribute arguments.*/)] private static void Client_LobbyState(int hitCount, float currentTime, List playerIds, Span healths) { //IL_0002: 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_000f: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) ActionMoment item = default(ActionMoment); item.position = Vector3.zero; item.time = currentTime; LevelEndScreen instance = LevelEndScreenPatch.Instance; if (!Object.op_Implicit((Object)(object)instance)) { return; } if (instance.Hits != null) { for (int i = 0; i < hitCount; i++) { instance.Hits.Add(item); } } if (GlobalsManager.HasLoadedMidLobbyInfo) { return; } GlobalsManager.HasLoadedMidLobbyInfo = true; if (!Object.op_Implicit((Object)(object)SingletonBase.Inst)) { PAM.Logger.LogError((object)"GameManager is null"); return; } SingletonBase.Inst.UnPause(); if (DataManager.inst.gameData.beatmapData.checkpoints.Count > 0) { int num = -1; for (int j = 0; j < DataManager.inst.gameData.beatmapData.checkpoints.Count; j++) { if (j > SingletonBase.Inst.currentCheckpointIndex && !(DataManager.inst.gameData.beatmapData.checkpoints[j].time > currentTime)) { num = j; } } if (num != -1) { SingletonBase.Inst.currentCheckpointIndex = num; } } SingletonBase.Inst.CurrentAudioSource.time = currentTime; SingletonBase.inst.RespawnPlayers(); for (int k = 0; k < playerIds.Count; k++) { ulong key = playerIds[k]; short num2 = healths[k]; if (GlobalsManager.Players.TryGetValue(key, out var value) && value.VGPlayerData.PlayerObject.IsValidPlayer()) { value.VGPlayerData.PlayerObject.Health = num2; if (num2 <= 0) { Object.Destroy((Object)(object)value.VGPlayerData.PlayerObject); } } } } [MultiRpc(/*Could not decode attribute arguments.*/)] private static void Multi_LatePlayerJoin(SteamId playerId) { //IL_000f: 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) if (!SingletonBase.Inst.players.Contains(GlobalsManager.Players[SteamId.op_Implicit(playerId)].VGPlayerData)) { SingletonBase.Inst.players.Add(GlobalsManager.Players[SteamId.op_Implicit(playerId)].VGPlayerData); } } [IteratorStateMachine(typeof(d__12))] private static IEnumerator CustomLoadGame(VGLevel _level) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__12(0) { _level = _level }; } [MultiRpc(/*Could not decode attribute arguments.*/)] private static void Multi_NextQueueLevel(ulong levelID, int seed) { if (!GlobalsManager.IsHosting) { PAM.Logger.LogInfo((object)$"New random seed : {seed}"); GlobalsManager.LevelId = levelID.ToString(); SteamLobbyManager.Inst.RandSeed = seed; GlobalsManager.IsReloadingLobby = true; GlobalsManager.LobbyState = SteamLobbyManager.LobbyState.Lobby; GlobalsManager.HasLoadedMidLobbyInfo = true; ((MonoBehaviour)DataManager.inst).StartCoroutine(NextQueueLevelIEnu(levelID, seed)); } } [IteratorStateMachine(typeof(d__14))] private static IEnumerator NextQueueLevelIEnu(ulong levelID, int seed) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__14(0); } [MultiRpc(/*Could not decode attribute arguments.*/)] public static void Multi_OpenChallenge() { if (!GlobalsManager.IsHosting) { ((Lobby)(ref SteamLobbyManager.Inst.CurrentLobby)).SetMemberData("IsLoaded", "0"); GlobalsManager.IsReloadingLobby = true; GlobalsManager.HasLoadedMidLobbyInfo = true; SingletonBase.Inst.manager.ClearLoadingTasks(); SingletonBase.Inst.LoadSceneGroup("Challenge"); } } private static void InitSteamInfo(ref VGLevel _level, PublishedFileId _id, string _folder, Item _item) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: 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_0029: Expected O, but got Unknown //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0054: 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_005f: Expected O, but got Unknown if (!string.IsNullOrEmpty(_folder)) { LevelDataBase val = new LevelDataBase { LevelID = ((object)(PublishedFileId)(ref _id)).ToString(), LocalFolder = _folder }; ((Object)_level).name = _id.Value.ToString(); _level.LevelData = val; _level.BaseLevelData = val; _level.SteamInfo = new SteamData { ItemID = _id }; } } private static async Task DownloadLevel() { if (!ulong.TryParse(GlobalsManager.LevelId, out var result)) { FailLoad("Invalid level ID to download"); return default(Item); } Item? val = await SteamUGC.QueryFileAsync(PublishedFileId.op_Implicit(result)); if (!val.HasValue) { FailLoad("Level not found, is it deleted from the workshop?"); return default(Item); } Item level = val.Value; if (AppId.op_Implicit(((Item)(ref level)).ConsumerApp) != 440310) { FailLoad("Workshop item is not from PA"); return default(Item); } ManualLogSource logger = PAM.Logger; string[] obj = new string[5] { "Downloading [", ((Item)(ref level)).Title, "] created by [", null, null }; Friend owner = ((Item)(ref level)).Owner; obj[3] = ((Friend)(ref owner)).Name; obj[4] = "]"; logger.LogInfo((object)string.Concat(obj)); if (string.IsNullOrEmpty(((Item)(ref level)).Directory)) { await ((Item)(ref level)).Subscribe(); for (int i = 0; i < 3; i++) { if (await ((Item)(ref level)).DownloadAsync((Action)null, 60, default(CancellationToken))) { break; } PAM.Logger.LogWarning((object)$"Failed to to download level, retrying.. [{i + 1}/3]"); await Task.Delay(1000); } } if (!((Item)(ref level)).IsInstalled) { FailLoad("Failed to download level"); return default(Item); } GlobalsManager.IsDownloading = false; return level; static void FailLoad(string errorMessage) { PAM.Logger.LogError((object)errorMessage); ErrorScreen.CreateErrorScreen("Failed to download the lobby's level, reason:\n\n" + errorMessage); GlobalsManager.IsDownloading = false; SingletonBase.Inst.manager.ClearLoadingTasks(); SingletonBase.Inst.LoadSceneGroup("Menu"); } } [HarmonyPrefix] [HarmonyPatch("LoadGame")] public static bool OverrideLoadGame(ref IEnumerator __result) { if (GlobalsManager.IsMultiplayer && !SingletonBase.Inst.IsArcade) { ErrorScreen.CreateErrorScreen("Tried to create a lobby outside of arcade. how did this happen?\n\nTry again, if issue persists report the issue."); return true; } if (!SingletonBase.Inst.IsArcade || !GlobalsManager.IsMultiplayer) { return true; } __result = CustomLoadGame(SingletonBase.Inst.CurrentArcadeLevel); return false; } private static void CallRpc_Server_RequestLobbyState() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown if (NetworkManager.Instance == null) { return; } if (NetworkManager.Instance.PeerServer) { Server_RequestLobbyState(NetworkManager.Instance.ServerSelfPeerConnection); return; } NetworkWriter val = new NetworkWriter(); try { NetWriterExtensions.Write(val, (ushort)34247); NetworkManager.Instance.SendToServer(val.GetData(), (SendType)0); } finally { ((IDisposable)val)?.Dispose(); } } public static void Deserialize_Server_RequestLobbyState_34247(ClientNetworkConnection senderConn, NetworkReader reader) { Server_RequestLobbyState(senderConn); } private static void CallRpc_Client_LobbyState(ClientNetworkConnection target, int hitCount, float currentTime, List playerIds, Span healths) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Expected O, but got Unknown if (NetworkManager.Instance == null) { return; } if (NetworkManager.Instance.PeerServer && target == NetworkManager.Instance.ServerSelfPeerConnection) { Client_LobbyState(hitCount, currentTime, playerIds, healths); return; } NetworkWriter val = new NetworkWriter(); try { NetWriterExtensions.Write(val, (ushort)11993); NetWriterExtensions.Write(val, hitCount); NetWriterExtensions.Write(val, currentTime); val.WriteUlongs(playerIds); val.WriteSongData(healths); NetworkManager.Instance.SendToClient(target, val.GetData(), (SendType)0); } finally { ((IDisposable)val)?.Dispose(); } } public static void Deserialize_Client_LobbyState_11993(ClientNetworkConnection senderConn, NetworkReader reader) { Client_LobbyState(NetReaderExtensions.ReadInt32(reader), NetReaderExtensions.ReadSingle(reader), reader.ReadUlongs(), reader.ReadSongData()); } private static void CallRpc_Multi_LatePlayerJoin(SteamId playerId) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) if (NetworkManager.Instance == null) { return; } if (NetworkManager.Instance.PeerServer) { Multi_LatePlayerJoin(playerId); } NetworkWriter val = new NetworkWriter(); try { NetWriterExtensions.Write(val, (ushort)10245); val.WriteSteamId(playerId); NetworkManager.Instance.SendToAllClients(val.GetData(), (SendType)0); } finally { ((IDisposable)val)?.Dispose(); } } public static void Deserialize_Multi_LatePlayerJoin_10245(ClientNetworkConnection senderConn, NetworkReader reader) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) Multi_LatePlayerJoin(reader.ReadSteamId()); } private static void CallRpc_Multi_NextQueueLevel(ulong levelID, int seed) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown if (NetworkManager.Instance == null) { return; } if (NetworkManager.Instance.PeerServer) { Multi_NextQueueLevel(levelID, seed); } NetworkWriter val = new NetworkWriter(); try { NetWriterExtensions.Write(val, (ushort)62198); NetWriterExtensions.Write(val, levelID); NetWriterExtensions.Write(val, seed); NetworkManager.Instance.SendToAllClients(val.GetData(), (SendType)0); } finally { ((IDisposable)val)?.Dispose(); } } public static void Deserialize_Multi_NextQueueLevel_62198(ClientNetworkConnection senderConn, NetworkReader reader) { Multi_NextQueueLevel(NetReaderExtensions.ReadUInt64(reader), NetReaderExtensions.ReadInt32(reader)); } public static void CallRpc_Multi_OpenChallenge() { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Expected O, but got Unknown if (NetworkManager.Instance == null) { return; } if (NetworkManager.Instance.PeerServer) { Multi_OpenChallenge(); } NetworkWriter val = new NetworkWriter(); try { NetWriterExtensions.Write(val, (ushort)65142); NetworkManager.Instance.SendToAllClients(val.GetData(), (SendType)0); } finally { ((IDisposable)val)?.Dispose(); } } public static void Deserialize_Multi_OpenChallenge_65142(ClientNetworkConnection senderConn, NetworkReader reader) { Multi_OpenChallenge(); } } [HarmonyPatch(typeof(ObjectManager))] public static class RNGSync { public static int Seed; [HarmonyPatch("CreateObjectData")] [HarmonyPostfix] public static void PostCreateData(int _i, ref GameObjectRef __result) { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) if (GlobalsManager.IsMultiplayer) { Random.InitState(Seed); __result.sequence.randomState = Random.state; Seed = Random.RandomRangeInt(int.MinValue, int.MaxValue); } } } [HarmonyPatch] public static class LoadPatches { private static bool StableSortSequencedObjs(List list) { if (list.Count < 200) { return true; } ABSSequentiable[] collection = list.OrderBy((ABSSequentiable x) => x.sequencedPosition).ToArray(); list.Clear(); list.AddRange(collection); return false; } } [HarmonyPatch(typeof(VGPlayer))] public class Player_Patch { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static CloseCallDelegate <>9__14_0; public static HitDelegate <>9__14_1; public static DeathDelegate <>9__14_2; internal void b__14_0(Vector3 _) { PointsManager.Inst.AddCloseCall(); } internal void b__14_1(int _, Vector3 _) { PointsManager.Inst.AddHit(); } internal void b__14_2(Vector3 _) { PointsManager.Inst.AddDeath(); } } public static bool IsDamageAll; public static Mesh CircleMesh; public static Mesh ArrowMesh; public static Mesh TriangleMesh; private static float _holdingBoost; private static bool _revertMoveX; private static bool _revertMoveY; private static bool _revertBoost; [HarmonyPatch("CheckForObjectCollision")] [HarmonyPrefix] private static bool PreCollision(VGPlayer __instance, Collider2D _other, ref bool __result) { if (!GlobalsManager.IsMultiplayer) { return true; } if (!__instance.IsLocalPlayer()) { __result = false; return false; } return true; } [HarmonyPatch("PlayerHit")] [HarmonyPrefix] private static bool Hit_Pre(ref VGPlayer __instance) { //IL_01df: Unknown result type (might be due to invalid IL or missing references) //IL_01b9: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) if (!SingletonBase.Inst.IsArcade || SingletonBase.Inst.IsEditor) { return true; } if (SingletonBase.Inst.Paused) { return false; } if (DataManager.inst.GetSettingEnum("ArcadeHealthMod", 0) == 1) { return false; } VGPlayer val = __instance; bool flag = !GlobalsManager.IsMultiplayer || val.IsLocalPlayer(); if (flag) { bool settingBool = DataManager.inst.GetSettingBool("mp_linkedHealth", false); if (GlobalsManager.IsMultiplayer) { if (GlobalsManager.IsHosting) { if (settingBool) { if (!IsDamageAll) { CallRpc_Multi_DamageAll(val.Health, SingletonBase.Inst.currentCheckpointIndex, GlobalsManager.LocalPlayerId); return false; } } else { CallRpc_Multi_PlayerDamaged(GlobalsManager.LocalPlayerId, val.Health, SingletonBase.Inst.currentCheckpointIndex); } } else if (!settingBool || !IsDamageAll) { CallRpc_Server_PlayerDamaged(val.Health, SingletonBase.Inst.currentCheckpointIndex, SingletonBase.Inst.CurrentSongTime); } IsDamageAll = false; val.Health--; } else { val.Health--; if (settingBool) { foreach (VGPlayerData player in SingletonBase.Inst.players) { if (player.PlayerObject.IsValidPlayer() && (Object)(object)player.PlayerObject != (Object)(object)__instance && player.PlayerObject.Health > val.Health) { player.PlayerObject.PlayerHit(); } } } } } else { val.Health--; } ((MonoBehaviour)val).StopCoroutine("RegisterCloseCall"); if (EventHelper.GetDeathEvent(val) != null && val.Health <= 0) { EventHelper.GetDeathEvent(val).Invoke(val.Player_Wrapper.position); } else if (EventHelper.GetHitEvent(val) != null) { EventHelper.GetHitEvent(val).Invoke(val.Health, val.Player_Wrapper.position); } if (val.Health > 0) { val.StartHurtDecay(); int value = Settings.WarpSfx.Value; if (value == 0 || (value == 1 && val.IsLocalPlayer())) { SingletonBase.Inst.ApplyLowPass(0.05f, 0.8f, 1.5f); SingletonBase.Inst.ApplyLowPassResonance(0f, 0.6f, 0.2f); } int value2 = Settings.HitSfx.Value; if (value2 == 0 || (value2 == 1 && val.IsLocalPlayer())) { SingletonBase.Inst.PlaySound("Player_Hurt", 0.6f); } if (flag) { val.PlayerHitAnimation(); } else { val.PlayParticles((ParticleTypes)2); } } else { val.PlayerDeath(0.2f); if (flag) { val.PlayerDeathAnimation(); } else { val.PlayParticles((ParticleTypes)3); } } return false; } [ServerRpc(/*Could not decode attribute arguments.*/)] private static void Server_PlayerDamaged(ClientNetworkConnection conn, int healthPreHit, int checkpointIndex, float time) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Invalid comparison between Unknown and I4 //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)SingletonBase.Inst) || SingletonBase.Inst.currentCheckpointIndex < checkpointIndex || (int)SingletonBase.Inst.CurGameState != 1 || SingletonBase.inst.CurrentSongTime < time || !conn.TryGetSteamId(out var steamId)) { return; } if (DataManager.inst.GetSettingBool("mp_linkedHealth", false)) { if (GlobalsManager.LocalPlayerObj.Health >= healthPreHit) { CallRpc_Multi_DamageAll(healthPreHit, checkpointIndex, steamId); } } else { CallRpc_Multi_PlayerDamaged(steamId, healthPreHit, checkpointIndex); } } [MultiRpc(/*Could not decode attribute arguments.*/)] public static void Multi_PlayerDamaged(SteamId steamID, int healthPreHit, int checkpointIndex) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Invalid comparison between Unknown and I4 //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Unknown result type (might be due to invalid IL or missing references) if (healthPreHit == 1) { PointsManager.Inst?.PlayerHasDied(SteamId.op_Implicit(steamID)); } if (steamID.IsLocalPlayer() || !Object.op_Implicit((Object)(object)SingletonBase.Inst)) { return; } PlayerData value; if (checkpointIndex < SingletonBase.Inst.currentCheckpointIndex) { if (Object.op_Implicit((Object)(object)LevelEndScreenPatch.Instance)) { LevelEndScreenPatch.Instance.OnHit(--healthPreHit, Vector3.zero); } } else if (checkpointIndex > SingletonBase.Inst.currentCheckpointIndex || (int)SingletonBase.Inst.CurGameState == 2) { GlobalsManager.HitsQueue.Add(new HitInfo(SteamId.op_Implicit(steamID), healthPreHit, checkpointIndex)); } else if (GlobalsManager.Players.TryGetValue(SteamId.op_Implicit(steamID), out value)) { if (value.VGPlayerData.PlayerObject.IsValidPlayer()) { value.VGPlayerData.PlayerObject.Health = healthPreHit; value.VGPlayerData.PlayerObject.PlayerHit(); } } else if (Object.op_Implicit((Object)(object)LevelEndScreenPatch.Instance)) { LevelEndScreenPatch.Instance.OnHit(--healthPreHit, Vector3.zero); } } [MultiRpc(/*Could not decode attribute arguments.*/)] private static void Multi_DamageAll(int healthPreHit, int checkpointIndex, SteamId playerHit) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) DamageAll(healthPreHit, checkpointIndex, SteamId.op_Implicit(playerHit)); } public static void DamageAll(int healthPreHit, int checkpointIndex, ulong hitPlayerId) { if (!Object.op_Implicit((Object)(object)SingletonBase.Inst)) { return; } if (checkpointIndex > SingletonBase.Inst.currentCheckpointIndex) { GlobalsManager.HitsQueue.Add(new HitInfo(hitPlayerId, healthPreHit, checkpointIndex, all: true)); return; } if (Settings.Linked.Value && GlobalsManager.Players.TryGetValue(hitPlayerId, out var value)) { string playerColorHex = SingletonBase.Inst.GetPlayerColorHex(value.VGPlayerData.PlayerID); SingletonBase.Inst.DisplayNotification("Nano [" + value.Name + "] got hit!", 1f); } foreach (KeyValuePair player in GlobalsManager.Players) { VGPlayer playerObject = player.Value.VGPlayerData.PlayerObject; if (!playerObject.IsValidPlayer()) { continue; } if (playerObject.Health < healthPreHit) { PAM.Logger.LogWarning((object)"Old message"); continue; } if (playerObject.IsLocalPlayer()) { IsDamageAll = true; } playerObject.Health = healthPreHit; playerObject.PlayerHit(); } } [HarmonyPatch("HandleBoost")] [HarmonyPrefix] private static bool Boost_Pre(ref VGPlayer __instance) { if (!GlobalsManager.IsMultiplayer) { return true; } return __instance.IsLocalPlayer(); } [HarmonyPatch("PlayParticles")] [HarmonyPrefix] private static bool BoostParticle_Post(ref VGPlayer __instance, ParticleTypes _type) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0018: 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_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Expected I4, but got Unknown //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_0134: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Unknown result type (might be due to invalid IL or missing references) //IL_0141: 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_014b: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Unknown result type (might be due to invalid IL or missing references) //IL_016a: Unknown result type (might be due to invalid IL or missing references) //IL_016f: Unknown result type (might be due to invalid IL or missing references) //IL_0177: Unknown result type (might be due to invalid IL or missing references) //IL_017c: Unknown result type (might be due to invalid IL or missing references) //IL_0181: Unknown result type (might be due to invalid IL or missing references) //IL_0186: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_0109: 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_011a: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) ParticleSystem val = null; Quaternion rotation = __instance.Player_Wrapper.rotation; Quaternion val2 = Quaternion.Euler(0f, 0f, ((Quaternion)(ref rotation)).eulerAngles.z - 90f); BeatmapTheme val3 = (Object.op_Implicit((Object)(object)SingletonBase.Inst) ? SingletonBase.Inst.LiveTheme : ChallengeManager.Inst.ChallengeTheme); switch ((int)_type) { case 0: { val = Object.Instantiate(__instance.PS_Spawn, __instance.Player_Wrapper.position, val2); MainModule main4 = val.main; ((MainModule)(ref main4)).startColor = new MinMaxGradient(val3.GetPlayerColor(__instance.PlayerID)); break; } case 1: { if (GlobalsManager.IsMultiplayer && __instance.IsLocalPlayer()) { if (GlobalsManager.IsHosting) { CallRpc_Multi_PlayerBoost(GlobalsManager.LocalPlayerId); } else { CallRpc_Server_PlayerBoost(); } } val = Object.Instantiate(__instance.PS_Boost, __instance.Player_Wrapper.position, val2); ((Component)val).transform.SetParent(__instance.Player_Wrapper); MainModule main3 = val.main; ((MainModule)(ref main3)).startColor = new MinMaxGradient(val3.GetPlayerColor(__instance.PlayerID)); break; } case 2: { val = Object.Instantiate(__instance.PS_Hit, __instance.Player_Wrapper.position, val2); MainModule main2 = val.main; ((MainModule)(ref main2)).startColor = new MinMaxGradient(val3.guiAccent); break; } case 3: { val = Object.Instantiate(__instance.PS_Die, __instance.Player_Wrapper.position, val2); MainModule main = val.main; ((MainModule)(ref main)).startColor = new MinMaxGradient(val3.guiAccent); break; } } if (Object.op_Implicit((Object)(object)val)) { val.Play(); ((MonoBehaviour)SystemManager.inst).StartCoroutine(__instance.KillParticleSystem(val)); } return false; } [ServerRpc(/*Could not decode attribute arguments.*/)] public static void Server_PlayerBoost(ClientNetworkConnection conn) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) if (conn.TryGetSteamId(out var steamId)) { if (GlobalsManager.Players.TryGetValue(SteamId.op_Implicit(steamId), out var value) && value.VGPlayerData.PlayerObject.IsValidPlayer()) { value.VGPlayerData.PlayerObject.PlayParticles((ParticleTypes)1); } CallRpc_Multi_PlayerBoost(steamId); } } [MultiRpc(/*Could not decode attribute arguments.*/)] public static void Multi_PlayerBoost(SteamId steamID) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) if (!steamID.IsLocalPlayer() && GlobalsManager.Players.TryGetValue(SteamId.op_Implicit(steamID), out var value) && value.VGPlayerData.PlayerObject.IsValidPlayer()) { value.VGPlayerData.PlayerObject.PlayParticles((ParticleTypes)1); } } [HarmonyPatch("Init", new Type[] { })] [HarmonyPostfix] private static void PostSpawn(ref VGPlayer __instance) { //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Expected O, but got Unknown //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) //IL_006e: Expected O, but got Unknown //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Expected O, but got Unknown //IL_017f: Unknown result type (might be due to invalid IL or missing references) //IL_018c: Unknown result type (might be due to invalid IL or missing references) //IL_0198: Unknown result type (might be due to invalid IL or missing references) //IL_01d9: Unknown result type (might be due to invalid IL or missing references) //IL_01e6: Unknown result type (might be due to invalid IL or missing references) //IL_01f2: Unknown result type (might be due to invalid IL or missing references) Player rPlayer = __instance.RPlayer; if (rPlayer != null && rPlayer.id == 0 && Object.op_Implicit((Object)(object)PointsManager.Inst)) { VGPlayer obj = __instance; object obj2 = <>c.<>9__14_0; if (obj2 == null) { CloseCallDelegate val = delegate { PointsManager.Inst.AddCloseCall(); }; <>c.<>9__14_0 = val; obj2 = (object)val; } obj.CloseCallEvent += (CloseCallDelegate)obj2; VGPlayer obj3 = __instance; object obj4 = <>c.<>9__14_1; if (obj4 == null) { HitDelegate val2 = delegate { PointsManager.Inst.AddHit(); }; <>c.<>9__14_1 = val2; obj4 = (object)val2; } obj3.HitEvent += (HitDelegate)obj4; VGPlayer obj5 = __instance; object obj6 = <>c.<>9__14_2; if (obj6 == null) { DeathDelegate val3 = delegate { PointsManager.Inst.AddDeath(); }; <>c.<>9__14_2 = val3; obj6 = (object)val3; } obj5.DeathEvent += (DeathDelegate)obj6; _holdingBoost = 0f; } if (!GlobalsManager.IsMultiplayer) { return; } if (!__instance.IsLocalPlayer()) { __instance.Player_Rigidbody.simulated = false; if (Settings.Transparent.Value) { foreach (PlayerTrailReference item in __instance.Player_Trail.Trail) { ((Renderer)item.Render_Trail).enabled = false; } } } if ((Object)(object)CircleMesh == (Object)null) { GetMeshes(); } int playerID = __instance.PlayerID; if (playerID < 8) { if (playerID >= 4) { SetPlayerMesh(__instance, CircleMesh); } } else if (playerID < 12) { SetPlayerMesh(__instance, TriangleMesh); Vector3 val4 = default(Vector3); ((Vector3)(ref val4))..ctor(0f, 0f, -90f); Transform obj7 = ((Component)__instance).transform.Find("Player"); obj7.GetChild(0).Rotate(val4); obj7.GetChild(1).Rotate(val4); obj7.GetChild(3).Rotate(val4); } else { SetPlayerMesh(__instance, ArrowMesh); Transform obj8 = ((Component)__instance).transform.Find("Player"); Vector3 localScale = default(Vector3); ((Vector3)(ref localScale))..ctor(2f, 2f, 1f); obj8.GetChild(0).localScale = localScale; obj8.GetChild(1).localScale = localScale; obj8.GetChild(3).localScale = localScale; } static void SetPlayerMesh(VGPlayer player, Mesh mesh) { try { Transform obj9 = ((Component)player).transform.Find("Player"); ((Component)obj9.GetChild(0)).GetComponent().mesh = mesh; ((Component)obj9.GetChild(1)).GetComponent().mesh = mesh; ((Component)obj9.GetChild(3)).GetComponent().mesh = mesh; } catch (Exception ex) { PAM.Logger.LogError((object)ex); } } } private static void GetMeshes() { Mesh[] array = Resources.FindObjectsOfTypeAll(); foreach (Mesh val in array) { if (((Object)val).name == "circle") { CircleMesh = val; } if (((Object)val).name == "full_arrow") { ArrowMesh = val; } if (((Object)val).name == "triangle") { TriangleMesh = val; } } } [HarmonyPatch("SetColor")] [HarmonyPrefix] private static bool PreSetColor(VGPlayer __instance, Color _col, Color _colTail) { //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: 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_0108: Unknown result type (might be due to invalid IL or missing references) //IL_010d: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Unknown result type (might be due to invalid IL or missing references) //IL_0112: Unknown result type (might be due to invalid IL or missing references) if (GlobalsManager.IsMultiplayer && Settings.Transparent.Value && !__instance.IsLocalPlayer()) { _colTail.a = (_col.a = Settings.TransparentAlpha.Value switch { 1 => 0.5f, 2 => 0.85f, _ => 0.35f, }); } int num = (Object.op_Implicit((Object)(object)SingletonBase.Inst) ? SingletonBase.Inst.ColorID : ChallengeManager.Inst.ColorID); __instance.Player_Core_Rend.material.SetColor(num, _col); __instance.Player_Boost_Rend.material.SetColor(num, _colTail); foreach (PlayerTrailReference item in __instance.Player_Trail.Trail) { if (item != null) { ((Renderer)item.Render_Mesh).material.color = _colTail; item.Render_Trail.startColor = _colTail; item.Render_Trail.endColor = LSColors.fadeColor(_colTail, 0f); if (Object.op_Implicit((Object)(object)item.ParticleSystem)) { MainModule main = item.ParticleSystem.main; ((MainModule)(ref main)).startColor = new MinMaxGradient(_colTail); } } } return false; } [HarmonyPatch("Update")] [HarmonyPrefix] private static void PreUpdate(VGPlayer __instance) { if (__instance.IsLocalPlayer() && GlobalsManager.IsMultiplayer && DebugController.inst.IsOpen) { if (__instance.Control_MoveX) { _revertMoveX = true; __instance.Control_MoveX = false; } if (__instance.Control_MoveY) { _revertMoveY = true; __instance.Control_MoveY = false; } if (__instance.CanBoost) { _revertBoost = true; __instance.CanBoost = false; } } } [HarmonyPatch("Update")] [HarmonyPostfix] private static void PostUpdate(VGPlayer __instance) { //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Invalid comparison between Unknown and I4 //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) if (!__instance.IsLocalPlayer()) { return; } if (_revertMoveX) { _revertMoveX = false; __instance.Control_MoveX = true; } if (_revertMoveY) { _revertMoveY = false; __instance.Control_MoveY = true; } if (_revertBoost) { _revertBoost = false; __instance.CanBoost = true; } if (Object.op_Implicit((Object)(object)SingletonBase.Inst) && (int)SingletonBase.Inst.CurGameState == 1 && !__instance.isDead && Object.op_Implicit((Object)(object)PointsManager.Inst)) { PointsManager.Inst.AddTimeAlive(Time.deltaTime); if (__instance.internalVelocity != Vector2.zero) { PointsManager.Inst.AddTimeMoving(Time.deltaTime); } PointsManager.Inst.AddPosition(((Component)SingletonBase.Inst.CamerasRoot).transform.InverseTransformPoint(__instance.Player_Wrapper.position)); } } [HarmonyPatch("HandleBoost")] [HarmonyPostfix] private static void PostHandleBoost(VGPlayer __instance) { if (!GlobalsManager.IsMultiplayer || __instance.IsLocalPlayer()) { if (__instance.BoostDuration < _holdingBoost) { PointsManager.Inst?.AddBoost(_holdingBoost); } _holdingBoost = __instance.BoostDuration; } } [HarmonyPatch(/*Could not decode attribute arguments.*/)] [HarmonyPrefix] private static bool RPlayerGetter(ref VGPlayer __instance, ref Player __result) { if (!GlobalsManager.IsMultiplayer) { return true; } __result = ReInput.players.GetPlayer((!__instance.IsLocalPlayer()) ? 1 : 0); return false; } private static void CallRpc_Server_PlayerDamaged(int healthPreHit, int checkpointIndex, float time) { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Expected O, but got Unknown if (NetworkManager.Instance == null) { return; } if (NetworkManager.Instance.PeerServer) { Server_PlayerDamaged(NetworkManager.Instance.ServerSelfPeerConnection, healthPreHit, checkpointIndex, time); return; } NetworkWriter val = new NetworkWriter(); try { NetWriterExtensions.Write(val, (ushort)54552); NetWriterExtensions.Write(val, healthPreHit); NetWriterExtensions.Write(val, checkpointIndex); NetWriterExtensions.Write(val, time); NetworkManager.Instance.SendToServer(val.GetData(), (SendType)0); } finally { ((IDisposable)val)?.Dispose(); } } public static void Deserialize_Server_PlayerDamaged_54552(ClientNetworkConnection senderConn, NetworkReader reader) { Server_PlayerDamaged(senderConn, NetReaderExtensions.ReadInt32(reader), NetReaderExtensions.ReadInt32(reader), NetReaderExtensions.ReadSingle(reader)); } public static void CallRpc_Server_PlayerBoost() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown if (NetworkManager.Instance == null) { return; } if (NetworkManager.Instance.PeerServer) { Server_PlayerBoost(NetworkManager.Instance.ServerSelfPeerConnection); return; } NetworkWriter val = new NetworkWriter(); try { NetWriterExtensions.Write(val, (ushort)59657); NetworkManager.Instance.SendToServer(val.GetData(), (SendType)1); } finally { ((IDisposable)val)?.Dispose(); } } public static void Deserialize_Server_PlayerBoost_59657(ClientNetworkConnection senderConn, NetworkReader reader) { Server_PlayerBoost(senderConn); } public static void CallRpc_Multi_PlayerDamaged(SteamId steamID, int healthPreHit, int checkpointIndex) { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) if (NetworkManager.Instance == null) { return; } if (NetworkManager.Instance.PeerServer) { Multi_PlayerDamaged(steamID, healthPreHit, checkpointIndex); } NetworkWriter val = new NetworkWriter(); try { NetWriterExtensions.Write(val, (ushort)40080); val.WriteSteamId(steamID); NetWriterExtensions.Write(val, healthPreHit); NetWriterExtensions.Write(val, checkpointIndex); NetworkManager.Instance.SendToAllClients(val.GetData(), (SendType)0); } finally { ((IDisposable)val)?.Dispose(); } } public static void Deserialize_Multi_PlayerDamaged_40080(ClientNetworkConnection senderConn, NetworkReader reader) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) Multi_PlayerDamaged(reader.ReadSteamId(), NetReaderExtensions.ReadInt32(reader), NetReaderExtensions.ReadInt32(reader)); } private static void CallRpc_Multi_DamageAll(int healthPreHit, int checkpointIndex, SteamId playerHit) { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) if (NetworkManager.Instance == null) { return; } if (NetworkManager.Instance.PeerServer) { Multi_DamageAll(healthPreHit, checkpointIndex, playerHit); } NetworkWriter val = new NetworkWriter(); try { NetWriterExtensions.Write(val, (ushort)5034); NetWriterExtensions.Write(val, healthPreHit); NetWriterExtensions.Write(val, checkpointIndex); val.WriteSteamId(playerHit); NetworkManager.Instance.SendToAllClients(val.GetData(), (SendType)0); } finally { ((IDisposable)val)?.Dispose(); } } public static void Deserialize_Multi_DamageAll_5034(ClientNetworkConnection senderConn, NetworkReader reader) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) Multi_DamageAll(NetReaderExtensions.ReadInt32(reader), NetReaderExtensions.ReadInt32(reader), reader.ReadSteamId()); } public static void CallRpc_Multi_PlayerBoost(SteamId steamID) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) if (NetworkManager.Instance == null) { return; } if (NetworkManager.Instance.PeerServer) { Multi_PlayerBoost(steamID); } NetworkWriter val = new NetworkWriter(); try { NetWriterExtensions.Write(val, (ushort)29337); val.WriteSteamId(steamID); NetworkManager.Instance.SendToAllClients(val.GetData(), (SendType)1); } finally { ((IDisposable)val)?.Dispose(); } } public static void Deserialize_Multi_PlayerBoost_29337(ClientNetworkConnection senderConn, NetworkReader reader) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) Multi_PlayerBoost(reader.ReadSteamId()); } } [HarmonyPatch(typeof(VGPlayerManager))] public static class PlayerManagerPatch { [HarmonyPatch("OnControllerConnected")] [HarmonyPrefix] private static bool PreConnected(ControllerStatusChangedEventArgs args) { return !GlobalsManager.IsMultiplayer; } [HarmonyPatch("OnControllerDisconnected")] [HarmonyPrefix] private static bool PreDisConnected() { return !GlobalsManager.IsMultiplayer; } [HarmonyPatch("RespawnPlayers")] [HarmonyPrefix] private static void OnCheckpoint(VGPlayerManager __instance) { foreach (VGPlayerData player in __instance.players) { if (player.ControllerID == 0 && player.hasSpawnedObject() && player.PlayerObject.Health == 1) { PointsManager.Inst?.AddCheckpointWithOneHealth(); } } } [HarmonyPatch("GetPlayerColorHex")] [HarmonyPostfix] private static void PostGetColorHex(ref string __result) { if (__result == "#ffffff") { __result = "ffffff"; } } } [HarmonyPatch(typeof(VGPlayerData))] public static class PlayerDataPatch { [HarmonyPatch("SpawnPlayerObject")] [HarmonyPrefix] private static bool PreSpawn(VGPlayerData __instance, Vector3 _pos, ref VGPlayer __result) { //IL_006b: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)SingletonBase.Inst)) { return true; } if (!Object.op_Implicit((Object)(object)ChallengeManager.Inst) || Object.op_Implicit((Object)(object)__instance.PlayerObject)) { return false; } string name = "player" + __instance.PlayerID; VGPlayer component = Object.Instantiate(SingletonBase.Inst.PlayerPrefab, ChallengeManager.Inst.playersParent).GetComponent(); ((Object)component).name = name; ((Component)component).transform.position = _pos; component.Init(__instance.PlayerID, SingletonBase.Inst.foregroundCamera, true); __instance.PlayerObject = component; __result = component; return false; } } [HarmonyPatch(typeof(PlayerTrail))] public static class TrailPatch { [HarmonyPatch("UpdateTailFull")] [HarmonyPrefix] private static bool PreTailUpdate(PlayerTrail __instance, ref int _health) { if (_health > __instance.Trail.Count) { PAM.Logger.LogFatal((object)$"Tried to update tail with invalid health value of [{_health}]"); return false; } return true; } } [HarmonyPatch(typeof(PlayerText))] public static class PlayerTextPatch { [HarmonyPatch("DisplayText", new Type[] { typeof(string), typeof(float) })] [HarmonyPrefix] private static void PreDisplay(PlayerText __instance) { ((TMP_Text)__instance.text).richText = true; } } [HarmonyPatch(typeof(MeshDeformation))] public static class MeshDeformationPatch { [HarmonyPatch("LateUpdate")] [HarmonyPrefix] private static bool PreLateUpdate(ref MeshDeformation __instance) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0030: 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_00fd: Unknown result type (might be due to invalid IL or missing references) float num = 1f - Mathf.Pow(0.9f, Time.deltaTime * 60f); for (int i = 0; i < __instance.originalVertices.Length; i++) { Vector3 val = __instance.tmpVerticies[i]; val.x = __instance.tmpVerticies[i].x + (__instance.newVertices[i].x - __instance.tmpVerticies[i].x) * num; val.y = __instance.tmpVerticies[i].y + (__instance.newVertices[i].y - __instance.tmpVerticies[i].y) * num; val.z = __instance.tmpVerticies[i].z + (__instance.newVertices[i].z - __instance.tmpVerticies[i].z) * num; __instance.tmpVerticies[i] = val; } __instance.mesh.vertices = __instance.tmpVerticies; __instance.mesh.RecalculateBounds(); return false; } } [HarmonyPatch(typeof(BeatmapTheme))] public static class BeatmapThemePatch { [HarmonyPatch("GetPlayerColor")] [HarmonyPrefix] private static bool PreGetPlayerColor(BeatmapTheme __instance, ref Color __result, int _val) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) __result = __instance.playerColors[_val % 4]; return false; } } internal static class PlayerExtensions { [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool IsLocalPlayer(this VGPlayer player) { return player.PlayerID == GlobalsManager.LocalPlayerObjectId; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool IsValidPlayer(this VGPlayer player) { if (Object.op_Implicit((Object)(object)player)) { return !player.isDead; } return false; } } [HarmonyPatch(typeof(ArcadeMenu))] public static class ArcadeMenuPatch { private static List _queueButtons = new List(); [HarmonyPatch("Start")] [HarmonyPostfix] private static void PostStart(ArcadeMenu __instance) { //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) _queueButtons.Clear(); GlobalsManager.Queue.Clear(); GameObject val; using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("PAMultiplayer.Assets.queue assets")) { AssetBundle obj = AssetBundle.LoadFromMemory(ExtensionMethods.CTReadFully(stream)); Object obj2 = obj.LoadAsset(obj.GetAllAssetNames()[0]); val = (GameObject)(object)((obj2 is GameObject) ? obj2 : null); obj.Unload(false); } foreach (ArcadeButtonRefs levelButton in __instance.LevelButtons) { Transform transform = ((Component)levelButton.Button).transform; GameObject val2 = Object.Instantiate(val, transform); _queueButtons.Add(val2.AddComponent()); MultiElementButton component = val2.GetComponent(); Navigation navigation = ((Selectable)component).navigation; ((Navigation)(ref navigation)).mode = (Mode)0; ((Selectable)component).navigation = navigation; } } [HarmonyPatch("SelectPage", new Type[] { typeof(int), typeof(bool) })] [HarmonyPostfix] private static void PostRenderLevelButtons(ArcadeMenu __instance) { int page = __instance.Page; for (int i = 0; i < 12; i++) { if (__instance.SearchedLevels.Count - 1 >= i + 12 * page) { ((Component)_queueButtons[i]).gameObject.SetActive(true); _queueButtons[i].SetLevel(__instance.SearchedLevels[i + 12 * page].BaseLevelData.LevelID); } else { ((Component)_queueButtons[i]).gameObject.SetActive(false); } } } [HarmonyPatch("Update")] [HarmonyPostfix] private static void PostUpdate(ArcadeMenu __instance) { if ((!Input.GetKeyDown((KeyCode)121) && !Input.GetKeyDown((KeyCode)333)) || !Object.op_Implicit((Object)(object)EventSystem.current)) { return; } GameObject currentSelectedGameObject = EventSystem.current.currentSelectedGameObject; for (int i = 0; i < __instance.LevelButtons.Count; i++) { if ((Object)(object)((Component)__instance.LevelButtons[i].Button).gameObject == (Object)(object)currentSelectedGameObject) { _queueButtons[i].OnClick(); ((UIElement)_queueButtons[i].UIQueueButton).Show((Action)null); break; } } } } public class QueueButton : MonoBehaviour { private delegate void QueueUpdated(); private TextMeshProUGUI queueText; private string currentLevel = ""; private int queueIndex; public UI_Button UIQueueButton { get; private set; } private static event QueueUpdated _queueUpdated; private void Start() { _queueUpdated += UpdateButton; } private void OnDestroy() { _queueUpdated -= UpdateButton; } private void UpdateButton() { int num = GlobalsManager.Queue.IndexOf(currentLevel) + 1; if (num > 0 && num != queueIndex) { queueIndex = num; ((UIElement)UIQueueButton).Show((Action)null); ((TMP_Text)queueText).text = num.ToString(); } } public void OnClick() { if (GlobalsManager.Queue.Contains(currentLevel)) { GlobalsManager.Queue.Remove(currentLevel); queueIndex = 0; ((TMP_Text)queueText).text = "+"; QueueButton._queueUpdated(); } else { GlobalsManager.Queue.Add(currentLevel); queueIndex = GlobalsManager.Queue.Count; ((TMP_Text)queueText).text = queueIndex.ToString(); } } public void SetLevel(string level) { //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Expected O, but got Unknown if ((Object)(object)UIQueueButton == (Object)null) { UIQueueButton = ((Component)this).gameObject.GetComponent(); queueText = ((Component)this).gameObject.GetComponentInChildren(); ((UnityEvent)((Button)((Component)UIQueueButton).GetComponent()).onClick).AddListener(new UnityAction(OnClick)); } UIQueueButton = ((Component)this).gameObject.GetComponent(); ((UIElement)UIQueueButton).Show((Action)null); currentLevel = level; queueIndex = GlobalsManager.Queue.IndexOf(level) + 1; ((TMP_Text)queueText).text = ((queueIndex > 0) ? queueIndex.ToString() : "+"); } } [HarmonyPatch(typeof(LevelEndScreen))] public static class LevelEndScreenPatch { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static UnityAction <>9__3_0; internal void b__3_0() { GlobalsManager.IsReloadingLobby = true; if (GlobalsManager.IsMultiplayer) { SteamLobbyManager.Inst.UnloadAll(); } if (GlobalsManager.IsChallenge) { if (GlobalsManager.IsMultiplayer && GlobalsManager.IsHosting) { GameManagerPatch.CallRpc_Multi_OpenChallenge(); } SingletonBase.Inst.LoadSceneGroup("Challenge"); } else { string text = GlobalsManager.Queue[0]; SingletonBase.Inst.CurrentArcadeLevel = SingletonBase.Inst.GetLocalCustomLevel(text); GlobalsManager.LevelId = text; SingletonBase.Inst.LoadSceneGroup("Arcade_Level"); PAM.Logger.LogInfo((object)"Starting next level in queue!"); } } } public static LevelEndScreen Instance; [HarmonyPatch("Start")] [HarmonyPostfix] private static void PostStart(LevelEndScreen __instance) { Instance = __instance; } [HarmonyPatch("CreateUI")] [HarmonyPrefix] private static void PreCreateUI(LevelEndScreen __instance) { //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Expected O, but got Unknown //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Expected O, but got Unknown if (!SingletonBase.Inst.IsArcade) { return; } Transform val = ((Component)__instance).transform.Find("Content/EndScreen/Buttons"); MultiElementButton component = Object.Instantiate(((Component)val.Find("Continue")).gameObject, val).GetComponent(); component.Start(); UI_Button ui = default(UI_Button); ref UI_Button reference = ref ui; UIElement uIElement = component.UIElement; reference = (UI_Button)(object)((uIElement is UI_Button) ? uIElement : null); if (Settings.ChallengeBlacklist.Value.Contains(((Object)SingletonBase.Inst.CurrentArcadeLevel).name)) { SingletonBase.Inst.RefreshTextCache(ui.Text, "Whitelist Level"); } else { SingletonBase.Inst.RefreshTextCache(ui.Text, "Blacklist Level"); } __instance.Buttons = CollectionExtensions.AddToArray(__instance.Buttons, component.UIElement); ((Button)component).onClick = new ButtonClickedEvent(); ((UnityEvent)((Button)component).onClick).AddListener((UnityAction)delegate { if (!Settings.ChallengeBlacklist.Value.Contains(((Object)SingletonBase.Inst.CurrentArcadeLevel).name)) { ConfigEntry challengeBlacklist = Settings.ChallengeBlacklist; challengeBlacklist.Value = challengeBlacklist.Value + "/" + ((Object)SingletonBase.Inst.CurrentArcadeLevel).name; SingletonBase.Inst.RefreshTextCache(ui.Text, "Whitelist Level"); ((TMP_Text)ui.Text).text = "Whitelist Level"; } else { Settings.ChallengeBlacklist.Value = Settings.ChallengeBlacklist.Value.Replace("/" + ((Object)SingletonBase.Inst.CurrentArcadeLevel).name, ""); SingletonBase.Inst.RefreshTextCache(ui.Text, "Blacklist Level"); ((TMP_Text)ui.Text).text = "Blacklist Level"; } }); } [HarmonyPatch("CreateUI")] [HarmonyPostfix] private static void PostCreateUI(LevelEndScreen __instance) { //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Expected O, but got Unknown //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Expected O, but got Unknown if (!SingletonBase.Inst.IsArcade) { return; } Transform val = ((Component)__instance).transform.Find("Content/EndScreen/Buttons"); ((Component)val.Find("Flair")).gameObject.SetActive(false); MultiElementButton component = ((Component)val.Find("Continue")).GetComponent(); if ((GlobalsManager.Queue.Count == 0 && !GlobalsManager.IsChallenge) || (GlobalsManager.IsMultiplayer && !GlobalsManager.IsHosting)) { __instance.DisableButton(component); } else { component.Lock = false; ((Selectable)component).interactable = true; } component.uiElement.Show((Action)null); ((Component)component).gameObject.SetActive(true); ((Button)component).onClick = new ButtonClickedEvent(); ButtonClickedEvent onClick = ((Button)component).onClick; object obj = <>c.<>9__3_0; if (obj == null) { UnityAction val2 = delegate { GlobalsManager.IsReloadingLobby = true; if (GlobalsManager.IsMultiplayer) { SteamLobbyManager.Inst.UnloadAll(); } if (GlobalsManager.IsChallenge) { if (GlobalsManager.IsMultiplayer && GlobalsManager.IsHosting) { GameManagerPatch.CallRpc_Multi_OpenChallenge(); } SingletonBase.Inst.LoadSceneGroup("Challenge"); } else { string text = GlobalsManager.Queue[0]; SingletonBase.Inst.CurrentArcadeLevel = SingletonBase.Inst.GetLocalCustomLevel(text); GlobalsManager.LevelId = text; SingletonBase.Inst.LoadSceneGroup("Arcade_Level"); PAM.Logger.LogInfo((object)"Starting next level in queue!"); } }; <>c.<>9__3_0 = val2; obj = (object)val2; } ((UnityEvent)onClick).AddListener((UnityAction)obj); if (GlobalsManager.IsMultiplayer) { __instance.DisableButton(((Component)val.Find("Restart Level")).GetComponent()); } } } [HarmonyPatch(typeof(SceneLoader))] public static class LoadingTipsPatch { [HarmonyPatch("Start")] [HarmonyPostfix] private static void GetterTips(ref SceneLoader __instance) { List list = new List(__instance.Tips) { "You should try the log Unerfed Fallen Kingdom!", "You can always call other Nanos for help!", "Git Gud", "I'm in your walls.", "Good Nano~", "No tips for you >:)", "Boykisser sent kisses!", "Girlkisser sent kisses!", "Theykisser sent kisses!", "The developer wants me to say something here.", "You might be a Nano but you should hydrate anyways.", "Before time began there was The Cube...", "Ready to be carried by another Nano again?", "Squeezing your Nano through the internet wire...", "The triangle is the simplest shape a computer can render", "Make sure to check out the game's official forum!", "Meow!", "Some Nanos seem to keep replaying some logs until they master it\nUnsure how productive that may be", "Cats rule the world", "Don't die... That's probably a good idea?", "Try to be the top Nano of your generation for once", "lol is is likej sab", "I got a box of chocolates for you! One of them has rat poison.", "Adding more bloom...", "Wait... what multiplayer?", "Afterbeat multiplayer...? Too long... BeatMultiplayer... Beat Toget-\nLets keep it at Project Arrhythmia Multiplayer" }; __instance.Tips = list.ToArray(); AddChallengeScene(); } private static void AddChallengeScene() { //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) //IL_0073: 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) //IL_0087: Expected O, but got Unknown //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Expected O, but got Unknown //IL_00a7: Expected O, but got Unknown List list = new List(SingletonBase.Inst.sceneGroups); if (!list.All((SceneGroup x) => x.GroupName != "Challenge")) { return; } using Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("PAMultiplayer.Assets.challenge"); string text = AssetBundle.LoadFromMemory(ExtensionMethods.CTReadFully(stream)).GetAllScenePaths()[0]; string text2 = "11f830737ff4bc41a4ffe792d073f41f"; SceneGroup val = new SceneGroup { GroupName = "Challenge", GroupType = (SceneGroupType)4, Scenes = new List() }; SceneData item = new SceneData { SceneType = (SceneType)0, Reference = new SceneReference { guid = text2 } }; SceneGuidToPathMapProvider._sceneGuidToPathMap.Add(text2, text); SceneGuidToPathMapProvider._scenePathToGuidMap.Add(text, text2); val.Scenes.Add(item); list.Add(val); SingletonBase.Inst.sceneGroups = list.ToArray(); SceneManager.sceneLoaded += delegate(Scene scene, LoadSceneMode _) { if (((Scene)(ref scene)).name == "Arcade" || ((Scene)(ref scene)).name == "Menu") { ChallengeManager.RecentLevels.Clear(); if (GlobalsManager.IsMultiplayer) { SteamManager.Inst.EndServer(); SteamManager.Inst.EndClient(); } } if (!(((Scene)(ref scene)).name != "Challenge")) { ((Scene)(ref scene)).GetRootGameObjects().First((GameObject x) => ((Object)x).name == "Managers").AddComponent(); } }; } } [HarmonyPatch(typeof(SceneReference))] public static class SceneReferencePatch { [HarmonyPatch(/*Could not decode attribute arguments.*/)] [HarmonyPrefix] private static bool GetStatePatch(SceneReference __instance, ref SceneReferenceState __result) { __result = (SceneReferenceState)0; if (__instance.HasValue && SceneGuidToPathMapProvider.SceneGuidToPathMap.TryGetValue(__instance.Guid, out var _)) { __result = (SceneReferenceState)1; } return false; } } [HarmonyPatch(typeof(SteamClient))] public static class SteamPatch { [HarmonyPatch("Init")] [HarmonyPrefix] private static bool PreInit() { return !SteamClient.IsValid; } } [HarmonyPatch(typeof(GameManager))] public static class CheckpointHandler { [HarmonyPatch("CheckpointCheck")] [HarmonyPrefix] private static bool CheckpointHit(ref GameManager __instance) { if (!GlobalsManager.IsMultiplayer) { return true; } if (!GlobalsManager.IsHosting || DataManager.inst.gameData.beatmapData == null) { return false; } float currentSongTimeSmoothed = __instance.CurrentSongTimeSmoothed; if (DataManager.inst.gameData.beatmapData.checkpoints.Count > 0) { int num = -1; for (int i = 0; i < DataManager.inst.gameData.beatmapData.checkpoints.Count; i++) { if (i > __instance.currentCheckpointIndex && DataManager.inst.gameData.beatmapData.checkpoints[i].time <= currentSongTimeSmoothed) { num = i; break; } } if (num != -1) { CallRpc_Multi_CheckpointHit(num); } } return false; } [MultiRpc(/*Could not decode attribute arguments.*/)] private static void Multi_CheckpointHit(int index) { //IL_00b4: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)SingletonBase.Inst) || index <= SingletonBase.Inst.currentCheckpointIndex) { return; } PAM.Logger.LogInfo((object)$"Checkpoint [{index}] Received"); SingletonBase.Inst.playingCheckpointAnimation = true; SingletonBase.Inst.RespawnPlayers(); SingletonBase.Inst.HealPlayers(); SingletonBase.Inst.currentCheckpointIndex = index; ((MonoBehaviour)SingletonBase.Inst).StartCoroutine(SingletonBase.Inst.PlayCheckpointAnimation(index)); for (int i = 0; i < GlobalsManager.HitsQueue.Count; i++) { HitInfo hitInfo = GlobalsManager.HitsQueue[i]; if (hitInfo.Checkpoint == index) { if (hitInfo.All) { Player_Patch.DamageAll(hitInfo.Health, hitInfo.Checkpoint, hitInfo.Id); } else { Player_Patch.Multi_PlayerDamaged(SteamId.op_Implicit(hitInfo.Id), hitInfo.Health, hitInfo.Checkpoint); } GlobalsManager.HitsQueue.RemoveAt(i); } } } private static void CallRpc_Multi_CheckpointHit(int index) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown if (NetworkManager.Instance == null) { return; } if (NetworkManager.Instance.PeerServer) { Multi_CheckpointHit(index); } NetworkWriter val = new NetworkWriter(); try { NetWriterExtensions.Write(val, (ushort)16372); NetWriterExtensions.Write(val, index); NetworkManager.Instance.SendToAllClients(val.GetData(), (SendType)0); } finally { ((IDisposable)val)?.Dispose(); } } public static void Deserialize_Multi_CheckpointHit_16372(ClientNetworkConnection senderConn, NetworkReader reader) { Multi_CheckpointHit(NetReaderExtensions.ReadInt32(reader)); } } [HarmonyPatch(typeof(VGPlayerManager))] public static class RewindHandler { [HarmonyPatch("SpawnPlayers")] [HarmonyPrefix] private static void ReplaceDeathAction(ref Action _deathAction) { if (!GlobalsManager.IsMultiplayer) { return; } if (GlobalsManager.IsHosting) { _deathAction = delegate { if (SingletonBase.Inst.AreAllPlayersDead()) { int index = 0; if (DataManager.inst.GetSettingEnum("ArcadeHealthMod", 0) <= 1) { index = SingletonBase.Inst.currentCheckpointIndex; } CallRpc_Multi_RewindToCheckpoint(index); } }; } else { _deathAction = delegate { }; } } [MultiRpc(/*Could not decode attribute arguments.*/)] public static void Multi_RewindToCheckpoint(int index) { if (!GlobalsManager.HasLoadedAllLobbyInfo) { return; } GlobalsManager.HitsQueue.Clear(); PAM.Logger.LogInfo((object)$"Rewind to Checkpoint [{index}] Received"); foreach (VGPlayerData player in SingletonBase.Inst.players) { if (player.PlayerObject.IsValidPlayer()) { player.PlayerObject.Health = 0; player.PlayerObject.ClearEvents(); player.PlayerObject.PlayerDeath(0.2f); } } SingletonBase.Inst.RewindToCheckpoint(index, false); } public static void CallRpc_Multi_RewindToCheckpoint(int index) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown if (NetworkManager.Instance == null) { return; } if (NetworkManager.Instance.PeerServer) { Multi_RewindToCheckpoint(index); } NetworkWriter val = new NetworkWriter(); try { NetWriterExtensions.Write(val, (ushort)11649); NetWriterExtensions.Write(val, index); NetworkManager.Instance.SendToAllClients(val.GetData(), (SendType)0); } finally { ((IDisposable)val)?.Dispose(); } } public static void Deserialize_Multi_RewindToCheckpoint_11649(ClientNetworkConnection senderConn, NetworkReader reader) { Multi_RewindToCheckpoint(NetReaderExtensions.ReadInt32(reader)); } } [HarmonyPatch(typeof(SteamWrapper))] public static class SteamWrapperPatch { [HarmonyPatch("SubmitArcadeLeaderboardScore")] [HarmonyPrefix] private static bool PreSubmitArcadeLeaderboardScore() { if (!GlobalsManager.IsMultiplayer || GlobalsManager.IsHosting) { return true; } if (GlobalsManager.JoinedMidLevel) { GlobalsManager.JoinedMidLevel = false; return false; } return true; } } [HarmonyPatch(typeof(ModifiersManager))] public static class UI_Patch { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static UnityAction <>9__0_1; public static UnityAction <>9__0_2; internal void b__0_1() { if (GlobalsManager.Queue.Count > 0) { string item = ((SingletonBase.Inst.CurrentArcadeLevel.SteamInfo != null) ? ((object)(PublishedFileId)(ref SingletonBase.Inst.CurrentArcadeLevel.SteamInfo.ItemID)).ToString() : ((Object)SingletonBase.Inst.CurrentArcadeLevel).name); if (!GlobalsManager.Queue.Contains(item)) { GlobalsManager.Queue.Add(item); } item = (GlobalsManager.LevelId = GlobalsManager.Queue[0]); SingletonBase.Inst.CurrentArcadeLevel = SingletonBase.Inst.GetLocalCustomLevel(item); } } internal void b__0_2(bool on) { DataManager.inst.UpdateSettingBool("mp_linkedHealth", on); } } [HarmonyPatch("Start")] [HarmonyPostfix] private static void AddUIToSettings(ref ModifiersManager __instance) { //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Expected O, but got Unknown //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Expected O, but got Unknown //IL_0186: Unknown result type (might be due to invalid IL or missing references) //IL_0190: Expected O, but got Unknown GameObject gameObject = ((Component)((Component)__instance).transform.parent.Find("Buttons/Primary/Multiplayer")).gameObject; gameObject.SetActive(true); MultiElementToggle mpToggle = gameObject.GetComponent(); ((Toggle)mpToggle).isOn = false; ((Selectable)mpToggle).interactable = true; ((Toggle)mpToggle).onValueChanged = new ToggleEvent(); ((UnityEvent)(object)((Toggle)mpToggle).onValueChanged).AddListener((UnityAction)delegate { ((Toggle)mpToggle).isOn = false; if (Object.op_Implicit((Object)(object)LobbyCreationManager.Instance)) { LobbyCreationManager.Instance.OpenMenu(bIsChallange: false); } }); ((TMP_Text)((Component)mpToggle).GetComponentInChildren()).richText = true; if (Object.op_Implicit((Object)(object)LobbyCreationManager.Instance)) { LobbyCreationManager.Instance.FallbackUIElement = (Selectable)(object)mpToggle; } ButtonClickedEvent onClick = ((Button)((Component)((Component)__instance).transform.parent.Find("Buttons/Primary/Play")).GetComponent()).onClick; object obj = <>c.<>9__0_1; if (obj == null) { UnityAction val = delegate { if (GlobalsManager.Queue.Count > 0) { string item = ((SingletonBase.Inst.CurrentArcadeLevel.SteamInfo != null) ? ((object)(PublishedFileId)(ref SingletonBase.Inst.CurrentArcadeLevel.SteamInfo.ItemID)).ToString() : ((Object)SingletonBase.Inst.CurrentArcadeLevel).name); if (!GlobalsManager.Queue.Contains(item)) { GlobalsManager.Queue.Add(item); } item = (GlobalsManager.LevelId = GlobalsManager.Queue[0]); SingletonBase.Inst.CurrentArcadeLevel = SingletonBase.Inst.GetLocalCustomLevel(item); } }; <>c.<>9__0_1 = val; obj = (object)val; } ((UnityEvent)onClick).AddListener((UnityAction)obj); Transform val2 = ((Component)__instance).transform.Find("r-2"); Transform val3 = Object.Instantiate(val2, ((Component)__instance).transform); for (int i = 0; i < val3.childCount; i++) { Object.Destroy((Object)(object)((Component)val3.GetChild(i)).gameObject); } MultiElementToggle component = ((Component)Object.Instantiate(val2.GetChild(0), val3)).GetComponent(); TextMeshProUGUI componentInChildren = ((Component)component).gameObject.GetComponentInChildren(); SingletonBase.Inst.RefreshTextCache(componentInChildren, "Linked Health"); ((TMP_Text)componentInChildren).text = "Linked Health"; ((TMP_Text)componentInChildren).richText = true; ((Object)component).name = "mp_linkedHealth"; ((Toggle)component).onValueChanged = new ToggleEvent(); ((UnityEvent)(object)((Toggle)component).onValueChanged).AddListener((UnityAction)delegate(bool on) { DataManager.inst.UpdateSettingBool("mp_linkedHealth", on); }); DataManager.inst.UpdateSettingBool("mp_linkedHealth", false); ((Toggle)component).isOn = false; component.wasOn = false; Object.FindFirstObjectByType().Pages[1].SubElements.Add(component.uiElement); } } [HarmonyPatch(typeof(PauseUIManager))] public static class PauseMenuPatch { [HarmonyPatch("RestartLevel")] [HarmonyPrefix] private static bool PreRestartLevel() { return !GlobalsManager.IsMultiplayer; } [HarmonyPatch("Update")] [HarmonyPostfix] private static void PostUpdate() { if (!((Object)(object)LobbyCreationManager.Instance != (Object)null)) { Transform parent = ((Component)SingletonBase.Inst).transform.parent; GameObject val; GameObject val2; using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("PAMultiplayer.Assets.lobbysettings")) { AssetBundle obj = AssetBundle.LoadFromMemory(ExtensionMethods.CTReadFully(stream)); Object obj2 = obj.LoadAsset(obj.GetAllAssetNames()[0]); val = Object.Instantiate((GameObject)(object)((obj2 is GameObject) ? obj2 : null), parent); Object obj3 = obj.LoadAsset(obj.GetAllAssetNames()[1]); val2 = Object.Instantiate((GameObject)(object)((obj3 is GameObject) ? obj3 : null), parent); obj.Unload(false); } ((Object)val).name = "LobbySettings"; val.AddComponent(); ((Object)val2).name = "SelectionMenu"; val2.AddComponent(); } } } [HarmonyPatch] public class PauseLobbyPatch { [CompilerGenerated] private sealed class <>c__DisplayClass1_0 { public PlayerText pt; public Color[] colors; } [CompilerGenerated] private sealed class d__2 : IEnumerator, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public VGPlayer player; object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public d__2(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; player.ChangeAnimationState(VGPlayer.ANIM_HURT); <>2__current = (object)new WaitForSeconds(3f); <>1__state = 1; return true; case 1: <>1__state = -1; if (Object.op_Implicit((Object)(object)player) && player.isHurting == 0f) { player.ChangeAnimationState(VGPlayer.ANIM_IDLE); } 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(); } } [CompilerGenerated] private sealed class d__1 : IEnumerator, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public d__1(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Expected O, but got Unknown //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Expected O, but got Unknown //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007e: 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_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_0183: Unknown result type (might be due to invalid IL or missing references) //IL_0184: Unknown result type (might be due to invalid IL or missing references) //IL_0195: Unknown result type (might be due to invalid IL or missing references) //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_01d9: Unknown result type (might be due to invalid IL or missing references) switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = (object)new WaitForUpdate(); <>1__state = 1; return true; case 1: <>1__state = -1; <>2__current = (object)new WaitForUpdate(); <>1__state = 2; return true; case 2: <>1__state = -1; foreach (Friend member in ((Lobby)(ref SteamLobbyManager.Inst.CurrentLobby)).Members) { Friend current = member; if (!GlobalsManager.Players.TryGetValue(SteamId.op_Implicit(current.Id), out var value)) { continue; } <>c__DisplayClass1_0 CS$<>8__locals0 = new <>c__DisplayClass1_0(); string text = ((Friend)(ref current)).Name; if (current.Id.IsLocalPlayer()) { text = "YOU"; if (!Object.op_Implicit((Object)(object)ChallengeManager.Inst) && Object.op_Implicit((Object)(object)value.VGPlayerData.PlayerObject)) { ((MonoBehaviour)SingletonBase.Inst).StartCoroutine(ShowDecay(value.VGPlayerData.PlayerObject)); } } CS$<>8__locals0.pt = value.VGPlayerData?.PlayerObject?.Player_Text; if (!Object.op_Implicit((Object)(object)CS$<>8__locals0.pt)) { continue; } ((TMP_Text)CS$<>8__locals0.pt.text).richText = !Settings.DisableRichText.Value; ((MonoBehaviour)CS$<>8__locals0.pt).StopCoroutine("HideTextAfterTime"); CS$<>8__locals0.pt.DisplayText(text); ((MonoBehaviour)CS$<>8__locals0.pt).StartCoroutine(CS$<>8__locals0.pt.HideTextAfterTime(3f)); if (!current.Id.IsLocalPlayer() && LobbyScreenManager.SpecialColors.TryGetValue(SteamId.op_Implicit(current.Id), out CS$<>8__locals0.colors)) { switch (CS$<>8__locals0.colors.Length) { case 1: ((Graphic)CS$<>8__locals0.pt.text).color = CS$<>8__locals0.colors[0]; break; case 2: ((TMP_Text)CS$<>8__locals0.pt.text).OnPreRenderText += SetGradient; break; } } void SetGradient(TMP_TextInfo info) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0029: 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_003a: Unknown result type (might be due to invalid IL or missing references) ((TMP_Text)CS$<>8__locals0.pt.text).OnPreRenderText -= SetGradient; MPUtility.SetFullTextGradient(info, Color32.op_Implicit(CS$<>8__locals0.colors[0]), Color32.op_Implicit(CS$<>8__locals0.colors[1])); } } 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(); } } [HarmonyPatch(typeof(PauseUIManager), "CloseWithEffects")] [HarmonyPrefix] private static bool PreMenuUnpause() { if (!GlobalsManager.IsMultiplayer) { return true; } if (GlobalsManager.HasStarted || (GlobalsManager.IsHosting && SteamLobbyManager.Inst.IsEveryoneLoaded)) { return true; } return false; } [IteratorStateMachine(typeof(d__1))] public static IEnumerator ShowNames() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__1(0); } [IteratorStateMachine(typeof(d__2))] public static IEnumerator ShowDecay(VGPlayer player) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__2(0) { player = player }; } [HarmonyPatch(typeof(GameManager), "UnPause")] [HarmonyPrefix] private static bool PreGameUnpause(ref GameManager __instance) { if (!GlobalsManager.IsMultiplayer) { return true; } if (!GlobalsManager.HasStarted && (!GlobalsManager.IsHosting || !SteamLobbyManager.Inst.IsEveryoneLoaded)) { return false; } __instance.Paused = false; if (GlobalsManager.IsHosting) { CallRpc_Multi_StartLevel(); } if (Object.op_Implicit((Object)(object)LobbyScreenManager.Instance)) { ((Lobby)(ref SteamLobbyManager.Inst.CurrentLobby)).SetMemberData("IsLoaded", "0"); ((MonoBehaviour)SingletonBase.Inst).StartCoroutine(ShowNames()); LobbyScreenManager.Instance.StartLevel(); Object.Destroy((Object)(object)LobbyScreenManager.Instance, 1f); } SingletonBase.Inst.SetUIVolumeWeightOut(0.2f); return true; } [MultiRpc(/*Could not decode attribute arguments.*/)] public static void Multi_StartLevel() { if (!GlobalsManager.IsHosting && Object.op_Implicit((Object)(object)LobbyScreenManager.Instance)) { LobbyScreenManager.Instance.StartLevel(); } } public static void CallRpc_Multi_StartLevel() { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Expected O, but got Unknown if (NetworkManager.Instance == null) { return; } if (NetworkManager.Instance.PeerServer) { Multi_StartLevel(); } NetworkWriter val = new NetworkWriter(); try { NetWriterExtensions.Write(val, (ushort)34174); NetworkManager.Instance.SendToAllClients(val.GetData(), (SendType)0); } finally { ((IDisposable)val)?.Dispose(); } } public static void Deserialize_Multi_StartLevel_34174(ClientNetworkConnection senderConn, NetworkReader reader) { Multi_StartLevel(); } } [HarmonyPatch(typeof(ShowChangeLog))] public static class UpdateModButton { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static UnityAction <>9__0_1; public static UnityAction <>9__0_2; public static UnityAction <>9__0_3; public static UnityAction <>9__2_0; internal void b__0_1(float x) { Settings.HitSfx.Value = (int)x; DataManager.inst.UpdateSettingBool("PlayerSFX", x != 2f); } internal void b__0_2(float x) { Settings.WarpSfx.Value = (int)x; DataManager.inst.UpdateSettingBool("PlayerWarpSFX", x != 2f); } internal void b__0_3() { MenuSelectionManager.Instance.OpenMenu(); } internal void b__2_0() { Application.OpenURL("https://thunderstore.io/c/project-arrhythmia/p/aiden_ytarame/Project_Arrhythmia_Multiplayer/"); } } [CompilerGenerated] private sealed class d__2 : IEnumerator, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public GameObject changeLog; private UnityWebRequest 5__2; object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public d__2(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { 5__2 = null; <>1__state = -2; } private bool MoveNext() { //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Invalid comparison between Unknown and I4 //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_0155: Expected O, but got Unknown //IL_016e: Unknown result type (might be due to invalid IL or missing references) //IL_0173: Unknown result type (might be due to invalid IL or missing references) //IL_0179: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; 5__2 = UnityWebRequest.Get("https://api.github.com/repos/Aiden-ytarame/PAMultiplayer/releases/latest"); <>2__current = 5__2.SendWebRequest(); <>1__state = 1; return true; case 1: { <>1__state = -1; if ((int)5__2.result != 1) { PAM.Logger.LogError((object)"Failed to fetch Github Release, oof"); 5__2.Dispose(); return false; } JSONNode obj = JSON.Parse(5__2.downloadHandler.text); 5__2.Dispose(); if (Version.Parse(obj["tag_name"].Value.Substring(1)).CompareTo(Version.Parse("1.3.1")) <= 0) { PAM.Logger.LogInfo((object)"Got Latest Version"); return false; } PAM.Logger.LogWarning((object)"New Mp Version Available!"); GameObject gameObject = Object.Instantiate(changeLog, changeLog.transform.parent).gameObject; ((Object)gameObject).name = "Update MP"; gameObject.SetActive(true); ((Behaviour)gameObject.GetComponent()).enabled = false; TextMeshProUGUI componentInChildren = gameObject.GetComponentInChildren(); ((TMP_Text)componentInChildren).text = " Update Multiplayer"; SingletonBase.Inst.RefreshTextCache(componentInChildren, " Update Multiplayer"); MultiElementButton component = gameObject.GetComponent(); ((Button)component).onClick = new ButtonClickedEvent(); ButtonClickedEvent onClick = ((Button)component).onClick; object obj2 = <>c.<>9__2_0; if (obj2 == null) { UnityAction val = delegate { Application.OpenURL("https://thunderstore.io/c/project-arrhythmia/p/aiden_ytarame/Project_Arrhythmia_Multiplayer/"); }; <>c.<>9__2_0 = val; obj2 = (object)val; } ((UnityEvent)onClick).AddListener((UnityAction)obj2); ((Component)GameObject.Find("Canvas/Window").transform.parent).GetComponent().Pages[0].SubElements.Add((UIElement)(object)gameObject.GetComponent()); 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 const string UpdateStr = " Update Multiplayer"; [HarmonyPatch("Start")] [HarmonyPrefix] private static bool PostStart(ShowChangeLog __instance) { //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Expected O, but got Unknown //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_014e: Unknown result type (might be due to invalid IL or missing references) //IL_0154: Expected O, but got Unknown UI_Book book = ((Component)((Component)__instance).transform.parent.parent.parent.Find("Settings")).GetComponent(); ((MonoBehaviour)SystemManager.inst).StartCoroutine(FetchGithubReleases(((Component)__instance).gameObject)); GameObject gameObject = ((Component)((Component)book).transform.Find("Audio/Right/Music")).gameObject; Transform parent2 = gameObject.transform.parent; Object.Destroy((Object)(object)((Component)parent2.GetChild(parent2.childCount - 1)).gameObject); Object.Destroy((Object)(object)((Component)parent2.GetChild(parent2.childCount - 2)).gameObject); InstantiateSlider(gameObject, parent2, "Player Hit SFX", Settings.HitSfx.Value, delegate(float x) { Settings.HitSfx.Value = (int)x; DataManager.inst.UpdateSettingBool("PlayerSFX", x != 2f); }); InstantiateSlider(gameObject, parent2, "Player Hit Warp SFX", Settings.WarpSfx.Value, delegate(float x) { Settings.WarpSfx.Value = (int)x; DataManager.inst.UpdateSettingBool("PlayerWarpSFX", x != 2f); }); MultiElementButton component = ((Component)((Component)__instance).transform.parent.parent.Find("pc_top-buttons/Custom Mode")).GetComponent(); ((Button)component).onClick = new ButtonClickedEvent(); ButtonClickedEvent onClick = ((Button)component).onClick; object obj = <>c.<>9__0_3; if (obj == null) { UnityAction val = delegate { MenuSelectionManager.Instance.OpenMenu(); }; <>c.<>9__0_3 = val; obj = (object)val; } ((UnityEvent)onClick).AddListener((UnityAction)obj); if (!SingletonBase.Inst.ShowChangeLog()) { ((Component)__instance).gameObject.SetActive(false); } return false; void InstantiateSlider(GameObject prefab, Transform parent, string label, float value, UnityAction setter) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) UI_Slider component2 = Object.Instantiate(prefab, parent).GetComponent(); component2.DataID = null; component2.DataIDType = (DataType)2; component2.Type = (VisualType)0; component2.Range = new Vector2(0f, 2f); component2.Values = new string[3] { "All Players", "Local player Only", "None" }; component2.Value = value; ((TMP_Text)component2.Label).text = label; ((Behaviour)((Component)component2.Label).GetComponentInChildren()).enabled = false; component2.OnValueChanged.AddListener(setter); SingletonBase.inst.RefreshTextCache(component2.Label, label); UIElementExtension.SetLocalization((UIElement)(object)component2, component2.Label, "me.ytarame.Multiplayer", label, label); book.Pages[1].SubElements.Add((UIElement)(object)component2); } } [IteratorStateMachine(typeof(d__2))] private static IEnumerator FetchGithubReleases(GameObject changeLog) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__2(0) { changeLog = changeLog }; } } [HarmonyPatch(typeof(ShowChangeLog))] public static class ChangelogsPatch { [HarmonyPatch("Start")] [HarmonyPrefix] private static bool PreStart(ShowChangeLog __instance) { if (!SingletonBase.Inst.ShowChangeLog() && ((Object)__instance).name == "Changelog") { ((Component)__instance).gameObject.SetActive(false); } return false; } } } namespace PAMultiplayer.Managers { public class ChallengeManager : MonoBehaviour { private class LoadState { public bool AudioLoaded; public bool ImageLoaded; public bool Loaded { get { if (AudioLoaded) { return ImageLoaded; } return false; } } public LoadState(bool audio = false, bool image = false) { AudioLoaded = audio; ImageLoaded = image; } } public delegate void OnVoteChangedSignature(VGLevel newLevel); [CompilerGenerated] private sealed class <>c__DisplayClass32_0 { public Task albumTask; internal bool b__0() { return albumTask.IsCompleted; } } [CompilerGenerated] private sealed class <>c__DisplayClass47_0 { public double timeSinceLastButton; public Func <>9__0; internal bool b__0() { return timeSinceLastButton <= Time.realtimeSinceStartupAsDouble; } } [CompilerGenerated] private sealed class d__50 : IEnumerator, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public List levelIds; private List 5__2; private int 5__3; private ulong 5__4; private bool 5__5; object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public d__50(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { 5__2 = null; <>1__state = -2; } private bool MoveNext() { //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Expected O, but got Unknown int num = <>1__state; if (num != 0) { if (num != 1) { return false; } <>1__state = -1; if (SteamWorkshopFacepunch.inst.isLoadingLevels) { goto IL_004c; } goto IL_009d; } <>1__state = -1; 5__2 = new List(); 5__3 = 0; goto IL_00dc; IL_00dc: if (5__3 < levelIds.Count) { 5__4 = levelIds[5__3]; 5__5 = false; goto IL_004c; } PAM.Logger.LogInfo((object)$"requesting audio of [{5__2.Count}] levels"); CallRpc_Server_UnknownLevelIds(5__2); return false; IL_004c: if (Object.op_Implicit((Object)(object)SingletonBase.Inst.GetLocalCustomLevel(5__4.ToString()))) { 5__5 = true; goto IL_009d; } <>2__current = (object)new WaitForSeconds(0.5f); <>1__state = 1; return true; IL_009d: if (!5__5) { 5__2.Add(5__4); } Inst.CreateLevelEntry(5__4, 5__3); 5__3++; goto IL_00dc; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class d__44 : IEnumerator, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public string url; public VGLevel level; public ChallengeManager <>4__this; private UnityWebRequest 5__2; object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public d__44(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { 5__2 = null; <>1__state = -2; } private bool MoveNext() { //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Invalid comparison between Unknown and I4 //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; ChallengeManager challengeManager = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; 5__2 = UnityWebRequestTexture.GetTexture(url); <>2__current = 5__2.SendWebRequest(); <>1__state = 1; return true; case 1: { <>1__state = -1; if ((int)5__2.result != 1) { PAM.Logger.LogError((object)5__2.error); level.AlbumArt = null; challengeManager._loadedLevels[level].ImageLoaded = true; challengeManager.CheckAllLevelsReady(); return false; } Texture2D content = DownloadHandlerTexture.GetContent(5__2); level.AlbumArt = Sprite.Create(content, new Rect(0f, 0f, (float)((Texture)content).width, (float)((Texture)content).height), new Vector2(0.5f, 0.5f)); challengeManager._loadedLevels[level].ImageLoaded = true; challengeManager.CheckAllLevelsReady(); 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(); } } [CompilerGenerated] private sealed class d__45 : IEnumerator, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public VGLevel level; public ChallengeManager <>4__this; private UnityWebRequest 5__2; object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public d__45(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { 5__2 = null; <>1__state = -2; } private bool MoveNext() { //IL_01d9: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; ChallengeManager challengeManager = <>4__this; switch (num) { default: return false; case 0: { <>1__state = -1; string text = ""; if (File.Exists(level.BaseLevelData.LocalFolder + "/audio.ogg")) { text = level.BaseLevelData.LocalFolder + "/audio.ogg"; } else if (File.Exists(level.BaseLevelData.LocalFolder + "/level.ogg")) { text = level.BaseLevelData.LocalFolder + "/level.ogg"; } 5__2 = UnityWebRequestMultimedia.GetAudioClip(text, (AudioType)14); <>2__current = 5__2.SendWebRequest(); <>1__state = 1; return true; } case 1: { <>1__state = -1; AudioClip content; try { content = DownloadHandlerAudioClip.GetContent(5__2); } catch (Exception ex) { 5__2.Dispose(); PAM.Logger.LogError((object)ex); return false; } 5__2.Dispose(); int num2 = 1; int num3; while (true) { num3 = content.frequency / num2; if (num3 <= 24000) { break; } num2 *= 2; } float[] array = new float[Mathf.FloorToInt((float)(4 * content.frequency * content.channels))]; short[] array2 = new short[Mathf.FloorToInt((float)(4 * num3 * content.channels))]; content.GetData(array, content.samples / 2); int num4 = 0; for (int i = 0; i < array.Length; i += (num2 - 1) * content.channels) { for (int j = 0; j < content.channels; j++) { array2[num4] = (short)(array[i] * 32767f); num4++; i++; } } challengeManager._songData.AddOrUpdate(PublishedFileId.op_Implicit(level.SteamInfo.ItemID), new Tuple(array2, num3, content.channels), (ulong _, Tuple tuple) => tuple); SceneLoader inst = SingletonBase.Inst; if (inst != null) { SceneGroupManager manager = inst.manager; if (manager != null) { manager.UpdateTaskStatus("Setting up chosen levels", $"[ Prepping ] {challengeManager._songData.Count}/6"); } } 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(); } } [CompilerGenerated] private sealed class d__48 : IEnumerator, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public ChallengeManager <>4__this; private Stopwatch 5__2; private List 5__3; object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public d__48(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { 5__2 = null; 5__3 = null; <>1__state = -2; } private bool MoveNext() { //IL_011d: Unknown result type (might be due to invalid IL or missing references) //IL_0127: Expected O, but got Unknown //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Expected O, but got Unknown //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Expected O, but got Unknown //IL_0303: Unknown result type (might be due to invalid IL or missing references) //IL_030d: Expected O, but got Unknown //IL_0211: Unknown result type (might be due to invalid IL or missing references) //IL_0255: Unknown result type (might be due to invalid IL or missing references) //IL_025f: Expected O, but got Unknown int num = <>1__state; ChallengeManager CS$<>8__locals0 = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; ((Component)CS$<>8__locals0).gameObject.AddComponent(); CS$<>8__locals0.AddLoadingScreenTasks(); if (!GlobalsManager.IsReloadingLobby) { if (GlobalsManager.IsHosting) { SteamLobbyManager.Inst.CreateLobby(); <>2__current = (object)new WaitUntil((Func)(() => SteamLobbyManager.Inst.InLobby)); <>1__state = 1; return true; } SteamManager.Inst.StartClient(((Lobby)(ref SteamLobbyManager.Inst.CurrentLobby)).Owner.Id); <>2__current = (object)new WaitUntil((Func)(() => NetworkManager.Instance.TransportActive)); <>1__state = 2; return true; } goto IL_0137; case 1: <>1__state = -1; goto IL_0137; case 2: <>1__state = -1; <>2__current = (object)new WaitUntil((Func)(() => GlobalsManager.HasLoadedAllInfo)); <>1__state = 3; return true; case 3: <>1__state = -1; goto IL_0137; case 4: { <>1__state = -1; Transform obj = ((Component)SingletonBase.Inst).transform.Find("Pause Menu"); Transform val = ((obj != null) ? obj.Find("Skip Queue Level") : null); if (Object.op_Implicit((Object)(object)val)) { ((Component)val).gameObject.SetActive(false); } 5__2 = Stopwatch.StartNew(); 5__3 = new List(); foreach (VGLevel item in CS$<>8__locals0._levelsToVote) { 5__3.Add(PublishedFileId.op_Implicit(item.SteamInfo.ItemID)); ThreadNinjaMonoBehaviourExtensions.StartCoroutineAsync((MonoBehaviour)(object)CS$<>8__locals0, CS$<>8__locals0.GetSongData(item)); } <>2__current = (object)new WaitUntil((Func)(() => CS$<>8__locals0._songData.Count >= 6)); <>1__state = 5; return true; } case 5: { <>1__state = -1; 5__2.Stop(); PAM.Logger.LogDebug((object)$"took {5__2.ElapsedMilliseconds}ms to get level data"); SceneLoader inst2 = SingletonBase.Inst; if (inst2 != null) { SceneGroupManager manager2 = inst2.manager; if (manager2 != null) { manager2.ResetTaskStatus("Setting up chosen levels"); } } CallRpc_Multi_CheckLevelIds(5__3); ((Lobby)(ref SteamLobbyManager.Inst.CurrentLobby)).SetMemberData("IsLoaded", "1"); <>2__current = (object)new WaitUntil((Func)(() => SteamLobbyManager.Inst.IsEveryoneLoaded)); <>1__state = 6; return true; } case 6: { <>1__state = -1; SceneLoader inst = SingletonBase.Inst; if (inst != null) { SceneGroupManager manager = inst.manager; if (manager != null) { manager.ClearLoadingTasks(); } } SteamLobbyManager.Inst.UnloadAll(); CallRpc_Multi_StartVoting(); CS$<>8__locals0.StartVoting(); return false; } IL_0137: if (Object.op_Implicit((Object)(object)MultiplayerDiscordManager.Instance)) { MultiplayerDiscordManager.Instance.SetChallengePresence(); } GlobalsManager.IsReloadingLobby = false; if (!GlobalsManager.IsHosting) { return false; } PaMNetworkManager.CallRpc_Multi_UpdateLobbyState(2); ((Lobby)(ref SteamLobbyManager.Inst.CurrentLobby)).SetData("LobbyState", ((ushort)2).ToString()); <>2__current = CS$<>8__locals0.PickLevelForVoting(); <>1__state = 4; return true; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class d__32 : IEnumerator, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public ChallengeManager <>4__this; private <>c__DisplayClass32_0 <>8__1; private List 5__2; private bool 5__3; private List> 5__4; private int 5__5; private VGLevel 5__6; private Task 5__7; private int 5__8; object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public d__32(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>8__1 = null; 5__2 = null; 5__4 = null; 5__6 = null; 5__7 = null; <>1__state = -2; } private bool MoveNext() { //IL_0293: Unknown result type (might be due to invalid IL or missing references) //IL_029d: Expected O, but got Unknown //IL_02d5: Unknown result type (might be due to invalid IL or missing references) //IL_02da: Unknown result type (might be due to invalid IL or missing references) //IL_02de: Unknown result type (might be due to invalid IL or missing references) //IL_02e4: Invalid comparison between Unknown and I4 //IL_02eb: Unknown result type (might be due to invalid IL or missing references) //IL_02f0: Unknown result type (might be due to invalid IL or missing references) //IL_037d: Unknown result type (might be due to invalid IL or missing references) //IL_0387: Expected O, but got Unknown //IL_0305: Unknown result type (might be due to invalid IL or missing references) //IL_030a: Unknown result type (might be due to invalid IL or missing references) //IL_04c9: Unknown result type (might be due to invalid IL or missing references) //IL_04d3: Expected O, but got Unknown //IL_0317: Unknown result type (might be due to invalid IL or missing references) //IL_031c: Unknown result type (might be due to invalid IL or missing references) //IL_0281: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; ChallengeManager challengeManager = <>4__this; Item? result; switch (num) { default: return false; case 0: { <>1__state = -1; if (SingletonBase.Inst.ArcadeLevels.Count < 6) { PAM.Logger.LogError((object)$"Not enough levels loaded or downloaded, minimum [6], loaded [{SingletonBase.Inst.ArcadeLevels.Count}]"); SingletonBase.Inst.manager.ClearLoadingTasks(); SingletonBase.Inst.LoadSceneGroup("Menu"); return false; } int value = Settings.NoRepeat.Value; if (value != 4) { value *= 6; if (RecentLevels.Count > value) { RecentLevels.RemoveRange(0, RecentLevels.Count - value); } } if (RecentLevels.Count + 6 >= SingletonBase.Inst.ArcadeLevels.Count) { PAM.Logger.LogInfo((object)"Clearing out recent level list due to being full"); RecentLevels.Clear(); } string value2 = Settings.ChallengeBlacklist.Value; 5__2 = new List(SingletonBase.Inst.ArcadeLevels.Count - RecentLevels.Count); HashSet hashSet = new HashSet(RecentLevels); hashSet.UnionWith(value2.Split('/', StringSplitOptions.RemoveEmptyEntries)); foreach (VGLevel arcadeLevel in SingletonBase.Inst.ArcadeLevels) { if (!hashSet.Contains(((Object)arcadeLevel).name)) { 5__2.Add(arcadeLevel); } } if (5__2.Count < 6) { PAM.Logger.LogError((object)$"Not enough non blacklisted levels found, minimum [6], loaded [{SingletonBase.Inst.ArcadeLevels.Count}]"); SingletonBase.Inst.manager.ClearLoadingTasks(); SingletonBase.Inst.LoadSceneGroup("Menu"); return false; } 5__3 = Settings.AllowNonPublicLevels.Value; 5__4 = new List>(); 5__5 = 0; goto IL_054c; } case 1: <>1__state = -1; goto IL_02ad; case 2: <>1__state = -1; goto IL_0397; case 3: { <>1__state = -1; goto IL_04e3; } IL_0397: 5__8++; goto IL_03a9; IL_03cb: if (!Object.op_Implicit((Object)(object)5__6.AlbumArt)) { 5__4.Add(challengeManager.AlbumArtManager.LoadAlbumArtAsync(((Object)5__6).name, 5__6.BaseLevelData.LocalFolder)); } else { 5__4.Add(null); } RecentLevels.Add(((Object)5__6).name); challengeManager._levelsToVote.Add(5__6); 5__2.Remove(5__6); if (challengeManager._levelsToVote.Count >= 6) { 5__8 = 0; goto IL_0522; } goto IL_053a; IL_0522: if (5__8 < 5__4.Count) { <>8__1 = new <>c__DisplayClass32_0(); <>8__1.albumTask = 5__4[5__8]; if (<>8__1.albumTask != null) { if (!<>8__1.albumTask.IsCompleted) { <>2__current = (object)new WaitUntil((Func)(() => <>8__1.albumTask.IsCompleted)); <>1__state = 3; return true; } goto IL_04e3; } goto IL_0510; } return false; IL_03a9: if (5__8 < 316) { if (!Object.op_Implicit((Object)(object)5__6.LevelMusic)) { <>2__current = (object)new WaitForUpdate(); <>1__state = 2; return true; } goto IL_0397; } if (Object.op_Implicit((Object)(object)5__6.LevelMusic)) { goto IL_03cb; } goto IL_053a; IL_0510: 5__8++; goto IL_0522; IL_02ad: if (!5__7.IsCompleted) { <>2__current = (object)new WaitForUpdate(); <>1__state = 1; return true; } result = 5__7.Result; if (result.HasValue) { Item value3 = result.Value; if ((int)((Item)(ref value3)).Result == 1) { value3 = result.Value; if (!((Item)(ref value3)).IsPublic && !5__3) { value3 = result.Value; if (!((Item)(ref value3)).IsFriendsOnly) { value3 = result.Value; if (!((Item)(ref value3)).IsPrivate) { goto IL_053a; } } } 5__7 = null; goto IL_0331; } } goto IL_053a; IL_0331: if (!Object.op_Implicit((Object)(object)5__6.LevelMusic)) { 5__6 = SingletonBase.Inst.GetLocalCustomLevel(((Object)5__6).name); 5__8 = 0; goto IL_03a9; } goto IL_03cb; IL_053a: 5__5++; goto IL_054c; IL_04e3: challengeManager._levelsToVote[5__8].AlbumArt = <>8__1.albumTask.Result; <>8__1 = null; goto IL_0510; IL_054c: if (5__5 < 24) { 5__6 = 5__2[Random.Range(0, 5__2.Count)]; if (challengeManager._levelsToVote.Contains(5__6)) { 5__2.Remove(5__6); } else { if (!GlobalsManager.IsMultiplayer) { goto IL_0331; } if (5__6.SteamInfo != null) { 5__7 = SteamUGC.QueryFileAsync(5__6.SteamInfo.ItemID); goto IL_02ad; } } goto IL_053a; } PAM.Logger.LogError((object)"Not enough levels found in too many attempts"); SingletonBase.Inst.manager.ClearLoadingTasks(); SingletonBase.Inst.LoadSceneGroup("Menu"); 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(); } } [CompilerGenerated] private sealed class d__29 : IEnumerator, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public ChallengeManager <>4__this; object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public d__29(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_00ef: 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_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Expected O, but got Unknown //IL_0186: Unknown result type (might be due to invalid IL or missing references) //IL_0191: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; ChallengeManager challengeManager = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; <>2__current = challengeManager.PickLevelForVoting(); <>1__state = 1; return true; case 1: { <>1__state = -1; if (!Object.op_Implicit((Object)(object)challengeManager._levelsToVote[0])) { PAM.Logger.LogFatal((object)"client asked for level id not in the picked challenge levels"); } foreach (VGPlayerData player in SingletonBase.Inst.players) { if (Object.op_Implicit((Object)(object)player.PlayerObject)) { Object.Destroy((Object)(object)((Component)player.PlayerObject).gameObject); player.PlayerObject = null; } } if (SingletonBase.Inst.players.Count == 0) { SingletonBase.Inst.players.Add(new VGPlayerData { PlayerID = 0, ControllerID = 0 }); } SingletonBase.Inst.SpawnPlayers(Vector2.zero, (Action)delegate { }, (Action)delegate { }, (Action)delegate { }, 3); foreach (VGPlayerData player2 in SingletonBase.Inst.players) { player2.PlayerObject.SetColor(challengeManager.ChallengeTheme.GetPlayerColor(player2.PlayerID), challengeManager.ChallengeTheme.guiAccent); } ((MonoBehaviour)challengeManager).StartCoroutine(challengeManager.ShowLevels()); Transform obj = ((Component)SingletonBase.Inst).transform.Find("Pause Menu"); Transform val = ((obj != null) ? obj.Find("Skip Queue Level") : null); if (Object.op_Implicit((Object)(object)val)) { ((Component)val).gameObject.SetActive(false); } 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(); } } [CompilerGenerated] private sealed class d__47 : IEnumerator, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public ChallengeManager <>4__this; private <>c__DisplayClass47_0 <>8__1; private Vector3 5__2; private VGLevel 5__3; private int 5__4; object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public d__47(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>8__1 = null; 5__3 = null; <>1__state = -2; } private bool MoveNext() { //IL_0202: Unknown result type (might be due to invalid IL or missing references) //IL_020d: Unknown result type (might be due to invalid IL or missing references) //IL_0217: Expected O, but got Unknown //IL_0291: Unknown result type (might be due to invalid IL or missing references) //IL_029b: Expected O, but got Unknown //IL_012e: Unknown result type (might be due to invalid IL or missing references) //IL_0138: Expected O, but got Unknown //IL_01bb: Unknown result type (might be due to invalid IL or missing references) //IL_01c0: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; ChallengeManager challengeManager = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; <>8__1 = new <>c__DisplayClass47_0(); <>8__1.timeSinceLastButton = Time.realtimeSinceStartupAsDouble; 5__4 = 0; goto IL_015a; case 1: <>1__state = -1; 5__4++; goto IL_015a; case 2: <>1__state = -1; if (!(<>8__1.timeSinceLastButton > Time.realtimeSinceStartupAsDouble)) { TweenExtensions.Play(challengeManager._sequence); if (GlobalsManager.IsMultiplayer && !GlobalsManager.IsHosting) { return false; } 5__3 = challengeManager.PickLevel(); if (!Object.op_Implicit((Object)(object)5__3)) { SingletonBase.Inst.LoadSceneGroup("Menu"); return false; } challengeManager.SetVoteWinner(5__3); <>2__current = (object)new WaitForSecondsRealtime(1.5f); <>1__state = 3; return true; } goto IL_01c5; case 3: { <>1__state = -1; GlobalsManager.LevelId = ((object)(PublishedFileId)(ref 5__3.SteamInfo.ItemID)).ToString(); SingletonBase.Inst.CurrentArcadeLevel = 5__3; GlobalsManager.IsReloadingLobby = true; foreach (VGPlayerData player in SingletonBase.Inst.players) { if (Object.op_Implicit((Object)(object)player.PlayerObject)) { Object.Destroy((Object)(object)((Component)player.PlayerObject).gameObject); player.PlayerObject = null; } } SingletonBase.Inst.LoadSceneGroup("Arcade_Level"); return false; } IL_01c5: 5__2.y = (float)(1.0 - (<>8__1.timeSinceLastButton - Time.realtimeSinceStartupAsDouble) / 5.0); ((Transform)((Graphic)challengeManager._bgSlider).rectTransform).localScale = 5__2; <>2__current = (object)new WaitForUpdate(); <>1__state = 2; return true; IL_015a: if (5__4 < 6) { VGLevel val = challengeManager._levelsToVote[5__4]; VoterCell voterCell = challengeManager._levelButtons[5__4]; voterCell.SetLevelData(val); voterCell.Show(); if (Object.op_Implicit((Object)(object)val.LevelMusic)) { SingletonBase.Inst.PlayMusic(val.LevelMusic, true); } if (val.LevelMusic.length > 5f) { SingletonBase.Inst.musicSources[SingletonBase.Inst.activeSource].time = val.LevelMusic.length / 2f; } <>8__1.timeSinceLastButton += 2.5; <>2__current = (object)new WaitUntil((Func)(() => <>8__1.timeSinceLastButton <= Time.realtimeSinceStartupAsDouble)); <>1__state = 1; return true; } <>8__1.timeSinceLastButton += 5.0; foreach (VoterCell levelButton in challengeManager._levelButtons) { levelButton.EnableVoting(); } 5__2 = Vector3.one; goto IL_01c5; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } public static readonly List RecentLevels = new List(); public Transform playersParent; private readonly List _levelButtons = new List(6); private readonly List _levelsToVote = new List(6); private readonly Dictionary _loadedLevels = new Dictionary(6); private readonly Dictionary _votes = new Dictionary(16); private readonly ConcurrentDictionary> _songData = new ConcurrentDictionary>(); private Image _bgSlider; private Sequence _sequence = DOTween.Sequence(); private bool _votingStarted; public AlbumArtManager AlbumArtManager = new AlbumArtManager(240, 3, 512, 5, 25); private static readonly List AudioDataBuffer = new List(400000); private static ulong _lastId; public static ChallengeManager Inst { get; private set; } public int ColorID { get; private set; } public BeatmapTheme ChallengeTheme { get; private set; } public event OnVoteChangedSignature OnVoteChanged; private void Awake() { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Expected O, but got Unknown //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_0152: Unknown result type (might be due to invalid IL or missing references) //IL_0164: Unknown result type (might be due to invalid IL or missing references) //IL_0169: Unknown result type (might be due to invalid IL or missing references) //IL_0176: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)Inst)) { Object.Destroy((Object)(object)this); return; } Inst = this; ColorID = Shader.PropertyToID("_BaseColor"); ChallengeTheme = new BeatmapTheme(); ChallengeTheme.guiAccent = Color.white; ChallengeTheme.playerColors.Add(new Color(0.98f, 0.361f, 0.4f)); ChallengeTheme.playerColors.Add(new Color(0.361f, 0.545f, 0.98f)); ChallengeTheme.playerColors.Add(new Color(0.024f, 0.839f, 0.626f)); ChallengeTheme.playerColors.Add(new Color(1f, 0.82f, 0.4f)); SingletonBase.Inst.foregroundCamera.orthographicSize = 20f; SingletonBase.Inst.backgroundCamera.orthographicSize = 20f; SingletonBase.Inst.CamerasRoot.position = Vector3.zero; Transform transform = GameObject.Find("Voter/Canvas/Cells").transform; _bgSlider = GameObject.Find("Voter/Canvas/BGBar").GetComponent(); RectTransform rectTransform = ((Graphic)_bgSlider).rectTransform; Vector3 one = Vector3.one; one.y = 0f; ((Transform)rectTransform).localScale = one; Image bgSlider = _bgSlider; Color color = ((Graphic)_bgSlider).color; color.a = 0.08f; ((Graphic)bgSlider).color = color; TweenSettingsExtensions.Append(_sequence, (Tween)(object)TweenSettingsExtensions.SetEase>(DOTween.ToAlpha((DOGetter)(() => ((Graphic)_bgSlider).color), (DOSetter)delegate(Color x) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) ((Graphic)_bgSlider).color = x; }, 0.15f, 0.05f), (Ease)18)); TweenSettingsExtensions.Append(_sequence, (Tween)(object)TweenSettingsExtensions.SetEase>(DOTween.ToAlpha((DOGetter)(() => ((Graphic)_bgSlider).color), (DOSetter)delegate(Color x) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) ((Graphic)_bgSlider).color = x; }, 0f, 1.4f), (Ease)2)); TweenExtensions.Pause(_sequence); for (int i = 0; i < transform.childCount; i++) { _levelButtons.Add(((Component)transform.GetChild(i)).gameObject.AddComponent()); } if (GlobalsManager.IsMultiplayer) { SingletonBase.Inst.LockPlayerAdding(false); ((MonoBehaviour)this).StartCoroutine(InitMultiplayer()); return; } if (Object.op_Implicit((Object)(object)MultiplayerDiscordManager.Instance)) { MultiplayerDiscordManager.Instance.SetChallengePresence(); } ((MonoBehaviour)this).StartCoroutine(PostAwake()); } [IteratorStateMachine(typeof(d__29))] private IEnumerator PostAwake() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__29(0) { <>4__this = this }; } private void Start() { //IL_0037: Unknown result type (might be due to invalid IL or missing references) SingletonBase.Inst.UpdateChroma(0.1f); SingletonBase.Inst.UpdateBloom(1f, 0.1f); SingletonBase.Inst.UpdateLensDistort(0.25f, new Vector2(0.5f, 0.5f)); } private void OnDestroy() { if (!GlobalsManager.IsReloadingLobby) { MultiplayerDiscordManager.Instance.SetMenuPresence(); GlobalsManager.IsChallenge = false; } foreach (VGPlayerData player in SingletonBase.Inst.players) { if (Object.op_Implicit((Object)(object)player.PlayerObject)) { Object.Destroy((Object)(object)((Component)player.PlayerObject).gameObject); player.PlayerObject = null; } } AlbumArtManager.Dispose(false); } [IteratorStateMachine(typeof(d__32))] private IEnumerator PickLevelForVoting() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__32(0) { <>4__this = this }; } private VGLevel PickLevel() { VGLevel result = _levelsToVote[0]; List list = new List(); int num = 0; Dictionary dictionary = new Dictionary(); foreach (KeyValuePair vote in _votes) { dictionary.TryAdd(vote.Value, 0); int num2 = ++dictionary[vote.Value]; if (num2 > num) { list.Clear(); list.Add(vote.Value); num = num2; } else if (num2 == num) { list.Add(vote.Value); } } if (list.Count > 0) { result = list[Random.Range(0, list.Count)]; } return result; } private void StartVoting() { SpawnPlayers_Multiplayer(); ((MonoBehaviour)this).StartCoroutine(ShowLevels()); } private void StartVoting_Client() { if (_levelsToVote.Count >= 6 && CheckAllLevelsReady(setLoaded: false)) { _votingStarted = true; SteamLobbyManager.Inst.UnloadAll(); StartVoting(); } } [MultiRpc(/*Could not decode attribute arguments.*/)] private static void Multi_StartVoting() { if (!GlobalsManager.IsHosting) { Inst?.StartVoting_Client(); } } public void PlayerVote(VGPlayer player, VGLevel level) { _votes[player] = level; this.OnVoteChanged?.Invoke(level); } public void PlayerVote(ulong player, ulong level) { VGPlayer val = GlobalsManager.Players[player].VGPlayerData?.PlayerObject; if (Object.op_Implicit((Object)(object)val)) { VGLevel val2 = _levelsToVote.Find((VGLevel x) => x.SteamInfo.ItemID == PublishedFileId.op_Implicit(level)); if ((Object)(object)val2 != (Object)null) { _votes[val] = val2; } } } public void SetVoteWinner(ulong level) { //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0070: 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) foreach (VoterCell levelButton in _levelButtons) { PublishedFileId? val = levelButton?.Level?.SteamInfo?.ItemID; PublishedFileId val2 = PublishedFileId.op_Implicit(level); if (!val.HasValue || val.GetValueOrDefault() != val2) { levelButton?.Hide(); } } } private void SetVoteWinner(VGLevel level) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) if (GlobalsManager.IsMultiplayer) { CallRpc_Multi_VoteWinner(PublishedFileId.op_Implicit(level.SteamInfo.ItemID)); return; } foreach (VoterCell levelButton in _levelButtons) { if ((Object)(object)levelButton.Level != (Object)(object)level) { levelButton.Hide(); } } } [MultiRpc(/*Could not decode attribute arguments.*/)] private static void Multi_VoteWinner(ulong level) { Inst?.SetVoteWinner(level); } public async void CreateLevelEntry(ulong id, int index) { _ = 1; try { VGLevel level2 = SingletonBase.Inst.GetLocalCustomLevel(id.ToString()); if (Object.op_Implicit((Object)(object)level2)) { if (!_levelsToVote.Contains(level2)) { _levelsToVote.Add(level2); VGLevel val = level2; val.AlbumArt = await AlbumArtManager.LoadAlbumArtAsync(((Object)level2).name, level2.BaseLevelData.LocalFolder); _loadedLevels[level2] = new LoadState(audio: true, image: true); } CheckAllLevelsReady(); return; } level2 = new VGLevel { SteamInfo = new SteamData { ItemID = PublishedFileId.op_Implicit(id) } }; _levelsToVote.Add(level2); _loadedLevels.TryAdd(level2, new LoadState()); Item? val2 = await SteamUGC.QueryFileAsync(PublishedFileId.op_Implicit(id)); if (val2.HasValue) { Item value = val2.Value; if ((int)((Item)(ref value)).Result == 1) { VGLevel obj = level2; value = val2.Value; obj.TrackName = ((Item)(ref value)).Title; level2.ArtistName = "Artist"; ChallengeManager challengeManager = this; ChallengeManager challengeManager2 = this; VGLevel level3 = level2; value = val2.Value; ((MonoBehaviour)challengeManager).StartCoroutine(challengeManager2.GetImageFromWorkshop(level3, ((Item)(ref value)).PreviewImageUrl)); return; } } PAM.Logger.LogError((object)$"Failed to get workshop data for level id [{id}]"); GlobalsManager.IsReloadingLobby = false; if (!GlobalsManager.IsHosting) { SteamManager.Inst.EndClient(); } ErrorScreen.CreateErrorScreen($"Host tried to send level {id} which is not available on workshop, disconnecting..."); SingletonBase.Inst.manager.ClearLoadingTasks(); SingletonBase.Inst.LoadSceneGroup("Menu"); } catch (Exception arg) { PAM.Logger.LogError((object)$"Error Creating Level Entry\n{arg}"); } } private bool GetVGLevel(ulong levelId, out Tuple songData) { return _songData.TryGetValue(levelId, out songData); } [IteratorStateMachine(typeof(d__44))] private IEnumerator GetImageFromWorkshop(VGLevel level, string url) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__44(0) { <>4__this = this, level = level, url = url }; } [IteratorStateMachine(typeof(d__45))] private IEnumerator GetSongData(VGLevel level) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__45(0) { <>4__this = this, level = level }; } public void SetLevelSong(ulong id, AudioClip clip) { VGLevel val = _levelsToVote.Find((VGLevel x) => x.SteamInfo.ItemID == PublishedFileId.op_Implicit(id)); if (Object.op_Implicit((Object)(object)val)) { val.LevelMusic = clip; _loadedLevels[val].AudioLoaded = true; } CheckAllLevelsReady(); } [IteratorStateMachine(typeof(d__47))] private IEnumerator ShowLevels() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__47(0) { <>4__this = this }; } [IteratorStateMachine(typeof(d__48))] private IEnumerator InitMultiplayer() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__48(0) { <>4__this = this }; } [MultiRpc(/*Could not decode attribute arguments.*/)] private static void Multi_CheckLevelIds(List levelIds) { if (!GlobalsManager.IsHosting) { ChallengeManager inst = Inst; if (inst != null) { ((MonoBehaviour)inst).StartCoroutine(CheckLevelIds(levelIds)); } } } [IteratorStateMachine(typeof(d__50))] private static IEnumerator CheckLevelIds(List levelIds) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__50(0) { levelIds = levelIds }; } [ServerRpc(/*Could not decode attribute arguments.*/)] private static void Server_UnknownLevelIds(ClientNetworkConnection conn, List levelIds) { if (!Object.op_Implicit((Object)(object)Inst)) { return; } PAM.Logger.LogInfo((object)$"Client [{((NetworkConnection)conn).Address}] has asked for [{levelIds.Count}] levels"); foreach (ulong levelId in levelIds) { if (!Inst.GetVGLevel(levelId, out var songData)) { PAM.Logger.LogFatal((object)"client asked for level id not in the picked challenge levels"); continue; } int i; for (i = 0; i + 131000 < songData.Item1.Length; i += 131001) { CallRpc_Client_AudioData(songData: new ArraySegment(songData.Item1, i, 131000), target: conn, audioID: levelId, frequency: songData.Item2, channels: songData.Item3, last: false); } CallRpc_Client_AudioData(songData: new ArraySegment(songData.Item1, i, Mathf.FloorToInt((float)(songData.Item1.Length - i))), target: conn, audioID: levelId, frequency: songData.Item2, channels: songData.Item3, last: true); } } [ClientRpc(/*Could not decode attribute arguments.*/)] private static void Client_AudioData(ulong audioID, int frequency, int channels, Span songData, bool last) { PAM.Logger.LogInfo((object)"Received audio data"); if (audioID != _lastId) { _lastId = audioID; AudioDataBuffer.Clear(); } Span span = songData; for (int i = 0; i < span.Length; i++) { short num = span[i]; AudioDataBuffer.Add((float)num / 32767f); } if (last) { PAM.Logger.LogInfo((object)$"Got all audio data for level [{audioID}]"); AudioClip val = AudioClip.Create(audioID.ToString(), AudioDataBuffer.Count / channels, channels, frequency, false); val.SetData(AudioDataBuffer.ToArray(), 0); val.LoadAudioData(); AudioDataBuffer.Clear(); if (Object.op_Implicit((Object)(object)Inst)) { Inst.SetLevelSong(audioID, val); } } } private void SpawnPlayers_Multiplayer() { //IL_01d5: Unknown result type (might be due to invalid IL or missing references) //IL_0119: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: 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_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Expected O, but got Unknown //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_0272: Unknown result type (might be due to invalid IL or missing references) //IL_027d: Unknown result type (might be due to invalid IL or missing references) foreach (VGPlayerData player in SingletonBase.Inst.players) { if (player.PlayerObject.IsValidPlayer()) { player.PlayerObject.PlayerDeath(0f); } } SingletonBase.Inst.players.Clear(); if (GlobalsManager.IsHosting) { bool flag = false; foreach (KeyValuePair player2 in GlobalsManager.Players) { SingletonBase.Inst.players.Add(player2.Value.VGPlayerData); if (player2.Value.VGPlayerData.PlayerID == 0) { flag = true; } } if (!flag) { VGPlayerData val = new VGPlayerData { PlayerID = 0, ControllerID = 0 }; SingletonBase.Inst.players.Add(val); GlobalsManager.Players.TryAdd(SteamId.op_Implicit(GlobalsManager.LocalPlayerId), new PlayerData(val, SteamClient.Name)); } SingletonBase.Inst.SpawnPlayers(Vector2.zero, (Action)delegate { }, (Action)delegate { }, (Action)delegate { }, 3); } else { foreach (KeyValuePair player3 in GlobalsManager.Players) { SingletonBase.Inst.players.Add(player3.Value.VGPlayerData); } SingletonBase.Inst.SpawnPlayers(Vector2.zero, (Action)delegate { }, (Action)delegate { }, (Action)delegate { }, 3); } foreach (VGPlayerData player4 in SingletonBase.Inst.players) { VGPlayer playerObject = player4.PlayerObject; if (playerObject != null) { playerObject.SetColor(ChallengeTheme.GetPlayerColor(player4.PlayerID), ChallengeTheme.guiAccent); } } } private void AddLoadingScreenTasks() { if (GlobalsManager.IsHosting) { SingletonBase.Inst.manager.AddToLoadingTasks("Creating Lobby", Task.Run(async delegate { while (!SteamLobbyManager.Inst.InLobby) { await Task.Delay(100); } }), (string)null, (string)null, (Func)null); SingletonBase.Inst.manager.AddToLoadingTasks("Setting up chosen levels", Task.Run(async delegate { while (_songData.Count < 6) { await Task.Delay(100); } }), "[ Prepping ] 0/6", (string)null, (Func)null); SingletonBase.Inst.manager.AddToLoadingTasks("Waiting other players", Task.Run(async delegate { while (!SteamLobbyManager.Inst.InLobby || !SteamLobbyManager.Inst.IsEveryoneLoaded) { await Task.Delay(100); } }), (string)null, (string)null, (Func)(() => $"[ Waiting ] {SteamLobbyManager.Inst.LoadedPlayerCount()}/{((GlobalsManager.Players.Count == 0) ? 1 : GlobalsManager.Players.Count)}")); return; } SingletonBase.Inst.manager.AddToLoadingTasks("Setting up chosen levels", Task.Run(async delegate { while (!_votingStarted) { await Task.Delay(100); } }), "[ Prepping ] 0/6", (string)null, (Func)null); SingletonBase.Inst.manager.AddToLoadingTasks("Waiting other players", Task.Run(async delegate { while (!_votingStarted) { await Task.Delay(100); } }), (string)null, (string)null, (Func)(() => $"[ Waiting ] {SteamLobbyManager.Inst.LoadedPlayerCount()}/{GlobalsManager.Players.Count}")); } private bool CheckAllLevelsReady(bool setLoaded = true) { int num = _loadedLevels.Values.Count((LoadState x) => x.Loaded); if (num < 6) { SceneLoader inst = SingletonBase.Inst; if (inst != null) { SceneGroupManager manager = inst.manager; if (manager != null) { manager.UpdateTaskStatus("Setting up chosen levels", $"[ Prepping ] {num}/6"); } } return false; } SceneLoader inst2 = SingletonBase.Inst; if (inst2 != null) { SceneGroupManager manager2 = inst2.manager; if (manager2 != null) { manager2.ResetTaskStatus("Setting up chosen levels"); } } if (setLoaded) { ((Lobby)(ref SteamLobbyManager.Inst.CurrentLobby)).SetMemberData("IsLoaded", "1"); } return true; } private static void CallRpc_Server_UnknownLevelIds(List levelIds) { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Expected O, but got Unknown if (NetworkManager.Instance == null) { return; } if (NetworkManager.Instance.PeerServer) { Server_UnknownLevelIds(NetworkManager.Instance.ServerSelfPeerConnection, levelIds); return; } NetworkWriter val = new NetworkWriter(); try { NetWriterExtensions.Write(val, (ushort)34771); val.WriteUlongs(levelIds); NetworkManager.Instance.SendToServer(val.GetData(), (SendType)0); } finally { ((IDisposable)val)?.Dispose(); } } public static void Deserialize_Server_UnknownLevelIds_34771(ClientNetworkConnection senderConn, NetworkReader reader) { Server_UnknownLevelIds(senderConn, reader.ReadUlongs()); } private static void CallRpc_Client_AudioData(ClientNetworkConnection target, ulong audioID, int frequency, int channels, Span songData, bool last) { //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Expected O, but got Unknown if (NetworkManager.Instance == null) { return; } if (NetworkManager.Instance.PeerServer && target == NetworkManager.Instance.ServerSelfPeerConnection) { Client_AudioData(audioID, frequency, channels, songData, last); return; } NetworkWriter val = new NetworkWriter(); try { NetWriterExtensions.Write(val, (ushort)56878); NetWriterExtensions.Write(val, audioID); NetWriterExtensions.Write(val, frequency); NetWriterExtensions.Write(val, channels); val.WriteSongData(songData); NetWriterExtensions.Write(val, last); NetworkManager.Instance.SendToClient(target, val.GetData(), (SendType)0); } finally { ((IDisposable)val)?.Dispose(); } } public static void Deserialize_Client_AudioData_56878(ClientNetworkConnection senderConn, NetworkReader reader) { Client_AudioData(NetReaderExtensions.ReadUInt64(reader), NetReaderExtensions.ReadInt32(reader), NetReaderExtensions.ReadInt32(reader), reader.ReadSongData(), NetReaderExtensions.ReadBoolean(reader)); } private static void CallRpc_Multi_StartVoting() { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Expected O, but got Unknown if (NetworkManager.Instance == null) { return; } if (NetworkManager.Instance.PeerServer) { Multi_StartVoting(); } NetworkWriter val = new NetworkWriter(); try { NetWriterExtensions.Write(val, (ushort)65375); NetworkManager.Instance.SendToAllClients(val.GetData(), (SendType)0); } finally { ((IDisposable)val)?.Dispose(); } } public static void Deserialize_Multi_StartVoting_65375(ClientNetworkConnection senderConn, NetworkReader reader) { Multi_StartVoting(); } private static void CallRpc_Multi_VoteWinner(ulong level) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown if (NetworkManager.Instance == null) { return; } if (NetworkManager.Instance.PeerServer) { Multi_VoteWinner(level); } NetworkWriter val = new NetworkWriter(); try { NetWriterExtensions.Write(val, (ushort)27550); NetWriterExtensions.Write(val, level); NetworkManager.Instance.SendToAllClients(val.GetData(), (SendType)0); } finally { ((IDisposable)val)?.Dispose(); } } public static void Deserialize_Multi_VoteWinner_27550(ClientNetworkConnection senderConn, NetworkReader reader) { Multi_VoteWinner(NetReaderExtensions.ReadUInt64(reader)); } private static void CallRpc_Multi_CheckLevelIds(List levelIds) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown if (NetworkManager.Instance == null) { return; } if (NetworkManager.Instance.PeerServer) { Multi_CheckLevelIds(levelIds); } NetworkWriter val = new NetworkWriter(); try { NetWriterExtensions.Write(val, (ushort)47253); val.WriteUlongs(levelIds); NetworkManager.Instance.SendToAllClients(val.GetData(), (SendType)0); } finally { ((IDisposable)val)?.Dispose(); } } public static void Deserialize_Multi_CheckLevelIds_47253(ClientNetworkConnection senderConn, NetworkReader reader) { Multi_CheckLevelIds(reader.ReadUlongs()); } } public class VoterCell : MonoBehaviour { private GhostUIElement _ghostUIElement; private Image _border; private int _playerCounter; private bool _isSelected; public VGLevel Level { get; private set; } private void Awake() { _ghostUIElement = ((Component)this).GetComponent(); ((UIElement)_ghostUIElement).HideInstant(); _border = ((Component)this).GetComponent(); ChallengeManager.Inst.OnVoteChanged += OnVoteChanged; } private void OnVoteChanged(VGLevel newlevel) { if ((Object)(object)newlevel != (Object)(object)Level) { SetSelected(selected: false); } } public void Show() { ((UIElement)_ghostUIElement).Show((Action)null); } public void Hide() { ((UIElement)_ghostUIElement).Hide((Action)null); ((Behaviour)((Component)this).gameObject.GetComponent()).enabled = false; } public void SetLevelData(VGLevel level) { Level = level; if (Object.op_Implicit((Object)(object)level.AlbumArt)) { ((Component)((Component)this).transform.GetChild(1).GetChild(0)).GetComponent().sprite = level.AlbumArt; } SingletonBase.Inst.RefreshTextCache(((Component)((Component)this).transform.GetChild(2)).GetComponent(), level.TrackName); SingletonBase.Inst.RefreshTextCache(((Component)((Component)this).transform.GetChild(3)).GetComponent(), level.ArtistName); } public void EnableVoting() { ((Behaviour)((Component)this).gameObject.GetComponent()).enabled = true; } private void OnTriggerEnter2D(Collider2D other) { //IL_011e: Unknown result type (might be due to invalid IL or missing references) VGPlayer component = ((Component)((Component)other).transform.parent.parent).gameObject.GetComponent(); if (!Object.op_Implicit((Object)(object)component) || (GlobalsManager.IsMultiplayer && !component.IsLocalPlayer())) { return; } if (_playerCounter == 0) { SetSelected(selected: true); if ((Object)(object)SingletonBase.Inst.CurrentAudioClip != (Object)(object)Level.LevelMusic) { SingletonBase.Inst.PlayMusic(Level.LevelMusic, true); if (Level.PreviewStart <= 0f) { SingletonBase.Inst.musicSources[SingletonBase.Inst.activeSource].time = Level.LevelMusic.length / 2f; } else { SingletonBase.Inst.musicSources[SingletonBase.Inst.activeSource].time = Level.PreviewStart; } } } _playerCounter++; if (!GlobalsManager.IsMultiplayer || GlobalsManager.IsHosting) { ChallengeManager.Inst.PlayerVote(component, Level); } else { CallRpc_Server_LevelVoted(PublishedFileId.op_Implicit(Level.SteamInfo.ItemID)); } } private void OnTriggerExit2D(Collider2D other) { VGPlayer component = ((Component)((Component)other).transform.parent.parent).gameObject.GetComponent(); if (Object.op_Implicit((Object)(object)component) && (!GlobalsManager.IsMultiplayer || component.IsLocalPlayer())) { _playerCounter--; if (_playerCounter <= 0) { _playerCounter = 0; SetSelected(selected: false); } } } public void SetSelected(bool selected) { //IL_0037: 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_003c: 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) if (selected != _isSelected) { _isSelected = selected; ((UIElement)_ghostUIElement).Stutter(false, (Action)null); Color color = (Color)(selected ? new Color(1f, 0.815f, 0f) : Color.white); ((Graphic)_border).color = color; } } [ServerRpc(/*Could not decode attribute arguments.*/)] private static void Server_LevelVoted(ClientNetworkConnection conn, ulong level) { //IL_001c: Unknown result type (might be due to invalid IL or missing references) if (conn.TryGetSteamId(out var steamId) && Object.op_Implicit((Object)(object)ChallengeManager.Inst)) { ChallengeManager.Inst.PlayerVote(SteamId.op_Implicit(steamId), level); } } private static void CallRpc_Server_LevelVoted(ulong level) { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Expected O, but got Unknown if (NetworkManager.Instance == null) { return; } if (NetworkManager.Instance.PeerServer) { Server_LevelVoted(NetworkManager.Instance.ServerSelfPeerConnection, level); return; } NetworkWriter val = new NetworkWriter(); try { NetWriterExtensions.Write(val, (ushort)7811); NetWriterExtensions.Write(val, level); NetworkManager.Instance.SendToServer(val.GetData(), (SendType)0); } finally { ((IDisposable)val)?.Dispose(); } } public static void Deserialize_Server_LevelVoted_7811(ClientNetworkConnection senderConn, NetworkReader reader) { Server_LevelVoted(senderConn, NetReaderExtensions.ReadUInt64(reader)); } } public struct PlayerData { public string Name; public VGPlayerData VGPlayerData; public PlayerData(VGPlayerData vgPlayerData, string name) { Name = name; VGPlayerData = vgPlayerData; } public void SetName(string name) { Name = name; } } public struct HitInfo { public ulong Id; public bool All; public int Health; public int Checkpoint; public HitInfo(ulong id, int health, int checkpoint, bool all = false) { Id = id; All = all; Health = health; Checkpoint = checkpoint; } } public static class GlobalsManager { public static SteamId LocalPlayerId; public static int LocalPlayerObjectId; public static readonly Dictionary Players = new Dictionary(); public static readonly Dictionary ConnIdToSteamId = new Dictionary(); public static List Queue = new List(); public static string LevelId; public static bool IsMultiplayer = false; public static bool IsHosting = false; public static SteamLobbyManager.LobbyState LobbyState; public static bool HasLoadedExternalInfo; public static bool HasLoadedBasePlayerIds; public static bool HasLoadedMidLobbyInfo = true; public static bool HasLoadedMainLobbyInfo = true; public static bool IsReloadingLobby = false; public static bool HasStarted = false; public static bool IsDownloading = false; public static bool IsChallenge = false; public static bool JoinedMidLevel = false; public static readonly List HitsQueue = new List(); public static VGPlayer LocalPlayerObj => Players[SteamId.op_Implicit(LocalPlayerId)].VGPlayerData?.PlayerObject; public static bool HasLoadedAllInfo { get { if (HasLoadedExternalInfo) { return HasLoadedBasePlayerIds; } return false; } } public static bool HasLoadedAllLobbyInfo { get { if (HasLoadedMainLobbyInfo) { return HasLoadedMidLobbyInfo; } return false; } } public static List GetQueueLevelNames() { List list = new List(); for (int i = 0; i < Queue.Count; i++) { if (i > 9 && Queue.Count != 11) { list.Add($"+{Queue.Count - i} Levels"); break; } VGLevel localCustomLevel = SingletonBase.Inst.GetLocalCustomLevel(Queue[i]); list.Add(localCustomLevel.TrackName); } return list; } } public class LobbyCreationManager : MonoBehaviour { public UI_Menu LobbyCreationMenu; private bool _isChallenge; public static LobbyCreationManager Instance { get; private set; } public bool IsPrivate { get; private set; } public int PlayerCount { get; set; } = 16; public Action FallbackAction { get; set; } public Selectable FallbackUIElement { get; set; } private void Awake() { //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Expected O, but got Unknown //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Expected O, but got Unknown //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Expected O, but got Unknown if ((Object)(object)Instance != (Object)null) { Object.Destroy((Object)(object)this); return; } Instance = this; LobbyCreationMenu = ((Component)this).gameObject.GetComponent(); ((UnityEvent)(object)((Toggle)((Component)((Component)this).transform.Find("Pause Menu/Private")).GetComponent()).onValueChanged).AddListener((UnityAction)delegate(bool x) { IsPrivate = x; }); ((Component)((Component)this).transform.Find("Pause Menu/PlayerCount")).GetComponent().OnValueChanged.AddListener((UnityAction)delegate(float x) { PlayerCount = 16 - (int)x * 4; }); ((UnityEvent)((Button)((Component)((Component)this).transform.Find("Pause Menu/StartLobby")).GetComponent()).onClick).AddListener((UnityAction)delegate { //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) GlobalsManager.IsHosting = true; GlobalsManager.IsMultiplayer = true; if (_isChallenge) { GlobalsManager.IsChallenge = true; LobbyCreationMenu.HideAllInstant(); SingletonBase.Inst.LoadSceneGroup("Challenge"); } else { PublishedFileId itemID = SingletonBase.Inst.CurrentArcadeLevel.SteamInfo.ItemID; if (!GlobalsManager.Queue.Contains(((object)(PublishedFileId)(ref itemID)).ToString())) { GlobalsManager.Queue.Add(((object)(PublishedFileId)(ref itemID)).ToString()); } SingletonBase.Inst.CurrentArcadeLevel = SingletonBase.Inst.GetLocalCustomLevel(GlobalsManager.Queue[0]); LobbyCreationMenu.HideAllInstant(); SingletonBase.Inst.LoadSceneGroup("Arcade_Level"); } }); MultiElementButton component = ((Component)((Component)this).transform.Find("Pause Menu/Return to Customs")).GetComponent(); ((Button)component).onClick = new ButtonClickedEvent(); ((UnityEvent)((Button)component).onClick).AddListener(new UnityAction(CloseMenu)); } public void OpenMenu(bool bIsChallange) { _isChallenge = bIsChallange; LobbyCreationMenu.ShowBase(); LobbyCreationMenu.SwapView("main"); SingletonBase.Inst.SetUIVolumeWeightIn(0.2f); } public void CloseMenu() { LobbyCreationMenu.HideAll(); if (Object.op_Implicit((Object)(object)FallbackUIElement)) { FallbackUIElement.Select(); } if (FallbackAction != null) { FallbackAction(); } } } public class LobbyScreenManager : MonoBehaviour { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static UnityAction <>9__11_0; internal void b__11_0() { SingletonBase.Inst.LoadSceneGroup("Arcade"); } } [CompilerGenerated] private sealed class d__13 : IEnumerator, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public LobbyScreenManager <>4__this; object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public d__13(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Expected O, but got Unknown int num = <>1__state; LobbyScreenManager lobbyScreenManager = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; <>2__current = (object)new WaitForUpdate(); <>1__state = 1; return true; case 1: <>1__state = -1; lobbyScreenManager.LobbyMenu.ShowBase(); lobbyScreenManager.LobbyMenu.SwapView("main"); SingletonBase.Inst.SetUIVolumeWeightIn(0.2f); if (GlobalsManager.IsHosting) { ((Selectable)lobbyScreenManager.ResumeButton).Select(); } else { ((Selectable)lobbyScreenManager.QuitButton).Select(); } 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(); } } public static Dictionary SpecialColors = new Dictionary(); public UI_Menu LobbyMenu; private readonly Dictionary _playerList = new Dictionary(); private Transform _playersList; private Transform _queueList; private MultiElementButton ResumeButton; private MultiElementButton QuitButton; public static LobbyScreenManager Instance { get; private set; } private void Awake() { //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Expected O, but got Unknown //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Expected O, but got Unknown //IL_011e: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Unknown result type (might be due to invalid IL or missing references) //IL_014f: Unknown result type (might be due to invalid IL or missing references) Instance = this; SingletonBase.Inst.ShowCursor(); Transform parent = ((Component)SingletonBase.Inst).transform.parent; GameObject val = Object.Instantiate(PAM.LobbyScreenPrefab, ((Component)parent).transform); ((Object)val).name = "PAM_Lobby"; LobbyMenu = val.GetComponent(); _playersList = val.transform.Find("PlayersList"); _queueList = val.transform.Find("QueueList"); Transform val2 = val.transform.Find("Pause Menu"); ResumeButton = ((Component)val2.GetChild(0)).GetComponent(); ((UnityEvent)((Button)ResumeButton).onClick).AddListener(new UnityAction(SingletonBase.Inst.UnPause)); QuitButton = ((Component)val2.GetChild(1)).GetComponent(); ButtonClickedEvent onClick = ((Button)QuitButton).onClick; object obj = <>c.<>9__11_0; if (obj == null) { UnityAction val3 = delegate { SingletonBase.Inst.LoadSceneGroup("Arcade"); }; <>c.<>9__11_0 = val3; obj = (object)val3; } ((UnityEvent)onClick).AddListener((UnityAction)obj); if (!GlobalsManager.IsHosting) { SetButtonActive(active: false); } foreach (Friend member in ((Lobby)(ref SteamLobbyManager.Inst.CurrentLobby)).Members) { Friend current = member; AddPlayerToLobby(current.Id, ((Friend)(ref current)).Name); if (SteamLobbyManager.Inst.IsPlayerLoaded(current.Id)) { SetPlayerLoaded(current.Id, playSound: false); } } UpdateQueue(); } private void Start() { ((MonoBehaviour)this).StartCoroutine(ShowLobby()); } [IteratorStateMachine(typeof(d__13))] private IEnumerator ShowLobby() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__13(0) { <>4__this = this }; } private void OnDestroy() { if (Object.op_Implicit((Object)(object)LobbyMenu)) { LobbyMenu.HideAll(); Object.Destroy((Object)(object)((Component)LobbyMenu).gameObject); } } public void AddPlayerToLobby(SteamId player, string playerName) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) if (_playerList.ContainsKey(SteamId.op_Implicit(player))) { return; } Transform transform = Object.Instantiate(PAM.LobbyPlayerEntryPrefab, ((Component)_playersList).transform).transform; TextMeshProUGUI componentInChildren = ((Component)transform).GetComponentInChildren(); ((TMP_Text)componentInChildren).text = playerName; ((TMP_Text)componentInChildren).richText = !Settings.DisableRichText.Value; SingletonBase.Inst.RefreshTextCache(componentInChildren, playerName); if (SpecialColors.TryGetValue(SteamId.op_Implicit(player), out var colors) && colors.Length >= 1) { if (colors.Length >= 2) { ((TMP_Text)componentInChildren).OnPreRenderText += delegate(TMP_TextInfo info) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0019: 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) MPUtility.SetFullTextGradient(info, Color32.op_Implicit(colors[0]), Color32.op_Implicit(colors[1])); }; } else { ((Graphic)componentInChildren).color = colors[0]; } } ((UIElement)((Component)transform).GetComponent()).ShowCustom(0.2f); _playerList.Add(SteamId.op_Implicit(player), transform); if (GlobalsManager.IsHosting) { SetButtonActive(SteamLobbyManager.Inst.IsEveryoneLoaded); } } public void RemovePlayerFromLobby(SteamId player) { //IL_0006: 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 (_playerList.TryGetValue(SteamId.op_Implicit(player), out var value)) { ((UIElement)((Component)value).GetComponent()).HideCustom(0.2f); Object.Destroy((Object)(object)((Component)value).gameObject, 0.3f); _playerList.Remove(SteamId.op_Implicit(player)); if (GlobalsManager.IsHosting) { SetButtonActive(SteamLobbyManager.Inst.IsEveryoneLoaded); } } } public void SetPlayerLoaded(SteamId player, bool playSound = true) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) if (!_playerList.TryGetValue(SteamId.op_Implicit(player), out var value)) { return; } if (playSound) { AudioManager inst = SingletonBase.Inst; if (inst != null) { inst.PlaySound("UI_Add", 1f); } } TextMeshProUGUI component = ((Component)value.GetChild(1)).GetComponent(); ((TMP_Text)component).text = "▓"; SingletonBase.Inst.RefreshTextCache(component, "▓"); if (GlobalsManager.IsHosting) { SetButtonActive(SteamLobbyManager.Inst.IsEveryoneLoaded); } } public void StartLevel() { if (GlobalsManager.HasStarted) { return; } foreach (VGPlayerData player in SingletonBase.Inst.players) { VGPlayer playerObject = player.PlayerObject; if (Object.op_Implicit((Object)(object)playerObject)) { ((MonoBehaviour)playerObject).StopCoroutine(playerObject.SpawnLoop()); playerObject.Spawn(); } } SingletonBase.Inst.RespawnPlayers(); PaMNetworkManager.CallRpc_Multi_UpdateLobbyState(1); ((Lobby)(ref SteamLobbyManager.Inst.CurrentLobby)).SetData("LobbyState", ((ushort)1).ToString()); GlobalsManager.HasStarted = true; LobbyMenu.HideAll(); SingletonBase.Inst.UnPause(); SteamLobbyManager.Inst.UnloadAll(); } public void UpdateQueue() { for (int i = 0; i < _queueList.childCount; i++) { Object.Destroy((Object)(object)((Component)_queueList.GetChild(i)).gameObject); } string data = ((Lobby)(ref SteamLobbyManager.Inst.CurrentLobby)).GetData("LevelQueue"); if (string.IsNullOrEmpty(data)) { ((Component)((Component)LobbyMenu).transform.Find("Queue Title")).gameObject.SetActive(false); return; } List list = JsonConvert.DeserializeObject>(data); if (list.Count == 0) { ((Component)((Component)LobbyMenu).transform.Find("Queue Title")).gameObject.SetActive(false); return; } foreach (string item in list) { ((TMP_Text)Object.Instantiate(PAM.LobbyQueueEntryPrefab, _queueList).GetComponentInChildren()).text = item; } } private void SetButtonActive(bool active) { //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_003e: 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_005d: Unknown result type (might be due to invalid IL or missing references) if (((Selectable)ResumeButton).interactable != active) { ((Selectable)ResumeButton).interactable = active; ((Behaviour)ResumeButton).enabled = active; Color color = (Color)(active ? Color.white : new Color(1f, 1f, 1f, 0.188f)); ResumeButton.targetGraphics.subGraphics[0].color = color; ((UIElement)((Component)ResumeButton).GetComponent()).PlayGlitch(0.6f, 0f, 0.5f, (Action)null); } } } public class MenuSelectionManager : MonoBehaviour { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static Action <>9__6_5; public static Action <>9__6_6; public static Action <>9__6_7; public static UnityAction <>9__6_4; internal void b__6_5() { SingletonBase.Inst.LoadSceneGroup("Arcade"); } internal void b__6_6() { GlobalsManager.IsChallenge = true; SingletonBase.Inst.LoadSceneGroup("Challenge"); } internal void b__6_7() { GeneralUILoader inst = SingletonBase.Inst; if (inst != null) { UnityEvent leaveSaveUI = inst.LeaveSaveUI; if (leaveSaveUI != null) { leaveSaveUI.Invoke(); } } } internal void b__6_4() { GeneralUILoader inst = SingletonBase.Inst; if (inst != null) { UnityEvent leaveSaveUI = inst.LeaveSaveUI; if (leaveSaveUI != null) { leaveSaveUI.Invoke(); } } } } public UI_Menu Menu; private TextMeshProUGUI LobbyCount; public static MenuSelectionManager Instance { get; private set; } private void Awake() { //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Expected O, but got Unknown //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Expected O, but got Unknown //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Expected O, but got Unknown //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Expected O, but got Unknown //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Expected O, but got Unknown if ((Object)(object)Instance != (Object)null) { Object.Destroy((Object)(object)this); return; } Instance = this; Menu = ((Component)this).gameObject.GetComponent(); Transform val = ((Component)this).transform.Find("New Game"); ((UnityEvent)((Button)((Component)val.GetChild(0)).GetComponent()).onClick).AddListener((UnityAction)delegate { Menu.HideAllInstant(); SingletonBase.Inst.SetContinueAction((Action)delegate { SingletonBase.Inst.LoadSceneGroup("Arcade"); }); SingletonBase.Inst.OpenUI(); }); ((UnityEvent)((Button)((Component)val.GetChild(1)).GetComponent()).onClick).AddListener((UnityAction)async delegate { Menu.HideAllInstant(); GeneralUILoader inst3 = SingletonBase.Inst; if (inst3 != null) { UnityEvent leaveSaveUI3 = inst3.LeaveSaveUI; if (leaveSaveUI3 != null) { leaveSaveUI3.Invoke(); } } LobbyQuery val3 = default(LobbyQuery); LobbyQuery val4 = ((LobbyQuery)(ref val3)).WithMaxResults(1); val4 = ((LobbyQuery)(ref val4)).WithKeyValue("AlphaMultiplayer", "true"); Lobby[] array = await ((LobbyQuery)(ref val4)).RequestAsync(); if (array != null && array.Length != 0) { GlobalsManager.IsHosting = false; GlobalsManager.IsMultiplayer = true; ((Lobby)(ref array[0])).Join(); } }); LobbyCount = ((Component)val.GetChild(1).Find("QueueIcon/Text")).GetComponent(); ((UnityEvent)((Button)((Component)val.GetChild(2)).GetComponent()).onClick).AddListener((UnityAction)delegate { Menu.HideAllInstant(); SingletonBase.Inst.SetContinueAction((Action)delegate { GlobalsManager.IsChallenge = true; SingletonBase.Inst.LoadSceneGroup("Challenge"); }); SingletonBase.Inst.OpenUI(); }); ((UnityEvent)((Button)((Component)val.GetChild(3)).GetComponent()).onClick).AddListener((UnityAction)delegate { Menu.HideAllInstant(); if (Object.op_Implicit((Object)(object)LobbyCreationManager.Instance)) { LobbyCreationManager.Instance.FallbackAction = delegate { GeneralUILoader inst2 = SingletonBase.Inst; if (inst2 != null) { UnityEvent leaveSaveUI2 = inst2.LeaveSaveUI; if (leaveSaveUI2 != null) { leaveSaveUI2.Invoke(); } } }; LobbyCreationManager.Instance.OpenMenu(bIsChallange: true); } GlobalsManager.IsChallenge = true; }); ButtonClickedEvent onClick = ((Button)((Component)val.GetChild(4)).GetComponent()).onClick; object obj = <>c.<>9__6_4; if (obj == null) { UnityAction val2 = delegate { GeneralUILoader inst = SingletonBase.Inst; if (inst != null) { UnityEvent leaveSaveUI = inst.LeaveSaveUI; if (leaveSaveUI != null) { leaveSaveUI.Invoke(); } } }; <>c.<>9__6_4 = val2; obj = (object)val2; } ((UnityEvent)onClick).AddListener((UnityAction)obj); } public async void OpenMenu() { try { GeneralUILoader inst = SingletonBase.Inst; if (inst != null) { UnityEvent enterSaveUI = inst.EnterSaveUI; if (enterSaveUI != null) { enterSaveUI.Invoke(); } } Menu.ShowBase(); Menu.SwapView("main"); ((Selectable)((SerializableDictionary)(object)Menu.AllViews)["main"].PossibleFirstButtons[0]).Select(); SingletonBase.Inst.SetUIVolumeWeightIn(0.2f); ((TMP_Text)LobbyCount).text = "..."; SingletonBase.Inst.RefreshTextCache(LobbyCount, "..."); LobbyQuery val = default(LobbyQuery); LobbyQuery val2 = ((LobbyQuery)(ref val)).WithMaxResults(10); val2 = ((LobbyQuery)(ref val2)).WithKeyValue("AlphaMultiplayer", "true"); Lobby[] array = await ((LobbyQuery)(ref val2)).RequestAsync(); if (Object.op_Implicit((Object)(object)LobbyCount)) { if (array != null) { ((TMP_Text)LobbyCount).text = array.Length.ToString(); SingletonBase.Inst.RefreshTextCache(LobbyCount, array.Length.ToString()); } else { ((TMP_Text)LobbyCount).text = "0"; SingletonBase.Inst.RefreshTextCache(LobbyCount, "0"); } } } catch (Exception ex) { PAM.Logger.LogError((object)ex); } } } public class MultiplayerDiscordManager : MonoBehaviour { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static OnErrorEvent <>9__11_0; internal void b__11_0(object _, ErrorMessage e) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) PAM.Logger.LogError((object)$"An error occurred with Discord RPC Client: {e.Message} ({e.Code})"); } } private DiscordRpcClient client; private RichPresence presence; private const string ApplicationId = "1282511280833298483"; private static readonly Button[] Buttons = (Button[])(object)new Button[2] { new Button { Label = "Get the game!", Url = "steam://advertise/440310" }, new Button { Label = "Get the multiplayer mod!", Url = "https://github.com/Aiden-ytarame/PAMultiplayer" } }; public static MultiplayerDiscordManager Instance { get; private set; } public static bool IsInitialized { get { if (Object.op_Implicit((Object)(object)Instance) && Instance.client != null) { return Instance.client.CurrentUser != null; } return false; } } private void FixedUpdate() { if (client != null) { client.Invoke(); } } private void Start() { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Expected O, but got Unknown //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Expected O, but got Unknown //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Expected O, but got Unknown //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) //IL_0058: Expected O, but got Unknown if ((Object)(object)Instance != (Object)null) { Object.Destroy((Object)(object)this); return; } Instance = this; client = new DiscordRpcClient("1282511280833298483", -1, (ILogger)new ConsoleLogger((LogLevel)3), false, (INamedPipeClient)null); DiscordRpcClient obj = client; object obj2 = <>c.<>9__11_0; if (obj2 == null) { OnErrorEvent val = delegate(object _, ErrorMessage e) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) PAM.Logger.LogError((object)$"An error occurred with Discord RPC Client: {e.Message} ({e.Code})"); }; <>c.<>9__11_0 = val; obj2 = (object)val; } obj.OnError += (OnErrorEvent)obj2; client.OnReady += new OnReadyEvent(onReady); client.OnJoin += new OnJoinEvent(ClientOnOnJoin); client.Subscribe((EventType)2); client.RegisterUriScheme("440310", Paths.ExecutablePath); client.Initialize(); } private void ClientOnOnJoin(object sender, JoinMessage joinSecret) { //IL_0039: Unknown result type (might be due to invalid IL or missing references) if (SteamClient.IsValid && !GlobalsManager.IsMultiplayer) { if (ulong.TryParse(joinSecret.Secret, out var result)) { PAM.Logger.LogInfo((object)"Attempting to join lobby from discord invite."); GlobalsManager.IsHosting = false; GlobalsManager.IsMultiplayer = true; SteamMatchmaking.JoinLobbyAsync(SteamId.op_Implicit(result)); } else { ErrorScreen.CreateErrorScreen("Tried to join discord invite which didnt contain lobby data"); PAM.Logger.LogError((object)"Failed to parse secret."); } } else { ErrorScreen.CreateErrorScreen($"Failed to Join lobby from discord, Was Already In Lobby[{GlobalsManager.IsMultiplayer}], Steam Initialized [{SteamClient.IsValid}]"); PAM.Logger.LogError((object)"Failed to join lobby from discord, steam wasn't initialized or you're already in a lobby"); } } private void onReady(object _, ReadyMessage __) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown //IL_0011: 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_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Expected O, but got Unknown presence = new RichPresence(); ((BaseRichPresence)presence).Assets = new Assets { SmallImageKey = "pamplogo2", SmallImageText = "Multiplayer Logo" }; SetMenuPresence(); client.SetPresence(presence); } public void SetLevelPresence(string state, string details, string levelCoverUrl) { //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Expected O, but got Unknown //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Expected O, but got Unknown //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Expected O, but got Unknown try { ((BaseRichPresence)presence).State = state; ((BaseRichPresence)presence).Details = details; ((BaseRichPresence)presence).Assets.LargeImageKey = levelCoverUrl; ((BaseRichPresence)presence).Assets.LargeImageText = "Level Cover"; ((BaseRichPresence)presence).Timestamps = new Timestamps(DateTime.UtcNow); if (GlobalsManager.IsMultiplayer) { SteamId id = ((Lobby)(ref SteamLobbyManager.Inst.CurrentLobby)).Id; string text = ((object)(SteamId)(ref id)).ToString(); RichPresence obj = presence; Party val = new Party(); id = ((Lobby)(ref SteamLobbyManager.Inst.CurrentLobby)).Owner.Id; val.ID = text + ((object)(SteamId)(ref id)).ToString(); val.Max = ((Lobby)(ref SteamLobbyManager.Inst.CurrentLobby)).MaxMembers; val.Size = ((Lobby)(ref SteamLobbyManager.Inst.CurrentLobby)).MemberCount; val.Privacy = (PrivacySetting)1; ((BaseRichPresence)obj).Party = val; ((BaseRichPresence)presence).Secrets = new Secrets { Join = text }; presence.Buttons = null; } client.SetPresence(presence); } catch (Exception ex) { PAM.Logger.LogError((object)ex); } } public void UpdatePartySize(int size) { if (((BaseRichPresence)presence).Party != null) { ((BaseRichPresence)presence).Party.Size = size; client.SetPresence(presence); } } public void SetMenuPresence() { ((BaseRichPresence)presence).State = "Navigating Menus"; ((BaseRichPresence)presence).Details = ""; ((BaseRichPresence)presence).Assets.LargeImageKey = "palogo"; ((BaseRichPresence)presence).Assets.LargeImageText = "Game Logo"; ((BaseRichPresence)presence).Timestamps = null; presence.Buttons = Buttons; ((BaseRichPresence)presence).Party = null; ((BaseRichPresence)presence).Secrets = null; client.SetPresence(presence); } public void SetChallengePresence() { //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Expected O, but got Unknown //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_0131: Unknown result type (might be due to invalid IL or missing references) //IL_013d: Expected O, but got Unknown if (client != null && presence != null) { ((BaseRichPresence)presence).State = "Choosing Level"; ((BaseRichPresence)presence).Details = "Playing Challenge"; ((BaseRichPresence)presence).Assets.LargeImageKey = "palogo"; ((BaseRichPresence)presence).Assets.LargeImageText = "Game Logo"; ((BaseRichPresence)presence).Timestamps = null; presence.Buttons = Buttons; ((BaseRichPresence)presence).Party = null; ((BaseRichPresence)presence).Secrets = null; if (GlobalsManager.IsMultiplayer) { SteamId id = ((Lobby)(ref SteamLobbyManager.Inst.CurrentLobby)).Id; string text = ((object)(SteamId)(ref id)).ToString(); RichPresence obj = presence; Party val = new Party(); id = ((Lobby)(ref SteamLobbyManager.Inst.CurrentLobby)).Owner.Id; val.ID = text + ((object)(SteamId)(ref id)).ToString(); val.Max = ((Lobby)(ref SteamLobbyManager.Inst.CurrentLobby)).MaxMembers; val.Size = ((Lobby)(ref SteamLobbyManager.Inst.CurrentLobby)).MemberCount; val.Privacy = (PrivacySetting)1; ((BaseRichPresence)obj).Party = val; ((BaseRichPresence)presence).Secrets = new Secrets { Join = text }; presence.Buttons = null; } client.SetPresence(presence); } } } public class NetworkManager : MonoBehaviour { private class PlayerPredictionData { public VGPlayerData Player; public Vector2 Position; public Vector2 LastPosition; public Vector2 PredictedPosition; public Vector2 LastMovementDirection; public float Speed; public float InterpSpeed; public bool Extrapolating; private ushort _lastId; private float _timeReceived; public void Update(ushort id, Vector2 pos) { //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0056: 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_004e: 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_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: 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_00df: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_01aa: Unknown result type (might be due to invalid IL or missing references) //IL_01af: Unknown result type (might be due to invalid IL or missing references) if (id < _lastId && id > _lastId - 100) { return; } float num = Time.timeSinceLevelLoad - _timeReceived; Transform val = Player?.PlayerObject?.Player_Wrapper; Position = pos; PredictedPosition = Vector2.op_Implicit((val != null) ? val.position : Vector2.op_Implicit(pos)); Extrapolating = false; _timeReceived = Time.timeSinceLevelLoad; Vector2 val2 = pos - LastPosition; if (((Vector2)(ref val2)).sqrMagnitude > 0.0001f) { ((Vector2)(ref val2)).Normalize(); } else { val2 = Vector2.zero; } Vector2 val3 = Position - LastPosition; Speed = ((Vector2)(ref val3)).sqrMagnitude; val3 = Position - PredictedPosition; InterpSpeed = ((Vector2)(ref val3)).sqrMagnitude; if (val2 != Vector2.zero) { LastMovementDirection = val2; } else { Speed = 0f; } if (InterpSpeed < Speed) { Speed = Mathf.Sqrt(Speed) / num; InterpSpeed = Speed; } else { if (num >= 2f && Object.op_Implicit((Object)(object)val)) { val.position = Vector2.op_Implicit(pos); } Speed = Mathf.Sqrt(Speed) / num; InterpSpeed = Mathf.Sqrt(InterpSpeed) / num; } if (!float.IsNormal(Speed)) { Speed = 0f; } if (!float.IsNormal(InterpSpeed)) { InterpSpeed = 0f; } _lastId = id; LastPosition = Position; } public PlayerPredictionData(VGPlayerData player, Vector2 lastPosition, Vector2 lastMovementDirection) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_000f: 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_0016: Unknown result type (might be due to invalid IL or missing references) Player = player; Position = lastPosition; LastMovementDirection = lastMovementDirection; _timeReceived = Time.timeSinceLevelLoad; } } private const float PositionUpdateDelay = 0.02f; private PaMNetworkManager _paMNetworkManager; private VGPlayerData _localData; private float _timeSinceUpdate; private ushort _movementId; private static Dictionary _playerPrediction = new Dictionary(); private void Update() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) if (_localData == null && GlobalsManager.Players.TryGetValue(SteamId.op_Implicit(GlobalsManager.LocalPlayerId), out var value)) { _localData = value.VGPlayerData; } if (_timeSinceUpdate > 0.02f) { if (Object.op_Implicit((Object)(object)_localData?.PlayerObject?.Player_Wrapper) && !_localData.PlayerObject.isDead) { _timeSinceUpdate = 0f; _movementId++; Vector3 position = _localData.PlayerObject.Player_Wrapper.position; if (GlobalsManager.IsHosting) { CallRpc_Multi_PlayerPos(GlobalsManager.LocalPlayerId, _movementId, Vector2.op_Implicit(position)); } else { CallRpc_Server_PlayerPos(_movementId, Vector2.op_Implicit(position)); } } } else { _timeSinceUpdate += Time.unscaledDeltaTime; } TryToGetController(); if (Input.GetKeyDown((KeyCode)9) || Input.GetKeyDown((KeyCode)334)) { ((MonoBehaviour)this).StartCoroutine(PauseLobbyPatch.ShowNames()); } if (_paMNetworkManager == null) { _paMNetworkManager = (PaMNetworkManager)(object)NetworkManager.Instance; if (_paMNetworkManager != null) { _paMNetworkManager.OnPlayerLeave += delegate(ulong id) { _playerPrediction.Remove(id); }; _paMNetworkManager.Receive(); } } else { _paMNetworkManager.Receive(); } foreach (KeyValuePair item in _playerPrediction) { HandlePlayersPrediction(item.Value); } } [ServerRpc(/*Could not decode attribute arguments.*/)] private static void Server_PlayerPos(ClientNetworkConnection conn, ushort moveId, Vector2 pos) { //IL_0025: 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) if (!conn.TryGetSteamId(out var steamId)) { PAM.Logger.LogError((object)("failed to get player position " + ((NetworkConnection)conn).Address)); } else { CallRpc_Multi_PlayerPos(steamId, moveId, pos); } } [MultiRpc(/*Could not decode attribute arguments.*/)] private static void Multi_PlayerPos(SteamId id, ushort moveId, Vector2 pos) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_000d: 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_0048: 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_0053: 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_0062: 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_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) if (id.IsLocalPlayer() || !GlobalsManager.Players.TryGetValue(SteamId.op_Implicit(id), out var value)) { return; } VGPlayer playerObject = value.VGPlayerData.PlayerObject; if (!Object.op_Implicit((Object)(object)playerObject?.Player_Wrapper)) { return; } Vector2 val = Vector2.op_Implicit(playerObject.Player_Wrapper.position); if (!_playerPrediction.TryGetValue(SteamId.op_Implicit(id), out var value2)) { Vector2 lastMovementDirection = pos - val; if (((Vector2)(ref lastMovementDirection)).sqrMagnitude > 0.0001f) { ((Vector2)(ref lastMovementDirection)).Normalize(); } else { lastMovementDirection = Vector2.zero; } _playerPrediction.Add(SteamId.op_Implicit(id), new PlayerPredictionData(value.VGPlayerData, pos, lastMovementDirection)); } else { value2.Update(moveId, pos); } } private void HandlePlayersPrediction(PlayerPredictionData data) { //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: 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_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Unknown result type (might be due to invalid IL or missing references) VGPlayer val = data.Player?.PlayerObject; if (!Object.op_Implicit((Object)(object)val?.Player_Wrapper) || val.isDead) { return; } val.p_lastMoveX = data.LastMovementDirection.x; val.p_lastMoveY = data.LastMovementDirection.y; if (data.Extrapolating) { Vector2 val2 = Vector2.op_Implicit(val.Player_Wrapper.position); val2 += data.Speed * Time.deltaTime * data.LastMovementDirection; val.Player_Wrapper.position = Vector2.op_Implicit(val2); return; } Vector2 val3 = Vector2.MoveTowards(Vector2.op_Implicit(val.Player_Wrapper.position), data.Position, data.InterpSpeed * Time.deltaTime); if (float.IsNaN(val3.x) || float.IsNaN(val3.y)) { val3 = data.Position; } val.Player_Wrapper.position = Vector2.op_Implicit(val3); if (val3 == data.Position) { data.Extrapolating = true; } } private void TryToGetController() { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Invalid comparison between Unknown and I4 for (int i = 0; i < ReInput.controllers.controllerCount; i++) { Controller val = ReInput.controllers.Controllers[i]; if (val.isConnected && val.enabled && ((int)val.type == 0 || (int)val.type == 2) && !ReInput.players.GetPlayer(0).controllers.ContainsController(val)) { ReInput.players.GetPlayer(0).controllers.AddController(val, true); } } } private void OnDestroy() { //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0073: 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) //IL_0086: Expected O, but got Unknown GlobalsManager.HasStarted = false; ((Lobby)(ref SteamLobbyManager.Inst.CurrentLobby)).SetMemberData("IsLoaded", "0"); _playerPrediction.Clear(); if (!GlobalsManager.IsReloadingLobby) { GlobalsManager.LocalPlayerObjectId = 0; SteamManager.Inst.EndServer(); SteamManager.Inst.EndClient(); GlobalsManager.Players.Clear(); SingletonBase.Inst.players.Clear(); SingletonBase.Inst.players.Add(new VGPlayerData { ControllerID = 0, PlayerID = 0 }); } } private static void CallRpc_Server_PlayerPos(ushort moveId, Vector2 pos) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Expected O, but got Unknown //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) if (NetworkManager.Instance == null) { return; } if (NetworkManager.Instance.PeerServer) { Server_PlayerPos(NetworkManager.Instance.ServerSelfPeerConnection, moveId, pos); return; } NetworkWriter val = new NetworkWriter(); try { NetWriterExtensions.Write(val, (ushort)65336); NetWriterExtensions.Write(val, moveId); val.WriteVector2(pos); NetworkManager.Instance.SendToServer(val.GetData(), (SendType)1); } finally { ((IDisposable)val)?.Dispose(); } } public static void Deserialize_Server_PlayerPos_65336(ClientNetworkConnection senderConn, NetworkReader reader) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) Server_PlayerPos(senderConn, NetReaderExtensions.ReadUInt16(reader), reader.ReadVector2()); } private static void CallRpc_Multi_PlayerPos(SteamId id, ushort moveId, Vector2 pos) { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown //IL_0014: 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_002e: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) if (NetworkManager.Instance == null) { return; } if (NetworkManager.Instance.PeerServer) { Multi_PlayerPos(id, moveId, pos); } NetworkWriter val = new NetworkWriter(); try { NetWriterExtensions.Write(val, (ushort)13413); val.WriteSteamId(id); NetWriterExtensions.Write(val, moveId); val.WriteVector2(pos); NetworkManager.Instance.SendToAllClients(val.GetData(), (SendType)1); } finally { ((IDisposable)val)?.Dispose(); } } public static void Deserialize_Multi_PlayerPos_13413(ClientNetworkConnection senderConn, NetworkReader reader) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) Multi_PlayerPos(reader.ReadSteamId(), NetReaderExtensions.ReadUInt16(reader), reader.ReadVector2()); } } public class PointsManager : MonoBehaviour { private class PointChallenge { public string Name; public int Points; public PointChallenge(string name, int points) { Name = name; Points = points; base..ctor(); } } private struct PlayerRank { public readonly int Hits; public readonly int Boosts; public readonly int Cc; public readonly int Score; public readonly bool Disqualify; public PlayerRank(int hits, int boosts, int cc, int score, bool disqualify) { Hits = hits; Boosts = boosts; Cc = cc; Score = score; Disqualify = disqualify; } } private struct PlayerEntry { public readonly TextMeshProUGUI Icon; public readonly TextMeshProUGUI Name; public readonly TextMeshProUGUI Rank; public readonly TextMeshProUGUI Stats; public readonly TextMeshProUGUI Score; public PlayerEntry(Transform entry) { //IL_0079: Unknown result type (might be due to invalid IL or missing references) Transform child = entry.GetChild(1); Icon = ((Component)child.GetChild(1)).GetComponent(); Name = ((Component)child.GetChild(2)).GetComponent(); Transform child2 = entry.GetChild(2); Rank = ((Component)child2.GetChild(0)).GetComponent(); Stats = ((Component)child2.GetChild(1)).GetComponent(); Transform transform = ((Component)child2.GetChild(2).GetChild(0)).transform; ((RectTransform)((transform is RectTransform) ? transform : null)).sizeDelta = new Vector2(50f, 50f); Score = ((Component)child2.GetChild(2).GetChild(1)).GetComponent(); } } [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static RestartDelegate <>9__27_0; public static FinishDelegate <>9__27_1; public static UnityAction <>9__27_2; internal void b__27_0() { Inst?.LevelRestarted(); } internal void b__27_1() { Inst?.LevelEnded(); } internal void b__27_2() { if (Object.op_Implicit((Object)(object)LevelEndScreenPatch.Instance)) { LevelEndScreen instance = LevelEndScreenPatch.Instance; if (Object.op_Implicit((Object)(object)instance.ContinueButton) && !instance.ContinueButton.IsLocked) { ((Selectable)instance.ContinueButton).Select(); } else if (Object.op_Implicit((Object)(object)instance.RestartLevelButton) && !instance.RestartLevelButton.IsLocked) { ((Selectable)instance.RestartLevelButton).Select(); } else { ((Selectable)instance.BackToArcadeButton).Select(); } } } } private Leaderboard? leaderboard; private int _currentPoint; public static PointsManager Inst; private float _levelDuration; private int _localBoosts; private int _localCc; private int _localHits; private int _localDeaths; private float _timeOfDeath; private float _averageBoostDuration; private float _timeAlive; private float _timeMoving; private Vector3 _sumOfPos = Vector3.zero; private int _posSaved; private int _checkpointLow; private readonly List _playersDead = new List(); private readonly Dictionary _playerRanks = new Dictionary(); private readonly Dictionary _playerEntries = new Dictionary(); private AssetBundle _pointsBundle; private UI_Menu _menu; private MultiElementButton _closeButton; private Transform _playerList; private GameObject _playerEntryPrefab; private static readonly string[] PlayerShapes = new string[4] { "■", "▲", "●", "^" }; private async void Awake() { if (Object.op_Implicit((Object)(object)Inst)) { PAM.Logger.LogWarning((object)"Tried to instantiate a second PointManager"); Object.Destroy((Object)(object)this); } Inst = this; GameManager inst = SingletonBase.Inst; object obj = <>c.<>9__27_0; if (obj == null) { RestartDelegate val = delegate { Inst?.LevelRestarted(); }; <>c.<>9__27_0 = val; obj = (object)val; } inst.levelRestartEvent += (RestartDelegate)obj; GameManager inst2 = SingletonBase.Inst; object obj2 = <>c.<>9__27_1; if (obj2 == null) { FinishDelegate val2 = delegate { Inst?.LevelEnded(); }; <>c.<>9__27_1 = val2; obj2 = (object)val2; } inst2.levelFinishEvent += (FinishDelegate)obj2; using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("PAMultiplayer.Assets.points")) { _pointsBundle = AssetBundle.LoadFromMemory(ExtensionMethods.CTReadFully(stream)); } Transform parent = ((Component)SingletonBase.Inst).transform.parent; ref UI_Menu menu = ref _menu; Object obj3 = _pointsBundle.LoadAsset("assets/level result.prefab"); menu = Object.Instantiate((GameObject)(object)((obj3 is GameObject) ? obj3 : null), parent).GetComponent(); _playerList = ((Component)_menu).transform.Find("PlayersList"); _closeButton = ((Component)((Component)_menu).transform.Find("Pause Menu/Resume")).GetComponent(); ButtonClickedEvent onClick = ((Button)_closeButton).onClick; object obj4 = <>c.<>9__27_2; if (obj4 == null) { UnityAction val3 = delegate { if (Object.op_Implicit((Object)(object)LevelEndScreenPatch.Instance)) { LevelEndScreen instance = LevelEndScreenPatch.Instance; if (Object.op_Implicit((Object)(object)instance.ContinueButton) && !instance.ContinueButton.IsLocked) { ((Selectable)instance.ContinueButton).Select(); } else if (Object.op_Implicit((Object)(object)instance.RestartLevelButton) && !instance.RestartLevelButton.IsLocked) { ((Selectable)instance.RestartLevelButton).Select(); } else { ((Selectable)instance.BackToArcadeButton).Select(); } } }; <>c.<>9__27_2 = val3; obj4 = (object)val3; } ((UnityEvent)onClick).AddListener((UnityAction)obj4); ref GameObject playerEntryPrefab = ref _playerEntryPrefab; Object obj5 = _pointsBundle.LoadAsset("assets/playerentry.prefab"); playerEntryPrefab = (GameObject)(object)((obj5 is GameObject) ? obj5 : null); leaderboard = await SteamUserStats.FindOrCreateLeaderboardAsync("MP_MOD_Points", (LeaderboardSort)2, (LeaderboardDisplay)1); if (leaderboard.HasValue) { Leaderboard value = leaderboard.Value; LeaderboardEntry[] array = await ((Leaderboard)(ref value)).GetScoresForUsersAsync((SteamId[])(object)new SteamId[1] { SteamClient.SteamId }); if (array != null && array.Length != 0) { _currentPoint = array[0].Score; } } } private void OnDestroy() { Inst = null; AssetBundle pointsBundle = _pointsBundle; if (pointsBundle != null) { pointsBundle.Unload(true); } if (Object.op_Implicit((Object)(object)_menu)) { Object.Destroy((Object)(object)((Component)_menu).gameObject); } } private void Update() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Invalid comparison between Unknown and I4 if (Object.op_Implicit((Object)(object)SingletonBase.Inst) && (int)SingletonBase.Inst.CurGameState == 1) { _levelDuration += Time.deltaTime; } } private void LevelRestarted() { //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) _levelDuration = 0f; _localBoosts = 0; _localCc = 0; _localHits = 0; _localDeaths = 0; _timeOfDeath = 0f; _averageBoostDuration = 0f; _timeAlive = 0f; _timeMoving = 0f; _sumOfPos = Vector3.zero; _posSaved = 0; _checkpointLow = 0; _playerEntries.Clear(); _playerRanks.Clear(); _playersDead.Clear(); } private void LevelEnded() { //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) int num = Settings.Score.Value; if (_currentPoint > num) { num = _currentPoint; } if (!GlobalsManager.JoinedMidLevel && !SingletonBase.Inst.IsPractice) { num += GetWonChallenges(); } Settings.Score.Value = num; _currentPoint = num; if (leaderboard.HasValue) { Leaderboard value = leaderboard.Value; ((Leaderboard)(ref value)).SubmitScoreAsync(num, (int[])null); } if (GlobalsManager.IsMultiplayer) { CallRpc_Client_SendResults(_localHits, _localBoosts, _localCc, num, GlobalsManager.JoinedMidLevel); ShowEndScreen(); } } public void ShowEndScreen() { _menu.ShowBase(); _menu.SwapView("main"); SingletonBase.Inst.SetUIVolumeWeightIn(0.2f); ((Selectable)_closeButton).Select(); foreach (KeyValuePair player in GlobalsManager.Players) { GenerateEntry(player.Key, player.Value); } } private void GenerateEntry(ulong playerId, PlayerData playerData) { //IL_0045: 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_0098: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Unknown result type (might be due to invalid IL or missing references) PlayerEntry value = new PlayerEntry(Object.Instantiate(_playerEntryPrefab, _playerList).transform); ((TMP_Text)value.Name).text = playerData.Name; string text = LSColors.ColorToHex(Color32.op_Implicit(SingletonBase.Inst.LiveTheme.GetPlayerColor(playerData.VGPlayerData.PlayerID % 4))); ((TMP_Text)value.Icon).text = "" + PlayerShapes[playerData.VGPlayerData.PlayerID / 4]; ((TMP_Text)value.Stats).rectTransform.anchoredPosition = new Vector2(100f, 7f); _playerEntries.Add(playerId, value); if (_playerRanks.TryGetValue(playerId, out var value2)) { UpdateEntry(playerId, value2); return; } ((TMP_Text)value.Rank).text = ")(object)DataManager.inst.LevelRanks)[(LevelRankType)0].Color)) + ">" + ((SerializableDictionary)(object)DataManager.inst.LevelRanks)[(LevelRankType)0].ASCII.GetLocalizedString(); ((TMP_Text)value.Score).text = "X"; } private void UpdateEntry(ulong playerId, PlayerRank playerRank) { //IL_001f: 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_003d: 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_0048: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) if (_playerEntries.TryGetValue(playerId, out var value)) { LevelRankType val = (LevelRankType)((!playerRank.Disqualify) ? ((int)LevelRank.GetLevelRankTypeFromHits(playerRank.Hits)) : 0); ((TMP_Text)value.Rank).text = ")(object)DataManager.inst.LevelRanks)[val].Color)) + ">" + ((SerializableDictionary)(object)DataManager.inst.LevelRanks)[val].ASCII.GetLocalizedString(); SingletonBase.Inst.RefreshTextCache(value.Rank, ((TMP_Text)value.Rank).text); ((TMP_Text)value.Stats).text = $"{playerRank.Hits} / {playerRank.Boosts} / {playerRank.Cc}"; SingletonBase.Inst.RefreshTextCache(value.Stats, ((TMP_Text)value.Stats).text); ((TMP_Text)value.Score).text = $"X{playerRank.Score}"; SingletonBase.Inst.RefreshTextCache(value.Score, ((TMP_Text)value.Score).text); } } [ServerRpc(/*Could not decode attribute arguments.*/)] private static void Client_SendResults(ClientNetworkConnection conn, int hit, int boost, int cc, int score, bool midLevel) { //IL_0032: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)Inst)) { if (!conn.TryGetSteamId(out var steamId)) { PAM.Logger.LogError((object)("couldnt find id " + ((NetworkConnection)conn).Address)); } else { CallRpc_Multi_SetPlayerResults(SteamId.op_Implicit(steamId), hit, boost, cc, score, midLevel); } } } [MultiRpc(/*Could not decode attribute arguments.*/)] private static void Multi_SetPlayerResults(ulong steamId, int hit, int boost, int cc, int score, bool midLevel) { if (Object.op_Implicit((Object)(object)Inst)) { PAM.Logger.LogError((object)$"data from {steamId}"); Dictionary playerRanks = Inst._playerRanks; int disqualify; if (!midLevel) { GameManager inst = SingletonBase.Inst; disqualify = ((inst != null && inst.IsPractice) ? 1 : 0); } else { disqualify = 1; } playerRanks[steamId] = new PlayerRank(hit, boost, cc, score, (byte)disqualify != 0); Inst.UpdateEntry(steamId, Inst._playerRanks[steamId]); } } public void AddBoost(float duration) { _localBoosts++; _averageBoostDuration += duration; } public void AddCloseCall() { _localCc++; } public void AddHit() { _localHits++; } public void AddTimeAlive(float time) { _timeAlive += time; } public void AddTimeMoving(float time) { _timeMoving += time; } public void AddDeath() { _localDeaths++; _localHits++; _timeOfDeath = Time.timeSinceLevelLoad; } public void AddPosition(Vector3 position) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) _sumOfPos += position / 10f; _posSaved++; } public void AddCheckpointWithOneHealth() { _checkpointLow++; } public void PlayerHasDied(ulong playerId) { if (!_playersDead.Contains(playerId)) { _playersDead.Add(playerId); } } public void PlayerLeft(ulong playerId) { _playersDead.Remove(playerId); } private int GetWonChallenges() { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Expected I4, but got Unknown //IL_02e3: Unknown result type (might be due to invalid IL or missing references) //IL_02ef: Unknown result type (might be due to invalid IL or missing references) //IL_02f4: Unknown result type (might be due to invalid IL or missing references) //IL_03a5: Unknown result type (might be due to invalid IL or missing references) //IL_03aa: Unknown result type (might be due to invalid IL or missing references) //IL_03ac: Unknown result type (might be due to invalid IL or missing references) //IL_03c7: Expected I4, but got Unknown List list = new List(); LevelRankType levelRankTypeFromHits = LevelRank.GetLevelRankTypeFromHits(_localHits); switch ((int)levelRankTypeFromHits) { case 0: list.Add(new PointChallenge("Participation trophy", 1)); break; case 6: list.Add(new PointChallenge("Maybe next time", 2)); break; case 5: list.Add(new PointChallenge("Could be better", 4)); break; case 4: list.Add(new PointChallenge("Not bad", 6)); break; case 3: list.Add(new PointChallenge("Very good", 8)); break; case 2: list.Add(new PointChallenge("Well done", 10)); break; case 1: list.Add(new PointChallenge("Perfection", 12)); break; } if (GlobalsManager.IsMultiplayer && GlobalsManager.Players.Count > 1 && _playersDead.Count - 1 == GlobalsManager.Players.Count && !_playersDead.Contains(GlobalsManager.LocalPlayerId.Value)) { list.Add(new PointChallenge("Carry", 10)); } _averageBoostDuration /= _localBoosts; float num = (float)_localBoosts / _levelDuration; PAM.Logger.LogFatal((object)$"average Boost [{num}]"); if (_localBoosts == 0) { list.Add(new PointChallenge("Didnt even try", 12)); } else { if (num > 5f) { list.Add(new PointChallenge("Impatient", 3)); } else if (num < 0.15f) { list.Add(new PointChallenge("Patience is a virtue", 6)); } if (_averageBoostDuration > 0.22f) { list.Add(new PointChallenge("Looong", 3)); } else if (_averageBoostDuration < 0.09f) { list.Add(new PointChallenge("You know you can hold it right?", 5)); } } float num2 = (float)_localCc / _levelDuration; if (num2 > 0.5f) { list.Add(new PointChallenge("A little too close", 6)); } else if (num2 < 0.05f) { list.Add(new PointChallenge("Not even close", 9)); } float num3 = _timeMoving / _timeAlive; if (num3 > 0.93f) { list.Add(new PointChallenge("Good cardio", 2)); } else if (num3 < 0.1f) { list.Add(new PointChallenge("Why even bother", 4)); } float num4 = _timeAlive / _levelDuration; if (_localDeaths == 0) { list.Add(new PointChallenge("Not even a death", 11)); } else if (num4 < 0.4f) { list.Add(new PointChallenge("Gamemode 3", 1)); } if (_localDeaths > 0 && _levelDuration - _timeOfDeath < 5f) { list.Add(new PointChallenge("Right at the end", 4)); } Vector3 val = _sumOfPos / (float)_posSaved; val.z = 0f; float magnitude = ((Vector3)(ref val)).magnitude; PAM.Logger.LogFatal((object)$"MAG [{magnitude}]"); if (magnitude < 1f) { list.Add(new PointChallenge("Center of attentions", 3)); } else if (magnitude > 3.7f) { list.Add(new PointChallenge("Shy nano", 2)); } int count = DataManager.inst.gameData.beatmapData.checkpoints.Count; if (count > 1 && count - 1 == _checkpointLow) { list.Add(new PointChallenge("On edge", 5)); } VGLevel val2 = SingletonBase.Inst.FetchLevel(); DifficultyType difficulty = val2.Difficulty; float num5 = (int)difficulty switch { 0 => 0.6f, 1 => 0.8f, 2 => 1f, 3 => 1.2f, 4 => 1.4f, _ => 0f, }; float num6 = val2.LevelMusic.length / 90f; int num7 = 0; int num8 = 0; foreach (PointChallenge item in list) { num8 += item.Points; item.Points = (int)((float)item.Points * num5 * num6); num7 += item.Points; PAM.Logger.LogInfo((object)item.Name); } PAM.Logger.LogInfo((object)$"Raw [{num8}], time and difficulty scaled [{num7}]"); return num7; } private static void CallRpc_Client_SendResults(int hit, int boost, int cc, int score, bool midLevel) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown if (NetworkManager.Instance == null) { return; } if (NetworkManager.Instance.PeerServer) { Client_SendResults(NetworkManager.Instance.ServerSelfPeerConnection, hit, boost, cc, score, midLevel); return; } NetworkWriter val = new NetworkWriter(); try { NetWriterExtensions.Write(val, (ushort)28267); NetWriterExtensions.Write(val, hit); NetWriterExtensions.Write(val, boost); NetWriterExtensions.Write(val, cc); NetWriterExtensions.Write(val, score); NetWriterExtensions.Write(val, midLevel); NetworkManager.Instance.SendToServer(val.GetData(), (SendType)0); } finally { ((IDisposable)val)?.Dispose(); } } public static void Deserialize_Client_SendResults_28267(ClientNetworkConnection senderConn, NetworkReader reader) { Client_SendResults(senderConn, NetReaderExtensions.ReadInt32(reader), NetReaderExtensions.ReadInt32(reader), NetReaderExtensions.ReadInt32(reader), NetReaderExtensions.ReadInt32(reader), NetReaderExtensions.ReadBoolean(reader)); } private static void CallRpc_Multi_SetPlayerResults(ulong steamId, int hit, int boost, int cc, int score, bool midLevel) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Expected O, but got Unknown if (NetworkManager.Instance == null) { return; } if (NetworkManager.Instance.PeerServer) { Multi_SetPlayerResults(steamId, hit, boost, cc, score, midLevel); } NetworkWriter val = new NetworkWriter(); try { NetWriterExtensions.Write(val, (ushort)49432); NetWriterExtensions.Write(val, steamId); NetWriterExtensions.Write(val, hit); NetWriterExtensions.Write(val, boost); NetWriterExtensions.Write(val, cc); NetWriterExtensions.Write(val, score); NetWriterExtensions.Write(val, midLevel); NetworkManager.Instance.SendToAllClients(val.GetData(), (SendType)0); } finally { ((IDisposable)val)?.Dispose(); } } public static void Deserialize_Multi_SetPlayerResults_49432(ClientNetworkConnection senderConn, NetworkReader reader) { Multi_SetPlayerResults(NetReaderExtensions.ReadUInt64(reader), NetReaderExtensions.ReadInt32(reader), NetReaderExtensions.ReadInt32(reader), NetReaderExtensions.ReadInt32(reader), NetReaderExtensions.ReadInt32(reader), NetReaderExtensions.ReadBoolean(reader)); } } public class SteamLobbyManager : MonoBehaviour { public enum LobbyState : ushort { Lobby, Playing, Challenge, Max } public Lobby CurrentLobby; public static SteamLobbyManager Inst; private Dictionary _loadedPlayers = new Dictionary(); public int RandSeed; public bool InLobby { get; private set; } public bool IsEveryoneLoaded => !_loadedPlayers.ContainsValue(value: false); public void CreateLobby() { SteamManager.Inst.StartServer(); SteamMatchmaking.CreateLobbyAsync(LobbyCreationManager.Instance.PlayerCount); } private void Awake() { if (Object.op_Implicit((Object)(object)Inst)) { Object.Destroy((Object)(object)this); return; } Object.DontDestroyOnLoad((Object)(object)this); Inst = this; SteamMatchmaking.OnLobbyCreated += OnLobbyCreated; SteamMatchmaking.OnLobbyEntered += OnLobbyEntered; SteamMatchmaking.OnLobbyMemberJoined += OnLobbyMemberJoined; SteamMatchmaking.OnLobbyMemberDisconnected += OnLobbyMemberDisconnected; SteamMatchmaking.OnLobbyMemberLeave += OnLobbyMemberDisconnected; SteamMatchmaking.OnLobbyMemberDataChanged += OnLobbyMemberDataChanged; SteamMatchmaking.OnLobbyDataChanged += OnLobbyDataChanged; SteamMatchmaking.OnChatMessage += OnChatMessage; } private void OnChatMessage(Lobby lobby, Friend friend, string message) { //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) if (Settings.Chat.Value) { if (message.Length > 25) { message = message.Substring(0, 25); } string text = message.Replace('_', ' '); if (!((Friend)(ref friend)).IsMe) { DebugController.inst.AddLog("" + ((Friend)(ref friend)).Name + ": " + text); } if (GlobalsManager.Players.TryGetValue(SteamId.op_Implicit(friend.Id), out var value) && value.VGPlayerData.PlayerObject.IsValidPlayer()) { value.VGPlayerData.PlayerObject.Player_Text.DisplayText(text, 5f); } } } private void OnLobbyDataChanged(Lobby lobby) { if (Object.op_Implicit((Object)(object)LobbyScreenManager.Instance)) { LobbyScreenManager.Instance.UpdateQueue(); } } private void OnLobbyMemberDataChanged(Lobby lobby, Friend friend) { //IL_0002: 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_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0037: 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) if (!(((Lobby)(ref lobby)).GetMemberData(friend, "IsLoaded") != "1")) { SetLoaded(friend.Id); if (Object.op_Implicit((Object)(object)LobbyScreenManager.Instance)) { LobbyScreenManager.Instance.SetPlayerLoaded(friend.Id); } } } private void OnLobbyMemberDisconnected(Lobby lobby, Friend friend) { //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_003c: 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_0058: 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_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_0108: Unknown result type (might be due to invalid IL or missing references) //IL_0164: Unknown result type (might be due to invalid IL or missing references) //IL_0165: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Unknown result type (might be due to invalid IL or missing references) //IL_0186: Unknown result type (might be due to invalid IL or missing references) //IL_0187: Unknown result type (might be due to invalid IL or missing references) PAM.Logger.LogInfo((object)("Member Left : [" + ((Friend)(ref friend)).Name + "]")); AudioManager inst = SingletonBase.Inst; if (inst != null) { inst.PlaySound("UI_Glitch", 1f); } RemovePlayerFromLoadList(friend.Id); if (Object.op_Implicit((Object)(object)LobbyScreenManager.Instance)) { LobbyScreenManager.Instance.RemovePlayerFromLobby(friend.Id); } if (MultiplayerDiscordManager.IsInitialized) { MultiplayerDiscordManager.Instance.UpdatePartySize(((Lobby)(ref lobby)).MemberCount); } if (!GlobalsManager.Players.TryGetValue(SteamId.op_Implicit(friend.Id), out var value)) { return; } string playerColorHex = SingletonBase.Inst.GetPlayerColorHex(value.VGPlayerData.PlayerID); SingletonBase.Inst.DisplayNotification("Nano [" + ((Friend)(ref friend)).Name + "] Disconnected", 2.5f); SingletonBase.Inst.players.Remove(value.VGPlayerData); GlobalsManager.Players.Remove(SteamId.op_Implicit(friend.Id)); VGPlayer playerObject = value.VGPlayerData.PlayerObject; if (Object.op_Implicit((Object)(object)playerObject)) { DeathDelegate deathEvent = EventHelper.GetDeathEvent(playerObject); if (deathEvent != null) { deathEvent.Invoke(playerObject.Player_Wrapper.position); } playerObject.ClearEvents(); playerObject.PlayerDeath(0f); } PointsManager.Inst?.PlayerLeft(SteamId.op_Implicit(friend.Id)); if (GlobalsManager.IsHosting && PaMNetworkManager.PamInstance.SteamIdToNetId.TryGetValue(SteamId.op_Implicit(friend.Id), out var value2)) { ((NetworkManager)PaMNetworkManager.PamInstance).KickClient(value2); } } private void OnLobbyMemberJoined(Lobby lobby, Friend friend) { //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_003c: 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_0058: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Expected O, but got Unknown //IL_014a: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_01b8: Unknown result type (might be due to invalid IL or missing references) //IL_01b9: Unknown result type (might be due to invalid IL or missing references) //IL_017a: Unknown result type (might be due to invalid IL or missing references) //IL_0198: Unknown result type (might be due to invalid IL or missing references) //IL_0199: Unknown result type (might be due to invalid IL or missing references) PAM.Logger.LogInfo((object)("Member Joined : [" + ((Friend)(ref friend)).Name + "]")); AudioManager inst = SingletonBase.Inst; if (inst != null) { inst.PlaySound("UI_Subtract", 1f); } AddPlayerToLoadList(friend.Id); if (Object.op_Implicit((Object)(object)LobbyScreenManager.Instance)) { LobbyScreenManager.Instance.AddPlayerToLobby(friend.Id, ((Friend)(ref friend)).Name); } if (MultiplayerDiscordManager.IsInitialized) { MultiplayerDiscordManager.Instance.UpdatePartySize(((Lobby)(ref lobby)).MemberCount); } HashSet hashSet = new HashSet(); int i = 1; foreach (KeyValuePair player in GlobalsManager.Players) { hashSet.Add(player.Value.VGPlayerData.PlayerID); } for (; hashSet.Contains(i); i++) { } VGPlayerData val = new VGPlayerData { PlayerID = i, ControllerID = i }; string playerColorHex = SingletonBase.Inst.GetPlayerColorHex(val.PlayerID); SingletonBase.Inst.DisplayNotification("Nano [" + ((Friend)(ref friend)).Name + "] Joined", 2.5f); if (GlobalsManager.Players.TryAdd(SteamId.op_Implicit(friend.Id), new PlayerData(val, ((Friend)(ref friend)).Name))) { if (Object.op_Implicit((Object)(object)SingletonBase.Inst) && (int)SingletonBase.Inst.CurGameState != 0 && GlobalsManager.LobbyState != LobbyState.Playing) { SingletonBase.Inst.players.Add(GlobalsManager.Players[SteamId.op_Implicit(friend.Id)].VGPlayerData); } } else { GlobalsManager.Players[SteamId.op_Implicit(friend.Id)].SetName(((Friend)(ref friend)).Name); } } private void OnLobbyEntered(Lobby lobby) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Unknown result type (might be due to invalid IL or missing references) //IL_0119: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Unknown result type (might be due to invalid IL or missing references) //IL_0135: Unknown result type (might be due to invalid IL or missing references) //IL_0136: Unknown result type (might be due to invalid IL or missing references) //IL_013d: Expected O, but got Unknown //IL_0152: Unknown result type (might be due to invalid IL or missing references) //IL_0153: Unknown result type (might be due to invalid IL or missing references) //IL_0171: Unknown result type (might be due to invalid IL or missing references) //IL_0172: Unknown result type (might be due to invalid IL or missing references) //IL_0182: Unknown result type (might be due to invalid IL or missing references) //IL_019a: Unknown result type (might be due to invalid IL or missing references) //IL_019b: Unknown result type (might be due to invalid IL or missing references) ((Lobby)(ref lobby)).Refresh(); Friend owner; if (!((Lobby)(ref lobby)).Owner.Id.IsLocalPlayer() && ((Lobby)(ref lobby)).GetData("AlphaMultiplayer") != "true") { ((Lobby)(ref lobby)).Leave(); SingletonBase.Inst.manager.ClearLoadingTasks(); SingletonBase.inst.LoadSceneGroup("Menu"); SteamManager.Inst.EndClient(); object arg = ((Lobby)(ref lobby)).Id; owner = ((Lobby)(ref lobby)).Owner; ErrorScreen.CreateErrorScreen($"Tried to join invalid Lobby [{arg}] by [{((Friend)(ref owner)).Name}]!\n\nTry again in a few seconds, if it doesnt work it may be a different MP version, or another mod"); ManualLogSource logger = PAM.Logger; owner = ((Lobby)(ref lobby)).Owner; logger.LogError((object)("Tried to join invalid lobby by [" + ((Friend)(ref owner)).Name + "]")); return; } ManualLogSource logger2 = PAM.Logger; owner = ((Lobby)(ref lobby)).Owner; logger2.LogInfo((object)("Joined Lobby hosted by [" + ((Friend)(ref owner)).Name + "]")); CurrentLobby = lobby; InLobby = true; int num = 0; if (((Lobby)(ref lobby)).Owner.Id.IsLocalPlayer()) { AddPlayerToLoadList(((Lobby)(ref lobby)).Owner.Id); SetupLobby(lobby); return; } foreach (Friend member in ((Lobby)(ref lobby)).Members) { Friend current = member; VGPlayerData val = new VGPlayerData(); val.PlayerID = num; val.ControllerID = num; GlobalsManager.Players.Add(SteamId.op_Implicit(current.Id), new PlayerData(val, ((Friend)(ref current)).Name)); AddPlayerToLoadList(current.Id); if (((Lobby)(ref CurrentLobby)).GetMemberData(current, "IsLoaded") == "1") { SetLoaded(current.Id); } num++; } GlobalsManager.HasLoadedExternalInfo = false; GlobalsManager.HasLoadedBasePlayerIds = false; GlobalsManager.HasLoadedMainLobbyInfo = false; GlobalsManager.HasLoadedMidLobbyInfo = false; GlobalsManager.Queue.Clear(); SingletonBase.Inst.LoadSceneGroup("Arcade_Level"); } private void OnLobbyCreated(Result result, Lobby lobby) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) if ((int)result != 1) { PAM.Logger.LogError((object)$"Failed to create lobby.. Result [{result}]"); ErrorScreen.CreateErrorScreen($"Failed to create lobby\nSteam result: {result}"); ((Lobby)(ref lobby)).Leave(); SteamManager.Inst.EndServer(); SingletonBase.Inst.manager.ClearLoadingTasks(); SingletonBase.inst.LoadSceneGroup("Menu"); } else { PAM.Logger.LogInfo((object)"Lobby Created!"); } } private void SetupLobby(Lobby lobby) { _loadedPlayers = new Dictionary(); ((Lobby)(ref lobby)).SetData("AlphaMultiplayer", "true"); if (GlobalsManager.IsChallenge) { ((Lobby)(ref lobby)).SetData("LobbyState", ((ushort)2).ToString()); PaMNetworkManager.CallRpc_Multi_UpdateLobbyState(2); } else { VGLevel currentArcadeLevel = SingletonBase.Inst.CurrentArcadeLevel; GlobalsManager.LevelId = ((currentArcadeLevel.SteamInfo != null) ? currentArcadeLevel.SteamInfo.ItemID.Value.ToString() : ((Object)currentArcadeLevel).name); ((Lobby)(ref lobby)).SetData("LevelId", GlobalsManager.LevelId); ((Lobby)(ref lobby)).SetData("seed", RandSeed.ToString()); ((Lobby)(ref lobby)).SetData("LobbyState", ((ushort)0).ToString()); PaMNetworkManager.CallRpc_Multi_UpdateLobbyState(0); } ((Lobby)(ref lobby)).SetData("LevelQueue", JsonConvert.SerializeObject((object)GlobalsManager.GetQueueLevelNames())); ((Lobby)(ref lobby)).SetData("HealthMod", DataManager.inst.GetSettingEnum("ArcadeHealthMod", 0).ToString()); ((Lobby)(ref lobby)).SetData("LinkedMod", DataManager.inst.GetSettingBool("mp_linkedHealth", false).ToString()); ((Lobby)(ref lobby)).SetData("SpeedMod", DataManager.inst.GetSettingEnum("ArcadeSpeedMod", 0).ToString()); if (LobbyCreationManager.Instance.IsPrivate) { ((Lobby)(ref lobby)).SetFriendsOnly(); } else { ((Lobby)(ref lobby)).SetPublic(); } ((Lobby)(ref lobby)).SetJoinable(true); } private void AddPlayerToLoadList(SteamId playerSteamId) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) _loadedPlayers.TryAdd(playerSteamId, value: false); } private void RemovePlayerFromLoadList(SteamId player) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) _loadedPlayers?.Remove(player); } private void SetLoaded(SteamId playerSteamId) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) _loadedPlayers[playerSteamId] = true; } public void LeaveLobby() { if (InLobby) { InLobby = false; ((Lobby)(ref CurrentLobby)).Leave(); } } public void UnloadAll() { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) foreach (SteamId item in _loadedPlayers.Keys.ToList()) { _loadedPlayers[item] = false; } } public bool IsPlayerLoaded(SteamId playerSteamId) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) return _loadedPlayers.GetValueOrDefault(playerSteamId, defaultValue: false); } public int LoadedPlayerCount() { return _loadedPlayers.Count((KeyValuePair x) => x.Value); } } public class SteamManager : MonoBehaviour { public static SteamManager Inst { get; private set; } private void Awake() { Invoker val = default(Invoker); RpcHandler.TryGetRpcInvoker((ushort)1, ref val); if (Object.op_Implicit((Object)(object)Inst)) { Object.Destroy((Object)(object)this); return; } Object.DontDestroyOnLoad((Object)(object)this); Inst = this; SteamMatchmaking.OnLobbyInvite += OnLobbyInvite; SteamFriends.OnGameLobbyJoinRequested += OnGameLobbyJoinRequested; InitSteamClient(); } private void Update() { if (SteamClient.IsValid) { SteamClient.RunCallbacks(); } } private void OnApplicationQuit() { EndServer(); EndClient(); } public void InitSteamClient() { //IL_002f: 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) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) if (SteamClient.IsValid) { SteamNetworkingUtils.ConnectionTimeout = 5000; SteamNetworkingUtils.Timeout = 6000; SteamNetworkingUtils.SendRateMax = 524288; SteamNetworkingUtils.SendBufferSize = 10485760; GlobalsManager.LocalPlayerId = SteamClient.SteamId; PAM.Logger.LogWarning((object)"Steam was already Initialized"); return; } try { SteamClient.Init(440310u, false); SteamNetworkingUtils.InitRelayNetworkAccess(); SteamNetworkingUtils.ConnectionTimeout = 5000; SteamNetworkingUtils.Timeout = 6000; SteamNetworkingUtils.SendRateMax = 524288; SteamNetworkingUtils.SendBufferSize = 10485760; GlobalsManager.LocalPlayerId = SteamClient.SteamId; PAM.Logger.LogInfo((object)"Steam Initialized"); } catch (Exception) { PAM.Logger.LogError((object)"failed to initialize steam"); } } private void OnGameLobbyJoinRequested(Lobby lobby, SteamId steamId) { //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0031: 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_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) ((Lobby)(ref lobby)).Refresh(); SteamId id; if (((Lobby)(ref lobby)).GetData("AlphaMultiplayer") != "true") { ManualLogSource logger = PAM.Logger; id = ((Lobby)(ref lobby)).Id; logger.LogError((object)("Tried to join invalid lobby [" + ((object)(SteamId)(ref id)).ToString() + "]")); object arg = ((Lobby)(ref lobby)).Id; Friend owner = ((Lobby)(ref lobby)).Owner; ErrorScreen.CreateErrorScreen($"Tried to join invalid Lobby [{arg}] by [{((Friend)(ref owner)).Name}]!\n\nTry again in a few seconds, if it doesnt work it may be a different MP version, or another mod"); } else { GlobalsManager.IsHosting = false; GlobalsManager.IsMultiplayer = true; PAM.Logger.LogInfo((object)$"Joining friend's lobby owned by [{steamId}]"); ManualLogSource logger2 = PAM.Logger; id = ((Lobby)(ref lobby)).Id; logger2.LogError((object)("Lobby Id [" + ((object)(SteamId)(ref id)).ToString() + "]")); ((Lobby)(ref lobby)).Join(); } } private void OnLobbyInvite(Friend friend, Lobby lobby) { PAM.Logger.LogInfo((object)("Invite received from [" + ((Friend)(ref friend)).Name + "]")); } public void StartClient(SteamId targetSteamId) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) PAM.Logger.LogInfo((object)$"Starting client. Connection to [{targetSteamId}]"); PaMNetworkManager paMNetworkManager = new PaMNetworkManager(); ((NetworkManager)paMNetworkManager).Init((Transport)(object)new FacepunchSocketsTransport()); ((NetworkManager)paMNetworkManager).ConnectToServer(((object)(SteamId)(ref targetSteamId)).ToString()); } public void EndClient() { GlobalsManager.IsReloadingLobby = false; GlobalsManager.IsMultiplayer = false; GlobalsManager.IsHosting = false; GlobalsManager.JoinedMidLevel = false; GlobalsManager.HasLoadedMidLobbyInfo = true; GlobalsManager.HasLoadedMainLobbyInfo = true; SteamLobbyManager.Inst.LeaveLobby(); NetworkManager instance = NetworkManager.Instance; if (instance != null) { instance.Disconnect(); } } public void StartServer() { PAM.Logger.LogInfo((object)"Starting Server."); PaMNetworkManager paMNetworkManager = new PaMNetworkManager(); if (!((NetworkManager)paMNetworkManager).Init((Transport)(object)new FacepunchSocketsTransport())) { throw new Exception("Tried to initialize network manager while another one already runs"); } ((NetworkManager)paMNetworkManager).StartServer(true); } public void EndServer() { GlobalsManager.IsReloadingLobby = false; GlobalsManager.IsMultiplayer = false; GlobalsManager.IsHosting = false; SteamLobbyManager.Inst?.LeaveLobby(); NetworkManager instance = NetworkManager.Instance; if (instance != null) { instance.EndServer(); } } } [HarmonyPatch(typeof(SystemManager))] public class SystemManagerPatch { [HarmonyPatch("Awake")] [HarmonyPostfix] private static void AddSteamManager(ref SystemManager __instance) { PAM.Logger.LogInfo((object)"Adding Steam Stuff"); ((Component)__instance).gameObject.AddComponent(); ((Component)__instance).gameObject.AddComponent(); } } public static class SteamIdLocalExtension { [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool IsLocalPlayer(this SteamId id) { //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) return SteamId.op_Implicit(id) == SteamId.op_Implicit(GlobalsManager.LocalPlayerId); } } } namespace PAMultiplayer.AttributeNetworkWrapperOverrides { public static class AttrWrapperExtension { public static void WriteSteamId(this NetworkWriter writer, SteamId steamId) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) writer.BinaryWriter.Write(SteamId.op_Implicit(steamId)); } public static SteamId ReadSteamId(this NetworkReader reader) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) return SteamId.op_Implicit(NetReaderExtensions.ReadUInt64(reader)); } public static void WriteVector2(this NetworkWriter writer, Vector2 vector2) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) NetWriterExtensions.Write(writer, vector2.x); NetWriterExtensions.Write(writer, vector2.y); } public static Vector2 ReadVector2(this NetworkReader reader) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) return new Vector2(NetReaderExtensions.ReadSingle(reader), NetReaderExtensions.ReadSingle(reader)); } public static void WriteUlongs(this NetworkWriter writer, List ulongs) { NetWriterExtensions.Write(writer, ulongs.Count); foreach (ulong @ulong in ulongs) { NetWriterExtensions.Write(writer, @ulong); } } public static List ReadUlongs(this NetworkReader reader) { int num = NetReaderExtensions.ReadInt32(reader); List list = new List(num); for (int i = 0; i < num; i++) { list.Add(NetReaderExtensions.ReadUInt64(reader)); } return list; } public static void WriteSongData(this NetworkWriter writer, Span songData) { Span span = MemoryMarshal.Cast(songData); NetWriterExtensions.Write(writer, span.Length); writer.BinaryWriter.Write(span); } public static Span ReadSongData(this NetworkReader reader) { int count = NetReaderExtensions.ReadInt32(reader); return MemoryMarshal.Cast((ReadOnlySpan)reader.BinaryReader.ReadBytes(count)).ToArray(); } public static void WriteVersion(this NetworkWriter writer, Version version) { NetWriterExtensions.Write(writer, version.Major); NetWriterExtensions.Write(writer, version.Minor); NetWriterExtensions.Write(writer, version.Build); NetWriterExtensions.Write(writer, version.Revision); } public static Version ReadVersion(this NetworkReader reader) { return new Version(Math.Max(NetReaderExtensions.ReadInt32(reader), 0), Math.Max(NetReaderExtensions.ReadInt32(reader), 0), Math.Max(NetReaderExtensions.ReadInt32(reader), 0), Math.Max(NetReaderExtensions.ReadInt32(reader), 0)); } public static bool TryGetSteamId(this ClientNetworkConnection conn, out SteamId steamId) { return GlobalsManager.ConnIdToSteamId.TryGetValue(((NetworkConnection)conn).ConnectionId, out steamId); } } public class FacepunchSocketsTransport : Transport, ISocketManager, IConnectionManager { private SocketManager _server; private ConnectionManager _client; internal readonly Dictionary IDToConnection = new Dictionary(); internal readonly Dictionary SteamIdToNetId = new Dictionary(); private static byte[] _buffer = new byte[1024]; public int GetNextConnectionId() { int i; for (i = 0; IDToConnection.ContainsKey(i); i++) { } return i; } private int GetIdFromSteamConnection(Connection steamConnection) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_002e: 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) foreach (KeyValuePair item in IDToConnection) { Connection? value = item.Value; if (value.HasValue && value.GetValueOrDefault() == steamConnection) { return item.Key; } } return -1; } private void AssureBufferSpace(int size) { if (_buffer.Length < size && size > 0 && size > _buffer.Length) { int num = Math.Max(size, 256); if (num < _buffer.Length * 2) { num = _buffer.Length * 2; } if ((uint)(_buffer.Length * 2) > 999999u) { num = Math.Max(size, 9999999); } byte[] array = new byte[num]; Buffer.BlockCopy(_buffer, 0, array, 0, _buffer.Length); _buffer = array; } } public void Receive() { SocketManager server = _server; if (server != null) { server.Receive(32, true); } ConnectionManager client = _client; if (client != null) { client.Receive(32, true); } } public int GetPing() { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) if (((Transport)this).IsServer) { return 0; } ConnectionManager client = _client; if (client == null) { return 9999; } ConnectionStatus val = ((Connection)(ref client.Connection)).QuickStatus(); return ((ConnectionStatus)(ref val)).Ping; } public override void ConnectClient(string address) { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Expected O, but got Unknown IDToConnection.Clear(); SteamIdToNetId.Clear(); if (ulong.TryParse(address, out var result)) { _client = SteamNetworkingSockets.ConnectRelay(SteamId.op_Implicit(result), 0, (IConnectionManager)(object)this); ((Transport)this).IsActive = true; base.OnClientConnected?.Invoke(new ServerNetworkConnection(result.ToString())); return; } throw new ArgumentException(address + " is not a valid SteamID"); } public override void StopClient() { ((Transport)this).IsActive = false; ConnectionManager client = _client; if (client != null) { client.Close(false, 0, "Closing Connection"); } } public override void StartServer() { IDToConnection.Clear(); SteamIdToNetId.Clear(); _server = SteamNetworkingSockets.CreateRelaySocket(0, (ISocketManager)(object)this); ((Transport)this).IsActive = true; } public override void StopServer() { ((Transport)this).IsActive = false; SocketManager server = _server; if (server != null) { server.Close(); } } public override void KickConnection(int connectionId) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) if (IDToConnection.TryGetValue(connectionId, out var value) && value.HasValue) { Connection valueOrDefault = value.GetValueOrDefault(); ((Connection)(ref valueOrDefault)).Close(false, 1111, "Closing Connection"); } } public override void SendMessageToServer(ArraySegment data, SendType sendType = 0) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) SendType val = (SendType)(((int)sendType == 0) ? 8 : 0); ConnectionManager client = _client; if (client != null) { ((Connection)(ref client.Connection)).SendMessage(data.Array, data.Offset, data.Count, val, (ushort)0); } } public override void SendMessageToClient(int connectionId, ArraySegment data, SendType sendType = 0) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0041: 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) if (IDToConnection.TryGetValue(connectionId, out var value)) { SendType val = (SendType)(((int)sendType == 0) ? 9 : 4); if (value.HasValue) { Connection valueOrDefault = value.GetValueOrDefault(); ((Connection)(ref valueOrDefault)).SendMessage(data.Array, data.Offset, data.Count, val, (ushort)0); } } } public override void Shutdown() { SocketManager server = _server; if (server != null) { server.Close(); } ConnectionManager client = _client; if (client != null) { client.Close(false, 0, "Closing Connection"); } IDToConnection.Clear(); SteamIdToNetId.Clear(); ((Transport)this).IsActive = false; } public void OnConnecting(Connection connection, ConnectionInfo info) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) ((Connection)(ref connection)).Accept(); ManualLogSource logger = PAM.Logger; NetIdentity identity = ((ConnectionInfo)(ref info)).Identity; logger.LogInfo((object)$"Player {((NetIdentity)(ref identity)).SteamId} is connecting to game server."); } public void OnConnected(Connection connection, ConnectionInfo info) { //IL_000e: 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_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004c: 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) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Expected O, but got Unknown int nextConnectionId = GetNextConnectionId(); IDToConnection.Add(nextConnectionId, connection); Dictionary steamIdToNetId = SteamIdToNetId; NetIdentity identity = ((ConnectionInfo)(ref info)).Identity; steamIdToNetId.Add(SteamId.op_Implicit(((NetIdentity)(ref identity)).SteamId), nextConnectionId); Action onServerClientConnected = base.OnServerClientConnected; if (onServerClientConnected != null) { identity = ((ConnectionInfo)(ref info)).Identity; SteamId steamId = ((NetIdentity)(ref identity)).SteamId; onServerClientConnected(new ClientNetworkConnection(nextConnectionId, ((object)(SteamId)(ref steamId)).ToString())); } } public void OnDisconnected(Connection connection, ConnectionInfo info) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0048: 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_0050: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Expected O, but got Unknown ((Connection)(ref connection)).Close(false, 0, "Closing Connection"); Dictionary steamIdToNetId = SteamIdToNetId; NetIdentity identity = ((ConnectionInfo)(ref info)).Identity; if (steamIdToNetId.TryGetValue(SteamId.op_Implicit(((NetIdentity)(ref identity)).SteamId), out var value)) { IDToConnection.Remove(value); Dictionary steamIdToNetId2 = SteamIdToNetId; identity = ((ConnectionInfo)(ref info)).Identity; steamIdToNetId2.Remove(SteamId.op_Implicit(((NetIdentity)(ref identity)).SteamId)); Action onServerClientDisconnected = base.OnServerClientDisconnected; if (onServerClientDisconnected != null) { int num = value; identity = ((ConnectionInfo)(ref info)).Identity; SteamId steamId = ((NetIdentity)(ref identity)).SteamId; onServerClientDisconnected(new ClientNetworkConnection(num, ((object)(SteamId)(ref steamId)).ToString())); } } } public void OnMessage(Connection connection, NetIdentity identity, IntPtr data, int size, long messageNum, long recvTime, int channel) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: 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_00ba: Expected O, but got Unknown int idFromSteamConnection = GetIdFromSteamConnection(connection); if (idFromSteamConnection == -1) { PAM.Logger.LogError((object)"Received data from someone not in the id to connection list"); return; } if (size < 2) { PAM.Logger.LogError((object)"Received too little data, disconnecting"); ((Connection)(ref connection)).Close(false, 0, "Closing Connection"); return; } if (size > 524288) { PAM.Logger.LogError((object)"Received too much data from someone, disconnecting"); ((Connection)(ref connection)).Close(false, 0, "Closing Connection"); return; } AssureBufferSpace(size); Marshal.Copy(data, _buffer, 0, size); ArraySegment arg = new ArraySegment(_buffer, 0, size); try { Action> onServerDataReceived = base.OnServerDataReceived; if (onServerDataReceived != null) { SteamId steamId = ((NetIdentity)(ref identity)).SteamId; onServerDataReceived(new ClientNetworkConnection(idFromSteamConnection, ((object)(SteamId)(ref steamId)).ToString()), arg); } } catch (Exception ex) { PAM.Logger.LogError((object)ex); } } public void OnConnecting(ConnectionInfo info) { } public void OnConnected(ConnectionInfo info) { } public void OnDisconnected(ConnectionInfo info) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Invalid comparison between Unknown and I4 //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004c: 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_0050: Invalid comparison between Unknown and I4 //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Invalid comparison between Unknown and I4 ((Transport)this).IsActive = false; base.OnClientDisconnected?.Invoke(); if ((int)((ConnectionInfo)(ref info)).State == 4) { if ((int)((ConnectionInfo)(ref info)).EndReason == 1111) { ErrorScreen.CreateErrorScreen("You were kicked from the lobby."); return; } ErrorScreen.CreateErrorScreen("Server has been closed."); } ConnectionState state = ((ConnectionInfo)(ref info)).State; if (((int)state == -3 || (int)state == 5) ? true : false) { ErrorScreen.CreateErrorScreen("Connection lost."); } } public void OnMessage(IntPtr data, int size, long messageNum, long recvTime, int channel) { if (size < 2) { PAM.Logger.LogError((object)"Received too little data"); return; } if (size > 524288) { PAM.Logger.LogError((object)"Received too much data from host"); return; } AssureBufferSpace(size); Marshal.Copy(data, _buffer, 0, size); ArraySegment obj = new ArraySegment(_buffer, 0, size); try { base.OnClientDataReceived?.Invoke(obj); } catch (Exception ex) { PAM.Logger.LogError((object)ex); } } } public class PaMNetworkManager : NetworkManager { public delegate void ClientModVersionReceived(ulong steamId, string guid, Version version); public delegate void MultiplayerStateChanged(bool hosting); public delegate void PlayerStateChanged(ulong id); private FacepunchSocketsTransport _facepunchtransport; private static int _amountOfInfo; public static PaMNetworkManager PamInstance { get; private set; } public Dictionary SteamIdToNetId => _facepunchtransport.SteamIdToNetId; public static event MultiplayerStateChanged OnMultiplayerStart; public static event MultiplayerStateChanged OnMultiplayerEnd; public event PlayerStateChanged OnPlayerJoin; public event PlayerStateChanged OnPlayerLeave; public event ClientModVersionReceived OnClientModVersionReceived; public void Receive() { _facepunchtransport?.Receive(); } public override void StartServer(bool serverIsPeer) { //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Expected O, but got Unknown //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) ((NetworkManager)this).StartServer(serverIsPeer); _facepunchtransport = (FacepunchSocketsTransport)(object)((NetworkManager)this).Transport; if (serverIsPeer) { base.ClientConnections.Clear(); ((NetworkManager)this).ServerSelfPeerConnection = new ClientNetworkConnection(_facepunchtransport.GetNextConnectionId(), ((object)(SteamId)(ref GlobalsManager.LocalPlayerId)).ToString()); _facepunchtransport.SteamIdToNetId.Add(SteamId.op_Implicit(GlobalsManager.LocalPlayerId), ((NetworkConnection)((NetworkManager)this).ServerSelfPeerConnection).ConnectionId); _facepunchtransport.IDToConnection.Add(((NetworkConnection)((NetworkManager)this).ServerSelfPeerConnection).ConnectionId, null); GlobalsManager.ConnIdToSteamId.Add(((NetworkConnection)((NetworkManager)this).ServerSelfPeerConnection).ConnectionId, GlobalsManager.LocalPlayerId); base.ClientConnections.Add(((NetworkConnection)((NetworkManager)this).ServerSelfPeerConnection).ConnectionId, ((NetworkManager)this).ServerSelfPeerConnection); } PamInstance = this; PaMNetworkManager.OnMultiplayerStart?.Invoke(hosting: true); } public override void ConnectToServer(string address) { PamInstance = this; ((NetworkManager)this).ConnectToServer(address); _facepunchtransport = (FacepunchSocketsTransport)(object)((NetworkManager)this).Transport; PaMNetworkManager.OnMultiplayerStart?.Invoke(hosting: false); } public override void OnClientDisconnected() { ((NetworkManager)this).OnClientDisconnected(); PamInstance = null; ((NetworkManager)this).Shutdown(); if (GlobalsManager.IsMultiplayer) { SteamManager.Inst.EndClient(); SingletonBase.Inst.manager.ClearLoadingTasks(); SingletonBase.Inst.LoadSceneGroup("Menu"); PaMNetworkManager.OnMultiplayerEnd?.Invoke(hosting: false); } } public override void EndServer() { PAM.Logger.LogFatal((object)"EndServer"); ((NetworkManager)this).EndServer(); GlobalsManager.ConnIdToSteamId.Clear(); PamInstance = null; ((NetworkManager)this).Shutdown(); PaMNetworkManager.OnMultiplayerEnd?.Invoke(hosting: true); } public override void OnServerClientConnected(ClientNetworkConnection connection) { //IL_009b: Unknown result type (might be due to invalid IL or missing references) //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: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0116: Unknown result type (might be due to invalid IL or missing references) ((NetworkManager)this).OnServerClientConnected(connection); if (!ulong.TryParse(GlobalsManager.LevelId, out var result)) { PAM.Logger.LogError((object)"Tried to send local level to client"); ErrorScreen.CreateErrorScreen("Tried to send local level to client, disconnecting...\n\nHost another level and try again"); ((NetworkConnection)connection).Disconnect(); } CallRpc_Client_SetMainLobbyData(connection, result, SteamLobbyManager.Inst.RandSeed, (byte)GlobalsManager.LobbyState, (byte)DataManager.inst.GetSettingEnum("ArcadeHealthMod", 0), (byte)DataManager.inst.GetSettingEnum("ArcadeSpeedMod", 0), DataManager.inst.GetSettingBool("mp_linkedHealth", false)); foreach (KeyValuePair player in GlobalsManager.Players) { CallRpc_Client_RegisterPlayerId(connection, SteamId.op_Implicit(player.Key), player.Value.VGPlayerData.PlayerID, GlobalsManager.Players.Count); } SteamId val = SteamId.op_Implicit(ulong.Parse(((NetworkConnection)connection).Address)); int playerID = GlobalsManager.Players[SteamId.op_Implicit(val)].VGPlayerData.PlayerID; GlobalsManager.ConnIdToSteamId.Add(((NetworkConnection)connection).ConnectionId, val); CallRpc_Multi_RegisterJoinedPlayerId(val, playerID); PAM.Logger.LogInfo((object)("Player " + ((NetworkConnection)connection).Address + " joined game server.")); } public override void OnServerClientDisconnected(ClientNetworkConnection connection) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) ((NetworkManager)this).OnServerClientDisconnected(connection); GlobalsManager.ConnIdToSteamId.Remove(((NetworkConnection)connection).ConnectionId); CallRpc_Multi_PlayerLeft(SteamId.op_Implicit(ulong.Parse(((NetworkConnection)connection).Address))); PAM.Logger.LogInfo((object)("Player " + ((NetworkConnection)connection).Address + " left game server.")); } public int GetPing() { return _facepunchtransport?.GetPing() ?? 9999; } [ClientRpc(/*Could not decode attribute arguments.*/)] private static void Client_RegisterPlayerId(SteamId steamID, int id, int amount) { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_003d: 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) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Expected O, but got Unknown //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) GlobalsManager.HasLoadedBasePlayerIds = false; _amountOfInfo++; PAM.Logger.LogInfo((object)$"Player Id from [{id}] Received, {steamID}//{amount}"); if (GlobalsManager.Players.TryGetValue(SteamId.op_Implicit(steamID), out var value)) { if (steamID.IsLocalPlayer()) { GlobalsManager.LocalPlayerObjectId = id; } value.VGPlayerData.PlayerID = id; } else { VGPlayerData vgPlayerData = new VGPlayerData { PlayerID = id, ControllerID = id }; GlobalsManager.Players.Add(SteamId.op_Implicit(steamID), new PlayerData(vgPlayerData, "placeHolder")); } if (_amountOfInfo >= amount) { _amountOfInfo = 0; PAM.Logger.LogInfo((object)$"Player Id from [{id}] Received"); GlobalsManager.HasLoadedBasePlayerIds = true; } } [MultiRpc(/*Could not decode attribute arguments.*/)] private static void Multi_RegisterJoinedPlayerId(SteamId steamID, int id) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Expected O, but got Unknown //IL_008b: 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) PamInstance?.OnPlayerJoin?.Invoke(SteamId.op_Implicit(steamID)); if (GlobalsManager.IsHosting) { return; } PAM.Logger.LogInfo((object)$"Multi Player Id from [{id}] Received"); if (GlobalsManager.Players.TryGetValue(SteamId.op_Implicit(steamID), out var value)) { if (steamID.IsLocalPlayer()) { GlobalsManager.LocalPlayerObjectId = id; } value.VGPlayerData.PlayerID = id; } else { VGPlayerData vgPlayerData = new VGPlayerData { PlayerID = id, ControllerID = id }; GlobalsManager.Players.Add(SteamId.op_Implicit(steamID), new PlayerData(vgPlayerData, "placeHolder")); } } [ClientRpc(/*Could not decode attribute arguments.*/)] private static void Client_SetMainLobbyData(ulong levelId, int seed, byte state, byte healthMod, byte speedMod, bool linked) { if (state < 3) { GlobalsManager.LobbyState = (SteamLobbyManager.LobbyState)state; } if (GlobalsManager.LobbyState != SteamLobbyManager.LobbyState.Challenge) { GlobalsManager.LevelId = levelId.ToString(); } DataManager.inst.UpdateSettingEnum("ArcadeHealthMod", (int)healthMod); DataManager.inst.UpdateSettingEnum("ArcadeSpeedMod", (int)speedMod); DataManager.inst.UpdateSettingBool("mp_linkedHealth", linked); SteamLobbyManager.Inst.RandSeed = seed; PAM.Logger.LogInfo((object)$"SEED : {seed}"); GlobalsManager.HasLoadedMainLobbyInfo = true; } [MultiRpc(/*Could not decode attribute arguments.*/)] public static void Multi_UpdateLobbyState(byte state) { if (state < 3) { GlobalsManager.LobbyState = (SteamLobbyManager.LobbyState)state; } } [MultiRpc(/*Could not decode attribute arguments.*/)] public static void Multi_UpdateModifier(byte modifier, byte value) { switch (modifier) { case 0: DataManager.inst.UpdateSettingEnum("ArcadeHealthMod", (int)value); break; case 1: DataManager.inst.UpdateSettingEnum("ArcadeSpeedMod", (int)value); break; case 2: DataManager.inst.UpdateSettingBool("mp_linkedHealth", value == 1); break; default: PAM.Logger.LogError((object)""); break; } } [MultiRpc(/*Could not decode attribute arguments.*/)] private static void Multi_PlayerLeft(SteamId steamId) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) PamInstance?.OnPlayerLeave?.Invoke(SteamId.op_Implicit(steamId)); } [ServerRpc(/*Could not decode attribute arguments.*/)] private static void Server_SendModVer(ClientNetworkConnection conn, Version version, string guid) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) if (conn.TryGetSteamId(out var steamId)) { PamInstance?.OnClientModVersionReceived?.Invoke(SteamId.op_Implicit(steamId), guid, version); } } [MethodImpl(MethodImplOptions.NoInlining)] [ClientRpc(/*Could not decode attribute arguments.*/)] public static void Client_AskForMod(string modGuid) { PAM.Logger.LogInfo((object)("Mod requested [" + modGuid + "]")); if (Chainloader.PluginInfos.TryGetValue(modGuid, out var value)) { PAM.Logger.LogInfo((object)"Mod found"); CallRpc_Server_SendModVer(value.Metadata.Version, modGuid); } else { PAM.Logger.LogWarning((object)("Mod [" + modGuid + "] was requested by the host, but it was not found.")); CallRpc_Server_SendModVer(new Version(0, 0, 0, 0), modGuid); } } [MethodImpl(MethodImplOptions.NoInlining)] [ClientRpc(/*Could not decode attribute arguments.*/)] public static void Client_MissingMod(string modGuid) { PAM.Logger.LogError((object)("Mod [" + modGuid + "] is missing or has incorrect version, host requested client to disconnect")); ErrorScreen.CreateErrorScreen("Required mod missing, GUID: " + modGuid + "\n\nDisconnecting..."); ((NetworkManager)PamInstance).Shutdown(); PamInstance = null; if (GlobalsManager.IsMultiplayer) { SteamManager.Inst.EndClient(); SingletonBase.Inst.manager.ClearLoadingTasks(); SingletonBase.Inst.LoadSceneGroup("Menu"); } } private static void CallRpc_Server_SendModVer(Version version, string guid) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Expected O, but got Unknown if (NetworkManager.Instance == null) { return; } if (NetworkManager.Instance.PeerServer) { Server_SendModVer(NetworkManager.Instance.ServerSelfPeerConnection, version, guid); return; } NetworkWriter val = new NetworkWriter(); try { NetWriterExtensions.Write(val, (ushort)58818); val.WriteVersion(version); NetWriterExtensions.Write(val, guid); NetworkManager.Instance.SendToServer(val.GetData(), (SendType)0); } finally { ((IDisposable)val)?.Dispose(); } } public static void Deserialize_Server_SendModVer_58818(ClientNetworkConnection senderConn, NetworkReader reader) { Server_SendModVer(senderConn, reader.ReadVersion(), NetReaderExtensions.ReadString(reader)); } private static void CallRpc_Client_RegisterPlayerId(ClientNetworkConnection target, SteamId steamID, int id, int amount) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown //IL_003c: 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) if (NetworkManager.Instance == null) { return; } if (NetworkManager.Instance.PeerServer && target == NetworkManager.Instance.ServerSelfPeerConnection) { Client_RegisterPlayerId(steamID, id, amount); return; } NetworkWriter val = new NetworkWriter(); try { NetWriterExtensions.Write(val, (ushort)42018); val.WriteSteamId(steamID); NetWriterExtensions.Write(val, id); NetWriterExtensions.Write(val, amount); NetworkManager.Instance.SendToClient(target, val.GetData(), (SendType)0); } finally { ((IDisposable)val)?.Dispose(); } } public static void Deserialize_Client_RegisterPlayerId_42018(ClientNetworkConnection senderConn, NetworkReader reader) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) Client_RegisterPlayerId(reader.ReadSteamId(), NetReaderExtensions.ReadInt32(reader), NetReaderExtensions.ReadInt32(reader)); } private static void CallRpc_Client_SetMainLobbyData(ClientNetworkConnection target, ulong levelId, int seed, byte state, byte healthMod, byte speedMod, bool linked) { //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown if (NetworkManager.Instance == null) { return; } if (NetworkManager.Instance.PeerServer && target == NetworkManager.Instance.ServerSelfPeerConnection) { Client_SetMainLobbyData(levelId, seed, state, healthMod, speedMod, linked); return; } NetworkWriter val = new NetworkWriter(); try { NetWriterExtensions.Write(val, (ushort)14931); NetWriterExtensions.Write(val, levelId); NetWriterExtensions.Write(val, seed); NetWriterExtensions.Write(val, state); NetWriterExtensions.Write(val, healthMod); NetWriterExtensions.Write(val, speedMod); NetWriterExtensions.Write(val, linked); NetworkManager.Instance.SendToClient(target, val.GetData(), (SendType)0); } finally { ((IDisposable)val)?.Dispose(); } } public static void Deserialize_Client_SetMainLobbyData_14931(ClientNetworkConnection senderConn, NetworkReader reader) { Client_SetMainLobbyData(NetReaderExtensions.ReadUInt64(reader), NetReaderExtensions.ReadInt32(reader), NetReaderExtensions.ReadByte(reader), NetReaderExtensions.ReadByte(reader), NetReaderExtensions.ReadByte(reader), NetReaderExtensions.ReadBoolean(reader)); } [MethodImpl(MethodImplOptions.NoInlining)] public static void CallRpc_Client_AskForMod(ClientNetworkConnection target, string modGuid) { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown if (NetworkManager.Instance == null) { return; } if (NetworkManager.Instance.PeerServer && target == NetworkManager.Instance.ServerSelfPeerConnection) { Client_AskForMod(modGuid); return; } NetworkWriter val = new NetworkWriter(); try { NetWriterExtensions.Write(val, (ushort)37620); NetWriterExtensions.Write(val, modGuid); NetworkManager.Instance.SendToClient(target, val.GetData(), (SendType)0); } finally { ((IDisposable)val)?.Dispose(); } } public static void Deserialize_Client_AskForMod_37620(ClientNetworkConnection senderConn, NetworkReader reader) { Client_AskForMod(NetReaderExtensions.ReadString(reader)); } [MethodImpl(MethodImplOptions.NoInlining)] public static void CallRpc_Client_MissingMod(ClientNetworkConnection target, string modGuid) { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown if (NetworkManager.Instance == null) { return; } if (NetworkManager.Instance.PeerServer && target == NetworkManager.Instance.ServerSelfPeerConnection) { Client_MissingMod(modGuid); return; } NetworkWriter val = new NetworkWriter(); try { NetWriterExtensions.Write(val, (ushort)8766); NetWriterExtensions.Write(val, modGuid); NetworkManager.Instance.SendToClient(target, val.GetData(), (SendType)0); } finally { ((IDisposable)val)?.Dispose(); } } public static void Deserialize_Client_MissingMod_8766(ClientNetworkConnection senderConn, NetworkReader reader) { Client_MissingMod(NetReaderExtensions.ReadString(reader)); } private static void CallRpc_Multi_RegisterJoinedPlayerId(SteamId steamID, int id) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) if (NetworkManager.Instance == null) { return; } if (NetworkManager.Instance.PeerServer) { Multi_RegisterJoinedPlayerId(steamID, id); } NetworkWriter val = new NetworkWriter(); try { NetWriterExtensions.Write(val, (ushort)22680); val.WriteSteamId(steamID); NetWriterExtensions.Write(val, id); NetworkManager.Instance.SendToAllClients(val.GetData(), (SendType)0); } finally { ((IDisposable)val)?.Dispose(); } } public static void Deserialize_Multi_RegisterJoinedPlayerId_22680(ClientNetworkConnection senderConn, NetworkReader reader) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) Multi_RegisterJoinedPlayerId(reader.ReadSteamId(), NetReaderExtensions.ReadInt32(reader)); } public static void CallRpc_Multi_UpdateLobbyState(byte state) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown if (NetworkManager.Instance == null) { return; } if (NetworkManager.Instance.PeerServer) { Multi_UpdateLobbyState(state); } NetworkWriter val = new NetworkWriter(); try { NetWriterExtensions.Write(val, (ushort)54154); NetWriterExtensions.Write(val, state); NetworkManager.Instance.SendToAllClients(val.GetData(), (SendType)0); } finally { ((IDisposable)val)?.Dispose(); } } public static void Deserialize_Multi_UpdateLobbyState_54154(ClientNetworkConnection senderConn, NetworkReader reader) { Multi_UpdateLobbyState(NetReaderExtensions.ReadByte(reader)); } public static void CallRpc_Multi_UpdateModifier(byte modifier, byte value) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown if (NetworkManager.Instance == null) { return; } if (NetworkManager.Instance.PeerServer) { Multi_UpdateModifier(modifier, value); } NetworkWriter val = new NetworkWriter(); try { NetWriterExtensions.Write(val, (ushort)43472); NetWriterExtensions.Write(val, modifier); NetWriterExtensions.Write(val, value); NetworkManager.Instance.SendToAllClients(val.GetData(), (SendType)0); } finally { ((IDisposable)val)?.Dispose(); } } public static void Deserialize_Multi_UpdateModifier_43472(ClientNetworkConnection senderConn, NetworkReader reader) { Multi_UpdateModifier(NetReaderExtensions.ReadByte(reader), NetReaderExtensions.ReadByte(reader)); } private static void CallRpc_Multi_PlayerLeft(SteamId steamId) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) if (NetworkManager.Instance == null) { return; } if (NetworkManager.Instance.PeerServer) { Multi_PlayerLeft(steamId); } NetworkWriter val = new NetworkWriter(); try { NetWriterExtensions.Write(val, (ushort)18518); val.WriteSteamId(steamId); NetworkManager.Instance.SendToAllClients(val.GetData(), (SendType)0); } finally { ((IDisposable)val)?.Dispose(); } } public static void Deserialize_Multi_PlayerLeft_18518(ClientNetworkConnection senderConn, NetworkReader reader) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) Multi_PlayerLeft(reader.ReadSteamId()); } } }