Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of RoR2DirectConnect v2.0.5
plugins/RoR2DirectConnect/RoR2DirectConnect.dll
Decompiled 11 hours ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using Facepunch.Steamworks; using HarmonyLib; using Microsoft.CodeAnalysis; using RoR2; using RoR2.Networking; using RoR2.UI; using RoR2.UI.MainMenu; using RoR2DirectConnect.Patches; using RoR2DirectConnect.UI; using TMPro; using UnityEngine; using UnityEngine.Events; using UnityEngine.Networking; using UnityEngine.UI; [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("RoR2DirectConnect")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+78647a700392973a7aa79369da3a616b7fded764")] [assembly: AssemblyProduct("RoR2DirectConnect")] [assembly: AssemblyTitle("RoR2DirectConnect")] [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 RoR2DirectConnect { public class DirectConnectUI : MonoBehaviour { private bool _showWindow; private int _activeTab; private string _platformId = ""; private string _maxPlayers = "4"; private string _hostPort = "7777"; private string _serverPassword = ""; private string _connectAddress = ""; private string _connectPort = "7777"; private string _clientPassword = ""; private List<string> _recentServers = new List<string>(); private bool _bypassSteam = true; private bool _bypassLobby = true; private string _statusMessage = ""; private Color _statusColor = Color.white; private float _statusClearTime; private Vector2 _playerListScroll; private Texture2D _texBg; private Texture2D _texCard; private Texture2D _texInput; private Texture2D _texInputFocus; private Texture2D _texBtnBlue; private Texture2D _texBtnBlueHover; private Texture2D _texBtnGreen; private Texture2D _texBtnGreenHover; private Texture2D _texBtnRed; private Texture2D _texBtnRedHover; private Texture2D _texBtnGray; private Texture2D _texBtnGrayHover; private Texture2D _texTabActive; private Texture2D _texTabInactive; private Texture2D _texTabHover; private Texture2D _texOverlay; private Texture2D _texStatusBar; private GUIStyle _sWindow; private GUIStyle _sCard; private GUIStyle _sTitle; private GUIStyle _sHeader; private GUIStyle _sLabel; private GUIStyle _sSmall; private GUIStyle _sInput; private GUIStyle _sPassword; private GUIStyle _sBtnBlue; private GUIStyle _sBtnGreen; private GUIStyle _sBtnRed; private GUIStyle _sBtnGray; private GUIStyle _sTabActive; private GUIStyle _sTabInactive; private GUIStyle _sStatus; private GUIStyle _sToggle; private GUIStyle _sIndicator; private bool _init; private KeyCode _toggleKey = (KeyCode)287; private const float WIN_W = 480f; private const float WIN_H = 560f; private void Start() { _platformId = Plugin.ConfigPlatformId.Value; _bypassSteam = Plugin.ConfigBypassSteamAuth.Value; _bypassLobby = Plugin.ConfigBypassLobbyCheck.Value; } private void Update() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) if (Input.GetKeyDown(_toggleKey)) { _showWindow = !_showWindow; } if (_statusClearTime > 0f && Time.time > _statusClearTime) { _statusMessage = ""; _statusClearTime = 0f; } } private void InitOnce() { //IL_01d5: Unknown result type (might be due to invalid IL or missing references) //IL_01e1: Unknown result type (might be due to invalid IL or missing references) //IL_01ed: Unknown result type (might be due to invalid IL or missing references) //IL_01f9: Unknown result type (might be due to invalid IL or missing references) //IL_0205: Unknown result type (might be due to invalid IL or missing references) //IL_0212: Unknown result type (might be due to invalid IL or missing references) //IL_021f: Unknown result type (might be due to invalid IL or missing references) //IL_022c: Unknown result type (might be due to invalid IL or missing references) //IL_0239: Unknown result type (might be due to invalid IL or missing references) //IL_0246: Unknown result type (might be due to invalid IL or missing references) //IL_0253: Unknown result type (might be due to invalid IL or missing references) //IL_0260: Unknown result type (might be due to invalid IL or missing references) //IL_026d: Unknown result type (might be due to invalid IL or missing references) //IL_027a: Unknown result type (might be due to invalid IL or missing references) //IL_0287: Unknown result type (might be due to invalid IL or missing references) //IL_0294: Unknown result type (might be due to invalid IL or missing references) //IL_02a1: Unknown result type (might be due to invalid IL or missing references) //IL_02ae: Unknown result type (might be due to invalid IL or missing references) //IL_02b3: Unknown result type (might be due to invalid IL or missing references) //IL_02c4: Unknown result type (might be due to invalid IL or missing references) //IL_02c9: Unknown result type (might be due to invalid IL or missing references) //IL_02d3: Expected O, but got Unknown //IL_02d3: Unknown result type (might be due to invalid IL or missing references) //IL_02d8: Unknown result type (might be due to invalid IL or missing references) //IL_02e2: Expected O, but got Unknown //IL_02e7: Expected O, but got Unknown //IL_02e8: Unknown result type (might be due to invalid IL or missing references) //IL_02ed: Unknown result type (might be due to invalid IL or missing references) //IL_02fe: Unknown result type (might be due to invalid IL or missing references) //IL_0307: Unknown result type (might be due to invalid IL or missing references) //IL_0311: Expected O, but got Unknown //IL_0311: Unknown result type (might be due to invalid IL or missing references) //IL_0318: Unknown result type (might be due to invalid IL or missing references) //IL_0322: Expected O, but got Unknown //IL_0327: Expected O, but got Unknown //IL_0332: Unknown result type (might be due to invalid IL or missing references) //IL_0337: Unknown result type (might be due to invalid IL or missing references) //IL_033f: Unknown result type (might be due to invalid IL or missing references) //IL_0346: Unknown result type (might be due to invalid IL or missing references) //IL_034d: Unknown result type (might be due to invalid IL or missing references) //IL_0353: Unknown result type (might be due to invalid IL or missing references) //IL_0362: Expected O, but got Unknown //IL_036d: Unknown result type (might be due to invalid IL or missing references) //IL_0372: Unknown result type (might be due to invalid IL or missing references) //IL_037a: Unknown result type (might be due to invalid IL or missing references) //IL_0381: Unknown result type (might be due to invalid IL or missing references) //IL_0396: Unknown result type (might be due to invalid IL or missing references) //IL_03a0: 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_03af: Expected O, but got Unknown //IL_03b4: Expected O, but got Unknown //IL_03bf: Unknown result type (might be due to invalid IL or missing references) //IL_03c4: Unknown result type (might be due to invalid IL or missing references) //IL_03cc: Unknown result type (might be due to invalid IL or missing references) //IL_03e1: Unknown result type (might be due to invalid IL or missing references) //IL_03f0: Expected O, but got Unknown //IL_03fb: Unknown result type (might be due to invalid IL or missing references) //IL_0400: Unknown result type (might be due to invalid IL or missing references) //IL_0408: Unknown result type (might be due to invalid IL or missing references) //IL_041d: Unknown result type (might be due to invalid IL or missing references) //IL_042c: Expected O, but got Unknown //IL_0437: Unknown result type (might be due to invalid IL or missing references) //IL_043c: Unknown result type (might be due to invalid IL or missing references) //IL_0444: Unknown result type (might be due to invalid IL or missing references) //IL_044b: Unknown result type (might be due to invalid IL or missing references) //IL_045c: Unknown result type (might be due to invalid IL or missing references) //IL_0462: Unknown result type (might be due to invalid IL or missing references) //IL_046c: Unknown result type (might be due to invalid IL or missing references) //IL_047d: Unknown result type (might be due to invalid IL or missing references) //IL_0483: Unknown result type (might be due to invalid IL or missing references) //IL_048d: Unknown result type (might be due to invalid IL or missing references) //IL_049e: Unknown result type (might be due to invalid IL or missing references) //IL_04a4: Unknown result type (might be due to invalid IL or missing references) //IL_04ae: Unknown result type (might be due to invalid IL or missing references) //IL_04b5: Unknown result type (might be due to invalid IL or missing references) //IL_04bf: Expected O, but got Unknown //IL_04bf: Unknown result type (might be due to invalid IL or missing references) //IL_04ca: Unknown result type (might be due to invalid IL or missing references) //IL_04cf: Unknown result type (might be due to invalid IL or missing references) //IL_04d9: Expected O, but got Unknown //IL_04de: Expected O, but got Unknown //IL_04e5: Unknown result type (might be due to invalid IL or missing references) //IL_04ef: Expected O, but got Unknown //IL_05d1: Unknown result type (might be due to invalid IL or missing references) //IL_05e6: Unknown result type (might be due to invalid IL or missing references) //IL_05eb: Unknown result type (might be due to invalid IL or missing references) //IL_05f3: Unknown result type (might be due to invalid IL or missing references) //IL_05fa: Unknown result type (might be due to invalid IL or missing references) //IL_0601: Unknown result type (might be due to invalid IL or missing references) //IL_0608: Unknown result type (might be due to invalid IL or missing references) //IL_060d: Unknown result type (might be due to invalid IL or missing references) //IL_0617: Expected O, but got Unknown //IL_061c: Expected O, but got Unknown //IL_0627: Unknown result type (might be due to invalid IL or missing references) //IL_062c: 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_0649: Unknown result type (might be due to invalid IL or missing references) //IL_0653: Unknown result type (might be due to invalid IL or missing references) //IL_0668: Unknown result type (might be due to invalid IL or missing references) //IL_0677: Expected O, but got Unknown //IL_0682: Unknown result type (might be due to invalid IL or missing references) //IL_0687: Unknown result type (might be due to invalid IL or missing references) //IL_068f: Unknown result type (might be due to invalid IL or missing references) //IL_0696: Unknown result type (might be due to invalid IL or missing references) //IL_06a2: Expected O, but got Unknown if (!_init) { Color c = default(Color); ((Color)(ref c))..ctor(0.08f, 0.08f, 0.11f, 0.97f); Color c2 = default(Color); ((Color)(ref c2))..ctor(0.14f, 0.14f, 0.18f, 0.95f); Color c3 = default(Color); ((Color)(ref c3))..ctor(0.1f, 0.1f, 0.14f, 1f); Color c4 = default(Color); ((Color)(ref c4))..ctor(0.16f, 0.16f, 0.22f, 1f); Color c5 = default(Color); ((Color)(ref c5))..ctor(0.22f, 0.45f, 0.78f, 1f); Color c6 = default(Color); ((Color)(ref c6))..ctor(0.28f, 0.52f, 0.88f, 1f); Color c7 = default(Color); ((Color)(ref c7))..ctor(0.18f, 0.58f, 0.28f, 1f); Color c8 = default(Color); ((Color)(ref c8))..ctor(0.22f, 0.68f, 0.32f, 1f); Color c9 = default(Color); ((Color)(ref c9))..ctor(0.7f, 0.18f, 0.18f, 1f); Color c10 = default(Color); ((Color)(ref c10))..ctor(0.82f, 0.22f, 0.22f, 1f); Color c11 = default(Color); ((Color)(ref c11))..ctor(0.28f, 0.28f, 0.32f, 1f); Color c12 = default(Color); ((Color)(ref c12))..ctor(0.35f, 0.35f, 0.4f, 1f); Color c13 = default(Color); ((Color)(ref c13))..ctor(0.22f, 0.45f, 0.78f, 1f); Color c14 = default(Color); ((Color)(ref c14))..ctor(0.18f, 0.18f, 0.22f, 1f); Color c15 = default(Color); ((Color)(ref c15))..ctor(0.24f, 0.24f, 0.3f, 1f); Color c16 = default(Color); ((Color)(ref c16))..ctor(0f, 0f, 0f, 0.55f); Color c17 = default(Color); ((Color)(ref c17))..ctor(0.1f, 0.1f, 0.14f, 0.9f); _texBg = Tex(c); _texCard = Tex(c2); _texInput = Tex(c3); _texInputFocus = Tex(c4); _texBtnBlue = Tex(c5); _texBtnBlueHover = Tex(c6); _texBtnGreen = Tex(c7); _texBtnGreenHover = Tex(c8); _texBtnRed = Tex(c9); _texBtnRedHover = Tex(c10); _texBtnGray = Tex(c11); _texBtnGrayHover = Tex(c12); _texTabActive = Tex(c13); _texTabInactive = Tex(c14); _texTabHover = Tex(c15); _texOverlay = Tex(c16); _texStatusBar = Tex(c17); GUIStyle val = new GUIStyle(); val.normal.background = _texBg; val.padding = new RectOffset(0, 0, 0, 0); val.border = new RectOffset(0, 0, 0, 0); _sWindow = val; GUIStyle val2 = new GUIStyle(); val2.normal.background = _texCard; val2.padding = new RectOffset(14, 14, 10, 10); val2.margin = new RectOffset(16, 16, 6, 6); _sCard = val2; GUIStyle val3 = new GUIStyle(GUI.skin.label) { fontSize = 20, fontStyle = (FontStyle)1, alignment = (TextAnchor)4 }; val3.normal.textColor = Color.white; _sTitle = val3; GUIStyle val4 = new GUIStyle(GUI.skin.label) { fontSize = 14, fontStyle = (FontStyle)1 }; val4.normal.textColor = new Color(0.65f, 0.82f, 1f); val4.margin = new RectOffset(0, 0, 2, 4); _sHeader = val4; GUIStyle val5 = new GUIStyle(GUI.skin.label) { fontSize = 13 }; val5.normal.textColor = new Color(0.8f, 0.8f, 0.82f); _sLabel = val5; GUIStyle val6 = new GUIStyle(GUI.skin.label) { fontSize = 11 }; val6.normal.textColor = new Color(0.5f, 0.5f, 0.55f); _sSmall = val6; GUIStyle val7 = new GUIStyle(GUI.skin.textField) { fontSize = 15, alignment = (TextAnchor)3 }; val7.normal.background = _texInput; val7.normal.textColor = Color.white; val7.focused.background = _texInputFocus; val7.focused.textColor = Color.white; val7.hover.background = _texInputFocus; val7.hover.textColor = Color.white; val7.padding = new RectOffset(10, 10, 7, 7); val7.fixedHeight = 32f; val7.margin = new RectOffset(0, 0, 2, 2); _sInput = val7; _sPassword = new GUIStyle(_sInput); _sBtnBlue = MakeBtn(_texBtnBlue, _texBtnBlueHover, 36f); _sBtnGreen = MakeBtn(_texBtnGreen, _texBtnGreenHover, 40f); _sBtnRed = MakeBtn(_texBtnRed, _texBtnRedHover, 40f); _sBtnGray = MakeBtn(_texBtnGray, _texBtnGrayHover, 30f); _sTabActive = MakeBtn(_texTabActive, _texTabActive, 34f); _sTabActive.fontSize = 14; _sTabInactive = MakeBtn(_texTabInactive, _texTabHover, 34f); _sTabInactive.fontSize = 14; _sTabInactive.normal.textColor = new Color(0.65f, 0.65f, 0.7f); _sStatus = new GUIStyle(GUI.skin.label) { fontSize = 13, fontStyle = (FontStyle)1, alignment = (TextAnchor)4, wordWrap = true, padding = new RectOffset(8, 8, 4, 4) }; GUIStyle val8 = new GUIStyle(GUI.skin.toggle) { fontSize = 13 }; val8.normal.textColor = new Color(0.8f, 0.8f, 0.82f); val8.onNormal.textColor = new Color(0.45f, 0.95f, 0.5f); _sToggle = val8; _sIndicator = new GUIStyle(GUI.skin.label) { fontSize = 12, fontStyle = (FontStyle)1, alignment = (TextAnchor)4 }; _init = true; } } private void OnGUI() { //IL_0025: 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_006c: Unknown result type (might be due to invalid IL or missing references) if (_showWindow) { InitOnce(); GUI.DrawTexture(new Rect(0f, 0f, (float)Screen.width, (float)Screen.height), (Texture)(object)_texOverlay); float num = ((float)Screen.width - 480f) / 2f; float num2 = ((float)Screen.height - 560f) / 2f; Rect val = new Rect(num, num2, 480f, 560f); GUI.Box(val, GUIContent.none, _sWindow); GUILayout.BeginArea(val); DrawPanel(); GUILayout.EndArea(); } } private void DrawPanel() { //IL_0161: Unknown result type (might be due to invalid IL or missing references) //IL_0166: 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_0186: Expected O, but got Unknown //IL_0190: Expected O, but got Unknown //IL_019c: Unknown result type (might be due to invalid IL or missing references) GUILayout.Space(12f); GUILayout.Label("DIRECT CONNECT", _sTitle, Array.Empty<GUILayoutOption>()); GUILayout.Space(4f); GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); GUILayout.FlexibleSpace(); if (GUILayout.Button("Host", (_activeTab == 0) ? _sTabActive : _sTabInactive, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(120f) })) { _activeTab = 0; } if (GUILayout.Button("Join", (_activeTab == 1) ? _sTabActive : _sTabInactive, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(120f) })) { _activeTab = 1; } if (GUILayout.Button("Settings", (_activeTab == 2) ? _sTabActive : _sTabInactive, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(120f) })) { _activeTab = 2; } GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); GUILayout.Space(4f); switch (_activeTab) { case 0: DrawHostTab(); break; case 1: DrawJoinTab(); break; case 2: DrawSettingsTab(); break; } if (!string.IsNullOrEmpty(_statusMessage)) { GUILayout.Space(4f); GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); GUILayout.Space(16f); GUIStyle val = new GUIStyle(); val.normal.background = _texStatusBar; val.padding = new RectOffset(8, 8, 4, 4); GUILayout.BeginVertical(val, Array.Empty<GUILayoutOption>()); _sStatus.normal.textColor = _statusColor; GUILayout.Label(_statusMessage, _sStatus, Array.Empty<GUILayoutOption>()); GUILayout.EndVertical(); GUILayout.Space(16f); GUILayout.EndHorizontal(); } GUILayout.FlexibleSpace(); DrawIndicator(); GUILayout.Space(8f); GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); GUILayout.FlexibleSpace(); GUILayout.Label("Press F6 to close", _sSmall, Array.Empty<GUILayoutOption>()); GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); GUILayout.Space(6f); } private void DrawHostTab() { GUILayout.BeginVertical(_sCard, Array.Empty<GUILayoutOption>()); GUILayout.Label("SERVER SETTINGS", _sHeader, Array.Empty<GUILayoutOption>()); Row("Port", ref _hostPort, 80f); Row("Max Players", ref _maxPlayers, 80f); PasswordRow("Password", ref _serverPassword); GUILayout.Label("Leave empty for no password", _sSmall, Array.Empty<GUILayoutOption>()); GUILayout.Space(6f); if (!NetworkServer.active) { if (GUILayout.Button("START HOST", _sBtnGreen, Array.Empty<GUILayoutOption>())) { DoHost(); } } else { if (GUILayout.Button("STOP HOST", _sBtnRed, Array.Empty<GUILayoutOption>())) { DoDisconnect(); } GUILayout.Space(4f); int num = (((Object)(object)NetworkManagerSystem.singleton != (Object)null) ? ((NetworkManager)NetworkManagerSystem.singleton).networkPort : 7777); int count = NetworkServer.connections.Count; GUILayout.Label($"Listening on port {num} — {count} connection(s)", _sSmall, Array.Empty<GUILayoutOption>()); } GUILayout.EndVertical(); if (NetworkServer.active || NetworkClient.active) { DrawPlayerList(); } } private void DrawJoinTab() { GUILayout.BeginVertical(_sCard, Array.Empty<GUILayoutOption>()); GUILayout.Label("CONNECT TO SERVER", _sHeader, Array.Empty<GUILayoutOption>()); GUILayout.Label("IPv4: 192.168.1.100 IPv6: [::1] or [2001:db8::1]", _sSmall, Array.Empty<GUILayoutOption>()); GUILayout.Space(2f); GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); GUILayout.Label("Address", _sLabel, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(65f) }); _connectAddress = GUILayout.TextField(_connectAddress, _sInput, Array.Empty<GUILayoutOption>()); GUILayout.Label(":", _sLabel, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(8f) }); _connectPort = GUILayout.TextField(_connectPort, _sInput, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(65f) }); GUILayout.EndHorizontal(); PasswordRow("Password", ref _clientPassword); GUILayout.Space(6f); if (!NetworkClient.active && !NetworkServer.active) { if (GUILayout.Button("CONNECT", _sBtnGreen, Array.Empty<GUILayoutOption>())) { DoConnect(); } } else if (GUILayout.Button("DISCONNECT", _sBtnRed, Array.Empty<GUILayoutOption>())) { DoDisconnect(); } GUILayout.EndVertical(); if (_recentServers.Count > 0) { GUILayout.BeginVertical(_sCard, Array.Empty<GUILayoutOption>()); GUILayout.Label("RECENT", _sHeader, Array.Empty<GUILayoutOption>()); foreach (string recentServer in _recentServers) { if (GUILayout.Button(recentServer, _sBtnGray, Array.Empty<GUILayoutOption>())) { ParseRecent(recentServer); } } GUILayout.EndVertical(); } if (NetworkClient.active) { DrawPlayerList(); } } private void DrawSettingsTab() { //IL_00bc: 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) GUILayout.BeginVertical(_sCard, Array.Empty<GUILayoutOption>()); GUILayout.Label("IDENTITY", _sHeader, Array.Empty<GUILayoutOption>()); GUILayout.Label("Platform ID — each player must use a different number", _sSmall, Array.Empty<GUILayoutOption>()); GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); _platformId = GUILayout.TextField(_platformId, _sInput, Array.Empty<GUILayoutOption>()); if (GUILayout.Button("SAVE", _sBtnBlue, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(70f) })) { if (ulong.TryParse(_platformId, out var _)) { Plugin.ConfigPlatformId.Value = _platformId; SetStatus("ID saved!", Color.green); } else { SetStatus("Invalid! Must be a number.", Color.red); } } GUILayout.EndHorizontal(); GUILayout.EndVertical(); GUILayout.BeginVertical(_sCard, Array.Empty<GUILayoutOption>()); GUILayout.Label("STEAM BYPASS", _sHeader, Array.Empty<GUILayoutOption>()); bool flag = GUILayout.Toggle(_bypassSteam, " Bypass Steam Authentication", _sToggle, Array.Empty<GUILayoutOption>()); if (flag != _bypassSteam) { _bypassSteam = flag; Plugin.ConfigBypassSteamAuth.Value = flag; } bool flag2 = GUILayout.Toggle(_bypassLobby, " Bypass Steam Lobby", _sToggle, Array.Empty<GUILayoutOption>()); if (flag2 != _bypassLobby) { _bypassLobby = flag2; Plugin.ConfigBypassLobbyCheck.Value = flag2; } GUILayout.Space(4f); GUILayout.Label("Both must be ON for direct connect to work without Steam.", _sSmall, Array.Empty<GUILayoutOption>()); GUILayout.EndVertical(); } private void DrawPlayerList() { //IL_0027: 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_0044: Unknown result type (might be due to invalid IL or missing references) GUILayout.BeginVertical(_sCard, Array.Empty<GUILayoutOption>()); GUILayout.Label("PLAYERS", _sHeader, Array.Empty<GUILayoutOption>()); _playerListScroll = GUILayout.BeginScrollView(_playerListScroll, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(60f) }); ReadOnlyCollection<NetworkUser> readOnlyInstancesList = NetworkUser.readOnlyInstancesList; if (readOnlyInstancesList.Count == 0) { GUILayout.Label("No players connected yet.", _sSmall, Array.Empty<GUILayoutOption>()); } else { foreach (NetworkUser item in readOnlyInstancesList) { string text = item.userName ?? "Unknown"; string text2 = (((NetworkBehaviour)item).isLocalPlayer ? " (You)" : ""); GUILayout.Label(" " + text + text2, _sLabel, Array.Empty<GUILayoutOption>()); } } GUILayout.EndScrollView(); GUILayout.EndVertical(); } private void DrawIndicator() { //IL_009d: Unknown result type (might be due to invalid IL or missing references) string text; Color textColor = default(Color); if (NetworkServer.active && NetworkClient.active) { text = "HOST (Server + Client)"; ((Color)(ref textColor))..ctor(0.35f, 0.95f, 0.45f); } else if (NetworkServer.active) { text = "SERVER"; ((Color)(ref textColor))..ctor(0.4f, 0.75f, 0.95f); } else if (NetworkClient.active) { text = "CONNECTED"; ((Color)(ref textColor))..ctor(0.35f, 0.95f, 0.45f); } else { text = "OFFLINE"; ((Color)(ref textColor))..ctor(0.55f, 0.55f, 0.6f); } _sIndicator.normal.textColor = textColor; GUILayout.Label(text, _sIndicator, Array.Empty<GUILayoutOption>()); } private void DoHost() { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_002a: 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_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: 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) if (!Object.op_Implicit((Object)(object)NetworkManagerSystem.singleton)) { SetStatus("NetworkManager not ready.", Color.red); return; } if (NetworkServer.active) { SetStatus("Server already running.", Color.yellow); return; } if (!int.TryParse(_maxPlayers, out var result) || result < 1 || result > 16) { result = 4; } if (!string.IsNullOrEmpty(_platformId)) { Plugin.ConfigPlatformId.Value = _platformId; } SetConVar("sv_password", _serverPassword); if (ushort.TryParse(_hostPort, out var result2)) { SetConVar("sv_port", result2.ToString()); } NetworkManagerSystem.singleton.desiredHost = new HostDescription(new HostingParameters { listen = true, maxPlayers = result }); string arg = (string.IsNullOrEmpty(_serverPassword) ? "no password" : "password set"); SetStatus($"Hosting on port {_hostPort}, {result} players, {arg}", Color.green); } private void DoConnect() { //IL_0012: 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_010b: 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_0162: 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_0178: Unknown result type (might be due to invalid IL or missing references) //IL_0188: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)NetworkManagerSystem.singleton)) { SetStatus("NetworkManager not ready.", Color.red); return; } string text = _connectAddress.Trim(); if (string.IsNullOrEmpty(text)) { SetStatus("Enter an address.", Color.red); return; } if (!string.IsNullOrEmpty(_platformId)) { Plugin.ConfigPlatformId.Value = _platformId; } SetConVar("cl_password", _clientPassword); string text2 = ((text.Contains(":") && !text.StartsWith("[")) ? ("[" + text + "]:" + _connectPort) : ((!text.StartsWith("[")) ? (text + ":" + _connectPort) : (text.Contains("]:") ? text : (text.TrimEnd(']') + "]:" + _connectPort)))); AddressPortPair val = default(AddressPortPair); if (!AddressPortPair.TryParse(text2, ref val) || !((AddressPortPair)(ref val)).isValid) { SetStatus("Cannot parse: " + text2, Color.red); return; } string item = text + ":" + _connectPort; _recentServers.Remove(item); _recentServers.Insert(0, item); if (_recentServers.Count > 5) { _recentServers.RemoveAt(5); } NetworkManagerSystem.singleton.desiredHost = new HostDescription(val); SetStatus($"Connecting to {val.address}:{val.port} ...", Color.cyan); } private void DoDisconnect() { //IL_0012: 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) if (Object.op_Implicit((Object)(object)NetworkManagerSystem.singleton)) { NetworkManagerSystem.singleton.desiredHost = HostDescription.none; if (NetworkServer.active || NetworkClient.active) { ((NetworkManager)NetworkManagerSystem.singleton).StopHost(); } SetStatus("Disconnected.", Color.yellow); } } private void ParseRecent(string entry) { int num = entry.LastIndexOf(':'); if (num > 0) { _connectAddress = entry.Substring(0, num); _connectPort = entry.Substring(num + 1); } _activeTab = 1; } private void Row(string label, ref string val, float fieldW) { GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); GUILayout.Label(label, _sLabel, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(90f) }); val = GUILayout.TextField(val, _sInput, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(fieldW) }); GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); } private void PasswordRow(string label, ref string val) { GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); GUILayout.Label(label, _sLabel, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(90f) }); val = GUILayout.PasswordField(val, '*', _sInput, Array.Empty<GUILayoutOption>()); GUILayout.EndHorizontal(); } private static void SetConVar(string name, string value) { try { Console instance = Console.instance; if ((Object)(object)instance != (Object)null) { instance.SubmitCmd((NetworkUser)null, name + " \"" + value + "\"", false); } } catch (Exception ex) { Plugin.Log.LogWarning((object)("SetConVar " + name + ": " + ex.Message)); } } private void SetStatus(string msg, Color color) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) _statusMessage = msg; _statusColor = color; _statusClearTime = Time.time + 6f; Plugin.Log.LogInfo((object)("[UI] " + msg)); } private GUIStyle MakeBtn(Texture2D normal, Texture2D hover, float h) { //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_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0025: 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_0037: 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_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_005d: 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_007e: 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_008f: 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_009e: Expected O, but got Unknown //IL_009f: Expected O, but got Unknown GUIStyle val = new GUIStyle(GUI.skin.button) { fontSize = 15, fontStyle = (FontStyle)1, alignment = (TextAnchor)4 }; val.normal.background = normal; val.normal.textColor = Color.white; val.hover.background = hover; val.hover.textColor = Color.white; val.active.background = normal; val.active.textColor = new Color(0.8f, 0.8f, 0.8f); val.fixedHeight = h; val.margin = new RectOffset(0, 0, 3, 3); return val; } private static Texture2D Tex(Color c) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_0010: 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_0018: 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_0020: 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_0028: 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) Texture2D val = new Texture2D(2, 2); Color[] pixels = (Color[])(object)new Color[4] { c, c, c, c }; val.SetPixels(pixels); val.Apply(); return val; } } public static class Localization { public const string BUTTON_DIRECT_CONNECT = "DC_BUTTON_DIRECT_CONNECT"; public const string TITLE = "DC_TITLE"; public const string HOST_SECTION = "DC_HOST_SECTION"; public const string JOIN_SECTION = "DC_JOIN_SECTION"; public const string LABEL_DISPLAY_NAME = "DC_LABEL_DISPLAY_NAME"; public const string LABEL_MAX_PLAYERS = "DC_LABEL_MAX_PLAYERS"; public const string LABEL_PASSWORD = "DC_LABEL_PASSWORD"; public const string LABEL_ADDRESS = "DC_LABEL_ADDRESS"; public const string LABEL_PORT = "DC_LABEL_PORT"; public const string PLACEHOLDER_NICKNAME = "DC_PH_NICKNAME"; public const string PLACEHOLDER_ADDRESS = "DC_PH_ADDRESS"; public const string PLACEHOLDER_PASSWORD = "DC_PH_PASSWORD"; public const string IPV_HINT = "DC_IPV_HINT"; public const string PW_HINT = "DC_PW_HINT"; public const string BTN_HOST = "DC_BTN_HOST"; public const string BTN_CONNECT = "DC_BTN_CONNECT"; public const string BTN_BACK = "DC_BTN_BACK"; private static readonly Dictionary<string, Dictionary<string, string>> _translations = new Dictionary<string, Dictionary<string, string>> { ["en"] = new Dictionary<string, string> { ["DC_BUTTON_DIRECT_CONNECT"] = "IP Direct Connect", ["DC_TITLE"] = "IP DIRECT CONNECT", ["DC_HOST_SECTION"] = "HOST A GAME", ["DC_JOIN_SECTION"] = "JOIN A GAME", ["DC_LABEL_DISPLAY_NAME"] = "Display Name", ["DC_LABEL_MAX_PLAYERS"] = "Max Players", ["DC_LABEL_PASSWORD"] = "Password", ["DC_LABEL_ADDRESS"] = "Address", ["DC_LABEL_PORT"] = "Port", ["DC_PH_NICKNAME"] = "Enter your nickname...", ["DC_PH_ADDRESS"] = "IP address...", ["DC_PH_PASSWORD"] = "optional", ["DC_IPV_HINT"] = "Supports IPv4 and IPv6 — Example: 192.168.1.100 or [::1]", ["DC_PW_HINT"] = "Leave password empty for no password", ["DC_BTN_HOST"] = "HOST GAME", ["DC_BTN_CONNECT"] = "CONNECT", ["DC_BTN_BACK"] = "BACK" }, ["zh-CN"] = new Dictionary<string, string> { ["DC_BUTTON_DIRECT_CONNECT"] = "IP 直连", ["DC_TITLE"] = "IP 直连", ["DC_HOST_SECTION"] = "创建房间", ["DC_JOIN_SECTION"] = "加入房间", ["DC_LABEL_DISPLAY_NAME"] = "显示名称", ["DC_LABEL_MAX_PLAYERS"] = "最大人数", ["DC_LABEL_PASSWORD"] = "密码", ["DC_LABEL_ADDRESS"] = "地址", ["DC_LABEL_PORT"] = "端口", ["DC_PH_NICKNAME"] = "输入你的昵称...", ["DC_PH_ADDRESS"] = "IP 地址...", ["DC_PH_PASSWORD"] = "可选", ["DC_IPV_HINT"] = "支持 IPv4 和 IPv6 — 示例: 192.168.1.100 或 [::1]", ["DC_PW_HINT"] = "留空表示不设密码", ["DC_BTN_HOST"] = "创建房间", ["DC_BTN_CONNECT"] = "连接", ["DC_BTN_BACK"] = "返回" }, ["zh-TW"] = new Dictionary<string, string> { ["DC_BUTTON_DIRECT_CONNECT"] = "IP 直連", ["DC_TITLE"] = "IP 直連", ["DC_HOST_SECTION"] = "建立房間", ["DC_JOIN_SECTION"] = "加入房間", ["DC_LABEL_DISPLAY_NAME"] = "顯示名稱", ["DC_LABEL_MAX_PLAYERS"] = "最大人數", ["DC_LABEL_PASSWORD"] = "密碼", ["DC_LABEL_ADDRESS"] = "地址", ["DC_LABEL_PORT"] = "端口", ["DC_PH_NICKNAME"] = "輸入你的暱稱...", ["DC_PH_ADDRESS"] = "IP 地址...", ["DC_PH_PASSWORD"] = "可選", ["DC_IPV_HINT"] = "支援 IPv4 和 IPv6 — 範例: 192.168.1.100 或 [::1]", ["DC_PW_HINT"] = "留空表示不設密碼", ["DC_BTN_HOST"] = "建立房間", ["DC_BTN_CONNECT"] = "連線", ["DC_BTN_BACK"] = "返回" }, ["ja"] = new Dictionary<string, string> { ["DC_BUTTON_DIRECT_CONNECT"] = "IP直接接続", ["DC_TITLE"] = "IP直接接続", ["DC_HOST_SECTION"] = "ゲームをホスト", ["DC_JOIN_SECTION"] = "ゲームに参加", ["DC_LABEL_DISPLAY_NAME"] = "表示名", ["DC_LABEL_MAX_PLAYERS"] = "最大人数", ["DC_LABEL_PASSWORD"] = "パスワード", ["DC_LABEL_ADDRESS"] = "アドレス", ["DC_LABEL_PORT"] = "ポート", ["DC_PH_NICKNAME"] = "ニックネームを入力...", ["DC_PH_ADDRESS"] = "IPアドレス...", ["DC_PH_PASSWORD"] = "任意", ["DC_IPV_HINT"] = "IPv4とIPv6に対応 — 例: 192.168.1.100 または [::1]", ["DC_PW_HINT"] = "空欄でパスワードなし", ["DC_BTN_HOST"] = "ホスト開始", ["DC_BTN_CONNECT"] = "接続", ["DC_BTN_BACK"] = "戻る" }, ["ko"] = new Dictionary<string, string> { ["DC_BUTTON_DIRECT_CONNECT"] = "IP 직접 연결", ["DC_TITLE"] = "IP 직접 연결", ["DC_HOST_SECTION"] = "게임 호스트", ["DC_JOIN_SECTION"] = "게임 참가", ["DC_LABEL_DISPLAY_NAME"] = "표시 이름", ["DC_LABEL_MAX_PLAYERS"] = "최대 인원", ["DC_LABEL_PASSWORD"] = "비밀번호", ["DC_LABEL_ADDRESS"] = "주소", ["DC_LABEL_PORT"] = "포트", ["DC_PH_NICKNAME"] = "닉네임 입력...", ["DC_PH_ADDRESS"] = "IP 주소...", ["DC_PH_PASSWORD"] = "선택사항", ["DC_IPV_HINT"] = "IPv4 및 IPv6 지원 — 예: 192.168.1.100 또는 [::1]", ["DC_PW_HINT"] = "비워두면 비밀번호 없음", ["DC_BTN_HOST"] = "호스트 시작", ["DC_BTN_CONNECT"] = "연결", ["DC_BTN_BACK"] = "뒤로" }, ["ru"] = new Dictionary<string, string> { ["DC_BUTTON_DIRECT_CONNECT"] = "Прямое подключение", ["DC_TITLE"] = "ПРЯМОЕ ПОДКЛЮЧЕНИЕ", ["DC_HOST_SECTION"] = "СОЗДАТЬ ИГРУ", ["DC_JOIN_SECTION"] = "ПРИСОЕДИНИТЬСЯ", ["DC_LABEL_DISPLAY_NAME"] = "Имя", ["DC_LABEL_MAX_PLAYERS"] = "Макс. игроков", ["DC_LABEL_PASSWORD"] = "Пароль", ["DC_LABEL_ADDRESS"] = "Адрес", ["DC_LABEL_PORT"] = "Порт", ["DC_PH_NICKNAME"] = "Введите никнейм...", ["DC_PH_ADDRESS"] = "IP адрес...", ["DC_PH_PASSWORD"] = "необязательно", ["DC_IPV_HINT"] = "Поддержка IPv4 и IPv6 — Пример: 192.168.1.100 или [::1]", ["DC_PW_HINT"] = "Оставьте пустым для игры без пароля", ["DC_BTN_HOST"] = "СОЗДАТЬ", ["DC_BTN_CONNECT"] = "ПОДКЛЮЧИТЬСЯ", ["DC_BTN_BACK"] = "НАЗАД" }, ["de"] = new Dictionary<string, string> { ["DC_BUTTON_DIRECT_CONNECT"] = "IP-Direktverbindung", ["DC_TITLE"] = "IP-DIREKTVERBINDUNG", ["DC_HOST_SECTION"] = "SPIEL HOSTEN", ["DC_JOIN_SECTION"] = "SPIEL BEITRETEN", ["DC_LABEL_DISPLAY_NAME"] = "Anzeigename", ["DC_LABEL_MAX_PLAYERS"] = "Max. Spieler", ["DC_LABEL_PASSWORD"] = "Passwort", ["DC_LABEL_ADDRESS"] = "Adresse", ["DC_LABEL_PORT"] = "Port", ["DC_PH_NICKNAME"] = "Nickname eingeben...", ["DC_PH_ADDRESS"] = "IP-Adresse...", ["DC_PH_PASSWORD"] = "optional", ["DC_IPV_HINT"] = "IPv4 und IPv6 — Beispiel: 192.168.1.100 oder [::1]", ["DC_PW_HINT"] = "Leer lassen für kein Passwort", ["DC_BTN_HOST"] = "HOSTEN", ["DC_BTN_CONNECT"] = "VERBINDEN", ["DC_BTN_BACK"] = "ZURÜCK" }, ["fr"] = new Dictionary<string, string> { ["DC_BUTTON_DIRECT_CONNECT"] = "Connexion directe IP", ["DC_TITLE"] = "CONNEXION DIRECTE IP", ["DC_HOST_SECTION"] = "HÉBERGER", ["DC_JOIN_SECTION"] = "REJOINDRE", ["DC_LABEL_DISPLAY_NAME"] = "Pseudo", ["DC_LABEL_MAX_PLAYERS"] = "Joueurs max", ["DC_LABEL_PASSWORD"] = "Mot de passe", ["DC_LABEL_ADDRESS"] = "Adresse", ["DC_LABEL_PORT"] = "Port", ["DC_PH_NICKNAME"] = "Entrez votre pseudo...", ["DC_PH_ADDRESS"] = "Adresse IP...", ["DC_PH_PASSWORD"] = "facultatif", ["DC_IPV_HINT"] = "IPv4 et IPv6 — Exemple : 192.168.1.100 ou [::1]", ["DC_PW_HINT"] = "Laisser vide = pas de mot de passe", ["DC_BTN_HOST"] = "HÉBERGER", ["DC_BTN_CONNECT"] = "CONNECTER", ["DC_BTN_BACK"] = "RETOUR" }, ["es"] = new Dictionary<string, string> { ["DC_BUTTON_DIRECT_CONNECT"] = "Conexión directa IP", ["DC_TITLE"] = "CONEXIÓN DIRECTA IP", ["DC_HOST_SECTION"] = "CREAR PARTIDA", ["DC_JOIN_SECTION"] = "UNIRSE", ["DC_LABEL_DISPLAY_NAME"] = "Nombre", ["DC_LABEL_MAX_PLAYERS"] = "Máx. jugadores", ["DC_LABEL_PASSWORD"] = "Contraseña", ["DC_LABEL_ADDRESS"] = "Dirección", ["DC_LABEL_PORT"] = "Puerto", ["DC_PH_NICKNAME"] = "Introduce tu apodo...", ["DC_PH_ADDRESS"] = "Dirección IP...", ["DC_PH_PASSWORD"] = "opcional", ["DC_IPV_HINT"] = "IPv4 e IPv6 — Ejemplo: 192.168.1.100 o [::1]", ["DC_PW_HINT"] = "Dejar vacío = sin contraseña", ["DC_BTN_HOST"] = "CREAR", ["DC_BTN_CONNECT"] = "CONECTAR", ["DC_BTN_BACK"] = "VOLVER" }, ["pt-BR"] = new Dictionary<string, string> { ["DC_BUTTON_DIRECT_CONNECT"] = "Conexão direta IP", ["DC_TITLE"] = "CONEXÃO DIRETA IP", ["DC_HOST_SECTION"] = "HOSPEDAR JOGO", ["DC_JOIN_SECTION"] = "ENTRAR EM JOGO", ["DC_LABEL_DISPLAY_NAME"] = "Nome", ["DC_LABEL_MAX_PLAYERS"] = "Máx. jogadores", ["DC_LABEL_PASSWORD"] = "Senha", ["DC_LABEL_ADDRESS"] = "Endereço", ["DC_LABEL_PORT"] = "Porta", ["DC_PH_NICKNAME"] = "Digite seu apelido...", ["DC_PH_ADDRESS"] = "Endereço IP...", ["DC_PH_PASSWORD"] = "opcional", ["DC_IPV_HINT"] = "IPv4 e IPv6 — Exemplo: 192.168.1.100 ou [::1]", ["DC_PW_HINT"] = "Deixe vazio para sem senha", ["DC_BTN_HOST"] = "HOSPEDAR", ["DC_BTN_CONNECT"] = "CONECTAR", ["DC_BTN_BACK"] = "VOLTAR" }, ["tr"] = new Dictionary<string, string> { ["DC_BUTTON_DIRECT_CONNECT"] = "IP Doğrudan Bağlantı", ["DC_TITLE"] = "IP DOĞRUDAN BAĞLANTI", ["DC_HOST_SECTION"] = "OYUN OLUŞTUR", ["DC_JOIN_SECTION"] = "OYUNA KATIL", ["DC_LABEL_DISPLAY_NAME"] = "Görünen Ad", ["DC_LABEL_MAX_PLAYERS"] = "Maks. Oyuncu", ["DC_LABEL_PASSWORD"] = "Şifre", ["DC_LABEL_ADDRESS"] = "Adres", ["DC_LABEL_PORT"] = "Port", ["DC_PH_NICKNAME"] = "Takma adınızı girin...", ["DC_PH_ADDRESS"] = "IP adresi...", ["DC_PH_PASSWORD"] = "isteğe bağlı", ["DC_IPV_HINT"] = "IPv4 ve IPv6 — Örnek: 192.168.1.100 veya [::1]", ["DC_PW_HINT"] = "Boş bırakırsanız şifre yok", ["DC_BTN_HOST"] = "OLUŞTUR", ["DC_BTN_CONNECT"] = "BAĞLAN", ["DC_BTN_BACK"] = "GERİ" } }; public static void RegisterAll() { foreach (KeyValuePair<string, Dictionary<string, string>> translation in _translations) { Language val = Language.FindLanguageByName(translation.Key); if (val == null) { continue; } foreach (KeyValuePair<string, string> item in translation.Value) { val.SetStringByToken(item.Key, item.Value); } } Language currentLanguage = Language.currentLanguage; if (currentLanguage != null && !_translations.ContainsKey(currentLanguage.name)) { foreach (KeyValuePair<string, string> item2 in _translations["en"]) { currentLanguage.SetStringByToken(item2.Key, item2.Value); } } Plugin.Log.LogInfo((object)$"Localization registered for {_translations.Count} languages."); } public static string Get(string token) { return Language.GetString(token); } } [BepInPlugin("com.ror2.directconnect", "RoR2DirectConnect", "2.0.5")] public class Plugin : BaseUnityPlugin { public const string PluginGUID = "com.ror2.directconnect"; public const string PluginName = "RoR2DirectConnect"; public const string PluginVersion = "2.0.5"; public static ConfigEntry<string> ConfigPlatformId; public static ConfigEntry<string> ConfigDisplayName; public static ConfigEntry<bool> ConfigBypassSteamAuth; public static ConfigEntry<bool> ConfigBypassLobbyCheck; public static ConfigEntry<string> ConfigLastAddress; public static ConfigEntry<string> ConfigLastPort; public static ConfigEntry<string> ConfigLastMaxPlayers; public static ConfigEntry<string> ConfigLastHostPassword; public static ConfigEntry<string> ConfigLastClientPassword; private Harmony _harmony; public static Plugin Instance { get; private set; } public static ManualLogSource Log { get; private set; } public static bool DirectConnectActive { get; set; } private void Awake() { //IL_0153: Unknown result type (might be due to invalid IL or missing references) //IL_015d: Expected O, but got Unknown Instance = this; Log = ((BaseUnityPlugin)this).Logger; ConfigPlatformId = ((BaseUnityPlugin)this).Config.Bind<string>("General", "PlatformId", "76561198000000000", "Custom Platform ID for direct connect. Each player must use a unique ID."); ConfigDisplayName = ((BaseUnityPlugin)this).Config.Bind<string>("General", "DisplayName", "", "Your in-game display name for direct connect. If empty, falls back to profile name."); ConfigBypassSteamAuth = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "BypassSteamAuth", true, "Bypass Steam authentication. Required for LAN/tunneling play."); ConfigBypassLobbyCheck = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "BypassLobbyCheck", true, "Bypass Steam lobby check when hosting. Required for direct IP hosting."); ConfigLastAddress = ((BaseUnityPlugin)this).Config.Bind<string>("SavedUI", "LastAddress", "", "Last used server address."); ConfigLastPort = ((BaseUnityPlugin)this).Config.Bind<string>("SavedUI", "LastPort", "7777", "Last used port."); ConfigLastMaxPlayers = ((BaseUnityPlugin)this).Config.Bind<string>("SavedUI", "LastMaxPlayers", "4", "Last used max players."); ConfigLastHostPassword = ((BaseUnityPlugin)this).Config.Bind<string>("SavedUI", "LastHostPassword", "", "Last used host password."); ConfigLastClientPassword = ((BaseUnityPlugin)this).Config.Bind<string>("SavedUI", "LastClientPassword", "", "Last used client password."); _harmony = new Harmony("com.ror2.directconnect"); _harmony.PatchAll(typeof(AddressPortPairPatch)); _harmony.PatchAll(typeof(PlatformAuthPatch)); _harmony.PatchAll(typeof(AddPlayerIdFromPlatformPatch)); _harmony.PatchAll(typeof(PlatformHostPatch)); _harmony.PatchAll(typeof(UpdateServerPatch)); _harmony.PatchAll(typeof(InitPlatformServerPatch)); _harmony.PatchAll(typeof(InitP2PPatch)); SteamServerPatches.Apply(_harmony); _harmony.PatchAll(typeof(CreateLobbyPatch)); _harmony.PatchAll(typeof(JoinLobbyPatch)); _harmony.PatchAll(typeof(OnLobbyJoinedPatch)); _harmony.PatchAll(typeof(IsInLobbyPatch)); _harmony.PatchAll(typeof(OwnsLobbyPatch)); _harmony.PatchAll(typeof(SteamLobbyOnStopClientPatch)); _harmony.PatchAll(typeof(EnsureDesiredHostPatch)); _harmony.PatchAll(typeof(SteamLobbyFinderUpdatePatch)); _harmony.PatchAll(typeof(ResetOnStopClient)); _harmony.PatchAll(typeof(ResetOnStopHost)); _harmony.PatchAll(typeof(DisplayNamePatch)); _harmony.PatchAll(typeof(ResolveNamePatch)); _harmony.PatchAll(typeof(UpdateUserNamePatch)); Language.onCurrentLanguageChanged += Localization.RegisterAll; RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, new Action(Localization.RegisterAll)); _harmony.PatchAll(typeof(MenuInjector)); _harmony.PatchAll(typeof(DirectConnectCommands)); ((Component)this).gameObject.AddComponent<DirectConnectUI>(); Log.LogInfo((object)"RoR2DirectConnect v2.0 loaded! Native UI injected into Multiplayer menu."); } private void OnDestroy() { Harmony harmony = _harmony; if (harmony != null) { harmony.UnpatchSelf(); } } } } namespace RoR2DirectConnect.UI { public class DirectConnectPanel : MonoBehaviour { [CompilerGenerated] private sealed class <WaitForConnectionOrRestore>d__15 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public AddressPortPair pair; public DirectConnectPanel <>4__this; private float <t>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <WaitForConnectionOrRestore>d__15(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_015d: 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_00a4: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; DirectConnectPanel directConnectPanel = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; <t>5__2 = 0f; break; case 1: <>1__state = -1; break; } if (<t>5__2 < 10f) { if (NetworkClient.active && NetworkClient.allClients.Count > 0) { NetworkClient val = NetworkClient.allClients[0]; if (val != null && val.isConnected) { Plugin.Log.LogInfo((object)$"Connected to {pair.address}:{pair.port}"); return false; } } if (!((Object)(object)NetworkManagerSystem.singleton != (Object)null) || (int)NetworkManagerSystem.singleton.desiredHost.hostType != 0) { <t>5__2 += Time.deltaTime; <>2__current = null; <>1__state = 1; return true; } } Plugin.Log.LogError((object)$"Connection to {pair.address}:{pair.port} failed (timeout 10s)."); Plugin.DirectConnectActive = false; CreateLobbyPatch.CleanupFakeLobbyState(); if ((Object)(object)directConnectPanel.menuController != (Object)null) { MenuInjector.ShowPanel(directConnectPanel.menuController); } directConnectPanel.SetStatus($"Connection failed: {pair.address}:{pair.port}", Color.red); 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 <WaitForServerOrRestore>d__13 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public DirectConnectPanel <>4__this; private float <t>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <WaitForServerOrRestore>d__13(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { int num = <>1__state; DirectConnectPanel directConnectPanel = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; <t>5__2 = 0f; break; case 1: <>1__state = -1; break; } if (!NetworkServer.active && <t>5__2 < 5f) { <t>5__2 += Time.deltaTime; <>2__current = null; <>1__state = 1; return true; } if (!NetworkServer.active) { Plugin.Log.LogError((object)"Server failed to start within 5s."); Plugin.DirectConnectActive = false; if ((Object)(object)directConnectPanel.menuController != (Object)null) { MenuInjector.ShowPanel(directConnectPanel.menuController); } } else { Plugin.Log.LogInfo((object)"Server started successfully."); } 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 MultiplayerMenuController menuController; private TMP_InputField _hostNicknameInput; private TMP_InputField _hostMaxPlayersInput; private TMP_InputField _hostPasswordInput; private TMP_InputField _joinNicknameInput; private TMP_InputField _joinAddressInput; private TMP_InputField _joinPortInput; private TMP_InputField _joinPasswordInput; private TextMeshProUGUI _statusLabel; private const float PANEL_WIDTH = 620f; private void OnEnable() { for (int num = ((Component)this).transform.childCount - 1; num >= 0; num--) { Object.DestroyImmediate((Object)(object)((Component)((Component)this).transform.GetChild(num)).gameObject); } BuildPanel(); } private void BuildPanel() { //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Expected O, but got Unknown //IL_007d: 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_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: 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_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Expected O, but got Unknown //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Unknown result type (might be due to invalid IL or missing references) //IL_0151: Unknown result type (might be due to invalid IL or missing references) //IL_0163: Unknown result type (might be due to invalid IL or missing references) //IL_0169: Expected O, but got Unknown //IL_0169: 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_01cb: Unknown result type (might be due to invalid IL or missing references) //IL_0216: Unknown result type (might be due to invalid IL or missing references) //IL_0250: Unknown result type (might be due to invalid IL or missing references) //IL_02c8: Unknown result type (might be due to invalid IL or missing references) //IL_0323: Unknown result type (might be due to invalid IL or missing references) //IL_037b: Unknown result type (might be due to invalid IL or missing references) //IL_0385: Expected O, but got Unknown //IL_03c6: Unknown result type (might be due to invalid IL or missing references) //IL_0400: Unknown result type (might be due to invalid IL or missing references) //IL_046b: Unknown result type (might be due to invalid IL or missing references) //IL_04b4: Unknown result type (might be due to invalid IL or missing references) //IL_0511: Unknown result type (might be due to invalid IL or missing references) //IL_057c: Unknown result type (might be due to invalid IL or missing references) //IL_05d5: Unknown result type (might be due to invalid IL or missing references) //IL_05df: Expected O, but got Unknown //IL_060d: Unknown result type (might be due to invalid IL or missing references) //IL_0617: Expected O, but got Unknown //IL_0643: Unknown result type (might be due to invalid IL or missing references) //IL_0681: Unknown result type (might be due to invalid IL or missing references) //IL_0686: 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_001c: 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_0032: Unknown result type (might be due to invalid IL or missing references) RectTransform component = ((Component)this).GetComponent<RectTransform>(); if ((Object)(object)component != (Object)null) { component.anchorMin = Vector2.zero; component.anchorMax = Vector2.one; component.offsetMin = Vector2.zero; component.offsetMax = Vector2.zero; } GameObject val = new GameObject("Center", new Type[1] { typeof(RectTransform) }); val.transform.SetParent(((Component)this).transform, false); RectTransform component2 = val.GetComponent<RectTransform>(); component2.anchorMin = new Vector2(0.5f, 0f); component2.anchorMax = new Vector2(0.5f, 1f); component2.sizeDelta = new Vector2(620f, 0f); component2.anchoredPosition = Vector2.zero; GameObject val2 = new GameObject("BG", new Type[2] { typeof(RectTransform), typeof(Image) }); val2.transform.SetParent(val.transform, false); StretchRT(val2); Image component3 = val2.GetComponent<Image>(); ((Graphic)component3).color = new Color(0.06f, 0.06f, 0.09f, 0.82f); ((Graphic)component3).raycastTarget = false; GameObject val3 = new GameObject("Content", new Type[2] { typeof(RectTransform), typeof(VerticalLayoutGroup) }); val3.transform.SetParent(val.transform, false); StretchRT(val3); VerticalLayoutGroup component4 = val3.GetComponent<VerticalLayoutGroup>(); ((HorizontalOrVerticalLayoutGroup)component4).spacing = 6f; ((LayoutGroup)component4).padding = new RectOffset(35, 35, 25, 20); ((HorizontalOrVerticalLayoutGroup)component4).childForceExpandWidth = true; ((HorizontalOrVerticalLayoutGroup)component4).childForceExpandHeight = false; ((HorizontalOrVerticalLayoutGroup)component4).childControlWidth = true; ((HorizontalOrVerticalLayoutGroup)component4).childControlHeight = true; ((LayoutGroup)component4).childAlignment = (TextAnchor)1; Transform transform = val3.transform; AddLabel(transform, L("DC_TITLE"), 26f, (FontStyles)1, (TextAlignmentOptions)514, Color.white, 42f); AddDivider(transform); AddSpacer(transform, 4f); AddLabel(transform, L("DC_HOST_SECTION"), 16f, (FontStyles)1, (TextAlignmentOptions)513, new Color(0.55f, 0.78f, 1f), 26f); AddLabel(transform, L("DC_LABEL_DISPLAY_NAME"), 13f, (FontStyles)0, (TextAlignmentOptions)513, new Color(0.9f, 0.9f, 0.95f), 20f); _hostNicknameInput = AddInputField(transform, L("DC_PH_NICKNAME"), Plugin.ConfigDisplayName.Value); AddSpacer(transform, 4f); Transform parent = AddRow(transform); AddLabel(parent, L("DC_LABEL_MAX_PLAYERS"), 13f, (FontStyles)0, (TextAlignmentOptions)4100, new Color(0.9f, 0.9f, 0.95f), 32f, 90f); _hostMaxPlayersInput = AddInputField(parent, "4", Plugin.ConfigLastMaxPlayers.Value, isPassword: false, 50f); AddLabel(parent, L("DC_LABEL_PASSWORD"), 13f, (FontStyles)0, (TextAlignmentOptions)4100, new Color(0.9f, 0.9f, 0.95f), 32f, 70f); _hostPasswordInput = AddInputField(parent, L("DC_PH_PASSWORD"), Plugin.ConfigLastHostPassword.Value, isPassword: true); AddSpacer(transform, 4f); CloneBtn(transform, L("DC_BTN_HOST"), new UnityAction(DoHost)); AddSpacer(transform, 8f); AddDivider(transform); AddSpacer(transform, 8f); AddLabel(transform, L("DC_JOIN_SECTION"), 16f, (FontStyles)1, (TextAlignmentOptions)513, new Color(0.55f, 0.78f, 1f), 26f); AddLabel(transform, L("DC_LABEL_DISPLAY_NAME"), 13f, (FontStyles)0, (TextAlignmentOptions)513, new Color(0.9f, 0.9f, 0.95f), 20f); _joinNicknameInput = AddInputField(transform, L("DC_PH_NICKNAME"), Plugin.ConfigDisplayName.Value); AddSpacer(transform, 4f); AddLabel(transform, L("DC_IPV_HINT"), 11f, (FontStyles)2, (TextAlignmentOptions)513, new Color(0.7f, 0.7f, 0.75f), 16f); Transform parent2 = AddRow(transform); AddLabel(parent2, L("DC_LABEL_ADDRESS"), 13f, (FontStyles)0, (TextAlignmentOptions)4100, new Color(0.9f, 0.9f, 0.95f), 32f, 60f); _joinAddressInput = AddInputField(parent2, L("DC_PH_ADDRESS"), Plugin.ConfigLastAddress.Value); AddLabel(parent2, ":", 13f, (FontStyles)0, (TextAlignmentOptions)514, new Color(0.9f, 0.9f, 0.95f), 32f, 10f); _joinPortInput = AddInputField(parent2, "7777", Plugin.ConfigLastPort.Value, isPassword: false, 70f); Transform parent3 = AddRow(transform); AddLabel(parent3, L("DC_LABEL_PASSWORD"), 13f, (FontStyles)0, (TextAlignmentOptions)4100, new Color(0.9f, 0.9f, 0.95f), 32f, 60f); _joinPasswordInput = AddInputField(parent3, L("DC_PH_PASSWORD"), Plugin.ConfigLastClientPassword.Value, isPassword: true); AddSpacer(transform, 4f); CloneBtn(transform, L("DC_BTN_CONNECT"), new UnityAction(DoConnect)); AddSpacer(transform, 8f); AddDivider(transform); AddSpacer(transform, 6f); CloneBtn(transform, L("DC_BTN_BACK"), (UnityAction)delegate { MenuInjector.HidePanel(menuController); }); AddSpacer(transform, 6f); _statusLabel = AddLabel(transform, "", 14f, (FontStyles)1, (TextAlignmentOptions)514, new Color(0.5f, 0.9f, 0.6f), 22f); GameObject val4 = new GameObject("BottomSpacer", new Type[2] { typeof(RectTransform), typeof(LayoutElement) }); val4.transform.SetParent(transform, false); val4.GetComponent<LayoutElement>().flexibleHeight = 1f; } private void DoHost() { //IL_0012: 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_00ec: 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) if (!Object.op_Implicit((Object)(object)NetworkManagerSystem.singleton)) { SetStatus("NetworkManager not ready.", Color.red); return; } Plugin.DirectConnectActive = true; SaveNickname(_hostNicknameInput); TMP_InputField hostPasswordInput = _hostPasswordInput; SetConVar("sv_password", ((hostPasswordInput != null) ? hostPasswordInput.text : null) ?? ""); int num = 4; if ((Object)(object)_hostMaxPlayersInput != (Object)null && int.TryParse(_hostMaxPlayersInput.text, out var result) && result > 0 && result <= 16) { num = result; } SetConVar("sv_maxplayers", num.ToString()); Plugin.ConfigLastMaxPlayers.Value = num.ToString(); ConfigEntry<string> configLastHostPassword = Plugin.ConfigLastHostPassword; TMP_InputField hostPasswordInput2 = _hostPasswordInput; configLastHostPassword.Value = ((hostPasswordInput2 != null) ? hostPasswordInput2.text : null) ?? ""; CreateLobbyPatch.FakeLobbyState(); NetworkManagerSystem.singleton.desiredHost = new HostDescription(new HostingParameters { listen = true, maxPlayers = num }); Plugin.Log.LogInfo((object)$"Direct connect host: {num} players"); MenuInjector.DismissPanel(menuController); ((MonoBehaviour)Plugin.Instance).StartCoroutine(WaitForServerOrRestore()); } [IteratorStateMachine(typeof(<WaitForServerOrRestore>d__13))] private IEnumerator WaitForServerOrRestore() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <WaitForServerOrRestore>d__13(0) { <>4__this = this }; } private void DoConnect() { //IL_0012: 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) //IL_01a4: 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) //IL_01c1: Unknown result type (might be due to invalid IL or missing references) //IL_01d5: Unknown result type (might be due to invalid IL or missing references) //IL_01db: Unknown result type (might be due to invalid IL or missing references) //IL_0201: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)NetworkManagerSystem.singleton)) { SetStatus("NetworkManager not ready.", Color.red); EnsurePanelVisible(); return; } TMP_InputField joinAddressInput = _joinAddressInput; string text = ((joinAddressInput == null) ? null : joinAddressInput.text?.Trim()) ?? ""; if (string.IsNullOrEmpty(text)) { SetStatus("Enter an address!", Color.red); EnsurePanelVisible(); return; } Plugin.DirectConnectActive = true; SaveNickname(_joinNicknameInput); TMP_InputField joinPasswordInput = _joinPasswordInput; SetConVar("cl_password", ((joinPasswordInput != null) ? joinPasswordInput.text : null) ?? ""); Plugin.ConfigLastAddress.Value = text; ConfigEntry<string> configLastPort = Plugin.ConfigLastPort; TMP_InputField joinPortInput = _joinPortInput; configLastPort.Value = ((joinPortInput != null) ? joinPortInput.text : null) ?? "7777"; ConfigEntry<string> configLastClientPassword = Plugin.ConfigLastClientPassword; TMP_InputField joinPasswordInput2 = _joinPasswordInput; configLastClientPassword.Value = ((joinPasswordInput2 != null) ? joinPasswordInput2.text : null) ?? ""; CreateLobbyPatch.FakeLobbyState(); TMP_InputField joinPortInput2 = _joinPortInput; string text2 = ((joinPortInput2 != null) ? joinPortInput2.text : null) ?? "7777"; string text3 = ((text.Contains(":") && !text.StartsWith("[")) ? ("[" + text + "]:" + text2) : ((!text.StartsWith("[")) ? (text + ":" + text2) : (text.Contains("]:") ? text : (text.TrimEnd(']') + "]:" + text2)))); AddressPortPair val = default(AddressPortPair); if (!AddressPortPair.TryParse(text3, ref val) || !((AddressPortPair)(ref val)).isValid) { SetStatus("Invalid address: " + text3, Color.red); Plugin.DirectConnectActive = false; EnsurePanelVisible(); } else { NetworkManagerSystem.singleton.desiredHost = new HostDescription(val); Plugin.Log.LogInfo((object)$"Connecting to {val.address}:{val.port}..."); MenuInjector.DismissPanel(menuController); ((MonoBehaviour)Plugin.Instance).StartCoroutine(WaitForConnectionOrRestore(val)); } } [IteratorStateMachine(typeof(<WaitForConnectionOrRestore>d__15))] private IEnumerator WaitForConnectionOrRestore(AddressPortPair pair) { //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) //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <WaitForConnectionOrRestore>d__15(0) { <>4__this = this, pair = pair }; } private void SaveNickname(TMP_InputField nicknameInput) { string text = ((nicknameInput != null) ? nicknameInput.text : null) ?? ""; if (!string.IsNullOrEmpty(text)) { Plugin.ConfigDisplayName.Value = text; ulong num = (ulong)((text.GetHashCode() & 0x7FFFFFFF) + 76561198000000000L); Plugin.ConfigPlatformId.Value = num.ToString(); } } private void SetStatus(string msg, Color c) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_statusLabel != (Object)null) { ((TMP_Text)_statusLabel).text = msg; ((Graphic)_statusLabel).color = c; } Plugin.Log.LogInfo((object)("[Panel] " + msg)); } private void EnsurePanelVisible() { if ((Object)(object)menuController != (Object)null) { MenuInjector.ShowPanel(menuController); } } private static void SetConVar(string n, string v) { try { Console instance = Console.instance; if (instance != null) { instance.SubmitCmd((NetworkUser)null, n + " \"" + v + "\"", false); } } catch { } } private static string L(string token) { return Localization.Get(token); } private static TextMeshProUGUI AddLabel(Transform parent, string text, float size, FontStyles style, TextAlignmentOptions align, Color color, float height, float fixedW = -1f) { //IL_0032: 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_0044: Unknown result type (might be due to invalid IL or missing references) //IL_005a: 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_0069: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("Lbl", new Type[3] { typeof(RectTransform), typeof(TextMeshProUGUI), typeof(LayoutElement) }); val.transform.SetParent(parent, false); TextMeshProUGUI component = val.GetComponent<TextMeshProUGUI>(); ((TMP_Text)component).text = text; ((TMP_Text)component).fontSize = size; ((TMP_Text)component).fontStyle = style; ((TMP_Text)component).alignment = align; ((Graphic)component).color = color; ((TMP_Text)component).overflowMode = (TextOverflowModes)0; ((TMP_Text)component).enableWordWrapping = false; ((Graphic)component).raycastTarget = false; LayoutElement component2 = val.GetComponent<LayoutElement>(); component2.preferredHeight = height; if (fixedW > 0f) { component2.preferredWidth = fixedW; component2.minWidth = fixedW; } else { component2.flexibleWidth = 1f; } return component; } private static TMP_InputField AddInputField(Transform parent, string placeholder, string defaultVal, bool isPassword = false, float fixedW = -1f) { //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Expected O, but got Unknown //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: 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_0129: Unknown result type (might be due to invalid IL or missing references) //IL_012f: Expected O, but got Unknown //IL_0149: 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_0169: Unknown result type (might be due to invalid IL or missing references) //IL_017e: Unknown result type (might be due to invalid IL or missing references) //IL_01ad: Unknown result type (might be due to invalid IL or missing references) //IL_01b2: Unknown result type (might be due to invalid IL or missing references) //IL_01c4: Unknown result type (might be due to invalid IL or missing references) //IL_01ca: Expected O, but got Unknown //IL_01fe: Unknown result type (might be due to invalid IL or missing references) //IL_0241: Unknown result type (might be due to invalid IL or missing references) //IL_0246: Unknown result type (might be due to invalid IL or missing references) //IL_0258: Unknown result type (might be due to invalid IL or missing references) //IL_025e: Expected O, but got Unknown //IL_0273: Unknown result type (might be due to invalid IL or missing references) //IL_02c3: Unknown result type (might be due to invalid IL or missing references) //IL_02c8: 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_02e0: Expected O, but got Unknown //IL_032b: Unknown result type (might be due to invalid IL or missing references) //IL_035f: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("Input", new Type[4] { typeof(RectTransform), typeof(Image), typeof(LayoutElement), typeof(MPEventSystemLocator) }); val.transform.SetParent(parent, false); Image component = val.GetComponent<Image>(); ((Graphic)component).color = new Color(0.16f, 0.16f, 0.22f, 0.95f); ((Graphic)component).raycastTarget = true; LayoutElement component2 = val.GetComponent<LayoutElement>(); component2.preferredHeight = 34f; component2.minHeight = 34f; component2.flexibleHeight = 0f; if (fixedW > 0f) { component2.preferredWidth = fixedW; component2.minWidth = fixedW; } else { component2.flexibleWidth = 1f; } Outline obj = val.AddComponent<Outline>(); ((Shadow)obj).effectColor = new Color(0.35f, 0.4f, 0.55f, 0.6f); ((Shadow)obj).effectDistance = new Vector2(1f, -1f); GameObject val2 = new GameObject("VP", new Type[2] { typeof(RectTransform), typeof(RectMask2D) }); val2.transform.SetParent(val.transform, false); RectTransform component3 = val2.GetComponent<RectTransform>(); component3.anchorMin = Vector2.zero; component3.anchorMax = Vector2.one; component3.offsetMin = new Vector2(8f, 2f); component3.offsetMax = new Vector2(-8f, -2f); GameObject val3 = new GameObject("PH", new Type[2] { typeof(RectTransform), typeof(TextMeshProUGUI) }); val3.transform.SetParent(val2.transform, false); StretchRT(val3); TextMeshProUGUI component4 = val3.GetComponent<TextMeshProUGUI>(); ((TMP_Text)component4).text = placeholder; ((TMP_Text)component4).fontSize = 14f; ((TMP_Text)component4).fontStyle = (FontStyles)2; ((Graphic)component4).color = new Color(0.55f, 0.55f, 0.62f); ((TMP_Text)component4).alignment = (TextAlignmentOptions)4097; ((Graphic)component4).raycastTarget = false; GameObject val4 = new GameObject("TX", new Type[2] { typeof(RectTransform), typeof(TextMeshProUGUI) }); val4.transform.SetParent(val2.transform, false); StretchRT(val4); TextMeshProUGUI component5 = val4.GetComponent<TextMeshProUGUI>(); ((TMP_Text)component5).fontSize = 14f; ((Graphic)component5).color = Color.white; ((TMP_Text)component5).alignment = (TextAlignmentOptions)4097; ((Graphic)component5).raycastTarget = false; GameObject val5 = new GameObject("Caret", new Type[3] { typeof(RectTransform), typeof(CanvasRenderer), typeof(LayoutElement) }); val5.transform.SetParent(val2.transform, false); StretchRT(val5); val5.GetComponent<LayoutElement>().ignoreLayout = true; TMP_InputField val6 = val.AddComponent<TMP_InputField>(); val6.textViewport = component3; val6.textComponent = (TMP_Text)(object)component5; val6.placeholder = (Graphic)(object)component4; val6.text = defaultVal; val6.pointSize = 14f; val6.customCaretColor = true; val6.caretColor = Color.white; val6.caretWidth = 2; val6.caretBlinkRate = 0.85f; val6.selectionColor = new Color(0.3f, 0.5f, 0.8f, 0.4f); val6.onFocusSelectAll = false; val6.richText = false; val6.restoreOriginalTextOnEscape = true; if (isPassword) { val6.contentType = (ContentType)7; val6.asteriskChar = '*'; } return val6; } private static Transform AddRow(Transform parent, int spacing = 8, float height = 34f) { //IL_0032: 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_0044: 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) GameObject val = new GameObject("Row", new Type[3] { typeof(RectTransform), typeof(HorizontalLayoutGroup), typeof(LayoutElement) }); val.transform.SetParent(parent, false); HorizontalLayoutGroup component = val.GetComponent<HorizontalLayoutGroup>(); ((HorizontalOrVerticalLayoutGroup)component).spacing = spacing; ((HorizontalOrVerticalLayoutGroup)component).childForceExpandWidth = false; ((HorizontalOrVerticalLayoutGroup)component).childForceExpandHeight = false; ((HorizontalOrVerticalLayoutGroup)component).childControlWidth = true; ((HorizontalOrVerticalLayoutGroup)component).childControlHeight = false; ((LayoutGroup)component).childAlignment = (TextAnchor)3; val.GetComponent<LayoutElement>().preferredHeight = height; return val.transform; } private static void CloneBtn(Transform parent, string text, UnityAction onClick) { MPButton val = MenuInjector.CloneButton(parent, text, onClick); if (!((Object)(object)val == (Object)null)) { LayoutElement val2 = ((Component)val).GetComponent<LayoutElement>(); if ((Object)(object)val2 == (Object)null) { val2 = ((Component)val).gameObject.AddComponent<LayoutElement>(); } val2.flexibleWidth = 1f; val2.flexibleHeight = 0f; val2.preferredHeight = 45f; val2.minHeight = 45f; val2.minWidth = 100f; } } private static void AddSpacer(Transform parent, float h) { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("Spacer", new Type[2] { typeof(RectTransform), typeof(LayoutElement) }); val.transform.SetParent(parent, false); val.GetComponent<LayoutElement>().preferredHeight = h; } private static void AddDivider(Transform parent) { //IL_0032: 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_0044: 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) GameObject val = new GameObject("Div", new Type[3] { typeof(RectTransform), typeof(Image), typeof(LayoutElement) }); val.transform.SetParent(parent, false); Image component = val.GetComponent<Image>(); ((Graphic)component).color = new Color(0.35f, 0.4f, 0.5f, 0.6f); ((Graphic)component).raycastTarget = false; val.GetComponent<LayoutElement>().preferredHeight = 1f; } private static void StretchRT(GameObject go) { //IL_0012: 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_0028: 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) RectTransform component = go.GetComponent<RectTransform>(); if (!((Object)(object)component == (Object)null)) { component.anchorMin = Vector2.zero; component.anchorMax = Vector2.one; component.offsetMin = Vector2.zero; component.offsetMax = Vector2.zero; } } } [HarmonyPatch] public static class MenuInjector { private static GameObject _directConnectMenu; private static GameObject _directConnectButton; public static GameObject ButtonTemplate { get; private set; } [HarmonyPatch(typeof(MultiplayerMenuController), "OnEnable")] [HarmonyPostfix] private static void OnEnablePostfix(MultiplayerMenuController __instance) { try { Inject(__instance); } catch (Exception arg) { Plugin.Log.LogError((object)$"MenuInjector: {arg}"); } } [HarmonyPatch(typeof(MultiplayerMenuController), "SetSubview")] [HarmonyPostfix] private static void SetSubviewPostfix() { if ((Object)(object)_directConnectMenu != (Object)null) { _directConnectMenu.SetActive(false); } } private static void Inject(MultiplayerMenuController ctrl) { //IL_0123: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Expected O, but got Unknown MPButton hostGame = ctrl.hostGame; GameObject val = ((hostGame != null) ? ((Component)hostGame).gameObject : null); if ((Object)(object)val == (Object)null) { return; } ButtonTemplate = val; if ((Object)(object)_directConnectButton == (Object)null || !Object.op_Implicit((Object)(object)_directConnectButton)) { _directConnectButton = Object.Instantiate<GameObject>(val, val.transform.parent); ((Object)_directConnectButton).name = "DirectConnectButton"; _directConnectButton.transform.SetSiblingIndex(val.transform.GetSiblingIndex() + 1); LanguageTextMeshController[] componentsInChildren = _directConnectButton.GetComponentsInChildren<LanguageTextMeshController>(true); for (int i = 0; i < componentsInChildren.Length; i++) { Object.DestroyImmediate((Object)(object)componentsInChildren[i]); } TextMeshProUGUI[] componentsInChildren2 = _directConnectButton.GetComponentsInChildren<TextMeshProUGUI>(true); for (int i = 0; i < componentsInChildren2.Length; i++) { ((TMP_Text)componentsInChildren2[i]).text = Localization.Get("DC_BUTTON_DIRECT_CONNECT"); } } HGButton component = _directConnectButton.GetComponent<HGButton>(); if ((Object)(object)component != (Object)null) { component.hoverLanguageTextMeshController = null; ((UnityEventBase)((Button)component).onClick).RemoveAllListeners(); ((UnityEvent)((Button)component).onClick).AddListener((UnityAction)delegate { ShowPanel(ctrl); }); } if ((Object)(object)_directConnectMenu == (Object)null || !Object.op_Implicit((Object)(object)_directConnectMenu)) { GameObject hostGameMenu = ctrl.HostGameMenu; if ((Object)(object)hostGameMenu == (Object)null) { return; } _directConnectMenu = Object.Instantiate<GameObject>(hostGameMenu, hostGameMenu.transform.parent); ((Object)_directConnectMenu).name = "DirectConnectMenu"; _directConnectMenu.SetActive(false); HostGamePanelController component2 = _directConnectMenu.GetComponent<HostGamePanelController>(); if ((Object)(object)component2 != (Object)null) { Object.DestroyImmediate((Object)(object)component2); } for (int num = _directConnectMenu.transform.childCount - 1; num >= 0; num--) { Object.DestroyImmediate((Object)(object)((Component)_directConnectMenu.transform.GetChild(num)).gameObject); } _directConnectMenu.AddComponent<DirectConnectPanel>(); Plugin.Log.LogInfo((object)"Injected 'IP Direct Connect' button + panel."); } DirectConnectPanel component3 = _directConnectMenu.GetComponent<DirectConnectPanel>(); if ((Object)(object)component3 != (Object)null) { component3.menuController = ctrl; } } public static void ShowPanel(MultiplayerMenuController ctrl) { if ((Object)(object)_directConnectMenu == (Object)null || !Object.op_Implicit((Object)(object)_directConnectMenu)) { Plugin.Log.LogWarning((object)"DirectConnect panel missing — recreating..."); try { Inject(ctrl); } catch (Exception arg) { Plugin.Log.LogError((object)$"Panel recreation failed: {arg}"); } } if ((Object)(object)_directConnectMenu == (Object)null || !Object.op_Implicit((Object)(object)_directConnectMenu)) { Plugin.Log.LogError((object)"Cannot show DirectConnect panel."); return; } ctrl.MainMultiplayerMenu.SetActive(false); ctrl.HostGameMenu.SetActive(false); ctrl.JoinGameMenu.SetActive(false); _directConnectMenu.SetActive(true); } public static void HidePanel(MultiplayerMenuController ctrl) { if ((Object)(object)_directConnectMenu != (Object)null) { _directConnectMenu.SetActive(false); } Plugin.DirectConnectActive = false; ctrl.SetSubview((Subview)0); } public static void DismissPanel(MultiplayerMenuController ctrl) { if ((Object)(object)_directConnectMenu != (Object)null) { _directConnectMenu.SetActive(false); } } public static MPButton CloneButton(Transform parent, string text, UnityAction onClick) { if ((Object)(object)ButtonTemplate == (Object)null) { return null; } GameObject val = Object.Instantiate<GameObject>(ButtonTemplate, parent); ((Object)val).name = "Btn_" + text.Replace(" ", ""); LanguageTextMeshController[] componentsInChildren = val.GetComponentsInChildren<LanguageTextMeshController>(true); for (int i = 0; i < componentsInChildren.Length; i++) { Object.DestroyImmediate((Object)(object)componentsInChildren[i]); } TextMeshProUGUI[] componentsInChildren2 = val.GetComponentsInChildren<TextMeshProUGUI>(true); for (int i = 0; i < componentsInChildren2.Length; i++) { ((TMP_Text)componentsInChildren2[i]).text = text; } HGButton component = val.GetComponent<HGButton>(); if ((Object)(object)component != (Object)null) { component.hoverLanguageTextMeshController = null; } MPButton component2 = val.GetComponent<MPButton>(); if ((Object)(object)component2 != (Object)null) { ((UnityEventBase)((Button)component2).onClick).RemoveAllListeners(); ((UnityEvent)((Button)component2).onClick).AddListener(onClick); } val.SetActive(true); return component2; } } } namespace RoR2DirectConnect.Patches { [HarmonyPatch(typeof(AddressPortPair), "TryParse")] public static class AddressPortPairPatch { private static bool Prefix(string str, out AddressPortPair addressPortPair, ref bool __result) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) addressPortPair = default(AddressPortPair); if (string.IsNullOrEmpty(str)) { __result = false; return false; } if (str.StartsWith("[")) { int num = str.IndexOf(']'); if (num < 0) { __result = false; return false; } string text = str.Substring(1, num - 1); ushort result = 7777; if (num + 1 < str.Length && str[num + 1] == ':' && !ushort.TryParse(str.Substring(num + 2), out result)) { result = 7777; } addressPortPair.address = text; addressPortPair.port = result; __result = true; Plugin.Log.LogInfo((object)$"Parsed IPv6 address: [{text}]:{result}"); return false; } int num2 = 0; for (int i = 0; i < str.Length; i++) { if (str[i] == ':') { num2++; } } if (num2 > 1) { addressPortPair.address = str; addressPortPair.port = 7777; __result = true; Plugin.Log.LogInfo((object)("Parsed bare IPv6 address: " + str + ":7777 (default port)")); return false; } return true; } } public static class DirectConnectCommands { [ConCommand(/*Could not decode attribute arguments.*/)] private static void CCDirectConnect(ConCommandArgs args) { //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: 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) string argString = ((ConCommandArgs)(ref args)).GetArgString(0); AddressPortPair val = default(AddressPortPair); if (string.IsNullOrEmpty(argString)) { Debug.Log((object)"[DirectConnect] Usage: dc_connect ip:port OR dc_connect [::1]:7777"); } else if (!Object.op_Implicit((Object)(object)NetworkManagerSystem.singleton)) { Debug.Log((object)"[DirectConnect] NetworkManager not ready."); } else if (!AddressPortPair.TryParse(argString, ref val) || !((AddressPortPair)(ref val)).isValid) { Debug.Log((object)("[DirectConnect] Failed to parse address: " + argString)); Debug.Log((object)"[DirectConnect] IPv4 format: 192.168.1.1:7777"); Debug.Log((object)"[DirectConnect] IPv6 format: [::1]:7777 or [2001:db8::1]:7777"); } else { Plugin.DirectConnectActive = true; AccessTools.Method(typeof(NetworkManagerSystem), "EnsureNetworkManagerNotBusy", (Type[])null, (Type[])null).Invoke(null, null); NetworkManagerSystem.singleton.desiredHost = new HostDescription(val); Debug.Log((object)$"[DirectConnect] Connecting to {val.address}:{val.port} ..."); } } [ConCommand(/*Could not decode attribute arguments.*/)] private static void CCDirectHost(ConCommandArgs args) { //IL_0056: 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_006d: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)NetworkManagerSystem.singleton)) { Debug.Log((object)"[DirectConnect] NetworkManager not ready."); return; } if (NetworkServer.active) { Debug.Log((object)"[DirectConnect] Server is already running."); return; } int num = 4; if (((ConCommandArgs)(ref args)).Count > 0) { int argInt = ((ConCommandArgs)(ref args)).GetArgInt(0); if (argInt > 0 && argInt <= 16) { num = argInt; } } Plugin.DirectConnectActive = true; NetworkManagerSystem.singleton.desiredHost = new HostDescription(new HostingParameters { listen = true, maxPlayers = num }); Debug.Log((object)($"[DirectConnect] Hosting with maxPlayers={num}. " + "Clients can connect with: dc_connect YOUR_IP:7777")); } [ConCommand(/*Could not decode attribute arguments.*/)] private static void CCDirectId(ConCommandArgs args) { if (((ConCommandArgs)(ref args)).Count > 0) { string argString = ((ConCommandArgs)(ref args)).GetArgString(0); if (ulong.TryParse(argString, out var _)) { Plugin.ConfigPlatformId.Value = argString; Debug.Log((object)("[DirectConnect] PlatformID set to: " + argString)); } else { Debug.Log((object)"[DirectConnect] Invalid ID. Must be a number. Example: 76561198012345678"); } } else { Debug.Log((object)("[DirectConnect] Current PlatformID: " + Plugin.ConfigPlatformId.Value)); } } [ConCommand(/*Could not decode attribute arguments.*/)] private static void CCDirectStatus(ConCommandArgs args) { //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: 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_00ae: 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_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Invalid comparison between Unknown and I4 //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) Debug.Log((object)"=== DirectConnect Status ==="); Debug.Log((object)(" PlatformID: " + Plugin.ConfigPlatformId.Value)); Debug.Log((object)$" BypassSteamAuth: {Plugin.ConfigBypassSteamAuth.Value}"); Debug.Log((object)$" BypassLobbyCheck: {Plugin.ConfigBypassLobbyCheck.Value}"); Debug.Log((object)$" Server active: {NetworkServer.active}"); Debug.Log((object)$" Client active: {NetworkClient.active}"); if (Object.op_Implicit((Object)(object)NetworkManagerSystem.singleton)) { HostDescription desiredHost = NetworkManagerSystem.singleton.desiredHost; Debug.Log((object)$" DesiredHost type: {desiredHost.hostType}"); if ((int)desiredHost.hostType == 3) { Debug.Log((object)$" Target address: {desiredHost.addressPortPair.address}:{desiredHost.addressPortPair.port}"); } } if (NetworkServer.active) { Debug.Log((object)$" Connections: {NetworkServer.connections.Count}"); Debug.Log((object)$" Listen port: {((NetworkManager)NetworkManagerSystem.singleton).networkPort}"); } Debug.Log((object)"============================"); } } [HarmonyPatch(typeof(NetworkUser), "GetNetworkPlayerName")] public static class DisplayNamePatch { private static void Postfix(NetworkUser __instance, ref NetworkPlayerName __result) { //IL_0035: 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_0051: 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_0057: Unknown result type (might be due to invalid IL or missing references) if (!Plugin.DirectConnectActive) { return; } if (((NetworkBehaviour)__instance).isLocalPlayer) { string value = Plugin.ConfigDisplayName.Value; if (!string.IsNullOrEmpty(value)) { __result.nameOverride = value; } } if (__result.nameOverride != null) { __result = new NetworkPlayerName { nameOverride = __result.nameOverride, playerId = new PlatformID(0uL) }; } } } [HarmonyPatch(typeof(NetworkPlayerName), "GetResolvedName")] public static class ResolveNamePatch { private static bool Prefix(ref NetworkPlayerName __instance, ref string __result) { if (!Plugin.DirectConnectActive) { return true; } if (!string.IsNullOrEmpty(__instance.nameOverride)) { __result = __instance.nameOverride; return false; } ulong num = (ulong)((PlatformID)(ref __instance.playerId)).value; __result = ((num != 0L) ? ("Player_" + num % 10000) : "Player"); return false; } } [HarmonyPatch(typeof(NetworkUser), "UpdateUserName")] public static class UpdateUserNamePatch { private static void Postfix(NetworkUser __instance) { //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_000f: 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 (Plugin.DirectConnectActive) { NetworkPlayerName networkPlayerName = __instance.GetNetworkPlayerName(); if (!string.IsNullOrEmpty(networkPlayerName.nameOverride)) { __instance.userName = networkPlayerName.nameOverride; } } } } [HarmonyPatch(typeof(NetworkManagerSystemSteam), "PlatformAuth")] public static class PlatformAuthPatch { private static bool Prefix(ref ClientAuthData authData, NetworkConnection conn) { //IL_004b: 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) if (!Plugin.DirectConnectActive) { return true; } if (conn is SteamNetworkConnection) { return true; } string text = Plugin.ConfigDisplayName.Value; if (string.IsNullOrEmpty(text)) { text = "Player_" + Random.Range(1000, 9999); } authData.platformId = new PlatformID(text); authData.authTicket = new byte[1]; try { authData.entitlements = PlatformSystems.entitlementsSystem.BuildEntitlements(); } catch { authData.entitlements = Array.Empty<string>(); } Plugin.Log.LogInfo((object)("Direct connect auth: name=\"" + text + "\"")); return false; } } [HarmonyPatch(typeof(NetworkManagerSystemSteam), "AddPlayerIdFromPlatform")] public static class AddPlayerIdFromPlatformPatch { private static bool Prefix(NetworkConnection conn, byte playerControllerId, ref NetworkUserId __result) { //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0046: 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_0027: 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) if (!Plugin.DirectConnectActive) { return true; } ClientAuthData val = ServerAuthManager.FindAuthData(conn); if (val != null && val.platformId != PlatformID.nil) { __result = new NetworkUserId(val.platformId, playerControllerId); } else { __result = NetworkUserId.FromIp(conn.address, playerControllerId); } return false; } } [HarmonyPatch(typeof(NetworkManagerSystemSteam), "PlatformHost")] public static class PlatformHostPatch { private static bool Prefix(ConCommandArgs args) { //IL_004a: 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_0061: Unknown result type (might be due to invalid IL or missing references) if (!Plugin.DirectConnectActive) { return true; } if (!Object.op_Implicit((Object)(object)NetworkManagerSystem.singleton)) { return false; } bool argBool = ((ConCommandArgs)(ref args)).GetArgBool(0); if (NetworkServer.active) { Plugin.Log.LogWarning((object)"Server is already active."); return false; } int intValue = SvMaxPlayersConVar.instance.intValue; NetworkManagerSystem.singleton.desiredHost = new HostDescription(new HostingParameters { listen = argBool, maxPlayers = intValue }); Plugin.Log.LogInfo((object)$"Direct host started: listen={argBool}, maxPlayers={intValue}"); return false; } } [HarmonyPatch(typeof(NetworkManagerSystemSteam), "UpdateServer")] public static class UpdateServerPatch { private static bool Prefix(NetworkManagerSystemSteam __instance) { //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_004b: 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_0067: Unknown result type (might be due to invalid IL or missing references) if (!Plugin.DirectConnectActive) { return true; } if (!NetworkServer.active) { return false; } ReadOnlyCollection<NetworkConnection> connections = NetworkServer.connections; for (int num = connections.Count - 1; num >= 0; num--) { NetworkConnection val = connections[num]; if (val != null) { SteamNetworkConnection val2 = (SteamNetworkConnection)(object)((val is SteamNetworkConnection) ? val : null); if (val2 != null) { P2PSessionState val3 = default(P2PSessionState); if (((BaseSteamworks)Client.Instance).Networking.GetP2PSessionState(val2.ste