Ejemplo n.º 1
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);
    }
Ejemplo n.º 2
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++;
    }
Ejemplo n.º 3
0
        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);
            }
        }
Ejemplo n.º 4
0
    private void OnConnectBC(GM_Connect recvData)
    {
        int roleId = recvData.roleId;

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

        Debug.Log("玩家连接成功, id = " + roleId);
    }
Ejemplo n.º 5
0
    void OnCommandReleaseSkill(CMD_ReleaseSkill varCommand)
    {
        PlayerCharacter tmpPlayerCharacter = PlayerManager.GetSingleton().GetPlayerCharacter(varCommand.roleId);

        if (tmpPlayerCharacter)
        {
            tmpPlayerCharacter.ReleaseSkill(varCommand.skillId, ProtoTransfer.Get(varCommand.mouseposition));
        }
    }
Ejemplo n.º 6
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);
        }
    }
Ejemplo n.º 7
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);
    }
Ejemplo n.º 8
0
    void OnCommandMoveToPoint(CMD_MoveToPoint varCommand)
    {
        PlayerCharacter tmpPlayerCharacter = PlayerManager.GetSingleton().GetPlayerCharacter(varCommand.roleId);

        if (tmpPlayerCharacter)
        {
            /*
             * tmpPlayerCharacter.SetNavigation(false);
             * tmpPlayerCharacter.transform.position = ProtoTransfer.Get(data.position);
             * tmpPlayerCharacter.transform.rotation = Quaternion.Euler(ProtoTransfer.Get(data.direction));
             * tmpPlayerCharacter.SetNavigation(true);
             */
            tmpPlayerCharacter.MoveToPoint(ProtoTransfer.Get(varCommand.destination));
        }
    }
Ejemplo n.º 9
0
    void OnCreateMonster(CMD_CreateMonster cmd)
    {
        if (cmd == null)
        {
            return;
        }

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

        PlayerCharacter tmpPlayerCharacter = PlayerManager.GetSingleton().GetPlayerCharacter(cmd.player.roleId);

        if (tmpPlayerCharacter)
        {
            tmpPlayerCharacter.SetPosition(ProtoTransfer.Get(cmd.position));
            tmpPlayerCharacter.SetRotation(ProtoTransfer.Get(cmd.direction));
            tmpPlayerCharacter.SetReady();
        }
    }
Ejemplo n.º 10
0
    void ReleaseSkill(int skillid)
    {
        if (PlayerManager.GetSingleton().mCamera == null)
        {
            return;
        }

        CMD_ReleaseSkill data = SharedValue <CMD_ReleaseSkill> .sData;

        data.roleId        = PlayerManager.GetSingleton().mRoleId;
        data.skillId       = skillid;
        data.mouseposition = ProtoTransfer.Get(PlayerManager.GetSingleton().mousePosition);

        Command cmd = new Command();

        cmd.Set(CommandID.RELEASE_SKILL, data);

        EventDispatch.Dispatch(EventID.AddCommand, cmd);
    }
Ejemplo n.º 11
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);
            ClientService.GetSingleton().SendUdp(ClientID.Frame, MessageID.GM_FRAME_CS, sendData);
        }
    }
Ejemplo n.º 12
0
    void OnReadyRequest(int data)
    {
        PlayerCharacter tmpPlayerCharacter = PlayerManager.GetSingleton().mPlayerCharacterSelf;

        if (tmpPlayerCharacter)
        {
            Debug.Log("Try to Ready.");

            GM_Ready sendData = new GM_Ready();
            sendData.roleId    = PlayerManager.GetSingleton().mRoleId;
            sendData.position  = ProtoTransfer.Get(tmpPlayerCharacter.position);
            sendData.direction = ProtoTransfer.Get(tmpPlayerCharacter.direction);

            ClientService.GetSingleton().SendUdp(ClientID.Frame, MessageID.GM_READY_CS, sendData);
        }
        else
        {
            Debug.Log("人物没创建完成");
        }
    }
Ejemplo n.º 13
0
        private void OnConnect(Session c, int roleId)
        {
            User user = new User(roleId, c);

            mUserList.Add(user);

            Debug.Log(string.Format("{0} roleid={1} tcp={2}, udp={3} connected! count={4}", c.id, user.roleid, c.tcpAdress, c.udpAdress, mUserList.Count), ConsoleColor.Yellow);

            GM_Connect sendData = new GM_Connect();

            sendData.roleId        = user.roleid;
            sendData.frameinterval = FRAME_INTERVAL; //告诉客户端帧时长 毫秒
            sendData.mode          = (int)mMode;     //告诉客户端当前模式
            sendData.player        = ProtoTransfer.Get(user.mPlayerInfo);

            user.SendTcp(MessageID.GM_CONNECT_SC, sendData);

            //告诉别人有人连接了
            for (int i = 0; i < mUserList.Count; ++i)
            {
                var u = mUserList[i]; //别人
                if (c != u.client)
                {
                    u.SendTcp(MessageID.GM_CONNECT_BC, sendData);
                }
            }

            //告诉他有哪些人已经连接了
            for (int i = 0; i < mUserList.Count; ++i)
            {
                var u = mUserList[i];//别人
                if (c != u.client)
                {
                    sendData.roleId = u.roleid;
                    sendData.player = ProtoTransfer.Get(u.mPlayerInfo);
                    //发给自己
                    user.SendTcp(MessageID.GM_CONNECT_BC, sendData);
                }
            }
        }
Ejemplo n.º 14
0
    void CreateMonster()
    {
        CMD_CreateMonster data = new CMD_CreateMonster();

        data.roleId = 0;
        data.player = new GMPlayerInfo();
        for (int i = 0; i < 5; ++i)
        {
            data.player.roleId    = 10000 + i;
            data.player.type      = 1; //怪物
            data.player.moveSpeed = 350;
            data.player.maxBlood  = 200;
            data.player.nowBlood  = 200;
            data.player.name      = "client " + data.player.roleId;
            data.position         = ProtoTransfer.Get(new Vector3((i + 1) * (i % 2 == 0? -3:3), 1, 10));
            data.direction        = ProtoTransfer.Get(Vector3.zero);

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

            DoCommand(cmd);
        }
    }
Ejemplo n.º 15
0
        /// <summary>
        /// 按固定频率向客户端广播帧
        /// </summary>
        private void SendFrame()
        {
            long        frame     = mCurrentFrame++;
            int         userCount = 0; //当前帧有多少个客户端发了命令
            GM_Frame_BC sendData  = new GM_Frame_BC();

            sendData.frame     = frame;
            sendData.frametime = mFrameTime;

            if (mFrameDic.ContainsKey(frame))
            {
                var frames = mFrameDic[frame];

                userCount = frames.Count;

                var it = frames.GetEnumerator();
                while (it.MoveNext())
                {
                    for (int i = 0, count = it.Current.Value.Count; i < count; ++i)
                    {
                        GMCommand cmd = ProtoTransfer.Get(it.Current.Value[i]);
                        cmd.eventType = it.Current.Value[i].eventType;
                        sendData.command.Add(cmd);
                    }
                }
            }


            //不显示那么多log
            if (frame % 30 == 0 || sendData.command.Count > 0)
            {
                Debug.Log(string.Format("Send frame:{0} user count:{1} command count:{2}", frame, userCount, sendData.command.Count), ConsoleColor.Gray);
            }

            BroadCast(MessageID.GM_FRAME_BC, sendData, true);
        }
Ejemplo n.º 16
0
        private void OnLockStepFrame(Session client, GM_Frame recvData)
        {
            long frame  = recvData.frame;
            int  roleId = recvData.roleId;

            if (recvData.command.Count > 0 || frame % 30 == 0)
            {
                Debug.Log(string.Format("Receive {0} serverframe:{1} clientframe:{2} command:{3}", roleId, mCurrentFrame, frame, recvData.command.Count), ConsoleColor.DarkGray);
            }
            if (mFrameDic.ContainsKey(frame) == false)
            {
                mFrameDic.Add(frame, new Dictionary <int, List <Command> >());
            }

            var frames = mFrameDic[frame];

            //当前帧的服务器命令
            if (frames.ContainsKey(SERVER_ROLEID) == false)
            {
                frames.Add(SERVER_ROLEID, new List <Command>());
            }

            //该玩家是否发送了当前帧
            if (frames.ContainsKey(roleId) == false)
            {
                frames.Add(roleId, new List <Command>());
            }

            for (int i = 0; i < recvData.command.Count; ++i)
            {
                Command cmd = new Command(recvData.command[i].frame, recvData.command[i].type, recvData.command[i].data, recvData.command[i].frametime);

                frames[roleId].Add(cmd);
            }

            //当所有玩家都发送了该帧,就可以广播了
            //减去1是因为服务器命令也在当前帧中
            if (frames.Count - 1 >= mUserList.Count)
            {
                GM_Frame_BC sendData = new GM_Frame_BC();
                sendData.frame     = frame;
                sendData.frametime = mFrameTime;
                var it = frames.GetEnumerator();
                while (it.MoveNext())
                {
                    for (int i = 0, count = it.Current.Value.Count; i < count; ++i)
                    {
                        GMCommand cmd = ProtoTransfer.Get(it.Current.Value[i]);

                        sendData.command.Add(cmd);
                    }
                }


                BroadCast(MessageID.GM_FRAME_BC, sendData, true);

                mCurrentFrame = frame + 1;
            }
            else
            {
                Debug.Log(string.Format("Waiting {0} frame:{1} count:{2} current:{3} ", roleId, frame, mFrameDic[frame].Count, mUserList.Count), ConsoleColor.Red);
            }
        }
Ejemplo n.º 17
0
    public void OnUpdate()
    {
        for (int i = 0; i < mPlayerCharacterList.Count; ++i)
        {
            mPlayerCharacterList[i].OnUpdate();
        }


        if (Input.GetMouseButtonDown(1))
        {
            if (EventSystem.current.IsPointerOverGameObject())
            {
                return;
            }

            if (mCamera && mPlayerCharacterSelf)
            {
                Ray        tmpRay = mCamera.ScreenPointToRay(Input.mousePosition);
                RaycastHit tmpHit;
                if (Physics.Raycast(tmpRay, out tmpHit, 100))
                {
                    mLastPosition.x = 0;
                    mLastPosition.y = 0;
                    mLastPosition.z = 0;

                    Vector3 position = tmpHit.point;

                    SetClickPosition(1, position);

                    CMD_MoveToPoint data = SharedValue <CMD_MoveToPoint> .sData;
                    data.roleId      = mRoleId;
                    data.destination = ProtoTransfer.Get(position);
                    data.position    = ProtoTransfer.Get(mPlayerCharacterSelf.position);
                    data.direction   = ProtoTransfer.Get(mPlayerCharacterSelf.direction);


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

                    EventDispatch.Dispatch(EventID.AddCommand, cmd);
                }
            }
        }
        if (Input.GetMouseButtonDown(0))
        {
            if (EventSystem.current.IsPointerOverGameObject())
            {
                return;
            }

            if (mCamera && mPlayerCharacterSelf)
            {
                Ray        tmpRay = mCamera.ScreenPointToRay(Input.mousePosition);
                RaycastHit tmpHit;
                if (Physics.Raycast(tmpRay, out tmpHit, 100))
                {
                    mLastPosition = tmpHit.point;
                    SetClickPosition(0, tmpHit.point);
                }
            }
        }
    }
Ejemplo n.º 18
0
        private void OnReceiveReady(Session client, GM_Ready recvData)
        {
            if (recvData == null || client == null)
            {
                return;
            }
            int readyCount = 0;

            for (int i = 0; i < mUserList.Count; ++i)
            {
                var user = mUserList[i];
                if (recvData.roleId == user.roleid && client == user.client)
                {
                    user.position  = ProtoTransfer.Get(recvData.position);
                    user.direction = ProtoTransfer.Get(recvData.direction);
                    user.SetReady();
                }
                //广播玩家准备(包括自己)
                //BroadCast(MessageID.GM_BEGIN_BC, recvData, true);
                //user.SendTcp(MessageID.GM_READY_BC, recvData);

                if (user.ready)
                {
                    readyCount++;
                }
            }

            Debug.Log(string.Format("{0} roleid={1} ready, ready count={2} user count={3}", client.id, recvData.roleId, readyCount, mUserList.Count), ConsoleColor.Blue);

            if (mBegin == false)
            {
                //所有的玩家都准备好了,可以开始同步
                if (readyCount == 2)
                //if (readyCount >= mUserList.Count)
                {
                    for (int i = 0; i < mUserList.Count; ++i)
                    {
                        var      user     = mUserList[i];
                        GM_Ready gm_Ready = new GM_Ready();
                        gm_Ready.roleId = user.roleid;
                        //if (recvData.roleId == user.roleid && client == user.client)
                        //{
                        //    user.position = ProtoTransfer.Get(recvData.position);
                        //    user.direction = ProtoTransfer.Get(recvData.direction);
                        //    user.SetReady();
                        //}
                        //广播玩家准备(包括自己)
                        BroadCast(MessageID.GM_READY_BC, gm_Ready, true);
                        //user.SendTcp(MessageID.GM_READY_BC, gm_Ready);

                        //if (user.ready)
                        //{
                        //    readyCount++;
                        //}
                    }

                    mFrameDic = new Dictionary <long, Dictionary <int, List <Command> > >();

                    GM_Begin sendData = new GM_Begin();
                    sendData.result = 0;

                    BroadCast(MessageID.GM_BEGIN_BC, sendData, true);

                    BeginGame();
                }
            }

            else //断线重连
            {
                User user = GetUser(recvData.roleId);
                if (user != null)
                {
                    GM_Begin sendData = new GM_Begin();
                    sendData.result = 0;

                    user.SendTcp(MessageID.GM_BEGIN_BC, sendData);

                    /*
                     * GM_Frame_BC frameData = new GM_Frame_BC();
                     *
                     * //给他发送当前帧之前的数据
                     * for (long frame = 1; frame < mCurrentFrame - 1; ++frame)
                     * {
                     *  if (mFrameDic.ContainsKey(frame))
                     *  {
                     *      frameData.frame = frame;
                     *      frameData.frametime = 0;
                     *      var it = mFrameDic[frame].GetEnumerator();
                     *      while (it.MoveNext())
                     *      {
                     *          for (int i = 0, count = it.Current.Value.Count; i < count; ++i)
                     *          {
                     *              GMCommand cmd = ProtoTransfer.Get(it.Current.Value[i]);
                     *
                     *              frameData.command.Add(cmd);
                     *          }
                     *      }
                     *      user.SendUdp(MessageID.GM_FRAME_BC, frameData);
                     *  }
                     * }
                     */
                }
            }
        }