/// <summary> /// 错误返回 /// </summary> private void RecvError(byte[] args) { //上次发给服务器的消息Id int LastSendId = MsgParse.PopByte(ref args); int errorId = MsgParse.PopByte(ref args); switch (errorId) { case 0: Log.Warning("未知错误"); break; case 1: Log.Warning("登录失败,密码有误"); break; case 2: Log.Warning("权限不足"); break; case 3: Log.Warning("启动游戏失败"); break; default: Log.Warning("未知错误"); break; } }
private void RecvNotifyDraw(byte[] args) { int gId = MsgParse.PopInt(ref args); if (gId != RoomManager.Instance.rData.gId.Value) { return; } byte rank = MsgParse.PopByte(ref args); byte suit = MsgParse.PopByte(ref args); int pId = MsgParse.PopInt(ref args); int localRank = CardManager.CardConvert2C(suit, rank); var player = RoomManager.Instance.rData.GetPlayer(pId); if (player != null) { if (player.handCardsData.Count == 0) { player.state = EPlayerState.Deal; } player.handCardsData.Add(localRank); } Log.Debug("给id={2},{0}发牌数据,本地序号={1},牌个数={3}", player.name, localRank, pId, player.handCardsData.Count); }
private void RecvGood(byte[] args) { var cmd = MsgParse.PopByte(ref args); Log.Debug("Good={0}", cmd); switch (cmd) { case Protocal.WATCH: { NetWorkManager.Instance.Send(Protocal.SEAT_QUERY, RoomManager.Instance.rData.gId.Value); } break; case Protocal.LEAVE: { RoomManager.Instance.Self.Value.state = EPlayerState.Watch; } break; case Protocal.READY_CANCEL: { RoomManager.Instance.Self.Value.state = EPlayerState.Seat; } break; case Protocal.READY: { RoomManager.Instance.Self.Value.state = EPlayerState.GamePrepare; } break; } }
/// <summary> /// Q3 TCP的发送消息函数 /// </summary> /// <param name="id">协议id,参看Protocal.cs</param> /// <param name="args">若干参数,参看MsgParse来Push参数</param> public void Send(byte id, params object[] args) { Q3Packet msg = new Q3Packet(); byte[] buffer = new byte[0]; MsgParse.PushByte(id, ref buffer); foreach (var arg in args) { if (arg is byte) { MsgParse.PushByte((byte)arg, ref buffer); } else if (arg is string) { MsgParse.PushString((string)arg, ref buffer); } else if (arg is int) { MsgParse.PushInt((int)arg, ref buffer); } } msg.SetArgs(buffer); channel.Send(msg); Log.Debug("->>>>>>>>>>>>{0},{1}", id, args); }
private void RecvPlayerSummary(byte[] args) { int pId = MsgParse.PopInt(ref args); int score = MsgParse.PopInt(ref args); string userId = MsgParse.PopString(ref args); string userLoc = MsgParse.PopString(ref args); RoomManager.Instance.rData.SetPlayerData(pId, userId, userLoc, score); }
public static void PushShort(short number, ref byte[] curArray) { byte[] intArray = BitConverter.GetBytes(number); MsgParse.ReverseBytes(ref intArray); byte[] combimeArray = new byte[curArray.Length + 2]; Buffer.BlockCopy(curArray, 0, combimeArray, 0, curArray.Length); Buffer.BlockCopy(intArray, 0, combimeArray, curArray.Length, 2); curArray = combimeArray; }
public static short PopShort(ref byte[] data) { byte[] intArray = new byte[2]; Buffer.BlockCopy(data, 0, intArray, 0, 2); MsgParse.ReverseBytes(ref intArray); byte[] newData = new byte[data.Length - 2]; Buffer.BlockCopy(data, 2, newData, 0, data.Length - 2); data = newData; return(BitConverter.ToInt16(intArray, 0)); }
private void RecvBalance(byte[] args) { int balance = MsgParse.PopInt(ref args); int score = MsgParse.PopInt(ref args); var self = RoomManager.Instance.rData.playerSelf; self.Value.score.Value = score; self.Value.balance.Value = balance; self.Value.state = EPlayerState.SeatPre; }
//登录处理設置PID private void RecvLogin(byte[] args) { int PID = MsgParse.PopInt(ref args); RoleData role = GameManager.Instance.GetRoleData(); role.pId.Value = PID; Log.Debug("login success,pid = {0}", PID); NetWorkManager.Instance.Send(Protocal.WATCH, RoomManager.Instance.rData.gId.Value); NetWorkManager.Instance.Send(Protocal.SEAT_QUERY, RoomManager.Instance.rData.gId.Value); }
public static int PopInt(ref byte[] data) { byte[] intArray = new byte[4]; Buffer.BlockCopy(data, 0, intArray, 0, 4); MsgParse.ReverseBytes(ref intArray); byte[] newData = new byte[data.Length - 4]; Buffer.BlockCopy(data, 4, newData, 0, data.Length - 4); data = newData; return(BitConverter.ToInt32(intArray, 0)); }
private void RecvBIDREQ(byte[] args) { int gId = MsgParse.PopInt(ref args); if (gId != RoomManager.Instance.rData.gId.Value) { return; } RoomManager.Instance.Self.Value.state = EPlayerState.Banker; }
private void RecvNotifyStart(byte[] args) { int gid = MsgParse.PopInt(ref args); if (gid != RoomManager.Instance.rData.gId.Value) { return; } //牌管理器初始化 CardManager.Instance.Reset(); //所有人状态变为发牌 foreach (var player in RoomManager.Instance.rData.allPlayers) { player.state = EPlayerState.GameStart; } }
public bool Serialize <T>(T packet, Stream destination) where T : GameFramework.Network.Packet { var c2SPacket = (object)packet as Q3Packet; var dataArray = c2SPacket.args; byte[] sendArray = new byte[2 + dataArray.Length]; var sizeArray = BitConverter.GetBytes((short)dataArray.Length); MsgParse.ReverseBytes(ref sizeArray); sendArray[0] = sizeArray[0]; sendArray[1] = sizeArray[1]; Buffer.BlockCopy(dataArray, 0, sendArray, 2, dataArray.Length); destination.Write(sendArray, 0, sendArray.Length); return(true); }
private void RecvNotifyButton(byte[] args) { int gId = MsgParse.PopInt(ref args); if (gId != RoomManager.Instance.rData.gId.Value) { return; } int pId = MsgParse.PopInt(ref args); var player = RoomManager.Instance.rData.GetPlayer(pId); if (player != null) { RoomManager.Instance.rData.bid.Value = player.id.Value; } }
public IPacketHeader DeserializePacketHeader(Stream source, out object customErrorData) { Q3PacketHeader header = new Q3PacketHeader(); try { byte[] buffer = new byte[2]; source.Read(buffer, 0, 2); MsgParse.ReverseBytes(ref buffer); header.PacketLength = BitConverter.ToInt16(buffer, 0); } catch (Exception ex) { Log.Error(ex); } customErrorData = null; return(header); }
private void RecvNotifyBet(byte[] args) { int gId = MsgParse.PopInt(ref args); if (gId != RoomManager.Instance.rData.gId.Value) { return; } int pId = MsgParse.PopInt(ref args); int amount = MsgParse.PopInt(ref args); var player = RoomManager.Instance.rData.GetPlayer(pId); if (player != null) { player.bet.Value = amount; player.score.Value = player.score.Value - amount; } }
private void RecvNotifyChat(byte[] args) { int gid = MsgParse.PopInt(ref args); if (gid != RoomManager.Instance.rData.gId.Value) { return; } int pId = MsgParse.PopInt(ref args); MsgParse.PopShort(ref args); var content = MsgParse.PopString(ref args); var player = RoomManager.Instance.rData.GetPlayer(pId); if (player != null) { player.tableUI.PopTalk(player.headUI.cardPos, content); } }
private void RecvNotifyReadyCancel(byte[] args) { int gId = MsgParse.PopInt(ref args); if (gId != RoomManager.Instance.rData.gId.Value) { return; } int pId = MsgParse.PopInt(ref args); var player = RoomManager.Instance.rData.GetPlayer(pId); if (player != null && player != RoomManager.Instance.Self.Value) { player.state = EPlayerState.Seat; } else if (GameManager.Instance.IsSelf(pId)) { RoomManager.Instance.Self.Value.state = EPlayerState.Seat; } }
private void RecvNotifyLeave(byte[] args) { int gid = MsgParse.PopInt(ref args); if (gid != RoomManager.Instance.rData.gId.Value) { return; } int pId = MsgParse.PopInt(ref args); Player player = GameManager.Instance.IsSelf(pId) ?RoomManager.Instance.Self.Value : RoomManager.Instance.rData.GetPlayer(pId); if (player != null) { player.state = EPlayerState.Watch; RoomManager.Instance.rData.roomSeats[player.pos.Value].pid = 0; RoomManager.Instance.rData.roomSeats[player.pos.Value].state = 0; if (!GameManager.Instance.IsSelf(pId)) { player.Clear(); } } }
private void RecvNotifyPrivate(byte[] args) { int gId = MsgParse.PopInt(ref args); if (gId != RoomManager.Instance.rData.gId.Value) { return; } int pId = MsgParse.PopInt(ref args); var player = RoomManager.Instance.rData.GetPlayer(pId); if (player != null) { if (player.handCardsData.Count == 0) { player.state = EPlayerState.Deal; } player.handCardsData.Add(0); } Log.Debug("给id={2},{0}发牌数据,本地序号={1},牌个数={3}", player.name, 0, pId, player.handCardsData.Count); }
private void RecvNotifyStage(byte[] args) { int gId = MsgParse.PopInt(ref args); if (gId != RoomManager.Instance.rData.gId.Value) { return; } var stage = MsgParse.PopByte(ref args); int mm = MsgParse.PopInt(ref args); RoomManager.Instance.rData.timer.Value = mm / (float)1000; RoomManager.Instance.rData.maxCoolTime.Value = mm / (float)1000; Log.Debug("通知Stage={0},time={1}", stage, RoomManager.Instance.rData.timer.Value); /* * Stage: * 1 - 抢庄 * 2 - 下注 * 3 - 开牌 */ foreach (var player in RoomManager.Instance.rData.allPlayers) { if (stage == 1) { player.state = EPlayerState.Banker; } else if (stage == 2) { Observable.Timer(TimeSpan.FromSeconds(2)).Subscribe(x => player.state = EPlayerState.Bet); } else if (stage == 3) { player.ClearCards(); player.state = EPlayerState.End; } } }
//设置座位状态 private void RecvSeatState(byte[] args) { int gid = MsgParse.PopInt(ref args); if (gid != RoomManager.Instance.rData.gId.Value) { return; } byte pos = MsgParse.PopByte(ref args); byte state = MsgParse.PopByte(ref args); int pId = MsgParse.PopInt(ref args); Log.Debug("设置座位状态pos={0},pid={1}", pos, pId); RoomManager.Instance.rData.roomSeats[pos].pid = pId; RoomManager.Instance.rData.roomSeats[pos].state = state; RoomManager.Instance.rData.roomSeats[pos].pos = pos; if (pId > 0) { //通过PID获取玩家的基本信息 NetWorkManager.Instance.Send(Protocal.PLAYER_INFO, pId); } }
private void RecvNotifyWin(byte[] args) { int gId = MsgParse.PopInt(ref args); if (gId != RoomManager.Instance.rData.gId.Value) { return; } int pId = MsgParse.PopInt(ref args); int amount = MsgParse.PopInt(ref args); var player = RoomManager.Instance.rData.GetPlayer(pId); if (player != null) { Log.Debug("player分数变化-》{0}", amount); // player.score.Value += amount; if (amount == 0) { player.winFlag.Value = 0; } else if (amount > 0) { player.winFlag.Value = 1; } else { player.winFlag.Value = -1; } } //获取所有玩家最新分数信息 foreach (var pForScore in RoomManager.Instance.rData.allPlayers) { NetWorkManager.Instance.Send(Protocal.PLAYER_INFO, pForScore.id.Value); } }
private void RecvNotifyJoin(byte[] args) { int gId = MsgParse.PopInt(ref args); if (gId != RoomManager.Instance.rData.gId.Value) { return; } int pId = MsgParse.PopInt(ref args); byte pos = MsgParse.PopByte(ref args); int score = MsgParse.PopInt(ref args); //通过PID获取玩家的基本信息 NetWorkManager.Instance.Send(Protocal.PLAYER_INFO, pId); if (pId == GameManager.Instance.GetRoleData().pId.Value) { RoomManager.Instance.Self.Value.SetPos(pos); RoomManager.Instance.Self.Value.state = EPlayerState.Seat; RoomManager.Instance.Self.Value.score.Value = score; } else { var player = RoomManager.Instance.rData.GetPlayer(pId) as PlayerOther; if (player == null) { player = new PlayerOther(); player.id.Value = pId; player.InitData(); player.SetPos(pos); player.state = EPlayerState.Seat; player.score.Value = score; RoomManager.Instance.rData.roomPlayers.Add(player); } } }
private void RecvNotifyState(byte[] args) { int gId = MsgParse.PopInt(ref args); if (gId != RoomManager.Instance.rData.gId.Value) { return; } int pId = MsgParse.PopInt(ref args); int state = MsgParse.PopByte(ref args); var player = RoomManager.Instance.rData.GetPlayer(pId); if (player != null && player != RoomManager.Instance.Self.Value) { if (state == 2) { player.state = EPlayerState.GamePrepare; } else if (state == 3) { player.state = EPlayerState.Seat; } } }
public void Handle(object sender, GameFramework.Network.Packet packet) { var basePacket = (BasePacket)packet; var args = basePacket.args; var msgId = MsgParse.PopByte(ref args); if (msgId != 23 && msgId != 38) { Log.Debug("<<<<<<<<<<<<<<<<<<<<{0}", msgId); } switch (msgId) { case Protocal.Error: RecvError(args); break; case Protocal.GOOD: RecvGood(args); break; case Protocal.RecvLogin: RecvLogin(args); break; case Protocal.NOTIFY_DRAW: RecvNotifyDraw(args); break; case Protocal.NOTIFY_PRIVATE: RecvNotifyPrivate(args); break; case Protocal.NOTIFY_SHARED: RecvNotifyShared(args); break; case Protocal.NOTIFY_JOIN: RecvNotifyJoin(args); break; case Protocal.NOTIFY_LEAVE: RecvNotifyLeave(args); break; case Protocal.NOTIFY_CHAT: RecvNotifyChat(args); break; case Protocal.NOTIFY_START: RecvNotifyStart(args); break; case Protocal.NOTIFY_END: RecvNotifyEnd(args); break; case Protocal.NOTIFY_WIN: RecvNotifyWin(args); break; case Protocal.NOTIFY_BET: RecvNotifyBet(args); break; case Protocal.NOTIFY_RAISE: RecvNotifyRaise(args); break; case Protocal.NOTIFY_CALL: RecvNotifyCall(args); break; case Protocal.NOTIFY_STATE: RecvNotifyState(args); break; case Protocal.NOTIFY_STAGE: RecvNotifyStage(args); break; case Protocal.NOTIFY_BUTTON: RecvNotifyButton(args); break; case Protocal.BALANCE: RecvBalance(args); break; case Protocal.NOTIFY_SB: RecvNotifySB(args); break; case Protocal.NOTIFY_BB: RecvNotifyBB(args); break; case Protocal.SEAT_STATE: RecvSeatState(args); break; case Protocal.PLAYER_SUMMARY: RecvPlayerSummary(args); break; case Protocal.NOTIFY_READY: RecvNotifyReady(args); break; case Protocal.NOTIFY_READY_CANCEL: RecvNotifyReadyCancel(args); break; case Protocal.BID_REQ: RecvBIDREQ(args); break; case Protocal.NOTIFY_BID: RecvNotifyBid(args); break; case Protocal.NOTIFY_LAY: RecvNotifyLay(args); break; default: break; } }