aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-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/Player/Player.cpp87
-rw-r--r--src/server/game/Spells/SpellInfo.cpp8
4 files changed, 80 insertions, 23 deletions
diff --git a/src/server/game/DataStores/GameTables.cpp b/src/server/game/DataStores/GameTables.cpp
index 4a38b703b7a..e826e2f948e 100644
--- a/src/server/game/DataStores/GameTables.cpp
+++ b/src/server/game/DataStores/GameTables.cpp
@@ -27,6 +27,7 @@ GameTable<GtArtifactLevelXPEntry> sArtifactLevelXPGameTable;
GameTable<GtBarberShopCostBaseEntry> sBarberShopCostBaseGameTable;
GameTable<GtBaseMPEntry> sBaseMPGameTable;
GameTable<GtCombatRatingsEntry> sCombatRatingsGameTable;
+GameTable<GtCombatRatingsMultByILvl> sCombatRatingsMultByILvlGameTable;
GameTable<GtHpPerStaEntry> sHpPerStaGameTable;
GameTable<GtItemSocketCostPerLevelEntry> sItemSocketCostPerLevelGameTable;
GameTable<GtNpcDamageByClassEntry> sNpcDamageByClassGameTable[MAX_EXPANSIONS];
@@ -112,6 +113,7 @@ void LoadGameTables(std::string const& dataPath)
LOAD_GT(sBarberShopCostBaseGameTable, "BarberShopCostBase.txt");
LOAD_GT(sBaseMPGameTable, "BaseMp.txt");
LOAD_GT(sCombatRatingsGameTable, "CombatRatings.txt");
+ LOAD_GT(sCombatRatingsMultByILvlGameTable, "CombatRatingsMultByILvl.txt");
LOAD_GT(sItemSocketCostPerLevelGameTable, "ItemSocketCostPerLevel.txt");
LOAD_GT(sHpPerStaGameTable, "HpPerSta.txt");
LOAD_GT(sNpcDamageByClassGameTable[0], "NpcDamageByClass.txt");
diff --git a/src/server/game/DataStores/GameTables.h b/src/server/game/DataStores/GameTables.h
index 4b9660621d2..abfee6978d0 100644
--- a/src/server/game/DataStores/GameTables.h
+++ b/src/server/game/DataStores/GameTables.h
@@ -88,6 +88,11 @@ struct GtCombatRatingsEntry
float Unused12 = 0.0f;
};
+struct GtCombatRatingsMultByILvl
+{
+ float RatingMultiplier = 0.0f;
+};
+
struct GtHpPerStaEntry
{
float Health = 0.0f;
@@ -191,6 +196,7 @@ TC_GAME_API extern GameTable<GtArtifactLevelXPEntry> sArtifactLevelXP
TC_GAME_API extern GameTable<GtBarberShopCostBaseEntry> sBarberShopCostBaseGameTable;
TC_GAME_API extern GameTable<GtBaseMPEntry> sBaseMPGameTable;
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<GtItemSocketCostPerLevelEntry> sItemSocketCostPerLevelGameTable;
TC_GAME_API extern GameTable<GtNpcDamageByClassEntry> sNpcDamageByClassGameTable[MAX_EXPANSIONS];
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index c3c6f147337..88da389f48d 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -7161,6 +7161,11 @@ void Player::_ApplyItemBonuses(Item* item, uint8 slot, bool apply)
if (slot >= INVENTORY_SLOT_BAG_END || !proto)
return;
+ uint32 itemLevel = item->GetItemLevel(this);
+ float combatRatingMultiplier = 1.0f;
+ if (GtCombatRatingsMultByILvl const* ratingMult = sCombatRatingsMultByILvlGameTable.GetRow(itemLevel))
+ combatRatingMultiplier = ratingMult->RatingMultiplier;
+
// req. check at equip, but allow use for extended range if range limit max level, set proper level
for (uint8 i = 0; i < MAX_ITEM_PROTO_STATS; ++i)
{
@@ -7201,34 +7206,34 @@ void Player::_ApplyItemBonuses(Item* item, uint8 slot, bool apply)
ApplyStatBuffMod(STAT_STAMINA, CalculatePct(val, GetModifierValue(UNIT_MOD_STAT_STAMINA, BASE_PCT_EXCLUDE_CREATE)), apply);
break;
case ITEM_MOD_DEFENSE_SKILL_RATING:
- ApplyRatingMod(CR_DEFENSE_SKILL, int32(val), apply);
+ ApplyRatingMod(CR_DEFENSE_SKILL, int32(val * combatRatingMultiplier), apply);
break;
case ITEM_MOD_DODGE_RATING:
- ApplyRatingMod(CR_DODGE, int32(val), apply);
+ ApplyRatingMod(CR_DODGE, int32(val * combatRatingMultiplier), apply);
break;
case ITEM_MOD_PARRY_RATING:
- ApplyRatingMod(CR_PARRY, int32(val), apply);
+ ApplyRatingMod(CR_PARRY, int32(val * combatRatingMultiplier), apply);
break;
case ITEM_MOD_BLOCK_RATING:
- ApplyRatingMod(CR_BLOCK, int32(val), apply);
+ ApplyRatingMod(CR_BLOCK, int32(val * combatRatingMultiplier), apply);
break;
case ITEM_MOD_HIT_MELEE_RATING:
- ApplyRatingMod(CR_HIT_MELEE, int32(val), apply);
+ ApplyRatingMod(CR_HIT_MELEE, int32(val * combatRatingMultiplier), apply);
break;
case ITEM_MOD_HIT_RANGED_RATING:
- ApplyRatingMod(CR_HIT_RANGED, int32(val), apply);
+ ApplyRatingMod(CR_HIT_RANGED, int32(val * combatRatingMultiplier), apply);
break;
case ITEM_MOD_HIT_SPELL_RATING:
- ApplyRatingMod(CR_HIT_SPELL, int32(val), apply);
+ ApplyRatingMod(CR_HIT_SPELL, int32(val * combatRatingMultiplier), apply);
break;
case ITEM_MOD_CRIT_MELEE_RATING:
- ApplyRatingMod(CR_CRIT_MELEE, int32(val), apply);
+ ApplyRatingMod(CR_CRIT_MELEE, int32(val * combatRatingMultiplier), apply);
break;
case ITEM_MOD_CRIT_RANGED_RATING:
- ApplyRatingMod(CR_CRIT_RANGED, int32(val), apply);
+ ApplyRatingMod(CR_CRIT_RANGED, int32(val * combatRatingMultiplier), apply);
break;
case ITEM_MOD_CRIT_SPELL_RATING:
- ApplyRatingMod(CR_CRIT_SPELL, int32(val), apply);
+ ApplyRatingMod(CR_CRIT_SPELL, int32(val * combatRatingMultiplier), apply);
break;
// case ITEM_MOD_HIT_TAKEN_MELEE_RATING:
// ApplyRatingMod(CR_HIT_TAKEN_MELEE, int32(val), apply);
@@ -7258,14 +7263,14 @@ void Player::_ApplyItemBonuses(Item* item, uint8 slot, bool apply)
ApplyRatingMod(CR_HASTE_SPELL, int32(val), apply);
break;
case ITEM_MOD_HIT_RATING:
- ApplyRatingMod(CR_HIT_MELEE, int32(val), apply);
- ApplyRatingMod(CR_HIT_RANGED, int32(val), apply);
- ApplyRatingMod(CR_HIT_SPELL, int32(val), apply);
+ ApplyRatingMod(CR_HIT_MELEE, int32(val * combatRatingMultiplier), apply);
+ ApplyRatingMod(CR_HIT_RANGED, int32(val * combatRatingMultiplier), apply);
+ ApplyRatingMod(CR_HIT_SPELL, int32(val * combatRatingMultiplier), apply);
break;
case ITEM_MOD_CRIT_RATING:
- ApplyRatingMod(CR_CRIT_MELEE, int32(val), apply);
- ApplyRatingMod(CR_CRIT_RANGED, int32(val), apply);
- ApplyRatingMod(CR_CRIT_SPELL, int32(val), apply);
+ ApplyRatingMod(CR_CRIT_MELEE, int32(val * combatRatingMultiplier), apply);
+ ApplyRatingMod(CR_CRIT_RANGED, int32(val * combatRatingMultiplier), apply);
+ ApplyRatingMod(CR_CRIT_SPELL, int32(val * combatRatingMultiplier), apply);
break;
// case ITEM_MOD_HIT_TAKEN_RATING: // Unused since 3.3.5
// ApplyRatingMod(CR_HIT_TAKEN_MELEE, int32(val), apply);
@@ -7278,15 +7283,15 @@ void Player::_ApplyItemBonuses(Item* item, uint8 slot, bool apply)
// ApplyRatingMod(CR_CRIT_TAKEN_SPELL, int32(val), apply);
// break;
case ITEM_MOD_RESILIENCE_RATING:
- ApplyRatingMod(CR_RESILIENCE_PLAYER_DAMAGE, int32(val), apply);
+ ApplyRatingMod(CR_RESILIENCE_PLAYER_DAMAGE, int32(val * combatRatingMultiplier), apply);
break;
case ITEM_MOD_HASTE_RATING:
- ApplyRatingMod(CR_HASTE_MELEE, int32(val), apply);
- ApplyRatingMod(CR_HASTE_RANGED, int32(val), apply);
- ApplyRatingMod(CR_HASTE_SPELL, int32(val), apply);
+ ApplyRatingMod(CR_HASTE_MELEE, int32(val * combatRatingMultiplier), apply);
+ ApplyRatingMod(CR_HASTE_RANGED, int32(val * combatRatingMultiplier), apply);
+ ApplyRatingMod(CR_HASTE_SPELL, int32(val * combatRatingMultiplier), apply);
break;
case ITEM_MOD_EXPERTISE_RATING:
- ApplyRatingMod(CR_EXPERTISE, int32(val), apply);
+ ApplyRatingMod(CR_EXPERTISE, int32(val * combatRatingMultiplier), apply);
break;
case ITEM_MOD_ATTACK_POWER:
HandleStatModifier(UNIT_MOD_ATTACK_POWER, TOTAL_VALUE, float(val), apply);
@@ -7295,6 +7300,11 @@ void Player::_ApplyItemBonuses(Item* item, uint8 slot, bool apply)
case ITEM_MOD_RANGED_ATTACK_POWER:
HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, float(val), apply);
break;
+ case ITEM_MOD_VERSATILITY:
+ ApplyRatingMod(CR_VERSATILITY_DAMAGE_DONE, int32(val * combatRatingMultiplier), apply);
+ ApplyRatingMod(CR_VERSATILITY_DAMAGE_TAKEN, int32(val * combatRatingMultiplier), apply);
+ ApplyRatingMod(CR_VERSATILITY_HEALING_DONE, int32(val * combatRatingMultiplier), apply);
+ break;
case ITEM_MOD_MANA_REGENERATION:
ApplyManaRegenBonus(int32(val), apply);
break;
@@ -7311,7 +7321,7 @@ void Player::_ApplyItemBonuses(Item* item, uint8 slot, bool apply)
ApplySpellPenetrationBonus(val, apply);
break;
case ITEM_MOD_MASTERY_RATING:
- ApplyRatingMod(CR_MASTERY, int32(val), apply);
+ ApplyRatingMod(CR_MASTERY, int32(val * combatRatingMultiplier), apply);
break;
case ITEM_MOD_FIRE_RESISTANCE:
HandleStatModifier(UNIT_MOD_RESISTANCE_FIRE, BASE_VALUE, float(val), apply);
@@ -7331,6 +7341,39 @@ void Player::_ApplyItemBonuses(Item* item, uint8 slot, bool apply)
case ITEM_MOD_ARCANE_RESISTANCE:
HandleStatModifier(UNIT_MOD_RESISTANCE_ARCANE, BASE_VALUE, float(val), apply);
break;
+ case ITEM_MOD_PVP_POWER:
+ ApplyRatingMod(CR_PVP_POWER, int32(val), apply);
+ break;
+ case ITEM_MOD_CR_AMPLIFY:
+ ApplyRatingMod(CR_AMPLIFY, int32(val), apply);
+ break;
+ case ITEM_MOD_CR_MULTISTRIKE:
+ ApplyRatingMod(CR_MULTISTRIKE, int32(val), apply);
+ break;
+ case ITEM_MOD_CR_READINESS:
+ ApplyRatingMod(CR_READINESS, int32(val * combatRatingMultiplier), apply);
+ break;
+ case ITEM_MOD_CR_SPEED:
+ ApplyRatingMod(CR_SPEED, int32(val * combatRatingMultiplier), apply);
+ break;
+ case ITEM_MOD_CR_LIFESTEAL:
+ ApplyRatingMod(CR_LIFESTEAL, int32(val * combatRatingMultiplier), apply);
+ break;
+ case ITEM_MOD_CR_AVOIDANCE:
+ ApplyRatingMod(CR_AVOIDANCE, int32(val * combatRatingMultiplier), apply);
+ break;
+ case ITEM_MOD_CR_STURDINESS:
+ ApplyRatingMod(CR_STURDINESS, int32(val * combatRatingMultiplier), apply);
+ break;
+ case ITEM_MOD_CR_UNUSED_7:
+ ApplyRatingMod(CR_UNUSED_7, int32(val), apply);
+ break;
+ case ITEM_MOD_CR_CLEAVE:
+ ApplyRatingMod(CR_CLEAVE, int32(val), apply);
+ break;
+ case ITEM_MOD_CR_UNUSED_12:
+ ApplyRatingMod(CR_UNUSED_12, int32(val), apply);
+ break;
case ITEM_MOD_AGI_STR_INT:
HandleStatModifier(UNIT_MOD_STAT_AGILITY, BASE_VALUE, float(val), apply);
HandleStatModifier(UNIT_MOD_STAT_STRENGTH, BASE_VALUE, float(val), apply);
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp
index 45756a36ba1..45a79f8c458 100644
--- a/src/server/game/Spells/SpellInfo.cpp
+++ b/src/server/game/Spells/SpellInfo.cpp
@@ -491,7 +491,13 @@ int32 SpellEffectInfo::CalcValue(Unit const* caster /*= nullptr*/, int32 const*
value = gtScaling->Item;
}
else
- value = GetRandomPropertyPoints(itemLevel != -1 ? uint32(itemLevel) : 1u, ITEM_QUALITY_RARE, INVTYPE_CHEST, 0);
+ {
+ uint32 effectiveItemLevel = itemLevel != -1 ? uint32(itemLevel) : 1u;
+ value = GetRandomPropertyPoints(effectiveItemLevel, ITEM_QUALITY_RARE, INVTYPE_CHEST, 0);
+ if (IsAura() && ApplyAuraName == SPELL_AURA_MOD_RATING)
+ if (GtCombatRatingsMultByILvl const* ratingMult = sCombatRatingsMultByILvlGameTable.GetRow(effectiveItemLevel))
+ value *= ratingMult->RatingMultiplier;
+ }
}
else
value = GetRandomPropertyPoints(_spellInfo->Scaling.ScalesFromItemLevel, ITEM_QUALITY_RARE, INVTYPE_CHEST, 0);