private static void LoadBroadcastTextLocale() { // 0 1 2 3 4 var query = new StringBuilder(string.Format("SELECT Id, locale, MaleText_lang, FemaleText_lang, VerifiedBuild FROM {0}.broadcast_text_locale;", Settings.HotfixesDatabase)); using (var reader = SQLConnector.ExecuteQuery(query.ToString())) { if (reader == null) { return; } while (reader.Read()) { var broadcastTextLocale = new BroadcastTextLocale(); var id = (uint)reader.GetValue(0); var locale = (string)reader.GetValue(1); broadcastTextLocale.MaleText_lang = (string)reader.GetValue(2); broadcastTextLocale.FemaleText_lang = (string)reader.GetValue(3); broadcastTextLocale.VerifiedBuild = Convert.ToInt16(reader.GetValue(4)); BroadcastTextLocaleStores.Add(Tuple.Create(id, locale), broadcastTextLocale); } } }
public static void HandleDBReply(Packet packet) { var type = packet.ReadUInt32E <DB2Hash>("TableHash"); var entry = packet.ReadInt32("RecordID"); var timeStamp = packet.ReadUInt32(); packet.AddValue("Timestamp", Utilities.GetDateTimeFromUnixTime(timeStamp)); var allow = packet.ReadBit("Allow"); var size = packet.ReadInt32("Size"); var data = packet.ReadBytes(size); var db2File = new Packet(data, packet.Opcode, packet.Time, packet.Direction, packet.Number, packet.Writer, packet.FileName); if (entry < 0 || !allow) { packet.WriteLine("Row {0} has been removed.", -entry); HotfixStoreMgr.RemoveRecord(type, entry); } else { switch (type) { case DB2Hash.BroadcastText: { var bct = new BroadcastText() { Text = db2File.ReadCString("Text"), Text1 = db2File.ReadCString("Text1"), }; bct.ID = db2File.ReadUInt32("ID"); bct.LanguageID = db2File.ReadByte("LanguageID"); bct.ConditionID = db2File.ReadUInt32("ConditionID"); bct.EmotesID = db2File.ReadUInt16("EmotesID"); bct.Flags = db2File.ReadByte("Flags"); bct.ChatBubbleDurationMs = db2File.ReadUInt32("ChatBubbleDurationMs"); bct.SoundEntriesID = new uint?[2]; for (int i = 0; i < 2; ++i) { bct.SoundEntriesID[i] = db2File.ReadUInt32("SoundEntriesID", i); } bct.EmoteID = new ushort?[3]; bct.EmoteDelay = new ushort?[3]; for (int i = 0; i < 3; ++i) { bct.EmoteID[i] = db2File.ReadUInt16("EmoteID", i); } for (int i = 0; i < 3; ++i) { bct.EmoteDelay[i] = db2File.ReadUInt16("EmoteDelay", i); } Storage.BroadcastTexts.Add(bct, packet.TimeSpan); if (ClientLocale.PacketLocale != LocaleConstant.enUS) { BroadcastTextLocale lbct = new BroadcastTextLocale { ID = bct.ID, TextLang = bct.Text, Text1Lang = bct.Text1 }; Storage.BroadcastTextLocales.Add(lbct, packet.TimeSpan); } break; } default: HotfixStoreMgr.AddRecord(type, entry, db2File); break; } db2File.ClosePacket(false); } }
public static void HandleDBReply(Packet packet) { var dbReply = packet.Holder.DbReply = new(); var type = packet.ReadUInt32E <DB2Hash>("TableHash"); dbReply.TableHash = (uint)type; var entry = dbReply.RecordId = packet.ReadInt32("RecordID"); var timeStamp = packet.ReadUInt32(); var time = packet.AddValue("Timestamp", Utilities.GetDateTimeFromUnixTime(timeStamp)); dbReply.Time = Timestamp.FromDateTime(DateTime.SpecifyKind(time, DateTimeKind.Utc)); int statusBits = ClientVersion.AddedInVersion(ClientVersionBuild.V9_1_0_39185) ? 3 : 2; var status = packet.ReadBitsE <HotfixStatus>("Status", statusBits); switch (status) { case HotfixStatus.Valid: dbReply.Status = PacketDbReplyRecordStatus.RecordStatusValid; break; case HotfixStatus.RecordRemoved: dbReply.Status = PacketDbReplyRecordStatus.RecordStatusRecordRemoved; break; case HotfixStatus.Invalid: dbReply.Status = PacketDbReplyRecordStatus.RecordStatusInvalid; break; case HotfixStatus.NotPublic: dbReply.Status = PacketDbReplyRecordStatus.RecordStatusNotPublic; break; default: throw new ArgumentOutOfRangeException(); } var size = packet.ReadInt32("Size"); var data = packet.ReadBytes(size); var db2File = new Packet(data, packet.Opcode, packet.Time, packet.Direction, packet.Number, packet.Writer, packet.FileName); switch (status) { case HotfixStatus.Valid: { switch (type) { case DB2Hash.BroadcastText: { var bct = new BroadcastText() { Text = db2File.ReadCString("Text"), Text1 = db2File.ReadCString("Text1"), }; bct.ID = db2File.ReadUInt32("ID"); bct.LanguageID = db2File.ReadInt32("LanguageID"); bct.ConditionID = db2File.ReadUInt32("ConditionID"); bct.EmotesID = db2File.ReadUInt16("EmotesID"); bct.Flags = db2File.ReadByte("Flags"); bct.ChatBubbleDurationMs = db2File.ReadUInt32("ChatBubbleDurationMs"); bct.SoundEntriesID = new uint?[2]; for (int i = 0; i < 2; ++i) { bct.SoundEntriesID[i] = db2File.ReadUInt32("SoundEntriesID", i); } bct.EmoteID = new ushort?[3]; bct.EmoteDelay = new ushort?[3]; for (int i = 0; i < 3; ++i) { bct.EmoteID[i] = db2File.ReadUInt16("EmoteID", i); } for (int i = 0; i < 3; ++i) { bct.EmoteDelay[i] = db2File.ReadUInt16("EmoteDelay", i); } Storage.BroadcastTexts.Add(bct, packet.TimeSpan); if (ClientLocale.PacketLocale != LocaleConstant.enUS) { BroadcastTextLocale lbct = new BroadcastTextLocale { ID = bct.ID, TextLang = bct.Text, Text1Lang = bct.Text1 }; Storage.BroadcastTextLocales.Add(lbct, packet.TimeSpan); } dbReply.BroadcastText = new PacketDbReplyBroadcastText() { Id = bct.ID.Value, Text0 = bct.Text, Text1 = bct.Text1, Language = bct.LanguageID.Value, ConditionId = bct.ConditionID.Value, EmotesId = bct.EmotesID.Value, Flags = bct.Flags.Value, ChatBubbleDuration = bct.ChatBubbleDurationMs.Value, }; for (int i = 0; i < 2; ++i) { dbReply.BroadcastText.Sounds.Add(bct.SoundEntriesID[i] ?? 0); } for (int i = 0; i < 3; ++i) { dbReply.BroadcastText.Emotes.Add(new BroadcastTextEmote() { EmoteId = bct.EmoteID[i] ?? 0, Delay = bct.EmoteDelay[i] ?? 0 }); } break; } default: HotfixStoreMgr.AddRecord(type, entry, db2File); break; } if (db2File.Position != db2File.Length) { HandleHotfixOptionalData(packet, type, entry, db2File); } db2File.ClosePacket(false); break; } case HotfixStatus.RecordRemoved: { packet.WriteLine($"Row {entry} has been removed."); HotfixStoreMgr.RemoveRecord(type, entry); break; } case HotfixStatus.Invalid: { // sniffs from others may have the data packet.WriteLine($"Row {entry} is invalid."); break; } case HotfixStatus.NotPublic: { packet.WriteLine($"Row {entry} is not public."); break; } default: { packet.WriteLine($"Unhandled status: {status}"); break; } } }
public static void HandleDBReply(Packet packet) { var dbReply = packet.Holder.DbReply = new(); var type = packet.ReadUInt32E <DB2Hash>("TableHash"); dbReply.TableHash = (uint)type; var entry = dbReply.RecordId = packet.ReadInt32("RecordID"); var timeStamp = packet.ReadUInt32(); var time = packet.AddValue("Timestamp", Utilities.GetDateTimeFromUnixTime(timeStamp)); dbReply.Time = Timestamp.FromDateTime(DateTime.SpecifyKind(time, DateTimeKind.Utc)); var allow = packet.ReadBit("Allow"); var size = packet.ReadInt32("Size"); var data = packet.ReadBytes(size); var db2File = new Packet(data, packet.Opcode, packet.Time, packet.Direction, packet.Number, packet.Writer, packet.FileName); if (entry < 0 || !allow) { dbReply.Status = PacketDbReplyRecordStatus.RecordStatusRecordRemoved; packet.WriteLine("Row {0} has been removed.", -entry); HotfixStoreMgr.RemoveRecord(type, entry); } else { dbReply.Status = PacketDbReplyRecordStatus.RecordStatusValid; switch (type) { case DB2Hash.BroadcastText: { var bct = new BroadcastText() { ID = (uint)entry, Text = db2File.ReadCString("Text"), Text1 = db2File.ReadCString("Text1"), }; bct.EmoteID = new ushort?[3]; bct.EmoteDelay = new ushort?[3]; for (int i = 0; i < 3; ++i) { bct.EmoteID[i] = db2File.ReadUInt16("EmoteID", i); } for (int i = 0; i < 3; ++i) { bct.EmoteDelay[i] = db2File.ReadUInt16("EmoteDelay", i); } bct.EmotesID = db2File.ReadUInt16("EmotesID"); bct.LanguageID = db2File.ReadByte("LanguageID"); bct.Flags = db2File.ReadByte("Flags"); if (ClientVersion.AddedInVersion(ClientVersionBuild.V7_3_5_25848)) { bct.ConditionID = db2File.ReadUInt32("ConditionID"); } bct.SoundEntriesID = new uint?[2]; for (int i = 0; i < 2; ++i) { bct.SoundEntriesID[i] = db2File.ReadUInt32("SoundEntriesID", i); } if (ClientVersion.AddedInVersion(ClientVersionBuild.V7_0_3_22248) && ClientVersion.RemovedInVersion(ClientVersionBuild.V7_3_5_25848)) { bct.ConditionID = db2File.ReadUInt32("ConditionID"); } Storage.BroadcastTexts.Add(bct, packet.TimeSpan); if (ClientLocale.PacketLocale != LocaleConstant.enUS) { BroadcastTextLocale lbct = new BroadcastTextLocale { ID = bct.ID, TextLang = bct.Text, Text1Lang = bct.Text1 }; Storage.BroadcastTextLocales.Add(lbct, packet.TimeSpan); } dbReply.BroadcastText = new PacketDbReplyBroadcastText() { Id = bct.ID.Value, Text0 = bct.Text, Text1 = bct.Text1, Language = bct.LanguageID.Value, ConditionId = bct.ConditionID ?? 0, EmotesId = bct.EmotesID.Value, Flags = bct.Flags.Value, ChatBubbleDuration = 0, }; dbReply.BroadcastText.Sounds.Add(bct.SoundEntriesID1 ?? 0); dbReply.BroadcastText.Sounds.Add(bct.SoundEntriesID2 ?? 0); for (int i = 0; i < 3; ++i) { dbReply.BroadcastText.Emotes.Add(new BroadcastTextEmote() { EmoteId = bct.EmoteID[i] ?? 0, Delay = bct.EmoteDelay[i] ?? 0 }); } break; } default: HotfixStoreMgr.AddRecord(type, entry, db2File); break; } db2File.ClosePacket(false); } }