aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2016-11-18 00:04:02 +0100
committerShauren <shauren.trinity@gmail.com>2016-11-18 00:04:02 +0100
commitd64da044d87dd8c792dd3e8dc1be53e81c701273 (patch)
treefffe2ee67a119d81511928d3bda4ac4deb2466cd /src/server/game/Entities
parentcd898ac446dda1c2ccd5163d10bba341b8a6b5bd (diff)
Core/Items: Fixed secondary stat calculation at item levels > 800
Diffstat (limited to 'src/server/game/Entities')
-rw-r--r--src/server/game/Entities/Player/Player.cpp87
1 files changed, 65 insertions, 22 deletions
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);