public static void HandleInspectTalent(Packet packet) { if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_0_6a_13623)) packet.ReadGuid("GUID"); else packet.ReadPackedGuid("GUID"); if (packet.Opcode == Opcodes.GetOpcode(Opcode.SMSG_INSPECT_TALENT)) ReadTalentInfo(ref packet); var slotMask = packet.ReadUInt32("Slot Mask"); var slot = 0; while (slotMask > 0) { if ((slotMask & 0x1) > 0) { var name = "[" + (EquipmentSlotType)slot + "] "; packet.ReadEntryWithName<UInt32>(StoreNameType.Item, name + "Item Entry"); var enchantMask = packet.ReadUInt16(); if (enchantMask > 0) { var enchantName = name + "Item Enchantments: "; while (enchantMask > 0) { if ((enchantMask & 0x1) > 0) { enchantName += packet.ReadUInt16(); if (enchantMask > 1) enchantName += ", "; } enchantMask >>= 1; } packet.WriteLine(enchantName); } packet.ReadUInt16(name + "Unk Uint16"); packet.ReadPackedGuid(name + "Creator GUID"); packet.ReadUInt32(name + "Unk Uint32"); } ++slot; slotMask >>= 1; } if (packet.Opcode == Opcodes.GetOpcode(Opcode.SMSG_INSPECT_TALENT) && packet.CanRead()) // otherwise it would fail for players without a guild { packet.ReadGuid("Guild GUID"); packet.ReadUInt32("Guild Level"); packet.ReadUInt64("Guild Xp"); packet.ReadUInt32("Guild Members"); } }
public static void HandleLearnTalents(Packet packet) { var talentCount = packet.ReadBits("Learned Talent Count", 25); for (int i = 0; i < talentCount; i++) packet.ReadUInt16("Talent Id", i); }
public static void HandleClientWardenData(Packet packet) { var opcode = packet.ReadEnum<WardenClientOpcode>("Warden Client Opcode", TypeCode.Byte); switch (opcode) { case WardenClientOpcode.CheatCheckResults: { var length = packet.ReadUInt16("Check Result Length"); packet.ReadInt32("Check Result Checksum"); var result = packet.ReadBytes(length); packet.WriteLine("Check Results: " + Utilities.ByteArrayToHexString(result)); break; } case WardenClientOpcode.TransformedSeed: { var sha1 = packet.ReadBytes(20); packet.WriteLine("SHA1 Seed: " + Utilities.ByteArrayToHexString(sha1)); break; } } }
public static void HandleUpdateObject(Packet packet) { uint map = MovementHandler.CurrentMapId; if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_0_1_13164)) map = packet.ReadUInt16("Map"); var count = packet.ReadUInt32("Count"); if (ClientVersion.RemovedInVersion(ClientVersionBuild.V3_0_2_9056)) packet.ReadBoolean("Has Transport"); for (var i = 0; i < count; i++) { var type = packet.ReadByte(); var typeString = ClientVersion.AddedInVersion(ClientType.Cataclysm) ? ((UpdateTypeCataclysm)type).ToString() : ((UpdateType)type).ToString(); packet.WriteLine("[" + i + "] UpdateType: " + typeString); switch (typeString) { case "Values": { var guid = packet.ReadPackedGuid("GUID", i); WoWObject obj; var updates = ReadValuesUpdateBlock(ref packet, guid.GetObjectType(), i, false); if (Storage.Objects.TryGetValue(guid, out obj)) { if (obj.ChangedUpdateFieldsList == null) obj.ChangedUpdateFieldsList = new List<Dictionary<int, UpdateField>>(); obj.ChangedUpdateFieldsList.Add(updates); } break; } case "Movement": { var guid = ClientVersion.AddedInVersion(ClientVersionBuild.V3_1_2_9901) ? packet.ReadPackedGuid("GUID", i) : packet.ReadGuid("GUID", i); ReadMovementUpdateBlock(ref packet, guid, i); // Should we update Storage.Object? break; } case "CreateObject1": case "CreateObject2": // Might != CreateObject1 on Cata { var guid = packet.ReadPackedGuid("GUID", i); ReadCreateObjectBlock(ref packet, guid, map, i); break; } case "FarObjects": case "NearObjects": case "DestroyObjects": { ReadObjectsBlock(ref packet, i); break; } } } }
public static void HandlePetAction(Packet packet) { packet.ReadGuid("GUID"); var action = (uint)packet.ReadUInt16() + (packet.ReadByte() << 16); packet.Writer.WriteLine("Action: {0}", action); packet.ReadEnum<ActionButtonType>("Type", TypeCode.Byte); packet.ReadGuid("GUID"); }
public static void HandleMailListResult(Packet packet) { packet.ReadUInt32("Total Mails"); var count = packet.ReadByte("Shown Mails"); for (var i = 0; i < count; ++i) { packet.ReadUInt16("Message Size", i); packet.ReadUInt32("Mail Id", i); var mailType = packet.ReadEnum<MailType>("Message Type", TypeCode.Byte, i); switch (mailType) // Read GUID if MailType.Normal, int32 (entry) if not { case MailType.Normal: packet.ReadGuid("Player GUID", i); break; case MailType.Creature: packet.Writer.WriteLine("[" + i + "] Entry: " + StoreGetters.GetExistingDatabaseString(StoreNameType.Unit, packet.ReadInt32())); break; case MailType.GameObject: packet.Writer.WriteLine("[" + i + "] Entry: " + StoreGetters.GetExistingDatabaseString(StoreNameType.GameObject, packet.ReadInt32())); break; case MailType.Item: packet.Writer.WriteLine("[" + i + "] Entry: " + StoreGetters.GetExistingDatabaseString(StoreNameType.Item, packet.ReadInt32())); break; default: packet.ReadInt32("Entry", i); break; } packet.ReadUInt32("COD", i); packet.ReadUInt32("Unk uint32", i); packet.ReadUInt32("Stationery", i); packet.ReadUInt32("Money", i); packet.ReadUInt32("Flags", i); packet.ReadSingle("Time?", i); packet.ReadUInt32("Template Id", i); packet.ReadCString("Subject", i); packet.ReadCString("Body", i); var items = packet.ReadByte("Item Count", i); for (var j = 0; j < items; ++j) { packet.ReadByte("Item Index", i, j); packet.ReadUInt32("Item GuidLow", i, j); packet.ReadEntryWithName<UInt32>(StoreNameType.Item, "Item Id", i, j); for (var k = 0; k < 7; ++k) { packet.ReadUInt32("Item Enchantment Id", i, j, k); packet.ReadUInt32("Item Enchantment Duration", i, j, k); packet.ReadUInt32("Item Enchantment Charges", i, j, k); } packet.ReadInt32("Item Random Property Id", i, j); packet.ReadUInt32("Item Suffix Factor", i, j); packet.ReadUInt32("Item Count", i, j); packet.ReadUInt32("Item SpellCharges", i, j); packet.ReadUInt32("Item Max Durability", i, j); packet.ReadUInt32("Item Durability", i, j); packet.ReadByte("Unk byte", i, j); } } }
public static void HandlePetAction(Packet packet) { packet.ReadPackedGuid128("PetGUID"); var action = (uint)packet.ReadUInt16() + (packet.ReadByte() << 16); packet.AddValue("Action", action); packet.ReadByte("Slot"); packet.ReadPackedGuid128("TargetGUID"); packet.ReadVector3("ActionPosition"); }
public static void HandleServerWardenData(Packet packet) { var opcode = packet.ReadEnum<WardenServerOpcode>("Warden Server Opcode", TypeCode.Byte); packet.SetPosition(0); switch (opcode) { case WardenServerOpcode.ModuleInfo: { packet.ReadByte(); packet.ReadBytes("Module MD5", 16); packet.ReadBytes("Module RC4", 16); packet.ReadUInt32("Module Length"); break; } case WardenServerOpcode.ModuleChunk: { packet.ReadByte(); var length = packet.ReadUInt16("Chunk Length"); packet.ReadBytes("Module Chunk", length); break; } case WardenServerOpcode.CheatChecks: { packet.ReadByte(); byte length; while ((length = packet.ReadByte()) != 0) { packet.ReadBytes("String", length); } // var rest = (int)(packet.GetLength() - packet.GetPosition()); break; } case WardenServerOpcode.Data: { while (packet.CanRead()) { packet.ReadByte(); var length = packet.ReadUInt16("Data Length"); packet.ReadInt32("Data Checksum"); packet.ReadBytes("Data", length); } break; } case WardenServerOpcode.Seed: { packet.ReadByte(); packet.ReadBytes("Seed", 16); break; } } }
public static void HandlePetAction(Packet packet) { packet.ReadGuid("GUID"); var action = (uint)packet.ReadUInt16() + (packet.ReadByte() << 16); packet.AddValue("Action", action); packet.ReadByteE<ActionButtonType>("Type"); packet.ReadGuid("GUID"); if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_0_6_13596)) packet.ReadVector3("Position"); }
public static void HandlePetAction(Packet packet) { packet.ReadGuid("GUID"); var action = (uint)packet.ReadUInt16() + (packet.ReadByte() << 16); packet.WriteLine("Action: {0}", action); packet.ReadEnum<ActionButtonType>("Type", TypeCode.Byte); packet.ReadGuid("GUID"); if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_2_2_14545)) packet.ReadVector3("Position"); }
public static void HandleInspectTalent(Packet packet) { if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_2_2_14545)) packet.ReadGuid("GUID"); else packet.ReadPackedGuid("GUID"); if (packet.Opcode == Opcodes.GetOpcode(Opcode.SMSG_INSPECT_TALENT)) ReadTalentInfo(ref packet); var slotMask = packet.ReadUInt32("Slot Mask"); var slot = 0; while (slotMask > 0) { if ((slotMask & 0x1) > 0) { var name = "[" + (EquipmentSlotType)slot + "] "; packet.ReadEntryWithName<UInt32>(StoreNameType.Item, name + "Item Entry"); var enchantMask = packet.ReadUInt16(); if (enchantMask > 0) { var enchantName = name + "Item Enchantments: "; while (enchantMask > 0) { if ((enchantMask & 0x1) > 0) { enchantName += packet.ReadUInt16(); if (enchantMask > 1) enchantName += ", "; } enchantMask >>= 1; } packet.WriteLine(enchantName); } packet.ReadUInt16(name + "Unk Uint16"); packet.ReadPackedGuid(name + "Creator GUID"); packet.ReadUInt32(name + "Unk Uint32"); } ++slot; slotMask >>= 1; } }
public static void ReadPetFlags(Packet packet, params object[] idx) { var petModeFlag = packet.ReadUInt16(); var reactState = packet.ReadByte(); var flag = petModeFlag >> 16; var commandState = (petModeFlag & flag); packet.AddValue("ReactState", (ReactState)reactState, idx); packet.AddValue("CommandState", (CommandState)commandState, idx); packet.AddValue("Flag", flag, idx); }
public static void ReadTalentInfo(Packet packet) { packet.ReadByte("Active Spec Group"); var specCount = packet.ReadBits("Spec Group count", 19); var wpos = new UInt32[specCount]; for (var i = 0; i < specCount; ++i) { wpos[i] = packet.ReadBits("TalentCount", 23, i); } for (var i = 0; i < specCount; ++i) { for (var j = 0; j < wpos[i]; ++j) packet.ReadUInt16("TalentID", i, j); packet.ReadUInt32("Spec Id", i); //var spentTalents = packet.ReadByte("Spec Talent Count", i); //var glyphCount = packet.ReadByte("Glyph count", i); for (var j = 0; j < 6; ++j) packet.ReadUInt16("Glyph", i, j); } }
public static void HandleInspectTalent(Packet packet) { packet.ReadPackedGuid("GUID"); ReadTalentInfo(ref packet); var slotMask = packet.ReadUInt32("Slot Mask"); var slot = 0; while (slotMask > 0) { if ((slotMask & 0x1) > 0) { var name = "[" + (EquipmentSlotType)slot + "] "; packet.ReadEntryWithName<UInt32>(StoreNameType.Item, name + "Item Entry"); var enchantMask = packet.ReadUInt16(); if (enchantMask > 0) { var enchantName = name + "Item Enchantments: "; while (enchantMask > 0) { if ((enchantMask & 0x1) > 0) { enchantName += packet.ReadUInt16(); if (enchantMask > 1) enchantName += ", "; } enchantMask >>= 1; } packet.Writer.WriteLine(enchantName); } packet.ReadUInt16(name + "Unk Uint16"); packet.ReadPackedGuid(name + "Creator GUID"); packet.ReadUInt32(name + "Unk Uint32"); } ++slot; slotMask >>= 1; } }
public static void HandleUpdateObject(Packet packet) { uint map = packet.ReadUInt16("Map"); var count = packet.ReadUInt32("Count"); //var type = packet.ReadByte(); //var typeString = ((UpdateType2)type).ToString(); for (var i = 0; i < count; i++) { packet.WriteLine("StartPosFor: " + packet.Position); var type = packet.ReadByte(); var typeString = ((UpdateTypeCataclysm)type).ToString(); packet.ResetBitReader(); packet.WriteLine("[" + i + "] UpdateType: " + typeString); switch (typeString) { case "Values": { var guid = packet.ReadPackedGuid("GUID", i); WoWObject obj; var updates = CoreParsers.UpdateHandler.ReadValuesUpdateBlock(packet, guid.GetObjectType(), i, false); if (Storage.Objects.TryGetValue(guid, out obj)) { if (obj.ChangedUpdateFieldsList == null) obj.ChangedUpdateFieldsList = new List<Dictionary<int, UpdateField>>(); obj.ChangedUpdateFieldsList.Add(updates); } break; } case "CreateObject1": case "CreateObject2": { var guid = packet.ReadPackedGuid("GUID", i); ReadCreateObjectBlock(ref packet, guid, map, i); break; } case "DestroyObjects": { CoreParsers.UpdateHandler.ReadObjectsBlock(packet, i); break; } } } }
public static void HandleUpdateObject(Packet packet) { var count = packet.ReadUInt32("NumObjUpdates"); uint map = packet.ReadUInt16<MapId>("MapID"); packet.ResetBitReader(); var bit552 = packet.ReadBit("HasDestroyObjects"); if (bit552) { packet.ReadInt16("Int0"); var int8 = packet.ReadUInt32("DestroyObjectsCount"); for (var i = 0; i < int8; i++) packet.ReadPackedGuid128("Object GUID", i); } packet.ReadUInt32("Data size"); for (var i = 0; i < count; i++) { var type = packet.ReadByte(); var typeString = ((UpdateTypeCataclysm)type).ToString(); packet.AddValue("UpdateType", typeString, i); switch (typeString) { case "Values": { var guid = packet.ReadPackedGuid128("Object Guid", i); WoWObject obj; var updates = CoreParsers.UpdateHandler.ReadValuesUpdateBlock(packet, guid.GetObjectType(), i, false); if (Storage.Objects.TryGetValue(guid, out obj)) { if (obj.ChangedUpdateFieldsList == null) obj.ChangedUpdateFieldsList = new List<Dictionary<int, UpdateField>>(); obj.ChangedUpdateFieldsList.Add(updates); } break; } case "CreateObject1": case "CreateObject2": // Might != CreateObject1 on Cata { var guid = packet.ReadPackedGuid128("Object Guid", i); ReadCreateObjectBlock(packet, guid, map, i); break; } } } }
public static void HandleClientWardenData(Packet packet) { var opcode = packet.ReadEnum<WardenClientOpcode>("Warden Client Opcode", TypeCode.Byte); switch (opcode) { case WardenClientOpcode.CheatCheckResults: { var length = packet.ReadUInt16("Check Result Length"); packet.ReadInt32("Check Result Checksum"); packet.ReadBytes("Check Results", length); break; } case WardenClientOpcode.TransformedSeed: { packet.ReadBytes("SHA1 Seed", 20); break; } } }
public static void HandleAuraUpdate(Packet packet) { var guid = new byte[8]; var powerGUID = new byte[8]; packet.ReadBit(); // fake bit? packet.StartBitStream(guid, 6, 1, 0); var bits4 = (int)packet.ReadBits(24); packet.StartBitStream(guid, 2, 4); var hasPowerData = packet.ReadBit(); var powerCount = 0u; if (hasPowerData) { packet.StartBitStream(powerGUID, 7, 0, 6); powerCount = packet.ReadBits(21); packet.StartBitStream(powerGUID, 3, 1, 2, 4, 5); } packet.StartBitStream(guid, 7, 3, 5); var hasAura = new bool[bits4]; var hasCasterGUID = new bool[bits4]; var hasDuration = new bool[bits4]; var hasMaxDuration = new bool[bits4]; var effectCount = new uint[bits4]; var casterGUID = new byte[bits4][]; var bitsEC = new uint[bits4]; for (var i = 0; i < bits4; ++i) { hasAura[i] = packet.ReadBit(); if (hasAura[i]) { hasMaxDuration[i] = packet.ReadBit(); effectCount[i] = packet.ReadBits(22); hasCasterGUID[i] = packet.ReadBit(); if (hasCasterGUID[i]) { casterGUID[i] = new byte[8]; packet.StartBitStream(casterGUID[i], 3, 0, 2, 6, 5, 7, 4, 1); } hasDuration[i] = packet.ReadBit(); bitsEC[i] = packet.ReadBits(22); } } var auras = new List<Aura>(); for (var i = 0; i < bits4; ++i) { if (hasAura[i]) { var aura = new Aura(); aura.Duration = hasDuration[i] ? packet.ReadInt32("Duration", i) : 0; if (hasCasterGUID[i]) { packet.ParseBitStream(casterGUID[i], 0, 7, 5, 6, 1, 3, 2, 4); packet.WriteGuid("Caster GUID", casterGUID[i], i); aura.CasterGuid = new WowGuid64(BitConverter.ToUInt64(casterGUID[i], 0)); } else aura.CasterGuid = new WowGuid64(); aura.AuraFlags = packet.ReadByteE<AuraFlagMoP>("Flags", i); for (var j = 0; j < effectCount[i]; ++j) packet.ReadSingle("Effect Value", i, j); aura.SpellId = packet.ReadUInt32("Spell Id", i); aura.MaxDuration = hasMaxDuration[i] ? packet.ReadInt32("Max Duration", i) : 0; for (var j = 0; j < bitsEC[i]; ++j) packet.ReadSingle("FloatEA"); aura.Charges = packet.ReadByte("Charges", i); packet.ReadInt32("Effect Mask", i); aura.Level = packet.ReadUInt16("Caster Level", i); auras.Add(aura); packet.AddSniffData(StoreNameType.Spell, (int)aura.SpellId, "AURA_UPDATE"); } packet.ReadByte("Slot", i); } if (hasPowerData) { packet.ReadXORByte(powerGUID, 7); packet.ReadXORByte(powerGUID, 4); packet.ReadXORByte(powerGUID, 5); packet.ReadXORByte(powerGUID, 1); packet.ReadXORByte(powerGUID, 6); for (var i = 0; i < powerCount; ++i) { packet.ReadInt32("Value", i); packet.ReadInt32E<PowerType>("Power type", i); // Actually powertype for class } packet.ReadInt32("Attack power"); packet.ReadInt32("Spell power"); packet.ReadXORByte(powerGUID, 3); packet.ReadInt32("Current health"); packet.ReadXORByte(powerGUID, 0); packet.ReadXORByte(powerGUID, 2); packet.WriteGuid("Power GUID", powerGUID); } packet.ParseBitStream(guid, 0, 4, 3, 7, 5, 6, 2, 1); packet.WriteGuid("Guid", guid); var GUID = new WowGuid64(BitConverter.ToUInt64(guid, 0)); if (Storage.Objects.ContainsKey(GUID)) { var unit = Storage.Objects[GUID].Item1 as Unit; if (unit != null) { // If this is the first packet that sends auras // (hopefully at spawn time) add it to the "Auras" field, // if not create another row of auras in AddedAuras // (similar to ChangedUpdateFields) if (unit.Auras == null) unit.Auras = auras; else unit.AddedAuras.Add(auras); } } }
public static void HandleMailListResult(Packet packet) { if (ClientVersion.AddedInVersion(ClientVersionBuild.V3_2_0_10192)) packet.ReadUInt32("Total Mails"); var count = packet.ReadByte("Shown Mails"); for (var i = 0; i < count; ++i) { packet.ReadUInt16("Message Size", i); packet.ReadUInt32("Mail Id", i); var mailType = packet.ReadEnum<MailType>("Message Type", TypeCode.Byte, i); switch (mailType) // Read GUID if MailType.Normal, int32 (entry) if not { case MailType.Normal: packet.ReadGuid("Player GUID", i); break; case MailType.Creature: packet.ReadEntryWithName<Int32>(StoreNameType.Unit, "Entry", i); break; case MailType.GameObject: packet.ReadEntryWithName<Int32>(StoreNameType.GameObject, "Entry", i); break; case MailType.Item: packet.ReadEntryWithName<Int32>(StoreNameType.Item, "Entry", i); break; case (MailType)1: case MailType.Auction: packet.ReadInt32("Entry", i); break; } if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_2_2_14545)) packet.ReadUInt64("COD", i); else packet.ReadUInt32("COD", i); if (ClientVersion.RemovedInVersion(ClientVersionBuild.V3_3_0_10958)) packet.ReadUInt32("Item Text Id", i); packet.ReadUInt32("Package", i); // Package.dbc ID packet.ReadUInt32("Stationery", i); // Stationary.dbc ID if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_2_2_14545)) packet.ReadUInt64("Money", i); else packet.ReadUInt32("Money", i); packet.ReadUInt32("Flags", i); packet.ReadSingle("Time", i); packet.ReadUInt32("Template Id", i); // MailTemplate.dbc ID packet.ReadCString("Subject", i); if (ClientVersion.AddedInVersion(ClientVersionBuild.V3_3_0_10958)) packet.ReadCString("Body", i); var items = packet.ReadByte("Item Count", i); for (var j = 0; j < items; ++j) { packet.ReadByte("Item Index", i, j); packet.ReadUInt32("Item GuidLow", i, j); packet.ReadEntryWithName<UInt32>(StoreNameType.Item, "Item Id", i, j); int enchantmentCount = 6; if (ClientVersion.AddedInVersion(ClientType.WrathOfTheLichKing)) enchantmentCount = 7; if (ClientVersion.AddedInVersion(ClientType.Cataclysm)) enchantmentCount = 9; if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_3_0_15005)) enchantmentCount = 10; for (var k = 0; k < enchantmentCount; ++k) { packet.ReadUInt32("Item Enchantment Id", i, j, k); packet.ReadUInt32("Item Enchantment Duration", i, j, k); packet.ReadUInt32("Item Enchantment Charges", i, j, k); } packet.ReadInt32("Item Random Property Id", i, j); packet.ReadUInt32("Item Suffix Factor", i, j); if (ClientVersion.AddedInVersion(ClientType.WrathOfTheLichKing)) packet.ReadUInt32("Item Count", i, j); else packet.ReadByte("Item Count", i, j); packet.ReadUInt32("Item SpellCharges", i, j); packet.ReadUInt32("Item Max Durability", i, j); packet.ReadUInt32("Item Durability", i, j); if (ClientVersion.AddedInVersion(ClientType.WrathOfTheLichKing)) packet.ReadByte("Unk byte", i, j); } } }
public static void HandleAuraUpdate(Packet packet) { packet.ReadBit("UpdateAll"); var guid = packet.ReadPackedGuid128("UnitGUID"); var count = packet.ReadUInt32("AurasCount"); var auras = new List<Aura>(); for (var i = 0; i < count; ++i) { var aura = new Aura(); packet.ReadByte("Slot", i); packet.ResetBitReader(); var hasAura = packet.ReadBit("HasAura", i); if (hasAura) { aura.SpellId = (uint)packet.ReadInt32<SpellId>("SpellID", i); if (ClientVersion.AddedInVersion(ClientVersionBuild.V6_2_0_20173)) packet.ReadUInt32("SpellXSpellVisualID", i); aura.AuraFlags = packet.ReadByteE<AuraFlagMoP>("Flags", i); packet.ReadInt32("ActiveFlags", i); aura.Level = packet.ReadUInt16("CastLevel", i); aura.Charges = packet.ReadByte("Applications", i); var int72 = packet.ReadUInt32("Int56 Count", i); var effectCount = packet.ReadUInt32("Effect Count", i); for (var j = 0; j < int72; ++j) packet.ReadSingle("Points", i, j); for (var j = 0; j < effectCount; ++j) packet.ReadSingle("EstimatedPoints", i, j); packet.ResetBitReader(); var hasCasterGUID = packet.ReadBit("HasCastUnit", i); var hasDuration = packet.ReadBit("HasDuration", i); var hasMaxDuration = packet.ReadBit("HasRemaining", i); if (hasCasterGUID) packet.ReadPackedGuid128("CastUnit", i); aura.Duration = hasDuration ? packet.ReadInt32("Duration", i) : 0; aura.MaxDuration = hasMaxDuration ? packet.ReadInt32("Remaining", i) : 0; auras.Add(aura); packet.AddSniffData(StoreNameType.Spell, (int)aura.SpellId, "AURA_UPDATE"); } } if (Storage.Objects.ContainsKey(guid)) { var unit = Storage.Objects[guid].Item1 as Unit; if (unit != null) { // If this is the first packet that sends auras // (hopefully at spawn time) add it to the "Auras" field, // if not create another row of auras in AddedAuras // (similar to ChangedUpdateFields) if (unit.Auras == null) unit.Auras = auras; else unit.AddedAuras.Add(auras); } } }
public static void ReadTalentGroupInfo(Packet packet, params object[] idx) { packet.ReadUInt32("SpecId", idx); var talentIDsCount = packet.ReadInt32("TalentIDsCount", idx); for (var i = 0; i < 6; ++i) packet.ReadUInt16("GlyphIDs", idx, i); for (var i = 0; i < talentIDsCount; ++i) packet.ReadUInt16("TalentID", idx, i); }
public static void ReadCharactersData(Packet packet, params object[] idx) { packet.ReadPackedGuid128("Guid", idx); packet.ReadByte("ListPosition", idx); var race = packet.ReadByteE<Race>("RaceID", idx); var klass = packet.ReadByteE<Class>("ClassID", idx); packet.ReadByte("SexID", idx); packet.ReadByte("SkinID", idx); packet.ReadByte("FaceID", idx); packet.ReadByte("HairStyle", idx); packet.ReadByte("HairColor", idx); packet.ReadByte("FacialHairStyle", idx); for (uint j = 0; j < 3; ++j) packet.ReadByte("CustomDisplay", idx, j); packet.ReadByte("ExperienceLevel", idx); var zone = packet.ReadUInt32("ZoneID", idx); var mapId = packet.ReadUInt32("MapID", idx); var pos = packet.ReadVector3("PreloadPos", idx); packet.ReadPackedGuid128("GuildGUID", idx); packet.ReadUInt32("Flags", idx); packet.ReadUInt32("Flags2", idx); packet.ReadUInt32("Flags3", idx); packet.ReadUInt32("PetCreatureDisplayID", idx); packet.ReadUInt32("PetExperienceLevel", idx); packet.ReadUInt32("PetCreatureFamilyID", idx); for (uint j = 0; j < 2; ++j) packet.ReadUInt32("ProfessionIDs", idx, j); for (uint j = 0; j < 23; ++j) { packet.ReadUInt32("InventoryItem DisplayID", idx, j); packet.ReadUInt32("InventoryItem DisplayEnchantID", idx, j); packet.ReadByteE<InventoryType>("InventoryItem InvType", idx, j); } packet.ReadTime("LastPlayedTime", idx); packet.ReadUInt16("SpecID", idx); packet.ReadUInt32("Unknown703", idx); packet.ReadUInt32("Flags4", idx); packet.ResetBitReader(); var nameLength = packet.ReadBits("Character Name Length", 6, idx); var firstLogin = packet.ReadBit("FirstLogin", idx); packet.ReadBit("BoostInProgress", idx); packet.ReadBits("UnkWod61x", 5, idx); packet.ReadWoWString("Character Name", nameLength, idx); if (firstLogin) { PlayerCreateInfo startPos = new PlayerCreateInfo { Race = race, Class = klass, Map = mapId, Zone = zone, Position = pos, Orientation = 0 }; Storage.StartPositions.Add(startPos, packet.TimeSpan); } }
public static void HandleDBReply434(Packet packet) { var id = packet.ReadInt32("Entry"); var type = packet.ReadUInt32("Type"); packet.ReadTime("Hotfix date"); var size = packet.ReadUInt32("Size"); if (size == 0) return; if (id < 0) return; var itemId = (uint)id; switch (type) { case 0x50238EC2: // Item { var item = Storage.ItemTemplates.ContainsKey(itemId) ? Storage.ItemTemplates[itemId].Item1 : new ItemTemplate(); packet.ReadEntryWithName<UInt32>(StoreNameType.Item, "Entry"); item.Class = packet.ReadEnum<ItemClass>("Class", TypeCode.Int32); item.SubClass = packet.ReadUInt32("Sub Class"); item.SoundOverrideSubclass = packet.ReadInt32("Sound Override Subclass"); item.Material = packet.ReadEnum<Material>("Material", TypeCode.Int32); item.DisplayId = packet.ReadUInt32("Display ID"); item.InventoryType = packet.ReadEnum<InventoryType>("Inventory Type", TypeCode.UInt32); item.SheathType = packet.ReadEnum<SheathType>("Sheath Type", TypeCode.Int32); Storage.ItemTemplates.Add(itemId, item, packet.TimeSpan); break; } case 0x919BE54E: // Item-sparse { var item = Storage.ItemTemplates.ContainsKey(itemId) ? Storage.ItemTemplates[itemId].Item1 : new ItemTemplate(); packet.ReadEntryWithName<UInt32>(StoreNameType.Item, "Entry"); item.Quality = packet.ReadEnum<ItemQuality>("Quality", TypeCode.Int32); item.Flags = packet.ReadEnum<ItemProtoFlags>("Flags", TypeCode.UInt32); item.ExtraFlags = packet.ReadEnum<ItemFlagExtra>("Extra Flags", TypeCode.Int32); item.Unk430_1 = packet.ReadSingle("Unk430_1"); item.Unk430_2 = packet.ReadSingle("Unk430_2"); item.BuyCount = packet.ReadUInt32("Buy count"); item.BuyPrice = packet.ReadUInt32("Buy Price"); item.SellPrice = packet.ReadUInt32("Sell Price"); item.InventoryType = packet.ReadEnum<InventoryType>("Inventory Type", TypeCode.Int32); item.AllowedClasses = packet.ReadEnum<ClassMask>("Allowed Classes", TypeCode.Int32); item.AllowedRaces = packet.ReadEnum<RaceMask>("Allowed Races", TypeCode.Int32); item.ItemLevel = packet.ReadUInt32("Item Level"); item.RequiredLevel = packet.ReadUInt32("Required Level"); item.RequiredSkillId = packet.ReadUInt32("Required Skill ID"); item.RequiredSkillLevel = packet.ReadUInt32("Required Skill Level"); item.RequiredSpell = (uint)packet.ReadEntryWithName<Int32>(StoreNameType.Spell, "Required Spell"); item.RequiredHonorRank = packet.ReadUInt32("Required Honor Rank"); item.RequiredCityRank = packet.ReadUInt32("Required City Rank"); item.RequiredRepFaction = packet.ReadUInt32("Required Rep Faction"); item.RequiredRepValue = packet.ReadUInt32("Required Rep Value"); item.MaxCount = packet.ReadInt32("Max Count"); item.MaxStackSize = packet.ReadInt32("Max Stack Size"); item.ContainerSlots = packet.ReadUInt32("Container Slots"); item.StatTypes = new ItemModType[10]; for (var i = 0; i < 10; i++) { var statType = packet.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] = packet.ReadInt32("Stat Value", i); item.StatUnk1 = new int[10]; for (var i = 0; i < 10; i++) item.StatUnk1[i] = packet.ReadInt32("Unk UInt32 1", i); item.StatUnk2 = new int[10]; for (var i = 0; i < 10; i++) item.StatUnk2[i] = packet.ReadInt32("Unk UInt32 2", i); item.ScalingStatDistribution = packet.ReadInt32("Scaling Stat Distribution"); item.DamageType = packet.ReadEnum<DamageType>("Damage Type", TypeCode.Int32); item.Delay = packet.ReadUInt32("Delay"); item.RangedMod = packet.ReadSingle("Ranged Mod"); item.TriggeredSpellIds = new int[5]; for (var i = 0; i < 5; i++) item.TriggeredSpellIds[i] = packet.ReadEntryWithName<Int32>(StoreNameType.Spell, "Triggered Spell ID", i); item.TriggeredSpellTypes = new ItemSpellTriggerType[5]; for (var i = 0; i < 5; i++) item.TriggeredSpellTypes[i] = packet.ReadEnum<ItemSpellTriggerType>("Trigger Spell Type", TypeCode.Int32, i); item.TriggeredSpellCharges = new int[5]; for (var i = 0; i < 5; i++) item.TriggeredSpellCharges[i] = packet.ReadInt32("Triggered Spell Charges", i); item.TriggeredSpellCooldowns = new int[5]; for (var i = 0; i < 5; i++) item.TriggeredSpellCooldowns[i] = packet.ReadInt32("Triggered Spell Cooldown", i); item.TriggeredSpellCategories = new uint[5]; for (var i = 0; i < 5; i++) item.TriggeredSpellCategories[i] = packet.ReadUInt32("Triggered Spell Category", i); item.TriggeredSpellCategoryCooldowns = new int[5]; for (var i = 0; i < 5; i++) item.TriggeredSpellCategoryCooldowns[i] = packet.ReadInt32("Triggered Spell Category Cooldown", i); item.Bonding = packet.ReadEnum<ItemBonding>("Bonding", TypeCode.Int32); if (packet.ReadUInt16() > 0) item.Name = packet.ReadCString("Name", 0); for (var i = 1; i < 4; ++i) if (packet.ReadUInt16() > 0) packet.ReadCString("Name", i); if (packet.ReadUInt16() > 0) item.Description = packet.ReadCString("Description"); item.PageText = packet.ReadUInt32("Page Text"); item.Language = packet.ReadEnum<Language>("Language", TypeCode.Int32); item.PageMaterial = packet.ReadEnum<PageMaterial>("Page Material", TypeCode.Int32); item.StartQuestId = (uint)packet.ReadEntryWithName<Int32>(StoreNameType.Quest, "Start Quest"); item.LockId = packet.ReadUInt32("Lock ID"); item.Material = packet.ReadEnum<Material>("Material", TypeCode.Int32); item.SheathType = packet.ReadEnum<SheathType>("Sheath Type", TypeCode.Int32); item.RandomPropery = packet.ReadInt32("Random Property"); item.RandomSuffix = packet.ReadUInt32("Random Suffix"); item.ItemSet = packet.ReadUInt32("Item Set"); item.AreaId = (uint)packet.ReadEntryWithName<UInt32>(StoreNameType.Area, "Area"); // In this single (?) case, map 0 means no map var map = packet.ReadInt32(); item.MapId = map; packet.WriteLine("Map ID: " + (map != 0 ? StoreGetters.GetName(StoreNameType.Map, map) : map + " (No map)")); item.BagFamily = packet.ReadEnum<BagFamilyMask>("Bag Family", TypeCode.Int32); item.TotemCategory = packet.ReadEnum<TotemCategory>("Totem Category", TypeCode.Int32); item.ItemSocketColors = new ItemSocketColor[3]; for (var i = 0; i < 3; i++) item.ItemSocketColors[i] = packet.ReadEnum<ItemSocketColor>("Socket Color", TypeCode.Int32, i); item.SocketContent = new uint[3]; for (var i = 0; i < 3; i++) item.SocketContent[i] = packet.ReadUInt32("Socket Item", i); item.SocketBonus = packet.ReadInt32("Socket Bonus"); item.GemProperties = packet.ReadInt32("Gem Properties"); item.ArmorDamageModifier = packet.ReadSingle("Armor Damage Modifier"); item.Duration = packet.ReadUInt32("Duration"); item.ItemLimitCategory = packet.ReadInt32("Limit Category"); item.HolidayId = packet.ReadEnum<Holiday>("Holiday", TypeCode.Int32); item.StatScalingFactor = packet.ReadSingle("Stat Scaling Factor"); item.CurrencySubstitutionId = packet.ReadUInt32("Currency Substitution Id"); item.CurrencySubstitutionCount = packet.ReadUInt32("Currency Substitution Count"); Storage.ObjectNames.Add(itemId, new ObjectName { ObjectType = ObjectType.Item, Name = item.Name }, packet.TimeSpan); break; } case 0x6D8A2694: // KeyChain { packet.ReadUInt32("Key Chain Id"); packet.WriteLine("Key: {0}", Utilities.ByteArrayToHexString(packet.ReadBytes(32))); break; } } packet.AddSniffData(StoreNameType.Item, (int)itemId, "DB_REPLY"); }
public static void HandleDBReply(Packet packet) { packet.ReadUInt32("Type"); var itemId = packet.ReadEntryWithName<UInt32>(StoreNameType.Item, "Entry"); if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_2_2_14545)) packet.ReadUInt32("Received Type"); var size = packet.ReadUInt32("Size"); if (size == 0) { packet.ReadUInt32("Received Type"); return; } packet.ReadEntryWithName<UInt32>(StoreNameType.Item, "Entry"); if (size == 32) { packet.ReadEnum<ItemClass>("Class", TypeCode.Int32); packet.ReadUInt32("Sub Class"); packet.ReadInt32("Unk Int32"); packet.ReadEnum<Material>("Material", TypeCode.Int32); packet.ReadUInt32("Display ID"); packet.ReadEnum<InventoryType>("Inventory Type", TypeCode.UInt32); packet.ReadEnum<SheathType>("Sheath Type", TypeCode.Int32); } else { packet.ReadEnum<ItemQuality>("Quality", TypeCode.Int32); packet.ReadEnum<ItemProtoFlags>("Flags", TypeCode.UInt32); packet.ReadEnum<ItemFlagExtra>("Extra Flags", TypeCode.Int32); packet.ReadInt32("Buy Price"); packet.ReadUInt32("Sell Price"); packet.ReadEnum<InventoryType>("Inventory Type", TypeCode.Int32); packet.ReadEnum<ClassMask>("Allowed Classes", TypeCode.Int32); packet.ReadEnum<RaceMask>("Allowed Races", TypeCode.Int32); packet.ReadUInt32("Item Level"); packet.ReadUInt32("Required Level"); packet.ReadUInt32("Required Skill ID"); packet.ReadUInt32("Required Skill Level"); packet.ReadEntryWithName<Int32>(StoreNameType.Spell, "Required Spell"); packet.ReadUInt32("Required Honor Rank"); packet.ReadUInt32("Required City Rank"); packet.ReadUInt32("Required Rep Faction"); packet.ReadUInt32("Required Rep Value"); packet.ReadInt32("Max Count"); packet.ReadInt32("Max Stack Size"); packet.ReadUInt32("Container Slots"); for (var i = 0; i < 10; i++) packet.ReadEnum<ItemModType>("Stat Type", TypeCode.Int32, i); for (var i = 0; i < 10; i++) packet.ReadInt32("Stat Value", i); for (var i = 0; i < 10; i++) packet.ReadInt32("Unk UInt32 1", i); for (var i = 0; i < 10; i++) packet.ReadInt32("Unk UInt32 2", i); packet.ReadUInt32("Scaling Stat Distribution"); packet.ReadEnum<DamageType>("Damage Type", TypeCode.Int32); packet.ReadUInt32("Delay"); packet.ReadSingle("Ranged Mod"); for (var i = 0; i < 5; i++) packet.ReadEntryWithName<Int32>(StoreNameType.Spell, "Triggered Spell ID", i); for (var i = 0; i < 5; i++) packet.ReadEnum<ItemSpellTriggerType>("Trigger Spell Type", TypeCode.Int32, i); for (var i = 0; i < 5; i++) packet.ReadInt32("Triggered Spell Charges", i); for (var i = 0; i < 5; i++) packet.ReadInt32("Triggered Spell Cooldown", i); for (var i = 0; i < 5; i++) packet.ReadUInt32("Triggered Spell Category", i); for (var i = 0; i < 5; i++) packet.ReadInt32("Triggered Spell Category Cooldown", i); packet.ReadEnum<ItemBonding>("Bonding", TypeCode.Int32); for (var i = 0; i < 4; i++) if (packet.ReadUInt16() > 0) packet.ReadCString("Name", i); if (packet.ReadUInt16() > 0) packet.ReadCString("Description"); packet.ReadUInt32("Page Text"); packet.ReadEnum<Language>("Language", TypeCode.Int32); packet.ReadEnum<PageMaterial>("Page Material", TypeCode.Int32); packet.ReadEntryWithName<Int32>(StoreNameType.Quest, "Start Quest"); packet.ReadUInt32("Lock ID"); packet.ReadEnum<Material>("Material", TypeCode.Int32); packet.ReadEnum<SheathType>("Sheath Type", TypeCode.Int32); packet.ReadInt32("Random Property"); packet.ReadInt32("Random Suffix"); packet.ReadUInt32("Item Set"); packet.ReadUInt32("Max Durability"); packet.ReadEntryWithName<UInt32>(StoreNameType.Area, "Area"); // In this single (?) case, map 0 means no map var map = packet.ReadUInt32(); packet.WriteLine("Map ID: " + (map != 0 ? StoreGetters.GetName(StoreNameType.Map, (int) map) : map + " (No map)")); packet.ReadEnum<BagFamilyMask>("Bag Family", TypeCode.Int32); packet.ReadEnum<TotemCategory>("Totem Category", TypeCode.Int32); for (var i = 0; i < 3; i++) packet.ReadEnum<ItemSocketColor>("Socket Color", TypeCode.Int32, i); for (var i = 0; i < 3; i++) packet.ReadUInt32("Socket Item", i); packet.ReadUInt32("Socket Bonus"); packet.ReadUInt32("Gem Properties"); packet.ReadSingle("Armor Damage Modifier"); packet.ReadInt32("Duration"); packet.ReadInt32("Limit Category"); packet.ReadEnum<Holiday>("Holiday", TypeCode.Int32); packet.ReadSingle("Stat Scaling Factor"); packet.ReadUInt32("Unk UInt32 1"); packet.ReadUInt32("Unk UInt32 2"); } if (ClientVersion.RemovedInVersion(ClientVersionBuild.V4_2_2_14545)) packet.ReadUInt32("Received Type"); packet.AddSniffData(StoreNameType.Item, itemId, "DB_REPLY"); }
public static void ReadMonsterSplineFilter(Packet packet, params object[] indexes) { var count = packet.ReadUInt32("MonsterSplineFilterKey", indexes); packet.ReadSingle("BaseSpeed", indexes); packet.ReadUInt16("StartOffset", indexes); packet.ReadSingle("DistToPrevFilterKey", indexes); for (int i = 0; i < count; i++) { packet.ReadInt16("IDx", indexes, i); packet.ReadUInt16("Speed", indexes, i); } packet.ReadUInt16("AddedToStart", indexes); packet.ResetBitReader(); packet.ReadBits("FilterFlags", 2, indexes); }
public static void HandlePhaseShift434(Packet packet) { var guid = packet.StartBitStream(2, 3, 1, 6, 4, 5, 7, 0); packet.ReadXORByte(guid, 7); packet.ReadXORByte(guid, 4); var count = packet.ReadUInt32("Count1") / 2; for (var i = 0; i < count; ++i) packet.ReadUInt16("First array", i); packet.ReadXORByte(guid, 1); packet.ReadUInt32("UInt32"); packet.ReadXORByte(guid, 2); packet.ReadXORByte(guid, 6); count = packet.ReadUInt32() / 2; packet.WriteLine("Terrain swap count: {0}", count); for (var i = 0; i < count; ++i) packet.ReadEntryWithName<Int16>(StoreNameType.Map, "Terrain swap", i); count = packet.ReadUInt32() / 2; packet.WriteLine("Phases count: {0}", count); for (var i = 0; i < count; ++i) packet.ReadUInt16("Phase id", i); // Phase.dbc packet.ReadXORByte(guid, 3); packet.ReadXORByte(guid, 0); count = packet.ReadUInt32("Count4") / 2; for (var i = 0; i < count; ++i) packet.ReadUInt16("Fourth array", i); packet.ReadXORByte(guid, 5); packet.WriteLine("GUID {0}", new Guid(BitConverter.ToUInt64(guid, 0))); }
public static void HandlePhaseShift422(Packet packet) { var guid = new byte[8]; guid[6] = packet.ReadBit();//0 guid[1] = packet.ReadBit();//1 guid[7] = packet.ReadBit();//2 guid[4] = packet.ReadBit();//3 guid[2] = packet.ReadBit();//4 guid[3] = packet.ReadBit();//5 guid[0] = packet.ReadBit();//6 guid[5] = packet.ReadBit();//7 packet.ReadXORByte(guid, 0); packet.ReadXORByte(guid, 4); var i = 0; var count = packet.ReadInt32(); for (var j = 0; j < count / 2; ++j) packet.ReadEntryWithName<Int16>(StoreNameType.Map, "Map Swap 1", i, j); packet.ReadXORByte(guid, 3); packet.WriteLine("[" + i + "]" + " Mask: 0x" + packet.ReadUInt32().ToString("X2")); packet.ReadXORByte(guid, 2); var phaseMask = -1; count = packet.ReadInt32(); for (var j = 0; j < count / 2; ++j) phaseMask = packet.ReadUInt16("Current Mask", i, j); packet.ReadXORByte(guid, 6); i++; count = packet.ReadInt32(); for (var j = 0; j < count / 2; ++j) packet.ReadEntryWithName<Int16>(StoreNameType.Map, "Map Swap 1", i, j); packet.ReadXORByte(guid, 7); i++; count = packet.ReadInt32(); for (var j = 0; j < count / 2; ++j) packet.ReadEntryWithName<Int16>(StoreNameType.Map, "Map Swap 3", i, j); packet.ReadXORByte(guid, 5); packet.ReadXORByte(guid, 1); packet.WriteGuid("Guid", guid); if (phaseMask != -1) { CurrentPhaseMask = phaseMask; packet.AddSniffData(StoreNameType.Phase, phaseMask, "PHASEMASK 422"); } }
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 HandlePetSpells(Packet packet) { var guid64 = packet.ReadUInt64(); // Equal to "Clear spells" pre cataclysm if (guid64 == 0) return; var guid = new Guid(guid64); packet.WriteLine("GUID: " + guid); var isPet = guid.GetHighType() == HighGuidType.Pet; if (ClientVersion.AddedInVersion(ClientVersionBuild.V3_1_0_9767)) packet.ReadEnum<CreatureFamily>("Pet Family", TypeCode.UInt16); // vehicles -> 0 packet.ReadUInt32("Unknown 1"); // Following int8,int8,int16 is sent like int32 /*var reactState = */ packet.ReadByte("React state"); // 1 /*var commandState = */ packet.ReadByte("Command state"); // 1 packet.ReadUInt16("Unknown 2"); // pets -> 0, vehicles -> 0x800 (2048) for (var i = 1; i <= (int)MiscConstants.CreatureMaxSpells + 2; i++) // Read pet/vehicle spell ids { var spell16 = packet.ReadUInt16(); var spell8 = packet.ReadByte(); var slotid = packet.ReadByte(); var spellId = spell16 + (spell8 << 16); if (!isPet) // cleanup vehicle spells (start at 1 instead 8, { // and do not print spells with id 0) slotid -= (int)MiscConstants.PetSpellsOffset - 1; if (spellId == 0) continue; } packet.WriteLine("Spell " + slotid + ": " + StoreGetters.GetName(StoreNameType.Spell, spellId)); } var spellCount = packet.ReadByte(); // vehicles -> 0, pets -> != 0. Could this be auras? packet.WriteLine("Spell count: " + spellCount); for (var i = 0; i < spellCount; i++) { // Sent as int32 var spellId = packet.ReadUInt16(); var active = packet.ReadInt16(); packet.WriteLine("Spell " + i + ": " + StoreGetters.GetName(StoreNameType.Spell, spellId) + ", active: " + active); } var cdCount = packet.ReadByte(); packet.WriteLine("Cooldown count: " + cdCount); for (var i = 0; i < cdCount; i++) { var spellId = ClientVersion.AddedInVersion(ClientVersionBuild.V3_1_0_9767) ? packet.ReadInt32() : packet.ReadUInt16(); var category = packet.ReadUInt16(); var cooldown = packet.ReadUInt32(); var categoryCooldown = packet.ReadUInt32(); packet.WriteLine("Cooldown: Spell: " + StoreGetters.GetName(StoreNameType.Spell, spellId) + " category: " + category + " cooldown: " + cooldown + " category cooldown: " + categoryCooldown); } }
public static void HandlePetSetAction(Packet packet) { var i = 0; packet.ReadGuid("GUID"); while (packet.CanRead()) { packet.ReadUInt32("Position", i); var action = (uint)packet.ReadUInt16() + (packet.ReadByte() << 16); packet.WriteLine("[{0}] Action: {1}", i, action); packet.ReadEnum<ActionButtonType>("Type", TypeCode.Byte, i++); } }