EntityActorHandler.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. using System;
  2. using System.Threading.Tasks;
  3. using ETModel;
  4. namespace ETHotfix
  5. {
  6. /// <summary>
  7. /// gate session收到的消息直接转发给客户端
  8. /// </summary>
  9. public class GateSessionEntityActorHandler : IEntityActorHandler
  10. {
  11. public async Task Handle(Session session, Entity entity, ActorRequest actorRequest)
  12. {
  13. ActorResponse actorResponse = new ActorResponse();
  14. actorResponse.RpcId = actorRequest.RpcId;
  15. try
  16. {
  17. OpcodeTypeComponent opcodeTypeComponent = session.Network.Entity.GetComponent<OpcodeTypeComponent>();
  18. Type type = opcodeTypeComponent.GetType(actorRequest.Op);
  19. IMessage message = (IMessage)session.Network.MessagePacker.DeserializeFrom(type, actorRequest.AMessage);
  20. // 发送给客户端
  21. Session clientSession = entity as Session;
  22. clientSession.Send(actorResponse.Flag, message);
  23. session.Reply(actorResponse);
  24. await Task.CompletedTask;
  25. }
  26. catch (Exception e)
  27. {
  28. actorResponse.Error = ErrorCode.ERR_SessionActorError;
  29. actorResponse.Message = $"session actor error {e}";
  30. session.Reply(actorResponse);
  31. throw;
  32. }
  33. }
  34. }
  35. public class CommonEntityActorHandler : IEntityActorHandler
  36. {
  37. public async Task Handle(Session session, Entity entity, ActorRequest actorRequest)
  38. {
  39. OpcodeTypeComponent opcodeTypeComponent = session.Network.Entity.GetComponent<OpcodeTypeComponent>();
  40. Type type = opcodeTypeComponent.GetType(actorRequest.Op);
  41. IMessage message = (IMessage)session.Network.MessagePacker.DeserializeFrom(type, actorRequest.AMessage);
  42. await Game.Scene.GetComponent<ActorMessageDispatherComponent>().Handle(session, entity, actorRequest, message);
  43. }
  44. }
  45. /// <summary>
  46. /// 玩家收到帧同步消息交给帧同步组件处理
  47. /// </summary>
  48. public class MapUnitEntityActorHandler : IEntityActorHandler
  49. {
  50. public async Task Handle(Session session, Entity entity, ActorRequest actorRequest)
  51. {
  52. OpcodeTypeComponent opcodeTypeComponent = session.Network.Entity.GetComponent<OpcodeTypeComponent>();
  53. Type type = opcodeTypeComponent.GetType(actorRequest.Op);
  54. IMessage message = (IMessage)session.Network.MessagePacker.DeserializeFrom(type, actorRequest.AMessage);
  55. if (message is OneFrameMessage aFrameMessage)
  56. {
  57. Game.Scene.GetComponent<ServerFrameComponent>().Add(aFrameMessage);
  58. ActorResponse actorResponse = new ActorResponse
  59. {
  60. RpcId = actorRequest.RpcId
  61. };
  62. session.Reply(actorResponse);
  63. return;
  64. }
  65. await Game.Scene.GetComponent<ActorMessageDispatherComponent>().Handle(session, entity, actorRequest, message);
  66. }
  67. }
  68. }