diff options
-rw-r--r-- | src/server/game/DataStores/DBCEnums.h | 4 | ||||
-rw-r--r-- | src/server/game/Entities/Item/Item.cpp | 13 | ||||
-rw-r--r-- | src/server/game/Entities/Item/Item.h | 3 | ||||
-rw-r--r-- | src/server/game/Groups/Group.cpp | 2 |
4 files changed, 18 insertions, 4 deletions
diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index 15e82a1bf16..f0d756a768d 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -990,7 +990,9 @@ enum ItemBonusType ITEM_BONUS_RANDOM_ENCHANTMENT = 15, // Responsible for showing "<Random additional stats>" or "+%d Rank Random Minor Trait" in the tooltip before item is obtained ITEM_BONUS_BONDING = 16, ITEM_BONUS_RELIC_TYPE = 17, - ITEM_BONUS_OVERRIDE_REQUIRED_LEVEL = 18 + ITEM_BONUS_OVERRIDE_REQUIRED_LEVEL = 18, + ITEM_BONUS_OVERRIDE_CAN_DISENCHANT = 21, + ITEM_BONUS_OVERRIDE_CAN_SCRAP = 22 }; enum class ItemContext : uint8 diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 9f5260d3e55..13554e90ccf 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -2318,6 +2318,9 @@ int32 Item::GetItemStatValue(uint32 index, Player const* owner) const ItemDisenchantLootEntry const* Item::GetDisenchantLoot(Player const* owner) const { + if (!_bonusData.CanDisenchant) + return nullptr; + return Item::GetDisenchantLoot(GetTemplate(), GetQuality(), GetItemLevel(owner)); } @@ -2756,9 +2759,10 @@ void BonusData::Initialize(ItemTemplate const* proto) ScalingStatDistribution = proto->GetScalingStatDistribution(); ContentTuningId = 0; RelicType = -1; - HasItemLevelBonus = false; HasFixedLevel = false; RequiredLevelOverride = 0; + CanDisenchant = (proto->GetFlags() & ITEM_FLAG_NO_DISENCHANT) == 0; + CanScrap = (proto->GetFlags4() & ITEM_FLAG4_SCRAPABLE) != 0; _state.AppearanceModPriority = std::numeric_limits<int32>::max(); _state.ScalingStatDistributionPriority = std::numeric_limits<int32>::max(); @@ -2786,7 +2790,6 @@ void BonusData::AddBonus(uint32 type, int32 const (&values)[3]) { case ITEM_BONUS_ITEM_LEVEL: ItemLevelBonus += values[0]; - HasItemLevelBonus = true; break; case ITEM_BONUS_STAT: { @@ -2856,5 +2859,11 @@ void BonusData::AddBonus(uint32 type, int32 const (&values)[3]) case ITEM_BONUS_OVERRIDE_REQUIRED_LEVEL: RequiredLevelOverride = values[0]; break; + case ITEM_BONUS_OVERRIDE_CAN_DISENCHANT: + CanDisenchant = values[0] != 0; + break; + case ITEM_BONUS_OVERRIDE_CAN_SCRAP: + CanScrap = values[0] != 0; + break; } } diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h index 6eca916db59..c7b6fd648a9 100644 --- a/src/server/game/Entities/Item/Item.h +++ b/src/server/game/Entities/Item/Item.h @@ -92,7 +92,8 @@ struct BonusData uint16 GemRelicRankBonus[MAX_ITEM_PROTO_SOCKETS]; int32 RelicType; int32 RequiredLevelOverride; - bool HasItemLevelBonus; + bool CanDisenchant; + bool CanScrap; bool HasFixedLevel; void Initialize(ItemTemplate const* proto); diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index e377812f029..2a975aaf7ac 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -1911,6 +1911,8 @@ ItemDisenchantLootEntry const* Roll::GetItemDisenchantLoot(Player const* player) BonusData bonusData; bonusData.Initialize(itemInstance); + if (!bonusData.CanDisenchant) + return nullptr; ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(itemid); uint32 itemLevel = Item::GetItemLevel(itemTemplate, bonusData, player->getLevel(), 0, 0, 0, 0, false, 0); |