diff options
Diffstat (limited to 'src/server')
| -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; }  | 
