diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Item/Item.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 23 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 13 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 1 |
4 files changed, 33 insertions, 6 deletions
diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index acae7866362..6ba4473bfd8 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -2250,8 +2250,8 @@ uint32 Item::GetItemLevel(Player const* owner) const ItemTemplate const* itemTemplate = GetTemplate(); uint32 minItemLevel = owner->m_unitData->MinItemLevel; uint32 minItemLevelCutoff = owner->m_unitData->MinItemLevelCutoff; - uint32 maxItemLevel = itemTemplate->HasFlag(ITEM_FLAG3_IGNORE_ITEM_LEVEL_CAP_IN_PVP) ? 0 : owner->m_unitData->MaxItemLevel; bool pvpBonus = owner->IsUsingPvpItemLevels(); + uint32 maxItemLevel = pvpBonus && itemTemplate->HasFlag(ITEM_FLAG3_IGNORE_ITEM_LEVEL_CAP_IN_PVP) ? 0 : owner->m_unitData->MaxItemLevel; uint32 azeriteLevel = 0; if (AzeriteItem const* azeriteItem = ToAzeriteItem()) azeriteLevel = azeriteItem->GetEffectiveLevel(); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index ea44e883944..dba5ded6b21 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -29984,25 +29984,42 @@ void Player::UpdateAverageItemLevelTotal() sum += std::get<1>(mainHand); sum /= 16.0f; - SetAverageItemLevelTotal(sum); + SetAverageItemLevel(sum, AvgItemLevelCategory::Base); } void Player::UpdateAverageItemLevelEquipped() { float totalItemLevel = 0; + float totalItemLevelEffective = 0; for (uint8 i = EQUIPMENT_SLOT_START; i < EQUIPMENT_SLOT_END; i++) { if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) { - uint32 itemLevel = pItem->GetItemLevel(this); + uint32 azeriteLevel = 0; + if (AzeriteItem const* azeriteItem = pItem->ToAzeriteItem()) + azeriteLevel = azeriteItem->GetEffectiveLevel(); + + uint32 itemLevel = Item::GetItemLevel(pItem->GetTemplate(), *pItem->GetBonus(), GetLevel(), pItem->GetModifier(ITEM_MODIFIER_TIMEWALKER_LEVEL), + 0, 0, 0, + false, azeriteLevel); + uint32 itemLevelEffective = Item::GetItemLevel(pItem->GetTemplate(), *pItem->GetBonus(), GetEffectiveLevel(), pItem->GetModifier(ITEM_MODIFIER_TIMEWALKER_LEVEL), + m_unitData->MinItemLevel, m_unitData->MinItemLevelCutoff, IsUsingPvpItemLevels() && pItem->GetTemplate()->HasFlag(ITEM_FLAG3_IGNORE_ITEM_LEVEL_CAP_IN_PVP) ? 0 : m_unitData->MaxItemLevel, + IsUsingPvpItemLevels(), + azeriteLevel); totalItemLevel += itemLevel; + totalItemLevelEffective += itemLevelEffective; if (!m_canTitanGrip && i == EQUIPMENT_SLOT_MAINHAND && pItem->GetTemplate()->GetInventoryType() == INVTYPE_2HWEAPON) // 2h weapon counts twice + { totalItemLevel += itemLevel; + totalItemLevelEffective += itemLevelEffective; + } } } totalItemLevel /= 16.0; - SetAverageItemLevelEquipped(totalItemLevel); + totalItemLevelEffective /= 16.0; + SetAverageItemLevel(totalItemLevel, AvgItemLevelCategory::EquippedBase); + SetAverageItemLevel(totalItemLevelEffective, AvgItemLevelCategory::EquippedEffective); } void Player::SetWarModeDesired(bool enabled) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 8b3b4263e7c..25a16e48b1e 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1009,6 +1009,16 @@ enum class DisplayToastMethod : uint8 CorruptedLoot = 19 }; +enum class AvgItemLevelCategory : uint32 +{ + Base = 0, + EquippedBase = 1, + EquippedEffective = 2, + Pvp = 3, + PvpWeighted = 4, + EquippedEffectiveWeighted = 5 +}; + class Player; /// Holder for Battleground data @@ -2790,8 +2800,7 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> void RemovePlayerFlagEx(PlayerFlagsEx flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::PlayerFlagsEx), flags); } void ReplaceAllPlayerFlagsEx(PlayerFlagsEx flags) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::PlayerFlagsEx), flags); } - void SetAverageItemLevelTotal(float newItemLevel) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::AvgItemLevel, 0), newItemLevel); } - void SetAverageItemLevelEquipped(float newItemLevel) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::AvgItemLevel, 1), newItemLevel); } + void SetAverageItemLevel(float newItemLevel, AvgItemLevelCategory category) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::AvgItemLevel, uint32(category)), newItemLevel); } uint32 GetCustomizationChoice(uint32 chrCustomizationOptionId) const { diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index cae58533142..77be8f57825 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -747,6 +747,7 @@ class TC_GAME_API Unit : public WorldObject int32 GetContentTuning() const { return m_unitData->ContentTuningID; } uint8 GetLevel() const { return uint8(m_unitData->Level); } + uint8 GetEffectiveLevel() const { return uint8(*m_unitData->EffectiveLevel ? *m_unitData->EffectiveLevel : *m_unitData->Level); } uint8 GetLevelForTarget(WorldObject const* /*target*/) const override { return GetLevel(); } void SetLevel(uint8 lvl, bool sendUpdate = true); uint8 GetRace() const { return m_unitData->Race; } |