//玩家拾取盒子
        //参数:盒子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);
        }
Пример #2
0
        //注册
        //协议参数:用户名,密码
        //返回协议:-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);
        }
Пример #4
0
        //登录
        //协议参数:用户名,密码
        //返回协议:-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);
            }
        }
Пример #8
0
        //客户端请求加入指定房间
        //参数:房间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);
            }
        }