Index: game/Player.cpp =================================================================== --- game/Player.cpp (revision 4874) +++ game/Player.cpp (working copy) @@ -4044,6 +4044,38 @@ return value; } +uint32 Player::GetMeleeCritDamageReduction(uint32 damage) const +{ + float melee = GetRatingBonusValue(PLAYER_FIELD_CRIT_TAKEN_MELEE_RATING)*2.0f; + if (melee>25.0f) melee = 25.0f; + return uint32 (melee * damage /100.0f); +} + +uint32 Player::GetRangedCritDamageReduction(uint32 damage) const +{ + float ranged = GetRatingBonusValue(PLAYER_FIELD_CRIT_TAKEN_RANGED_RATING)*2.0f; + if (ranged>25.0f) ranged=25.0f; + return uint32 (ranged * damage /100.0f); +} + +uint32 Player::GetSpellCritDamageReduction(uint32 damage) const +{ + float spell = GetRatingBonusValue(PLAYER_FIELD_CRIT_TAKEN_SPELL_RATING)*2.0f; + if (spell>25.0f) spell = 25.0f; + return uint32 (spell * damage / 100.0f); +} + +uint32 Player::GetDotDamageReduction(uint32 damage) const +{ + float spellDot = GetRatingBonusValue(PLAYER_FIELD_CRIT_TAKEN_SPELL_RATING); + return uint32 (spellDot * damage / 100.0f); +} + +float Player::GetExpertiseDodgeOrParryReduction() const +{ + return GetUInt32Value(PLAYER_EXPERTISE) / 4.0f; +} + float Player::OCTRegenHPPerSpirit() { uint32 level = getLevel(); @@ -4097,62 +4129,58 @@ switch (index) { - case PLAYER_FIELD_MELEE_WEAPON_SKILL_RATING: - case PLAYER_FIELD_OFFHAND_WEAPON_SKILL_RATING: - case PLAYER_FIELD_RANGED_WEAPON_SKILL_RATING: - { - //Weapon skill: 2.5 - //RatingChange = value/(2.5 * RatingCoeffecient); - /*uint16 slot; - switch (index) - { - case PLAYER_FIELD_MELEE_WEAPON_SKILL_RATING: slot = EQUIPMENT_SLOT_MAINHAND; break; - case PLAYER_FIELD_OFFHAND_WEAPON_SKILL_RATING: slot = EQUIPMENT_SLOT_OFFHAND; break; - case PLAYER_FIELD_RANGED_WEAPON_SKILL_RATING: slot = EQUIPMENT_SLOT_RANGED; break; +// Implemended in Unit::RollMeleeOutcomeAgainst +// case PLAYER_FIELD_ALL_WEAPONS_SKILL_RATING: +// break; +// Implemended in Unit::RollMeleeOutcomeAgainst +// case PLAYER_FIELD_DEFENCE_RATING: +// break; + case PLAYER_FIELD_DODGE_RATING: UpdateDodgePercentage(); break; + case PLAYER_FIELD_PARRY_RATING: UpdateParryPercentage(); break; + case PLAYER_FIELD_BLOCK_RATING: UpdateBlockPercentage(); break; + case PLAYER_FIELD_MELEE_HIT_RATING: + RatingChange = value/ RatingCoeffecient; + m_modMeleeHitChance += apply?RatingChange:-RatingChange; + break; + case PLAYER_FIELD_RANGED_HIT_RATING: + RatingChange = value/ RatingCoeffecient; + m_modRangedHitChance += apply?RatingChange:-RatingChange; + break; + case PLAYER_FIELD_SPELL_HIT_RATING: + RatingChange = value/ RatingCoeffecient; + m_modSpellHitChance += apply?RatingChange:-RatingChange; + break; + case PLAYER_FIELD_MELEE_CRIT_RATING: + if(affectStats) + { + UpdateCritPercentage(BASE_ATTACK); + UpdateCritPercentage(OFF_ATTACK); } - Item *item = GetItemByPos(INVENTORY_SLOT_BAG_0, slot); - uint32 skill = item && !item->IsBroken() && ((Player*)this)->IsUseEquipedWeapon() - ? item->GetSkill() : SKILL_UNARMED; - ModifySkillBonus(skill, (apply ? (int32)RatingChange: -(int32)RatingChange));*/ - } - break; - case PLAYER_FIELD_DEFENCE_RATING: - //Defense: 1.5 + break; + case PLAYER_FIELD_RANGED_CRIT_RATING: + if(affectStats) + UpdateCritPercentage(RANGED_ATTACK); + break; + case PLAYER_FIELD_SPELL_CRIT_RATING: + if(affectStats) + UpdateAllSpellCritChances(); + break; +// Implemended in Unit::MeleeMissChanceCalc +// case PLAYER_FIELD_HIT_TAKEN_MELEE_RATING: +// case PLAYER_FIELD_HIT_TAKEN_RANGED_RATING: +// break; +// Implemended in Unit::SpellMissChanceCalc +// case PLAYER_FIELD_HIT_TAKEN_SPELL_RATING: +// break; +// Implemended in Unit::RollMeleeOutcomeAgainst (only for chance to crit) +// case PLAYER_FIELD_CRIT_TAKEN_MELEE_RATING: +// case PLAYER_FIELD_CRIT_TAKEN_RANGED_RATING: +// break; +// Implemented in Unit::SpellCriticalBonus (only for chance to crit) +// case PLAYER_FIELD_CRIT_TAKEN_SPELL_RATING: +// break; + case PLAYER_FIELD_MELEE_HASTE_RATING: RatingChange = value/ RatingCoeffecient; - ModifySkillBonus(SKILL_DEFENSE,(apply ? (int32)RatingChange: -(int32)RatingChange)); - if(affectStats) - UpdateDefenseBonusesMod(); - break; - case PLAYER_FIELD_DODGE_RATING: UpdateDodgePercentage(); break; - case PLAYER_FIELD_PARRY_RATING: UpdateParryPercentage(); break; - case PLAYER_FIELD_BLOCK_RATING: UpdateBlockPercentage(); break; - case PLAYER_FIELD_MELEE_HIT_RATING: - //Hit (melee): 10 - RatingChange = value/ RatingCoeffecient; - m_modHitChance += apply ? RatingChange : -RatingChange; - break; - case PLAYER_FIELD_RANGED_HIT_RATING: - //Hit (melee): 10 - RatingChange = value/ RatingCoeffecient; - m_modHitChance += apply ? RatingChange : -RatingChange; - break; - case PLAYER_FIELD_SPELL_HIT_RATING: - //Hit (spells): 8 - RatingChange = value/ RatingCoeffecient; - m_modSpellHitChance += apply ? RatingChange : -RatingChange; - break; - case PLAYER_FIELD_MELEE_CRIT_RATING: - if(affectStats) - UpdateCritPercentage(BASE_ATTACK); break; - case PLAYER_FIELD_RANGED_CRIT_RATING: - if(affectStats) - UpdateCritPercentage(RANGED_ATTACK); break; - case PLAYER_FIELD_SPELL_CRIT_RATING: - if(affectStats) - UpdateAllSpellCritChances(); break; - case PLAYER_FIELD_MELEE_HASTE_RATING: - //Haste: 6.67 - RatingChange = value/ RatingCoeffecient; if(RatingChange > 0) { ApplyAttackTimePercentMod(BASE_ATTACK,RatingChange,apply); @@ -4164,45 +4192,26 @@ ApplyAttackTimePercentMod(OFF_ATTACK,-RatingChange,!apply); } break; - case PLAYER_FIELD_RANGED_HASTE_RATING: - //Haste: 6.67 + case PLAYER_FIELD_RANGED_HASTE_RATING: RatingChange = value/ RatingCoeffecient; if(RatingChange >= 0) ApplyAttackTimePercentMod(RANGED_ATTACK, RatingChange, apply); else ApplyAttackTimePercentMod(RANGED_ATTACK, -RatingChange, !apply); break; - case PLAYER_FIELD_SPELL_HASTE_RATING: - //Haste: 6.67 + case PLAYER_FIELD_SPELL_HASTE_RATING: RatingChange = value/ RatingCoeffecient; ApplyPercentModFloatValue(UNIT_MOD_CAST_SPEED,-RatingChange,apply); break; - case PLAYER_FIELD_HIT_RATING: - //Hit (melee): 10 - RatingChange = value/ RatingCoeffecient; - ApplyModUInt32Value(PLAYER_FIELD_MELEE_HIT_RATING, value, apply); - ApplyModUInt32Value(PLAYER_FIELD_RANGED_HIT_RATING, value, apply); - m_modHitChance += apply ? RatingChange : -RatingChange; - break; - case PLAYER_FIELD_CRIT_RATING: - ApplyModUInt32Value(PLAYER_FIELD_MELEE_CRIT_RATING, value, apply); - ApplyModUInt32Value(PLAYER_FIELD_RANGED_CRIT_RATING, value, apply); - if(affectStats) - UpdateAllCritPercentages(); - break; - /* - case PLAYER_FIELD_HIT_AVOIDANCE_RATING: - break; - case PLAYER_FIELD_CRIT_AVOIDANCE_RATING: - break; - */ - case PLAYER_FIELD_RESILIENCE_RATING: - //Resilience: 25 - RatingChange = value/ RatingCoeffecient; - ApplyModUInt32Value(PLAYER_FIELD_UNK4_RATING, value, apply); - ApplyModUInt32Value(PLAYER_FIELD_UNK5_RATING, value, apply); - m_modResilience += apply ? RatingChange :-RatingChange; - break; +// Implemended in Unit::RollMeleeOutcomeAgainst +// case PLAYER_FIELD_MELEE_WEAPON_SKILL_RATING: +// case PLAYER_FIELD_OFFHAND_WEAPON_SKILL_RATING: +// case PLAYER_FIELD_RANGED_WEAPON_SKILL_RATING: +// break; + case PLAYER_FIELD_EXPERTISE_RATING: + if(affectStats) + UpdateExpertise(); + break; } } @@ -5924,7 +5933,6 @@ ApplyNegStatMod(STAT_STAMINA, -val, apply); //typestr = "STAMINA"; break; - case ITEM_MOD_DEFENSE_SKILL_RATING: ApplyRatingMod(PLAYER_FIELD_DEFENCE_RATING, int32(val), apply); break; @@ -5956,22 +5964,22 @@ ApplyRatingMod(PLAYER_FIELD_SPELL_CRIT_RATING, int32(val), apply); break; case ITEM_MOD_HIT_TAKEN_MELEE_RATING: - //ApplyRatingMod(PLAYER_FIELD_MELEE_HA_RATING, int32(val), apply); + ApplyRatingMod(PLAYER_FIELD_HIT_TAKEN_MELEE_RATING, int32(val), apply); break; case ITEM_MOD_HIT_TAKEN_RANGED_RATING: - //ApplyRatingMod(PLAYER_FIELD_RANGED_HA_RATING, int32(val), apply); + ApplyRatingMod(PLAYER_FIELD_HIT_TAKEN_RANGED_RATING, int32(val), apply); break; case ITEM_MOD_HIT_TAKEN_SPELL_RATING: - //ApplyRatingMod(PLAYER_FIELD_SPELL_HA_RATING, int32(val), apply); + ApplyRatingMod(PLAYER_FIELD_HIT_TAKEN_SPELL_RATING, int32(val), apply); break; case ITEM_MOD_CRIT_TAKEN_MELEE_RATING: - //ApplyRatingMod(PLAYER_FIELD_MELEE_CA_RATING, int32(val), apply); + ApplyRatingMod(PLAYER_FIELD_CRIT_TAKEN_MELEE_RATING, int32(val), apply); break; case ITEM_MOD_CRIT_TAKEN_RANGED_RATING: - //ApplyRatingMod(PLAYER_FIELD_RANGED_CA_RATING, int32(val), apply); + ApplyRatingMod(PLAYER_FIELD_CRIT_TAKEN_RANGED_RATING, int32(val), apply); break; case ITEM_MOD_CRIT_TAKEN_SPELL_RATING: - //ApplyRatingMod(PLAYER_FIELD_SPELL_CA_RATING, int32(val), apply); + ApplyRatingMod(PLAYER_FIELD_CRIT_TAKEN_SPELL_RATING, int32(val), apply); break; case ITEM_MOD_HASTE_MELEE_RATING: ApplyRatingMod(PLAYER_FIELD_MELEE_HASTE_RATING, int32(val), apply); @@ -5983,19 +5991,29 @@ ApplyRatingMod(PLAYER_FIELD_SPELL_HASTE_RATING, int32(val), apply); break; case ITEM_MOD_HIT_RATING: - ApplyRatingMod(PLAYER_FIELD_HIT_RATING, int32(val), apply); + ApplyRatingMod(PLAYER_FIELD_MELEE_HIT_RATING, int32(val), apply); + ApplyRatingMod(PLAYER_FIELD_RANGED_HIT_RATING, int32(val), apply); + ApplyRatingMod(PLAYER_FIELD_SPELL_HIT_RATING, int32(val), apply); break; case ITEM_MOD_CRIT_RATING: - ApplyRatingMod(PLAYER_FIELD_CRIT_RATING, int32(val), apply); + ApplyRatingMod(PLAYER_FIELD_MELEE_CRIT_RATING, int32(val), apply); + ApplyRatingMod(PLAYER_FIELD_RANGED_CRIT_RATING, int32(val), apply); + ApplyRatingMod(PLAYER_FIELD_SPELL_CRIT_RATING, int32(val), apply); break; case ITEM_MOD_HIT_TAKEN_RATING: - //ApplyRatingMod(PLAYER_FIELD_HA_RATING, int32(val), apply); + ApplyRatingMod(PLAYER_FIELD_HIT_TAKEN_MELEE_RATING, int32(val), apply); + ApplyRatingMod(PLAYER_FIELD_HIT_TAKEN_RANGED_RATING, int32(val), apply); + ApplyRatingMod(PLAYER_FIELD_HIT_TAKEN_SPELL_RATING, int32(val), apply); break; case ITEM_MOD_CRIT_TAKEN_RATING: - //ApplyRatingMod(PLAYER_FIELD_CA_RATING, int32(val), apply); + ApplyRatingMod(PLAYER_FIELD_CRIT_TAKEN_MELEE_RATING, int32(val), apply); + ApplyRatingMod(PLAYER_FIELD_CRIT_TAKEN_RANGED_RATING, int32(val), apply); + ApplyRatingMod(PLAYER_FIELD_CRIT_TAKEN_SPELL_RATING, int32(val), apply); break; case ITEM_MOD_RESILIENCE_RATING: - ApplyRatingMod(PLAYER_FIELD_RESILIENCE_RATING, int32(val), apply); + ApplyRatingMod(PLAYER_FIELD_CRIT_TAKEN_MELEE_RATING, int32(val), apply); + ApplyRatingMod(PLAYER_FIELD_CRIT_TAKEN_RANGED_RATING, int32(val), apply); + ApplyRatingMod(PLAYER_FIELD_CRIT_TAKEN_SPELL_RATING, int32(val), apply); break; case ITEM_MOD_HASTE_RATING: ApplyRatingMod(PLAYER_FIELD_MELEE_HASTE_RATING, int32(val), apply); @@ -10428,19 +10446,62 @@ ((Player*)this)->ApplyRatingMod(PLAYER_FIELD_SPELL_CRIT_RATING, enchant_amount, apply); sLog.outDebug("+ %u SPELL_CRIT", enchant_amount); break; - // Values from ITEM_STAT_MELEE_HA_RATING to ITEM_STAT_SPELL_HASTE_RATING are never used - // in Enchantments +// Values from ITEM_STAT_MELEE_HA_RATING to ITEM_STAT_SPELL_HASTE_RATING are never used +// in Enchantments +// case ITEM_MOD_HIT_TAKEN_MELEE_RATING: +// ((Player*)this)->ApplyRatingMod(PLAYER_FIELD_HIT_TAKEN_MELEE_RATING, enchant_amount, apply); +// break; +// case ITEM_MOD_HIT_TAKEN_RANGED_RATING: +// ((Player*)this)->ApplyRatingMod(PLAYER_FIELD_HIT_TAKEN_RANGED_RATING, enchant_amount, apply); +// break; +// case ITEM_MOD_HIT_TAKEN_SPELL_RATING: +// ((Player*)this)->ApplyRatingMod(PLAYER_FIELD_HIT_TAKEN_SPELL_RATING, enchant_amount, apply); +// break; +// case ITEM_MOD_CRIT_TAKEN_MELEE_RATING: +// ((Player*)this)->ApplyRatingMod(PLAYER_FIELD_CRIT_TAKEN_MELEE_RATING, enchant_amount, apply); +// break; +// case ITEM_MOD_CRIT_TAKEN_RANGED_RATING: +// ((Player*)this)->ApplyRatingMod(PLAYER_FIELD_CRIT_TAKEN_RANGED_RATING, enchant_amount, apply); +// break; +// case ITEM_MOD_CRIT_TAKEN_SPELL_RATING: +// ((Player*)this)->ApplyRatingMod(PLAYER_FIELD_CRIT_TAKEN_SPELL_RATING, enchant_amount, apply); +// break; +// case ITEM_MOD_HASTE_MELEE_RATING: +// ((Player*)this)->ApplyRatingMod(PLAYER_FIELD_MELEE_HASTE_RATING, enchant_amount, apply); +// break; +// case ITEM_MOD_HASTE_RANGED_RATING: +// ((Player*)this)->ApplyRatingMod(PLAYER_FIELD_RANGED_HIT_RATING, enchant_amount, apply); +// break; +// case ITEM_MOD_HASTE_SPELL_RATING: +// ((Player*)this)->ApplyRatingMod(PLAYER_FIELD_SPELL_HIT_RATING, enchant_amount, apply); +// break; case ITEM_MOD_HIT_RATING: - ((Player*)this)->ApplyRatingMod(PLAYER_FIELD_HIT_RATING, enchant_amount, apply); + ((Player*)this)->ApplyRatingMod(PLAYER_FIELD_MELEE_HIT_RATING, enchant_amount, apply); + ((Player*)this)->ApplyRatingMod(PLAYER_FIELD_RANGED_HIT_RATING, enchant_amount, apply); + ((Player*)this)->ApplyRatingMod(PLAYER_FIELD_SPELL_HIT_RATING, enchant_amount, apply); sLog.outDebug("+ %u HIT", enchant_amount); break; case ITEM_MOD_CRIT_RATING: - ((Player*)this)->ApplyRatingMod(PLAYER_FIELD_CRIT_RATING, enchant_amount, apply); + ((Player*)this)->ApplyRatingMod(PLAYER_FIELD_MELEE_CRIT_RATING, enchant_amount, apply); + ((Player*)this)->ApplyRatingMod(PLAYER_FIELD_RANGED_CRIT_RATING, enchant_amount, apply); + ((Player*)this)->ApplyRatingMod(PLAYER_FIELD_SPELL_CRIT_RATING, enchant_amount, apply); sLog.outDebug("+ %u CRITICAL", enchant_amount); break; - // Values ITEM_STAT_HA_RATING and ITEM_STAT_CA_RATING are never used in Enchantment +// Values ITEM_MOD_HIT_TAKEN_RATING and ITEM_MOD_CRIT_TAKEN_RATING are never used in Enchantment +// case ITEM_MOD_HIT_TAKEN_RATING: +// ((Player*)this)->ApplyRatingMod(PLAYER_FIELD_HIT_TAKEN_MELEE_RATING, enchant_amount, apply); +// ((Player*)this)->ApplyRatingMod(PLAYER_FIELD_HIT_TAKEN_RANGED_RATING, enchant_amount, apply); +// ((Player*)this)->ApplyRatingMod(PLAYER_FIELD_HIT_TAKEN_SPELL_RATING, enchant_amount, apply); +// break; +// case ITEM_MOD_CRIT_TAKEN_RATING: +// ((Player*)this)->ApplyRatingMod(PLAYER_FIELD_CRIT_TAKEN_MELEE_RATING, enchant_amount, apply); +// ((Player*)this)->ApplyRatingMod(PLAYER_FIELD_CRIT_TAKEN_RANGED_RATING, enchant_amount, apply); +// ((Player*)this)->ApplyRatingMod(PLAYER_FIELD_CRIT_TAKEN_SPELL_RATING, enchant_amount, apply); +// break; case ITEM_MOD_RESILIENCE_RATING: - ((Player*)this)->ApplyRatingMod(PLAYER_FIELD_RESILIENCE_RATING, enchant_amount, apply); + ((Player*)this)->ApplyRatingMod(PLAYER_FIELD_CRIT_TAKEN_MELEE_RATING, enchant_amount, apply); + ((Player*)this)->ApplyRatingMod(PLAYER_FIELD_CRIT_TAKEN_RANGED_RATING, enchant_amount, apply); + ((Player*)this)->ApplyRatingMod(PLAYER_FIELD_CRIT_TAKEN_SPELL_RATING, enchant_amount, apply); sLog.outDebug("+ %u RESILIENCE", enchant_amount); break; // Value ITEM_STAT_HASTE_RATING is never used in Enchantment Index: game/Player.h =================================================================== --- game/Player.h (revision 4874) +++ game/Player.h (working copy) @@ -1357,12 +1357,19 @@ float OCTRegenMPPerSpirit(); float GetRatingCoefficient(uint16 index) const; float GetRatingBonusValue(uint16 index) const; + uint32 GetMeleeCritDamageReduction(uint32 damage) const; + uint32 GetRangedCritDamageReduction(uint32 damage) const; + uint32 GetSpellCritDamageReduction(uint32 damage) const; + uint32 GetDotDamageReduction(uint32 damage) const; + + float GetExpertiseDodgeOrParryReduction() const; void UpdateBlockPercentage(); void UpdateCritPercentage(WeaponAttackType attType); void UpdateAllCritPercentages(); void UpdateParryPercentage(); void UpdateDodgePercentage(); void UpdateAllSpellCritChances(); + void UpdateExpertise(); void UpdateManaRegen(); void UpdateSpellCritChance(uint32 school); uint32 GetSpellSchoolByBaseGroup(BaseModGroup baseGroup) const; Index: game/Spell.h =================================================================== --- game/Spell.h (revision 4874) +++ game/Spell.h (working copy) @@ -123,33 +123,32 @@ enum Rating { - SPELL_RATING_SKILL = 0x0000001, // 0 - SPELL_RATING_DEFENCE = 0x0000002, // 1 - SPELL_RATING_DODGE = 0x0000004, // 2 - SPELL_RATING_PARRY = 0x0000008, // 3 - SPELL_RATING_BLOCK = 0x0000010, // 4 - SPELL_RATING_MELEE_HIT = 0x0000020, // 5 - SPELL_RATING_RANGED_HIT = 0x0000040, // 6 - SPELL_RATING_SPELL_HIT = 0x0000080, // 7 - SPELL_RATING_MELEE_CRIT_HIT = 0x0000100, // 8 - SPELL_RATING_RANGED_CRIT_HIT = 0x0000200, // 9 - SPELL_RATING_SPELL_CRIT_HIT = 0x0000400, // 10 - //SPELL_RATING_MELEE_HIT_TAKEN = 0x0000800, // 11 - //SPELL_RATING_RANGED_HIT_TAKEN = 0x0001000, // 12 - //SPELL_RATING_SPELL_HIT_TAKEN = 0x0002000, // 13 - //SPELL_RATING_MELEE_CRIT_TAKEN = 0x0004000, // 14 - //SPELL_RATING_RANGED_CRIT_TAKEN = 0x0008000, // 15 - //SPELL_RATING_SPELL_CRIT_TAKEN = 0x0010000, // 16 - SPELL_RATING_MELEE_HASTE = 0x0020000, // 17 - SPELL_RATING_RANGED_HASTE = 0x0040000, // 18 - SPELL_RATING_SPELL_HASTE = 0x0080000, // 19 - SPELL_RATING_HIT = 0x0100000, // 20 - SPELL_RATING_CRIT_HIT = 0x0200000, // 21 - SPELL_RATING_HIT_AVOIDANCE = 0x0400000, // 22 - SPELL_RATING_CRIT_AVOIDANCE = 0x0800000, // 23 - SPELL_RATING_RESILIENCE = 0x1000000 // 24 - //SPELL_RATING_EXPERTISE + CR_WEAPON_SKILL = 1, + CR_DEFENSE_SKILL = 2, + CR_DODGE = 3, + CR_PARRY = 4, + CR_BLOCK = 5, + CR_HIT_MELEE = 6, + CR_HIT_RANGED = 7, + CR_HIT_SPELL = 8, + CR_CRIT_MELEE = 9, + CR_CRIT_RANGED = 10, + CR_CRIT_SPELL = 11, + CR_HIT_TAKEN_MELEE = 12, + CR_HIT_TAKEN_RANGED = 13, + CR_HIT_TAKEN_SPELL = 14, + CR_CRIT_TAKEN_MELEE = 15, + CR_CRIT_TAKEN_RANGED = 16, + CR_CRIT_TAKEN_SPELL = 17, + CR_HASTE_MELEE = 18, + CR_HASTE_RANGED = 19, + CR_HASTE_SPELL = 20, + CR_WEAPON_SKILL_MAINHAND = 21, + CR_WEAPON_SKILL_OFFHAND = 22, + CR_WEAPON_SKILL_RANGED = 23, + CR_EXPERTISE = 24 }; +#define MAX_RATINGS 24 bool IsQuestTameSpell(uint32 spellId); Index: game/SpellAuraDefines.h =================================================================== --- game/SpellAuraDefines.h (revision 4874) +++ game/SpellAuraDefines.h (working copy) @@ -277,7 +277,7 @@ SPELL_AURA_237 = 237, SPELL_AURA_238 = 238, SPELL_AURA_239 = 239, - SPELL_AURA_240 = 240, + SPELL_AURA_MOD_EXPERTISE = 240, SPELL_AURA_241 = 241, SPELL_AURA_242 = 242, SPELL_AURA_243 = 243, Index: game/SpellAuras.cpp =================================================================== --- game/SpellAuras.cpp (revision 4874) +++ game/SpellAuras.cpp (working copy) @@ -289,7 +289,7 @@ &Aura::HandleNULL, //237 &Aura::HandleNULL, //238 &Aura::HandleNULL, //239 - &Aura::HandleNULL, //240 + &Aura::HandleAuraModExpertise, //240 SPELL_AURA_MOD_EXPERTISE &Aura::HandleNULL, //241 &Aura::HandleNULL, //242 &Aura::HandleNULL, //243 @@ -3431,7 +3431,8 @@ void Aura::HandleModHitChance(bool Apply, bool Real) { - m_target->m_modHitChance += Apply ? m_modifier.m_amount : (-m_modifier.m_amount); + m_target->m_modMeleeHitChance += Apply ? m_modifier.m_amount : (-m_modifier.m_amount); + m_target->m_modRangedHitChance += Apply ? m_modifier.m_amount : (-m_modifier.m_amount); } void Aura::HandleModSpellHitChance(bool Apply, bool Real) @@ -4057,74 +4058,18 @@ { if(m_target->GetTypeId() == TYPEID_PLAYER) { - if (m_modifier.m_miscvalue & SPELL_RATING_SKILL) - { - /*Item* pItem = ((Player*)m_target)->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND); - if (pItem && pItem->IsFitToSpellRequirements(GetSpellProto())) - ((Player*)m_target)->ApplyRatingMod(PLAYER_FIELD_MELEE_WEAPON_SKILL_RATING,m_modifier.m_amount,apply); + uint32 mask=1; + for (uint32 rating=0;ratingApplyRatingMod(PLAYER_FIELD_COMBAT_RATING_1 + rating, m_modifier.m_amount, apply); + } +} - pItem = ((Player*)m_target)->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND); - if (pItem && pItem->IsFitToSpellRequirements(GetSpellProto())) - ((Player*)m_target)->ApplyRatingMod(PLAYER_FIELD_OFFHAND_WEAPON_SKILL_RATING,m_modifier.m_amount,apply); - - pItem = ((Player*)m_target)->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_RANGED); - if (pItem && pItem->IsFitToSpellRequirements(GetSpellProto())) - ((Player*)m_target)->ApplyRatingMod(PLAYER_FIELD_RANGED_WEAPON_SKILL_RATING,m_modifier.m_amount,apply);*/ - } - - if (m_modifier.m_miscvalue & SPELL_RATING_DEFENCE) - ((Player*)m_target)->ApplyRatingMod(PLAYER_FIELD_DEFENCE_RATING,m_modifier.m_amount,apply); - - if (m_modifier.m_miscvalue & SPELL_RATING_DODGE) - ((Player*)m_target)->ApplyRatingMod(PLAYER_FIELD_DODGE_RATING,m_modifier.m_amount,apply); - - if (m_modifier.m_miscvalue & SPELL_RATING_PARRY) - ((Player*)m_target)->ApplyRatingMod(PLAYER_FIELD_PARRY_RATING,m_modifier.m_amount,apply); - - if (m_modifier.m_miscvalue & SPELL_RATING_BLOCK) - ((Player*)m_target)->ApplyRatingMod(PLAYER_FIELD_BLOCK_RATING,m_modifier.m_amount,apply); - - if (m_modifier.m_miscvalue & SPELL_RATING_MELEE_HIT) - ((Player*)m_target)->ApplyRatingMod(PLAYER_FIELD_MELEE_HIT_RATING,m_modifier.m_amount,apply); - - if (m_modifier.m_miscvalue & SPELL_RATING_RANGED_HIT) - ((Player*)m_target)->ApplyRatingMod(PLAYER_FIELD_RANGED_HIT_RATING,m_modifier.m_amount,apply); - - if (m_modifier.m_miscvalue & SPELL_RATING_SPELL_HIT) - ((Player*)m_target)->ApplyRatingMod(PLAYER_FIELD_SPELL_HIT_RATING,m_modifier.m_amount,apply); - - if (m_modifier.m_miscvalue & SPELL_RATING_MELEE_CRIT_HIT) - ((Player*)m_target)->ApplyRatingMod(PLAYER_FIELD_MELEE_CRIT_RATING,m_modifier.m_amount,apply); - - if (m_modifier.m_miscvalue & SPELL_RATING_RANGED_CRIT_HIT) - ((Player*)m_target)->ApplyRatingMod(PLAYER_FIELD_RANGED_CRIT_RATING,m_modifier.m_amount,apply); - - if (m_modifier.m_miscvalue & SPELL_RATING_SPELL_CRIT_HIT) - ((Player*)m_target)->ApplyRatingMod(PLAYER_FIELD_SPELL_CRIT_RATING,m_modifier.m_amount,apply); - - if (m_modifier.m_miscvalue & SPELL_RATING_MELEE_HASTE) - ((Player*)m_target)->ApplyRatingMod(PLAYER_FIELD_MELEE_HASTE_RATING,m_modifier.m_amount,apply); - - if (m_modifier.m_miscvalue & SPELL_RATING_RANGED_HASTE) - ((Player*)m_target)->ApplyRatingMod(PLAYER_FIELD_RANGED_HASTE_RATING,m_modifier.m_amount,apply); - - if (m_modifier.m_miscvalue & SPELL_RATING_SPELL_HASTE) - ((Player*)m_target)->ApplyRatingMod(PLAYER_FIELD_SPELL_HASTE_RATING,m_modifier.m_amount,apply); - - if (m_modifier.m_miscvalue & SPELL_RATING_HIT) - ((Player*)m_target)->ApplyRatingMod(PLAYER_FIELD_HIT_RATING,m_modifier.m_amount,apply); - - if (m_modifier.m_miscvalue & SPELL_RATING_CRIT_HIT) - ((Player*)m_target)->ApplyRatingMod(PLAYER_FIELD_CRIT_RATING,m_modifier.m_amount,apply); - - /*if (m_modifier.m_miscvalue & SPELL_RATING_HIT_AVOIDANCE) - ((Player*)m_target)->ApplyRatingMod(PLAYER_FIELD_HIT_AVOIDANCE_RATING,m_modifier.m_amount,apply); - - if (m_modifier.m_miscvalue & SPELL_RATING_CRIT_AVOIDANCE) - ((Player*)m_target)->ApplyRatingMod(PLAYER_FIELD_CRIT_AVOIDANCE_RATING,m_modifier.m_amount,apply);*/ - - if (m_modifier.m_miscvalue & SPELL_RATING_RESILIENCE) - ((Player*)m_target)->ApplyRatingMod(PLAYER_FIELD_RESILIENCE_RATING,m_modifier.m_amount,apply); +void Aura::HandleAuraModExpertise(bool apply, bool Real) +{ + if(m_target->GetTypeId() == TYPEID_PLAYER) + { + ((Player*)m_target)->ApplyModInt32Value(PLAYER_EXPERTISE, m_modifier.m_amount, apply); } } Index: game/SpellAuras.h =================================================================== --- game/SpellAuras.h (revision 4874) +++ game/SpellAuras.h (working copy) @@ -188,6 +188,7 @@ void HandleAuraRetainComboPoints(bool apply, bool Real); void HandleModSpellDamagePercent(bool apply, bool Real); void HandleModSpellHealingPercent(bool apply, bool Real); + void HandleAuraModExpertise(bool apply, bool Real); Aura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster = NULL, Item* castItem = NULL); virtual ~Aura(); Index: game/StatSystem.cpp =================================================================== --- game/StatSystem.cpp (revision 4874) +++ game/StatSystem.cpp (working copy) @@ -424,6 +424,13 @@ UpdateSpellCritChance(i); } +void Player::UpdateExpertise() +{ + uint32 expertise = GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE); + expertise+= uint32(GetRatingBonusValue(PLAYER_FIELD_EXPERTISE_RATING)); + SetUInt32Value(PLAYER_EXPERTISE, expertise); +} + void Player::UpdateManaRegen() { uint8 PlayerClass = getClass(); Index: game/Unit.cpp =================================================================== --- game/Unit.cpp (revision 4874) +++ game/Unit.cpp (working copy) @@ -174,10 +174,11 @@ m_createStats[i] = 0.0f; m_attacking = NULL; - m_modHitChance = 0.0f; + m_modMeleeHitChance = 0.0f; + m_modRangedHitChance = 0.0f; m_modSpellHitChance = 0.0f; m_baseSpellCritChance = 5; - m_modResilience = 0.0f; + m_CombatTimer = 0; //m_victimThreat = 0.0f; for (int i = 0; i < MAX_SPELL_SCHOOL; ++i) @@ -1077,10 +1078,13 @@ case MELEE_HIT_CRIT: { *damage *= 2; - // Resilience - reduce crit damage by 2x% - uint32 resilienceReduction = uint32(pVictim->m_modResilience * 2/100 * (*damage)); - cleanDamage->damage += resilienceReduction; - *damage -= resilienceReduction; + // Resilience - reduce crit damage + if (pVictim->GetTypeId()==TYPEID_PLAYER) + { + uint32 resilienceReduction = ((Player*)pVictim)->GetMeleeCritDamageReduction(*damage); + cleanDamage->damage += resilienceReduction; + *damage -= resilienceReduction; + } *crit = true; hitInfo |= HITINFO_CRITICALHIT; break; @@ -1218,10 +1222,13 @@ { *crit = true; *damage *= 2; - // Resilience - reduce crit damage by 2x% - uint32 resilienceReduction = uint32(pVictim->m_modResilience * 2/100 * (*damage)); - cleanDamage->damage += resilienceReduction; - *damage -= resilienceReduction; + // Resilience - reduce crit damage by + if (pVictim->GetTypeId()==TYPEID_PLAYER) + { + uint32 resilienceReduction = ((Player*)pVictim)->GetMeleeCritDamageReduction(*damage); + cleanDamage->damage += resilienceReduction; + *damage -= resilienceReduction; + } } } else @@ -1348,6 +1355,9 @@ if(mod->m_auraname == SPELL_AURA_PERIODIC_DAMAGE) { pdamage = mod->m_amount; + // Reduce dot damage from resilience for players + if (pVictim->GetTypeId()==TYPEID_PLAYER) + pdamage-=((Player*)pVictim)->GetDotDamageReduction(pdamage); //Calculate armor mitigation if it is a physical spell if (spellProto->School == SPELL_SCHOOL_NORMAL) @@ -1390,6 +1400,9 @@ CleanDamage cleanDamage = CleanDamage(0, BASE_ATTACK, MELEE_HIT_NORMAL ); uint32 pdamage = mod->m_amount; + // Reduce dot damage from resilience for players + if (pVictim->GetTypeId()==TYPEID_PLAYER) + pdamage-=((Player*)pVictim)->GetDotDamageReduction(pdamage); //Calculate armor mitigation if it is a physical spell if (spellProto->School == SPELL_SCHOOL_NORMAL) @@ -1825,6 +1838,7 @@ switch (outcome) { case MELEE_HIT_CRIT: + { //*hitInfo = 0xEA; // 0xEA *hitInfo = HITINFO_CRITICALHIT | HITINFO_NORMALSWING2 | 0x8; @@ -1841,21 +1855,23 @@ } *damage += crit_bonus; - + uint32 resilienceReduction = 0; if(attType == RANGED_ATTACK) { int32 mod = pVictim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE); *damage = int32((*damage) * float((100.0f + mod)/100.0f)); + // Resilience - reduce crit damage + if (pVictim->GetTypeId()==TYPEID_PLAYER) + resilienceReduction = ((Player*)pVictim)->GetRangedCritDamageReduction(*damage); } else { int32 mod = pVictim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE); *damage = int32((*damage) * float((100.0f + mod)/100.0f)); + // Resilience - reduce crit damage + if (pVictim->GetTypeId()==TYPEID_PLAYER) + resilienceReduction = ((Player*)pVictim)->GetMeleeCritDamageReduction(*damage); } - - // Resilience - reduce crit damage by 2x% - uint32 resilienceReduction; - resilienceReduction = uint32(pVictim->m_modResilience * 2/100 * (*damage)); *damage -= resilienceReduction; cleanDamage->damage += resilienceReduction; @@ -1873,7 +1889,7 @@ pVictim->HandleEmoteCommand(EMOTE_ONESHOT_WOUNDCRITICAL); break; - + } case MELEE_HIT_PARRY: if(attType == RANGED_ATTACK || unavoidable) //range attack - no parry break; @@ -2246,7 +2262,7 @@ MeleeHitOutcome Unit::RollPhysicalOutcomeAgainst (Unit const *pVictim, WeaponAttackType attType, SpellEntry const *spellInfo) { // Miss chance based on melee - int32 miss_chance = (int32)(MeleeMissChanceCalc(pVictim)); + int32 miss_chance = (int32)(MeleeMissChanceCalc(pVictim, attType)); // Critical hit chance float crit_chance = GetUnitCriticalChance(attType); @@ -2269,10 +2285,12 @@ // Spellmods if(Player* modOwner = GetSpellModOwner()) modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CRITICAL_CHANCE, crit_chance); + float modHitChance = 0.0f; + if (attType == RANGED_ATTACK) modHitChance = m_modRangedHitChance; + else modHitChance = m_modMeleeHitChance; + DEBUG_LOG("PHYSICAL OUTCOME: hit %f crit %f miss %u",modHitChance,crit_chance,miss_chance); - DEBUG_LOG("PHYSICAL OUTCOME: hit %f crit %f miss %u",m_modHitChance,crit_chance,miss_chance); - - return RollMeleeOutcomeAgainst(pVictim, attType, int32(crit_chance * 100 ), miss_chance, int32(m_modHitChance)); + return RollMeleeOutcomeAgainst(pVictim, attType, int32(crit_chance * 100 ), miss_chance, int32(modHitChance)); } MeleeHitOutcome Unit::RollMeleeOutcomeAgainst (const Unit *pVictim, WeaponAttackType attType) const @@ -2280,7 +2298,7 @@ // This is only wrapper // Miss chance based on melee - int32 miss_chance = (int32)(MeleeMissChanceCalc(pVictim)); + int32 miss_chance = (int32)(MeleeMissChanceCalc(pVictim, attType)); // Critical hit chance float crit_chance = GetUnitCriticalChance(attType); @@ -2290,9 +2308,12 @@ for(AuraList::const_iterator i = mAttackerSWCrit.begin(); i != mAttackerSWCrit.end(); ++i) crit_chance += (*i)->GetModifier()->m_amount; + float modHitChance = 0.0f; + if (attType == RANGED_ATTACK) modHitChance = m_modRangedHitChance; + else modHitChance = m_modMeleeHitChance; // Useful if want to specify crit & miss chances for melee, else it could be removed - DEBUG_LOG("MELEE OUTCOME: hit %f crit %u miss %u", m_modHitChance,crit_chance,miss_chance); - return RollMeleeOutcomeAgainst(pVictim, attType, int32(crit_chance * 100 ), miss_chance, int32(m_modHitChance)); + DEBUG_LOG("MELEE OUTCOME: hit %f crit %u miss %u", modHitChance,crit_chance,miss_chance); + return RollMeleeOutcomeAgainst(pVictim, attType, int32(crit_chance * 100 ), miss_chance, int32(modHitChance)); } MeleeHitOutcome Unit::RollMeleeOutcomeAgainst (const Unit *pVictim, WeaponAttackType attType, int32 crit_chance, int32 miss_chance, int32 hit_chance) const @@ -2301,6 +2322,21 @@ return MELEE_HIT_EVADE; int32 skillDiff = GetWeaponSkillValue(attType) - pVictim->GetDefenseSkillValue(); + // Add rating bonuses for attacker + if(GetTypeId() == TYPEID_PLAYER) + { + skillDiff+=((Player*)this)->GetRatingBonusValue(PLAYER_FIELD_ALL_WEAPONS_SKILL_RATING); + switch (attType) + { + case BASE_ATTACK: skillDiff+=((Player*)this)->GetRatingBonusValue(PLAYER_FIELD_MELEE_WEAPON_SKILL_RATING);break; + case OFF_ATTACK: skillDiff+=((Player*)this)->GetRatingBonusValue(PLAYER_FIELD_OFFHAND_WEAPON_SKILL_RATING);break; + case RANGED_ATTACK: skillDiff+=((Player*)this)->GetRatingBonusValue(PLAYER_FIELD_RANGED_WEAPON_SKILL_RATING);break; + } + } + // Add rating bonuses for victim + if(pVictim->GetTypeId() == TYPEID_PLAYER) + skillDiff-=((Player*)pVictim)->GetRatingBonusValue(PLAYER_FIELD_DEFENCE_RATING); + // bonus from skills is 0.04% int32 skillBonus = skillDiff * 4; int32 skillBonus2 = 4 * ( GetWeaponSkillValue(attType) - pVictim->GetPureDefenseSkillValue() ); @@ -2343,7 +2379,11 @@ } // stunned target cannot dodge and this is check in GetUnitDodgeChance() - tmp = (int32)(pVictim->GetUnitDodgeChance()*100); + float dodge = pVictim->GetUnitDodgeChance(); + // Reduce dodge chance by attacker expertise rating + if (GetTypeId() == TYPEID_PLAYER) + dodge-=((Player*)this)->GetExpertiseDodgeOrParryReduction(); + tmp = (int32)(dodge*100.0f); if ( (tmp > 0) // check if unit _can_ dodge && ((tmp -= skillBonus2) > 0) && roll < (sum += tmp)) @@ -2364,7 +2404,11 @@ else { // cannot parry or block attacks from behind, but can from forward - tmp = (int32)(pVictim->GetUnitParryChance()*100); + float parry = pVictim->GetUnitParryChance(); + // Reduce parry chance by attacker expertise rating + if (GetTypeId() == TYPEID_PLAYER) + parry-=((Player*)this)->GetExpertiseDodgeOrParryReduction(); + int32 tmp = int32(parry * 100.0f); if ( (tmp > 0) // check if unit _can_ parry && ((tmp -= skillBonus2) > 0) && (roll < (sum += tmp))) @@ -2383,8 +2427,14 @@ } } - // Resilience - reduce crit chance by x% - modCrit -= int32(pVictim->m_modResilience*100); + // reduce crit chance from Rating for players + if (pVictim->GetTypeId()==TYPEID_PLAYER) + { + if (attType==RANGED_ATTACK) + modCrit -= int32(((Player*)pVictim)->GetRatingBonusValue(PLAYER_FIELD_CRIT_TAKEN_RANGED_RATING)*100); + else + modCrit -= int32(((Player*)pVictim)->GetRatingBonusValue(PLAYER_FIELD_CRIT_TAKEN_MELEE_RATING)*100); + } // Critical chance tmp = crit_chance + skillBonus + modCrit; @@ -2515,11 +2565,13 @@ int32 mod = pVictim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE); misschance -= mod * 100; - + // Add victim rating bonus + if (pVictim->GetTypeId()==TYPEID_PLAYER) + misschance+=((Player*)pVictim)->GetRatingBonusValue(PLAYER_FIELD_HIT_TAKEN_SPELL_RATING)*100.0f; return misschance < 100 ? 100 : misschance; } -int32 Unit::MeleeMissChanceCalc(const Unit *pVictim) const +int32 Unit::MeleeMissChanceCalc(const Unit *pVictim, WeaponAttackType attType) const { if(!pVictim) return 0; @@ -2555,12 +2607,26 @@ int32 leveldif = pVictim->getLevel() - getLevel(); if(leveldif < 0) leveldif = 0; + // Hit chance from attacker based on ratings and auras + uint32 m_modHitChance; + if (attType == RANGED_ATTACK) + m_modHitChance = m_modRangedHitChance * 100.0f; + else + m_modHitChance = m_modMeleeHitChance * 100.0f; if(leveldif < 3) - misschance += leveldif * 100 - int32(m_modHitChance*100); + misschance += leveldif * 100 - m_modHitChance; else - misschance += (leveldif - 2) * chance - int32(m_modHitChance*100); + misschance += (leveldif - 2) * chance - m_modHitChance; + // Hit chance for victim based on ratings + if (pVictim->GetTypeId()==TYPEID_PLAYER) + { + if (attType == RANGED_ATTACK) + misschance+=((Player*)pVictim)->GetRatingBonusValue(PLAYER_FIELD_HIT_TAKEN_RANGED_RATING)*100.0f; + else + misschance+=((Player*)pVictim)->GetRatingBonusValue(PLAYER_FIELD_HIT_TAKEN_MELEE_RATING)*100.0f; + } return misschance > 6000 ? 6000 : misschance; } @@ -5242,8 +5308,8 @@ if((*i)->GetModifier()->m_miscvalue == -2 || ((*i)->GetModifier()->m_miscvalue & (int32)(1<School)) != 0) crit_chance += (*i)->GetModifier()->m_amount; - // flat: Resilience - reduce crit chance by x% - crit_chance -= pVictim->m_modResilience; + if (pVictim->GetTypeId() == TYPEID_PLAYER) + crit_chance -= ((Player*)pVictim)->GetRatingBonusValue(PLAYER_FIELD_CRIT_TAKEN_SPELL_RATING); // flat: scripted (increase crit chance ... against ... target by x% AuraList const& mOverrideClassScript = GetAurasByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS); @@ -5282,10 +5348,10 @@ if(crit_bonus> 0) *damage += crit_bonus; - // Resilience - reduce crit damage by 2x% - if (pVictim) + // Resilience - reduce crit damage + if (pVictim && pVictim->GetTypeId()==TYPEID_PLAYER) { - *damage -= uint32(pVictim->m_modResilience * 2/100 * (*damage)); + *damage -= ((Player *)pVictim)->GetSpellCritDamageReduction(*damage); } return true; Index: game/Unit.h =================================================================== --- game/Unit.h (revision 4874) +++ game/Unit.h (working copy) @@ -850,7 +850,7 @@ void HandleEmoteCommand(uint32 anim_id); void AttackerStateUpdate (Unit *pVictim, WeaponAttackType attType = BASE_ATTACK, bool isTriggered = false); uint32 SpellMissChanceCalc(Unit *pVictim) const; - int32 MeleeMissChanceCalc(const Unit *pVictim) const; + int32 MeleeMissChanceCalc(const Unit *pVictim, WeaponAttackType attType) const; float GetUnitDodgeChance() const; float GetUnitParryChance() const; @@ -1048,10 +1048,11 @@ uint32 m_invisibilityMask; uint32 m_ShapeShiftForm; uint32 m_form; - float m_modHitChance; + float m_modMeleeHitChance; + float m_modRangedHitChance; float m_modSpellHitChance; int32 m_baseSpellCritChance; - float m_modResilience; + float m_threatModifier[MAX_SPELL_SCHOOL]; float m_modAttackSpeedPct[3]; Index: game/UpdateFields.h =================================================================== --- game/UpdateFields.h (revision 4874) +++ game/UpdateFields.h (working copy) @@ -371,17 +371,17 @@ // CR_CRIT_SPELL PLAYER_FIELD_SPELL_CRIT_RATING = PLAYER_FIELD_COMBAT_RATING_1+10, // CR_HIT_TAKEN_MELEE - PLAYER_FIELD_HIT_RATING = PLAYER_FIELD_COMBAT_RATING_1+11, + PLAYER_FIELD_HIT_TAKEN_MELEE_RATING = PLAYER_FIELD_COMBAT_RATING_1+11, // CR_HIT_TAKEN_RANGED - PLAYER_FIELD_CRIT_RATING = PLAYER_FIELD_COMBAT_RATING_1+12, + PLAYER_FIELD_HIT_TAKEN_RANGED_RATING = PLAYER_FIELD_COMBAT_RATING_1+12, // CR_HIT_TAKEN_SPELL - PLAYER_FIELD_UNK3_RATING = PLAYER_FIELD_COMBAT_RATING_1+13, + PLAYER_FIELD_HIT_TAKEN_SPELL_RATING = PLAYER_FIELD_COMBAT_RATING_1+13, // CR_CRIT_TAKEN_MELEE - PLAYER_FIELD_UNK4_RATING = PLAYER_FIELD_COMBAT_RATING_1+14, + PLAYER_FIELD_CRIT_TAKEN_MELEE_RATING = PLAYER_FIELD_COMBAT_RATING_1+14, // CR_CRIT_TAKEN_RANGED - PLAYER_FIELD_UNK5_RATING = PLAYER_FIELD_COMBAT_RATING_1+15, + PLAYER_FIELD_CRIT_TAKEN_RANGED_RATING = PLAYER_FIELD_COMBAT_RATING_1+15, // CR_CRIT_TAKEN_SPELL - PLAYER_FIELD_RESILIENCE_RATING = PLAYER_FIELD_COMBAT_RATING_1+16, + PLAYER_FIELD_CRIT_TAKEN_SPELL_RATING = PLAYER_FIELD_COMBAT_RATING_1+16, // CR_HASTE_MELEE PLAYER_FIELD_MELEE_HASTE_RATING = PLAYER_FIELD_COMBAT_RATING_1+17, // CR_HASTE_RANGED