*Implement "Chaos Bolt cannot be resisted, and pierces through all absorption effects" + some cleanup.
--HG-- branch : trunk
This commit is contained in:
@@ -321,7 +321,7 @@ enum AuraType
|
|||||||
SPELL_AURA_273 = 273,
|
SPELL_AURA_273 = 273,
|
||||||
SPELL_AURA_ABILITY_CONSUME_NO_AMMO = 274,
|
SPELL_AURA_ABILITY_CONSUME_NO_AMMO = 274,
|
||||||
SPELL_AURA_MOD_IGNORE_SHAPESHIFT = 275,
|
SPELL_AURA_MOD_IGNORE_SHAPESHIFT = 275,
|
||||||
SPELL_AURA_276 = 276, // Only "Test Mod Damage % Mechanic" spell, possible mod damage done
|
SPELL_AURA_276 = 276, // Only "Test Mod Damage % Mechanic" spell, possible mod damage done
|
||||||
SPELL_AURA_MOD_MAX_AFFECTED_TARGETS = 277,
|
SPELL_AURA_MOD_MAX_AFFECTED_TARGETS = 277,
|
||||||
SPELL_AURA_MOD_DISARM_RANGED = 278,
|
SPELL_AURA_MOD_DISARM_RANGED = 278,
|
||||||
SPELL_AURA_INITIALIZE_IMAGES = 279,
|
SPELL_AURA_INITIALIZE_IMAGES = 279,
|
||||||
|
|||||||
+24
-18
@@ -1183,7 +1183,7 @@ void Unit::CalculateSpellDamageTaken(SpellNonMeleeDamage *damageInfo, int32 dama
|
|||||||
|
|
||||||
if (crit)
|
if (crit)
|
||||||
{
|
{
|
||||||
damageInfo->HitInfo|= SPELL_HIT_TYPE_CRIT;
|
damageInfo->HitInfo |= SPELL_HIT_TYPE_CRIT;
|
||||||
|
|
||||||
// Calculate crit bonus
|
// Calculate crit bonus
|
||||||
uint32 crit_bonus = damage;
|
uint32 crit_bonus = damage;
|
||||||
@@ -1247,8 +1247,16 @@ void Unit::CalculateSpellDamageTaken(SpellNonMeleeDamage *damageInfo, int32 dama
|
|||||||
// Calculate absorb resist
|
// Calculate absorb resist
|
||||||
if (damage > 0)
|
if (damage > 0)
|
||||||
{
|
{
|
||||||
CalcAbsorbResist(pVictim, damageSchoolMask, SPELL_DIRECT_DAMAGE, damage, &damageInfo->absorb, &damageInfo->resist, spellInfo);
|
switch (spellInfo->SpellIconID)
|
||||||
damage-= damageInfo->absorb + damageInfo->resist;
|
{
|
||||||
|
// Chaos Bolt - "Chaos Bolt cannot be resisted, and pierces through all absorption effects."
|
||||||
|
case 3178:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
CalcAbsorbResist(pVictim, damageSchoolMask, SPELL_DIRECT_DAMAGE, damage, &damageInfo->absorb, &damageInfo->resist, spellInfo);
|
||||||
|
damage -= damageInfo->absorb + damageInfo->resist;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
damage = 0;
|
damage = 0;
|
||||||
@@ -1736,7 +1744,7 @@ uint32 Unit::CalcArmorReducedDamage(Unit* pVictim, const uint32 damage, SpellEnt
|
|||||||
return (newdamage > 1) ? newdamage : 1;
|
return (newdamage > 1) ? newdamage : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Unit::CalcAbsorbResist(Unit *pVictim,SpellSchoolMask schoolMask, DamageEffectType damagetype, const uint32 damage, uint32 *absorb, uint32 *resist, SpellEntry const *spellInfo)
|
void Unit::CalcAbsorbResist(Unit *pVictim, SpellSchoolMask schoolMask, DamageEffectType damagetype, const uint32 damage, uint32 *absorb, uint32 *resist, SpellEntry const *spellInfo)
|
||||||
{
|
{
|
||||||
if (!pVictim || !pVictim->isAlive() || !damage)
|
if (!pVictim || !pVictim->isAlive() || !damage)
|
||||||
return;
|
return;
|
||||||
@@ -1761,7 +1769,7 @@ void Unit::CalcAbsorbResist(Unit *pVictim,SpellSchoolMask schoolMask, DamageEffe
|
|||||||
for (uint8 i = 0; i < 4; ++i)
|
for (uint8 i = 0; i < 4; ++i)
|
||||||
{
|
{
|
||||||
Binom += 2400 *( powf(tmpvalue2, i) * powf( (1-tmpvalue2), (4-i)))/faq[i];
|
Binom += 2400 *( powf(tmpvalue2, i) * powf( (1-tmpvalue2), (4-i)))/faq[i];
|
||||||
if (ran > Binom )
|
if (ran > Binom)
|
||||||
++m;
|
++m;
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
@@ -1773,7 +1781,7 @@ void Unit::CalcAbsorbResist(Unit *pVictim,SpellSchoolMask schoolMask, DamageEffe
|
|||||||
if (*resist > damage)
|
if (*resist > damage)
|
||||||
*resist = damage;
|
*resist = damage;
|
||||||
|
|
||||||
AuraEffectList const& ResIgnoreAurasAb = GetAurasByType(SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST);
|
AuraEffectList const &ResIgnoreAurasAb = GetAurasByType(SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST);
|
||||||
for (AuraEffectList::const_iterator j = ResIgnoreAurasAb.begin(); j != ResIgnoreAurasAb.end(); ++j)
|
for (AuraEffectList::const_iterator j = ResIgnoreAurasAb.begin(); j != ResIgnoreAurasAb.end(); ++j)
|
||||||
{
|
{
|
||||||
if ((*j)->GetMiscValue() & schoolMask
|
if ((*j)->GetMiscValue() & schoolMask
|
||||||
@@ -1781,7 +1789,7 @@ void Unit::CalcAbsorbResist(Unit *pVictim,SpellSchoolMask schoolMask, DamageEffe
|
|||||||
*resist= int32(float(*resist) * (float(100-(*j)->GetAmount())/100.0f));
|
*resist= int32(float(*resist) * (float(100-(*j)->GetAmount())/100.0f));
|
||||||
}
|
}
|
||||||
|
|
||||||
AuraEffectList const& ResIgnoreAuras = GetAurasByType(SPELL_AURA_MOD_IGNORE_TARGET_RESIST);
|
AuraEffectList const &ResIgnoreAuras = GetAurasByType(SPELL_AURA_MOD_IGNORE_TARGET_RESIST);
|
||||||
for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
|
for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
|
||||||
{
|
{
|
||||||
if ((*j)->GetMiscValue() & schoolMask)
|
if ((*j)->GetMiscValue() & schoolMask)
|
||||||
@@ -1814,14 +1822,14 @@ void Unit::CalcAbsorbResist(Unit *pVictim,SpellSchoolMask schoolMask, DamageEffe
|
|||||||
int32 currentAbsorb = (*i)->GetAmount();
|
int32 currentAbsorb = (*i)->GetAmount();
|
||||||
|
|
||||||
// Found empty aura (impossible but..)
|
// Found empty aura (impossible but..)
|
||||||
if (currentAbsorb <=0)
|
if (currentAbsorb <= 0)
|
||||||
{
|
{
|
||||||
existExpired = true;
|
existExpired = true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// Handle custom absorb auras
|
// Handle custom absorb auras
|
||||||
// TODO: try find better way
|
// TODO: try find better way
|
||||||
switch(spellProto->SpellFamilyName)
|
switch (spellProto->SpellFamilyName)
|
||||||
{
|
{
|
||||||
case SPELLFAMILY_GENERIC:
|
case SPELLFAMILY_GENERIC:
|
||||||
{
|
{
|
||||||
@@ -1891,11 +1899,9 @@ void Unit::CalcAbsorbResist(Unit *pVictim,SpellSchoolMask schoolMask, DamageEffe
|
|||||||
if (spellProto->SpellIconID == 2109)
|
if (spellProto->SpellIconID == 2109)
|
||||||
{
|
{
|
||||||
if (!preventDeathSpell &&
|
if (!preventDeathSpell &&
|
||||||
pVictim->GetTypeId() == TYPEID_PLAYER && // Only players
|
pVictim->GetTypeId() == TYPEID_PLAYER && // Only players
|
||||||
!((Player*)pVictim)->HasSpellCooldown(31231) &&
|
!((Player*)pVictim)->HasSpellCooldown(31231) && // Only if no cooldown
|
||||||
// Only if no cooldown
|
roll_chance_i((*i)->GetAmount())) // Only if roll
|
||||||
roll_chance_i((*i)->GetAmount()))
|
|
||||||
// Only if roll
|
|
||||||
{
|
{
|
||||||
preventDeathSpell = (*i)->GetSpellProto();
|
preventDeathSpell = (*i)->GetSpellProto();
|
||||||
}
|
}
|
||||||
@@ -1953,7 +1959,7 @@ void Unit::CalcAbsorbResist(Unit *pVictim,SpellSchoolMask schoolMask, DamageEffe
|
|||||||
}
|
}
|
||||||
case SPELLFAMILY_DEATHKNIGHT:
|
case SPELLFAMILY_DEATHKNIGHT:
|
||||||
{
|
{
|
||||||
switch(spellProto->Id)
|
switch (spellProto->Id)
|
||||||
{
|
{
|
||||||
case 51271: // Unbreakable Armor
|
case 51271: // Unbreakable Armor
|
||||||
if (Unit *caster = (*i)->GetCaster())
|
if (Unit *caster = (*i)->GetCaster())
|
||||||
@@ -1962,7 +1968,7 @@ void Unit::CalcAbsorbResist(Unit *pVictim,SpellSchoolMask schoolMask, DamageEffe
|
|||||||
|
|
||||||
// Glyph of Unbreakable Armor
|
// Glyph of Unbreakable Armor
|
||||||
if (AuraEffect *aurEff = caster->GetAuraEffect(58635, 0))
|
if (AuraEffect *aurEff = caster->GetAuraEffect(58635, 0))
|
||||||
absorbed += uint32( absorbed * aurEff->GetAmount() / 100 );
|
absorbed += uint32(absorbed * aurEff->GetAmount() / 100);
|
||||||
|
|
||||||
RemainingDamage -= absorbed;
|
RemainingDamage -= absorbed;
|
||||||
}
|
}
|
||||||
@@ -2010,7 +2016,7 @@ void Unit::CalcAbsorbResist(Unit *pVictim,SpellSchoolMask schoolMask, DamageEffe
|
|||||||
// Reduce shield amount
|
// Reduce shield amount
|
||||||
(*i)->SetAmount((*i)->GetAmount() -currentAbsorb);
|
(*i)->SetAmount((*i)->GetAmount() -currentAbsorb);
|
||||||
// Need remove it later
|
// Need remove it later
|
||||||
if ((*i)->GetAmount()<=0)
|
if ((*i)->GetAmount() <= 0)
|
||||||
existExpired = true;
|
existExpired = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2020,7 +2026,7 @@ void Unit::CalcAbsorbResist(Unit *pVictim,SpellSchoolMask schoolMask, DamageEffe
|
|||||||
itr->source->CastCustomSpell(itr->spell, SPELLVALUE_BASE_POINT0, itr->amount, itr->target, true, NULL, itr->auraEff);
|
itr->source->CastCustomSpell(itr->spell, SPELLVALUE_BASE_POINT0, itr->amount, itr->target, true, NULL, itr->auraEff);
|
||||||
else if (itr->amount > 0)
|
else if (itr->amount > 0)
|
||||||
{
|
{
|
||||||
uint32 damage = (uint32)itr->amount;
|
uint32 damage = uint32(itr->amount);
|
||||||
itr->source->DealDamageMods(itr->target, damage, NULL);
|
itr->source->DealDamageMods(itr->target, damage, NULL);
|
||||||
itr->source->DealDamage(itr->target, damage, NULL, damagetype, schoolMask, 0, false);
|
itr->source->DealDamage(itr->target, damage, NULL, damagetype, schoolMask, 0, false);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user