diff --git a/README.md b/README.md index 604014e..b55b8a3 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,9 @@ Regions can be connected to directly using an IP address. Custom regions can be added as detailed below in the [configuration](#configuration) section. +Other mods can add regions via the +`AddRegion(string name, string ip)` method. + ## Installation > **⚠ WARNING** @@ -60,7 +63,7 @@ The configuration file is located at ### Custom regions Custom regions can be added by modifying the `[Region 1]`, -`[Region 2]` ... `[Region 10]` sections of the configuration file. +`[Region 2]` ... `[Region 9]` sections of the configuration file. You can modify the display name of the region, the IP address of the region and the port of the region. diff --git a/Unify/Patches/Regions.cs b/Unify/Patches/Regions.cs index fa220f8..cf47c9a 100644 --- a/Unify/Patches/Regions.cs +++ b/Unify/Patches/Regions.cs @@ -27,16 +27,17 @@ namespace Unify.Patches public static IRegionInfo DirectRegion { get; set; } - private static TextBox directConnect { get; set; } + private static TextBox DirectConnect { get; set; } public static void Patch() { ServerManager serverManager = ServerManager.Instance; - 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); + IRegionInfo[] patchedRegions = _oldRegions + .AddRangeToArray(_newRegions) + .AddRangeToArray(ModRegions.ToArray()) + .AddRangeToArray(LoadCustomUserRegions()); + if (DirectRegion != null) patchedRegions = patchedRegions.AddToArray(DirectRegion); ServerManager.DefaultRegions = patchedRegions; serverManager.AvailableRegions = patchedRegions; @@ -47,7 +48,7 @@ namespace Unify.Patches { List customRegions = new List(); - for (int x = 0; x < 10; x++) + for (int x = 0; x < 9; x++) { ConfigEntry regionName = UnifyPlugin.ConfigFile.Bind( $"Region {x + 1}", $"Name", "custom region"); @@ -72,11 +73,11 @@ namespace Unify.Patches { RegionMenu regionMenu = GameObject.Find("RegionMenu").GetComponent(); - bool success = UnifyPlugin.SetDirectRegion(directConnect.text, out IRegionInfo newRegion); + bool success = UnifyPlugin.SetDirectRegion(DirectConnect.text, out IRegionInfo newRegion); if (!success) { - directConnect.StartCoroutine(Effects.FIJHCJMBGFP(directConnect.transform, 0.75f, 0.25f)); + DirectConnect.StartCoroutine(Effects.FIJHCJMBGFP(DirectConnect.transform, 0.75f, 0.25f)); return; } @@ -92,17 +93,17 @@ namespace Unify.Patches JoinGameButton joinGameButton = DestroyableSingleton.Instance; RegionMenu regionMenu = DestroyableSingleton.Instance; - directConnect = Object.Instantiate(joinGameButton.GameIdText, regionMenu.transform); - directConnect.gameObject.SetActive(false); - directConnect.IpMode = true; - directConnect.characterLimit = 15; - directConnect.ClearOnFocus = false; + DirectConnect = Object.Instantiate(joinGameButton.GameIdText, regionMenu.transform); + DirectConnect.gameObject.SetActive(false); + DirectConnect.IpMode = true; + DirectConnect.characterLimit = 15; + DirectConnect.ClearOnFocus = false; - directConnect.OnEnter = new Button.ButtonClickedEvent(); - directConnect.OnEnter.AddListener((Action) UpdateRegion); + DirectConnect.OnEnter = new Button.ButtonClickedEvent(); + DirectConnect.OnEnter.AddListener((Action) UpdateRegion); - int offset = ((ServerManager.DefaultRegions.Length + 1) / 2) + 1; - directConnect.transform.localPosition = new Vector3(0, 2f - (offset / 2f), -100f); + int offset = _newRegions.Length + ModRegions.Count; + DirectConnect.transform.localPosition = new Vector3(0, 1f - (offset / 2f), -100f); } } @@ -111,18 +112,38 @@ namespace Unify.Patches { public static void Postfix(RegionMenu __instance) { - directConnect.gameObject.SetActive(true); + DirectConnect.gameObject.SetActive(true); var regionButtons = __instance.ButtonPool.activeChildren.ToArray(); - int half = (regionButtons.Length + 1) / 2; - - for (int x = 0; x < regionButtons.Length; x++) - { - ServerListButton regionButton = regionButtons[x].Cast(); - regionButton.transform.localPosition = new Vector3(1.25f * ((x < half)? -1: 1), 2f - 0.5f * (x - ((x < half)? 0 : half)), 0f); + for (int i = 0; i < regionButtons.Length; i++) + { + ServerListButton regionButton = regionButtons[i].Cast(); + + (float x, float y) = CalculatePosition(i); + regionButton.transform.localPosition = new Vector3(1.25f + x, 2f - 0.5f * y, 0f); } } + + private static (float x, float y) CalculatePosition(int index) + { + // currently broken + /*if (DirectRegion != null && ServerManager.DefaultRegions[index].Name == DirectRegion.Name) + { + int offset = Math.Max( + Math.Max(LoadCustomUserRegions().Length, _newRegions.Length + ModRegions.Count), + _oldRegions.Length); + return (1.25f, 2f - offset); + }*/ + + bool isCustomRegion = index >= _oldRegions.Length; + bool isCustomUserRegion = index >= _oldRegions.Length + _newRegions.Length + ModRegions.Count; + float x = (isCustomRegion ? 3f : 0) + (isCustomUserRegion ? 3f : 0) - 4.25f; + float y = index - (isCustomRegion ? _oldRegions.Length : 0) - + (isCustomUserRegion ? _newRegions.Length + ModRegions.Count : 0); + + return (x, y); + } } [HarmonyPatch(typeof(JoinGameButton), nameof(JoinGameButton.OnClick))] @@ -144,7 +165,7 @@ namespace Unify.Patches { public static void Postfix() { - directConnect.gameObject.SetActive(false); + DirectConnect.gameObject.SetActive(false); } } @@ -153,7 +174,7 @@ namespace Unify.Patches { public static void Postfix() { - directConnect.gameObject.SetActive(false); + DirectConnect.gameObject.SetActive(false); } } } diff --git a/Unify/Unify.cs b/Unify/Unify.cs index 8cdb028..7317e9b 100644 --- a/Unify/Unify.cs +++ b/Unify/Unify.cs @@ -6,6 +6,7 @@ using BepInEx; using BepInEx.Configuration; using BepInEx.IL2CPP; using HarmonyLib; +using Hazel.Udp; using Reactor; using Unify.Patches; @@ -19,15 +20,10 @@ namespace Unify { public const string Id = "daemon.unify"; private const string Name = "Unify"; - private const string Version = "3.0.0"; + private const string Version = "3.0.1"; public static ConfigFile ConfigFile { get; private set; } - // public static readonly bool HandshakeDisabled = !PluginSingleton.Instance.ModdedHandshake.Value; - - /*public static readonly string[] NormalHandshake = - new string[] {"North America", "Europe", "Asia", "skeld.net"};*/ - public Harmony Harmony { get; } = new Harmony(Id); public override void Load() @@ -47,20 +43,12 @@ namespace Unify RegionsPatch.Patch(); - Harmony.UnpatchAll(ReactorPlugin.Id); + // Unpatches the modded handshake, because Impostor is STILL not fully updated yet + Harmony.Unpatch(typeof(UdpConnection).GetMethod("HandleSend"), HarmonyPatchType.Prefix, ReactorPlugin.Id); Harmony.PatchAll(); } - public static IRegionInfo[] MergeRegions(IRegionInfo[] oldRegions, IRegionInfo[] newRegions) - { - IRegionInfo[] patchedRegions = new IRegionInfo[oldRegions.Length + newRegions.Length]; - Array.Copy(oldRegions, patchedRegions, oldRegions.Length); - Array.Copy(newRegions, 0, patchedRegions, oldRegions.Length, newRegions.Length); - - return patchedRegions; - } - public static IRegionInfo AddRegion(string name, string ip) { if (Uri.CheckHostName(ip) != UriHostNameType.IPv4) return ServerManager.Instance.CurrentRegion; diff --git a/Unify/Unify.csproj b/Unify/Unify.csproj index 8b029dc..377fedd 100644 --- a/Unify/Unify.csproj +++ b/Unify/Unify.csproj @@ -1,7 +1,7 @@ netstandard2.1 - 3.0.0 + 3.0.1 NuclearPowered/Mappings:0.3.0 Region mod diff --git a/build/Unify-2021.3.31.3s.dll b/build/Unify-2021.3.31.3s.dll index 61b6280..dab467a 100644 Binary files a/build/Unify-2021.3.31.3s.dll and b/build/Unify-2021.3.31.3s.dll differ