diff options
author | thenecromancer <none@none> | 2010-07-21 00:55:27 +0200 |
---|---|---|
committer | thenecromancer <none@none> | 2010-07-21 00:55:27 +0200 |
commit | afa27d1dbfe2801df5e209f9ca2f5c581ef67a9f (patch) | |
tree | a0b889e03e5ff4e04b173a831d8f091c2267af66 | |
parent | c0f9ef60593723b4fc0aeea4dc7000d9b5de45a2 (diff) |
Some fixes to proc events
* Always pass up some aura types, regardless of triggered state ( this might be CC effects touched by triggered spells )
* Allow defensive procs on Full block
* Allow defensive procs to trigger from states with PROC_EX_INTERNAL_REQ_FAMILY ( I don't remmember what that one fixes :))
--HG--
branch : trunk
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index b127592f8ef..0b75bc529f2 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -88,6 +88,8 @@ static bool InitTriggerAuraData(); static bool isTriggerAura[TOTAL_AURAS]; // Define can`t trigger auras (need for disable second trigger) static bool isNonTriggerAura[TOTAL_AURAS]; +// Triggered always, even from triggered spells +static bool isAlwaysTriggeredAura[TOTAL_AURAS]; // Prepare lists static bool procPrepared = InitTriggerAuraData(); @@ -13643,6 +13645,7 @@ bool InitTriggerAuraData() { isTriggerAura[i]=false; isNonTriggerAura[i] = false; + isAlwaysTriggeredAura[i] = false; } isTriggerAura[SPELL_AURA_DUMMY] = true; isTriggerAura[SPELL_AURA_MOD_CONFUSE] = true; @@ -13683,6 +13686,15 @@ bool InitTriggerAuraData() isNonTriggerAura[SPELL_AURA_MOD_POWER_REGEN]=true; isNonTriggerAura[SPELL_AURA_REDUCE_PUSHBACK]=true; + isAlwaysTriggeredAura[SPELL_AURA_OVERRIDE_CLASS_SCRIPTS] = true; + isAlwaysTriggeredAura[SPELL_AURA_MOD_FEAR] = true; + isAlwaysTriggeredAura[SPELL_AURA_MOD_ROOT] = true; + isAlwaysTriggeredAura[SPELL_AURA_MOD_STUN] = true; + isAlwaysTriggeredAura[SPELL_AURA_TRANSFORM] = true; + isAlwaysTriggeredAura[SPELL_AURA_SPELL_MAGNET] = true; + isAlwaysTriggeredAura[SPELL_AURA_SCHOOL_ABSORB] = true; + isAlwaysTriggeredAura[SPELL_AURA_MOD_STEALTH] = true; + return true; } @@ -13804,10 +13816,17 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit * pTarget, uint32 procFlag, continue; ProcTriggeredData triggerData(itr->second->GetBase()); // Defensive procs are active on absorbs (so absorption effects are not a hindrance) - bool active = (damage > 0) || ((procExtra & PROC_EX_ABSORB) && isVictim); - if (!IsTriggeredAtSpellProcEvent(pTarget, triggerData.aura, procSpell, procFlag, procExtra, attType, isVictim, active, triggerData.spellProcEvent)) + bool active = (damage > 0) || (procExtra & (PROC_EX_ABSORB|PROC_EX_BLOCK) && isVictim); + if (isVictim) + procExtra &= ~PROC_EX_INTERNAL_REQ_FAMILY; + SpellEntry const* spellProto = itr->second->GetBase()->GetSpellProto(); + if(!IsTriggeredAtSpellProcEvent(pTarget, triggerData.aura, procSpell, procFlag, procExtra, attType, isVictim, (damage != NULL), triggerData.spellProcEvent)) continue; + // Triggered spells not triggering additional spells + bool triggered= !(spellProto->AttributesEx3 & SPELL_ATTR_EX3_CAN_PROC_TRIGGERED) ? + (procExtra & PROC_EX_INTERNAL_TRIGGERED && !(procFlag & PROC_FLAG_ON_TRAP_ACTIVATION)) : false; + for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) { if (itr->second->HasEffect(i)) @@ -13828,7 +13847,9 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit * pTarget, uint32 procFlag, IsPositiveSpell(triggered_spell_id); if (!damage && (procExtra & PROC_EX_ABSORB) && isVictim && positive) continue; - triggerData.effMask |= 1<<i; + // Some spells must always trigger + if (!triggered || isAlwaysTriggeredAura[aurEff->GetAuraType()]) + triggerData.effMask |= 1<<i; } } if (triggerData.effMask) |