public static void HandleClientCharDelete(Packet packet) { var playerGuid = new byte[8]; playerGuid[2] = packet.ReadBit(); playerGuid[1] = packet.ReadBit(); playerGuid[5] = packet.ReadBit(); playerGuid[7] = packet.ReadBit(); playerGuid[6] = packet.ReadBit(); var unknown = packet.ReadBit(); playerGuid[3] = packet.ReadBit(); playerGuid[0] = packet.ReadBit(); playerGuid[4] = packet.ReadBit(); packet.ReadXORByte(playerGuid, 1); packet.ReadXORByte(playerGuid, 3); packet.ReadXORByte(playerGuid, 4); packet.ReadXORByte(playerGuid, 0); packet.ReadXORByte(playerGuid, 7); packet.ReadXORByte(playerGuid, 2); packet.ReadXORByte(playerGuid, 5); packet.ReadXORByte(playerGuid, 6); var guid = new WowGuid64(BitConverter.ToUInt64(playerGuid, 0)); packet.WriteGuid("GUID", playerGuid); }
public void TestConstructor() { var guid = new WowGuid64(1); Assert.IsNotNull(guid); Assert.AreEqual(1, guid.Low); Assert.AreEqual(0, guid.High); }
public void TestGetHashCode() { var guid1 = new WowGuid64(0xF130005C0500105F); var guid15 = new WowGuid64(0xF130005C0500105F); var guid2 = new WowGuid64(0x600000002B2D7C9); Assert.AreEqual(guid1.GetHashCode(), guid15.GetHashCode()); Assert.AreNotEqual(guid1.GetHashCode(), guid2.GetHashCode()); }
public void TestGetHighType() { var guid1 = new WowGuid64(0xF130005C0500105F); var guid2 = new WowGuid64(0x600000002B2D7C9); var guid3 = new WowGuid64(0); Assert.AreEqual(HighGuidType.Creature, guid1.GetHighType()); Assert.AreEqual(HighGuidType.Player, guid2.GetHighType()); Assert.AreEqual(HighGuidType.Null, guid3.GetHighType()); }
public void TestGetLow() { var guid1 = new WowGuid64(0xF130005C0500105F); var guid2 = new WowGuid64(0x600000002B2D7C9); var guid3 = new WowGuid64(0); Assert.AreEqual(0x105F, guid1.GetLow()); Assert.AreEqual(0x2B2D7C9, guid2.GetLow()); Assert.AreEqual(0, guid3.GetLow()); }
public void TestHasEntry() { var guid1 = new WowGuid64(0xF130005C0500105F); var guid2 = new WowGuid64(0x600000002B2D7C9); var guid3 = new WowGuid64(0); Assert.IsTrue(guid1.HasEntry()); Assert.IsFalse(guid2.HasEntry()); Assert.IsFalse(guid3.HasEntry()); }
public void TestGetObjectType() { var guid1 = new WowGuid64(0xF130005C0500105F); var guid2 = new WowGuid64(0x600000002B2D7C9); var guid3 = new WowGuid64(0); Assert.AreEqual(ObjectType.Unit, guid1.GetObjectType()); Assert.AreEqual(ObjectType.Player, guid2.GetObjectType()); Assert.AreEqual(ObjectType.Object, guid3.GetObjectType()); }
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 void TestEquals() { var guid1 = new WowGuid64(0xF130005C0500105F); var guid2 = new WowGuid64(0x600000002B2D7C9); var guid25 = new WowGuid64(0x600000002B2D7C9); var guid3 = new WowGuid64(0); Assert.IsFalse(guid1.Equals(guid2)); Assert.IsTrue(guid2.Equals(guid25)); Assert.IsTrue(guid2.Equals((object)guid25)); Assert.IsFalse(guid2.Equals(new object())); Assert.IsTrue(guid3.Equals(guid3)); }
public static UniversalGuid ToUniversal(this WowGuid64 guid) { return(new UniversalGuid() { Entry = guid.GetEntry(), Type = (UniversalHighGuid)(int)guid.HighGuid.GetHighGuidType(), Guid64 = new UniversalGuid64() { Low = guid.Low, High = guid.High } }); }
public void TestOperators() { var guid1 = new WowGuid64(0xF130005C0500105F); var guid2 = new WowGuid64(0x600000002B2D7C9); var guid3 = new WowGuid64(0); Assert.IsFalse(guid1 == guid2); Assert.IsTrue(guid1 != guid2); #pragma warning disable 1718 Assert.IsTrue(guid3 == guid3); #pragma warning restore 1718 }
public static void HandlePetNameQuery(Packet packet) { var number = new byte[8]; var guid = new byte[8]; guid[6] = packet.ReadBit(); number[4] = packet.ReadBit(); number[6] = packet.ReadBit(); number[5] = packet.ReadBit(); guid[4] = packet.ReadBit(); number[7] = packet.ReadBit(); guid[5] = packet.ReadBit(); guid[3] = packet.ReadBit(); guid[2] = packet.ReadBit(); guid[7] = packet.ReadBit(); number[1] = packet.ReadBit(); number[0] = packet.ReadBit(); number[2] = packet.ReadBit(); number[3] = packet.ReadBit(); guid[1] = packet.ReadBit(); guid[0] = packet.ReadBit(); packet.ReadXORByte(guid, 7); packet.ReadXORByte(number, 2); packet.ReadXORByte(guid, 4); packet.ReadXORByte(guid, 6); packet.ReadXORByte(guid, 5); packet.ReadXORByte(number, 5); packet.ReadXORByte(guid, 3); packet.ReadXORByte(number, 0); packet.ReadXORByte(number, 6); packet.ReadXORByte(guid, 1); packet.ReadXORByte(number, 4); packet.ReadXORByte(guid, 0); packet.ReadXORByte(number, 7); packet.ReadXORByte(number, 1); packet.ReadXORByte(guid, 2); packet.ReadXORByte(number, 3); packet.WriteGuid("Guid2", number); packet.WriteGuid("Guid3", guid); var GUID = new WowGuid64(BitConverter.ToUInt64(guid, 0)); var Number = BitConverter.ToUInt64(number, 0); packet.WriteGuid("Guid", guid); packet.AddValue("Pet Number", Number); // Store temporary name (will be replaced in SMSG_PET_NAME_QUERY_RESPONSE) StoreGetters.AddName(GUID, Number.ToString(CultureInfo.InvariantCulture)); }
public void TestOperators() { var guid1 = new WowGuid64(0xF130005C0500105F); var guid2 = new WowGuid64(0x600000002B2D7C9); var guid3 = new WowGuid64(0); Assert.IsFalse(guid1 == guid2); Assert.IsTrue(guid1 != guid2); #pragma warning disable 1718 // ReSharper disable once EqualExpressionComparison Assert.IsTrue(guid3 == guid3); #pragma warning restore 1718 }
public static void HandleSpellClick(Packet packet) { var guidBytes = new byte[8]; packet.StartBitStream(guidBytes, 7, 4, 0, 3, 6, 5); packet.ReadBit("unk"); packet.StartBitStream(guidBytes, 1, 2); packet.ParseBitStream(guidBytes, 6, 1, 5, 4, 7, 2, 3, 0); packet.WriteGuid("Guid", guidBytes); var guid = new WowGuid64(BitConverter.ToUInt64(guidBytes, 0)); if (guid.GetObjectType() == ObjectType.Unit) { Storage.NpcSpellClicks.Add(guid, packet.TimeSpan); } }
public static void HandleClientCharDelete(Packet packet) { var playerGuid = new byte[8]; playerGuid[1] = packet.ReadBit(); playerGuid[4] = packet.ReadBit(); playerGuid[7] = packet.ReadBit(); playerGuid[5] = packet.ReadBit(); playerGuid[3] = packet.ReadBit(); playerGuid[2] = packet.ReadBit(); playerGuid[0] = packet.ReadBit(); playerGuid[6] = packet.ReadBit(); packet.ParseBitStream(playerGuid, 2, 0, 4, 1, 5, 3, 7, 6); var guid = new WowGuid64(BitConverter.ToUInt64(playerGuid, 0)); packet.WriteGuid("GUID", playerGuid); }
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 = WowGuid64.Empty; } 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 HandleNpcGossip(Packet packet) { var guidBytes = new byte[8]; guidBytes[7] = packet.ReadBit(); guidBytes[6] = packet.ReadBit(); guidBytes[1] = packet.ReadBit(); uint questgossips = packet.ReadBits(19); guidBytes[0] = packet.ReadBit(); guidBytes[4] = packet.ReadBit(); guidBytes[5] = packet.ReadBit(); guidBytes[2] = packet.ReadBit(); guidBytes[3] = packet.ReadBit(); uint amountOfOptions = packet.ReadBits(20); var boxTextLen = new uint[amountOfOptions]; var optionTextLen = new uint[amountOfOptions]; for (int i = 0; i < amountOfOptions; ++i) { boxTextLen[i] = packet.ReadBits(12); optionTextLen[i] = packet.ReadBits(12); } var titleLen = new uint[questgossips]; for (int i = 0; i < questgossips; ++i) { packet.ReadBit("Change Icon", i); titleLen[i] = packet.ReadBits(9); } for (var i = 0; i < questgossips; ++i) { packet.ReadUInt32E <QuestFlagsEx>("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); var gossipOptions = new List <GossipMenuOption>((int)amountOfOptions); var gossipOptionBoxes = new List <GossipMenuOptionBox>((int)amountOfOptions); for (int i = 0; i < amountOfOptions; ++i) { GossipMenuOption gossipMenuOption = new GossipMenuOption(); GossipMenuOptionBox gossipMenuOptionBox = new GossipMenuOptionBox(); gossipMenuOptionBox.BoxMoney = packet.ReadUInt32("Required money", i); gossipMenuOption.OptionText = packet.ReadWoWString("Text", optionTextLen[i], i); gossipMenuOption.OptionIndex = gossipMenuOptionBox.OptionIndex = packet.ReadUInt32("Index", i); gossipMenuOption.OptionIcon = packet.ReadByteE <GossipOptionIcon>("Icon", i); gossipMenuOptionBox.BoxText = packet.ReadWoWString("Box Text", boxTextLen[i], i); gossipMenuOptionBox.BoxCoded = packet.ReadBool("Box", i); gossipOptions.Add(gossipMenuOption); if (!gossipMenuOptionBox.IsEmpty) { gossipOptionBoxes.Add(gossipMenuOptionBox); } } packet.ReadXORByte(guidBytes, 2); uint textId = packet.ReadUInt32("Text Id"); packet.ReadXORByte(guidBytes, 1); packet.ReadXORByte(guidBytes, 5); uint 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); GossipMenu gossip = new GossipMenu { Entry = menuId, TextID = textId }; WowGuid64 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; } } gossipOptions.ForEach(g => { g.MenuId = menuId; Storage.GossipMenuOptions.Add(g, packet.TimeSpan); }); gossipOptionBoxes.ForEach(gb => { gb.MenuId = menuId; Storage.GossipMenuOptionBoxes.Add(gb, packet.TimeSpan); }); Storage.Gossips.Add(gossip, packet.TimeSpan); var lastGossipOption = CoreParsers.NpcHandler.LastGossipOption; if (lastGossipOption.HasSelection) { Storage.GossipMenuOptionActions.Add(new GossipMenuOptionAction { MenuId = lastGossipOption.MenuId, OptionIndex = lastGossipOption.OptionIndex, ActionMenuId = gossip.Entry }, packet.TimeSpan); } packet.AddSniffData(StoreNameType.Gossip, (int)menuId, guid.GetEntry().ToString(CultureInfo.InvariantCulture)); }
public static void HandleCharEnum(Packet packet) { packet.ReadBit("Unk bit"); var unkCounter = packet.ReadBits("Unk Counter", 21); var count = packet.ReadBits("Char count", 16); var charGuids = new byte[count][]; var guildGuids = new byte[count][]; var firstLogins = new bool[count]; var nameLenghts = new uint[count]; for (int c = 0; c < count; ++c) { charGuids[c] = new byte[8]; guildGuids[c] = new byte[8]; guildGuids[c][4] = packet.ReadBit(); charGuids[c][0] = packet.ReadBit(); charGuids[c][3] = packet.ReadBit(); charGuids[c][6] = packet.ReadBit(); guildGuids[c][1] = packet.ReadBit(); charGuids[c][1] = packet.ReadBit(); guildGuids[c][2] = packet.ReadBit(); guildGuids[c][3] = packet.ReadBit(); firstLogins[c] = packet.ReadBit(); charGuids[c][2] = packet.ReadBit(); guildGuids[c][0] = packet.ReadBit(); guildGuids[c][7] = packet.ReadBit(); nameLenghts[c] = packet.ReadBits(6); packet.ReadBit("Unkt Bit"); guildGuids[c][6] = packet.ReadBit(); charGuids[c][4] = packet.ReadBit(); guildGuids[c][5] = packet.ReadBit(); charGuids[c][5] = packet.ReadBit(); charGuids[c][7] = packet.ReadBit(); } packet.ResetBitReader(); for (int c = 0; c < count; ++c) { var pos = new Vector3(); packet.ReadByte("Face", c); packet.ReadXORByte(guildGuids[c], 7); var race = packet.ReadByteE <Race>("Race", c); packet.ReadXORByte(charGuids[c], 5); packet.ReadXORByte(guildGuids[c], 2); packet.ReadXORByte(charGuids[c], 6); packet.ReadInt32E <CharacterFlag>("CharacterFlag", c); var zone = packet.ReadUInt32 <ZoneId>("Zone Id", c); packet.ReadXORByte(guildGuids[c], 3); packet.ReadInt32("Pet Level", c); // v4+112 packet.ReadInt32("Pet Display ID", c); //v4+108 packet.ReadUInt32("Unk 1", c); packet.ReadUInt32("Unk 2", c); packet.ReadXORByte(charGuids[c], 3); packet.ReadXORByte(charGuids[c], 0); packet.ReadByte("Facial Hair", c); packet.ReadByteE <Gender>("Gender", c); packet.ReadXORByte(guildGuids[c], 0); packet.ReadByte("HairStyle", c); var level = packet.ReadByte("Level", c); for (int j = 0; j < 23; ++j) { packet.ReadInt32("Item DisplayID", c, j); packet.ReadInt32("Item EnchantID", c, j); packet.ReadByteE <InventoryType>("Item InventoryType", c, j); } pos.Z = packet.ReadSingle(); packet.ReadXORByte(guildGuids[c], 1); pos.Y = packet.ReadSingle(); packet.ReadByte("Skin", c); packet.ReadByte("List Order", c); //v4+57 packet.ReadXORByte(guildGuids[c], 5); packet.ReadXORByte(charGuids[c], 1); packet.ReadUInt32("Unk 3", c); pos.X = packet.ReadSingle(); var name = packet.ReadWoWString("Name", (int)nameLenghts[c], c); var mapId = packet.ReadInt32("Map", c); packet.ReadInt32("Pet Family", c); // v4+116 packet.ReadByte("Hair Color", c); var klass = packet.ReadByteE <Class>("Class", c); packet.ReadXORByte(guildGuids[c], 4); packet.ReadXORByte(charGuids[c], 2); packet.ReadUInt32E <CustomizationFlag>("CustomizationFlag", c); packet.ReadXORByte(charGuids[c], 7); packet.ReadXORByte(guildGuids[c], 6); packet.ReadXORByte(charGuids[c], 4); var playerGuid = new WowGuid64(BitConverter.ToUInt64(charGuids[c], 0)); packet.AddValue("Position", pos, c); packet.WriteGuid("Character GUID", charGuids[c], c); packet.WriteGuid("Guild GUID", guildGuids[c], c); if (firstLogins[c]) { PlayerCreateInfo startPos = new PlayerCreateInfo { Race = race, Class = klass, Map = (uint)mapId, Zone = zone, Position = pos, Orientation = 0 }; Storage.StartPositions.Add(startPos, packet.TimeSpan); } var playerInfo = new Player { Race = race, Class = klass, Name = name, FirstLogin = firstLogins[c], Level = level }; if (Storage.Objects.ContainsKey(playerGuid)) { Storage.Objects[playerGuid] = new Tuple <WoWObject, TimeSpan?>(playerInfo, packet.TimeSpan); } else { Storage.Objects.Add(playerGuid, playerInfo, packet.TimeSpan); } StoreGetters.AddName(playerGuid, name); } for (var i = 0; i < unkCounter; ++i) { packet.ReadUInt32("Unk int", i); packet.ReadByte("Unk byte", i); } }
public static void HandleVendorInventoryList(Packet packet) { var npcVendor = new NpcVendor(); var guid = new byte[8]; var itemCount = (int)packet.ReadBits(18); guid[0] = packet.ReadBit(); var hasExtendedCost = new bool[itemCount]; var hasCondition = new bool[itemCount]; for (int i = 0; i < itemCount; ++i) { packet.ReadBit("Unk bit", i); hasExtendedCost[i] = !packet.ReadBit(); hasCondition[i] = !packet.ReadBit(); } guid[3] = packet.ReadBit(); guid[7] = packet.ReadBit(); guid[6] = packet.ReadBit(); guid[5] = packet.ReadBit(); guid[2] = packet.ReadBit(); guid[1] = packet.ReadBit(); guid[4] = packet.ReadBit(); packet.ReadXORByte(guid, 7); packet.ReadXORByte(guid, 6); npcVendor.VendorItems = new List <VendorItem>(itemCount); for (int i = 0; i < itemCount; ++i) { var vendorItem = new VendorItem(); vendorItem.Type = packet.ReadUInt32("Type", i); // 1 - item, 2 - currency var buyCount = packet.ReadUInt32("Buy Count", i); var maxCount = packet.ReadInt32("Max Count", i); packet.ReadInt32("Display ID", i); vendorItem.Slot = packet.ReadUInt32("Item Position", i); packet.ReadInt32("Max Durability", i); packet.ReadInt32("Price", i); if (hasExtendedCost[i]) { vendorItem.ExtendedCostId = packet.ReadUInt32("Extended Cost", i); } packet.ReadInt32("Item Upgrade ID", i); vendorItem.ItemId = (uint)packet.ReadEntry <Int32>(StoreNameType.Item, "Item ID", i); if (hasCondition[i]) { packet.ReadInt32("Condition ID", i); } npcVendor.VendorItems.Add(vendorItem); } packet.ReadByte("Byte28"); packet.ReadXORByte(guid, 2); packet.ReadXORByte(guid, 3); packet.ReadXORByte(guid, 5); packet.ReadXORByte(guid, 1); packet.ReadXORByte(guid, 0); packet.ReadXORByte(guid, 4); 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 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.ReadEntry <Int32>(StoreNameType.Spell, "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.ReadEnum <TrainerSpellState>("State", TypeCode.Byte, 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.ReadEnum <TrainerType>("Type", TypeCode.Int32); 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 ReadSpellCastData(Packet packet, params object[] idx) { bool isSpellGo = packet.Opcode == Opcodes.GetOpcode(Opcode.SMSG_SPELL_GO, Direction.ServerToClient); WowGuid targetGUID = new WowGuid64(); var casterGUID = packet.ReadPackedGuid("CasterGUID", idx); packet.ReadPackedGuid("CasterUnit", idx); packet.ReadByte("CastID", idx); var spellId = packet.ReadInt32 <SpellId>("SpellID", idx); CastFlag flags = packet.ReadInt32E <CastFlag>("CastFlags", idx); packet.ReadUInt32("CastFlagsEx", idx); packet.ReadUInt32("CastTime", idx); if (isSpellGo) { var hitTargetsCount = packet.ReadByte("HitTargetsCount", idx); for (var i = 0; i < hitTargetsCount; ++i) { packet.ReadGuid("HitTarget", idx, i); } var missCount = packet.ReadByte("MissStatusCount", idx); for (var i = 0; i < missCount; ++i) { ReadSpellMissStatus(packet, idx, "MissStatus", i); } } TargetFlag targetFlags = TargetFlag.Self; ReadSpellTargetData(packet, ref targetFlags, targetGUID, idx, "Target"); if (flags.HasAnyFlag(CastFlag.PredictedPower)) { packet.ReadUInt32("RemainingPower"); } if (flags.HasAnyFlag(CastFlag.RuneInfo)) { ReadRuneData(packet, idx, "RemainingRunes"); } if (isSpellGo) { if (flags.HasAnyFlag(CastFlag.AdjustMissile)) { ReadMissileTrajectoryResult(packet, idx, "MissileTrajectory"); } } if (flags.HasAnyFlag(CastFlag.Projectile)) { ReadSpellAmmo(packet, idx, "Ammo"); } if (isSpellGo) { if (flags.HasAnyFlag(CastFlag.VisualChain)) { ReadProjectileVisual(packet, idx, "ProjectileVisual"); } if (targetFlags.HasAnyFlag(TargetFlag.DestinationLocation)) { packet.ReadByte("DestLocSpellCastIndex", idx); } if (targetFlags.HasAnyFlag(TargetFlag.ExtraTargets)) { var targetPointsCount = packet.ReadInt32("TargetPointsCount", idx); for (var i = 0; i < targetPointsCount; ++i) { ReadTargetLocation(packet, idx, "TargetPoints", i); } } } else { if (flags.HasAnyFlag(CastFlag.Immunity)) { ReadCreatureImmunities(packet, idx, "Immunities"); } if (flags.HasAnyFlag(CastFlag.HealPrediction)) { ReadSpellHealPrediction(packet, idx, "Predict"); } } if (flags.HasAnyFlag(CastFlag.Unknown21) && !isSpellGo) { NpcSpellClick spellClick = new NpcSpellClick { SpellID = (uint)spellId, CasterGUID = casterGUID, TargetGUID = targetGUID }; Storage.SpellClicks.Add(spellClick, packet.TimeSpan); } if (isSpellGo) { packet.AddSniffData(StoreNameType.Spell, spellId, "SPELL_GO"); } }
public static void HandleAuraUpdate(Packet packet) { var guid = new byte[8]; guid[3] = packet.ReadBit(); guid[6] = packet.ReadBit(); guid[0] = packet.ReadBit(); guid[7] = packet.ReadBit(); guid[5] = packet.ReadBit(); guid[4] = packet.ReadBit(); var bits0 = packet.ReadBits(24); var bit10 = packet.ReadBit(); var hasAura = new bool[bits0]; var hasCasterGUID = new bool[bits0]; var hasMaxDuration = new bool[bits0]; var hasDuration = new bool[bits0]; var bits48 = new uint[bits0]; var casterGUID = new byte[bits0][]; var effectCount = new uint[bits0]; for (var i = 0; i < bits0; ++i) { hasAura[i] = packet.ReadBit(); if (hasAura[i]) { effectCount[i] = packet.ReadBits(22); bits48[i] = packet.ReadBits(22); hasCasterGUID[i] = packet.ReadBit(); if (hasCasterGUID[i]) { casterGUID[i] = new byte[8]; packet.StartBitStream(casterGUID[i], 7, 4, 2, 5, 6, 1, 3, 0); } hasMaxDuration[i] = packet.ReadBit(); hasDuration[i] = packet.ReadBit(); } } guid[1] = packet.ReadBit(); guid[2] = packet.ReadBit(); var auras = new List <Aura>(); for (var i = 0; i < bits0; ++i) { if (hasAura[i]) { var aura = new Aura(); if (hasCasterGUID[i]) { packet.ParseBitStream(casterGUID[i], 0, 3, 7, 1, 2, 5, 4, 6); packet.WriteGuid("Caster GUID", casterGUID[i], i); aura.CasterGuid = new WowGuid64(BitConverter.ToUInt64(casterGUID[i], 0)); } aura.Duration = hasDuration[i] ? packet.ReadInt32("Duration", i) : 0; for (var j = 0; j < bits48[i]; ++j) { packet.ReadSingle("Float3", i, j); } for (var j = 0; j < effectCount[i]; ++j) { packet.ReadSingle("Effect Value", i, j); } aura.Level = packet.ReadUInt16("Caster Level", i); aura.MaxDuration = hasMaxDuration[i] ? packet.ReadInt32("Max Duration", i) : 0; aura.Charges = packet.ReadByte("Charges", i); aura.SpellId = packet.ReadUInt32("Spell Id", i); aura.AuraFlags = packet.ReadByteE <AuraFlagMoP>("Flags", i); packet.ReadInt32("Effect Mask", i); auras.Add(aura); packet.AddSniffData(StoreNameType.Spell, (int)aura.SpellId, "AURA_UPDATE"); } packet.ReadByte("Slot", i); } packet.ParseBitStream(guid, 5, 1, 2, 6, 0, 7, 4, 3); 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 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.ReadEntry <Int32>(StoreNameType.Item, "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 HandleCharEnum(Packet packet) { var count = packet.ReadBits("Char count", 16); var charGuids = new byte[count][]; var guildGuids = new byte[count][]; var firstLogins = new bool[count]; var nameLenghts = new uint[count]; for (int c = 0; c < count; ++c) { charGuids[c] = new byte[8]; guildGuids[c] = new byte[8]; guildGuids[c][3] = packet.ReadBit(); firstLogins[c] = packet.ReadBit(); charGuids[c][6] = packet.ReadBit(); guildGuids[c][1] = packet.ReadBit(); charGuids[c][1] = packet.ReadBit(); charGuids[c][5] = packet.ReadBit(); guildGuids[c][6] = packet.ReadBit(); charGuids[c][7] = packet.ReadBit(); charGuids[c][0] = packet.ReadBit(); guildGuids[c][5] = packet.ReadBit(); charGuids[c][2] = packet.ReadBit(); nameLenghts[c] = packet.ReadBits(6); charGuids[c][4] = packet.ReadBit(); guildGuids[c][4] = packet.ReadBit(); guildGuids[c][2] = packet.ReadBit(); charGuids[c][3] = packet.ReadBit(); guildGuids[c][0] = packet.ReadBit(); guildGuids[c][7] = packet.ReadBit(); } packet.ReadBit("Unk bit"); var count2 = packet.ReadBits("RIDBIT21", 21); packet.ResetBitReader(); for (int c = 0; c < count; ++c) { packet.ReadByte("Skin", c); //v4+61 packet.ReadXORByte(charGuids[c], 2); packet.ReadXORByte(charGuids[c], 7); packet.ReadInt32("Pet Display ID", c); //v4+108 var name = packet.ReadWoWString("Name", (int)nameLenghts[c], c); // v4 + 8 for (int j = 0; j < 23; ++j) { packet.ReadInt32("Item DisplayID", c, j); packet.ReadInt32("Item EnchantID", c, j); packet.ReadByteE <InventoryType>("Item InventoryType", c, j); } packet.ReadXORByte(charGuids[c], 4); packet.ReadXORByte(charGuids[c], 6); var level = packet.ReadByte("Level", c); // v4+66 var y = packet.ReadSingle("Position Y", c); // v4+80 var x = packet.ReadSingle("Position X", c); //v4+76 packet.ReadByte("Face", c); // v4+62 packet.ReadXORByte(guildGuids[c], 0); packet.ReadByte("List Order", c); //v4+57 var zone = packet.ReadUInt32 <ZoneId>("Zone Id", c); packet.ReadXORByte(guildGuids[c], 7); packet.ReadInt32E <CharacterFlag>("CharacterFlag", c); var mapId = packet.ReadInt32 <MapId>("Map Id", c); //v4+72 var race = packet.ReadByteE <Race>("Race", c); //v4+58 var z = packet.ReadSingle("Position Z", c); //v4+84 packet.ReadXORByte(guildGuids[c], 1); packet.ReadByteE <Gender>("Gender", c); //v4+60 packet.ReadXORByte(charGuids[c], 3); packet.ReadByte("Hair Color", c); // v4+64 packet.ReadXORByte(guildGuids[c], 5); var clss = packet.ReadByteE <Class>("Class", c); // v4+59 packet.ReadXORByte(guildGuids[c], 2); packet.ReadXORByte(charGuids[c], 1); packet.ReadUInt32E <CustomizationFlag>("CustomizationFlag", c); //v4+100 packet.ReadByte("Facial Hair", c); // v4+65 packet.ReadXORByte(guildGuids[c], 6); packet.ReadXORByte(charGuids[c], 0); packet.ReadByte("Hair Style", c); // v4+63 packet.ReadXORByte(charGuids[c], 5); packet.ReadInt32("Pet Family", c); // v4+116 packet.ReadXORByte(guildGuids[c], 2); packet.ReadInt32("Pet Level", c); // v4+112 packet.ReadXORByte(guildGuids[c], 4); for (var i = 0; i < count2; ++i) { packet.ReadByte("unk2", i); packet.ReadUInt32("unk1", i); } var playerGuid = new WowGuid64(BitConverter.ToUInt64(charGuids[c], 0)); packet.WriteGuid("Character GUID", charGuids[c], c); packet.WriteGuid("Guild GUID", guildGuids[c], c); if (firstLogins[c]) { var startPos = new StartPosition { Map = (uint)mapId, Position = new Vector3(x, y, z), Zone = zone }; Storage.StartPositions.Add(new Tuple <Race, Class>(race, clss), startPos, packet.TimeSpan); } var playerInfo = new Player { Race = race, Class = clss, Name = name, FirstLogin = firstLogins[c], Level = level }; if (Storage.Objects.ContainsKey(playerGuid)) { Storage.Objects[playerGuid] = new Tuple <WoWObject, TimeSpan?>(playerInfo, packet.TimeSpan); } else { Storage.Objects.Add(playerGuid, playerInfo, packet.TimeSpan); } StoreGetters.AddName(playerGuid, name); } }
public static void HandleAuraUpdate(Packet packet) { var guid = new byte[8]; var guid2 = new byte[8]; guid[1] = packet.ReadBit(); var hasPowerData = packet.ReadBit(); uint bits3C = 0; if (hasPowerData) { packet.StartBitStream(guid2, 1, 5, 6); bits3C = packet.ReadBits(21); packet.StartBitStream(guid2, 2, 3, 7, 0, 4); } var bits4 = packet.ReadBits(24); guid[6] = packet.ReadBit(); 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][]; 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], 5, 7, 4, 1, 6, 0, 3, 2); } hasDuration[i] = packet.ReadBit(); } } packet.StartBitStream(guid, 2, 3, 7, 4); packet.ReadBit("Is AURA_UPDATE_ALL"); packet.StartBitStream(guid, 0, 5); packet.ResetBitReader(); var auras = new List <Aura>(); for (var i = 0; i < bits4; ++i) { if (hasAura[i]) { var aura = new Aura(); if (hasCasterGUID[i]) { packet.ParseBitStream(casterGUID[i], 2, 7, 6, 1, 4, 0, 5, 3); packet.WriteGuid("Caster GUID", casterGUID[i], i); aura.CasterGuid = new WowGuid64(BitConverter.ToUInt64(casterGUID[i], 0)); } else { aura.CasterGuid = new WowGuid64(); } aura.Charges = packet.ReadByte("Charges", i); if (hasDuration[i]) { aura.Duration = packet.ReadInt32("Duration", i); } else { aura.Duration = 0; } aura.SpellId = packet.ReadUInt32("Spell Id", i); aura.AuraFlags = packet.ReadEnum <AuraFlagMoP>("Flags", TypeCode.Byte, i); for (var j = 0; j < effectCount[i]; ++j) { packet.ReadSingle("Effect Value", i, j); } packet.ReadInt32("Effect Mask", i); if (hasMaxDuration[i]) { aura.MaxDuration = packet.ReadInt32("Max Duration", i); } else { aura.MaxDuration = 0; } 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.ReadXORBytes(guid2, 7, 0); for (var i = 0; i < bits3C; ++i) { packet.ReadEnum <PowerType>("Power Type", TypeCode.UInt32, i); packet.ReadInt32("Power Value", i); } packet.ReadXORBytes(guid2, 2, 5); packet.ReadInt32("Attack power"); packet.ReadInt32("Spell power"); packet.ReadXORBytes(guid2, 6, 4, 3, 1); packet.ReadInt32("Current Health"); packet.WriteGuid("PowerUnitGUID", guid2); } packet.ParseBitStream(guid, 0, 5, 7, 2, 1, 4, 3, 6); 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); } } } }