aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2019-11-25 21:42:00 +0100
committerShauren <shauren.trinity@gmail.com>2019-11-25 21:42:00 +0100
commit3d9e21193dd9f7d5f38a7a8edb3d6f6f8daa1867 (patch)
treea1902b5228dafb1c2a64b252c78047410dd2e5a5
parente718440599b2ce69a45bfdf0af0aee7d37621072 (diff)
Core/Items: Implement new item bonus types
-rw-r--r--src/server/game/DataStores/DBCEnums.h4
-rw-r--r--src/server/game/Entities/Item/Item.cpp13
-rw-r--r--src/server/game/Entities/Item/Item.h3
-rw-r--r--src/server/game/Groups/Group.cpp2
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);