//玩家拾取盒子 //参数:盒子id //返回协议:0代表成功,-1代表失败 // 广播 要删除的Box的ID public void MsgPlayerAvatarGetBox(Player player, ProtocolBase protocol) { int start = 0; string protoName = protocol.GetString(start, ref start); string boxID = protocol.GetString(start, ref start); bool flag = false; lock (player.tempData.room.boxSet) { if (player.tempData.room.boxSet.Contains(boxID)) //J... { player.tempData.room.boxSet.Remove(boxID); //J... flag = true; } } ProtocolBase protocolBack = ServNet.instance.proto.Decode(null, 0, 0); protocolBack.AddString("PlayerAvatarGetBox"); if (flag) { protocolBack.AddInt(0); ProtocolBase protocolBroadcast = ServNet.instance.proto.Decode(null, 0, 0); protocolBroadcast.AddString("DelBox"); protocolBroadcast.AddString(boxID); RoomSystem.instance.BroadcastInRoom(player.tempData.room, protocolBroadcast); } else { protocolBack.AddInt(-1); } player.Send(protocolBack); }
//注册 //协议参数:用户名,密码 //返回协议:-1代表失败,0代表成功 public void MsgRegister(Conn conn, ProtocolBase protocol) { //解析出所有参数 int start = 0; string protoName = protocol.GetString(start, ref start); string id = protocol.GetString(start, ref start); string pw = protocol.GetString(start, ref start); Console.WriteLine("[收到注册协议]" + conn.GetAddress() + "发起的 " + "用户名:" + id + " 密码:" + pw); bool ret = DataMgr.instance.Register(id, pw); //返回协议 ProtocolBase protocolBack = ServNet.instance.proto.Decode(null, 0, 0); protocolBack.AddString("Register"); if (ret) { protocolBack.AddInt(0); } else { protocolBack.AddInt(-1); } ServerSystem.instance.Send(conn, protocolBack); //创建角色:一个账号对应一个角色的模式 if (ret) { DataMgr.instance.CreatePlayer(id); } }
//伤害 //参数:被击者id,伤害数值damage //返回协议:广播 攻击者id,被击者id,伤害数值damage public void MsgHit(Player player, ProtocolBase protocol) { if (player.tempData.status != PlayerTempData.Statue.Fight) { return; } //作弊校验 // long lastShootTime = player.tempData.lastShootTime; // if (Sys.GetTimeStamp() - lastShootTime < 1) { // Console.WriteLine("MsgHit 开炮作弊 " + player.id); // return; // } // player.tempData.lastShootTime = Sys.GetTimeStamp(); int start = 0; string protoName = protocol.GetString(start, ref start); string enenmyID = protocol.GetString(start, ref start); float damage = protocol.GetFloat(start, ref start); //扣除生命值 Room room = player.tempData.room; lock (room.playerDict) { if (!room.playerDict.ContainsKey(enenmyID)) { Console.WriteLine("MsgHit not Contains enemy " + enenmyID); return; } Player enemy = room.playerDict[enenmyID]; // if (enemy == null) // return; if (enemy.tempData.hp <= 0) { return; } enemy.tempData.hp -= damage; Console.WriteLine("MsgHit " + enenmyID + " hp:" + enemy.tempData.hp); } //广播 ProtocolBase protocolRet = ServNet.instance.proto.Decode(null, 0, 0); protocolRet.AddString("Hit"); protocolRet.AddString(player.id); protocolRet.AddString(enenmyID); protocolRet.AddFloat(damage); RoomSystem.instance.BroadcastInRoom(room, protocolRet); //胜负判断 RoomSystem.instance.DealWithWinForRoom(room); }
//登录 //协议参数:用户名,密码 //返回协议:-1密码错误,-2顶下线失败,-3读取角色数据失败,0成功 public void MsgLogin(Conn conn, ProtocolBase protocol) { //解析出所有参数 int start = 0; string protoName = protocol.GetString(start, ref start); string id = protocol.GetString(start, ref start); string pw = protocol.GetString(start, ref start); Console.WriteLine("[收到登录协议]" + conn.GetAddress() + "发起的 " + "用户名:" + id + " 密码:" + pw); //检查密码 bool ret = DataMgr.instance.CheckPassWord(id, pw); ProtocolBase protocolBack = ServNet.instance.proto.Decode(null, 0, 0); protocolBack.AddString("Login"); if (!ret) { protocolBack.AddInt(-1); ServerSystem.instance.Send(conn, protocolBack); return; } //检查是否已经登录了 ret = Player.KickOff(id); if (!ret) { protocolBack.AddInt(-2); ServerSystem.instance.Send(conn, protocolBack); return; } //获取玩家数据 PlayerData playerData = DataMgr.instance.GetPlayerData(id); if (playerData == null) { protocolBack.AddInt(-3); ServerSystem.instance.Send(conn, protocolBack); return; } Player player = new Player(id, conn); ServerSystem.instance.ConnLogin(conn, player, playerData); //事件 ServNet.instance.handlePlayerEvent.OnLogin(conn.player); protocolBack.AddInt(0); ServerSystem.instance.Send(conn, protocolBack); }
//释放技能 //参数:posX,posY,posZ,rotX,rotY,rotZ,skillType //返回协议:广播 释放者id,posX,posY,posZ,rotX,rotY,rotZ,skillType public void MsgReleaseSkill(Player player, ProtocolBase protocol) { if (player.tempData.status != PlayerTempData.Statue.Fight) { return; } int start = 0; string protoName = protocol.GetString(start, ref start); float posX = protocol.GetFloat(start, ref start); float posY = protocol.GetFloat(start, ref start); float posZ = protocol.GetFloat(start, ref start); float rotX = protocol.GetFloat(start, ref start); float rotY = protocol.GetFloat(start, ref start); float rotZ = protocol.GetFloat(start, ref start); int skillType = protocol.GetInt(start, ref start); //加上id后广播 Room room = player.tempData.room; ProtocolBase protocolRet = ServNet.instance.proto.Decode(null, 0, 0); protocolRet.AddString("ReleaseSkill"); protocolRet.AddString(player.id); protocolRet.AddFloat(posX); protocolRet.AddFloat(posY); protocolRet.AddFloat(posZ); protocolRet.AddFloat(rotX); protocolRet.AddFloat(rotY); protocolRet.AddFloat(rotZ); protocolRet.AddInt(skillType); RoomSystem.instance.BroadcastInRoom(room, protocolRet); }
//收到transform信息 //参数:posX,posY,posZ,rotX,rotY,rotZ,gunRot,gunRoll //返回协议:广播 id,posX,posY,posZ,rotX,rotY,rotZ,gunRot,gunRoll public void MsgUpdateUnitInfo(Player player, ProtocolBase protocol) { if (player.tempData.status != PlayerTempData.Statue.Fight) { return; } int start = 0; string protoName = protocol.GetString(start, ref start); float posX = protocol.GetFloat(start, ref start); float posY = protocol.GetFloat(start, ref start); float posZ = protocol.GetFloat(start, ref start); float rotX = protocol.GetFloat(start, ref start); float rotY = protocol.GetFloat(start, ref start); float rotZ = protocol.GetFloat(start, ref start); float gunRot = protocol.GetFloat(start, ref start); float gunRoll = protocol.GetFloat(start, ref start); Room room = player.tempData.room; //作弊校验 //略 //为什么tempData中只保留了一部分数据,为了校验??? player.tempData.posX = posX; player.tempData.posY = posY; player.tempData.posZ = posZ; player.tempData.lastUpdatePosTime = Sys.GetTimeStamp(); //加上id后广播 ProtocolBase protocolRet = ServNet.instance.proto.Decode(null, 0, 0); protocolRet.AddString("UpdateUnitInfo"); protocolRet.AddString(player.id); protocolRet.AddFloat(posX); protocolRet.AddFloat(posY); protocolRet.AddFloat(posZ); protocolRet.AddFloat(rotX); protocolRet.AddFloat(rotY); protocolRet.AddFloat(rotZ); protocolRet.AddFloat(gunRot); protocolRet.AddFloat(gunRoll); RoomSystem.instance.BroadcastInRoom(room, protocolRet); }
public void Send(Conn conn, ProtocolBase protocol) { int start = 0; string protoName = protocol.GetString(start, ref start); Console.WriteLine("发送消息:" + protoName + " 到:" + conn.GetAddress()); byte[] sendBuff = NetPackage.EncoderHeader(protocol); try { conn.socket.BeginSend(sendBuff, 0, sendBuff.Length, SocketFlags.None, null, null); } catch (Exception e) { Console.WriteLine("[发送消息]" + conn.GetAddress() + " : " + e.Message); } }
//客户端请求加入指定房间 //参数:房间index //用index来确定应该进入的房间是不准确的,因为如果中途房间被关闭了,就会进入错误的房间... //返回协议:0代表成功,-1代表失败,-2代表已开战,-3代表房间满 public void MsgEnterRoom(Player player, ProtocolBase protocol) { int start = 0; string protoName = protocol.GetString(start, ref start); int index = protocol.GetInt(start, ref start); ProtocolBase backProtocol = ServNet.instance.proto.Decode(null, 0, 0); backProtocol.AddString("EnterRoom"); if (index < 0 || index >= World.instance.roomList.Count) { Console.WriteLine("指定房间不存在," + player.id + " 无法进入房间"); backProtocol.AddInt(-1); player.Send(backProtocol); return; } Room room = World.instance.roomList[index]; if (room.status != Room.Status.Prepare) { Console.WriteLine("指定房间不是准备状态," + player.id + " 无法进入房间"); backProtocol.AddInt(-2); player.Send(backProtocol); return; } if (RoomSystem.instance.AddPlayerToRoom(room, player)) { RoomSystem.instance.BroadcastInRoom(room, room.GetRoomInfoBack()); backProtocol.AddInt(0); player.Send(backProtocol); } else { Console.WriteLine("房间已满," + player.id + " 无法进入房间"); backProtocol.AddInt(-3); player.Send(backProtocol); } }