From 26142c72d4da11038081e40c57de17a65c9e4a0c Mon Sep 17 00:00:00 2001 From: Daemon Date: Tue, 30 Mar 2021 21:15:08 +0100 Subject: [PATCH] Added direct connect in regions menu --- Unify/Patches/Regions.cs | 89 +++++++++++++++++++++++++++++++++++++- Unify/Unify.cs | 44 ++++++++++++++++++- build/Unify-2021.3.5s.dll | Bin 7680 -> 10752 bytes 3 files changed, 130 insertions(+), 3 deletions(-) diff --git a/Unify/Patches/Regions.cs b/Unify/Patches/Regions.cs index 1dd98a8..c7c0ee9 100644 --- a/Unify/Patches/Regions.cs +++ b/Unify/Patches/Regions.cs @@ -1,10 +1,13 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using BepInEx.Configuration; using HarmonyLib; using Hazel.Udp; using Reactor; -using Array = System.Array; +using UnityEngine; +using UnityEngine.UI; +using Object = UnityEngine.Object; using String = System.String; namespace Unify.Patches @@ -12,6 +15,7 @@ namespace Unify.Patches public static class RegionsPatch { private static IRegionInfo[] _oldRegions = ServerManager.DefaultRegions; + private static IRegionInfo[] _newRegions = new IRegionInfo[] { new DnsRegionInfo("192.241.154.115", "skeld.net", StringNames.NoTranslation, "192.241.154.115") @@ -24,10 +28,15 @@ namespace Unify.Patches public static List ModRegions = new List(); + public static IRegionInfo DirectRegion; + + private static TextBox directConnect; + public static void Patch() { IRegionInfo[] customRegions = UnifyPlugin.MergeRegions(_newRegions, ModRegions.ToArray()); customRegions = UnifyPlugin.MergeRegions(customRegions, LoadCustomUserRegions()); + if (DirectRegion != null) customRegions = customRegions.AddToArray(DirectRegion); IRegionInfo[] patchedRegions = UnifyPlugin.MergeRegions(_oldRegions, customRegions); ServerManager.DefaultRegions = patchedRegions; @@ -57,6 +66,82 @@ namespace Unify.Patches return customRegions.ToArray(); } + + private static void UpdateRegion() + { + RegionMenu regionMenu = GameObject.Find("RegionMenu").GetComponent(); + + IRegionInfo newRegion = UnifyPlugin.SetDirectRegion(directConnect.text); + + regionMenu.ChooseOption(newRegion); + regionMenu.Close(); + } + + [HarmonyPatch(typeof(NameTextBehaviour), nameof(NameTextBehaviour.Start))] + public static class DirectConnectButtonPatch + { + public static void Postfix() + { + if (directConnect) return; + + JoinGameButton joinGameButton = DestroyableSingleton.Instance; + RegionMenu regionMenu = DestroyableSingleton.Instance; + + directConnect = Object.Instantiate(joinGameButton.GameIdText, regionMenu.transform); + directConnect.gameObject.SetActive(false); + directConnect.SetText(""); + directConnect.IpMode = true; + directConnect.characterLimit = 15; + directConnect.ClearOnFocus = false; + + directConnect.OnEnter = new Button.ButtonClickedEvent(); + directConnect.OnEnter.AddListener((Action) UpdateRegion); + + float offset = (float) 0.5 * ServerManager.DefaultRegions.Length; + directConnect.transform.localPosition = new Vector3(0, 2 - offset, -100); + } + } + + [HarmonyPatch(typeof(JoinGameButton), nameof(JoinGameButton.OnClick))] + public static class DirectConnectEnterButtonPatch + { + public static bool Prefix(JoinGameButton __instance) + { + GameObject regionMenuGameObject = GameObject.Find("RegionMenu"); + if (!regionMenuGameObject) return true; + + UpdateRegion(); + + return false; + } + } + + [HarmonyPatch(typeof(RegionMenu), nameof(RegionMenu.Open))] + public static class ShowDirectConnectPatch + { + public static void Postfix() + { + directConnect.gameObject.SetActive(true); + } + } + + [HarmonyPatch(typeof(RegionMenu), nameof(RegionMenu.Close))] + public static class HideDirectConnectPatch + { + public static void Postfix() + { + directConnect.gameObject.SetActive(false); + } + } + + [HarmonyPatch(typeof(ServerManager), nameof(ServerManager.SaveServers))] + public static class HideDirectConnectOnSelectPatch + { + public static void Postfix() + { + directConnect.gameObject.SetActive(false); + } + } } [HarmonyPatch(typeof(UdpConnection), nameof(UdpConnection.HandleSend))] diff --git a/Unify/Unify.cs b/Unify/Unify.cs index 7968ec0..9352f49 100644 --- a/Unify/Unify.cs +++ b/Unify/Unify.cs @@ -1,8 +1,11 @@ using System; using System.IO; +using System.Linq; +using System.Text.RegularExpressions; using BepInEx; using BepInEx.Configuration; using BepInEx.IL2CPP; +using BepInEx.Logging; using HarmonyLib; using Reactor; using Unify.Patches; @@ -45,13 +48,52 @@ namespace Unify return patchedRegions; } - public static void AddRegion(string name, string ip) + public static IRegionInfo AddRegion(string name, string ip) { + if (Uri.CheckHostName(ip) != UriHostNameType.IPv4) return ServerManager.Instance.CurrentRegion; + + IRegionInfo existingRegion = + ServerManager.DefaultRegions.ToArray().FirstOrDefault(region => region.PingServer == ip); + if (existingRegion != null) return existingRegion; + IRegionInfo newRegion = new DnsRegionInfo(ip, name, StringNames.NoTranslation, ip) .Cast(); RegionsPatch.ModRegions.Add(newRegion); RegionsPatch.Patch(); + + return newRegion; + } + + public static IRegionInfo SetDirectRegion(string ip) + { + if (Uri.CheckHostName(ip) != UriHostNameType.IPv4) return ServerManager.Instance.CurrentRegion; + + IRegionInfo newRegion = new DnsRegionInfo(ip, ip, StringNames.NoTranslation, ip) + .Cast(); + + RegionsPatch.DirectRegion = newRegion; + RegionsPatch.Patch(); + + return newRegion; + } + + public static void SetRegionIp(string ip) + { + IRegionInfo existingRegion = + ServerManager.DefaultRegions.ToArray().FirstOrDefault(region => region.PingServer == ip); + if (existingRegion != null) return; + + RegionMenu regionMenu = DestroyableSingleton.Instance; + IRegionInfo newRegion = AddRegion(ip, ip); + + // ChatLanguageButton lastRegionButton = regionMenu.ButtonPool.activeChildren[^1].Cast(); + + // regionMenu.ChooseOption(ServerManager.DefaultRegions[^1]); + // regionMenu.ButtonPool.activeChildren[^1].Cast().Button.ReceiveClickDown(); + // lastRegionButton.gameObject.SetActive(true); + // lastRegionButton.Button.OnClick.Invoke(); + regionMenu.ChooseOption(newRegion); } } } \ No newline at end of file diff --git a/build/Unify-2021.3.5s.dll b/build/Unify-2021.3.5s.dll index 6fe6567741dd663edcf8047caec0d859ec6e8c46..24f825017a1ba6450c789225c8697ed1605c07eb 100644 GIT binary patch literal 10752 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 delta 2965 zcmZuz32ao?6+QQFGaloQXUvQjY%*iB3^rKC7z%LMt{ao%S+Cj;Z6y!mQRzWWI#lwoj z;s)a7go2)`nAB61l=>#)XGzB8XOODVmXdw$L{UX!$m2Wyy!#c&Mvp@X{ zTGGEFOiQu04O2+`zq~7o_raIElA;uS1mZIY^BW3^Uz>E53x=DeF0-6q*3y+`_+sDm zyL)fkxZ&uDtE_!^f=Q|tzeBl=5^`$#l}EW;GAok)P{q#^w12JMbbo4AdAdkQP*5P$ zP`Z^+k= zf-*Z+t`7A z?xj-N>h9gx-o|&1dd~D*e|eT=!M|l8A|oIfJaTHe!KA?rspSQHGeeY3=!!S_a9e9x z@f8QSXsSLSg!j!8^z)=Fv?8c?&hs4qLEf{f(8~Z0#2GWIkUc=93YDBdE#8#V?6@D7 zIBbzUZaaA0%)`YJoU>efVV<)B=)pqELE0QM1NhJ!w*xp&W&l2C++K%S^yA`RqWB#| z2bb(Ivlbh0no(ZTv0_Yaww7n3H>-2`CX~A^)3t)*R-GI#wPZbnC-M5Hx$06aihkx#?Lj*BC0B7A5q9a>aP^0 zRqohY9+Fag*DSWT!Ve#mc0g;ztj*VRA9FD_}zztJqBJlW!n~BH6(k ztj*pnLA*eWV7;A^^-&e?uz$AG%Q%~|TKzTthAygmv~~?71pPH0oD3tZbvT02}Z zY<2M(8rNFB;tlI6wFgyAaSSh;N*mT%9zFJ_VxxyU9GGNY)7mlo-B!%zI(3b4;8m@v zI;`Rf8hDW?cuti3xD|s6T8R;}3k%Tf?AJJirL;eXcKq3XiMRhhah9B6YXn7_zZtKX zqv*sbxyU*UTW@0;R?B7V#WwjXs?lct15akz0mnJ8=XXG;Y?|sWGW>uf_u!hctRS z+^Xy{dEID4tGq${s*Dpm2wh|A@ZsH-?M|_&tibL>8E1t%D zqQ_ac;skG!L!8xG;|gzu9;}cCX*AL}j&I4Z7+fmwg#U+&C0TBjpW$76g2VE>{6(&d zl~b#zD3h(6SJkZ+!5rO9Gn=}oRC{G&Na0#3*v{!gb35;Z?lKrx4bU43sL>pgM@M*S z3+*XA_;%Zc3GWuKjmdUe3%BzMW3__`S^&S%QVD*{jd)q^>^P7aNc1*7km%l%*f~HNee`uFceN!l zJJZR2ZD}t!Xz%Mzp{*}-Q}eDz8oll1*S!9U%EhZw>E6x(tb1rT9U;}fy}h@8PjY8+ z0Ii*w0jx~)xA(2ukM-$9capDEW>yuZlra^My@~n`IY8BuDo#h)r)6KK3L(+oPK{TRQ1#*v6Nv3Tz3XS2h6}d;;Mwi<%MG~bucQwzJ-Vk{AeLCLn^rp zRurMI8HHO?Duxjbv~u