*Implement "Chaos Bolt cannot be resisted, and pierces through all absorption effects" + some cleanup.

--HG--
branch : trunk
This commit is contained in:
maximius
2009-11-20 20:25:12 -08:00
parent 37974cc362
commit 75e37c7599
2 changed files with 25 additions and 19 deletions
+1 -1
View File
@@ -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
View File
@@ -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);
} }