aboutsummaryrefslogtreecommitdiff
path: root/src/game/Unit.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/Unit.cpp')
-rw-r--r--src/game/Unit.cpp52
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