From 2e41da548e4e32a5fc752983f2a2af244cda1991 Mon Sep 17 00:00:00 2001 From: UltraNix <80540499+UltraNix@users.noreply.github.com> Date: Tue, 7 Sep 2021 02:10:13 +0200 Subject: [PATCH] fix(Core/Spells): implement SPELL_GROUP_SPECIAL_FLAG_SAME_SPELL_CHECK group stack flag (#7709) - Closes #6664 --- .../rev_1630695496578966300.sql | 3 ++ src/server/game/Spells/SpellMgr.cpp | 18 +++++++++--- src/server/game/Spells/SpellMgr.h | 29 ++++++++++--------- 3 files changed, 32 insertions(+), 18 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1630695496578966300.sql diff --git a/data/sql/updates/pending_db_world/rev_1630695496578966300.sql b/data/sql/updates/pending_db_world/rev_1630695496578966300.sql new file mode 100644 index 000000000..a661efe39 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1630695496578966300.sql @@ -0,0 +1,3 @@ +INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1630695496578966300'); + +UPDATE `spell_group` SET `special_flag`=0x1000 WHERE `spell_id`=6343; diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 1ddad153b..c47b7729f 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -671,14 +671,24 @@ SpellGroupStackFlags SpellMgr::CheckSpellGroupStackRules(SpellInfo const* spellI { uint32 spellid_1 = spellInfo1->GetFirstRankSpell()->Id; uint32 spellid_2 = spellInfo2->GetFirstRankSpell()->Id; - // xinef: dunno why i added this - if (spellid_1 == spellid_2 && remove && !areaAura) - return SPELL_GROUP_STACK_FLAG_NONE; uint32 groupId = GetSpellGroup(spellid_1); + + SpellGroupSpecialFlags flag1 = GetSpellGroupSpecialFlags(spellid_1); + + // xinef: dunno why i added this + if (spellid_1 == spellid_2 && remove && !areaAura) + { + if (flag1 & SPELL_GROUP_SPECIAL_FLAG_SAME_SPELL_CHECK) + { + return SPELL_GROUP_STACK_FLAG_EXCLUSIVE; + } + + return SPELL_GROUP_STACK_FLAG_NONE; + } + if (groupId > 0 && groupId == GetSpellGroup(spellid_2)) { - SpellGroupSpecialFlags flag1 = GetSpellGroupSpecialFlags(spellid_1); SpellGroupSpecialFlags flag2 = GetSpellGroupSpecialFlags(spellid_2); SpellGroupStackFlags additionFlag = SPELL_GROUP_STACK_FLAG_NONE; // xinef: first flags are used for elixir stacking rules diff --git a/src/server/game/Spells/SpellMgr.h b/src/server/game/Spells/SpellMgr.h index 4241e58ce..8ae5d9edb 100644 --- a/src/server/game/Spells/SpellMgr.h +++ b/src/server/game/Spells/SpellMgr.h @@ -312,20 +312,21 @@ typedef std::unordered_map SpellBonusMap; enum SpellGroupSpecialFlags { - SPELL_GROUP_SPECIAL_FLAG_NONE = 0x000, - SPELL_GROUP_SPECIAL_FLAG_ELIXIR_BATTLE = 0x001, - SPELL_GROUP_SPECIAL_FLAG_ELIXIR_GUARDIAN = 0x002, - SPELL_GROUP_SPECIAL_FLAG_ELIXIR_UNSTABLE = 0x004, - SPELL_GROUP_SPECIAL_FLAG_ELIXIR_SHATTRATH = 0x008, - SPELL_GROUP_SPECIAL_FLAG_STACK_EXCLUSIVE_MAX = 0x00F, - SPELL_GROUP_SPECIAL_FLAG_FORCED_STRONGEST = 0x010, // xinef: specially helpful flag if some spells have different auras, but only one should be present - SPELL_GROUP_SPECIAL_FLAG_SKIP_STRONGER_CHECK = 0x020, - SPELL_GROUP_SPECIAL_FLAG_BASE_AMOUNT_CHECK = 0x040, - SPELL_GROUP_SPECIAL_FLAG_PRIORITY1 = 0x100, - SPELL_GROUP_SPECIAL_FLAG_PRIORITY2 = 0x200, - SPELL_GROUP_SPECIAL_FLAG_PRIORITY3 = 0x400, - SPELL_GROUP_SPECIAL_FLAG_PRIORITY4 = 0x800, - SPELL_GROUP_SPECIAL_FLAG_MAX = 0x1000, + SPELL_GROUP_SPECIAL_FLAG_NONE = 0x000, + SPELL_GROUP_SPECIAL_FLAG_ELIXIR_BATTLE = 0x001, + SPELL_GROUP_SPECIAL_FLAG_ELIXIR_GUARDIAN = 0x002, + SPELL_GROUP_SPECIAL_FLAG_ELIXIR_UNSTABLE = 0x004, + SPELL_GROUP_SPECIAL_FLAG_ELIXIR_SHATTRATH = 0x008, + SPELL_GROUP_SPECIAL_FLAG_STACK_EXCLUSIVE_MAX = 0x00F, + SPELL_GROUP_SPECIAL_FLAG_FORCED_STRONGEST = 0x010, // xinef: specially helpful flag if some spells have different auras, but only one should be present + SPELL_GROUP_SPECIAL_FLAG_SKIP_STRONGER_CHECK = 0x020, + SPELL_GROUP_SPECIAL_FLAG_BASE_AMOUNT_CHECK = 0x040, + SPELL_GROUP_SPECIAL_FLAG_PRIORITY1 = 0x100, + SPELL_GROUP_SPECIAL_FLAG_PRIORITY2 = 0x200, + SPELL_GROUP_SPECIAL_FLAG_PRIORITY3 = 0x400, + SPELL_GROUP_SPECIAL_FLAG_PRIORITY4 = 0x800, + SPELL_GROUP_SPECIAL_FLAG_SAME_SPELL_CHECK = 0x1000, + SPELL_GROUP_SPECIAL_FLAG_MAX = 0x2000 }; enum SpellGroupStackFlags