rendered paste bodyIndex: game/Player.cpp===================================================================--- game/Player.cpp (revision 4783)+++ game/Player.cpp (working copy)@@ -3980,6 +3980,18 @@ return Rating->ratio; } +float Player::GetResilience()+{+ float melee = GetRatingBonusValue(PLAYER_FIELD_CRIT_TAKEN_MELEE_RATING);+ float ranged = GetRatingBonusValue(PLAYER_FIELD_CRIT_TAKEN_RANGED_RATING);+ float spell = GetRatingBonusValue(PLAYER_FIELD_CRIT_TAKEN_SPELL_RATING);+ float resilience = melee;+ if (resilience>ranged) resilience = ranged;+ if (resilience>spell ) resilience = spell;+ resilience*=2.0f;+ if (resilience>25.0f) resilience=25.0f;+ return resilience/100.0f;+} float Player::GetRatingBonusValue(uint16 index) const { float value = float(GetUInt32Value(index)) / GetRatingCoefficient(index);@@ -4040,61 +4052,52 @@ switch (index) {+ case PLAYER_FIELD_ALL_WEAPONS_SKILL_RATING: 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;- }- 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;+ break; case PLAYER_FIELD_DEFENCE_RATING:- //Defense: 1.5- 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?int32(RatingChange):-int32(RatingChange);+ m_modMeleeHitChance += apply?int32(RatingChange):-int32(RatingChange); break; case PLAYER_FIELD_RANGED_HIT_RATING:- //Hit (melee): 10 RatingChange = value/ RatingCoeffecient;- m_modHitChance += apply?int32(RatingChange):-int32(RatingChange);+ m_modRangedHitChance += apply?int32(RatingChange):-int32(RatingChange); break; case PLAYER_FIELD_SPELL_HIT_RATING:- //Hit (spells): 8 RatingChange = value/ RatingCoeffecient; m_modSpellHitChance += apply?int32(RatingChange):-int32(RatingChange); break; case PLAYER_FIELD_MELEE_CRIT_RATING: if(affectStats)- UpdateCritPercentage(BASE_ATTACK); break;+ {+ UpdateCritPercentage(BASE_ATTACK);+ UpdateCritPercentage(OFF_ATTACK); + }+ break; case PLAYER_FIELD_RANGED_CRIT_RATING: if(affectStats)- UpdateCritPercentage(RANGED_ATTACK); break;+ UpdateCritPercentage(RANGED_ATTACK); + break; case PLAYER_FIELD_SPELL_CRIT_RATING: if(affectStats)- UpdateAllSpellCritChances(); break;+ UpdateAllSpellCritChances(); + break;+ case PLAYER_FIELD_HIT_TAKEN_MELEE_RATING:+ case PLAYER_FIELD_HIT_TAKEN_RANGED_RATING:+ case PLAYER_FIELD_HIT_TAKEN_SPELL_RATING:+ break;+ case PLAYER_FIELD_CRIT_TAKEN_MELEE_RATING:+ case PLAYER_FIELD_CRIT_TAKEN_RANGED_RATING:+ case PLAYER_FIELD_CRIT_TAKEN_SPELL_RATING:+ break; case PLAYER_FIELD_MELEE_HASTE_RATING:- //Haste: 6.67 RatingChange = value/ RatingCoeffecient; if(RatingChange > 0) {@@ -4108,7 +4111,6 @@ } break; case PLAYER_FIELD_RANGED_HASTE_RATING:- //Haste: 6.67 RatingChange = value/ RatingCoeffecient; if(RatingChange >= 0) ApplyAttackTimePercentMod(RANGED_ATTACK, RatingChange, apply);@@ -4116,36 +4118,9 @@ ApplyAttackTimePercentMod(RANGED_ATTACK, -RatingChange, !apply); break; case PLAYER_FIELD_SPELL_HASTE_RATING:- //Haste: 6.67 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 ? int32(RatingChange) : -int32(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; } } @@ -5886,22 +5861,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);@@ -5913,19 +5888,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);@@ -10306,16 +10291,22 @@ // Values from ITEM_STAT_MELEE_HA_RATING to ITEM_STAT_SPELL_HASTE_RATING are never used // in Enchantments 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 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 EnchantmentIndex: game/Player.h===================================================================--- game/Player.h (revision 4783)+++ game/Player.h (working copy)@@ -1508,6 +1508,7 @@ float GetBaseModValue(BaseModGroup modGroup, BaseModType modType) const; float GetTotalBaseModValue(BaseModGroup modGroup) const; float GetTotalPercentageModValue(BaseModGroup modGroup) const { return m_auraBaseMod[modGroup][FLAT_MOD] + m_auraBaseMod[modGroup][PCT_MOD]; }+ float GetResilience(); void _ApplyAllStatBonuses(); void _RemoveAllStatBonuses(); Index: game/Spell.h===================================================================--- game/Spell.h (revision 4783)+++ game/Spell.h (working copy)@@ -121,29 +121,33 @@ 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- //more ratings here?- 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-+ 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 };+#define MAX_RATINGS 23 + bool IsQuestTameSpell(uint32 spellId); namespace MaNGOSIndex: game/SpellAuras.cpp===================================================================--- game/SpellAuras.cpp (revision 4783)+++ game/SpellAuras.cpp (working copy)@@ -236,8 +236,8 @@ &Aura::HandleNoImmediateEffect, //184 SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE implemented in Unit::RollMeleeOutcomeAgainst &Aura::HandleNoImmediateEffect, //185 SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE implemented in Unit::RollMeleeOutcomeAgainst &Aura::HandleNoImmediateEffect, //186 SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE implemented in Unit::SpellMissChanceCalc- &Aura::HandleNULL, //187 SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE- &Aura::HandleNULL, //188 SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE+ &Aura::HandleNoImmediateEffect, //187 SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE+ &Aura::HandleNoImmediateEffect, //188 SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE &Aura::HandleModRating, //189 SPELL_AURA_MOD_RATING &Aura::HandleNULL, //190 SPELL_AURA_MOD_FACTION_REPUTATION_GAIN &Aura::HandleNULL, //191 SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED@@ -3411,7 +3411,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)@@ -4035,74 +4036,10 @@ { 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);-- 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);+ uint32 mask=1;+ for (uint32 rating=0;rating<MAX_RATINGS;rating++, mask<<=1)+ if (m_modifier.m_miscvalue & mask)+ ((Player*)m_target)->ApplyRatingMod(PLAYER_FIELD_COMBAT_RATING_1 + rating, m_modifier.m_amount, apply); } } Index: game/Unit.cpp===================================================================--- game/Unit.cpp (revision 4783)+++ game/Unit.cpp (working copy)@@ -174,10 +174,11 @@ m_createStats[i] = 0.0f; m_attacking = NULL;- m_modHitChance = 0;+ m_modMeleeHitChance = 0;+ m_modRangedHitChance = 0; m_modSpellHitChance = 0; m_baseSpellCritChance = 5;- m_modResilience = 0.0f;+ m_CombatTimer = 0; //m_victimThreat = 0.0f; for (int i = 0; i < MAX_SPELL_SCHOOL; ++i)@@ -1065,9 +1066,12 @@ { *damage *= 2; // Resilience - reduce crit damage by 2x%- uint32 resilienceReduction = uint32(pVictim->m_modResilience * 2/100 * (*damage));- cleanDamage->damage += resilienceReduction;- *damage -= resilienceReduction;+ if (pVictim->GetTypeId()==TYPEID_PLAYER)+ {+ uint32 resilienceReduction = uint32(((Player*)pVictim)->GetResilience() * (*damage));+ cleanDamage->damage += resilienceReduction;+ *damage -= resilienceReduction;+ } *crit = true; hitInfo |= HITINFO_CRITICALHIT; break;@@ -1206,9 +1210,12 @@ *crit = true; *damage *= 2; // Resilience - reduce crit damage by 2x%- uint32 resilienceReduction = uint32(pVictim->m_modResilience * 2/100 * (*damage));- cleanDamage->damage += resilienceReduction;- *damage -= resilienceReduction;+ if (pVictim->GetTypeId()==TYPEID_PLAYER)+ {+ uint32 resilienceReduction = uint32(((Player*)pVictim)->GetResilience() * (*damage));+ cleanDamage->damage += resilienceReduction;+ *damage -= resilienceReduction;+ } } } else@@ -1843,10 +1850,12 @@ } // Resilience - reduce crit damage by 2x%- uint32 resilienceReduction;- resilienceReduction = uint32(pVictim->m_modResilience * 2/100 * (*damage));- *damage -= resilienceReduction;- cleanDamage->damage += resilienceReduction;+ if (pVictim->GetTypeId()==TYPEID_PLAYER)+ {+ uint32 resilienceReduction = uint32(((Player*)pVictim)->GetResilience() * (*damage));+ cleanDamage->damage += resilienceReduction;+ *damage -= resilienceReduction;+ } if(GetTypeId() == TYPEID_PLAYER && pVictim->GetTypeId() != TYPEID_PLAYER && pVictim->GetCreatureType() != CREATURE_TYPE_CRITTER ) ((Player*)this)->UpdateWeaponSkill(attType);@@ -2209,7 +2218,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);@@ -2232,10 +2241,12 @@ // Spellmods if(Player* modOwner = GetSpellModOwner()) modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CRITICAL_CHANCE, crit_chance);+ uint32 modHitChance;+ if (attType==RANGED_ATTACK) modHitChance = m_modRangedHitChance;+ else modHitChance = m_modMeleeHitChance;+ DEBUG_LOG("PHYSICAL OUTCOME: hit %u crit %f miss %u", modHitChance,crit_chance,miss_chance); - DEBUG_LOG("PHYSICAL OUTCOME: hit %u crit %f miss %u",m_modHitChance,crit_chance,miss_chance);-- return RollMeleeOutcomeAgainst(pVictim, attType, int32(crit_chance * 100 ), miss_chance, m_modHitChance);+ return RollMeleeOutcomeAgainst(pVictim, attType, int32(crit_chance * 100 ), miss_chance, modHitChance); } MeleeHitOutcome Unit::RollMeleeOutcomeAgainst (const Unit *pVictim, WeaponAttackType attType) const@@ -2243,7 +2254,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);@@ -2252,10 +2263,12 @@ AuraList const& mAttackerSWCrit = pVictim->GetAurasByType(SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE); for(AuraList::const_iterator i = mAttackerSWCrit.begin(); i != mAttackerSWCrit.end(); ++i) crit_chance += (*i)->GetModifier()->m_amount;-+ uint32 modHitChance;+ 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 %u crit %u miss %u", m_modHitChance,crit_chance,miss_chance);- return RollMeleeOutcomeAgainst(pVictim, attType, int32(crit_chance * 100 ), miss_chance, m_modHitChance);+ DEBUG_LOG("MELEE OUTCOME: hit %u crit %u miss %u", modHitChance,crit_chance,miss_chance);+ return RollMeleeOutcomeAgainst(pVictim, attType, int32(crit_chance * 100 ), miss_chance, modHitChance); } MeleeHitOutcome Unit::RollMeleeOutcomeAgainst (const Unit *pVictim, WeaponAttackType attType, int32 crit_chance, int32 miss_chance, int32 hit_chance) const@@ -2264,6 +2277,18 @@ return MELEE_HIT_EVADE; int32 skillDiff = GetWeaponSkillValue(attType) - pVictim->GetDefenseSkillValue();+ if(GetTypeId() == TYPEID_PLAYER)+ {+ skillDiff+=((Player*)this)->GetRatingCoefficient(PLAYER_FIELD_ALL_WEAPONS_SKILL_RATING);+ switch (attType)+ {+ case BASE_ATTACK: skillDiff+=((Player*)this)->GetRatingCoefficient(PLAYER_FIELD_MELEE_WEAPON_SKILL_RATING);break;+ case OFF_ATTACK: skillDiff+=((Player*)this)->GetRatingCoefficient(PLAYER_FIELD_OFFHAND_WEAPON_SKILL_RATING);break;+ case RANGED_ATTACK: skillDiff+=((Player*)this)->GetRatingCoefficient(PLAYER_FIELD_RANGED_WEAPON_SKILL_RATING);break;+ }+ }+ if( pVictim->GetTypeId() == TYPEID_PLAYER)+ skillDiff-=((Player*)pVictim)->GetRatingCoefficient(PLAYER_FIELD_DEFENCE_RATING); // bonus from skills is 0.04% int32 skillBonus = skillDiff * 4; int32 skillBonus2 = 4 * ( GetWeaponSkillValue(attType) - pVictim->GetPureDefenseSkillValue() );@@ -2346,9 +2371,19 @@ } } - // Resilience - reduce crit chance by x%- modCrit -= int32(pVictim->m_modResilience*100);-+ // Reduce crit chance from auras+ if(attType == RANGED_ATTACK)+ modCrit -= int32(pVictim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE)*100);+ else+ modCrit -= int32(pVictim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE)*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; @@ -2478,11 +2513,12 @@ int32 mod = pVictim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE); misschance -= mod * 100;-+ if (pVictim->GetTypeId()==TYPEID_PLAYER)+ misschance+=((Player*)pVictim)->GetRatingCoefficient(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;@@ -2518,12 +2554,22 @@ int32 leveldif = pVictim->getLevel() - getLevel(); if(leveldif < 0) leveldif = 0;-+ 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 - m_modHitChance*100;+ misschance += leveldif * 100 - m_modHitChance; else- misschance += (leveldif - 2) * chance - m_modHitChance*100;-+ misschance += (leveldif - 2) * chance - m_modHitChance;+ if (pVictim->GetTypeId()==TYPEID_PLAYER)+ {+ if (attType == RANGED_ATTACK) + misschance+=((Player*)pVictim)->GetRatingCoefficient(PLAYER_FIELD_HIT_TAKEN_RANGED_RATING)*100.0f;+ else + misschance+=((Player*)pVictim)->GetRatingCoefficient(PLAYER_FIELD_HIT_TAKEN_MELEE_RATING)*100.0f;+ } return misschance > 6000 ? 6000 : misschance; } @@ -5203,7 +5249,8 @@ 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);@@ -5243,9 +5290,9 @@ *damage += crit_bonus; // Resilience - reduce crit damage by 2x%- if (pVictim)+ if (pVictim && pVictim->GetTypeId() == TYPEID_PLAYER) {- *damage -= uint32(pVictim->m_modResilience * 2/100 * (*damage));+ *damage -= uint32(((Player*)pVictim)->GetResilience() * (*damage)); } return true;Index: game/Unit.h===================================================================--- game/Unit.h (revision 4783)+++ game/Unit.h (working copy)@@ -834,7 +834,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;@@ -1032,10 +1032,10 @@ uint32 m_invisibilityMask; uint32 m_ShapeShiftForm; uint32 m_form;- int32 m_modHitChance;- int32 m_modSpellHitChance;+ 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 4783)+++ game/UpdateFields.h (working copy)@@ -378,17 +378,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