diff options
author | Shauren <shauren.trinity@gmail.com> | 2025-04-28 10:36:47 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2025-04-28 10:36:47 +0200 |
commit | 255082782cef48f68ec4ad041202be8e8693071c (patch) | |
tree | be0e01a4c7864b819c0384ab7573957ff2d3c344 | |
parent | 6a20d3181d1ef939bca61e7fe2ce265a974678f4 (diff) |
Core/Players: Implemented item level based armor damage reduction diminishing for pvp
-rw-r--r-- | src/server/game/DataStores/GameTables.cpp | 2 | ||||
-rw-r--r-- | src/server/game/DataStores/GameTables.h | 6 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 18 |
3 files changed, 24 insertions, 2 deletions
diff --git a/src/server/game/DataStores/GameTables.cpp b/src/server/game/DataStores/GameTables.cpp index 6483b8fd63c..56f214a1d2b 100644 --- a/src/server/game/DataStores/GameTables.cpp +++ b/src/server/game/DataStores/GameTables.cpp @@ -33,6 +33,7 @@ GameTable<GtBattlePetXPEntry> sBattlePetXPGameTable; GameTable<GtCombatRatingsEntry> sCombatRatingsGameTable; GameTable<GtCombatRatingsMultByILvl> sCombatRatingsMultByILvlGameTable; GameTable<GtHpPerStaEntry> sHpPerStaGameTable; +GameTable<GtItemLevelByLevelEntry> sItemLevelByLevelTable; GameTable<GtItemSocketCostPerLevelEntry> sItemSocketCostPerLevelGameTable; GameTable<GtNpcManaCostScalerEntry> sNpcManaCostScalerGameTable; GameTable<GtSpellScalingEntry> sSpellScalingGameTable; @@ -123,6 +124,7 @@ void LoadGameTables(std::string const& dataPath) LOAD_GT(sBattlePetXPGameTable, "BattlePetXP.txt"); LOAD_GT(sCombatRatingsGameTable, "CombatRatings.txt"); LOAD_GT(sCombatRatingsMultByILvlGameTable, "CombatRatingsMultByILvl.txt"); + LOAD_GT(sItemLevelByLevelTable, "ItemLevelByLevel.txt"); LOAD_GT(sItemSocketCostPerLevelGameTable, "ItemSocketCostPerLevel.txt"); LOAD_GT(sHpPerStaGameTable, "HpPerSta.txt"); LOAD_GT(sNpcManaCostScalerGameTable, "NPCManaCostScaler.txt"); diff --git a/src/server/game/DataStores/GameTables.h b/src/server/game/DataStores/GameTables.h index 188c9b74a65..d6ce6686555 100644 --- a/src/server/game/DataStores/GameTables.h +++ b/src/server/game/DataStores/GameTables.h @@ -118,6 +118,11 @@ struct GtItemSocketCostPerLevelEntry float SocketCost = 0.0f; }; +struct GtItemLevelByLevelEntry +{ + float ItemLevel = 0.0f; +}; + struct GtNpcManaCostScalerEntry { float Scaler = 0.0f; @@ -195,6 +200,7 @@ TC_GAME_API extern GameTable<GtBattlePetXPEntry> sBattlePetXP TC_GAME_API extern GameTable<GtCombatRatingsEntry> sCombatRatingsGameTable; TC_GAME_API extern GameTable<GtCombatRatingsMultByILvl> sCombatRatingsMultByILvlGameTable; TC_GAME_API extern GameTable<GtHpPerStaEntry> sHpPerStaGameTable; +TC_GAME_API extern GameTable<GtItemLevelByLevelEntry> sItemLevelByLevelTable; TC_GAME_API extern GameTable<GtItemSocketCostPerLevelEntry> sItemSocketCostPerLevelGameTable; TC_GAME_API extern GameTable<GtNpcManaCostScalerEntry> sNpcManaCostScalerGameTable; TC_GAME_API extern GameTable<GtSpellScalingEntry> sSpellScalingGameTable; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 5c21ec7ac5c..a23fb293312 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -1713,15 +1713,29 @@ void Unit::HandleEmoteCommand(Emote emoteId, Player* target /*=nullptr*/, Trinit if (G3D::fuzzyLe(armor, 0.0f)) return damage; - Classes attackerClass = CLASS_WARRIOR; + Classes attackerClass = CLASS_NONE; + Optional<float> attackerItemLevel; if (attacker) { attackerLevel = attacker->GetLevelForTarget(victim); - attackerClass = Classes(attacker->GetClass()); + if (Player const* ownerPlayer = attacker->GetCharmerOrOwnerPlayerOrPlayerItself()) + attackerItemLevel = ownerPlayer->m_playerData->AvgItemLevel[AsUnderlyingType(AvgItemLevelCategory::EquippedBase)]; + else + attackerClass = Classes(attacker->GetClass()); } // Expansion and ContentTuningID necessary? Does Player get a ContentTuningID too ? float armorConstant = sDB2Manager.EvaluateExpectedStat(ExpectedStatType::ArmorConstant, attackerLevel, -2, 0, attackerClass, 0); + if (attackerItemLevel) + { + uint32 maxLevelForExpansion = GetMaxLevelForExpansion(sWorld->getIntConfig(CONFIG_EXPANSION)); + if (attackerLevel == maxLevelForExpansion) + { + float itemLevelDelta = *attackerItemLevel - ASSERT_NOTNULL(sItemLevelByLevelTable.GetRow(maxLevelForExpansion))->ItemLevel; + if (uint32 curveId = sDB2Manager.GetGlobalCurveId(GlobalCurve::ArmorItemLevelDiminishing)) + armorConstant *= sDB2Manager.GetCurveValueAt(curveId, itemLevelDelta); + } + } if (!(armor + armorConstant)) return damage; |