aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Spells/SpellInfo.cpp13
-rw-r--r--src/server/game/Spells/SpellInfo.h11
-rw-r--r--src/server/game/Spells/SpellMgr.cpp12
3 files changed, 10 insertions, 26 deletions
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp
index cadfeef49c3..fe9d12f8248 100644
--- a/src/server/game/Spells/SpellInfo.cpp
+++ b/src/server/game/Spells/SpellInfo.cpp
@@ -1567,21 +1567,12 @@ bool SpellInfo::CanBeUsedInCombat() const
bool SpellInfo::IsPositive() const
{
- return !HasAttribute(SPELL_ATTR0_CU_NEGATIVE);
+ return NegativeEffects.none();
}
bool SpellInfo::IsPositiveEffect(uint8 effIndex) const
{
- switch (effIndex)
- {
- default:
- case 0:
- return !HasAttribute(SPELL_ATTR0_CU_NEGATIVE_EFF0);
- case 1:
- return !HasAttribute(SPELL_ATTR0_CU_NEGATIVE_EFF1);
- case 2:
- return !HasAttribute(SPELL_ATTR0_CU_NEGATIVE_EFF2);
- }
+ return !NegativeEffects.test(effIndex);
}
bool SpellInfo::IsChanneled() const
diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h
index 8c92fd6c9c1..2f43618bf20 100644
--- a/src/server/game/Spells/SpellInfo.h
+++ b/src/server/game/Spells/SpellInfo.h
@@ -23,8 +23,8 @@
#include "Util.h"
#include "Object.h"
#include "SpellAuraDefines.h"
-
#include <boost/container/flat_set.hpp>
+#include <bitset>
class Unit;
class Player;
@@ -193,9 +193,9 @@ enum SpellCustomAttributes
SPELL_ATTR0_CU_DIRECT_DAMAGE = 0x00000100,
SPELL_ATTR0_CU_CHARGE = 0x00000200,
SPELL_ATTR0_CU_PICKPOCKET = 0x00000400,
- SPELL_ATTR0_CU_NEGATIVE_EFF0 = 0x00001000,
- SPELL_ATTR0_CU_NEGATIVE_EFF1 = 0x00002000,
- SPELL_ATTR0_CU_NEGATIVE_EFF2 = 0x00004000,
+ SPELL_ATTR0_CU_DEPRECATED_NEGATIVE_EFF0 = 0x00001000, // DO NOT REUSE
+ SPELL_ATTR0_CU_DEPRECATED_NEGATIVE_EFF1 = 0x00002000, // DO NOT REUSE
+ SPELL_ATTR0_CU_DEPRECATED_NEGATIVE_EFF2 = 0x00004000, // DO NOT REUSE
SPELL_ATTR0_CU_IGNORE_ARMOR = 0x00008000,
SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER = 0x00010000,
SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET = 0x00020000,
@@ -205,8 +205,6 @@ enum SpellCustomAttributes
SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC = 0x00200000,
SPELL_ATTR0_CU_LIQUID_AURA = 0x00400000,
SPELL_ATTR0_CU_IS_TALENT = 0x00800000,
-
- SPELL_ATTR0_CU_NEGATIVE = SPELL_ATTR0_CU_NEGATIVE_EFF0 | SPELL_ATTR0_CU_NEGATIVE_EFF1 | SPELL_ATTR0_CU_NEGATIVE_EFF2
};
enum SpellInterruptFlags : uint32
@@ -459,6 +457,7 @@ class TC_GAME_API SpellInfo
uint32 AttributesEx12;
uint32 AttributesEx13;
uint32 AttributesCu;
+ std::bitset<MAX_SPELL_EFFECTS> NegativeEffects;
uint64 Stances;
uint64 StancesNot;
uint32 Targets;
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index d0f0096d4f8..635c08761a8 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -2735,6 +2735,9 @@ void SpellMgr::LoadSpellInfoCustomAttributes()
break;
}
}
+
+ if (!spellInfoMutable->_IsPositiveEffect(effect->EffectIndex, false))
+ spellInfoMutable->NegativeEffects[effect->EffectIndex] = true;
}
// spells ignoring hit result should not be binary
@@ -2820,15 +2823,6 @@ void SpellMgr::LoadSpellInfoCustomAttributes()
spellInfoMutable->AttributesCu |= SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC;
}
- if (!spellInfoMutable->_IsPositiveEffect(EFFECT_0, false))
- spellInfoMutable->AttributesCu |= SPELL_ATTR0_CU_NEGATIVE_EFF0;
-
- if (!spellInfoMutable->_IsPositiveEffect(EFFECT_1, false))
- spellInfoMutable->AttributesCu |= SPELL_ATTR0_CU_NEGATIVE_EFF1;
-
- if (!spellInfoMutable->_IsPositiveEffect(EFFECT_2, false))
- spellInfoMutable->AttributesCu |= SPELL_ATTR0_CU_NEGATIVE_EFF2;
-
if (talentSpells.count(spellInfoMutable->Id))
spellInfoMutable->AttributesCu |= SPELL_ATTR0_CU_IS_TALENT;