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.

91 lines
3.1KB

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using GameNetworkLayer.Shared;
  4. using Svelto.Context;
  5. using Svelto.ECS;
  6. namespace CLre.API.Synergy
  7. {
  8. class ClientMessagingEngine: Engines.GameObsoleteEnginePostBuild, IWaitForFrameworkDestruction, IWaitForFrameworkInitialization
  9. {
  10. private struct MessageQueueItem
  11. {
  12. public SerializedCLreMessage msg;
  13. public NetworkDispatcherCode code;
  14. }
  15. private Utility.Reflection.INetMsgClientSender_SendMessage<SerializedCLreMessage> _sendMessage;
  16. private Utility.Reflection.INetMsgClientListener_RegisterListener<SerializedCLreMessage> _registerListener;
  17. private Queue<MessageQueueItem> _messageQueue = new Queue<MessageQueueItem>(10);
  18. private bool _isRunning = false;
  19. public override void Ready()
  20. {
  21. //Utility.Logging.MetaLog("Building send message delegate");
  22. _sendMessage =
  23. Utility.Reflection.MethodAsDelegate<Utility.Reflection.INetMsgClientSender_SendMessage<SerializedCLreMessage>>(
  24. "GameNetworkLayer.Client.NetMessageClientSender:SendMessage",
  25. generics: new [] {typeof(SerializedCLreMessage)},
  26. instance: MainLevel_BuildClasses_Patch.netMessageSender);
  27. //Utility.Logging.MetaLog("Building register listener delegate");
  28. _registerListener =
  29. Utility.Reflection.MethodAsDelegate<Utility.Reflection.INetMsgClientListener_RegisterListener<SerializedCLreMessage>>(
  30. "GameNetworkLayer.Client.NetMessageClientListener:RegisterListener",
  31. generics: new [] {typeof(SerializedCLreMessage)},
  32. instance: MainLevel_BuildClasses_Patch.netMessageListener);
  33. _registerListener(Message.CLre_MESSAGE_NETCODE, OnMessageReceived);
  34. }
  35. private void OnMessageReceived(ref SerializedCLreMessage data)
  36. {
  37. Message.HandleMessageReceive(ref data);
  38. }
  39. internal void EnqueueMessage(ref SerializedCLreMessage msg)
  40. {
  41. _messageQueue.Enqueue(new MessageQueueItem
  42. {
  43. msg = msg,
  44. code = Message.CLre_MESSAGE_NETCODE,
  45. });
  46. }
  47. public ClientMessagingEngine(): base()
  48. {
  49. App.Client.GameJoin += (_, __) => { MessageSender().Run(); };
  50. }
  51. public IEnumerator MessageSender()
  52. {
  53. while (!_isRunning)
  54. {
  55. yield return null;
  56. }
  57. while (_isRunning)
  58. {
  59. while (_messageQueue.Count != 0)
  60. {
  61. MessageQueueItem item = _messageQueue.Dequeue();
  62. API.Utility.Logging.MetaLog($"Sending message with id {item.msg.Id}");
  63. _sendMessage(item.code, ref item.msg);
  64. }
  65. yield return null;
  66. }
  67. }
  68. public void OnFrameworkDestroyed()
  69. {
  70. _isRunning = false;
  71. }
  72. public void OnFrameworkInitialized()
  73. {
  74. _isRunning = true;
  75. }
  76. }
  77. }