/// <summary> /// 准备开始游戏 /// </summary> /// <param name="self"></param> public static void ReadyStartGame(this GameControllerComponent self) { Room room = self.GetParent <Room>(); Gamer[] gamers = room.GetAll(); //房间内有3名玩家且全部准备则开始游戏 if (room.Count == 3 && gamers.Where(g => g.IsReady).Count() == 3) { //同步匹配服务器开始游戏 room.State = RoomState.Game; MapHelper.SendMessage(new MP2MH_SyncRoomState_Ntt() { RoomID = room.InstanceId, State = room.State }); //初始玩家开始状态 foreach (var _gamer in gamers) { if (_gamer.GetComponent <HandCardsComponent>() == null) { _gamer.AddComponent <HandCardsComponent>(); } _gamer.IsReady = false; } GameControllerComponent gameController = room.GetComponent <GameControllerComponent>(); //洗牌发牌 gameController.DealCards(); List <GamerCardNum> gamersCardNum = new List <GamerCardNum>(); Array.ForEach(gamers, (g) => { HandCardsComponent handCards = g.GetComponent <HandCardsComponent>(); //重置玩家身份 handCards.AccessIdentity = Identity.None; //记录玩家手牌数 gamersCardNum.Add(new GamerCardNum() { UserID = g.UserID, Num = g.GetComponent <HandCardsComponent>().GetAll().Length }); }); //发送玩家手牌和其他玩家手牌数 foreach (var _gamer in gamers) { ActorMessageSender actorProxy = _gamer.GetComponent <UnitGateComponent>().GetActorMessageSender(); Actor_GameStart_Ntt gameStartMessage = new Actor_GameStart_Ntt(); gameStartMessage.HandCards.AddRange(_gamer.GetComponent <HandCardsComponent>().GetAll()); gameStartMessage.GamersCardNum.AddRange(gamersCardNum); actorProxy.Send(gameStartMessage); } //随机先手玩家 gameController.RandomFirstAuthority(); Log.Info($"房间{room.InstanceId}开始游戏"); } }
/// <summary> /// 游戏结束 /// </summary> /// <param name="self"></param> public static async void GameOver(this GameControllerComponent self, List <GamerScore> 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_Ntt() { RoomID = room.InstanceId, State = room.State }); Dictionary <long, long> gamersMoney = new Dictionary <long, long>(); foreach (GamerScore gamerScore in gamersScore) { //结算玩家余额 Gamer gamer = room.Get(gamerScore.UserID); long gamerMoney = await self.StatisticalIntegral(gamer, gamerScore.Score); gamersMoney[gamer.UserID] = gamerMoney; } //广播游戏结束消息 Actor_Gameover_Ntt gameoverMessage = new Actor_Gameover_Ntt() { Winner = winnerIdentity, BasePointPerMatch = self.BasePointPerMatch, Multiples = self.Multiples }; gameoverMessage.GamersScore.AddRange(gamersScore); room.Broadcast(gameoverMessage); //清理玩家 foreach (var _gamer in gamers) { //踢出离线玩家 if (_gamer.isOffline) { ActorMessageSender actorProxy = Game.Scene.GetComponent <ActorMessageSenderComponent>().Get(_gamer.InstanceId); await actorProxy.Call(new Actor_PlayerExitRoom_Req()); } //踢出余额不足玩家 else if (gamersMoney[_gamer.UserID] < self.MinThreshold) { ActorMessageSender actorProxy = _gamer.GetComponent <UnitGateComponent>().GetActorMessageSender(); actorProxy.Send(new Actor_GamerMoneyLess_Ntt() { UserID = _gamer.UserID }); } } }