using System; using System.Diagnostics; using System.Net; using System.Net.Sockets; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Core.Logging.Interpolation; using BepInEx.Logging; using BepInEx.Unity.IL2CPP; using HarmonyLib; using Il2CppInterop.Runtime.Injection; using TMPro; using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] [assembly: AssemblyCompany("BigWalkN2n")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("BigWalkN2n")] [assembly: AssemblyTitle("BigWalkN2n")] [assembly: AssemblyVersion("1.0.0.0")] namespace BigWalkN2n; [BepInPlugin("lajilaji.bigwalk.n2n-direct-connect", "N2N Direct Connect", "1.0.0")] public sealed class Plugin : BasePlugin { public const string PluginGuid = "lajilaji.bigwalk.n2n-direct-connect"; public const string PluginName = "N2N Direct Connect"; public const string PluginVersion = "1.0.0"; internal static ManualLogSource Logger; public override void Load() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Expected O, but got Unknown Logger = ((BasePlugin)this).Log; new Harmony("lajilaji.bigwalk.n2n-direct-connect").PatchAll(); ClassInjector.RegisterTypeInIl2Cpp(); GameObject val = new GameObject("N2NDirectConnectController"); Object.DontDestroyOnLoad((Object)val); val.AddComponent(); Logger.LogInfo((object)"Loaded. The Join Game page now connects directly by IPv4 and password."); } } internal static class DirectConnectState { internal const string PasswordFieldName = "N2NDirectConnectPassword"; internal static TMP_InputField PasswordField; internal static string PendingPassword = string.Empty; internal static bool WaitingForPassword; internal static void ConfigureJoinPage(JoinMenu menu) { if ((Object)(object)menu.addressField == (Object)null) { throw new InvalidOperationException("BIG WALK JoinMenu.addressField is missing."); } Hide((Component)(object)menu.friendsSection); Hide((Component)(object)menu.cardParent); Hide((Component)(object)menu.noneFoundCard); Hide((Component)(object)menu.warningDisplay); menu.RequiresAuth = false; ((Component)menu.addressField).gameObject.SetActive(true); SetPlaceholder(menu.addressField, "IP 地址,例如 10.151.133.54"); PasswordField = FindOrCreatePasswordField(menu); ((Component)PasswordField).gameObject.SetActive(true); PasswordField.contentType = (ContentType)7; PasswordField.characterLimit = 32; SetPlaceholder(PasswordField, "密码"); PasswordField.ForceLabelUpdate(); SetText(((Component)menu.addressField).transform.parent, "Subheading", "通过 IP 加入:"); SetText(((Component)menu.addressField).transform.parent, "PlayButton/Text (TMP)", "确定"); Plugin.Logger.LogInfo((object)"Configured Join Game page with IPv4 and password fields only."); } internal static bool TryBeginConnection(JoinMenu menu) { //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Expected O, but got Unknown //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Expected O, but got Unknown string text = menu.addressField.text.Trim(); bool flag = default(bool); if (!IPAddress.TryParse(text, out IPAddress address) || address.AddressFamily != AddressFamily.InterNetwork) { menu.addressField.text = string.Empty; SetPlaceholder(menu.addressField, "Invalid IPv4 address"); ((Selectable)menu.addressField).Select(); ManualLogSource logger = Plugin.Logger; BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(31, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Rejected invalid IPv4 address: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(text); } logger.LogWarning(val); return false; } if ((Object)(object)PasswordField == (Object)null) { throw new InvalidOperationException("The direct-connect password field is missing."); } PendingPassword = PasswordField.text; WaitingForPassword = true; menu.GoToConnectingMenu(); NetworkMinder.SetTransportAndConnect(text); ManualLogSource logger2 = Plugin.Logger; BepInExInfoLogInterpolatedStringHandler val2 = new BepInExInfoLogInterpolatedStringHandler(29, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("Connecting directly to "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(text); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(":7777."); } logger2.LogInfo(val2); return true; } internal static void SubmitPendingPassword(PasswordMenu passwordMenu) { if (WaitingForPassword) { if ((Object)(object)passwordMenu.passwordField == (Object)null) { throw new InvalidOperationException("BIG WALK password menu input field is missing."); } passwordMenu.passwordField.text = PendingPassword; WaitingForPassword = false; passwordMenu.SubmitPassword(); Plugin.Logger.LogInfo((object)"Submitted the password requested by the host."); } } private static TMP_InputField FindOrCreatePasswordField(JoinMenu menu) { Transform parent = ((Component)menu.addressField).transform.parent; if ((Object)(object)parent == (Object)null) { throw new InvalidOperationException("BIG WALK address field has no parent transform."); } Transform val = parent.Find("N2NDirectConnectPassword"); if ((Object)(object)val != (Object)null) { TMP_InputField component = ((Component)val).GetComponent(); if ((Object)(object)component == (Object)null) { throw new InvalidOperationException("N2NDirectConnectPassword exists without TMP_InputField."); } return component; } MainMenuManager instance = MainMenuManager.instance; object obj; if (instance == null) { obj = null; } else { PasswordMenu passwordMenu = instance.passwordMenu; obj = ((passwordMenu != null) ? passwordMenu.passwordField : null); } if ((Object)obj == (Object)null) { throw new InvalidOperationException("BIG WALK password input field is missing."); } GameObject obj2 = Object.Instantiate(((Component)obj).gameObject, parent); ((Object)obj2).name = "N2NDirectConnectPassword"; TMP_InputField component2 = obj2.GetComponent(); if ((Object)(object)component2 == (Object)null) { throw new InvalidOperationException("Cloned password object has no TMP_InputField."); } ((UnityEventBase)component2.onValueChanged).RemoveAllListeners(); ((UnityEventBase)component2.onEndEdit).RemoveAllListeners(); ((UnityEventBase)component2.onSubmit).RemoveAllListeners(); PositionBelowAddressField(menu.addressField, component2); return component2; } private static void PositionBelowAddressField(TMP_InputField addressField, TMP_InputField passwordField) { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0045: 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_005d: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) RectTransform component = ((Component)addressField).GetComponent(); RectTransform component2 = ((Component)passwordField).GetComponent(); if ((Object)(object)component == (Object)null || (Object)(object)component2 == (Object)null) { throw new InvalidOperationException("Direct-connect input fields require RectTransform."); } component2.anchorMin = component.anchorMin; component2.anchorMax = component.anchorMax; component2.pivot = component.pivot; component2.sizeDelta = component.sizeDelta; Vector2 anchoredPosition = component.anchoredPosition; Rect rect = component.rect; component2.anchoredPosition = anchoredPosition + new Vector2(0f, 0f - Math.Max(72f, ((Rect)(ref rect)).height * 1.35f)); ((Transform)component2).localScale = ((Transform)component).localScale; } private static void SetPlaceholder(TMP_InputField field, string value) { Graphic placeholder = field.placeholder; TMP_Text obj = ((placeholder != null) ? ((Component)placeholder).GetComponent() : null); if ((Object)(object)obj == (Object)null) { throw new InvalidOperationException("Input field " + ((Object)field).name + " has no TMP_Text placeholder."); } obj.text = value; } private static void Hide(Component component) { if ((Object)(object)component != (Object)null) { component.gameObject.SetActive(false); } } private static void SetText(Transform parent, string relativePath, string value) { Transform obj = parent.Find(relativePath); TMP_Text obj2 = ((obj != null) ? ((Component)obj).GetComponent() : null); if ((Object)(object)obj2 == (Object)null) { throw new InvalidOperationException("Join page text is missing: " + relativePath); } obj2.text = value; } } public sealed class DirectConnectController : MonoBehaviour { public DirectConnectController(IntPtr pointer) : base(pointer) { } private void Update() { if (DirectConnectState.WaitingForPassword) { MainMenuManager instance = MainMenuManager.instance; PasswordMenu val = ((instance != null) ? instance.passwordMenu : null); if ((Object)(object)val != (Object)null && ((Component)val).gameObject.activeInHierarchy) { DirectConnectState.SubmitPendingPassword(val); } } } } [HarmonyPatch(typeof(JoinMenu), "OnEnable")] internal static class JoinMenuOnEnablePatch { private static void Postfix(JoinMenu __instance) { DirectConnectState.ConfigureJoinPage(__instance); } } [HarmonyPatch(typeof(JoinMenu), "Connect")] internal static class JoinMenuConnectPatch { private static bool Prefix(JoinMenu __instance) { DirectConnectState.TryBeginConnection(__instance); return false; } }