Esempio n. 1
0
        public static void Handle_RandomEnterRoom(ClientConnection Client, PacketReader reader, byte last)
        {
            Account User       = Client.CurrentAccount;
            byte    roomkindid = reader.ReadByte();

            //int empty = reader.ReadLEInt32();

            if (roomkindid == 0x4A)
            {
                bool isExist = Rooms.NormalRoomList.Any(rm => rm.RoomKindID == 0x4A && rm.Players.Count < rm.MaxPlayersCount);
                if (!isExist)
                {
                    NormalRoom room = new NormalRoom();
                    room.setID(Rooms.RoomID);
                    room.setName("Park");
                    room.setPassword("");
                    room.setItemType(1);
                    room.setIsStepOn(true);
                    room.setRoomKindID(0x4A);
                    room.setIsTeamPlay(0);

                    room.Players.Add(User);
                    room.setMaxPlayersCount(30);
                    room.setPosList(30);

                    User.RoomPos = room.PosList.First();
                    room.PosList.Remove(User.RoomPos);
                    room.setRoomMasterIndex(User.RoomPos);

                    User.CurrentRoomId = Rooms.RoomID;
                    User.InGame        = true;

                    Client.SendAsync(new GameRoom_SendRoomInfo(User, room, last));
                    Client.SendAsync(new GameRoom_SendPlayerInfo(User, last));
                    Client.SendAsync(new GameRoom_GetRoomMaster(User, room.RoomMasterIndex, last)); //場主位置

                    Client.SendAsync(new GameRoom_SendRoomMaster(User, room.MapNum, room.RoomMasterIndex, last));

                    Rooms.NormalRoomList.Add(room);
                    Rooms.RoomID += 1;
                }
                else
                {
                    NormalRoom room = Rooms.NormalRoomList.FirstOrDefault(rm => rm.RoomKindID == 0x4A && rm.Players.Count < rm.MaxPlayersCount);
                    User.CurrentRoomId = room.ID;
                    User.InGame        = true;

                    //取得當前第一個位置id
                    User.RoomPos = room.PosList.FirstOrDefault();
                    room.PosList.Remove(User.RoomPos);

                    Client.SendAsync(new GameRoom_Hex(User, "FF5805FFFFFFFF00000000000000000000000000", last));
                    Client.SendAsync(new GameRoom_SendRoomInfo(User, room, last, User.RoomPos));

                    //Send自己info俾其他roomuser
                    foreach (Account roomUser in room.Players)
                    {
                        roomUser.Connection.SendAsync(new GameRoom_SendPlayerInfo(User, last));
                    }

                    room.Players.Add(User);

                    //Send roomuser info俾自己
                    foreach (Account roomUser in room.Players)
                    {
                        Client.SendAsync(new GameRoom_SendPlayerInfo(roomUser, last));
                    }

                    byte roommasterpos = room.RoomMasterIndex; //room.Players.Find(player => player.IsRoomMaster).RoomPos;
                    Client.SendAsync(new GameRoom_GetRoomMaster(User, roommasterpos, last));
                }
            }
            else
            {
                bool isExist = Rooms.NormalRoomList.Any(rm => rm.RoomKindID == roomkindid && rm.Players.Count < rm.MaxPlayersCount && !rm.isPlaying && !rm.HasPassword && !rm.Players.Exists(p => p.Attribute == 3));
                if (!isExist)
                {
                    Client.SendAsync(new GameRoom_EnterRoomError(User, 0xB, roomkindid, last));
                }
                else
                {
                    int        count = Rooms.NormalRoomList.Count(rm => rm.RoomKindID == roomkindid && rm.Players.Count < rm.MaxPlayersCount && !rm.isPlaying && !rm.HasPassword && !rm.Players.Exists(p => p.Attribute == 3));
                    NormalRoom room  = Rooms.NormalRoomList.FindAll(rm => rm.RoomKindID == roomkindid && rm.Players.Count < rm.MaxPlayersCount && !rm.isPlaying && !rm.HasPassword && !rm.Players.Exists(p => p.Attribute == 3))[new Random().Next(count)];
                    GameRoomEvent.EnterRoom(Client, room, string.Empty, last);
                }
            }
        }
Esempio n. 2
0
        public static void Handle_EnterFarm(ClientConnection Client, PacketReader packetReader, byte last)
        {
            //FF D1 01 00 13 EA 25 00 00 00 00 00 04
            Account User      = Client.CurrentAccount;
            byte    subopcode = packetReader.ReadByte();
            int     farmindex = packetReader.ReadLEInt32();//13 EA 25 00 id??

            bool       existRoom = Rooms.RoomList.Values.Any(rm => rm.FarmIndex == farmindex);
            NormalRoom room;

            if (!existRoom)
            {
                string FarmName = string.Empty;
                string Password = string.Empty;
                int    RoomServerNum, RoomHandle;

                using (var con = new MySqlConnection(Conf.Connstr))
                {
                    con.Open();
                    var cmd = new MySqlCommand(string.Empty, con);
                    cmd.Parameters.Clear();
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.CommandText = "usp_Farm_GetRoomInfo";
                    cmd.Parameters.Add("pFarmUniqueNum", MySqlDbType.Int32).Value = farmindex;
                    MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow);
                    if (reader.HasRows)
                    {
                        reader.Read();
                        FarmName      = reader["FarmName"].ToString();
                        Password      = reader["Password"].ToString();
                        RoomServerNum = Convert.ToInt32(reader["RoomServerNum"]);
                        RoomHandle    = Convert.ToInt32(reader["RoomHandle"]);
                    }
                    cmd.Dispose();
                    reader.Close();
                    con.Close();
                }

                room = new NormalRoom();
                room.setID(Rooms.RoomID);
                room.setName(FarmName);
                room.setPassword(Password);
                room.setItemType(0);
                room.setIsStepOn(false);
                room.setRoomKindID(75);
                room.setIsTeamPlay(0);
                room.FarmIndex = farmindex;
                room.Players.Add(User);
                if (RoomHolder.RoomKindInfos.TryGetValue(75, out var roomkindinfo))
                {
                    room.setGameMode(roomkindinfo);
                }

                //取得第一個位置 0
                User.RoomPos = (byte)(User.Attribute == 3 ? 100 : room.PosList.First());
                room.PosList.Remove(User.RoomPos);
                room.setRoomMasterIndex(User.RoomPos);


                //User.IsRoomMaster = true;
                User.InGame        = true;
                User.CurrentRoomId = Rooms.RoomID;
                Rooms.RoomID      += 1;

                room.StartAutoChangeRoomMaster();
                Rooms.AddRoom(room.ID, room);
            }
            else
            {
                room = Rooms.RoomList.Values.Where(rm => rm.FarmIndex == farmindex).FirstOrDefault();
                room.EnterRoom(Client, string.Empty, last);
            }
            Client.SendAsync(new GameRoom_Hex("A3", last));
            if (!existRoom)
            {
                Client.SendAsync(new SendFarmInfo(User, room, farmindex, last));
            }
            Client.SendAsync(new GameRoom_SendPlayerInfo(User, last));
            Client.SendAsync(new EnterFarm_0x2DD(last));
            Client.SendAsync(new EnterFarm_0x646(last));
        }
Esempio n. 3
0
        public static void Handle_CreateGameRoom(ClientConnection Client, PacketReader reader, byte last)
        {
            Account User = Client.CurrentAccount;

            if (!User.InGame)
            {
                if (User.Attribute == 3)
                {
                    Client.SendAsync(new GameRoom_CreateRoomError(User, 8, last));
                    return;
                }
                byte   roomkindid     = reader.ReadByte();
                byte   unk            = reader.ReadByte();
                int    namelength     = reader.ReadLEInt32();
                string name           = reader.ReadBig5StringSafe(namelength);
                int    passwordlength = reader.ReadLEInt32();
                string password       = string.Empty;
                if (passwordlength > 0)
                {
                    password = reader.ReadBig5StringSafe(passwordlength);
                }
                int  isTeamPlay = reader.ReadLEInt32();
                bool isStepOn   = reader.ReadBoolean();
                int  itemtype   = reader.ReadLEInt32();
                int  unk2       = reader.ReadLEInt32();
                int  unk3       = reader.ReadLEInt32();
                //byte footer = binaryReader.ReadByte();

                NormalRoom room = new NormalRoom();
                room.setID(Rooms.RoomID);
                room.setName(name);
                room.setPassword(password);
                room.setItemType(itemtype);
                room.setIsStepOn(isStepOn);
                room.setRoomKindID(roomkindid);
                room.setIsTeamPlay(isTeamPlay);
                room.Players.Add(User);
                Console.WriteLine("fdRoomKindID={0}", roomkindid);
                if (RoomHolder.RoomKindInfos.TryGetValue(roomkindid, out int GameMode))
                {
                    room.setGameMode(GameMode);
                }
                else
                {
                    room.setGameMode(1);
                }

                /*if (!DBHelp.CheckTable(string.Format("select * from essenroomkindid where fdRoomKindID={0}", roomkindid)))
                 * {
                 *  Log.Error("DataBase沒有此RoomKind: {0}", roomkindid);
                 *  return;
                 * }
                 *
                 * if (DBHelp.CheckTable(string.Format("select * from essenroomkindid where fdRoomKindID={0} and fdGameMode=1", roomkindid)))
                 * {
                 *  room.setMaxPlayersCount(8);
                 *  room.setPosList(8);
                 * }
                 * else if (DBHelp.CheckTable(string.Format("select * from essenroomkindid where fdRoomKindID={0} and fdGameMode=2", roomkindid)))
                 * {
                 *  room.setMaxPlayersCount(30);
                 *  room.setPosList(30);
                 *  room.is8Player = false;
                 * }
                 * else if (DBHelp.CheckTable(string.Format("select * from essenroomkindid where fdRoomKindID={0} and fdGameMode=3", roomkindid)))
                 * {
                 *  room.setMaxPlayersCount(20);
                 *  room.setPosList(20);
                 *  room.is8Player = false;
                 * }*/


                //取得第一個位置 0
                User.RoomPos = (byte)(User.Attribute == 3 ? 100 : room.PosList.First());
                room.PosList.Remove(User.RoomPos);
                room.setRoomMasterIndex(User.RoomPos);


                //User.IsRoomMaster = true;
                User.InGame        = true;
                User.CurrentRoomId = Rooms.RoomID;
                Rooms.RoomID      += 1;

                Log.Info("Room name: {0}, isTeamPlay={1}, isStepOn={2}, ItemType={3}, HasPassword={4}, RoomKindID={5}", name, isTeamPlay, isStepOn, itemtype, passwordlength > 0 ? true : false, roomkindid);

                //Client.SendAsync(new GameRoom_Hex(User, "FF5805FFFFFFFFFFFFFFFF000000000000000D01", last));
                Client.SendAsync(new GameRoom_GoodsInfo(User, room, last));
                Client.SendAsync(new GameRoom_Hex(User, "A3", last));

                Client.SendAsync(new GameRoom_SendRoomInfo(User, room, last));
                Client.SendAsync(new GameRoom_SendPlayerInfo(User, last));
                Client.SendAsync(new GameRoom_GetRoomMaster(User, room.RoomMasterIndex, last)); //場主位置

                //Client.SendAsync(new GameRoom_Hex(User, "FFB9010100000000", last));
                //Client.SendAsync(new GameRoom_SendRoomMaster(User, room.RoomMasterIndex, last));
                Client.SendAsync(new GameRoom_SendRoomMaster(User, room.MapNum, room.RoomMasterIndex, last));

                Client.SendAsync(new GameRoom_Hex(User, "FF6405F70300000000000000000000", last));
                Client.SendAsync(new GameRoom_Hex(User, "FF660501000000", last));

                if (isTeamPlay == 2)
                {
                    User.Team = 1;
                    Client.SendAsync(new GameRoom_RoomPosTeam(User, last));
                }

                /*Client.SendAsync(new GameRoom_Hex(User, "FF6405F70300000000000000000000", last));
                 * Client.SendAsync(new GameRoom_Hex(User, "FF660501000000", last));*/
                Rooms.NormalRoomList.Add(room);
            }
        }