/// <summary> /// A cityserver requested a decryptionkey for a client! /// </summary> public static void HandleKeyFetch(ref LoginListener Listener, PacketStream P, CityServerClient Client) { string AccountName = P.ReadString(); byte[] EncKey = new byte[1]; foreach (LoginClient Cl in Listener.Clients) { if (Cl.Username == AccountName) { EncKey = Cl.EncKey; if (Cl.CurrentlyActiveSim.CreatedThisSession) { //TODO: Update the DB to reflect the city that // this sim resides in. Database.UpdateCityForCharacter(Cl.CurrentlyActiveSim.Name, Client.ServerInfo.Name); } } } PacketStream OutPacket = new PacketStream(0x01, 0x00); OutPacket.WriteByte((byte)0x01); OutPacket.WriteByte((byte)(EncKey.Length + 2)); OutPacket.WriteByte((byte)EncKey.Length); OutPacket.Write(EncKey, 0, EncKey.Length); Client.Send(OutPacket.ToArray()); //For now, assume client has already disconnected and doesn't need to be disconnected manually. Listener.TransferringClients.Remove(Client); }
public static void HandleCityInfoRequest(NetworkClient Client, ProcessedPacket P) { //This packet only contains a dummy byte, don't bother reading it. PacketStream Packet = new PacketStream((byte)PacketType.CITY_LIST, 0); MemoryStream PacketData = new MemoryStream(); BinaryWriter PacketWriter = new BinaryWriter(PacketData); PacketWriter.Write((byte)NetworkFacade.CServerListener.CityServers.Count); foreach (CityServerClient City in NetworkFacade.CServerListener.CityServers) { PacketWriter.Write((string)City.ServerInfo.Name); PacketWriter.Write((string)City.ServerInfo.Description); PacketWriter.Write((string)City.ServerInfo.IP); PacketWriter.Write((int)City.ServerInfo.Port); //Hack (?) to ensure status is written correctly. switch (City.ServerInfo.Status) { case CityInfoStatus.Ok: PacketWriter.Write((byte)1); break; case CityInfoStatus.Busy: PacketWriter.Write((byte)2); break; case CityInfoStatus.Full: PacketWriter.Write((byte)3); break; case CityInfoStatus.Reserved: PacketWriter.Write((byte)4); break; } PacketWriter.Write((ulong)City.ServerInfo.Thumbnail); PacketWriter.Write((string)City.ServerInfo.UUID); PacketWriter.Write((ulong)City.ServerInfo.Map); PacketWriter.Flush(); } Packet.Write(PacketData.ToArray(), 0, PacketData.ToArray().Length); PacketWriter.Close(); Client.SendEncrypted((byte)PacketType.CITY_LIST, Packet.ToArray()); }
/// <summary> /// Callback method for EndCheckCharacterID. /// This retrieves information about the characters /// corresponding to the IDs retrieved earlier. /// </summary> private static void EndCheckCharacterTimestamp(IAsyncResult AR) { DatabaseAsyncObject AsyncObject = AR.AsyncState as DatabaseAsyncObject; List<Sim> Sims = new List<Sim>(); using (MySqlDataReader Reader = AsyncObject.MySQLCmd.EndExecuteReader(AR)) { while (Reader.Read()) { if ((int)Reader[0] == AsyncObject.CharacterID1) { int CharacterID = AsyncObject.CharacterID1; Sim Character = new Sim((string)Reader[1]); Character.CharacterID = CharacterID; Character.Timestamp = (string)Reader[2]; Character.Name = (string)Reader[3]; Character.Sex = (string)Reader[4]; Sims.Add(Character); } if (AsyncObject.NumCharacters == 1) break; if (AsyncObject.NumCharacters > 1) { if ((int)Reader[1] == AsyncObject.CharacterID2) { int CharacterID = AsyncObject.CharacterID2; Sim Character = new Sim((string)Reader[1]); Character.CharacterID = CharacterID; Character.Timestamp = (string)Reader[2]; Character.Name = (string)Reader[3]; Character.Sex = (string)Reader[4]; Sims.Add(Character); } } if (AsyncObject.NumCharacters == 2) break; if (AsyncObject.NumCharacters > 2) { if ((int)Reader[2] == AsyncObject.CharacterID3) { int CharacterID = AsyncObject.CharacterID3; Sim Character = new Sim((string)Reader[1]); Character.CharacterID = CharacterID; Character.Timestamp = (string)Reader[2]; Character.Name = (string)Reader[3]; Character.Sex = (string)Reader[4]; Sims.Add(Character); //For now, assume that finding the third character means //all characters have been found. break; } } } } PacketStream Packet = new PacketStream(0x05, 0); MemoryStream PacketData = new MemoryStream(); BinaryWriter PacketWriter = new BinaryWriter(PacketData); //The timestamp for all characters should be equal, so just check the first character. if (AsyncObject.CharacterTimestamp < DateTime.Parse(Sims[0].Timestamp) || AsyncObject.CharacterTimestamp > DateTime.Parse(Sims[0].Timestamp)) { //Write the characterdata into a temporary buffer. if (AsyncObject.NumCharacters == 1) { PacketWriter.Write(Sims[0].CharacterID); PacketWriter.Write(Sims[0].GUID); PacketWriter.Write(Sims[0].Timestamp); PacketWriter.Write(Sims[0].Name); PacketWriter.Write(Sims[0].Sex); PacketWriter.Flush(); } else if (AsyncObject.NumCharacters == 2) { PacketWriter.Write(Sims[0].CharacterID); PacketWriter.Write(Sims[0].GUID); PacketWriter.Write(Sims[0].Timestamp); PacketWriter.Write(Sims[0].Name); PacketWriter.Write(Sims[0].Sex); PacketWriter.Write(Sims[1].CharacterID); PacketWriter.Write(Sims[1].GUID); PacketWriter.Write(Sims[1].Timestamp); PacketWriter.Write(Sims[1].Name); PacketWriter.Write(Sims[1].Sex); PacketWriter.Flush(); } else if (AsyncObject.NumCharacters == 3) { PacketWriter.Write(Sims[0].CharacterID); PacketWriter.Write(Sims[0].GUID); PacketWriter.Write(Sims[0].Timestamp); PacketWriter.Write(Sims[0].Name); PacketWriter.Write(Sims[0].Sex); PacketWriter.Write(Sims[1].CharacterID); PacketWriter.Write(Sims[1].GUID); PacketWriter.Write(Sims[1].Timestamp); PacketWriter.Write(Sims[1].Name); PacketWriter.Write(Sims[1].Sex); PacketWriter.Write(Sims[2].CharacterID); PacketWriter.Write(Sims[2].GUID); PacketWriter.Write(Sims[2].Timestamp); PacketWriter.Write(Sims[2].Name); PacketWriter.Write(Sims[2].Sex); PacketWriter.Flush(); } Packet.WriteByte((byte)AsyncObject.NumCharacters); //Total number of characters. Packet.Write(PacketData.ToArray(), 0, (int)PacketData.Length); AsyncObject.Client.SendEncrypted(0x05, Packet.ToArray()); } else if (AsyncObject.CharacterTimestamp == DateTime.Parse(Sims[0].Timestamp)) { PacketWriter.Write((byte)0x00); //0 characters. AsyncObject.Client.SendEncrypted(0x05, Packet.ToArray()); } PacketWriter.Close(); }
/// <summary> /// Callback method for EndCheckCharacterID. /// This retrieves information about the characters /// corresponding to the IDs retrieved earlier. /// </summary> private static void EndCheckCharacterTimestamp(IAsyncResult AR) { DatabaseAsyncObject AsyncObject = AR.AsyncState as DatabaseAsyncObject; List <Sim> Sims = new List <Sim>(); using (MySqlDataReader Reader = AsyncObject.MySQLCmd.EndExecuteReader(AR)) { while (Reader.Read()) { if ((int)Reader[0] == AsyncObject.CharacterID1) { int CharacterID = AsyncObject.CharacterID1; Sim Character = new Sim((string)Reader[1]); Character.CharacterID = CharacterID; Character.Timestamp = (string)Reader[2]; Character.Name = (string)Reader[3]; Character.Sex = (string)Reader[4]; Sims.Add(Character); } if (AsyncObject.NumCharacters == 1) { break; } if (AsyncObject.NumCharacters > 1) { if ((int)Reader[1] == AsyncObject.CharacterID2) { int CharacterID = AsyncObject.CharacterID2; Sim Character = new Sim((string)Reader[1]); Character.CharacterID = CharacterID; Character.Timestamp = (string)Reader[2]; Character.Name = (string)Reader[3]; Character.Sex = (string)Reader[4]; Sims.Add(Character); } } if (AsyncObject.NumCharacters == 2) { break; } if (AsyncObject.NumCharacters > 2) { if ((int)Reader[2] == AsyncObject.CharacterID3) { int CharacterID = AsyncObject.CharacterID3; Sim Character = new Sim((string)Reader[1]); Character.CharacterID = CharacterID; Character.Timestamp = (string)Reader[2]; Character.Name = (string)Reader[3]; Character.Sex = (string)Reader[4]; Sims.Add(Character); //For now, assume that finding the third character means //all characters have been found. break; } } } } PacketStream Packet = new PacketStream(0x05, 0); MemoryStream PacketData = new MemoryStream(); BinaryWriter PacketWriter = new BinaryWriter(PacketData); //The timestamp for all characters should be equal, so just check the first character. if (AsyncObject.CharacterTimestamp < DateTime.Parse(Sims[0].Timestamp) || AsyncObject.CharacterTimestamp > DateTime.Parse(Sims[0].Timestamp)) { //Write the characterdata into a temporary buffer. if (AsyncObject.NumCharacters == 1) { PacketWriter.Write(Sims[0].CharacterID); PacketWriter.Write(Sims[0].GUID); PacketWriter.Write(Sims[0].Timestamp); PacketWriter.Write(Sims[0].Name); PacketWriter.Write(Sims[0].Sex); PacketWriter.Flush(); } else if (AsyncObject.NumCharacters == 2) { PacketWriter.Write(Sims[0].CharacterID); PacketWriter.Write(Sims[0].GUID); PacketWriter.Write(Sims[0].Timestamp); PacketWriter.Write(Sims[0].Name); PacketWriter.Write(Sims[0].Sex); PacketWriter.Write(Sims[1].CharacterID); PacketWriter.Write(Sims[1].GUID); PacketWriter.Write(Sims[1].Timestamp); PacketWriter.Write(Sims[1].Name); PacketWriter.Write(Sims[1].Sex); PacketWriter.Flush(); } else if (AsyncObject.NumCharacters == 3) { PacketWriter.Write(Sims[0].CharacterID); PacketWriter.Write(Sims[0].GUID); PacketWriter.Write(Sims[0].Timestamp); PacketWriter.Write(Sims[0].Name); PacketWriter.Write(Sims[0].Sex); PacketWriter.Write(Sims[1].CharacterID); PacketWriter.Write(Sims[1].GUID); PacketWriter.Write(Sims[1].Timestamp); PacketWriter.Write(Sims[1].Name); PacketWriter.Write(Sims[1].Sex); PacketWriter.Write(Sims[2].CharacterID); PacketWriter.Write(Sims[2].GUID); PacketWriter.Write(Sims[2].Timestamp); PacketWriter.Write(Sims[2].Name); PacketWriter.Write(Sims[2].Sex); PacketWriter.Flush(); } Packet.WriteByte((byte)AsyncObject.NumCharacters); //Total number of characters. Packet.Write(PacketData.ToArray(), 0, (int)PacketData.Length); AsyncObject.Client.SendEncrypted(0x05, Packet.ToArray()); } else if (AsyncObject.CharacterTimestamp == DateTime.Parse(Sims[0].Timestamp)) { PacketWriter.Write((byte)0x00); //0 characters. AsyncObject.Client.SendEncrypted(0x05, Packet.ToArray()); } PacketWriter.Close(); }
/// <summary> /// Client requested information about its characters. /// </summary> public static void HandleCharacterInfoRequest(NetworkClient Client, ProcessedPacket P) { Logger.LogInfo("Received CharacterInfoRequest!"); string DateTimeStr = P.ReadString(); DateTime Timestamp; if (DateTimeStr != string.Empty) { Timestamp = DateTime.Parse(DateTimeStr); } else { //Unix epoch Timestamp = new DateTime(1970, 1, 1, 0, 0, 1); } Character[] Characters = new Character[] { }; using (var db = DataAccess.Get()) { var account = db.Accounts.GetByUsername(Client.ClientEncryptor.Username); Characters = db.Characters.GetForAccount((int)account.AccountID).ToArray(); } int NumChars = 0, NewChars = 0; if (Characters != null) { PacketStream Packet = new PacketStream((byte)PacketType.CHARACTER_LIST, 0); MemoryStream PacketData = new MemoryStream(); BinaryWriter PacketWriter = new BinaryWriter(PacketData); NumChars = Characters.Length; foreach (Character avatar in Characters) { //Zero means same, less than zero means T1 is earlier than T2, more than zero means T1 is later. if (DateTime.Compare(Timestamp, avatar.LastCached) < 0) { NewChars++; PacketWriter.Write((int)avatar.CharacterID); PacketWriter.Write(avatar.GUID.ToString()); PacketWriter.Write(avatar.LastCached.ToString("yyyy.MM.dd hh:mm:ss", CultureInfo.InvariantCulture)); PacketWriter.Write(avatar.Name); PacketWriter.Write(avatar.Sex); PacketWriter.Write(avatar.Description); PacketWriter.Write((ulong)avatar.HeadOutfitID); PacketWriter.Write((ulong)avatar.BodyOutfitID); PacketWriter.Write((byte)avatar.AppearanceType); PacketWriter.Write((string)avatar.CityName); PacketWriter.Write((ulong)avatar.CityThumb); PacketWriter.Write((string)avatar.City); PacketWriter.Write((ulong)avatar.CityMap); PacketWriter.Write((string)avatar.CityIp); PacketWriter.Write((int)avatar.CityPort); PacketWriter.Write((int)avatar.Money); } } //NOTE: If Characters != null, but no chars were new, NumChars will be however many characters, // and NewChars will be 0. Packet.WriteByte((byte)NumChars); Packet.WriteByte((byte)NewChars); Packet.Write(PacketData.ToArray(), 0, (int)PacketData.Length); PacketWriter.Close(); Client.SendEncrypted((byte)PacketType.CHARACTER_LIST, Packet.ToArray()); } else //No characters existed for the account. { PacketStream Packet = new PacketStream(0x05, 0); Packet.WriteByte((byte)NumChars); //0 characters. Packet.WriteByte((byte)NewChars); //0 new characters. Client.SendEncrypted((byte)PacketType.CHARACTER_LIST, Packet.ToArray()); } }
public static void HandleCharacterInfoRequest(PacketStream P, LoginClient Client) { byte PacketLength = (byte)P.ReadByte(); //Length of the unencrypted data, excluding the header (ID, length, unencrypted length). byte UnencryptedLength = (byte)P.ReadByte(); P.DecryptPacket(Client.EncKey, Client.CryptoService, UnencryptedLength); Logger.LogDebug("Received CharacterInfoRequest!"); byte Length = (byte)P.ReadByte(); byte[] StrBuf = new byte[Length]; P.Read(StrBuf, 0, Length - 1); DateTime Timestamp = DateTime.Parse(Encoding.ASCII.GetString(StrBuf)); //Database.CheckCharacterTimestamp(Client.Username, Client, TimeStamp); Character[] Characters = Character.GetCharacters(Client.Username); if (Characters != null) { PacketStream Packet = new PacketStream(0x05, 0); MemoryStream PacketData = new MemoryStream(); BinaryWriter PacketWriter = new BinaryWriter(PacketData); //The timestamp for all characters should be equal, so just check the first character. if (Timestamp < DateTime.Parse(Characters[0].LastCached) || Timestamp > DateTime.Parse(Characters[0].LastCached)) { //Write the characterdata into a temporary buffer. if (Characters.Length == 1) { PacketWriter.Write(Characters[0].CharacterID); PacketWriter.Write(Characters[0].GUID); PacketWriter.Write(Characters[0].LastCached); PacketWriter.Write(Characters[0].Name); PacketWriter.Write(Characters[0].Sex); PacketWriter.Flush(); } else if (Characters.Length == 2) { PacketWriter.Write(Characters[0].CharacterID); PacketWriter.Write(Characters[0].GUID); PacketWriter.Write(Characters[0].LastCached); PacketWriter.Write(Characters[0].Name); PacketWriter.Write(Characters[0].Sex); PacketWriter.Write(Characters[1].CharacterID); PacketWriter.Write(Characters[1].GUID); PacketWriter.Write(Characters[1].LastCached); PacketWriter.Write(Characters[1].Name); PacketWriter.Write(Characters[1].Sex); PacketWriter.Flush(); } else if (Characters.Length == 3) { PacketWriter.Write(Characters[0].CharacterID); PacketWriter.Write(Characters[0].GUID); PacketWriter.Write(Characters[0].LastCached); PacketWriter.Write(Characters[0].Name); PacketWriter.Write(Characters[0].Sex); PacketWriter.Write(Characters[1].CharacterID); PacketWriter.Write(Characters[1].GUID); PacketWriter.Write(Characters[1].LastCached); PacketWriter.Write(Characters[1].Name); PacketWriter.Write(Characters[1].Sex); PacketWriter.Write(Characters[2].CharacterID); PacketWriter.Write(Characters[2].GUID); PacketWriter.Write(Characters[2].LastCached); PacketWriter.Write(Characters[2].Name); PacketWriter.Write(Characters[2].Sex); PacketWriter.Flush(); } Packet.WriteByte((byte)Characters.Length); //Total number of characters. Packet.Write(PacketData.ToArray(), 0, (int)PacketData.Length); PacketWriter.Close(); Client.SendEncrypted(0x05, Packet.ToArray()); } } else //No characters existed for the account. { PacketStream Packet = new PacketStream(0x05, 0); Packet.WriteByte(0x00); //0 characters. Client.SendEncrypted(0x05, Packet.ToArray()); } }
public static void HandleCityInfoRequest(PacketStream P, LoginClient Client) { byte PacketLength = (byte)P.ReadByte(); //Length of the unencrypted data, excluding the header (ID, length, unencrypted length). byte UnencryptedLength = (byte)P.ReadByte(); P.DecryptPacket(Client.EncKey, Client.CryptoService, UnencryptedLength); //This packet only contains a dummy byte, don't bother reading it. PacketStream Packet = new PacketStream(0x06, 0); MemoryStream PacketData = new MemoryStream(); BinaryWriter PacketWriter = new BinaryWriter(PacketData); PacketWriter.Write((byte)NetworkFacade.CServerListener.CityServers.Count); foreach (CityServerClient City in NetworkFacade.CServerListener.CityServers) { PacketWriter.Write(City.ServerInfo.Name); PacketWriter.Write(City.ServerInfo.Description); PacketWriter.Write(City.ServerInfo.IP); PacketWriter.Write(City.ServerInfo.Port); PacketWriter.Write((byte)City.ServerInfo.Status); PacketWriter.Write(City.ServerInfo.Thumbnail); PacketWriter.Write(City.ServerInfo.UUID); PacketWriter.Flush(); } Packet.Write(PacketData.ToArray(), 0, PacketData.ToArray().Length); PacketWriter.Close(); Client.SendEncrypted(0x06, Packet.ToArray()); }
/// <summary> /// Client requested information about its characters. /// </summary> public static void HandleCharacterInfoRequest(NetworkClient Client, ProcessedPacket P) { Logger.LogInfo("Received CharacterInfoRequest!"); DateTime Timestamp = DateTime.Parse(P.ReadPascalString()); //Database.CheckCharacterTimestamp(Client.Username, Client, TimeStamp); Character[] Characters = new Character[] { }; using (var db = DataAccess.Get()) { var account = db.Accounts.GetByUsername(Client.ClientEncryptor.Username); Characters = db.Characters.GetForAccount((int)account.AccountID).ToArray(); } if (Characters != null) { PacketStream Packet = new PacketStream((byte)PacketType.CHARACTER_LIST, 0); MemoryStream PacketData = new MemoryStream(); BinaryWriter PacketWriter = new BinaryWriter(PacketData); int NumChars = 0; foreach (Character avatar in Characters) { //Zero means same, less than zero means T1 is earlier than T2, more than zero means T1 is later. if (DateTime.Compare(Timestamp, DateTime.Parse(avatar.LastCached)) < 0) { NumChars++; PacketWriter.Write((int)avatar.CharacterID); PacketWriter.Write(avatar.GUID.ToString()); PacketWriter.Write(avatar.LastCached); PacketWriter.Write(avatar.Name); PacketWriter.Write(avatar.Sex); PacketWriter.Write(avatar.Description); PacketWriter.Write((ulong)avatar.HeadOutfitID); PacketWriter.Write((ulong)avatar.BodyOutfitID); PacketWriter.Write((byte)avatar.AppearanceType); PacketWriter.Write((string)avatar.CityName); PacketWriter.Write((ulong)avatar.CityThumb); PacketWriter.Write((string)avatar.City); PacketWriter.Write((ulong)avatar.CityMap); PacketWriter.Write((string)avatar.CityIp); PacketWriter.Write((int)avatar.CityPort); } } Packet.WriteByte((byte)NumChars); Packet.Write(PacketData.ToArray(), 0, (int)PacketData.Length); PacketWriter.Close(); Client.SendEncrypted(0x05, Packet.ToArray()); } else //No characters existed for the account. { PacketStream Packet = new PacketStream(0x05, 0); Packet.WriteByte(0x00); //0 characters. Client.SendEncrypted((byte)PacketType.CHARACTER_LIST, Packet.ToArray()); } }
public static void HandleCityInfoRequest(ref LoginClient Client, PacketStream P) { ushort PacketLength = (ushort)P.ReadUShort(); //Length of the unencrypted data, excluding the header (ID, length, unencrypted length). ushort UnencryptedLength = (ushort)P.ReadUShort(); P.DecryptPacket(Client.EncKey, Client.CryptoService, UnencryptedLength); //This packet only contains a dummy byte, don't bother reading it. PacketStream Packet = new PacketStream(0x06, 0); MemoryStream PacketData = new MemoryStream(); BinaryWriter PacketWriter = new BinaryWriter(PacketData); PacketWriter.Write((byte)NetworkFacade.CServerListener.CityServers.Count); foreach (CityServerClient City in NetworkFacade.CServerListener.CityServers) { PacketWriter.Write((string)City.ServerInfo.Name); PacketWriter.Write((string)City.ServerInfo.Description); PacketWriter.Write((string)City.ServerInfo.IP); PacketWriter.Write((int)City.ServerInfo.Port); //Hack (?) to ensure status is written correctly. switch (City.ServerInfo.Status) { case CityInfoStatus.Ok: PacketWriter.Write((byte)1); break; case CityInfoStatus.Busy: PacketWriter.Write((byte)2); break; case CityInfoStatus.Full: PacketWriter.Write((byte)3); break; case CityInfoStatus.Reserved: PacketWriter.Write((byte)4); break; } PacketWriter.Write((ulong)City.ServerInfo.Thumbnail); PacketWriter.Write((string)City.ServerInfo.UUID); PacketWriter.Write((ulong)City.ServerInfo.Map); PacketWriter.Flush(); } Packet.Write(PacketData.ToArray(), 0, PacketData.ToArray().Length); PacketWriter.Close(); Client.SendEncrypted(0x06, Packet.ToArray()); }
public static void HandleCharacterInfoRequest(ref LoginClient Client, PacketStream P) { ushort PacketLength = (ushort)P.ReadUShort(); //Length of the unencrypted data, excluding the header (ID, length, unencrypted length). ushort UnencryptedLength = (ushort)P.ReadUShort(); P.DecryptPacket(Client.EncKey, Client.CryptoService, UnencryptedLength); Logger.LogDebug("Received CharacterInfoRequest!"); DateTime Timestamp = DateTime.Parse(P.ReadASCII()); //Database.CheckCharacterTimestamp(Client.Username, Client, TimeStamp); Character[] Characters = new Character[]{}; using (var db = DataAccess.Get()) { Characters = db.Characters.GetForAccount(Client.AccountID).ToArray(); } if (Characters != null) { PacketStream Packet = new PacketStream(0x05, 0); MemoryStream PacketData = new MemoryStream(); BinaryWriter PacketWriter = new BinaryWriter(PacketData); /** * Whats the point of checking a timestamp here? It saves a few bytes on a packet * sent once per user session. Premature optimization. */ PacketWriter.Write((byte)Characters.Length); foreach(Character avatar in Characters){ PacketWriter.Write(avatar.CharacterID); PacketWriter.Write(avatar.GUID.ToString()); PacketWriter.Write(avatar.LastCached); PacketWriter.Write(avatar.Name); PacketWriter.Write(avatar.Sex); } Packet.Write(PacketData.ToArray(), 0, (int)PacketData.Length); PacketWriter.Close(); Client.SendEncrypted(0x05, Packet.ToArray()); } else //No characters existed for the account. { PacketStream Packet = new PacketStream(0x05, 0); Packet.WriteByte(0x00); //0 characters. Client.SendEncrypted(0x05, Packet.ToArray()); } }
public static void HandleCharacterInfoRequest(PacketStream P, LoginClient Client) { byte PacketLength = (byte)P.ReadByte(); //Length of the unencrypted data, excluding the header (ID, length, unencrypted length). byte UnencryptedLength = (byte)P.ReadByte(); P.DecryptPacket(Client.EncKey, Client.CryptoService, UnencryptedLength); Logger.LogDebug("Received CharacterInfoRequest!"); byte Length = (byte)P.ReadByte(); byte[] StrBuf = new byte[Length]; P.Read(StrBuf, 0, Length - 1); DateTime Timestamp = DateTime.Parse(Encoding.ASCII.GetString(StrBuf)); //Database.CheckCharacterTimestamp(Client.Username, Client, TimeStamp); Character[] Characters = Character.GetCharacters(Client.Username); if (Characters != null) { PacketStream Packet = new PacketStream(0x05, 0); MemoryStream PacketData = new MemoryStream(); BinaryWriter PacketWriter = new BinaryWriter(PacketData); //The timestamp for all characters should be equal, so just check the first character. if (Timestamp < DateTime.Parse(Characters[0].LastCached) || Timestamp > DateTime.Parse(Characters[0].LastCached)) { //Write the characterdata into a temporary buffer. if (Characters.Length == 1) { PacketWriter.Write(Characters[0].CharacterID); PacketWriter.Write(Characters[0].GUID); PacketWriter.Write(Characters[0].LastCached); PacketWriter.Write(Characters[0].Name); PacketWriter.Write(Characters[0].Sex); PacketWriter.Flush(); } else if (Characters.Length == 2) { PacketWriter.Write(Characters[0].CharacterID); PacketWriter.Write(Characters[0].GUID); PacketWriter.Write(Characters[0].LastCached); PacketWriter.Write(Characters[0].Name); PacketWriter.Write(Characters[0].Sex); PacketWriter.Write(Characters[1].CharacterID); PacketWriter.Write(Characters[1].GUID); PacketWriter.Write(Characters[1].LastCached); PacketWriter.Write(Characters[1].Name); PacketWriter.Write(Characters[1].Sex); PacketWriter.Flush(); } else if (Characters.Length == 3) { PacketWriter.Write(Characters[0].CharacterID); PacketWriter.Write(Characters[0].GUID); PacketWriter.Write(Characters[0].LastCached); PacketWriter.Write(Characters[0].Name); PacketWriter.Write(Characters[0].Sex); PacketWriter.Write(Characters[1].CharacterID); PacketWriter.Write(Characters[1].GUID); PacketWriter.Write(Characters[1].LastCached); PacketWriter.Write(Characters[1].Name); PacketWriter.Write(Characters[1].Sex); PacketWriter.Write(Characters[2].CharacterID); PacketWriter.Write(Characters[2].GUID); PacketWriter.Write(Characters[2].LastCached); PacketWriter.Write(Characters[2].Name); PacketWriter.Write(Characters[2].Sex); PacketWriter.Flush(); } Packet.WriteByte((byte)Characters.Length); //Total number of characters. Packet.Write(PacketData.ToArray(), 0, (int)PacketData.Length); PacketWriter.Close(); Client.SendEncrypted(0x05, Packet.ToArray()); } } else //No characters existed for the account. { PacketStream Packet = new PacketStream(0x05, 0); Packet.WriteByte(0x00); //0 characters. Client.SendEncrypted(0x05, Packet.ToArray()); } }