void SendQueYiMenMessage(GameInfo.QueType queType) { //发送缺一门消息给服务器 //var qym = SendQYM.CreateBuilder().SetType((int)queType).SetOpenid(GameInfo.OpenID).Build(); //byte[] body = qym.ToByteArray(); var qym = new SendQYM(); qym.type = (int)queType; qym.openid = GameInfo.OpenID; byte[] body = ProtobufUtility.GetByteFromProtoBuf(qym); byte[] data = CreateHead.CreateMessage(CreateHead.CSXYNUM + 5011, body.Length, 0, body); GameInfo.cs.Send(data); }
public void CallBack(object state) { var roomInfo = Gongyong.roomlist.Find(w => w.RoomID == roomID); if (roomInfo == null) { return; } var muInfo = Gongyong.mulist.Find(w => w.Openid.Equals(openID)); if (muInfo == null) { return; } //lock (ThreadUtility.myObject) //{ } if (roomInfo.QuickCard)//只有快速出牌才会有10秒出牌roomInfo.DQHY== mulist.ZS_Fw { var info = new ProtobufRequestInfo(); var userInfo = Gongyong.userlist.Find(w => w.openid.Equals(muInfo.Openid)); if (currentOperation.IndexOf("30071") >= 0 && muInfo.Is_tiantX == -1)//天听 { userInfo.session.Logger.Debug("10秒后自动30071:" + userInfo.openid); info = new ProtobufRequestInfo(); // var userInfo = Gongyong.userlist.Find(w => w.openid.Equals(muInfo.Openid)); var guo = SendPeng.CreateBuilder() .SetState(2) .SetOpenid(userInfo.openid) .SetRoomid(roomID) .SetTypes(4); info = new ProtobufRequestInfo(); guo.SetFW(roomInfo.DQHY); info.Body = guo.Build().ToByteArray(); info.Key = "14001"; info.Messagelength = info.Body.Length; info.MessageNum = 14001; info.MessageResNum = 0; new Gang().ExecuteCommand(userInfo.session, info); } else if (currentOperation.IndexOf("3002") >= 0 && muInfo.QYM == 0) { userInfo.session.Logger.Debug("10秒后自动3002:" + userInfo.openid); //foreach (var item in Gongyong.mulist.FindAll(w =>w.RoomID==roomID&& w.QYM == 0)) //{ } info = new ProtobufRequestInfo(); userInfo = Gongyong.userlist.Find(w => w.openid.Equals(muInfo.Openid)); var qym = muInfo.majiangs.Select(w => new { Tong = (w.PaiHs < 10 ? 1 : 0), Tiao = (w.PaiHs > 10 && w.PaiHs < 20 ? 1 : 0), Wan = (w.PaiHs > 20 ? 1 : 0) });//遍历所有花色 var mydata = from r in qym group r by new { r.Tiao, r.Tong, r.Wan } into g select new { key = g.Key, number = g.Count() }; //统计花色 var key = mydata.OrderBy(w => w.number).FirstOrDefault().key; //取出最少的花色 info.Body = SendQYM.CreateBuilder().SetType(key.Tiao == 1 ? 2 : (key.Tong == 1 ? 1 : 3)).SetOpenid(muInfo.Openid).Build().ToByteArray(); info.Key = "15011"; info.Messagelength = info.Body.Length; info.MessageNum = 14001; info.MessageResNum = 0; new QYM().ExecuteCommand(userInfo.session, info); } else if (roomInfo.DQHY == muInfo.ZS_Fw) { // var muInfo = Gongyong.mulist.Find(w => w.ZS_Fw == roomInfo.DQHY && w.RoomID == roomID); info = new ProtobufRequestInfo(); if (currentOperation.Equals("30083")) { if (muInfo.ByteData == "13002")//因为摸牌逻辑比较多处理时间长, { return; } if (userInfo != null) { var mp = SendMP.CreateBuilder().SetMType(0).SetOpenid(muInfo.Openid).SetRoomid(roomID).Build(); var data = mp.ToByteArray(); info.Body = data; info.Key = "13002"; info.Messagelength = data.Length; info.MessageNum = 13002; info.MessageResNum = 0; new MoPai().ExecuteCommand(userInfo.session, info); userInfo.session.Logger.Debug("10秒后自动摸牌" + mp); } } if (currentOperation.IndexOf("30082") >= 0)//杠牌 { userInfo.session.Logger.Debug("10秒后自动30082:" + userInfo.openid); var guo = SendPeng.CreateBuilder() .SetState(2) .SetMj(MaJiang.CreateBuilder() .SetPaiHS(roomInfo.PaiHSCZ.PaiHs) .SetPaiID(roomInfo.PaiHSCZ.PaiId)) .SetOpenid(userInfo.openid) .SetRoomid(roomID) .SetTypes(2); info = new ProtobufRequestInfo(); var dqcz = currentOperation.Split(','); switch (dqcz[1]) { case "1": guo.SetFW(int.Parse(dqcz[2])).SetGtype("M"); break; case "2": guo.SetFW(roomInfo.DQHY).SetGtype("Z"); break; case "3": guo.SetFW(roomInfo.DQHY).SetGtype("A"); break; case "4": guo.SetFW(roomInfo.DQHY).SetGtype("h"); break; } info.Body = guo.Build().ToByteArray(); info.Key = "14001"; info.Messagelength = info.Body.Length; info.MessageNum = 14001; info.MessageResNum = 0; new Gang().ExecuteCommand(userInfo.session, info); } else if (currentOperation.IndexOf("30081") >= 0)//碰 { userInfo.session.Logger.Debug("10秒后自动30081:" + userInfo.openid); var guo = SendPeng.CreateBuilder() .SetState(2) .SetMj(MaJiang.CreateBuilder() .SetPaiHS(roomInfo.PaiHSCZ.PaiHs) .SetPaiID(roomInfo.PaiHSCZ.PaiId)) .SetOpenid(userInfo.openid) .SetRoomid(roomID) .SetTypes(1); info = new ProtobufRequestInfo(); var dqcz = currentOperation.Split(','); guo.SetFW(int.Parse(dqcz[1])); info.Body = guo.Build().ToByteArray(); info.Key = "14001"; info.Messagelength = info.Body.Length; info.MessageNum = 14001; info.MessageResNum = 0; new Gang().ExecuteCommand(userInfo.session, info); } else if (currentOperation.IndexOf("30070") >= 0)//天胡 { userInfo.session.Logger.Debug("10秒后自动30070:" + userInfo.openid); var guo = SendPeng.CreateBuilder() .SetState(2) .SetOpenid(userInfo.openid) .SetRoomid(roomID) .SetTypes(5); info = new ProtobufRequestInfo(); var dqcz = currentOperation.Split(','); guo.SetFW(roomInfo.DQHY); info.Body = guo.Build().ToByteArray(); info.Key = "14001"; info.Messagelength = info.Body.Length; info.MessageNum = 14001; info.MessageResNum = 0; new Gang().ExecuteCommand(userInfo.session, info); } else if (currentOperation.IndexOf("30080") >= 0)//胡 { userInfo.session.Logger.Debug("30080:" + userInfo.openid); var guo = SendPeng.CreateBuilder() .SetState(2) .SetOpenid(userInfo.openid) .SetRoomid(roomID) .SetTypes(3).SetMj(MaJiang.CreateBuilder() .SetPaiHS(roomInfo.PaiHSCZ.PaiHs) .SetPaiID(roomInfo.PaiHSCZ.PaiId)); info = new ProtobufRequestInfo(); // var dqcz = currentOperation.Split(','); guo.SetFW(roomInfo.DQHY); info.Body = guo.Build().ToByteArray(); info.Key = "14001"; info.Messagelength = info.Body.Length; info.MessageNum = 14001; info.MessageResNum = 0; new Gang().ExecuteCommand(userInfo.session, info); } else if (currentOperation.IndexOf("3001") >= 0)//出牌 { userInfo.session.Logger.Debug("10秒后自动3001:" + userInfo.openid); var chu = SendCP.CreateBuilder() .SetRoomid(roomID) .SetOpenid(userInfo.openid) .SetType(0); switch (muInfo.QYM) { case 1: if (muInfo.majiangs.Any(u => u.PaiHs < 10)) { var mj = muInfo.majiangs.Find(u => u.PaiHs < 10); chu.SetMj(MaJiang.CreateBuilder() .SetPaiHS(mj.PaiHs) .SetPaiID(mj.PaiId)); } else { chu.SetMj(MaJiang.CreateBuilder() .SetPaiHS(muInfo.majiangs.Last().PaiHs) .SetPaiID(muInfo.majiangs.Last().PaiId)); } break; case 2: if (muInfo.majiangs.Any(u => u.PaiHs > 10 && u.PaiHs < 20)) { var mj = muInfo.majiangs.Find(u => u.PaiHs > 10 && u.PaiHs < 20); chu.SetMj(MaJiang.CreateBuilder() .SetPaiHS(mj.PaiHs) .SetPaiID(mj.PaiId)); } else { chu.SetMj(MaJiang.CreateBuilder() .SetPaiHS(muInfo.majiangs.Last().PaiHs) .SetPaiID(muInfo.majiangs.Last().PaiId)); } break; case 3: if (muInfo.majiangs.Any(u => u.PaiHs > 20)) { var mj = muInfo.majiangs.Find(u => u.PaiHs > 20); chu.SetMj(MaJiang.CreateBuilder() .SetPaiHS(mj.PaiHs) .SetPaiID(mj.PaiId)); } else { chu.SetMj(MaJiang.CreateBuilder() .SetPaiHS(muInfo.majiangs.Last().PaiHs) .SetPaiID(muInfo.majiangs.Last().PaiId)); } break; default: chu.SetMj(MaJiang.CreateBuilder() .SetPaiHS(muInfo.majiangs.Last().PaiHs) .SetPaiID(muInfo.majiangs.Last().PaiId)); break; } info = new ProtobufRequestInfo(); info.Body = chu.Build().ToByteArray(); info.Key = "13001"; info.Messagelength = info.Body.Length; info.MessageNum = 14001; info.MessageResNum = 0; new ChuPai().ExecuteCommand(userInfo.session, info); } //if (roomInfo.DQHY == muInfo.ZS_Fw) // this.CallBack(null); if (userInfo.session != null && userInfo.session.Connected)//发送托管请求 { var data = ReturnManaged.CreateBuilder().SetState(1).Build().ToByteArray(); userInfo.session.TrySend(new ArraySegment <byte>(CreateHead.CreateMessage(GameInformationBase.BASEAGREEMENTNUMBER + 2011, data.Length, 0, data))); } } } // GC.Collect(); // MyTimer.Dispose(); // this.Dispose(); }
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); } } }