diff options
author | Shauren <shauren.trinity@gmail.com> | 2016-11-30 21:17:15 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2016-11-30 21:17:15 +0100 |
commit | 2c5474e319da0a24b704c1a3521be4876d7a4da3 (patch) | |
tree | 51d3e025d55c2d577849b5a2847a99cdbef47131 /src | |
parent | 9b006e511bf40020e1660adf290ceb6ed6f4fd86 (diff) |
Core/Items: Implemented new 7.1 ItemSpec rule - PrimaryStat can now be set to ITEM_SPEC_STAT_NONE
Closes #18360
Closes #18357
Closes #18358
Closes #18359
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 61 |
2 files changed, 33 insertions, 30 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index c88f7933704..a6e526a1984 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -14873,7 +14873,7 @@ bool Player::CanSelectQuestPackageItem(QuestPackageItemEntry const* questPackage case QUEST_PACKAGE_FILTER_LOOT_SPECIALIZATION: return rewardProto->IsUsableByLootSpecialization(this); case QUEST_PACKAGE_FILTER_CLASS: - return (rewardProto->ItemSpecClassMask & getClassMask()) != 0; + return !rewardProto->ItemSpecClassMask || (rewardProto->ItemSpecClassMask & getClassMask()) != 0; case QUEST_PACKAGE_FILTER_EVERYONE: return true; default: diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 9d026296724..94f64519292 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -2617,6 +2617,7 @@ struct ItemSpecStats } else if (item->Class == ITEM_CLASS_GEM) { + ItemType = 7; if (GemPropertiesEntry const* gem = sGemPropertiesStore.LookupEntry(sparse->GemProperties)) { if (gem->Type & SOCKET_COLOR_RELIC_IRON) @@ -2747,47 +2748,49 @@ void ObjectMgr::LoadItemTemplates() if (std::vector<ItemSpecOverrideEntry const*> const* itemSpecOverrides = sDB2Manager.GetItemSpecOverrides(sparse->ID)) { for (ItemSpecOverrideEntry const* itemSpecOverride : *itemSpecOverrides) + { if (ChrSpecializationEntry const* specialization = sChrSpecializationStore.LookupEntry(itemSpecOverride->SpecID)) + { + itemTemplate.ItemSpecClassMask |= 1 << (specialization->ClassID - 1); itemTemplate.Specializations[0].set(ItemTemplate::CalculateItemSpecBit(specialization)); - - itemTemplate.Specializations[1] |= itemTemplate.Specializations[0]; + itemTemplate.Specializations[1] |= itemTemplate.Specializations[0]; + itemTemplate.Specializations[2] |= itemTemplate.Specializations[0]; + } + } } else { ItemSpecStats itemSpecStats(db2Data, sparse); - if (itemSpecStats.ItemSpecStatCount) + for (ItemSpecEntry const* itemSpec : sItemSpecStore) { - for (ItemSpecEntry const* itemSpec : sItemSpecStore) - { - if (itemSpecStats.ItemType != itemSpec->ItemType) - continue; + if (itemSpecStats.ItemType != itemSpec->ItemType) + continue; - bool hasPrimary = false; - bool hasSecondary = itemSpec->SecondaryStat == ITEM_SPEC_STAT_NONE; - for (uint32 i = 0; i < itemSpecStats.ItemSpecStatCount; ++i) - { - if (itemSpecStats.ItemSpecStatTypes[i] == itemSpec->PrimaryStat) - hasPrimary = true; - if (itemSpecStats.ItemSpecStatTypes[i] == itemSpec->SecondaryStat) - hasSecondary = true; - } + bool hasPrimary = itemSpec->PrimaryStat == ITEM_SPEC_STAT_NONE; + bool hasSecondary = itemSpec->SecondaryStat == ITEM_SPEC_STAT_NONE; + for (uint32 i = 0; i < itemSpecStats.ItemSpecStatCount; ++i) + { + if (itemSpecStats.ItemSpecStatTypes[i] == itemSpec->PrimaryStat) + hasPrimary = true; + if (itemSpecStats.ItemSpecStatTypes[i] == itemSpec->SecondaryStat) + hasSecondary = true; + } - if (!hasPrimary || !hasSecondary) - continue; + if (!hasPrimary || !hasSecondary) + continue; - if (ChrSpecializationEntry const* specialization = sChrSpecializationStore.LookupEntry(itemSpec->SpecID)) + if (ChrSpecializationEntry const* specialization = sChrSpecializationStore.LookupEntry(itemSpec->SpecID)) + { + if ((1 << (specialization->ClassID - 1)) & sparse->AllowableClass) { - if ((1 << (specialization->ClassID - 1)) & sparse->AllowableClass) - { - itemTemplate.ItemSpecClassMask |= 1 << (specialization->ClassID - 1); - std::size_t specBit = ItemTemplate::CalculateItemSpecBit(specialization); - itemTemplate.Specializations[0].set(specBit); - if (itemSpec->MaxLevel > 40) - itemTemplate.Specializations[1].set(specBit); - if (itemSpec->MaxLevel >= 110) - itemTemplate.Specializations[2].set(specBit); - } + itemTemplate.ItemSpecClassMask |= 1 << (specialization->ClassID - 1); + std::size_t specBit = ItemTemplate::CalculateItemSpecBit(specialization); + itemTemplate.Specializations[0].set(specBit); + if (itemSpec->MaxLevel > 40) + itemTemplate.Specializations[1].set(specBit); + if (itemSpec->MaxLevel >= 110) + itemTemplate.Specializations[2].set(specBit); } } } |