コード例 #1
0
        public static async void Start(this TrusteeshipComponent self)
        {
            //玩家所在房间
            Room room = Game.Scene.GetComponent <RoomComponent>().Get(self.GetParent <Gamer>().RoomID);
            OrderControllerComponent orderController = room.GetComponent <OrderControllerComponent>();
            Gamer gamer           = self.GetParent <Gamer>();
            bool  isStartPlayCard = false;

            while (true)
            {
                await Game.Scene.GetComponent <TimerComponent>().WaitAsync(1000);

                if (self.IsDisposed)
                {
                    return;
                }

                if (gamer.UserID != orderController?.CurrentAuthority)
                {
                    continue;
                }

                //自动出牌开关,用于托管延迟出牌
                isStartPlayCard = !isStartPlayCard;
                if (isStartPlayCard)
                {
                    continue;
                }

                ActorProxy actorProxy = Game.Scene.GetComponent <ActorProxyComponent>().Get(gamer.Id);
                //当还没抢地主时随机抢地主
                if (gamer.GetComponent <HandCardsComponent>().AccessIdentity == Identity.None)
                {
                    int randomSelect = RandomHelper.RandomNumber(0, 2);
                    actorProxy.Send(new Actor_GamerGrabLandlordSelect_Ntt()
                    {
                        IsGrab = randomSelect == 0
                    });
                    self.Playing = false;
                    continue;
                }

                //自动提示出牌
                Actor_GamerPrompt_Ack response = await actorProxy.Call(new Actor_GamerPrompt_Req()) as Actor_GamerPrompt_Ack;

                if (response.Error > 0 || response.Cards == null)
                {
                    actorProxy.Send(new Actor_GamerDontPlay_Ntt());
                }
                else
                {
                    await actorProxy.Call(new Actor_GamerPlayCard_Req()
                    {
                        Cards = response.Cards
                    });
                }
            }
        }
コード例 #2
0
        public async void Dispatch(Session session, PacketInfo packetInfo)
        {
            Type     messageType = Game.Scene.GetComponent <OpcodeTypeComponent>().GetType(packetInfo.Header.Opcode);
            IMessage message     = (IMessage)session.Network.MessagePacker.DeserializeFrom(messageType, packetInfo.Bytes, packetInfo.Index, packetInfo.Length);

            // gate session收到actor消息直接转发给actor自己去处理
            if (message is IActorMessage)
            {
                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 IActorRequest aActorRequest)
            {
                long       unitId     = session.GetComponent <SessionPlayerComponent>().Player.UnitId;
                ActorProxy actorProxy = Game.Scene.GetComponent <ActorProxyComponent>().Get(unitId);
                IResponse  response   = await actorProxy.Call(aActorRequest);

                session.Reply(packetInfo.Header.RpcId, response);
                return;
            }

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

            throw new Exception($"message type error: {message.GetType().FullName}");
        }
コード例 #3
0
        public async void Dispatch(Session session, Opcode opcode, int offset, byte[] messageBytes, AMessage message)
        {
            // gate session收到actor消息直接转发给actor自己去处理
            if (message is AActorMessage)
            {
                long       unitId     = session.GetComponent <SessionPlayerComponent>().Player.mBaseInfo.roleId;
                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.mBaseInfo.roleId;
                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}");
        }
コード例 #4
0
        /// <summary>
        /// 加入房间
        /// </summary>
        /// <param name="self"></param>
        /// <param name="room"></param>
        /// <param name="matcher"></param>
        public static async void JoinRoom(this MatchComponent self, Room room, Matcher matcher)
        {
            //玩家加入房间,移除匹配队列
            self.Playing[matcher.UserID] = room.Id;
            self.MatchSuccessQueue.Enqueue(matcher);

            //向房间服务器发送玩家进入请求
            ActorProxy actorProxy = Game.Scene.GetComponent <ActorProxyComponent>().Get(room.Id);
            Actor_PlayerEnterRoom_Ack actor_PlayerEnterRoom_Ack = await actorProxy.Call(new Actor_PlayerEnterRoom_Req()
            {
                PlayerID  = matcher.PlayerID,
                UserID    = matcher.UserID,
                SessionID = matcher.GateSessionID
            }) as Actor_PlayerEnterRoom_Ack;

            Gamer gamer = GamerFactory.Create(matcher.PlayerID, matcher.UserID, actor_PlayerEnterRoom_Ack.GamerID);

            room.Add(gamer);

            //向玩家发送匹配成功消息
            ActorProxyComponent actorProxyComponent = Game.Scene.GetComponent <ActorProxyComponent>();
            ActorProxy          gamerActorProxy     = actorProxyComponent.Get(gamer.PlayerID);

            gamerActorProxy.Send(new Actor_MatchSucess_Ntt()
            {
                GamerID = gamer.Id
            });
        }
コード例 #5
0
        /// <summary>
        /// 加入房间
        /// </summary>
        /// <param name="self"></param>
        /// <param name="room"></param>
        /// <param name="matcher"></param>
        public static async void JoinRoom(this MatchComponent self, Room room, Matcher matcher)
        {
            //玩家加入房间,移除匹配队列
            self.Playing.Add(matcher.UserID, room.Id);
            self.MatchSuccessQueue.Enqueue(matcher);
            room.Add(EntityFactory.CreateWithId <Gamer, long>(matcher.PlayerID, matcher.UserID));

            //发送获取加入房间密匙消息
            ActorProxy        actorProxy       = Game.Scene.GetComponent <ActorProxyComponent>().Get(room.Id);
            GetJoinRoomKey_RE playerJoinRoomRE = await actorProxy.Call <GetJoinRoomKey_RE>(new GetJoinRoomKey_RT()
            {
                PlayerID      = matcher.PlayerID,
                UserID        = matcher.UserID,
                GateSeesionID = matcher.GateSessionID
            });

            //发送匹配成功消息
            string  gateAddress = Game.Scene.GetComponent <StartConfigComponent>().Get(matcher.GateAppID).GetComponent <InnerConfig>().Address;
            Session gateSession = Game.Scene.GetComponent <NetInnerComponent>().Get(gateAddress);

            gateSession.Send(new MatchSuccess()
            {
                PlayerID = matcher.PlayerID, RoomID = room.Id, Key = playerJoinRoomRE.Key
            });
        }
コード例 #6
0
        public static async void Update(this AutoPlayCardsComponent self)
        {
            if (!self.Playing)
            {
                OrderControllerComponent orderController = self.GamerRoom.GetComponent <OrderControllerComponent>();
                if (self.Entity.Id == orderController.CurrentAuthority)
                {
                    self.Playing = true;
                    await Game.Scene.GetComponent <TimerComponent>().WaitAsync(1000);

                    ActorProxy actorProxy = Game.Scene.GetComponent <ActorProxyComponent>().Get(self.GamerRoom.Id);
                    //当还没抢地主时随机抢地主
                    if (self.Entity.GetComponent <HandCardsComponent>().AccessIdentity == Identity.None)
                    {
                        int randomSelect = RandomHelper.RandomNumber(0, 2);
                        actorProxy.Send(new GrabLordSelect()
                        {
                            PlayerId = self.Entity.Id, IsGrab = randomSelect == 0
                        });
                        self.Playing = false;
                        return;
                    }

                    PromptRe promptRE = await actorProxy.Call <PromptRe>(new PromptRt()
                    {
                        PlayerId = self.Entity.Id
                    });

                    if (promptRE.Error > 0 || promptRE.Cards == null)
                    {
                        actorProxy.Send(new Discard()
                        {
                            PlayerId = self.Entity.Id
                        });
                    }
                    else
                    {
                        await actorProxy.Call <PlayCardsRe>(new PlayCardsRt()
                        {
                            PlayerId = self.Entity.Id, Cards = promptRE.Cards
                        });
                    }
                    self.Playing = false;
                }
            }
        }
コード例 #7
0
        public async void Dispatch(Session session, Packet packet)
        {
            ushort opcode      = packet.Opcode();
            Type   messageType = session.Network.Entity.GetComponent <OpcodeTypeComponent>().GetType(opcode);
            object message     = session.Network.MessagePacker.DeserializeFrom(messageType, packet.Bytes, Packet.Index, packet.Length - Packet.Index);

            //Log.Debug($"recv: {JsonHelper.ToJson(message)}");

            switch (message)
            {
            case IFrameMessage iFrameMessage:                     // 如果是帧消息,构造成OneFrameMessage发给对应的unit
            {
                long       actorId    = session.GetComponent <SessionUserComponent>().User.ActorID;
                ActorProxy actorProxy = Game.Scene.GetComponent <ActorProxyComponent>().Get(actorId);

                // 这里设置了帧消息的id,防止客户端伪造
                iFrameMessage.Id = actorId;

                OneFrameMessage oneFrameMessage = new OneFrameMessage
                {
                    Op       = opcode,
                    AMessage = session.Network.MessagePacker.SerializeToByteArray(iFrameMessage)
                };
                actorProxy.Send(oneFrameMessage);
                return;
            }

            case IActorRequest iActorRequest:                     // gate session收到actor rpc消息,先向actor 发送rpc请求,再将请求结果返回客户端
            {
                long       actorId    = session.GetComponent <SessionUserComponent>().User.ActorID;
                ActorProxy actorProxy = Game.Scene.GetComponent <ActorProxyComponent>().Get(actorId);

                int       rpcId    = iActorRequest.RpcId;                // 这里要保存客户端的rpcId
                IResponse response = await actorProxy.Call(iActorRequest);

                response.RpcId = rpcId;

                session.Reply(response);
                return;
            }

            case IActorMessage iActorMessage:                     // gate session收到actor消息直接转发给actor自己去处理
            {
                long       actorId    = session.GetComponent <SessionUserComponent>().User.ActorID;
                ActorProxy actorProxy = Game.Scene.GetComponent <ActorProxyComponent>().Get(actorId);
                actorProxy.Send(iActorMessage);
                return;
            }
            }

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

            throw new Exception($"message type error: {message.GetType().FullName}");
        }
コード例 #8
0
        /// <summary>
        /// 游戏结束
        /// </summary>
        /// <param name="self"></param>
        public static async void GameOver(this GameControllerComponent self, Dictionary <long, long> gamersScore, Identity winnerIdentity)
        {
            Room room = self.GetParent <Room>();

            Gamer[] gamers = room.GetAll();

            //清理所有卡牌
            self.BackToDeck();
            room.GetComponent <DeskCardsCacheComponent>().Clear();

            //同步匹配服务器结束游戏
            room.State = RoomState.Ready;
            MapHelper.SendMessage(new MP2MH_SyncRoomState()
            {
                RoomID = room.Id, State = room.State
            });

            Dictionary <long, long> gamersMoney = new Dictionary <long, long>();

            foreach (Gamer gamer in gamers)
            {
                //结算玩家余额
                long gamerMoney = await self.StatisticalIntegral(gamer, gamersScore[gamer.UserID]);

                gamersMoney[gamer.UserID] = gamerMoney;
            }

            //广播游戏结束消息
            room.Broadcast(new M2C_Gameover()
            {
                Winner            = (int)winnerIdentity,
                BasePointPerMatch = self.BasePointPerMatch,
                Multiples         = self.Multiples,
                GamersScore       = gamersScore
            });

            //清理玩家
            foreach (var _gamer in gamers)
            {
                //踢出离线玩家
                if (_gamer.isOffline)
                {
                    ActorProxy actorProxy = Game.Scene.GetComponent <ActorProxyComponent>().Get(_gamer.Id);
                    await actorProxy.Call(new G2M_PlayerExitRoom());
                }
                //踢出余额不足玩家
                else if (gamersMoney[_gamer.UserID] < self.MinThreshold)
                {
                    ActorProxy actorProxy = _gamer.GetComponent <UnitGateComponent>().GetActorProxy();
                    actorProxy.Send(new M2C_GamerMoneyLess()
                    {
                        UserID = _gamer.UserID
                    });
                }
            }
        }
コード例 #9
0
        public async void Dispatch(Session session, Packet packet)
        {
            ushort opcode      = packet.Opcode();
            Type   messageType = Game.Scene.GetComponent <OpcodeTypeComponent>().GetType(opcode);
            object message     = session.Network.MessagePacker.DeserializeFrom(messageType, packet.Bytes, Packet.Index, packet.Length - Packet.Index);

            // 如果是帧指令消息,构造成OneFrameMessage发给对应的unit
            if (message is IFrameMessage)
            {
                long       unitId     = session.GetComponent <SessionPlayerComponent>().Player.UnitId;
                ActorProxy actorProxy = Game.Scene.GetComponent <ActorProxyComponent>().Get(unitId);

                // 这里设置了帧消息的id,防止客户端伪造
                IFrameMessage iFrameMessage = (IFrameMessage)message;
                iFrameMessage.Id = unitId;

                OneFrameMessage oneFrameMessage = new OneFrameMessage();
                oneFrameMessage.Op       = opcode;
                oneFrameMessage.AMessage = session.Network.MessagePacker.SerializeToByteArray(iFrameMessage);
                actorProxy.Send(oneFrameMessage);
                return;
            }

            // gate session收到actor消息直接转发给actor自己去处理
            if (message is IActorMessage)
            {
                long       unitId     = session.GetComponent <SessionPlayerComponent>().Player.UnitId;
                ActorProxy actorProxy = Game.Scene.GetComponent <ActorProxyComponent>().Get(unitId);
                actorProxy.Send((IMessage)message);
                return;
            }

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

                session.Reply(response);
                return;
            }

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

            throw new Exception($"message type error: {message.GetType().FullName}");
        }
コード例 #10
0
        protected override async void Run(Session session, G2M_PlayerEnterMatch message, Action <M2G_PlayerEnterMatch> reply)
        {
            M2G_PlayerEnterMatch response = new M2G_PlayerEnterMatch();

            try
            {
                MatchComponent      matchComponent      = Game.Scene.GetComponent <MatchComponent>();
                ActorProxyComponent actorProxyComponent = Game.Scene.GetComponent <ActorProxyComponent>();

                if (matchComponent.Playing.ContainsKey(message.UserID))
                {
                    //todo 重连逻辑
                    MatchRoomComponent matchRoomComponent = Game.Scene.GetComponent <MatchRoomComponent>();
                    long  roomId = matchComponent.Playing[message.UserID];
                    Room  room   = matchRoomComponent.Get(roomId);
                    Gamer gamer  = room.Get(message.UserID);

                    //重置GateActorID
                    gamer.PlayerID = message.PlayerID;

                    //重连房间
                    ActorProxy actorProxy = actorProxyComponent.Get(roomId);
                    await actorProxy.Call(new MH2MP_PlayerEnterRoom()
                    {
                        PlayerID  = message.PlayerID,
                        UserID    = message.UserID,
                        SessionID = message.SessionID
                    });

                    //向玩家发送匹配成功消息
                    ActorProxy gamerActorProxy = actorProxyComponent.Get(gamer.PlayerID);
                    gamerActorProxy.Send(new M2G_MatchSucess()
                    {
                        GamerID = gamer.Id
                    });
                }
                else
                {
                    //创建匹配玩家
                    Matcher matcher = MatcherFactory.Create(message.PlayerID, message.UserID, message.SessionID);
                }

                reply(response);
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }
コード例 #11
0
        public override async void Destroy(SessionUserComponent self)
        {
            try
            {
                //释放User对象时将User对象从管理组件中移除
                Game.Scene.GetComponent <UserComponent>()?.Remove(self.User.UserID);

                StartConfigComponent config = Game.Scene.GetComponent <StartConfigComponent>();
                ActorProxyComponent  actorProxyComponent = Game.Scene.GetComponent <ActorProxyComponent>();

                //正在匹配中发送玩家退出匹配请求
                if (self.User.IsMatching)
                {
                    IPEndPoint matchIPEndPoint = config.MatchConfig.GetComponent <InnerConfig>().IPEndPoint;
                    Session    matchSession    = Game.Scene.GetComponent <NetInnerComponent>().Get(matchIPEndPoint);
                    await matchSession.Call(new G2M_PlayerExitMatch_Req()
                    {
                        UserID = self.User.UserID
                    });
                }

                //正在游戏中发送玩家退出房间请求
                if (self.User.ActorID != 0)
                {
                    ActorProxy actorProxy = actorProxyComponent.Get(self.User.ActorID);
                    await actorProxy.Call(new Actor_PlayerExitRoom_Req()
                    {
                        UserID = self.User.UserID
                    });
                }

                //向登录服务器发送玩家下线消息
                IPEndPoint realmIPEndPoint = config.RealmConfig.GetComponent <InnerConfig>().IPEndPoint;
                Session    realmSession    = Game.Scene.GetComponent <NetInnerComponent>().Get(realmIPEndPoint);
                await realmSession.Call(new G2R_PlayerOffline_Req()
                {
                    UserID = self.User.UserID
                });

                self.User.Dispose();
                self.User = null;
            }
            catch (System.Exception e)
            {
                Log.Trace(e.ToString());
            }
        }
コード例 #12
0
        protected override async void Run(Session session, C2G_ReturnLobby_Ntt message)
        {
            //验证Session
            if (!GateHelper.SignSession(session))
            {
                return;
            }

            User user = session.GetComponent <SessionUserComponent>().User;
            StartConfigComponent config = Game.Scene.GetComponent <StartConfigComponent>();
            ActorProxyComponent  actorProxyComponent = Game.Scene.GetComponent <ActorProxyComponent>();

            //正在匹配中发送玩家退出匹配请求
            if (user.IsMatching)
            {
                IPEndPoint matchIPEndPoint = config.MatchConfig.GetComponent <InnerConfig>().IPEndPoint;
                Session    matchSession    = Game.Scene.GetComponent <NetInnerComponent>().Get(matchIPEndPoint);
                await matchSession.Call(new G2M_PlayerExitMatch_Req()
                {
                    UserID = user.UserID
                });

                user.IsMatching = false;
            }

            //正在游戏中发送玩家退出房间请求
            if (user.ActorID != 0)
            {
                ActorProxy actorProxy = actorProxyComponent.Get(user.ActorID);
                await actorProxy.Call(new Actor_PlayerExitRoom_Req()
                {
                    UserID = user.UserID
                });

                user.ActorID = 0;
            }
        }