using System.Collections; using System.Linq; using GameNetworkLayer.Shared; using HarmonyLib; using Svelto.ECS; namespace CLre_server.API.Synergy { class ServerHandshakeEngine : Engines.ServerEnginePreBuild { internal static ServerHandshakeEngine Instance = null; internal const NetworkDispatcherCode CLre_HANDSHAKE_NETCODE = (NetworkDispatcherCode) 218; private Utility.Reflection.INetMsgServerSender_SendMessage _sendMessage; private Utility.Reflection.INetMsgServerListener_RegisterListener _registerListener; public override void Ready() { Utility.Logging.MetaLog("Building send message delegate"); _sendMessage = Utility.Reflection.MethodAsDelegate>( "GameNetworkLayer.Server.NetMessageServerSender:SendMessage", generics: new [] {typeof(SerializedCLreHandshake)}, instance: MainGameServer_SetupContainer_Patch.netMessageSender); Utility.Logging.MetaLog("Building register listener delegate"); _registerListener = Utility.Reflection.MethodAsDelegate>( "GameNetworkLayer.Server.NetMessageServerListener:RegisterListener", generics: new [] {typeof(SerializedCLreHandshake)}, instance: MainGameServer_SetupContainer_Patch.netMessageListener); _registerListener(CLre_HANDSHAKE_NETCODE, OnHandshakeReceived); } public void OnHandshakeReceived(int playerId, ref SerializedCLreHandshake p) { // validate handshake msg if (!(p.HasFlag(HandshakeFlag.Client) || p.Mods.Contains("CLre"))) { Utility.Logging.LogWarning($"Received invalid CLre handshake from player {playerId}! {p}"); return; } Utility.Logging.MetaLog($"Received CLre handshake from player {playerId}! {p}"); Clients.RegisterCLreClient(playerId); SerializedCLreHandshake payload = SerializedCLreHandshake.Current(); payload.SetFlag(HandshakeFlag.Confirm); Sender(payload, playerId).Run(); } public IEnumerator Sender(SerializedCLreHandshake payload, int playerId) { yield return null; Utility.Logging.MetaLog("Sending Server CLre handshake"); _sendMessage(CLre_HANDSHAKE_NETCODE, ref payload, playerId); yield return null; } internal static void Init() { Instance = new ServerHandshakeEngine(); } } [HarmonyPatch(typeof(GameServer.GameFramework.MainGameServer), "SetupContainer")] class MainGameServer_SetupContainer_Patch { internal static object netMessageListener; internal static object netMessageSender; [HarmonyPostfix] public static void AfterMethodCall(object ____netMessageListener, object ____netMessageSender) { Utility.Logging.MetaLog($"Got NetMessage objects"); netMessageListener = ____netMessageListener; netMessageSender = ____netMessageSender; } } }