*Update to Mangos 7200.
--HG-- branch : trunk
This commit is contained in:
+43
-61
@@ -100,9 +100,9 @@ pAuraHandler AuraHandler[TOTAL_AURAS]=
|
||||
&Aura::HandleNoImmediateEffect, // 43 SPELL_AURA_PROC_TRIGGER_DAMAGE implemented in Unit::ProcDamageAndSpellFor
|
||||
&Aura::HandleAuraTrackCreatures, // 44 SPELL_AURA_TRACK_CREATURES
|
||||
&Aura::HandleAuraTrackResources, // 45 SPELL_AURA_TRACK_RESOURCES
|
||||
&Aura::HandleUnused, // 46 SPELL_AURA_MOD_PARRY_SKILL obsolete?
|
||||
&Aura::HandleUnused, // 46 SPELL_AURA_46
|
||||
&Aura::HandleAuraModParryPercent, // 47 SPELL_AURA_MOD_PARRY_PERCENT
|
||||
&Aura::HandleUnused, // 48 SPELL_AURA_MOD_DODGE_SKILL obsolete?
|
||||
&Aura::HandleUnused, // 48 SPELL_AURA_48
|
||||
&Aura::HandleAuraModDodgePercent, // 49 SPELL_AURA_MOD_DODGE_PERCENT
|
||||
&Aura::HandleNoImmediateEffect, // 50 SPELL_AURA_MOD_CRITICAL_HEALING_BONUS
|
||||
&Aura::HandleAuraModBlockPercent, // 51 SPELL_AURA_MOD_BLOCK_PERCENT
|
||||
@@ -119,7 +119,7 @@ pAuraHandler AuraHandler[TOTAL_AURAS]=
|
||||
&Aura::HandlePeriodicHealthFunnel, // 62 SPELL_AURA_PERIODIC_HEALTH_FUNNEL
|
||||
&Aura::HandleUnused, // 63 SPELL_AURA_PERIODIC_MANA_FUNNEL obsolete?
|
||||
&Aura::HandlePeriodicManaLeech, // 64 SPELL_AURA_PERIODIC_MANA_LEECH
|
||||
&Aura::HandleModCastingSpeed, // 65 SPELL_AURA_MOD_CASTING_SPEED
|
||||
&Aura::HandleModCastingSpeed, // 65 SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK
|
||||
&Aura::HandleFeignDeath, // 66 SPELL_AURA_FEIGN_DEATH
|
||||
&Aura::HandleAuraModDisarm, // 67 SPELL_AURA_MOD_DISARM
|
||||
&Aura::HandleAuraModStalked, // 68 SPELL_AURA_MOD_STALKED
|
||||
@@ -440,8 +440,10 @@ m_updated(false), m_isRemovedOnShapeLost(true), m_in_use(false)
|
||||
if(modOwner)
|
||||
modOwner->ApplySpellMod(GetId(), SPELLMOD_CHARGES, m_procCharges);
|
||||
|
||||
m_isRemovedOnShapeLost = (m_caster_guid==m_target->GetGUID() && m_spellProto->Stances &&
|
||||
!(m_spellProto->AttributesEx2 & 0x80000) && !(m_spellProto->Attributes & 0x10000));
|
||||
m_isRemovedOnShapeLost = (m_caster_guid==m_target->GetGUID() &&
|
||||
m_spellProto->Stances &&
|
||||
!(m_spellProto->AttributesEx2 & SPELL_ATTR_EX2_NOT_NEED_SHAPESHIFT) &&
|
||||
!(m_spellProto->Attributes & SPELL_ATTR_NOT_SHAPESHIFT));
|
||||
}
|
||||
|
||||
Aura::~Aura()
|
||||
@@ -858,6 +860,10 @@ void Aura::_AddAura()
|
||||
// Deadly poison aura state
|
||||
if(m_spellProto->SpellFamilyName == SPELLFAMILY_ROGUE && m_spellProto->SpellFamilyFlags & 0x10000)
|
||||
m_target->ModifyAuraState(AURA_STATE_DEADLY_POISON, true);
|
||||
|
||||
// Enrage aura state
|
||||
if(m_spellProto->Dispel == DISPEL_ENRAGE)
|
||||
m_target->ModifyAuraState(AURA_STATE_ENRAGE, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -927,6 +933,10 @@ void Aura::_RemoveAura()
|
||||
//*****************************************************
|
||||
// Update target aura state flag (at last aura remove)
|
||||
//*****************************************************
|
||||
// Enrage aura state
|
||||
if(m_spellProto->Dispel == DISPEL_ENRAGE)
|
||||
m_target->ModifyAuraState(AURA_STATE_ENRAGE, false);
|
||||
|
||||
uint32 removeState = 0;
|
||||
switch(m_spellProto->SpellFamilyName)
|
||||
{
|
||||
@@ -1975,7 +1985,7 @@ void Aura::HandleAuraDummy(bool apply, bool Real)
|
||||
{
|
||||
// prevent double apply bonuses
|
||||
if(m_target->GetTypeId()!=TYPEID_PLAYER || !((Player*)m_target)->GetSession()->PlayerLoading())
|
||||
m_modifier.m_amount = caster->SpellHealingBonus(GetSpellProto(), m_modifier.m_amount, SPELL_DIRECT_DAMAGE, m_target);
|
||||
m_modifier.m_amount = caster->SpellHealingBonus(m_target, GetSpellProto(), m_modifier.m_amount, SPELL_DIRECT_DAMAGE);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -2173,7 +2183,7 @@ void Aura::HandleAuraDummy(bool apply, bool Real)
|
||||
if ( caster )
|
||||
// prevent double apply bonuses
|
||||
if(m_target->GetTypeId()!=TYPEID_PLAYER || !((Player*)m_target)->GetSession()->PlayerLoading())
|
||||
m_modifier.m_amount = caster->SpellHealingBonus(GetSpellProto(), m_modifier.m_amount, SPELL_DIRECT_DAMAGE, m_target);
|
||||
m_modifier.m_amount = caster->SpellHealingBonus(m_target, GetSpellProto(), m_modifier.m_amount, SPELL_DIRECT_DAMAGE);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -2847,6 +2857,9 @@ void Aura::HandleChannelDeathItem(bool apply, bool Real)
|
||||
//talent will remove the caster's aura->interrupt channel->remove victim aura
|
||||
if(victim->GetHealth() > 0)
|
||||
return;
|
||||
// Item amount
|
||||
if (m_modifier.m_amount <= 0)
|
||||
return;
|
||||
|
||||
SpellEntry const *spellInfo = GetSpellProto();
|
||||
if(spellInfo->EffectItemType[m_effIndex] == 0)
|
||||
@@ -2857,16 +2870,22 @@ void Aura::HandleChannelDeathItem(bool apply, bool Real)
|
||||
(victim->getLevel() <= Trinity::XP::GetGrayLevel(caster->getLevel()) ||
|
||||
victim->GetTypeId()==TYPEID_UNIT && !((Player*)caster)->isAllowedToLoot((Creature*)victim)) )
|
||||
return;
|
||||
//Adding items
|
||||
uint32 noSpaceForCount = 0;
|
||||
uint32 count = m_modifier.m_amount;
|
||||
|
||||
ItemPosCountVec dest;
|
||||
uint8 msg = ((Player*)caster)->CanStoreNewItem( NULL_BAG, NULL_SLOT, dest, spellInfo->EffectItemType[m_effIndex], 1 );
|
||||
uint8 msg = ((Player*)caster)->CanStoreNewItem( NULL_BAG, NULL_SLOT, dest, spellInfo->EffectItemType[m_effIndex], count, &noSpaceForCount);
|
||||
if( msg != EQUIP_ERR_OK )
|
||||
{
|
||||
count-=noSpaceForCount;
|
||||
((Player*)caster)->SendEquipError( msg, NULL, NULL );
|
||||
return;
|
||||
if (count==0)
|
||||
return;
|
||||
}
|
||||
|
||||
Item* newitem = ((Player*)caster)->StoreNewItem(dest, spellInfo->EffectItemType[m_effIndex], true);
|
||||
((Player*)caster)->SendNewItem(newitem, 1, true, false);
|
||||
((Player*)caster)->SendNewItem(newitem, count, true, false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3694,9 +3713,8 @@ void Aura::HandleModMechanicImmunity(bool apply, bool Real)
|
||||
next = iter;
|
||||
++next;
|
||||
SpellEntry const *spell = iter->second->GetSpellProto();
|
||||
if (!( spell->Attributes & SPELL_ATTR_UNAFFECTED_BY_INVULNERABILITY) // spells unaffected by invulnerability
|
||||
&& !iter->second->IsPositive() // only remove negative spells
|
||||
&& spell->Id != GetId())
|
||||
if (!( spell->Attributes & SPELL_ATTR_UNAFFECTED_BY_INVULNERABILITY) && // spells unaffected by invulnerability
|
||||
spell->Id != GetId())
|
||||
{
|
||||
//check for mechanic mask
|
||||
if(GetSpellMechanicMask(spell, iter->second->GetEffIndex()) & mechanic)
|
||||
@@ -4122,29 +4140,6 @@ void Aura::HandlePeriodicDamage(bool apply, bool Real)
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SPELLFAMILY_PALADIN:
|
||||
{
|
||||
// Consecration
|
||||
if (m_spellProto->SpellFamilyFlags & 0x0000000000000020LL)
|
||||
{
|
||||
// ($m1+0.04*$SPH+0.04*$AP)
|
||||
float ap = caster->GetTotalAttackPowerValue(BASE_ATTACK);
|
||||
int32 holy = caster->SpellBaseDamageBonus(GetSpellSchoolMask(m_spellProto)) +
|
||||
caster->SpellBaseDamageBonusForVictim(GetSpellSchoolMask(m_spellProto), m_target);
|
||||
m_modifier.m_amount += int32(0.04f*holy + 0.04f*ap);
|
||||
return;
|
||||
}
|
||||
// Seal of Vengeance 0.013*$SPH+0.025*$AP per tick (also can stack)
|
||||
if(m_spellProto->SpellFamilyFlags & 0x0000080000000000LL)
|
||||
{
|
||||
float ap = caster->GetTotalAttackPowerValue(BASE_ATTACK);
|
||||
int32 holy = caster->SpellBaseDamageBonus(GetSpellSchoolMask(m_spellProto)) +
|
||||
caster->SpellBaseDamageBonusForVictim(GetSpellSchoolMask(m_spellProto), m_target);
|
||||
m_modifier.m_amount += int32((0.013f*holy + 0.025f*ap) * GetStackAmount());
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -5086,7 +5081,7 @@ void Aura::HandleShapeshiftBoosts(bool apply)
|
||||
if(itr->second->state == PLAYERSPELL_REMOVED) continue;
|
||||
if(itr->first==spellId || itr->first==spellId2) continue;
|
||||
SpellEntry const *spellInfo = sSpellStore.LookupEntry(itr->first);
|
||||
if (!spellInfo || !(spellInfo->Attributes & ((1<<6) | (1<<7)))) continue;
|
||||
if (!spellInfo || !(spellInfo->Attributes & (SPELL_ATTR_PASSIVE | (1<<7)))) continue;
|
||||
if (spellInfo->Stances & (1<<form))
|
||||
m_target->CastSpell(m_target, itr->first, true, NULL, this);
|
||||
}
|
||||
@@ -5487,13 +5482,12 @@ void Aura::PeriodicTick()
|
||||
CleanDamage cleanDamage = CleanDamage(0, BASE_ATTACK, MELEE_HIT_NORMAL );
|
||||
|
||||
// ignore non positive values (can be result apply spellmods to aura damage
|
||||
uint32 amount = GetModifierValuePerStack() > 0 ? GetModifierValuePerStack() : 0;
|
||||
|
||||
uint32 pdamage;
|
||||
//uint32 amount = GetModifierValuePerStack() > 0 ? GetModifierValuePerStack() : 0;
|
||||
uint32 pdamage = GetModifier()->m_amount > 0 ? GetModifier()->m_amount : 0;
|
||||
|
||||
if(m_modifier.m_auraname == SPELL_AURA_PERIODIC_DAMAGE)
|
||||
{
|
||||
pdamage = pCaster->SpellDamageBonus(m_target,GetSpellProto(),amount,DOT);
|
||||
pdamage = pCaster->SpellDamageBonus(m_target, GetSpellProto(), pdamage, DOT, GetStackAmount());
|
||||
|
||||
// Calculate armor mitigation if it is a physical spell
|
||||
// But not for bleed mechanic spells
|
||||
@@ -5505,8 +5499,6 @@ void Aura::PeriodicTick()
|
||||
pdamage = pdamageReductedArmor;
|
||||
}
|
||||
|
||||
//pdamage = pCaster->SpellDamageBonus(m_target,GetSpellProto(),pdamage,DOT);
|
||||
|
||||
// Curse of Agony damage-per-tick calculation
|
||||
if (GetSpellProto()->SpellFamilyName==SPELLFAMILY_WARLOCK && (GetSpellProto()->SpellFamilyFlags & 0x0000000000000400LL) && GetSpellProto()->SpellIconID==544)
|
||||
{
|
||||
@@ -5527,8 +5519,6 @@ void Aura::PeriodicTick()
|
||||
if (m_target->GetTypeId()==TYPEID_PLAYER)
|
||||
pdamage-=((Player*)m_target)->GetDotDamageReduction(pdamage);
|
||||
|
||||
pdamage *= GetStackAmount();
|
||||
|
||||
pCaster->CalcAbsorbResist(m_target, GetSpellSchoolMask(GetSpellProto()), DOT, pdamage, &absorb, &resist);
|
||||
|
||||
sLog.outDetail("PeriodicTick: %u (TypeId: %u) attacked %u (TypeId: %u) for %u dmg inflicted by %u abs is %u",
|
||||
@@ -5583,8 +5573,9 @@ void Aura::PeriodicTick()
|
||||
uint32 resist=0;
|
||||
CleanDamage cleanDamage = CleanDamage(0, BASE_ATTACK, MELEE_HIT_NORMAL );
|
||||
|
||||
uint32 pdamage = GetModifierValuePerStack() > 0 ? GetModifierValuePerStack() : 0;
|
||||
pdamage = pCaster->SpellDamageBonus(m_target,GetSpellProto(),pdamage,DOT);
|
||||
//uint32 pdamage = GetModifierValuePerStack() > 0 ? GetModifierValuePerStack() : 0;
|
||||
uint32 pdamage = GetModifier()->m_amount > 0 ? GetModifier()->m_amount : 0;
|
||||
pdamage = pCaster->SpellDamageBonus(m_target, GetSpellProto(), pdamage, DOT, GetStackAmount());
|
||||
|
||||
//Calculate armor mitigation if it is a physical spell
|
||||
if (GetSpellSchoolMask(GetSpellProto()) & SPELL_SCHOOL_MASK_NORMAL)
|
||||
@@ -5594,15 +5585,11 @@ void Aura::PeriodicTick()
|
||||
pdamage = pdamageReductedArmor;
|
||||
}
|
||||
|
||||
//pdamage = pCaster->SpellDamageBonus(m_target,GetSpellProto(),pdamage,DOT);
|
||||
|
||||
//As of 2.2 resilience reduces damage from DoT ticks as much as the chance to not be critically hit
|
||||
// Reduce dot damage from resilience for players
|
||||
if (m_target->GetTypeId()==TYPEID_PLAYER)
|
||||
pdamage-=((Player*)m_target)->GetDotDamageReduction(pdamage);
|
||||
|
||||
pdamage *= GetStackAmount();
|
||||
|
||||
pCaster->CalcAbsorbResist(m_target, GetSpellSchoolMask(GetSpellProto()), DOT, pdamage, &absorb, &resist);
|
||||
|
||||
if(m_target->GetHealth() < pdamage)
|
||||
@@ -5640,7 +5627,7 @@ void Aura::PeriodicTick()
|
||||
if(Player *modOwner = pCaster->GetSpellModOwner())
|
||||
modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_MULTIPLE_VALUE, multiplier);
|
||||
|
||||
uint32 heal = pCaster->SpellHealingBonus(spellProto, uint32(new_damage * multiplier), DOT, pCaster);
|
||||
uint32 heal = pCaster->SpellHealingBonus(pCaster, spellProto, uint32(new_damage * multiplier), DOT, GetStackAmount());
|
||||
|
||||
int32 gain = pCaster->ModifyHealth(heal);
|
||||
pCaster->getHostilRefManager().threatAssist(pCaster, gain * 0.5f, spellProto);
|
||||
@@ -5660,18 +5647,13 @@ void Aura::PeriodicTick()
|
||||
return;
|
||||
|
||||
// ignore non positive values (can be result apply spellmods to aura damage
|
||||
uint32 amount = GetModifierValuePerStack() > 0 ? GetModifierValuePerStack() : 0;
|
||||
|
||||
uint32 pdamage;
|
||||
//uint32 amount = GetModifierValuePerStack() > 0 ? GetModifierValuePerStack() : 0;
|
||||
uint32 pdamage = GetModifier()->m_amount > 0 ? GetModifier()->m_amount : 0;
|
||||
|
||||
if(m_modifier.m_auraname==SPELL_AURA_OBS_MOD_HEALTH)
|
||||
pdamage = uint32(m_target->GetMaxHealth() * amount/100);
|
||||
pdamage = uint32(m_target->GetMaxHealth() * pdamage * GetStackAmount() / 100);
|
||||
else
|
||||
pdamage = pCaster->SpellHealingBonus(GetSpellProto(), amount, DOT, m_target);
|
||||
|
||||
pdamage *= GetStackAmount();
|
||||
|
||||
//pdamage = pCaster->SpellHealingBonus(GetSpellProto(), pdamage, DOT, m_target);
|
||||
pdamage = pCaster->SpellHealingBonus(m_target, GetSpellProto(), pdamage, DOT, GetStackAmount());
|
||||
|
||||
sLog.outDetail("PeriodicTick: %u (TypeId: %u) heal of %u (TypeId: %u) for %u health inflicted by %u",
|
||||
GUID_LOPART(GetCasterGUID()), GuidHigh2TypeId(GUID_HIPART(GetCasterGUID())), m_target->GetGUIDLow(), m_target->GetTypeId(), pdamage, GetId());
|
||||
|
||||
Reference in New Issue
Block a user