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.

94 lines
3.3KB

  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 override IEntitiesDB entitiesDB { get; set; }
  48. public override IEntityFactory entityFactory { get; set; }
  49. public ClientMessagingEngine(): base()
  50. {
  51. App.Client.GameJoin += (_, __) => { MessageSender().Run(); };
  52. }
  53. public IEnumerator MessageSender()
  54. {
  55. while (!_isRunning)
  56. {
  57. yield return null;
  58. }
  59. while (_isRunning)
  60. {
  61. while (_messageQueue.Count != 0)
  62. {
  63. MessageQueueItem item = _messageQueue.Dequeue();
  64. API.Utility.Logging.MetaLog($"Sending message with id {item.msg.Id}");
  65. _sendMessage(item.code, ref item.msg);
  66. }
  67. yield return null;
  68. }
  69. }
  70. public void OnFrameworkDestroyed()
  71. {
  72. _isRunning = false;
  73. }
  74. public void OnFrameworkInitialized()
  75. {
  76. _isRunning = true;
  77. }
  78. }
  79. }