diff options
-rw-r--r-- | src/server/game/Handlers/SpellHandler.cpp | 10 | ||||
-rw-r--r-- | src/server/game/Miscellaneous/SharedDefines.h | 2 | ||||
-rw-r--r-- | src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Spells/SpellInfo.cpp | 2 |
4 files changed, 12 insertions, 8 deletions
diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index 6597bb8dd98..a0033fc2b81 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -501,12 +501,16 @@ void WorldSession::HandleTotemDestroyed(WorldPackets::Totem::TotemDestroyed& tot void WorldSession::HandleSelfResOpcode(WorldPackets::Spells::SelfRes& selfRes) { - if (_player->HasAuraType(SPELL_AURA_PREVENT_RESURRECTION)) - return; // silent return, client should display error by itself and not send this opcode - if (_player->m_activePlayerData->SelfResSpells.FindIndex(selfRes.SpellID) < 0) return; + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(selfRes.SpellID, _player->GetMap()->GetDifficultyID()); + if (!spellInfo) + return; + + if (_player->HasAuraType(SPELL_AURA_PREVENT_RESURRECTION) && !spellInfo->HasAttribute(SPELL_ATTR7_BYPASS_NO_RESURRECT_AURA)) + return; // silent return, client should display error by itself and not send this opcode + _player->CastSpell(_player, selfRes.SpellID, _player->GetMap()->GetDifficultyID()); _player->RemoveSelfResSpell(selfRes.SpellID); } diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 729a3020359..707668233b5 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -690,7 +690,7 @@ enum SpellAttr7 : uint32 SPELL_ATTR7_UNK24 = 0x01000000, // TITLE Unknown attribute 24@Attr7 SPELL_ATTR7_UNK25 = 0x02000000, // TITLE Unknown attribute 25@Attr7 SPELL_ATTR7_UNK26 = 0x04000000, // TITLE Unknown attribute 26@Attr7 - SPELL_ATTR7_UNK27 = 0x08000000, // TITLE Unknown attribute 27@Attr7 + SPELL_ATTR7_BYPASS_NO_RESURRECT_AURA = 0x08000000, // TITLE Bypass No Resurrect Aura SPELL_ATTR7_CONSOLIDATED_RAID_BUFF = 0x10000000, // TITLE Consolidate in raid buff frame (client only) SPELL_ATTR7_UNK29 = 0x20000000, // TITLE Unknown attribute 29@Attr7 SPELL_ATTR7_UNK30 = 0x40000000, // TITLE Unknown attribute 30@Attr7 diff --git a/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp b/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp index 33739ee5288..4f90df03315 100644 --- a/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp +++ b/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp @@ -1177,7 +1177,7 @@ TC_API_EXPORT EnumText EnumUtils<SpellAttr7>::ToString(SpellAttr7 value) case SPELL_ATTR7_UNK24: return { "SPELL_ATTR7_UNK24", "Unknown attribute 24@Attr7", "" }; case SPELL_ATTR7_UNK25: return { "SPELL_ATTR7_UNK25", "Unknown attribute 25@Attr7", "" }; case SPELL_ATTR7_UNK26: return { "SPELL_ATTR7_UNK26", "Unknown attribute 26@Attr7", "" }; - case SPELL_ATTR7_UNK27: return { "SPELL_ATTR7_UNK27", "Unknown attribute 27@Attr7", "" }; + case SPELL_ATTR7_BYPASS_NO_RESURRECT_AURA: return { "SPELL_ATTR7_BYPASS_NO_RESURRECT_AURA", "Bypass No Resurrect Aura", "" }; case SPELL_ATTR7_CONSOLIDATED_RAID_BUFF: return { "SPELL_ATTR7_CONSOLIDATED_RAID_BUFF", "Consolidate in raid buff frame (client only)", "" }; case SPELL_ATTR7_UNK29: return { "SPELL_ATTR7_UNK29", "Unknown attribute 29@Attr7", "" }; case SPELL_ATTR7_UNK30: return { "SPELL_ATTR7_UNK30", "Unknown attribute 30@Attr7", "" }; @@ -1221,7 +1221,7 @@ TC_API_EXPORT SpellAttr7 EnumUtils<SpellAttr7>::FromIndex(size_t index) case 24: return SPELL_ATTR7_UNK24; case 25: return SPELL_ATTR7_UNK25; case 26: return SPELL_ATTR7_UNK26; - case 27: return SPELL_ATTR7_UNK27; + case 27: return SPELL_ATTR7_BYPASS_NO_RESURRECT_AURA; case 28: return SPELL_ATTR7_CONSOLIDATED_RAID_BUFF; case 29: return SPELL_ATTR7_UNK29; case 30: return SPELL_ATTR7_UNK30; @@ -1262,7 +1262,7 @@ TC_API_EXPORT size_t EnumUtils<SpellAttr7>::ToIndex(SpellAttr7 value) case SPELL_ATTR7_UNK24: return 24; case SPELL_ATTR7_UNK25: return 25; case SPELL_ATTR7_UNK26: return 26; - case SPELL_ATTR7_UNK27: return 27; + case SPELL_ATTR7_BYPASS_NO_RESURRECT_AURA: return 27; case SPELL_ATTR7_CONSOLIDATED_RAID_BUFF: return 28; case SPELL_ATTR7_UNK29: return 29; case SPELL_ATTR7_UNK30: return 30; diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index f6b87135126..91a81c35388 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -2230,7 +2230,7 @@ SpellCastResult SpellInfo::CheckTarget(WorldObject const* caster, WorldObject co if (ExcludeTargetAuraSpell && unitTarget->HasAura(ExcludeTargetAuraSpell)) return SPELL_FAILED_TARGET_AURASTATE; - if (unitTarget->HasAuraType(SPELL_AURA_PREVENT_RESURRECTION)) + if (unitTarget->HasAuraType(SPELL_AURA_PREVENT_RESURRECTION) && !HasAttribute(SPELL_ATTR7_BYPASS_NO_RESURRECT_AURA)) if (HasEffect(SPELL_EFFECT_SELF_RESURRECT) || HasEffect(SPELL_EFFECT_RESURRECT)) return SPELL_FAILED_TARGET_CANNOT_BE_RESURRECTED; |