diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 48da0becb8..e4a5de16ac 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -21358,7 +21358,7 @@ void Player::VehicleSpellInitialize() { uint32 spellId = vehicle->m_spells[i]; SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); - if (!spellInfo) + if (!spellInfo || !spellInfo->HasAttribute(SPELL_ATTR5_NOT_AVAILABLE_WHILE_CHARMED)) { data << uint16(0) << uint8(0) << uint8(i+8); continue; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index d06d30606e..720036a421 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -9732,6 +9732,9 @@ void CharmInfo::InitPossessCreateSpells() SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); if (spellInfo) { + if (spellInfo->HasAttribute(SPELL_ATTR5_NOT_AVAILABLE_WHILE_CHARMED)) + continue; + if (spellInfo->IsPassive()) _unit->CastSpell(_unit, spellInfo->Id, true); else @@ -9764,6 +9767,9 @@ void CharmInfo::InitCharmCreateSpells() continue; } + if (spellInfo->HasAttribute(SPELL_ATTR5_NOT_AVAILABLE_WHILE_CHARMED)) + continue; + if (spellInfo->IsPassive()) { _unit->CastSpell(_unit, spellInfo->Id, true); diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 20cb9c1f37..9949b5404e 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -548,7 +548,7 @@ enum SpellAttr5 : uint32 SPELL_ATTR5_IMPLIED_TARGETING = 0x00000800, // TITLE Implied Targeting (client only) SPELL_ATTR5_MELEE_CHAIN_TARGETING = 0x00001000, // TITLE Melee Chain Targeting SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC = 0x00002000, // TITLE Spell Haste Affects Periodic - SPELL_ATTR5_NOT_AVAILABLE_WHILE_CHARMED = 0x00004000, /*NYI*/ // TITLE Not Available While Charmed + SPELL_ATTR5_NOT_AVAILABLE_WHILE_CHARMED = 0x00004000, // TITLE Not Available While Charmed SPELL_ATTR5_TREAT_AS_AREA_EFFECT = 0x00008000, /*NYI*/ // TITLE Treat as Area Effect SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM = 0x00010000, // TITLE Aura Affects Not Just Req. Equipped Item SPELL_ATTR5_ALLOW_WHILE_FLEEING = 0x00020000, // TITLE Allow While Fleeing diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index f74fc77c40..fd9ce12e80 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -5627,6 +5627,9 @@ SpellCastResult Spell::CheckCast(bool strict, uint32* param1 /*= nullptr*/, uint if (Unit* unitCaster = m_caster->ToUnit()) { + if (m_spellInfo->HasAttribute(SPELL_ATTR5_NOT_AVAILABLE_WHILE_CHARMED) && unitCaster->IsCharmed()) + return SPELL_FAILED_CHARMED; + // only check at first call, Stealth auras are already removed at second call // for now, ignore triggered spells if (strict && !(_triggeredCastFlags & TRIGGERED_IGNORE_SHAPESHIFT))