diff --git a/Source/Game/DataStorage/CliDB.cs b/Source/Game/DataStorage/CliDB.cs index 168bcf531..5d5897937 100644 --- a/Source/Game/DataStorage/CliDB.cs +++ b/Source/Game/DataStorage/CliDB.cs @@ -436,8 +436,9 @@ namespace Game.DataStorage BattlePetXPGameTable = ReadGameTable("BattlePetXP.txt"); CombatRatingsGameTable = ReadGameTable("CombatRatings.txt"); CombatRatingsMultByILvlGameTable = ReadGameTable("CombatRatingsMultByILvl.txt"); - ItemSocketCostPerLevelGameTable = ReadGameTable("ItemSocketCostPerLevel.txt"); HpPerStaGameTable = ReadGameTable("HpPerSta.txt"); + ItemLevelByLevelTable = ReadGameTable("ItemLevelByLevel.txt"); + ItemSocketCostPerLevelGameTable = ReadGameTable("ItemSocketCostPerLevel.txt"); NpcManaCostScalerGameTable = ReadGameTable("NPCManaCostScaler.txt"); SpellScalingGameTable = ReadGameTable("SpellScaling.txt"); StaminaMultByILvlGameTable = ReadGameTable("StaminaMultByILvl.txt"); @@ -807,6 +808,7 @@ namespace Game.DataStorage public static GameTable CombatRatingsGameTable; public static GameTable CombatRatingsMultByILvlGameTable; public static GameTable HpPerStaGameTable; + public static GameTable ItemLevelByLevelTable; public static GameTable ItemSocketCostPerLevelGameTable; public static GameTable NpcManaCostScalerGameTable; public static GameTable SpellScalingGameTable; diff --git a/Source/Game/DataStorage/Structs/GameTablesRecords.cs b/Source/Game/DataStorage/Structs/GameTablesRecords.cs index d045bf5d7..f97479ed5 100644 --- a/Source/Game/DataStorage/Structs/GameTablesRecords.cs +++ b/Source/Game/DataStorage/Structs/GameTablesRecords.cs @@ -92,6 +92,11 @@ namespace Game.DataStorage public float Health; } + public sealed class GtItemLevelByLevelRecord + { + public float ItemLevel; + } + public sealed class GtItemSocketCostPerLevelRecord { public float SocketCost; diff --git a/Source/Game/Entities/Unit/Unit.cs b/Source/Game/Entities/Unit/Unit.cs index 05d89acb1..4ae12e526 100644 --- a/Source/Game/Entities/Unit/Unit.cs +++ b/Source/Game/Entities/Unit/Unit.cs @@ -3888,15 +3888,32 @@ namespace Game.Entities if (MathFunctions.fuzzyLe(armor, 0.0f)) return damage; - Class attackerClass = Class.Warrior; + Class attackerClass = Class.None; + float? attackerItemLevel = null; if (attacker != null) { attackerLevel = attacker.GetLevelForTarget(victim); - attackerClass = attacker.GetClass(); + Player ownerPlayer = attacker.GetCharmerOrOwnerPlayerOrPlayerItself(); + if (ownerPlayer != null) + attackerItemLevel = ownerPlayer.m_playerData.AvgItemLevel[(int)AvgItemLevelCategory.EquippedBase]; + else + attackerClass = attacker.GetClass(); } // Expansion and ContentTuningID necessary? Does Player get a ContentTuningID too ? float armorConstant = Global.DB2Mgr.EvaluateExpectedStat(ExpectedStatType.ArmorConstant, attackerLevel, -2, 0, attackerClass, 0); + if (attackerItemLevel.HasValue) + { + uint maxLevelForExpansion = Global.ObjectMgr.GetMaxLevelForExpansion((Expansion)WorldConfig.GetUIntValue(WorldCfg.Expansion)); + if (attackerLevel == maxLevelForExpansion) + { + float itemLevelDelta = attackerItemLevel.Value - CliDB.ItemLevelByLevelTable.GetRow(maxLevelForExpansion).ItemLevel; + uint curveId = Global.DB2Mgr.GetGlobalCurveId(GlobalCurve.ArmorItemLevelDiminishing); + if (curveId != 0) + armorConstant *= Global.DB2Mgr.GetCurveValueAt(curveId, itemLevelDelta); + } + } + if ((armor + armorConstant) == 0) return damage;