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); Storage.AddHotfixData(entry, type, true, timeStamp); } else { packet.AddSniffData(StoreNameType.None, entry, type.ToString()); HotfixStoreMgr.AddRecord(type, entry, db2File); Storage.AddHotfixData(entry, type, false, timeStamp); db2File.ClosePacket(false); } }
public static void HandleAuthSession(Packet packet) { var sha = new byte[20]; packet.ReadUInt32("UInt32 1"); packet.ReadUInt32("UInt32 2"); packet.ReadByte("Unk Byte"); sha[10] = packet.ReadByte(); sha[18] = packet.ReadByte(); sha[12] = packet.ReadByte(); sha[5] = packet.ReadByte(); packet.ReadInt64("Int64"); sha[15] = packet.ReadByte(); sha[9] = packet.ReadByte(); sha[19] = packet.ReadByte(); sha[4] = packet.ReadByte(); sha[7] = packet.ReadByte(); sha[16] = packet.ReadByte(); sha[3] = packet.ReadByte(); packet.ReadInt16E<ClientVersionBuild>("Client Build"); sha[8] = packet.ReadByte(); packet.ReadUInt32("UInt32 3"); packet.ReadByte("Unk Byte"); sha[17] = packet.ReadByte(); sha[6] = packet.ReadByte(); sha[0] = packet.ReadByte(); sha[1] = packet.ReadByte(); sha[11] = packet.ReadByte(); packet.ReadUInt32("Client seed"); sha[2] = packet.ReadByte(); packet.ReadUInt32("UInt32 4"); sha[14] = packet.ReadByte(); sha[13] = packet.ReadByte(); var addons = new Packet(packet.ReadBytes(packet.ReadInt32()), packet.Opcode, packet.Time, packet.Direction, packet.Number, packet.Writer, packet.FileName); CoreParsers.AddonHandler.ReadClientAddonsList(addons); addons.ClosePacket(false); packet.ReadBit("Unk bit"); var size = (int)packet.ReadBits(12); packet.ReadBytesString("Account name", size); packet.AddValue("Proof SHA-1 Hash", Utilities.ByteArrayToHexString(sha)); }
public void TestAsHex() { var bytes = new byte[] {0xB, 0xA, 0xD, 0xC, 0x0, 0xD, 0xE, 66, 65, 68, 67, 79, 68, 69, 0, 0, 0x42}; var packet = new Packet(bytes, 1, new DateTime(2012, 1, 1), Direction.ClientToServer, 1, "Test"); packet.AsHex(); var actual = packet.Writer.ToString(); var expected = "|-------------------------------------------------|---------------------------------|" + Environment.NewLine + "| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | 0 1 2 3 4 5 6 7 8 9 A B C D E F |" + Environment.NewLine + "|-------------------------------------------------|---------------------------------|" + Environment.NewLine + "| 0B 0A 0D 0C 00 0D 0E 42 41 44 43 4F 44 45 00 00 | . . . . . . . B A D C O D E . . |" + Environment.NewLine + "| 42 | B |" + Environment.NewLine + "|-------------------------------------------------|---------------------------------|" + Environment.NewLine; Assert.AreEqual(expected, actual); packet.ClosePacket(); }
public void TestAddByStatus() { var packet1 = new Packet(new byte[] { 1, 2 }, 1, DateTime.Now, Direction.ClientToServer, 1, "test.bin"); var packet2 = new Packet(new byte[] { 1, 2 }, 1, DateTime.Now, Direction.ClientToServer, 2, "test.bin"); var packet3 = new Packet(new byte[] { 1, 2 }, 1, DateTime.Now, Direction.ClientToServer, 3, "test.bin"); packet1.Status = ParsedStatus.Success; packet2.Status = ParsedStatus.NotParsed; var stats = new Statistics(); stats.AddByStatus(packet1.Status); stats.AddByStatus(packet2.Status); stats.AddByStatus(packet3.Status); packet1.ClosePacket(); packet2.ClosePacket(); packet3.ClosePacket(); Assert.AreEqual(1, stats.SucessPacketCount); Assert.AreEqual(0, stats.WithErrorsPacketCount); Assert.AreEqual(1, stats.NotParsedPacketCount); Assert.AreEqual(2, stats.CalculatedTotalPacketCount); }
public static void HandleNpcTextUpdate(Packet packet) { var npcText = new NpcTextMop(); var size = packet.ReadInt32("Size"); var data = packet.ReadBytes(size); var pkt = new Packet(data, packet.Opcode, packet.Time, packet.Direction, packet.Number, packet.Writer, packet.FileName); npcText.Probabilities = new float[8]; npcText.BroadcastTextId = new uint[8]; for (var i = 0; i < 8; ++i) npcText.Probabilities[i] = pkt.ReadSingle("Probability", i); for (var i = 0; i < 8; ++i) npcText.BroadcastTextId[i] = pkt.ReadUInt32("Broadcast Text Id", i); pkt.ClosePacket(false); var entry = packet.ReadEntry("Entry"); if (entry.Value) // Can be masked return; var hasData = packet.ReadBit(); if (!hasData) return; // nothing to do packet.AddSniffData(StoreNameType.NpcText, entry.Key, "QUERY_RESPONSE"); Storage.NpcTextsMop.Add((uint)entry.Key, npcText, packet.TimeSpan); }
public static void HandleDBReply(Packet packet) { packet.ReadTime("Hotfix date"); var type = packet.ReadUInt32E<DB2Hash>("DB2 File"); 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: { BroadcastText broadcastText = new BroadcastText(); var id = db2File.ReadEntry("Id"); broadcastText.ID = (uint)id.Key; broadcastText.Language = db2File.ReadInt32("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 (int i = 0; i < 3; ++i) broadcastText.EmoteID[i] = (uint) db2File.ReadInt32("Emote ID", i); for (int i = 0; i < 3; ++i) broadcastText.EmoteDelay[i] = (uint) db2File.ReadInt32("Emote Delay", i); broadcastText.SoundId = db2File.ReadUInt32("Sound Id"); broadcastText.UnkEmoteId = db2File.ReadUInt32("Unk MoP 1"); // unk emote broadcastText.Type = db2File.ReadUInt32("Unk MoP 2"); // kind of type? Storage.BroadcastTexts.Add(broadcastText, packet.TimeSpan); packet.AddSniffData(StoreNameType.None, 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 (int i = 0; i < 4; ++i) db2File.ReadInt32("Display Id", i); for (int 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: { CreatureDifficulty creatureDifficulty = new CreatureDifficulty(); creatureDifficulty.ID = (uint)db2File.ReadEntry("Id").Key; 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 (int i = 0; i < 5; ++i) creatureDifficulty.Flags[i] = db2File.ReadUInt32("Flags", i); Storage.CreatureDifficulties.Add(creatureDifficulty, packet.TimeSpan); break; } case DB2Hash.GameObjects: { db2File.ReadEntry("GameObject Id"); db2File.ReadUInt32("Map"); db2File.ReadUInt32("Display Id"); db2File.ReadSingle("Position X"); db2File.ReadSingle("Position Y"); db2File.ReadSingle("Position Z"); db2File.ReadSingle("Rotation X"); db2File.ReadSingle("Rotation Y"); db2File.ReadSingle("Rotation Z"); db2File.ReadSingle("Rotation W"); db2File.ReadSingle("Size"); db2File.ReadInt32E<GameObjectType>("Type"); for (int i = 0; i < 4; i++) db2File.ReadInt32("Data", i); if (db2File.ReadUInt16() > 0) db2File.ReadCString("Name"); break; } case DB2Hash.Item: { ItemTemplate key = new ItemTemplate {Entry = entry}; ItemTemplate item = Storage.ItemTemplates.ContainsKey(key) ? Storage.ItemTemplates[key].Item1 : new ItemTemplate(); db2File.ReadUInt32<ItemId>("Item Entry"); 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.DisplayID = db2File.ReadUInt32("Display ID"); item.InventoryType = db2File.ReadUInt32E<InventoryType>("Inventory Type"); item.SheathType = db2File.ReadInt32E<SheathType>("Sheath Type"); Storage.ItemTemplates.Add(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.ReadInt32<AchievementId>("Required Achievement"); break; } case DB2Hash.Item_sparse: { ItemTemplate key = new ItemTemplate {Entry = entry}; ItemTemplate item = Storage.ItemTemplates.ContainsKey(key) ? Storage.ItemTemplates[key].Item1 : new ItemTemplate(); db2File.ReadUInt32<ItemId>("Item Sparse Entry"); item.Quality = db2File.ReadInt32E<ItemQuality>("Quality"); item.Flags = db2File.ReadUInt32E<ItemProtoFlags>("Flags 1"); item.FlagsExtra = db2File.ReadInt32E<ItemFlagExtra>("Flags 2"); 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 (int i = 0; i < 10; i++) { ItemModType statType = db2File.ReadInt32E<ItemModType>("Stat Type", i); item.StatTypes[i] = statType == ItemModType.None ? ItemModType.Mana : statType; // TDB } item.StatValues = new int?[10]; for (int i = 0; i < 10; i++) item.StatValues[i] = db2File.ReadInt32("Stat Value", i); item.ScalingValue = new int?[10]; for (int i = 0; i < 10; i++) item.ScalingValue[i] = db2File.ReadInt32("Scaling Value", i); item.SocketCostRate = new int?[10]; for (int 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.TriggeredSpellIds = new int?[5]; for (int i = 0; i < 5; i++) item.TriggeredSpellIds[i] = db2File.ReadInt32<SpellId>("Triggered Spell ID", i); item.TriggeredSpellTypes = new ItemSpellTriggerType?[5]; for (int i = 0; i < 5; i++) item.TriggeredSpellTypes[i] = db2File.ReadInt32E<ItemSpellTriggerType>("Trigger Spell Type", i); item.TriggeredSpellCharges = new int?[5]; for (int i = 0; i < 5; i++) item.TriggeredSpellCharges[i] = db2File.ReadInt32("Triggered Spell Charges", i); item.TriggeredSpellCooldowns = new int?[5]; for (int i = 0; i < 5; i++) item.TriggeredSpellCooldowns[i] = db2File.ReadInt32("Triggered Spell Cooldown", i); item.TriggeredSpellCategories = new uint?[5]; for (int i = 0; i < 5; i++) item.TriggeredSpellCategories[i] = db2File.ReadUInt32("Triggered Spell Category", i); item.TriggeredSpellCategoryCooldowns = new int?[5]; for (int i = 0; i < 5; i++) item.TriggeredSpellCategoryCooldowns[i] = db2File.ReadInt32( "Triggered Spell Category Cooldown", i); item.Bonding = db2File.ReadInt32E<ItemBonding>("Bonding"); if (db2File.ReadUInt16() > 0) item.Name = db2File.ReadCString("Name", 0); for (int 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.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.TotemCategory = db2File.ReadInt32E<TotemCategory>("Totem Category"); item.ItemSocketColors = new ItemSocketColor?[3]; for (int i = 0; i < 3; i++) item.ItemSocketColors[i] = db2File.ReadInt32E<ItemSocketColor>("Socket Color", i); item.SocketContent = new uint?[3]; for (int 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.ReadInt32E<Holiday>("Holiday"); item.StatScalingFactor = db2File.ReadSingle("Stat Scaling Factor"); item.CurrencySubstitutionID = db2File.ReadUInt32("Currency Substitution Id"); item.CurrencySubstitutionCount = db2File.ReadUInt32("Currency Substitution Count"); Storage.ObjectNames.Add(new ObjectName {ObjectType = ObjectType.Item, ID = (int)entry, 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 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; } } db2File.ClosePacket(false); }
public static void HandleAuthSession624(Packet packet) { packet.ReadInt16E<ClientVersionBuild>("Build"); packet.ReadByte("BuildType"); packet.ReadUInt32("RegionID"); packet.ReadUInt32("BattlegroupID"); packet.ReadUInt32("RealmID"); packet.ReadBytes("LocalChallenge", 16); packet.ReadBytes("Digest", 24); packet.ReadUInt64("DosResponse"); var addonSize = packet.ReadInt32(); if (addonSize > 0) { var addons = new Packet(packet.ReadBytes(addonSize), packet.Opcode, packet.Time, packet.Direction, packet.Number, packet.Writer, packet.FileName); CoreParsers.AddonHandler.ReadClientAddonsList(addons); addons.ClosePacket(false); } var realmJoinTicketSize = packet.ReadInt32(); packet.ReadBytes("RealmJoinTicket", realmJoinTicketSize); packet.ReadBit("UseIPv6"); }
public static void HandleAuthSession(Packet packet) { var sha = new byte[20]; packet.ReadUInt32("Grunt ServerId"); packet.ReadInt16E<ClientVersionBuild>("Client Build"); packet.ReadUInt32("Region"); packet.ReadUInt32("Battlegroup"); packet.ReadUInt32("RealmIndex"); packet.ReadByte("Login Server Type"); packet.ReadByte("Unk"); packet.ReadUInt32("Client Seed"); packet.ReadUInt64("DosResponse"); for (uint i = 0; i < 20; ++i) sha[i] = packet.ReadByte(); var accountNameLength = packet.ReadBits("Account Name Length", 11); packet.ResetBitReader(); packet.ReadWoWString("Account Name", accountNameLength); packet.ReadBit("UseIPv6"); var addonSize = packet.ReadInt32("Addons Size"); if (addonSize > 0) { var addons = new Packet(packet.ReadBytes(addonSize), packet.Opcode, packet.Time, packet.Direction, packet.Number, packet.Writer, packet.FileName); CoreParsers.AddonHandler.ReadClientAddonsList(addons); addons.ClosePacket(false); } packet.AddValue("Proof SHA-1 Hash", Utilities.ByteArrayToHexString(sha)); }
public static void HandlePartyMemberStats(Packet packet) { var guid = new byte[8]; packet.StartBitStream(guid, 0, 5); packet.ReadBit("unk1"); // Add arena opponent ? packet.StartBitStream(guid, 1, 4); packet.ReadBit("unk2"); packet.StartBitStream(guid, 6, 2, 7, 3); packet.ParseBitStream(guid, 3, 2, 6, 7, 5); var updateFlags = packet.ReadUInt32E<GroupUpdateFlag548>("Update Flags"); packet.ParseBitStream(guid, 1, 4, 0); packet.WriteGuid("Guid", guid); var size = packet.ReadInt32("Size"); var data = packet.ReadBytes(size); var updateFlagPacket = new Packet(data, packet.Opcode, packet.Time, packet.Direction, packet.Number, packet.Writer, packet.FileName); if (updateFlags.HasFlag(GroupUpdateFlag548.Status)) // 0x1 updateFlagPacket.ReadInt16E<GroupMemberStatusFlag>("Status"); if (updateFlags.HasFlag(GroupUpdateFlag548.Unk2)) // 0x2 { for (var i = 0; i < 2; i++) updateFlagPacket.ReadByte("Unk2", i); } if (updateFlags.HasFlag(GroupUpdateFlag548.CurrentHealth)) // 0x4 updateFlagPacket.ReadUInt32("Current Health"); if (updateFlags.HasFlag(GroupUpdateFlag548.MaxHealth)) // 0x8 updateFlagPacket.ReadUInt32("Max Health"); if (updateFlags.HasFlag(GroupUpdateFlag548.PowerType)) // 0x10 updateFlagPacket.ReadByteE<PowerType>("Power type"); if (updateFlags.HasFlag(GroupUpdateFlag548.CurrentPower)) // 0x20 updateFlagPacket.ReadUInt16("Current Power"); if (updateFlags.HasFlag(GroupUpdateFlag548.Zone)) // 0x40 updateFlagPacket.ReadUInt16<ZoneId>("Zone Id"); if (updateFlags.HasFlag(GroupUpdateFlag548.MaxPower))// 0x80 updateFlagPacket.ReadUInt16("Max Power"); if (updateFlags.HasFlag(GroupUpdateFlag548.Level))// 0x100 updateFlagPacket.ReadUInt16("Level"); if (updateFlags.HasFlag(GroupUpdateFlag548.Unk200)) // 0x200 updateFlagPacket.ReadUInt16("Unk200"); if (updateFlags.HasFlag(GroupUpdateFlag548.Unk400)) // 0x400 updateFlagPacket.ReadUInt16("Unk400"); if (updateFlags.HasFlag(GroupUpdateFlag548.Position)) // 0x800 { updateFlagPacket.ReadInt16("Position X"); updateFlagPacket.ReadInt16("Position Y"); updateFlagPacket.ReadInt16("Position Z"); } if (updateFlags.HasFlag(GroupUpdateFlag548.Auras)) // 0x1000 { updateFlagPacket.ReadByte("unkByte"); var mask = updateFlagPacket.ReadUInt64("Aura Mask"); var count = updateFlagPacket.ReadInt32("AuraCount"); for (var i = 0; i < count; ++i) { if (mask == 0) // bad packet break; if ((mask & (1ul << i)) == 0) continue; updateFlagPacket.ReadUInt32<SpellId>("Spell Id", i); var flags = updateFlagPacket.ReadByteE<AuraFlagMoP>("Aura Flags", i); var unk = updateFlagPacket.ReadUInt32("unk", i); if (flags.HasFlag(AuraFlagMoP.Scalable)) { var cnt = updateFlagPacket.ReadByte("Scalings"); for (int j = 0; j < cnt; j++) updateFlagPacket.ReadSingle("Scale", i, j); } } } if (updateFlags.HasFlag(GroupUpdateFlag548.PetGuid)) // 0x2000 updateFlagPacket.ReadGuid("Pet GUID"); if (updateFlags.HasFlag(GroupUpdateFlag548.PetName)) // 0x4000 updateFlagPacket.ReadCString("Pet Name"); if (updateFlags.HasFlag(GroupUpdateFlag548.PetModelId)) // 0x8000 updateFlagPacket.ReadInt16("Pet Modelid"); if (updateFlags.HasFlag(GroupUpdateFlag548.PetCurrentHealth)) // 0x10000 updateFlagPacket.ReadInt32("Pet Current Health"); if (updateFlags.HasFlag(GroupUpdateFlag548.PetMaxHealth)) // 0x20000 updateFlagPacket.ReadInt32("Pet Max Health"); if (updateFlags.HasFlag(GroupUpdateFlag548.PetPowerType)) // 0x40000 updateFlagPacket.ReadByteE<PowerType>("Pet Power type"); if (updateFlags.HasFlag(GroupUpdateFlag548.PetCurrentPower)) // 0x80000 updateFlagPacket.ReadInt16("Pet Current Power"); if (updateFlags.HasFlag(GroupUpdateFlag548.PetMaxPower)) // 0x100000 updateFlagPacket.ReadInt16("Pet Max Power"); if (updateFlags.HasFlag(GroupUpdateFlag548.Unk200000)) // 0x200000 updateFlagPacket.ReadInt16("Unk200000"); if (updateFlags.HasFlag(GroupUpdateFlag548.PetAuras)) // 0x400000 { updateFlagPacket.ReadByte("unkByte"); var mask = updateFlagPacket.ReadUInt64("Aura Mask"); var count = updateFlagPacket.ReadInt32("AuraCount"); for (var i = 0; i < count; ++i) { if ((mask & (1ul << i)) == 0) continue; updateFlagPacket.ReadUInt32<SpellId>("Spell Id", i); var flags = updateFlagPacket.ReadByteE<AuraFlagMoP>("Aura Flags", i); updateFlagPacket.ReadUInt32("unk", i); if (flags.HasFlag(AuraFlagMoP.Scalable)) { var cnt = updateFlagPacket.ReadByte("Scalings", i); for (int j = 0; j < cnt; j++) updateFlagPacket.ReadSingle("Scale", i, j); } } } if (updateFlags.HasFlag(GroupUpdateFlag548.VehicleSeat)) // 0x800000 updateFlagPacket.ReadInt32("Vehicle Seat"); if (updateFlags.HasFlag(GroupUpdateFlag548.Phase)) // 0x1000000 { updateFlagPacket.ReadInt32("Unk Int32"); var count = updateFlagPacket.ReadBits("Phase Count", 23); for (var i = 0; i < count; ++i) updateFlagPacket.ReadUInt16("Phase Id"); } if (updateFlags.HasFlag(GroupUpdateFlag548.Unk2000000)) // 0x2000000 updateFlagPacket.ReadInt16("Unk2000000"); if (updateFlags.HasFlag(GroupUpdateFlag548.Unk4000000)) // 0x4000000 updateFlagPacket.ReadInt32("Unk4000000"); updateFlagPacket.ClosePacket(false); }
public static void HandleDBReply(Packet packet) { var entry = packet.ReadInt32("Entry"); var type = packet.ReadUInt32E<DB2Hash>("DB2 File"); 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 (entry < 0) { packet.WriteLine("Row {0} has been removed.", -entry); HotfixStoreMgr.RemoveRecord(type, entry); } else { packet.AddSniffData(StoreNameType.None, entry, type.ToString()); HotfixStoreMgr.AddRecord(type, entry, db2File); db2File.ClosePacket(false); } }
public static void HandleDBReply(Packet packet) { var type = packet.ReadUInt32E<DB2Hash>("DB2 File"); 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.ReadInt32("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.UnkEmoteId = db2File.ReadUInt32("Unk 1"); // emote unk broadcastText.Type = 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.ReadUInt32<ItemId>("Item Entry"); 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.DisplayId = db2File.ReadUInt32("Display ID"); item.InventoryType = db2File.ReadUInt32E<InventoryType>("Inventory Type"); item.SheathType = db2File.ReadInt32E<SheathType>("Sheath Type"); 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.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.TriggeredSpellIds = new int[5]; for (var i = 0; i < 5; i++) item.TriggeredSpellIds[i] = db2File.ReadInt32<SpellId>("Triggered Spell ID", i); item.TriggeredSpellTypes = new ItemSpellTriggerType[5]; for (var i = 0; i < 5; i++) item.TriggeredSpellTypes[i] = db2File.ReadInt32E<ItemSpellTriggerType>("Trigger Spell Type", 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.ReadInt32E<ItemBonding>("Bonding"); 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.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"); var map = db2File.ReadInt32<MapId>("Map ID"); item.MapId = map; 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.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.ReadInt32E<Holiday>("Holiday"); 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 bool TryRead(out Packet packet) { try { packet = PacketReader.Read(_packetNum, FileName); if (packet == null) return false; // continue if (_packetNum++ == 0) { // determine build version based on date of first packet if not specified otherwise if (ClientVersion.IsUndefined()) ClientVersion.SetVersion(packet.Time); } // check for filters var opcodeName = Opcodes.GetOpcodeName(packet.Opcode, packet.Direction); var add = true; if (Settings.Filters.Length > 0) add = opcodeName.MatchesFilters(Settings.Filters); // check for ignore filters if (add && Settings.IgnoreFilters.Length > 0) add = !opcodeName.MatchesFilters(Settings.IgnoreFilters); if (add) { if (Settings.FilterPacketsNum > 0 && _count++ == Settings.FilterPacketsNum) return true; // break return false; // continue } packet.ClosePacket(); packet = null; return false; } catch (Exception ex) { Trace.WriteLine(ex.Data); Trace.WriteLine(ex.GetType()); Trace.WriteLine(ex.Message); Trace.WriteLine(ex.StackTrace); } packet = null; return false; }
public static void HandleDBReply(Packet packet) { var entry = (uint)packet.ReadInt32("Entry"); packet.ReadTime("Hotfix date"); var type = packet.ReadEnum<DB2Hash>("DB2 File", TypeCode.UInt32); 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.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(); db2File.ReadUInt32("Id"); var Id = db2File.ReadEntry("Creature Id"); creatureDifficulty.faction = db2File.ReadUInt32("Faction Template Id"); creatureDifficulty.Expansion = db2File.ReadInt32("Expansion"); creatureDifficulty.MinLevel = db2File.ReadInt32("Min Level"); creatureDifficulty.MaxLevel = db2File.ReadInt32("Max Level"); db2File.ReadUInt32("Unk MoP 1"); db2File.ReadUInt32("Unk MoP 2"); db2File.ReadUInt32("Unk MoP 3"); db2File.ReadUInt32("Unk MoP 4"); db2File.ReadUInt32("Unk MoP 5"); Storage.CreatureDifficultys.Add((uint) Id.Key, creatureDifficulty, packet.TimeSpan); break; } case DB2Hash.GameObjects: { var gameObjectTemplateDB2 = new GameObjectTemplateDB2(); var gameObjectTemplatePositionDB2 = new GameObjectTemplatePositionDB2(); var Id = db2File.ReadEntry("GameObject Id"); gameObjectTemplatePositionDB2.map = db2File.ReadUInt32("Map"); gameObjectTemplateDB2.DisplayId = db2File.ReadUInt32("Display Id"); gameObjectTemplatePositionDB2.positionX = db2File.ReadSingle("Position X"); gameObjectTemplatePositionDB2.positionY = db2File.ReadSingle("Position Y"); gameObjectTemplatePositionDB2.positionZ = db2File.ReadSingle("Position Z"); gameObjectTemplatePositionDB2.rotationX = db2File.ReadSingle("Rotation X"); gameObjectTemplatePositionDB2.rotationY = db2File.ReadSingle("Rotation Y"); gameObjectTemplatePositionDB2.rotationZ = db2File.ReadSingle("Rotation Z"); gameObjectTemplatePositionDB2.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); if (gameObjectTemplatePositionDB2.positionX != 0.0f && gameObjectTemplatePositionDB2.positionY != 0.0f && gameObjectTemplatePositionDB2.positionZ != 0.0f) Storage.GameObjectTemplatePositionDB2s.Add((uint) Id.Key, gameObjectTemplatePositionDB2, packet.TimeSpan); break; } case DB2Hash.Item: { var item = Storage.ItemTemplates.ContainsKey(entry) ? Storage.ItemTemplates[entry].Item1 : new ItemTemplate(); db2File.ReadEntryWithName<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.ItemCurrencyCost: { db2File.ReadUInt32("Id"); db2File.ReadEntryWithName<UInt32>(StoreNameType.Item, "Item Entry"); break; } case DB2Hash.RulesetItemUpgrade: { db2File.ReadUInt32("Id"); db2File.ReadUInt32("Item Upgrade Level"); db2File.ReadUInt32("Item Upgrade Id"); db2File.ReadEntryWithName<UInt32>(StoreNameType.Item, "Item Entry"); break; } case DB2Hash.Item_sparse: { var item = Storage.ItemTemplates.ContainsKey(entry) ? Storage.ItemTemplates[entry].Item1 : new ItemTemplate(); db2File.ReadEntryWithName<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.ReadEntryWithName<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.ReadEntryWithName<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.ReadEntryWithName<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 = (uint) db2File.ReadEntryWithName<UInt32>(StoreNameType.Area, "Area"); // In this single (?) case, map 0 means no map var map = db2File.ReadInt32(); item.MapId = map; db2File.WriteLine("Map ID: " + (map != 0 ? StoreGetters.GetName(StoreNameType.Map, map) : map + " (No 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.WriteLine("Key: {0}", Utilities.ByteArrayToHexString(db2File.ReadBytes(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.WriteLine("Unknown DB2 file type: {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.WriteLine(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.WriteLine(key + ": " + value); } break; } } break; } } db2File.ClosePacket(); }
public static void HandleAuthSession505(Packet packet) { var sha = new byte[20]; packet.ReadUInt32("UInt32 2");//18 sha[2] = packet.ReadByte();//24 sha[15] = packet.ReadByte();//37 sha[12] = packet.ReadByte();//34 sha[11] = packet.ReadByte();//33 sha[10] = packet.ReadByte();//32 sha[9] = packet.ReadByte();//31 packet.ReadByte("Unk Byte");//20 packet.ReadUInt32("Client seed");//14 sha[16] = packet.ReadByte();//38 sha[5] = packet.ReadByte();//27 packet.ReadEnum<ClientVersionBuild>("Client Build", TypeCode.Int16);//34 packet.ReadUInt32("UInt32 4");//16 sha[18] = packet.ReadByte();//40 sha[0] = packet.ReadByte();//22 sha[13] = packet.ReadByte();//35 sha[3] = packet.ReadByte();//25 sha[14] = packet.ReadByte();//36 packet.ReadByte("Unk Byte");//21 sha[8] = packet.ReadByte();//30 sha[7] = packet.ReadByte();//29 packet.ReadUInt32("UInt32 3");//15 sha[4] = packet.ReadByte();//26 packet.ReadInt64("Int64");//12,13 sha[17] = packet.ReadByte();//39 sha[19] = packet.ReadByte();//41 packet.ReadUInt32("UInt32 1");//4 sha[6] = packet.ReadByte();//28 sha[1] = packet.ReadByte();//23 var addons = new Packet(packet.ReadBytes(packet.ReadInt32()), packet.Opcode, packet.Time, packet.Direction, packet.Number, packet.Writer, packet.FileName); AddonHandler.ReadClientAddonsList(ref addons); addons.ClosePacket(false); packet.ReadBit("Unk bit"); var size = (int)packet.ReadBits(12); packet.WriteLine("Account name: {0}", Encoding.UTF8.GetString(packet.ReadBytes(size))); packet.WriteLine("Proof SHA-1 Hash: " + Utilities.ByteArrayToHexString(sha)); }
public static void HandleAuthSession432(Packet packet) { var sha = new byte[20]; packet.ReadInt32("Int32"); sha[12] = packet.ReadByte(); packet.ReadInt32("Int32"); packet.ReadInt32("Int32"); sha[0] = packet.ReadByte(); sha[2] = packet.ReadByte(); sha[18] = packet.ReadByte(); sha[7] = packet.ReadByte(); sha[9] = packet.ReadByte(); sha[19] = packet.ReadByte(); sha[17] = packet.ReadByte(); sha[6] = packet.ReadByte(); sha[11] = packet.ReadByte(); packet.ReadEnum<ClientVersionBuild>("Client Build", TypeCode.Int16); sha[15] = packet.ReadByte(); packet.ReadInt64("Int64"); packet.ReadByte("Unk Byte"); packet.ReadByte("Unk Byte"); sha[3] = packet.ReadByte(); sha[10] = packet.ReadByte(); packet.ReadUInt32("Client Seed"); sha[16] = packet.ReadByte(); sha[4] = packet.ReadByte(); packet.ReadInt32("Int32"); sha[14] = packet.ReadByte(); sha[8] = packet.ReadByte(); sha[5] = packet.ReadByte(); sha[1] = packet.ReadByte(); sha[13] = packet.ReadByte(); var pkt = new Packet(packet.ReadBytes(packet.ReadInt32()), packet.Opcode, packet.Time, packet.Direction, packet.Number, packet.Writer, packet.FileName); AddonHandler.ReadClientAddonsList(ref pkt); pkt.ClosePacket(false); var highBits = packet.ReadByte() << 5; var lowBits = packet.ReadByte() >> 3; var size = lowBits | highBits; packet.WriteLine("Size: " + size); packet.WriteLine("Account name: {0}", Encoding.UTF8.GetString(packet.ReadBytes(size))); packet.WriteLine("Proof SHA-1 Hash: " + Utilities.ByteArrayToHexString(sha)); }
public static void HandleAuthSession430(Packet packet) { packet.ReadInt32("Int32"); packet.ReadByte("Digest (1)"); packet.ReadInt64("Int64"); packet.ReadInt32("Int32"); packet.ReadByte("Digest (2)"); packet.ReadInt32("Int32"); packet.ReadByte("Digest (3)"); packet.ReadInt32("Int32"); for (var i = 0; i < 7; i++) packet.ReadByte("Digest (4)", i); packet.ReadEnum<ClientVersionBuild>("Client Build", TypeCode.Int16); for (var i = 0; i < 8; i++) packet.ReadByte("Digest (5)", i); packet.ReadByte("Unk Byte"); packet.ReadByte("Unk Byte"); packet.ReadUInt32("Client Seed"); for (var i = 0; i < 2; i++) packet.ReadByte("Digest (6)", i); var pkt = new Packet(packet.ReadBytes(packet.ReadInt32()), packet.Opcode, packet.Time, packet.Direction, packet.Number, packet.Writer, packet.FileName); AddonHandler.ReadClientAddonsList(ref pkt); pkt.ClosePacket(false); packet.ReadByte("Mask"); // TODO: Seems to affect how the size is read var size = (packet.ReadByte() >> 4); packet.WriteLine("Size: " + size); packet.WriteLine("Account name: {0}", Encoding.UTF8.GetString(packet.ReadBytes(size))); }
public static void HandleAuthSession(Packet packet) { var sha = new byte[20]; packet.ReadUInt32("UInt32 2"); sha[4] = packet.ReadByte(); packet.ReadUInt32("UInt32 4"); packet.ReadByte("Unk Byte"); sha[19] = packet.ReadByte(); sha[12] = packet.ReadByte(); sha[9]= packet.ReadByte(); sha[6] = packet.ReadByte(); sha[18] = packet.ReadByte(); sha[17] = packet.ReadByte(); sha[8] = packet.ReadByte(); sha[13] = packet.ReadByte(); sha[1] = packet.ReadByte(); sha[10] = packet.ReadByte(); sha[11] = packet.ReadByte(); sha[15] = packet.ReadByte(); packet.ReadUInt32("Client seed"); sha[3] = packet.ReadByte(); sha[14] = packet.ReadByte(); sha[7] = packet.ReadByte(); packet.ReadInt64("Int64"); packet.ReadByte("Unk Byte"); packet.ReadUInt32("UInt32 1"); sha[5] = packet.ReadByte(); sha[0] = packet.ReadByte(); packet.ReadEnum<ClientVersionBuild>("Client Build", TypeCode.Int16);//20 sha[16] = packet.ReadByte(); sha[2] = packet.ReadByte(); packet.ReadUInt32("UInt32 3"); var addons = new Packet(packet.ReadBytes(packet.ReadInt32()), packet.Opcode, packet.Time, packet.Direction, packet.Number, packet.Writer, packet.FileName); CoreParsers.AddonHandler.ReadClientAddonsList(ref addons); addons.ClosePacket(false); var size = (int)packet.ReadBits(11); packet.ReadBit("Unk bit"); packet.ResetBitReader(); packet.WriteLine("Account name: {0}", Encoding.UTF8.GetString(packet.ReadBytes(size))); packet.WriteLine("Proof SHA-1 Hash: " + Utilities.ByteArrayToHexString(sha)); }