From afa27d1dbfe2801df5e209f9ca2f5c581ef67a9f Mon Sep 17 00:00:00 2001 From: thenecromancer Date: Wed, 21 Jul 2010 00:55:27 +0200 Subject: 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 --- src/server/game/Entities/Unit/Unit.cpp | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) (limited to 'src') 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<GetAuraType()]) + triggerData.effMask |= 1<