for (uint32 itemId = 0; itemId < sItemSparseStore.GetNumRows(); ++itemId)
{
ItemSparseEntry const* sparse = sItemSparseStore.LookupEntry(itemId);
ItemEntry const* db2Data = sItemStore.LookupEntry(itemId);
if (!sparse || !db2Data)
continue;
ItemTemplate& itemTemplate = _itemTemplateStore[itemId];
itemTemplate.ItemId = itemId;
itemTemplate.Class = db2Data->Class;
itemTemplate.SubClass = db2Data->SubClass;
itemTemplate.SoundOverrideSubclass = db2Data->SoundOverrideSubclass;
itemTemplate.Name1 = sparse->Name->Str[sWorld->GetDefaultDbcLocale()];
itemTemplate.DisplayInfoID = db2Data->DisplayId;
itemTemplate.Quality = sparse->Quality;
itemTemplate.Flags = sparse->Flags;
itemTemplate.Flags2 = sparse->Flags2;
itemTemplate.Unk430_1 = sparse->Unk430_1;
itemTemplate.Unk430_2 = sparse->Unk430_2;
itemTemplate.BuyCount = std::max(sparse->BuyCount, 1u);
itemTemplate.BuyPrice = sparse->BuyPrice;
itemTemplate.SellPrice = sparse->SellPrice;
itemTemplate.InventoryType = db2Data->InventoryType;
itemTemplate.AllowableClass = sparse->AllowableClass;
itemTemplate.AllowableRace = sparse->AllowableRace;
itemTemplate.ItemLevel = sparse->ItemLevel;
itemTemplate.RequiredLevel = sparse->RequiredLevel;
itemTemplate.RequiredSkill = sparse->RequiredSkill;
itemTemplate.RequiredSkillRank = sparse->RequiredSkillRank;
itemTemplate.RequiredSpell = sparse->RequiredSpell;
itemTemplate.RequiredHonorRank = sparse->RequiredHonorRank;
itemTemplate.RequiredCityRank = sparse->RequiredCityRank;
itemTemplate.RequiredReputationFaction = sparse->RequiredReputationFaction;
itemTemplate.RequiredReputationRank = sparse->RequiredReputationRank;
itemTemplate.MaxCount = sparse->MaxCount;
itemTemplate.Stackable = sparse->Stackable;
itemTemplate.ContainerSlots = sparse->ContainerSlots;
for (uint32 i = 0; i < MAX_ITEM_PROTO_STATS; ++i)
{
itemTemplate.ItemStat[i].ItemStatType = sparse->ItemStatType[i];
itemTemplate.ItemStat[i].ItemStatValue = sparse->ItemStatValue[i];
itemTemplate.ItemStat[i].ItemStatUnk1 = sparse->ItemStatUnk1[i];
itemTemplate.ItemStat[i].ItemStatUnk2 = sparse->ItemStatUnk2[i];
}
itemTemplate.ScalingStatDistribution = sparse->ScalingStatDistribution;
// cache item damage
FillItemDamageFields(&itemTemplate.DamageMin, &itemTemplate.DamageMax, &itemTemplate.DPS, sparse->ItemLevel,
db2Data->Class, db2Data->SubClass, sparse->Quality, sparse->Delay, sparse->StatScalingFactor,
sparse->InventoryType, sparse->Flags2);
itemTemplate.DamageType = sparse->DamageType;
itemTemplate.Armor = FillItemArmor(sparse->ItemLevel, db2Data->Class, db2Data->SubClass, sparse->Quality, sparse->InventoryType);
itemTemplate.Delay = sparse->Delay;
itemTemplate.RangedModRange = sparse->RangedModRange;
for (uint32 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
{
itemTemplate.Spells[i].SpellId = sparse->SpellId[i];
itemTemplate.Spells[i].SpellTrigger = sparse->SpellTrigger[i];
itemTemplate.Spells[i].SpellCharges = sparse->SpellCharges[i];
itemTemplate.Spells[i].SpellCooldown = sparse->SpellCooldown[i];
itemTemplate.Spells[i].SpellCategory = sparse->SpellCategory[i];
itemTemplate.Spells[i].SpellCategoryCooldown = sparse->SpellCategoryCooldown[i];
}
itemTemplate.SpellPPMRate = 0.0f;
itemTemplate.Bonding = sparse->Bonding;
itemTemplate.Description = sparse->Description->Str[sWorld->GetDefaultDbcLocale()];
itemTemplate.PageText = sparse->PageText;
itemTemplate.LanguageID = sparse->LanguageID;
itemTemplate.PageMaterial = sparse->PageMaterial;
itemTemplate.StartQuest = sparse->StartQuest;
itemTemplate.LockID = sparse->LockID;
itemTemplate.Material = sparse->Material;
itemTemplate.Sheath = sparse->Sheath;
itemTemplate.RandomProperty = sparse->RandomProperty;
itemTemplate.RandomSuffix = sparse->RandomSuffix;
itemTemplate.ItemSet = sparse->ItemSet;
itemTemplate.MaxDurability = FillMaxDurability(db2Data->Class, db2Data->SubClass, sparse->InventoryType, sparse->Quality, sparse->ItemLevel);
itemTemplate.Area = sparse->Area;
itemTemplate.Map = sparse->Map;
itemTemplate.BagFamily = sparse->BagFamily;
itemTemplate.TotemCategory = sparse->TotemCategory;
for (uint32 i = 0; i < MAX_ITEM_PROTO_SOCKETS; ++i)
{
itemTemplate.Socket[i].Color = sparse->Color[i];
itemTemplate.Socket[i].Content = sparse->Content[i];
}
itemTemplate.socketBonus = sparse->SocketBonus;
itemTemplate.GemProperties = sparse->GemProperties;
FillDisenchantFields(&itemTemplate.DisenchantID, &itemTemplate.RequiredDisenchantSkill, itemTemplate);
itemTemplate.ArmorDamageModifier = sparse->ArmorDamageModifier;
itemTemplate.Duration = sparse->Duration;
itemTemplate.ItemLimitCategory = sparse->ItemLimitCategory;
itemTemplate.HolidayId = sparse->HolidayId;
itemTemplate.StatScalingFactor = sparse->StatScalingFactor;
itemTemplate.CurrencySubstitutionId = sparse->CurrencySubstitutionId;
itemTemplate.CurrencySubstitutionCount = sparse->CurrencySubstitutionCount;
itemTemplate.ScriptId = 0;
itemTemplate.FoodType = 0;
itemTemplate.MinMoneyLoot = 0;
itemTemplate.MaxMoneyLoot = 0;
++sparseCount;
}