diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/DataStores/DBCEnums.h | 26 | ||||
-rw-r--r-- | src/server/game/Entities/Item/Item.cpp | 60 | ||||
-rw-r--r-- | src/server/game/Entities/Item/Item.h | 14 | ||||
-rw-r--r-- | src/server/game/Entities/Item/ItemTemplate.h | 2 |
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; |