InnerMessageDispatcherHelper.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. using System;
  2. using System.IO;
  3. namespace ET
  4. {
  5. public static class InnerMessageDispatcherHelper
  6. {
  7. public static void HandleIActorResponse(ushort opcode, long actorId, IActorResponse iActorResponse)
  8. {
  9. ActorMessageSenderComponent.Instance.RunMessage(actorId, iActorResponse);
  10. }
  11. public static void HandleIActorRequest(ushort opcode, long actorId, IActorRequest iActorRequest, Action<IActorResponse> reply)
  12. {
  13. Entity entity = Game.EventSystem.Get(actorId);
  14. if (entity == null)
  15. {
  16. FailResponse(iActorRequest, ErrorCode.ERR_NotFoundActor, reply);
  17. return;
  18. }
  19. MailBoxComponent mailBoxComponent = entity.GetComponent<MailBoxComponent>();
  20. if (mailBoxComponent == null)
  21. {
  22. FailResponse(iActorRequest, ErrorCode.ERR_ActorNoMailBoxComponent, reply);
  23. return;
  24. }
  25. switch (mailBoxComponent.MailboxType)
  26. {
  27. case MailboxType.MessageDispatcher:
  28. {
  29. async ETVoid MessageDispatcherHandler()
  30. {
  31. long instanceId = entity.InstanceId;
  32. using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.Mailbox, actorId))
  33. {
  34. if (entity.InstanceId != instanceId)
  35. {
  36. FailResponse(iActorRequest, ErrorCode.ERR_NotFoundActor, reply);
  37. return;
  38. }
  39. await ActorMessageDispatcherComponent.Instance.Handle(entity, iActorRequest, reply);
  40. }
  41. }
  42. MessageDispatcherHandler().Coroutine();
  43. break;
  44. }
  45. case MailboxType.UnOrderMessageDispatcher:
  46. {
  47. ActorMessageDispatcherComponent.Instance.Handle(entity, iActorRequest, reply).Coroutine();
  48. break;
  49. }
  50. }
  51. }
  52. private static void FailResponse(IActorRequest iActorRequest, int error, Action<IActorResponse> reply)
  53. {
  54. IActorResponse response = ActorHelper.CreateResponse(iActorRequest, error);
  55. reply.Invoke(response);
  56. }
  57. public static void HandleIActorMessage(ushort opcode, long actorId, IActorMessage iActorMessage)
  58. {
  59. OpcodeHelper.LogMsg(opcode, actorId, iActorMessage);
  60. Entity entity = Game.EventSystem.Get(actorId);
  61. if (entity == null)
  62. {
  63. Log.Error($"not found actor: {actorId} {iActorMessage}");
  64. return;
  65. }
  66. MailBoxComponent mailBoxComponent = entity.GetComponent<MailBoxComponent>();
  67. if (mailBoxComponent == null)
  68. {
  69. Log.Error($"actor not add MailBoxComponent: {entity.GetType().Name} {iActorMessage}");
  70. return;
  71. }
  72. switch (mailBoxComponent.MailboxType)
  73. {
  74. case MailboxType.MessageDispatcher:
  75. {
  76. async ETVoid MessageDispatcherHandler()
  77. {
  78. long instanceId = entity.InstanceId;
  79. using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.Mailbox, actorId))
  80. {
  81. if (entity.InstanceId != instanceId)
  82. {
  83. return;
  84. }
  85. await ActorMessageDispatcherComponent.Instance.Handle(entity, iActorMessage, null);
  86. }
  87. }
  88. MessageDispatcherHandler().Coroutine();
  89. break;
  90. }
  91. case MailboxType.UnOrderMessageDispatcher:
  92. {
  93. ActorMessageDispatcherComponent.Instance.Handle(entity, iActorMessage, null).Coroutine();
  94. break;
  95. }
  96. }
  97. }
  98. }
  99. }