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); }
// 处理消息粘包 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); } }
/// <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(); } }
/// <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); }
// 中途退出战斗 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); }
// 复活玩家 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; }
//账号登录 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); }
/// <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); }
/// <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); }
// 处理子弹同步 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); }
// 同步伤害信息 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); }
// 处理位置同步 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); }
//消息处理 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(); } }
/// <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++; }
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 OnConnectBC(GM_Connect recvData) { int roleId = recvData.roleId; CreatePlayerCharacter(ProtoTransfer.Get(recvData.player)); Debug.Log("玩家连接成功, id = " + roleId); }
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); }
void OnCommandReleaseSkill(CMD_ReleaseSkill varCommand) { PlayerCharacter tmpPlayerCharacter = PlayerManager.GetSingleton().GetPlayerCharacter(varCommand.roleId); if (tmpPlayerCharacter) { tmpPlayerCharacter.ReleaseSkill(varCommand.skillId, ProtoTransfer.Get(varCommand.mouseposition)); } }
// 更新比分回调 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(); }
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); } }
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); }
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(); }
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)); }
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); }
public bool Send(GameMessage message) { if (status != Status.Connected) { Debug.LogError(" [COnnection] 需要先连接再发送数据"); return(true); } byte[] b = ProtoTransfer.Serialize(message); return(Send(b)); }
/// <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); }
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); }