EntityActorHandler.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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. try
  15. {
  16. OpcodeTypeComponent opcodeTypeComponent = session.Network.Entity.GetComponent<OpcodeTypeComponent>();
  17. Type type = opcodeTypeComponent.GetType(actorRequest.Op);
  18. IMessage message = (IMessage)session.Network.MessagePacker.DeserializeFrom(type, actorRequest.AMessage);
  19. // 发送给客户端
  20. Session clientSession = entity as Session;
  21. clientSession.Send(actorResponse.Flag, message);
  22. actorResponse.RpcId = actorRequest.RpcId;
  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. actorResponse.RpcId = actorRequest.RpcId;
  31. session.Reply(actorResponse);
  32. throw;
  33. }
  34. }
  35. }
  36. public class CommonEntityActorHandler : IEntityActorHandler
  37. {
  38. public async Task Handle(Session session, Entity entity, ActorRequest actorRequest)
  39. {
  40. OpcodeTypeComponent opcodeTypeComponent = session.Network.Entity.GetComponent<OpcodeTypeComponent>();
  41. Type type = opcodeTypeComponent.GetType(actorRequest.Op);
  42. IMessage message = (IMessage)session.Network.MessagePacker.DeserializeFrom(type, actorRequest.AMessage);
  43. await Game.Scene.GetComponent<ActorMessageDispatherComponent>().Handle(session, entity, actorRequest, message);
  44. }
  45. }
  46. /// <summary>
  47. /// 玩家收到帧同步消息交给帧同步组件处理
  48. /// </summary>
  49. public class MapUnitEntityActorHandler : IEntityActorHandler
  50. {
  51. public async Task Handle(Session session, Entity entity, ActorRequest actorRequest)
  52. {
  53. OpcodeTypeComponent opcodeTypeComponent = session.Network.Entity.GetComponent<OpcodeTypeComponent>();
  54. Type type = opcodeTypeComponent.GetType(actorRequest.Op);
  55. IMessage message = (IMessage)session.Network.MessagePacker.DeserializeFrom(type, actorRequest.AMessage);
  56. if (message is OneFrameMessage aFrameMessage)
  57. {
  58. Game.Scene.GetComponent<ServerFrameComponent>().Add(aFrameMessage);
  59. ActorResponse actorResponse = new ActorResponse();
  60. actorResponse.RpcId = actorRequest.RpcId;
  61. session.Reply(actorResponse);
  62. return;
  63. }
  64. await Game.Scene.GetComponent<ActorMessageDispatherComponent>().Handle(session, entity, actorRequest, message);
  65. }
  66. }
  67. }