Unofficial CardLife revival project, pronounced like "celery"
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

78 lines
3.2KB

  1. using System.Collections;
  2. using GameNetworkLayer.Shared;
  3. using HarmonyLib;
  4. using Svelto.ECS;
  5. namespace CLre_server.API.Synergy
  6. {
  7. class ServerHandshakeEngine : Engines.ServerEnginePreBuild
  8. {
  9. internal static ServerHandshakeEngine Instance = null;
  10. internal const NetworkDispatcherCode CLre_HANDSHAKE_NETCODE = (NetworkDispatcherCode) 218;
  11. private Utility.Reflection.INetMsgServerSender_SendMessage<SerializedCLreHandshake> _sendMessage;
  12. private Utility.Reflection.INetMsgServerListener_RegisterListener<SerializedCLreHandshake> _registerListener;
  13. public override void Ready()
  14. {
  15. Utility.Logging.MetaLog("Building send message delegate");
  16. _sendMessage =
  17. Utility.Reflection.MethodAsDelegate<Utility.Reflection.INetMsgServerSender_SendMessage<SerializedCLreHandshake>>(
  18. "GameNetworkLayer.Server.NetMessageServerSender:SendMessage",
  19. generics: new [] {typeof(SerializedCLreHandshake)},
  20. instance: MainGameServer_SetupContainer_Patch.netMessageSender);
  21. Utility.Logging.MetaLog("Building register listener delegate");
  22. _registerListener =
  23. Utility.Reflection.MethodAsDelegate<Utility.Reflection.INetMsgServerListener_RegisterListener<SerializedCLreHandshake>>(
  24. "GameNetworkLayer.Server.NetMessageServerListener:RegisterListener",
  25. generics: new [] {typeof(SerializedCLreHandshake)},
  26. instance: MainGameServer_SetupContainer_Patch.netMessageListener);
  27. _registerListener(CLre_HANDSHAKE_NETCODE, OnHandshakeReceived);
  28. }
  29. public void OnHandshakeReceived(int playerId, ref SerializedCLreHandshake p)
  30. {
  31. // TODO validate handshake msg
  32. Utility.Logging.MetaLog($"Received CLre handshake from player {playerId}! {p}");
  33. Message.RegisterCLreClient(playerId);
  34. SerializedCLreHandshake payload = SerializedCLreHandshake.Current();
  35. payload.SetFlag(HandshakeFlag.Confirm);
  36. Sender(payload, playerId).Run();
  37. }
  38. public override IEntitiesDB entitiesDB { get; set; }
  39. public override IEntityFactory entityFactory { get; set; }
  40. public IEnumerator Sender(SerializedCLreHandshake payload, int playerId)
  41. {
  42. yield return null;
  43. Utility.Logging.MetaLog("Sending Server CLre handshake");
  44. _sendMessage(CLre_HANDSHAKE_NETCODE, ref payload, playerId);
  45. yield return null;
  46. }
  47. internal static void Init()
  48. {
  49. Instance = new ServerHandshakeEngine();
  50. }
  51. }
  52. [HarmonyPatch(typeof(GameServer.GameFramework.MainGameServer), "SetupContainer")]
  53. class MainGameServer_SetupContainer_Patch
  54. {
  55. internal static object netMessageListener;
  56. internal static object netMessageSender;
  57. [HarmonyPostfix]
  58. public static void AfterMethodCall(object ____netMessageListener, object ____netMessageSender)
  59. {
  60. Utility.Logging.MetaLog($"Got NetMessage objects");
  61. netMessageListener = ____netMessageListener;
  62. netMessageSender = ____netMessageSender;
  63. }
  64. }
  65. }