aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-06-11 00:55:22 +0200
committerOvahlord <dreadkiller@gmx.de>2024-06-20 01:19:33 +0200
commit0c0e451027d1d00913dcfcbe3d1babaee8946cf4 (patch)
treeba4db0685147e31139c114725fe2880ccd3a0736
parentbaadaa550e21d215bf7690d9bfa3336a48a772d0 (diff)
Core/Spells: Implemented SPELL_ATTR9_ONLY_WHEN_ILLEGALLY_MOUNTED
(cherry picked from commit 1f3af18e3a17096748a621c9171feb30047287be)
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h2
-rw-r--r--src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp6
-rw-r--r--src/server/game/Spells/Spell.cpp16
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