protected override async Task Run(Gamer gamer, Actor_GamerCancelTrusteeship message) { Log.Info($"玩家{gamer.UserID}取消托管"); try { RoomComponent roomComponent = Game.Scene.GetComponent <RoomComponent>(); Room room = roomComponent.Get(gamer.RoomID); if (room == null) { return; } gamer.IsTrusteeship = false; //在自己出牌的时候取消托管 OrderControllerComponent orderControllerComponent = room.GetComponent <OrderControllerComponent>(); //当前出牌是自己,并且外面没有碰刚 Log.Info($"IsNeedWaitOperate:{room.IsNeedWaitOperate}"); if (orderControllerComponent.CurrentAuthority == gamer.UserID && !room.IsNeedWaitOperate) { room.StartTime(8); } room.Broadcast(new Actor_GamerCancelTrusteeship() { Uid = gamer.UserID }); } catch (Exception e) { Log.Error(e); } await Task.CompletedTask; }
protected override async Task Run(Gamer gamer, C2M_GamerDontPlay message) { Room room = Game.Scene.GetComponent <RoomComponent>().Get(gamer.RoomID); OrderControllerComponent orderController = room.GetComponent <OrderControllerComponent>(); if (orderController.CurrentAuthority == gamer.UserID) { //转发玩家不出牌消息 C2M_GamerDontPlay transpond = new C2M_GamerDontPlay(); transpond.UserID = gamer.UserID; room.Broadcast(transpond); //轮到下位玩家出牌 orderController.Turn(false); //判断是否先手 bool isFirst = orderController.CurrentAuthority == orderController.Biggest; if (isFirst) { room.GetComponent <DeskCardsCacheComponent>().Clear(); } room.Broadcast(new M2C_AuthorityPlayCard() { UserID = orderController.CurrentAuthority, IsFirst = isFirst }); } await Task.CompletedTask; }
protected override void Run(Gamer gamer, Actor_Trusteeship_Ntt message) { Room room = Game.Scene.GetComponent<RoomComponent>().Get(gamer.RoomID); //是否已经托管 bool isTrusteeship = gamer.GetComponent<TrusteeshipComponent>() != null; if (message.IsTrusteeship && !isTrusteeship) { gamer.AddComponent<TrusteeshipComponent>(); Log.Info($"玩家{gamer.UserID}切换为自动模式"); } else if (isTrusteeship) { gamer.RemoveComponent<TrusteeshipComponent>(); Log.Info($"玩家{gamer.UserID}切换为手动模式"); } //这里由服务端设置消息UserID用于转发 Actor_Trusteeship_Ntt transpond = new Actor_Trusteeship_Ntt(); transpond.IsTrusteeship = message.IsTrusteeship; transpond.UserID = gamer.UserID; //转发消息 room.Broadcast(transpond); if (isTrusteeship) { OrderControllerComponent orderController = room.GetComponent<OrderControllerComponent>(); if (gamer.UserID == orderController.CurrentAuthority) { bool isFirst = gamer.UserID == orderController.Biggest; ActorMessageSender actorProxy = gamer.GetComponent<UnitGateComponent>().GetActorMessageSender(); actorProxy.Send(new Actor_AuthorityPlayCard_Ntt() { UserID = orderController.CurrentAuthority, IsFirst = isFirst }); } } }
protected override void Run(Gamer gamer, Actor_GamerDontPlay_Ntt message) { Room room = Game.Scene.GetComponent <RoomComponent>().Get(gamer.RoomID); OrderControllerComponent orderController = room.GetComponent <OrderControllerComponent>(); if (orderController.CurrentAuthority == gamer.UserID) { //转发玩家不出牌消息 Actor_GamerDontPlay_Ntt transpond = new Actor_GamerDontPlay_Ntt(); transpond.UserID = gamer.UserID; room.Broadcast(transpond); //轮到下位玩家出牌 orderController.Turn(); //判断是否先手 bool isFirst = orderController.CurrentAuthority == orderController.Biggest; if (isFirst) { room.GetComponent <DeskCardsCacheComponent>().Clear(); } room.Broadcast(new Actor_AuthorityPlayCard_Ntt() { UserID = orderController.CurrentAuthority, IsFirst = isFirst }); } }
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); } }
/// <summary> /// 向客户端发地主牌 /// </summary> public static void CardsOnTable(this GameControllerComponent self, long id) { Room room = self.GetParent <Room>(); OrderControllerComponent orderController = room.GetComponent <OrderControllerComponent>(); HandCardsComponent handCards = room.GetGamerFromUserID(id).GetComponent <HandCardsComponent>(); orderController.Start(id); for (int i = 0; i < 3; i++) { Card card = self.DealLord(room); handCards.AddCard(card); } //更新玩家身份 foreach (var gamer in room.gamers) { Identity gamerIdentity = gamer.UserID == id ? Identity.Landlord : Identity.Farmer; self.UpdateInIdentity(gamer, gamerIdentity); } //广播地主消息 room.Broadcast(new Actor_SetLandlord_Ntt() { UserID = id, LordCards = To.RepeatedField(room.LordCards) }); //广播地主先手出牌消息 room.Broadcast(new Actor_AuthorityPlayCard_Ntt() { UserID = id, IsFirst = true }); }
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; } //出牌 await gamer.GetComponent <HandCardsComponent>().PopCard(); } }
/// <summary> /// 发地主牌 /// </summary> /// <param name="self"></param> /// <param name="id"></param> public static void CardsOnTable(this GameControllerComponent self, long id) { Room room = self.GetEntity <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.Id == id ? Identity.Landlord : Identity.Farmer; self.UpdateInIdentity(gamer, gamerIdentity); } //广播地主消息 room.Broadcast(new SelectLord() { PlayerId = id, LordCards = deskCardsCache.LordCards.ToArray() }); //广播地主先手出牌消息 room.Broadcast(new AuthorityPlayCard() { PlayerId = id, IsFirst = true }); }
protected override Task Run(Room entity, Discard message) { OrderControllerComponent orderController = entity.GetComponent <OrderControllerComponent>(); Gamer gamer = entity.Get(message.PlayerId); if (gamer != null) { if (orderController.CurrentAuthority == gamer.Id) { //转发玩家不出消息 entity.Broadcast(message); //轮到下位玩家出牌 orderController.Turn(); //判断是否先手 bool isFirst = orderController.CurrentAuthority == orderController.Biggest; if (isFirst) { entity.GetComponent <DeskCardsCacheComponent>().Clear(); } entity.Broadcast(new AuthorityPlayCard() { PlayerId = orderController.CurrentAuthority, IsFirst = isFirst }); } } return(Task.CompletedTask); }
/// <summary> /// 初始化 /// </summary> /// <param name="self"></param> public static void Init(this OrderControllerComponent self, long id) { self.FirstAuthority = new System.Collections.Generic.KeyValuePair <long, bool>(id, false); self.Biggest = 0; self.CurrentAuthority = id; self.SelectLordIndex = 1; }
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 }); } } }
/// <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> public static void Turn(this OrderControllerComponent self) { LandlordsRoom room = self.GetParent <LandlordsRoom>(); Gamer[] gamers = room.gamers; int index = Array.FindIndex(gamers, (gamer) => self.CurrentAuthority == gamer.UserID); index++; if (index == gamers.Length) { index = 0; } self.CurrentAuthority = gamers[index].UserID; }
/// <summary> /// 轮转 /// </summary> /// <param name="self"></param> public static void Turn(this OrderControllerComponent self) { Room room = self.GetEntity <Room>(); Gamer[] gamers = room.GetAll(); int index = Array.FindIndex(gamers, (gamer) => self.CurrentAuthority == gamer.Id); index++; if (index == gamers.Length) { index = 0; } self.CurrentAuthority = gamers[index].Id; }
/// <summary> /// 找到下一个玩家 /// </summary> /// <param name="self"></param> public static Gamer FindNextGamer(this OrderControllerComponent self, long userId) { Room room = self.GetParent <Room>(); Gamer[] gamers = room.GetAll(); int index = room.GetGamerSeat(userId); index++; if (index == gamers.Length) { index = 0; } return(gamers[index]); }
public static async void Update(this AutoPlayCardsComponent self) { if (!self.Playing) { OrderControllerComponent orderController = self.GamerRoom.GetComponent <OrderControllerComponent>(); if (self.Entity.Id == orderController.CurrentAuthority) { self.Playing = true; await Game.Scene.GetComponent <TimerComponent>().WaitAsync(1000); ActorProxy actorProxy = Game.Scene.GetComponent <ActorProxyComponent>().Get(self.GamerRoom.Id); //当还没抢地主时随机抢地主 if (self.Entity.GetComponent <HandCardsComponent>().AccessIdentity == Identity.None) { int randomSelect = RandomHelper.RandomNumber(0, 2); actorProxy.Send(new GrabLordSelect() { PlayerId = self.Entity.Id, IsGrab = randomSelect == 0 }); self.Playing = false; return; } PromptRe promptRE = await actorProxy.Call <PromptRe>(new PromptRt() { PlayerId = self.Entity.Id }); if (promptRE.Error > 0 || promptRE.Cards == null) { actorProxy.Send(new Discard() { PlayerId = self.Entity.Id }); } else { await actorProxy.Call <PlayCardsRe>(new PlayCardsRt() { PlayerId = self.Entity.Id, Cards = promptRE.Cards }); } self.Playing = false; } } }
/// <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="self"></param> public static void Turn(this OrderControllerComponent self) { Room room = self.GetParent <Room>(); Gamer[] gamers = room.GetAll(); int index = Array.FindIndex(gamers, (gamer) => self.CurrentAuthority == gamer.UserID); index++; if (index == gamers.Length) { index = 0; } self.CurrentAuthority = gamers[index].UserID; room.Broadcast(new Actor_AuthorityPlayCard_Ntt() { UserID = self.CurrentAuthority, IsFirst = false }); }
/// <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 }); }
/// <summary> /// 轮转 /// </summary> /// <param name="self"></param> public static void Turn(this OrderControllerComponent self) { int index = -1; try { Room room = self.GetParent <Room>(); Gamer[] gamers = room.GetAll(); for (int i = 0; i < gamers.Length; i++) { Gamer gamer = gamers[i]; if (gamer == null) { Log.Error("在轮转的时候玩家为null:" + room.State); continue; } if (self.CurrentAuthority == gamer.UserID) { index = i; break; } } if (index < 0) { Log.Error("玩家轮转的时候room的玩家都是null"); return; } index++; if (index == gamers.Length) { index = 0; } self.CurrentAuthority = gamers[index].UserID; } catch (Exception e) { Log.Error($"角标越界{index}:" + e); } }
public static async void Start(this TrusteeshipComponent self) { //找到玩家所在房间 LandlordsComponent landordsMatchComponent = Game.Scene.GetComponent <LandlordsComponent>(); Gamer gamer = self.GetParent <Gamer>(); LandlordsRoom room = landordsMatchComponent.GetGamingRoom(self.GetParent <Gamer>()); ActorMessageSender actorProxy = Game.Scene.GetComponent <ActorMessageSenderComponent>().Get(gamer.InstanceId); OrderControllerComponent orderController = room.GetComponent <OrderControllerComponent>(); //这个托管组件是通过定时器实现的 while (true) { //延迟1秒 await Game.Scene.GetComponent <TimerComponent>().WaitAsync(3000); if (self.IsDisposed) { return; } if (gamer.UserID != orderController?.CurrentAuthority) { continue; } //给Map上的Gamer发送Actor消息 //自动提示出牌 Actor_GamerPrompt_Back response = (Actor_GamerPrompt_Back)await actorProxy.Call(new Actor_GamerPrompt_Req()); if (response.Error > 0 || response.Cards.Count == 0) { actorProxy.Send(new Actor_GamerDontPlay_Ntt()); } else { await actorProxy.Call(new Actor_GamerPlayCard_Req() { Cards = response.Cards }); } } }
/// <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); } }
protected override async Task Run(Gamer gamer, C2M_Trusteeship message) { Room room = Game.Scene.GetComponent <RoomComponent>().Get(gamer.RoomID); //是否已经托管 bool isTrusteeship = gamer.GetComponent <TrusteeshipComponent>() != null; if (message.isTrusteeship && !isTrusteeship) { gamer.AddComponent <TrusteeshipComponent>(); Log.Info($"玩家{gamer.UserID}切换为自动模式"); } else if (isTrusteeship) { gamer.RemoveComponent <TrusteeshipComponent>(); Log.Info($"玩家{gamer.UserID}切换为手动模式"); } //这里由服务端设置消息UserID用于转发 C2M_Trusteeship transpond = new C2M_Trusteeship(); transpond.isTrusteeship = message.isTrusteeship; transpond.UserID = gamer.UserID; //转发消息 room.Broadcast(transpond); if (isTrusteeship) { OrderControllerComponent orderController = room.GetComponent <OrderControllerComponent>(); if (gamer.UserID == orderController.CurrentAuthority) { bool isFirst = gamer.UserID == orderController.Biggest; ActorProxy actorProxy = gamer.GetComponent <UnitGateComponent>().GetActorProxy(); actorProxy.Send(new M2C_AuthorityPlayCard() { UserID = orderController.CurrentAuthority, IsFirst = isFirst }); } } await Task.CompletedTask; }
/// <summary> /// 发牌,包含抓牌和补花 /// </summary> /// <param name="room"></param> public static async void GamerGrabCard(this Room room) { foreach (var gamer in room.GetAll()) { if (gamer == null) { Log.Error("发牌的时候gamer为null:" + JsonHelper.ToJson(room.UserIds) + "\n------:" + JsonHelper.ToJson(room.GetAll())); continue; } gamer.isGangFaWanPai = false; } OrderControllerComponent orderController = room.GetComponent <OrderControllerComponent>(); orderController.Turn(); var currentGamer = room.Get(orderController.CurrentAuthority); currentGamer.isGangEndBuPai = false; currentGamer.isGetYingHuaBuPai = false; await room.GrabMahjongNoHua(currentGamer); }
/// <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(Gamer gamer, Actor_Trusteeship_Ntt message) { LandlordsRoom room = Game.Scene.GetComponent <LandlordsComponent>().GetGamingRoom(gamer); //是否已经托管 bool isTrusteeship = gamer.GetComponent <TrusteeshipComponent>() != null; if (message.IsTrusteeship && !isTrusteeship) { gamer.AddComponent <TrusteeshipComponent>(); Log.Info($"玩家{gamer.UserID}切换为自动模式"); } else if (isTrusteeship) { gamer.RemoveComponent <TrusteeshipComponent>(); Log.Info($"玩家{gamer.UserID}切换为手动模式"); } //当玩家切换为手动模式时 补发出牌权 if (isTrusteeship) { OrderControllerComponent orderController = room.GetComponent <OrderControllerComponent>(); if (gamer.UserID == orderController.CurrentAuthority) { bool isFirst = gamer.UserID == orderController.Biggest; //向客户端发送出牌权消息 ActorMessageSender actorProxy = Game.Scene.GetComponent <ActorMessageSenderComponent>().Get(gamer.ActorIDofClient); actorProxy.Send(new Actor_AuthorityPlayCard_Ntt() { UserID = orderController.CurrentAuthority, IsFirst = isFirst }); } } await Task.CompletedTask; }
protected override async Task Run(Room room, Actor_PlayerEnterRoom_Req message, Action <Actor_PlayerEnterRoom_Ack> reply) { Actor_PlayerEnterRoom_Ack response = new Actor_PlayerEnterRoom_Ack(); try { Gamer gamer = room.Get(message.UserID); if (gamer == null) { //创建房间玩家对象 gamer = GamerFactory.Create(message.PlayerID, message.UserID); await gamer.AddComponent <MailBoxComponent>().AddLocation(); gamer.AddComponent <UnitGateComponent, long>(message.SessionID); //加入到房间 room.Add(gamer); Actor_GamerEnterRoom_Ntt broadcastMessage = new Actor_GamerEnterRoom_Ntt(); foreach (Gamer _gamer in room.GetAll()) { if (_gamer == null) { //添加空位 broadcastMessage.Gamers.Add(null); continue; } //添加玩家信息 GamerInfo info = new GamerInfo() { UserID = _gamer.UserID, IsReady = _gamer.IsReady }; broadcastMessage.Gamers.Add(info); } //广播房间内玩家消息 room.Broadcast(broadcastMessage); Log.Info($"玩家{message.UserID}进入房间"); } else { //玩家重连 gamer.isOffline = false; gamer.PlayerID = message.PlayerID; gamer.GetComponent <UnitGateComponent>().GateSessionActorId = message.SessionID; //玩家重连移除托管组件 gamer.RemoveComponent <TrusteeshipComponent>(); Actor_GamerEnterRoom_Ntt broadcastMessage = new Actor_GamerEnterRoom_Ntt(); foreach (Gamer _gamer in room.GetAll()) { if (_gamer == null) { //添加空位 broadcastMessage.Gamers.Add(null); continue; } //添加玩家信息 GamerInfo info = new GamerInfo() { UserID = _gamer.UserID, IsReady = _gamer.IsReady }; broadcastMessage.Gamers.Add(info); } //发送房间玩家信息 ActorMessageSender actorProxy = gamer.GetComponent <UnitGateComponent>().GetActorMessageSender(); actorProxy.Send(broadcastMessage); List <GamerCardNum> gamersCardNum = new List <GamerCardNum>(); List <GamerState> gamersState = new List <GamerState>(); GameControllerComponent gameController = room.GetComponent <GameControllerComponent>(); OrderControllerComponent orderController = room.GetComponent <OrderControllerComponent>(); DeskCardsCacheComponent deskCardsCache = room.GetComponent <DeskCardsCacheComponent>(); foreach (Gamer _gamer in room.GetAll()) { HandCardsComponent handCards = _gamer.GetComponent <HandCardsComponent>(); gamersCardNum.Add(new GamerCardNum() { UserID = _gamer.UserID, Num = _gamer.GetComponent <HandCardsComponent>().GetAll().Length }); gamersState.Add(new GamerState() { UserID = _gamer.UserID, Identity = (byte)handCards.AccessIdentity, GrabLandlordState = orderController.GamerLandlordState.ContainsKey(_gamer.UserID) ? orderController.GamerLandlordState[_gamer.UserID] : false }); } //发送游戏开始消息 Actor_GameStart_Ntt gameStartNotice = new Actor_GameStart_Ntt() { HandCards = gamer.GetComponent <HandCardsComponent>().GetAll(), GamersCardNum = gamersCardNum }; actorProxy.Send(gameStartNotice); Card[] lordCards = null; if (gamer.GetComponent <HandCardsComponent>().AccessIdentity == Identity.None) { //广播先手玩家 actorProxy.Send(new Actor_AuthorityGrabLandlord_Ntt() { UserID = orderController.CurrentAuthority }); } else { if (gamer.UserID == orderController.CurrentAuthority) { //发送可以出牌消息 bool isFirst = gamer.UserID == orderController.Biggest; actorProxy.Send(new Actor_AuthorityPlayCard_Ntt() { UserID = orderController.CurrentAuthority, IsFirst = isFirst }); } lordCards = deskCardsCache.LordCards.ToArray(); } //发送重连数据 Actor_GamerReconnect_Ntt reconnectNotice = new Actor_GamerReconnect_Ntt() { Multiples = room.GetComponent <GameControllerComponent>().Multiples, GamersState = gamersState, DeskCards = new KeyValuePair <long, Card[]>(orderController.Biggest, deskCardsCache.library.ToArray()), LordCards = lordCards, }; actorProxy.Send(reconnectNotice); Log.Info($"玩家{message.UserID}重连"); } response.GamerID = gamer.Id; reply(response); } catch (Exception e) { ReplyError(response, e, reply); } }
protected override void Run(Gamer gamer, Actor_GamerGrabLandlordSelect_Ntt message) { Room room = Game.Scene.GetComponent <RoomComponent>().Get(gamer.RoomID); OrderControllerComponent orderController = room.GetComponent <OrderControllerComponent>(); GameControllerComponent gameController = room.GetComponent <GameControllerComponent>(); if (orderController.CurrentAuthority == gamer.UserID) { //保存抢地主状态 orderController.GamerLandlordState[gamer.UserID] = message.IsGrab; if (message.IsGrab) { orderController.Biggest = gamer.UserID; gameController.Multiples *= 2; room.Broadcast(new Actor_SetMultiples_Ntt() { Multiples = gameController.Multiples }); } //转发消息 Actor_GamerGrabLandlordSelect_Ntt transpond = new Actor_GamerGrabLandlordSelect_Ntt(); transpond.IsGrab = message.IsGrab; transpond.UserID = gamer.UserID; room.Broadcast(transpond); if (orderController.SelectLordIndex >= room.Count) { /* * 地主:√ 农民1:× 农民2:× * 地主:× 农民1:√ 农民2:√ * 地主:√ 农民1:√ 农民2:√ 地主:√ * * */ if (orderController.Biggest == 0) { //没人抢地主则重新发牌 gameController.BackToDeck(); gameController.DealCards(); //发送玩家手牌 Gamer[] gamers = room.GetAll(); List <GamerCardNum> gamersCardNum = new List <GamerCardNum>(); Array.ForEach(gamers, _gamer => gamersCardNum.Add(new GamerCardNum() { UserID = _gamer.UserID, Num = _gamer.GetComponent <HandCardsComponent>().GetAll().Length })); Array.ForEach(gamers, _gamer => { ActorMessageSender actorProxy = _gamer.GetComponent <UnitGateComponent>().GetActorMessageSender(); Actor_GameStart_Ntt actorMessage = new Actor_GameStart_Ntt(); actorMessage.HandCards.AddRange(_gamer.GetComponent <HandCardsComponent>().GetAll()); actorMessage.GamersCardNum.AddRange(gamersCardNum); }); //随机先手玩家 gameController.RandomFirstAuthority(); return; } else if ((orderController.SelectLordIndex == room.Count && ((orderController.Biggest != orderController.FirstAuthority.Key && !orderController.FirstAuthority.Value) || orderController.Biggest == orderController.FirstAuthority.Key)) || orderController.SelectLordIndex > room.Count) { gameController.CardsOnTable(orderController.Biggest); return; } } //当所有玩家都抢地主时先手玩家还有一次抢地主的机会 if (gamer.UserID == orderController.FirstAuthority.Key && message.IsGrab) { orderController.FirstAuthority = new KeyValuePair <long, bool>(gamer.UserID, true); } orderController.Turn(); orderController.SelectLordIndex++; room.Broadcast(new Actor_AuthorityGrabLandlord_Ntt() { UserID = orderController.CurrentAuthority }); } }
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; }
protected override async Task Run(Gamer gamer, Actor_GamerPlayCard_Req message, Action <Actor_GamerPlayCard_Ack> reply) { Actor_GamerPlayCard_Ack response = new Actor_GamerPlayCard_Ack(); try { Room room = Game.Scene.GetComponent <RoomComponent>().Get(gamer.RoomID); GameControllerComponent gameController = room.GetComponent <GameControllerComponent>(); DeskCardsCacheComponent deskCardsCache = room.GetComponent <DeskCardsCacheComponent>(); OrderControllerComponent orderController = room.GetComponent <OrderControllerComponent>(); //检测是否符合出牌规则 if (CardsHelper.PopEnable(message.Cards, out CardsType type)) { //当前出牌牌型是否比牌桌上牌型的权重更大 bool isWeightGreater = CardsHelper.GetWeight(message.Cards, type) > deskCardsCache.GetTotalWeight(); //当前出牌牌型是否和牌桌上牌型的数量一样 bool isSameCardsNum = message.Cards.count == deskCardsCache.GetAll().Length; //当前出牌玩家是否是上局最大出牌者 bool isBiggest = orderController.Biggest == orderController.CurrentAuthority; //当前牌桌牌型是否是顺子 bool isStraight = deskCardsCache.Rule == CardsType.Straight || deskCardsCache.Rule == CardsType.DoubleStraight || deskCardsCache.Rule == CardsType.TripleStraight; //当前出牌牌型是否和牌桌上牌型一样 bool isSameCardsType = type == deskCardsCache.Rule; if (isBiggest || //先手出牌玩家 type == CardsType.JokerBoom || //王炸 type == CardsType.Boom && isWeightGreater || //更大的炸弹 isSameCardsType && isStraight && isSameCardsNum && isWeightGreater || //更大的顺子 isSameCardsType && isWeightGreater) //更大的同类型牌 { if (type == CardsType.JokerBoom) { //王炸翻4倍 gameController.Multiples *= 4; room.Broadcast(new Actor_SetMultiples_Ntt() { Multiples = gameController.Multiples }); } else if (type == CardsType.Boom) { //炸弹翻2倍 gameController.Multiples *= 2; room.Broadcast(new Actor_SetMultiples_Ntt() { Multiples = gameController.Multiples }); } } else { response.Error = ErrorCode.ERR_PlayCardError; reply(response); return; } } else { response.Error = ErrorCode.ERR_PlayCardError; reply(response); return; } //如果符合将牌从手牌移到出牌缓存区 deskCardsCache.Clear(); deskCardsCache.Rule = type; HandCardsComponent handCards = gamer.GetComponent <HandCardsComponent>(); foreach (var card in message.Cards) { handCards.PopCard(card); deskCardsCache.AddCard(card); } reply(response); //转发玩家出牌消息 room.Broadcast(new Actor_GamerPlayCard_Ntt() { UserID = gamer.UserID, Cards = message.Cards }); //游戏控制器继续游戏 gameController.Continue(gamer); } catch (Exception e) { ReplyError(response, e, reply); } }