Beispiel #1
0
        public void Dispatch(Session session, ushort opcode, int offset, byte[] messageBytes, AMessage message)
        {
            // 收到actor rpc request
            if (message is ActorRpcRequest actorRpcRequest)
            {
                Entity entity = Game.Scene.GetComponent <ActorManagerComponent>().Get(actorRpcRequest.Id);
                if (entity == null)
                {
                    Log.Warning($"not found actor: {actorRpcRequest.Id}");
                    ActorRpcResponse response = new ActorRpcResponse
                    {
                        RpcId = actorRpcRequest.RpcId,
                        Error = ErrorCode.ERR_NotFoundActor
                    };
                    session.Reply(response);
                    return;
                }
                entity.GetComponent <ActorComponent>().Add(new ActorMessageInfo()
                {
                    Session = session, Message = actorRpcRequest
                });
                return;
            }

            // 收到actor消息分发给actor自己去处理
            if (message is ActorRequest actorRequest)
            {
                Entity entity = Game.Scene.GetComponent <ActorManagerComponent>().Get(actorRequest.Id);
                if (entity == null)
                {
                    Log.Warning($"not found actor: {actorRequest.Id}");
                    ActorResponse response = new ActorResponse
                    {
                        RpcId = actorRequest.RpcId,
                        Error = ErrorCode.ERR_NotFoundActor
                    };
                    session.Reply(response);
                    return;
                }
                entity.GetComponent <ActorComponent>().Add(new ActorMessageInfo()
                {
                    Session = session, Message = actorRequest
                });
                return;
            }

            if (message is AMessage || message is ARequest)
            {
                Game.Scene.GetComponent <MessageDispatherComponent>().Handle(session, message);
                return;
            }

            throw new Exception($"message type error: {message.GetType().FullName}");
        }
Beispiel #2
0
 public void Handle(Session session, MessageInfo messageInfo)
 {
     try
     {
         Request request = messageInfo.Message as Request;
         if (request == null)
         {
             Log.Error($"消息类型转换错误: {messageInfo.Message.GetType().Name} to {typeof(Request).Name}");
         }
         this.Run(session, request, response =>
         {
             // 等回调回来,session可以已经断开了,所以需要判断session id是否为0
             if (session.Id == 0)
             {
                 return;
             }
             session.Reply(messageInfo.RpcId, response);
         }
                  );
     }
     catch (Exception e)
     {
         throw new Exception($"解释消息失败: {messageInfo.Opcode}", e);
     }
 }
        public async Task Handle(Session session, Entity entity, ActorRequest message)
        {
            Message msg = message.AMessage as Message;

            if (msg == null)
            {
                Log.Error($"消息类型转换错误: {message.GetType().FullName} to {typeof (Message).Name}");
                return;
            }
            E e = entity as E;

            if (e == null)
            {
                Log.Error($"Actor类型转换错误: {entity.GetType().Name} to {typeof(E).Name}");
                return;
            }

            await this.Run(e, msg);

            // 等回调回来,session可以已经断开了,所以需要判断session id是否为0
            if (session.Id == 0)
            {
                return;
            }
            ActorResponse response = new ActorResponse
            {
                RpcId = message.RpcId
            };

            session.Reply(response);
        }
Beispiel #4
0
 public async Task Handle(Session session, Entity entity, uint rpcId, ActorRequest message)
 {
     try
     {
         Request request = message.AMessage as Request;
         if (request == null)
         {
             Log.Error($"消息类型转换错误: {message.GetType().FullName} to {typeof (Request).Name}");
             return;
         }
         E e = entity as E;
         if (e == null)
         {
             Log.Error($"Actor类型转换错误: {entity.GetType().Name} to {typeof(E).Name}");
             return;
         }
         await this.Run(e, request, response =>
         {
             // 等回调回来,session可以已经断开了,所以需要判断session id是否为0
             if (session.Id == 0)
             {
                 return;
             }
             ActorResponse actorResponse = new ActorResponse
             {
                 AMessage = response
             };
             session.Reply(rpcId, actorResponse);
         });
     }
     catch (Exception e)
     {
         throw new Exception($"解释消息失败: {message.GetType().FullName}", e);
     }
 }
        public async void Dispatch(Session session, ushort opcode, int offset, byte[] messageBytes, AMessage message)
        {
            // gate session收到actor消息直接转发给actor自己去处理
            if (message is AActorMessage)
            {
                long       unitId     = session.GetComponent <SessionPlayerComponent>().Player.UnitId;
                ActorProxy actorProxy = Game.Scene.GetComponent <ActorProxyComponent>().Get(unitId);
                actorProxy.Send(message);
                return;
            }

            // gate session收到actor rpc消息,先向actor 发送rpc请求,再将请求结果返回客户端
            if (message is AActorRequest aActorRequest)
            {
                long       unitId     = session.GetComponent <SessionPlayerComponent>().Player.UnitId;
                ActorProxy actorProxy = Game.Scene.GetComponent <ActorProxyComponent>().Get(unitId);
                uint       rpcId      = aActorRequest.RpcId;
                AResponse  response   = await actorProxy.Call <AResponse>(aActorRequest);

                response.RpcId = rpcId;
                session.Reply(response);
                return;
            }

            if (message != null)
            {
                Game.Scene.GetComponent <MessageDispatherComponent>().Handle(session, message);
                return;
            }

            throw new Exception($"message type error: {message.GetType().FullName}");
        }
Beispiel #6
0
 public void Handle(Session session, Entity entity, object message)
 {
     try
     {
         Request request = message as Request;
         if (request == null)
         {
             Log.Error($"消息类型转换错误: {message.GetType().FullName} to {typeof(Request).Name}");
         }
         this.Run(session, request, response =>
         {
             // 等回调回来,session可以已经断开了,所以需要判断session id是否为0
             if (session.Id == 0)
             {
                 return;
             }
             response.RpcId = request.RpcId;
             session.Reply(response);
         });
     }
     catch (Exception e)
     {
         throw new Exception($"解释消息失败: {message.GetType().FullName}", e);
     }
 }
		public async Task<bool> Handle(Session session, Entity entity, ActorRequest message)
		{
			((Session)entity).Send(message.AMessage);
			ActorResponse response = new ActorResponse();
			response.RpcId = message.RpcId;
			session.Reply(response);
			return true;
		}
Beispiel #8
0
        public static void Reply(this Session session, uint rpcId, IResponse message)
        {
            OpcodeTypeComponent opcodeTypeComponent = Game.Scene.GetComponent <OpcodeTypeComponent>();
            ushort opcode = opcodeTypeComponent.GetOpcode(message.GetType());

            byte[] bytes = session.Network.MessagePacker.SerializeToByteArray(message);
            session.Reply(opcode, rpcId, bytes);
        }
Beispiel #9
0
        public async Task Handle(Session session, Entity entity, ActorRequest message)
        {
            ((Session)entity).Send(message.AMessage);
            ActorResponse response = new ActorResponse
            {
                RpcId = message.RpcId
            };

            session.Reply(response);
        }
Beispiel #10
0
 public void Handle(Session session, MessageInfo messageInfo)
 {
     try
     {
         Request request = MongoHelper.FromBson <Request>(messageInfo.MessageBytes, messageInfo.Offset, messageInfo.Count);
         this.Run(session, request, response =>
         {
             // 等回调回来,session可以已经断开了,所以需要判断session id是否为0
             if (session.Id == 0)
             {
                 return;
             }
             session.Reply(messageInfo.RpcId, response);
         }
                  );
     }
     catch (Exception e)
     {
         throw new Exception($"解释消息失败: {messageInfo.Opcode}", e);
     }
 }