LogicRecvMessageEvent.cs 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. using System;
  2. using System.Threading.Tasks;
  3. using Common.Network;
  4. using Model;
  5. using MongoDB.Bson;
  6. namespace Controller
  7. {
  8. [Event(EventType.LogicRecvMessage, ServerType.All)]
  9. public class LogicRecvMessageEvent: IEventAsync
  10. {
  11. public async Task RunAsync(Env env)
  12. {
  13. byte[] message = env.Get<byte[]>(EnvKey.Message);
  14. AChannel channel = env.Get<AChannel>(EnvKey.Channel);
  15. int opcode = BitConverter.ToUInt16(message, 0);
  16. // 如果是客户端消息,转交给unit actor处理
  17. // 逻辑服收到客户端消息opcode(2) + id(12) + content
  18. if (MessageTypeHelper.IsClientMessage(opcode))
  19. {
  20. byte[] idBuffer = new byte[12];
  21. Array.Copy(message, 2, idBuffer, 0, 12);
  22. ObjectId unitId = new ObjectId(idBuffer);
  23. Unit unit = World.Instance.GetComponent<UnitComponent>().Get(unitId);
  24. if (unit != null)
  25. {
  26. unit.GetComponent<ActorComponent>().Add(env);
  27. }
  28. return;
  29. }
  30. try
  31. {
  32. await World.Instance.GetComponent<EventComponent<MessageAttribute>>().RunAsync(opcode, env);
  33. }
  34. catch (Exception e)
  35. {
  36. // 如果是rpc请求,统一处理一下异常
  37. if (MessageTypeHelper.IsRpcRequestMessage(opcode))
  38. {
  39. int id = BitConverter.ToInt32(message, 4);
  40. World.Instance.GetComponent<NetworkComponent>().ResponseException(channel, id, 0, e.Message);
  41. }
  42. throw;
  43. }
  44. }
  45. }
  46. }