diff options
Diffstat (limited to 'src/game/Unit.cpp')
-rw-r--r-- | src/game/Unit.cpp | 52 |
1 files changed, 34 insertions, 18 deletions
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index d2a10593a1d..6f248b75161 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -1334,12 +1334,12 @@ void Unit::CalculateMeleeDamage(Unit *pVictim, uint32 damage, CalcDamageInfo *da switch (attackType) { case BASE_ATTACK: - damageInfo->procAttacker = PROC_FLAG_SUCCESSFUL_MILEE_HIT; + damageInfo->procAttacker = PROC_FLAG_SUCCESSFUL_MELEE_HIT; damageInfo->procVictim = PROC_FLAG_TAKEN_MELEE_HIT; damageInfo->HitInfo = HITINFO_NORMALSWING2; break; case OFF_ATTACK: - damageInfo->procAttacker = PROC_FLAG_SUCCESSFUL_MILEE_HIT | PROC_FLAG_SUCCESSFUL_OFFHAND_HIT; + damageInfo->procAttacker = PROC_FLAG_SUCCESSFUL_MELEE_HIT | PROC_FLAG_SUCCESSFUL_OFFHAND_HIT; damageInfo->procVictim = PROC_FLAG_TAKEN_MELEE_HIT;//|PROC_FLAG_TAKEN_OFFHAND_HIT // not used damageInfo->HitInfo = HITINFO_LEFTSWING; break; @@ -1659,7 +1659,7 @@ void Unit::DealMeleeDamage(CalcDamageInfo *damageInfo, bool durabilityLoss) } // Do effect if any damage done to target - if (damageInfo->damage) + if (damageInfo->procVictim & PROC_FLAG_TAKEN_ANY_DAMAGE) { // victim's damage shield std::set<Aura*> alreadyDone; @@ -2804,6 +2804,27 @@ float Unit::MeleeSpellMissChance(const Unit *pVictim, WeaponAttackType attType, return miss_chance; } + +int32 Unit::GetMechanicResistChance(const SpellEntry *spell) +{ + if(!spell) + return 0; + int32 resist_mech = 0; + for(int eff = 0; eff < 3; ++eff) + { + if(spell->Effect[eff] == 0) + break; + int32 effect_mech = GetEffectMechanic(spell, eff); + if (effect_mech) + { + int32 temp = GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_MECHANIC_RESISTANCE, effect_mech); + if (resist_mech < temp) + resist_mech = temp; + } + } + return resist_mech; +} + // Melee based spells hit result calculations SpellMissInfo Unit::MeleeSpellHitResult(Unit *pVictim, SpellEntry const *spell) { @@ -2829,6 +2850,12 @@ SpellMissInfo Unit::MeleeSpellHitResult(Unit *pVictim, SpellEntry const *spell) if (spell->Attributes & SPELL_ATTR_IMPOSSIBLE_DODGE_PARRY_BLOCK) return SPELL_MISS_NONE; + // Chance resist mechanic + int32 resist_chance = pVictim->GetMechanicResistChance(spell)*100; + tmp += resist_chance; + if (roll < tmp) + return SPELL_MISS_RESIST; + // Ranged attack can`t miss too if (attType == RANGED_ATTACK) return SPELL_MISS_NONE; @@ -2917,20 +2944,9 @@ SpellMissInfo Unit::MagicSpellHitResult(Unit *pVictim, SpellEntry const *spell) if (IsDispelSpell(spell)) modHitChance-=pVictim->GetTotalAuraModifier(SPELL_AURA_MOD_DISPEL_RESIST); // Chance resist mechanic (select max value from every mechanic spell effect) - int32 resist_mech = 0; - // Get effects mechanic and chance - for(int eff = 0; eff < 3; ++eff) - { - int32 effect_mech = GetEffectMechanic(spell, eff); - if (effect_mech) - { - int32 temp = pVictim->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_MECHANIC_RESISTANCE, effect_mech); - if (resist_mech < temp) - resist_mech = temp; - } - } + int32 resist_chance = pVictim->GetMechanicResistChance(spell); // Apply mod - modHitChance-=resist_mech; + modHitChance-=resist_chance; // Chance resist debuff modHitChance-=pVictim->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_DEBUFF_RESISTANCE, int32(spell->Dispel)); @@ -4709,10 +4725,10 @@ void Unit::SendSpellNonMeleeDamageLog(Unit *target,uint32 SpellID,uint32 Damage, SendMessageToSet( &data, true ); } -void Unit::ProcDamageAndSpell(Unit *pVictim, uint32 procAttacker, uint32 procVictim, uint32 procExtra, uint32 amount, WeaponAttackType attType, SpellEntry const *procSpell) +void Unit::ProcDamageAndSpell(Unit *pVictim, uint32 procAttacker, uint32 procVictim, uint32 procExtra, uint32 amount, WeaponAttackType attType, SpellEntry const *procSpell, bool canTrigger) { // Not much to do if no flags are set. - if (procAttacker) + if (procAttacker && canTrigger) ProcDamageAndSpellFor(false,pVictim,procAttacker, procExtra,attType, procSpell, amount); // Now go on with a victim's events'n'auras // Not much to do if no flags are set or there is no victim |