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 Enchantment Index: 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 MaNGOS Index: 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;ratingApplyRatingMod(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