protected override Task Run(Room entity, PlayerReconnect message) { Gamer gamer = entity.GetAll().Where(g => g.UserId == message.UserId).FirstOrDefault(); if (gamer != null) { long pastId = gamer.Id; gamer.Id = message.PlayerId; gamer.isOffline = false; entity.Replace(pastId, gamer); gamer.RemoveComponent <AutoPlayCardsComponent>(); UnitGateComponent unitGateComponent = gamer.GetComponent <UnitGateComponent>(); unitGateComponent.GateSessionId = message.GateSessionId; ActorProxy actorProxy = unitGateComponent.GetActorProxy(); OrderControllerComponent orderController = entity.GetComponent <OrderControllerComponent>(); DeskCardsCacheComponent deskCardsCache = entity.GetComponent <DeskCardsCacheComponent>(); GameControllerComponent gameController = entity.GetComponent <GameControllerComponent>(); //替换过期玩家ID if (orderController.FirstAuthority.Key == pastId) { orderController.FirstAuthority = new KeyValuePair <long, bool>(gamer.Id, orderController.FirstAuthority.Value); } if (orderController.Biggest == pastId) { orderController.Biggest = gamer.Id; } if (orderController.CurrentAuthority == pastId) { orderController.CurrentAuthority = gamer.Id; } entity.Broadcast(new GamerReenter() { PastId = pastId, NewId = gamer.Id }); //发送房间玩家信息 Gamer[] gamers = entity.GetAll(); GamerInfo[] gamersInfo = new GamerInfo[gamers.Length]; for (int i = 0; i < gamers.Length; i++) { gamersInfo[i] = new GamerInfo(); gamersInfo[i].PlayerId = gamers[i].Id; gamersInfo[i].UserId = gamers[i].UserId; gamersInfo[i].IsReady = gamers[i].IsReady; } actorProxy.Send(new GamerEnter() { RoomId = entity.Id, GamersInfo = gamersInfo }); Dictionary <long, int> gamerCardsNum = new Dictionary <long, int>(); Dictionary <long, Identity> gamersIdentity = new Dictionary <long, Identity>(); Array.ForEach(gamers, (g) => { HandCardsComponent handCards = g.GetComponent <HandCardsComponent>(); gamerCardsNum.Add(g.Id, handCards.CardsCount); gamersIdentity.Add(g.Id, handCards.AccessIdentity); }); //发送玩家手牌 actorProxy.Send(new GameStart() { GamerCards = gamer.GetComponent <HandCardsComponent>().GetAll(), GamerCardsNum = gamerCardsNum }); Card[] lordCards = null; if (gamer.GetComponent <HandCardsComponent>().AccessIdentity == Identity.None) { //广播先手玩家 entity.Broadcast(new SelectAuthority() { PlayerId = orderController.CurrentAuthority }); } else { lordCards = deskCardsCache.LordCards.ToArray(); } //发送重连消息 actorProxy.Send(new GamerReconnect() { PlayerId = gamer.Id, Multiples = gameController.Multiples, GamersIdentity = gamersIdentity, LordCards = lordCards, DeskCards = new KeyValuePair <long, Card[]>(orderController.Biggest, deskCardsCache.library.ToArray()) }); //发送当前出牌者消息 bool isFirst = orderController.Biggest == orderController.CurrentAuthority; actorProxy.Send(new AuthorityPlayCard() { PlayerId = orderController.CurrentAuthority, IsFirst = isFirst }); Log.Info($"玩家{gamer.Id}重连"); } return(Task.CompletedTask); }
/// <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 Task Run(Room unit, PlayCardsRt message, Action <PlayCardsRe> reply) { PlayCardsRe response = new PlayCardsRe(); try { Gamer gamer = unit.Get(message.PlayerId); if (gamer == null) { response.Error = ErrorCode.ErrPlayCardError; reply(response); return(Task.CompletedTask); } GameControllerComponent gameController = unit.GetComponent <GameControllerComponent>(); DeskCardsCacheComponent deskCardsCache = unit.GetComponent <DeskCardsCacheComponent>(); OrderControllerComponent orderController = unit.GetComponent <OrderControllerComponent>(); //检测是否符合出牌规则 if (CardsHelper.PopEnable(message.Cards, out CardsType type)) { if (orderController.Biggest == orderController.CurrentAuthority || type == CardsType.JokerBoom || type == CardsType.Boom && CardsHelper.GetWeight(message.Cards, type) > deskCardsCache.GetTotalWeight() || (deskCardsCache.Rule == CardsType.Straight || deskCardsCache.Rule == CardsType.DoubleStraight || deskCardsCache.Rule == CardsType.TripleStraight) && type == deskCardsCache.Rule && message.Cards.Length == deskCardsCache.GetAll().Length&& CardsHelper.GetWeight(message.Cards, type) > deskCardsCache.GetTotalWeight() || type == deskCardsCache.Rule && CardsHelper.GetWeight(message.Cards, type) > deskCardsCache.GetTotalWeight()) { if (type == CardsType.JokerBoom) { gameController.Multiples *= 4; unit.Broadcast(new GameMultiples() { Multiples = gameController.Multiples }); } else if (type == CardsType.Boom) { gameController.Multiples *= 2; unit.Broadcast(new GameMultiples() { Multiples = gameController.Multiples }); } } else { response.Error = ErrorCode.ErrPlayCardError; reply(response); return(Task.CompletedTask); } } else { response.Error = ErrorCode.ErrPlayCardError; reply(response); return(Task.CompletedTask); } //如果符合将牌从手牌移到出牌缓存区 deskCardsCache.Clear(); deskCardsCache.Rule = type; HandCardsComponent handCards = gamer.GetComponent <HandCardsComponent>(); foreach (var card in message.Cards) { handCards.PopCard(card); deskCardsCache.AddCard(card); } //转发玩家出牌消息 unit.Broadcast(new GamerPlayCards() { PlayerId = gamer.Id, Cards = message.Cards }); if (handCards.CardsCount == 0) { Identity winnerIdentity = unit.Get(orderController.Biggest).GetComponent <HandCardsComponent>().AccessIdentity; Dictionary <long, long> gamersScore = new Dictionary <long, long>(); foreach (var _gamer in unit.GetAll()) { _gamer.RemoveComponent <AutoPlayCardsComponent>(); gamersScore.Add(_gamer.Id, gameController.GetScore(_gamer, winnerIdentity)); //玩家剩余出牌 if (_gamer.Id != message.PlayerId) { Card[] _gamerCards = _gamer.GetComponent <HandCardsComponent>().GetAll(); unit.Broadcast(new GamerPlayCards() { PlayerId = _gamer.Id, Cards = _gamerCards }); } } //游戏结束结算 gameController.GameOver(gamersScore); //广播游戏结束消息 unit.Broadcast(new Gameover() { Winner = winnerIdentity, BasePointPerMatch = gameController.BasePointPerMatch, Multiples = gameController.Multiples, GamersScore = gamersScore }); } else { //轮到下位玩家出牌 orderController.Biggest = gamer.Id; orderController.Turn(); unit.Broadcast(new AuthorityPlayCard() { PlayerId = orderController.CurrentAuthority, IsFirst = false }); } reply(response); } catch (Exception e) { ReplyError(response, e, reply); } return(Task.CompletedTask); }
/// <summary> /// 更新身份 /// </summary> /// <param name="self"></param> /// <param name="id"></param> /// <param name="identity"></param> public static void UpdateInIdentity(this GameControllerComponent self, Gamer gamer, Identity identity) { gamer.GetComponent <HandCardsComponent>().AccessIdentity = identity; }