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); }
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; } }
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("人物没创建完成"); } }
/// <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); // } // } // */ //} } }
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); * } * } */ } } }