aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Item/Item.cpp2
-rw-r--r--src/server/game/Entities/Player/Player.cpp23
-rw-r--r--src/server/game/Entities/Player/Player.h13
-rw-r--r--src/server/game/Entities/Unit/Unit.h1
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; }