mirror of
https://github.com/mangosfour/server.git
synced 2025-12-13 22:37:03 +00:00
[8139] Implemented aura SPELL_AURA_ABILITY_PERIODIC_CRIT(286).
This commit affects spells 49868, 58435, 63068, 63091, 63503, 64915, 64925. Signed-off-by: ApoC <apoc@nymfe.net>
This commit is contained in:
parent
c8bb0c75a3
commit
fccba20c9d
6 changed files with 33 additions and 8 deletions
|
|
@ -328,7 +328,7 @@ enum AuraType
|
||||||
SPELL_AURA_MOD_HEALING_RECEIVED = 283, // Possibly only for some spell family class spells
|
SPELL_AURA_MOD_HEALING_RECEIVED = 283, // Possibly only for some spell family class spells
|
||||||
SPELL_AURA_284,
|
SPELL_AURA_284,
|
||||||
SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR = 285,
|
SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR = 285,
|
||||||
SPELL_AURA_286,
|
SPELL_AURA_ABILITY_PERIODIC_CRIT = 286,
|
||||||
SPELL_AURA_DEFLECT_SPELLS,
|
SPELL_AURA_DEFLECT_SPELLS,
|
||||||
SPELL_AURA_288,
|
SPELL_AURA_288,
|
||||||
SPELL_AURA_289,
|
SPELL_AURA_289,
|
||||||
|
|
|
||||||
|
|
@ -336,7 +336,7 @@ pAuraHandler AuraHandler[TOTAL_AURAS]=
|
||||||
&Aura::HandleNoImmediateEffect, //283 SPELL_AURA_MOD_HEALING_RECEIVED implemented in Unit::SpellHealingBonus
|
&Aura::HandleNoImmediateEffect, //283 SPELL_AURA_MOD_HEALING_RECEIVED implemented in Unit::SpellHealingBonus
|
||||||
&Aura::HandleUnused, //284 not used by any spells (3.08a)
|
&Aura::HandleUnused, //284 not used by any spells (3.08a)
|
||||||
&Aura::HandleAuraModAttackPowerOfArmor, //285 SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR implemented in Player::UpdateAttackPowerAndDamage
|
&Aura::HandleAuraModAttackPowerOfArmor, //285 SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR implemented in Player::UpdateAttackPowerAndDamage
|
||||||
&Aura::HandleUnused, //286 not used by any spells (3.08a)
|
&Aura::HandleNoImmediateEffect, //286 SPELL_AURA_ABILITY_PERIODIC_CRIT implemented in Aura::IsCritFromAbilityAura called from AuraEffect::PeriodicTick
|
||||||
&Aura::HandleNoImmediateEffect, //287 SPELL_AURA_DEFLECT_SPELLS implemented in Unit::MagicSpellHitResult and Unit::MeleeSpellHitResult
|
&Aura::HandleNoImmediateEffect, //287 SPELL_AURA_DEFLECT_SPELLS implemented in Unit::MagicSpellHitResult and Unit::MeleeSpellHitResult
|
||||||
&Aura::HandleUnused, //288 not used by any spells (3.09) except 1 test spell.
|
&Aura::HandleUnused, //288 not used by any spells (3.09) except 1 test spell.
|
||||||
&Aura::HandleUnused, //289 unused
|
&Aura::HandleUnused, //289 unused
|
||||||
|
|
@ -5896,6 +5896,9 @@ void Aura::PeriodicTick()
|
||||||
else
|
else
|
||||||
pdamage = uint32(m_target->GetMaxHealth()*amount/100);
|
pdamage = uint32(m_target->GetMaxHealth()*amount/100);
|
||||||
|
|
||||||
|
// This method can modify pdamage
|
||||||
|
bool isCrit = IsCritFromAbilityAura(pCaster, pdamage);
|
||||||
|
|
||||||
// As of 2.2 resilience reduces damage from DoT ticks as much as the chance to not be critically hit
|
// 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
|
// Reduce dot damage from resilience for players
|
||||||
if (m_target->GetTypeId() == TYPEID_PLAYER)
|
if (m_target->GetTypeId() == TYPEID_PLAYER)
|
||||||
|
|
@ -5908,7 +5911,7 @@ void Aura::PeriodicTick()
|
||||||
|
|
||||||
pCaster->DealDamageMods(m_target, pdamage, &absorb);
|
pCaster->DealDamageMods(m_target, pdamage, &absorb);
|
||||||
|
|
||||||
SpellPeriodicAuraLogInfo pInfo(this, pdamage, 0, absorb, resist, 0.0f);
|
SpellPeriodicAuraLogInfo pInfo(this, pdamage, 0, absorb, resist, 0.0f, isCrit);
|
||||||
m_target->SendPeriodicAuraLog(&pInfo);
|
m_target->SendPeriodicAuraLog(&pInfo);
|
||||||
|
|
||||||
Unit* target = m_target; // aura can be deleted in DealDamage
|
Unit* target = m_target; // aura can be deleted in DealDamage
|
||||||
|
|
@ -6030,10 +6033,13 @@ void Aura::PeriodicTick()
|
||||||
|
|
||||||
pdamage = pCaster->SpellHealingBonus(m_target, GetSpellProto(), pdamage, DOT, GetStackAmount());
|
pdamage = pCaster->SpellHealingBonus(m_target, GetSpellProto(), pdamage, DOT, GetStackAmount());
|
||||||
|
|
||||||
|
// This method can modify pdamage
|
||||||
|
bool isCrit = IsCritFromAbilityAura(pCaster, pdamage);
|
||||||
|
|
||||||
sLog.outDetail("PeriodicTick: %u (TypeId: %u) heal of %u (TypeId: %u) for %u health inflicted by %u",
|
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());
|
GUID_LOPART(GetCasterGUID()), GuidHigh2TypeId(GUID_HIPART(GetCasterGUID())), m_target->GetGUIDLow(), m_target->GetTypeId(), pdamage, GetId());
|
||||||
|
|
||||||
SpellPeriodicAuraLogInfo pInfo(this, pdamage, 0, 0, 0, 0.0f);
|
SpellPeriodicAuraLogInfo pInfo(this, pdamage, 0, 0, 0, 0.0f, isCrit);
|
||||||
m_target->SendPeriodicAuraLog(&pInfo);
|
m_target->SendPeriodicAuraLog(&pInfo);
|
||||||
|
|
||||||
int32 gain = m_target->ModifyHealth(pdamage);
|
int32 gain = m_target->ModifyHealth(pdamage);
|
||||||
|
|
@ -6921,3 +6927,19 @@ void Aura::HandleAuraSafeFall( bool Apply, bool Real )
|
||||||
if(Apply && Real && GetId() == 32474 && m_target->GetTypeId() == TYPEID_PLAYER)
|
if(Apply && Real && GetId() == 32474 && m_target->GetTypeId() == TYPEID_PLAYER)
|
||||||
((Player*)m_target)->ActivateTaxiPathTo(506, GetId());
|
((Player*)m_target)->ActivateTaxiPathTo(506, GetId());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Aura::IsCritFromAbilityAura(Unit* caster, uint32& damage)
|
||||||
|
{
|
||||||
|
Unit::AuraList const& auras = caster->GetAurasByType(SPELL_AURA_ABILITY_PERIODIC_CRIT);
|
||||||
|
for(Unit::AuraList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
|
||||||
|
{
|
||||||
|
if (!(*itr)->isAffectedOnSpell(m_spellProto))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (caster->isSpellCrit(m_target, m_spellProto, GetSpellSchoolMask(m_spellProto)))
|
||||||
|
damage = caster->SpellCriticalDamageBonus(m_spellProto, damage, m_target);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -325,6 +325,8 @@ class MANGOS_DLL_SPEC Aura
|
||||||
protected:
|
protected:
|
||||||
Aura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster = NULL, Item* castItem = NULL);
|
Aura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster = NULL, Item* castItem = NULL);
|
||||||
|
|
||||||
|
bool IsCritFromAbilityAura(Unit* caster, uint32& damage);
|
||||||
|
|
||||||
Modifier m_modifier;
|
Modifier m_modifier;
|
||||||
SpellModifier *m_spellmod;
|
SpellModifier *m_spellmod;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4278,13 +4278,13 @@ void Unit::SendPeriodicAuraLog(SpellPeriodicAuraLogInfo *pInfo)
|
||||||
data << uint32(GetSpellSchoolMask(aura->GetSpellProto()));
|
data << uint32(GetSpellSchoolMask(aura->GetSpellProto()));
|
||||||
data << uint32(pInfo->absorb); // absorb
|
data << uint32(pInfo->absorb); // absorb
|
||||||
data << uint32(pInfo->resist); // resist
|
data << uint32(pInfo->resist); // resist
|
||||||
data << uint8(0); // new 3.1.2
|
data << uint8(pInfo->critical ? 1 : 0); // new 3.1.2 critical flag
|
||||||
break;
|
break;
|
||||||
case SPELL_AURA_PERIODIC_HEAL:
|
case SPELL_AURA_PERIODIC_HEAL:
|
||||||
case SPELL_AURA_OBS_MOD_HEALTH:
|
case SPELL_AURA_OBS_MOD_HEALTH:
|
||||||
data << uint32(pInfo->damage); // damage
|
data << uint32(pInfo->damage); // damage
|
||||||
data << uint32(pInfo->overDamage); // overheal?
|
data << uint32(pInfo->overDamage); // overheal?
|
||||||
data << uint8(0); // new 3.1.2
|
data << uint8(pInfo->critical ? 1 : 0); // new 3.1.2 critical flag
|
||||||
break;
|
break;
|
||||||
case SPELL_AURA_OBS_MOD_MANA:
|
case SPELL_AURA_OBS_MOD_MANA:
|
||||||
case SPELL_AURA_PERIODIC_ENERGIZE:
|
case SPELL_AURA_PERIODIC_ENERGIZE:
|
||||||
|
|
|
||||||
|
|
@ -686,7 +686,7 @@ struct SpellNonMeleeDamage{
|
||||||
|
|
||||||
struct SpellPeriodicAuraLogInfo
|
struct SpellPeriodicAuraLogInfo
|
||||||
{
|
{
|
||||||
SpellPeriodicAuraLogInfo(Aura *_aura, uint32 _damage, uint32 _overDamage, uint32 _absorb, uint32 _resist, float _multiplier)
|
SpellPeriodicAuraLogInfo(Aura *_aura, uint32 _damage, uint32 _overDamage, uint32 _absorb, uint32 _resist, float _multiplier, bool _critical = false)
|
||||||
: aura(_aura), damage(_damage), overDamage(_overDamage), absorb(_absorb), resist(_resist), multiplier(_multiplier) {}
|
: aura(_aura), damage(_damage), overDamage(_overDamage), absorb(_absorb), resist(_resist), multiplier(_multiplier) {}
|
||||||
|
|
||||||
Aura *aura;
|
Aura *aura;
|
||||||
|
|
@ -695,6 +695,7 @@ struct SpellPeriodicAuraLogInfo
|
||||||
uint32 resist;
|
uint32 resist;
|
||||||
uint32 overDamage; // overkill/overheal
|
uint32 overDamage; // overkill/overheal
|
||||||
float multiplier;
|
float multiplier;
|
||||||
|
bool critical;
|
||||||
};
|
};
|
||||||
|
|
||||||
uint32 createProcExtendMask(SpellNonMeleeDamage *damageInfo, SpellMissInfo missCondition);
|
uint32 createProcExtendMask(SpellNonMeleeDamage *damageInfo, SpellMissInfo missCondition);
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "8138"
|
#define REVISION_NR "8139"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue