aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorthenecromancer <none@none>2010-07-21 00:55:27 +0200
committerthenecromancer <none@none>2010-07-21 00:55:27 +0200
commitafa27d1dbfe2801df5e209f9ca2f5c581ef67a9f (patch)
treea0b889e03e5ff4e04b173a831d8f091c2267af66
parentc0f9ef60593723b4fc0aeea4dc7000d9b5de45a2 (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.cpp27
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)