public static void LoadSQL() { if (!SQLConnector.Connected()) { throw new DataException("Cannot get DB data without an active DB connection."); } var startTime = DateTime.Now; var query = new StringBuilder(string.Format("SELECT ID, Language, MaleText, FemaleText, EmoteID0, EmoteID1, EmoteID2, EmoteDelay0, EmoteDelay1, EmoteDelay2, SoundId, Unk1, Unk2 FROM {0}.broadcast_text;", Settings.TDBDatabase)); using (var reader = SQLConnector.ExecuteQuery(query.ToString())) { if (reader == null) { return; } while (reader.Read()) { var broadcastText = new BroadcastText(); uint Id = Convert.ToUInt32(reader["Id"]); broadcastText.language = Convert.ToUInt32(reader["Language"]); broadcastText.MaleText = Convert.ToString(reader["MaleText"]); broadcastText.FemaleText = Convert.ToString(reader["FemaleText"]); broadcastText.emoteID0 = Convert.ToUInt32(reader["EmoteID0"]); broadcastText.emoteID1 = Convert.ToUInt32(reader["EmoteID1"]); broadcastText.emoteID2 = Convert.ToUInt32(reader["EmoteID2"]); broadcastText.emoteDelay0 = Convert.ToUInt32(reader["EmoteDelay0"]); broadcastText.emoteDelay1 = Convert.ToUInt32(reader["EmoteDelay1"]); broadcastText.emoteDelay2 = Convert.ToUInt32(reader["EmoteDelay2"]); broadcastText.soundId = Convert.ToUInt32(reader["SoundId"]); broadcastText.unk1 = Convert.ToUInt32(reader["Unk1"]); broadcastText.unk2 = Convert.ToUInt32(reader["Unk2"]); var tuple = Tuple.Create(Id, broadcastText); BroadcastTextStores.Add(tuple); } } var endTime = DateTime.Now; var span = endTime.Subtract(startTime); Trace.WriteLine(String.Format("SQL loaded in {0}.", span.ToFormattedString())); }
/// <summary> /// Loads the broadcast texts form the database. /// </summary> private static void LoadBroadcastText() { string query = $"SELECT ID, Language, MaleText, FemaleText, EmoteID1, EmoteID2, EmoteID3, EmoteDelay1, EmoteDelay2, EmoteDelay3, SoundId, UnkEmoteID, Type FROM {Settings.HotfixesDatabase}.broadcast_text;"; using (MySqlDataReader reader = SQLConnector.ExecuteQuery(query)) { if (reader == null) { return; } while (reader.Read()) { BroadcastText broadcastText = new BroadcastText(); uint id = Convert.ToUInt32(reader["Id"]); broadcastText.Language = Convert.ToInt32(reader["Language"]); broadcastText.MaleText = Convert.ToString(reader["MaleText"]); broadcastText.FemaleText = Convert.ToString(reader["FemaleText"]); broadcastText.EmoteID = new uint?[3]; broadcastText.EmoteID[0] = Convert.ToUInt32(reader["EmoteID1"]); broadcastText.EmoteID[1] = Convert.ToUInt32(reader["EmoteID2"]); broadcastText.EmoteID[2] = Convert.ToUInt32(reader["EmoteID3"]); broadcastText.EmoteDelay = new uint?[3]; broadcastText.EmoteDelay[0] = Convert.ToUInt32(reader["EmoteDelay1"]); broadcastText.EmoteDelay[1] = Convert.ToUInt32(reader["EmoteDelay2"]); broadcastText.EmoteDelay[2] = Convert.ToUInt32(reader["EmoteDelay3"]); broadcastText.SoundId = Convert.ToUInt32(reader["SoundId"]); broadcastText.UnkEmoteId = Convert.ToUInt32(reader["UnkEmoteID"]); broadcastText.Type = Convert.ToUInt32(reader["Type"]); var tuple = Tuple.Create(id, broadcastText); BroadcastTextStores.Add(tuple); } } }
private static void LoadBroadcastText() { var query = new StringBuilder(string.Format("SELECT ID, Language, MaleText, FemaleText, EmoteID1, EmoteID2, EmoteID3, EmoteDelay1, EmoteDelay2, EmoteDelay3, SoundId, UnkEmoteID, Type FROM {0}.broadcast_text;", Settings.HotfixesDatabase)); using (var reader = SQLConnector.ExecuteQuery(query.ToString())) { if (reader == null) { return; } while (reader.Read()) { var broadcastText = new BroadcastText(); uint id = Convert.ToUInt32(reader["Id"]); broadcastText.language = Convert.ToInt32(reader["Language"]); broadcastText.MaleText = Convert.ToString(reader["MaleText"]); broadcastText.FemaleText = Convert.ToString(reader["FemaleText"]); broadcastText.emoteID0 = Convert.ToUInt32(reader["EmoteID1"]); broadcastText.emoteID1 = Convert.ToUInt32(reader["EmoteID2"]); broadcastText.emoteID2 = Convert.ToUInt32(reader["EmoteID3"]); broadcastText.emoteDelay0 = Convert.ToUInt32(reader["EmoteDelay1"]); broadcastText.emoteDelay1 = Convert.ToUInt32(reader["EmoteDelay2"]); broadcastText.emoteDelay2 = Convert.ToUInt32(reader["EmoteDelay3"]); broadcastText.soundId = Convert.ToUInt32(reader["SoundId"]); broadcastText.unk1 = Convert.ToUInt32(reader["UnkEmoteID"]); broadcastText.unk2 = Convert.ToUInt32(reader["Type"]); var tuple = Tuple.Create(id, broadcastText); BroadcastTextStores.Add(tuple); } } }
public static void HandleDBReply(Packet packet) { var type = packet.ReadEnum <DB2Hash>("DB2 File", TypeCode.UInt32); packet.ReadTime("Hotfix date"); 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); var entry = (uint)packet.ReadInt32("Entry"); if ((int)entry < 0) { packet.WriteLine("Row {0} has been removed.", -(int)entry); return; } switch (type) { case DB2Hash.BroadcastText: { var broadcastText = new BroadcastText(); var Id = db2File.ReadEntry("Broadcast Text Entry"); broadcastText.language = db2File.ReadUInt32("Language"); if (db2File.ReadUInt16() > 0) { broadcastText.MaleText = db2File.ReadCString("Male Text"); } if (db2File.ReadUInt16() > 0) { broadcastText.FemaleText = db2File.ReadCString("Female Text"); } broadcastText.EmoteID = new uint[3]; broadcastText.EmoteDelay = new uint[3]; for (var i = 0; i < 3; ++i) { broadcastText.EmoteID[i] = (uint)db2File.ReadInt32("Emote ID", i); } for (var i = 0; i < 3; ++i) { broadcastText.EmoteDelay[i] = (uint)db2File.ReadInt32("Emote Delay", i); } broadcastText.soundId = db2File.ReadUInt32("Sound Id"); broadcastText.unk1 = db2File.ReadUInt32("Unk 1"); // emote unk broadcastText.unk2 = db2File.ReadUInt32("Unk 2"); // kind of type? Storage.BroadcastTexts.Add((uint)Id.Key, broadcastText, packet.TimeSpan); packet.AddSniffData(StoreNameType.BroadcastText, Id.Key, "BROADCAST_TEXT"); break; } case DB2Hash.Creature: { db2File.ReadUInt32("Creature Entry"); db2File.ReadUInt32("Item Entry 1"); db2File.ReadUInt32("Item Entry 2"); db2File.ReadUInt32("Item Entry 3"); db2File.ReadUInt32("Projectile Entry 1"); db2File.ReadUInt32("Projectile Entry 2"); db2File.ReadUInt32("Mount"); db2File.ReadUInt32("Display Id 1"); db2File.ReadUInt32("Display Id 2"); db2File.ReadUInt32("Display Id 3"); db2File.ReadUInt32("Display Id 4"); db2File.ReadSingle("Unk Float 1"); db2File.ReadSingle("Unk Float 2"); db2File.ReadSingle("Unk Float 3"); db2File.ReadSingle("Unk Float 4"); if (db2File.ReadUInt16() > 0) { db2File.ReadCString("Name"); } db2File.ReadUInt32("Inhabit Type"); break; } case DB2Hash.Item: { var item = Storage.ItemTemplates.ContainsKey(entry) ? Storage.ItemTemplates[entry].Item1 : new ItemTemplate(); db2File.ReadEntry <UInt32>(StoreNameType.Item, "Item Entry"); item.Class = db2File.ReadEnum <ItemClass>("Class", TypeCode.Int32); item.SubClass = db2File.ReadUInt32("Sub Class"); item.SoundOverrideSubclass = db2File.ReadInt32("Sound Override Subclass"); item.Material = db2File.ReadEnum <Material>("Material", TypeCode.Int32); item.DisplayId = db2File.ReadUInt32("Display ID"); item.InventoryType = db2File.ReadEnum <InventoryType>("Inventory Type", TypeCode.UInt32); item.SheathType = db2File.ReadEnum <SheathType>("Sheath Type", TypeCode.Int32); Storage.ItemTemplates.Add(entry, item, packet.TimeSpan); packet.AddSniffData(StoreNameType.Item, (int)entry, "DB_REPLY"); break; } case DB2Hash.Item_sparse: { var item = Storage.ItemTemplates.ContainsKey(entry) ? Storage.ItemTemplates[entry].Item1 : new ItemTemplate(); db2File.ReadEntry <UInt32>(StoreNameType.Item, "Item Sparse Entry"); item.Quality = db2File.ReadEnum <ItemQuality>("Quality", TypeCode.Int32); item.Flags1 = db2File.ReadEnum <ItemProtoFlags>("Flags 1", TypeCode.UInt32); item.Flags2 = db2File.ReadEnum <ItemFlagExtra>("Flags 2", TypeCode.Int32); item.Flags3 = db2File.ReadUInt32("Flags 3"); item.Unk430_1 = db2File.ReadSingle("Unk430_1"); item.Unk430_2 = db2File.ReadSingle("Unk430_2"); item.BuyCount = db2File.ReadUInt32("Buy count"); item.BuyPrice = db2File.ReadUInt32("Buy Price"); item.SellPrice = db2File.ReadUInt32("Sell Price"); item.InventoryType = db2File.ReadEnum <InventoryType>("Inventory Type", TypeCode.Int32); item.AllowedClasses = db2File.ReadEnum <ClassMask>("Allowed Classes", TypeCode.Int32); item.AllowedRaces = db2File.ReadEnum <RaceMask>("Allowed Races", TypeCode.Int32); item.ItemLevel = db2File.ReadUInt32("Item Level"); item.RequiredLevel = db2File.ReadUInt32("Required Level"); item.RequiredSkillId = db2File.ReadUInt32("Required Skill ID"); item.RequiredSkillLevel = db2File.ReadUInt32("Required Skill Level"); item.RequiredSpell = (uint)db2File.ReadEntry <Int32>(StoreNameType.Spell, "Required Spell"); item.RequiredHonorRank = db2File.ReadUInt32("Required Honor Rank"); item.RequiredCityRank = db2File.ReadUInt32("Required City Rank"); item.RequiredRepFaction = db2File.ReadUInt32("Required Rep Faction"); item.RequiredRepValue = db2File.ReadUInt32("Required Rep Value"); item.MaxCount = db2File.ReadInt32("Max Count"); item.MaxStackSize = db2File.ReadInt32("Max Stack Size"); item.ContainerSlots = db2File.ReadUInt32("Container Slots"); item.StatTypes = new ItemModType[10]; for (var i = 0; i < 10; i++) { var statType = db2File.ReadEnum <ItemModType>("Stat Type", TypeCode.Int32, i); item.StatTypes[i] = statType == ItemModType.None ? ItemModType.Mana : statType; // TDB } item.StatValues = new int[10]; for (var i = 0; i < 10; i++) { item.StatValues[i] = db2File.ReadInt32("Stat Value", i); } item.StatUnk1 = new int[10]; for (var i = 0; i < 10; i++) { item.StatUnk1[i] = db2File.ReadInt32("Unk UInt32 1", i); } item.StatUnk2 = new int[10]; for (var i = 0; i < 10; i++) { item.StatUnk2[i] = db2File.ReadInt32("Unk UInt32 2", i); } item.ScalingStatDistribution = db2File.ReadInt32("Scaling Stat Distribution"); item.DamageType = db2File.ReadEnum <DamageType>("Damage Type", TypeCode.Int32); item.Delay = db2File.ReadUInt32("Delay"); item.RangedMod = db2File.ReadSingle("Ranged Mod"); item.TriggeredSpellIds = new int[5]; for (var i = 0; i < 5; i++) { item.TriggeredSpellIds[i] = db2File.ReadEntry <Int32>(StoreNameType.Spell, "Triggered Spell ID", i); } item.TriggeredSpellTypes = new ItemSpellTriggerType[5]; for (var i = 0; i < 5; i++) { item.TriggeredSpellTypes[i] = db2File.ReadEnum <ItemSpellTriggerType>("Trigger Spell Type", TypeCode.Int32, i); } item.TriggeredSpellCharges = new int[5]; for (var i = 0; i < 5; i++) { item.TriggeredSpellCharges[i] = db2File.ReadInt32("Triggered Spell Charges", i); } item.TriggeredSpellCooldowns = new int[5]; for (var i = 0; i < 5; i++) { item.TriggeredSpellCooldowns[i] = db2File.ReadInt32("Triggered Spell Cooldown", i); } item.TriggeredSpellCategories = new uint[5]; for (var i = 0; i < 5; i++) { item.TriggeredSpellCategories[i] = db2File.ReadUInt32("Triggered Spell Category", i); } item.TriggeredSpellCategoryCooldowns = new int[5]; for (var i = 0; i < 5; i++) { item.TriggeredSpellCategoryCooldowns[i] = db2File.ReadInt32("Triggered Spell Category Cooldown", i); } item.Bonding = db2File.ReadEnum <ItemBonding>("Bonding", TypeCode.Int32); if (db2File.ReadUInt16() > 0) { item.Name = db2File.ReadCString("Name", 0); } for (var i = 1; i < 4; ++i) { if (db2File.ReadUInt16() > 0) { db2File.ReadCString("Name", i); } } if (db2File.ReadUInt16() > 0) { item.Description = db2File.ReadCString("Description"); } item.PageText = db2File.ReadUInt32("Page Text"); item.Language = db2File.ReadEnum <Language>("Language", TypeCode.Int32); item.PageMaterial = db2File.ReadEnum <PageMaterial>("Page Material", TypeCode.Int32); item.StartQuestId = (uint)db2File.ReadEntry <Int32>(StoreNameType.Quest, "Start Quest"); item.LockId = db2File.ReadUInt32("Lock ID"); item.Material = db2File.ReadEnum <Material>("Material", TypeCode.Int32); item.SheathType = db2File.ReadEnum <SheathType>("Sheath Type", TypeCode.Int32); item.RandomPropery = db2File.ReadInt32("Random Property"); item.RandomSuffix = db2File.ReadUInt32("Random Suffix"); item.ItemSet = db2File.ReadUInt32("Item Set"); item.AreaId = db2File.ReadEntry <UInt32>(StoreNameType.Area, "Area"); var map = db2File.ReadEntry <Int32>(StoreNameType.Map, "Map ID"); item.MapId = map; item.BagFamily = db2File.ReadEnum <BagFamilyMask>("Bag Family", TypeCode.Int32); item.TotemCategory = db2File.ReadEnum <TotemCategory>("Totem Category", TypeCode.Int32); item.ItemSocketColors = new ItemSocketColor[3]; for (var i = 0; i < 3; i++) { item.ItemSocketColors[i] = db2File.ReadEnum <ItemSocketColor>("Socket Color", TypeCode.Int32, i); } item.SocketContent = new uint[3]; for (var i = 0; i < 3; i++) { item.SocketContent[i] = db2File.ReadUInt32("Socket Item", i); } item.SocketBonus = db2File.ReadInt32("Socket Bonus"); item.GemProperties = db2File.ReadInt32("Gem Properties"); item.ArmorDamageModifier = db2File.ReadSingle("Armor Damage Modifier"); item.Duration = db2File.ReadUInt32("Duration"); item.ItemLimitCategory = db2File.ReadInt32("Limit Category"); item.HolidayId = db2File.ReadEnum <Holiday>("Holiday", TypeCode.Int32); item.StatScalingFactor = db2File.ReadSingle("Stat Scaling Factor"); item.CurrencySubstitutionId = db2File.ReadUInt32("Currency Substitution Id"); item.CurrencySubstitutionCount = db2File.ReadUInt32("Currency Substitution Count"); Storage.ObjectNames.Add(entry, new ObjectName { ObjectType = ObjectType.Item, Name = item.Name }, packet.TimeSpan); packet.AddSniffData(StoreNameType.Item, (int)entry, "DB_REPLY"); break; } case DB2Hash.KeyChain: { db2File.ReadUInt32("Key Chain Id"); db2File.ReadBytes("Key", 32); break; } default: { db2File.AddValue("Unknown DB2 file type", string.Format(": {0} (0x{0:x})", type)); for (var i = 0; ; ++i) { if (db2File.Length - 4 >= db2File.Position) { var blockVal = db2File.ReadUpdateField(); string value = blockVal.UInt32Value + "/" + blockVal.SingleValue; packet.AddValue("Block Value " + i, value); } else { var left = db2File.Length - db2File.Position; for (var j = 0; j < left; ++j) { var value = db2File.ReadByte(); packet.AddValue("Byte Value " + i, value); } break; } } break; } } db2File.ClosePacket(false); }
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 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); var type = packet.ReadEnum <DB2Hash>("DB2 File", TypeCode.UInt32); packet.ReadTime("Hotfix date"); var entry = (uint)packet.ReadInt32("Entry"); if ((int)entry < 0) { packet.WriteLine("Row {0} has been removed.", -(int)entry); return; } switch (type) { case DB2Hash.BroadcastText: { var broadcastText = new BroadcastText(); var Id = db2File.ReadEntry("Id"); broadcastText.language = db2File.ReadUInt32("Language"); if (db2File.ReadUInt16() > 0) { broadcastText.MaleText = db2File.ReadCString("Male Text"); } if (db2File.ReadUInt16() > 0) { broadcastText.FemaleText = db2File.ReadCString("Female Text"); } broadcastText.EmoteID = new uint[3]; broadcastText.EmoteDelay = new uint[3]; for (var i = 0; i < 3; ++i) { broadcastText.EmoteID[i] = (uint)db2File.ReadInt32("Emote ID", i); } for (var i = 0; i < 3; ++i) { broadcastText.EmoteDelay[i] = (uint)db2File.ReadInt32("Emote Delay", i); } broadcastText.soundId = db2File.ReadUInt32("Sound Id"); broadcastText.unk1 = db2File.ReadUInt32("Unk MoP 1"); // unk emote broadcastText.unk2 = db2File.ReadUInt32("Unk MoP 2"); // kind of type? Storage.BroadcastTexts.Add((uint)Id.Key, broadcastText, packet.TimeSpan); packet.AddSniffData(StoreNameType.BroadcastText, Id.Key, "BROADCAST_TEXT"); break; } case DB2Hash.Creature: // New structure - 5.4.0 { db2File.ReadUInt32("Creature Id"); db2File.ReadUInt32("Item Id 1"); db2File.ReadUInt32("Item Id 2"); db2File.ReadUInt32("Item Id 3"); db2File.ReadUInt32("Mount"); for (var i = 0; i < 4; ++i) { db2File.ReadInt32("Display Id", i); } for (var i = 0; i < 4; ++i) { db2File.ReadSingle("Display Id Probability", i); } if (db2File.ReadUInt16() > 0) { db2File.ReadCString("Name"); } if (db2File.ReadUInt16() > 0) { db2File.ReadCString("SubName"); } if (db2File.ReadUInt16() > 0) { db2File.ReadCString("Female SubName"); } db2File.ReadUInt32("Rank"); db2File.ReadUInt32("Inhabit Type"); break; } case DB2Hash.CreatureDifficulty: { var creatureDifficulty = new CreatureDifficulty(); var Id = db2File.ReadEntry("Id"); creatureDifficulty.CreatureID = db2File.ReadUInt32("Creature Id"); creatureDifficulty.FactionID = db2File.ReadUInt32("Faction Template Id"); creatureDifficulty.Expansion = db2File.ReadInt32("Expansion"); creatureDifficulty.MinLevel = db2File.ReadInt32("Min Level"); creatureDifficulty.MaxLevel = db2File.ReadInt32("Max Level"); creatureDifficulty.Flags = new uint[5]; for (var i = 0; i < 5; ++i) { creatureDifficulty.Flags[i] = db2File.ReadUInt32("Flags", i); } Storage.CreatureDifficultys.Add((uint)Id.Key, creatureDifficulty, packet.TimeSpan); break; } case DB2Hash.GameObjects: { var gameObjectTemplateDB2 = new GameObjectTemplateDB2(); var Id = db2File.ReadEntry("GameObject Id"); gameObjectTemplateDB2.MapID = db2File.ReadUInt32("Map"); gameObjectTemplateDB2.DisplayId = db2File.ReadUInt32("Display Id"); gameObjectTemplateDB2.PositionX = db2File.ReadSingle("Position X"); gameObjectTemplateDB2.PositionY = db2File.ReadSingle("Position Y"); gameObjectTemplateDB2.PositionZ = db2File.ReadSingle("Position Z"); gameObjectTemplateDB2.RotationX = db2File.ReadSingle("Rotation X"); gameObjectTemplateDB2.RotationY = db2File.ReadSingle("Rotation Y"); gameObjectTemplateDB2.RotationZ = db2File.ReadSingle("Rotation Z"); gameObjectTemplateDB2.RotationW = db2File.ReadSingle("Rotation W"); gameObjectTemplateDB2.Size = db2File.ReadSingle("Size"); gameObjectTemplateDB2.Type = db2File.ReadEnum <GameObjectType>("Type", TypeCode.Int32); gameObjectTemplateDB2.Data = new int[4]; for (var i = 0; i < gameObjectTemplateDB2.Data.Length; i++) { gameObjectTemplateDB2.Data[i] = db2File.ReadInt32("Data", i); } if (db2File.ReadUInt16() > 0) { gameObjectTemplateDB2.Name = db2File.ReadCString("Name"); } Storage.GameObjectTemplateDB2s.Add((uint)Id.Key, gameObjectTemplateDB2, packet.TimeSpan); break; } case DB2Hash.Item: { var item = Storage.ItemTemplates.ContainsKey(entry) ? Storage.ItemTemplates[entry].Item1 : new ItemTemplate(); db2File.ReadEntry <UInt32>(StoreNameType.Item, "Item Entry"); item.Class = db2File.ReadEnum <ItemClass>("Class", TypeCode.Int32); item.SubClass = db2File.ReadUInt32("Sub Class"); item.SoundOverrideSubclass = db2File.ReadInt32("Sound Override Subclass"); item.Material = db2File.ReadEnum <Material>("Material", TypeCode.Int32); item.DisplayId = db2File.ReadUInt32("Display ID"); item.InventoryType = db2File.ReadEnum <InventoryType>("Inventory Type", TypeCode.UInt32); item.SheathType = db2File.ReadEnum <SheathType>("Sheath Type", TypeCode.Int32); Storage.ItemTemplates.Add(entry, item, packet.TimeSpan); packet.AddSniffData(StoreNameType.Item, (int)entry, "DB_REPLY"); break; } case DB2Hash.ItemExtendedCost: { db2File.ReadUInt32("Item Extended Cost Entry"); db2File.ReadUInt32("Required Honor Points"); db2File.ReadUInt32("Required Arena Points"); db2File.ReadUInt32("Required Arena Slot"); for (var i = 0; i < 5; ++i) { db2File.ReadUInt32("Required Item", i); } for (var i = 0; i < 5; ++i) { db2File.ReadUInt32("Required Item Count", i); } db2File.ReadUInt32("Required Personal Arena Rating"); db2File.ReadUInt32("Item Purchase Group"); for (var i = 0; i < 5; ++i) { db2File.ReadUInt32("Required Currency", i); } for (var i = 0; i < 5; ++i) { db2File.ReadUInt32("Required Currency Count", i); } db2File.ReadUInt32("Required Faction Id"); db2File.ReadUInt32("Required Faction Standing"); db2File.ReadUInt32("Requirement Flags"); db2File.ReadUInt32("Required Guild Level"); db2File.ReadUInt32("Required Achievement"); break; } case DB2Hash.Item_sparse: { var item = Storage.ItemTemplates.ContainsKey(entry) ? Storage.ItemTemplates[entry].Item1 : new ItemTemplate(); db2File.ReadEntry <UInt32>(StoreNameType.Item, "Item Sparse Entry"); item.Quality = db2File.ReadEnum <ItemQuality>("Quality", TypeCode.Int32); item.Flags1 = db2File.ReadEnum <ItemProtoFlags>("Flags 1", TypeCode.UInt32); item.Flags2 = db2File.ReadEnum <ItemFlagExtra>("Flags 2", TypeCode.Int32); item.Flags3 = db2File.ReadUInt32("Flags 3"); item.Unk430_1 = db2File.ReadSingle("Unk430_1"); item.Unk430_2 = db2File.ReadSingle("Unk430_2"); item.BuyCount = db2File.ReadUInt32("Buy count"); item.BuyPrice = db2File.ReadUInt32("Buy Price"); item.SellPrice = db2File.ReadUInt32("Sell Price"); item.InventoryType = db2File.ReadEnum <InventoryType>("Inventory Type", TypeCode.Int32); item.AllowedClasses = db2File.ReadEnum <ClassMask>("Allowed Classes", TypeCode.Int32); item.AllowedRaces = db2File.ReadEnum <RaceMask>("Allowed Races", TypeCode.Int32); item.ItemLevel = db2File.ReadUInt32("Item Level"); item.RequiredLevel = db2File.ReadUInt32("Required Level"); item.RequiredSkillId = db2File.ReadUInt32("Required Skill ID"); item.RequiredSkillLevel = db2File.ReadUInt32("Required Skill Level"); item.RequiredSpell = (uint)db2File.ReadEntry <Int32>(StoreNameType.Spell, "Required Spell"); item.RequiredHonorRank = db2File.ReadUInt32("Required Honor Rank"); item.RequiredCityRank = db2File.ReadUInt32("Required City Rank"); item.RequiredRepFaction = db2File.ReadUInt32("Required Rep Faction"); item.RequiredRepValue = db2File.ReadUInt32("Required Rep Value"); item.MaxCount = db2File.ReadInt32("Max Count"); item.MaxStackSize = db2File.ReadInt32("Max Stack Size"); item.ContainerSlots = db2File.ReadUInt32("Container Slots"); item.StatTypes = new ItemModType[10]; for (var i = 0; i < 10; i++) { var statType = db2File.ReadEnum <ItemModType>("Stat Type", TypeCode.Int32, i); item.StatTypes[i] = statType == ItemModType.None ? ItemModType.Mana : statType; // TDB } item.StatValues = new int[10]; for (var i = 0; i < 10; i++) { item.StatValues[i] = db2File.ReadInt32("Stat Value", i); } item.StatUnk1 = new int[10]; for (var i = 0; i < 10; i++) { item.StatUnk1[i] = db2File.ReadInt32("Unk UInt32 1", i); } item.StatUnk2 = new int[10]; for (var i = 0; i < 10; i++) { item.StatUnk2[i] = db2File.ReadInt32("Unk UInt32 2", i); } item.ScalingStatDistribution = db2File.ReadInt32("Scaling Stat Distribution"); item.DamageType = db2File.ReadEnum <DamageType>("Damage Type", TypeCode.Int32); item.Delay = db2File.ReadUInt32("Delay"); item.RangedMod = db2File.ReadSingle("Ranged Mod"); item.TriggeredSpellIds = new int[5]; for (var i = 0; i < 5; i++) { item.TriggeredSpellIds[i] = db2File.ReadEntry <Int32>(StoreNameType.Spell, "Triggered Spell ID", i); } item.TriggeredSpellTypes = new ItemSpellTriggerType[5]; for (var i = 0; i < 5; i++) { item.TriggeredSpellTypes[i] = db2File.ReadEnum <ItemSpellTriggerType>("Trigger Spell Type", TypeCode.Int32, i); } item.TriggeredSpellCharges = new int[5]; for (var i = 0; i < 5; i++) { item.TriggeredSpellCharges[i] = db2File.ReadInt32("Triggered Spell Charges", i); } item.TriggeredSpellCooldowns = new int[5]; for (var i = 0; i < 5; i++) { item.TriggeredSpellCooldowns[i] = db2File.ReadInt32("Triggered Spell Cooldown", i); } item.TriggeredSpellCategories = new uint[5]; for (var i = 0; i < 5; i++) { item.TriggeredSpellCategories[i] = db2File.ReadUInt32("Triggered Spell Category", i); } item.TriggeredSpellCategoryCooldowns = new int[5]; for (var i = 0; i < 5; i++) { item.TriggeredSpellCategoryCooldowns[i] = db2File.ReadInt32( "Triggered Spell Category Cooldown", i); } item.Bonding = db2File.ReadEnum <ItemBonding>("Bonding", TypeCode.Int32); if (db2File.ReadUInt16() > 0) { item.Name = db2File.ReadCString("Name", 0); } for (var i = 1; i < 4; ++i) { if (db2File.ReadUInt16() > 0) { db2File.ReadCString("Name", i); } } if (db2File.ReadUInt16() > 0) { item.Description = db2File.ReadCString("Description"); } item.PageText = db2File.ReadUInt32("Page Text"); item.Language = db2File.ReadEnum <Language>("Language", TypeCode.Int32); item.PageMaterial = db2File.ReadEnum <PageMaterial>("Page Material", TypeCode.Int32); item.StartQuestId = (uint)db2File.ReadEntry <Int32>(StoreNameType.Quest, "Start Quest"); item.LockId = db2File.ReadUInt32("Lock ID"); item.Material = db2File.ReadEnum <Material>("Material", TypeCode.Int32); item.SheathType = db2File.ReadEnum <SheathType>("Sheath Type", TypeCode.Int32); item.RandomPropery = db2File.ReadInt32("Random Property"); item.RandomSuffix = db2File.ReadUInt32("Random Suffix"); item.ItemSet = db2File.ReadUInt32("Item Set"); item.AreaId = db2File.ReadEntry <UInt32>(StoreNameType.Area, "Area"); item.MapId = db2File.ReadEntry <Int32>(StoreNameType.Map, "Map ID"); item.BagFamily = db2File.ReadEnum <BagFamilyMask>("Bag Family", TypeCode.Int32); item.TotemCategory = db2File.ReadEnum <TotemCategory>("Totem Category", TypeCode.Int32); item.ItemSocketColors = new ItemSocketColor[3]; for (var i = 0; i < 3; i++) { item.ItemSocketColors[i] = db2File.ReadEnum <ItemSocketColor>("Socket Color", TypeCode.Int32, i); } item.SocketContent = new uint[3]; for (var i = 0; i < 3; i++) { item.SocketContent[i] = db2File.ReadUInt32("Socket Item", i); } item.SocketBonus = db2File.ReadInt32("Socket Bonus"); item.GemProperties = db2File.ReadInt32("Gem Properties"); item.ArmorDamageModifier = db2File.ReadSingle("Armor Damage Modifier"); item.Duration = db2File.ReadUInt32("Duration"); item.ItemLimitCategory = db2File.ReadInt32("Limit Category"); item.HolidayId = db2File.ReadEnum <Holiday>("Holiday", TypeCode.Int32); item.StatScalingFactor = db2File.ReadSingle("Stat Scaling Factor"); item.CurrencySubstitutionId = db2File.ReadUInt32("Currency Substitution Id"); item.CurrencySubstitutionCount = db2File.ReadUInt32("Currency Substitution Count"); Storage.ObjectNames.Add(entry, new ObjectName { ObjectType = ObjectType.Item, Name = item.Name }, packet.TimeSpan); packet.AddSniffData(StoreNameType.Item, (int)entry, "DB_REPLY"); break; } case DB2Hash.KeyChain: { db2File.ReadUInt32("Key Chain Id"); db2File.ReadBytes("Key", 32); break; } case DB2Hash.SceneScript: // lua ftw! { db2File.ReadUInt32("Scene Script Id"); if (db2File.ReadUInt16() > 0) { db2File.ReadCString("Name"); } if (db2File.ReadUInt16() > 0) { db2File.ReadCString("Script"); } db2File.ReadUInt32("Previous Scene Script Part"); db2File.ReadUInt32("Next Scene Script Part"); break; } case DB2Hash.Vignette: { db2File.ReadUInt32("Vignette Entry"); if (db2File.ReadUInt16() > 0) { db2File.ReadCString("Name"); } db2File.ReadUInt32("Icon"); db2File.ReadUInt32("Flag"); // not 100% sure (8 & 32 as values only) - todo verify with more data db2File.ReadSingle("Unk Float 1"); db2File.ReadSingle("Unk Float 2"); break; } case DB2Hash.WbAccessControlList: { db2File.ReadUInt32("Id"); if (db2File.ReadUInt16() > 0) { db2File.ReadCString("Address"); } db2File.ReadUInt32("Unk MoP 1"); db2File.ReadUInt32("Unk MoP 2"); db2File.ReadUInt32("Unk MoP 3"); db2File.ReadUInt32("Unk MoP 4"); // flags? break; } default: { db2File.AddValue("Unknown DB2 file type", string.Format("{0} (0x{0:x})", type)); for (var i = 0;; ++i) { if (db2File.Length - 4 >= db2File.Position) { var blockVal = db2File.ReadUpdateField(); string value = blockVal.UInt32Value + "/" + blockVal.SingleValue; packet.AddValue("Block Value " + i, value); } else { var left = db2File.Length - db2File.Position; for (var j = 0; j < left; ++j) { var value = db2File.ReadByte(); packet.AddValue("Byte Value " + i, value); } break; } } 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 type = packet.ReadUInt32E <DB2Hash>("DB2 File"); var entry = (uint)packet.ReadInt32("Entry"); packet.ReadTime("Hotfix date"); 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 ((int)entry < 0) { packet.WriteLine("Row {0} has been removed.", -(int)entry); return; } switch (type) { case DB2Hash.BroadcastText: { var broadcastText = new BroadcastText(); var id = db2File.ReadEntry("Id"); broadcastText.language = db2File.ReadInt32("Language"); var maletextLength = db2File.ReadUInt16(); broadcastText.MaleText = db2File.ReadWoWString("Male Text", maletextLength); var femaletextLength = db2File.ReadUInt16(); broadcastText.FemaleText = db2File.ReadWoWString("Female Text", femaletextLength); broadcastText.EmoteID = new uint[3]; broadcastText.EmoteDelay = new uint[3]; for (var i = 0; i < 3; ++i) { broadcastText.EmoteID[i] = (uint)db2File.ReadInt32("Emote ID", i); } for (var i = 0; i < 3; ++i) { broadcastText.EmoteDelay[i] = (uint)db2File.ReadInt32("Emote Delay", i); } broadcastText.soundId = db2File.ReadUInt32("Sound Id"); broadcastText.unk1 = db2File.ReadUInt32("Unk MoP 1"); // unk emote broadcastText.unk2 = db2File.ReadUInt32("Unk MoP 2"); // kind of type? Storage.BroadcastTexts.Add((uint)id.Key, broadcastText, packet.TimeSpan); packet.AddSniffData(StoreNameType.BroadcastText, id.Key, "BROADCAST_TEXT"); break; } case DB2Hash.Creature: // New structure - 6.0.2 { db2File.ReadUInt32("Creature ID"); db2File.ReadInt32E <CreatureType>("Type"); for (var i = 0; i < 3; ++i) { db2File.ReadUInt32 <ItemId>("Item ID", i); } db2File.ReadUInt32("Mount"); for (var i = 0; i < 4; ++i) { db2File.ReadInt32("Display ID", i); } for (var i = 0; i < 4; ++i) { db2File.ReadSingle("Display ID Probability", i); } if (db2File.ReadUInt16() > 0) { db2File.ReadCString("Name"); } if (db2File.ReadUInt16() > 0) { db2File.ReadCString("Female Name"); } if (db2File.ReadUInt16() > 0) { db2File.ReadCString("SubName"); } if (db2File.ReadUInt16() > 0) { db2File.ReadCString("Female SubName"); } db2File.ReadUInt32("Rank"); db2File.ReadUInt32("Inhabit Type"); break; } case DB2Hash.CreatureDifficulty: { var creatureDifficulty = new CreatureDifficulty(); var id = db2File.ReadEntry("Id"); creatureDifficulty.CreatureID = db2File.ReadUInt32("Creature Id"); creatureDifficulty.FactionID = db2File.ReadUInt32("Faction Template Id"); creatureDifficulty.Expansion = db2File.ReadInt32("Expansion"); creatureDifficulty.MinLevel = db2File.ReadInt32("Min Level"); creatureDifficulty.MaxLevel = db2File.ReadInt32("Max Level"); creatureDifficulty.Flags = new uint[5]; for (var i = 0; i < 5; ++i) { creatureDifficulty.Flags[i] = db2File.ReadUInt32("Flags", i); } Storage.CreatureDifficultys.Add((uint)id.Key, creatureDifficulty, packet.TimeSpan); break; } case DB2Hash.CurvePoint: { var curvePoint = new CurvePoint(); var id = db2File.ReadUInt32("ID"); curvePoint.CurveID = db2File.ReadUInt32("CurveID"); curvePoint.Index = db2File.ReadUInt32("Index"); curvePoint.X = db2File.ReadSingle("X"); curvePoint.Y = db2File.ReadSingle("Y"); Storage.CurvePoints.Add(id, curvePoint, packet.TimeSpan); break; } case DB2Hash.GameObjects: // New structure - 6.0.2 { var gameObjectTemplateDB2 = new GameObjectTemplateDB2(); var id = db2File.ReadEntry("ID"); gameObjectTemplateDB2.MapID = db2File.ReadUInt32("Map"); gameObjectTemplateDB2.DisplayId = db2File.ReadUInt32("DisplayID"); gameObjectTemplateDB2.PositionX = db2File.ReadSingle("PositionX"); gameObjectTemplateDB2.PositionY = db2File.ReadSingle("PositionY"); gameObjectTemplateDB2.PositionZ = db2File.ReadSingle("PositionZ"); gameObjectTemplateDB2.RotationX = db2File.ReadSingle("RotationX"); gameObjectTemplateDB2.RotationY = db2File.ReadSingle("RotationY"); gameObjectTemplateDB2.RotationZ = db2File.ReadSingle("RotationZ"); gameObjectTemplateDB2.RotationW = db2File.ReadSingle("RotationW"); gameObjectTemplateDB2.Size = db2File.ReadSingle("Size"); db2File.ReadInt32("Phase Use Flags"); gameObjectTemplateDB2.PhaseId = db2File.ReadInt32("PhaseID"); gameObjectTemplateDB2.PhaseGroupId = db2File.ReadInt32("PhaseGroupID"); gameObjectTemplateDB2.Type = db2File.ReadInt32E <GameObjectType>("Type"); gameObjectTemplateDB2.Data = new int[8]; for (var i = 0; i < gameObjectTemplateDB2.Data.Length; i++) { gameObjectTemplateDB2.Data[i] = db2File.ReadInt32("Data", i); } if (db2File.ReadUInt16() > 0) { gameObjectTemplateDB2.Name = db2File.ReadCString("Name"); } Storage.GameObjectTemplateDB2s.Add((uint)id.Key, gameObjectTemplateDB2, packet.TimeSpan); break; } case DB2Hash.Item: // New structure - 6.0.2 { var item = Storage.ItemTemplates.ContainsKey(entry) ? Storage.ItemTemplates[entry].Item1 : new ItemTemplate(); db2File.ReadUInt32 <ItemId>("Item ID"); item.Class = db2File.ReadInt32E <ItemClass>("Class"); item.SubClass = db2File.ReadUInt32("Sub Class"); item.SoundOverrideSubclass = db2File.ReadInt32("Sound Override Subclass"); item.Material = db2File.ReadInt32E <Material>("Material"); item.InventoryType = db2File.ReadUInt32E <InventoryType>("Inventory Type"); item.SheathType = db2File.ReadInt32E <SheathType>("Sheath Type"); db2File.ReadInt32("Icon File Data ID"); db2File.ReadInt32("Item Group Sounds ID"); Storage.ItemTemplates.Add(entry, item, packet.TimeSpan); packet.AddSniffData(StoreNameType.Item, (int)entry, "DB_REPLY"); break; } case DB2Hash.ItemExtendedCost: // New structure - 6.0.2 { db2File.ReadUInt32("Item Extended Cost ID"); db2File.ReadUInt32("Required Honor Points"); db2File.ReadUInt32("Required Arena Points"); db2File.ReadUInt32("Required Arena Slot"); for (var i = 0; i < 5; ++i) { db2File.ReadUInt32("Required Item", i); } for (var i = 0; i < 5; ++i) { db2File.ReadUInt32("Required Item Count", i); } db2File.ReadUInt32("Required Personal Arena Rating"); db2File.ReadUInt32("Item Purchase Group"); for (var i = 0; i < 5; ++i) { db2File.ReadUInt32("Required Currency", i); } for (var i = 0; i < 5; ++i) { db2File.ReadUInt32("Required Currency Count", i); } db2File.ReadUInt32("Required Faction ID"); db2File.ReadUInt32("Required Faction Standing"); db2File.ReadUInt32("Requirement Flags"); db2File.ReadInt32 <AchievementId>("Required Achievement"); break; } case DB2Hash.ItemCurrencyCost: { db2File.ReadUInt32("ID"); db2File.ReadUInt32 <ItemId>("Item ID"); break; } case DB2Hash.RulesetItemUpgrade: { db2File.ReadUInt32("ID"); db2File.ReadUInt32("Item Upgrade Level"); db2File.ReadUInt32("Item Upgrade ID"); db2File.ReadUInt32 <ItemId>("Item ID"); break; } case DB2Hash.Item_sparse: // New structure - 6.0.2 { var item = Storage.ItemTemplates.ContainsKey(entry) ? Storage.ItemTemplates[entry].Item1 : new ItemTemplate(); db2File.ReadUInt32 <ItemId>("Item Sparse Entry"); item.Quality = db2File.ReadInt32E <ItemQuality>("Quality"); item.Flags1 = db2File.ReadUInt32E <ItemProtoFlags>("Flags 1"); item.Flags2 = db2File.ReadInt32E <ItemFlagExtra>("Flags 2"); item.Flags3 = db2File.ReadUInt32("Flags 3"); item.Unk430_1 = db2File.ReadSingle("Unk430_1"); item.Unk430_2 = db2File.ReadSingle("Unk430_2"); item.BuyCount = db2File.ReadUInt32("Buy count"); item.BuyPrice = db2File.ReadUInt32("Buy Price"); item.SellPrice = db2File.ReadUInt32("Sell Price"); item.InventoryType = db2File.ReadInt32E <InventoryType>("Inventory Type"); item.AllowedClasses = db2File.ReadInt32E <ClassMask>("Allowed Classes"); item.AllowedRaces = db2File.ReadInt32E <RaceMask>("Allowed Races"); item.ItemLevel = db2File.ReadUInt32("Item Level"); item.RequiredLevel = db2File.ReadUInt32("Required Level"); item.RequiredSkillId = db2File.ReadUInt32("Required Skill ID"); item.RequiredSkillLevel = db2File.ReadUInt32("Required Skill Level"); item.RequiredSpell = (uint)db2File.ReadInt32 <SpellId>("Required Spell"); item.RequiredHonorRank = db2File.ReadUInt32("Required Honor Rank"); item.RequiredCityRank = db2File.ReadUInt32("Required City Rank"); item.RequiredRepFaction = db2File.ReadUInt32("Required Rep Faction"); item.RequiredRepValue = db2File.ReadUInt32("Required Rep Value"); item.MaxCount = db2File.ReadInt32("Max Count"); item.MaxStackSize = db2File.ReadInt32("Max Stack Size"); item.ContainerSlots = db2File.ReadUInt32("Container Slots"); item.StatTypes = new ItemModType[10]; for (var i = 0; i < 10; i++) { var statType = db2File.ReadInt32E <ItemModType>("Stat Type", i); item.StatTypes[i] = statType == ItemModType.None ? ItemModType.Mana : statType; // TDB } item.StatValues = new int[10]; for (var i = 0; i < 10; i++) { item.StatValues[i] = db2File.ReadInt32("Stat Value", i); } item.ScalingValue = new int[10]; for (var i = 0; i < 10; i++) { item.ScalingValue[i] = db2File.ReadInt32("Scaling Value", i); } item.SocketCostRate = new int[10]; for (var i = 0; i < 10; i++) { item.SocketCostRate[i] = db2File.ReadInt32("Socket Cost Rate", i); } item.ScalingStatDistribution = db2File.ReadInt32("Scaling Stat Distribution"); item.DamageType = db2File.ReadInt32E <DamageType>("Damage Type"); item.Delay = db2File.ReadUInt32("Delay"); item.RangedMod = db2File.ReadSingle("Ranged Mod"); item.Bonding = db2File.ReadInt32E <ItemBonding>("Bonding"); var nameLength = db2File.ReadUInt16(); item.Name = db2File.ReadWoWString("Name", nameLength, 0); for (var i = 1; i < 4; ++i) { if (db2File.ReadUInt16() > 0) { db2File.ReadCString("Name", i); } } var descriptionLength = db2File.ReadUInt16(); item.Description = db2File.ReadWoWString("Description", descriptionLength); item.PageText = db2File.ReadUInt32("Page Text"); item.Language = db2File.ReadInt32E <Language>("Language"); item.PageMaterial = db2File.ReadInt32E <PageMaterial>("Page Material"); item.StartQuestId = (uint)db2File.ReadInt32 <QuestId>("Start Quest"); item.LockId = db2File.ReadUInt32("Lock ID"); item.Material = db2File.ReadInt32E <Material>("Material"); item.SheathType = db2File.ReadInt32E <SheathType>("Sheath Type"); item.RandomPropery = db2File.ReadInt32("Random Property"); item.RandomSuffix = db2File.ReadUInt32("Random Suffix"); item.ItemSet = db2File.ReadUInt32("Item Set"); item.AreaId = db2File.ReadUInt32 <AreaId>("Area"); item.MapId = db2File.ReadInt32 <MapId>("Map ID"); item.BagFamily = db2File.ReadInt32E <BagFamilyMask>("Bag Family"); item.TotemCategory = db2File.ReadInt32E <TotemCategory>("Totem Category"); item.ItemSocketColors = new ItemSocketColor[3]; for (var i = 0; i < 3; i++) { item.ItemSocketColors[i] = db2File.ReadInt32E <ItemSocketColor>("Socket Color", i); } item.SocketBonus = db2File.ReadInt32("Socket Bonus"); item.GemProperties = db2File.ReadInt32("Gem Properties"); item.ArmorDamageModifier = db2File.ReadSingle("Armor Damage Modifier"); item.Duration = db2File.ReadUInt32("Duration"); item.ItemLimitCategory = db2File.ReadInt32("Limit Category"); item.HolidayId = db2File.ReadInt32E <Holiday>("Holiday"); item.StatScalingFactor = db2File.ReadSingle("Stat Scaling Factor"); item.CurrencySubstitutionId = db2File.ReadUInt32("Currency Substitution Id"); item.CurrencySubstitutionCount = db2File.ReadUInt32("Currency Substitution Count"); item.flagsCustom = db2File.ReadUInt32("Flags Custom"); Storage.ObjectNames.Add(entry, new ObjectName { ObjectType = ObjectType.Item, Name = item.Name }, packet.TimeSpan); packet.AddSniffData(StoreNameType.Item, (int)entry, "DB_REPLY"); break; } case DB2Hash.KeyChain: { db2File.ReadUInt32("Key Chain ID"); db2File.ReadBytes("Key", 32); break; } case DB2Hash.SceneScript: // lua ftw! { db2File.ReadUInt32("Scene Script ID"); var nameLength = db2File.ReadUInt16(); db2File.ReadWoWString("Name", nameLength); var scriptLength = db2File.ReadUInt16(); db2File.ReadWoWString("Script", scriptLength); db2File.ReadUInt32("Previous Scene Script Part"); db2File.ReadUInt32("Next Scene Script Part"); break; } case DB2Hash.SpellMisc: // New structure - 6.0.2 { var spellMisc = new SpellMisc(); var id = db2File.ReadEntry("ID"); spellMisc.Attributes = db2File.ReadUInt32("Attributes"); spellMisc.AttributesEx = db2File.ReadUInt32("AttributesEx"); spellMisc.AttributesExB = db2File.ReadUInt32("AttributesExB"); spellMisc.AttributesExC = db2File.ReadUInt32("AttributesExC"); spellMisc.AttributesExD = db2File.ReadUInt32("AttributesExD"); spellMisc.AttributesExE = db2File.ReadUInt32("AttributesExE"); spellMisc.AttributesExF = db2File.ReadUInt32("AttributesExF"); spellMisc.AttributesExG = db2File.ReadUInt32("AttributesExG"); spellMisc.AttributesExH = db2File.ReadUInt32("AttributesExH"); spellMisc.AttributesExI = db2File.ReadUInt32("AttributesExI"); spellMisc.AttributesExJ = db2File.ReadUInt32("AttributesExJ"); spellMisc.AttributesExK = db2File.ReadUInt32("AttributesExK"); spellMisc.AttributesExL = db2File.ReadUInt32("AttributesExL"); spellMisc.AttributesExM = db2File.ReadUInt32("AttributesExM"); spellMisc.CastingTimeIndex = db2File.ReadUInt32("CastingTimeIndex"); spellMisc.DurationIndex = db2File.ReadUInt32("DurationIndex"); spellMisc.RangeIndex = db2File.ReadUInt32("RangeIndex"); spellMisc.Speed = db2File.ReadSingle("Speed"); spellMisc.SpellVisualID = new uint[2]; for (var i = 0; i < 2; ++i) { spellMisc.SpellVisualID[i] = db2File.ReadUInt32("SpellVisualID", i); } spellMisc.SpellIconID = db2File.ReadUInt32("SpellIconID"); spellMisc.ActiveIconID = db2File.ReadUInt32("ActiveIconID"); spellMisc.SchoolMask = db2File.ReadUInt32("SchoolMask"); spellMisc.MultistrikeSpeedMod = db2File.ReadSingle("MultistrikeSpeedMod"); Storage.SpellMiscs.Add((uint)id.Key, spellMisc, packet.TimeSpan); break; } case DB2Hash.Toy: // New structure - 6.0.2 { db2File.ReadUInt32("ID"); db2File.ReadUInt32 <ItemId>("Item ID"); db2File.ReadUInt32("Flags"); var descriptionLength = db2File.ReadUInt16(); db2File.ReadWoWString("Description", descriptionLength); db2File.ReadInt32("Source Type"); break; } case DB2Hash.Vignette: { db2File.ReadUInt32("Vignette ID"); var nameLength = db2File.ReadUInt16(); db2File.ReadWoWString("Name", nameLength); db2File.ReadUInt32("Icon"); db2File.ReadUInt32("Flag"); // not 100% sure (8 & 32 as values only) - todo verify with more data db2File.ReadSingle("Unk Float 1"); db2File.ReadSingle("Unk Float 2"); break; } case DB2Hash.WbAccessControlList: { db2File.ReadUInt32("Id"); var addressLength = db2File.ReadUInt16(); db2File.ReadWoWString("Address", addressLength); db2File.ReadUInt32("Unk MoP 1"); db2File.ReadUInt32("Unk MoP 2"); db2File.ReadUInt32("Unk MoP 3"); db2File.ReadUInt32("Unk MoP 4"); // flags? break; } default: { db2File.AddValue("Unknown DB2 file type", string.Format("{0} (0x{0:x})", type)); for (var i = 0;; ++i) { if (db2File.Length - 4 >= db2File.Position) { var blockVal = db2File.ReadUpdateField(); string key = "Block Value " + i; string value = blockVal.UInt32Value + "/" + blockVal.SingleValue; packet.AddValue(key, value); } else { var left = db2File.Length - db2File.Position; for (var j = 0; j < left; ++j) { string key = "Byte Value " + i; var value = db2File.ReadByte(); packet.AddValue(key, value); } break; } } break; } } if (db2File.Length != db2File.Position) { packet.WriteLine("Packet not fully read! Current position is {0}, length is {1}, and diff is {2}.", db2File.Position, db2File.Length, db2File.Length - db2File.Position); if (db2File.Length < 300) // If the packet isn't "too big" and it is not full read, print its hex table { packet.AsHex(); } packet.Status = ParsedStatus.WithErrors; } }
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); } }
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() { ID = (uint)entry, MaleText = db2File.ReadCString("MaleText"), FemaleText = db2File.ReadCString("FemaleText"), }; 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.UnkEmoteID = db2File.ReadUInt16("UnkEmoteID"); bct.Language = db2File.ReadByte("Language"); bct.Type = db2File.ReadByte("Type"); bct.SoundID = new uint?[2]; for (int i = 0; i < 2; ++i) { bct.SoundID[i] = db2File.ReadUInt32("SoundID", i); } bct.PlayerConditionID = db2File.ReadUInt32("PlayerConditionID"); Storage.BroadcastTexts.Add(bct, packet.TimeSpan); break; } default: HotfixStoreMgr.AddRecord(type, entry, db2File); break; } db2File.ClosePacket(false); } }