From a72f5f97e615b81af9a556018821f24a957ad786 Mon Sep 17 00:00:00 2001 From: UltraNix <80540499+UltraNix@users.noreply.github.com> Date: Sun, 2 Apr 2023 20:28:23 +0200 Subject: [PATCH] fix(Core/Spells): Implemented `ENCHANT_PROC_ATTR_EXCLUSIVE`. (#15476) Fixes #12132 --- .../updates/pending_db_world/rev_1679233071443044800.sql | 3 +++ src/server/game/Entities/Player/Player.cpp | 9 +++++++++ src/server/game/Spells/SpellMgr.cpp | 5 +++-- src/server/game/Spells/SpellMgr.h | 6 ++++++ 4 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1679233071443044800.sql diff --git a/data/sql/updates/pending_db_world/rev_1679233071443044800.sql b/data/sql/updates/pending_db_world/rev_1679233071443044800.sql new file mode 100644 index 000000000..14d300b98 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1679233071443044800.sql @@ -0,0 +1,3 @@ +-- +ALTER TABLE `spell_enchant_proc_data` ADD COLUMN `attributeMask` INT UNSIGNED DEFAULT 0 NOT NULL AFTER `procEx`; +UPDATE `spell_enchant_proc_data` SET `attributeMask`=1 WHERE `entry`=3225; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index c53e3a83c..e95b33a58 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -7218,6 +7218,15 @@ void Player::CastItemCombatSpell(Unit* target, WeaponAttackType attType, uint32 continue; } + if (entry && (entry->attributeMask & ENCHANT_PROC_ATTR_EXCLUSIVE) != 0) + { + Unit* checkTarget = spellInfo->IsPositive() ? this : target; + if (checkTarget->HasAura(spellInfo->Id, GetGUID())) + { + continue; + } + } + float chance = pEnchant->amount[s] != 0 ? float(pEnchant->amount[s]) : GetWeaponProcChance(); if (entry) diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 552659a6c..103d93d40 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -2211,8 +2211,8 @@ void SpellMgr::LoadSpellEnchantProcData() mSpellEnchantProcEventMap.clear(); // need for reload case - // 0 1 2 3 - QueryResult result = WorldDatabase.Query("SELECT entry, customChance, PPMChance, procEx FROM spell_enchant_proc_data"); + // 0 1 2 3 4 + QueryResult result = WorldDatabase.Query("SELECT entry, customChance, PPMChance, procEx, attributeMask FROM spell_enchant_proc_data"); if (!result) { LOG_WARN("server.loading", ">> Loaded 0 spell enchant proc event conditions. DB table `spell_enchant_proc_data` is empty."); @@ -2239,6 +2239,7 @@ void SpellMgr::LoadSpellEnchantProcData() spe.customChance = fields[1].Get(); spe.PPMChance = fields[2].Get(); spe.procEx = fields[3].Get(); + spe.attributeMask = fields[4].Get(); mSpellEnchantProcEventMap[enchantId] = spe; diff --git a/src/server/game/Spells/SpellMgr.h b/src/server/game/Spells/SpellMgr.h index 2ee19ecc3..80eae7fc2 100644 --- a/src/server/game/Spells/SpellMgr.h +++ b/src/server/game/Spells/SpellMgr.h @@ -304,11 +304,17 @@ struct SpellProcEntry typedef std::unordered_map SpellProcMap; +enum EnchantProcAttributes +{ + ENCHANT_PROC_ATTR_EXCLUSIVE = 0x1 // Only one instance of that effect can be active +}; + struct SpellEnchantProcEntry { uint32 customChance; float PPMChance; uint32 procEx; + uint32 attributeMask; }; typedef std::unordered_map SpellEnchantProcEventMap;