public void TestGetEntry() { var guid1 = new WowGuid64(0xF130005C0500105F); var guid2 = new WowGuid64(0x600000002B2D7C9); var guid3 = new WowGuid64(0); Assert.AreEqual(0x5C05, guid1.GetEntry()); Assert.AreEqual(0, guid2.GetEntry()); Assert.AreEqual(0, guid3.GetEntry()); }
public void TestGetEntry() { ClientVersion.SetVersion(ClientVersionBuild.V3_3_5a_12340); var guid1 = new WowGuid64(0xF130005C0500105F); var guid2 = new WowGuid64(0x600000002B2D7C9); var guid3 = new WowGuid64(0); Assert.AreEqual(0x5C05, guid1.GetEntry()); Assert.AreEqual(0, guid2.GetEntry()); Assert.AreEqual(0, guid3.GetEntry()); }
public static void HandleVendorInventoryList(Packet packet) { var npcVendor = new NpcVendor(); var guid = new byte[8]; guid[4] = packet.ReadBit(); var itemCount = packet.ReadBits(18); var hasCondition = new bool[itemCount]; var hasExtendedCost = new bool[itemCount]; for (int i = 0; i < itemCount; ++i) { packet.ReadBit("Unk bit", i); hasCondition[i]= !packet.ReadBit(); hasExtendedCost[i] = !packet.ReadBit(); } guid[1] = packet.ReadBit(); guid[6] = packet.ReadBit(); guid[2] = packet.ReadBit(); guid[5] = packet.ReadBit(); guid[7] = packet.ReadBit(); guid[0] = packet.ReadBit(); guid[3] = packet.ReadBit(); packet.ReadXORByte(guid, 3); npcVendor.VendorItems = new List<VendorItem>((int)itemCount); for (int i = 0; i < itemCount; ++i) { var vendorItem = new VendorItem(); packet.ReadInt32("Max Durability", i); vendorItem.Type = packet.ReadUInt32("Type", i); // 1 - item, 2 - currency var buyCount = packet.ReadUInt32("Buy Count", i); if (hasExtendedCost[i]) vendorItem.ExtendedCostId = packet.ReadUInt32("Extended Cost", i); packet.ReadInt32("Price", i); vendorItem.ItemId = (uint)packet.ReadInt32<ItemId>("Item ID", i); vendorItem.Slot = packet.ReadUInt32("Item Position", i); if (hasCondition[i]) packet.ReadInt32("Condition ID", i); var maxCount = packet.ReadInt32("Max Count", i); packet.ReadInt32("Item Upgrade ID", i); packet.ReadInt32("Display ID", i); npcVendor.VendorItems.Add(vendorItem); } packet.ReadXORByte(guid, 6); packet.ReadXORByte(guid, 0); packet.ReadXORByte(guid, 2); packet.ReadXORByte(guid, 5); packet.ReadByte("Byte10"); packet.ReadXORByte(guid, 1); packet.ReadXORByte(guid, 4); packet.ReadXORByte(guid, 7); packet.WriteGuid("Guid", guid); var vendorGUID = new WowGuid64(BitConverter.ToUInt64(guid, 0)); Storage.NpcVendors.Add(vendorGUID.GetEntry(), npcVendor, packet.TimeSpan); }
public static void HandleNpcGossip(Packet packet) { var gossip = new Gossip(); var guidBytes = new byte[8]; guidBytes[7] = packet.ReadBit(); guidBytes[6] = packet.ReadBit(); guidBytes[1] = packet.ReadBit(); var questgossips = packet.ReadBits(19); guidBytes[0] = packet.ReadBit(); guidBytes[4] = packet.ReadBit(); guidBytes[5] = packet.ReadBit(); guidBytes[2] = packet.ReadBit(); guidBytes[3] = packet.ReadBit(); var amountOfOptions = packet.ReadBits(20); var boxTextLen = new uint[amountOfOptions]; var optionTextLen = new uint[amountOfOptions]; for (var i = 0; i < amountOfOptions; ++i) { boxTextLen[i] = packet.ReadBits(12); optionTextLen[i] = packet.ReadBits(12); } var titleLen = new uint[questgossips]; for (var i = 0; i < questgossips; ++i) { packet.ReadBit("Change Icon", i); titleLen[i] = packet.ReadBits(9); } for (var i = 0; i < questgossips; ++i) { packet.ReadUInt32E<QuestFlags2>("Flags 2", i); packet.ReadUInt32<QuestId>("Quest ID", i); packet.ReadInt32("Level", i); packet.ReadUInt32("Icon", i); packet.ReadUInt32E<QuestFlags>("Flags", i); packet.ReadWoWString("Title", titleLen[i], i); } packet.ReadXORByte(guidBytes, 6); gossip.GossipOptions = new List<GossipOption>((int)amountOfOptions); for (var i = 0; i < amountOfOptions; ++i) { var gossipOption = new GossipOption { RequiredMoney = packet.ReadUInt32("Required money", i), OptionText = packet.ReadWoWString("Text", optionTextLen[i], i), Index = packet.ReadUInt32("Index", i), OptionIcon = packet.ReadByteE<GossipOptionIcon>("Icon", i), BoxText = packet.ReadWoWString("Box Text", boxTextLen[i], i), Box = packet.ReadBool("Box", i) }; gossip.GossipOptions.Add(gossipOption); } packet.ReadXORByte(guidBytes, 2); var textId = packet.ReadUInt32("Text Id"); packet.ReadXORByte(guidBytes, 1); packet.ReadXORByte(guidBytes, 5); var menuId = packet.ReadUInt32("Menu Id"); packet.ReadUInt32("Friendship Faction"); packet.ReadXORByte(guidBytes, 4); packet.ReadXORByte(guidBytes, 7); packet.ReadXORByte(guidBytes, 3); packet.ReadXORByte(guidBytes, 0); packet.WriteGuid("Guid", guidBytes); var guid = new WowGuid64(BitConverter.ToUInt64(guidBytes, 0)); gossip.ObjectType = guid.GetObjectType(); gossip.ObjectEntry = guid.GetEntry(); if (guid.GetObjectType() == ObjectType.Unit) if (Storage.Objects.ContainsKey(guid)) ((Unit)Storage.Objects[guid].Item1).GossipId = menuId; if (Storage.Gossips.ContainsKey(Tuple.Create(menuId, textId))) { var oldGossipOptions = Storage.Gossips[Tuple.Create(menuId, textId)]; if (oldGossipOptions != null) { foreach (var gossipOptions in gossip.GossipOptions) oldGossipOptions.Item1.GossipOptions.Add(gossipOptions); } } else Storage.Gossips.Add(Tuple.Create(menuId, textId), gossip, packet.TimeSpan); packet.AddSniffData(StoreNameType.Gossip, (int)menuId, guid.GetEntry().ToString(CultureInfo.InvariantCulture)); }
public static void HandleVendorInventoryList(Packet packet) { var npcVendor = new NpcVendor(); var guid = new byte[8]; guid[5] = packet.ReadBit(); guid[7] = packet.ReadBit(); guid[1] = packet.ReadBit(); guid[3] = packet.ReadBit(); guid[6] = packet.ReadBit(); var itemCount = packet.ReadBits(18); var unkBit = new uint[itemCount]; var hasExtendedCost = new bool[itemCount]; var hasCondition = new bool[itemCount]; for (var i = 0; i < itemCount; ++i) { unkBit[i] = packet.ReadBit(); hasExtendedCost[i] = !packet.ReadBit(); // +44 hasCondition[i] = !packet.ReadBit(); // +36 } guid[4] = packet.ReadBit(); guid[0] = packet.ReadBit(); guid[2] = packet.ReadBit(); packet.ReadByte("Byte10"); npcVendor.VendorItems = new List<VendorItem>((int)itemCount); for (var i = 0; i < itemCount; ++i) { var vendorItem = new VendorItem(); packet.AddValue("unkBit", unkBit[i], i); packet.ReadInt32("Max Durability", i); // +16 packet.ReadInt32("Price", i); // +20 vendorItem.Type = packet.ReadUInt32("Type", i); // +4 var maxCount = packet.ReadInt32("Max Count", i); // +24 packet.ReadInt32("Display ID", i); // +12 var buyCount = packet.ReadUInt32("Buy Count", i); // +28 vendorItem.ItemId = (uint)packet.ReadInt32<ItemId>("Item ID", i); // +8 if (hasExtendedCost[i]) vendorItem.ExtendedCostId = packet.ReadUInt32("Extended Cost", i); // +36 packet.ReadInt32("Item Upgrade ID", i); // +32 if (hasCondition[i]) packet.ReadInt32("Condition ID", i); // +40 vendorItem.Slot = packet.ReadUInt32("Item Position", i); // +0 npcVendor.VendorItems.Add(vendorItem); } packet.ParseBitStream(guid, 3, 7, 0, 6, 2, 1, 4, 5); packet.WriteGuid("Guid", guid); var vendorGUID = new WowGuid64(BitConverter.ToUInt64(guid, 0)); Storage.NpcVendors.Add(vendorGUID.GetEntry(), npcVendor, packet.TimeSpan); }
public static void HandleServerTrainerList(Packet packet) { var npcTrainer = new NpcTrainer(); var guid = new byte[8]; guid[4] = packet.ReadBit(); guid[5] = packet.ReadBit(); var count = (int)packet.ReadBits(19); var titleLen = packet.ReadBits(11); guid[6] = packet.ReadBit(); guid[2] = packet.ReadBit(); guid[7] = packet.ReadBit(); guid[1] = packet.ReadBit(); guid[3] = packet.ReadBit(); guid[0] = packet.ReadBit(); packet.ReadXORByte(guid, 4); npcTrainer.TrainerSpells = new List<TrainerSpell>(count); for (var i = 0; i < count; ++i) { var trainerSpell = new TrainerSpell(); trainerSpell.RequiredLevel = packet.ReadByte("Required Level", i); trainerSpell.Cost = packet.ReadUInt32("Cost", i); trainerSpell.Spell = (uint)packet.ReadInt32<SpellId>("Spell ID", i); for (var j = 0; j < 3; ++j) packet.ReadInt32("Int818", i, j); trainerSpell.RequiredSkill = packet.ReadUInt32("Required Skill", i); trainerSpell.RequiredSkillLevel = packet.ReadUInt32("Required Skill Level", i); packet.ReadByteE<TrainerSpellState>("State", i); npcTrainer.TrainerSpells.Add(trainerSpell); } npcTrainer.Title = packet.ReadWoWString("Title", titleLen); packet.ReadXORByte(guid, 6); packet.ReadXORByte(guid, 7); packet.ReadXORByte(guid, 1); packet.ReadXORByte(guid, 3); packet.ReadInt32("Unk Int32"); // Same unk exists in CMSG_TRAINER_BUY_SPELL packet.ReadXORByte(guid, 5); packet.ReadXORByte(guid, 0); packet.ReadXORByte(guid, 2); npcTrainer.Type = packet.ReadInt32E<TrainerType>("Type"); packet.WriteGuid("Guid", guid); var GUID = new WowGuid64(BitConverter.ToUInt64(guid, 0)); if (Storage.NpcTrainers.ContainsKey(GUID.GetEntry())) { var oldTrainer = Storage.NpcTrainers[GUID.GetEntry()]; if (oldTrainer != null) { foreach (var trainerSpell in npcTrainer.TrainerSpells) oldTrainer.Item1.TrainerSpells.Add(trainerSpell); } } else Storage.NpcTrainers.Add(GUID.GetEntry(), npcTrainer, packet.TimeSpan); }
public static void HandleMessageChat(Packet packet) { var text = new CreatureText(); uint entry = 0; //text.Language = packet.ReadEnum<Language>("Language", TypeCode.Int32); var hasSenderName = !packet.ReadBit("!hasSenderName"); packet.ReadBit("Show only in bubble"); // 0 Show in chat log, 1 for showing only in bubble var SenderLen = 0u; if (hasSenderName) SenderLen = packet.ReadBits("SenderLen", 11); packet.ReadBit("!unk48*4"); // unk52*4 = 0; var hasChannelName = !packet.ReadBit("!hasChannelName"); packet.ReadBit("unk5273*4"); var has1494 = !packet.ReadBit("!unk1494h"); // dword ptr [esi+1494h] = ("has unk1494h") ? 0 : ds:dword_D26EA8 var chatTag = !packet.ReadBit("!chatTag"); // 5264*2 var hasRealmID1 = !packet.ReadBit("!hasRealmID1"); // 56 var guid4 = packet.StartBitStream(0, 1, 5, 4, 3, 2, 6, 7); if (chatTag) packet.ReadBits("chatTag", 9); // 5264*2 packet.ReadBit("!unk40*4"); // unk44*4 = 0 var guid3 = packet.StartBitStream(7, 6, 1, 4, 0, 2, 3, 5); packet.ReadBit("!unk24*4"); // unk28*4 = 0 var hasLanguage = !packet.ReadBit("!hasLanguage"); // 17 var hasPrefix = !packet.ReadBit("!hasPrefix"); var guid = packet.StartBitStream(0, 3, 7, 2, 1, 5, 4, 6); var hasAchievementID = !packet.ReadBit("!hasAchievementID"); // 5260*4 var hasMessage = !packet.ReadBit("!hasMessage"); // 2259 var ChannelLen = 0u; if (hasChannelName) ChannelLen = packet.ReadBits("ChannelLen", 7); // 2134 var MessageLen = 0u; if (hasMessage) MessageLen = packet.ReadBits("MessageLen", 12); var hasReceiverName = !packet.ReadBit("!hasReceiverName"); // 1089 var PrefixLen = 0u; if (hasPrefix) PrefixLen = packet.ReadBits("PrefixLen", 5); // 2114*4 var hasRealmID2 = !packet.ReadBit("!hasRealmID2"); // 60 var ReceiverLen = 0u; if (hasReceiverName) ReceiverLen = packet.ReadBits("ReceiverLen", 11); packet.ReadBit("!unk32*4"); // unk36 = 0 var guid2 = packet.StartBitStream(2, 5, 7, 4, 0, 1, 3, 6); packet.ParseBitStream(guid2, 4, 5, 7, 3, 2, 6, 0, 1); if (hasChannelName) packet.ReadWoWString("ChannelName", ChannelLen); if (hasPrefix) packet.ReadWoWString("Prefix", PrefixLen); if (has1494) packet.ReadSingle("unk1494"); packet.ParseBitStream(guid, 4, 7, 1, 5, 0, 6, 2, 3); var unitGuid = new WowGuid64(BitConverter.ToUInt64(guid, 0)); if (unitGuid.GetObjectType() == ObjectType.Unit) entry = unitGuid.GetEntry(); text.Type = (ChatMessageType)packet.ReadByteE<ChatMessageType548>("Type"); if (hasAchievementID) packet.ReadUInt32("AchievementID"); packet.ParseBitStream(guid4, 1, 3, 4, 6, 0, 2, 5, 7); packet.ParseBitStream(guid3, 2, 5, 3, 6, 7, 4, 1, 0); if (hasLanguage) packet.ReadByte("Language"); if (hasRealmID2) packet.ReadInt32("RealmID2"); // 60 if (hasMessage) text.Text = packet.ReadWoWString("Message", MessageLen); if (hasReceiverName) text.ReceiverName = packet.ReadWoWString("Receiver Name", ReceiverLen); if (hasSenderName) text.SenderName = packet.ReadWoWString("Sender Name", SenderLen); if (hasRealmID1) packet.ReadInt32("RealmID1"); // 56 text.SenderGUID = packet.WriteGuid("SenderGUID", guid); text.ReceiverGUID = packet.WriteGuid("ReceiverGUID", guid3); packet.WriteGuid("GuildGUID", guid2); packet.WriteGuid("GroupGUID", guid4); if (text.SenderGUID.GetObjectType() == ObjectType.Unit) entry = text.SenderGUID.GetEntry(); else if (text.ReceiverGUID.GetObjectType() == ObjectType.Unit) entry = text.ReceiverGUID.GetEntry(); if (entry != 0) Storage.CreatureTexts.Add(entry, text, packet.TimeSpan); }