Пример #1
0
        public void ExecuteCommand(GameSession session, ProtobufRequestInfo requestInfo)
        {
            if (!Gongyong.userlist.Any(w => w.session.SessionID.Equals(session.SessionID)))
            {
                session.Logger.Debug("UserRemove : 非法连接");
                session.Close();
                return;
            }
            var    getdata = SendRemove.ParseFrom(requestInfo.Body);
            mjuser usermj  = Gongyong.mulist.Find(u => u.Openid == getdata.Openid);

            //判断是否存在该玩家
            if (usermj == null)
            {
                return;
            }
            if (usermj.IsHomeowner)    //如果是房主则不能是退出房间,而应该是解散牌桌
            {
                session.Logger.Debug("房主请求退出");
                return;
            }


            new UserExitLogic().UserExit(usermj, getdata.RoomID, getdata.Openid, requestInfo.MessageNum, session);
        }
Пример #2
0
 /// <summary>
 /// 清空当前局数玩家信息
 /// </summary>
 /// <param name="item"></param>
 /// <param name="r"></param>
 internal void Clear(mjuser item, Room r)
 {
     ///清空当前局数玩家信息
     item.majiangs.Clear();
     item.Peng.Clear();
     item.paixinfs = 0;
     item.QYM      = 0;
     item.Gong     = "";
     item.chuda.Clear();
     item.ByteData  = string.Empty;
     item.Is_baotin = false;
     item.is_cfwg   = false;
     item.Is_cfj    = false;
     item.Is_zrj    = 0;
     item.is_zrwg   = 0;
     item.Is_jiao   = false;
     item.Is_tiant  = false;
     item.Is_baotin = false;
     item.IsGuoHu   = false;
     item.Is_tianHu = false;
     item.Is_tiantX = 0;
     r.RoomPai.Clear();
     r.MPS     = 0;
     r.PaiHSCZ = null;
     r.DQcz    = "";
     r.DQHY    = 0;
 }
Пример #3
0
        /// <summary>
        /// 用户退出牌桌
        /// </summary>
        /// <param name="usermj"></param>
        /// <param name="roomID"></param>
        /// <param name="openid"></param>
        /// <param name="messageNum"></param>
        /// <param name="session"></param>
        /// <param name="isExit">是否已退出</param>
        public void UserExit(mjuser usermj, int roomID, string openid, int messageNum, GameSession session, bool isExit = false)
        {
            List <mjuser> listmjuser = Gongyong.mulist.FindAll(u => u.RoomID == roomID);

            ///判断是否该房间是否存在用户
            if (listmjuser.Count <= 0)
            {
                return;
            }

            ///向剩余用户下发推出玩家
            var  returnData = ReturnRemoveUser.CreateBuilder().SetOpenid(openid).SetStatus(1);
            Room r          = Gongyong.roomlist.Find(u => u.RoomID == roomID);

            if (r == null)
            {
                return;
            }
            //判断房间已开始游戏
            if (r.startgame == 1)
            {
                returnData.SetStatus(0);
                byte[] returnbyte = returnData.Build().ToByteArray();
                if (!isExit)
                {
                    session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 5009, returnbyte.Length, messageNum, returnbyte)));
                }
            }
            else
            {
                byte[] returnbyte = returnData.Build().ToByteArray();
                if (isExit)
                {
                    listmjuser.Remove(listmjuser.First(w => w.Openid.Equals(openid)));
                }
                r.listOpenid.Remove(openid);
                foreach (var item in listmjuser)
                {
                    UserInfo user = Gongyong.userlist.Find(u => u.openid == item.Openid);
                    if (user != null && user.session != null)
                    {
                        user.session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 5009, returnbyte.Length, messageNum, returnbyte)));
                    }

                    if (user.openid.Equals(usermj.Openid))
                    {
                        //将用户游戏信息更新
                        RedisUtility.Remove(RedisUtility.GetKey(GameInformationBase.COMMUNITYUSERGAME, user.openid, user.unionid));
                    }
                }
                Gongyong.mulist.Remove(usermj);
            }
        }
Пример #4
0
        /// <summary>
        /// 加入服务器
        /// </summary>
        /// <param name="session"></param>
        /// <param name="requestInfo"></param>
        public void ExecuteCommand(GameSession session, ProtobufRequestInfo requestInfo)
        {
            SendAddServer sendInfo = SendAddServer.ParseFrom(requestInfo.Body);
            var           key      = RedisUtility.GetKey(GameInformationBase.COMMUNITYUSERINFO, sendInfo.Openid, sendInfo.Unionid);

            var userInfo = RedisUtility.Get <RedisUserInfoModel>(key);

            var returnAddServer = ReturnAddServer.CreateBuilder();

            if (userInfo == null)
            {
                returnAddServer.SetStatus(2);
            }
            else
            {
                returnAddServer.SetStatus(1);
                var info = Gongyong.userlist.Find(w => w.openid.Equals(userInfo.Openid));
                if (info == null)
                {
                    var user = new UserInfo(userInfo);
                    user.session = session;
                    Gongyong.userlist.Add(user);
                    session.Logger.Debug("加入游戏服务器成功----" + sendInfo.Openid + "------" + DateTime.Now);
                }
                else
                {
                    info.nickname = userInfo.Nickname;
                    info.sex      = userInfo.Sex;
                    info.headimg  = userInfo.Headimg;
                    if (info.session != null)
                    {
                        info.session.Close();
                    }
                    info.session = session;
                    mjuser mju = Gongyong.mulist.Find(u => u.Openid == info.openid);

                    if (mju != null)
                    {
                        mju.ConnectionStatus = 1;
                        // SendCL(session, info.openid, requestInfo);
                    }
                }
            }
            var data = returnAddServer.Build().ToByteArray();

            session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 1012, data.Length, requestInfo.MessageNum, data)));
        }
Пример #5
0
 internal void UserExit(mjuser muInfo, int roomID, string openid, int v1, object p, bool v2)
 {
     throw new NotImplementedException();
 }
Пример #6
0
        public void ExecuteCommand(GameSession session, ProtobufRequestInfo requestInfo)
        {
            if (!Gongyong.userlist.Any(w => w.session.SessionID.Equals(session.SessionID)))
            {
                session.Logger.Debug("AddRoom : 非法连接");
                session.Close();
                return;
            }
            ///定义返回状态码
            string          staut    = "10000";
            var             nowsend  = ReturnAddRoom.CreateBuilder();
            List <Userinfo> listuser = new List <Userinfo>();
            ///当前返回信息
            var getdata = SendAddRoom.ParseFrom(requestInfo.Body);
            ///根据上传信息查找房间
            Room rm      = Gongyong.roomlist.Find(u => u.RoomID == getdata.RoomID);
            var  roommsg = ReturnRoomMsg.CreateBuilder();
            //储存IP
            List <UserInfo> ListUserIP = new List <UserInfo>();

            if (rm != null)
            {
                List <mjuser> mulist = Gongyong.mulist.FindAll(u => u.RoomID == getdata.RoomID);
                mjuser        mjuser = Gongyong.mulist.Find(u => u.RoomID == getdata.RoomID && u.Openid == getdata.Openid);

                if (mulist.Count == rm.room_peo)
                {
                    staut = "10002";
                }
                else
                {
                    List <int> shuzhu = new List <int>()
                    {
                        1, 2, 3, 4
                    };
                    ///移除以坐的方位,并添加以有玩家信息
                    var senddata = ReturnUserInfo.CreateBuilder();

                    //for(int i=0;i< mulist.Count();i++)
                    foreach (mjuser item in mulist)
                    {
                        UserInfo gamer = Gongyong.userlist.Find(u => u.openid == item.Openid);
                        Userinfo users = Userinfo.CreateBuilder().SetHeadimg(gamer.headimg).SetNickname(gamer.nickname).SetOpenid(gamer.openid).SetSex(int.Parse(gamer.sex)).SetUserFW(item.ZS_Fw).SetUserBean(0).SetUserGold(0).SetUserID(gamer.UserID).SetUserIP(gamer.UserIP).Build();
                        listuser.Add(users);
                        shuzhu.Remove(item.ZS_Fw);
                        senddata.AddUserinfo(users);
                        nowsend.AddUserinfo(users);
                    }
                    if (mjuser != null)
                    {
                        return;
                    }
                    else
                    {
                        ///添加新加入玩家信息
                        mjuser mj = new mjuser()
                        {
                            Openid             = getdata.Openid,
                            ZS_Fw              = shuzhu[0],
                            RoomID             = getdata.RoomID,
                            ConfirmationStarts = true,
                            SendData           = new List <ArraySegment <byte> >(),
                            IsGuoHu            = false
                        };
                        Gongyong.mulist.Add(mj);
                    }


                    ///将当前的用户信息添加到下发文件包
                    UserInfo gameuser = Gongyong.userlist.Find(u => u.openid == getdata.Openid);
                    gameuser.Lat = getdata.Latitude;
                    Userinfo newuser = Userinfo.CreateBuilder().SetHeadimg(gameuser.headimg).SetNickname(gameuser.nickname).SetOpenid(gameuser.openid).SetSex(int.Parse(gameuser.sex)).SetUserFW(shuzhu[0]).SetUserGold(0).SetUserBean(0).SetUserID(gameuser.UserID).SetUserIP(gameuser.UserIP).Build();
                    listuser.Add(newuser);
                    senddata.AddUserinfo(newuser);
                    nowsend.AddUserinfo(newuser);
                    List <mjuser> mu       = Gongyong.mulist.FindAll(u => u.RoomID == getdata.RoomID);
                    var           dis      = ReturnDis.CreateBuilder();
                    var           closeGPS = ReturnCloseGPS.CreateBuilder();

                    ///向已有玩家下发信息
                    foreach (mjuser items in mu)
                    {
                        UserInfo gamersend = Gongyong.userlist.Find(u => u.openid == items.Openid);
                        if (gamersend.Lat.Equals("0,0") || string.IsNullOrEmpty(gamersend.Lat))
                        {
                            //Console.WriteLine("AddRoom : " + gamersend.session.Config.Ip + " lat 为 0");
                            //Console.WriteLine(" : " + mjuser.)
                            closeGPS.AddFW(items.ZS_Fw);
                            //gamersend.session.Send(new ArraySegment<byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 7091, dataGPS.Length, requestInfo.MessageNum, dataGPS)));
                        }
                        else if (gameuser.Lat.Equals("0,0") || string.IsNullOrEmpty(gameuser.Lat))
                        {
                            if (items.Openid.Equals(gameuser.openid))
                            {
                                //Console.WriteLine("AddRoom : " + gamersend.session.Config.Ip + " lat 为 0");
                                if (!closeGPS.FWList.Any(w => w == items.ZS_Fw))
                                {
                                    closeGPS.AddFW(items.ZS_Fw);
                                }
                            }
                        }
                        else
                        {
                            var userdis = ReturnDis.CreateBuilder();


                            //double jl = Erth.GetDistance(gamersend.Lat, gameuser.Lat);
                            double jl = 1;  //  测试修改
                            if (shuzhu[0] != items.ZS_Fw)
                            {
                                //if (jl < GameInformationBase.DISTANCE)
                                if (jl < 0.001f) //任光粤测试修改
                                {
                                    Console.WriteLine("距离为 : " + jl + gamersend.nickname + ":" + gamersend.Lat + " , " + gameuser.nickname + " : " + gameuser.Lat);
                                    rm.Is_Jin = true;

                                    rm.Juser1 = shuzhu[0];
                                    rm.Juser2 = items.ZS_Fw;
                                }
                            }
                            dis.SetDis(jl.ToString());
                            dis.SetFW(items.ZS_Fw);
                            userdis.SetFW(shuzhu[0]);
                            userdis.SetDis(jl.ToString());
                            ListUserIP.Add(gamersend);


                            byte[]    dataMJ     = userdis.Build().ToByteArray();
                            byte[]    datauser   = dis.Build().ToByteArray();
                            AppServer userserver = new AppServer();
                            gamersend.session.Send(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 7091, dataMJ.Length, requestInfo.MessageNum, dataMJ)));
                            gameuser.session.Send(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 7091, datauser.Length, requestInfo.MessageNum, datauser)));
                        }
                        System.Threading.Thread.Sleep(100);
                        byte[] data = senddata.Build().ToByteArray();
                        gamersend.session.Send(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 2005, data.Length, requestInfo.MessageNum, data)));
                        ///如果人数满足,下发游戏开始信息
                        if (mu.Count == rm.room_peo)
                        {
                            //牌局回放保存用户信息
                            rm.gameOperationProcess.SetUserInfo(senddata);
                            foreach (var item in Gongyong.mulist.FindAll(u => u.RoomID == rm.RoomID))
                            {
                                if (!item.ConfirmationStarts)
                                {
                                    rm.startgame = 2;
                                }
                            }
                            rm.startgame = rm.startgame == 2 ? 0 : 1;

                            //ReturnStart startgame = ReturnStart.CreateBuilder().SetStart(1).Build();
                            //byte[] bstart = startgame.ToByteArray();
                            //gamersend.session.TrySend(new ArraySegment<byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 2008, bstart.Length, requestInfo.MessageNum, bstart)));
                        }
                    }

                    if (closeGPS.FWCount > 0)
                    {
                        foreach (mjuser items in mu)
                        {
                            var      dataGPS   = closeGPS.Build().ToByteArray();
                            UserInfo gamersend = Gongyong.userlist.Find(u => u.openid == items.Openid);
                            gamersend.session.Send(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 7097, dataGPS.Length, requestInfo.MessageNum, dataGPS)));
                        }
                    }
                }
            }
            else
            {
                staut = "10001";
            }
            ///判断房间不为空 发生房间信息
            if (rm != null)
            {
                roommsg.SetCount(rm.count)
                .SetIsBenji(rm.is_benji == true ? 1 : 0)
                .SetIsShangxiaji(rm.is_shangxiaji == true ? 1 : 0)
                .SetIsWgj(rm.is_wgj == true ? 1 : 0)
                .SetIsXinqiji(rm.is_xinqiji == true ? 1 : 0)
                .SetIsYikousan(rm.is_yikousan == true ? 1 : 0)
                .SetRoomPeo(rm.room_peo)
                .SetIsLianzhuang(rm.is_lianz == true ? 1 : 0)
                .SetIsYuanque(rm.IsYuanQue ? 1 : 0)
                .SetQuickCard(rm.QuickCard?1:0);
                byte[] roommsgb = roommsg.Build().ToByteArray();


                session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 7003, roommsgb.Length, requestInfo.MessageNum, roommsgb)));
            }



            System.Threading.Thread.Sleep(100);
            nowsend.SetState(int.Parse(staut));

            byte[] datanew = nowsend.Build().ToByteArray();
            session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 2004, datanew.Length, requestInfo.MessageNum, datanew)));

            //如果有玩家距离过近,提醒牌桌所有用户,并接受确认
            if (rm.Is_Jin)
            {
                byte[] jusers = ReturnIsJ.CreateBuilder().SetFWO(rm.Juser1).SetFWW(rm.Juser2).Build().ToByteArray();
                rm.startgame = 0;

                SendRoomAllUser(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 7092, jusers.Length, requestInfo.MessageNum, jusers)), getdata.RoomID);
            }
            List <UserInfo> waringList = new List <UserInfo>();

            //如果有玩家IP一样
            foreach (var item in ListUserIP)
            {
                if (ListUserIP.Where(w => w.UserIP.Equals(item.UserIP)).Count() > 1)
                {
                    waringList.Add(item);
                }
            }
            if (waringList.Count > 1)
            {
                var ipSame = ReturnIPSame.CreateBuilder();
                foreach (var item in ListUserIP)
                {
                    var userInfo = Gongyong.mulist.First(w => w.Openid.Equals(item.openid));
                    if (userInfo != null)
                    {
                        ipSame.AddFW(userInfo.ZS_Fw);
                    }
                }
                var jusers = ipSame.Build().ToByteArray();
                rm.startgame = 0;
                SendRoomAllUser(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 7093, jusers.Length, requestInfo.MessageNum, jusers)), getdata.RoomID);
            }
            rm.gameOperationProcess.SetMessage(roommsg);//牌局回放保存房间信息
            session.Logger.Debug("用户请求加入房间:" + getdata.RoomID + ",openid:" + getdata.Openid + "----------" + DateTime.Now);
            if (rm.startgame == 1)
            {
                //将牌桌信息保存
                RedisUtility.Set <RedisGameRoomInfo>(RedisUtility.GetKey(GameInformationBase.COMMUNITYROOMINFO, rm.RoomID.ToString(), ""),
                                                     new RedisGameRoomInfo {
                    room = rm, ServerName = GameInformationBase.serverName
                });
                foreach (var item in Gongyong.mulist.FindAll(u => u.RoomID == rm.RoomID))
                {
                    if (!item.ConfirmationStarts)
                    {
                        return;
                    }
                }
                session.Logger.Debug("发牌");
                ///查找当前玩家集合
                List <mjuser> mjList = Gongyong.mulist.FindAll(u => u.RoomID == rm.RoomID);

                CardsLogic logic  = new CardsLogic();
                int        number = 0;//发牌次数,从0开始计数

                //根据
                ///获取房主信息
                ///


                string homeownerOpenid = "";
                foreach (var item in mjList)
                {
                    if (item.IsHomeowner)
                    {
                        //如果是房主,记录该房主的openid
                        homeownerOpenid = item.Openid;
                    }
                }


                var roominfodal  = new RoomInfoDAL();
                var createuserid = roominfodal.GetCreateUserIdByRoomId(rm.RoomID);
                //var groupid = roominfodal.GetGroupInfoByGroupID(createuserid);
                var groupid = rm.GroupID;

                //不是圈子用户,直接进行扣费
                if (groupid == 0)
                {
                    RoomCardUtility.ReduceRoomCard(createuserid, (rm.count / 4) * 1);
                }
                else
                {
                    GroupInfoDAL groupInfoDAL      = new GroupInfoDAL();
                    var          creategroupuderid = groupInfoDAL.GetUserIDByGuoupID(groupid);
                    var          reducecount       = (rm.count / 8) * 1;
                    RoomCardUtility.ReduceRoomCard(creategroupuderid, reducecount);

                    ////向日志里面添加朋友圈耗卡信息
                    groupInfoDAL.AddCreateRoomRecord(creategroupuderid, groupid, rm.RoomID, reducecount);
                }

                var dcount = rm.Dcount;
                foreach (var item in mjList)
                {
                    ReturnStartGame.Builder    sendmj        = ReturnStartGame.CreateBuilder();
                    ReturnGang.Builder         ReturnGangMSG = ReturnGang.CreateBuilder();
                    List <model.ServerMaJiang> Ruturnjsmj    = new List <model.ServerMaJiang>();
                    item.paixinfs = 5;
                    Gongyong.mulist.Remove(item);
                    if (rm.IsYuanQue)
                    {
                        item.QYM = 3;
                    }
                    logic.GetMyCards(requestInfo, sendmj, ReturnGangMSG, Ruturnjsmj, session, rm.RoomID, item, item.Openid, ref dcount);
                }
            }
        }
Пример #7
0
        /// <summary>
        /// 叫牌牌型赋值
        /// </summary>
        /// <param name="is_paixin"></param>
        /// <param name="thisuser"></param>
        /// <param name="is_qys"></param>
        private void GetPaiXin(string is_paixin, mjuser thisuser)
        {
            bool is_qys = false;

            ///判断牌型
            if (thisuser.majiangs[thisuser.majiangs.Count - 1].PaiHs - thisuser.majiangs[0].PaiHs < 9 && thisuser.majiangs[0].PaiHs / 10 == thisuser.majiangs[thisuser.majiangs.Count - 1].PaiHs / 10)
            {
                if (thisuser.majiangs[0].PaiHs > 10 && thisuser.majiangs[0].PaiHs < 20)
                {
                    int count = thisuser.Peng.FindAll(u => u.PaiHs < 10 || u.PaiHs > 20).Count;
                    if (!string.IsNullOrEmpty(thisuser.Gong))
                    {
                        string   gang    = thisuser.Gong.Remove(thisuser.Gong.Length - 1, 1);
                        string[] arr     = gang.Split(',');
                        int      panduan = 0;
                        foreach (var item in arr)
                        {
                            string[] newarr = item.Split('|');
                            if (int.Parse(newarr[0]) < 10 || int.Parse(newarr[0]) > 20)
                            {
                                panduan++;
                                is_qys = false;
                                break;
                            }
                        }
                        if (panduan == 0 && count == 0)
                        {
                            is_qys = true;
                        }
                    }
                    else
                    {
                        if (count == 0)
                        {
                            is_qys = true;
                        }
                    }
                }
                else if (thisuser.majiangs[0].PaiHs < 10)
                {
                    int count = thisuser.Peng.FindAll(u => u.PaiHs > 10).Count;
                    if (!string.IsNullOrEmpty(thisuser.Gong))
                    {
                        string   gang    = thisuser.Gong.Remove(thisuser.Gong.Length - 1, 1);
                        string[] arr     = gang.Split(',');
                        int      panduan = 0;
                        foreach (var item in arr)
                        {
                            string[] newarr = item.Split('|');
                            if (int.Parse(newarr[0]) > 10)
                            {
                                panduan++;
                                is_qys = false;
                                break;
                            }
                        }
                        if (panduan == 0 && count == 0)
                        {
                            is_qys = true;
                        }
                    }
                    else
                    {
                        if (count == 0)
                        {
                            is_qys = true;
                        }
                    }
                }
                else
                {
                    int count = thisuser.Peng.FindAll(u => u.PaiHs < 20).Count;
                    if (!string.IsNullOrEmpty(thisuser.Gong))
                    {
                        string   gang    = thisuser.Gong.Remove(thisuser.Gong.Length - 1, 1);
                        string[] arr     = gang.Split(',');
                        int      panduan = 0;
                        foreach (var item in arr)
                        {
                            string[] newarr = item.Split('|');
                            if (int.Parse(newarr[0]) < 20)
                            {
                                panduan++;
                                is_qys = false;
                                break;
                            }
                        }
                        if (panduan == 0 && count == 0)
                        {
                            is_qys = true;
                        }
                    }
                    else
                    {
                        if (count == 0)
                        {
                            is_qys = true;
                        }
                    }
                }
            }
            if (is_paixin != "MJ")
            {
                thisuser.Is_jiao = true;
                switch (is_paixin)
                {
                case "QD":
                    if (is_qys)
                    {
                        thisuser.paixinfs = 6;
                    }
                    else
                    {
                        thisuser.paixinfs = 1;
                    }

                    break;

                case "DDDD":
                    if (is_qys)
                    {
                        thisuser.paixinfs = 7;
                    }
                    else
                    {
                        thisuser.paixinfs = 2;
                    }

                    break;

                case "DD":
                    if (is_qys)
                    {
                        thisuser.paixinfs = 8;
                    }
                    else
                    {
                        thisuser.paixinfs = 3;
                    }

                    break;

                case "LQD":
                    if (is_qys)
                    {
                        thisuser.paixinfs = 9;
                    }
                    else
                    {
                        thisuser.paixinfs = 4;
                    }

                    break;

                case "SP":
                    if (is_qys)
                    {
                        thisuser.paixinfs = 10;
                    }
                    else
                    {
                        thisuser.paixinfs = 5;
                    }

                    break;

                default:
                    break;
                }
            }
            else
            {
                thisuser.Is_tiant = false;
                thisuser.Is_jiao  = false;
                thisuser.paixinfs = 0;
            }
        }
Пример #8
0
        /// <summary>
        /// 出牌
        /// </summary>
        /// <param name="session"></param>
        /// <param name="requestInfo"></param>
        public void ExecuteCommand(GameSession session, ProtobufRequestInfo requestInfo)
        {
            if (!Gongyong.userlist.Any(w => w.session.SessionID.Equals(session.SessionID)))
            {
                session.Logger.Debug("ChuPai : 非法连接");
                session.Close();
                return;
            }

            var    returnmsg = ReturnMsg.CreateBuilder();
            var    PGH       = ReturnAll.CreateBuilder();
            var    chu       = SendCP.ParseFrom(requestInfo.Body);
            mjuser thisuser  = Gongyong.mulist.Find(u => u.RoomID == chu.Roomid && u.Openid == chu.Openid);

            if (thisuser == null)
            {
                return;
            }

            if (thisuser.ByteData == requestInfo.Key)
            {
                return;
            }
            else
            {
                thisuser.ByteData = requestInfo.Key;
            }


            model.ServerMaJiang mj = new model.ServerMaJiang();
            Room r = Gongyong.roomlist.Find(u => u.RoomID == chu.Roomid);

            if (r.room_peo != 4)
            {
                if (Gongyong.mulist.Any(w => w.RoomID == chu.Roomid && w.QYM == 0))
                {
                    thisuser.ByteData = string.Empty;
                    session.Logger.Debug("牌桌玩家没有全部定缺");
                    return;
                }
            }
            if (r.DQcz != "3001")
            {
                session.Logger.Debug("当前操作不是出牌 当前操作为:" + r.DQcz);
                thisuser.ByteData = string.Empty;
                return;
            }
            mj = thisuser.majiangs.Find(u => u.PaiHs == chu.Mj.PaiHS && u.PaiId == chu.Mj.PaiID);

            //mj.PaiHs = chu.Mj.PaiHS;
            //mj.PaiId = chu.Mj.PaiID;
            if (r.DQHY != thisuser.ZS_Fw)
            {
                thisuser.ByteData = string.Empty;
                session.Logger.Debug("不是活跃用户");
                return;
            }
            if (mj == null)
            {
                thisuser.ByteData = string.Empty;
                session.Logger.Debug("用户不存在");
                return;
            }

            if (thisuser.Is_baotin || thisuser.Is_tiant)//报听天听用户必须摸牌打牌。不能换牌
            {
                if (r.LastMoMJ != null && (chu.Mj.PaiHS != r.LastMoMJ.PaiHs || chu.Mj.PaiID != r.LastMoMJ.PaiId))
                {
                    session.Logger.Debug("出牌不是摸到的");
                    thisuser.ByteData = string.Empty;
                    return;
                }
            }
            ThreadUtility.RemoveManagedThread(thisuser.Openid);//当用户操作时 取消用户的倒计时
            r.LastChuMJ = mj;
            thisuser.SendData.Clear();
            thisuser.majiangs.Remove(mj);
            List <model.ServerMaJiang> listmjs = new List <model.ServerMaJiang>();

            listmjs.AddRange(thisuser.majiangs.ToArray());
            //StringBuilder  paidui = new StringBuilder();
            //foreach (var item in r.RoomPai)
            //{
            //    paidui.Append(item.PaiHs + ",");
            //}
            //session.Logger.Error("出牌堆" + paidui);
            string is_paixin = new Ting().GetTing(listmjs);

            thisuser.majiangs.Sort((a, b) => - b.PaiHs.CompareTo(a.PaiHs));
            r.DQcz = "";
            int hStart = 0;//胡牌的数量?
            int hzs_fw = 0;

            GetPaiXin(is_paixin, thisuser);


            int           index    = 0;
            List <mjuser> mjuserss = Gongyong.mulist.FindAll(u => u.RoomID == chu.Roomid);

            session.Logger.Debug("判断放炮");
            List <HuInfo> huList = new List <HuInfo>();//处理一炮多响新增一个胡牌类型对象

            ///判断各种放炮
            foreach (var item in mjuserss)
            {
                HuInfo huInfo = new HuInfo();
                int    Qcount = 0;
                if (r.room_peo < 4)
                {
                    switch (item.QYM)
                    {
                    case 1:
                        if (chu.Mj.PaiHS < 10)
                        {
                            Qcount++;
                        }
                        break;

                    case 2:
                        if (chu.Mj.PaiHS > 10 && chu.Mj.PaiHS < 20)
                        {
                            Qcount++;
                        }
                        break;

                    case 3:
                        if (chu.Mj.PaiHS > 20)
                        {
                            Qcount++;
                        }
                        break;

                    default:
                        break;
                    }
                }
                if (Qcount == 0)
                {
                    if (item.ZS_Fw != thisuser.ZS_Fw)
                    {
                        List <model.ServerMaJiang> listgett = new List <model.ServerMaJiang>();
                        List <model.ServerMaJiang> listnew  = new List <model.ServerMaJiang>();
                        listgett.AddRange(item.majiangs.ToArray());
                        listnew.AddRange(item.majiangs.ToArray());
                        string hxx = new Ting().GetTing(listnew);
                        model.ServerMaJiang mjh = new model.ServerMaJiang()
                        {
                            PaiHs = chu.Mj.PaiHS,
                            PaiId = chu.Mj.PaiID
                        };
                        listgett.Add(mjh);
                        GetPaiXin(hxx, item);
                        if (thisuser.Mtype == 1)
                        {
                            if (new Ting().GetTing(listgett) == "H")
                            {
                                hStart++;
                                index++;
                                hzs_fw = item.ZS_Fw;
                                r.DQHY = item.ZS_Fw;
                                session.Logger.Debug("热炮");
                                huInfo.HuIndex  = item.ZS_Fw;
                                huInfo.HuType   = 4;
                                huInfo.MJ       = mjh;
                                huInfo.OpenID   = item.Openid;
                                huInfo.PaoIndex = thisuser.ZS_Fw;
                                huInfo.RoomID   = r.RoomID;
                                huList.Add(huInfo);
                                r.DQHY = item.ZS_Fw;
                                r.DQcz = "30080";
                                #region 旧热炮
                                //var sendh = SendHu.CreateBuilder();
                                //sendh.SetFWZ(item.ZS_Fw);
                                //sendh.SetFWB(thisuser.ZS_Fw);
                                //sendh.SetType(4);
                                //sendh.SetMJ(chu.Mj);
                                //sendh.SetOpenid(thisuser.Openid);
                                //sendh.SetRoomid(r.RoomID);
                                //byte[] rbyte = sendh.Build().ToByteArray();
                                // r.DQHY = item.ZS_Fw;
                                //  Gongyong.userlist.Find(u => u.openid == item.Openid).session.TrySend(new ArraySegment<byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 5016, rbyte.Length, requestInfo.MessageNum, rbyte)));
                                //int messageNum = (GameInformationBase.BASEAGREEMENTNUMBER + 5016);
                                //热炮必胡,所以需要服务器自己返回胡牌的信息。
                                //new GetH().ExecuteCommand(Gongyong.userlist.Find(u => u.openid == item.Openid).session,
                                //        new ProtobufRequestInfo { Body = rbyte, Key = messageNum.ToString(), Messagelength = rbyte.Length, MessageNum = messageNum, MessageResNum = 0 });

                                // session.Logger.Debug("热炮");
                                //returnmsg.SetMj(chu.Mj);
                                //returnmsg.SetFW(thisuser.ZS_Fw);
                                //byte[] ball = returnmsg.Build().ToByteArray();
                                //foreach (var newitems in mjuserss)
                                //{
                                //    UserInfo user = Gongyong.userlist.Find(u => u.openid == newitems.Openid);
                                //    user.session.TrySend(new ArraySegment<byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 3009, ball.Length, requestInfo.MessageNum, ball)));
                                //}
                                //return;
                                #endregion
                            }
                        }
                        else if ((item.Is_baotin || item.Is_tiant) && !item.IsGuoHu)
                        {
                            if (new Ting().GetTing(listgett) == "H")
                            {
                                hStart++;
                                index++;
                                hzs_fw          = item.ZS_Fw;
                                huInfo.HuIndex  = item.ZS_Fw;
                                huInfo.HuType   = 2;
                                huInfo.MJ       = mjh;
                                huInfo.OpenID   = item.Openid;
                                huInfo.PaoIndex = thisuser.ZS_Fw;
                                huInfo.RoomID   = r.RoomID;
                                huList.Add(huInfo);
                                //var sendh = ReturnHByType.CreateBuilder();
                                //sendh.SetFWZ(item.ZS_Fw);
                                //sendh.SetFWB(thisuser.ZS_Fw);
                                //sendh.SetType(2);
                                //sendh.SetMJ(chu.Mj);
                                //byte[] rbyte = sendh.Build().ToByteArray();
                                //r.DQHY = item.ZS_Fw;
                                //Gongyong.userlist.Find(u => u.openid == item.Openid).session.TrySend(new ArraySegment<byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 5015, rbyte.Length, requestInfo.MessageNum, rbyte)));

                                r.DQHY = item.ZS_Fw;
                                r.DQcz = "30080";
                                session.Logger.Debug("报听放炮");
                            }
                        }
                        #region 旧代码
                        //}

                        //if (item.ZS_Fw != thisuser.ZS_Fw)
                        //{
                        //if ((hxx == "QD" || hxx == "DD" || hxx == "DDDD" || hxx == "LQD")&& !item.IsGuoHu)
                        //{
                        //    if (item.ZS_Fw != thisuser.ZS_Fw)
                        //    {
                        //        if (new Ting().GetTing(listgett) == "H")
                        //        {

                        //            hStart++;
                        //            index++;


                        //            hzs_fw = item.ZS_Fw;
                        //            var sendh = ReturnHByType.CreateBuilder();
                        //            //sendh.SetFWZ(item.ZS_Fw);
                        //            //sendh.SetFWB(thisuser.ZS_Fw);
                        //            //sendh.SetType(2);
                        //            //sendh.SetMJ(chu.Mj);
                        //            //r.DQHY = item.ZS_Fw;
                        //            //byte[] rbyte = sendh.Build().ToByteArray();
                        //            //Gongyong.userlist.Find(u => u.openid == item.Openid).session.TrySend(new ArraySegment<byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 5015, rbyte.Length, requestInfo.MessageNum, rbyte)));
                        //            huInfo.HuIndex = item.ZS_Fw;
                        //            huInfo.HuType =2;
                        //            huInfo.MJ = mjh;
                        //            huInfo.OpenID = item.Openid;
                        //            huInfo.PaoIndex = thisuser.ZS_Fw;
                        //            huInfo.RoomID = r.RoomID;
                        //            huList.Add(huInfo);
                        //            session.Logger.Debug("大牌"+ hxx+"牌"+ chu.Mj.PaiHS);
                        //        }
                        //    }

                        //}
                        //}


                        //if (item.ZS_Fw
                        #endregion != thisuser.ZS_Fw)
                        //{
                        else if ((!string.IsNullOrEmpty(item.Gong)) && !item.IsGuoHu)
                        {
                            if (new Ting().GetTing(listgett) == "H")
                            {
                                hStart++;
                                index++;
                                hzs_fw = item.ZS_Fw;
                                var sendh = ReturnHByType.CreateBuilder();
                                //sendh.SetFWZ(item.ZS_Fw);
                                //sendh.SetFWB(thisuser.ZS_Fw);
                                //sendh.SetType(2);
                                //sendh.SetMJ(chu.Mj);
                                //r.DQHY = item.ZS_Fw;
                                //byte[] rbyte = sendh.Build().ToByteArray();
                                //Gongyong.userlist.Find(u => u.openid == item.Openid).session.TrySend(new ArraySegment<byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 5015, rbyte.Length, requestInfo.MessageNum, rbyte)));
                                huInfo.HuIndex  = item.ZS_Fw;
                                huInfo.HuType   = 2;
                                huInfo.MJ       = mjh;
                                huInfo.OpenID   = item.Openid;
                                huInfo.PaoIndex = thisuser.ZS_Fw;
                                huInfo.RoomID   = r.RoomID;
                                huList.Add(huInfo);
                                r.DQHY = item.ZS_Fw;
                                r.DQcz = "30080";
                                session.Logger.Debug("有杠" + hxx + "牌" + chu.Mj.PaiHS);
                            }
                        }
                        //}


                        //if (item.ZS_Fw != thisuser.ZS_Fw)
                        //{

                        else if ((item.paixinfs != 5 && item.paixinfs != 0) && !item.IsGuoHu)
                        {
                            var newlist = new List <model.ServerMaJiang>();
                            newlist.AddRange(listgett);
                            Ting t = new Ting();
                            if (t.GetTing(listgett) == "H")
                            {
                                hxx = t.GetHPaiPaiXin(newlist, item.Peng.GroupBy(w => w.PaiHs).Count(), string.IsNullOrEmpty(item.Gong) ? 0 : item.Gong.Split(',').Length, chu.Mj.PaiHS);
                                t.GetPaiXin(hxx, item);
                                if (item.paixinfs != 5 && item.paixinfs != 0)
                                {
                                    hStart++;
                                    index++;
                                    hzs_fw          = item.ZS_Fw;
                                    huInfo.HuIndex  = item.ZS_Fw;
                                    huInfo.HuType   = 2;
                                    huInfo.MJ       = mjh;
                                    huInfo.OpenID   = item.Openid;
                                    huInfo.PaoIndex = thisuser.ZS_Fw;
                                    huInfo.RoomID   = r.RoomID;
                                    huList.Add(huInfo);
                                    r.DQHY = item.ZS_Fw;
                                    r.DQcz = "30080";
                                    session.Logger.Debug("胡牌" + hxx + "牌" + chu.Mj.PaiHS);
                                }
                            }
                        }
                        if (huList.Count == 0 || huList[0].HuType != 4)//热炮不能有碰
                        {
                            //}

                            //if (item.ZS_Fw != thisuser.ZS_Fw)
                            //{
                            UserInfo userp = Gongyong.userlist.Find(u => u.openid == item.Openid);
                            List <model.ServerMaJiang> UmjList = item.majiangs.FindAll(u => u.PaiHs == mj.PaiHs);
                            if (item.Is_tiant || item.Is_baotin)//天听或者报听 不能有碰杠牌
                            {
                            }
                            else
                            {
                                if (UmjList.Count >= 2)
                                {
                                    index++;
                                    PGH.SetPeng(1);
                                    PGH.SetFw(thisuser.ZS_Fw);
                                    PGH.SetMj(chu.Mj);
                                    byte[] xia = PGH.Build().ToByteArray();
                                    if (huList.Count > 0 && hzs_fw != item.ZS_Fw)
                                    {
                                        RoomMsgWirte msgri = new RoomMsgWirte()
                                        {
                                            openid    = item.Openid,
                                            xiaoxihao = 3008,
                                            ArrList   = xia,
                                            roomid    = r.RoomID,
                                            operating = "30081" + "," + thisuser.ZS_Fw
                                        };
                                        Gongyong.roommsg.Add(msgri);
                                    }
                                    else
                                    {
                                        item.SendData.Add(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 3008, xia.Length, requestInfo.MessageNum, xia)));

                                        r.DQHY    = item.ZS_Fw;
                                        r.DQcz    = "30081" + "," + thisuser.ZS_Fw;
                                        r.PaiHSCZ = mj;
                                        userp.session.TrySend(item.SendData);
                                        session.Logger.Debug("方位------" + item.ZS_Fw + "--碰--" + chu.Mj.PaiHS);
                                    }
                                }
                                if (UmjList.Count == 3)
                                {
                                    index++;

                                    var returngang = GangMSG.CreateBuilder();
                                    returngang.SetFw(thisuser.ZS_Fw);
                                    returngang.SetMj(chu.Mj);
                                    returngang.SetType(1);

                                    byte[] xia = ReturnGang.CreateBuilder().AddGang(returngang).Build().ToByteArray();
                                    if (huList.Count > 0 && hzs_fw != item.ZS_Fw)
                                    {
                                        RoomMsgWirte msgri = new RoomMsgWirte()
                                        {
                                            ArrList   = xia,
                                            xiaoxihao = 5022,
                                            openid    = item.Openid,
                                            roomid    = r.RoomID,
                                            operating = "30082,1" + "," + thisuser.ZS_Fw
                                        };
                                        Gongyong.roommsg.Add(msgri);
                                    }
                                    else
                                    {
                                        item.SendData.Add(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 5022, xia.Length, requestInfo.MessageNum, xia)));

                                        r.DQHY    = item.ZS_Fw;
                                        r.DQcz    = "30082,1" + "," + thisuser.ZS_Fw;
                                        r.PaiHSCZ = mj;
                                        userp.session.TrySend(item.SendData);
                                        session.Logger.Debug("方位------" + item.ZS_Fw + "--杠--" + chu.Mj.PaiHS);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            if (huList.Count > 0)
            {
                r.Is_Hu = true;
                session.Logger.Debug(huList);
                if (huList.Count > 1 || huList[0].HuType == 4)
                {
                    var sendh = SendHu.CreateBuilder();
                    foreach (var item in huList)
                    {
                        if (!sendh.HasFWZ)
                        {
                            sendh.SetFWZ(item.HuIndex);
                        }
                        if (!sendh.HasFWB)
                        {
                            sendh.SetFWB(item.PaoIndex);
                        }
                        sendh.SetType(item.HuType);
                        sendh.SetMJ(chu.Mj);
                        if (!sendh.HasOpenid)
                        {
                            sendh.SetOpenid(item.OpenID);
                        }
                        if (!sendh.HasRoomid)
                        {
                            sendh.SetRoomid(r.RoomID);
                        }
                        sendh.AddDXInfo(DuoXiangHu.CreateBuilder().SetDXFW(item.HuIndex).SetDXType(item.HuType));
                    }
                    byte[] rbyte = sendh.Build().ToByteArray();
                    //Gongyong.userlist.Find(u => u.openid == item.Openid).session.TrySend(new ArraySegment<byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 5016, rbyte.Length, requestInfo.MessageNum, rbyte)));
                    int messageNum = (GameInformationBase.BASEAGREEMENTNUMBER + 5016);
                    //热炮必胡,所以需要服务器自己返回胡牌的信息。
                    new GetH().ExecuteCommand(Gongyong.userlist.Find(u => u.openid == huList[0].OpenID).session,
                                              new ProtobufRequestInfo {
                        Body = rbyte, Key = messageNum.ToString(), Messagelength = rbyte.Length, MessageNum = messageNum, MessageResNum = 0
                    });
                    return;
                }
                else
                {
                    var sendh = ReturnHByType.CreateBuilder();
                    sendh.SetFWZ(huList[0].HuIndex);
                    sendh.SetFWB(huList[0].PaoIndex);
                    sendh.SetType(huList[0].HuType);
                    sendh.SetMJ(chu.Mj);
                    r.DQHY = huList[0].HuIndex;
                    byte[] rbyte    = sendh.Build().ToByteArray();
                    var    sendData = new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 5015, rbyte.Length, requestInfo.MessageNum, rbyte));
                    mjuserss.Find(w => w.Openid.Equals(huList[0].OpenID)).SendData.Add(sendData);
                    Gongyong.userlist.Find(u => u.openid == huList[0].OpenID).session.TrySend(sendData);
                }
            }
            else
            {
                r.Is_Hu = false;
            }
            thisuser.chuda.Add(mj);
            thisuser.Mtype = 0;//不将自己的摸牌类型修改 会导致碰牌后的出牌也被判断成热炮

            ///下发出的牌
            if (index > 0)
            {
                returnmsg.SetMj(chu.Mj);
                returnmsg.SetFW(thisuser.ZS_Fw);
                byte[] ball = returnmsg.Build().ToByteArray();
                foreach (var newitems in mjuserss)
                {
                    UserInfo user = Gongyong.userlist.Find(u => u.openid == newitems.Openid);
                    user.session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 3009, ball.Length, requestInfo.MessageNum, ball)));
                }
                //牌局回放
                r.gameOperationProcess.AddGameOperationInfo(
                    GameOperationInfo.CreateBuilder()
                    .SetSerialNumber(r.gameOperationProcess.GameOperationInfoCount)
                    .SetOperationFW(thisuser.ZS_Fw)
                    .SetOperationType(2)
                    .AddMJ(chu.Mj)
                    );
            }

            ///下发冲锋鸡消息
            if (index == 0)
            {
                if (mj.PaiHs == 8 && r.is_wgj)
                {
                    int wgjc = 0;
                    foreach (var item in mjuserss)
                    {
                        int Pcount = item.Peng.FindAll(u => u.PaiHs == 8).Count;

                        int Ccount = item.chuda.FindAll(u => u.PaiHs == 8).Count;
                        if (item.ZS_Fw == thisuser.ZS_Fw)
                        {
                            Ccount = Ccount - 1;
                        }
                        if (!string.IsNullOrEmpty(item.Gong))
                        {
                            item.Gong.Remove(item.Gong.Length - 1, 1);
                            string[] G = item.Gong.Split(',');
                            foreach (var items in G)
                            {
                                string[] GOne = items.Split('|');
                                if (GOne[0] == "8")
                                {
                                    wgjc++;
                                }
                            }
                        }
                        if (Pcount > 0 || Ccount > 0)
                        {
                            wgjc++;
                        }
                    }
                    if (wgjc == 0)
                    {
                        thisuser.is_cfwg = true;
                        returnmsg.SetMsg("CFWG");
                    }
                    else
                    {
                        returnmsg.SetMsg("");
                    }
                }

                if (mj.PaiHs == 11)
                {
                    int cfjc = 0;
                    foreach (var item in mjuserss)
                    {
                        int Pcount = item.Peng.FindAll(u => u.PaiHs == 11).Count;
                        int Ccount = item.chuda.FindAll(u => u.PaiHs == 11).Count;
                        if (item.ZS_Fw == thisuser.ZS_Fw)
                        {
                            Ccount = Ccount - 1;
                        }
                        if (!string.IsNullOrEmpty(item.Gong))
                        {
                            item.Gong.Remove(item.Gong.Length - 1, 1);
                            string[] G = item.Gong.Split(',');
                            foreach (var items in G)
                            {
                                string[] GOne = items.Split('|');
                                if (GOne[0] == "11")
                                {
                                    cfjc++;
                                }
                            }
                        }
                        if (Pcount > 0 || Ccount > 0)
                        {
                            cfjc++;
                        }
                    }
                    if (cfjc == 0)
                    {
                        thisuser.Is_cfj = true;
                        returnmsg.SetMsg("CFJ");
                    }
                    else
                    {
                        returnmsg.SetMsg("");
                    }
                }

                returnmsg.SetMj(chu.Mj);
                returnmsg.SetFW(thisuser.ZS_Fw);
                byte[] ball = returnmsg.Build().ToByteArray();

                var paiCount = ReturnPaiCount.CreateBuilder();
                if (r.RoomPai.Count == 108)
                {
                    switch (r.room_peo)
                    {
                    case 2:
                        if (r.RoomPai.Count == 108)
                        {
                            paiCount.SetPaiCount(81);
                        }
                        break;

                    case 3:
                        if (r.RoomPai.Count == 108)
                        {
                            paiCount.SetPaiCount(68);
                        }
                        break;

                    case 4:
                        if (r.RoomPai.Count == 108)
                        {
                            paiCount.SetPaiCount(55);
                        }
                        break;

                    default:
                        break;
                    }
                }
                else
                {
                    paiCount.SetPaiCount(r.RoomPai.Count);
                }

                byte[] returnPaiCount = paiCount.Build().ToByteArray();
                var    sby            = ReturnHyUser.CreateBuilder();
                foreach (var items in mjuserss)
                {
                    UserInfo user    = Gongyong.userlist.Find(u => u.openid == items.Openid);
                    bool     is_send = user.session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 3009, ball.Length, requestInfo.MessageNum, ball)));
                    PGH.SetMo(1);
                    // user.session.TrySend(new ArraySegment<byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 7006, returnPaiCount.Length, requestInfo.MessageNum, returnPaiCount)));

                    //if (is_send)
                    //{
                    //   session.Logger.Debug("方位------" + items.ZS_Fw + "--发送成功-- 3009");
                    //}
                    //else
                    //{
                    //   session.Logger.Debug("方位------" + items.ZS_Fw + "--发送失败-- 3009");
                    //}
                    session.Logger.Debug("方位------" + items.ZS_Fw + "--发送-- 3009" + "牌" + chu.Mj.PaiHS);

                    if (thisuser.ZS_Fw == r.room_peo)
                    {
                        if (items.ZS_Fw == 1)
                        {
                            PGH.SetFw(items.ZS_Fw);
                            items.Mtype = 0;
                            byte[] xia = PGH.Build().ToByteArray();
                            items.SendData.Add(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 3008, xia.Length, requestInfo.MessageNum, xia)));
                            user.session.TrySend(items.SendData);
                            r.DQHY = items.ZS_Fw;
                            r.DQcz = "30083";
                            session.Logger.Debug("方位------" + items.ZS_Fw + "--摸牌--");
                        }
                    }
                    else
                    {
                        if (items.ZS_Fw == thisuser.ZS_Fw + 1)
                        {
                            PGH.SetFw(items.ZS_Fw);
                            items.Mtype = 0;
                            byte[] xia = PGH.Build().ToByteArray();
                            items.SendData.Add(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 3008, xia.Length, requestInfo.MessageNum, xia)));
                            user.session.TrySend(items.SendData);
                            r.DQHY = items.ZS_Fw;
                            r.DQcz = "30083";
                            session.Logger.Debug("方位------" + items.ZS_Fw + "--摸牌-- ");
                        }
                    }


                    #region 旧摸牌

                    /* if (thisuser.ZS_Fw == 4)
                     * {
                     *   if (items.ZS_Fw == 1)
                     *   {
                     *       PGH.SetFw(items.ZS_Fw);
                     *       byte[] xia = PGH.Build().ToByteArray();
                     *
                     *       r.DQHY = items.ZS_Fw;
                     *       r.DQcz = "30083";
                     *       user.session.TrySend(new ArraySegment<byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 3008, xia.Length, requestInfo.MessageNum, xia)));
                     *   }
                     * }
                     * else
                     * {
                     *   if (hStart == 0)
                     *   {
                     *       if (r.room_peo == 2)
                     *       {
                     *           if (thisuser.ZS_Fw == 2 || items.ZS_Fw - 1 == thisuser.ZS_Fw)
                     *           {
                     *
                     *               if (items.ZS_Fw != thisuser.ZS_Fw)
                     *               {
                     *                   PGH.SetFw(items.ZS_Fw);
                     *                   items.Mtype = 0;
                     *                   byte[] xia = PGH.Build().ToByteArray();
                     *                   items.SendData.Add(new ArraySegment<byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 3008, xia.Length, requestInfo.MessageNum, xia)));
                     *                   user.session.TrySend(items.SendData);
                     *                   r.DQHY = items.ZS_Fw;
                     *                   r.DQcz = "30083";
                     *                   session.Logger.Debug("方位------" + thisuser.ZS_Fw + "--出--" + chu.Mj.PaiHS);
                     *               }
                     *
                     *           }
                     *       }
                     *       else if (r.room_peo == 3)
                     *       {
                     *           if (thisuser.ZS_Fw == 3)
                     *           {
                     *               if (items.ZS_Fw == 1)
                     *               {
                     *                   PGH.SetFw(items.ZS_Fw);
                     *                   byte[] xia = PGH.Build().ToByteArray();
                     *                   r.DQHY = items.ZS_Fw;
                     *                   r.DQcz = "30083";
                     *                   items.Mtype = 0;
                     *                   items.SendData.Add(new ArraySegment<byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 3008, xia.Length, requestInfo.MessageNum, xia)));
                     *                   user.session.TrySend(items.SendData);
                     *               }
                     *           }
                     *           else
                     *           {
                     *               if (items.ZS_Fw - 1 == thisuser.ZS_Fw)
                     *               {
                     *                   PGH.SetFw(items.ZS_Fw);
                     *                   byte[] xia = PGH.Build().ToByteArray();
                     *                   r.DQHY = items.ZS_Fw;
                     *                   r.DQcz = "30083";
                     *                   items.Mtype = 0;
                     *                   items.SendData.Add(new ArraySegment<byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 3008, xia.Length, requestInfo.MessageNum, xia)));
                     *                   user.session.TrySend(items.SendData);
                     *               }
                     *           }
                     *       }
                     *       else
                     *       {
                     *           if (thisuser.ZS_Fw == 4)
                     *           {
                     *               if (items.ZS_Fw == 1)
                     *               {
                     *                   PGH.SetFw(items.ZS_Fw);
                     *                   byte[] xia = PGH.Build().ToByteArray();
                     *                   r.DQHY = items.ZS_Fw;
                     *                   r.DQcz = "30083";
                     *                   items.Mtype = 0;
                     *                   items.SendData.Add(new ArraySegment<byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 3008, xia.Length, requestInfo.MessageNum, xia)));
                     *                   user.session.TrySend(items.SendData);
                     *               }
                     *           }
                     *           else
                     *           {
                     *               if (items.ZS_Fw - 1 == thisuser.ZS_Fw)
                     *               {
                     *                   PGH.SetFw(items.ZS_Fw);
                     *                   byte[] xia = PGH.Build().ToByteArray();
                     *                   r.DQHY = items.ZS_Fw;
                     *                   r.DQcz = "30083";
                     *                   items.Mtype = 0;
                     *                   items.SendData.Add(new ArraySegment<byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 3008, xia.Length, requestInfo.MessageNum, xia)));
                     *                   user.session.TrySend(items.SendData);
                     *               }
                     *           }
                     *       }
                     *   }
                     * } */
                    #endregion
                }

                //牌局回放 出牌
                r.gameOperationProcess.AddGameOperationInfo(
                    GameOperationInfo.CreateBuilder()
                    .SetSerialNumber(r.gameOperationProcess.GameOperationInfoCount)
                    .SetOperationFW(thisuser.ZS_Fw)
                    .SetOperationType(2)
                    .AddMJ(chu.Mj)
                    .SetMJType(returnmsg.Msg)
                    );
                // Thread.Sleep(100);
                sby.SetFw(r.DQHY);

                sby.SetCz(r.DQcz);
                byte[] hybyte = sby.Build().ToByteArray();

                foreach (var item in mjuserss)
                {
                    UserInfo user = Gongyong.userlist.Find(u => u.openid == item.Openid);
                    user.IsActive = true;
                    user.session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 7004, hybyte.Length, requestInfo.MessageNum, hybyte)));
                }
            }
            ThreadUtility.StartManagedThread(Gongyong.mulist.Find(w => w.ZS_Fw == r.DQHY && w.RoomID == r.RoomID).Openid, r.RoomID, r.DQcz);
        }
Пример #9
0
        // public string Name => "CreateRoom";

        public void ExecuteCommand(GameSession session, ProtobufRequestInfo requestInfo)
        {
            if (!Gongyong.userlist.Any(w => w.session.SessionID.Equals(session.SessionID)))
            {
                session.Logger.Debug("CreateRoom : 非法连接");
                session.Close();
                return;
            }
            session.Logger.Debug("创建sssionID--------" + session.SessionID);

            var info = SendCreateRoom.ParseFrom(requestInfo.Body);
            ///当前用户信息
            UserInfo user = Gongyong.userlist.Find(u => u.openid.Equals(info.Openid));

            if (user == null)
            {
                session.Logger.Debug("CREATEROOM user == nulll");
                session.Close();
                return;
            }
            if (Gongyong.mulist.Any(w => w.Openid.Equals(info.Openid)))
            {
                var muInfo = Gongyong.mulist.Find(w => w.Openid.Equals(info.Openid));
                if (Gongyong.roomlist.Any(w => w.RoomID == muInfo.RoomID))
                {
                    // ReturnServerIP.CreateBuilder().SetIp
                }
                else
                {
                    Gongyong.mulist.Remove(muInfo);
                }
            }
            ///更具房间信息创建房间
            int roomid = GetRoomID();

            if (info.Count != 8 && info.Count != 16 && info.Count != 32)
            {
                return;
            }
            Room room = new Room()
            {
                count = info.Count,
                //count = 1,
                is_benji      = info.IsBenji == 1 ? true : false,
                is_wgj        = info.IsWgj == 1 ? true : false,
                is_xinqiji    = info.IsXinqiji == 1 ? true : false,
                is_yikousan   = info.IsYikousan == 1 ? true : false,
                is_shangxiaji = info.IsShangxiaji == 1 ? true : false,
                room_peo      = info.RoomPeo,
                Dcount        = 1,
                RoomID        = roomid,
                GroupID       = info.GroupID,
                startgame     = 0,
                is_lianz      = info.IsYikousan == 3 ? true : false,
                CreateDate    = DateTime.Now,
                IsYuanQue     = info.HasRoomPeo ? (info.RoomPeo == 4 ? false : (info.HasIsYuanque ? info.IsYuanque == 1 : false)) : false, //如果是4人桌 不能是原缺。
                QuickCard     = info.HasQuickCard ? (info.QuickCard == 1) : false                                                          //十秒快速出牌
                                                                                                                                           // RoomPai = new CreateMj().CreateMJ()
            };

            //Console.WriteLine("roomid : " + roomid);
            try
            {
                new RoomInfoDAL().Add(CardsLogic.SetRoomInfoTb(room, user.UserID), info.GroupID);
            }
            catch (Exception ex)
            {
                session.Logger.Error(ex);
            }
            Gongyong.roomlist.Add(room);

            user.Lat = info.Latitude;

            //将用户游戏信息更新
            RedisUtility.Set <RedisGameModel>(RedisUtility.GetKey(GameInformationBase.COMMUNITYUSERGAME, user.openid, user.unionid),
                                              new RedisGameModel {
                Openid = user.openid, RoomID = roomid, ServerName = GameInformationBase.serverName, Unionid = user.unionid
            });
            //将牌桌信息保存
            RedisUtility.Set <RedisGameRoomInfo>(RedisUtility.GetKey(GameInformationBase.COMMUNITYROOMINFO, roomid.ToString(), ""),
                                                 new RedisGameRoomInfo {
                room = room, ServerName = GameInformationBase.serverName
            });


            ///麻将玩家操作类
            mjuser mu = new mjuser()
            {
                ZS_Fw              = 1,
                Openid             = user.openid,
                RoomID             = roomid,
                SendData           = new List <ArraySegment <byte> >(),
                ConfirmationStarts = true,
                IsGuoHu            = false
            };

            Gongyong.mulist.Add(mu);


            if (mu.ByteData == requestInfo.Key)
            {
                return;
            }
            else
            {
                mu.ByteData = requestInfo.Key;
            }
            mu.IsHomeowner = true;
            ///当前返回用户信息
            Userinfo uinfo = Userinfo.CreateBuilder().SetHeadimg(user.headimg).SetNickname(user.nickname).SetOpenid(user.openid).SetSex(int.Parse(user.sex)).SetUserFW(1).SetUserBean(0).SetUserGold(0).SetUserID(user.UserID).SetUserIP(user.UserIP).Build();
            ///返回数值
            ReturnCreateRoom cr = ReturnCreateRoom.CreateBuilder().SetRoomID(roomid).SetUserinfo(uinfo).Build();

            byte[] data = cr.ToByteArray();
            session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 2002, data.Length, requestInfo.MessageNum, data)));

            var roommsg = ReturnRoomMsg.CreateBuilder();

            roommsg.SetCount(room.count).SetIsBenji(room.is_benji ? 1 : 0)
            .SetIsShangxiaji(room.is_shangxiaji ? 1 : 0)
            .SetIsWgj(room.is_wgj ? 1 : 0)
            .SetIsXinqiji(room.is_xinqiji ? 1 : 0)
            .SetIsYikousan(room.is_yikousan ? 1 : 0).SetRoomPeo(room.room_peo)
            .SetIsLianzhuang(room.is_lianz ? 1 : 0)
            .SetIsYuanque(room.IsYuanQue ? 1 : 0)
            .SetQuickCard(room.QuickCard ? 1 : 0)
            ;
            byte[] roommsgb = roommsg.Build().ToByteArray();
            session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 7003, roommsgb.Length, requestInfo.MessageNum, roommsgb)));
            session.Logger.Debug("参数data" + cr + "----------" + DateTime.Now);
            session.Logger.Debug("当前用户创建房间----" + roomid + "------" + DateTime.Now);
        }
Пример #10
0
        public void ExecuteCommand(GameSession session, ProtobufRequestInfo requestInfo)
        {
            System.Net.IPEndPoint clientipe = (System.Net.IPEndPoint)session.RemoteEndPoint;

            MsgLog msglog = new MsgLog();

            session.Logger.Debug("登陆sssionID--------" + session.SessionID);

            string fileName = string.Empty; //文件名
            string headImg  = string.Empty; //头像图片

            session.Logger.Debug("登录游戏----------" + DateTime.Now);
            var        userinfo  = SendLogin.ParseFrom(requestInfo.Body);
            mjuserinfo usermodel = new mjuserinfo();

            mjuserinfo model = new mjuserinfo()
            {
                nickname = HttpUtility.UrlEncode(userinfo.Nickname),
                openid   = userinfo.Openid,
                city     = userinfo.City,
                headimg  = userinfo.Headimg,
                province = userinfo.Province,
                unionid  = userinfo.Unionid,
                sex      = int.Parse(userinfo.Sex)
            };

            usermodel = AddUser(model, session);



            session.Logger.Debug("登录用户openid:" + userinfo.Openid + "|昵称:" + userinfo.Nickname + "----------" + DateTime.Now);
            UserInfo olduser = Gongyong.userlist.Find(u => u.openid == userinfo.Openid);

            if (olduser == null)
            {
                UserInfo user = new UserInfo()
                {
                    city = userinfo.City,
                    //判断图片是否保存至图片服务器,保存相应头像地址
                    headimg  = usermodel.headimg,
                    nickname = userinfo.Nickname,
                    openid   = userinfo.Openid,
                    province = userinfo.Province,
                    session  = session,
                    sex      = userinfo.Sex,
                    unionid  = userinfo.Unionid,
                    Lat      = userinfo.Latitude,
                    UserID   = int.Parse(usermodel.id.ToString()),
                    UserIP   = clientipe.Address.ToString()
                };
                Gongyong.userlist.Add(user);
                ReturnLogin log = ReturnLogin.CreateBuilder().SetLoginstat(1).SetUserID(int.Parse(usermodel.id.ToString())).Build();
                byte[]      msg = log.ToByteArray();

                session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 1002, msg.Length, requestInfo.MessageNum, msg)));


                session.Logger.Debug("登录游戏成功----------" + DateTime.Now);
            }
            else
            {
                if (olduser.session.Connected)
                {
                    ReturnLogin log = ReturnLogin.CreateBuilder().SetLoginstat(2).SetUserID(int.Parse(usermodel.id.ToString())).Build();
                    byte[]      msg = log.ToByteArray();

                    session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 1002, msg.Length, requestInfo.MessageNum, msg)));

                    session.Logger.Debug("登录游戏失败,当前对象存在----------" + DateTime.Now);
                    session.Logger.Debug("sssionID--------" + session.SessionID);
                }
                else
                {
                    mjuser mju = Gongyong.mulist.Find(u => u.Openid == userinfo.Openid);
                    if (mju != null)
                    {
                        SendCL(session, userinfo.Openid, requestInfo);
                    }


                    olduser.session = session;
                    ReturnLogin log = ReturnLogin.CreateBuilder().SetLoginstat(1).SetUserID(int.Parse(usermodel.id.ToString())).Build();
                    byte[]      msg = log.ToByteArray();
                    session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 1002, msg.Length, requestInfo.MessageNum, msg)));
                    session.Logger.Debug("登录游戏成功,当前对象存在----------" + DateTime.Now);
                }
            }
        }
Пример #11
0
        public void ExecuteCommand(GameSession session, ProtobufRequestInfo requestInfo)
        {
            if (!Gongyong.userlist.Any(w => w.session.SessionID.Equals(session.SessionID)))
            {
                session.Logger.Debug("ConnData : 非法连接");
                session.Close();
                return;
            }
            var getinfo = SendConnData.ParseFrom(requestInfo.Body);

            var userInfo = Gongyong.userlist.Find(u => u.openid == getinfo.Openid);

            if (userInfo == null)
            {
                session.Close();
            }
            userInfo.session = session;

            mjuser mj = Gongyong.mulist.Find(u => u.Openid == getinfo.Openid);

            if (mj == null)
            {
                return;
            }
            List <mjuser> mjlist  = Gongyong.mulist.FindAll(u => u.RoomID == mj.RoomID);
            var           roommsg = ReturnRoomMsg.CreateBuilder();

            Room rm = Gongyong.roomlist.Find(u => u.RoomID == mj.RoomID);

            if (rm == null)
            {
                return;
            }
            var userinfo = Userinfo.CreateBuilder();
            ///返回重连状态
            //  var ifconn = ReturnRecon.CreateBuilder().SetState(1).Build();
            ///返回房间用户信息
            var userinfobyroom = ReturnUserInfo.CreateBuilder();
            var mjhy           = MaJiang.CreateBuilder();
            var hyyh           = ReturnHyUser.CreateBuilder();

            if (!string.IsNullOrEmpty(rm.DQHY.ToString()))
            {
                hyyh.SetFw(rm.DQHY);
            }
            else
            {
                hyyh.SetFw(0);
            }


            if (!string.IsNullOrEmpty(rm.DQcz))
            {
                hyyh.SetCz(rm.DQcz);
            }
            else
            {
                hyyh.SetCz("");
            }

            if (rm.PaiHSCZ != null)
            {
                mjhy.SetPaiID(rm.PaiHSCZ.PaiId);
                mjhy.SetPaiHS(rm.PaiHSCZ.PaiHs);
            }
            else
            {
                mjhy.SetPaiID(0);
                mjhy.SetPaiHS(0);
            }
            hyyh.SetMj(mjhy);

            var         returndata   = ReturnConnData.CreateBuilder();
            List <byte> returnzhuang = new List <byte>();
            List <model.ServerMaJiang> Ruturnjsmj = new List <model.ServerMaJiang>();
            int myFW = 0;

            foreach (mjuser mjuseritem in mjlist)
            {
                var MJ = MaJiang.CreateBuilder();
                ///手牌集合
                var shoupai = UserShou.CreateBuilder();
                //碰牌集合
                var pengpai = UserPeng.CreateBuilder();
                ///出牌集合
                var chupai = UserChu.CreateBuilder();
                ///杠
                var gangpai = UserGang.CreateBuilder();


                var userzrj = JpConn.CreateBuilder();
                userzrj.SetFW(mjuseritem.ZS_Fw);
                if (mjuseritem.Is_cfj == true)
                {
                    userzrj.SetCFJ(1);
                }

                if (mjuseritem.Is_zrj == -1)
                {
                    userzrj.SetCFJ(2);
                }


                if (mjuseritem.is_cfwg == true)
                {
                    userzrj.SetWGJ(1);
                }

                if (mjuseritem.is_zrwg == -1)
                {
                    userzrj.SetWGJ(2);
                }

                /**********************返回房间用户信息************************************************/
                UserInfo user = Gongyong.userlist.Find(u => u.openid == mjuseritem.Openid);
                userinfo.SetOpenid(user.openid);
                userinfo.SetNickname(user.nickname);
                userinfo.SetHeadimg(user.headimg);
                userinfo.SetSex(int.Parse(user.sex));
                userinfo.SetUserBean(0);
                userinfo.SetUserGold(0);
                userinfo.SetUserFW(mjuseritem.ZS_Fw);
                userinfo.SetUserID(user.UserID);
                CardUser card = Gongyong.FKUser.Find(u => u.roomid == mjuseritem.RoomID);
                if (card != null)
                {
                    userinfo.SetCumulativeScore(card.GetScoreByPosition(mjuseritem.ZS_Fw));
                    //if (returnzhuang.Count == 0)
                    //    returnzhuang.AddRange(ReturnZhuang.CreateBuilder().SetZhuang(card.win).Build().ToByteArray());
                    if (!returndata.HasZhuang)
                    {
                        returndata.SetZhuang(ReturnZhuang.CreateBuilder().SetZhuang(card.win).SetSeizi(card.Points).SetZhuangCount(card.lianzCount));
                    }
                    shoupai.SetScare(card.GetScoreByPosition(mjuseritem.ZS_Fw));
                }
                else
                {
                    shoupai.SetScare(0);
                }
                userinfobyroom.AddUserinfo(userinfo);
                /***********************返回手牌集合***************************************/
                // int paicount = 0;
                if (mjuseritem.Openid == getinfo.Openid)
                {
                    //foreach (var item in mjuseritem.majiangs)
                    //{
                    //    paicount++;
                    //    MJ.SetPaiHS(item.PaiHs);
                    //    MJ.SetPaiID(item.PaiId);
                    //    shoupai.AddMj(MJ);
                    //}
                    myFW = mjuseritem.ZS_Fw;
                    shoupai.AddRangeMj(mjuseritem.majiangs.Select(w => MaJiang.CreateBuilder().SetPaiHS(w.PaiHs).SetPaiID(w.PaiId).Build()));
                    List <model.ServerMaJiang> majongList = new List <model.ServerMaJiang>();
                    majongList.AddRange(mjuseritem.majiangs.ToArray());
                    if (mjuseritem.majiangs.Count == 14 && mjuseritem.MopaiNumber <= 1 && mjuseritem.Peng.Count == 0 && string.IsNullOrEmpty(mjuseritem.Gong))
                    {
                        Ruturnjsmj = new Ting().ReturnJMJ(majongList);
                    }
                }
                else
                {
                    //foreach (var item in mjuseritem.majiangs)
                    //{
                    //    paicount++;
                    //    MJ.SetPaiHS(0);
                    //    MJ.SetPaiID(0);
                    //    shoupai.AddMj(MJ);
                    //}
                    shoupai.AddRangeMj(mjuseritem.majiangs.Select(w => MaJiang.CreateBuilder().SetPaiHS(0).SetPaiID(0).Build()));
                }
                shoupai.SetFW(mjuseritem.ZS_Fw);
                shoupai.SetPcount(mjuseritem.majiangs.Count);
                shoupai.SetQYM(mjuseritem.QYM);
                shoupai.SetTianting(mjuseritem.Is_tiantX);
                shoupai.SetBaoting(mjuseritem.Is_baotin ? 1 : 0);
                /*****碰牌集合*****************************/
                foreach (var itemP in mjuseritem.Peng)
                {
                    MJ.SetPaiHS(itemP.PaiHs);
                    MJ.SetPaiID(itemP.PaiId);
                    pengpai.AddMj(MJ);
                }
                pengpai.SetFW(mjuseritem.ZS_Fw);

                /****************出牌集合*********************************/
                foreach (var itemC in mjuseritem.chuda)
                {
                    MJ.SetPaiHS(itemC.PaiHs);
                    MJ.SetPaiID(itemC.PaiId);
                    chupai.AddMj(MJ);
                }
                chupai.SetFW(mjuseritem.ZS_Fw);

                gangpai.SetFW(mjuseritem.ZS_Fw);
                if (!string.IsNullOrEmpty(mjuseritem.Gong))
                {
                    gangpai.SetGang(mjuseritem.Gong);
                }
                else
                {
                    gangpai.SetGang("");
                }
                returndata.AddChu(chupai);
                returndata.AddPeng(pengpai);
                returndata.AddGang(gangpai);
                returndata.AddShoupai(shoupai);
                returndata.AddJp(userzrj);


                //chupai.Clear();
                //pengpai.Clear();
                //gangpai.Clear();
                //shoupai.Clear();
            }
            roommsg.SetCount(rm.count).SetIsBenji(rm.is_benji == true ? 1 : 0).SetIsShangxiaji(rm.is_shangxiaji == true ? 1 : 0).SetIsWgj(rm.is_wgj == true ? 1 : 0).SetIsXinqiji(rm.is_xinqiji == true ? 1 : 0).SetIsYikousan(rm.is_yikousan == true ? 1 : 0).SetRoomPeo(rm.room_peo).SetIsLianzhuang(rm.is_lianz == true ? 1 : 0).SetIsYuanque(rm.IsYuanQue?1:0);
            returndata.SetRoomID(mj.RoomID);

            returndata.SetHyUser(hyyh);
            returndata.SetMessage(roommsg);
            returndata.SetUserInfo(userinfobyroom);
            //byte[] hyczall = hyyh.Build().ToByteArray();
            //session.TrySend(new ArraySegment<byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 7004, hyczall.Length, requestInfo.MessageNum, hyczall)));
            //byte[] roommsgb = roommsg.Build().ToByteArray();
            //session.TrySend(new ArraySegment<byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 7003, roommsgb.Length, requestInfo.MessageNum, roommsgb)));


            //byte[] cState = ifconn.ToByteArray();
            //session.TrySend(new ArraySegment<byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 6001, cState.Length, requestInfo.MessageNum, cState)));

            //byte[] uData = userinfobyroom.Build().ToByteArray();
            //session.TrySend(new ArraySegment<byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 2005, uData.Length, requestInfo.MessageNum, uData)));
            if (Ruturnjsmj.Count > 0)
            {
                var returntp = ReturnTP.CreateBuilder();
                var tmj      = MaJiang.CreateBuilder();
                foreach (var mjItem in Ruturnjsmj)
                {
                    tmj.SetPaiHS(mjItem.PaiHs);
                    tmj.SetPaiID(mjItem.PaiId);
                    returntp.AddMj(tmj);
                }
                returndata.SetTp(returntp);
                //byte[] tmjsr = returntp.Build().ToByteArray();
                //session.TrySend(new ArraySegment<byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 2009, tmjsr.Length, requestInfo.MessageNum, tmjsr)));
            }

            // session.TrySend(new ArraySegment<byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 5020, returnzhuang.Count, GameInformationBase.BASEAGREEMENTNUMBER + 7093, returnzhuang.ToArray())));
            //if (mj.SendData != null)
            //    session.TrySend(mj.SendData);
            if (mj.SendData != null)
            {
                returndata.AddRangeSendData(mj.SendData.Select(w => ByteString.CopyFrom(w.ToArray())));
            }
            if (rm.LastMoMJ != null)
            {
                returndata.SetLastMomj(MaJiang.CreateBuilder().SetPaiHS(rm.LastMoMJ.PaiHs).SetPaiID(rm.LastMoMJ.PaiId));
            }
            if (rm.LastChuMJ != null)
            {
                returndata.SetLastChumj(MaJiang.CreateBuilder().SetPaiHS(rm.LastChuMJ.PaiHs).SetPaiID(rm.LastChuMJ.PaiId));
            }
            returndata.SetGameNumber(rm.Dcount);
            var jxRoom = Gongyong.room_JX.Find(u => u.room_id == returndata.RoomID);

            if (jxRoom == null)
            {
                returndata.SetJiXuYouXi(0);
            }
            else
            {
                returndata.SetJiXuYouXi(jxRoom.UsersFW.Any(w => w == myFW) ? 1 : 0);
            }
            returndata.SetPaiCount(rm.RoomPai.Count);
            if (!returndata.HasZhuang)
            {
                returndata.SetZhuang(ReturnZhuang.CreateBuilder().SetZhuang(1).SetSeizi("").SetZhuangCount(1));
            }
            byte[] rData = returndata.Build().ToByteArray();
            session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 7001, rData.Length, requestInfo.MessageNum, rData)));
            Gongyong.msg.RemoveAll(w => w.openid.Equals(userInfo.openid));
            session.Logger.Debug("断线重连结束" + userInfo.openid);
        }
Пример #12
0
        /// <summary>
        /// 碰杠过消息
        /// </summary>
        /// <param name="session"></param>
        /// <param name="requestInfo"></param>
        public void ExecuteCommand(GameSession session, ProtobufRequestInfo requestInfo)
        {
            if (!Gongyong.userlist.Any(w => w.session.SessionID.Equals(session.SessionID)))
            {
                session.Logger.Debug(" Gang : 非法连接");
                session.Close();
                return;
            }

            var returnmsg = ReturnMsg.CreateBuilder();

            var retumsg  = ReturnPeng.CreateBuilder();
            var sendinfo = SendPeng.ParseFrom(requestInfo.Body);

            session.Logger.Debug(sendinfo);
            var           jp     = ReturnFJ.CreateBuilder();
            Room          r      = Gongyong.roomlist.Find(u => u.RoomID == sendinfo.Roomid);
            mjuser        mjuser = Gongyong.mulist.Find(u => u.RoomID == sendinfo.Roomid && u.Openid == sendinfo.Openid);
            List <mjuser> mjlist = Gongyong.mulist.FindAll(u => u.RoomID == sendinfo.Roomid);
            List <model.ServerMaJiang> listmj = new List <model.ServerMaJiang>();

            model.ServerMaJiang mjfh = new model.ServerMaJiang();

            if (!string.IsNullOrEmpty(mjuser.ByteData) && mjuser.ByteData.Equals(sendinfo.ToString()))
            {
                session.Logger.Debug("消息重复");
                return;
            }
            else
            {
                mjuser.ByteData = sendinfo.ToString();
            }

            if (mjuser == null)
            {
                session.Logger.Debug("用户不存在");
                return;
            }

            if (r.DQHY != 0 && r.DQHY != mjuser.ZS_Fw)
            {
                session.Logger.Debug("不是活跃用户");
                return;
            }
            mjuser.SendData.Clear();
            ThreadUtility.RemoveManagedThread(mjuser.Openid); //当用户已做操作 取消用户的倒计时
            var           zrjxx    = ReturnZR.CreateBuilder();
            List <HuInfo> huList   = new List <HuInfo>();     //处理一炮多响新增一个胡牌类型对象
            var           info     = mjlist.FirstOrDefault(w => w.ZS_Fw == sendinfo.FW);
            bool          isDelete = false;

            if (info != null)//先删除牌,否则过牌时判断冲锋鸡 会有问题
            {
                session.Logger.Debug("删除牌前手牌有 " + info.chuda.Count);
                isDelete = info.chuda.Remove(info.chuda.Find(w => w.PaiHs == sendinfo.Mj.PaiHS && w.PaiId == sendinfo.Mj.PaiID));
                session.Logger.Debug("删除牌前手牌后 " + info.chuda.Count);
            }
            ///不是过
            if (sendinfo.State == 1)
            {
                switch (sendinfo.Types)
                {
                ///碰
                case 1:
                    if (sendinfo.Mj.PaiHS != r.LastChuMJ.PaiHs || sendinfo.Mj.PaiID != r.LastChuMJ.PaiId)
                    {
                        session.Logger.Debug(r.LastChuMJ + "碰的牌不是最后一张打出的牌" + mjuser.Openid);
                        return;
                    }
                    listmj = mjuser.majiangs.FindAll(u => u.PaiHs == sendinfo.Mj.PaiHS);
                    List <model.ServerMaJiang> listP = mjuser.majiangs.FindAll(u => u.PaiHs == sendinfo.Mj.PaiHS);
                    if (listP.Count < 2)
                    {
                        session.Logger.Debug("碰的牌不够2张" + mjuser.Openid);
                        return;
                    }
                    mjuser.majiangs.Remove(listP[0]);
                    mjuser.majiangs.Remove(listP[1]);
                    mjuser.Peng.AddRange(listmj);
                    mjuser.Peng.Add(listmj[0]);
                    retumsg.SetState(1);
                    retumsg.SetMj(sendinfo.Mj);
                    retumsg.SetFw(mjuser.ZS_Fw);
                    retumsg.SetPfw(sendinfo.FW);

                    int    cfj        = 0;
                    int    wgj        = 0;
                    mjuser mjnewusers = Gongyong.mulist.Find(u => u.ZS_Fw == sendinfo.FW && u.RoomID == sendinfo.Roomid);
                    //判断责任鸡
                    if (sendinfo.Mj.PaiHS == 11)
                    {
                        foreach (var item in mjlist)
                        {
                            int count = item.chuda.FindAll(u => u.PaiHs == 11).Count;
                            if (count > 0)
                            {
                                cfj++;
                                break;
                            }
                        }
                        if (cfj == 0)
                        {
                            mjuser.Is_zrj     = 1;
                            mjnewusers.Is_cfj = false;
                            mjnewusers.Is_zrj = -1;
                            zrjxx.SetGtype(1);
                            zrjxx.SetZrfw(mjnewusers.ZS_Fw);
                            zrjxx.SetDzrfw(mjuser.ZS_Fw);
                        }
                    }
                    ///判断责任乌骨
                    if (r.is_wgj)
                    {
                        if (sendinfo.Mj.PaiHS == 8)
                        {
                            foreach (var item in mjlist)
                            {
                                int count = item.chuda.FindAll(u => u.PaiHs == 8).Count;
                                if (count > 0)
                                {
                                    wgj++;
                                    break;
                                }
                            }
                            if (wgj == 0)
                            {
                                mjuser.is_zrwg     = 1;
                                mjnewusers.is_cfwg = false;
                                mjnewusers.is_zrwg = -1;
                                zrjxx.SetGtype(2);
                                zrjxx.SetZrfw(mjnewusers.ZS_Fw);
                                zrjxx.SetDzrfw(mjuser.ZS_Fw);
                            }
                        }
                    }
                    r.DQHY = mjuser.ZS_Fw;
                    r.DQcz = "3001";    //出牌
                                        //牌局回放 碰牌
                    r.gameOperationProcess.AddGameOperationInfo(
                        GameOperationInfo.CreateBuilder()
                        .SetSerialNumber(r.gameOperationProcess.GameOperationInfoCount)
                        .SetOperationFW(mjuser.ZS_Fw)
                        .SetOperationType(3)
                        .AddMJ(sendinfo.Mj)
                        .SetPengFW(mjnewusers.ZS_Fw)
                        .SetMJType(mjuser.Is_zrj == 1 ? "ZRJ" : (mjuser.is_zrwg == 1 ? "ZRWG" : ""))
                        );

                    break;

                //杠
                case 2:
                    int gangType = 0;
                    ///杠类型判断
                    switch (sendinfo.Gtype)
                    {
                    case "A":
                        //if (r.LastMoMJ != null && (sendinfo.Mj.PaiHS != r.LastMoMJ.PaiHs || sendinfo.Mj.PaiID != r.LastMoMJ.PaiId))
                        //{
                        //    session.Logger.Debug("M杠的牌不是最后一张摸到的牌" + mjuser.Openid);
                        //    return;
                        //}
                        if (mjuser.majiangs.Where(w => w.PaiHs == sendinfo.Mj.PaiHS).Count() < 3)
                        {
                            session.Logger.Debug("A杠的牌不是不够3张" + mjuser.Openid);
                            return;
                        }
                        mjuser.ad_count += 1;
                        gangType         = 5;
                        break;

                    case "Z":
                        if (sendinfo.Mj.PaiHS != r.LastMoMJ.PaiHs || sendinfo.Mj.PaiID != r.LastMoMJ.PaiId)
                        {
                            session.Logger.Debug("M杠的牌不是最后一张摸到的牌" + mjuser.Openid);
                            return;
                        }
                        if (!mjuser.Peng.Any(u => u.PaiHs == sendinfo.Mj.PaiHS))
                        {
                            session.Logger.Debug("Z杠的牌不是不够3张" + mjuser.Openid);
                            return;
                        }
                        mjuser.zwd_count += 1;
                        gangType          = 6;
                        break;

                    case "M":
                        if (sendinfo.Mj.PaiHS != r.LastChuMJ.PaiHs || sendinfo.Mj.PaiID != r.LastChuMJ.PaiId)
                        {
                            session.Logger.Debug("M杠的牌不是最后一张打出的牌" + mjuser.Openid);
                            return;
                        }
                        if (mjuser.majiangs.Where(w => w.PaiHs == sendinfo.Mj.PaiHS).Count() < 3)
                        {
                            session.Logger.Debug("M杠的牌不是不够3张" + mjuser.Openid);
                            return;
                        }
                        mjuser.MD_count += 1;
                        gangType         = 4;
                        break;

                    case "H":
                        if (mjuser.majiangs.Where(w => w.PaiHs == sendinfo.Mj.PaiHS).Count() < 3 && !mjuser.Peng.Any(u => u.PaiHs == sendinfo.Mj.PaiHS))
                        {
                            session.Logger.Debug("H杠的牌不是不够3张或者碰牌区没有" + mjuser.Openid);
                            return;
                        }
                        gangType = 7;
                        break;

                    default:
                        break;
                    }

                    mjuser.majiangs.RemoveAll(u => u.PaiHs == sendinfo.Mj.PaiHS);
                    mjuser.Gong += sendinfo.Mj.PaiHS + "|" + sendinfo.FW + "|" + sendinfo.Gtype + ",";
                    retumsg.SetState(2);
                    retumsg.SetMj(sendinfo.Mj);
                    retumsg.SetFw(mjuser.ZS_Fw);
                    retumsg.SetPfw(sendinfo.FW);
                    retumsg.SetGtype(sendinfo.Gtype);
                    //var gangInfo = mjlist.FirstOrDefault(w => w.ZS_Fw == sendinfo.FW);
                    //if (gangInfo != null)
                    //    gangInfo.chuda.Remove(gangInfo.chuda.Find(w => w.PaiHs == sendinfo.Mj.PaiHS && w.PaiId == sendinfo.Mj.PaiID));
                    ///明豆
                    if (sendinfo.Gtype == "M")
                    {
                        mjuser mjnewuser = Gongyong.mulist.Find(u => u.ZS_Fw == sendinfo.FW && u.RoomID == sendinfo.Roomid);

                        if (sendinfo.Mj.PaiHS == 11)
                        {
                            mjuser.Is_zrj    = 1;
                            mjnewuser.Is_cfj = false;
                            mjnewuser.Is_zrj = -1;
                            zrjxx.SetGtype(1);
                            zrjxx.SetZrfw(mjnewuser.ZS_Fw);
                            zrjxx.SetDzrfw(mjuser.ZS_Fw);
                        }

                        if (r.is_wgj)
                        {
                            if (sendinfo.Mj.PaiHS == 8)
                            {
                                mjuser.is_zrwg    = 1;
                                mjnewuser.is_cfwg = false;
                                mjnewuser.is_zrwg = -1;
                                zrjxx.SetGtype(2);
                                zrjxx.SetZrfw(mjnewuser.ZS_Fw);
                                zrjxx.SetDzrfw(mjuser.ZS_Fw);
                            }
                        }
                    }
                    ///转弯都抢杠
                    if (sendinfo.Gtype == "Z")
                    {
                        mjuser.Peng.RemoveAll(u => u.PaiHs == sendinfo.Mj.PaiHS);
                        foreach (var item in mjlist)
                        {
                            if (item.ZS_Fw != mjuser.ZS_Fw)
                            {
                                List <model.ServerMaJiang> mah = new List <model.ServerMaJiang>();
                                mah.AddRange(item.majiangs.ToArray());
                                model.ServerMaJiang mjone = new model.ServerMaJiang()
                                {
                                    PaiHs = sendinfo.Mj.PaiHS,
                                    PaiId = sendinfo.Mj.PaiID
                                };
                                mah.Add(mjone);

                                if (new Ting().GetTing(mah) == "H")
                                {
                                    //var sendh = ReturnHByType.CreateBuilder();
                                    //sendh.SetFWZ(item.ZS_Fw);
                                    //sendh.SetFWB(mjuser.ZS_Fw);
                                    //sendh.SetType(3);
                                    //sendh.SetMJ(sendinfo.Mj);
                                    //byte[] rbyte = sendh.Build().ToByteArray();
                                    //Gongyong.userlist.Find(u => u.openid == item.Openid).session.TrySend(new ArraySegment<byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 5015, rbyte.Length, requestInfo.MessageNum, rbyte)));
                                    HuInfo huInfo = new HuInfo();
                                    huInfo.HuIndex  = item.ZS_Fw;
                                    huInfo.HuType   = 3;
                                    huInfo.MJ       = mjone;
                                    huInfo.OpenID   = item.Openid;
                                    huInfo.PaoIndex = mjuser.ZS_Fw;
                                    huInfo.RoomID   = r.RoomID;
                                    huList.Add(huInfo);
                                    item.IsGrabBars           = true;
                                    item.WasGrabbedUserOpenID = mjuser.Openid;
                                    r.DQHY = item.ZS_Fw;
                                }
                            }
                        }
                        //if (mjlist.Any(w => w.IsGrabBars))
                        //    return;
                    }
                    //憨包豆
                    if (sendinfo.Gtype == "H")
                    {
                        if (mjuser.Peng.Any(u => u.PaiHs == sendinfo.Mj.PaiHS))
                        {
                            mjuser.Peng.RemoveAll(u => u.PaiHs == sendinfo.Mj.PaiHS);
                            foreach (var item in mjlist)
                            {
                                if (item.ZS_Fw != mjuser.ZS_Fw)
                                {
                                    List <model.ServerMaJiang> mah = new List <model.ServerMaJiang>();
                                    mah.AddRange(item.majiangs.ToArray());
                                    model.ServerMaJiang mjone = new model.ServerMaJiang()
                                    {
                                        PaiHs = sendinfo.Mj.PaiHS,
                                        PaiId = sendinfo.Mj.PaiID
                                    };
                                    mah.Add(mjone);

                                    if (new Ting().GetTing(mah) == "H")
                                    {
                                        //var sendh = ReturnHByType.CreateBuilder();
                                        //sendh.SetFWZ(item.ZS_Fw);
                                        //sendh.SetFWB(mjuser.ZS_Fw);
                                        //sendh.SetType(3);
                                        //sendh.SetMJ(sendinfo.Mj);
                                        //byte[] rbyte = sendh.Build().ToByteArray();
                                        //Gongyong.userlist.Find(u => u.openid == item.Openid).session.TrySend(new ArraySegment<byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 5015, rbyte.Length, requestInfo.MessageNum, rbyte)));

                                        HuInfo huInfo = new HuInfo();
                                        huInfo.HuIndex  = item.ZS_Fw;
                                        huInfo.HuType   = 3;
                                        huInfo.MJ       = mjone;
                                        huInfo.OpenID   = item.Openid;
                                        huInfo.PaoIndex = mjuser.ZS_Fw;
                                        huInfo.RoomID   = r.RoomID;
                                        huList.Add(huInfo);

                                        item.IsGrabBars           = true;
                                        item.WasGrabbedUserOpenID = mjuser.Openid;
                                        r.DQHY = item.ZS_Fw;
                                    }
                                }
                            }
                        }
                    }
                    r.DQHY = mjuser.ZS_Fw;
                    //牌局回放 杠牌
                    r.gameOperationProcess.AddGameOperationInfo(
                        GameOperationInfo.CreateBuilder()
                        .SetSerialNumber(r.gameOperationProcess.GameOperationInfoCount)
                        .SetOperationFW(mjuser.ZS_Fw)
                        .SetOperationType(4)
                        .AddMJ(sendinfo.Mj)
                        .SetPengFW(sendinfo.FW)
                        .SetTingHuType(gangType)
                        .SetMJType(mjuser.Is_zrj == 1 ? "ZRJ" : (mjuser.is_zrwg == 1 ? "ZRWG" : ""))
                        );
                    break;

                case 3:
                    //if (r.count == r.Dcount)
                    //{
                    //    Gongyong.roomlist.Remove(r);
                    //    Gongyong.mulist.RemoveAll(u => u.RoomID == sendinfo.Roomid);
                    //}
                    //mjfh = r.RoomPai[0];
                    //jp.SetHS(mjfh.PaiHs);
                    break;

                default:
                    break;
                }
            }
            //过
            else
            {
                session.Logger.Debug("过牌");
                string mjType = string.Empty;

                //过类型
                if (sendinfo.Types == 1 || (sendinfo.Types == 2 && sendinfo.Gtype.Equals("M")) || (sendinfo.Types == 3 && sendinfo.FW != mjuser.ZS_Fw))
                {
                    //判断幺鸡过,是否下发冲锋鸡消息
                    if (sendinfo.Mj.PaiHS == 11)
                    {
                        bool cfj = true;
                        // List<mjuser> listnewJP = Gongyong.mulist.FindAll(U => U.RoomID == sendinfo.Roomid);
                        foreach (var item in mjlist)
                        {
                            int Ccount = item.chuda.FindAll(u => u.PaiHs == 11).Count;
                            if (Ccount > 0)
                            {
                                cfj = false;
                            }
                        }

                        if (cfj)
                        {
                            returnmsg.SetFW(sendinfo.FW);
                            returnmsg.SetMj(MaJiang.CreateBuilder().SetPaiHS(0).SetPaiID(0));
                            returnmsg.SetMsg("CFJ");
                            info.Is_cfj = true;
                            //  listnewJP.Find(w => w.ZS_Fw == sendinfo.FW).chuda.Add(new model.ServerMaJiang { PaiHs = 11, PaiId = sendinfo.HasMj ? sendinfo.Mj.PaiID : 211 });
                            mjType = returnmsg.Msg;
                            byte[] byteball = returnmsg.Build().ToByteArray();
                            foreach (var item in mjlist)
                            {
                                Gongyong.userlist.Find(u => u.openid == item.Openid).session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 3009, byteball.Length, requestInfo.MessageNum, byteball)));
                            }
                        }
                    }

                    ///判断乌骨鸡过是否下发乌骨鸡消息
                    if (sendinfo.Mj.PaiHS == 8)
                    {
                        bool WGJ = true;
                        //  List<mjuser> listnewJPW = Gongyong.mulist.FindAll(U => U.RoomID == sendinfo.Roomid);
                        foreach (var item in mjlist)
                        {
                            int Ccount = item.chuda.FindAll(u => u.PaiHs == 8).Count;
                            if (Ccount > 0)
                            {
                                WGJ = false;
                            }
                        }

                        if (WGJ)
                        {
                            returnmsg.SetFW(sendinfo.FW);
                            returnmsg.SetMj(MaJiang.CreateBuilder().SetPaiHS(0).SetPaiID(0));
                            returnmsg.SetMsg("CFWG");
                            info.is_cfwg = true;
                            // listnewJPW.Find(w => w.ZS_Fw == sendinfo.FW).chuda.Add(new model.ServerMaJiang { PaiHs = 8, PaiId = sendinfo.HasMj ? sendinfo.Mj.PaiID : 208 });
                            mjType = returnmsg.Msg;
                            byte[] byteball = returnmsg.Build().ToByteArray();
                            foreach (var item in mjlist)
                            {
                                Gongyong.userlist.Find(u => u.openid == item.Openid).session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 3009, byteball.Length, requestInfo.MessageNum, byteball)));
                            }
                        }
                    }
                }
                if (isDelete)
                {
                    info.chuda.Add(new model.ServerMaJiang {
                        PaiHs = sendinfo.Mj.PaiHS, PaiId = sendinfo.HasMj ? sendinfo.Mj.PaiID : 208
                    });
                }

                //牌局回放 过牌
                if (returnmsg.HasMsg)
                {
                    r.gameOperationProcess.AddGameOperationInfo(
                        GameOperationInfo.CreateBuilder()
                        .SetSerialNumber(r.gameOperationProcess.GameOperationInfoCount)
                        .SetOperationFW(mjuser.ZS_Fw)
                        .SetOperationType(7)
                        .SetPengFW(returnmsg.FW)
                        .SetMJType(returnmsg.Msg)
                        );
                }
                else
                {
                    r.gameOperationProcess.AddGameOperationInfo(
                        GameOperationInfo.CreateBuilder()
                        .SetSerialNumber(r.gameOperationProcess.GameOperationInfoCount)
                        .SetOperationFW(mjuser.ZS_Fw)
                        .SetOperationType(7)
                        );
                }
                List <RoomMsgWirte> msglist = new List <RoomMsgWirte>();
                msglist = Gongyong.roommsg.FindAll(u => u.roomid == r.RoomID);
                session.Logger.Debug("过牌判断" + msglist.Count);
                if (msglist.Count > 0 && sendinfo.Types != 4 && sendinfo.Types != 5)
                {
                    foreach (var item in msglist)
                    {
                        var userInfo = Gongyong.userlist.Find(u => u.openid == item.openid);
                        if (userInfo != null)
                        {
                            userInfo.session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + item.xiaoxihao, item.ArrList.Length, requestInfo.MessageNum, item.ArrList)));
                            r.DQHY = mjlist.Find(u => u.Openid.Equals(item.openid)).ZS_Fw;
                            r.DQcz = item.operating;
                            session.Logger.Debug("过牌后根据之前的消息分配活跃用户" + r.DQHY);
                        }
                    }

                    Gongyong.roommsg.RemoveAll(u => u.roomid == r.RoomID);
                    retumsg.SetState(4);
                    retumsg.SetMj(sendinfo.Mj);
                }
                else if (mjuser.IsGrabBars)
                {
                    session.Logger.Debug("过牌判断抢杠");
                    mjuser.IsGrabBars = false;
                    var PGH = ReturnAll.CreateBuilder();
                    PGH.SetMo(1);
                    PGH.SetFw(mjuser.ZS_Fw);
                    PGH.SetMType(1);
                    mjuser.Mtype = 1;
                    byte[] bytegou = PGH.Build().ToByteArray();
                    var    user    = Gongyong.userlist.Find(u => u.openid.Equals(mjuser.WasGrabbedUserOpenID));
                    var    mjaure  = mjlist.Find(w => w.Openid.Equals(mjuser.WasGrabbedUserOpenID));
                    r.DQHY = mjaure.ZS_Fw;
                    user.session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 3008, bytegou.Length, requestInfo.MessageNum, bytegou)));
                }

                ///下发摸牌出牌消息
                else
                {
                    session.Logger.Debug("过牌摸牌");
                    var      shy  = ReturnHyUser.CreateBuilder();
                    CardUser card = Gongyong.FKUser.Find(u => u.roomid == mjuser.RoomID);
                    if (sendinfo.Types == 4 && mjuser.Is_tiant)//天听过牌
                    {
                        mjuser.Is_tiantX = 0;
                        mjuser.Is_tiant  = false;
                        if (!mjlist.Any(w => w.Is_tiantX == -1))
                        {
                            r.DQHY = card.win;
                            r.DQcz = "3001";
                            byte[] startHY = ReturnHyUser.CreateBuilder().SetCz("3001").SetFw(card.win).Build().ToByteArray();
                            foreach (var item in mjlist)
                            {
                                UserInfo user = Gongyong.userlist.Find(u => u.openid == item.Openid);
                                user.session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 7004, startHY.Length, requestInfo.MessageNum, startHY)));
                            }
                            msglist = Gongyong.roommsg.FindAll(u => u.roomid == r.RoomID);
                            if (msglist.Count > 0)
                            {
                                // Room r = Gongyong.roomlist.Find(u => u.RoomID == r.RoomID);
                                foreach (var msgitem in msglist)
                                {
                                    var userInfo = Gongyong.userlist.Find(u => u.openid == msgitem.openid);
                                    if (userInfo != null)
                                    {
                                        var mjUser = mjlist.Find(u => u.Openid.Equals(msgitem.openid));
                                        r.DQHY = mjUser.ZS_Fw;
                                        mjUser.SendData.Clear();
                                        var data = new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + msgitem.xiaoxihao, msgitem.ArrList.Length, requestInfo.MessageNum, msgitem.ArrList));
                                        userInfo.session.TrySend(data);
                                        //session.Logger.Debug("过牌后根据之前的消息分配活跃用户" + r.DQHY);
                                    }
                                }
                                Gongyong.roommsg.RemoveAll(u => u.roomid == r.RoomID);
                            }
                        }
                        return;
                    }
                    else if (sendinfo.Types == 5 && mjuser.Is_tianHu)
                    {
                        mjuser.Is_tianHu = false;
                        r.DQHY           = card.win;
                        r.DQcz           = "3001";
                        byte[] startHY = ReturnHyUser.CreateBuilder().SetCz("3001").SetFw(card.win).Build().ToByteArray();
                        foreach (var item in mjlist)
                        {
                            UserInfo user = Gongyong.userlist.Find(u => u.openid == item.Openid);
                            user.session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 7004, startHY.Length, requestInfo.MessageNum, startHY)));
                        }
                        return;
                    }

                    else if ((sendinfo.Gtype.ToUpper() != "M" && sendinfo.Types == 2) || (sendinfo.Types == 3 && sendinfo.FW == mjuser.ZS_Fw))
                    {
                        if (mjuser.majiangs.Any(w => w.PaiId == sendinfo.Mj.PaiID) || sendinfo.Mj.PaiID == 0)// 有些情况在放炮过牌的时候会让过牌的用户出牌,然而应该摸牌
                        {
                            shy.SetCz("3001");
                            shy.SetFw(mjuser.ZS_Fw);
                            retumsg.SetState(4);
                            retumsg.SetMj(sendinfo.Mj);
                            retumsg.SetFw(mjuser.ZS_Fw);
                            retumsg.SetPfw(sendinfo.FW);
                            r.DQcz = "3001";
                        }
                        else
                        {
                            UserInfo user = Gongyong.userlist.Find(u => u.openid == mjuser.Openid);
                            r.DQcz = "30083";
                            var PGH = ReturnAll.CreateBuilder();
                            PGH.SetMo(1);
                            PGH.SetFw(mjuser.ZS_Fw);
                            mjuser.Mtype = 0;
                            byte[] bsss = PGH.Build().ToByteArray();
                            user.session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 3008, bsss.Length, requestInfo.MessageNum, bsss)));
                        }
                    }
                    else //if( (sendinfo.Types == 3 && sendinfo.FW != mjuser.ZS_Fw))
                    {
                        if (sendinfo.Types == 3 && sendinfo.FW != mjuser.ZS_Fw)
                        {
                            mjuser.IsGuoHu = true;
                        }
                        shy.SetCz("30083");
                        // int peocount = Convert.ToInt32(r.room_peo.Remove(1, 1));
                        int peocount = r.room_peo;
                        if (sendinfo.FW == peocount)
                        {
                            r.DQHY = 1;
                            r.DQcz = "30083";
                            string   openid = mjlist.Find(u => u.ZS_Fw == 1).Openid;
                            UserInfo user   = Gongyong.userlist.Find(u => u.openid == openid);


                            shy.SetFw(1);

                            var PGH = ReturnAll.CreateBuilder();
                            PGH.SetMo(1);
                            PGH.SetFw(mjuser.ZS_Fw);
                            mjuser.Mtype = 0;
                            byte[] bsss = PGH.Build().ToByteArray();
                            user.session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 3008, bsss.Length, requestInfo.MessageNum, bsss)));
                        }
                        else
                        {
                            r.DQHY = sendinfo.FW + 1;
                            r.DQcz = "30083";
                            string openid = mjlist.Find(u => u.ZS_Fw == sendinfo.FW + 1).Openid;

                            UserInfo user = Gongyong.userlist.Find(u => u.openid == openid);
                            var      PGH  = ReturnAll.CreateBuilder();
                            PGH.SetMo(1);
                            mjuser.Mtype = 0;
                            PGH.SetFw(Gongyong.mulist.Find(u => u.ZS_Fw == sendinfo.FW + 1).ZS_Fw);
                            shy.SetFw(Gongyong.mulist.Find(u => u.ZS_Fw == sendinfo.FW + 1).ZS_Fw);
                            byte[] bsss = PGH.Build().ToByteArray();
                            user.session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 3008, bsss.Length, requestInfo.MessageNum, bsss)));
                        }
                        retumsg.SetState(4);
                        if (sendinfo.Mj.HasPaiHS)
                        {
                            retumsg.SetMj(sendinfo.Mj);
                        }
                        retumsg.SetFw(mjuser.ZS_Fw);
                        retumsg.SetPfw(sendinfo.FW);
                        r.DQcz = "30083";
                    }



                    byte[] senhy = shy.Build().ToByteArray();

                    session.Logger.Debug(shy.Build());
                    foreach (var item in mjlist)
                    {
                        UserInfo user = Gongyong.userlist.Find(u => u.openid == item.Openid);
                        user.IsActive = true;
                        user.session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 7004, senhy.Length, requestInfo.MessageNum, senhy)));
                    }
                }
            }
            if (huList.Count > 0)
            {
                if (huList.Count > 1 || huList[0].HuType == 3)
                {
                    r.Is_Hu = true;
                    var sendh = SendHu.CreateBuilder();
                    foreach (var item in huList)
                    {
                        if (!sendh.HasFWZ)
                        {
                            sendh.SetFWZ(item.HuIndex);
                        }
                        if (!sendh.HasFWB)
                        {
                            sendh.SetFWB(item.PaoIndex);
                        }
                        sendh.SetType(item.HuType);
                        sendh.SetMJ(sendinfo.Mj);
                        if (!sendh.HasOpenid)
                        {
                            sendh.SetOpenid(item.OpenID);
                        }
                        if (!sendh.HasRoomid)
                        {
                            sendh.SetRoomid(r.RoomID);
                        }
                        sendh.AddDXInfo(DuoXiangHu.CreateBuilder().SetDXFW(item.HuIndex).SetDXType(item.HuType));
                    }
                    byte[] rbyte = sendh.Build().ToByteArray();
                    //Gongyong.userlist.Find(u => u.openid == item.Openid).session.TrySend(new ArraySegment<byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 5016, rbyte.Length, requestInfo.MessageNum, rbyte)));
                    int messageNum = (GameInformationBase.BASEAGREEMENTNUMBER + 5016);
                    //抢杠必胡,所以需要服务器自己返回胡牌的信息。
                    new GetH().ExecuteCommand(Gongyong.userlist.Find(u => u.openid == huList[0].OpenID).session,
                                              new ProtobufRequestInfo {
                        Body = rbyte, Key = messageNum.ToString(), Messagelength = rbyte.Length, MessageNum = messageNum, MessageResNum = 0
                    });
                }
                else
                {
                    var sendh = ReturnHByType.CreateBuilder();
                    sendh.SetFWZ(huList[0].HuIndex);
                    sendh.SetFWB(huList[0].PaoIndex);
                    sendh.SetType(huList[0].HuType);
                    sendh.SetMJ(sendinfo.Mj);
                    r.DQHY = huList[0].HuIndex;
                    byte[] rbyte    = sendh.Build().ToByteArray();
                    var    sendData = new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 5015, rbyte.Length, requestInfo.MessageNum, rbyte));
                    mjlist.Find(w => w.Openid.Equals(huList[0].OpenID)).SendData.Add(sendData);
                    Gongyong.userlist.Find(u => u.openid == huList[0].OpenID).session.TrySend(sendData);
                }
            }
            else if (sendinfo.State == 1 && sendinfo.Types == 2)
            {
                r.Is_Hu = false;
                var PGH = ReturnAll.CreateBuilder();
                PGH.SetMo(1);
                PGH.SetFw(mjuser.ZS_Fw);
                PGH.SetMType(1);
                mjuser.Mtype = 1;
                byte[] bytegou = PGH.Build().ToByteArray();
                session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 3008, bytegou.Length, requestInfo.MessageNum, bytegou)));
            }
            else if (sendinfo.State == 2)//过牌后 会摸牌,不能强制修改为 出牌
            {
            }
            else
            {
                r.Is_Hu = false;
                r.DQcz  = "3001";
            }

            var settle = ReturnJS.CreateBuilder();

            session.Logger.Debug("处理完成下发消息");
            foreach (var item in mjlist)
            {
                UserInfo user = Gongyong.userlist.Find(u => u.openid == item.Openid);

                //if (sendinfo.Types == 3 && sendinfo.State == 1)
                //{
                //    byte[] jpr = jp.Build().ToByteArray();
                //    user.session.TrySend(new ArraySegment<byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 7005, jpr.Length, requestInfo.MessageNum, jpr)));
                //    byte[] settlebyte = settle.Build().ToByteArray();
                //    user.session.TrySend(new ArraySegment<byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 7009, settlebyte.Length, requestInfo.MessageNum, settlebyte)));
                //}
                //else
                //{
                byte[] b = retumsg.Build().ToByteArray();
                user.session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 4002, b.Length, requestInfo.MessageNum, b)));
                //}


                if (zrjxx.Dzrfw != 0)
                {
                    byte[] zrj = zrjxx.Build().ToByteArray();

                    user.session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 5018, zrj.Length, requestInfo.MessageNum, zrj)));
                }
            }
            ThreadUtility.StartManagedThread(Gongyong.mulist.Find(w => w.ZS_Fw == r.DQHY && w.RoomID == r.RoomID).Openid, r.RoomID, r.DQcz);
        }
Пример #13
0
        public void ExecuteCommand(GameSession session, ProtobufRequestInfo requestInfo)
        {
            if (!Gongyong.userlist.Any(w => w.session.SessionID.Equals(session.SessionID)))
            {
                session.Logger.Debug("QYM : 非法连接");
                session.Close();
                return;
            }
            ///获取缺一门数据
            var getdata = SendQYM.ParseFrom(requestInfo.Body);
            ///根据openid找到用户
            mjuser userrun = Gongyong.mulist.Find(u => u.Openid == getdata.Openid);

            if (userrun == null)
            {
                return;
            }

            if (userrun.ByteData == requestInfo.Key)
            {
                return;
            }
            else
            {
                userrun.ByteData = requestInfo.Key;
            }

            ///如果用户为空则直接返回
            if (userrun == null)
            {
                return;
            }

            if (userrun.QYM != 0 && !string.IsNullOrEmpty(userrun.QYM.ToString()))
            {
                return;
            }
            ///设置用户缺的麻将
            userrun.QYM = getdata.Type;
            ///根据房间ID找到当前房间
            List <mjuser> userlist = Gongyong.mulist.FindAll(u => u.RoomID == userrun.RoomID);
            mjuser        mjlist   = Gongyong.mulist.Find(u => u.RoomID == userrun.RoomID && (u.QYM == 0 || string.IsNullOrEmpty(u.QYM.ToString())));

            CardUser cu = Gongyong.FKUser.Find(u => u.roomid == userrun.RoomID);

            if (mjlist == null)
            {
                ThreadUtility.RemoveManagedThread(getdata.Openid);//当用户操作时 取消用户的倒计时
                var  returndata    = ReturnAYM.CreateBuilder();
                var  mjuserAll     = Gongyong.mulist.FindAll(u => u.RoomID == userrun.RoomID);
                var  R             = Gongyong.roomlist.Find(u => u.RoomID == userrun.RoomID);
                Ting t             = new Ting();
                var  ReturnGangMSG = ReturnGang.CreateBuilder();
                foreach (var item in mjuserAll)
                {
                    item.SendData.Clear();
                    ReturnTTATH.Builder sendmj = ReturnTTATH.CreateBuilder();
                    UserInfo            user   = Gongyong.userlist.Find(u => u.openid == item.Openid);
                    //sendmj.AddMj(MaJiang.CreateBuilder());
                    List <model.ServerMaJiang> listT = new List <model.ServerMaJiang>();
                    listT.AddRange(item.majiangs.ToArray());
                    var Ruturnjsmj = new List <model.ServerMaJiang>();

                    string hxx = t.GetTing(listT);
                    if (hxx != "MJ")
                    {
                        if (cu.win == item.ZS_Fw)
                        {
                            if (hxx == "H")
                            {
                                switch (item.QYM)
                                {
                                case 1:
                                    if (item.majiangs.FindAll(u => u.PaiHs < 10).Count <= 0)
                                    {
                                        sendmj.SetState(214);
                                        item.Is_tianHu = true;
                                    }
                                    break;

                                case 2:
                                    if (item.majiangs.FindAll(u => u.PaiHs > 10 && u.PaiHs < 20).Count <= 0)
                                    {
                                        sendmj.SetState(214);
                                        item.Is_tianHu = true;
                                    }
                                    break;

                                case 3:
                                    if (item.majiangs.FindAll(u => u.PaiHs > 20).Count <= 0)
                                    {
                                        sendmj.SetState(214);
                                        item.Is_tianHu = true;
                                    }
                                    break;

                                default:
                                    break;
                                }
                            }

                            else if (R.room_peo < 4)
                            {
                                switch (item.QYM)
                                {
                                case 1:
                                    if (item.majiangs.FindAll(u => u.PaiHs < 10).Count <= 0)
                                    {
                                        ///庄家报听判断
                                        List <model.ServerMaJiang> JPMJ = new List <model.ServerMaJiang>();
                                        JPMJ.AddRange(item.majiangs.ToArray());

                                        Ruturnjsmj = t.ReturnJMJ(JPMJ);
                                        //item.Is_tiant = true;
                                    }

                                    break;

                                case 2:
                                    if (item.majiangs.FindAll(u => u.PaiHs > 10 && u.PaiHs < 20).Count <= 0)
                                    {
                                        ///庄家报听判断
                                        List <model.ServerMaJiang> JPMJ = new List <model.ServerMaJiang>();
                                        JPMJ.AddRange(item.majiangs.ToArray());
                                        Ruturnjsmj = t.ReturnJMJ(JPMJ);
                                        //item.Is_tiant = true;
                                    }
                                    break;

                                case 3:
                                    if (item.majiangs.FindAll(u => u.PaiHs > 20).Count <= 0)
                                    {
                                        ///庄家报听判断
                                        List <model.ServerMaJiang> JPMJ = new List <model.ServerMaJiang>();
                                        JPMJ.AddRange(item.majiangs.ToArray());
                                        Ruturnjsmj = t.ReturnJMJ(JPMJ);
                                        //item.Is_tiant = true;
                                    }
                                    break;

                                default:
                                    break;
                                }
                            }
                            else
                            {
                                ///庄家报听判断
                                List <model.ServerMaJiang> JPMJ = new List <model.ServerMaJiang>();
                                JPMJ.AddRange(item.majiangs.ToArray());
                                Ruturnjsmj = t.ReturnJMJ(JPMJ);
                                // item.Is_tiant = true;
                            }
                        }
                        else
                        {
                            if (R.room_peo < 4)
                            {
                                switch (item.QYM)
                                {
                                case 1:
                                    if (item.majiangs.FindAll(u => u.PaiHs < 10).Count <= 0)
                                    {
                                        sendmj.SetState(213);
                                        var           TT         = ReturnTT.CreateBuilder().SetFw(item.ZS_Fw);
                                        byte[]        TTR        = TT.Build().ToByteArray();
                                        List <mjuser> listmjuser = Gongyong.mulist.FindAll(u => u.RoomID == item.RoomID);
                                        //foreach (var mjuser in listmjuser)
                                        //{
                                        //    UserInfo user = Gongyong.userlist.Find(u => u.openid == mjuser.Openid);
                                        //    user.session.TrySend(new ArraySegment<byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 5013, TTR.Length, GameInformationBase.BASEAGREEMENTNUMBER + 7093, TTR)));
                                        //}
                                        item.Is_tiant  = true;
                                        R.DQHY         = item.ZS_Fw;
                                        R.DQcz         = "30071";
                                        item.Is_tiantX = -1;
                                    }
                                    break;

                                case 2:
                                    if (item.majiangs.FindAll(u => u.PaiHs > 10 && u.PaiHs < 20).Count <= 0)
                                    {
                                        sendmj.SetState(213);
                                        var           TT         = ReturnTT.CreateBuilder().SetFw(item.ZS_Fw);
                                        byte[]        TTR        = TT.Build().ToByteArray();
                                        List <mjuser> listmjuser = Gongyong.mulist.FindAll(u => u.RoomID == item.RoomID);
                                        R.DQHY         = item.ZS_Fw;
                                        R.DQcz         = "30071";
                                        item.Is_tiant  = true;
                                        item.Is_tiantX = -1;
                                    }
                                    break;

                                case 3:
                                    if (item.majiangs.FindAll(u => u.PaiHs > 20).Count <= 0)
                                    {
                                        sendmj.SetState(213);
                                        var           TT         = ReturnTT.CreateBuilder().SetFw(item.ZS_Fw);
                                        byte[]        TTR        = TT.Build().ToByteArray();
                                        List <mjuser> listmjuser = Gongyong.mulist.FindAll(u => u.RoomID == item.RoomID);

                                        item.Is_tiant  = true;
                                        R.DQHY         = item.ZS_Fw;
                                        R.DQcz         = "30071";
                                        item.Is_tiantX = -1;
                                    }
                                    break;

                                default:
                                    break;
                                }
                            }
                            else
                            {
                                sendmj.SetState(213);
                                var           TT         = ReturnTT.CreateBuilder().SetFw(item.ZS_Fw);
                                byte[]        TTR        = TT.Build().ToByteArray();
                                List <mjuser> listmjuser = Gongyong.mulist.FindAll(u => u.RoomID == item.RoomID);
                                item.Is_tiant  = true;
                                item.Is_tiantX = -1;
                                R.DQHY         = item.ZS_Fw;
                                R.DQcz         = "30071";
                            }
                        }
                    }
                    if (Ruturnjsmj.Count > 0)
                    {
                        var returntp = ReturnTP.CreateBuilder();
                        var tmj      = MaJiang.CreateBuilder();
                        foreach (var mjItem in Ruturnjsmj)
                        {
                            tmj.SetPaiHS(mjItem.PaiHs);
                            tmj.SetPaiID(mjItem.PaiId);
                            returntp.AddMj(tmj);
                        }
                        byte[] tmjsr = returntp.Build().ToByteArray();
                        var    data  = new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 2009, tmjsr.Length, requestInfo.MessageNum, tmjsr));
                        item.SendData.Add(data);
                        user.session.TrySend(data);
                    }
                    if (sendmj.HasState)
                    {
                        var data      = sendmj.Build().ToByteArray();
                        var dataArray = new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 2010, data.Length, requestInfo.MessageNum, data));
                        item.SendData.Add(dataArray);
                        user.session.TrySend(dataArray);
                    }

                    //验证杠牌
                    if (cu.win == item.ZS_Fw)
                    {
                        // listT.AddRange(item.majiangs.ToArray());

                        var listchuan = listT.GroupBy(w => w.PaiHs).Select(w => new { PaiHs = w.Key, Count = w.Count() });
                        foreach (var gangInfo in listchuan.Where(w => w.Count == 4))
                        {
                            switch (item.QYM)
                            {
                            case 1:
                                if (gangInfo.PaiHs > 10)
                                {
                                    var PGH = ReturnAll.CreateBuilder();
                                    var mjG = MaJiang.CreateBuilder();
                                    mjG.SetPaiHS(gangInfo.PaiHs);
                                    mjG.SetPaiID(401);

                                    ReturnGangMSG.AddGang(GangMSG.CreateBuilder().SetFw(cu.win).SetMj(mjG).SetType(3));
                                }
                                break;

                            case 2:
                                if (gangInfo.PaiHs < 10 && gangInfo.PaiHs > 20)
                                {
                                    var PGH = ReturnAll.CreateBuilder();
                                    var mjG = MaJiang.CreateBuilder();
                                    mjG.SetPaiHS(gangInfo.PaiHs);
                                    mjG.SetPaiID(401);

                                    ReturnGangMSG.AddGang(GangMSG.CreateBuilder().SetFw(cu.win).SetMj(mjG).SetType(3));
                                }
                                break;

                            case 3:
                                if (gangInfo.PaiHs < 20)
                                {
                                    var PGH = ReturnAll.CreateBuilder();
                                    var mjG = MaJiang.CreateBuilder();
                                    mjG.SetPaiHS(gangInfo.PaiHs);
                                    mjG.SetPaiID(401);

                                    ReturnGangMSG.AddGang(GangMSG.CreateBuilder().SetFw(cu.win).SetMj(mjG).SetType(3));
                                }
                                break;

                            default:
                                break;
                            }
                        }


                        if (ReturnGangMSG.GangCount > 0)
                        {
                            byte[] bytegang = ReturnGangMSG.Build().ToByteArray();
                            user.session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 5022, bytegang.Length, requestInfo.MessageNum, bytegang)));
                        }
                    }
                }


                if (userlist.Any(w => w.Is_tianHu))
                {
                    var user = userlist.Find(w => w.Is_tianHu);
                    user.SendData.Clear();
                    var    humj  = user.majiangs.Last();
                    var    hupai = ReturnHByType.CreateBuilder().SetFWZ(user.ZS_Fw).SetMJ(MaJiang.CreateBuilder().SetPaiHS(humj.PaiHs).SetPaiID(humj.PaiId)).SetType(1);
                    byte[] data  = hupai.Build().ToByteArray();
                    if (userlist.Any(w => w.Is_tiant))
                    {
                        RoomMsgWirte msgri = new RoomMsgWirte()
                        {
                            openid    = user.Openid,
                            xiaoxihao = 5015,
                            ArrList   = data,
                            roomid    = user.RoomID
                            ,
                            operating = "30070"
                        };
                        Gongyong.roommsg.Add(msgri);
                    }
                    else
                    {
                        var userSend = Gongyong.userlist.Find(w => w.openid.Equals(user.Openid));

                        var dataArray = new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 5015, data.Length, requestInfo.MessageNum, data));
                        user.SendData.Add(dataArray);
                        userSend.session.TrySend(dataArray);
                        R.DQHY = user.ZS_Fw;
                        R.DQcz = "30070";
                        ThreadUtility.StartManagedThread(user.Openid, R.RoomID, R.DQcz);
                    }
                    // userSendJ.session.TrySend(new ArraySegment<byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 5015, data.Length, requestInfo.MessageNum, data)));
                }
                else if (userlist.Any(w => w.Is_tiant))
                {
                    R.DQHY = 0;
                    R.DQcz = "30071";
                    foreach (var item in userlist)
                    {
                        ThreadUtility.StartManagedThread(item.Openid, R.RoomID, R.DQcz);
                    }
                }
                else
                {
                    byte[] startHY = ReturnHyUser.CreateBuilder().SetCz("3001").SetFw(cu.win).Build().ToByteArray();
                    R.DQHY = cu.win;
                    R.DQcz = "3001";
                    foreach (var item in userlist)
                    {
                        UserInfo user = Gongyong.userlist.Find(u => u.openid == item.Openid);
                        user.IsActive = true;
                        user.session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 7004, startHY.Length, GameInformationBase.BASEAGREEMENTNUMBER + 7093, startHY)));
                    }
                    ThreadUtility.StartManagedThread(userlist.Find(w => w.ZS_Fw == cu.win).Openid, R.RoomID, R.DQcz);
                }
                ///下发缺牌信息
                foreach (var item in userlist)
                {
                    var senddata = ReturnQYM.CreateBuilder().SetFw(item.ZS_Fw).SetType(item.QYM);
                    returndata.AddQP(senddata);
                    //牌局回放 缺一门
                    R.gameOperationProcess.AddGameOperationInfo(
                        GameOperationInfo.CreateBuilder()
                        .SetSerialNumber(R.gameOperationProcess.GameOperationInfoCount)
                        .SetOperationFW(item.ZS_Fw)
                        .SetOperationType(8)
                        .SetQYM(item.QYM)
                        );
                }
                byte[] RBT = returndata.Build().ToByteArray();



                foreach (var item in userlist)
                {
                    UserInfo user = Gongyong.userlist.Find(u => u.openid == item.Openid);
                    var      data = new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 5012, RBT.Length, requestInfo.MessageNum, RBT));
                    item.SendData.Add(data);
                    user.session.TrySend(data);
                }
            }
        }
Пример #14
0
        public void ExecuteCommand(GameSession session, ProtobufRequestInfo requestInfo)
        {
            if (!Gongyong.userlist.Any(w => w.session.SessionID.Equals(session.SessionID)))
            {
                session.Logger.Debug("DayToL : 非法连接");
                session.Close();
                return;
            }
            var           getMsg   = SendBT.ParseFrom(requestInfo.Body);
            List <mjuser> listuser = Gongyong.mulist.FindAll(u => u.RoomID == getMsg.RoomID);
            mjuser        mjuser   = Gongyong.mulist.Find(u => u.Openid == getMsg.Openid && u.RoomID == getMsg.RoomID);
            var           room     = Gongyong.roomlist.Find(w => w.RoomID == getMsg.RoomID);

            if (room == null)
            {
                return;
            }
            if (mjuser == null)
            {
                return;
            }
            if (getMsg.Type == 1 && mjuser.majiangs.Count != 14)//天听,报听时手牌还未扣除,因此为14张
            {
                return;
            }
            if ((getMsg.Type == 2 && !mjuser.Is_tiant))
            {
                return;
            }
            int fw = mjuser.ZS_Fw;

            if (mjuser.ByteData == requestInfo.Key)
            {
                return;
            }
            else
            {
                mjuser.ByteData = requestInfo.Key;
            }
            Ting t = new Ting();
            List <model.ServerMaJiang> Returnmj = new List <model.ServerMaJiang>();

            Returnmj.AddRange(mjuser.majiangs.ToArray());
            if (getMsg.Type == 1 && !mjuser.Is_tianHu)
            {
                List <model.ServerMaJiang> Ruturnjsmj = new List <model.ServerMaJiang>();

                Ruturnjsmj = t.ReturnJMJ(Returnmj);
                Returnmj.Remove(Returnmj.Find(w => w.PaiHs == getMsg.Mj.PaiHS && w.PaiId == getMsg.Mj.PaiID));
                if (!Ruturnjsmj.Any(w => w.PaiHs == getMsg.Mj.PaiHS))
                {
                    return;//出的牌必须是打出听牌的集合中的一张
                }
            }
            if (getMsg.Type == 2 && t.GetTing(Returnmj) == "MJ")
            {
                mjuser.Is_tiant = false;
                return;
            }
            bool          isShenTianHu = false;
            List <mjuser> list         = new List <mjuser>();

            foreach (var item in listuser)
            {
                list.Add(item);
                if (!isShenTianHu)
                {
                    item.SendData.Clear();
                }
                if (item.Openid.Equals(getMsg.Openid))
                {
                    switch (getMsg.Type)
                    {
                    case 1:
                        if (mjuser.Is_tianHu)
                        {
                            mjuser.Is_tianHu = false;
                        }
                        var roomInfo = Gongyong.roomlist.FirstOrDefault(w => w.RoomID.Equals(getMsg.RoomID));
                        if (roomInfo != null)
                        {
                            roomInfo.LastMoMJ = new model.ServerMaJiang {
                                PaiHs = getMsg.Mj.PaiHS, PaiId = getMsg.Mj.PaiID
                            }
                        }
                        ;
                        item.Is_baotin = true;
                        break;

                    case 2:
                        item.Is_tiant = true;
                        CardUser cu = Gongyong.FKUser.Find(u => u.roomid == getMsg.RoomID);
                        item.Is_tiantX = 1;
                        byte[] startHY = ReturnHyUser.CreateBuilder().SetCz("3001").SetFw(cu.win).Build().ToByteArray();
                        if (!listuser.Any(w => w.Is_tiantX == -1))
                        {
                            if (room != null)
                            {
                                room.DQHY = cu.win;
                                room.DQcz = "3001";
                            }
                            List <mjuser> listmjuserstart = Gongyong.mulist.FindAll(u => u.RoomID == getMsg.RoomID);

                            foreach (var items in listmjuserstart)
                            {
                                UserInfo users = Gongyong.userlist.Find(u => u.openid == items.Openid);
                                users.IsActive = true;
                                users.session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 7004, startHY.Length, requestInfo.MessageNum, startHY)));
                            }
                            var msglist = Gongyong.roommsg.FindAll(u => u.roomid == getMsg.RoomID);
                            if (msglist.Count > 0)
                            {
                                Room r = Gongyong.roomlist.Find(u => u.RoomID == getMsg.RoomID);
                                foreach (var msgitem in msglist)
                                {
                                    var userInfo = Gongyong.userlist.Find(u => u.openid == msgitem.openid);
                                    if (userInfo != null)
                                    {
                                        isShenTianHu = true;
                                        var mjUser = listmjuserstart.Find(u => u.Openid.Equals(msgitem.openid));
                                        r.DQHY = mjUser.ZS_Fw;
                                        if (!list.Any(w => w.Openid.Equals(msgitem.openid)))    //如果外面的遍历已经遍历过当前用户 则不需要清理集合
                                        {
                                            mjUser.SendData.Clear();
                                        }
                                        var data = new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + msgitem.xiaoxihao, msgitem.ArrList.Length, requestInfo.MessageNum, msgitem.ArrList));
                                        mjUser.SendData.Add(data);
                                        userInfo.session.TrySend(data);

                                        //session.Logger.Debug("过牌后根据之前的消息分配活跃用户" + r.DQHY);
                                    }
                                }
                                Gongyong.roommsg.RemoveAll(u => u.roomid == r.RoomID);
                            }
                        }
                        break;

                    default:
                        break;
                    }
                }
                UserInfo user = Gongyong.userlist.Find(u => u.openid == item.Openid);
                if (getMsg.Type == 1)
                {
                    var    renturnmsg = ReturnBTMsg.CreateBuilder().SetFw(fw).Build();
                    byte[] r          = renturnmsg.ToByteArray();
                    var    data       = new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 5002, r.Length, requestInfo.MessageNum, r));
                    item.SendData.Add(data);
                    user.session.TrySend(data);
                }
                else
                {
                    var    renturnmsg = ReturnTT.CreateBuilder().SetFw(fw).Build();
                    byte[] r          = renturnmsg.ToByteArray();
                    var    data       = new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 5013, r.Length, requestInfo.MessageNum, r));
                    item.SendData.Add(data);
                    user.session.TrySend(data);
                }
            }

            //牌局回放 摸牌

            room.gameOperationProcess.AddGameOperationInfo(
                GameOperationInfo.CreateBuilder()
                .SetSerialNumber(room.gameOperationProcess.GameOperationInfoCount)
                .SetOperationFW(mjuser.ZS_Fw)
                .SetOperationType(6)
                .SetTingHuType(getMsg.Type + 1)
                );
        }
Пример #15
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="requestInfo">请求信息</param>
        /// <param name="sendmj">返回开始游戏集合</param>
        /// <param name="ReturnGangMSG">返回杠牌集合信息</param>
        /// <param name="Ruturnjsmj">返回打出叫牌的集合</param>
        /// <param name="session">ss请求</param>
        /// <param name="roomID">房间ID</param>
        /// <param name="mj">当前玩家</param>
        /// <param name="number">请求次数</param>
        /// <param name="openid"></param>
        public void GetMyCards(ProtobufRequestInfo requestInfo, ReturnStartGame.Builder sendmj, ReturnGang.Builder ReturnGangMSG,
                               List <model.ServerMaJiang> Ruturnjsmj, GameSession session, int roomID, mjuser mj, string openid, ref int number)
        {
            ReturnGangMSG = ReturnGang.CreateBuilder();
            Ruturnjsmj    = new List <model.ServerMaJiang>();
            ///房间牌堆
            List <model.ServerMaJiang> listmj = new List <model.ServerMaJiang>();
            CreateMj C = new CreateMj();

            mj.MopaiNumber = 0;

            ///房间牌堆赋值
            Room    R   = new Room();
            Room_JX rjx = new Room_JX();

            rjx = Gongyong.room_JX.Find(u => u.room_id == roomID);
            if (rjx != null)
            {
                rjx.room_peo = 0;
            }

            R = Gongyong.roomlist.Find(u => u.RoomID == roomID);
            R.MPS++;

            if (Gongyong.roomlist.Find(u => u.RoomID == roomID).RoomPai.Count == 0)
            {
                listmj = C.CreateMJ(R.IsYuanQue);
            }
            else
            {
                listmj = R.RoomPai;
            }
#if DEBUG
            /*    listmj.Insert(0, new ServerMaJiang { PaiHs = 2, PaiId = 201 });
             * listmj.Insert(0, new ServerMaJiang { PaiHs = 2, PaiId = 202 });
             * listmj.Insert(0, new ServerMaJiang { PaiHs = 2, PaiId = 203 });
             * listmj.Insert(0, new ServerMaJiang { PaiHs = 2, PaiId = 204 });
             * listmj.Insert(0, new ServerMaJiang { PaiHs = 1, PaiId = 205 });
             * listmj.Insert(0, new ServerMaJiang { PaiHs = 1, PaiId = 206 });
             * listmj.Insert(0, new ServerMaJiang { PaiHs = 1, PaiId = 207 });
             * listmj.Insert(0, new ServerMaJiang { PaiHs = 1, PaiId = 208 });
             * listmj.Insert(0, new ServerMaJiang { PaiHs = 5, PaiId = 209 });
             * listmj.Insert(0, new ServerMaJiang { PaiHs = 5, PaiId = 210 });
             * listmj.Insert(0, new ServerMaJiang { PaiHs = 6, PaiId = 211 });
             * listmj.Insert(0, new ServerMaJiang { PaiHs = 6, PaiId = 212 });
             * listmj.Insert(0, new ServerMaJiang { PaiHs = 7, PaiId = 213 });
             * listmj.Insert(0, new ServerMaJiang { PaiHs = 7, PaiId = 214 });  */
#endif
            R.startgame = 1;
            CardUser cu = Gongyong.FKUser.Find(u => u.roomid == roomID);
            if (cu == null)
            {
                cu            = new CardUser();
                cu.roomid     = roomID;
                cu.win        = 1;
                cu.dong       = 0;
                cu.xi         = 0;
                cu.nan        = 0;
                cu.bei        = 0;
                cu.jushu      = 0;
                cu.dongM      = 0;
                cu.xiM        = 0;
                cu.nan        = 0;
                cu.beiM       = 0;
                cu.lianzCount = 1;
                Gongyong.FKUser.Add(cu);
            }
            else
            {
                cu.dongM = 0;
                cu.xiM   = 0;

                cu.beiM = 0;
            }

            //  int x = 0;
            int y = 0;

            #region 根据玩家方位判断玩家手牌

            string logs = "";
            for (int i = 0; i < listmj.Count; i++)
            {
                logs += listmj[i].PaiHs + ",";
            }

            session.Logger.Debug("牌堆" + logs);

            //int x = 0;
            //int y = 0;

            if (mj.ZS_Fw == cu.win)
            {
                //  x = 0;
                y = 14;
            }
            else
            {
                // x = 0;
                y = 13;
            }
            #endregion


            ///组装下发数据
            foreach (var item in listmj.Take(y))
            {
                MaJiang fanmj = MaJiang.CreateBuilder().SetPaiHS(item.PaiHs).SetPaiID(item.PaiId).Build();
                mj.majiangs.Add(item);
                int count = mj.majiangs.Count;
                sendmj.AddMj(fanmj);
            }

            // number += y;
            listmj.RemoveRange(0, y);
            R.RoomPai = listmj;
            mj.majiangs.Sort((a, b) => - b.PaiHs.CompareTo(a.PaiHs));
            Gongyong.mulist.Add(mj);
            Ting t = new Ting();
            List <model.ServerMaJiang> listT = new List <model.ServerMaJiang>();
            listT.AddRange(mj.majiangs.ToArray());

            UserInfo userSendJ = Gongyong.userlist.Find(u => u.openid == openid);
            int      PaiHS     = 0;
            if (R.room_peo == 4 || R.IsYuanQue)
            {
                if (cu.win == mj.ZS_Fw)
                {
                    foreach (var item in listT)
                    {
                        List <model.ServerMaJiang> listchuan = listT.FindAll(u => u.PaiHs == item.PaiHs);
                        if (listchuan.Count == 4)
                        {
                            if (PaiHS != item.PaiHs)
                            {
                                var PGH = ReturnAll.CreateBuilder();
                                var mjG = MaJiang.CreateBuilder();
                                mjG.SetPaiHS(item.PaiHs);
                                mjG.SetPaiID(item.PaiId);

                                ReturnGangMSG.AddGang(GangMSG.CreateBuilder().SetFw(cu.win).SetMj(mjG).SetType(3));
                            }
                            PaiHS = item.PaiHs;
                        }
                    }


                    if (ReturnGangMSG.GangCount > 0)
                    {
                        byte[] bytegang = ReturnGangMSG.Build().ToByteArray();
                        userSendJ.session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 5022, bytegang.Length, requestInfo.MessageNum, bytegang)));
                    }
                }
            }
            var ttAthState = ReturnTTATH.CreateBuilder();

            if (cu.win == mj.ZS_Fw)
            {
                if (t.GetTing(listT) == "H")
                {
                    if (R.room_peo < 4)
                    {
                        switch (mj.QYM)
                        {
                        case 1:
                            if (mj.majiangs.FindAll(u => u.PaiHs < 10).Count <= 0)
                            {
                                // mj.Is_tiantX = -1;
                                ttAthState.SetState(214);
                                mj.Is_tianHu = true;
                            }
                            break;

                        case 2:
                            if (mj.majiangs.FindAll(u => u.PaiHs > 10 && u.PaiHs < 20).Count <= 0)
                            {
                                // mj.Is_tiantX = -1;
                                ttAthState.SetState(214);
                                mj.Is_tianHu = true;
                            }
                            break;

                        case 3:
                            if (mj.majiangs.FindAll(u => u.PaiHs > 20).Count <= 0)
                            {
                                //mj.Is_tiantX = -1;
                                ttAthState.SetState(214);
                                mj.Is_tianHu = true;
                            }
                            break;

                        default:
                            break;
                        }
                    }
                    else
                    {
                        ttAthState.SetState(214);
                        // mj.Is_tiantX = -1;
                        mj.Is_tianHu = true;
                    }
                }
                else
                {
                    if (R.room_peo < 4)
                    {
                        switch (mj.QYM)
                        {
                        case 1:
                            if (mj.majiangs.FindAll(u => u.PaiHs < 10).Count <= 0)
                            {
                                ///庄家报听判断
                                List <model.ServerMaJiang> JPMJ = new List <model.ServerMaJiang>();
                                JPMJ.AddRange(mj.majiangs.ToArray());

                                Ruturnjsmj = t.ReturnJMJ(JPMJ);
                            }

                            break;

                        case 2:
                            if (mj.majiangs.FindAll(u => u.PaiHs > 10 && u.PaiHs < 20).Count <= 0)
                            {
                                ///庄家报听判断
                                List <model.ServerMaJiang> JPMJ = new List <model.ServerMaJiang>();
                                JPMJ.AddRange(mj.majiangs.ToArray());
                                Ruturnjsmj = t.ReturnJMJ(JPMJ);
                            }
                            break;

                        case 3:
                            if (mj.majiangs.FindAll(u => u.PaiHs > 20).Count <= 0)
                            {
                                ///庄家报听判断
                                List <model.ServerMaJiang> JPMJ = new List <model.ServerMaJiang>();
                                JPMJ.AddRange(mj.majiangs.ToArray());
                                Ruturnjsmj = t.ReturnJMJ(JPMJ);
                            }
                            break;

                        default:
                            break;
                        }
                    }
                    else
                    {
                        ///庄家报听判断
                        List <model.ServerMaJiang> JPMJ = new List <model.ServerMaJiang>();
                        JPMJ.AddRange(mj.majiangs.ToArray());
                        Ruturnjsmj = t.ReturnJMJ(JPMJ);
                    }
                }
            }
            else
            {    ///判断天听
                if (t.GetTing(listT) != "MJ")
                {
                    if (R.room_peo < 4)
                    {
                        switch (mj.QYM)
                        {
                        case 1:
                            if (mj.majiangs.FindAll(u => u.PaiHs < 10).Count <= 0)
                            {
                                ttAthState.SetState(213);

                                mj.Is_tiantX = -1;
                                mj.Is_tiant  = true;
                            }
                            break;

                        case 2:
                            if (mj.majiangs.FindAll(u => u.PaiHs > 10 && u.PaiHs < 20).Count <= 0)
                            {
                                ttAthState.SetState(213);


                                mj.Is_tiantX = -1;
                                mj.Is_tiant  = true;
                            }
                            break;

                        case 3:
                            if (mj.majiangs.FindAll(u => u.PaiHs > 20).Count <= 0)
                            {
                                ttAthState.SetState(213);

                                mj.Is_tiantX = -1;
                                mj.Is_tiant  = true;
                            }
                            break;

                        default:
                            break;
                        }
                    }
                    else
                    {
                        ttAthState.SetState(213);

                        mj.Is_tiantX = -1;
                        mj.Is_tiant  = true;
                    }
                }
            }

            if (Ruturnjsmj.Count > 0)
            {
                var returntp = ReturnTP.CreateBuilder();
                var tmj      = MaJiang.CreateBuilder();
                foreach (var mjItem in Ruturnjsmj)
                {
                    tmj.SetPaiHS(mjItem.PaiHs);
                    tmj.SetPaiID(mjItem.PaiId);
                    returntp.AddMj(tmj);
                }
                byte[] tmjsr = returntp.Build().ToByteArray();
                userSendJ.session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 2009, tmjsr.Length, requestInfo.MessageNum, tmjsr)));
            }
            sendmj.SetChuuser(cu.win);
            sendmj.SetGamenumber(number);

            //牌局回放 发牌
            R.gameOperationProcess.AddGameOperationInfo(GameOperationInfo.CreateBuilder()
                                                        .SetOperationFW(mj.ZS_Fw)
                                                        .AddRangeMJ(sendmj.MjList)
                                                        .SetSerialNumber(R.gameOperationProcess.GameOperationInfoCount)
                                                        .SetOperationType(0)
                                                        .SetChuUser(cu.win)
                                                        );
            byte[] sendbyte = sendmj.Build().ToByteArray();
            userSendJ.session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 2006, sendbyte.Length, requestInfo.MessageNum, sendbyte)));

            if (ttAthState.HasState)
            {
                byte[] sendbytes = ttAthState.Build().ToByteArray();
                userSendJ.session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 2010, sendbytes.Length, requestInfo.MessageNum, sendbytes)));
            }
            ///判断房间人数满足 并且没有天听用户才发生活跃用户
            if (R.MPS == R.room_peo)
            {
                List <mjuser> listmjuserstart = Gongyong.mulist.FindAll(u => u.RoomID == mj.RoomID);
                var           userbool        = Gongyong.mulist.FindAll(u => u.RoomID == R.RoomID && u.Is_tiant == true);
                if (userbool.Count == 0 && (R.room_peo == 4 || R.IsYuanQue))//当原缺或者四人桌,没有人天听的时候 为庄家挂上倒计时出牌
                {
                    byte[] startHY = ReturnHyUser.CreateBuilder().SetCz("3001").SetFw(cu.win).Build().ToByteArray();
                    R.DQHY = cu.win;
                    R.DQcz = "3001";
                    foreach (var item in listmjuserstart)
                    {
                        UserInfo user = Gongyong.userlist.Find(u => u.openid == item.Openid);
                        user.IsActive = true;
                        user.session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 7004, startHY.Length, GameInformationBase.BASEAGREEMENTNUMBER + 7093, startHY)));
                    }
                    if (number == 0)
                    {
                        ThreadUtility.StartManagedThread(listmjuserstart.Find(w => w.ZS_Fw == cu.win).Openid, R.RoomID, R.DQcz);
                    }
                }
                else if (userbool.Count > 0)//当有天听时, 为每个天听用户挂上倒计时
                {
                    R.DQHY = 0;
                    R.DQcz = "30071";
                    if (number == 0)
                    {
                        foreach (var item in userbool)
                        {
                            ThreadUtility.StartManagedThread(item.Openid, R.RoomID, R.DQcz);
                        }
                    }
                }
                else//需要选择缺一门时 为每个用户挂上倒计时
                {
                    R.DQHY = 0;
                    R.DQcz = "3002";
                    if (number == 0)
                    {
                        foreach (var item in listmjuserstart)
                        {
                            ThreadUtility.StartManagedThread(item.Openid, R.RoomID, R.DQcz);
                        }
                    }
                }
                foreach (var item in listmjuserstart)
                {
                    UserInfo user         = Gongyong.userlist.Find(u => u.openid == item.Openid);
                    byte[]   returnzhuang = ReturnZhuang.CreateBuilder().SetZhuang(cu.win).SetSeizi(cu.Points).SetZhuangCount(cu.lianzCount).Build().ToByteArray();
                    user.session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 5020, returnzhuang.Length, GameInformationBase.BASEAGREEMENTNUMBER + 7093, returnzhuang)));
                }
                // ThreadUtility.StartManagedThread(R.RoomID.ToString(), R.RoomID);
                StringBuilder mjrz = new StringBuilder();
                //foreach (var item in mj.majiangs)
                //{

                //    mjrz.Append(item.PaiHs + ",");

                //}
                //session.Logger.Debug("方位------" + mj.ZS_Fw + "----" + mjrz);
                number++;
            }
        }
Пример #16
0
        public void ExecuteCommand(GameSession session, ProtobufRequestInfo requestInfo)
        {
            if (!Gongyong.userlist.Any(w => w.session.SessionID.Equals(session.SessionID)))
            {
                session.Logger.Debug("RemoveRoom : 非法连接");
                session.Close();
                return;
            }
            var    getdata = SendJS.ParseFrom(requestInfo.Body);
            mjuser rst     = Gongyong.mulist.Find(u => u.Openid == getdata.Openid);
            int    roomid  = getdata.Roomid;
            Room   r       = Gongyong.roomlist.Find(u => u.RoomID == roomid);

            if (rst == null)
            {
                if (r != null)
                {
                    if (!Gongyong.mulist.Any(w => w.RoomID == roomid))
                    {
                        Gongyong.roomlist.Remove(r);
                        RedisUtility.Remove(RedisUtility.GetKey(GameInformationBase.COMMUNITYROOMINFO, r.RoomID.ToString(), ""));
                    }
                }
                RedisUtility.Remove(RedisUtility.GetKey(GameInformationBase.COMMUNITYUSERGAME, getdata.Openid, getdata.Unionid));
                return;
            }
            if (r == null)
            {
                return;
            }

            int fw = Gongyong.mulist.Find(u => u.Openid == getdata.Openid).ZS_Fw;

            session.Logger.Debug(Name + "|" + getdata.ToString());
            string        nickname          = Gongyong.userlist.Find(u => u.openid == getdata.Openid).nickname;
            var           disbandedRoomInfo = RedisUtility.Get <DisbandedRoomInfo>((RedisUtility.GetKey(GameInformationBase.COMMUNITYDISBANDED, getdata.Openid, getdata.Unionid)));
            List <mjuser> listuser          = Gongyong.mulist.FindAll(u => u.RoomID == roomid);

            ///判断游戏是否开始(未开始直接解散,开始则发送消息)
            if (r.startgame != 1 && rst.IsHomeowner)
            {
                new UserExitLogic().DissolutionRoom(r, requestInfo.MessageNum, 1);
            }
            else if (disbandedRoomInfo != null && (DateTime.Now - disbandedRoomInfo.Time).TotalSeconds < 5)//
            {
                var data = ReturnDisbandedFailure.CreateBuilder().SetStatus(1).Build().ToByteArray();
                session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 5010, data.Length, requestInfo.MessageNum, data)));
            }
            else
            {
                if (disbandedRoomInfo == null)
                {
                    var disbandedRoom = new DisbandedRoomInfo {
                        OpenID = getdata.Openid, RoomID = roomid, Time = DateTime.Now
                    };
                    RedisUtility.Set(RedisUtility.GetKey(GameInformationBase.COMMUNITYDISBANDED, getdata.Openid, getdata.Unionid), disbandedRoom, 1);
                }
                if (!Gongyong.roomclear.Any(w => w.RoomID == roomid))
                {
                    RoomClear rc = new RoomClear()
                    {
                        Status = 1,
                        RoomID = roomid
                    };
                    var    Rdata  = ReturnJSMsg.CreateBuilder().SetFw(fw).SetNickName(nickname);
                    byte[] Rtbyte = Rdata.Build().ToByteArray();
                    foreach (var item in listuser)
                    {
                        if (item.Openid != getdata.Openid)
                        {
                            rc.RoomPeo.Add(item.Openid);
                        }
                        UserInfo user = Gongyong.userlist.Find(u => u.openid == item.Openid);
                        user.session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 5004, Rtbyte.Length, requestInfo.MessageNum, Rtbyte)));
                    }

                    Gongyong.roomclear.Add(rc);
                    ThreadUtility.AddCountdownRemoveRoomThread(roomid.ToString());//当有用户申请解散房间,倒计时开始。
                }
                else
                {
                    var data = SendJSIdea.CreateBuilder().SetOpenid(getdata.Openid).SetRoomid(roomid).SetState(1).Build().ToByteArray();
                    //  new ArraySegment<byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 5005, data.Length, requestInfo.MessageNum, data));
                    new ClearByUser().ExecuteCommand(session,
                                                     new ProtobufRequestInfo {
                        Body = data, Key = (GameInformationBase.BASEAGREEMENTNUMBER + 5005).ToString(), Messagelength = data.Length, MessageNum = GameInformationBase.BASEAGREEMENTNUMBER + 5005, MessageResNum = 0
                    });
                }
                //  ThreadUtility.StartCountdownRemoveRoomThread(roomid.ToString());
            }
        }