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(); }
private static void AppServerOnNewRequestReceived(ProtobufAppSession session, ProtobufRequestInfo requestInfo) { switch (requestInfo.Type) { case DefeatMessage.Types.Type.BackMessage: Console.WriteLine("BackMessage:{0}", requestInfo.Body.BackMessage.Content); break; case DefeatMessage.Types.Type.CallMessage: var content = requestInfo.Body.CallMessage.Content.Split('%'); var contentBody = content[0]; var color = (ConsoleColor)Enum.Parse(typeof(ConsoleColor), content[1]); //Console.WriteLine("CallMessage:{0}", requestInfo.Body.CallMessage.Content); ColoredConsoleWriteLine(color, contentBody); var backMessage = BackMessage.CreateBuilder() .SetContent("Hello I am form C# server by SuperSocket").Build(); var message = DefeatMessage.CreateBuilder() .SetType(DefeatMessage.Types.Type.BackMessage) .SetBackMessage(backMessage).Build(); using (var stream = new MemoryStream()) { CodedOutputStream os = CodedOutputStream.CreateInstance(stream); os.WriteMessageNoTag(message); os.Flush(); byte[] data = stream.ToArray(); session.Send(new ArraySegment <byte>(data)); } break; } }
/// <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++; } }