All pastes #824296 Raw Edit

Rating Fixes

public cpp v1 · immutable
·published 2007-12-19 21:57 UTC
rendered paste body
Index: 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