using System.Collections; using CLre.API.Engines; using GameNetworkLayer.Shared; using HarmonyLib; using Svelto.ECS; using VoxelFarm.GameServer; namespace CLre.API.Synergy { public class ClientHandshakeEngine : GameObsoleteEnginePreBuild { internal static ClientHandshakeEngine Instance = null; internal const NetworkDispatcherCode CLre_HANDSHAKE_NETCODE = (NetworkDispatcherCode) 218; private Utility.Reflection.INetMsgClientSender_SendMessage _sendMessage; private Utility.Reflection.INetMsgClientListener_RegisterListener _registerListener; public override void Ready() { //Utility.Logging.MetaLog("Building send message delegate"); _sendMessage = Utility.Reflection.MethodAsDelegate>( "GameNetworkLayer.Client.NetMessageClientSender:SendMessage", generics: new [] {typeof(SerializedCLreHandshake)}, instance: MainLevel_BuildClasses_Patch.netMessageSender); //Utility.Logging.MetaLog("Building register listener delegate"); _registerListener = Utility.Reflection.MethodAsDelegate>( "GameNetworkLayer.Client.NetMessageClientListener:RegisterListener", generics: new [] {typeof(SerializedCLreHandshake)}, instance: MainLevel_BuildClasses_Patch.netMessageListener); _registerListener(CLre_HANDSHAKE_NETCODE, OnHandshakeReceived); } public void OnHandshakeReceived(ref SerializedCLreHandshake p) { // TODO validate handshake msg Utility.Logging.MetaLog($"Received CLre handshake! {p}"); } public IEnumerator Sender(SerializedCLreHandshake payload) { yield return null; Utility.Logging.MetaLog("Sending Client CLre handshake"); _sendMessage(CLre_HANDSHAKE_NETCODE, ref payload); yield return null; } internal static void Init() { Instance = new ClientHandshakeEngine(); } public ClientHandshakeEngine(): base() { App.Client.GameJoin += (_, __) => { SerializedCLreHandshake payload = SerializedCLreHandshake.Current(); Sender(payload).Run(); }; } } [HarmonyPatch(typeof(GameFramework.MainLevel), "BuildClasses")] class MainLevel_BuildClasses_Patch { internal static object netMessageListener; internal static object netMessageSender; internal static TerrainModelClientServer tmcs; [HarmonyPostfix] public static void AfterMethodCall(object ____netMessageListener, object ____netMessageSender, TerrainModelClientServer ____terrainModelServerPrediction) { netMessageListener = ____netMessageListener; netMessageSender = ____netMessageSender; tmcs = ____terrainModelServerPrediction; } } }