mirror of
https://github.com/mangosfour/server.git
synced 2025-12-14 07:37:01 +00:00
[6980] Add some fixes to trigger system
Allow proc from every kill Fix (and remove hack) priest 32379 and rank (backfire damage after 1 sec) Remove not need stack overflow protection Signed-off-by: DiSlord <dislord@nomail.com>
This commit is contained in:
parent
12753049d1
commit
a1494d29dc
7 changed files with 28 additions and 36 deletions
|
|
@ -990,21 +990,8 @@ void Spell::DoAllEffectOnTarget(TargetInfo *target)
|
||||||
|
|
||||||
caster->DealSpellDamage(&damageInfo, true);
|
caster->DealSpellDamage(&damageInfo, true);
|
||||||
|
|
||||||
// Shadow Word: Death - deals damage equal to damage done to caster if victim is not killed
|
|
||||||
if (m_spellInfo->SpellFamilyName == SPELLFAMILY_PRIEST && m_spellInfo->SpellFamilyFlags&0x0000000200000000LL &&
|
|
||||||
caster != unitTarget && unitTarget->isAlive())
|
|
||||||
{
|
|
||||||
// Redirect damage to caster if victim Alive
|
|
||||||
damageInfo.target = caster;
|
|
||||||
damageInfo.absorb = 0;
|
|
||||||
damageInfo.resist = 0;
|
|
||||||
damageInfo.blocked = 0;
|
|
||||||
// Send log damage message to client
|
|
||||||
caster->SendSpellNonMeleeDamageLog(&damageInfo);
|
|
||||||
caster->DealSpellDamage(&damageInfo, true);
|
|
||||||
}
|
|
||||||
// Judgement of Blood
|
// Judgement of Blood
|
||||||
else if (m_spellInfo->SpellFamilyName == SPELLFAMILY_PALADIN && m_spellInfo->SpellFamilyFlags & 0x0000000800000000LL && m_spellInfo->SpellIconID==153)
|
if (m_spellInfo->SpellFamilyName == SPELLFAMILY_PALADIN && m_spellInfo->SpellFamilyFlags & 0x0000000800000000LL && m_spellInfo->SpellIconID==153)
|
||||||
{
|
{
|
||||||
int32 damagePoint = damageInfo.damage * 33 / 100;
|
int32 damagePoint = damageInfo.damage * 33 / 100;
|
||||||
m_caster->CastCustomSpell(m_caster, 32220, &damagePoint, NULL, NULL, true);
|
m_caster->CastCustomSpell(m_caster, 32220, &damagePoint, NULL, NULL, true);
|
||||||
|
|
|
||||||
|
|
@ -397,6 +397,13 @@ void Spell::EffectSchoolDMG(uint32 effect_idx)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case SPELLFAMILY_PRIEST:
|
||||||
|
{
|
||||||
|
// Shadow Word: Death - deals damage equal to damage done to caster
|
||||||
|
if (m_spellInfo->SpellFamilyFlags & 0x0000000200000000LL)
|
||||||
|
m_caster->CastCustomSpell(m_caster, 32409, &damage, 0, 0, true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case SPELLFAMILY_DRUID:
|
case SPELLFAMILY_DRUID:
|
||||||
{
|
{
|
||||||
// Ferocious Bite
|
// Ferocious Bite
|
||||||
|
|
|
||||||
|
|
@ -897,7 +897,7 @@ bool SpellMgr::IsSpellProcEventCanTriggeredBy(SpellProcEventEntry const * spellP
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Always trigger for this
|
// Always trigger for this
|
||||||
if (EventProcFlag & (PROC_FLAG_KILLED | PROC_FLAG_KILL_AND_GET_XP))
|
if (EventProcFlag & (PROC_FLAG_KILLED | PROC_FLAG_KILL))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (spellProcEvent) // Exist event data
|
if (spellProcEvent) // Exist event data
|
||||||
|
|
|
||||||
|
|
@ -468,7 +468,7 @@ enum ProcFlags
|
||||||
PROC_FLAG_NONE = 0x00000000,
|
PROC_FLAG_NONE = 0x00000000,
|
||||||
|
|
||||||
PROC_FLAG_KILLED = 0x00000001, // 00 Killed by agressor
|
PROC_FLAG_KILLED = 0x00000001, // 00 Killed by agressor
|
||||||
PROC_FLAG_KILL_AND_GET_XP = 0x00000002, // 01 Kill that yields experience or honor
|
PROC_FLAG_KILL = 0x00000002, // 01 Kill target (in most cases need XP/Honor reward)
|
||||||
|
|
||||||
PROC_FLAG_SUCCESSFUL_MILEE_HIT = 0x00000004, // 02 Successful melee auto attack
|
PROC_FLAG_SUCCESSFUL_MILEE_HIT = 0x00000004, // 02 Successful melee auto attack
|
||||||
PROC_FLAG_TAKEN_MELEE_HIT = 0x00000008, // 03 Taken damage from melee auto attack hit
|
PROC_FLAG_TAKEN_MELEE_HIT = 0x00000008, // 03 Taken damage from melee auto attack hit
|
||||||
|
|
|
||||||
|
|
@ -559,10 +559,8 @@ uint32 Unit::DealDamage(Unit *pVictim, uint32 damage, CleanDamage const* cleanDa
|
||||||
// call kill spell proc event (before real die and combat stop to triggering auras removed at death/combat stop)
|
// call kill spell proc event (before real die and combat stop to triggering auras removed at death/combat stop)
|
||||||
if(player && player!=pVictim)
|
if(player && player!=pVictim)
|
||||||
{
|
{
|
||||||
if(player->RewardPlayerAndGroupAtKill(pVictim))
|
player->RewardPlayerAndGroupAtKill(pVictim);
|
||||||
player->ProcDamageAndSpell(pVictim, PROC_FLAG_KILL_AND_GET_XP, PROC_FLAG_KILLED, PROC_EX_NONE, 0);
|
player->ProcDamageAndSpell(pVictim, PROC_FLAG_KILL, PROC_FLAG_KILLED, PROC_EX_NONE, 0);
|
||||||
else
|
|
||||||
player->ProcDamageAndSpell(pVictim, PROC_FLAG_NONE, PROC_FLAG_KILLED,PROC_EX_NONE, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG_LOG("DealDamageAttackStop");
|
DEBUG_LOG("DealDamageAttackStop");
|
||||||
|
|
@ -9582,6 +9580,7 @@ bool InitTriggerAuraData()
|
||||||
isTriggerAura[i]=false;
|
isTriggerAura[i]=false;
|
||||||
isNonTriggerAura[i] = false;
|
isNonTriggerAura[i] = false;
|
||||||
}
|
}
|
||||||
|
isTriggerAura[SPELL_AURA_PERIODIC_DAMAGE] = true;
|
||||||
isTriggerAura[SPELL_AURA_DUMMY] = true;
|
isTriggerAura[SPELL_AURA_DUMMY] = true;
|
||||||
isTriggerAura[SPELL_AURA_MOD_CONFUSE] = true;
|
isTriggerAura[SPELL_AURA_MOD_CONFUSE] = true;
|
||||||
isTriggerAura[SPELL_AURA_MOD_THREAT] = true;
|
isTriggerAura[SPELL_AURA_MOD_THREAT] = true;
|
||||||
|
|
@ -9655,18 +9654,8 @@ uint32 createProcExtendMask(SpellNonMeleeDamage *damageInfo, SpellMissInfo missC
|
||||||
return procEx;
|
return procEx;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int deep = 0;
|
|
||||||
void Unit::ProcDamageAndSpellFor( bool isVictim, Unit * pTarget, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, SpellEntry const * procSpell, uint32 damage )
|
void Unit::ProcDamageAndSpellFor( bool isVictim, Unit * pTarget, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, SpellEntry const * procSpell, uint32 damage )
|
||||||
{
|
{
|
||||||
deep ++;
|
|
||||||
if (deep > 5)
|
|
||||||
{
|
|
||||||
sLog.outError("Prevent possible stack owerflow in Unit::ProcDamageAndSpellFor");
|
|
||||||
if (procSpell)
|
|
||||||
sLog.outError(" Spell %u", procSpell->Id);
|
|
||||||
deep--;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// For melee/ranged based attack need update skills and set some Aura states
|
// For melee/ranged based attack need update skills and set some Aura states
|
||||||
if (procFlag & MELEE_BASED_TRIGGER_MASK)
|
if (procFlag & MELEE_BASED_TRIGGER_MASK)
|
||||||
{
|
{
|
||||||
|
|
@ -9750,7 +9739,7 @@ void Unit::ProcDamageAndSpellFor( bool isVictim, Unit * pTarget, uint32 procFlag
|
||||||
for(AuraMap::const_iterator itr = GetAuras().begin(); itr!= GetAuras().end(); ++itr)
|
for(AuraMap::const_iterator itr = GetAuras().begin(); itr!= GetAuras().end(); ++itr)
|
||||||
{
|
{
|
||||||
SpellProcEventEntry const* spellProcEvent = NULL;
|
SpellProcEventEntry const* spellProcEvent = NULL;
|
||||||
if(!IsTriggeredAtSpellProcEvent(itr->second, procSpell, procFlag, procExtra, attType, isVictim, (damage > 0), spellProcEvent))
|
if(!IsTriggeredAtSpellProcEvent(pTarget, itr->second, procSpell, procFlag, procExtra, attType, isVictim, (damage > 0), spellProcEvent))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
procTriggered.push_back( ProcTriggeredData(spellProcEvent, itr->second) );
|
procTriggered.push_back( ProcTriggeredData(spellProcEvent, itr->second) );
|
||||||
|
|
@ -9928,7 +9917,6 @@ void Unit::ProcDamageAndSpellFor( bool isVictim, Unit * pTarget, uint32 procFlag
|
||||||
for(RemoveSpellList::const_iterator i = removedSpells.begin(); i != removedSpells.end();i++)
|
for(RemoveSpellList::const_iterator i = removedSpells.begin(); i != removedSpells.end();i++)
|
||||||
RemoveAurasDueToSpell(*i);
|
RemoveAurasDueToSpell(*i);
|
||||||
}
|
}
|
||||||
deep--;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SpellSchoolMask Unit::GetMeleeDamageSchoolMask() const
|
SpellSchoolMask Unit::GetMeleeDamageSchoolMask() const
|
||||||
|
|
@ -10547,7 +10535,7 @@ Pet* Unit::CreateTamedPetFrom(Creature* creatureTarget,uint32 spell_id)
|
||||||
return pet;
|
return pet;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Unit::IsTriggeredAtSpellProcEvent(Aura* aura, SpellEntry const* procSpell, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const*& spellProcEvent )
|
bool Unit::IsTriggeredAtSpellProcEvent(Unit *pVictim, Aura* aura, SpellEntry const* procSpell, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const*& spellProcEvent )
|
||||||
{
|
{
|
||||||
SpellEntry const* spellProto = aura->GetSpellProto ();
|
SpellEntry const* spellProto = aura->GetSpellProto ();
|
||||||
|
|
||||||
|
|
@ -10577,7 +10565,17 @@ bool Unit::IsTriggeredAtSpellProcEvent(Aura* aura, SpellEntry const* procSpell,
|
||||||
if(!SpellMgr::IsSpellProcEventCanTriggeredBy(spellProcEvent, EventProcFlag, procSpell, procFlag, procExtra, active))
|
if(!SpellMgr::IsSpellProcEventCanTriggeredBy(spellProcEvent, EventProcFlag, procSpell, procFlag, procExtra, active))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Aura added by spell can`t trogger from self (prevent drop cahres/do triggers)
|
// In most cases req get honor or XP from kill
|
||||||
|
if (EventProcFlag & PROC_FLAG_KILL && GetTypeId() == TYPEID_PLAYER)
|
||||||
|
{
|
||||||
|
bool allow = ((Player*)this)->isHonorOrXPTarget(pVictim);
|
||||||
|
// Shadow Word: Death - can trigger from every kill
|
||||||
|
if (aura->GetId() == 32409)
|
||||||
|
allow = true;
|
||||||
|
if (!allow)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// Aura added by spell can`t trogger from self (prevent drop charges/do triggers)
|
||||||
// But except periodic triggers (can triggered from self)
|
// But except periodic triggers (can triggered from self)
|
||||||
if(procSpell && procSpell->Id == spellProto->Id && !(spellProto->procFlags&PROC_FLAG_ON_TAKE_PERIODIC))
|
if(procSpell && procSpell->Id == spellProto->Id && !(spellProto->procFlags&PROC_FLAG_ON_TAKE_PERIODIC))
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
|
|
@ -1437,7 +1437,7 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
|
||||||
void SendAttackStop(Unit* victim); // only from AttackStop(Unit*)
|
void SendAttackStop(Unit* victim); // only from AttackStop(Unit*)
|
||||||
void SendAttackStart(Unit* pVictim); // only from Unit::AttackStart(Unit*)
|
void SendAttackStart(Unit* pVictim); // only from Unit::AttackStart(Unit*)
|
||||||
|
|
||||||
bool IsTriggeredAtSpellProcEvent( Aura* aura, SpellEntry const* procSpell, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const*& spellProcEvent );
|
bool IsTriggeredAtSpellProcEvent(Unit *pVictim, Aura* aura, SpellEntry const* procSpell, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const*& spellProcEvent );
|
||||||
bool HandleDummyAuraProc( Unit *pVictim, uint32 damage, Aura* triggredByAura, SpellEntry const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown);
|
bool HandleDummyAuraProc( Unit *pVictim, uint32 damage, Aura* triggredByAura, SpellEntry const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown);
|
||||||
bool HandleHasteAuraProc( Unit *pVictim, uint32 damage, Aura* triggredByAura, SpellEntry const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown);
|
bool HandleHasteAuraProc( Unit *pVictim, uint32 damage, Aura* triggredByAura, SpellEntry const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown);
|
||||||
bool HandleProcTriggerSpell(Unit *pVictim, uint32 damage, Aura* triggredByAura, SpellEntry const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown);
|
bool HandleProcTriggerSpell(Unit *pVictim, uint32 damage, Aura* triggredByAura, SpellEntry const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown);
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "6979"
|
#define REVISION_NR "6980"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue