/// <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 }); } } }
/// <summary> /// 发牌 /// </summary> /// <param name="self"></param> /// <param name="chairID"></param> public static void DealTo(this GameControllerComponent self, ushort chairID) { Room room = self.GetParent <Room>(); byte[] cards = room.GetComponent <DeckComponent>().Deals(5); Gamer gamer = room.Get(chairID); gamer.GetComponent <HandCardsComponent>().AddCard(cards); }
/// <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() { RoomID = room.Id, 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(); Dictionary <long, int> gamerCardsNum = new Dictionary <long, int>(); Array.ForEach(gamers, (g) => { HandCardsComponent handCards = g.GetComponent <HandCardsComponent>(); //重置玩家身份 handCards.AccessIdentity = Identity.None; //记录玩家手牌数 gamerCardsNum.Add(g.UserID, handCards.CardsCount); }); //发送玩家手牌和其他玩家手牌数 foreach (var _gamer in gamers) { ActorProxy actorProxy = _gamer.GetComponent <UnitGateComponent>().GetActorProxy(); actorProxy.Send(new M2C_GameStart() { GamerCards = _gamer.GetComponent <HandCardsComponent>().GetAll(), GamerCardsNum = gamerCardsNum }); } //随机先手玩家 gameController.RandomFirstAuthority(); Log.Info($"房间{room.Id}开始游戏"); } }
/// <summary> /// 准备开始游戏 /// </summary> /// <param name="self"></param> public static void StartGame(this GameControllerComponent self) { LandlordsRoom room = self.GetParent <LandlordsRoom>(); Gamer[] gamers = room.gamers; //房间内有3名玩家且全部准备则开始游戏 //if(room.Count == 3 && gamers.Where(g => g.IsReady).Count() == 3){} //初始玩家开始状态 foreach (var _gamer in gamers) { if (_gamer.GetComponent <HandCardsComponent>() == null) { _gamer.AddComponent <HandCardsComponent>(); } } 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) { ActorMessageSenderComponent actorProxyComponent = Game.Scene.GetComponent <ActorMessageSenderComponent>(); ActorMessageSender actorProxy = actorProxyComponent.Get(_gamer.ActorIDofClient); actorProxy.Send(new Actor_GameStart_Ntt() { HandCards = To.RepeatedField(_gamer.GetComponent <HandCardsComponent>().GetAll()), GamersCardNum = To.RepeatedField(gamersCardNum) }); } //随机先手玩家 gameController.RandomFirstAuthority(); Log.Info($"房间{room.Id}开始游戏"); }
//暂用存地主牌方法 public static void DealToLord(this GameControllerComponent self, long id) { Room room = self.GetParent <Room>(); Card card = room.GetComponent <DeckComponent>().Deal(); if (id == room.Id) { room.LordCache.Add(card); room.LordCards.Add(card); } }
/// <summary> /// 游戏继续 /// </summary> /// <param name="self"></param> /// <param name="lastGamer"></param> public static void Continue(this GameControllerComponent self, Gamer lastGamer) { Room room = self.GetParent <Room>(); OrderControllerComponent orderController = room.GetComponent <OrderControllerComponent>(); //是否结束,当前出牌者手牌数为0时游戏结束 bool isEnd = lastGamer.GetComponent <HandCardsComponent>().CardsCount == 0; if (isEnd) { //当前最大出牌者为赢家 Identity winnerIdentity = room.Get(orderController.Biggest).GetComponent <HandCardsComponent>().AccessIdentity; List <GamerScore> gamersScore = new List <GamerScore>(); //游戏结束所有玩家摊牌 foreach (var gamer in room.GetAll()) { //取消托管 gamer.RemoveComponent <TrusteeshipComponent>(); //计算玩家积分 gamersScore.Add(new GamerScore() { UserID = gamer.UserID, Score = self.GetGamerScore(gamer, winnerIdentity) }); if (gamer.UserID != lastGamer.UserID) { //剩余玩家摊牌 Card[] _gamerCards = gamer.GetComponent <HandCardsComponent>().GetAll(); Actor_GamerPlayCard_Ntt gamerPlayCardMessage = new Actor_GamerPlayCard_Ntt() { UserID = gamer.UserID }; gamerPlayCardMessage.Cards.AddRange(gamer.GetComponent <HandCardsComponent>().GetAll()); room.Broadcast(gamerPlayCardMessage); } } self.GameOver(gamersScore, winnerIdentity); } else { //轮到下位玩家出牌 orderController.Biggest = lastGamer.UserID; orderController.Turn(); room.Broadcast(new Actor_AuthorityPlayCard_Ntt() { UserID = orderController.CurrentAuthority, IsFirst = false }); } }
/// <summary> /// 改变玩家财富 /// </summary> /// <param name="self"></param> /// <param name="huaCount"></param> /// <param name="room"></param> /// <returns></returns> private static async Task ChangeWeath(GameControllerComponent self, int huaCount, Room room) { int amount = huaCount * self.RoomConfig.Multiples; if (huaCount > 0) { //改变财富 foreach (var gamer in room.GetAll()) { //自摸 if (room.IsZimo) { if (gamer.UserID == room.huPaiUid) { GameHelp.ChangeGamerGold(room, gamer, amount * 3, self.RoomConfig.Name + "结算"); gamer.ChangeGold = amount * 3; // await DBCommonUtil.ChangeWealth(gamer.UserID, 1, amount * 3,self.RoomConfig.Name + "结算"); UpdateTask(gamer, amount * 3); } else { // Log.Debug($"玩家:{gamer.UserID} 输了{amount}"); // await DBCommonUtil.ChangeWealth(gamer.UserID, 1, -amount, self.RoomConfig.Name + "结算"); GameHelp.ChangeGamerGold(room, gamer, -amount, self.RoomConfig.Name + "结算"); gamer.ChangeGold = -amount; } } else { if (gamer.UserID == room.huPaiUid) { // await DBCommonUtil.ChangeWealth(gamer.UserID, 1, amount, self.RoomConfig.Name + "结算"); GameHelp.ChangeGamerGold(room, gamer, amount, self.RoomConfig.Name + "结算"); gamer.ChangeGold = amount; UpdateTask(gamer, amount); } else { if (gamer.UserID == room.fangPaoUid) { // Log.Debug($"玩家:{gamer.UserID} 输了{amount}"); // await DBCommonUtil.ChangeWealth(gamer.UserID, 1, -amount, self.RoomConfig.Name + "结算"); GameHelp.ChangeGamerGold(room, gamer, -amount, self.RoomConfig.Name + "结算"); gamer.ChangeGold = -amount; } } } } } }
/// <summary> /// 发牌 /// </summary> /// <param name="id"></param> public static void DealTo(this GameControllerComponent self, long id) { Room room = self.GetParent <Room>(); Card card = room.GetComponent <DeckComponent>().Deal(); foreach (var gamer in room.gamers) { if (id == gamer.UserID) { gamer.GetComponent <HandCardsComponent>().AddCard(card); break; } } }
/// <summary> /// 计算玩家积分 /// </summary> /// <param name="self"></param> /// <param name="gamer"></param> /// <param name="winnerIdentity"></param> /// <returns></returns> public static long GetScore(this GameControllerComponent self, Gamer gamer, Identity winnerIdentity) { HandCardsComponent handCards = gamer.GetComponent <HandCardsComponent>(); //积分计算公式:全场底分 * 全场倍率 * 身份倍率 long integration = self.BasePointPerMatch * self.Multiples * (int)handCards.AccessIdentity; //当玩家不是胜者,结算积分为负 if (handCards.AccessIdentity != winnerIdentity) { integration = -integration; } return(integration); }
/// <summary> /// 结算用户余额 /// </summary> public static async Task <long> StatisticalIntegral(this GameControllerComponent self, Gamer gamer, long sorce) { DBProxyComponent dbProxy = Game.Scene.GetComponent <DBProxyComponent>(); //结算用户余额 UserInfo userInfo = await dbProxy.Query <UserInfo>(gamer.UserId); userInfo.Money = userInfo.Money + sorce < 0 ? 0 : userInfo.Money + sorce; //更新用户信息 await dbProxy.Save(userInfo); return(userInfo.Money); }
protected override async Task Run(Gamer gamer, Actor_GamerApplyRoomDismiss message) { try { Log.Info($"玩家{gamer.UserID}申请解散房间"); RoomComponent roomComponent = Game.Scene.GetComponent <RoomComponent>(); Room room = roomComponent.Get(gamer.RoomID); if (room == null) { return; } if (!room.IsFriendRoom) { return; } GameControllerComponent gameControllerComponent = room.GetComponent <GameControllerComponent>(); if (room.State == RoomState.Idle) { if (gamer.UserID != gameControllerComponent.RoomConfig.MasterUserId) { Log.Warning($"准备阶段只有房主才能解散,房主:{gameControllerComponent.RoomConfig.MasterUserId},gamer:{gamer.UserID}"); return; } else { if (room.CurrentJuCount > 0) { return; } room.Broadcast(new Actor_GamerReadyTimeOut() { Message = "房主解散房间" }); GameHelp.RoomDispose(room); return; } } room.Broadcast(new Actor_GamerApplyRoomDismiss()); room.WaitDismiss(60); } catch (Exception e) { Log.Error(e); } await Task.CompletedTask; }
/// <summary> /// 收服务费 /// </summary> /// <param name="room"></param> public static void CostServiceCharge(Room room, bool isNeedAnim = true) { GameControllerComponent controllerComponent = room.GetComponent <GameControllerComponent>(); long cost = controllerComponent.RoomConfig.ServiceCharge; foreach (var gamer in room.GetAll()) { ChangeGamerGold(room, gamer, (int)-cost, controllerComponent.RoomConfig.Name + "报名费", isNeedAnim); room.GamerBroadcast(gamer, new Actor_ShowAnimType() { Type = 1, Count = (int)cost }); } }
/// <summary> /// 洗牌 /// </summary> /// <param name="self"></param> public static void DealCards(this GameControllerComponent self) { Room room = self.GetParent <Room>(); //牌库洗牌 room.GetComponent <DeckComponent>().Shuffle(); Gamer[] gamers = room.GetAll(); int index = 0; for (int i = 0; i < room.roomConfig.PlayerCount; i++) { self.DealTo(gamers[i].uChairID); } }
/// <summary> /// 场上所有牌回收到牌库中 /// </summary> /// <param name="self"></param> public static void BackToDeck(this GameControllerComponent self) { Room room = self.GetParent <Room>(); DeckComponent deckComponent = room.GetComponent <DeckComponent>(); foreach (var gamer in room.GetAll()) { HandCardsComponent handCards = gamer.GetComponent <HandCardsComponent>(); while (handCards.CardsCount > 0) { byte card = handCards.library[handCards.CardsCount - 1]; handCards.PopCard(card); deckComponent.AddCard(card); } } }
/// <summary> /// 根据房间号获得房间 /// </summary> /// <param name="self"></param> /// <param name="roomId"></param> /// <returns></returns> public static Room GetFriendRoomById(this RoomComponent self, int roomId) { foreach (var room in self.rooms.Values) { if (!room.IsFriendRoom) { continue; } GameControllerComponent gameControllerComponent = room.GetComponent <GameControllerComponent>(); if (gameControllerComponent.RoomConfig.FriendRoomId == roomId) { return(room); } } return(null); }
public static Room Create(RoomLevel level) { Room room = EntityFactory.Create <Room>(); room.AddComponent <RoomJoinKeyComponent>(); room.AddComponent <DeckComponent>(); room.AddComponent <DeskCardsCacheComponent>(); room.AddComponent <OrderControllerComponent>(); RoomConfig config = RoomHelper.GetConfig(level); GameControllerComponent gameController = room.AddComponent <GameControllerComponent, RoomConfig>(config); //添加管理,避免被GC释放 Game.Scene.GetComponent <RoomComponent>().Add(room); return(room); }
/// <summary> /// 游戏结束 /// </summary> /// <param name="self"></param> public static async void GameOver(this GameControllerComponent self, List <GamerScore> gamersScore, Identity winnerIdentity) { LandlordsRoom room = self.GetParent <LandlordsRoom>(); Gamer[] gamers = room.gamers; //清理所有卡牌 self.BackToDeck(); room.GetComponent <DeskCardsCacheComponent>().Clear(); Dictionary <long, long> gamersMoney = new Dictionary <long, long>(); foreach (GamerScore gamerScore in gamersScore) { //结算玩家余额 Gamer gamer = room.GetGamerFromUserID(gamerScore.UserID); long gamerMoney = await self.StatisticalIntegral(gamer, gamerScore.Score); gamersMoney[gamer.UserID] = gamerMoney; } //广播游戏结束消息 room.Broadcast(new Actor_Gameover_Ntt() { Winner = (byte)winnerIdentity, BasePointPerMatch = self.BasePointPerMatch, Multiples = self.Multiples, GamersScore = To.RepeatedField(gamersScore) }); //清理玩家 foreach (var _gamer in gamers) { //踢出离线玩家 if (_gamer.isOffline) { ActorMessageSender actorProxy = Game.Scene.GetComponent <ActorMessageSenderComponent>().Get(_gamer.Id); //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 }); } } }
protected override async void Run(Session session, G2M_FriendRoomInfo message, Action <M2G_FriendRoomInfo> reply) { M2G_FriendRoomInfo response = new M2G_FriendRoomInfo(); //Log.Info("G2M_FriendRoomInfo"); try { //获取房间信息 { //获取所有空闲房间接口 RoomComponent roomComponent = Game.Scene.GetComponent <RoomComponent>(); foreach (var room in roomComponent.rooms.Values) { if (!room.IsFriendRoom) { continue; } GameControllerComponent gameControllerComponent = room.GetComponent <GameControllerComponent>(); FriendRoomInfo friendRoomInfo = new FriendRoomInfo(); friendRoomInfo.Hua = gameControllerComponent.RoomConfig.Multiples; friendRoomInfo.Ju = gameControllerComponent.RoomConfig.JuCount; friendRoomInfo.RoomId = gameControllerComponent.RoomConfig.FriendRoomId; friendRoomInfo.IsPublic = gameControllerComponent.RoomConfig.IsPublic ? 1 : 2; //设置头像 foreach (var gamer in room.GetAll()) { if (gamer == null) { continue; } friendRoomInfo.Icons.Add(gamer.playerBaseInfo.Icon); } response.Info.Add(friendRoomInfo); } } reply(response); } catch (Exception e) { ReplyError(response, e, reply); } await Task.CompletedTask; }
/// <summary> /// 游戏结束 /// </summary> /// <param name="self"></param> public static async void GameOver(this GameControllerComponent self, Dictionary <long, long> gamersSorce) { Room room = self.GetEntity <Room>(); //清理所有卡牌 self.BackToDeck(); room.GetComponent <DeskCardsCacheComponent>().Clear(); //同步匹配服务器结束游戏 room.State = RoomState.Ready; DDZHelper.SendMessage(new SyncRoomState() { RoomId = room.Id, State = room.State }); Gamer[] gamers = room.GetAll(); for (int i = 0; i < gamers.Length; i++) { long gamerMoney = await self.StatisticalIntegral(gamers[i], gamersSorce[gamers[i].Id]); bool isKickOut = gamers[i].isOffline; //玩家余额低于最低门槛 if (gamerMoney < self.MinThreshold) { ActorProxy actorProxy = gamers[i].GetComponent <UnitGateComponent>().GetActorProxy(); actorProxy.Send(new GamerMoneyLess() { PlayerId = gamers[i].Id }); isKickOut = true; } //踢出玩家 if (isKickOut) { ActorProxy actorProxy = Game.Scene.GetComponent <ActorProxyComponent>().Get(self.Entity.Id); actorProxy.Send(new PlayerQuitDdz() { PlayerId = gamers[i].Id }); } } }
/// <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> public static void RandomFirstAuthority(this GameControllerComponent self) { Room room = self.GetEntity <Room>(); OrderControllerComponent orderController = room.GetComponent <OrderControllerComponent>(); Gamer[] gamers = room.GetAll(); int index = RandomHelper.RandomNumber(0, gamers.Length); long firstAuthority = gamers[index].Id; orderController.Init(firstAuthority); //广播先手玩家 room.Broadcast(new SelectAuthority() { PlayerId = firstAuthority }); }
protected override async void Run(Session session, G2M_CreateFriendRoom message, Action <M2G_CreateFriendRoom> reply) { M2G_CreateFriendRoom response = new M2G_CreateFriendRoom(); try { RoomComponent roomComponent = Game.Scene.GetComponent <RoomComponent>(); Gamer gamer = null; Room room = null; foreach (var _room in roomComponent.rooms.Values) { room = _room; gamer = room.Get(message.UserId); if (gamer != null) { Log.Info("找到房间:" + _room.Id); break; } } if (gamer == null) { Room friendRoom = RoomFactory.CreateFriendRoom(message); roomComponent.Add(friendRoom); GameControllerComponent gameControllerComponent = friendRoom.GetComponent <GameControllerComponent>(); response.RoomId = gameControllerComponent.RoomConfig.FriendRoomId; } else { response.Error = ErrorCode.ERR_RoomNoExist; response.Message = "正在游戏内,无法创建房间"; } reply(response); } catch (Exception e) { ReplyError(response, e, reply); } await Task.CompletedTask; }
private static async Task UpdateTask(Room room) { GameControllerComponent controllerComponent = room.GetComponent <GameControllerComponent>(); var dbProxyComponent = Game.Scene.GetComponent <DBProxyComponent>(); foreach (var gamer in room.GetAll()) { if (gamer == null) { continue; } // Log.Debug(str_list.Count + ""); //胜利 if (gamer.UserID == room.huPaiUid) { if (controllerComponent.RoomName == RoomName.ChuJi) { // Log.Debug("新手场SHENGLI"); // 102 新手场 在新手场赢得10场胜利 1000 10 await DBCommonUtil.UpdateTask(gamer.UserID, 102, 1); } else if (controllerComponent.RoomName == RoomName.JingYing) { // Log.Debug("精英场SHENGLI"); // 103 精英场 在精英场赢得30场胜利 100000 30 await DBCommonUtil.UpdateTask(gamer.UserID, 103, 1); } // Log.Debug(" 连赢5场"); // 104 游戏高手 连赢5场 10000 5 await DBCommonUtil.UpdateTask(gamer.UserID, 104, 1); } //输了 else { // Log.Debug("SHULE"); // 104 游戏高手 连赢5场 10000 5 await DBCommonUtil.UpdateTask(gamer.UserID, 104, -1); } //101 新的征程 完成一局游戏 100 1 await DBCommonUtil.UpdateTask(gamer.UserID, 101, 1); } }
/// <summary> /// 游戏继续 /// </summary> /// <param name="self"></param> /// <param name="lastGamer"></param> public static void Continue(this GameControllerComponent self, Gamer lastGamer) { Room room = self.GetParent <Room>(); OrderControllerComponent orderController = room.GetComponent <OrderControllerComponent>(); //是否结束,当前出牌者手牌数为0时游戏结束 bool isEnd = lastGamer.GetComponent <HandCardsComponent>().CardsCount == 0; if (isEnd) { //当前最大出牌者为赢家 Identity winnerIdentity = room.Get(orderController.Biggest).GetComponent <HandCardsComponent>().AccessIdentity; Dictionary <long, long> gamersScore = new Dictionary <long, long>(); //游戏结束所有玩家摊牌 foreach (var gamer in room.GetAll()) { //取消托管 gamer.RemoveComponent <TrusteeshipComponent>(); //计算玩家积分 gamersScore.Add(gamer.UserID, self.GetGamerScore(gamer, winnerIdentity)); if (gamer.UserID != lastGamer.UserID) { //剩余玩家摊牌 Card[] _gamerCards = gamer.GetComponent <HandCardsComponent>().GetAll(); room.Broadcast(new M2C_GamerPlayCard_Ntt() { UserID = gamer.UserID, Cards = _gamerCards }); } } self.GameOver(gamersScore, winnerIdentity); } else { //轮到下位玩家出牌 orderController.Biggest = lastGamer.UserID; orderController.Turn(true); } }
/// <summary> /// 创建Room对象 /// </summary> /// <param name="roomType"></param> /// <returns></returns> public static Room Create(int roomType) { try { Room idleRoom = ComponentFactory.Create <Room>(); idleRoom.AddComponent <DeskComponent>(); idleRoom.AddComponent <OrderControllerComponent>(); idleRoom.IsFriendRoom = false; GameControllerComponent controllerComponent = idleRoom.AddComponent <GameControllerComponent>(); controllerComponent.RoomConfig = ConfigHelp.Get <RoomConfig>(roomType); controllerComponent.RoomName = (RoomName)roomType; Log.Debug("创建房间:" + JsonHelper.ToJson(controllerComponent.RoomConfig)); return(idleRoom); } catch (Exception e) { Log.Error(e); } return(null); }
/// <summary> /// 发牌 /// </summary> /// <param name="self"></param> public static void DealCards(this GameControllerComponent self) { if (self == null) { Log.Error("当前为null:GameControllerComponent.DealCards"); return; } temp.Clear(); Room room = self.GetParent <Room>(); Gamer[] gamers = room.GetAll(); DeskComponent deskComponent = room.GetComponent <DeskComponent>(); foreach (var gamer in gamers) { HandCardsComponent handCardsComponent = gamer.GetComponent <HandCardsComponent>(); //发牌前有拍了 if (handCardsComponent.GetAll().Count > 0) { // Log.Debug("发牌前有牌了:" + handCardsComponent.GetAll().Count); temp.Add(null); } else { // Log.Debug("发牌前没有拍"); temp.Add(handCardsComponent.GetAll()); } } Logic_NJMJ.getInstance().FaMahjong(temp, deskComponent.RestLibrary); foreach (var card in deskComponent.RestLibrary) { card.weight = (byte)card.m_weight; } }
/// <summary> /// 场上的所有牌回到牌库中 /// </summary> /// <param name="self"></param> public static void BackToDeck(this GameControllerComponent self) { Room room = self.GetEntity <Room>(); DeckComponent deckComponent = room.GetComponent <DeckComponent>(); DeskCardsCacheComponent deskCardsCache = room.GetComponent <DeskCardsCacheComponent>(); //回收牌桌卡牌 deskCardsCache.Clear(); deskCardsCache.LordCards.Clear(); //回收玩家手牌 foreach (var gamer in room.GetAll()) { HandCardsComponent handCards = gamer.GetComponent <HandCardsComponent>(); while (handCards.CardsCount > 0) { Card card = handCards.Library[handCards.CardsCount - 1]; handCards.PopCard(card); deckComponent.AddCard(card); } } }
/// <summary> /// 发牌 /// </summary> /// <param name="id"></param> public static void DealTo(this GameControllerComponent self, long id) { Room room = self.GetEntity <Room>(); Card card = room.GetComponent <DeckComponent>().Deal(); if (id == room.Id) { DeskCardsCacheComponent deskCardsCache = room.GetComponent <DeskCardsCacheComponent>(); deskCardsCache.AddCard(card); deskCardsCache.LordCards.Add(card); } else { foreach (var gamer in room.GetAll()) { if (id == gamer.Id) { gamer.GetComponent <HandCardsComponent>().AddCard(card); break; } } } }
/// <summary> /// 发地主牌 /// </summary> /// <param name="self"></param> /// <param name="id"></param> public static void CardsOnTable(this GameControllerComponent self, long id) { Room room = self.GetParent <Room>(); DeskCardsCacheComponent deskCardsCache = room.GetComponent <DeskCardsCacheComponent>(); OrderControllerComponent orderController = room.GetComponent <OrderControllerComponent>(); HandCardsComponent handCards = room.Get(id).GetComponent <HandCardsComponent>(); orderController.Start(id); for (int i = 0; i < 3; i++) { Card card = deskCardsCache.Deal(); handCards.AddCard(card); } //更新玩家身份 foreach (var gamer in room.GetAll()) { Identity gamerIdentity = gamer.UserID == id ? Identity.Landlord : Identity.Farmer; self.UpdateInIdentity(gamer, gamerIdentity); } //广播地主消息 Actor_SetLandlord_Ntt SetLandlordMessage = new Actor_SetLandlord_Ntt() { UserID = id }; SetLandlordMessage.LordCards.AddRange(deskCardsCache.LordCards); room.Broadcast(SetLandlordMessage); //广播地主先手出牌消息 room.Broadcast(new Actor_AuthorityPlayCard_Ntt() { UserID = id, IsFirst = true }); }
protected override async void Run(Session session, G2M_PlayerEnterRoom message, Action <M2G_PlayerEnterRoom> reply) { M2G_PlayerEnterRoom response = new M2G_PlayerEnterRoom(); //Log.Info("G2M_GamerEnterRoomHandler" + JsonHelper.ToJson(message)); try { RoomComponent roomCompnent = Game.Scene.GetComponent <RoomComponent>(); Gamer gamer = null; Room room = null; foreach (var _room in roomCompnent.rooms.Values) { room = _room; gamer = room.Get(message.UserId); if (gamer != null) { Log.Info("找到房间:" + _room.Id); break; } } //断线重连 if (gamer != null) { //在空闲房间内 if (room.State == RoomState.Idle) { response.Message = "已经进入房间"; response.Error = ErrorCode.ERR_Common; Log.Error("玩家多次进入空闲房间"); room.Remove(gamer.UserID); reply(response); return; } DeskComponent deskComponent = room.GetComponent <DeskComponent>(); //重新更新actor gamer.PlayerID = message.PlayerId; gamer.GetComponent <UnitGateComponent>().GateSessionActorId = message.SessionId; //短线重连 Actor_GamerReconnet reconnet = new Actor_GamerReconnet(); foreach (var _gamer in room.GetAll()) { if (_gamer == null) { Log.Error($"断线重连后玩家为空"); continue; } GamerData gamerData = new GamerData(); HandCardsComponent handCardsComponent = _gamer.GetComponent <HandCardsComponent>(); if (handCardsComponent == null) { Log.Error($"{_gamer.UserID}断线重连后玩家的手牌为空,移除玩家"); continue; // room.Remove(_gamer.UserID); // //房间没人就释放 // if (room.seats.Count == 0) // { // roomCompnent.RemoveRoom(room); // room.Dispose(); // } // return; } List <MahjongInfo> handCards = handCardsComponent.GetAll(); gamerData.handCards = handCards; gamerData.faceCards = handCardsComponent.FaceCards; gamerData.playCards = handCardsComponent.PlayCards; //添加碰刚的uid foreach (var pengOrBar in handCardsComponent.PengOrBars) { //碰 if (pengOrBar.OperateType == OperateType.Peng) { gamerData.pengCards.Add(new MahjongInfo() { weight = (byte)pengOrBar.Weight }); gamerData.OperatedPengUserIds.Add(pengOrBar.UserId); } //杠 else { gamerData.gangCards.Add(new MahjongInfo() { weight = (byte)pengOrBar.Weight }); gamerData.OperatedGangUserIds.Add(pengOrBar.UserId); } } gamerData.IsBanker = handCardsComponent.IsBanker; gamerData.UserID = _gamer.UserID; gamerData.SeatIndex = room.GetGamerSeat(_gamer.UserID); gamerData.OnlineSeconds = await DBCommonUtil.GetRestOnlineSeconds(_gamer.UserID); gamerData.IsTrusteeship = gamer.IsTrusteeship; PlayerBaseInfo playerBaseInfo = await DBCommonUtil.getPlayerBaseInfo(_gamer.UserID); PlayerInfo playerInfo = PlayerInfoFactory.Create(playerBaseInfo); gamerData.playerInfo = playerInfo; reconnet.Gamers.Add(gamerData); } reconnet.RestCount = deskComponent.RestLibrary.Count; reconnet.RoomType = (int)room.GetComponent <GameControllerComponent>().RoomConfig.Id; if (room.IsFriendRoom) { GameControllerComponent gameControllerComponent = room.GetComponent <GameControllerComponent>(); reconnet.RoomId = gameControllerComponent.RoomConfig.FriendRoomId; reconnet.MasterUserId = gameControllerComponent.RoomConfig.MasterUserId; reconnet.JuCount = gameControllerComponent.RoomConfig.JuCount; reconnet.Multiples = gameControllerComponent.RoomConfig.Multiples; reconnet.CurrentJuCount = room.CurrentJuCount; } room.GamerReconnect(gamer, reconnet); gamer.isOffline = false; gamer.RemoveComponent <TrusteeshipComponent>(); Log.Info($"玩家{message.UserId}断线重连"); gamer.StartTime = DateTime.Now; } else { Log.Info($"{message.UserId}进入房间"); gamer = await GamerFactory.Create(message.PlayerId, message.UserId); await gamer.AddComponent <MailBoxComponent>().AddLocation(); gamer.AddComponent <UnitGateComponent, long>(message.SessionId); RoomComponent roomComponent = Game.Scene.GetComponent <RoomComponent>(); //获得空闲的房间 Room idleRoom; if (message.RoomType == 3) { idleRoom = roomComponent.GetFriendRoomById(message.RoomId); if (idleRoom == null) { response.Error = ErrorCode.ERR_Common; response.Message = "房间号不存在"; reply(response); return; } if (idleRoom.Count == 4) { response.Error = ErrorCode.ERR_Common; response.Message = "房间人数已满"; reply(response); return; } } else { idleRoom = roomComponent.GetIdleRoomById(message.RoomType); if (idleRoom == null) { idleRoom = RoomFactory.Create(message.RoomType); roomComponent.Add(idleRoom); } } idleRoom.Add(gamer); await idleRoom.BroadGamerEnter(gamer.UserID); } response.GameId = gamer.Id; reply(response); if (message.RoomType == 3) { await Actor_GamerReadyHandler.GamerReady(gamer, new Actor_GamerReady() { }); } } catch (Exception e) { ReplyError(response, e, reply); } await Task.CompletedTask; }