Example #1
0
        public static Room CreateFriendRoom(G2M_CreateFriendRoom message)
        {
            try
            {
                FriendRoomInfo friendRoomInfo = message.FriendRoomInfo;
                Room           room           = ComponentFactory.Create <Room>();
                room.AddComponent <DeskComponent>();
                room.AddComponent <OrderControllerComponent>();
                room.IsFriendRoom = true;

                GameControllerComponent controllerComponent = room.AddComponent <GameControllerComponent>();
                RoomConfig roomConfig = new RoomConfig();
                roomConfig.FriendRoomId        = RandomHelper.RandomNumber(100000, 1000000);
                roomConfig.JuCount             = friendRoomInfo.Ju;
                roomConfig.Multiples           = friendRoomInfo.Hua;
                roomConfig.MinThreshold        = 500;
                roomConfig.IsPublic            = friendRoomInfo.IsPublic == 1;
                roomConfig.MasterUserId        = message.UserId;
                roomConfig.Id                  = 3;
                roomConfig.Name                = "好友房";
                roomConfig.KeyCount            = friendRoomInfo.KeyCount;
                controllerComponent.RoomConfig = roomConfig;
                controllerComponent.RoomName   = RoomName.Friend;

                return(room);
            }
            catch (Exception e)
            {
                Log.Error(e);
            }
            return(null);
        }
Example #2
0
        protected override async Task Run(Gamer gamer, Actor_GamerPrompt_Req message, Action <Actor_GamerPrompt_Ack> reply)
        {
            Actor_GamerPrompt_Ack response = new Actor_GamerPrompt_Ack();

            try
            {
                Room room = Game.Scene.GetComponent <RoomComponent>().Get(gamer.RoomID);
                OrderControllerComponent orderController = room.GetComponent <OrderControllerComponent>();
                DeskCardsCacheComponent  deskCardsCache  = room.GetComponent <DeskCardsCacheComponent>();

                List <Card> handCards = new List <Card>(gamer.GetComponent <HandCardsComponent>().GetAll());
                CardsHelper.SortCards(handCards);

                if (gamer.UserID == orderController.Biggest)
                {
                    response.Cards.AddRange(handCards.Where(card => card.CardWeight == handCards[handCards.Count - 1].CardWeight).ToArray());
                }
                else
                {
                    List <IList <Card> > result = await CardsHelper.GetPrompt(handCards, deskCardsCache, deskCardsCache.Rule);

                    if (result.Count > 0)
                    {
                        response.Cards.AddRange(result[RandomHelper.RandomNumber(0, result.Count)]);
                    }
                }

                reply(response);
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }
Example #3
0
        /// <summary>
        /// 获取随机Map服务器的Session
        /// </summary>
        /// <returns></returns>
        public static Session GetRandomMapSession()
        {
            int        randomMapAppId = RandomHelper.RandomNumber(0, StartConfigComponent.Instance.MapConfigs.Count);
            IPEndPoint ipEndPoint     = StartConfigComponent.Instance.MapConfigs[randomMapAppId].GetComponent <InnerConfig>().IPEndPoint;

            return(Game.Scene.GetComponent <NetInnerComponent>().Get(ipEndPoint));
        }
        public static StartConfig GetRandomMap()
        {
            var mapConfigs = StartConfigComponent.Instance.MapConfigs;
            var val        = RandomHelper.RandomNumber(0, mapConfigs.Count);

            return(mapConfigs[val]);
        }
Example #5
0
        public static StartConfig GetGate()
        {
            int count = StartConfigComponent.Instance.Gates.Count;

            int n = RandomHelper.RandomNumber(0, count);

            return(StartConfigComponent.Instance.Gates[n]);
        }
Example #6
0
        /// <summary>
        /// 隨機選取Map伺服器
        /// </summary>
        /// <returns></returns>
        public static int GetMapIdRandomly()
        {
            var startComponent = Game.Scene.GetComponent <StartConfigComponent>();
            var mapIndex       = RandomHelper.RandomNumber(0, startComponent.MapConfigs.Count);
            var mapInst        = startComponent.MapConfigs[mapIndex];

            return(mapInst.AppId);
        }
Example #7
0
        /// <summary>
        /// 隨機選取Lobby伺服器
        /// </summary>
        /// <returns></returns>
        public static int GetLobbyIdRandomly()
        {
            var startComponent = Game.Scene.GetComponent <StartConfigComponent>();
            var lobbyIndex     = RandomHelper.RandomNumber(0, startComponent.LobbyConfigs.Count);
            var lobbyInst      = startComponent.LobbyConfigs[lobbyIndex];

            return(lobbyInst.AppId);
        }
Example #8
0
        public static StartSceneConfig GetGate(int zone)
        {
            List <StartSceneConfig> zoneGates = StartSceneConfigCategory.Instance.Gates[zone];

            int n = RandomHelper.RandomNumber(0, zoneGates.Count);

            return(zoneGates[n]);
        }
Example #9
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;
                }

                ActorMessageSender actorProxy = Game.Scene.GetComponent <ActorMessageSenderComponent>().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
                    });
                }
            }
        }
Example #10
0
        /// <summary>
        /// 随机生成区号 1~
        /// </summary>
        public static long GenerateId()
        {
            //随机获得GateId 1~2
            int  randomGateAppId = RandomHelper.RandomNumber(0, StartConfigComponent.Instance.GateConfigs.Count) + 1;
            long time            = TimeHelper.ClientNowSeconds();

            //1540 2822 75   时间为10位数
            //区号取第11位数
            return(randomGateAppId * 100000000000 + time + ++value);
        }
Example #11
0
 /// <summary>
 /// 从空闲集合中随机返回一个列表
 /// </summary>
 /// <param name="self"></param>
 /// <returns></returns>
 public static Room GetIdleRoom(this RoomComponent self)
 {
     if (self.IdleRoomCount > 0)
     {
         Room room = self.idleRooms[RandomHelper.RandomNumber(0, self.idleRooms.Count)];
         return(room);
     }
     else
     {
         return(null);
     }
 }
Example #12
0
        //从23个英雄中随机
        private static int RandomSeedNotRepeat(List <int> alreadyHave)
        {
            int randomSeed = RandomHelper.RandomNumber(1, 24);

            if (alreadyHave.Contains(randomSeed))
            {
                randomSeed = RandomSeedNotRepeat(alreadyHave);
            }
            else
            {
                alreadyHave.Add(randomSeed);
            }
            return(randomSeed);
        }
Example #13
0
        /// <summary>
        /// 发所有牌
        /// </summary>
        public static List <int> DealAllCards(int count)
        {
            List <int> allCards = new List <int>();

            while (allCards.Count < count)
            {
                int n = RandomHelper.RandomNumber(1, 53); //除去大小鬼,52张牌
                if (!allCards.Contains(n))
                {
                    allCards.Insert(RandomHelper.RandomNumber(allCards.Count), n);
                }
            }
            return(allCards);
        }
Example #14
0
        public void Reconnection()
        {
            Log.Debug("重新连接");
            int i = RandomHelper.RandomNumber(1, 3);

            if (i == 1)
            {
                this.ConnectionStatus = ConnectionStatus.Normal;
            }
            else
            {
                this.ConnectionStatus = ConnectionStatus.Outline;
            }
        }
        /// <summary>
        /// 随机先手玩家
        /// </summary>
        public static void RandomFirstAuthority(this GameControllerComponent self)
        {
            Room room = self.GetParent <Room>();
            OrderControllerComponent orderController = room.GetComponent <OrderControllerComponent>();

            Gamer[] gamers = room.gamers;

            int  index          = RandomHelper.RandomNumber(0, gamers.Length);
            long firstAuthority = gamers[index].UserID;

            orderController.Init(firstAuthority);

            //广播先手抢地主玩家
            room.Broadcast(new Actor_AuthorityGrabLandlord_Ntt()
            {
                UserID = firstAuthority
            });
        }
        /// <summary>
        /// 发牌(不包括花牌)
        /// </summary>
        /// <param name="deskComponent"></param>
        /// <param name="handCardsComponent"></param>
        private static void GetCardNotFace(DeskComponent deskComponent, HandCardsComponent handCardsComponent)
        {
            while (true)
            {
                int         cardIndex   = RandomHelper.RandomNumber(0, deskComponent.RestLibrary.Count);
                MahjongInfo grabMahjong = deskComponent.RestLibrary[cardIndex];

                deskComponent.RestLibrary.RemoveAt(cardIndex);

                //花牌
                if (grabMahjong.m_weight >= Consts.MahjongWeight.Hua_HongZhong)
                {
                    handCardsComponent.FaceCards.Add(grabMahjong);
                    handCardsComponent.FaceGangCards.Add(grabMahjong);
                }
                else
                {
                    handCardsComponent.GetAll().Add(grabMahjong);
                    break;
                }
            }
        }
Example #17
0
        public void UpdateSpeed(MapUnitFsmMoveComponent self, long nowTime)
        {
            if (nowTime > self.SpeedRandomTimeAfter)
            {
                self.SpeedTarget          = (float)RandomHelper.RandomDouble() * (self.SpeedMax - self.SpeedMin) + self.SpeedMin;
                self.SpeedRandomTimeAfter = nowTime + RandomHelper.RandomNumber(MapUnitFsmMoveComponent.SpeedRandomTimeIntervalMin, MapUnitFsmMoveComponent.SpeedRandomTimeIntervalMax);
            }

            if (nowTime > self.SpeedLerpTimeAfter)
            {
                if (self.SpeedLerpTimePrevious <= 0)
                {
                    self.SpeedLerpTimePrevious = nowTime;
                }

                long detlaTime = nowTime - self.SpeedLerpTimePrevious;
                if (Math.Abs(self.SpeedTarget - self.SpeedNow) > 0.01f)
                {
                    if (self.SpeedTarget > self.SpeedNow)
                    {
                        self.SpeedNow += 2f * (detlaTime * 0.001f);
                        if (self.SpeedTarget < self.SpeedNow)
                        {
                            self.SpeedNow = self.SpeedTarget;
                        }
                    }
                    else
                    {
                        self.SpeedNow -= 2f * (detlaTime * 0.001f);
                        if (self.SpeedTarget > self.SpeedNow)
                        {
                            self.SpeedNow = self.SpeedTarget;
                        }
                    }
                }
                self.SpeedLerpTimePrevious = nowTime;
                self.SpeedLerpTimeAfter    = nowTime + MapUnitFsmMoveComponent.SpeedLerpTimeInterval;
            }
        }
Example #18
0
        /// <summary>
        /// 随机获取一个房间服务器地址
        /// </summary>
        /// <returns></returns>
        public static StartConfig GetAddress(this AllotMapComponent self)
        {
            int n = RandomHelper.RandomNumber(0, self.MapAddress.Count);

            return(self.MapAddress[n]);
        }
        public static async Task GamerReady(Gamer gamer, Actor_GamerReady message)
        {
            try
            {
                Log.Info($"收到玩家{gamer.UserID}准备");
                RoomComponent roomComponent = Game.Scene.GetComponent <RoomComponent>();
                Room          room          = roomComponent.Get(gamer.RoomID);

                if (room == null || gamer == null || gamer.IsReady || room.State == RoomState.Game)
                {
                    return;
                }

                gamer.IsReady = true;
                //消息广播给其他人
                room?.Broadcast(new Actor_GamerReady()
                {
                    Uid = gamer.UserID
                });

                Gamer[] gamers = room.GetAll();
                //房间内有4名玩家且全部准备则开始游戏
                if (room.Count == 4 && gamers.Where(g => g.IsReady).Count() == 4)
                {
                    room.State = RoomState.Game;
                    room.CurrentJuCount++;
                    room.IsGameOver = false;
                    room.RoomDispose();

                    #region 好友房扣钥匙

                    if (room.IsFriendRoom && room.CurrentJuCount == 1)
                    {
                        RoomConfig roomConfig = room.GetComponent <GameControllerComponent>().RoomConfig;
                        await DBCommonUtil.DeleteFriendKey(roomConfig.MasterUserId, roomConfig.KeyCount, "好友房房主扣除钥匙");
                    }
                    #endregion
                    //设置比下胡
                    if (room.LastBiXiaHu)
                    {
                        room.IsBiXiaHu = true;
                    }
                    else
                    {
                        room.IsBiXiaHu = false;
                    }
                    room.LastBiXiaHu = false;


                    if (roomComponent.gameRooms.TryGetValue(room.Id, out var itemRoom))
                    {
                        roomComponent.gameRooms.Remove(room.Id);
                    }

                    roomComponent.gameRooms.Add(room.Id, room);
                    roomComponent.idleRooms.Remove(room.Id);
                    //添加用户
                    room.UserIds.Clear();
                    //初始玩家开始状态
                    foreach (var _gamer in gamers)
                    {
                        room.UserIds.Add(_gamer.UserID);

                        if (_gamer.GetComponent <HandCardsComponent>() == null)
                        {
                            _gamer.AddComponent <HandCardsComponent>();
                        }

                        _gamer.IsReady = false;
                    }

                    Log.Info($"{room.Id}房间开始,玩家:{JsonHelper.ToJson(room.UserIds)}");


                    GameControllerComponent  gameController  = room.GetComponent <GameControllerComponent>();
                    OrderControllerComponent orderController = room.GetComponent <OrderControllerComponent>();
                    DeskComponent            deskComponent   = room.GetComponent <DeskComponent>();

                    Gamer bankerGamer = null;
                    HandCardsComponent bankerHandCards = null;
                    if (room.IsLianZhuang)
                    {
                        if (room.huPaiUid != 0 && room.huPaiUid == room.BankerGamer?.UserID)
                        {
                            bankerGamer              = room.Get(room.huPaiUid);
                            bankerHandCards          = bankerGamer.GetComponent <HandCardsComponent>();
                            bankerHandCards.IsBanker = true;
                            room.BankerGamer         = bankerGamer;
                            //连庄
                            room.LastBiXiaHu = true;
                        }
                        else
                        {
                            int gamerSeat = room.GetGamerSeat(room.BankerGamer.UserID);
                            int currentSeat;
                            if (gamerSeat == 3)
                            {
                                currentSeat = 0;
                            }
                            else
                            {
                                currentSeat = ++gamerSeat;
                            }

                            bankerGamer              = room.gamers[currentSeat];
                            bankerHandCards          = bankerGamer.GetComponent <HandCardsComponent>();
                            bankerHandCards.IsBanker = true;
                            room.BankerGamer         = bankerGamer;
                        }
                    }
                    else
                    {
                        if (room.IsFriendRoom)
                        {
                            GameControllerComponent controllerComponent = room.GetComponent <GameControllerComponent>();
                            long masterUserId = controllerComponent.RoomConfig.MasterUserId;
                            bankerGamer = room.Get(masterUserId);
                        }
                        else
                        {
                            //随机庄家
                            int number = RandomHelper.RandomNumber(0, 12);
                            int i      = number % 4;
                            bankerGamer = room.gamers[i];
                        }
                        bankerHandCards          = bankerGamer.GetComponent <HandCardsComponent>();
                        bankerHandCards.IsBanker = true;
                        room.BankerGamer         = bankerGamer;
                    }

                    //发牌
                    gameController.DealCards();
                    orderController.Start(bankerGamer.UserID);

                    //去除花牌
                    foreach (var _gamer in gamers)
                    {
                        HandCardsComponent handCardsComponent = _gamer.GetComponent <HandCardsComponent>();
                        List <MahjongInfo> handCards          = handCardsComponent.GetAll();

                        for (int j = handCards.Count - 1; j >= 0; j--)
                        {
                            MahjongInfo mahjongInfo = handCards[j];

                            if (mahjongInfo.m_weight >= Consts.MahjongWeight.Hua_HongZhong)
                            {
                                handCards.RemoveAt(j);
                                mahjongInfo.weight = (byte)mahjongInfo.m_weight;
                                handCardsComponent.FaceCards.Add(mahjongInfo);
                                handCardsComponent.FaceGangCards.Add(mahjongInfo);
                            }
                        }

                        //加牌
                        int handCardsCount = handCards.Count;
                        for (int j = 0; j < 13 - handCardsCount; j++)
                        {
                            GetCardNotFace(deskComponent, handCardsComponent);
                        }
                    }

                    //庄家多发一张牌
                    GetCardNotFace(deskComponent, bankerHandCards);

//	                List<MahjongInfo> infos = bankerHandCards.GetAll();
//	                bankerHandCards.library = new List<MahjongInfo>(list);

                    //给客户端传送数据
                    Actor_StartGame actorStartGame = new Actor_StartGame();
                    foreach (var itemGame in gamers)
                    {
                        GamerData          gamerData          = new GamerData();
                        HandCardsComponent handCardsComponent = itemGame.GetComponent <HandCardsComponent>();

                        List <MahjongInfo> mahjongInfos = handCardsComponent.library;
                        foreach (var mahjongInfo in mahjongInfos)
                        {
                            mahjongInfo.weight = (byte)mahjongInfo.m_weight;
                        }

                        gamerData.UserID    = itemGame.UserID;
                        gamerData.handCards = mahjongInfos;
                        gamerData.faceCards = handCardsComponent.FaceCards;
                        if (handCardsComponent.IsBanker)
                        {
                            gamerData.IsBanker = true;
                        }

                        gamerData.SeatIndex     = room.seats[itemGame.UserID];
                        gamerData.OnlineSeconds = await DBCommonUtil.GetRestOnlineSeconds(itemGame.UserID);

                        actorStartGame.GamerDatas.Add(gamerData);
                    }

                    actorStartGame.restCount = deskComponent.RestLibrary.Count;
                    GameControllerComponent gameControllerComponent = room.GetComponent <GameControllerComponent>();

                    if (room.IsFriendRoom)
                    {
                        actorStartGame.RoomType       = 3;
                        actorStartGame.CurrentJuCount = room.CurrentJuCount;
                    }
                    else
                    {
                        actorStartGame.RoomType = (int)gameControllerComponent.RoomConfig.Id;
                    }
                    //发送消息
                    room.Broadcast(actorStartGame);
//	                Log.Debug("发送开始:" + JsonHelper.ToJson(actorStartGame));

                    //排序
                    var startTime = DateTime.Now;
                    foreach (var _gamer in gamers)
                    {
                        HandCardsComponent handCardsComponent = _gamer.GetComponent <HandCardsComponent>();
                        //排序
                        handCardsComponent.Sort();
                        handCardsComponent.GrabCard = handCardsComponent.GetAll()[handCardsComponent.GetAll().Count - 1];
                        //设置玩家在线开始时间
                        _gamer.StartTime = startTime;
                        //await DBCommonUtil.RecordGamerTime(startTime, true, _gamer.UserID);
                    }

                    foreach (var _gamer in room.GetAll())
                    {
                        HandCardsComponent handCardsComponent = _gamer.GetComponent <HandCardsComponent>();

                        List <MahjongInfo> cards = handCardsComponent.GetAll();

                        if (handCardsComponent.IsBanker)
                        {
                            if (Logic_NJMJ.getInstance().isHuPai(cards))
                            {
                                //ToDo 胡牌
                                Actor_GamerCanOperation canOperation = new Actor_GamerCanOperation();
                                canOperation.Uid           = _gamer.UserID;
                                _gamer.IsCanHu             = true;
                                canOperation.OperationType = 2;
                                room.GamerBroadcast(_gamer, canOperation);
                                _gamer.isGangFaWanPai = true;
                            }
                        }
                        else
                        {
                            //检查听牌
                            List <MahjongInfo> checkTingPaiList = Logic_NJMJ.getInstance().checkTingPaiList(cards);
                            if (checkTingPaiList.Count > 0)
                            {
                                Log.Info($"{_gamer.UserID}听牌:");
                                _gamer.isFaWanPaiTingPai = true;
                            }
                        }
                    }

                    //等客户端掷骰子
                    //是否超时
                    await Game.Scene.GetComponent <TimerComponent>().WaitAsync(10 * 1000);

                    room.StartTime();
                    //扣服务费
                    if (!room.IsFriendRoom)
                    {
                        //不要动画
                        GameHelp.CostServiceCharge(room, false);
                    }
                }
            }
            catch (Exception e)
            {
                Log.Error(e);
            }

            await Task.CompletedTask;
        }
Example #20
0
 public static void Awake(this Room room, byte PlayerCount)
 {
     room.gamers = new Gamer[PlayerCount];
     room.RoomId = RandomHelper.RandomNumber(100000, 999999);
 }
Example #21
0
        protected override async void Run(Session session, C2G_CowCowCreateGameRoomGate message, Action <G2C_CowCowCreateGameRoomGate> reply)
        {
            G2C_CowCowCreateGameRoomGate response = new G2C_CowCowCreateGameRoomGate();

            try
            {
                UserInfo userInfo = Game.Scene.GetComponent <UserInfoComponent>().Get(message.UserID);
                if (userInfo.Diamond < message.Bureau)
                {
                    response.Error   = ErrorCode.ERR_CreateRoomError;
                    response.Message = "房卡不足";
                    reply(response);
                    return;
                }
                userInfo.Diamond -= (message.Bureau + 1);

                string roomId = string.Empty;
                while (true)
                {
                    roomId = RandomHelper.RandomNumber(100000, 999999).ToString();
                    if (!Game.Scene.GetComponent <RoomComponent>().IsExist(roomId))
                    {
                        break;
                    }
                }

                Room room = ComponentFactory.Create <Room>();
                room.UserID      = message.UserID;
                room.RoomID      = roomId;
                room.GameName    = message.Name;
                room.Bureau      = GameInfo.Bureau[message.Bureau];
                room.RuleBit     = message.RuleBit;
                room.PeopleCount = message.People;
                room.CurBureau   = 0;
                Game.Scene.GetComponent <RoomComponent>().Add(room);

                Gamer gamer = GamerFactory.Create(message.UserID, session.InstanceId);
                await gamer.AddComponent <MailBoxComponent>().AddLocation();

                gamer.UserID    = message.UserID;
                gamer.Name      = "房主" + userInfo.NickName;
                gamer.HeadIcon  = userInfo.HeadIcon;
                gamer.RoomID    = room.RoomID;
                gamer.Status    = GamerStatus.Down;
                gamer.IsOffline = false;
                gamer.Identity  = Identity.None;
                gamer.Coin      = 0;
                gamer.Sex       = userInfo.Sex;
                room.Add(gamer);
                Game.Scene.GetComponent <RoomComponent>().Add(gamer.UserID, room.RoomID);

                response.GameName = room.GameName;
                response.Bureau   = room.Bureau;
                response.RuleBit  = room.RuleBit;
                response.RoomID   = room.RoomID;
                response.People   = room.PeopleCount;
                //根据UserID从数据库拿到该用户信息并返回
                response.GamerInfo          = new GamerInfo();
                response.GamerInfo.Name     = gamer.Name;
                response.GamerInfo.HeadIcon = gamer.HeadIcon;
                response.GamerInfo.UserID   = gamer.UserID; //这个ID用于保存?待定
                response.GamerInfo.SeatID   = gamer.SeatID;
                response.GamerInfo.Sex      = gamer.Sex;
                response.GamerInfo.Status   = (int)gamer.Status;
                response.GamerInfo.Coin     = gamer.Coin;
                response.CurBureau          = room.CurBureau;

                reply(response);
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }
Example #22
0
        protected override void Run(Session session, C2M_CowCowGrabBanker message, Action <M2C_CowCowGrabBanker> reply)
        {
            M2C_CowCowGrabBanker response = new M2C_CowCowGrabBanker();

            try
            {
                Room room = Game.Scene.GetComponent <RoomComponent>().Get(message.UserID);
                if (room == null)
                {
                    response.Error = ErrorCode.ERR_NotRoomNumberError;
                    reply(response);
                    return;
                }
                Gamer gamer = room.Get(message.SeatID);
                gamer.GrabBanker = message.Multiple;

                reply(response);

                Dictionary <int, Gamer> gamers = room.GetAll();
                room.grabBankers.Clear();
                foreach (Gamer g in gamers.Values)
                {
                    if (g.GrabBanker != 0)
                    {
                        room.grabBankers.Add(g.GrabBanker);
                    }
                }
                //抢庄后发牌,庄家
                if (room.grabBankers.Count == room.PeopleCount)
                {
                    //判断最大值
                    room.State = RoomState.Game;
                    this.seatId.Clear();
                    int max = room.grabBankers.Max();
                    foreach (Gamer g in gamers.Values)
                    {
                        if (g.GrabBanker == max)
                        {
                            this.seatId.Add(g.SeatID);
                        }
                    }
                    //庄家
                    int seatId = this.seatId[RandomHelper.RandomNumber(this.seatId.Count)];
                    room.CurBankerSeatID = seatId;
                    room.CurMultiple     = max;
                    List <int> allCards = CowCowDealCardSystem.DealAllCards(CardCount * room.GamerCount);
                    foreach (Gamer g in gamers.Values)
                    {
                        g.GrabBanker = 0;                   //初始化
                        g.Status     = GamerStatus.Playing; //正在玩的状态
                        Actor_CowCowRoomDealCards sendCards = new Actor_CowCowRoomDealCards();
                        sendCards.Cards = new RepeatedField <int>();
                        int index = g.SeatID * CardCount;
                        for (int i = 0; i < CardCount; i++)
                        {
                            sendCards.Cards.Add(allCards[index + i]);
                        }
                        sendCards.SeatID   = seatId;
                        sendCards.Multiple = max;
                        room.Send(g, sendCards);
                    }
                }
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }
Example #23
0
        public static async void StartGame(Actor_StartGame message, bool isReconnect)
        {
            Log.Debug($"收到开始");

            try
            {
                UI uiRoom = Game.Scene.GetComponent <UIComponent>().Get(UIType.UIRoom);

                if (uiRoom == null)
                {
                    uiRoom = Game.Scene.GetComponent <UIComponent>().Create(UIType.UIRoom);
                }

                Game.Scene.GetComponent <UIComponent>().Remove(UIType.UIReady);
                Game.Scene.GetComponent <UIComponent>().Remove(UIType.UIGameResult);
                GamerComponent  gamerComponent  = uiRoom.GetComponent <GamerComponent>();
                UIRoomComponent uiRoomComponent = uiRoom.GetComponent <UIRoomComponent>();
                UIRoomComponent.ISGaming = true;
                uiRoomComponent.ContinueGamer();
                //好友房设置将退出变成解散
                if (UIRoomComponent.IsFriendRoom)
                {
                    uiRoomComponent.SetFriendSetting(PlayerInfoComponent.Instance.uid);
                    uiRoomComponent.SetCurrentJuCount(message.CurrentJuCount);
                }
                //先掷骰子
                if (!isReconnect)
                {
                    uiRoomComponent.exitBtn.interactable = false;
                    uiRoomComponent.players.SetActive(true);
                    GameObject DiceAnim   = uiRoomComponent.dice.Get <GameObject>("DiceAnim");
                    GameObject DiceBottom = uiRoomComponent.dice.Get <GameObject>("DiceBottom");
                    Image      Dice1      = DiceBottom.transform.Find("Dice1").GetComponent <Image>();
                    Image      Dice2      = DiceBottom.transform.Find("Dice2").GetComponent <Image>();
                    DiceAnim.SetActive(true);
                    SoundsHelp.Instance.playSound_ShaiZi();
                    await ETModel.Game.Scene.GetComponent <TimerComponent>().WaitAsync(2000);

                    DiceAnim.SetActive(false);
                    DiceBottom.SetActive(true);
                    int number1 = RandomHelper.RandomNumber(1, 7);
                    Dice1.sprite = CommonUtil.getSpriteByBundle("Image_Dice", "num_" + number1);
                    int number2 = RandomHelper.RandomNumber(1, 7);
                    Dice2.sprite = CommonUtil.getSpriteByBundle("Image_Dice", "num_" + number2);
                    await ETModel.Game.Scene.GetComponent <TimerComponent>().WaitAsync(1000);


                    //发牌动画

                    List <MahjongInfo> myCard = null;
                    foreach (var gameData in message.GamerDatas)
                    {
                        foreach (var mahjong in gameData.handCards)
                        {
                            mahjong.m_weight = (Consts.MahjongWeight)mahjong.weight;
                        }

                        foreach (var mahjong in gameData.faceCards)
                        {
                            mahjong.m_weight = (Consts.MahjongWeight)mahjong.weight;
                        }

                        foreach (var gamer in gamerComponent.GetAll())
                        {
                            if (gamer.UserID != gameData.UserID)
                            {
                                continue;
                            }
//                            if (gamer.UserID == PlayerInfoComponent.Instance.uid)
//                            {
//                                myCard = new List<MahjongInfo>(gameData.handCards);
//                            }
                            gamer.gameData = gameData;
                            GamerUIComponent gamerUi = gamer.GetComponent <GamerUIComponent>();
                            gamerUi.GameStart();

                            gamer.IsBanker = gameData.IsBanker;
                            HandCardsComponent handCards = gamer.GetComponent <HandCardsComponent>();
                            if (handCards != null)
                            {
                                handCards.Reset();
                            }
                            else
                            {
                                handCards = gamer.AddComponent <HandCardsComponent, GameObject, int, int>(gamerUi.Panel, gamerUi.Index, gameData.SeatIndex);
                            }

                            handCards.myCard = new List <MahjongInfo>(gameData.handCards);
                        }
                    }

                    for (int i = 0; i < 4; i++)
                    {
                        foreach (var gamer in gamerComponent.GetAll())
                        {
                            HandCardsComponent handCards = gamer.GetComponent <HandCardsComponent>();

                            if (PlayerInfoComponent.Instance.uid == gamer.UserID)
                            {
                                handCards.StartDealCardAnim(true);
                            }
                            else
                            {
                                handCards.StartDealCardAnim(false);
                            }
                            await ETModel.Game.Scene.GetComponent <TimerComponent>().WaitAsync(400);
                        }
                    }

                    //自己的牌翻一下
                    foreach (var gamer in gamerComponent.GetAll())
                    {
                        if (gamer.UserID == PlayerInfoComponent.Instance.uid)
                        {
                            HandCardsComponent handCards = gamer.GetComponent <HandCardsComponent>();
                            handCards.FanPai();
                        }
                    }
                    await ETModel.Game.Scene.GetComponent <TimerComponent>().WaitAsync(500);

                    DiceBottom.SetActive(false);
                }

                uiRoomComponent.StartGame(message.restCount);
                uiRoomComponent.exitBtn.interactable = true;
                // uiRoomComponent.SetRoomType(message.RoomType);

                foreach (var gameData in message.GamerDatas)
                {
                    foreach (var mahjong in gameData.handCards)
                    {
                        mahjong.m_weight = (Consts.MahjongWeight)mahjong.weight;
                    }

                    foreach (var mahjong in gameData.faceCards)
                    {
                        mahjong.m_weight = (Consts.MahjongWeight)mahjong.weight;
                    }

                    foreach (var gamer in gamerComponent.GetAll())
                    {
                        if (gamer.UserID != gameData.UserID)
                        {
                            continue;
                        }

                        GamerUIComponent gamerUi = gamer.GetComponent <GamerUIComponent>();
                        gamerUi.GameStart();
                        HandCardsComponent handCards = gamer.GetComponent <HandCardsComponent>();
                        if (handCards != null)
                        {
                            handCards.Reset();
                        }
                        else
                        {
                            handCards = gamer.AddComponent <HandCardsComponent, GameObject, int, int>(gamerUi.Panel, gamerUi.Index, gameData.SeatIndex);
                        }

                        //设置庄家
                        gamer.IsBanker = gameData.IsBanker;
                        gamerUi.SetZhuang();

                        //当前出牌玩家
                        if (gamer.IsBanker)
                        {
                            gamerComponent.CurrentPlayUid = gamer.UserID;
                        }

                        if (gamer.UserID == gamerComponent.LocalGamer.UserID)
                        {
                            //本地玩家添加手牌
                            uiRoomComponent.SetTreasureTime(gameData.OnlineSeconds);
                            handCards.AddCards(gameData.handCards);
                            handCards.ShowBg();
                        }
                        else
                        {
                            handCards.AddOtherCards(gamer.IsBanker);
                        }

                        handCards.SetFaceCards(gameData.faceCards);
                        foreach (var card in gameData.faceCards)
                        {
                            gamerUi.SetBuHua(card.weight);
                        }
                    }
                }

                //时间倒计时
                foreach (var gamer in gamerComponent.GetAll())
                {
                    if (gamer.IsBanker)
                    {
                        uiRoomComponent.ShowTurn(gamer.UserID);
                    }
                }

                uiRoom.GameObject.SetActive(true);
                UIRoomComponent.ISGaming = true;

                uiRoomComponent?.tip?.SetActive(true);
                uiRoomComponent.tip.GetComponentInChildren <Image>().sprite = CommonUtil.getSpriteByBundle("Image_Desk_Card", "shangji_tip");
                await ETModel.Game.Scene.GetComponent <TimerComponent>().WaitAsync(3000);

                if (uiRoomComponent != null)
                {
                    if (uiRoomComponent.tip != null)
                    {
                        uiRoomComponent?.tip?.SetActive(false);
                    }
                }
            }
            catch (Exception e)
            {
                Log.Error(e);
            }
        }
Example #24
0
        /// <summary>
        /// 提示出牌
        /// </summary>
        /// <param name="cards"></param>
        /// <returns></returns>
        public static async Task <List <IList <Card> > > GetPrompt(List <Card> cards, DeskCardsCacheComponent deskCardsCache, CardsType type)
        {
            List <IList <Card> > result    = new List <IList <Card> >();
            IList <Card>         deskCards = deskCardsCache.GetAll();
            int weight = deskCardsCache.GetTotalWeight();

            if (type == CardsType.JokerBoom)
            {
                return(result);
            }

            //检索王炸
            if (cards.Count >= 2)
            {
                IList <Card> groupCards = new Card[2];
                groupCards[0] = cards[0];
                groupCards[1] = cards[1];

                if (IsJokerBoom(groupCards))
                {
                    result.Add(groupCards);
                }
            }

            //检索炸弹
            for (int i = cards.Count - 1; i >= 3; i--)
            {
                IList <Card> groupCards = new Card[4];
                groupCards[0] = cards[i - 3];
                groupCards[1] = cards[i - 2];
                groupCards[2] = cards[i - 1];
                groupCards[3] = cards[i];

                if (IsBoom(groupCards) && GetWeight(groupCards, CardsType.Boom) > weight)
                {
                    result.Add(groupCards);
                }
            }

            switch (type)
            {
            case CardsType.OnlyThree:
                for (int i = cards.Count - 1; i >= 2; i--)
                {
                    if (cards[i].CardWeight <= deskCards[deskCards.Count - 1].CardWeight)
                    {
                        continue;
                    }

                    IList <Card> groupCards = new Card[3];
                    groupCards[0] = cards[i - 2];
                    groupCards[1] = cards[i - 1];
                    groupCards[2] = cards[i];

                    if (IsOnlyThree(groupCards) && GetWeight(groupCards, type) > weight)
                    {
                        result.Add(groupCards);
                    }
                }
                break;

            case CardsType.ThreeAndOne:
                if (cards.Count >= 4)
                {
                    for (int i = cards.Count - 1; i >= 2; i--)
                    {
                        if (cards[i].CardWeight <= deskCards[deskCards.Count - 1].CardWeight)
                        {
                            continue;
                        }

                        List <Card> other = new List <Card>(cards);
                        other.RemoveRange(i - 2, 3);

                        IList <Card> groupCards = new Card[4];
                        groupCards[0] = cards[i - 2];
                        groupCards[1] = cards[i - 1];
                        groupCards[2] = cards[i];
                        groupCards[3] = other[RandomHelper.RandomNumber(0, other.Count)];

                        if (IsThreeAndOne(groupCards) && GetWeight(groupCards, type) > weight)
                        {
                            result.Add(groupCards);
                        }
                    }
                }
                break;

            case CardsType.ThreeAndTwo:
                if (cards.Count >= 5)
                {
                    for (int i = cards.Count - 1; i >= 2; i--)
                    {
                        if (cards[i].CardWeight <= deskCards[deskCards.Count - 1].CardWeight)
                        {
                            continue;
                        }

                        List <Card> other = new List <Card>(cards);
                        other.RemoveRange(i - 2, 3);

                        List <IList <Card> > otherDouble = await GetPrompt(other, deskCardsCache, CardsType.Double);

                        if (otherDouble.Count > 0)
                        {
                            IList <Card> randomDouble = otherDouble[RandomHelper.RandomNumber(0, otherDouble.Count)];
                            IList <Card> groupCards   = new Card[5];
                            groupCards[0] = cards[i - 2];
                            groupCards[1] = cards[i - 1];
                            groupCards[2] = cards[i];
                            groupCards[3] = randomDouble[0];
                            groupCards[4] = randomDouble[1];

                            if (IsThreeAndTwo(groupCards) && GetWeight(groupCards, type) > weight)
                            {
                                result.Add(groupCards);
                            }
                        }
                    }
                }
                break;

            case CardsType.Straight:
                /*
                 * 7 6 5 4 3
                 * 8 7 6 5 4
                 *
                 * */
                if (cards.Count >= deskCards.Count)
                {
                    for (int i = cards.Count - 1; i >= deskCards.Count - 1; i--)
                    {
                        if (cards[i].CardWeight <= deskCards[deskCards.Count - 1].CardWeight)
                        {
                            continue;
                        }

                        //是否全部搜索完成
                        bool         isTrue     = true;
                        IList <Card> groupCards = new Card[deskCards.Count];
                        for (int j = 0; j < deskCards.Count; j++)
                        {
                            //搜索连续权重牌
                            Card findCard = cards.Where(card => (int)card.CardWeight == (int)cards[i].CardWeight + j).FirstOrDefault();
                            if (findCard == null)
                            {
                                isTrue = false;
                                break;
                            }
                            groupCards[deskCards.Count - 1 - j] = findCard;
                        }

                        if (isTrue && IsStraight(groupCards) && GetWeight(groupCards, type) > weight)
                        {
                            result.Add(groupCards);
                        }
                    }
                }
                break;

            case CardsType.DoubleStraight:
                /*
                 * 5 5 4 4 3 3
                 * 6 6 5 5 4 4
                 *
                 * */
                if (cards.Count >= deskCards.Count)
                {
                    for (int i = cards.Count - 1; i >= deskCards.Count - 1; i--)
                    {
                        if (cards[i].CardWeight <= deskCards[deskCards.Count - 1].CardWeight)
                        {
                            continue;
                        }

                        //是否全部搜索完成
                        bool         isTrue     = true;
                        IList <Card> groupCards = new Card[deskCards.Count];
                        for (int j = 0; j < deskCards.Count; j += 2)
                        {
                            //搜索连续权重牌
                            IList <Card> findCards = cards.Where(card => (int)card.CardWeight == (int)cards[i].CardWeight + (j / 2)).ToArray();
                            if (findCards.Count < 2)
                            {
                                isTrue = false;
                                break;
                            }
                            groupCards[deskCards.Count - 2 - j] = findCards[0];
                            groupCards[deskCards.Count - 1 - j] = findCards[1];
                        }

                        if (isTrue && IsDoubleStraight(groupCards) && GetWeight(groupCards, type) > weight)
                        {
                            result.Add(groupCards);
                        }
                    }
                }
                break;

            case CardsType.TripleStraight:
                if (cards.Count >= deskCards.Count)
                {
                    for (int i = cards.Count - 1; i >= deskCards.Count - 1; i--)
                    {
                        if (cards[i].CardWeight <= deskCards[deskCards.Count - 1].CardWeight)
                        {
                            continue;
                        }

                        //是否全部搜索完成
                        bool         isTrue     = true;
                        IList <Card> groupCards = new Card[deskCards.Count];
                        for (int j = 0; j < deskCards.Count; j += 3)
                        {
                            //搜索连续权重牌
                            IList <Card> findCards = cards.Where(card => (int)card.CardWeight == (int)cards[i].CardWeight + (j / 3)).ToArray();
                            if (findCards.Count < 3)
                            {
                                isTrue = false;
                                break;
                            }
                            groupCards[deskCards.Count - 3 - j] = findCards[0];
                            groupCards[deskCards.Count - 2 - j] = findCards[1];
                            groupCards[deskCards.Count - 1 - j] = findCards[2];
                        }

                        if (isTrue && IsTripleStraight(groupCards) && GetWeight(groupCards, type) > weight)
                        {
                            result.Add(groupCards);
                        }
                    }
                }
                break;

            case CardsType.Double:
                if (cards.Count >= 2)
                {
                    for (int i = cards.Count - 1; i >= 1; i--)
                    {
                        IList <Card> groupCards = new Card[2];
                        groupCards[0] = cards[i - 1];
                        groupCards[1] = cards[i];

                        if (IsDouble(groupCards) && GetWeight(groupCards, type) > weight)
                        {
                            result.Add(groupCards);
                        }
                    }
                }
                break;

            case CardsType.Single:
                if (cards.Count >= 1)
                {
                    for (int i = cards.Count - 1; i >= 0; i--)
                    {
                        if (cards[i].CardWeight <= deskCards[deskCards.Count - 1].CardWeight)
                        {
                            continue;
                        }

                        IList <Card> groupCards = new Card[1];
                        groupCards[0] = cards[i];

                        if (IsSingle(groupCards) && GetWeight(groupCards, type) > weight)
                        {
                            result.Add(groupCards);
                        }
                    }
                }
                break;

            default:
                break;
            }

            return(result);
        }
Example #25
0
        /// <summary>
        /// 抓牌
        /// </summary>
        /// <param name="room"></param>
        /// <returns></returns>
        public static MahjongInfo GrabMahjong(this Room room)
        {
            try
            {
                OrderControllerComponent orderController = room.GetComponent <OrderControllerComponent>();
                var currentGamer = room.Get(orderController.CurrentAuthority);
                HandCardsComponent cardsComponent = currentGamer.GetComponent <HandCardsComponent>();
                DeskComponent      deskComponent  = room.GetComponent <DeskComponent>();

                if (deskComponent.RestLibrary.Count == 0)
                {
                    Log.Info("没牌了");
                    return(null);
                }

                MahjongInfo grabMahjong;
                if (room.NextGrabCard != null)
                {
                    grabMahjong = new MahjongInfo()
                    {
                        m_weight = room.NextGrabCard.m_weight,
                        weight   = room.NextGrabCard.weight
                    };

                    room.NextGrabCard = null;
                    Log.Debug("发作弊牌:" + grabMahjong.m_weight);
                }
                else
                {
                    int number = RandomHelper.RandomNumber(0, deskComponent.RestLibrary.Count);
                    grabMahjong = deskComponent.RestLibrary[number];
                    deskComponent.RestLibrary.RemoveAt(number);

                    Log.Info($"{currentGamer.UserID}发牌:" + grabMahjong.m_weight);
                }

                //花牌返回
                if (grabMahjong.m_weight >= Consts.MahjongWeight.Hua_HongZhong)
                {
                    return(grabMahjong);
                }

                //发牌
                cardsComponent.AddCard(grabMahjong);
                room.my_lastMahjong     = grabMahjong;
                cardsComponent.GrabCard = grabMahjong;

                Logic_NJMJ.getInstance().SortMahjong(cardsComponent.GetAll());

                //发送抓牌消息
                ActorMessageSenderComponent actorMessageSenderComponent = Game.Scene.GetComponent <ActorMessageSenderComponent>();

                foreach (Gamer _gamer in room.gamers)
                {
                    if (_gamer == null || _gamer.isOffline)
                    {
                        continue;
                    }
                    UnitGateComponent   unitGateComponent = _gamer?.GetComponent <UnitGateComponent>();
                    Actor_GamerGrabCard actorGamerGrabCard;
                    if (_gamer.UserID == orderController.CurrentAuthority)
                    {
                        actorGamerGrabCard = new Actor_GamerGrabCard()
                        {
                            Uid    = currentGamer.UserID,
                            weight = (int)grabMahjong.m_weight
                        };
                    }
                    else
                    {
                        actorGamerGrabCard = new Actor_GamerGrabCard()
                        {
                            Uid = currentGamer.UserID,
                        };
                    }
                    actorMessageSenderComponent.GetWithActorId(unitGateComponent.GateSessionActorId).Send(actorGamerGrabCard);
                }

                //发完牌判断是否胡牌
                foreach (Gamer _gamer in room.gamers)
                {
                    if (_gamer == null || _gamer.isOffline)
                    {
                        continue;
                    }

                    if (_gamer.UserID == orderController.CurrentAuthority)
                    {
                        HandCardsComponent handCardsComponent = _gamer.GetComponent <HandCardsComponent>();

                        //判断胡牌
                        if (Logic_NJMJ.getInstance().isHuPai(handCardsComponent.GetAll()))
                        {
                            _gamer.huPaiNeedData.my_lastMahjong    = room.my_lastMahjong;
                            _gamer.huPaiNeedData.restMahjongCount  = deskComponent.RestLibrary.Count;
                            _gamer.huPaiNeedData.isSelfZhuaPai     = orderController.CurrentAuthority == _gamer.UserID;
                            _gamer.huPaiNeedData.isZhuangJia       = handCardsComponent.IsBanker;
                            _gamer.huPaiNeedData.isGetYingHuaBuPai = _gamer.isGetYingHuaBuPai;
                            _gamer.huPaiNeedData.isGangEndBuPai    = _gamer.isGangEndBuPai;
                            _gamer.huPaiNeedData.isGangFaWanPai    = _gamer.isGangFaWanPai;
                            _gamer.huPaiNeedData.isFaWanPaiTingPai = _gamer.isFaWanPaiTingPai;
                            _gamer.huPaiNeedData.my_yingHuaList    = handCardsComponent.FaceCards;
                            _gamer.huPaiNeedData.my_gangList       = handCardsComponent.GangCards;
                            _gamer.huPaiNeedData.my_pengList       = handCardsComponent.PengCards;
                            List <List <MahjongInfo> > tempList = new List <List <MahjongInfo> >();
                            for (int i = 0; i < room.GetAll().Length; i++)
                            {
                                if (_gamer.UserID == room.GetAll()[i].UserID)
                                {
                                    continue;
                                }
                                tempList.Add(room.GetAll()[i].GetComponent <HandCardsComponent>().PengCards);
                            }

                            _gamer.huPaiNeedData.other1_pengList = tempList[0];
                            _gamer.huPaiNeedData.other2_pengList = tempList[1];
                            _gamer.huPaiNeedData.other3_pengList = tempList[2];

                            List <Consts.HuPaiType> huPaiTypes = Logic_NJMJ.getInstance().getHuPaiType(handCardsComponent.GetAll(),
                                                                                                       _gamer.huPaiNeedData);
                            Log.Info(JsonHelper.ToJson(_gamer.huPaiNeedData));
                            Log.Info(JsonHelper.ToJson(huPaiTypes));

                            if (huPaiTypes.Count > 0)
                            {
                                //判断小胡,4个花以上才能胡
                                if (huPaiTypes[0] == Consts.HuPaiType.Normal)
                                {
                                    if (handCardsComponent.PengGangCards.Count > 0 || handCardsComponent.PengCards.Count > 0)
                                    {
                                        if (handCardsComponent.FaceCards.Count >= 4)
                                        {
                                            _gamer.IsCanHu = true;
                                            Actor_GamerCanOperation canOperation = new Actor_GamerCanOperation();
                                            canOperation.Uid           = _gamer.UserID;
                                            canOperation.OperationType = 2;
                                            room.GamerBroadcast(_gamer, canOperation);
                                        }
                                    }
                                }
                                else
                                {
                                    _gamer.IsCanHu = true;
                                    Actor_GamerCanOperation canOperation = new Actor_GamerCanOperation();
                                    canOperation.Uid           = _gamer.UserID;
                                    canOperation.OperationType = 2;
                                    room.GamerBroadcast(_gamer, canOperation);
                                }
                            }
                        }

                        //暗杠
                        if (Logic_NJMJ.getInstance().IsAnGang(handCardsComponent.GetAll(), out var weight))
                        {
                            _gamer.IsCanGang = true;
                            Actor_GamerCanOperation canOperation = new Actor_GamerCanOperation();
                            canOperation.Uid           = _gamer.UserID;
                            canOperation.OperationType = 4;
                            room.GamerBroadcast(_gamer, canOperation);
                        }
                        //碰杠
                        else if (Logic_NJMJ.getInstance().IsPengGang(handCardsComponent.PengCards, handCardsComponent.GetAll(), out var weight2))
                        {
                            _gamer.IsCanGang = true;
                            Actor_GamerCanOperation canOperation = new Actor_GamerCanOperation();
                            canOperation.Uid           = _gamer.UserID;
                            canOperation.OperationType = 5;
                            room.GamerBroadcast(_gamer, canOperation);
                        }
                    }
                }

                return(grabMahjong);
            }
            catch (Exception e)
            {
                Log.Error(e);
                return(null);
            }
        }