private void WritePreviewCharSet(Span <byte> target, IAppearanceData appearanceData) { ItemAppearance[] itemArray = new ItemAppearance[InventoryConstants.BootsSlot + 1]; for (byte i = 0; i < itemArray.Length; i++) { itemArray[i] = appearanceData.EquippedItems.FirstOrDefault(item => item.ItemSlot == i && item.Definition.Number < 16); } target[0] = (byte)(appearanceData.CharacterClass.Number << 3); target[0] |= (byte)appearanceData.Pose; this.SetHand(target, itemArray[InventoryConstants.LeftHandSlot], 1); this.SetHand(target, itemArray[InventoryConstants.RightHandSlot], 2); this.SetArmorPiece(target, itemArray[InventoryConstants.HelmSlot], 3, true); this.SetArmorPiece(target, itemArray[InventoryConstants.ArmorSlot], 3, false); this.SetArmorPiece(target, itemArray[InventoryConstants.PantsSlot], 4, true); this.SetArmorPiece(target, itemArray[InventoryConstants.GlovesSlot], 4, false); this.SetArmorPiece(target, itemArray[InventoryConstants.BootsSlot], 5, true); var wing = appearanceData.EquippedItems.FirstOrDefault(item => item.ItemSlot == InventoryConstants.WingsSlot && item.Definition.Number < 3); var pet = appearanceData.EquippedItems.FirstOrDefault(item => item.ItemSlot == InventoryConstants.PetSlot && item.Definition.Number < 3); target[5] |= (byte)((wing?.Definition.Number & 0x03) << 2 ?? 0b1100); target[5] |= (byte)(pet?.Definition.Number & 0x03 ?? 0b0011); this.SetItemLevels(target, itemArray); }
private byte[] GetPreviewCharSet(CharacterClass characterClass, IEnumerable <ItemAppearance> equippedItems) { byte[] preview = new byte[18]; ItemAppearance[] itemArray = new ItemAppearance[12]; for (byte i = 0; i < itemArray.Length; i++) { itemArray[i] = equippedItems.FirstOrDefault(item => item.ItemSlot == i); } preview[0] = (byte)(characterClass.Number << 3 & 0xF8); this.SetHand(preview, itemArray[InventoryConstants.LeftHandSlot], 1, 12); this.SetHand(preview, itemArray[InventoryConstants.RightHandSlot], 2, 13); this.SetArmorPiece(preview, itemArray[InventoryConstants.HelmSlot], 3, true, 0x80, 13, false); this.SetArmorPiece(preview, itemArray[InventoryConstants.ArmorSlot], 3, false, 0x40, 14, true); this.SetArmorPiece(preview, itemArray[InventoryConstants.PantsSlot], 4, true, 0x20, 14, false); this.SetArmorPiece(preview, itemArray[InventoryConstants.GlovesSlot], 4, false, 0x10, 15, true); this.SetArmorPiece(preview, itemArray[InventoryConstants.BootsSlot], 5, true, 0x08, 15, false); this.SetItemLevels(preview, itemArray); this.SetAncientSetCompleteness(preview, itemArray); this.AddWing(preview, itemArray[InventoryConstants.WingsSlot]); this.AddPet(preview, itemArray[InventoryConstants.PetSlot]); return(preview); }
private void WritePreviewCharSet(Span <byte> target, IAppearanceData appearanceData) { ItemAppearance[] itemArray = new ItemAppearance[InventoryConstants.EquippableSlotsCount]; for (byte i = 0; i < itemArray.Length; i++) { itemArray[i] = appearanceData.EquippedItems.FirstOrDefault(item => item.ItemSlot == i); } target[0] = (byte)(appearanceData.CharacterClass.Number << 3 & 0xF8); target[0] |= (byte)appearanceData.Pose; this.SetHand(target, itemArray[InventoryConstants.LeftHandSlot], 1, 12); this.SetHand(target, itemArray[InventoryConstants.RightHandSlot], 2, 13); this.SetArmorPiece(target, itemArray[InventoryConstants.HelmSlot], 3, true, 0x80, 13, false); this.SetArmorPiece(target, itemArray[InventoryConstants.ArmorSlot], 3, false, 0x40, 14, true); this.SetArmorPiece(target, itemArray[InventoryConstants.PantsSlot], 4, true, 0x20, 14, false); this.SetArmorPiece(target, itemArray[InventoryConstants.GlovesSlot], 4, false, 0x10, 15, true); this.SetArmorPiece(target, itemArray[InventoryConstants.BootsSlot], 5, true, 0x08, 15, false); this.SetItemLevels(target, itemArray); if (appearanceData.FullAncientSetEquipped) { target[11] |= 0x01; } this.AddWing(target, itemArray[InventoryConstants.WingsSlot]); this.AddPet(target, itemArray[InventoryConstants.PetSlot]); }
private void WritePreviewCharSet(Span <byte> target, CharacterClass characterClass, IEnumerable <ItemAppearance> equippedItems) { ItemAppearance[] itemArray = new ItemAppearance[InventoryConstants.EquippableSlotsCount]; for (byte i = 0; i < itemArray.Length; i++) { itemArray[i] = equippedItems.FirstOrDefault(item => item.ItemSlot == i); } target[0] = (byte)(characterClass.Number << 3 & 0xF8); this.SetHand(target, itemArray[InventoryConstants.LeftHandSlot], 1, 12); this.SetHand(target, itemArray[InventoryConstants.RightHandSlot], 2, 13); this.SetArmorPiece(target, itemArray[InventoryConstants.HelmSlot], 3, true, 0x80, 13, false); this.SetArmorPiece(target, itemArray[InventoryConstants.ArmorSlot], 3, false, 0x40, 14, true); this.SetArmorPiece(target, itemArray[InventoryConstants.PantsSlot], 4, true, 0x20, 14, false); this.SetArmorPiece(target, itemArray[InventoryConstants.GlovesSlot], 4, false, 0x10, 15, true); this.SetArmorPiece(target, itemArray[InventoryConstants.BootsSlot], 5, true, 0x08, 15, false); this.SetItemLevels(target, itemArray); this.SetAncientSetCompleteness(target, itemArray); this.AddWing(target, itemArray[InventoryConstants.WingsSlot]); this.AddPet(target, itemArray[InventoryConstants.PetSlot]); }
/// <summary> /// Creates a persistent instance of the given <see cref="ItemAppearance"/> and returns it. /// </summary> /// <param name="itemAppearance">The item appearance.</param> /// <param name="persistenceContext">The persistence context where the object should be added.</param> /// <returns>A persistent instance of the given <see cref="ItemAppearance"/>.</returns> public static ItemAppearance MakePersistent(this ItemAppearance itemAppearance, IContext persistenceContext) { var persistent = persistenceContext.CreateNew <ItemAppearance>(); persistent.ItemSlot = itemAppearance.ItemSlot; persistent.Definition = itemAppearance.Definition; persistent.Level = itemAppearance.Level; itemAppearance.VisibleOptions.ForEach(o => persistent.VisibleOptions.Add(o)); return(persistent); }
private void SetHand(Span <byte> preview, ItemAppearance item, int index) { if (item == null) { preview[index] = 0xFF; } else { preview[index] = (byte)item.Definition.Number; preview[index] |= (byte)(item.Definition.Group << 4); } }
private void SetArmorPiece(Span <byte> preview, ItemAppearance item, int index, bool highNibble) { if (item == null) { // if the item is not equipped every index bit is set to 1 preview[index] |= highNibble ? this.GetOrMaskForHighNibble(0x0F) : this.GetOrMaskForLowNibble(0x0F); } else { preview[index] |= highNibble ? this.GetOrMaskForHighNibble(item.Definition.Number) : this.GetOrMaskForLowNibble(item.Definition.Number); } }
private void SetHand(byte[] preview, ItemAppearance item, int indexIndex, int groupIndex) { if (item == null) { preview[indexIndex] = 0xFF; preview[groupIndex] |= 0xF0; } else { preview[indexIndex] = (byte)item.Definition.Number; preview[groupIndex] |= (byte)(item.Definition.Group << 5); } }
private void SetHand(byte[] preview, ItemAppearance item, int indexIndex, int groupIndex) { if (item == null) { preview[indexIndex] = 0xFF; preview[groupIndex] |= 0xF0; } else { preview[indexIndex] = (byte)item.Index; preview[groupIndex] |= (byte)((item.Group << 4) & 0xF0); } }
private void SetArmorPiece(Span <byte> preview, ItemAppearance item, int firstIndex, bool firstIndexHigh, byte secondIndexMask, int thirdIndex, bool thirdIndexHigh) { if (item == null) { // if the item is not equipped every index bit is set to 1 preview[firstIndex] |= firstIndexHigh ? this.GetOrMaskForHighNibble(0x0F) : this.GetOrMaskForLowNibble(0x0F); preview[9] |= secondIndexMask; preview[thirdIndex] |= thirdIndexHigh ? this.GetOrMaskForHighNibble(0x0F) : this.GetOrMaskForLowNibble(0x0F); } else { // item id preview[firstIndex] |= firstIndexHigh ? this.GetOrMaskForHighNibble(item.Definition.Number) : this.GetOrMaskForLowNibble(item.Definition.Number); byte multi = (byte)(item.Definition.Number / 16); if (multi > 0) { byte bit1 = (byte)(multi % 2); byte byte2 = (byte)(multi / 2); if (bit1 == 1) { preview[9] |= secondIndexMask; } if (byte2 > 0) { preview[thirdIndex] |= byte2; } } // exc bit if (this.IsExcellent(item)) { preview[10] |= secondIndexMask; } // ancient bit if (this.IsAncient(item)) { preview[11] |= secondIndexMask; } } }
private void SetArmorPiece(byte[] preview, ItemAppearance item, int firstIndex, bool firstIndexHigh, byte secondIndexMask, int thirdIndex, bool thirdIndexHigh) { if (item == null) { // if the item is not equipped every index bit is set to 1 preview[firstIndex] |= (byte)(0x0F << (firstIndexHigh ? 4 : 0)); preview[9] |= secondIndexMask; preview[thirdIndex] |= (byte)(0x0F << (thirdIndexHigh ? 4 : 0)); } else { // item id preview[firstIndex] = (byte)((item.Index << (firstIndexHigh ? 4 : 0)) & (0x0F << (firstIndexHigh ? 4 : 0))); byte multi = (byte)(item.Index / 16); if (multi > 0) { byte bit1 = (byte)(multi % 2); byte byte2 = (byte)(multi / 2); if (bit1 == 1) { preview[9] |= secondIndexMask; } if (byte2 > 0) { preview[thirdIndex] = byte2; } } // exc bit if (this.IsExcellent(item)) { preview[10] |= secondIndexMask; } // ancient bit if (this.IsAncient(item)) { preview[11] |= secondIndexMask; } } }
private void SetArmorItemIndex(Span <byte> preview, ItemAppearance item, int firstIndex, bool firstIndexHigh, byte secondIndexMask, int thirdIndex, bool thirdIndexHigh) { preview[firstIndex] |= firstIndexHigh ? this.GetOrMaskForHighNibble(item.Definition.Number) : this.GetOrMaskForLowNibble(item.Definition.Number); byte multi = (byte)(item.Definition.Number / 16); if (multi > 0) { byte bit1 = (byte)(multi % 2); byte byte2 = (byte)(multi / 2); if (bit1 == 1) { preview[9] |= secondIndexMask; } if (byte2 > 0) { preview[thirdIndex] |= thirdIndexHigh ? this.GetOrMaskForHighNibble(byte2) : this.GetOrMaskForLowNibble(byte2); } } }
private void SetArmorPiece(Span <byte> preview, ItemAppearance item, int firstIndex, bool firstIndexHigh, byte secondIndexMask, int thirdIndex, bool thirdIndexHigh) { if (item == null) { this.SetEmptyArmor(preview, firstIndex, firstIndexHigh, secondIndexMask, thirdIndex, thirdIndexHigh); } else { // item id this.SetArmorItemIndex(preview, item, firstIndex, firstIndexHigh, secondIndexMask, thirdIndex, thirdIndexHigh); // exc bit if (this.IsExcellent(item)) { preview[10] |= secondIndexMask; } // ancient bit if (this.IsAncient(item)) { preview[11] |= secondIndexMask; } } }
private bool IsAncient(ItemAppearance item) { return(item.VisibleOptions.Contains(ItemOptionTypes.AncientOption)); }
private bool IsExcellent(ItemAppearance item) { return(item.VisibleOptions.Contains(ItemOptionTypes.Excellent)); }
private void AddPet(Span <byte> preview, ItemAppearance pet) { if (pet == null) { preview[5] |= 0b0000_0011; return; } switch ((PetIndex)pet.Definition.Number) { case PetIndex.Angel: case PetIndex.Imp: case PetIndex.Unicorn: preview[5] |= (byte)pet.Definition.Number; break; case PetIndex.Dinorant: preview[5] |= 0x03; preview[10] |= 0x01; break; case PetIndex.DarkHorse: preview[5] = 0x03; preview[12] |= 0x01; break; case PetIndex.Fenrir: preview[5] |= 0x03; preview[10] &= 0xFE; preview[12] &= 0xFE; preview[12] |= 0x04; preview[16] = 0x00; if (pet.VisibleOptions.Contains(ItemOptionTypes.BlackFenrir)) { preview[16] |= 0x01; } if (pet.VisibleOptions.Contains(ItemOptionTypes.BlueFenrir)) { preview[16] |= 0x02; } if (pet.VisibleOptions.Contains(ItemOptionTypes.GoldFenrir)) { preview[17] |= 0x01; } break; default: preview[5] |= 0x03; break; } switch ((PetIndex)pet.Definition.Number) { case PetIndex.Panda: preview[16] |= 0xE0; break; case PetIndex.PetUnicorn: preview[16] |= 0xA0; break; case PetIndex.Skeleton: preview[16] |= 0x60; break; case PetIndex.Rudolph: preview[16] |= 0x80; break; case PetIndex.SpiritOfGuardian: preview[16] |= 0x40; break; case PetIndex.Demon: preview[16] |= 0x20; break; default: // no further flag required. break; } }
private void AddWing(Span <byte> preview, ItemAppearance wing) { if (wing == null) { return; } switch ((WingIndex)wing.Definition.Number) { case WingIndex.WingsOfElf: case WingIndex.WingsOfHeaven: case WingIndex.WingsOfSatan: case WingIndex.WingsOfMistery: preview[5] |= 0x04; break; case WingIndex.WingsOfSpirit: case WingIndex.WingsOfSoul: case WingIndex.WingsOfDragon: case WingIndex.WingsOfDarkness: case WingIndex.CapeOfLord: case WingIndex.WingsOfDespair: case WingIndex.CapeOfFighter: preview[5] |= 0x08; break; case WingIndex.WingOfStorm: case WingIndex.WingOfEternal: case WingIndex.WingOfIllusion: case WingIndex.WingOfRuin: case WingIndex.CapeOfEmperor: case WingIndex.WingOfDimension: case WingIndex.CapeOfOverrule: case WingIndex.SmallCapeOfLord: case WingIndex.SmallWingsOfMistery: case WingIndex.SmallWingsOfElf: case WingIndex.SmallWingsOfHeaven: case WingIndex.SmallWingsOfSatan: case WingIndex.SmallCloakOfWarrior: preview[5] |= 0x0C; break; default: // nothing to do break; } switch ((WingIndex)wing.Definition.Number) { case WingIndex.WingsOfElf: case WingIndex.WingsOfSpirit: case WingIndex.WingOfStorm: preview[9] |= 0x01; break; case WingIndex.WingsOfHeaven: case WingIndex.WingsOfSoul: case WingIndex.WingOfEternal: preview[9] |= 0x02; break; case WingIndex.WingsOfSatan: case WingIndex.WingsOfDragon: case WingIndex.WingOfIllusion: preview[9] |= 0x03; break; case WingIndex.WingsOfMistery: case WingIndex.WingsOfDarkness: case WingIndex.WingOfRuin: preview[9] |= 0x04; break; case WingIndex.CapeOfLord: case WingIndex.CapeOfEmperor: preview[9] |= 0x05; break; case WingIndex.WingsOfDespair: case WingIndex.WingOfDimension: preview[9] |= 0x06; break; case WingIndex.CapeOfFighter: case WingIndex.CapeOfOverrule: preview[9] |= 0x07; break; case WingIndex.SmallCapeOfLord: preview[17] |= 0x20; break; case WingIndex.SmallWingsOfMistery: preview[17] |= 0x40; break; case WingIndex.SmallWingsOfElf: preview[17] |= 0x60; break; case WingIndex.SmallWingsOfHeaven: preview[17] |= 0x80; break; case WingIndex.SmallWingsOfSatan: preview[17] |= 0xA0; break; case WingIndex.SmallCloakOfWarrior: preview[17] |= 0xC0; break; default: // nothing to do break; } }
private void AddPet(Span <byte> preview, ItemAppearance pet) { if (pet == null) { preview[5] |= 0b0000_0011; return; } switch ((PetIndex)pet.Definition.Number) { case PetIndex.Angel: case PetIndex.Imp: case PetIndex.Unicorn: preview[5] |= (byte)pet.Definition.Number; break; case PetIndex.Dinorant: preview[5] |= 0x03; preview[10] |= 0x01; break; case PetIndex.DarkHorse: preview[5] = 0x03; preview[12] |= 0x01; break; case PetIndex.Fenrir: preview[5] |= 0x03; preview[10] &= 0xFE; preview[12] &= 0xFE; preview[12] |= 0x04; preview[16] = 0x00; // TODO: Red Fenrir: preview[16] |= 0x01; // TODO: Blue Fenrir: preview[16] |= 0x02; // TODO: Gold Fenrir: preview[17] |= 0x01; break; default: preview[5] |= 0x03; break; } switch ((PetIndex)pet.Definition.Number) { case PetIndex.Panda: preview[16] |= 0xE0; break; case PetIndex.PetUnicorn: preview[16] |= 0xA0; break; case PetIndex.Skeleton: preview[16] |= 0x60; break; case PetIndex.Rudolph: preview[16] |= 0x80; break; case PetIndex.SpiritOfGuardian: preview[16] |= 0x40; break; case PetIndex.Demon: preview[16] |= 0x20; break; } }
private void AddPet(byte[] preview, ItemAppearance pet) { if (pet == null) { preview[5] |= 0x0F; return; } switch ((PetIndex)pet.Index) { case PetIndex.Angel: break; case PetIndex.Imp: preview[5] |= 0x01; break; case PetIndex.Unicorn: preview[5] |= 0x02; break; case PetIndex.Dinorant: preview[5] |= 0x03; preview[10] |= 0x01; break; case PetIndex.Fenrir: preview[5] |= 0x03; preview[12] |= 0x02; break; default: preview[5] |= 0x0F; break; } switch ((PetIndex)pet.Index) { case PetIndex.Panda: preview[16] |= 0xE0; break; case PetIndex.PetUnicorn: preview[16] |= 0xA0; break; case PetIndex.Skeleton: preview[16] |= 0x60; break; case PetIndex.Rudolph: preview[16] |= 0x80; break; case PetIndex.SpiritOfGuardian: preview[16] |= 0x40; break; case PetIndex.Demon: preview[16] |= 0x20; break; } }
public static void HandleDBReply(Packet packet) { var type = packet.ReadUInt32E <DB2Hash>("DB2 File"); var entry = (uint)packet.ReadInt32("Entry"); packet.ReadTime("Hotfix date"); var size = packet.ReadInt32("Size"); var data = packet.ReadBytes(size); var db2File = new Packet(data, packet.Opcode, packet.Time, packet.Direction, packet.Number, packet.Writer, packet.FileName); if ((int)entry < 0) { packet.WriteLine("Row {0} has been removed.", -(int)entry); return; } switch (type) { case DB2Hash.BroadcastText: { var broadcastText = new BroadcastText(); var id = db2File.ReadEntry("Id"); broadcastText.Language = db2File.ReadInt32("Language"); var maletextLength = db2File.ReadUInt16(); broadcastText.MaleText = db2File.ReadWoWString("Male Text", maletextLength); var femaletextLength = db2File.ReadUInt16(); broadcastText.FemaleText = db2File.ReadWoWString("Female Text", femaletextLength); broadcastText.EmoteID = new uint[3]; broadcastText.EmoteDelay = new uint[3]; for (var i = 0; i < 3; ++i) { broadcastText.EmoteID[i] = (uint)db2File.ReadInt32("Emote ID", i); } for (var i = 0; i < 3; ++i) { broadcastText.EmoteDelay[i] = (uint)db2File.ReadInt32("Emote Delay", i); } broadcastText.SoundId = db2File.ReadUInt32("Sound Id"); broadcastText.UnkEmoteId = db2File.ReadUInt32("Unk MoP 1"); // unk emote broadcastText.Type = db2File.ReadUInt32("Unk MoP 2"); // kind of type? Storage.BroadcastTexts.Add((uint)id.Key, broadcastText, packet.TimeSpan); packet.AddSniffData(StoreNameType.BroadcastText, id.Key, "BROADCAST_TEXT"); break; } case DB2Hash.Creature: // New structure - 6.0.2 { db2File.ReadUInt32("Creature ID"); db2File.ReadInt32E <CreatureType>("Type"); for (var i = 0; i < 3; ++i) { db2File.ReadUInt32 <ItemId>("Item ID", i); } db2File.ReadUInt32("Mount"); for (var i = 0; i < 4; ++i) { db2File.ReadInt32("Display ID", i); } for (var i = 0; i < 4; ++i) { db2File.ReadSingle("Display ID Probability", i); } if (db2File.ReadUInt16() > 0) { db2File.ReadCString("Name"); } if (db2File.ReadUInt16() > 0) { db2File.ReadCString("Female Name"); } if (db2File.ReadUInt16() > 0) { db2File.ReadCString("SubName"); } if (db2File.ReadUInt16() > 0) { db2File.ReadCString("Female SubName"); } db2File.ReadUInt32("Rank"); db2File.ReadUInt32("Inhabit Type"); break; } case DB2Hash.CreatureDifficulty: { var creatureDifficulty = new CreatureDifficulty(); var id = db2File.ReadEntry("Id"); creatureDifficulty.CreatureID = db2File.ReadUInt32("Creature Id"); creatureDifficulty.FactionID = db2File.ReadUInt32("Faction Template Id"); creatureDifficulty.Expansion = db2File.ReadInt32("Expansion"); creatureDifficulty.MinLevel = db2File.ReadInt32("Min Level"); creatureDifficulty.MaxLevel = db2File.ReadInt32("Max Level"); creatureDifficulty.Flags = new uint[5]; for (var i = 0; i < 5; ++i) { creatureDifficulty.Flags[i] = db2File.ReadUInt32("Flags", i); } Storage.CreatureDifficultys.Add((uint)id.Key, creatureDifficulty, packet.TimeSpan); break; } case DB2Hash.CurvePoint: { var curvePoint = new CurvePoint(); var id = db2File.ReadUInt32("ID"); curvePoint.CurveID = db2File.ReadUInt32("CurveID"); curvePoint.Index = db2File.ReadUInt32("Index"); curvePoint.X = db2File.ReadSingle("X"); curvePoint.Y = db2File.ReadSingle("Y"); Storage.CurvePoints.Add(id, curvePoint, packet.TimeSpan); break; } case DB2Hash.GameObjects: // New structure - 6.0.2 { var gameObjectTemplateDB2 = new GameObjectTemplateDB2(); var id = db2File.ReadEntry("ID"); gameObjectTemplateDB2.MapID = db2File.ReadUInt32("Map"); gameObjectTemplateDB2.DisplayId = db2File.ReadUInt32("DisplayID"); gameObjectTemplateDB2.PositionX = db2File.ReadSingle("PositionX"); gameObjectTemplateDB2.PositionY = db2File.ReadSingle("PositionY"); gameObjectTemplateDB2.PositionZ = db2File.ReadSingle("PositionZ"); gameObjectTemplateDB2.RotationX = db2File.ReadSingle("RotationX"); gameObjectTemplateDB2.RotationY = db2File.ReadSingle("RotationY"); gameObjectTemplateDB2.RotationZ = db2File.ReadSingle("RotationZ"); gameObjectTemplateDB2.RotationW = db2File.ReadSingle("RotationW"); gameObjectTemplateDB2.Size = db2File.ReadSingle("Size"); db2File.ReadInt32("Phase Use Flags"); gameObjectTemplateDB2.PhaseId = db2File.ReadUInt32("PhaseID"); gameObjectTemplateDB2.PhaseGroupId = db2File.ReadUInt32("PhaseGroupID"); gameObjectTemplateDB2.Type = db2File.ReadInt32E <GameObjectType>("Type"); gameObjectTemplateDB2.Data = new int[8]; for (var i = 0; i < gameObjectTemplateDB2.Data.Length; i++) { gameObjectTemplateDB2.Data[i] = db2File.ReadInt32("Data", i); } if (db2File.ReadUInt16() > 0) { gameObjectTemplateDB2.Name = db2File.ReadCString("Name"); } Storage.GameObjectTemplateDB2s.Add((uint)id.Key, gameObjectTemplateDB2, packet.TimeSpan); break; } case DB2Hash.Item: // New structure - 6.0.2 { var item = Storage.ItemTemplates.ContainsKey(entry) ? Storage.ItemTemplates[entry].Item1 : new ItemTemplate(); db2File.ReadUInt32 <ItemId>("Item ID"); item.Class = db2File.ReadInt32E <ItemClass>("Class"); item.SubClass = db2File.ReadUInt32("Sub Class"); item.SoundOverrideSubclass = db2File.ReadInt32("Sound Override Subclass"); item.Material = db2File.ReadInt32E <Material>("Material"); item.InventoryType = db2File.ReadUInt32E <InventoryType>("Inventory Type"); item.SheathType = db2File.ReadInt32E <SheathType>("Sheath Type"); db2File.ReadInt32("Icon File Data ID"); db2File.ReadInt32("Item Group Sounds ID"); Storage.ItemTemplates.Add(entry, item, packet.TimeSpan); packet.AddSniffData(StoreNameType.Item, (int)entry, "DB_REPLY"); break; } case DB2Hash.ItemExtendedCost: // New structure - 6.0.2 { db2File.ReadUInt32("Item Extended Cost ID"); if (ClientVersion.RemovedInVersion(ClientVersionBuild.V6_1_0_19678)) { db2File.ReadUInt32("Required Honor Points"); db2File.ReadUInt32("Required Arena Points"); } db2File.ReadUInt32("Required Arena Slot"); for (var i = 0; i < 5; ++i) { db2File.ReadUInt32("Required Item", i); } for (var i = 0; i < 5; ++i) { db2File.ReadUInt32("Required Item Count", i); } db2File.ReadUInt32("Required Personal Arena Rating"); db2File.ReadUInt32("Item Purchase Group"); for (var i = 0; i < 5; ++i) { db2File.ReadUInt32("Required Currency", i); } for (var i = 0; i < 5; ++i) { db2File.ReadUInt32("Required Currency Count", i); } db2File.ReadUInt32("Required Faction ID"); db2File.ReadUInt32("Required Faction Standing"); db2File.ReadUInt32("Requirement Flags"); db2File.ReadInt32 <AchievementId>("Required Achievement"); if (ClientVersion.AddedInVersion(ClientVersionBuild.V6_1_0_19678)) { db2File.ReadInt32("Unk1 Wod61x"); } break; } case DB2Hash.ItemCurrencyCost: { db2File.ReadUInt32("ID"); db2File.ReadUInt32 <ItemId>("Item ID"); break; } case DB2Hash.Mount: { var mount = new Mount(); var id = db2File.ReadUInt32("ID"); mount.MountTypeId = db2File.ReadUInt32("MountTypeId"); mount.DisplayId = db2File.ReadUInt32("DisplayId"); mount.Flags = db2File.ReadUInt32("Flags"); var NameLength = db2File.ReadUInt16(); mount.Name = db2File.ReadWoWString("Name", NameLength); var DescriptionLength = db2File.ReadUInt16(); mount.Description = db2File.ReadWoWString("Description", DescriptionLength); var SourceDescriptionLength = db2File.ReadUInt16(); mount.SourceDescription = db2File.ReadWoWString("SourceDescription", SourceDescriptionLength); mount.Source = db2File.ReadUInt32("Source"); mount.SpellId = db2File.ReadUInt32("SpellId"); mount.PlayerConditionId = db2File.ReadUInt32("PlayerConditionId"); Storage.Mounts.Add(id, mount, packet.TimeSpan); break; } case DB2Hash.RulesetItemUpgrade: { db2File.ReadUInt32("ID"); db2File.ReadUInt32("Item Upgrade Level"); db2File.ReadUInt32("Item Upgrade ID"); db2File.ReadUInt32 <ItemId>("Item ID"); break; } case DB2Hash.Holidays: { var holiday = new HolidayData(); var id = db2File.ReadUInt32("ID"); holiday.Duration = new uint[10]; for (var i = 0; i < 10; i++) { holiday.Duration[i] = db2File.ReadUInt32("Duration", i); } holiday.Date = new uint[16]; for (var i = 0; i < 16; i++) { holiday.Date[i] = db2File.ReadUInt32("Date", i); } holiday.Region = db2File.ReadUInt32("Region"); holiday.Looping = db2File.ReadUInt32("Looping"); holiday.CalendarFlags = new uint[10]; for (var i = 0; i < 10; i++) { holiday.CalendarFlags[i] = db2File.ReadUInt32("CalendarFlags", i); } holiday.HolidayNameID = db2File.ReadUInt32("HolidayNameID"); holiday.HolidayDescriptionID = db2File.ReadUInt32("HolidayDescriptionID"); var TextureFilenameLength = db2File.ReadUInt16(); holiday.TextureFilename = db2File.ReadWoWString("SourceDescription", TextureFilenameLength); holiday.Priority = db2File.ReadUInt32("Priority"); holiday.CalendarFilterType = db2File.ReadUInt32("CalendarFilterType"); holiday.Flags = db2File.ReadUInt32("Flags"); Storage.Holidays.Add(id, holiday, packet.TimeSpan); break; } case DB2Hash.ItemAppearance: { var itemAppearance = new ItemAppearance(); var id = db2File.ReadUInt32("ID"); itemAppearance.DisplayID = db2File.ReadUInt32("Display ID"); itemAppearance.IconFileDataID = db2File.ReadUInt32("File Data ID"); Storage.ItemAppearances.Add(id, itemAppearance, packet.TimeSpan); break; } case DB2Hash.ItemBonus: { var itemBonus = new ItemBonus(); var id = db2File.ReadUInt32("ID"); itemBonus.BonusListID = db2File.ReadUInt32("Bonus List ID"); itemBonus.Type = db2File.ReadUInt32("Type"); itemBonus.Value = new uint[2]; for (var i = 0; i < 2; i++) { itemBonus.Value[i] = db2File.ReadUInt32("Value", i); } itemBonus.Index = db2File.ReadUInt32("Index"); Storage.ItemBonuses.Add(id, itemBonus, packet.TimeSpan); break; } case DB2Hash.ItemBonusTreeNode: { var itemBonusTreeNode = new ItemBonusTreeNode(); var id = db2File.ReadUInt32("ID"); itemBonusTreeNode.BonusTreeID = db2File.ReadUInt32("BonusTreeID"); itemBonusTreeNode.BonusTreeModID = db2File.ReadUInt32("BonusTreeModID"); itemBonusTreeNode.SubTreeID = db2File.ReadUInt32("SubTreeID"); itemBonusTreeNode.BonusListID = db2File.ReadUInt32("BonusListID"); Storage.ItemBonusTreeNodes.Add(id, itemBonusTreeNode, packet.TimeSpan); break; } case DB2Hash.Item_sparse: // New structure - 6.0.2 { var item = Storage.ItemTemplates.ContainsKey(entry) ? Storage.ItemTemplates[entry].Item1 : new ItemTemplate(); db2File.ReadUInt32 <ItemId>("Item Sparse Entry"); item.Quality = db2File.ReadInt32E <ItemQuality>("Quality"); item.Flags1 = db2File.ReadUInt32E <ItemProtoFlags>("Flags 1"); item.Flags2 = db2File.ReadInt32E <ItemFlagExtra>("Flags 2"); item.Flags3 = db2File.ReadUInt32("Flags 3"); item.Unk430_1 = db2File.ReadSingle("Unk430_1"); item.Unk430_2 = db2File.ReadSingle("Unk430_2"); item.BuyCount = db2File.ReadUInt32("Buy count"); item.BuyPrice = db2File.ReadUInt32("Buy Price"); item.SellPrice = db2File.ReadUInt32("Sell Price"); item.InventoryType = db2File.ReadInt32E <InventoryType>("Inventory Type"); item.AllowedClasses = db2File.ReadInt32E <ClassMask>("Allowed Classes"); item.AllowedRaces = db2File.ReadInt32E <RaceMask>("Allowed Races"); item.ItemLevel = db2File.ReadUInt32("Item Level"); item.RequiredLevel = db2File.ReadUInt32("Required Level"); item.RequiredSkillId = db2File.ReadUInt32("Required Skill ID"); item.RequiredSkillLevel = db2File.ReadUInt32("Required Skill Level"); item.RequiredSpell = (uint)db2File.ReadInt32 <SpellId>("Required Spell"); item.RequiredHonorRank = db2File.ReadUInt32("Required Honor Rank"); item.RequiredCityRank = db2File.ReadUInt32("Required City Rank"); item.RequiredRepFaction = db2File.ReadUInt32("Required Rep Faction"); item.RequiredRepValue = db2File.ReadUInt32("Required Rep Value"); item.MaxCount = db2File.ReadInt32("Max Count"); item.MaxStackSize = db2File.ReadInt32("Max Stack Size"); item.ContainerSlots = db2File.ReadUInt32("Container Slots"); item.StatTypes = new ItemModType[10]; for (var i = 0; i < 10; i++) { var statType = db2File.ReadInt32E <ItemModType>("Stat Type", i); item.StatTypes[i] = statType == ItemModType.None ? ItemModType.Mana : statType; // TDB } item.StatValues = new int[10]; for (var i = 0; i < 10; i++) { item.StatValues[i] = db2File.ReadInt32("Stat Value", i); } item.ScalingValue = new int[10]; for (var i = 0; i < 10; i++) { item.ScalingValue[i] = db2File.ReadInt32("Scaling Value", i); } item.SocketCostRate = new int[10]; for (var i = 0; i < 10; i++) { item.SocketCostRate[i] = db2File.ReadInt32("Socket Cost Rate", i); } item.ScalingStatDistribution = db2File.ReadInt32("Scaling Stat Distribution"); item.DamageType = db2File.ReadInt32E <DamageType>("Damage Type"); item.Delay = db2File.ReadUInt32("Delay"); item.RangedMod = db2File.ReadSingle("Ranged Mod"); item.Bonding = db2File.ReadInt32E <ItemBonding>("Bonding"); var nameLength = db2File.ReadUInt16(); item.Name = db2File.ReadWoWString("Name", nameLength, 0); for (var i = 1; i < 4; ++i) { if (db2File.ReadUInt16() > 0) { db2File.ReadCString("Name", i); } } var descriptionLength = db2File.ReadUInt16(); item.Description = db2File.ReadWoWString("Description", descriptionLength); item.PageText = db2File.ReadUInt32("Page Text"); item.Language = db2File.ReadInt32E <Language>("Language"); item.PageMaterial = db2File.ReadInt32E <PageMaterial>("Page Material"); item.StartQuestId = (uint)db2File.ReadInt32 <QuestId>("Start Quest"); item.LockId = db2File.ReadUInt32("Lock ID"); item.Material = db2File.ReadInt32E <Material>("Material"); item.SheathType = db2File.ReadInt32E <SheathType>("Sheath Type"); item.RandomPropery = db2File.ReadInt32("Random Property"); item.RandomSuffix = db2File.ReadUInt32("Random Suffix"); item.ItemSet = db2File.ReadUInt32("Item Set"); item.AreaId = db2File.ReadUInt32 <AreaId>("Area"); item.MapId = db2File.ReadInt32 <MapId>("Map ID"); item.BagFamily = db2File.ReadInt32E <BagFamilyMask>("Bag Family"); item.TotemCategory = db2File.ReadInt32E <TotemCategory>("Totem Category"); item.ItemSocketColors = new ItemSocketColor[3]; for (var i = 0; i < 3; i++) { item.ItemSocketColors[i] = db2File.ReadInt32E <ItemSocketColor>("Socket Color", i); } item.SocketBonus = db2File.ReadInt32("Socket Bonus"); item.GemProperties = db2File.ReadInt32("Gem Properties"); item.ArmorDamageModifier = db2File.ReadSingle("Armor Damage Modifier"); item.Duration = db2File.ReadUInt32("Duration"); item.ItemLimitCategory = db2File.ReadInt32("Limit Category"); item.HolidayId = db2File.ReadInt32E <Holiday>("Holiday"); item.StatScalingFactor = db2File.ReadSingle("Stat Scaling Factor"); item.CurrencySubstitutionId = db2File.ReadUInt32("Currency Substitution Id"); item.CurrencySubstitutionCount = db2File.ReadUInt32("Currency Substitution Count"); item.ItemNameDescriptionId = db2File.ReadUInt32("Item Name Description ID"); Storage.ObjectNames.Add(entry, new ObjectName { ObjectType = ObjectType.Item, Name = item.Name }, packet.TimeSpan); packet.AddSniffData(StoreNameType.Item, (int)entry, "DB_REPLY"); break; } case DB2Hash.KeyChain: { var key = new KeyChain(); var id = db2File.ReadUInt32("ID"); key.Key = new byte[32]; for (var i = 0; i < 32; i++) { key.Key[i] = db2File.ReadByte("Key", i); } Storage.KeyChains.Add(id, key, packet.TimeSpan); break; } case DB2Hash.SceneScript: // lua ftw! { db2File.ReadUInt32("Scene Script ID"); var nameLength = db2File.ReadUInt16(); db2File.ReadWoWString("Name", nameLength); var scriptLength = db2File.ReadUInt16(); db2File.ReadWoWString("Script", scriptLength); db2File.ReadUInt32("Previous Scene Script Part"); db2File.ReadUInt32("Next Scene Script Part"); break; } case DB2Hash.SpellMisc: // New structure - 6.0.2 { var spellMisc = new SpellMisc(); var id = db2File.ReadEntry("ID"); spellMisc.Attributes = db2File.ReadUInt32("Attributes"); spellMisc.AttributesEx = db2File.ReadUInt32("AttributesEx"); spellMisc.AttributesExB = db2File.ReadUInt32("AttributesExB"); spellMisc.AttributesExC = db2File.ReadUInt32("AttributesExC"); spellMisc.AttributesExD = db2File.ReadUInt32("AttributesExD"); spellMisc.AttributesExE = db2File.ReadUInt32("AttributesExE"); spellMisc.AttributesExF = db2File.ReadUInt32("AttributesExF"); spellMisc.AttributesExG = db2File.ReadUInt32("AttributesExG"); spellMisc.AttributesExH = db2File.ReadUInt32("AttributesExH"); spellMisc.AttributesExI = db2File.ReadUInt32("AttributesExI"); spellMisc.AttributesExJ = db2File.ReadUInt32("AttributesExJ"); spellMisc.AttributesExK = db2File.ReadUInt32("AttributesExK"); spellMisc.AttributesExL = db2File.ReadUInt32("AttributesExL"); spellMisc.AttributesExM = db2File.ReadUInt32("AttributesExM"); spellMisc.CastingTimeIndex = db2File.ReadUInt32("CastingTimeIndex"); spellMisc.DurationIndex = db2File.ReadUInt32("DurationIndex"); spellMisc.RangeIndex = db2File.ReadUInt32("RangeIndex"); spellMisc.Speed = db2File.ReadSingle("Speed"); spellMisc.SpellVisualID = new uint[2]; for (var i = 0; i < 2; ++i) { spellMisc.SpellVisualID[i] = db2File.ReadUInt32("SpellVisualID", i); } spellMisc.SpellIconID = db2File.ReadUInt32("SpellIconID"); spellMisc.ActiveIconID = db2File.ReadUInt32("ActiveIconID"); spellMisc.SchoolMask = db2File.ReadUInt32("SchoolMask"); spellMisc.MultistrikeSpeedMod = db2File.ReadSingle("MultistrikeSpeedMod"); Storage.SpellMiscs.Add((uint)id.Key, spellMisc, packet.TimeSpan); break; } case DB2Hash.Toy: // New structure - 6.0.2 { db2File.ReadUInt32("ID"); db2File.ReadUInt32 <ItemId>("Item ID"); db2File.ReadUInt32("Flags"); var descriptionLength = db2File.ReadUInt16(); db2File.ReadWoWString("Description", descriptionLength); db2File.ReadInt32("Source Type"); break; } case DB2Hash.Vignette: { db2File.ReadUInt32("Vignette ID"); var nameLength = db2File.ReadUInt16(); db2File.ReadWoWString("Name", nameLength); db2File.ReadUInt32("Icon"); db2File.ReadUInt32("Flag"); // not 100% sure (8 & 32 as values only) - todo verify with more data db2File.ReadSingle("Unk Float 1"); db2File.ReadSingle("Unk Float 2"); break; } case DB2Hash.WbAccessControlList: { db2File.ReadUInt32("Id"); var addressLength = db2File.ReadUInt16(); db2File.ReadWoWString("Address", addressLength); db2File.ReadUInt32("Unk MoP 1"); db2File.ReadUInt32("Unk MoP 2"); db2File.ReadUInt32("Unk MoP 3"); db2File.ReadUInt32("Unk MoP 4"); // flags? break; } case DB2Hash.AreaPOI: { db2File.ReadUInt32("Id"); db2File.ReadUInt32("Flags"); db2File.ReadUInt32("Importance"); db2File.ReadUInt32("FactionID"); db2File.ReadUInt32("MapID"); db2File.ReadUInt32("AreaID"); db2File.ReadUInt32("Icon"); db2File.ReadSingle("PositionX"); db2File.ReadSingle("PositionY"); var len1 = db2File.ReadUInt16(); db2File.ReadWoWString("Name", len1); var len2 = db2File.ReadUInt16(); db2File.ReadWoWString("Description", len2); db2File.ReadUInt32("WorldStateID"); db2File.ReadUInt32("PlayerConditionID"); db2File.ReadUInt32("WorldMapLink"); db2File.ReadUInt32("PortLocID"); break; } case DB2Hash.AreaPOIState: { db2File.ReadUInt32("Id"); db2File.ReadUInt32("AreaPOIID"); db2File.ReadUInt32("State"); db2File.ReadUInt32("Icon"); var len2 = db2File.ReadUInt16(); db2File.ReadWoWString("Description", len2); break; } case DB2Hash.TaxiPathNode: { db2File.ReadUInt32("Id"); db2File.ReadUInt32("PathID"); db2File.ReadUInt32("NodeIndex"); db2File.ReadUInt32("MapID"); db2File.ReadSingle("LocX"); db2File.ReadSingle("LocY"); db2File.ReadSingle("LocZ"); db2File.ReadUInt32("Flags"); db2File.ReadUInt32("Delay"); db2File.ReadUInt32("ArrivalEventID"); db2File.ReadUInt32("DepartureEventID"); break; } case DB2Hash.Location: { db2File.ReadUInt32("Id"); db2File.ReadSingle("LocX"); db2File.ReadSingle("LocY"); db2File.ReadSingle("LocZ"); db2File.ReadSingle("Rotation1"); db2File.ReadSingle("Rotation2"); db2File.ReadSingle("Rotation3"); break; } default: { db2File.AddValue("Unknown DB2 file type", string.Format("{0} (0x{0:x})", type)); for (var i = 0;; ++i) { if (db2File.Length - 4 >= db2File.Position) { var blockVal = db2File.ReadUpdateField(); string key = "Block Value " + i; string value = blockVal.UInt32Value + "/" + blockVal.SingleValue; packet.AddValue(key, value); } else { var left = db2File.Length - db2File.Position; for (var j = 0; j < left; ++j) { string key = "Byte Value " + i; var value = db2File.ReadByte(); packet.AddValue(key, value); } break; } } break; } } if (db2File.Length != db2File.Position) { packet.WriteLine("Packet not fully read! Current position is {0}, length is {1}, and diff is {2}.", db2File.Position, db2File.Length, db2File.Length - db2File.Position); if (db2File.Length < 300) // If the packet isn't "too big" and it is not full read, print its hex table { packet.AsHex(); } packet.Status = ParsedStatus.WithErrors; } }
public FakeItem WithAppearance(ItemAppearance appearance) { Item.Appearance.Returns(appearance); return(this); }
public ItemAppearanceWrapper(ItemAppearance itemAppearance) { _itemAppearance = itemAppearance; }
/// <summary> /// Gets the glow level of the item. /// </summary> /// <param name="item">The item.</param> /// <returns>The glow level of the item</returns> public static byte GetGlowLevel(this ItemAppearance item) => GetGlowLevel(item.Level);