aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2025-04-28 10:36:47 +0200
committerShauren <shauren.trinity@gmail.com>2025-04-28 10:36:47 +0200
commit255082782cef48f68ec4ad041202be8e8693071c (patch)
treebe0e01a4c7864b819c0384ab7573957ff2d3c344
parent6a20d3181d1ef939bca61e7fe2ce265a974678f4 (diff)
Core/Players: Implemented item level based armor damage reduction diminishing for pvp
-rw-r--r--src/server/game/DataStores/GameTables.cpp2
-rw-r--r--src/server/game/DataStores/GameTables.h6
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp18
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;