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)); }
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); } }
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); } } }
public static void EnterRoom(ClientConnection Client, NormalRoom room, string pw, byte last) { Account User = Client.CurrentAccount; int MaxPlayer; if (room.is8Player) { MaxPlayer = room.SlotCount; } else { MaxPlayer = room.MaxPlayersCount; } if (room.isPlaying) { Client.SendAsync(new GameRoom_EnterRoomError(User, 5, (byte)room.RoomKindID, last)); return; } if (room.Players.Count(p => p.Attribute != 3) < MaxPlayer || User.Attribute == 3) { //room.Players.Add(User); // User.IsRoomMaster = false; if (room.Players.Exists(p => p.Attribute == 3) && User.Attribute == 3) { Client.SendAsync(new GameRoom_EnterRoomError(User, 9, (byte)room.RoomKindID, last)); return; } if (room.Password != pw && User.Attribute == 0) { Client.SendAsync(new GameRoom_EnterRoomError(User, 7, (byte)room.RoomKindID, last)); return; } DateTime kickedtime; if (room.KickedList.TryGetValue(User, out kickedtime)) { bool cantenter = DateTime.Compare(DateTime.Now, kickedtime.AddSeconds(60)) < 0; if (cantenter) { Client.SendAsync(new GameRoom_EnterRoomError(User, 6, (byte)room.RoomKindID, last)); return; } room.KickedList.Remove(User); } User.InGame = true; User.CurrentRoomId = room.ID; User.IsReady = false; //取得當前第一個位置id User.RoomPos = (byte)(User.Attribute == 3 ? 100 : room.PosList.FirstOrDefault()); //Console.WriteLine("User.RoomPos: "+ User.RoomPos); room.PosList.Remove(User.RoomPos); //Client.SendAsync(new GameRoom_RegisterSuccess(User, room.ItemNum, room.Storage_Id, last)); Client.SendAsync(new GameRoom_GoodsInfo(User, room, 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)); if (room.IsTeamPlay == 2) { User.Team = 1; roomUser.Connection.SendAsync(new GameRoom_RoomPosTeam(User, last)); } } room.Players.Add(User); //Send roomuser info俾自己 foreach (Account roomUser in room.Players) { Client.SendAsync(new GameRoom_SendPlayerInfo(roomUser, last)); Client.SendAsync(new GameRoom_RoomPosReady(roomUser, roomUser.RoomPos, roomUser.IsReady, last)); if (room.IsTeamPlay == 2) { Client.SendAsync(new GameRoom_RoomPosTeam(roomUser, last)); } if (User.Attribute == 3) { room.setRoomMasterIndex(100); byte africapos = room.RoomMasterIndex; //room.Players.Find(player => player.IsRoomMaster).RoomPos; roomUser.Connection.SendAsync(new GameRoom_GetRoomMaster(roomUser, africapos, last)); } } if (User.Attribute != 3) { byte roommasterpos = room.RoomMasterIndex; //room.Players.Find(player => player.IsRoomMaster).RoomPos; Client.SendAsync(new GameRoom_GetRoomMaster(User, roommasterpos, last)); } } else { Client.SendAsync(new GameRoom_EnterRoomError(User, 1, (byte)room.RoomKindID, last)); } }