aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-05-02 19:29:51 +0200
committerShauren <shauren.trinity@gmail.com>2022-05-02 19:29:51 +0200
commit076c63c766d10697cea17da8bd5194862a682cbe (patch)
treea52bd66f822118e361465d34f6b7371cfe563fa2
parentacda6f9dcf411a1406b81e1a100125dbe34f942b (diff)
Core/Spells: Implemented SPELL_ATTR5_NOT_AVAILABLE_WHILE_CHARMED
-rw-r--r--src/server/game/Entities/Player/Player.cpp3
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp6
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h2
-rw-r--r--src/server/game/Spells/Spell.cpp7
4 files changed, 15 insertions, 3 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 9d3cf1e685f..0653036b3f1 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -22329,6 +22329,9 @@ void Player::VehicleSpellInitialize()
if (!spellInfo)
continue;
+ if (spellInfo->HasAttribute(SPELL_ATTR5_NOT_AVAILABLE_WHILE_CHARMED))
+ continue;
+
if (!sConditionMgr->IsObjectMeetingVehicleSpellConditions(vehicle->GetEntry(), spellId, this, vehicle))
{
TC_LOG_DEBUG("condition", "Player::VehicleSpellInitialize: Player '%s' (%s) doesn't meet conditions for vehicle (Entry: %u, Spell: %u)",
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 3d695465a33..7dcdd263662 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -9512,6 +9512,9 @@ void CharmInfo::InitPossessCreateSpells()
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId, _unit->GetMap()->GetDifficultyID());
if (spellInfo)
{
+ if (spellInfo->HasAttribute(SPELL_ATTR5_NOT_AVAILABLE_WHILE_CHARMED))
+ continue;
+
if (spellInfo->IsPassive())
_unit->CastSpell(_unit, spellInfo->Id, true);
else
@@ -9544,6 +9547,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 2b4e32cc726..f753b1da7e9 100644
--- a/src/server/game/Miscellaneous/SharedDefines.h
+++ b/src/server/game/Miscellaneous/SharedDefines.h
@@ -603,7 +603,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 094bb17489f..21f5caaf65c 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -5514,6 +5514,9 @@ SpellCastResult Spell::CheckCast(bool strict, int32* param1 /*= nullptr*/, int32
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))
@@ -6447,7 +6450,7 @@ SpellCastResult Spell::CheckCast(bool strict, int32* param1 /*= nullptr*/, int32
return SPELL_FAILED_NO_PET;
if (!pet->GetCharmerGUID().IsEmpty())
- return SPELL_FAILED_CHARMED;
+ return SPELL_FAILED_ALREADY_HAVE_CHARM;
break;
}
case SPELL_AURA_MOD_POSSESS:
@@ -6480,7 +6483,7 @@ SpellCastResult Spell::CheckCast(bool strict, int32* param1 /*= nullptr*/, int32
return SPELL_FAILED_CANT_BE_CHARMED;
if (!target->GetCharmerGUID().IsEmpty())
- return SPELL_FAILED_CHARMED;
+ return SPELL_FAILED_ALREADY_HAVE_CHARM;
if (target->GetOwner() && target->GetOwner()->GetTypeId() == TYPEID_PLAYER)
return SPELL_FAILED_TARGET_IS_PLAYER_CONTROLLED;