/// <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); } }
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; }
public static async Task PlayCard(Gamer gamer, Actor_GamerPlayCard message) { RoomComponent roomComponent = Game.Scene.GetComponent <RoomComponent>(); Room room = roomComponent.Get(gamer.RoomID); if (room == null || room.IsGameOver) { return; } try { MahjongInfo mahjongInfo = new MahjongInfo() { weight = (byte)message.weight, m_weight = (Consts.MahjongWeight)message.weight }; //加锁 if (room.IsPlayingCard) { Log.Warning("当前正在出牌,不能再出牌了"); return; } room.IsPlayingCard = true; GameControllerComponent gameController = room.GetComponent <GameControllerComponent>(); OrderControllerComponent orderController = room.GetComponent <OrderControllerComponent>(); DeskComponent deskComponent = room.GetComponent <DeskComponent>(); HandCardsComponent handCardsComponent = gamer.GetComponent <HandCardsComponent>(); if (handCardsComponent == null) { return; } List <MahjongInfo> mahjongInfos = handCardsComponent.GetAll(); if (orderController.CurrentAuthority != gamer.UserID) { Log.Warning("没有轮到当前玩家出牌:" + gamer.UserID); Log.Warning("当前出牌玩家:" + orderController.CurrentAuthority); room.IsPlayingCard = false; return; } int index = -1; for (int i = 0; i < mahjongInfos.Count; i++) { if (mahjongInfos[i].m_weight == mahjongInfo.m_weight) { index = i; break; } } if (index >= 0) { //停止倒计时 room?.tokenSource?.Cancel(); Log.Info($"玩家{gamer.UserID}出牌:" + mahjongInfo.m_weight); //当前出的牌 deskComponent.CurrentCard = mahjongInfo; deskComponent.CurrentAuthority = gamer.UserID; handCardsComponent.PlayCards.Add(mahjongInfo); mahjongInfos.RemoveAt(index); room.my_lastMahjong = mahjongInfo; Actor_GamerPlayCard actorGamerPlayCard = new Actor_GamerPlayCard() { weight = message.weight, Uid = gamer.UserID, index = message.index }; room.Broadcast(actorGamerPlayCard); gamer.IsCanHu = false; gamer.IsCanPeng = false; gamer.IsCanGang = false; #region 4个人连续出同样的牌,第一个出牌的人立即支付其他三人 List <MahjongInfo> list = new List <MahjongInfo>(); foreach (var _gamer in room.GetAll()) { HandCardsComponent cardsComponent = _gamer.GetComponent <HandCardsComponent>(); if (cardsComponent.PlayCards.Count > 0) { list.Add(cardsComponent.PlayCards[cardsComponent.PlayCards.Count - 1]); } } if (list.Count == 4) { bool flag = true; for (int i = 1; i < list.Count; i++) { if (list[0].m_weight != list[i].m_weight) { flag = false; break; } } if (flag) { Gamer nextGamer = orderController.FindNextGamer(gamer.UserID); //罚分 foreach (var _gamer in room.GetAll()) { if (_gamer.UserID == nextGamer.UserID) { GameHelp.ChangeGamerGold(room, _gamer, -10 * gameController.RoomConfig.Multiples * 3); } else { GameHelp.ChangeGamerGold(room, _gamer, 10 * gameController.RoomConfig.Multiples); } room.GamerBroadcast(_gamer, new Actor_ShowAnimType() { Type = 3, Count = 0 }); } room.LastBiXiaHu = true; } } #endregion #region 一个人出4张一样的牌 //4个人出一样的牌 int temp = 0; foreach (var playCard in handCardsComponent.PlayCards) { if (playCard.m_weight == mahjongInfo.m_weight) { temp++; } } if (temp == 4) { //罚分 foreach (var _gamer in room.GetAll()) { if (_gamer.UserID == gamer.UserID) { GameHelp.ChangeGamerGold(room, _gamer, -10 * gameController.RoomConfig.Multiples * 3); } else { GameHelp.ChangeGamerGold(room, _gamer, 10 * gameController.RoomConfig.Multiples); } room.GamerBroadcast(_gamer, new Actor_ShowAnimType() { Type = 3, Count = 0 }); } room.LastBiXiaHu = true; } #endregion #region 一人前四次出牌打出东南西北(不必按顺序),则其他每名玩家立即支付给该玩家 if (handCardsComponent.PlayCards.Count == 4) { int Feng_Dong = handCardsComponent.PlayCards.Count(a => a.m_weight == Consts.MahjongWeight.Feng_Dong); int Feng_Nan = handCardsComponent.PlayCards.Count(a => a.m_weight == Consts.MahjongWeight.Feng_Nan); int Feng_Xi = handCardsComponent.PlayCards.Count(a => a.m_weight == Consts.MahjongWeight.Feng_Xi); int Feng_Bei = handCardsComponent.PlayCards.Count(a => a.m_weight == Consts.MahjongWeight.Feng_Bei); if (Feng_Dong == 1 && Feng_Nan == 1 && Feng_Xi == 1 && Feng_Bei == 1) { //四连风 foreach (var _gamer in room.GetAll()) { if (_gamer.UserID == gamer.UserID) { GameHelp.ChangeGamerGold(room, _gamer, 5 * gameController.RoomConfig.Multiples * 3); } else { GameHelp.ChangeGamerGold(room, _gamer, -5 * gameController.RoomConfig.Multiples); } room.GamerBroadcast(_gamer, new Actor_ShowAnimType() { Type = 2, Count = 0 }); } } } #endregion #region 等待客户端有没有人碰杠胡 //等待客户端有没有人碰 bool isNeedWait = false; foreach (var _gamer in room.GetAll()) { if (_gamer == null) { continue; } if (_gamer.UserID == gamer.UserID) { continue; } HandCardsComponent currentCards = _gamer.GetComponent <HandCardsComponent>(); List <MahjongInfo> cards = _gamer.GetComponent <HandCardsComponent>().GetAll(); if (Logic_NJMJ.getInstance().isCanPeng(mahjongInfo, cards)) { Actor_GamerCanOperation canOperation = new Actor_GamerCanOperation(); canOperation.Uid = _gamer.UserID; _gamer.IsCanPeng = true; isNeedWait = true; canOperation.OperationType = 0; //Log.Info($"{_gamer.UserID}可碰:"+JsonHelper.ToJson(canOperation)); room.GamerBroadcast(_gamer, canOperation); } //明杠 if (Logic_NJMJ.getInstance().isCanGang(mahjongInfo, cards)) { Actor_GamerCanOperation canOperation = new Actor_GamerCanOperation(); canOperation.Uid = _gamer.UserID; _gamer.IsCanGang = true; isNeedWait = true; canOperation.OperationType = 1; //Log.Info($"{_gamer.UserID}可杠" + JsonHelper.ToJson(canOperation)); room.GamerBroadcast(_gamer, canOperation); } if (room.CanHu(mahjongInfo, cards)) { _gamer.huPaiNeedData.my_lastMahjong = room.my_lastMahjong; _gamer.huPaiNeedData.restMahjongCount = deskComponent.RestLibrary.Count; _gamer.huPaiNeedData.isSelfZhuaPai = orderController.CurrentAuthority == _gamer.UserID; _gamer.huPaiNeedData.isZhuangJia = currentCards.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 = currentCards.FaceCards; _gamer.huPaiNeedData.my_gangList = currentCards.GangCards; _gamer.huPaiNeedData.my_pengList = currentCards.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 <MahjongInfo> infos = new List <MahjongInfo>(cards); infos.Add(mahjongInfo); List <Consts.HuPaiType> huPaiTypes = Logic_NJMJ.getInstance().getHuPaiType(infos, _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 (currentCards.PengGangCards.Count > 0 || currentCards.PengCards.Count > 0) { if (currentCards.FaceCards.Count >= 4) { _gamer.IsCanHu = true; isNeedWait = true; Actor_GamerCanOperation canOperation = new Actor_GamerCanOperation(); canOperation.Uid = _gamer.UserID; canOperation.OperationType = 2; room.GamerBroadcast(_gamer, canOperation); } } } else { _gamer.IsCanHu = true; isNeedWait = true; Actor_GamerCanOperation canOperation = new Actor_GamerCanOperation(); canOperation.Uid = _gamer.UserID; canOperation.OperationType = 2; room.GamerBroadcast(_gamer, canOperation); } } } } #endregion if (isNeedWait) { room.IsNeedWaitOperate = true; room.StartOperateTime(); } //没人可以操作就直接发牌 else { room.IsNeedWaitOperate = false; //发牌 room.GamerGrabCard(); room.IsPlayingCard = false; } } else { Log.Warning("玩家出牌不存在:" + message.weight); room.IsPlayingCard = false; } } catch (Exception e) { Log.Error(e); room.IsPlayingCard = false; } await Task.CompletedTask; }