Esempio 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);
    }
Esempio n. 2
0
        private void OnMessage(Session client, MessageBuffer msg)
        {
            MessageID messageId = (MessageID)msg.id();

            switch (messageId)
            {
            case MessageID.GM_ACCEPT_CS:
            {
                GM_Accept recvData = JsonSerializerUtil.FromJsonByte <GM_Accept>(msg.body());
                //ProtoTransfer.DeserializeProtoBuf<GM_Accept>(msg);
                if (recvData.conv == client.id)
                {
                    OnConnect(client, recvData.roleId);
                }
            }
            break;

            case MessageID.GM_READY_CS:
            {
                GM_Ready recvData = JsonSerializerUtil.FromJsonByte <GM_Ready>(msg.body());
                //ProtoTransfer.DeserializeProtoBuf<GM_Ready>(msg);
                OnReceiveReady(client, recvData);
            }
            break;

            case MessageID.GM_FRAME_CS:
            {
                GM_Frame recvData = JsonSerializerUtil.FromJsonByte <GM_Frame>(msg.body());
                //ProtoTransfer.DeserializeProtoBuf<GM_Frame>(msg);
                if (mMode == Mode.LockStep)
                {
                    OnLockStepFrame(client, recvData);
                }
                else
                {
                    OnOptimisticFrame(client, recvData);
                }
            }
            break;

            case MessageID.GM_PING_CS:
            {
                GM_Request recvData = JsonSerializerUtil.FromJsonByte <GM_Request>(msg.body());
                //ProtoTransfer.DeserializeProtoBuf<GM_Request>(msg);
                User u = GetUser(recvData.id);
                if (u != null)
                {
                    GM_Return sendData = new GM_Return();
                    sendData.id = recvData.id;
                    u.SendTcp(MessageID.GM_PING_SC, sendData);
                }
            }
            break;
            }
        }
Esempio n. 3
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("人物没创建完成");
        }
    }
Esempio n. 4
0
        /// <summary>
        /// 收到准备后的处理
        /// </summary>
        /// <param name="client"></param>
        /// <param name="recvData"></param>
        private void OnReceiveReady(Session client, GM_Ready recvData)
        {
            if (mBegin)
            {
                //游戏已经开始,不能中途进入游戏,后面再这里加断线重连逻辑看看
                return;
            }
            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.SetReady();
                }

                BroadCast(MessageID.GM_READY_BC, recvData, true);
                //广播玩家准备(包括自己)
                //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)
                {
                    GM_Begin sendData = new GM_Begin();
                    sendData.roleIdList = new List <int>();
                    sendData.randSeed   = 12345;
                    for (int i = 0; i < mUserList.Count; ++i)
                    {
                        if (mUserList[i].ready)
                        {
                            sendData.roleIdList.Add(mUserList[i].roleid);
                        }

                        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();
                        //}
                        //广播玩家准备(包括自己)

                        //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);

                    //BroadCast(MessageID.GM_BEGIN_BC, sendData, true);

                    BeginGame();
                }
            }

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


                //    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);
                //        }
                //    }
                //    */
                //}
            }
        }
Esempio n. 5
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();
                }
                //广播玩家准备(包括自己)
                user.SendUdp(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 >= mUserList.Count)
                {
                    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.SendUdp(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);
                     *  }
                     * }
                     */
                }
            }
        }