aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGildor <gildor55@gmail.com>2021-11-20 20:48:58 +0100
committerGitHub <noreply@github.com>2021-11-20 21:48:58 +0200
commit04d54a000fd2629155dfb43db79e5e2023bc84ac (patch)
tree7feb902d531d7450af5668656ec4503b686cd4c4
parente63838f624b28b4fc5fcba2b8c64fced8ef8e11c (diff)
Core/Auras: Convert most rules from Aura::CanBeSaved to a custom spell attribute (#27191)
(cherry picked from commit b4aa698acb88e1a74bc22d97279148a567b88cad) (cherry picked from commit 2bea816bbec6ba9d50f7bd6725806e81c6cafaae)
-rw-r--r--sql/updates/world/3.3.5/2021_11_20_00_world.sql14
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.cpp41
-rw-r--r--src/server/game/Spells/SpellInfo.h3
-rw-r--r--src/server/game/Spells/SpellMgr.cpp19
4 files changed, 35 insertions, 42 deletions
diff --git a/sql/updates/world/3.3.5/2021_11_20_00_world.sql b/sql/updates/world/3.3.5/2021_11_20_00_world.sql
new file mode 100644
index 00000000000..05a90843b94
--- /dev/null
+++ b/sql/updates/world/3.3.5/2021_11_20_00_world.sql
@@ -0,0 +1,14 @@
+--
+ALTER TABLE `spell_custom_attr`
+ MODIFY `entry` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'spell id',
+ MODIFY `attributes` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'SpellCustomAttributes';
+
+SET @SPELL_ATTR0_CU_AURA_CANNOT_BE_SAVED := 16777216;
+
+DELETE FROM `spell_custom_attr` WHERE `entry` IN (44413,40075,55849,73822,73828);
+INSERT INTO `spell_custom_attr` (`entry`, `attributes`) VALUES
+(44413, @SPELL_ATTR0_CU_AURA_CANNOT_BE_SAVED), -- Incanter's Absorption
+(40075, @SPELL_ATTR0_CU_AURA_CANNOT_BE_SAVED), -- Fel Flak Fire
+(55849, @SPELL_ATTR0_CU_AURA_CANNOT_BE_SAVED), -- Power Spark
+(73822, @SPELL_ATTR0_CU_AURA_CANNOT_BE_SAVED), -- Hellscream's Warsong (ICC)
+(73828, @SPELL_ATTR0_CU_AURA_CANNOT_BE_SAVED); -- Strength of Wrynn (ICC)
diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp
index 9225876eb9d..7a0b01a65b6 100644
--- a/src/server/game/Spells/Auras/SpellAuras.cpp
+++ b/src/server/game/Spells/Auras/SpellAuras.cpp
@@ -1113,48 +1113,9 @@ bool Aura::CanBeSaved() const
return false;
}
- // don't save liquid auras
- if (GetSpellInfo()->HasAttribute(SPELL_ATTR0_CU_LIQUID_AURA))
+ if (GetSpellInfo()->HasAttribute(SPELL_ATTR0_CU_AURA_CANNOT_BE_SAVED))
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;
-
- // Can't save vehicle auras, it requires both caster & target to be in world
- if (HasEffectType(SPELL_AURA_CONTROL_VEHICLE))
- return false;
-
- // do not save bind sight auras
- if (HasEffectType(SPELL_AURA_BIND_SIGHT))
- return false;
-
- // no charming auras (taking direct control)
- if (HasEffectType(SPELL_AURA_MOD_POSSESS) || HasEffectType(SPELL_AURA_MOD_POSSESS_PET))
- return false;
-
- // no charming auras can be saved
- if (HasEffectType(SPELL_AURA_MOD_CHARM) || HasEffectType(SPELL_AURA_AOE_CHARM))
- return false;
-
- // Incanter's Absorbtion - considering the minimal duration and problems with aura stacking
- // we skip saving this aura
- // Also for some reason other auras put as MultiSlot crash core on keeping them after restart,
- // so put here only these for which you are sure they get removed
- switch (GetId())
- {
- case 44413: // Incanter's Absorption
- case 40075: // Fel Flak Fire
- case 55849: // Power Spark
- case 73822: // Hellscream's Warsong
- case 73828: // Strength of Wrynn
- return false;
- }
-
// don't save auras removed by proc system
if (IsUsingCharges() && !GetCharges())
return false;
diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h
index b9ec5514adc..b837f9b3efc 100644
--- a/src/server/game/Spells/SpellInfo.h
+++ b/src/server/game/Spells/SpellInfo.h
@@ -198,8 +198,9 @@ enum SpellCustomAttributes
SPELL_ATTR0_CU_NEEDS_AMMO_DATA = 0x00080000,
SPELL_ATTR0_CU_BINARY_SPELL = 0x00100000,
SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC = 0x00200000,
- SPELL_ATTR0_CU_LIQUID_AURA = 0x00400000,
+ SPELL_ATTR0_CU_DEPRECATED_LIQUID_AURA = 0x00400000, // DO NOT REUSE
SPELL_ATTR0_CU_IS_TALENT = 0x00800000, // reserved for master branch
+ SPELL_ATTR0_CU_AURA_CANNOT_BE_SAVED = 0x01000000,
SPELL_ATTR0_CU_NEGATIVE = SPELL_ATTR0_CU_NEGATIVE_EFF0 | SPELL_ATTR0_CU_NEGATIVE_EFF1 | SPELL_ATTR0_CU_NEGATIVE_EFF2
};
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index 404b9d4fac6..ecb2a67010d 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -2673,6 +2673,23 @@ void SpellMgr::LoadSpellInfoCustomAttributes()
break;
}
+ switch (spellEffectInfo.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 (spellEffectInfo.Effect)
{
case SPELL_EFFECT_SCHOOL_DAMAGE:
@@ -2949,7 +2966,7 @@ void SpellMgr::LoadSpellInfoCustomAttributes()
{
if (uint32 spellId = liquid->SpellID)
if (SpellInfo* spellInfo = _GetSpellInfo(spellId))
- spellInfo->AttributesCu |= SPELL_ATTR0_CU_LIQUID_AURA;
+ spellInfo->AttributesCu |= SPELL_ATTR0_CU_AURA_CANNOT_BE_SAVED;
}
TC_LOG_INFO("server.loading", ">> Loaded SpellInfo custom attributes in %u ms", GetMSTimeDiffToNow(oldMSTime));