Beispiel #1
0
    /// <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;
        }
    }
Beispiel #2
0
    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);
    }
Beispiel #3
0
    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;
        }
    }
Beispiel #4
0
    /// <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);
    }
Beispiel #5
0
    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);
    }
Beispiel #6
0
 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;
 }
Beispiel #7
0
 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));
 }
Beispiel #8
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;
    }
Beispiel #9
0
    //登录处理設置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);
    }
Beispiel #10
0
 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));
 }
Beispiel #11
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;
    }
Beispiel #12
0
    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;
        }
    }
Beispiel #13
0
        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);
        }
Beispiel #14
0
    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;
        }
    }
Beispiel #15
0
        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);
        }
Beispiel #16
0
    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;
        }
    }
Beispiel #17
0
    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);
        }
    }
Beispiel #18
0
    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;
        }
    }
Beispiel #19
0
    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();
            }
        }
    }
Beispiel #20
0
    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);
    }
Beispiel #21
0
    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;
            }
        }
    }
Beispiel #22
0
    //设置座位状态
    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);
        }
    }
Beispiel #23
0
    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);
        }
    }
Beispiel #24
0
    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);
            }
        }
    }
Beispiel #25
0
    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;
            }
        }
    }
Beispiel #26
0
    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;
        }
    }