aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-06-11 20:12:24 +0200
committerShauren <shauren.trinity@gmail.com>2024-06-11 20:12:24 +0200
commit8142ab20b7495ca87a135e08e473f5a33a40e5a4 (patch)
tree3c18c85b1e7502df1b10b11293b4cfb3270689b5
parent56a027131a130bc778ee34ddfa379c42580b510b (diff)
Core/Spells: Implemented SPELL_ATTR9_IGNORE_TOTEM_REQUIREMENTS_FOR_CASTING - fixes some totems requiring legacy items in inventory
-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.cpp39
3 files changed, 17 insertions, 30 deletions
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h
index 5566107a7f7..33097fbec95 100644
--- a/src/server/game/Miscellaneous/SharedDefines.h
+++ b/src/server/game/Miscellaneous/SharedDefines.h
@@ -764,7 +764,7 @@ enum SpellAttr9 : uint32
SPELL_ATTR9_ONLY_WHEN_ILLEGALLY_MOUNTED = 0x00000004, // TITLE Only When Illegally Mounted
SPELL_ATTR9_DO_NOT_LOG_AURA_REFRESH = 0x00000008, // TITLE Do Not Log Aura Refresh (client only)
SPELL_ATTR9_MISSILE_SPEED_IS_DELAY_IN_SEC = 0x00000010, // TITLE Missile Speed is Delay (in sec)
- SPELL_ATTR9_SUMMON_PLAYER_TOTEM = 0x00000020, // TITLE Ignore Totem Requirements for Casting
+ SPELL_ATTR9_IGNORE_TOTEM_REQUIREMENTS_FOR_CASTING = 0x00000020, // TITLE Ignore Totem Requirements for Casting
SPELL_ATTR9_UNK6 = 0x00000040, // TITLE Unknown attribute 6@Attr9
SPELL_ATTR9_UNK7 = 0x00000080, // TITLE Unknown attribute 7@Attr9
SPELL_ATTR9_AIMED_SHOT = 0x00000100, // TITLE Cooldown Ignores Ranged Weapon
diff --git a/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp b/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp
index fb515d961a4..b5c772b539e 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_ONLY_WHEN_ILLEGALLY_MOUNTED: return { "SPELL_ATTR9_ONLY_WHEN_ILLEGALLY_MOUNTED", "Only When Illegally Mounted", "" };
case SPELL_ATTR9_DO_NOT_LOG_AURA_REFRESH: return { "SPELL_ATTR9_DO_NOT_LOG_AURA_REFRESH", "Do Not Log Aura Refresh (client only)", "" };
case SPELL_ATTR9_MISSILE_SPEED_IS_DELAY_IN_SEC: return { "SPELL_ATTR9_MISSILE_SPEED_IS_DELAY_IN_SEC", "Missile Speed is Delay (in sec)", "" };
- case SPELL_ATTR9_SUMMON_PLAYER_TOTEM: return { "SPELL_ATTR9_SUMMON_PLAYER_TOTEM", "Ignore Totem Requirements for Casting", "" };
+ case SPELL_ATTR9_IGNORE_TOTEM_REQUIREMENTS_FOR_CASTING: return { "SPELL_ATTR9_IGNORE_TOTEM_REQUIREMENTS_FOR_CASTING", "Ignore Totem Requirements for Casting", "" };
case SPELL_ATTR9_UNK6: return { "SPELL_ATTR9_UNK6", "Unknown attribute 6@Attr9", "" };
case SPELL_ATTR9_UNK7: return { "SPELL_ATTR9_UNK7", "Unknown attribute 7@Attr9", "" };
case SPELL_ATTR9_AIMED_SHOT: return { "SPELL_ATTR9_AIMED_SHOT", "Cooldown Ignores Ranged Weapon", "" };
@@ -1484,7 +1484,7 @@ TC_API_EXPORT SpellAttr9 EnumUtils<SpellAttr9>::FromIndex(size_t index)
case 2: return SPELL_ATTR9_ONLY_WHEN_ILLEGALLY_MOUNTED;
case 3: return SPELL_ATTR9_DO_NOT_LOG_AURA_REFRESH;
case 4: return SPELL_ATTR9_MISSILE_SPEED_IS_DELAY_IN_SEC;
- case 5: return SPELL_ATTR9_SUMMON_PLAYER_TOTEM;
+ case 5: return SPELL_ATTR9_IGNORE_TOTEM_REQUIREMENTS_FOR_CASTING;
case 6: return SPELL_ATTR9_UNK6;
case 7: return SPELL_ATTR9_UNK7;
case 8: return SPELL_ATTR9_AIMED_SHOT;
@@ -1525,7 +1525,7 @@ TC_API_EXPORT size_t EnumUtils<SpellAttr9>::ToIndex(SpellAttr9 value)
case SPELL_ATTR9_ONLY_WHEN_ILLEGALLY_MOUNTED: return 2;
case SPELL_ATTR9_DO_NOT_LOG_AURA_REFRESH: return 3;
case SPELL_ATTR9_MISSILE_SPEED_IS_DELAY_IN_SEC: return 4;
- case SPELL_ATTR9_SUMMON_PLAYER_TOTEM: return 5;
+ case SPELL_ATTR9_IGNORE_TOTEM_REQUIREMENTS_FOR_CASTING: return 5;
case SPELL_ATTR9_UNK6: return 6;
case SPELL_ATTR9_UNK7: return 7;
case SPELL_ATTR9_AIMED_SHOT: return 8;
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index b2bcf65ab10..5f74831c43a 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -7663,43 +7663,30 @@ SpellCastResult Spell::CheckItems(int32* param1 /*= nullptr*/, int32* param2 /*=
}
}
- // check totem-item requirements (items presence in inventory)
- uint32 totems = 2;
- for (uint8 i = 0; i < 2; ++i)
+ if (!m_spellInfo->HasAttribute(SPELL_ATTR9_IGNORE_TOTEM_REQUIREMENTS_FOR_CASTING))
{
- if (m_spellInfo->Totem[i] != 0)
+ // check totem-item requirements (items presence in inventory)
+ for (int32 totem : m_spellInfo->Totem)
{
- if (player->HasItemCount(m_spellInfo->Totem[i]))
+ if (totem && !player->HasItemCount(totem))
{
- totems -= 1;
- continue;
+ if (param1)
+ *param1 = totem;
+ return SPELL_FAILED_TOTEMS;
}
}
- else
- totems -= 1;
- }
-
- if (totems != 0)
- return SPELL_FAILED_TOTEMS;
- // Check items for TotemCategory (items presence in inventory)
- uint32 totemCategory = 2;
- for (uint8 i = 0; i < 2; ++i)
- {
- if (m_spellInfo->TotemCategory[i] != 0)
+ // Check items for TotemCategory (items presence in inventory)
+ for (int32 totemCategory : m_spellInfo->TotemCategory)
{
- if (player->HasItemTotemCategory(m_spellInfo->TotemCategory[i]))
+ if (totemCategory && !player->HasItemTotemCategory(totemCategory))
{
- totemCategory -= 1;
- continue;
+ if (param1)
+ *param1 = totemCategory;
+ return SPELL_FAILED_TOTEM_CATEGORY;
}
}
- else
- totemCategory -= 1;
}
-
- if (totemCategory != 0)
- return SPELL_FAILED_TOTEM_CATEGORY;
}
// special checks for spell effects