diff options
author | Shauren <shauren.trinity@gmail.com> | 2016-11-18 00:04:02 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2016-11-18 00:04:02 +0100 |
commit | d64da044d87dd8c792dd3e8dc1be53e81c701273 (patch) | |
tree | fffe2ee67a119d81511928d3bda4ac4deb2466cd /src | |
parent | cd898ac446dda1c2ccd5163d10bba341b8a6b5bd (diff) |
Core/Items: Fixed secondary stat calculation at item levels > 800
Diffstat (limited to 'src')
-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/Player/Player.cpp | 87 | ||||
-rw-r--r-- | src/server/game/Spells/SpellInfo.cpp | 8 |
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); |