diff options
| author | ariel- <ariel-@users.noreply.github.com> | 2016-10-17 02:19:29 -0300 | 
|---|---|---|
| committer | ariel- <ariel-@users.noreply.github.com> | 2016-10-17 02:19:29 -0300 | 
| commit | 531904afffa010a07ed866b2ae76d97ef1f935e4 (patch) | |
| tree | aacae570f69ec90612ba608ec8cb8b8f2cc6f983 /src/server | |
| parent | 9b0fa51022fba3d5ece96dd0ac8399be01ea5b0f (diff) | |
Core/SpellMgr: some changes in default proc generation. Fix an issue of stealth breaking with positive and/or healing spells
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/game/Spells/SpellMgr.cpp | 142 | 
1 files changed, 71 insertions, 71 deletions
| diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 3e42b62f9bb..02584542676 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -1412,71 +1412,6 @@ void SpellMgr::LoadSpellGroupStackRules()      TC_LOG_INFO("server.loading", ">> Loaded %u spell group stack rules in %u ms", count, GetMSTimeDiffToNow(oldMSTime));  } -// Used for prepare can/can't triggr aura -static bool InitTriggerAuraData(); -// Define can trigger auras -static bool isTriggerAura[TOTAL_AURAS]; -// Triggered always, even from triggered spells -static bool isAlwaysTriggeredAura[TOTAL_AURAS]; -// Prepare lists -static bool procPrepared = InitTriggerAuraData(); - -// List of auras that CAN be trigger but may not exist in spell_proc_event -// in most case need for drop charges -// in some types of aura need do additional check -// for example SPELL_AURA_MECHANIC_IMMUNITY - need check for mechanic -bool InitTriggerAuraData() -{ -    for (uint16 i = 0; i < TOTAL_AURAS; ++i) -    { -        isTriggerAura[i] = false; -        isAlwaysTriggeredAura[i] = false; -    } -    isTriggerAura[SPELL_AURA_DUMMY] = true;                                 // Most dummy auras should require scripting. Remove? -    isTriggerAura[SPELL_AURA_MOD_CONFUSE] = true;                           // "Any direct damaging attack will revive targets" -    isTriggerAura[SPELL_AURA_MOD_THREAT] = true;                            // Only one spell: 28762 part of Mage T3 8p bonus -    isTriggerAura[SPELL_AURA_MOD_STUN] = true;                              // Aura does not have charges but needs to be removed on trigger -    isTriggerAura[SPELL_AURA_MOD_DAMAGE_DONE] = true; -    isTriggerAura[SPELL_AURA_MOD_DAMAGE_TAKEN] = true; -    isTriggerAura[SPELL_AURA_MOD_RESISTANCE] = true; -    isTriggerAura[SPELL_AURA_MOD_STEALTH] = true; -    isTriggerAura[SPELL_AURA_MOD_FEAR] = true;                              // Aura does not have charges but needs to be removed on trigger -    isTriggerAura[SPELL_AURA_MOD_ROOT] = true; -    isTriggerAura[SPELL_AURA_TRANSFORM] = true; -    isTriggerAura[SPELL_AURA_REFLECT_SPELLS] = true; -    isTriggerAura[SPELL_AURA_DAMAGE_IMMUNITY] = true; -    isTriggerAura[SPELL_AURA_PROC_TRIGGER_SPELL] = true; -    isTriggerAura[SPELL_AURA_PROC_TRIGGER_DAMAGE] = true; -    isTriggerAura[SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK] = true; -    isTriggerAura[SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT] = true; -    isTriggerAura[SPELL_AURA_MOD_POWER_COST_SCHOOL] = true; -    isTriggerAura[SPELL_AURA_REFLECT_SPELLS_SCHOOL] = true; -    isTriggerAura[SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN] = true; -    isTriggerAura[SPELL_AURA_MOD_ATTACK_POWER] = true; -    isTriggerAura[SPELL_AURA_ADD_CASTER_HIT_TRIGGER] = true; -    isTriggerAura[SPELL_AURA_OVERRIDE_CLASS_SCRIPTS] = true; -    isTriggerAura[SPELL_AURA_MOD_MELEE_HASTE] = true; -    isTriggerAura[SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE] = true; -    isTriggerAura[SPELL_AURA_RAID_PROC_FROM_CHARGE] = true; -    isTriggerAura[SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE] = true; -    isTriggerAura[SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE] = true; -    isTriggerAura[SPELL_AURA_MOD_SPELL_CRIT_CHANCE] = true; -    isTriggerAura[SPELL_AURA_ADD_FLAT_MODIFIER] = true; -    isTriggerAura[SPELL_AURA_ADD_PCT_MODIFIER] = true; -    isTriggerAura[SPELL_AURA_ABILITY_IGNORE_AURASTATE] = 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; -} -  void SpellMgr::LoadSpellProcs()  {      uint32 oldMSTime = getMSTime(); @@ -1605,6 +1540,71 @@ void SpellMgr::LoadSpellProcs()      TC_LOG_INFO("server.loading", ">> Loaded %u spell proc conditions and data in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); +    // Define can trigger auras +    bool isTriggerAura[TOTAL_AURAS]; +    // Triggered always, even from triggered spells +    bool isAlwaysTriggeredAura[TOTAL_AURAS]; +    // SpellTypeMask to add to the proc +    uint32 spellTypeMask[TOTAL_AURAS]; + +    // List of auras that CAN trigger but may not exist in spell_proc +    // in most cases needed to drop charges + +    // some aura types need additional checks (eg SPELL_AURA_MECHANIC_IMMUNITY needs mechanic check) +    // see AuraEffect::CheckEffectProc +    for (uint16 i = 0; i < TOTAL_AURAS; ++i) +    { +        isTriggerAura[i] = false; +        isAlwaysTriggeredAura[i] = false; +        spellTypeMask[i] = PROC_SPELL_TYPE_MASK_ALL; +    } + +    isTriggerAura[SPELL_AURA_DUMMY] = true;                                 // Most dummy auras should require scripting, but there are some exceptions (ie 12311) +    isTriggerAura[SPELL_AURA_MOD_CONFUSE] = true;                           // "Any direct damaging attack will revive targets" +    isTriggerAura[SPELL_AURA_MOD_THREAT] = true;                            // Only one spell: 28762 part of Mage T3 8p bonus +    isTriggerAura[SPELL_AURA_MOD_STUN] = true;                              // Aura does not have charges but needs to be removed on trigger +    isTriggerAura[SPELL_AURA_MOD_DAMAGE_DONE] = true; +    isTriggerAura[SPELL_AURA_MOD_DAMAGE_TAKEN] = true; +    isTriggerAura[SPELL_AURA_MOD_RESISTANCE] = true; +    isTriggerAura[SPELL_AURA_MOD_STEALTH] = true; +    isTriggerAura[SPELL_AURA_MOD_FEAR] = true;                              // Aura does not have charges but needs to be removed on trigger +    isTriggerAura[SPELL_AURA_MOD_ROOT] = true; +    isTriggerAura[SPELL_AURA_TRANSFORM] = true; +    isTriggerAura[SPELL_AURA_REFLECT_SPELLS] = true; +    isTriggerAura[SPELL_AURA_DAMAGE_IMMUNITY] = true; +    isTriggerAura[SPELL_AURA_PROC_TRIGGER_SPELL] = true; +    isTriggerAura[SPELL_AURA_PROC_TRIGGER_DAMAGE] = true; +    isTriggerAura[SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK] = true; +    isTriggerAura[SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT] = true; +    isTriggerAura[SPELL_AURA_MOD_POWER_COST_SCHOOL] = true; +    isTriggerAura[SPELL_AURA_REFLECT_SPELLS_SCHOOL] = true; +    isTriggerAura[SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN] = true; +    isTriggerAura[SPELL_AURA_MOD_ATTACK_POWER] = true; +    isTriggerAura[SPELL_AURA_ADD_CASTER_HIT_TRIGGER] = true; +    isTriggerAura[SPELL_AURA_OVERRIDE_CLASS_SCRIPTS] = true; +    isTriggerAura[SPELL_AURA_MOD_MELEE_HASTE] = true; +    isTriggerAura[SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE] = true; +    isTriggerAura[SPELL_AURA_RAID_PROC_FROM_CHARGE] = true; +    isTriggerAura[SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE] = true; +    isTriggerAura[SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE] = true; +    isTriggerAura[SPELL_AURA_MOD_SPELL_CRIT_CHANCE] = true; +    isTriggerAura[SPELL_AURA_ADD_FLAT_MODIFIER] = true; +    isTriggerAura[SPELL_AURA_ADD_PCT_MODIFIER] = true; +    isTriggerAura[SPELL_AURA_ABILITY_IGNORE_AURASTATE] = 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; + +    spellTypeMask[SPELL_AURA_MOD_STEALTH] = PROC_SPELL_TYPE_DAMAGE | PROC_SPELL_TYPE_NO_DMG_HEAL; +    spellTypeMask[SPELL_AURA_MOD_CONFUSE] = PROC_SPELL_TYPE_DAMAGE; +    spellTypeMask[SPELL_AURA_MOD_FEAR] = PROC_SPELL_TYPE_DAMAGE; +    spellTypeMask[SPELL_AURA_MOD_ROOT] = PROC_SPELL_TYPE_DAMAGE; +    spellTypeMask[SPELL_AURA_MOD_STUN] = PROC_SPELL_TYPE_DAMAGE; +    spellTypeMask[SPELL_AURA_TRANSFORM] = PROC_SPELL_TYPE_DAMAGE; +      // This generates default procs to retain compatibility with previous proc system      TC_LOG_INFO("server.loading", "Generating spell proc data from SpellMap...");      count = 0; @@ -1618,7 +1618,8 @@ void SpellMgr::LoadSpellProcs()          if (mSpellProcMap.find(spellInfo->Id) != mSpellProcMap.end())              continue; -        bool found = false, addTriggerFlag = false; +        bool addTriggerFlag = false; +        uint32 procSpellTypeMask = PROC_SPELL_TYPE_NONE;          for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)          {              if (!spellInfo->Effects[i].IsEffect()) @@ -1631,14 +1632,13 @@ void SpellMgr::LoadSpellProcs()              if (!isTriggerAura[auraName])                  continue; -            found = true; - -            if (!addTriggerFlag && isAlwaysTriggeredAura[auraName]) +            procSpellTypeMask |= spellTypeMask[auraName]; +            if (isAlwaysTriggeredAura[auraName])                  addTriggerFlag = true;              break;          } -        if (!found) +        if (!procSpellTypeMask)              continue;          if (!spellInfo->ProcFlags) @@ -1655,7 +1655,7 @@ void SpellMgr::LoadSpellProcs()          if (procEntry.SpellFamilyMask)              procEntry.SpellFamilyName = spellInfo->SpellFamilyName; -        procEntry.SpellTypeMask   = PROC_SPELL_TYPE_MASK_ALL; +        procEntry.SpellTypeMask   = procSpellTypeMask;          procEntry.SpellPhaseMask  = PROC_SPELL_PHASE_HIT;          procEntry.HitMask         = PROC_HIT_NONE; // uses default proc @see SpellMgr::CanSpellTriggerProcOnEvent | 
