From f9337497d87437245469e46f4a76e5b904cc08ac Mon Sep 17 00:00:00 2001 From: Kitzunu <24550914+Kitzunu@users.noreply.github.com> Date: Tue, 30 Nov 2021 17:03:04 +0100 Subject: [PATCH] chore(Core/Auras): Clean up Aura::CanBeSaved() (#9343) --- .../rev_1637861417456909900.sql | 5 +++ src/server/game/Spells/Auras/SpellAuras.cpp | 38 +------------------ src/server/game/Spells/SpellInfo.h | 5 ++- src/server/game/Spells/SpellMgr.cpp | 23 +++++++++-- 4 files changed, 29 insertions(+), 42 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1637861417456909900.sql diff --git a/data/sql/updates/pending_db_world/rev_1637861417456909900.sql b/data/sql/updates/pending_db_world/rev_1637861417456909900.sql new file mode 100644 index 000000000..c469f31db --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1637861417456909900.sql @@ -0,0 +1,5 @@ +INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1637861417456909900'); + +SET @flag := 268435456; + +UPDATE `spell_custom_attr` SET `attributes` = 16777216 WHERE `spell_id` = (SELECT `spell_id` WHERE `attributes` & @flag = @flag); diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index fb2cebf40..026538e7c 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -1062,7 +1062,7 @@ bool Aura::CanBeSaved() const return true; } - if (spellInfo->HasAttribute(SPELL_ATTR0_CU_REJECT_AURA_SAVING)) + if (spellInfo->HasAttribute(SPELL_ATTR0_CU_AURA_CANNOT_BE_SAVED)) { return false; } @@ -1084,42 +1084,6 @@ bool Aura::CanBeSaved() const return false; } - // Xinef: Dont save control vehicle auras - caster may not exist - if (HasEffectType(SPELL_AURA_CONTROL_VEHICLE)) - { - return false; - } - - // Can't be saved - aura handler relies on calculated amount and changes it - if (HasEffectType(SPELL_AURA_CONVERT_RUNE)) - { - return false; - } - - // No point in saving this, since the stable dialog can't be open on aura load anyway. - if (HasEffectType(SPELL_AURA_OPEN_STABLE)) - { - return false; - } - - // xinef: do not save bind sight auras! - if (HasEffectType(SPELL_AURA_BIND_SIGHT)) - { - return false; - } - - // xinef: no charming auras (taking direct control) - if (HasEffectType(SPELL_AURA_MOD_POSSESS) || HasEffectType(SPELL_AURA_MOD_POSSESS_PET)) - { - return false; - } - - // xinef: no charming auras can be saved - if (HasEffectType(SPELL_AURA_MOD_CHARM) || HasEffectType(SPELL_AURA_AOE_CHARM)) - { - return false; - } - // don't save auras removed by proc system if (IsUsingCharges() && !GetCharges()) { diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h index 4d02717f5..388c70bcc 100644 --- a/src/server/game/Spells/SpellInfo.h +++ b/src/server/game/Spells/SpellInfo.h @@ -197,12 +197,13 @@ enum SpellCustomAttributes SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS = 0x00200000, 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_AURA_CANNOT_BE_SAVED = 0x01000000, SPELL_ATTR0_CU_POSITIVE_EFF0 = 0x02000000, SPELL_ATTR0_CU_POSITIVE_EFF1 = 0x04000000, SPELL_ATTR0_CU_POSITIVE_EFF2 = 0x08000000, - SPELL_ATTR0_CU_REJECT_AURA_SAVING = 0x10000000, + // unused = 0x10000000, SPELL_ATTR0_CU_FORCE_AURA_SAVING = 0x20000800, + SPELL_ATTR0_CU_ENCOUNTER_REWARD = 0x40000000, // pussywizard 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, diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 23cc9fe52..09d6963f2 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -2806,10 +2806,10 @@ void SpellMgr::LoadSpellCustomAttr() } } - if ((attributes & SPELL_ATTR0_CU_FORCE_AURA_SAVING) && (attributes & SPELL_ATTR0_CU_REJECT_AURA_SAVING)) + if ((attributes & SPELL_ATTR0_CU_FORCE_AURA_SAVING) && (attributes & SPELL_ATTR0_CU_AURA_CANNOT_BE_SAVED)) { - LOG_ERROR("sql.sql", "Table `spell_custom_attr` attribute1 field has attributes SPELL_ATTR1_CU_FORCE_AURA_SAVING and SPELL_ATTR1_CU_REJECT_AURA_SAVING which cannot stack for spell %u. Both attributes will get applied", spellId); - attributes &= ~(SPELL_ATTR0_CU_FORCE_AURA_SAVING | SPELL_ATTR0_CU_REJECT_AURA_SAVING); + LOG_ERROR("sql.sql", "Table `spell_custom_attr` attribute1 field has attributes SPELL_ATTR1_CU_FORCE_AURA_SAVING and SPELL_ATTR0_CU_AURA_CANNOT_BE_SAVED which cannot stack for spell %u. Both attributes will be ignored.", spellId); + attributes &= ~(SPELL_ATTR0_CU_FORCE_AURA_SAVING | SPELL_ATTR0_CU_AURA_CANNOT_BE_SAVED); } spellInfo->AttributesCu |= attributes; @@ -2878,6 +2878,23 @@ void SpellMgr::LoadSpellCustomAttr() break; } + switch (spellInfo->Effects[j].ApplyAuraName) + { + case SPELL_AURA_CONVERT_RUNE: // Can't be saved - aura handler relies on calculated amount and changes it + case SPELL_AURA_OPEN_STABLE: // No point in saving this, since the stable dialog can't be open on aura load anyway. + // Auras that require both caster & target to be in world cannot be saved + case SPELL_AURA_CONTROL_VEHICLE: + case SPELL_AURA_BIND_SIGHT: + case SPELL_AURA_MOD_POSSESS: + case SPELL_AURA_MOD_POSSESS_PET: + case SPELL_AURA_MOD_CHARM: + case SPELL_AURA_AOE_CHARM: + spellInfo->AttributesCu |= SPELL_ATTR0_CU_AURA_CANNOT_BE_SAVED; + break; + default: + break; + } + switch (spellInfo->Effects[j].ApplyAuraName) { case SPELL_AURA_MOD_POSSESS: