/// <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);
        }
Esempio n. 3
0
        /// <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
                });
            }
        }
Esempio n. 7
0
        /// <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;
                }
            }
        }
Esempio n. 9
0
        /// <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);
        }
Esempio n. 10
0
        /// <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;
        }
Esempio n. 12
0
        /// <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);
                }
            }
        }
Esempio n. 15
0
 /// <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);
 }
Esempio n. 16
0
        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 });
                }
            }
        }
Esempio n. 18
0
        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;
        }
Esempio n. 19
0
        /// <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
            });
        }
Esempio n. 21
0
        /// <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;
        }
Esempio n. 23
0
        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);
            }
        }
Esempio n. 24
0
        /// <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);
            }
        }
Esempio n. 25
0
        /// <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);
        }
Esempio n. 26
0
        /// <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;
            }
        }
Esempio n. 27
0
        /// <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);
                }
            }
        }
Esempio n. 28
0
        /// <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
            });
        }
Esempio n. 30
0
        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;
        }