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); }
/// <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; }
/// <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); } }
/// <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))); }
internal void UserExit(mjuser muInfo, int roomID, string openid, int v1, object p, bool v2) { throw new NotImplementedException(); }
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); } } }
/// <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; } }
/// <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); }
// 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); }
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); } } }
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); }
/// <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); }
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); } } }
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) ); }
/// <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++; } }
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()); } }