Beispiel #1
0
        private async ETVoid HandleIActorRequest(Session session, IActorRequest message)
        {
            using (await CoroutineLockComponent.Instance.Wait(message.ActorId))
            {
                Entity entity = (Entity)Game.EventSystem.Get(message.ActorId);
                if (entity == null)
                {
                    Log.Warning($"not found actor: {message}");
                    ActorResponse response = new ActorResponse
                    {
                        Error = ErrorCode.ERR_NotFoundActor,
                        RpcId = message.RpcId
                    };
                    session.Reply(response);
                    return;
                }

                MailBoxComponent mailBoxComponent = entity.GetComponent <MailBoxComponent>();
                if (mailBoxComponent == null)
                {
                    ActorResponse response = new ActorResponse
                    {
                        Error = ErrorCode.ERR_ActorNoMailBoxComponent,
                        RpcId = message.RpcId
                    };
                    session.Reply(response);
                    Log.Error($"actor not add MailBoxComponent: {entity.GetType().Name} {message}");
                    return;
                }

                await mailBoxComponent.Add(session, message);
            }
        }
Beispiel #2
0
        public void Dispatch(Session session, Packet packet)
        {
            IMessage message;

            try
            {
                Type messageType = Game.Scene.GetComponent <OpcodeTypeComponent>().GetType(packet.Opcode);
                message = (IMessage)session.Network.MessagePacker.DeserializeFrom(messageType, packet.Stream);
            }
            catch (Exception e)
            {
                // 出现任何解析消息异常都要断开Session,防止客户端伪造消息
                Log.Error(e);
                session.Error = ErrorCode.ERR_PacketParserError;
                session.Network.Remove(session.Id);
                return;
            }


            // 收到actor消息,放入actor队列
            if (message is IActorMessage iActorMessage)
            {
                Entity entity = (Entity)Game.EventSystem.Get(iActorMessage.ActorId);
                if (entity == null)
                {
                    Log.Warning($"not found actor: {iActorMessage.ActorId}");
                    ActorResponse response = new ActorResponse
                    {
                        Error = ErrorCode.ERR_NotFoundActor,
                        RpcId = iActorMessage.RpcId
                    };
                    session.Reply(response);
                    return;
                }

                MailBoxComponent mailBoxComponent = entity.GetComponent <MailBoxComponent>();
                if (mailBoxComponent == null)
                {
                    ActorResponse response = new ActorResponse
                    {
                        Error = ErrorCode.ERR_ActorNoMailBoxComponent,
                        RpcId = iActorMessage.RpcId
                    };
                    session.Reply(response);

                    Log.Error($"actor没有挂载MailBoxComponent组件: {entity.GetType().Name} {entity.Id}");
                    return;
                }

                mailBoxComponent.Add(new ActorMessageInfo()
                {
                    Session = session, Message = iActorMessage
                });
                return;
            }

            Game.Scene.GetComponent <MessageDispatherComponent>().Handle(session, new MessageInfo(packet.Opcode, message));
        }
        public void Dispatch(Session session, Packet packet)
        {
            ushort   opcode      = packet.Opcode;
            Type     messageType = Game.Scene.GetComponent <OpcodeTypeComponent>().GetType(opcode);
            IMessage message     = (IMessage)session.Network.MessagePacker.DeserializeFrom(messageType, packet.Bytes, Packet.Index, packet.Length - Packet.Index);

            // 收到actor消息,放入actor队列
            if (message is IActorLanuch iActorLaunch)
            {
                Entity entity = (Entity)Game.EventSystem.Get(iActorLaunch.ActorId);
                if (entity == null)
                {
                    Log.Warning($"not found actor: {iActorLaunch.ActorId}");
                    ActorResponse response = new ActorResponse
                    {
                        Error = ErrorCode.ERR_NotFoundActor,
                        RpcId = iActorLaunch.RpcId
                    };
                    session.Reply(response);
                    return;
                }

                MailBoxComponent mailBoxComponent = entity.GetComponent <MailBoxComponent>();
                if (mailBoxComponent == null)
                {
                    ActorResponse response = new ActorResponse
                    {
                        Error = ErrorCode.ERR_ActorNoActorComponent,
                        RpcId = iActorLaunch.RpcId
                    };
                    session.Reply(response);
                    Log.Error($"actor没有挂载ActorComponent组件: {entity.GetType().Name} {entity.Id}");
                    return;
                }

                mailBoxComponent.Add(new ActorMessageInfo()
                {
                    Session = session, Launch = iActorLaunch
                });
                return;
            }

            Game.Scene.GetComponent <MessageDispatherComponent>().Handle(session, new MessageInfo(opcode, message));
        }
Beispiel #4
0
        private async ETVoid HandleIActorMessage(Session session, IActorMessage message)
        {
            using (await CoroutineLockComponent.Instance.Wait(message.ActorId))
            {
                Entity entity = (Entity)Game.EventSystem.Get(message.ActorId);
                if (entity == null)
                {
                    Log.Error($"not found actor: {message}");
                    return;
                }

                MailBoxComponent mailBoxComponent = entity.GetComponent <MailBoxComponent>();
                if (mailBoxComponent == null)
                {
                    Log.Error($"actor not add MailBoxComponent: {entity.GetType().Name} {message}");
                    return;
                }
                await mailBoxComponent.Add(session, message);
            }
        }
Beispiel #5
0
        public void Dispatch(Session session, ushort opcode, object message)
        {
            // 收到actor消息,放入actor队列
            if (message is IActorMessage iActorMessage)
            {
                Entity entity = (Entity)Game.EventSystem.Get(iActorMessage.ActorId);
                if (entity == null)
                {
                    Log.Warning($"not found actor: {iActorMessage.ActorId}");
                    ActorResponse response = new ActorResponse
                    {
                        Error = ErrorCode.ERR_NotFoundActor,
                        RpcId = iActorMessage.RpcId
                    };
                    session.Reply(response);
                    return;
                }

                MailBoxComponent mailBoxComponent = entity.GetComponent <MailBoxComponent>();
                if (mailBoxComponent == null)
                {
                    ActorResponse response = new ActorResponse
                    {
                        Error = ErrorCode.ERR_ActorNoMailBoxComponent,
                        RpcId = iActorMessage.RpcId
                    };
                    session.Reply(response);
                    Log.Error($"actor没有挂载MailBoxComponent组件: {entity.GetType().Name} {entity.Id}");
                    return;
                }

                mailBoxComponent.Add(new ActorMessageInfo()
                {
                    Session = session, Message = iActorMessage
                });
                return;
            }

            Game.Scene.GetComponent <MessageDispatherComponent>().Handle(session, new MessageInfo(opcode, message));
        }
Beispiel #6
0
        public void Dispatch(Session session, ushort opcode, object message)
        {
            // 收到actor消息,放入actor队列
            switch (message)
            {
            case IActorRequest iActorRequest:
            {
                Entity entity = (Entity)Game.EventSystem.Get(iActorRequest.ActorId);
                if (entity == null)
                {
                    Log.Warning($"not found actor: {message}");
                    ActorResponse response = new ActorResponse
                    {
                        Error = ErrorCode.ERR_NotFoundActor,
                        RpcId = iActorRequest.RpcId
                    };
                    session.Reply(response);
                    return;
                }

                MailBoxComponent mailBoxComponent = entity.GetComponent <MailBoxComponent>();
                if (mailBoxComponent == null)
                {
                    ActorResponse response = new ActorResponse
                    {
                        Error = ErrorCode.ERR_ActorNoMailBoxComponent,
                        RpcId = iActorRequest.RpcId
                    };
                    session.Reply(response);
                    Log.Error($"actor not add MailBoxComponent: {entity.GetType().Name} {message}");
                    return;
                }

                mailBoxComponent.Add(new ActorMessageInfo()
                    {
                        Session = session, Message = iActorRequest
                    });
                return;
            }

            case IActorMessage iactorMessage:
            {
                Entity entity = (Entity)Game.EventSystem.Get(iactorMessage.ActorId);

                if (entity == null)
                {
                    return;
                }

                //if (entity == null)
                //{
                //	Log.Error($"not found actor: {message}");
                //	return;
                //}

                MailBoxComponent mailBoxComponent = entity.GetComponent <MailBoxComponent>();
                if (mailBoxComponent == null)
                {
                    Log.Error($"actor not add MailBoxComponent: {entity.GetType().Name} {message}");
                    return;
                }

                mailBoxComponent.Add(new ActorMessageInfo()
                    {
                        Session = session, Message = iactorMessage
                    });

                return;
            }

            default:
            {
                Game.Scene.GetComponent <MessageDispatcherComponent>().Handle(session, new MessageInfo(opcode, message));
                break;
            }
            }
        }