From 8b9cec620d005db264baca9abb68c49167bdfabb Mon Sep 17 00:00:00 2001 From: Kitzunu <24550914+Kitzunu@users.noreply.github.com> Date: Sun, 16 Aug 2020 13:25:26 +0200 Subject: [PATCH] refactor(Core/SpellInfo): Positive/Negative spells from SpellFamilyName into DB (#3149) * Implement SPELL_ATTR0_CU_POSITIVE_EFF0 * Implement SPELL_ATTR0_CU_POSITIVE_EFF1 * Implement SPELL_ATTR0_CU_POSITIVE_EFF2 * Move SpellFamilyName spells into DB to define if they are POSITIVE or NEGATIVE spells * Rename column from entry to spell_id to make more sense --- .../rev_1592753632765913300.sql | 91 ++++++++++++++++++ src/server/game/Spells/SpellInfo.cpp | 93 +------------------ src/server/game/Spells/SpellInfo.h | 4 + src/server/game/Spells/SpellMgr.cpp | 22 ++++- 4 files changed, 117 insertions(+), 93 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1592753632765913300.sql diff --git a/data/sql/updates/pending_db_world/rev_1592753632765913300.sql b/data/sql/updates/pending_db_world/rev_1592753632765913300.sql new file mode 100644 index 000000000..dfb936c2f --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1592753632765913300.sql @@ -0,0 +1,91 @@ +INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1592753632765913300'); + +ALTER TABLE `spell_custom_attr` + CHANGE `entry` `spell_id` MEDIUMINT UNSIGNED NOT NULL DEFAULT '0' COMMENT 'spell id', + CHANGE `attributes` `attributes` INT UNSIGNED NOT NULL DEFAULT '0' COMMENT 'SpellCustomAttributes'; + +SET @SPELL_ATTR0_CU_NEGATIVE_EFF0 = 4096, + @SPELL_ATTR0_CU_NEGATIVE_EFF1 = 8192, + @SPELL_ATTR0_CU_NEGATIVE_EFF2 = 16384, + @SPELL_ATTR0_CU_POSITIVE_EFF0 = 33554432, + @SPELL_ATTR0_CU_POSITIVE_EFF1 = 67108864, + @SPELL_ATTR0_CU_POSITIVE_EFF2 = 134217728; + +DELETE FROM `spell_custom_attr` WHERE `spell_id` IN (50344, 71204, 72410, 64412, 24732, 40268, 42396, 8455, 47585, 64904, 604, 8450, 64844, 8451, 1008, 10173, 10174, 10169, 33944, 41478, 11103, 43015, 10170, 12357, 26044, 12358, 26143, 28310, 29407, 29570, 32417, 35507, 37276, 37330, 37621, 38243, 40842, 48396, 43512, 57941, 58381, 59367, 59974, 60472, 17165, 23953, 22919, 5171, 6774, 34074, 1725, 35202, 32645, 32684, 3411, 57993, 57992, 30708, 30877, 61716, 61734, 62344, 61819, 61834, 72998, 61988, 61987, 58867, 54836, 34709, 34700, 11196, 29214, 25771); +INSERT INTO `spell_custom_attr` (`spell_id`, `attributes`) VALUES +-- Positive +(50344, @SPELL_ATTR0_CU_POSITIVE_EFF0 | @SPELL_ATTR0_CU_POSITIVE_EFF1 | @SPELL_ATTR0_CU_POSITIVE_EFF2), +(40268, @SPELL_ATTR0_CU_POSITIVE_EFF0 | @SPELL_ATTR0_CU_POSITIVE_EFF1 | @SPELL_ATTR0_CU_POSITIVE_EFF2), +(64412, @SPELL_ATTR0_CU_POSITIVE_EFF0 | @SPELL_ATTR0_CU_POSITIVE_EFF1), +(24732, @SPELL_ATTR0_CU_POSITIVE_EFF0 | @SPELL_ATTR0_CU_POSITIVE_EFF1 | @SPELL_ATTR0_CU_POSITIVE_EFF2), +(1725, @SPELL_ATTR0_CU_POSITIVE_EFF0), +(3411, @SPELL_ATTR0_CU_POSITIVE_EFF0 | @SPELL_ATTR0_CU_POSITIVE_EFF1), +(30877, @SPELL_ATTR0_CU_POSITIVE_EFF0), +(61716, @SPELL_ATTR0_CU_POSITIVE_EFF0 | @SPELL_ATTR0_CU_POSITIVE_EFF1 | @SPELL_ATTR0_CU_POSITIVE_EFF2), +(61734, @SPELL_ATTR0_CU_POSITIVE_EFF0 | @SPELL_ATTR0_CU_POSITIVE_EFF1 | @SPELL_ATTR0_CU_POSITIVE_EFF2), +(62344, @SPELL_ATTR0_CU_POSITIVE_EFF0 | @SPELL_ATTR0_CU_POSITIVE_EFF1 | @SPELL_ATTR0_CU_POSITIVE_EFF2), +(61819, @SPELL_ATTR0_CU_POSITIVE_EFF0 | @SPELL_ATTR0_CU_POSITIVE_EFF1 | @SPELL_ATTR0_CU_POSITIVE_EFF2), +(61834, @SPELL_ATTR0_CU_POSITIVE_EFF0 | @SPELL_ATTR0_CU_POSITIVE_EFF1 | @SPELL_ATTR0_CU_POSITIVE_EFF2), +(32645, @SPELL_ATTR0_CU_POSITIVE_EFF0 | @SPELL_ATTR0_CU_POSITIVE_EFF1 | @SPELL_ATTR0_CU_POSITIVE_EFF2), +(32684, @SPELL_ATTR0_CU_POSITIVE_EFF0 | @SPELL_ATTR0_CU_POSITIVE_EFF1 | @SPELL_ATTR0_CU_POSITIVE_EFF2), +(57992, @SPELL_ATTR0_CU_POSITIVE_EFF0 | @SPELL_ATTR0_CU_POSITIVE_EFF1 | @SPELL_ATTR0_CU_POSITIVE_EFF2), +(57993, @SPELL_ATTR0_CU_POSITIVE_EFF0 | @SPELL_ATTR0_CU_POSITIVE_EFF1 | @SPELL_ATTR0_CU_POSITIVE_EFF2), +(34074, @SPELL_ATTR0_CU_POSITIVE_EFF0 | @SPELL_ATTR0_CU_POSITIVE_EFF1 | @SPELL_ATTR0_CU_POSITIVE_EFF2), +(64844, @SPELL_ATTR0_CU_POSITIVE_EFF0 | @SPELL_ATTR0_CU_POSITIVE_EFF1), +(64904, @SPELL_ATTR0_CU_POSITIVE_EFF1 | @SPELL_ATTR0_CU_POSITIVE_EFF2), +(47585, @SPELL_ATTR0_CU_POSITIVE_EFF0 | @SPELL_ATTR0_CU_POSITIVE_EFF2), +(5171, @SPELL_ATTR0_CU_POSITIVE_EFF0 | @SPELL_ATTR0_CU_POSITIVE_EFF1), +(6774, @SPELL_ATTR0_CU_POSITIVE_EFF0 | @SPELL_ATTR0_CU_POSITIVE_EFF1), +(11103, @SPELL_ATTR0_CU_POSITIVE_EFF0), +(12357, @SPELL_ATTR0_CU_POSITIVE_EFF0), +(12358, @SPELL_ATTR0_CU_POSITIVE_EFF0), +(1008, @SPELL_ATTR0_CU_POSITIVE_EFF0 | @SPELL_ATTR0_CU_POSITIVE_EFF1), +(8455, @SPELL_ATTR0_CU_POSITIVE_EFF0 | @SPELL_ATTR0_CU_POSITIVE_EFF1), +(10169, @SPELL_ATTR0_CU_POSITIVE_EFF0 | @SPELL_ATTR0_CU_POSITIVE_EFF1), +(10170, @SPELL_ATTR0_CU_POSITIVE_EFF0 | @SPELL_ATTR0_CU_POSITIVE_EFF1), +(604, @SPELL_ATTR0_CU_POSITIVE_EFF0 | @SPELL_ATTR0_CU_POSITIVE_EFF1), +(8450, @SPELL_ATTR0_CU_POSITIVE_EFF0 | @SPELL_ATTR0_CU_POSITIVE_EFF1), +(8451, @SPELL_ATTR0_CU_POSITIVE_EFF0 | @SPELL_ATTR0_CU_POSITIVE_EFF1), +(10173, @SPELL_ATTR0_CU_POSITIVE_EFF0 | @SPELL_ATTR0_CU_POSITIVE_EFF1), +(10174, @SPELL_ATTR0_CU_POSITIVE_EFF0 | @SPELL_ATTR0_CU_POSITIVE_EFF1), +(33944, @SPELL_ATTR0_CU_POSITIVE_EFF0 | @SPELL_ATTR0_CU_POSITIVE_EFF1), +(41478, @SPELL_ATTR0_CU_POSITIVE_EFF0 | @SPELL_ATTR0_CU_POSITIVE_EFF1), +(43015, @SPELL_ATTR0_CU_POSITIVE_EFF0 | @SPELL_ATTR0_CU_POSITIVE_EFF1), + +-- Negative +(25771, @SPELL_ATTR0_CU_NEGATIVE_EFF0), +(30708, @SPELL_ATTR0_CU_NEGATIVE_EFF0), +(35202, @SPELL_ATTR0_CU_NEGATIVE_EFF0), +(72998, @SPELL_ATTR0_CU_NEGATIVE_EFF0), +(61988, @SPELL_ATTR0_CU_NEGATIVE_EFF0), +(61987, @SPELL_ATTR0_CU_NEGATIVE_EFF0), +(71204, @SPELL_ATTR0_CU_NEGATIVE_EFF0), +(58867, @SPELL_ATTR0_CU_NEGATIVE_EFF0 | @SPELL_ATTR0_CU_NEGATIVE_EFF1), +(54836, @SPELL_ATTR0_CU_NEGATIVE_EFF0 | @SPELL_ATTR0_CU_NEGATIVE_EFF1), +(72410, @SPELL_ATTR0_CU_NEGATIVE_EFF0), +(34709, @SPELL_ATTR0_CU_NEGATIVE_EFF0 | @SPELL_ATTR0_CU_NEGATIVE_EFF1 | @SPELL_ATTR0_CU_NEGATIVE_EFF2), +(34700, @SPELL_ATTR0_CU_NEGATIVE_EFF0 | @SPELL_ATTR0_CU_NEGATIVE_EFF1 | @SPELL_ATTR0_CU_NEGATIVE_EFF2), +(11196, @SPELL_ATTR0_CU_NEGATIVE_EFF0), +(29214, @SPELL_ATTR0_CU_NEGATIVE_EFF0 | @SPELL_ATTR0_CU_NEGATIVE_EFF1), +(17165, @SPELL_ATTR0_CU_NEGATIVE_EFF0 | @SPELL_ATTR0_CU_NEGATIVE_EFF1), +(22919, @SPELL_ATTR0_CU_NEGATIVE_EFF0 | @SPELL_ATTR0_CU_NEGATIVE_EFF1), +(23953, @SPELL_ATTR0_CU_NEGATIVE_EFF0 | @SPELL_ATTR0_CU_NEGATIVE_EFF1), +(26044, @SPELL_ATTR0_CU_NEGATIVE_EFF0 | @SPELL_ATTR0_CU_NEGATIVE_EFF1 | @SPELL_ATTR0_CU_NEGATIVE_EFF2), +(26143, @SPELL_ATTR0_CU_NEGATIVE_EFF0 | @SPELL_ATTR0_CU_NEGATIVE_EFF1), +(28310, @SPELL_ATTR0_CU_NEGATIVE_EFF0 | @SPELL_ATTR0_CU_NEGATIVE_EFF1), +(29407, @SPELL_ATTR0_CU_NEGATIVE_EFF0 | @SPELL_ATTR0_CU_NEGATIVE_EFF1), +(29570, @SPELL_ATTR0_CU_NEGATIVE_EFF0 | @SPELL_ATTR0_CU_NEGATIVE_EFF1), +(32417, @SPELL_ATTR0_CU_NEGATIVE_EFF0 | @SPELL_ATTR0_CU_NEGATIVE_EFF1), +(35507, @SPELL_ATTR0_CU_NEGATIVE_EFF0 | @SPELL_ATTR0_CU_NEGATIVE_EFF1), +(37276, @SPELL_ATTR0_CU_NEGATIVE_EFF0 | @SPELL_ATTR0_CU_NEGATIVE_EFF1), +(37330, @SPELL_ATTR0_CU_NEGATIVE_EFF0 | @SPELL_ATTR0_CU_NEGATIVE_EFF1), +(37621, @SPELL_ATTR0_CU_NEGATIVE_EFF0 | @SPELL_ATTR0_CU_NEGATIVE_EFF1), +(38243, @SPELL_ATTR0_CU_NEGATIVE_EFF0 | @SPELL_ATTR0_CU_NEGATIVE_EFF1), +(40842, @SPELL_ATTR0_CU_NEGATIVE_EFF0 | @SPELL_ATTR0_CU_NEGATIVE_EFF1), +(42396, @SPELL_ATTR0_CU_NEGATIVE_EFF0 | @SPELL_ATTR0_CU_NEGATIVE_EFF1), +(43512, @SPELL_ATTR0_CU_NEGATIVE_EFF0 | @SPELL_ATTR0_CU_NEGATIVE_EFF1), +(57941, @SPELL_ATTR0_CU_NEGATIVE_EFF0 | @SPELL_ATTR0_CU_NEGATIVE_EFF1), +(58381, @SPELL_ATTR0_CU_NEGATIVE_EFF0), +(59367, @SPELL_ATTR0_CU_NEGATIVE_EFF0 | @SPELL_ATTR0_CU_NEGATIVE_EFF1), +(59974, @SPELL_ATTR0_CU_NEGATIVE_EFF0 | @SPELL_ATTR0_CU_NEGATIVE_EFF1), +(60472, @SPELL_ATTR0_CU_NEGATIVE_EFF0 | @SPELL_ATTR0_CU_NEGATIVE_EFF1); diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 671f6af1c..4c31871fc 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -1210,7 +1210,7 @@ bool SpellInfo::CanBeUsedInCombat() const bool SpellInfo::IsPositive() const { - return !(AttributesCu & SPELL_ATTR0_CU_NEGATIVE); + return !(AttributesCu & SPELL_ATTR0_CU_NEGATIVE) || (AttributesCu & SPELL_ATTR0_CU_POSITIVE); } bool SpellInfo::IsPositiveEffect(uint8 effIndex) const @@ -1219,11 +1219,11 @@ bool SpellInfo::IsPositiveEffect(uint8 effIndex) const { default: case 0: - return !(AttributesCu & SPELL_ATTR0_CU_NEGATIVE_EFF0); + return !(AttributesCu & SPELL_ATTR0_CU_NEGATIVE_EFF0) || (AttributesCu & SPELL_ATTR0_CU_POSITIVE_EFF0); case 1: - return !(AttributesCu & SPELL_ATTR0_CU_NEGATIVE_EFF1); + return !(AttributesCu & SPELL_ATTR0_CU_NEGATIVE_EFF1) || (AttributesCu & SPELL_ATTR0_CU_POSITIVE_EFF1); case 2: - return !(AttributesCu & SPELL_ATTR0_CU_NEGATIVE_EFF2); + return !(AttributesCu & SPELL_ATTR0_CU_NEGATIVE_EFF2) || (AttributesCu & SPELL_ATTR0_CU_POSITIVE_EFF2); } } @@ -2548,91 +2548,6 @@ bool SpellInfo::_IsPositiveEffect(uint8 effIndex, bool deep) const if (Attributes & SPELL_ATTR0_NEGATIVE_1) return false; - switch (SpellFamilyName) - { - case SPELLFAMILY_GENERIC: - switch (Id) - { - case 11196: // Recently bandaged - case 29214: // Wrath of the Plaguebringer - case 34700: // Allergic Reaction - case 34709: // Shadow Sight (arena stealth detection) - case 54836: // Wrath of the Plaguebringer - case 58867: // Shaman's Spirit Wolf leap - case 61987: // Avenging Wrath Marker - case 61988: // Divine Shield exclude aura - case 72998: // Shadow Prison (Blood Prince Council, ICC Encounter) - return false; - case 30877: // Tag Murloc - case 61716: // Rabbit Costume - case 61734: // Noblegarden Bunny - case 62344: // Fists of Stone - case 61819: // Manabonked! (item) - case 61834: // Manabonked! (minigob) - case 19451: // Enrage (Magmadar) - return true; - default: - break; - } - break; - case SPELLFAMILY_MAGE: - // Amplify Magic, Dampen Magic - if (SpellFamilyFlags[0] == 0x00002000) - return true; - if (SpellIconID == 242) - return true; - // Ignite - if (SpellIconID == 45) - return true; - break; - case SPELLFAMILY_PRIEST: - switch (Id) - { - case 64844: // Divine Hymn - case 64904: // Hymn of Hope - case 47585: // Dispersion - return true; - default: - break; - } - // Mind Flay - if (SpellFamilyFlags[0] & 0x800000) - return false; - break; - case SPELLFAMILY_HUNTER: - // Aspect of the Viper - if (Id == 34074) - return true; - break; - case SPELLFAMILY_ROGUE: - // Envenom - if (SpellIconID == 2237) - return true; - // Slice and Dice - else if (SpellFamilyFlags[0] & 0x40000) - return true; - // Distract - else if (Id == 1725) - return true; - break; - case SPELLFAMILY_SHAMAN: - if (Id == 30708) - return false; - break; - case SPELLFAMILY_PALADIN: - // Forberance - if (Id == 25771) - return false; - break; - case SPELLFAMILY_WARRIOR: - // Intervene, Warrior, considered negative due to triggered spell with threat - if (Id == 3411) - return true; - break; - default: - break; - } - switch (Mechanic) { case MECHANIC_IMMUNE_SHIELD: diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h index dd90ba5ec..e0afefd46 100644 --- a/src/server/game/Spells/SpellInfo.h +++ b/src/server/game/Spells/SpellInfo.h @@ -186,8 +186,12 @@ enum SpellCustomAttributes SPELL_ATTR0_CU_SINGLE_AURA_STACK = 0x00400000, // pussywizard SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC = 0x00800000, SPELL_ATTR0_CU_ENCOUNTER_REWARD = 0x01000000, // pussywizard + SPELL_ATTR0_CU_POSITIVE_EFF0 = 0x02000000, + SPELL_ATTR0_CU_POSITIVE_EFF1 = 0x04000000, + SPELL_ATTR0_CU_POSITIVE_EFF2 = 0x08000000, SPELL_ATTR0_CU_NEGATIVE = SPELL_ATTR0_CU_NEGATIVE_EFF0 | SPELL_ATTR0_CU_NEGATIVE_EFF1 | SPELL_ATTR0_CU_NEGATIVE_EFF2, + SPELL_ATTR0_CU_POSITIVE = SPELL_ATTR0_CU_POSITIVE_EFF0 | SPELL_ATTR0_CU_POSITIVE_EFF1 | SPELL_ATTR0_CU_POSITIVE_EFF2, }; uint32 GetTargetFlagMask(SpellTargetObjectTypes objType); diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index f44766a0a..fe34762e3 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -2713,7 +2713,7 @@ void SpellMgr::LoadSpellCustomAttr() uint32 customAttrTime = getMSTime(); uint32 count; - QueryResult result = WorldDatabase.Query("SELECT entry, attributes FROM spell_custom_attr"); + QueryResult result = WorldDatabase.Query("SELECT spell_id, attributes FROM spell_custom_attr"); if (!result) sLog->outString(">> Loaded 0 spell custom attributes from DB. DB table `spell_custom_attr` is empty."); @@ -2729,7 +2729,7 @@ void SpellMgr::LoadSpellCustomAttr() SpellInfo * spellInfo = _GetSpellInfo(spellId); if (!spellInfo) { - sLog->outString("Table `spell_custom_attr` has wrong spell (entry: %u), ignored.", spellId); + sLog->outString("Table `spell_custom_attr` has wrong spell (spell_id: %u), ignored.", spellId); continue; } @@ -2742,7 +2742,22 @@ void SpellMgr::LoadSpellCustomAttr() if ((attributes & (SPELL_ATTR0_CU_NEGATIVE_EFF0 << i)) != 0) { - sLog->outString("Table `spell_custom_attr` has attribute SPELL_ATTR0_CU_NEGATIVE_EFF%u for spell %u with no EFFECT_%u", uint32(i), spellId, uint32(i)); + sLog->outErrorDb("Table `spell_custom_attr` has attribute SPELL_ATTR0_CU_NEGATIVE_EFF%u for spell %u with no EFFECT_%u", uint32(i), spellId, uint32(i)); + continue; + } + } + } + + if ((attributes & SPELL_ATTR0_CU_POSITIVE) != 0) + { + for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + { + if (spellInfo->Effects[i].IsEffect()) + continue; + + if ((attributes & (SPELL_ATTR0_CU_POSITIVE_EFF0 << i)) != 0) + { + sLog->outErrorDb("Table `spell_custom_attr` has attribute SPELL_ATTR0_CU_POSITIVE_EFF%u for spell %u with no EFFECT_%u", uint32(i), spellId, uint32(i)); continue; } } @@ -2753,7 +2768,6 @@ void SpellMgr::LoadSpellCustomAttr() sLog->outString(">> Loaded %u spell custom attributes from DB in %u ms", count, GetMSTimeDiffToNow(customAttrTime)); } - // xinef: create talent spells set for (uint32 i = 0; i < sTalentStore.GetNumRows(); ++i) {