diff options
Diffstat (limited to 'src/server/game/Globals/ObjectMgr.cpp')
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 82 |
1 files changed, 49 insertions, 33 deletions
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 51088e0000f..755b6a2ac59 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -2435,7 +2435,7 @@ void FillDisenchantFields(uint32* disenchantID, uint32* requiredDisenchantSkill, { *disenchantID = 0; *(int32*)requiredDisenchantSkill = -1; - if ((itemTemplate.Flags & (ITEM_PROTO_FLAG_CONJURED | ITEM_PROTO_FLAG_UNK6)) || + if ((itemTemplate.Flags[0] & (ITEM_PROTO_FLAG_CONJURED | ITEM_PROTO_FLAG_UNK6)) || itemTemplate.Bonding == BIND_QUEST_ITEM || itemTemplate.Area || itemTemplate.Map || itemTemplate.Stackable > 1 || itemTemplate.Quality < ITEM_QUALITY_UNCOMMON || itemTemplate.Quality > ITEM_QUALITY_EPIC || @@ -2492,12 +2492,11 @@ void ObjectMgr::LoadItemTemplates() itemTemplate.SubClass = db2Data->SubClass; itemTemplate.SoundOverrideSubclass = db2Data->SoundOverrideSubclass; itemTemplate.Name1 = sparse->Name->Str[sWorld->GetDefaultDbcLocale()]; - itemTemplate.DisplayInfoID = db2Data->DisplayId; + itemTemplate.DisplayInfoID = GetItemDisplayID(db2Data->AppearanceID); itemTemplate.Quality = sparse->Quality; - itemTemplate.Flags = sparse->Flags; - itemTemplate.Flags2 = sparse->Flags2; - itemTemplate.Unk430_1 = sparse->Unk430_1; - itemTemplate.Unk430_2 = sparse->Unk430_2; + memcpy(itemTemplate.Flags, sparse->Flags, sizeof(itemTemplate.Flags)); + itemTemplate.Unk1 = sparse->Unk1; + itemTemplate.Unk2 = sparse->Unk2; itemTemplate.BuyCount = std::max(sparse->BuyCount, 1u); itemTemplate.BuyPrice = sparse->BuyPrice; itemTemplate.SellPrice = sparse->SellPrice; @@ -2529,21 +2528,12 @@ void ObjectMgr::LoadItemTemplates() // 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); + sparse->InventoryType, sparse->Flags[1]); 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; @@ -2565,8 +2555,9 @@ void ObjectMgr::LoadItemTemplates() 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.Socket[i].Color = sparse->SocketColor[i]; + // TODO: 6.x update/remove this + itemTemplate.Socket[i].Content = 0; } itemTemplate.socketBonus = sparse->SocketBonus; @@ -2576,9 +2567,9 @@ void ObjectMgr::LoadItemTemplates() itemTemplate.ArmorDamageModifier = sparse->ArmorDamageModifier; itemTemplate.Duration = sparse->Duration; itemTemplate.ItemLimitCategory = sparse->ItemLimitCategory; - itemTemplate.HolidayId = sparse->HolidayId; + itemTemplate.HolidayId = sparse->HolidayID; itemTemplate.StatScalingFactor = sparse->StatScalingFactor; - itemTemplate.CurrencySubstitutionId = sparse->CurrencySubstitutionId; + itemTemplate.CurrencySubstitutionId = sparse->CurrencySubstitutionID; itemTemplate.CurrencySubstitutionCount = sparse->CurrencySubstitutionCount; itemTemplate.ScriptId = 0; itemTemplate.FoodType = 0; @@ -2587,6 +2578,29 @@ void ObjectMgr::LoadItemTemplates() ++sparseCount; } + // Load item effects (spells) + for (uint32 effectId = 0; effectId < sItemEffectStore.GetNumRows(); ++effectId) + { + ItemEffectEntry const* effectEntry = sItemEffectStore.LookupEntry(effectId); + if (!effectEntry) + continue; + + auto itemItr = _itemTemplateStore.find(effectEntry->ItemID); + if (itemItr == _itemTemplateStore.end()) + continue; + + ItemTemplate& itemTemplate = itemItr->second; + + ItemEffect effect; + effect.SpellID = effectEntry->SpellID; + effect.Trigger = effectEntry->Trigger; + effect.Charges = effectEntry->Charges; + effect.Cooldown = effectEntry->Cooldown; + effect.Category = effectEntry->Category; + effect.CategoryCooldown = effectEntry->CategoryCooldown; + itemTemplate.Effects.push_back(effect); + } + // Load missing items from item_template AND overwrite data from Item-sparse.db2 (item_template is supposed to contain Item-sparse.adb data) // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 QueryResult result = WorldDatabase.Query("SELECT entry, Class, SubClass, SoundOverrideSubclass, Name, DisplayId, Quality, Flags, FlagsExtra, Unk430_1, Unk430_2, BuyCount, BuyPrice, SellPrice, " @@ -2646,10 +2660,10 @@ void ObjectMgr::LoadItemTemplates() itemTemplate.Name1 = fields[4].GetString(); itemTemplate.DisplayInfoID = fields[5].GetUInt32(); itemTemplate.Quality = uint32(fields[6].GetUInt8()); - itemTemplate.Flags = fields[7].GetUInt32(); - itemTemplate.Flags2 = fields[8].GetUInt32(); - itemTemplate.Unk430_1 = fields[9].GetFloat(); - itemTemplate.Unk430_2 = fields[10].GetFloat(); + itemTemplate.Flags[0] = fields[7].GetUInt32(); + itemTemplate.Flags[1] = fields[8].GetUInt32(); + itemTemplate.Unk1 = fields[9].GetFloat(); + itemTemplate.Unk2 = fields[10].GetFloat(); itemTemplate.BuyCount = uint32(fields[11].GetUInt8()); itemTemplate.BuyPrice = int32(fields[12].GetInt64()); itemTemplate.SellPrice = fields[13].GetUInt32(); @@ -2682,7 +2696,7 @@ void ObjectMgr::LoadItemTemplates() // cache item damage FillItemDamageFields(&itemTemplate.DamageMin, &itemTemplate.DamageMax, &itemTemplate.DPS, itemTemplate.ItemLevel, itemTemplate.Class, itemTemplate.SubClass, itemTemplate.Quality, fields[71].GetUInt16(), - fields[131].GetFloat(), itemTemplate.InventoryType, itemTemplate.Flags2); + fields[131].GetFloat(), itemTemplate.InventoryType, itemTemplate.Flags[1]); itemTemplate.DamageType = fields[70].GetUInt8(); itemTemplate.Armor = FillItemArmor(itemTemplate.ItemLevel, itemTemplate.Class, @@ -2691,14 +2705,16 @@ void ObjectMgr::LoadItemTemplates() itemTemplate.Delay = fields[71].GetUInt16(); itemTemplate.RangedModRange = fields[72].GetFloat(); - for (uint32 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i) - { - itemTemplate.Spells[i].SpellId = fields[73 + 6 * i + 0].GetInt32(); - itemTemplate.Spells[i].SpellTrigger = uint32(fields[73 + 6 * i + 1].GetUInt8()); - itemTemplate.Spells[i].SpellCharges = int32(fields[73 + 6 * i + 2].GetInt16()); - itemTemplate.Spells[i].SpellCooldown = fields[73 + 6 * i + 3].GetInt32(); - itemTemplate.Spells[i].SpellCategory = uint32(fields[73 + 6 * i + 4].GetUInt16()); - itemTemplate.Spells[i].SpellCategoryCooldown = fields[73 + 6 * i + 5].GetInt32(); + // TODO: 6.x move this to new itemeffect table (probably itemeffect_dbc?) + itemTemplate.Effects.resize(3); + for (uint32 i = 0; i < 3; ++i) + { + itemTemplate.Effects[i].SpellID = fields[73 + 6 * i + 0].GetInt32(); + itemTemplate.Effects[i].Trigger = uint32(fields[73 + 6 * i + 1].GetUInt8()); + itemTemplate.Effects[i].Charges = int32(fields[73 + 6 * i + 2].GetInt16()); + itemTemplate.Effects[i].Cooldown = fields[73 + 6 * i + 3].GetInt32(); + itemTemplate.Effects[i].Category = uint32(fields[73 + 6 * i + 4].GetUInt16()); + itemTemplate.Effects[i].CategoryCooldown = fields[73 + 6 * i + 5].GetInt32(); } itemTemplate.SpellPPMRate = 0.0f; |