aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/DataStores/DBCEnums.h26
-rw-r--r--src/server/game/Entities/Item/Item.cpp60
-rw-r--r--src/server/game/Entities/Item/Item.h14
-rw-r--r--src/server/game/Entities/Item/ItemTemplate.h2
4 files changed, 76 insertions, 26 deletions
diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h
index 9c1a618feb6..9e466e10be0 100644
--- a/src/server/game/DataStores/DBCEnums.h
+++ b/src/server/game/DataStores/DBCEnums.h
@@ -607,18 +607,20 @@ enum ItemExtendedCostFlags
enum ItemBonusType
{
- ITEM_BONUS_ITEM_LEVEL = 1,
- ITEM_BONUS_STAT = 2,
- ITEM_BONUS_QUALITY = 3,
- ITEM_BONUS_DESCRIPTION = 4,
- ITEM_BONUS_SUFFIX = 5,
- ITEM_BONUS_SOCKET = 6,
- ITEM_BONUS_APPEARANCE = 7,
- ITEM_BONUS_REQUIRED_LEVEL = 8,
- ITEM_BONUS_DISPLAY_TOAST_METHOD = 9,
- ITEM_BONUS_REPAIR_COST_MULTIPLIER = 10,
- ITEM_BONUS_SCALING_STAT_DISTRIBUTION = 11,
- ITEM_BONUS_UNK_12 = 12
+ ITEM_BONUS_ITEM_LEVEL = 1,
+ ITEM_BONUS_STAT = 2,
+ ITEM_BONUS_QUALITY = 3,
+ ITEM_BONUS_DESCRIPTION = 4,
+ ITEM_BONUS_SUFFIX = 5,
+ ITEM_BONUS_SOCKET = 6,
+ ITEM_BONUS_APPEARANCE = 7,
+ ITEM_BONUS_REQUIRED_LEVEL = 8,
+ ITEM_BONUS_DISPLAY_TOAST_METHOD = 9,
+ ITEM_BONUS_REPAIR_COST_MULTIPLIER = 10,
+ ITEM_BONUS_SCALING_STAT_DISTRIBUTION = 11,
+ ITEM_BONUS_DISENCHANT_LOOT_ID = 12,
+ ITEM_BONUS_SCALING_STAT_DISTRIBUTION_2 = 13,
+ ITEM_BONUS_ITEM_LEVEL_OVERRIDE = 14
};
enum ItemLimitCategoryMode
diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp
index d79bf16ac07..590e2f7c7c3 100644
--- a/src/server/game/Entities/Item/Item.cpp
+++ b/src/server/game/Entities/Item/Item.cpp
@@ -1271,7 +1271,7 @@ void Item::SetGem(uint16 slot, ItemDynamicFieldGems const* gem)
}
case ITEM_ENCHANTMENT_TYPE_BONUS_LIST_CURVE:
{
- if (uint32 bonusListId = sDB2Manager.GetItemBonusListForItemLevelDelta(int16(sDB2Manager.GetCurveValueAt(CURVE_ID_ARTIFACT_RELIC_ITEM_LEVEL_BONUS, gemTemplate->GetBaseItemLevel() + gemBonus.ItemLevel))))
+ if (uint32 bonusListId = sDB2Manager.GetItemBonusListForItemLevelDelta(int16(sDB2Manager.GetCurveValueAt(CURVE_ID_ARTIFACT_RELIC_ITEM_LEVEL_BONUS, gemTemplate->GetBaseItemLevel() + gemBonus.ItemLevelBonus))))
if (DB2Manager::ItemBonusList const* bonuses = sDB2Manager.GetItemBonusList(bonusListId))
for (ItemBonusEntry const* itemBonus : *bonuses)
if (itemBonus->Type == ITEM_BONUS_ITEM_LEVEL)
@@ -2159,9 +2159,21 @@ uint32 Item::GetItemLevel(Player const* owner) const
return MIN_ITEM_LEVEL;
uint32 itemLevel = stats->GetBaseItemLevel();
- if (ScalingStatDistributionEntry const* ssd = sScalingStatDistributionStore.LookupEntry(GetScalingStatDistribution()))
- if (uint32 heirloomIlvl = uint32(sDB2Manager.GetCurveValueAt(ssd->ItemLevelCurveID, owner->getLevel())))
- itemLevel = heirloomIlvl;
+ if (!_bonusData.HasItemLevelBonus && !_bonusData.ItemLevelOverride)
+ {
+ if (ScalingStatDistributionEntry const* ssd = sScalingStatDistributionStore.LookupEntry(GetScalingStatDistribution()))
+ {
+ uint32 level = owner->getLevel();
+ if (uint32 fixedLevel = GetModifier(ITEM_MODIFIER_SCALING_STAT_DISTRIBUTION_FIXED_LEVEL))
+ level = fixedLevel;
+ if (uint32 heirloomIlvl = uint32(sDB2Manager.GetCurveValueAt(ssd->ItemLevelCurveID, level)))
+ itemLevel = heirloomIlvl;
+ }
+
+ itemLevel += _bonusData.ItemLevelBonus;
+ }
+ else
+ itemLevel = _bonusData.ItemLevelOverride;
if (ItemUpgradeEntry const* upgrade = sItemUpgradeStore.LookupEntry(GetModifier(ITEM_MODIFIER_UPGRADE_ID)))
itemLevel += upgrade->ItemLevelBonus;
@@ -2169,7 +2181,7 @@ uint32 Item::GetItemLevel(Player const* owner) const
for (uint32 i = 0; i < MAX_ITEM_PROTO_SOCKETS; ++i)
itemLevel += _bonusData.GemItemLevelBonus[i];
- return std::min(std::max(itemLevel + _bonusData.ItemLevel, uint32(MIN_ITEM_LEVEL)), uint32(MAX_ITEM_LEVEL));
+ return std::min(std::max(itemLevel, uint32(MIN_ITEM_LEVEL)), uint32(MAX_ITEM_LEVEL));
}
int32 Item::GetItemStatValue(uint32 index, Player const* owner) const
@@ -2423,7 +2435,7 @@ void Item::GiveArtifactXp(int32 amount, Item* sourceItem, uint32 artifactCategor
void BonusData::Initialize(ItemTemplate const* proto)
{
Quality = proto->GetQuality();
- ItemLevel = 0;
+ ItemLevelBonus = 0;
RequiredLevel = proto->GetBaseRequiredLevel();
for (uint32 i = 0; i < MAX_ITEM_PROTO_STATS; ++i)
ItemStatType[i] = proto->GetItemStatType(i);
@@ -2449,6 +2461,13 @@ void BonusData::Initialize(ItemTemplate const* proto)
RepairCostMultiplier = 1.0f;
ScalingStatDistribution = proto->GetScalingStatDistribution();
+ ItemLevelOverride = 0;
+ HasItemLevelBonus = false;
+
+ _state.AppearanceModPriority = std::numeric_limits<int32>::max();
+ _state.ScalingStatDistributionPriority = std::numeric_limits<int32>::max();
+ _state.ItemLevelOverridePriority = std::numeric_limits<int32>::max();
+ _state.HasQualityBonus = false;
}
void BonusData::Initialize(WorldPackets::Item::ItemInstance const& itemInstance)
@@ -2471,7 +2490,8 @@ void BonusData::AddBonus(uint32 type, int32 const (&values)[2])
switch (type)
{
case ITEM_BONUS_ITEM_LEVEL:
- ItemLevel += values[0];
+ ItemLevelBonus += values[0];
+ HasItemLevelBonus = true;
break;
case ITEM_BONUS_STAT:
{
@@ -2488,7 +2508,12 @@ void BonusData::AddBonus(uint32 type, int32 const (&values)[2])
break;
}
case ITEM_BONUS_QUALITY:
- if (Quality < static_cast<uint32>(values[0]))
+ if (!_state.HasQualityBonus)
+ {
+ Quality = static_cast<uint32>(values[0]);
+ _state.HasQualityBonus = true;
+ }
+ else if (Quality < static_cast<uint32>(values[0]))
Quality = static_cast<uint32>(values[0]);
break;
case ITEM_BONUS_SOCKET:
@@ -2505,8 +2530,11 @@ void BonusData::AddBonus(uint32 type, int32 const (&values)[2])
break;
}
case ITEM_BONUS_APPEARANCE:
- if (AppearanceModID < static_cast<uint32>(values[0]))
+ if (values[1] < _state.AppearanceModPriority)
+ {
AppearanceModID = static_cast<uint32>(values[0]);
+ _state.AppearanceModPriority = values[1];
+ }
break;
case ITEM_BONUS_REQUIRED_LEVEL:
RequiredLevel += values[0];
@@ -2515,7 +2543,19 @@ void BonusData::AddBonus(uint32 type, int32 const (&values)[2])
RepairCostMultiplier *= static_cast<float>(values[0]) * 0.01f;
break;
case ITEM_BONUS_SCALING_STAT_DISTRIBUTION:
- ScalingStatDistribution = static_cast<uint32>(values[0]);
+ case ITEM_BONUS_SCALING_STAT_DISTRIBUTION_2:
+ if (values[1] < _state.ScalingStatDistributionPriority)
+ {
+ ScalingStatDistribution = static_cast<uint32>(values[0]);
+ _state.ScalingStatDistributionPriority = values[1];
+ }
+ break;
+ case ITEM_BONUS_ITEM_LEVEL_OVERRIDE:
+ if (values[1] < _state.ItemLevelOverridePriority)
+ {
+ ItemLevelOverride = static_cast<uint32>(values[0]);
+ _state.ItemLevelOverridePriority = values[1];
+ }
break;
}
}
diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h
index 204eb8e44d3..ca8819ad5ab 100644
--- a/src/server/game/Entities/Item/Item.h
+++ b/src/server/game/Entities/Item/Item.h
@@ -263,7 +263,7 @@ extern ItemModifier const IllusionModifierSlotBySpec[MAX_SPECIALIZATIONS];
struct BonusData
{
uint32 Quality;
- int32 ItemLevel;
+ int32 ItemLevelBonus;
int32 RequiredLevel;
int32 ItemStatType[MAX_ITEM_PROTO_STATS];
int32 ItemStatValue[MAX_ITEM_PROTO_STATS];
@@ -273,12 +273,22 @@ struct BonusData
uint32 AppearanceModID;
float RepairCostMultiplier;
uint32 ScalingStatDistribution;
-
+ uint32 ItemLevelOverride;
uint32 GemItemLevelBonus[MAX_ITEM_PROTO_SOCKETS];
+ bool HasItemLevelBonus;
void Initialize(ItemTemplate const* proto);
void Initialize(WorldPackets::Item::ItemInstance const& itemInstance);
void AddBonus(uint32 type, int32 const (&values)[2]);
+
+private:
+ struct
+ {
+ int32 AppearanceModPriority;
+ int32 ScalingStatDistributionPriority;
+ int32 ItemLevelOverridePriority;
+ bool HasQualityBonus;
+ } _state;
};
#pragma pack(push, 1)
diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h
index f44d3a4479f..f18f5f2e082 100644
--- a/src/server/game/Entities/Item/ItemTemplate.h
+++ b/src/server/game/Entities/Item/ItemTemplate.h
@@ -759,8 +759,6 @@ struct TC_GAME_API ItemTemplate
HolidayIds GetHolidayID() const { return HolidayIds(ExtendedData->HolidayID); }
float GetStatScalingFactor() const { return ExtendedData->StatScalingFactor; }
uint8 GetArtifactID() const { return ExtendedData->ArtifactID; }
- uint32 GetBaseArmor() const { return GetArmor(ExtendedData->ItemLevel); }
- void GetBaseDamage(float& minDamage, float& maxDamage) const { GetDamage(ExtendedData->ItemLevel, minDamage, maxDamage); }
uint32 MaxDurability;
std::vector<ItemEffectEntry const*> Effects;