示例#1
0
文件: Program.cs 项目: tuita520/Frame
        void CreateMonster()
        {
            //服务器添加命令

            for (int i = 0; i < 3; ++i)
            {
                Monster monster = new Monster(mMonsterId++);
                mMonsterList.Add(monster);

                monster.mPlayerInfo.name = "Server " + monster.roleid;
                monster.mPlayerInfo.type = 2;//Boss

                monster.position.x = ((i + 1) * (i % 2 == 0 ? -3 : 3)) * 10000;
                monster.position.y = 1 * 10000;
                monster.position.z = -10 * 10000;

                CMD_CreateMonster data = new CMD_CreateMonster();
                data.roleId    = SERVER_ROLEID;
                data.player    = ProtoTransfer.Get(monster.mPlayerInfo);
                data.position  = ProtoTransfer.Get(monster.position);
                data.direction = ProtoTransfer.Get(monster.direction);

                Command cmd = new Command();
                cmd.Set(CommandID.CREATE_MONSTER, data);

                AddCommand(cmd);
            }
        }
        /*
         * 注册
         * 协议参数:str用户名,str密码
         * 返回协议:-1表示失败 0表示成功
         *
         * */
        public void MsgRegister(Session session, GameMessage message)
        {
            //获得数值
            ReqLogin req = ProtoTransfer.Deserialize <ReqLogin>(message.data);

            string strFormat = "[收到注册协议]" + session.GetAddress();

            Debug.Log(strFormat + " 用户名:" + req.account + " 密码:" + req.password);

            //构建返回协议
            int result = -1;

            //注册
            if (DataMgr.instance.Register(req.account, req.password))
            {
                result = 0;
            }

            byte[] bytes = BitConverter.GetBytes(result);
            //创建角色
            DataMgr.instance.CreatePlayer(req.account);
            GameMessage retMsg = new GameMessage();

            retMsg.type = BitConverter.GetBytes((int)Protocol.Regist);
            retMsg.data = BitConverter.GetBytes(result);

            //返回协议给客户端
            session.SendTcp(retMsg);
        }
示例#3
0
        // 处理消息粘包
        private void ProcessData(Session session)
        {
            //其中消息长度为一个32位的int类型,转换成byte即占用4个字节的空间
            //小于长度字节
            if (session.buffCount < sizeof(Int32))
            {
                return;
            }

            //消息长度,获得消息长度的byte数据(4个字节组成)
            Array.Copy(session.readBuff, session.lenBytes, sizeof(Int32));
            //将该四个字节转换成int
            session.msgLength = BitConverter.ToInt32(session.lenBytes, 0);
            if (session.buffCount < session.msgLength + sizeof(Int32))
            {
                return;
            }

            //处理消息,从消息长度后取得消息内容
            //string str = System.Text.Encoding.UTF8.GetString(conn.readBuff,sizeof(Int32),conn.msgLength);
            GameMessage message = ProtoTransfer.Deserialize(session.readBuff, sizeof(Int32), session.msgLength);

            HandleMsg(session, message);

            //清除已处理的消息
            int count = session.buffCount - session.msgLength - sizeof(Int32);

            Array.Copy(session.readBuff, sizeof(Int32) + session.msgLength, session.readBuff, 0, count);
            session.buffCount = count;
            if (session.buffCount > 0)
            {
                ProcessData(session);
            }
        }
示例#4
0
        /// <summary>
        /// 开始战斗
        /// </summary>
        public void StartFight()
        {
            scoreT1 = 0;
            scoreT2 = 0;
            status  = Status.Fight;
            GameMessage msg = new GameMessage();

            msg.type = BitConverter.GetBytes((int)Protocol.Fight);

            var battleinfos = new List <BattlePlayer>();

            // 开始计时
            battleTimer.Elapsed += (sender, e) => {
                int winTeam = scoreT1 >= scoreT2 ? 1 : 2;
                UpdateWin(winTeam);
            };
            battleTimer.AutoReset = false;
            battleTimer.Enabled   = true;

            int teamPos1 = 1;
            int teamPos2 = 1;

            lock (playerDic) {
                foreach (Player p in playerDic.Values)
                {
                    BattlePlayer battlePlayer = new BattlePlayer();

                    p.tempData.hp     = 100;
                    battlePlayer.id   = p.id;
                    battlePlayer.team = p.tempData.team;
                    if (p.tempData.team == 1)
                    {
                        p.tempData.swopId   = teamPos1;
                        battlePlayer.swopId = teamPos1++;
                    }
                    else
                    {
                        p.tempData.swopId   = teamPos2;
                        battlePlayer.swopId = teamPos2++;
                    }
                    battlePlayer.playerHp = (int)p.tempData.hp;
                    p.tempData.status     = PlayerTempData.Status.Fight;

                    battleinfos.Add(battlePlayer);
                }

                // 对局时间

                byte[] battlebytes = BitConverter.GetBytes(battleLimitTime);
                byte[] tempBytes   = ProtoTransfer.Serialize(battleinfos);
                byte[] sendbytes   = new byte[tempBytes.Length + battlebytes.Length];
                Array.Copy(battlebytes, 0, sendbytes, 0, battlebytes.Length);
                Array.Copy(tempBytes, 0, sendbytes, battlebytes.Length, tempBytes.Length);
                msg.data = sendbytes;
                //广播Fight协议
                BroadcastTcp(msg);

                // GameStar();
            }
        }
示例#5
0
        /// <summary>
        /// 同步玩家
        /// </summary>
        /// <param name="player"></param>
        /// <param name="protocolBase"></param>
        public void MsgUpdateUnitInfo(Session session, GameMessage message)
        {
            UnitInfo unitInfo = ProtoTransfer.Deserialize <UnitInfo>(message.data);

            Player player = session.player;

            //获取房间
            if (player.tempData.status != PlayerTempData.Status.Fight)
            {
                return;
            }

            Room room = session.player.tempData.room;

            //作弊校验略
            player.tempData.posX           = unitInfo.posX;
            player.tempData.posY           = unitInfo.posY;
            player.tempData.posZ           = unitInfo.posZ;
            player.tempData.lastUpdateTime = Sys.GetTimeStamp();

            //广播
            unitInfo.id  = player.id;
            message.data = ProtoTransfer.Serialize(unitInfo);
            room.BroadcastTcp(message);
        }
示例#6
0
        // 中途退出战斗
        public void ExitFight(Player player)
        {
            //摧毁坦克
            if (playerDic[player.id] != null)
            {
                playerDic[player.id].tempData.hp = -1;
            }

            //广播消息
            GameMessage broadMsg = new GameMessage();

            broadMsg.type = BitConverter.GetBytes((int)Protocol.Hit);
            HitInfo retInfo = new HitInfo();

            retInfo.attId  = player.id;
            retInfo.defId  = player.id;
            retInfo.damage = 999;
            broadMsg.data  = ProtoTransfer.Serialize(retInfo);

            BroadcastTcp(broadMsg);
            //增加失败次数
            if (IsWinByPlayerCount() == 0)
            {
                player.data.defeat++;
            }

            int isWin = IsWinByPlayerCount();

            UpdateWin(isWin);
        }
示例#7
0
        // 复活玩家
        public void ReLifePlayer(Player player)
        {
            System.Timers.Timer relifeTimer = new System.Timers.Timer(5000);

            // 5秒后执行
            relifeTimer.Elapsed += (sender, e) => {
                if (playerDic[player.id] != null)
                {
                    GameMessage broadMsg = new GameMessage();
                    broadMsg.type = BitConverter.GetBytes((int)Protocol.RelifePlayer);

                    player.tempData.hp = 100;
                    BattlePlayer battlePlayer = new BattlePlayer();
                    battlePlayer.id       = player.id;
                    battlePlayer.team     = player.tempData.team;
                    battlePlayer.swopId   = player.tempData.swopId;
                    battlePlayer.playerHp = ((int)player.tempData.hp);

                    broadMsg.data = ProtoTransfer.Serialize(battlePlayer);
                    BroadcastTcp(broadMsg);
                }
            };

            relifeTimer.AutoReset = false;
            relifeTimer.Enabled   = true;
        }
示例#8
0
    //账号登录
    private void OnClickLogin()
    {
        text.text = "";
        waitTip.SetActive(true);
        string acc = inputField_Acc.text;
        string pas = inputField_Pas.text;

        if (acc == "" || pas == "")
        {
            text.text = "账号密码请输入完整";
            waitTip.SetActive(false);
            return;
        }
        TcpLogin _loginInfo = new TcpLogin
        {
            Account  = acc,
            Password = pas,
            Token    = ""
        };

        byte[]        bytes   = ProtoTransfer.SerializeProtoBuf3 <TcpLogin>(_loginInfo);
        MessageBuffer message = new MessageBuffer((int)ClientToServerID.TcpLogin, bytes, 0);

        Network.ClientService.GetSingleton().SendTcp(message);
    }
示例#9
0
        /// <summary>
        /// 获得房间信息
        /// </summary>
        /// <returns></returns>
        public GameMessage GetRoomInfo()
        {
            GameMessage message = new GameMessage();

            message.type = BitConverter.GetBytes((int)Protocol.GetRoomInfo);
            List <RoomPlayer> roomPlayers = new List <RoomPlayer>();

            //每个玩家的信息
            foreach (Player p in playerDic.Values)
            {
                RoomPlayer roomPlayer = new RoomPlayer();
                PlayerInfo playerinfo = new PlayerInfo();
                playerinfo.id         = p.id;
                playerinfo.win        = p.data.win;
                playerinfo.defeat     = p.data.defeat;
                roomPlayer.playerinfo = playerinfo;

                roomPlayer.team = p.tempData.team;
                int isOwner = p.tempData.isOwner ? 1 : 0;
                roomPlayer.isOwner = isOwner;

                roomPlayers.Add(roomPlayer);
            }

            message.data = ProtoTransfer.Serialize <List <RoomPlayer> >(roomPlayers);

            return(message);
        }
示例#10
0
        /// <summary>
        /// 获得房间列表
        /// </summary>
        /// <returns></returns>
        public GameMessage GetRoomList()
        {
            GameMessage msg = new GameMessage();

            msg.type = BitConverter.GetBytes((int)Protocol.GetRoomList);

            int count = roomList.Count;
            //房间数量
            List <RoomInfo> roomInfos = new List <RoomInfo>();

            int cout = roomList.Count;

            for (int i = 0; i < count; i++)
            {
                Room     room     = roomList[i];
                RoomInfo roominfo = new RoomInfo();
                roominfo.playercount = room.playerDic.Count;
                roominfo.roomstatus  = (int)room.status;
                roomInfos.Add(roominfo);
            }

            msg.data = ProtoTransfer.Serialize <List <RoomInfo> >(roomInfos);

            return(msg);
        }
示例#11
0
    // 处理子弹同步
    public void RecvShooting(GameMessage message)
    {
        ShootInfo shootInfo = ProtoTransfer.Deserialize <ShootInfo>(message.data);
        //解析协议
        string id = shootInfo.id;

        Vector3 pos;
        Vector3 rot;

        pos.x = shootInfo.posX;
        pos.y = shootInfo.posY;
        pos.z = shootInfo.posZ;

        rot.x = shootInfo.rotateX;
        rot.y = shootInfo.rotateY;
        rot.z = shootInfo.rotateZ;

        //处理
        if (!unitDic.ContainsKey(id))
        {
            Debug.Log("RecvShooting bt == null");
            return;
        }
        BattleUnit bu = unitDic[id];

        if (id == GameMgr._instance.id)
        {
            return;
        }
        bu.player.weapon.NetShoot(pos, rot);
    }
    private void SendUnitInfo()
    {
        GameMessage message = new GameMessage();

        message.type = System.BitConverter.GetBytes((int)Protocol.UpdateUnitInfo);
        UnitInfo unitInfo = new UnitInfo();

        unitInfo.id = GameMgr._instance.id;
        Vector3 pos = transform.position;

        unitInfo.posX = pos.x;
        unitInfo.posY = pos.y;
        unitInfo.posZ = pos.z;

        Vector3 rot = player.fPCamera.GetRotate();

        unitInfo.rotateX = rot.x;
        unitInfo.rotateY = rot.y;
        unitInfo.rotateZ = rot.z;

        unitInfo.input_h   = paramter.inputMoveVector.x;
        unitInfo.input_v   = paramter.inputMoveVector.y;
        unitInfo.moveState = (uint)State;
        message.data       = ProtoTransfer.Serialize(unitInfo);
        NetMgr.GetInstance().tcpSock.Send(message);
    }
示例#13
0
    // 同步伤害信息
    public void RecvHit(GameMessage message)
    {
        //解析协议
        HitInfo hitInfo = ProtoTransfer.Deserialize <HitInfo>(message.data);
        string  attId   = hitInfo.attId;
        string  defId   = hitInfo.defId;

        float hurt = hitInfo.damage;

        //获取BattleTank
        if (!unitDic.ContainsKey(attId))
        {
            Debug.Log("RecvHit attBt == null " + attId);
            return;
        }

        BattleUnit attBu = unitDic[attId];

        if (!unitDic.ContainsKey(defId))
        {
            Debug.Log("RecvHit defBt == null " + defId);
            return;
        }
        BattleUnit defBu = unitDic[defId];

        //被击中的玩家
        defBu.player.NetBeAttacked(hurt, attBu.player.gameObject);
    }
示例#14
0
    // 处理位置同步
    public void RecvUpdateUnitInfo(GameMessage message)
    {
        //解析协议
        UnitInfo unitInfo = ProtoTransfer.Deserialize <UnitInfo>(message.data);
        string   id       = unitInfo.id;
        Vector3  nPos;
        Vector3  nRot;

        nPos.x = unitInfo.posX;
        nPos.y = unitInfo.posY;
        nPos.z = unitInfo.posZ;

        nRot.x = unitInfo.rotateX;
        nRot.y = unitInfo.rotateY;
        nRot.z = unitInfo.rotateZ;


        //处理
        Debug.Log("RecvUpdateUnitInfo" + id);
        if (!unitDic.ContainsKey(id))
        {
            Debug.Log("RecvUpdateUnitInfo bt == null");
            return;
        }

        BattleUnit bt = unitDic[id];

        if (id == GameMgr._instance.id)
        {
            return;
        }

        bt.player.playerCtrl.NetForecastInfo(nPos, nRot);
        bt.player.playerCtrl.NetMoveState((PlayerState)unitInfo.moveState, unitInfo.input_h, unitInfo.input_v, (PlayerState)unitInfo.moveState);
    }
示例#15
0
    //消息处理
    private void ProcessData()
    {
        //粘包分包处理
        if (buffCount < sizeof(Int32))
        {
            return;
        }
        //包体长度
        Array.Copy(readBuff, lenBytes, sizeof(Int32));
        msgLength = BitConverter.ToInt32(lenBytes, 0);
        if (buffCount < msgLength + sizeof(Int32))
        {
            return;
        }

        //协议解码
        GameMessage protocol = ProtoTransfer.Deserialize(readBuff, sizeof(Int32), msgLength);

        lock (msgDist.msgList) {
            msgDist.msgList.Add(protocol);
        }
        //消除已处理的消息
        int count = buffCount - msgLength - sizeof(Int32);

        Array.Copy(readBuff, sizeof(Int32) + msgLength, readBuff, 0, count);
        buffCount = count;
        if (buffCount > 0)
        {
            ProcessData();
        }
    }
示例#16
0
    /// <summary>
    /// 发送关键帧
    /// </summary>
    private void SendFrame()
    {
        if (mSentFrame >= mCurrentFrame)
        {
            return;
        }

        GM_Frame sendData = SharedValue <GM_Frame> .sData;

        sendData.command.Clear();

        sendData.roleId    = PlayerManager.GetSingleton().mRoleId;
        sendData.frame     = mCurrentFrame;
        sendData.frametime = mFrameTime;
        lock (mCommandQueue)
        {
            while (mCommandQueue.Count > 0)
            {
                Command   frame = mCommandQueue.Dequeue();
                GMCommand cmd   = ProtoTransfer.Get(frame);

                sendData.command.Add(cmd);
            }
            mCommandQueue.Clear();
        }

        ClientService.GetSingleton().SendUdp(ClientID.Frame, MessageID.GM_FRAME_CS, sendData);


        mSentFrame++;
    }
示例#17
0
    private void OnReadyBC(GM_Ready recvData)
    {
        Debug.Log("玩家准备,id=" + recvData.roleId);

        if (recvData == null)
        {
            return;
        }

        PlayerCharacter tmpPlayerCharacter = PlayerManager.GetSingleton().GetPlayerCharacter(recvData.roleId);

        if (tmpPlayerCharacter)
        {
            tmpPlayerCharacter.SetPosition(ProtoTransfer.Get(recvData.position));
            tmpPlayerCharacter.SetRotation(ProtoTransfer.Get(recvData.direction));

            tmpPlayerCharacter.SetReady();
        }

        if (recvData.roleId == PlayerManager.GetSingleton().mRoleId)
        {
            PlayerManager.GetSingleton().mReady = true;
        }

        EventDispatch.Dispatch(EventID.Ready_Broadcast, recvData.roleId);
    }
示例#18
0
    private void OnConnectBC(GM_Connect recvData)
    {
        int roleId = recvData.roleId;

        CreatePlayerCharacter(ProtoTransfer.Get(recvData.player));

        Debug.Log("玩家连接成功, id = " + roleId);
    }
示例#19
0
        void ProcessData(byte[] bytes, IPEndPoint tSenderPoint)
        {
            byte[] content = new byte[bytes.Length - 4];
            Array.Copy(bytes, 4, content, 0, content.Length);
            BattleCommand command = ProtoTransfer.Deserialize <BattleCommand>(content);

            HandleMessage(command, tSenderPoint);
        }
示例#20
0
    void OnCommandReleaseSkill(CMD_ReleaseSkill varCommand)
    {
        PlayerCharacter tmpPlayerCharacter = PlayerManager.GetSingleton().GetPlayerCharacter(varCommand.roleId);

        if (tmpPlayerCharacter)
        {
            tmpPlayerCharacter.ReleaseSkill(varCommand.skillId, ProtoTransfer.Get(varCommand.mouseposition));
        }
    }
示例#21
0
    // 更新比分回调
    public void RecvUpdateBattleScore(GameMessage message)
    {
        BattleScore battleScore = ProtoTransfer.Deserialize <BattleScore>(message.data);
        int         scoreT1     = battleScore.scoreT1;
        int         scoreT2     = battleScore.scoreT2;

        redScoreTxt.text  = scoreT1.ToString();
        blueScoreTxt.text = scoreT2.ToString();
    }
示例#22
0
 public void SendTcp <T>(MessageID messageId, T t) where T : class, ProtoBuf.IExtensible
 {
     if (mClient != null)
     {
         byte[]        data    = ProtoTransfer.SerializeProtoBuf <T>(t);
         MessageBuffer message = new MessageBuffer((int)messageId, data, mClient.id);
         mClient.SendTcp(message);
     }
 }
示例#23
0
    private void OnClickMatch()
    {
        byte[] bytes = ProtoTransfer.SerializeProtoBuf3 <TcpRequestMatch>(new TcpRequestMatch()
        {
            Token = ClientService.GetSingleton().token
        });
        MessageBuffer message = new MessageBuffer((int)ClientToServerID.TcpRequestMatch, bytes, 0);

        ClientService.GetSingleton().SendTcp(message);
    }
示例#24
0
    void OnAddCommand(Command cmd)
    {
        if (cmd == null)
        {
            return;
        }

        if (mBegin == false)
        {
            Debug.Log("Frame not Begin ");

            return;
        }

        Debug.Log("AddFrame " + (CommandID)cmd.type);

        cmd.SetFrame(mCurrentFrame, mFrameTime);

        if (GameApplication.GetSingleton().mode == Mode.LockStep)
        {
            lock (mCommandQueue)
            {
                mCommandQueue.Enqueue(cmd);
            }
        }
        else
        {
            //乐观模式马上发送命令

            GM_Frame sendData = SharedValue <GM_Frame> .sData;
            sendData.command.Clear();

            sendData.roleId    = PlayerManager.GetSingleton().mRoleId;
            sendData.frame     = mCurrentFrame;
            sendData.frametime = mFrameTime;

            GMCommand data = ProtoTransfer.Get(cmd);

            sendData.command.Add(data);


            //string s1 = JsonSerializerUtil.ToJson<GM_Frame>(sendData);
            //GM_Frame sendData2 = JsonSerializerUtil.FromJson<GM_Frame>(s1);

            //byte[] bytes = JsonSerializerUtil.ToJsonByte<GM_Frame>(sendData);
            //GM_Frame sendData1 = JsonSerializerUtil.FromJsonByte<GM_Frame>(bytes);

            if (Debuger.ENABLELOG)
            {
                Debug.Log("当前帧:" + mCurrentFrame + "发送关键帧 = " + cmd.id.ToString() + ",frame = " + cmd.frame + ",time = " + cmd.time);
            }

            ClientService.GetSingleton().SendTcp(ClientID.Frame, MessageID.GM_FRAME_CS, sendData);
        }
    }
    /// <summary>
    /// 收到GetAchieve协议
    /// </summary>
    /// <param name="protocol"></param>
    public void RecvGetAchieve(GameMessage message)
    {
        PlayerInfo playerInfo = ProtoTransfer.Deserialize <PlayerInfo>(message.data);
        int        winNum     = playerInfo.win;
        int        defeatNum  = playerInfo.defeat;

        //处理
        idText.text     = GameMgr._instance.id;
        winText.text    = winNum.ToString();
        defeatText.text = defeatNum.ToString();
    }
示例#26
0
    public static ProtoMessage TransferFunds(string fiefFromID, string fiefToID, int amount, TextTestClient client)
    {
        ProtoTransfer request = new ProtoTransfer {
            fiefFrom   = fiefFromID,
            fiefTo     = fiefToID,
            amount     = amount,
            ActionType = Actions.TransferFunds
        };

        client.net.Send(request);
        return(GetActionReply(Actions.TransferFunds, client));
    }
示例#27
0
文件: Program.cs 项目: tuita520/Frame
        private void OnAccept(Session c)
        {
            GM_Accept sendData = new GM_Accept();

            sendData.conv     = c.id;
            sendData.protocol = (int)mProtocol;

            byte[]        data    = ProtoTransfer.SerializeProtoBuf(sendData);
            MessageBuffer message = new MessageBuffer((int)MessageID.GM_ACCEPT_SC, data, c.id);

            c.SendTcp(message);
        }
示例#28
0
    public bool Send(GameMessage message)
    {
        if (status != Status.Connected)
        {
            Debug.LogError(" [COnnection] 需要先连接再发送数据");
            return(true);
        }

        byte[] b = ProtoTransfer.Serialize(message);

        return(Send(b));
    }
示例#29
0
    /// <summary>
    /// 发送伤害信息
    /// </summary>
    /// <param name="id"></param>
    /// <param name="damage"></param>
    public void SendHit(string id, float damage)
    {
        GameMessage msg = new GameMessage();

        msg.type = System.BitConverter.GetBytes((int)Protocol.Hit);
        HitInfo hitInfo = new HitInfo();

        hitInfo.attId  = id;
        hitInfo.damage = (int)Mathf.Round(damage);
        msg.data       = ProtoTransfer.Serialize(hitInfo);
        NetMgr.GetInstance().tcpSock.Send(msg);
    }
示例#30
0
    private void OnConnectReturn(GM_Connect recvData)
    {
        int roleId = recvData.roleId;

        mFrameInterval = recvData.frameinterval;
        GameApplication.GetSingleton().mode = (Mode)recvData.mode;

        PlayerManager.GetSingleton().mRoleId = roleId;

        CreatePlayerCharacter(ProtoTransfer.Get(recvData.player));

        Debug.Log("自己连接成功,id = " + roleId);
    }