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); }
/// <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++; }
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); } }
private void OnConnectBC(GM_Connect recvData) { int roleId = recvData.roleId; CreatePlayerCharacter(ProtoTransfer.Get(recvData.player)); Debug.Log("玩家连接成功, id = " + roleId); }
void OnCommandReleaseSkill(CMD_ReleaseSkill varCommand) { PlayerCharacter tmpPlayerCharacter = PlayerManager.GetSingleton().GetPlayerCharacter(varCommand.roleId); if (tmpPlayerCharacter) { tmpPlayerCharacter.ReleaseSkill(varCommand.skillId, ProtoTransfer.Get(varCommand.mouseposition)); } }
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); } }
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); }
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)); } }
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(); } }
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); }
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); } }
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("人物没创建完成"); } }
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); } } }
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); } }
/// <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); }
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); } }
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); } } } }
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); * } * } */ } } }