diff options
-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/Spell.cpp | 16 |
3 files changed, 20 insertions, 4 deletions
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 0953db0b799..f62d4426dd2 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -764,7 +764,7 @@ enum SpellAttr9 : uint32 { SPELL_ATTR9_FORCE_DEST_LOCATION = 0x00000001, // TITLE Force Dest Location DESCRIPTION Ignores collision with terrain (unsure if it also ignores terrain height and can go under map) SPELL_ATTR9_MOD_INVIS_INCLUDES_PARTY = 0x00000002, // TITLE Mod Invis Includes Party 1@Attr9 DESCRIPTION Causes invisibility auras to ignore "can always see party member invis" rule - SPELL_ATTR9_RESTRICTED_FLIGHT_AREA = 0x00000004, // TITLE Only When Illegally Mounted + SPELL_ATTR9_ONLY_WHEN_ILLEGALLY_MOUNTED = 0x00000004, // TITLE Only When Illegally Mounted SPELL_ATTR9_UNK3 = 0x00000008, // TITLE Unknown attribute 3@Attr9 SPELL_ATTR9_SPECIAL_DELAY_CALCULATION = 0x00000010, // TITLE Missile Speed is Delay (in sec) SPELL_ATTR9_SUMMON_PLAYER_TOTEM = 0x00000020, // TITLE Ignore Totem Requirements for Casting diff --git a/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp b/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp index 996a6feea37..3531eb60238 100644 --- a/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp +++ b/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp @@ -1440,7 +1440,7 @@ TC_API_EXPORT EnumText EnumUtils<SpellAttr9>::ToString(SpellAttr9 value) { case SPELL_ATTR9_FORCE_DEST_LOCATION: return { "SPELL_ATTR9_FORCE_DEST_LOCATION", "Force Dest Location", "Ignores collision with terrain (unsure if it also ignores terrain height and can go under map)" }; case SPELL_ATTR9_MOD_INVIS_INCLUDES_PARTY: return { "SPELL_ATTR9_MOD_INVIS_INCLUDES_PARTY", "Mod Invis Includes Party 1@Attr9", "Causes invisibility auras to ignore \042can always see party member invis\042 rule" }; - case SPELL_ATTR9_RESTRICTED_FLIGHT_AREA: return { "SPELL_ATTR9_RESTRICTED_FLIGHT_AREA", "Only When Illegally Mounted", "" }; + case SPELL_ATTR9_ONLY_WHEN_ILLEGALLY_MOUNTED: return { "SPELL_ATTR9_ONLY_WHEN_ILLEGALLY_MOUNTED", "Only When Illegally Mounted", "" }; case SPELL_ATTR9_UNK3: return { "SPELL_ATTR9_UNK3", "Unknown attribute 3@Attr9", "" }; case SPELL_ATTR9_SPECIAL_DELAY_CALCULATION: return { "SPELL_ATTR9_SPECIAL_DELAY_CALCULATION", "Missile Speed is Delay (in sec)", "" }; case SPELL_ATTR9_SUMMON_PLAYER_TOTEM: return { "SPELL_ATTR9_SUMMON_PLAYER_TOTEM", "Ignore Totem Requirements for Casting", "" }; @@ -1484,7 +1484,7 @@ TC_API_EXPORT SpellAttr9 EnumUtils<SpellAttr9>::FromIndex(size_t index) { case 0: return SPELL_ATTR9_FORCE_DEST_LOCATION; case 1: return SPELL_ATTR9_MOD_INVIS_INCLUDES_PARTY; - case 2: return SPELL_ATTR9_RESTRICTED_FLIGHT_AREA; + case 2: return SPELL_ATTR9_ONLY_WHEN_ILLEGALLY_MOUNTED; case 3: return SPELL_ATTR9_UNK3; case 4: return SPELL_ATTR9_SPECIAL_DELAY_CALCULATION; case 5: return SPELL_ATTR9_SUMMON_PLAYER_TOTEM; @@ -1525,7 +1525,7 @@ TC_API_EXPORT size_t EnumUtils<SpellAttr9>::ToIndex(SpellAttr9 value) { case SPELL_ATTR9_FORCE_DEST_LOCATION: return 0; case SPELL_ATTR9_MOD_INVIS_INCLUDES_PARTY: return 1; - case SPELL_ATTR9_RESTRICTED_FLIGHT_AREA: return 2; + case SPELL_ATTR9_ONLY_WHEN_ILLEGALLY_MOUNTED: return 2; case SPELL_ATTR9_UNK3: return 3; case SPELL_ATTR9_SPECIAL_DELAY_CALCULATION: return 4; case SPELL_ATTR9_SUMMON_PLAYER_TOTEM: return 5; diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 43b6a4bf75e..ce064dcc5f1 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -5808,6 +5808,22 @@ SpellCastResult Spell::CheckCast(bool strict, int32* param1 /*= nullptr*/, int32 if (unitCaster->IsInCombat() && !m_spellInfo->CanBeUsedInCombat(unitCaster)) return SPELL_FAILED_AFFECTING_COMBAT; + + if (m_spellInfo->HasAttribute(SPELL_ATTR9_ONLY_WHEN_ILLEGALLY_MOUNTED)) + { + bool hasInvalidMountAura = std::ranges::any_of(unitCaster->GetAuraEffectsByType(SPELL_AURA_MOUNTED), [unitCaster](AuraEffect const* mountEffect) + { + uint32 mountType = mountEffect->GetSpellEffectInfo().MiscValueB; + if (MountEntry const* mountEntry = sDB2Manager.GetMount(mountEffect->GetId())) + mountType = mountEntry->MountTypeID; + + MountCapabilityEntry const* mountCapability = unitCaster->GetMountCapability(mountType); + return !mountCapability || mountCapability->ID != uint32(mountEffect->GetAmount()); + }); + + if (!hasInvalidMountAura) + return SPELL_FAILED_ONLY_MOUNTED; + } } // Check vehicle flags |