From d5929c270a66bbe0acaff4183912de161fd2c033 Mon Sep 17 00:00:00 2001 From: js6pak Date: Tue, 2 Nov 2021 21:14:35 +0100 Subject: [PATCH] Add ServerInfoFixes Co-authored-by: miniduikboot --- Reactor/Patches/ServerInfoFixes.cs | 84 ++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 Reactor/Patches/ServerInfoFixes.cs diff --git a/Reactor/Patches/ServerInfoFixes.cs b/Reactor/Patches/ServerInfoFixes.cs new file mode 100644 index 0000000..b23880e --- /dev/null +++ b/Reactor/Patches/ServerInfoFixes.cs @@ -0,0 +1,84 @@ +using System; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using HarmonyLib; +using InnerNet; + +namespace Reactor.Patches +{ + /// + /// Fixes hardcoded ports + /// + [HarmonyPatch(typeof(InnerNetClient), nameof(InnerNetClient.SetEndpoint))] + public static class SetEndpointPatch + { + public static void Prefix(InnerNetClient __instance, ref string addr, ref ushort port) + { + var serverManager = ServerManager.Instance; + if (addr == serverManager.OnlineNetAddress && __instance.GameMode == GameModes.OnlineGame && port != serverManager.OnlineNetPort) + { + Logger.Info($"Set endpoint to {addr}:{port}"); + Logger.Info($"Correcting port to {serverManager.OnlineNetPort}"); + port = serverManager.OnlineNetPort; + } + } + } + + [HarmonyPatch(typeof(InnerNetClient), nameof(InnerNetClient.Connect))] + public static class ConnectPatch + { + public static void Prefix(InnerNetClient __instance) + { + Logger.Info($"Joining {__instance.networkAddress}:{__instance.networkPort}"); + } + } + + /// + /// Fixes hardcoded port and filters out IPv6 in DnsRegionInfo + /// + [HarmonyPatch(typeof(DnsRegionInfo), nameof(DnsRegionInfo.PopulateServers))] + public static class PopulateServersPatch + { + public static bool Prefix(DnsRegionInfo __instance) + { + try + { + var i = 0; + var servers = Dns.GetHostAddresses(__instance.Fqdn) + .Distinct() + .Where(ipAddress => ipAddress.AddressFamily == AddressFamily.InterNetwork) + .Select(ipAddress => new ServerInfo($"{__instance.Name}-{i++}", ipAddress.ToString(), __instance.Port)) + .ToArray(); + + __instance.cachedServers = servers; + Logger.Info($"Populated {__instance.Name} ({__instance.Fqdn}:{__instance.Port}) with {servers.Length} server(s) {{{servers.Join()}}}"); + } + catch (Exception e) + { + Logger.Info($"Failed to populate {__instance.Name}: {e}"); + __instance.cachedServers = new[] + { + new ServerInfo(__instance.Name ?? string.Empty, __instance.DefaultIp, __instance.Port), + }; + } + + return false; + } + } + + /// + /// De-inlines AmongUsClient#SetEndpoint from JoinGameButton + /// + [HarmonyPatch(typeof(JoinGameButton), nameof(JoinGameButton.OnClick))] + public static class JoinGameButtonPatch + { + public static void Postfix(JoinGameButton __instance) + { + if (__instance.GameMode == GameModes.OnlineGame) + { + AmongUsClient.Instance.SetEndpoint(DestroyableSingleton.Instance.OnlineNetAddress, DestroyableSingleton.Instance.OnlineNetPort); + } + } + } +}