diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/common/Utilities/FuzzyFind.h | 53 | ||||
-rw-r--r-- | src/common/Utilities/SmartEnum.h | 116 | ||||
-rw-r--r-- | src/common/Utilities/Util.h | 6 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/CreatureData.h | 6 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/enuminfo_CreatureData.cpp | 116 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/UnitDefines.h | 90 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/enuminfo_UnitDefines.cpp | 344 | ||||
-rw-r--r-- | src/server/game/Miscellaneous/SharedDefines.h | 146 | ||||
-rw-r--r-- | src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp | 1676 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_npc.cpp | 209 |
10 files changed, 2471 insertions, 291 deletions
diff --git a/src/common/Utilities/FuzzyFind.h b/src/common/Utilities/FuzzyFind.h new file mode 100644 index 00000000000..e1c583af3b0 --- /dev/null +++ b/src/common/Utilities/FuzzyFind.h @@ -0,0 +1,53 @@ +/* + * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef TRINITY_FUZZYFIND_H +#define TRINITY_FUZZYFIND_H + +namespace Trinity +{ + namespace Containers + { + template <typename Container, typename NeedleContainer, typename ContainsOperator = bool(std::string const&, std::string const&), typename T = void> + auto FuzzyFindIn(Container const& container, NeedleContainer const& needles, ContainsOperator const& contains = StringContainsStringI, int(*bonus)(decltype((*std::begin(std::declval<Container>())))) = nullptr) + { + using IteratorResult = decltype((*std::begin(container))); + using MappedType = std::conditional_t<advstd::is_reference_v<IteratorResult>, std::reference_wrapper<std::remove_reference_t<IteratorResult>>, IteratorResult>; + std::multimap<size_t, MappedType, std::greater<size_t>> results; + + for (auto outerIt = std::begin(container), outerEnd = std::end(container); outerIt != outerEnd; ++outerIt) + { + size_t count = 0; + for (auto innerIt = std::begin(needles), innerEnd = std::end(needles); innerIt != innerEnd; ++innerIt) + if (contains(*outerIt, *innerIt)) + ++count; + + if (!count) + continue; + + if (bonus) + count += bonus(*outerIt); + + results.emplace(count, *outerIt); + } + + return results; + } + } +} + +#endif diff --git a/src/common/Utilities/SmartEnum.h b/src/common/Utilities/SmartEnum.h new file mode 100644 index 00000000000..0966469f454 --- /dev/null +++ b/src/common/Utilities/SmartEnum.h @@ -0,0 +1,116 @@ +/* + * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef TRINITY_SMARTENUM_H +#define TRINITY_SMARTENUM_H + +#include "IteratorPair.h" +#include <iterator> + +struct EnumText +{ + EnumText(char const* c, char const* t, char const* d) : Constant(c), Title(t), Description(d) {} + // Enum constant of the value + char const* const Constant; + // Human-readable title of the value + char const* const Title; + // Human-readable description of the value + char const* const Description; +}; + +namespace Trinity +{ + namespace Impl + { + template <typename Enum> + struct EnumUtils + { + static size_t Count(); + static EnumText ToString(Enum value); + static Enum FromIndex(size_t index); + }; + } +} + +class EnumUtils +{ + public: + template <typename Enum> + static size_t Count() { return Trinity::Impl::EnumUtils<Enum>::Count(); } + template <typename Enum> + static EnumText ToString(Enum value) { return Trinity::Impl::EnumUtils<Enum>::ToString(value); } + template <typename Enum> + static Enum FromIndex(size_t index) { return Trinity::Impl::EnumUtils<Enum>::FromIndex(index); } + + template <typename Enum> + class Iterator + { + public: + using iterator_category = std::random_access_iterator_tag; + using value_type = Enum; + using pointer = Enum*; + using reference = Enum&; + using difference_type = std::ptrdiff_t; + + Iterator() : _index(EnumUtils::Count<Enum>()) {} + explicit Iterator(size_t index) : _index(index) { } + + bool operator==(const Iterator& other) const { return other._index == _index; } + bool operator!=(const Iterator& other) const { return !operator==(other); } + difference_type operator-(Iterator const& other) const { return _index - other._index; } + bool operator<(const Iterator& other) const { return _index < other._index; } + bool operator<=(const Iterator& other) const { return _index <= other._index; } + bool operator>(const Iterator& other) const { return _index > other._index; } + bool operator>=(const Iterator& other) const { return _index >= other._index; } + + value_type operator[](difference_type d) const { return FromIndex<Enum>(_index + d); } + value_type operator*() const { return operator[](0); } + + Iterator& operator+=(difference_type d) { _index += d; return *this; } + Iterator& operator++() { return operator+=(1); } + Iterator operator++(int) { Iterator i = *this; operator++(); return i; } + Iterator operator+(difference_type d) const { Iterator i = *this; i += d; return i; } + + Iterator& operator-=(difference_type d) { _index -= d; return *this; } + Iterator& operator--() { return operator-=(1); } + Iterator operator--(int) { Iterator i = *this; operator--(); return i; } + Iterator operator-(difference_type d) const { Iterator i = *this; i -= d; return i; } + + private: + difference_type _index; + }; + + template <typename Enum> + static Iterator<Enum> Begin() { return Iterator<Enum>(0); } + + template <typename Enum> + static Iterator<Enum> End() { return Iterator<Enum>(); } + + template <typename Enum> + static Trinity::IteratorPair<Iterator<Enum>> Iterate() { return { Begin<Enum>(), End<Enum>() }; } + + template <typename Enum> + static char const* ToConstant(Enum value) { return ToString(value).Constant; } + + template <typename Enum> + static char const* ToTitle(Enum value) { return ToString(value).Title; } + + template <typename Enum> + static char const* ToDescription(Enum value) { return ToString(value).Description; } +}; + +#endif diff --git a/src/common/Utilities/Util.h b/src/common/Utilities/Util.h index 27dee721d16..a858a44b556 100644 --- a/src/common/Utilities/Util.h +++ b/src/common/Utilities/Util.h @@ -22,6 +22,7 @@ #include "Errors.h" #include <array> #include <string> +#include <utility> #include <vector> #include "advstd.h" @@ -351,6 +352,11 @@ TC_COMMON_API bool StringToBool(std::string const& str); TC_COMMON_API float DegToRad(float degrees); TC_COMMON_API bool StringContainsStringI(std::string const& haystack, std::string const& needle); +template <typename T> +inline bool ValueContainsStringI(std::pair<T, std::string> const& haystack, std::string const& needle) +{ + return StringContainsStringI(haystack.second, needle); +} // simple class for not-modifyable list template <typename T> diff --git a/src/server/game/Entities/Creature/CreatureData.h b/src/server/game/Entities/Creature/CreatureData.h index e0d68be0589..67e65cc53d2 100644 --- a/src/server/game/Entities/Creature/CreatureData.h +++ b/src/server/game/Entities/Creature/CreatureData.h @@ -18,6 +18,7 @@ #ifndef CreatureData_h__ #define CreatureData_h__ +#include "Common.h" #include "DBCEnums.h" #include "Optional.h" #include "SharedDefines.h" @@ -255,6 +256,7 @@ enum CreatureDifficultyFlags7 CREATURE_DIFFICULTYFLAGS_7_UNK1 = 0x00000008 }; +// EnumUtils: DESCRIBE THIS enum CreatureFlagsExtra : uint32 { CREATURE_FLAG_EXTRA_INSTANCE_BIND = 0x00000001, // creature kill bind instance with killer and killer's group @@ -293,9 +295,9 @@ enum CreatureFlagsExtra : uint32 // Masks CREATURE_FLAG_EXTRA_UNUSED = (CREATURE_FLAG_EXTRA_UNUSED_13 | CREATURE_FLAG_EXTRA_UNUSED_16 | CREATURE_FLAG_EXTRA_UNUSED_22 | CREATURE_FLAG_EXTRA_UNUSED_23 | CREATURE_FLAG_EXTRA_UNUSED_24 | CREATURE_FLAG_EXTRA_UNUSED_25 | - CREATURE_FLAG_EXTRA_UNUSED_26 | CREATURE_FLAG_EXTRA_UNUSED_27 | CREATURE_FLAG_EXTRA_UNUSED_31), + CREATURE_FLAG_EXTRA_UNUSED_26 | CREATURE_FLAG_EXTRA_UNUSED_27 | CREATURE_FLAG_EXTRA_UNUSED_31), // SKIP - CREATURE_FLAG_EXTRA_DB_ALLOWED = (0xFFFFFFFF & ~(CREATURE_FLAG_EXTRA_UNUSED | CREATURE_FLAG_EXTRA_DUNGEON_BOSS)) + CREATURE_FLAG_EXTRA_DB_ALLOWED = (0xFFFFFFFF & ~(CREATURE_FLAG_EXTRA_UNUSED | CREATURE_FLAG_EXTRA_DUNGEON_BOSS)) // SKIP }; enum class CreatureGroundMovementType : uint8 diff --git a/src/server/game/Entities/Creature/enuminfo_CreatureData.cpp b/src/server/game/Entities/Creature/enuminfo_CreatureData.cpp new file mode 100644 index 00000000000..8186f6815cf --- /dev/null +++ b/src/server/game/Entities/Creature/enuminfo_CreatureData.cpp @@ -0,0 +1,116 @@ +/* + * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "CreatureData.h" +#include "Define.h" +#include "SmartEnum.h" +#include <stdexcept> + +namespace Trinity +{ +namespace Impl +{ + +/*************************************************************************\ +|* data for enum 'CreatureFlagsExtra' in 'CreatureData.h' auto-generated *| +\*************************************************************************/ +template <> +TC_API_EXPORT EnumText EnumUtils<CreatureFlagsExtra>::ToString(CreatureFlagsExtra value) +{ + switch (value) + { + case CREATURE_FLAG_EXTRA_INSTANCE_BIND: return { "CREATURE_FLAG_EXTRA_INSTANCE_BIND", "CREATURE_FLAG_EXTRA_INSTANCE_BIND", "creature kill bind instance with killer and killer's group" }; + case CREATURE_FLAG_EXTRA_CIVILIAN: return { "CREATURE_FLAG_EXTRA_CIVILIAN", "CREATURE_FLAG_EXTRA_CIVILIAN", "not aggro (ignore faction/reputation hostility)" }; + case CREATURE_FLAG_EXTRA_NO_PARRY: return { "CREATURE_FLAG_EXTRA_NO_PARRY", "CREATURE_FLAG_EXTRA_NO_PARRY", "creature can't parry" }; + case CREATURE_FLAG_EXTRA_NO_PARRY_HASTEN: return { "CREATURE_FLAG_EXTRA_NO_PARRY_HASTEN", "CREATURE_FLAG_EXTRA_NO_PARRY_HASTEN", "creature can't counter-attack at parry" }; + case CREATURE_FLAG_EXTRA_NO_BLOCK: return { "CREATURE_FLAG_EXTRA_NO_BLOCK", "CREATURE_FLAG_EXTRA_NO_BLOCK", "creature can't block" }; + case CREATURE_FLAG_EXTRA_NO_CRUSH: return { "CREATURE_FLAG_EXTRA_NO_CRUSH", "CREATURE_FLAG_EXTRA_NO_CRUSH", "creature can't do crush attacks" }; + case CREATURE_FLAG_EXTRA_NO_XP_AT_KILL: return { "CREATURE_FLAG_EXTRA_NO_XP_AT_KILL", "CREATURE_FLAG_EXTRA_NO_XP_AT_KILL", "creature kill not provide XP" }; + case CREATURE_FLAG_EXTRA_TRIGGER: return { "CREATURE_FLAG_EXTRA_TRIGGER", "CREATURE_FLAG_EXTRA_TRIGGER", "trigger creature" }; + case CREATURE_FLAG_EXTRA_NO_TAUNT: return { "CREATURE_FLAG_EXTRA_NO_TAUNT", "CREATURE_FLAG_EXTRA_NO_TAUNT", "creature is immune to taunt auras and effect attack me" }; + case CREATURE_FLAG_EXTRA_NO_MOVE_FLAGS_UPDATE: return { "CREATURE_FLAG_EXTRA_NO_MOVE_FLAGS_UPDATE", "CREATURE_FLAG_EXTRA_NO_MOVE_FLAGS_UPDATE", "creature won't update movement flags" }; + case CREATURE_FLAG_EXTRA_GHOST_VISIBILITY: return { "CREATURE_FLAG_EXTRA_GHOST_VISIBILITY", "CREATURE_FLAG_EXTRA_GHOST_VISIBILITY", "creature will be only visible for dead players" }; + case CREATURE_FLAG_EXTRA_USE_OFFHAND_ATTACK: return { "CREATURE_FLAG_EXTRA_USE_OFFHAND_ATTACK", "CREATURE_FLAG_EXTRA_USE_OFFHAND_ATTACK", "creature will use offhand attacks" }; + case CREATURE_FLAG_EXTRA_NO_SELL_VENDOR: return { "CREATURE_FLAG_EXTRA_NO_SELL_VENDOR", "CREATURE_FLAG_EXTRA_NO_SELL_VENDOR", "players can't sell items to this vendor" }; + case CREATURE_FLAG_EXTRA_UNUSED_13: return { "CREATURE_FLAG_EXTRA_UNUSED_13", "CREATURE_FLAG_EXTRA_UNUSED_13", "" }; + case CREATURE_FLAG_EXTRA_WORLDEVENT: return { "CREATURE_FLAG_EXTRA_WORLDEVENT", "CREATURE_FLAG_EXTRA_WORLDEVENT", "custom flag for world event creatures (left room for merging)" }; + case CREATURE_FLAG_EXTRA_GUARD: return { "CREATURE_FLAG_EXTRA_GUARD", "CREATURE_FLAG_EXTRA_GUARD", "Creature is guard" }; + case CREATURE_FLAG_EXTRA_UNUSED_16: return { "CREATURE_FLAG_EXTRA_UNUSED_16", "CREATURE_FLAG_EXTRA_UNUSED_16", "" }; + case CREATURE_FLAG_EXTRA_NO_CRIT: return { "CREATURE_FLAG_EXTRA_NO_CRIT", "CREATURE_FLAG_EXTRA_NO_CRIT", "creature can't do critical strikes" }; + case CREATURE_FLAG_EXTRA_NO_SKILLGAIN: return { "CREATURE_FLAG_EXTRA_NO_SKILLGAIN", "CREATURE_FLAG_EXTRA_NO_SKILLGAIN", "creature won't increase weapon skills" }; + case CREATURE_FLAG_EXTRA_TAUNT_DIMINISH: return { "CREATURE_FLAG_EXTRA_TAUNT_DIMINISH", "CREATURE_FLAG_EXTRA_TAUNT_DIMINISH", "Taunt is a subject to diminishing returns on this creautre" }; + case CREATURE_FLAG_EXTRA_ALL_DIMINISH: return { "CREATURE_FLAG_EXTRA_ALL_DIMINISH", "CREATURE_FLAG_EXTRA_ALL_DIMINISH", "creature is subject to all diminishing returns as player are" }; + case CREATURE_FLAG_EXTRA_NO_PLAYER_DAMAGE_REQ: return { "CREATURE_FLAG_EXTRA_NO_PLAYER_DAMAGE_REQ", "CREATURE_FLAG_EXTRA_NO_PLAYER_DAMAGE_REQ", "creature does not need to take player damage for kill credit" }; + case CREATURE_FLAG_EXTRA_UNUSED_22: return { "CREATURE_FLAG_EXTRA_UNUSED_22", "CREATURE_FLAG_EXTRA_UNUSED_22", "" }; + case CREATURE_FLAG_EXTRA_UNUSED_23: return { "CREATURE_FLAG_EXTRA_UNUSED_23", "CREATURE_FLAG_EXTRA_UNUSED_23", "" }; + case CREATURE_FLAG_EXTRA_UNUSED_24: return { "CREATURE_FLAG_EXTRA_UNUSED_24", "CREATURE_FLAG_EXTRA_UNUSED_24", "" }; + case CREATURE_FLAG_EXTRA_UNUSED_25: return { "CREATURE_FLAG_EXTRA_UNUSED_25", "CREATURE_FLAG_EXTRA_UNUSED_25", "" }; + case CREATURE_FLAG_EXTRA_UNUSED_26: return { "CREATURE_FLAG_EXTRA_UNUSED_26", "CREATURE_FLAG_EXTRA_UNUSED_26", "" }; + case CREATURE_FLAG_EXTRA_UNUSED_27: return { "CREATURE_FLAG_EXTRA_UNUSED_27", "CREATURE_FLAG_EXTRA_UNUSED_27", "" }; + case CREATURE_FLAG_EXTRA_DUNGEON_BOSS: return { "CREATURE_FLAG_EXTRA_DUNGEON_BOSS", "CREATURE_FLAG_EXTRA_DUNGEON_BOSS", "creature is a dungeon boss (SET DYNAMICALLY, DO NOT ADD IN DB)" }; + case CREATURE_FLAG_EXTRA_IGNORE_PATHFINDING: return { "CREATURE_FLAG_EXTRA_IGNORE_PATHFINDING", "CREATURE_FLAG_EXTRA_IGNORE_PATHFINDING", "creature ignore pathfinding" }; + case CREATURE_FLAG_EXTRA_IMMUNITY_KNOCKBACK: return { "CREATURE_FLAG_EXTRA_IMMUNITY_KNOCKBACK", "CREATURE_FLAG_EXTRA_IMMUNITY_KNOCKBACK", "creature is immune to knockback effects" }; + case CREATURE_FLAG_EXTRA_UNUSED_31: return { "CREATURE_FLAG_EXTRA_UNUSED_31", "CREATURE_FLAG_EXTRA_UNUSED_31", "" }; + default: throw std::out_of_range("value"); + } +} + +template <> +TC_API_EXPORT size_t EnumUtils<CreatureFlagsExtra>::Count() { return 32; } + +template <> +TC_API_EXPORT CreatureFlagsExtra EnumUtils<CreatureFlagsExtra>::FromIndex(size_t index) +{ + switch (index) + { + case 0: return CREATURE_FLAG_EXTRA_INSTANCE_BIND; + case 1: return CREATURE_FLAG_EXTRA_CIVILIAN; + case 2: return CREATURE_FLAG_EXTRA_NO_PARRY; + case 3: return CREATURE_FLAG_EXTRA_NO_PARRY_HASTEN; + case 4: return CREATURE_FLAG_EXTRA_NO_BLOCK; + case 5: return CREATURE_FLAG_EXTRA_NO_CRUSH; + case 6: return CREATURE_FLAG_EXTRA_NO_XP_AT_KILL; + case 7: return CREATURE_FLAG_EXTRA_TRIGGER; + case 8: return CREATURE_FLAG_EXTRA_NO_TAUNT; + case 9: return CREATURE_FLAG_EXTRA_NO_MOVE_FLAGS_UPDATE; + case 10: return CREATURE_FLAG_EXTRA_GHOST_VISIBILITY; + case 11: return CREATURE_FLAG_EXTRA_USE_OFFHAND_ATTACK; + case 12: return CREATURE_FLAG_EXTRA_NO_SELL_VENDOR; + case 13: return CREATURE_FLAG_EXTRA_UNUSED_13; + case 14: return CREATURE_FLAG_EXTRA_WORLDEVENT; + case 15: return CREATURE_FLAG_EXTRA_GUARD; + case 16: return CREATURE_FLAG_EXTRA_UNUSED_16; + case 17: return CREATURE_FLAG_EXTRA_NO_CRIT; + case 18: return CREATURE_FLAG_EXTRA_NO_SKILLGAIN; + case 19: return CREATURE_FLAG_EXTRA_TAUNT_DIMINISH; + case 20: return CREATURE_FLAG_EXTRA_ALL_DIMINISH; + case 21: return CREATURE_FLAG_EXTRA_NO_PLAYER_DAMAGE_REQ; + case 22: return CREATURE_FLAG_EXTRA_UNUSED_22; + case 23: return CREATURE_FLAG_EXTRA_UNUSED_23; + case 24: return CREATURE_FLAG_EXTRA_UNUSED_24; + case 25: return CREATURE_FLAG_EXTRA_UNUSED_25; + case 26: return CREATURE_FLAG_EXTRA_UNUSED_26; + case 27: return CREATURE_FLAG_EXTRA_UNUSED_27; + case 28: return CREATURE_FLAG_EXTRA_DUNGEON_BOSS; + case 29: return CREATURE_FLAG_EXTRA_IGNORE_PATHFINDING; + case 30: return CREATURE_FLAG_EXTRA_IMMUNITY_KNOCKBACK; + case 31: return CREATURE_FLAG_EXTRA_UNUSED_31; + default: throw std::out_of_range("index"); + } +} +} +} diff --git a/src/server/game/Entities/Unit/UnitDefines.h b/src/server/game/Entities/Unit/UnitDefines.h index a4841929d07..c94eaded6fd 100644 --- a/src/server/game/Entities/Unit/UnitDefines.h +++ b/src/server/game/Entities/Unit/UnitDefines.h @@ -114,6 +114,7 @@ enum UnitMoveType #define MAX_MOVE_TYPE 9 // Value masks for UNIT_FIELD_FLAGS +// EnumUtils: DESCRIBE THIS enum UnitFlags : uint32 { UNIT_FLAG_SERVER_CONTROLLED = 0x00000001, // set only when unit movement is controlled by server - by SPLINE/MONSTER_MOVE packets, together with UNIT_FLAG_STUNNED; only set to units controlled by client; client function CGUnit_C::IsClientControlled returns false when set for owner @@ -148,10 +149,10 @@ enum UnitFlags : uint32 UNIT_FLAG_UNK_29 = 0x20000000, // used in Feing Death spell UNIT_FLAG_SHEATHE = 0x40000000, UNIT_FLAG_UNK_31 = 0x80000000, - MAX_UNIT_FLAGS = 32 }; // Value masks for UNIT_FIELD_FLAGS_2 +// EnumUtils: DESCRIBE THIS enum UnitFlags2 : uint32 { UNIT_FLAG2_FEIGN_DEATH = 0x00000001, @@ -174,68 +175,69 @@ enum UnitFlags2 : uint32 UNIT_FLAG2_PLAY_DEATH_ANIM = 0x00020000, // Plays special death animation upon death UNIT_FLAG2_ALLOW_CHEAT_SPELLS = 0x00040000, // Allows casting spells with AttributesEx7 & SPELL_ATTR7_IS_CHEAT_SPELL UNIT_FLAG2_NO_ACTIONS = 0x00800000, - MAX_UNIT_FLAGS_2 = 19 }; // Value masks for UNIT_FIELD_FLAGS_3 +// EnumUtils: DESCRIBE THIS enum UnitFlags3 : uint32 { UNIT_FLAG3_UNK1 = 0x00000001, - MAX_UNIT_FLAGS_3 = 1 }; /// Non Player Character flags +// EnumUtils: DESCRIBE THIS enum NPCFlags : uint32 { UNIT_NPC_FLAG_NONE = 0x00000000, - UNIT_NPC_FLAG_GOSSIP = 0x00000001, // 100% - UNIT_NPC_FLAG_QUESTGIVER = 0x00000002, // 100% + UNIT_NPC_FLAG_GOSSIP = 0x00000001, // TITLE has gossip menu DESCRIPTION 100% + UNIT_NPC_FLAG_QUESTGIVER = 0x00000002, // TITLE is quest giver DESCRIPTION 100% UNIT_NPC_FLAG_UNK1 = 0x00000004, UNIT_NPC_FLAG_UNK2 = 0x00000008, - UNIT_NPC_FLAG_TRAINER = 0x00000010, // 100% - UNIT_NPC_FLAG_TRAINER_CLASS = 0x00000020, // 100% - UNIT_NPC_FLAG_TRAINER_PROFESSION = 0x00000040, // 100% - UNIT_NPC_FLAG_VENDOR = 0x00000080, // 100% - UNIT_NPC_FLAG_VENDOR_AMMO = 0x00000100, // 100%, general goods vendor - UNIT_NPC_FLAG_VENDOR_FOOD = 0x00000200, // 100% - UNIT_NPC_FLAG_VENDOR_POISON = 0x00000400, // guessed - UNIT_NPC_FLAG_VENDOR_REAGENT = 0x00000800, // 100% - UNIT_NPC_FLAG_REPAIR = 0x00001000, // 100% - UNIT_NPC_FLAG_FLIGHTMASTER = 0x00002000, // 100% - UNIT_NPC_FLAG_SPIRITHEALER = 0x00004000, // guessed - UNIT_NPC_FLAG_SPIRITGUIDE = 0x00008000, // guessed - UNIT_NPC_FLAG_INNKEEPER = 0x00010000, // 100% - UNIT_NPC_FLAG_BANKER = 0x00020000, // 100% - UNIT_NPC_FLAG_PETITIONER = 0x00040000, // 100% 0xC0000 = guild petitions, 0x40000 = arena team petitions - UNIT_NPC_FLAG_TABARDDESIGNER = 0x00080000, // 100% - UNIT_NPC_FLAG_BATTLEMASTER = 0x00100000, // 100% - UNIT_NPC_FLAG_AUCTIONEER = 0x00200000, // 100% - UNIT_NPC_FLAG_STABLEMASTER = 0x00400000, // 100% - UNIT_NPC_FLAG_GUILD_BANKER = 0x00800000, // - UNIT_NPC_FLAG_SPELLCLICK = 0x01000000, // - UNIT_NPC_FLAG_PLAYER_VEHICLE = 0x02000000, // players with mounts that have vehicle data should have it set - UNIT_NPC_FLAG_MAILBOX = 0x04000000, // mailbox - UNIT_NPC_FLAG_ARTIFACT_POWER_RESPEC = 0x08000000, // artifact powers reset - UNIT_NPC_FLAG_TRANSMOGRIFIER = 0x10000000, // transmogrification - UNIT_NPC_FLAG_VAULTKEEPER = 0x20000000, // void storage - UNIT_NPC_FLAG_WILD_BATTLE_PET = 0x40000000, // Pet that player can fight (Battle Pet) - UNIT_NPC_FLAG_BLACK_MARKET = 0x80000000 // black market + UNIT_NPC_FLAG_TRAINER = 0x00000010, // TITLE is trainer DESCRIPTION 100% + UNIT_NPC_FLAG_TRAINER_CLASS = 0x00000020, // TITLE is class trainer DESCRIPTION 100% + UNIT_NPC_FLAG_TRAINER_PROFESSION = 0x00000040, // TITLE is profession trainer DESCRIPTION 100% + UNIT_NPC_FLAG_VENDOR = 0x00000080, // TITLE is vendor (generic) DESCRIPTION 100% + UNIT_NPC_FLAG_VENDOR_AMMO = 0x00000100, // TITLE is vendor (ammo) DESCRIPTION 100%, general goods vendor + UNIT_NPC_FLAG_VENDOR_FOOD = 0x00000200, // TITLE is vendor (food) DESCRIPTION 100% + UNIT_NPC_FLAG_VENDOR_POISON = 0x00000400, // TITLE is vendor (poison) DESCRIPTION guessed + UNIT_NPC_FLAG_VENDOR_REAGENT = 0x00000800, // TITLE is vendor (reagents) DESCRIPTION 100% + UNIT_NPC_FLAG_REPAIR = 0x00001000, // TITLE can repair DESCRIPTION 100% + UNIT_NPC_FLAG_FLIGHTMASTER = 0x00002000, // TITLE is flight master DESCRIPTION 100% + UNIT_NPC_FLAG_SPIRITHEALER = 0x00004000, // TITLE is spirit healer DESCRIPTION guessed + UNIT_NPC_FLAG_SPIRITGUIDE = 0x00008000, // TITLE is spirit guide DESCRIPTION guessed + UNIT_NPC_FLAG_INNKEEPER = 0x00010000, // TITLE is innkeeper + UNIT_NPC_FLAG_BANKER = 0x00020000, // TITLE is banker DESCRIPTION 100% + UNIT_NPC_FLAG_PETITIONER = 0x00040000, // TITLE handles guild/arena petitions DESCRIPTION 100% 0xC0000 = guild petitions, 0x40000 = arena team petitions + UNIT_NPC_FLAG_TABARDDESIGNER = 0x00080000, // TITLE is guild tabard designer DESCRIPTION 100% + UNIT_NPC_FLAG_BATTLEMASTER = 0x00100000, // TITLE is battlemaster DESCRIPTION 100% + UNIT_NPC_FLAG_AUCTIONEER = 0x00200000, // TITLE is auctioneer DESCRIPTION 100% + UNIT_NPC_FLAG_STABLEMASTER = 0x00400000, // TITLE is stable master DESCRIPTION 100% + UNIT_NPC_FLAG_GUILD_BANKER = 0x00800000, // TITLE is guild banker DESCRIPTION + UNIT_NPC_FLAG_SPELLCLICK = 0x01000000, // TITLE has spell click enabled + UNIT_NPC_FLAG_PLAYER_VEHICLE = 0x02000000, // TITLE is player vehicle DESCRIPTION players with mounts that have vehicle data should have it set + UNIT_NPC_FLAG_MAILBOX = 0x04000000, // TITLE is mailbox + UNIT_NPC_FLAG_ARTIFACT_POWER_RESPEC = 0x08000000, // TITLE can reset artifact powers + UNIT_NPC_FLAG_TRANSMOGRIFIER = 0x10000000, // TITLE transmogrification + UNIT_NPC_FLAG_VAULTKEEPER = 0x20000000, // TITLE is void storage + UNIT_NPC_FLAG_WILD_BATTLE_PET = 0x40000000, // TITLE is wild battle pet DESCRIPTION Pet that player can fight (Battle Pet) + UNIT_NPC_FLAG_BLACK_MARKET = 0x80000000 // TITLE is black market }; +// EnumUtils: DESCRIBE THIS enum NPCFlags2 : uint32 { UNIT_NPC_FLAG_2_NONE = 0x0000, - UNIT_NPC_FLAG_2_ITEM_UPGRADE_MASTER = 0x0001, - UNIT_NPC_FLAG_2_GARRISON_ARCHITECT = 0x0002, - UNIT_NPC_FLAG_2_STEERING = 0x0004, - UNIT_NPC_FLAG_2_SHIPMENT_CRAFTER = 0x0010, - UNIT_NPC_FLAG_2_GARRISON_MISSION_NPC = 0x0020, - UNIT_NPC_FLAG_2_TRADESKILL_NPC = 0x0040, - UNIT_NPC_FLAG_2_BLACK_MARKET_VIEW = 0x0080, - UNIT_NPC_FLAG_2_GARRISON_TALENT_NPC = 0x0200, - UNIT_NPC_FLAG_2_CONTRIBUTION_COLLECTOR = 0x0400, - UNIT_NPC_FLAG_2_AZERITE_RESPEC = 0x4000, - UNIT_NPC_FLAG_2_ISLANDS_QUEUE = 0x8000, + UNIT_NPC_FLAG_2_ITEM_UPGRADE_MASTER = 0x0001, // TITLE is item upgrade + UNIT_NPC_FLAG_2_GARRISON_ARCHITECT = 0x0002, // TITLE is garrison architect DESCRIPTION garrison building placement UI + UNIT_NPC_FLAG_2_STEERING = 0x0004, // TITLE is avoiding obstacles DESCRIPTION clientside pathfinding + UNIT_NPC_FLAG_2_SHIPMENT_CRAFTER = 0x0010, // TITLE is shipment crafter DESCRIPTION garrison work orders + UNIT_NPC_FLAG_2_GARRISON_MISSION_NPC = 0x0020, // TITLE is garrison mission + UNIT_NPC_FLAG_2_TRADESKILL_NPC = 0x0040, // TITLE is tradeskill DESCRIPTION crafting at npc + UNIT_NPC_FLAG_2_BLACK_MARKET_VIEW = 0x0080, // TITLE is black market view DESCRIPTION only allows viewing black market auctions, no bidding + UNIT_NPC_FLAG_2_GARRISON_TALENT_NPC = 0x0200, // TITLE is garrrison talent + UNIT_NPC_FLAG_2_CONTRIBUTION_COLLECTOR = 0x0400, // TITLE is contribution collector + UNIT_NPC_FLAG_2_AZERITE_RESPEC = 0x4000, // TITLE is azerite respec + UNIT_NPC_FLAG_2_ISLANDS_QUEUE = 0x8000, // TITLE is islands queue }; enum MovementFlags : uint32 diff --git a/src/server/game/Entities/Unit/enuminfo_UnitDefines.cpp b/src/server/game/Entities/Unit/enuminfo_UnitDefines.cpp new file mode 100644 index 00000000000..958a5cdfe07 --- /dev/null +++ b/src/server/game/Entities/Unit/enuminfo_UnitDefines.cpp @@ -0,0 +1,344 @@ +/* + * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "UnitDefines.h" +#include "Define.h" +#include "SmartEnum.h" +#include <stdexcept> + +namespace Trinity +{ +namespace Impl +{ + +/***************************************************************\ +|* data for enum 'UnitFlags' in 'UnitDefines.h' auto-generated *| +\***************************************************************/ +template <> +TC_API_EXPORT EnumText EnumUtils<UnitFlags>::ToString(UnitFlags value) +{ + switch (value) + { + case UNIT_FLAG_SERVER_CONTROLLED: return { "UNIT_FLAG_SERVER_CONTROLLED", "UNIT_FLAG_SERVER_CONTROLLED", "set only when unit movement is controlled by server - by SPLINE/MONSTER_MOVE packets, together with UNIT_FLAG_STUNNED; only set to units controlled by client; client function CGUnit_C::IsClientControlled returns false when set for owner" }; + case UNIT_FLAG_NON_ATTACKABLE: return { "UNIT_FLAG_NON_ATTACKABLE", "UNIT_FLAG_NON_ATTACKABLE", "not attackable" }; + case UNIT_FLAG_REMOVE_CLIENT_CONTROL: return { "UNIT_FLAG_REMOVE_CLIENT_CONTROL", "UNIT_FLAG_REMOVE_CLIENT_CONTROL", "This is a legacy flag used to disable movement player's movement while controlling other units, SMSG_CLIENT_CONTROL replaces this functionality clientside now. CONFUSED and FLEEING flags have the same effect on client movement asDISABLE_MOVE_CONTROL in addition to preventing spell casts/autoattack (they all allow climbing steeper hills and emotes while moving)" }; + case UNIT_FLAG_PLAYER_CONTROLLED: return { "UNIT_FLAG_PLAYER_CONTROLLED", "UNIT_FLAG_PLAYER_CONTROLLED", "controlled by player, use _IMMUNE_TO_PC instead of _IMMUNE_TO_NPC" }; + case UNIT_FLAG_RENAME: return { "UNIT_FLAG_RENAME", "UNIT_FLAG_RENAME", "" }; + case UNIT_FLAG_PREPARATION: return { "UNIT_FLAG_PREPARATION", "UNIT_FLAG_PREPARATION", "don't take reagents for spells with SPELL_ATTR5_NO_REAGENT_WHILE_PREP" }; + case UNIT_FLAG_UNK_6: return { "UNIT_FLAG_UNK_6", "UNIT_FLAG_UNK_6", "" }; + case UNIT_FLAG_NOT_ATTACKABLE_1: return { "UNIT_FLAG_NOT_ATTACKABLE_1", "UNIT_FLAG_NOT_ATTACKABLE_1", "?? (UNIT_FLAG_PLAYER_CONTROLLED | UNIT_FLAG_NOT_ATTACKABLE_1) is NON_PVP_ATTACKABLE" }; + case UNIT_FLAG_IMMUNE_TO_PC: return { "UNIT_FLAG_IMMUNE_TO_PC", "UNIT_FLAG_IMMUNE_TO_PC", "disables combat/assistance with PlayerCharacters (PC) - see Unit::IsValidAttackTarget, Unit::IsValidAssistTarget" }; + case UNIT_FLAG_IMMUNE_TO_NPC: return { "UNIT_FLAG_IMMUNE_TO_NPC", "UNIT_FLAG_IMMUNE_TO_NPC", "disables combat/assistance with NonPlayerCharacters (NPC) - see Unit::IsValidAttackTarget, Unit::IsValidAssistTarget" }; + case UNIT_FLAG_LOOTING: return { "UNIT_FLAG_LOOTING", "UNIT_FLAG_LOOTING", "loot animation" }; + case UNIT_FLAG_PET_IN_COMBAT: return { "UNIT_FLAG_PET_IN_COMBAT", "UNIT_FLAG_PET_IN_COMBAT", "on player pets: whether the pet is chasing a target to attack || on other units: whether any of the unit's minions is in combat" }; + case UNIT_FLAG_PVP: return { "UNIT_FLAG_PVP", "UNIT_FLAG_PVP", "changed in 3.0.3" }; + case UNIT_FLAG_SILENCED: return { "UNIT_FLAG_SILENCED", "UNIT_FLAG_SILENCED", "silenced, 2.1.1" }; + case UNIT_FLAG_CANNOT_SWIM: return { "UNIT_FLAG_CANNOT_SWIM", "UNIT_FLAG_CANNOT_SWIM", "2.0.8" }; + case UNIT_FLAG_UNK_15: return { "UNIT_FLAG_UNK_15", "UNIT_FLAG_UNK_15", "" }; + case UNIT_FLAG_NON_ATTACKABLE_2: return { "UNIT_FLAG_NON_ATTACKABLE_2", "UNIT_FLAG_NON_ATTACKABLE_2", "removes attackable icon, if on yourself, cannot assist self but can cast TARGET_SELF spells - added by SPELL_AURA_MOD_UNATTACKABLE" }; + case UNIT_FLAG_PACIFIED: return { "UNIT_FLAG_PACIFIED", "UNIT_FLAG_PACIFIED", "3.0.3 ok" }; + case UNIT_FLAG_STUNNED: return { "UNIT_FLAG_STUNNED", "UNIT_FLAG_STUNNED", "3.0.3 ok" }; + case UNIT_FLAG_IN_COMBAT: return { "UNIT_FLAG_IN_COMBAT", "UNIT_FLAG_IN_COMBAT", "" }; + case UNIT_FLAG_TAXI_FLIGHT: return { "UNIT_FLAG_TAXI_FLIGHT", "UNIT_FLAG_TAXI_FLIGHT", "disable casting at client side spell not allowed by taxi flight (mounted?), probably used with 0x4 flag" }; + case UNIT_FLAG_DISARMED: return { "UNIT_FLAG_DISARMED", "UNIT_FLAG_DISARMED", "3.0.3, disable melee spells casting..., \042Required melee weapon\042 added to melee spells tooltip." }; + case UNIT_FLAG_CONFUSED: return { "UNIT_FLAG_CONFUSED", "UNIT_FLAG_CONFUSED", "" }; + case UNIT_FLAG_FLEEING: return { "UNIT_FLAG_FLEEING", "UNIT_FLAG_FLEEING", "" }; + case UNIT_FLAG_POSSESSED: return { "UNIT_FLAG_POSSESSED", "UNIT_FLAG_POSSESSED", "under direct client control by a player (possess or vehicle)" }; + case UNIT_FLAG_NOT_SELECTABLE: return { "UNIT_FLAG_NOT_SELECTABLE", "UNIT_FLAG_NOT_SELECTABLE", "" }; + case UNIT_FLAG_SKINNABLE: return { "UNIT_FLAG_SKINNABLE", "UNIT_FLAG_SKINNABLE", "" }; + case UNIT_FLAG_MOUNT: return { "UNIT_FLAG_MOUNT", "UNIT_FLAG_MOUNT", "" }; + case UNIT_FLAG_UNK_28: return { "UNIT_FLAG_UNK_28", "UNIT_FLAG_UNK_28", "" }; + case UNIT_FLAG_UNK_29: return { "UNIT_FLAG_UNK_29", "UNIT_FLAG_UNK_29", "used in Feing Death spell" }; + case UNIT_FLAG_SHEATHE: return { "UNIT_FLAG_SHEATHE", "UNIT_FLAG_SHEATHE", "" }; + case UNIT_FLAG_UNK_31: return { "UNIT_FLAG_UNK_31", "UNIT_FLAG_UNK_31", "" }; + default: throw std::out_of_range("value"); + } +} + +template <> +TC_API_EXPORT size_t EnumUtils<UnitFlags>::Count() { return 32; } + +template <> +TC_API_EXPORT UnitFlags EnumUtils<UnitFlags>::FromIndex(size_t index) +{ + switch (index) + { + case 0: return UNIT_FLAG_SERVER_CONTROLLED; + case 1: return UNIT_FLAG_NON_ATTACKABLE; + case 2: return UNIT_FLAG_REMOVE_CLIENT_CONTROL; + case 3: return UNIT_FLAG_PLAYER_CONTROLLED; + case 4: return UNIT_FLAG_RENAME; + case 5: return UNIT_FLAG_PREPARATION; + case 6: return UNIT_FLAG_UNK_6; + case 7: return UNIT_FLAG_NOT_ATTACKABLE_1; + case 8: return UNIT_FLAG_IMMUNE_TO_PC; + case 9: return UNIT_FLAG_IMMUNE_TO_NPC; + case 10: return UNIT_FLAG_LOOTING; + case 11: return UNIT_FLAG_PET_IN_COMBAT; + case 12: return UNIT_FLAG_PVP; + case 13: return UNIT_FLAG_SILENCED; + case 14: return UNIT_FLAG_CANNOT_SWIM; + case 15: return UNIT_FLAG_UNK_15; + case 16: return UNIT_FLAG_NON_ATTACKABLE_2; + case 17: return UNIT_FLAG_PACIFIED; + case 18: return UNIT_FLAG_STUNNED; + case 19: return UNIT_FLAG_IN_COMBAT; + case 20: return UNIT_FLAG_TAXI_FLIGHT; + case 21: return UNIT_FLAG_DISARMED; + case 22: return UNIT_FLAG_CONFUSED; + case 23: return UNIT_FLAG_FLEEING; + case 24: return UNIT_FLAG_POSSESSED; + case 25: return UNIT_FLAG_NOT_SELECTABLE; + case 26: return UNIT_FLAG_SKINNABLE; + case 27: return UNIT_FLAG_MOUNT; + case 28: return UNIT_FLAG_UNK_28; + case 29: return UNIT_FLAG_UNK_29; + case 30: return UNIT_FLAG_SHEATHE; + case 31: return UNIT_FLAG_UNK_31; + default: throw std::out_of_range("index"); + } +} + +/****************************************************************\ +|* data for enum 'UnitFlags2' in 'UnitDefines.h' auto-generated *| +\****************************************************************/ +template <> +TC_API_EXPORT EnumText EnumUtils<UnitFlags2>::ToString(UnitFlags2 value) +{ + switch (value) + { + case UNIT_FLAG2_FEIGN_DEATH: return { "UNIT_FLAG2_FEIGN_DEATH", "UNIT_FLAG2_FEIGN_DEATH", "" }; + case UNIT_FLAG2_UNK1: return { "UNIT_FLAG2_UNK1", "UNIT_FLAG2_UNK1", "Hide unit model (show only player equip)" }; + case UNIT_FLAG2_IGNORE_REPUTATION: return { "UNIT_FLAG2_IGNORE_REPUTATION", "UNIT_FLAG2_IGNORE_REPUTATION", "" }; + case UNIT_FLAG2_COMPREHEND_LANG: return { "UNIT_FLAG2_COMPREHEND_LANG", "UNIT_FLAG2_COMPREHEND_LANG", "" }; + case UNIT_FLAG2_MIRROR_IMAGE: return { "UNIT_FLAG2_MIRROR_IMAGE", "UNIT_FLAG2_MIRROR_IMAGE", "" }; + case UNIT_FLAG2_INSTANTLY_APPEAR_MODEL: return { "UNIT_FLAG2_INSTANTLY_APPEAR_MODEL", "UNIT_FLAG2_INSTANTLY_APPEAR_MODEL", "Unit model instantly appears when summoned (does not fade in)" }; + case UNIT_FLAG2_FORCE_MOVEMENT: return { "UNIT_FLAG2_FORCE_MOVEMENT", "UNIT_FLAG2_FORCE_MOVEMENT", "" }; + case UNIT_FLAG2_DISARM_OFFHAND: return { "UNIT_FLAG2_DISARM_OFFHAND", "UNIT_FLAG2_DISARM_OFFHAND", "" }; + case UNIT_FLAG2_DISABLE_PRED_STATS: return { "UNIT_FLAG2_DISABLE_PRED_STATS", "UNIT_FLAG2_DISABLE_PRED_STATS", "Player has disabled predicted stats (Used by raid frames)" }; + case UNIT_FLAG2_ALLOW_CHANGING_TALENTS: return { "UNIT_FLAG2_ALLOW_CHANGING_TALENTS", "UNIT_FLAG2_ALLOW_CHANGING_TALENTS", "Allows changing talents outside rest area" }; + case UNIT_FLAG2_DISARM_RANGED: return { "UNIT_FLAG2_DISARM_RANGED", "UNIT_FLAG2_DISARM_RANGED", "this does not disable ranged weapon display (maybe additional flag needed?)" }; + case UNIT_FLAG2_REGENERATE_POWER: return { "UNIT_FLAG2_REGENERATE_POWER", "UNIT_FLAG2_REGENERATE_POWER", "" }; + case UNIT_FLAG2_RESTRICT_PARTY_INTERACTION: return { "UNIT_FLAG2_RESTRICT_PARTY_INTERACTION", "UNIT_FLAG2_RESTRICT_PARTY_INTERACTION", "Restrict interaction to party or raid" }; + case UNIT_FLAG2_PREVENT_SPELL_CLICK: return { "UNIT_FLAG2_PREVENT_SPELL_CLICK", "UNIT_FLAG2_PREVENT_SPELL_CLICK", "Prevent spellclick" }; + case UNIT_FLAG2_ALLOW_ENEMY_INTERACT: return { "UNIT_FLAG2_ALLOW_ENEMY_INTERACT", "UNIT_FLAG2_ALLOW_ENEMY_INTERACT", "" }; + case UNIT_FLAG2_DISABLE_TURN: return { "UNIT_FLAG2_DISABLE_TURN", "UNIT_FLAG2_DISABLE_TURN", "" }; + case UNIT_FLAG2_UNK2: return { "UNIT_FLAG2_UNK2", "UNIT_FLAG2_UNK2", "" }; + case UNIT_FLAG2_PLAY_DEATH_ANIM: return { "UNIT_FLAG2_PLAY_DEATH_ANIM", "UNIT_FLAG2_PLAY_DEATH_ANIM", "Plays special death animation upon death" }; + case UNIT_FLAG2_ALLOW_CHEAT_SPELLS: return { "UNIT_FLAG2_ALLOW_CHEAT_SPELLS", "UNIT_FLAG2_ALLOW_CHEAT_SPELLS", "Allows casting spells with AttributesEx7 & SPELL_ATTR7_IS_CHEAT_SPELL" }; + case UNIT_FLAG2_NO_ACTIONS: return { "UNIT_FLAG2_NO_ACTIONS", "UNIT_FLAG2_NO_ACTIONS", "" }; + default: throw std::out_of_range("value"); + } +} + +template <> +TC_API_EXPORT size_t EnumUtils<UnitFlags2>::Count() { return 20; } + +template <> +TC_API_EXPORT UnitFlags2 EnumUtils<UnitFlags2>::FromIndex(size_t index) +{ + switch (index) + { + case 0: return UNIT_FLAG2_FEIGN_DEATH; + case 1: return UNIT_FLAG2_UNK1; + case 2: return UNIT_FLAG2_IGNORE_REPUTATION; + case 3: return UNIT_FLAG2_COMPREHEND_LANG; + case 4: return UNIT_FLAG2_MIRROR_IMAGE; + case 5: return UNIT_FLAG2_INSTANTLY_APPEAR_MODEL; + case 6: return UNIT_FLAG2_FORCE_MOVEMENT; + case 7: return UNIT_FLAG2_DISARM_OFFHAND; + case 8: return UNIT_FLAG2_DISABLE_PRED_STATS; + case 9: return UNIT_FLAG2_ALLOW_CHANGING_TALENTS; + case 10: return UNIT_FLAG2_DISARM_RANGED; + case 11: return UNIT_FLAG2_REGENERATE_POWER; + case 12: return UNIT_FLAG2_RESTRICT_PARTY_INTERACTION; + case 13: return UNIT_FLAG2_PREVENT_SPELL_CLICK; + case 14: return UNIT_FLAG2_ALLOW_ENEMY_INTERACT; + case 15: return UNIT_FLAG2_DISABLE_TURN; + case 16: return UNIT_FLAG2_UNK2; + case 17: return UNIT_FLAG2_PLAY_DEATH_ANIM; + case 18: return UNIT_FLAG2_ALLOW_CHEAT_SPELLS; + case 19: return UNIT_FLAG2_NO_ACTIONS; + default: throw std::out_of_range("index"); + } +} + +/****************************************************************\ +|* data for enum 'UnitFlags3' in 'UnitDefines.h' auto-generated *| +\****************************************************************/ +template <> +TC_API_EXPORT EnumText EnumUtils<UnitFlags3>::ToString(UnitFlags3 value) +{ + switch (value) + { + case UNIT_FLAG3_UNK1: return { "UNIT_FLAG3_UNK1", "UNIT_FLAG3_UNK1", "" }; + default: throw std::out_of_range("value"); + } +} + +template <> +TC_API_EXPORT size_t EnumUtils<UnitFlags3>::Count() { return 1; } + +template <> +TC_API_EXPORT UnitFlags3 EnumUtils<UnitFlags3>::FromIndex(size_t index) +{ + switch (index) + { + case 0: return UNIT_FLAG3_UNK1; + default: throw std::out_of_range("index"); + } +} + +/**************************************************************\ +|* data for enum 'NPCFlags' in 'UnitDefines.h' auto-generated *| +\**************************************************************/ +template <> +TC_API_EXPORT EnumText EnumUtils<NPCFlags>::ToString(NPCFlags value) +{ + switch (value) + { + case UNIT_NPC_FLAG_NONE: return { "UNIT_NPC_FLAG_NONE", "UNIT_NPC_FLAG_NONE", "" }; + case UNIT_NPC_FLAG_GOSSIP: return { "UNIT_NPC_FLAG_GOSSIP", "has gossip menu", "100%" }; + case UNIT_NPC_FLAG_QUESTGIVER: return { "UNIT_NPC_FLAG_QUESTGIVER", "is quest giver", "100%" }; + case UNIT_NPC_FLAG_UNK1: return { "UNIT_NPC_FLAG_UNK1", "UNIT_NPC_FLAG_UNK1", "" }; + case UNIT_NPC_FLAG_UNK2: return { "UNIT_NPC_FLAG_UNK2", "UNIT_NPC_FLAG_UNK2", "" }; + case UNIT_NPC_FLAG_TRAINER: return { "UNIT_NPC_FLAG_TRAINER", "is trainer", "100%" }; + case UNIT_NPC_FLAG_TRAINER_CLASS: return { "UNIT_NPC_FLAG_TRAINER_CLASS", "is class trainer", "100%" }; + case UNIT_NPC_FLAG_TRAINER_PROFESSION: return { "UNIT_NPC_FLAG_TRAINER_PROFESSION", "is profession trainer", "100%" }; + case UNIT_NPC_FLAG_VENDOR: return { "UNIT_NPC_FLAG_VENDOR", "is vendor (generic)", "100%" }; + case UNIT_NPC_FLAG_VENDOR_AMMO: return { "UNIT_NPC_FLAG_VENDOR_AMMO", "is vendor (ammo)", "100%, general goods vendor" }; + case UNIT_NPC_FLAG_VENDOR_FOOD: return { "UNIT_NPC_FLAG_VENDOR_FOOD", "is vendor (food)", "100%" }; + case UNIT_NPC_FLAG_VENDOR_POISON: return { "UNIT_NPC_FLAG_VENDOR_POISON", "is vendor (poison)", "guessed" }; + case UNIT_NPC_FLAG_VENDOR_REAGENT: return { "UNIT_NPC_FLAG_VENDOR_REAGENT", "is vendor (reagents)", "100%" }; + case UNIT_NPC_FLAG_REPAIR: return { "UNIT_NPC_FLAG_REPAIR", "can repair", "100%" }; + case UNIT_NPC_FLAG_FLIGHTMASTER: return { "UNIT_NPC_FLAG_FLIGHTMASTER", "is flight master", "100%" }; + case UNIT_NPC_FLAG_SPIRITHEALER: return { "UNIT_NPC_FLAG_SPIRITHEALER", "is spirit healer", "guessed" }; + case UNIT_NPC_FLAG_SPIRITGUIDE: return { "UNIT_NPC_FLAG_SPIRITGUIDE", "is spirit guide", "guessed" }; + case UNIT_NPC_FLAG_INNKEEPER: return { "UNIT_NPC_FLAG_INNKEEPER", "is innkeeper", "" }; + case UNIT_NPC_FLAG_BANKER: return { "UNIT_NPC_FLAG_BANKER", "is banker", "100%" }; + case UNIT_NPC_FLAG_PETITIONER: return { "UNIT_NPC_FLAG_PETITIONER", "handles guild/arena petitions", "100% 0xC0000 = guild petitions, 0x40000 = arena team petitions" }; + case UNIT_NPC_FLAG_TABARDDESIGNER: return { "UNIT_NPC_FLAG_TABARDDESIGNER", "is guild tabard designer", "100%" }; + case UNIT_NPC_FLAG_BATTLEMASTER: return { "UNIT_NPC_FLAG_BATTLEMASTER", "is battlemaster", "100%" }; + case UNIT_NPC_FLAG_AUCTIONEER: return { "UNIT_NPC_FLAG_AUCTIONEER", "is auctioneer", "100%" }; + case UNIT_NPC_FLAG_STABLEMASTER: return { "UNIT_NPC_FLAG_STABLEMASTER", "is stable master", "100%" }; + case UNIT_NPC_FLAG_GUILD_BANKER: return { "UNIT_NPC_FLAG_GUILD_BANKER", "is guild banker DESCRIPTION", "" }; + case UNIT_NPC_FLAG_SPELLCLICK: return { "UNIT_NPC_FLAG_SPELLCLICK", "has spell click enabled", "" }; + case UNIT_NPC_FLAG_PLAYER_VEHICLE: return { "UNIT_NPC_FLAG_PLAYER_VEHICLE", "is player vehicle", "players with mounts that have vehicle data should have it set" }; + case UNIT_NPC_FLAG_MAILBOX: return { "UNIT_NPC_FLAG_MAILBOX", "is mailbox", "" }; + case UNIT_NPC_FLAG_ARTIFACT_POWER_RESPEC: return { "UNIT_NPC_FLAG_ARTIFACT_POWER_RESPEC", "can reset artifact powers", "" }; + case UNIT_NPC_FLAG_TRANSMOGRIFIER: return { "UNIT_NPC_FLAG_TRANSMOGRIFIER", "transmogrification", "" }; + case UNIT_NPC_FLAG_VAULTKEEPER: return { "UNIT_NPC_FLAG_VAULTKEEPER", "is void storage", "" }; + case UNIT_NPC_FLAG_WILD_BATTLE_PET: return { "UNIT_NPC_FLAG_WILD_BATTLE_PET", "is wild battle pet", "Pet that player can fight (Battle Pet)" }; + case UNIT_NPC_FLAG_BLACK_MARKET: return { "UNIT_NPC_FLAG_BLACK_MARKET", "is black market", "" }; + default: throw std::out_of_range("value"); + } +} + +template <> +TC_API_EXPORT size_t EnumUtils<NPCFlags>::Count() { return 33; } + +template <> +TC_API_EXPORT NPCFlags EnumUtils<NPCFlags>::FromIndex(size_t index) +{ + switch (index) + { + case 0: return UNIT_NPC_FLAG_NONE; + case 1: return UNIT_NPC_FLAG_GOSSIP; + case 2: return UNIT_NPC_FLAG_QUESTGIVER; + case 3: return UNIT_NPC_FLAG_UNK1; + case 4: return UNIT_NPC_FLAG_UNK2; + case 5: return UNIT_NPC_FLAG_TRAINER; + case 6: return UNIT_NPC_FLAG_TRAINER_CLASS; + case 7: return UNIT_NPC_FLAG_TRAINER_PROFESSION; + case 8: return UNIT_NPC_FLAG_VENDOR; + case 9: return UNIT_NPC_FLAG_VENDOR_AMMO; + case 10: return UNIT_NPC_FLAG_VENDOR_FOOD; + case 11: return UNIT_NPC_FLAG_VENDOR_POISON; + case 12: return UNIT_NPC_FLAG_VENDOR_REAGENT; + case 13: return UNIT_NPC_FLAG_REPAIR; + case 14: return UNIT_NPC_FLAG_FLIGHTMASTER; + case 15: return UNIT_NPC_FLAG_SPIRITHEALER; + case 16: return UNIT_NPC_FLAG_SPIRITGUIDE; + case 17: return UNIT_NPC_FLAG_INNKEEPER; + case 18: return UNIT_NPC_FLAG_BANKER; + case 19: return UNIT_NPC_FLAG_PETITIONER; + case 20: return UNIT_NPC_FLAG_TABARDDESIGNER; + case 21: return UNIT_NPC_FLAG_BATTLEMASTER; + case 22: return UNIT_NPC_FLAG_AUCTIONEER; + case 23: return UNIT_NPC_FLAG_STABLEMASTER; + case 24: return UNIT_NPC_FLAG_GUILD_BANKER; + case 25: return UNIT_NPC_FLAG_SPELLCLICK; + case 26: return UNIT_NPC_FLAG_PLAYER_VEHICLE; + case 27: return UNIT_NPC_FLAG_MAILBOX; + case 28: return UNIT_NPC_FLAG_ARTIFACT_POWER_RESPEC; + case 29: return UNIT_NPC_FLAG_TRANSMOGRIFIER; + case 30: return UNIT_NPC_FLAG_VAULTKEEPER; + case 31: return UNIT_NPC_FLAG_WILD_BATTLE_PET; + case 32: return UNIT_NPC_FLAG_BLACK_MARKET; + default: throw std::out_of_range("index"); + } +} + +/***************************************************************\ +|* data for enum 'NPCFlags2' in 'UnitDefines.h' auto-generated *| +\***************************************************************/ +template <> +TC_API_EXPORT EnumText EnumUtils<NPCFlags2>::ToString(NPCFlags2 value) +{ + switch (value) + { + case UNIT_NPC_FLAG_2_NONE: return { "UNIT_NPC_FLAG_2_NONE", "UNIT_NPC_FLAG_2_NONE", "" }; + case UNIT_NPC_FLAG_2_ITEM_UPGRADE_MASTER: return { "UNIT_NPC_FLAG_2_ITEM_UPGRADE_MASTER", "is item upgrade", "" }; + case UNIT_NPC_FLAG_2_GARRISON_ARCHITECT: return { "UNIT_NPC_FLAG_2_GARRISON_ARCHITECT", "is garrison architect", "garrison building placement UI" }; + case UNIT_NPC_FLAG_2_STEERING: return { "UNIT_NPC_FLAG_2_STEERING", "is avoiding obstacles", "clientside pathfinding" }; + case UNIT_NPC_FLAG_2_SHIPMENT_CRAFTER: return { "UNIT_NPC_FLAG_2_SHIPMENT_CRAFTER", "is shipment crafter", "garrison work orders" }; + case UNIT_NPC_FLAG_2_GARRISON_MISSION_NPC: return { "UNIT_NPC_FLAG_2_GARRISON_MISSION_NPC", "is garrison mission", "" }; + case UNIT_NPC_FLAG_2_TRADESKILL_NPC: return { "UNIT_NPC_FLAG_2_TRADESKILL_NPC", "is tradeskill", "crafting at npc" }; + case UNIT_NPC_FLAG_2_BLACK_MARKET_VIEW: return { "UNIT_NPC_FLAG_2_BLACK_MARKET_VIEW", "is black market view", "only allows viewing black market auctions, no bidding" }; + case UNIT_NPC_FLAG_2_GARRISON_TALENT_NPC: return { "UNIT_NPC_FLAG_2_GARRISON_TALENT_NPC", "is garrrison talent", "" }; + case UNIT_NPC_FLAG_2_CONTRIBUTION_COLLECTOR: return { "UNIT_NPC_FLAG_2_CONTRIBUTION_COLLECTOR", "is contribution collector", "" }; + case UNIT_NPC_FLAG_2_AZERITE_RESPEC: return { "UNIT_NPC_FLAG_2_AZERITE_RESPEC", "is azerite respec", "" }; + case UNIT_NPC_FLAG_2_ISLANDS_QUEUE: return { "UNIT_NPC_FLAG_2_ISLANDS_QUEUE", "is islands queue", "" }; + default: throw std::out_of_range("value"); + } +} + +template <> +TC_API_EXPORT size_t EnumUtils<NPCFlags2>::Count() { return 12; } + +template <> +TC_API_EXPORT NPCFlags2 EnumUtils<NPCFlags2>::FromIndex(size_t index) +{ + switch (index) + { + case 0: return UNIT_NPC_FLAG_2_NONE; + case 1: return UNIT_NPC_FLAG_2_ITEM_UPGRADE_MASTER; + case 2: return UNIT_NPC_FLAG_2_GARRISON_ARCHITECT; + case 3: return UNIT_NPC_FLAG_2_STEERING; + case 4: return UNIT_NPC_FLAG_2_SHIPMENT_CRAFTER; + case 5: return UNIT_NPC_FLAG_2_GARRISON_MISSION_NPC; + case 6: return UNIT_NPC_FLAG_2_TRADESKILL_NPC; + case 7: return UNIT_NPC_FLAG_2_BLACK_MARKET_VIEW; + case 8: return UNIT_NPC_FLAG_2_GARRISON_TALENT_NPC; + case 9: return UNIT_NPC_FLAG_2_CONTRIBUTION_COLLECTOR; + case 10: return UNIT_NPC_FLAG_2_AZERITE_RESPEC; + case 11: return UNIT_NPC_FLAG_2_ISLANDS_QUEUE; + default: throw std::out_of_range("index"); + } +} +} +} diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 1bb91d32dc8..7dd5520bde7 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -20,6 +20,7 @@ #include "Define.h" #include "DetourNavMesh.h" +#include "SmartEnum.h" float const GROUND_HEIGHT_TOLERANCE = 0.05f; // Extra tolerance to z position to check if it is in air or on ground. @@ -260,44 +261,46 @@ enum Stats : uint16 #define MAX_STATS 4 +// EnumUtils: DESCRIBE THIS enum Powers : int8 { - POWER_MANA = 0, - POWER_RAGE = 1, - POWER_FOCUS = 2, - POWER_ENERGY = 3, - POWER_COMBO_POINTS = 4, - POWER_RUNES = 5, - POWER_RUNIC_POWER = 6, - POWER_SOUL_SHARDS = 7, - POWER_LUNAR_POWER = 8, - POWER_HOLY_POWER = 9, - POWER_ALTERNATE_POWER = 10, // Used in some quests - POWER_MAELSTROM = 11, - POWER_CHI = 12, - POWER_INSANITY = 13, - POWER_BURNING_EMBERS = 14, - POWER_DEMONIC_FURY = 15, - POWER_ARCANE_CHARGES = 16, - POWER_FURY = 17, - POWER_PAIN = 18, - MAX_POWERS = 19, - POWER_ALL = 127, // default for class? - POWER_HEALTH = -2 // (-2 as signed value) + POWER_HEALTH = -2, // TITLE Health + POWER_MANA = 0, // TITLE Mana + POWER_RAGE = 1, // TITLE Rage + POWER_FOCUS = 2, // TITLE Focus + POWER_ENERGY = 3, // TITLE Energy + POWER_COMBO_POINTS = 4, // TITLE Combo Points + POWER_RUNES = 5, // TITLE Runes + POWER_RUNIC_POWER = 6, // TITLE Runic Power + POWER_SOUL_SHARDS = 7, // TITLE Soul Shards + POWER_LUNAR_POWER = 8, // TITLE Lunar Power + POWER_HOLY_POWER = 9, // TITLE Holy Power + POWER_ALTERNATE_POWER = 10, // TITLE Alternate + POWER_MAELSTROM = 11, // TITLE Maelstrom + POWER_CHI = 12, // TITLE Chi + POWER_INSANITY = 13, // TITLE Insanity + POWER_BURNING_EMBERS = 14, // TITLE Burning Embers (Obsolete) + POWER_DEMONIC_FURY = 15, // TITLE Demonic Fury (Obsolete) + POWER_ARCANE_CHARGES = 16, // TITLE Arcane Charges + POWER_FURY = 17, // TITLE Fury + POWER_PAIN = 18, // TITLE Pain + MAX_POWERS = 19, // SKIP + POWER_ALL = 127 // SKIP }; #define MAX_POWERS_PER_CLASS 7 +// EnumUtils: DESCRIBE THIS enum SpellSchools : uint16 { - SPELL_SCHOOL_NORMAL = 0, - SPELL_SCHOOL_HOLY = 1, - SPELL_SCHOOL_FIRE = 2, - SPELL_SCHOOL_NATURE = 3, - SPELL_SCHOOL_FROST = 4, - SPELL_SCHOOL_SHADOW = 5, - SPELL_SCHOOL_ARCANE = 6, - MAX_SPELL_SCHOOL = 7 + SPELL_SCHOOL_NORMAL = 0, // TITLE Physical + SPELL_SCHOOL_HOLY = 1, // TITLE Holy + SPELL_SCHOOL_FIRE = 2, // TITLE Fire + SPELL_SCHOOL_NATURE = 3, // TITLE Nature + SPELL_SCHOOL_FROST = 4, // TITLE Frost + SPELL_SCHOOL_SHADOW = 5, // TITLE Shadow + SPELL_SCHOOL_ARCANE = 6, // TITLE Arcane + MAX_SPELL_SCHOOL = 7 // SKIP }; enum SpellSchoolMask : uint32 @@ -324,11 +327,16 @@ enum SpellSchoolMask : uint32 SPELL_SCHOOL_MASK_ALL = (SPELL_SCHOOL_MASK_NORMAL | SPELL_SCHOOL_MASK_MAGIC) }; +constexpr SpellSchoolMask GetMaskForSchool(SpellSchools school) +{ + return SpellSchoolMask(1 << school); +} + inline SpellSchools GetFirstSchoolInMask(SpellSchoolMask mask) { - for (int i = 0; i < MAX_SPELL_SCHOOL; ++i) - if (mask & (1 << i)) - return SpellSchools(i); + for (SpellSchools school : EnumUtils::Iterate<SpellSchools>()) + if (mask & GetMaskForSchool(school)) + return school; return SPELL_SCHOOL_NORMAL; } @@ -386,6 +394,7 @@ uint32 constexpr QuestDifficultyColors[MAX_QUEST_DIFFICULTY] = // Spell Attributes definitions // *********************************** +// EnumUtils: DESCRIBE THIS enum SpellAttr0 { SPELL_ATTR0_UNK0 = 0x00000001, // 0 @@ -422,6 +431,7 @@ enum SpellAttr0 SPELL_ATTR0_CANT_CANCEL = 0x80000000 // 31 positive aura can't be canceled }; +// EnumUtils: DESCRIBE THIS enum SpellAttr1 { SPELL_ATTR1_DISMISS_PET = 0x00000001, // 0 for spells without this flag client doesn't allow to summon pet if caster has a pet @@ -458,6 +468,7 @@ enum SpellAttr1 SPELL_ATTR1_UNK31 = 0x80000000 // 31 }; +// EnumUtils: DESCRIBE THIS enum SpellAttr2 { SPELL_ATTR2_CAN_TARGET_DEAD = 0x00000001, // 0 can target dead unit or corpse @@ -494,6 +505,7 @@ enum SpellAttr2 SPELL_ATTR2_FOOD_BUFF = 0x80000000 // 31 Food or Drink Buff (like Well Fed) }; +// EnumUtils: DESCRIBE THIS enum SpellAttr3 { SPELL_ATTR3_UNK0 = 0x00000001, // 0 @@ -530,6 +542,7 @@ enum SpellAttr3 SPELL_ATTR3_UNK31 = 0x80000000 // 31 }; +// EnumUtils: DESCRIBE THIS enum SpellAttr4 { SPELL_ATTR4_IGNORE_RESISTANCES = 0x00000001, // 0 spells with this attribute will completely ignore the target's resistance (these spells can't be resisted) @@ -566,6 +579,7 @@ enum SpellAttr4 SPELL_ATTR4_UNK31 = 0x80000000 // 31 Polymorph (chicken) 228 and Sonic Boom (38052, 38488) }; +// EnumUtils: DESCRIBE THIS enum SpellAttr5 { SPELL_ATTR5_CAN_CHANNEL_WHEN_MOVING = 0x00000001, // 0 available casting channel spell when moving @@ -602,6 +616,7 @@ enum SpellAttr5 SPELL_ATTR5_UNK31 = 0x80000000 // 31 Forces all nearby enemies to focus attacks caster }; +// EnumUtils: DESCRIBE THIS enum SpellAttr6 { SPELL_ATTR6_DONT_DISPLAY_COOLDOWN = 0x00000001, // 0 client doesn't display cooldown in tooltip for these spells @@ -638,6 +653,7 @@ enum SpellAttr6 SPELL_ATTR6_IGNORE_CATEGORY_COOLDOWN_MODS = 0x80000000 // 31 Spells with this attribute skip applying modifiers to category cooldowns }; +// EnumUtils: DESCRIBE THIS enum SpellAttr7 { SPELL_ATTR7_UNK0 = 0x00000001, // 0 Shaman's new spells (Call of the ...), Feign Death. @@ -674,6 +690,7 @@ enum SpellAttr7 SPELL_ATTR7_CLIENT_INDICATOR = 0x80000000 }; +// EnumUtils: DESCRIBE THIS enum SpellAttr8 { SPELL_ATTR8_CANT_MISS = 0x00000001, // 0 @@ -710,6 +727,7 @@ enum SpellAttr8 SPELL_ATTR8_ATTACK_IGNORE_IMMUNE_TO_PC_FLAG = 0x80000000 // 31 Do not check UNIT_FLAG_IMMUNE_TO_PC in IsValidAttackTarget }; +// EnumUtils: DESCRIBE THIS enum SpellAttr9 { SPELL_ATTR9_UNK0 = 0x00000001, // 0 @@ -746,6 +764,7 @@ enum SpellAttr9 SPELL_ATTR9_UNK31 = 0x80000000 // 31 }; +// EnumUtils: DESCRIBE THIS enum SpellAttr10 { SPELL_ATTR10_UNK0 = 0x00000001, // 0 @@ -782,6 +801,7 @@ enum SpellAttr10 SPELL_ATTR10_UNK31 = 0x80000000 // 31 }; +// EnumUtils: DESCRIBE THIS enum SpellAttr11 { SPELL_ATTR11_UNK0 = 0x00000001, // 0 @@ -818,6 +838,7 @@ enum SpellAttr11 SPELL_ATTR11_UNK31 = 0x80000000 // 31 }; +// EnumUtils: DESCRIBE THIS enum SpellAttr12 { SPELL_ATTR12_UNK0 = 0x00000001, // 0 @@ -854,6 +875,7 @@ enum SpellAttr12 SPELL_ATTR12_UNK31 = 0x80000000 // 31 }; +// EnumUtils: DESCRIBE THIS enum SpellAttr13 { SPELL_ATTR13_UNK0 = 0x00000001, // 0 @@ -890,6 +912,7 @@ enum SpellAttr13 SPELL_ATTR13_UNK31 = 0x80000000 // 31 }; +// EnumUtils: DESCRIBE THIS enum SpellAttr14 { SPELL_ATTR14_UNK0 = 0x00000001, // 0 @@ -2388,6 +2411,7 @@ enum AuraStateType (1<<(AURA_STATE_RAID_ENCOUNTER_2-1))|(1<<(AURA_STATE_ROGUE_POISONED-1))) // Spell mechanics +// EnumUtils: DESCRIBE THIS enum Mechanics : uint32 { MECHANIC_NONE = 0, @@ -2423,7 +2447,7 @@ enum Mechanics : uint32 MECHANIC_SAPPED = 30, MECHANIC_ENRAGED = 31, MECHANIC_WOUNDED = 32, - MAX_MECHANIC = 33 + MAX_MECHANIC = 33 // SKIP }; // Used for spell 42292 Immune Movement Impairment and Loss of Control (0x49967ca6) @@ -2653,19 +2677,22 @@ enum SpellHitType SPELL_HIT_TYPE_NO_ATTACKER = 0x80, // does the same as SPELL_ATTR4_COMBAT_LOG_NO_CASTER }; +// EnumUtils: DESCRIBE THIS enum SpellDmgClass { - SPELL_DAMAGE_CLASS_NONE = 0, - SPELL_DAMAGE_CLASS_MAGIC = 1, - SPELL_DAMAGE_CLASS_MELEE = 2, - SPELL_DAMAGE_CLASS_RANGED = 3 + SPELL_DAMAGE_CLASS_NONE = 0, // TITLE None + SPELL_DAMAGE_CLASS_MAGIC = 1, // TITLE Magic + SPELL_DAMAGE_CLASS_MELEE = 2, // TITLE Melee + SPELL_DAMAGE_CLASS_RANGED = 3 // TITLE Ranged }; +// EnumUtils: DESCRIBE THIS enum SpellPreventionType { - SPELL_PREVENTION_TYPE_SILENCE = 1, - SPELL_PREVENTION_TYPE_PACIFY = 2, - SPELL_PREVENTION_TYPE_NO_ACTIONS = 4 + SPELL_PREVENTION_TYPE_NONE = 0, // TITLE None + SPELL_PREVENTION_TYPE_SILENCE = 1, // TITLE Silence + SPELL_PREVENTION_TYPE_PACIFY = 2, // TITLE Pacify + SPELL_PREVENTION_TYPE_NO_ACTIONS = 4 // TITLE No actions }; enum GameobjectTypes : uint8 @@ -5095,7 +5122,7 @@ enum QuestSort QUEST_SORT_LEGENDARY_CRAFTING = 596 }; -inline uint8 ClassByQuestSort(int32 QuestSort) +constexpr uint8 ClassByQuestSort(int32 QuestSort) { switch (QuestSort) { @@ -5452,7 +5479,7 @@ enum SkillType SKILL_PET_CAMEL = 2807 }; -inline SkillType SkillByLockType(LockType locktype) +constexpr SkillType SkillByLockType(LockType locktype) { switch (locktype) { @@ -5483,7 +5510,7 @@ inline SkillType SkillByLockType(LockType locktype) return SKILL_NONE; } -inline uint32 SkillByQuestSort(int32 QuestSort) +constexpr uint32 SkillByQuestSort(int32 QuestSort) { switch (QuestSort) { @@ -6112,26 +6139,27 @@ enum MailResponseResult MAIL_ERR_ITEM_HAS_EXPIRED = 21 }; +// EnumUtils: DESCRIBE THIS enum SpellFamilyNames : uint8 { - SPELLFAMILY_GENERIC = 0, - SPELLFAMILY_EVENTS = 1, // events, holidays + SPELLFAMILY_GENERIC = 0, // TITLE Generic + SPELLFAMILY_UNK1 = 1, // TITLE Unk1 (events, holidays, ...) // 2 - unused - SPELLFAMILY_MAGE = 3, - SPELLFAMILY_WARRIOR = 4, - SPELLFAMILY_WARLOCK = 5, - SPELLFAMILY_PRIEST = 6, - SPELLFAMILY_DRUID = 7, - SPELLFAMILY_ROGUE = 8, - SPELLFAMILY_HUNTER = 9, - SPELLFAMILY_PALADIN = 10, - SPELLFAMILY_SHAMAN = 11, - SPELLFAMILY_UNK12 = 12, // 2 spells (silence resistance) - SPELLFAMILY_POTION = 13, + SPELLFAMILY_MAGE = 3, // TITLE Mage + SPELLFAMILY_WARRIOR = 4, // TITLE Warrior + SPELLFAMILY_WARLOCK = 5, // TITLE Warlock + SPELLFAMILY_PRIEST = 6, // TITLE Priest + SPELLFAMILY_DRUID = 7, // TITLE Druid + SPELLFAMILY_ROGUE = 8, // TITLE Rogue + SPELLFAMILY_HUNTER = 9, // TITLE Hunter + SPELLFAMILY_PALADIN = 10, // TITLE Paladin + SPELLFAMILY_SHAMAN = 11, // TITLE Shaman + SPELLFAMILY_UNK2 = 12, // TITLE Unk2 (Silence resistance?) + SPELLFAMILY_POTION = 13, // TITLE Potion // 14 - unused - SPELLFAMILY_DEATHKNIGHT = 15, + SPELLFAMILY_DEATHKNIGHT = 15, // TITLE Death Knight // 16 - unused - SPELLFAMILY_PET = 17, + SPELLFAMILY_PET = 17, // TITLE Pet SPELLFAMILY_TOTEMS = 50, SPELLFAMILY_MONK = 53, SPELLFAMILY_WARLOCK_PET = 57, diff --git a/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp b/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp new file mode 100644 index 00000000000..e9c195030d8 --- /dev/null +++ b/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp @@ -0,0 +1,1676 @@ +/* + * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "SharedDefines.h" +#include "Define.h" +#include "SmartEnum.h" +#include <stdexcept> + +namespace Trinity +{ +namespace Impl +{ + +/**************************************************************\ +|* data for enum 'Powers' in 'SharedDefines.h' auto-generated *| +\**************************************************************/ +template <> +TC_API_EXPORT EnumText EnumUtils<Powers>::ToString(Powers value) +{ + switch (value) + { + case POWER_HEALTH: return { "POWER_HEALTH", "Health", "" }; + case POWER_MANA: return { "POWER_MANA", "Mana", "" }; + case POWER_RAGE: return { "POWER_RAGE", "Rage", "" }; + case POWER_FOCUS: return { "POWER_FOCUS", "Focus", "" }; + case POWER_ENERGY: return { "POWER_ENERGY", "Energy", "" }; + case POWER_COMBO_POINTS: return { "POWER_COMBO_POINTS", "Combo Points", "" }; + case POWER_RUNES: return { "POWER_RUNES", "Runes", "" }; + case POWER_RUNIC_POWER: return { "POWER_RUNIC_POWER", "Runic Power", "" }; + case POWER_SOUL_SHARDS: return { "POWER_SOUL_SHARDS", "Soul Shards", "" }; + case POWER_LUNAR_POWER: return { "POWER_LUNAR_POWER", "Lunar Power", "" }; + case POWER_HOLY_POWER: return { "POWER_HOLY_POWER", "Holy Power", "" }; + case POWER_ALTERNATE_POWER: return { "POWER_ALTERNATE_POWER", "Alternate", "" }; + case POWER_MAELSTROM: return { "POWER_MAELSTROM", "Maelstrom", "" }; + case POWER_CHI: return { "POWER_CHI", "Chi", "" }; + case POWER_INSANITY: return { "POWER_INSANITY", "Insanity", "" }; + case POWER_BURNING_EMBERS: return { "POWER_BURNING_EMBERS", "Burning Embers (Obsolete)", "" }; + case POWER_DEMONIC_FURY: return { "POWER_DEMONIC_FURY", "Demonic Fury (Obsolete)", "" }; + case POWER_ARCANE_CHARGES: return { "POWER_ARCANE_CHARGES", "Arcane Charges", "" }; + case POWER_FURY: return { "POWER_FURY", "Fury", "" }; + case POWER_PAIN: return { "POWER_PAIN", "Pain", "" }; + default: throw std::out_of_range("value"); + } +} + +template <> +TC_API_EXPORT size_t EnumUtils<Powers>::Count() { return 20; } + +template <> +TC_API_EXPORT Powers EnumUtils<Powers>::FromIndex(size_t index) +{ + switch (index) + { + case 0: return POWER_HEALTH; + case 1: return POWER_MANA; + case 2: return POWER_RAGE; + case 3: return POWER_FOCUS; + case 4: return POWER_ENERGY; + case 5: return POWER_COMBO_POINTS; + case 6: return POWER_RUNES; + case 7: return POWER_RUNIC_POWER; + case 8: return POWER_SOUL_SHARDS; + case 9: return POWER_LUNAR_POWER; + case 10: return POWER_HOLY_POWER; + case 11: return POWER_ALTERNATE_POWER; + case 12: return POWER_MAELSTROM; + case 13: return POWER_CHI; + case 14: return POWER_INSANITY; + case 15: return POWER_BURNING_EMBERS; + case 16: return POWER_DEMONIC_FURY; + case 17: return POWER_ARCANE_CHARGES; + case 18: return POWER_FURY; + case 19: return POWER_PAIN; + default: throw std::out_of_range("index"); + } +} + +/********************************************************************\ +|* data for enum 'SpellSchools' in 'SharedDefines.h' auto-generated *| +\********************************************************************/ +template <> +TC_API_EXPORT EnumText EnumUtils<SpellSchools>::ToString(SpellSchools value) +{ + switch (value) + { + case SPELL_SCHOOL_NORMAL: return { "SPELL_SCHOOL_NORMAL", "Physical", "" }; + case SPELL_SCHOOL_HOLY: return { "SPELL_SCHOOL_HOLY", "Holy", "" }; + case SPELL_SCHOOL_FIRE: return { "SPELL_SCHOOL_FIRE", "Fire", "" }; + case SPELL_SCHOOL_NATURE: return { "SPELL_SCHOOL_NATURE", "Nature", "" }; + case SPELL_SCHOOL_FROST: return { "SPELL_SCHOOL_FROST", "Frost", "" }; + case SPELL_SCHOOL_SHADOW: return { "SPELL_SCHOOL_SHADOW", "Shadow", "" }; + case SPELL_SCHOOL_ARCANE: return { "SPELL_SCHOOL_ARCANE", "Arcane", "" }; + default: throw std::out_of_range("value"); + } +} + +template <> +TC_API_EXPORT size_t EnumUtils<SpellSchools>::Count() { return 7; } + +template <> +TC_API_EXPORT SpellSchools EnumUtils<SpellSchools>::FromIndex(size_t index) +{ + switch (index) + { + case 0: return SPELL_SCHOOL_NORMAL; + case 1: return SPELL_SCHOOL_HOLY; + case 2: return SPELL_SCHOOL_FIRE; + case 3: return SPELL_SCHOOL_NATURE; + case 4: return SPELL_SCHOOL_FROST; + case 5: return SPELL_SCHOOL_SHADOW; + case 6: return SPELL_SCHOOL_ARCANE; + default: throw std::out_of_range("index"); + } +} + +/******************************************************************\ +|* data for enum 'SpellAttr0' in 'SharedDefines.h' auto-generated *| +\******************************************************************/ +template <> +TC_API_EXPORT EnumText EnumUtils<SpellAttr0>::ToString(SpellAttr0 value) +{ + switch (value) + { + case SPELL_ATTR0_UNK0: return { "SPELL_ATTR0_UNK0", "SPELL_ATTR0_UNK0", "0" }; + case SPELL_ATTR0_REQ_AMMO: return { "SPELL_ATTR0_REQ_AMMO", "SPELL_ATTR0_REQ_AMMO", "1 on next ranged" }; + case SPELL_ATTR0_ON_NEXT_SWING: return { "SPELL_ATTR0_ON_NEXT_SWING", "SPELL_ATTR0_ON_NEXT_SWING", "2" }; + case SPELL_ATTR0_IS_REPLENISHMENT: return { "SPELL_ATTR0_IS_REPLENISHMENT", "SPELL_ATTR0_IS_REPLENISHMENT", "3 not set in 3.0.3" }; + case SPELL_ATTR0_ABILITY: return { "SPELL_ATTR0_ABILITY", "SPELL_ATTR0_ABILITY", "4 client puts 'ability' instead of 'spell' in game strings for these spells" }; + case SPELL_ATTR0_TRADESPELL: return { "SPELL_ATTR0_TRADESPELL", "SPELL_ATTR0_TRADESPELL", "5 trade spells (recipes), will be added by client to a sublist of profession spell" }; + case SPELL_ATTR0_PASSIVE: return { "SPELL_ATTR0_PASSIVE", "SPELL_ATTR0_PASSIVE", "6 Passive spell" }; + case SPELL_ATTR0_HIDDEN_CLIENTSIDE: return { "SPELL_ATTR0_HIDDEN_CLIENTSIDE", "SPELL_ATTR0_HIDDEN_CLIENTSIDE", "7 Spells with this attribute are not visible in spellbook or aura bar" }; + case SPELL_ATTR0_HIDE_IN_COMBAT_LOG: return { "SPELL_ATTR0_HIDE_IN_COMBAT_LOG", "SPELL_ATTR0_HIDE_IN_COMBAT_LOG", "8 This attribite controls whether spell appears in combat logs" }; + case SPELL_ATTR0_TARGET_MAINHAND_ITEM: return { "SPELL_ATTR0_TARGET_MAINHAND_ITEM", "SPELL_ATTR0_TARGET_MAINHAND_ITEM", "9 Client automatically selects item from mainhand slot as a cast target" }; + case SPELL_ATTR0_ON_NEXT_SWING_2: return { "SPELL_ATTR0_ON_NEXT_SWING_2", "SPELL_ATTR0_ON_NEXT_SWING_2", "10" }; + case SPELL_ATTR0_UNK11: return { "SPELL_ATTR0_UNK11", "SPELL_ATTR0_UNK11", "11" }; + case SPELL_ATTR0_DAYTIME_ONLY: return { "SPELL_ATTR0_DAYTIME_ONLY", "SPELL_ATTR0_DAYTIME_ONLY", "12 only useable at daytime, not set in 2.4.2" }; + case SPELL_ATTR0_NIGHT_ONLY: return { "SPELL_ATTR0_NIGHT_ONLY", "SPELL_ATTR0_NIGHT_ONLY", "13 only useable at night, not set in 2.4.2" }; + case SPELL_ATTR0_INDOORS_ONLY: return { "SPELL_ATTR0_INDOORS_ONLY", "SPELL_ATTR0_INDOORS_ONLY", "14 only useable indoors, not set in 2.4.2" }; + case SPELL_ATTR0_OUTDOORS_ONLY: return { "SPELL_ATTR0_OUTDOORS_ONLY", "SPELL_ATTR0_OUTDOORS_ONLY", "15 Only useable outdoors." }; + case SPELL_ATTR0_NOT_SHAPESHIFT: return { "SPELL_ATTR0_NOT_SHAPESHIFT", "SPELL_ATTR0_NOT_SHAPESHIFT", "16 Not while shapeshifted" }; + case SPELL_ATTR0_ONLY_STEALTHED: return { "SPELL_ATTR0_ONLY_STEALTHED", "SPELL_ATTR0_ONLY_STEALTHED", "17 Must be in stealth" }; + case SPELL_ATTR0_DONT_AFFECT_SHEATH_STATE: return { "SPELL_ATTR0_DONT_AFFECT_SHEATH_STATE", "SPELL_ATTR0_DONT_AFFECT_SHEATH_STATE", "18 client won't hide unit weapons in sheath on cast/channel" }; + case SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION: return { "SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION", "SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION", "19 spelldamage depends on caster level" }; + case SPELL_ATTR0_STOP_ATTACK_TARGET: return { "SPELL_ATTR0_STOP_ATTACK_TARGET", "SPELL_ATTR0_STOP_ATTACK_TARGET", "20 Stop attack after use this spell (and not begin attack if use)" }; + case SPELL_ATTR0_IMPOSSIBLE_DODGE_PARRY_BLOCK: return { "SPELL_ATTR0_IMPOSSIBLE_DODGE_PARRY_BLOCK", "SPELL_ATTR0_IMPOSSIBLE_DODGE_PARRY_BLOCK", "21 Cannot be dodged/parried/blocked" }; + case SPELL_ATTR0_CAST_TRACK_TARGET: return { "SPELL_ATTR0_CAST_TRACK_TARGET", "SPELL_ATTR0_CAST_TRACK_TARGET", "22 Client automatically forces player to face target when casting" }; + case SPELL_ATTR0_CASTABLE_WHILE_DEAD: return { "SPELL_ATTR0_CASTABLE_WHILE_DEAD", "SPELL_ATTR0_CASTABLE_WHILE_DEAD", "23 castable while dead?" }; + case SPELL_ATTR0_CASTABLE_WHILE_MOUNTED: return { "SPELL_ATTR0_CASTABLE_WHILE_MOUNTED", "SPELL_ATTR0_CASTABLE_WHILE_MOUNTED", "24 castable while mounted" }; + case SPELL_ATTR0_DISABLED_WHILE_ACTIVE: return { "SPELL_ATTR0_DISABLED_WHILE_ACTIVE", "SPELL_ATTR0_DISABLED_WHILE_ACTIVE", "25 Activate and start cooldown after aura fade or remove summoned creature or go" }; + case SPELL_ATTR0_NEGATIVE_1: return { "SPELL_ATTR0_NEGATIVE_1", "SPELL_ATTR0_NEGATIVE_1", "26 Many negative spells have this attr" }; + case SPELL_ATTR0_CASTABLE_WHILE_SITTING: return { "SPELL_ATTR0_CASTABLE_WHILE_SITTING", "SPELL_ATTR0_CASTABLE_WHILE_SITTING", "27 castable while sitting" }; + case SPELL_ATTR0_CANT_USED_IN_COMBAT: return { "SPELL_ATTR0_CANT_USED_IN_COMBAT", "SPELL_ATTR0_CANT_USED_IN_COMBAT", "28 Cannot be used in combat" }; + case SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY: return { "SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY", "SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY", "29 unaffected by invulnerability (hmm possible not...)" }; + case SPELL_ATTR0_HEARTBEAT_RESIST_CHECK: return { "SPELL_ATTR0_HEARTBEAT_RESIST_CHECK", "SPELL_ATTR0_HEARTBEAT_RESIST_CHECK", "30 random chance the effect will end TODO: implement core support" }; + case SPELL_ATTR0_CANT_CANCEL: return { "SPELL_ATTR0_CANT_CANCEL", "SPELL_ATTR0_CANT_CANCEL", "31 positive aura can't be canceled" }; + default: throw std::out_of_range("value"); + } +} + +template <> +TC_API_EXPORT size_t EnumUtils<SpellAttr0>::Count() { return 32; } + +template <> +TC_API_EXPORT SpellAttr0 EnumUtils<SpellAttr0>::FromIndex(size_t index) +{ + switch (index) + { + case 0: return SPELL_ATTR0_UNK0; + case 1: return SPELL_ATTR0_REQ_AMMO; + case 2: return SPELL_ATTR0_ON_NEXT_SWING; + case 3: return SPELL_ATTR0_IS_REPLENISHMENT; + case 4: return SPELL_ATTR0_ABILITY; + case 5: return SPELL_ATTR0_TRADESPELL; + case 6: return SPELL_ATTR0_PASSIVE; + case 7: return SPELL_ATTR0_HIDDEN_CLIENTSIDE; + case 8: return SPELL_ATTR0_HIDE_IN_COMBAT_LOG; + case 9: return SPELL_ATTR0_TARGET_MAINHAND_ITEM; + case 10: return SPELL_ATTR0_ON_NEXT_SWING_2; + case 11: return SPELL_ATTR0_UNK11; + case 12: return SPELL_ATTR0_DAYTIME_ONLY; + case 13: return SPELL_ATTR0_NIGHT_ONLY; + case 14: return SPELL_ATTR0_INDOORS_ONLY; + case 15: return SPELL_ATTR0_OUTDOORS_ONLY; + case 16: return SPELL_ATTR0_NOT_SHAPESHIFT; + case 17: return SPELL_ATTR0_ONLY_STEALTHED; + case 18: return SPELL_ATTR0_DONT_AFFECT_SHEATH_STATE; + case 19: return SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION; + case 20: return SPELL_ATTR0_STOP_ATTACK_TARGET; + case 21: return SPELL_ATTR0_IMPOSSIBLE_DODGE_PARRY_BLOCK; + case 22: return SPELL_ATTR0_CAST_TRACK_TARGET; + case 23: return SPELL_ATTR0_CASTABLE_WHILE_DEAD; + case 24: return SPELL_ATTR0_CASTABLE_WHILE_MOUNTED; + case 25: return SPELL_ATTR0_DISABLED_WHILE_ACTIVE; + case 26: return SPELL_ATTR0_NEGATIVE_1; + case 27: return SPELL_ATTR0_CASTABLE_WHILE_SITTING; + case 28: return SPELL_ATTR0_CANT_USED_IN_COMBAT; + case 29: return SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY; + case 30: return SPELL_ATTR0_HEARTBEAT_RESIST_CHECK; + case 31: return SPELL_ATTR0_CANT_CANCEL; + default: throw std::out_of_range("index"); + } +} + +/******************************************************************\ +|* data for enum 'SpellAttr1' in 'SharedDefines.h' auto-generated *| +\******************************************************************/ +template <> +TC_API_EXPORT EnumText EnumUtils<SpellAttr1>::ToString(SpellAttr1 value) +{ + switch (value) + { + case SPELL_ATTR1_DISMISS_PET: return { "SPELL_ATTR1_DISMISS_PET", "SPELL_ATTR1_DISMISS_PET", "0 for spells without this flag client doesn't allow to summon pet if caster has a pet" }; + case SPELL_ATTR1_DRAIN_ALL_POWER: return { "SPELL_ATTR1_DRAIN_ALL_POWER", "SPELL_ATTR1_DRAIN_ALL_POWER", "1 use all power (Only paladin Lay of Hands and Bunyanize)" }; + case SPELL_ATTR1_CHANNELED_1: return { "SPELL_ATTR1_CHANNELED_1", "SPELL_ATTR1_CHANNELED_1", "2 clientside checked? cancelable?" }; + case SPELL_ATTR1_CANT_BE_REDIRECTED: return { "SPELL_ATTR1_CANT_BE_REDIRECTED", "SPELL_ATTR1_CANT_BE_REDIRECTED", "3" }; + case SPELL_ATTR1_UNK4: return { "SPELL_ATTR1_UNK4", "SPELL_ATTR1_UNK4", "4 stealth and whirlwind" }; + case SPELL_ATTR1_NOT_BREAK_STEALTH: return { "SPELL_ATTR1_NOT_BREAK_STEALTH", "SPELL_ATTR1_NOT_BREAK_STEALTH", "5 Not break stealth" }; + case SPELL_ATTR1_CHANNELED_2: return { "SPELL_ATTR1_CHANNELED_2", "SPELL_ATTR1_CHANNELED_2", "6" }; + case SPELL_ATTR1_CANT_BE_REFLECTED: return { "SPELL_ATTR1_CANT_BE_REFLECTED", "SPELL_ATTR1_CANT_BE_REFLECTED", "7" }; + case SPELL_ATTR1_CANT_TARGET_IN_COMBAT: return { "SPELL_ATTR1_CANT_TARGET_IN_COMBAT", "SPELL_ATTR1_CANT_TARGET_IN_COMBAT", "8 can target only out of combat units" }; + case SPELL_ATTR1_MELEE_COMBAT_START: return { "SPELL_ATTR1_MELEE_COMBAT_START", "SPELL_ATTR1_MELEE_COMBAT_START", "9 player starts melee combat after this spell is cast" }; + case SPELL_ATTR1_NO_THREAT: return { "SPELL_ATTR1_NO_THREAT", "SPELL_ATTR1_NO_THREAT", "10 no generates threat on cast 100% (old NO_INITIAL_AGGRO)" }; + case SPELL_ATTR1_DONT_REFRESH_DURATION_ON_RECAST: return { "SPELL_ATTR1_DONT_REFRESH_DURATION_ON_RECAST", "SPELL_ATTR1_DONT_REFRESH_DURATION_ON_RECAST", "11 aura will not refresh its duration when recast" }; + case SPELL_ATTR1_IS_PICKPOCKET: return { "SPELL_ATTR1_IS_PICKPOCKET", "SPELL_ATTR1_IS_PICKPOCKET", "12 Pickpocket" }; + case SPELL_ATTR1_FARSIGHT: return { "SPELL_ATTR1_FARSIGHT", "SPELL_ATTR1_FARSIGHT", "13 Client removes farsight on aura loss" }; + case SPELL_ATTR1_CHANNEL_TRACK_TARGET: return { "SPELL_ATTR1_CHANNEL_TRACK_TARGET", "SPELL_ATTR1_CHANNEL_TRACK_TARGET", "14 Client automatically forces player to face target when channeling" }; + case SPELL_ATTR1_DISPEL_AURAS_ON_IMMUNITY: return { "SPELL_ATTR1_DISPEL_AURAS_ON_IMMUNITY", "SPELL_ATTR1_DISPEL_AURAS_ON_IMMUNITY", "15 remove auras on immunity" }; + case SPELL_ATTR1_UNAFFECTED_BY_SCHOOL_IMMUNE: return { "SPELL_ATTR1_UNAFFECTED_BY_SCHOOL_IMMUNE", "SPELL_ATTR1_UNAFFECTED_BY_SCHOOL_IMMUNE", "16 on immuniy" }; + case SPELL_ATTR1_UNAUTOCASTABLE_BY_PET: return { "SPELL_ATTR1_UNAUTOCASTABLE_BY_PET", "SPELL_ATTR1_UNAUTOCASTABLE_BY_PET", "17" }; + case SPELL_ATTR1_UNK18: return { "SPELL_ATTR1_UNK18", "SPELL_ATTR1_UNK18", "18 stun, polymorph, daze, hex" }; + case SPELL_ATTR1_CANT_TARGET_SELF: return { "SPELL_ATTR1_CANT_TARGET_SELF", "SPELL_ATTR1_CANT_TARGET_SELF", "19" }; + case SPELL_ATTR1_REQ_COMBO_POINTS1: return { "SPELL_ATTR1_REQ_COMBO_POINTS1", "SPELL_ATTR1_REQ_COMBO_POINTS1", "20 Req combo points on target" }; + case SPELL_ATTR1_UNK21: return { "SPELL_ATTR1_UNK21", "SPELL_ATTR1_UNK21", "21" }; + case SPELL_ATTR1_REQ_COMBO_POINTS2: return { "SPELL_ATTR1_REQ_COMBO_POINTS2", "SPELL_ATTR1_REQ_COMBO_POINTS2", "22 Req combo points on target" }; + case SPELL_ATTR1_UNK23: return { "SPELL_ATTR1_UNK23", "SPELL_ATTR1_UNK23", "23" }; + case SPELL_ATTR1_IS_FISHING: return { "SPELL_ATTR1_IS_FISHING", "SPELL_ATTR1_IS_FISHING", "24 only fishing spells" }; + case SPELL_ATTR1_UNK25: return { "SPELL_ATTR1_UNK25", "SPELL_ATTR1_UNK25", "25" }; + case SPELL_ATTR1_UNK26: return { "SPELL_ATTR1_UNK26", "SPELL_ATTR1_UNK26", "26 works correctly with [target=focus] and [target=mouseover] macros?" }; + case SPELL_ATTR1_UNK27: return { "SPELL_ATTR1_UNK27", "SPELL_ATTR1_UNK27", "27 melee spell?" }; + case SPELL_ATTR1_DONT_DISPLAY_IN_AURA_BAR: return { "SPELL_ATTR1_DONT_DISPLAY_IN_AURA_BAR", "SPELL_ATTR1_DONT_DISPLAY_IN_AURA_BAR", "28 client doesn't display these spells in aura bar" }; + case SPELL_ATTR1_CHANNEL_DISPLAY_SPELL_NAME: return { "SPELL_ATTR1_CHANNEL_DISPLAY_SPELL_NAME", "SPELL_ATTR1_CHANNEL_DISPLAY_SPELL_NAME", "29 spell name is displayed in cast bar instead of 'channeling' text" }; + case SPELL_ATTR1_ENABLE_AT_DODGE: return { "SPELL_ATTR1_ENABLE_AT_DODGE", "SPELL_ATTR1_ENABLE_AT_DODGE", "30 Overpower" }; + case SPELL_ATTR1_UNK31: return { "SPELL_ATTR1_UNK31", "SPELL_ATTR1_UNK31", "31" }; + default: throw std::out_of_range("value"); + } +} + +template <> +TC_API_EXPORT size_t EnumUtils<SpellAttr1>::Count() { return 32; } + +template <> +TC_API_EXPORT SpellAttr1 EnumUtils<SpellAttr1>::FromIndex(size_t index) +{ + switch (index) + { + case 0: return SPELL_ATTR1_DISMISS_PET; + case 1: return SPELL_ATTR1_DRAIN_ALL_POWER; + case 2: return SPELL_ATTR1_CHANNELED_1; + case 3: return SPELL_ATTR1_CANT_BE_REDIRECTED; + case 4: return SPELL_ATTR1_UNK4; + case 5: return SPELL_ATTR1_NOT_BREAK_STEALTH; + case 6: return SPELL_ATTR1_CHANNELED_2; + case 7: return SPELL_ATTR1_CANT_BE_REFLECTED; + case 8: return SPELL_ATTR1_CANT_TARGET_IN_COMBAT; + case 9: return SPELL_ATTR1_MELEE_COMBAT_START; + case 10: return SPELL_ATTR1_NO_THREAT; + case 11: return SPELL_ATTR1_DONT_REFRESH_DURATION_ON_RECAST; + case 12: return SPELL_ATTR1_IS_PICKPOCKET; + case 13: return SPELL_ATTR1_FARSIGHT; + case 14: return SPELL_ATTR1_CHANNEL_TRACK_TARGET; + case 15: return SPELL_ATTR1_DISPEL_AURAS_ON_IMMUNITY; + case 16: return SPELL_ATTR1_UNAFFECTED_BY_SCHOOL_IMMUNE; + case 17: return SPELL_ATTR1_UNAUTOCASTABLE_BY_PET; + case 18: return SPELL_ATTR1_UNK18; + case 19: return SPELL_ATTR1_CANT_TARGET_SELF; + case 20: return SPELL_ATTR1_REQ_COMBO_POINTS1; + case 21: return SPELL_ATTR1_UNK21; + case 22: return SPELL_ATTR1_REQ_COMBO_POINTS2; + case 23: return SPELL_ATTR1_UNK23; + case 24: return SPELL_ATTR1_IS_FISHING; + case 25: return SPELL_ATTR1_UNK25; + case 26: return SPELL_ATTR1_UNK26; + case 27: return SPELL_ATTR1_UNK27; + case 28: return SPELL_ATTR1_DONT_DISPLAY_IN_AURA_BAR; + case 29: return SPELL_ATTR1_CHANNEL_DISPLAY_SPELL_NAME; + case 30: return SPELL_ATTR1_ENABLE_AT_DODGE; + case 31: return SPELL_ATTR1_UNK31; + default: throw std::out_of_range("index"); + } +} + +/******************************************************************\ +|* data for enum 'SpellAttr2' in 'SharedDefines.h' auto-generated *| +\******************************************************************/ +template <> +TC_API_EXPORT EnumText EnumUtils<SpellAttr2>::ToString(SpellAttr2 value) +{ + switch (value) + { + case SPELL_ATTR2_CAN_TARGET_DEAD: return { "SPELL_ATTR2_CAN_TARGET_DEAD", "SPELL_ATTR2_CAN_TARGET_DEAD", "0 can target dead unit or corpse" }; + case SPELL_ATTR2_UNK1: return { "SPELL_ATTR2_UNK1", "SPELL_ATTR2_UNK1", "1 vanish, shadowform, Ghost Wolf and other" }; + case SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS: return { "SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS", "SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS", "2 26368 4.0.1 dbc change" }; + case SPELL_ATTR2_UNK3: return { "SPELL_ATTR2_UNK3", "SPELL_ATTR2_UNK3", "3" }; + case SPELL_ATTR2_DISPLAY_IN_STANCE_BAR: return { "SPELL_ATTR2_DISPLAY_IN_STANCE_BAR", "SPELL_ATTR2_DISPLAY_IN_STANCE_BAR", "4 client displays icon in stance bar when learned, even if not shapeshift" }; + case SPELL_ATTR2_AUTOREPEAT_FLAG: return { "SPELL_ATTR2_AUTOREPEAT_FLAG", "SPELL_ATTR2_AUTOREPEAT_FLAG", "5" }; + case SPELL_ATTR2_CANT_TARGET_TAPPED: return { "SPELL_ATTR2_CANT_TARGET_TAPPED", "SPELL_ATTR2_CANT_TARGET_TAPPED", "6 target must be tapped by caster" }; + case SPELL_ATTR2_UNK7: return { "SPELL_ATTR2_UNK7", "SPELL_ATTR2_UNK7", "7" }; + case SPELL_ATTR2_UNK8: return { "SPELL_ATTR2_UNK8", "SPELL_ATTR2_UNK8", "8 not set in 3.0.3" }; + case SPELL_ATTR2_UNK9: return { "SPELL_ATTR2_UNK9", "SPELL_ATTR2_UNK9", "9" }; + case SPELL_ATTR2_UNK10: return { "SPELL_ATTR2_UNK10", "SPELL_ATTR2_UNK10", "10 related to tame" }; + case SPELL_ATTR2_HEALTH_FUNNEL: return { "SPELL_ATTR2_HEALTH_FUNNEL", "SPELL_ATTR2_HEALTH_FUNNEL", "11" }; + case SPELL_ATTR2_UNK12: return { "SPELL_ATTR2_UNK12", "SPELL_ATTR2_UNK12", "12 Cleave, Heart Strike, Maul, Sunder Armor, Swipe" }; + case SPELL_ATTR2_PRESERVE_ENCHANT_IN_ARENA: return { "SPELL_ATTR2_PRESERVE_ENCHANT_IN_ARENA", "SPELL_ATTR2_PRESERVE_ENCHANT_IN_ARENA", "13 Items enchanted by spells with this flag preserve the enchant to arenas" }; + case SPELL_ATTR2_UNK14: return { "SPELL_ATTR2_UNK14", "SPELL_ATTR2_UNK14", "14" }; + case SPELL_ATTR2_UNK15: return { "SPELL_ATTR2_UNK15", "SPELL_ATTR2_UNK15", "15 not set in 3.0.3" }; + case SPELL_ATTR2_TAME_BEAST: return { "SPELL_ATTR2_TAME_BEAST", "SPELL_ATTR2_TAME_BEAST", "16" }; + case SPELL_ATTR2_NOT_RESET_AUTO_ACTIONS: return { "SPELL_ATTR2_NOT_RESET_AUTO_ACTIONS", "SPELL_ATTR2_NOT_RESET_AUTO_ACTIONS", "17 don't reset timers for melee autoattacks (swings) or ranged autoattacks (autoshoots)" }; + case SPELL_ATTR2_REQ_DEAD_PET: return { "SPELL_ATTR2_REQ_DEAD_PET", "SPELL_ATTR2_REQ_DEAD_PET", "18 Only Revive pet and Heart of the Pheonix" }; + case SPELL_ATTR2_NOT_NEED_SHAPESHIFT: return { "SPELL_ATTR2_NOT_NEED_SHAPESHIFT", "SPELL_ATTR2_NOT_NEED_SHAPESHIFT", "19 does not necessarly need shapeshift" }; + case SPELL_ATTR2_UNK20: return { "SPELL_ATTR2_UNK20", "SPELL_ATTR2_UNK20", "20" }; + case SPELL_ATTR2_DAMAGE_REDUCED_SHIELD: return { "SPELL_ATTR2_DAMAGE_REDUCED_SHIELD", "SPELL_ATTR2_DAMAGE_REDUCED_SHIELD", "21 for ice blocks, pala immunity buffs, priest absorb shields, but used also for other spells -> not sure!" }; + case SPELL_ATTR2_UNK22: return { "SPELL_ATTR2_UNK22", "SPELL_ATTR2_UNK22", "22 Ambush, Backstab, Cheap Shot, Death Grip, Garrote, Judgements, Mutilate, Pounce, Ravage, Shiv, Shred" }; + case SPELL_ATTR2_IS_ARCANE_CONCENTRATION: return { "SPELL_ATTR2_IS_ARCANE_CONCENTRATION", "SPELL_ATTR2_IS_ARCANE_CONCENTRATION", "23 Only mage Arcane Concentration have this flag" }; + case SPELL_ATTR2_UNK24: return { "SPELL_ATTR2_UNK24", "SPELL_ATTR2_UNK24", "24" }; + case SPELL_ATTR2_UNK25: return { "SPELL_ATTR2_UNK25", "SPELL_ATTR2_UNK25", "25" }; + case SPELL_ATTR2_UNAFFECTED_BY_AURA_SCHOOL_IMMUNE: return { "SPELL_ATTR2_UNAFFECTED_BY_AURA_SCHOOL_IMMUNE", "SPELL_ATTR2_UNAFFECTED_BY_AURA_SCHOOL_IMMUNE", "26 unaffected by school immunity" }; + case SPELL_ATTR2_UNK27: return { "SPELL_ATTR2_UNK27", "SPELL_ATTR2_UNK27", "27" }; + case SPELL_ATTR2_IGNORE_ACTION_AURA_INTERRUPT_FLAGS: return { "SPELL_ATTR2_IGNORE_ACTION_AURA_INTERRUPT_FLAGS", "SPELL_ATTR2_IGNORE_ACTION_AURA_INTERRUPT_FLAGS", "28 doesnt break auras with SpellAuraInterruptFlags::Action and SpellAuraInterruptFlags::ActionDelayed" }; + case SPELL_ATTR2_CANT_CRIT: return { "SPELL_ATTR2_CANT_CRIT", "SPELL_ATTR2_CANT_CRIT", "29 Spell can't crit" }; + case SPELL_ATTR2_TRIGGERED_CAN_TRIGGER_PROC: return { "SPELL_ATTR2_TRIGGERED_CAN_TRIGGER_PROC", "SPELL_ATTR2_TRIGGERED_CAN_TRIGGER_PROC", "30 spell can trigger even if triggered" }; + case SPELL_ATTR2_FOOD_BUFF: return { "SPELL_ATTR2_FOOD_BUFF", "SPELL_ATTR2_FOOD_BUFF", "31 Food or Drink Buff (like Well Fed)" }; + default: throw std::out_of_range("value"); + } +} + +template <> +TC_API_EXPORT size_t EnumUtils<SpellAttr2>::Count() { return 32; } + +template <> +TC_API_EXPORT SpellAttr2 EnumUtils<SpellAttr2>::FromIndex(size_t index) +{ + switch (index) + { + case 0: return SPELL_ATTR2_CAN_TARGET_DEAD; + case 1: return SPELL_ATTR2_UNK1; + case 2: return SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS; + case 3: return SPELL_ATTR2_UNK3; + case 4: return SPELL_ATTR2_DISPLAY_IN_STANCE_BAR; + case 5: return SPELL_ATTR2_AUTOREPEAT_FLAG; + case 6: return SPELL_ATTR2_CANT_TARGET_TAPPED; + case 7: return SPELL_ATTR2_UNK7; + case 8: return SPELL_ATTR2_UNK8; + case 9: return SPELL_ATTR2_UNK9; + case 10: return SPELL_ATTR2_UNK10; + case 11: return SPELL_ATTR2_HEALTH_FUNNEL; + case 12: return SPELL_ATTR2_UNK12; + case 13: return SPELL_ATTR2_PRESERVE_ENCHANT_IN_ARENA; + case 14: return SPELL_ATTR2_UNK14; + case 15: return SPELL_ATTR2_UNK15; + case 16: return SPELL_ATTR2_TAME_BEAST; + case 17: return SPELL_ATTR2_NOT_RESET_AUTO_ACTIONS; + case 18: return SPELL_ATTR2_REQ_DEAD_PET; + case 19: return SPELL_ATTR2_NOT_NEED_SHAPESHIFT; + case 20: return SPELL_ATTR2_UNK20; + case 21: return SPELL_ATTR2_DAMAGE_REDUCED_SHIELD; + case 22: return SPELL_ATTR2_UNK22; + case 23: return SPELL_ATTR2_IS_ARCANE_CONCENTRATION; + case 24: return SPELL_ATTR2_UNK24; + case 25: return SPELL_ATTR2_UNK25; + case 26: return SPELL_ATTR2_UNAFFECTED_BY_AURA_SCHOOL_IMMUNE; + case 27: return SPELL_ATTR2_UNK27; + case 28: return SPELL_ATTR2_IGNORE_ACTION_AURA_INTERRUPT_FLAGS; + case 29: return SPELL_ATTR2_CANT_CRIT; + case 30: return SPELL_ATTR2_TRIGGERED_CAN_TRIGGER_PROC; + case 31: return SPELL_ATTR2_FOOD_BUFF; + default: throw std::out_of_range("index"); + } +} + +/******************************************************************\ +|* data for enum 'SpellAttr3' in 'SharedDefines.h' auto-generated *| +\******************************************************************/ +template <> +TC_API_EXPORT EnumText EnumUtils<SpellAttr3>::ToString(SpellAttr3 value) +{ + switch (value) + { + case SPELL_ATTR3_UNK0: return { "SPELL_ATTR3_UNK0", "SPELL_ATTR3_UNK0", "0" }; + case SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT: return { "SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT", "SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT", "1 Ignores subclass mask check when checking proc" }; + case SPELL_ATTR3_UNK2: return { "SPELL_ATTR3_UNK2", "SPELL_ATTR3_UNK2", "2" }; + case SPELL_ATTR3_BLOCKABLE_SPELL: return { "SPELL_ATTR3_BLOCKABLE_SPELL", "SPELL_ATTR3_BLOCKABLE_SPELL", "3 Only dmg class melee in 3.1.3" }; + case SPELL_ATTR3_IGNORE_RESURRECTION_TIMER: return { "SPELL_ATTR3_IGNORE_RESURRECTION_TIMER", "SPELL_ATTR3_IGNORE_RESURRECTION_TIMER", "4 you don't have to wait to be resurrected with these spells" }; + case SPELL_ATTR3_UNK5: return { "SPELL_ATTR3_UNK5", "SPELL_ATTR3_UNK5", "5" }; + case SPELL_ATTR3_UNK6: return { "SPELL_ATTR3_UNK6", "SPELL_ATTR3_UNK6", "6" }; + case SPELL_ATTR3_STACK_FOR_DIFF_CASTERS: return { "SPELL_ATTR3_STACK_FOR_DIFF_CASTERS", "SPELL_ATTR3_STACK_FOR_DIFF_CASTERS", "7 separate stack for every caster" }; + case SPELL_ATTR3_ONLY_TARGET_PLAYERS: return { "SPELL_ATTR3_ONLY_TARGET_PLAYERS", "SPELL_ATTR3_ONLY_TARGET_PLAYERS", "8 can only target players" }; + case SPELL_ATTR3_TRIGGERED_CAN_TRIGGER_PROC_2: return { "SPELL_ATTR3_TRIGGERED_CAN_TRIGGER_PROC_2", "SPELL_ATTR3_TRIGGERED_CAN_TRIGGER_PROC_2", "9 triggered from effect?" }; + case SPELL_ATTR3_MAIN_HAND: return { "SPELL_ATTR3_MAIN_HAND", "SPELL_ATTR3_MAIN_HAND", "10 Main hand weapon required" }; + case SPELL_ATTR3_BATTLEGROUND: return { "SPELL_ATTR3_BATTLEGROUND", "SPELL_ATTR3_BATTLEGROUND", "11 Can only be cast in battleground" }; + case SPELL_ATTR3_ONLY_TARGET_GHOSTS: return { "SPELL_ATTR3_ONLY_TARGET_GHOSTS", "SPELL_ATTR3_ONLY_TARGET_GHOSTS", "12" }; + case SPELL_ATTR3_DONT_DISPLAY_CHANNEL_BAR: return { "SPELL_ATTR3_DONT_DISPLAY_CHANNEL_BAR", "SPELL_ATTR3_DONT_DISPLAY_CHANNEL_BAR", "13 Clientside attribute - will not display channeling bar" }; + case SPELL_ATTR3_IS_HONORLESS_TARGET: return { "SPELL_ATTR3_IS_HONORLESS_TARGET", "SPELL_ATTR3_IS_HONORLESS_TARGET", "14 \042Honorless Target\042 only this spells have this flag" }; + case SPELL_ATTR3_UNK15: return { "SPELL_ATTR3_UNK15", "SPELL_ATTR3_UNK15", "15 Auto Shoot, Shoot, Throw, - this is autoshot flag" }; + case SPELL_ATTR3_CANT_TRIGGER_PROC: return { "SPELL_ATTR3_CANT_TRIGGER_PROC", "SPELL_ATTR3_CANT_TRIGGER_PROC", "16 confirmed with many patchnotes" }; + case SPELL_ATTR3_NO_INITIAL_AGGRO: return { "SPELL_ATTR3_NO_INITIAL_AGGRO", "SPELL_ATTR3_NO_INITIAL_AGGRO", "17 Soothe Animal, 39758, Mind Soothe" }; + case SPELL_ATTR3_IGNORE_HIT_RESULT: return { "SPELL_ATTR3_IGNORE_HIT_RESULT", "SPELL_ATTR3_IGNORE_HIT_RESULT", "18 Spell should always hit its target" }; + case SPELL_ATTR3_DISABLE_PROC: return { "SPELL_ATTR3_DISABLE_PROC", "SPELL_ATTR3_DISABLE_PROC", "19 during aura proc no spells can trigger (20178, 20375)" }; + case SPELL_ATTR3_DEATH_PERSISTENT: return { "SPELL_ATTR3_DEATH_PERSISTENT", "SPELL_ATTR3_DEATH_PERSISTENT", "20 Death persistent spells" }; + case SPELL_ATTR3_UNK21: return { "SPELL_ATTR3_UNK21", "SPELL_ATTR3_UNK21", "21 unused" }; + case SPELL_ATTR3_REQ_WAND: return { "SPELL_ATTR3_REQ_WAND", "SPELL_ATTR3_REQ_WAND", "22 Req wand" }; + case SPELL_ATTR3_UNK23: return { "SPELL_ATTR3_UNK23", "SPELL_ATTR3_UNK23", "23" }; + case SPELL_ATTR3_REQ_OFFHAND: return { "SPELL_ATTR3_REQ_OFFHAND", "SPELL_ATTR3_REQ_OFFHAND", "24 Req offhand weapon" }; + case SPELL_ATTR3_TREAT_AS_PERIODIC: return { "SPELL_ATTR3_TREAT_AS_PERIODIC", "SPELL_ATTR3_TREAT_AS_PERIODIC", "25 Makes the spell appear as periodic in client combat logs - used by spells that trigger another spell on each tick" }; + case SPELL_ATTR3_CAN_PROC_WITH_TRIGGERED: return { "SPELL_ATTR3_CAN_PROC_WITH_TRIGGERED", "SPELL_ATTR3_CAN_PROC_WITH_TRIGGERED", "26 auras with this attribute can proc from triggered spell casts with SPELL_ATTR3_TRIGGERED_CAN_TRIGGER_PROC_2 (67736 + 52999)" }; + case SPELL_ATTR3_DRAIN_SOUL: return { "SPELL_ATTR3_DRAIN_SOUL", "SPELL_ATTR3_DRAIN_SOUL", "27 only drain soul has this flag" }; + case SPELL_ATTR3_UNK28: return { "SPELL_ATTR3_UNK28", "SPELL_ATTR3_UNK28", "28" }; + case SPELL_ATTR3_NO_DONE_BONUS: return { "SPELL_ATTR3_NO_DONE_BONUS", "SPELL_ATTR3_NO_DONE_BONUS", "29 Ignore caster spellpower and done damage mods? client doesn't apply spellmods for those spells" }; + case SPELL_ATTR3_DONT_DISPLAY_RANGE: return { "SPELL_ATTR3_DONT_DISPLAY_RANGE", "SPELL_ATTR3_DONT_DISPLAY_RANGE", "30 client doesn't display range in tooltip for those spells" }; + case SPELL_ATTR3_UNK31: return { "SPELL_ATTR3_UNK31", "SPELL_ATTR3_UNK31", "31" }; + default: throw std::out_of_range("value"); + } +} + +template <> +TC_API_EXPORT size_t EnumUtils<SpellAttr3>::Count() { return 32; } + +template <> +TC_API_EXPORT SpellAttr3 EnumUtils<SpellAttr3>::FromIndex(size_t index) +{ + switch (index) + { + case 0: return SPELL_ATTR3_UNK0; + case 1: return SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT; + case 2: return SPELL_ATTR3_UNK2; + case 3: return SPELL_ATTR3_BLOCKABLE_SPELL; + case 4: return SPELL_ATTR3_IGNORE_RESURRECTION_TIMER; + case 5: return SPELL_ATTR3_UNK5; + case 6: return SPELL_ATTR3_UNK6; + case 7: return SPELL_ATTR3_STACK_FOR_DIFF_CASTERS; + case 8: return SPELL_ATTR3_ONLY_TARGET_PLAYERS; + case 9: return SPELL_ATTR3_TRIGGERED_CAN_TRIGGER_PROC_2; + case 10: return SPELL_ATTR3_MAIN_HAND; + case 11: return SPELL_ATTR3_BATTLEGROUND; + case 12: return SPELL_ATTR3_ONLY_TARGET_GHOSTS; + case 13: return SPELL_ATTR3_DONT_DISPLAY_CHANNEL_BAR; + case 14: return SPELL_ATTR3_IS_HONORLESS_TARGET; + case 15: return SPELL_ATTR3_UNK15; + case 16: return SPELL_ATTR3_CANT_TRIGGER_PROC; + case 17: return SPELL_ATTR3_NO_INITIAL_AGGRO; + case 18: return SPELL_ATTR3_IGNORE_HIT_RESULT; + case 19: return SPELL_ATTR3_DISABLE_PROC; + case 20: return SPELL_ATTR3_DEATH_PERSISTENT; + case 21: return SPELL_ATTR3_UNK21; + case 22: return SPELL_ATTR3_REQ_WAND; + case 23: return SPELL_ATTR3_UNK23; + case 24: return SPELL_ATTR3_REQ_OFFHAND; + case 25: return SPELL_ATTR3_TREAT_AS_PERIODIC; + case 26: return SPELL_ATTR3_CAN_PROC_WITH_TRIGGERED; + case 27: return SPELL_ATTR3_DRAIN_SOUL; + case 28: return SPELL_ATTR3_UNK28; + case 29: return SPELL_ATTR3_NO_DONE_BONUS; + case 30: return SPELL_ATTR3_DONT_DISPLAY_RANGE; + case 31: return SPELL_ATTR3_UNK31; + default: throw std::out_of_range("index"); + } +} + +/******************************************************************\ +|* data for enum 'SpellAttr4' in 'SharedDefines.h' auto-generated *| +\******************************************************************/ +template <> +TC_API_EXPORT EnumText EnumUtils<SpellAttr4>::ToString(SpellAttr4 value) +{ + switch (value) + { + case SPELL_ATTR4_IGNORE_RESISTANCES: return { "SPELL_ATTR4_IGNORE_RESISTANCES", "SPELL_ATTR4_IGNORE_RESISTANCES", "0 spells with this attribute will completely ignore the target's resistance (these spells can't be resisted)" }; + case SPELL_ATTR4_PROC_ONLY_ON_CASTER: return { "SPELL_ATTR4_PROC_ONLY_ON_CASTER", "SPELL_ATTR4_PROC_ONLY_ON_CASTER", "1 proc only on effects with TARGET_UNIT_CASTER?" }; + case SPELL_ATTR4_AURA_EXPIRES_OFFLINE: return { "SPELL_ATTR4_AURA_EXPIRES_OFFLINE", "SPELL_ATTR4_AURA_EXPIRES_OFFLINE", "2 duration is removed from aura while player is logged out" }; + case SPELL_ATTR4_UNK3: return { "SPELL_ATTR4_UNK3", "SPELL_ATTR4_UNK3", "3" }; + case SPELL_ATTR4_UNK4: return { "SPELL_ATTR4_UNK4", "SPELL_ATTR4_UNK4", "4 This will no longer cause guards to attack on use??" }; + case SPELL_ATTR4_UNK5: return { "SPELL_ATTR4_UNK5", "SPELL_ATTR4_UNK5", "5" }; + case SPELL_ATTR4_NOT_STEALABLE: return { "SPELL_ATTR4_NOT_STEALABLE", "SPELL_ATTR4_NOT_STEALABLE", "6 although such auras might be dispellable, they cannot be stolen" }; + case SPELL_ATTR4_CAN_CAST_WHILE_CASTING: return { "SPELL_ATTR4_CAN_CAST_WHILE_CASTING", "SPELL_ATTR4_CAN_CAST_WHILE_CASTING", "7 Can be cast while another cast is in progress - see CanCastWhileCasting(SpellRec const*,CGUnit_C *,int &)" }; + case SPELL_ATTR4_FIXED_DAMAGE: return { "SPELL_ATTR4_FIXED_DAMAGE", "SPELL_ATTR4_FIXED_DAMAGE", "8 Ignores resilience and any (except mechanic related) damage or % damage taken auras on target." }; + case SPELL_ATTR4_TRIGGER_ACTIVATE: return { "SPELL_ATTR4_TRIGGER_ACTIVATE", "SPELL_ATTR4_TRIGGER_ACTIVATE", "9 initially disabled / trigger activate from event (Execute, Riposte, Deep Freeze end other)" }; + case SPELL_ATTR4_SPELL_VS_EXTEND_COST: return { "SPELL_ATTR4_SPELL_VS_EXTEND_COST", "SPELL_ATTR4_SPELL_VS_EXTEND_COST", "10 Rogue Shiv have this flag" }; + case SPELL_ATTR4_UNK11: return { "SPELL_ATTR4_UNK11", "SPELL_ATTR4_UNK11", "11" }; + case SPELL_ATTR4_UNK12: return { "SPELL_ATTR4_UNK12", "SPELL_ATTR4_UNK12", "12" }; + case SPELL_ATTR4_COMBAT_LOG_NO_CASTER: return { "SPELL_ATTR4_COMBAT_LOG_NO_CASTER", "SPELL_ATTR4_COMBAT_LOG_NO_CASTER", "13 No caster object is sent to client combat log" }; + case SPELL_ATTR4_DAMAGE_DOESNT_BREAK_AURAS: return { "SPELL_ATTR4_DAMAGE_DOESNT_BREAK_AURAS", "SPELL_ATTR4_DAMAGE_DOESNT_BREAK_AURAS", "14 doesn't break auras by damage from these spells" }; + case SPELL_ATTR4_HIDDEN_IN_SPELLBOOK: return { "SPELL_ATTR4_HIDDEN_IN_SPELLBOOK", "SPELL_ATTR4_HIDDEN_IN_SPELLBOOK", "15" }; + case SPELL_ATTR4_NOT_USABLE_IN_ARENA_OR_RATED_BG: return { "SPELL_ATTR4_NOT_USABLE_IN_ARENA_OR_RATED_BG", "SPELL_ATTR4_NOT_USABLE_IN_ARENA_OR_RATED_BG", "16 Cannot be used in both Arenas or Rated Battlegrounds" }; + case SPELL_ATTR4_USABLE_IN_ARENA: return { "SPELL_ATTR4_USABLE_IN_ARENA", "SPELL_ATTR4_USABLE_IN_ARENA", "17" }; + case SPELL_ATTR4_AREA_TARGET_CHAIN: return { "SPELL_ATTR4_AREA_TARGET_CHAIN", "SPELL_ATTR4_AREA_TARGET_CHAIN", "18 (NYI)hits area targets one after another instead of all at once" }; + case SPELL_ATTR4_UNK19: return { "SPELL_ATTR4_UNK19", "SPELL_ATTR4_UNK19", "19 proc dalayed, after damage or don't proc on absorb?" }; + case SPELL_ATTR4_NOT_CHECK_SELFCAST_POWER: return { "SPELL_ATTR4_NOT_CHECK_SELFCAST_POWER", "SPELL_ATTR4_NOT_CHECK_SELFCAST_POWER", "20 supersedes message \042More powerful spell applied\042 for self casts." }; + case SPELL_ATTR4_DONT_REMOVE_IN_ARENA: return { "SPELL_ATTR4_DONT_REMOVE_IN_ARENA", "SPELL_ATTR4_DONT_REMOVE_IN_ARENA", "21 Pally aura, dk presence, dudu form, warrior stance, shadowform, hunter track" }; + case SPELL_ATTR4_UNK22: return { "SPELL_ATTR4_UNK22", "SPELL_ATTR4_UNK22", "22 Seal of Command (42058, 57770) and Gymer's Smash 55426" }; + case SPELL_ATTR4_SUPPRESS_WEAPON_PROCS: return { "SPELL_ATTR4_SUPPRESS_WEAPON_PROCS", "SPELL_ATTR4_SUPPRESS_WEAPON_PROCS", "23 spells with this flag should not trigger item spells / enchants (mostly in conjunction with SPELL_ATTR0_STOP_ATTACK_TARGET)" }; + case SPELL_ATTR4_UNK24: return { "SPELL_ATTR4_UNK24", "SPELL_ATTR4_UNK24", "24 some shoot spell" }; + case SPELL_ATTR4_IS_PET_SCALING: return { "SPELL_ATTR4_IS_PET_SCALING", "SPELL_ATTR4_IS_PET_SCALING", "25 pet scaling auras" }; + case SPELL_ATTR4_CAST_ONLY_IN_OUTLAND: return { "SPELL_ATTR4_CAST_ONLY_IN_OUTLAND", "SPELL_ATTR4_CAST_ONLY_IN_OUTLAND", "26 Can only be used in Outland." }; + case SPELL_ATTR4_UNK27: return { "SPELL_ATTR4_UNK27", "SPELL_ATTR4_UNK27", "27" }; + case SPELL_ATTR4_UNK28: return { "SPELL_ATTR4_UNK28", "SPELL_ATTR4_UNK28", "28 Aimed Shot" }; + case SPELL_ATTR4_UNK29: return { "SPELL_ATTR4_UNK29", "SPELL_ATTR4_UNK29", "29" }; + case SPELL_ATTR4_UNK30: return { "SPELL_ATTR4_UNK30", "SPELL_ATTR4_UNK30", "30" }; + case SPELL_ATTR4_UNK31: return { "SPELL_ATTR4_UNK31", "SPELL_ATTR4_UNK31", "31 Polymorph (chicken) 228 and Sonic Boom (38052, 38488)" }; + default: throw std::out_of_range("value"); + } +} + +template <> +TC_API_EXPORT size_t EnumUtils<SpellAttr4>::Count() { return 32; } + +template <> +TC_API_EXPORT SpellAttr4 EnumUtils<SpellAttr4>::FromIndex(size_t index) +{ + switch (index) + { + case 0: return SPELL_ATTR4_IGNORE_RESISTANCES; + case 1: return SPELL_ATTR4_PROC_ONLY_ON_CASTER; + case 2: return SPELL_ATTR4_AURA_EXPIRES_OFFLINE; + case 3: return SPELL_ATTR4_UNK3; + case 4: return SPELL_ATTR4_UNK4; + case 5: return SPELL_ATTR4_UNK5; + case 6: return SPELL_ATTR4_NOT_STEALABLE; + case 7: return SPELL_ATTR4_CAN_CAST_WHILE_CASTING; + case 8: return SPELL_ATTR4_FIXED_DAMAGE; + case 9: return SPELL_ATTR4_TRIGGER_ACTIVATE; + case 10: return SPELL_ATTR4_SPELL_VS_EXTEND_COST; + case 11: return SPELL_ATTR4_UNK11; + case 12: return SPELL_ATTR4_UNK12; + case 13: return SPELL_ATTR4_COMBAT_LOG_NO_CASTER; + case 14: return SPELL_ATTR4_DAMAGE_DOESNT_BREAK_AURAS; + case 15: return SPELL_ATTR4_HIDDEN_IN_SPELLBOOK; + case 16: return SPELL_ATTR4_NOT_USABLE_IN_ARENA_OR_RATED_BG; + case 17: return SPELL_ATTR4_USABLE_IN_ARENA; + case 18: return SPELL_ATTR4_AREA_TARGET_CHAIN; + case 19: return SPELL_ATTR4_UNK19; + case 20: return SPELL_ATTR4_NOT_CHECK_SELFCAST_POWER; + case 21: return SPELL_ATTR4_DONT_REMOVE_IN_ARENA; + case 22: return SPELL_ATTR4_UNK22; + case 23: return SPELL_ATTR4_SUPPRESS_WEAPON_PROCS; + case 24: return SPELL_ATTR4_UNK24; + case 25: return SPELL_ATTR4_IS_PET_SCALING; + case 26: return SPELL_ATTR4_CAST_ONLY_IN_OUTLAND; + case 27: return SPELL_ATTR4_UNK27; + case 28: return SPELL_ATTR4_UNK28; + case 29: return SPELL_ATTR4_UNK29; + case 30: return SPELL_ATTR4_UNK30; + case 31: return SPELL_ATTR4_UNK31; + default: throw std::out_of_range("index"); + } +} + +/******************************************************************\ +|* data for enum 'SpellAttr5' in 'SharedDefines.h' auto-generated *| +\******************************************************************/ +template <> +TC_API_EXPORT EnumText EnumUtils<SpellAttr5>::ToString(SpellAttr5 value) +{ + switch (value) + { + case SPELL_ATTR5_CAN_CHANNEL_WHEN_MOVING: return { "SPELL_ATTR5_CAN_CHANNEL_WHEN_MOVING", "SPELL_ATTR5_CAN_CHANNEL_WHEN_MOVING", "0 available casting channel spell when moving" }; + case SPELL_ATTR5_NO_REAGENT_WHILE_PREP: return { "SPELL_ATTR5_NO_REAGENT_WHILE_PREP", "SPELL_ATTR5_NO_REAGENT_WHILE_PREP", "1 not need reagents if UNIT_FLAG_PREPARATION" }; + case SPELL_ATTR5_REMOVE_ENTERING_ARENA: return { "SPELL_ATTR5_REMOVE_ENTERING_ARENA", "SPELL_ATTR5_REMOVE_ENTERING_ARENA", "2 remove this aura on arena enter" }; + case SPELL_ATTR5_USABLE_WHILE_STUNNED: return { "SPELL_ATTR5_USABLE_WHILE_STUNNED", "SPELL_ATTR5_USABLE_WHILE_STUNNED", "3 usable while stunned" }; + case SPELL_ATTR5_UNK4: return { "SPELL_ATTR5_UNK4", "SPELL_ATTR5_UNK4", "4" }; + case SPELL_ATTR5_SINGLE_TARGET_SPELL: return { "SPELL_ATTR5_SINGLE_TARGET_SPELL", "SPELL_ATTR5_SINGLE_TARGET_SPELL", "5 Only one target can be apply at a time" }; + case SPELL_ATTR5_UNK6: return { "SPELL_ATTR5_UNK6", "SPELL_ATTR5_UNK6", "6" }; + case SPELL_ATTR5_UNK7: return { "SPELL_ATTR5_UNK7", "SPELL_ATTR5_UNK7", "7" }; + case SPELL_ATTR5_CANT_TARGET_PLAYER_CONTROLLED: return { "SPELL_ATTR5_CANT_TARGET_PLAYER_CONTROLLED", "SPELL_ATTR5_CANT_TARGET_PLAYER_CONTROLLED", "8 cannot target player controlled units but can target players" }; + case SPELL_ATTR5_START_PERIODIC_AT_APPLY: return { "SPELL_ATTR5_START_PERIODIC_AT_APPLY", "SPELL_ATTR5_START_PERIODIC_AT_APPLY", "9 begin periodic tick at aura apply" }; + case SPELL_ATTR5_HIDE_DURATION: return { "SPELL_ATTR5_HIDE_DURATION", "SPELL_ATTR5_HIDE_DURATION", "10 do not send duration to client" }; + case SPELL_ATTR5_ALLOW_TARGET_OF_TARGET_AS_TARGET: return { "SPELL_ATTR5_ALLOW_TARGET_OF_TARGET_AS_TARGET", "SPELL_ATTR5_ALLOW_TARGET_OF_TARGET_AS_TARGET", "11 (NYI) uses target's target as target if original target not valid (intervene for example)" }; + case SPELL_ATTR5_UNK12: return { "SPELL_ATTR5_UNK12", "SPELL_ATTR5_UNK12", "12 Cleave related?" }; + case SPELL_ATTR5_HASTE_AFFECT_DURATION: return { "SPELL_ATTR5_HASTE_AFFECT_DURATION", "SPELL_ATTR5_HASTE_AFFECT_DURATION", "13 haste effects decrease duration of this" }; + case SPELL_ATTR5_NOT_USABLE_WHILE_CHARMED: return { "SPELL_ATTR5_NOT_USABLE_WHILE_CHARMED", "SPELL_ATTR5_NOT_USABLE_WHILE_CHARMED", "14 Charmed units cannot cast this spell" }; + case SPELL_ATTR5_UNK15: return { "SPELL_ATTR5_UNK15", "SPELL_ATTR5_UNK15", "15 Inflits on multiple targets?" }; + case SPELL_ATTR5_UNK16: return { "SPELL_ATTR5_UNK16", "SPELL_ATTR5_UNK16", "16" }; + case SPELL_ATTR5_USABLE_WHILE_FEARED: return { "SPELL_ATTR5_USABLE_WHILE_FEARED", "SPELL_ATTR5_USABLE_WHILE_FEARED", "17 usable while feared" }; + case SPELL_ATTR5_USABLE_WHILE_CONFUSED: return { "SPELL_ATTR5_USABLE_WHILE_CONFUSED", "SPELL_ATTR5_USABLE_WHILE_CONFUSED", "18 usable while confused" }; + case SPELL_ATTR5_DONT_TURN_DURING_CAST: return { "SPELL_ATTR5_DONT_TURN_DURING_CAST", "SPELL_ATTR5_DONT_TURN_DURING_CAST", "19 Blocks caster's turning when casting (client does not automatically turn caster's model to face UNIT_FIELD_TARGET)" }; + case SPELL_ATTR5_UNK20: return { "SPELL_ATTR5_UNK20", "SPELL_ATTR5_UNK20", "20" }; + case SPELL_ATTR5_UNK21: return { "SPELL_ATTR5_UNK21", "SPELL_ATTR5_UNK21", "21" }; + case SPELL_ATTR5_UNK22: return { "SPELL_ATTR5_UNK22", "SPELL_ATTR5_UNK22", "22" }; + case SPELL_ATTR5_UNK23: return { "SPELL_ATTR5_UNK23", "SPELL_ATTR5_UNK23", "23" }; + case SPELL_ATTR5_UNK24: return { "SPELL_ATTR5_UNK24", "SPELL_ATTR5_UNK24", "24" }; + case SPELL_ATTR5_UNK25: return { "SPELL_ATTR5_UNK25", "SPELL_ATTR5_UNK25", "25" }; + case SPELL_ATTR5_ALWAYS_AOE_LINE_OF_SIGHT: return { "SPELL_ATTR5_ALWAYS_AOE_LINE_OF_SIGHT", "SPELL_ATTR5_ALWAYS_AOE_LINE_OF_SIGHT", "26 aoe related - Boulder, Cannon, Corpse Explosion, Fire Nova, Flames, Frost Bomb, Living Bomb, Seed of Corruption, Starfall, Thunder Clap, Volley" }; + case SPELL_ATTR5_DONT_SHOW_AURA_IF_SELF_CAST: return { "SPELL_ATTR5_DONT_SHOW_AURA_IF_SELF_CAST", "SPELL_ATTR5_DONT_SHOW_AURA_IF_SELF_CAST", "27 Auras with this attribute are not visible on units that are the caster" }; + case SPELL_ATTR5_DONT_SHOW_AURA_IF_NOT_SELF_CAST: return { "SPELL_ATTR5_DONT_SHOW_AURA_IF_NOT_SELF_CAST", "SPELL_ATTR5_DONT_SHOW_AURA_IF_NOT_SELF_CAST", "28 Auras with this attribute are not visible on units that are not the caster" }; + case SPELL_ATTR5_UNK29: return { "SPELL_ATTR5_UNK29", "SPELL_ATTR5_UNK29", "29" }; + case SPELL_ATTR5_UNK30: return { "SPELL_ATTR5_UNK30", "SPELL_ATTR5_UNK30", "30" }; + case SPELL_ATTR5_UNK31: return { "SPELL_ATTR5_UNK31", "SPELL_ATTR5_UNK31", "31 Forces all nearby enemies to focus attacks caster" }; + default: throw std::out_of_range("value"); + } +} + +template <> +TC_API_EXPORT size_t EnumUtils<SpellAttr5>::Count() { return 32; } + +template <> +TC_API_EXPORT SpellAttr5 EnumUtils<SpellAttr5>::FromIndex(size_t index) +{ + switch (index) + { + case 0: return SPELL_ATTR5_CAN_CHANNEL_WHEN_MOVING; + case 1: return SPELL_ATTR5_NO_REAGENT_WHILE_PREP; + case 2: return SPELL_ATTR5_REMOVE_ENTERING_ARENA; + case 3: return SPELL_ATTR5_USABLE_WHILE_STUNNED; + case 4: return SPELL_ATTR5_UNK4; + case 5: return SPELL_ATTR5_SINGLE_TARGET_SPELL; + case 6: return SPELL_ATTR5_UNK6; + case 7: return SPELL_ATTR5_UNK7; + case 8: return SPELL_ATTR5_CANT_TARGET_PLAYER_CONTROLLED; + case 9: return SPELL_ATTR5_START_PERIODIC_AT_APPLY; + case 10: return SPELL_ATTR5_HIDE_DURATION; + case 11: return SPELL_ATTR5_ALLOW_TARGET_OF_TARGET_AS_TARGET; + case 12: return SPELL_ATTR5_UNK12; + case 13: return SPELL_ATTR5_HASTE_AFFECT_DURATION; + case 14: return SPELL_ATTR5_NOT_USABLE_WHILE_CHARMED; + case 15: return SPELL_ATTR5_UNK15; + case 16: return SPELL_ATTR5_UNK16; + case 17: return SPELL_ATTR5_USABLE_WHILE_FEARED; + case 18: return SPELL_ATTR5_USABLE_WHILE_CONFUSED; + case 19: return SPELL_ATTR5_DONT_TURN_DURING_CAST; + case 20: return SPELL_ATTR5_UNK20; + case 21: return SPELL_ATTR5_UNK21; + case 22: return SPELL_ATTR5_UNK22; + case 23: return SPELL_ATTR5_UNK23; + case 24: return SPELL_ATTR5_UNK24; + case 25: return SPELL_ATTR5_UNK25; + case 26: return SPELL_ATTR5_ALWAYS_AOE_LINE_OF_SIGHT; + case 27: return SPELL_ATTR5_DONT_SHOW_AURA_IF_SELF_CAST; + case 28: return SPELL_ATTR5_DONT_SHOW_AURA_IF_NOT_SELF_CAST; + case 29: return SPELL_ATTR5_UNK29; + case 30: return SPELL_ATTR5_UNK30; + case 31: return SPELL_ATTR5_UNK31; + default: throw std::out_of_range("index"); + } +} + +/******************************************************************\ +|* data for enum 'SpellAttr6' in 'SharedDefines.h' auto-generated *| +\******************************************************************/ +template <> +TC_API_EXPORT EnumText EnumUtils<SpellAttr6>::ToString(SpellAttr6 value) +{ + switch (value) + { + case SPELL_ATTR6_DONT_DISPLAY_COOLDOWN: return { "SPELL_ATTR6_DONT_DISPLAY_COOLDOWN", "SPELL_ATTR6_DONT_DISPLAY_COOLDOWN", "0 client doesn't display cooldown in tooltip for these spells" }; + case SPELL_ATTR6_ONLY_IN_ARENA: return { "SPELL_ATTR6_ONLY_IN_ARENA", "SPELL_ATTR6_ONLY_IN_ARENA", "1 only usable in arena" }; + case SPELL_ATTR6_IGNORE_CASTER_AURAS: return { "SPELL_ATTR6_IGNORE_CASTER_AURAS", "SPELL_ATTR6_IGNORE_CASTER_AURAS", "2" }; + case SPELL_ATTR6_ASSIST_IGNORE_IMMUNE_FLAG: return { "SPELL_ATTR6_ASSIST_IGNORE_IMMUNE_FLAG", "SPELL_ATTR6_ASSIST_IGNORE_IMMUNE_FLAG", "3 skips checking UNIT_FLAG_IMMUNE_TO_PC and UNIT_FLAG_IMMUNE_TO_NPC flags on assist" }; + case SPELL_ATTR6_UNK4: return { "SPELL_ATTR6_UNK4", "SPELL_ATTR6_UNK4", "4" }; + case SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES: return { "SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES", "SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES", "5 dont consume proc charges" }; + case SPELL_ATTR6_USE_SPELL_CAST_EVENT: return { "SPELL_ATTR6_USE_SPELL_CAST_EVENT", "SPELL_ATTR6_USE_SPELL_CAST_EVENT", "6 Auras with this attribute trigger SPELL_CAST combat log event instead of SPELL_AURA_START (clientside attribute)" }; + case SPELL_ATTR6_UNK7: return { "SPELL_ATTR6_UNK7", "SPELL_ATTR6_UNK7", "7" }; + case SPELL_ATTR6_CANT_TARGET_CROWD_CONTROLLED: return { "SPELL_ATTR6_CANT_TARGET_CROWD_CONTROLLED", "SPELL_ATTR6_CANT_TARGET_CROWD_CONTROLLED", "8" }; + case SPELL_ATTR6_UNK9: return { "SPELL_ATTR6_UNK9", "SPELL_ATTR6_UNK9", "9" }; + case SPELL_ATTR6_CAN_TARGET_POSSESSED_FRIENDS: return { "SPELL_ATTR6_CAN_TARGET_POSSESSED_FRIENDS", "SPELL_ATTR6_CAN_TARGET_POSSESSED_FRIENDS", "10 NYI!" }; + case SPELL_ATTR6_NOT_IN_RAID_INSTANCE: return { "SPELL_ATTR6_NOT_IN_RAID_INSTANCE", "SPELL_ATTR6_NOT_IN_RAID_INSTANCE", "11 not usable in raid instance" }; + case SPELL_ATTR6_CASTABLE_WHILE_ON_VEHICLE: return { "SPELL_ATTR6_CASTABLE_WHILE_ON_VEHICLE", "SPELL_ATTR6_CASTABLE_WHILE_ON_VEHICLE", "12 castable while caster is on vehicle" }; + case SPELL_ATTR6_CAN_TARGET_INVISIBLE: return { "SPELL_ATTR6_CAN_TARGET_INVISIBLE", "SPELL_ATTR6_CAN_TARGET_INVISIBLE", "13 ignore visibility requirement for spell target (phases, invisibility, etc.)" }; + case SPELL_ATTR6_UNK14: return { "SPELL_ATTR6_UNK14", "SPELL_ATTR6_UNK14", "14" }; + case SPELL_ATTR6_UNK15: return { "SPELL_ATTR6_UNK15", "SPELL_ATTR6_UNK15", "15 only 54368, 67892" }; + case SPELL_ATTR6_UNK16: return { "SPELL_ATTR6_UNK16", "SPELL_ATTR6_UNK16", "16" }; + case SPELL_ATTR6_UNK17: return { "SPELL_ATTR6_UNK17", "SPELL_ATTR6_UNK17", "17 Mount spell" }; + case SPELL_ATTR6_CAST_BY_CHARMER: return { "SPELL_ATTR6_CAST_BY_CHARMER", "SPELL_ATTR6_CAST_BY_CHARMER", "18 client won't allow to cast these spells when unit is not possessed && charmer of caster will be original caster" }; + case SPELL_ATTR6_UNK19: return { "SPELL_ATTR6_UNK19", "SPELL_ATTR6_UNK19", "19 only 47488, 50782" }; + case SPELL_ATTR6_ONLY_VISIBLE_TO_CASTER: return { "SPELL_ATTR6_ONLY_VISIBLE_TO_CASTER", "SPELL_ATTR6_ONLY_VISIBLE_TO_CASTER", "20 Auras with this attribute are only visible to their caster (or pet's owner)" }; + case SPELL_ATTR6_CLIENT_UI_TARGET_EFFECTS: return { "SPELL_ATTR6_CLIENT_UI_TARGET_EFFECTS", "SPELL_ATTR6_CLIENT_UI_TARGET_EFFECTS", "21 it's only client-side attribute" }; + case SPELL_ATTR6_UNK22: return { "SPELL_ATTR6_UNK22", "SPELL_ATTR6_UNK22", "22 only 72054" }; + case SPELL_ATTR6_UNK23: return { "SPELL_ATTR6_UNK23", "SPELL_ATTR6_UNK23", "23" }; + case SPELL_ATTR6_CAN_TARGET_UNTARGETABLE: return { "SPELL_ATTR6_CAN_TARGET_UNTARGETABLE", "SPELL_ATTR6_CAN_TARGET_UNTARGETABLE", "24" }; + case SPELL_ATTR6_NOT_RESET_SWING_IF_INSTANT: return { "SPELL_ATTR6_NOT_RESET_SWING_IF_INSTANT", "SPELL_ATTR6_NOT_RESET_SWING_IF_INSTANT", "25 Exorcism, Flash of Light" }; + case SPELL_ATTR6_UNK26: return { "SPELL_ATTR6_UNK26", "SPELL_ATTR6_UNK26", "26 related to player castable positive buff" }; + case SPELL_ATTR6_IGNORE_HEALING_MODIFIERS: return { "SPELL_ATTR6_IGNORE_HEALING_MODIFIERS", "SPELL_ATTR6_IGNORE_HEALING_MODIFIERS", "27 some custom rules - complicated" }; + case SPELL_ATTR6_UNK28: return { "SPELL_ATTR6_UNK28", "SPELL_ATTR6_UNK28", "28 Death Grip" }; + case SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS: return { "SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS", "SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS", "29 ignores done percent damage mods? some custom rules - complicated" }; + case SPELL_ATTR6_UNK30: return { "SPELL_ATTR6_UNK30", "SPELL_ATTR6_UNK30", "30" }; + case SPELL_ATTR6_IGNORE_CATEGORY_COOLDOWN_MODS: return { "SPELL_ATTR6_IGNORE_CATEGORY_COOLDOWN_MODS", "SPELL_ATTR6_IGNORE_CATEGORY_COOLDOWN_MODS", "31 Spells with this attribute skip applying modifiers to category cooldowns" }; + default: throw std::out_of_range("value"); + } +} + +template <> +TC_API_EXPORT size_t EnumUtils<SpellAttr6>::Count() { return 32; } + +template <> +TC_API_EXPORT SpellAttr6 EnumUtils<SpellAttr6>::FromIndex(size_t index) +{ + switch (index) + { + case 0: return SPELL_ATTR6_DONT_DISPLAY_COOLDOWN; + case 1: return SPELL_ATTR6_ONLY_IN_ARENA; + case 2: return SPELL_ATTR6_IGNORE_CASTER_AURAS; + case 3: return SPELL_ATTR6_ASSIST_IGNORE_IMMUNE_FLAG; + case 4: return SPELL_ATTR6_UNK4; + case 5: return SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES; + case 6: return SPELL_ATTR6_USE_SPELL_CAST_EVENT; + case 7: return SPELL_ATTR6_UNK7; + case 8: return SPELL_ATTR6_CANT_TARGET_CROWD_CONTROLLED; + case 9: return SPELL_ATTR6_UNK9; + case 10: return SPELL_ATTR6_CAN_TARGET_POSSESSED_FRIENDS; + case 11: return SPELL_ATTR6_NOT_IN_RAID_INSTANCE; + case 12: return SPELL_ATTR6_CASTABLE_WHILE_ON_VEHICLE; + case 13: return SPELL_ATTR6_CAN_TARGET_INVISIBLE; + case 14: return SPELL_ATTR6_UNK14; + case 15: return SPELL_ATTR6_UNK15; + case 16: return SPELL_ATTR6_UNK16; + case 17: return SPELL_ATTR6_UNK17; + case 18: return SPELL_ATTR6_CAST_BY_CHARMER; + case 19: return SPELL_ATTR6_UNK19; + case 20: return SPELL_ATTR6_ONLY_VISIBLE_TO_CASTER; + case 21: return SPELL_ATTR6_CLIENT_UI_TARGET_EFFECTS; + case 22: return SPELL_ATTR6_UNK22; + case 23: return SPELL_ATTR6_UNK23; + case 24: return SPELL_ATTR6_CAN_TARGET_UNTARGETABLE; + case 25: return SPELL_ATTR6_NOT_RESET_SWING_IF_INSTANT; + case 26: return SPELL_ATTR6_UNK26; + case 27: return SPELL_ATTR6_IGNORE_HEALING_MODIFIERS; + case 28: return SPELL_ATTR6_UNK28; + case 29: return SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS; + case 30: return SPELL_ATTR6_UNK30; + case 31: return SPELL_ATTR6_IGNORE_CATEGORY_COOLDOWN_MODS; + default: throw std::out_of_range("index"); + } +} + +/******************************************************************\ +|* data for enum 'SpellAttr7' in 'SharedDefines.h' auto-generated *| +\******************************************************************/ +template <> +TC_API_EXPORT EnumText EnumUtils<SpellAttr7>::ToString(SpellAttr7 value) +{ + switch (value) + { + case SPELL_ATTR7_UNK0: return { "SPELL_ATTR7_UNK0", "SPELL_ATTR7_UNK0", "0 Shaman's new spells (Call of the ...), Feign Death." }; + case SPELL_ATTR7_IGNORE_DURATION_MODS: return { "SPELL_ATTR7_IGNORE_DURATION_MODS", "SPELL_ATTR7_IGNORE_DURATION_MODS", "1 Duration is not affected by duration modifiers" }; + case SPELL_ATTR7_REACTIVATE_AT_RESURRECT: return { "SPELL_ATTR7_REACTIVATE_AT_RESURRECT", "SPELL_ATTR7_REACTIVATE_AT_RESURRECT", "2 Paladin's auras and 65607 only." }; + case SPELL_ATTR7_IS_CHEAT_SPELL: return { "SPELL_ATTR7_IS_CHEAT_SPELL", "SPELL_ATTR7_IS_CHEAT_SPELL", "3 Cannot cast if caster doesn't have UnitFlag2 & UNIT_FLAG2_ALLOW_CHEAT_SPELLS" }; + case SPELL_ATTR7_UNK4: return { "SPELL_ATTR7_UNK4", "SPELL_ATTR7_UNK4", "4 Only 47883 (Soulstone Resurrection) and test spell." }; + case SPELL_ATTR7_SUMMON_TOTEM: return { "SPELL_ATTR7_SUMMON_TOTEM", "SPELL_ATTR7_SUMMON_TOTEM", "5 Only Shaman totems." }; + case SPELL_ATTR7_NO_PUSHBACK_ON_DAMAGE: return { "SPELL_ATTR7_NO_PUSHBACK_ON_DAMAGE", "SPELL_ATTR7_NO_PUSHBACK_ON_DAMAGE", "6 Does not cause spell pushback on damage" }; + case SPELL_ATTR7_UNK7: return { "SPELL_ATTR7_UNK7", "SPELL_ATTR7_UNK7", "7 66218 (Launch) spell." }; + case SPELL_ATTR7_HORDE_ONLY: return { "SPELL_ATTR7_HORDE_ONLY", "SPELL_ATTR7_HORDE_ONLY", "8 Teleports, mounts and other spells." }; + case SPELL_ATTR7_ALLIANCE_ONLY: return { "SPELL_ATTR7_ALLIANCE_ONLY", "SPELL_ATTR7_ALLIANCE_ONLY", "9 Teleports, mounts and other spells." }; + case SPELL_ATTR7_DISPEL_CHARGES: return { "SPELL_ATTR7_DISPEL_CHARGES", "SPELL_ATTR7_DISPEL_CHARGES", "10 Dispel and Spellsteal individual charges instead of whole aura." }; + case SPELL_ATTR7_INTERRUPT_ONLY_NONPLAYER: return { "SPELL_ATTR7_INTERRUPT_ONLY_NONPLAYER", "SPELL_ATTR7_INTERRUPT_ONLY_NONPLAYER", "11 Only non-player casts interrupt, though Feral Charge - Bear has it." }; + case SPELL_ATTR7_SILENCE_ONLY_NONPLAYER: return { "SPELL_ATTR7_SILENCE_ONLY_NONPLAYER", "SPELL_ATTR7_SILENCE_ONLY_NONPLAYER", "12 Not set in 3.2.2a." }; + case SPELL_ATTR7_CAN_ALWAYS_BE_INTERRUPTED: return { "SPELL_ATTR7_CAN_ALWAYS_BE_INTERRUPTED", "SPELL_ATTR7_CAN_ALWAYS_BE_INTERRUPTED", "13 Can always be interrupted, even if caster is immune" }; + case SPELL_ATTR7_UNK14: return { "SPELL_ATTR7_UNK14", "SPELL_ATTR7_UNK14", "14 Only 52150 (Raise Dead - Pet) spell." }; + case SPELL_ATTR7_UNK15: return { "SPELL_ATTR7_UNK15", "SPELL_ATTR7_UNK15", "15 Exorcism. Usable on players? 100% crit chance on undead and demons?" }; + case SPELL_ATTR7_HIDDEN_IN_SPELLBOOK_WHEN_LEARNED: return { "SPELL_ATTR7_HIDDEN_IN_SPELLBOOK_WHEN_LEARNED", "SPELL_ATTR7_HIDDEN_IN_SPELLBOOK_WHEN_LEARNED", "16 After learning these spells become hidden in spellbook (but are visible when not learned for low level characters)" }; + case SPELL_ATTR7_UNK17: return { "SPELL_ATTR7_UNK17", "SPELL_ATTR7_UNK17", "17 Only 27965 (Suicide) spell." }; + case SPELL_ATTR7_HAS_CHARGE_EFFECT: return { "SPELL_ATTR7_HAS_CHARGE_EFFECT", "SPELL_ATTR7_HAS_CHARGE_EFFECT", "18 Only spells that have Charge among effects." }; + case SPELL_ATTR7_ZONE_TELEPORT: return { "SPELL_ATTR7_ZONE_TELEPORT", "SPELL_ATTR7_ZONE_TELEPORT", "19 Teleports to specific zones." }; + case SPELL_ATTR7_UNK20: return { "SPELL_ATTR7_UNK20", "SPELL_ATTR7_UNK20", "20 Blink, Divine Shield, Ice Block" }; + case SPELL_ATTR7_UNK21: return { "SPELL_ATTR7_UNK21", "SPELL_ATTR7_UNK21", "21 Not set" }; + case SPELL_ATTR7_UNK22: return { "SPELL_ATTR7_UNK22", "SPELL_ATTR7_UNK22", "22" }; + case SPELL_ATTR7_UNK23: return { "SPELL_ATTR7_UNK23", "SPELL_ATTR7_UNK23", "23 Motivate, Mutilate, Shattering Throw" }; + case SPELL_ATTR7_UNK24: return { "SPELL_ATTR7_UNK24", "SPELL_ATTR7_UNK24", "24 Motivate, Mutilate, Perform Speech, Shattering Throw" }; + case SPELL_ATTR7_UNK25: return { "SPELL_ATTR7_UNK25", "SPELL_ATTR7_UNK25", "25" }; + case SPELL_ATTR7_UNK26: return { "SPELL_ATTR7_UNK26", "SPELL_ATTR7_UNK26", "26" }; + case SPELL_ATTR7_UNK27: return { "SPELL_ATTR7_UNK27", "SPELL_ATTR7_UNK27", "27 Not set" }; + case SPELL_ATTR7_CONSOLIDATED_RAID_BUFF: return { "SPELL_ATTR7_CONSOLIDATED_RAID_BUFF", "SPELL_ATTR7_CONSOLIDATED_RAID_BUFF", "28 May be collapsed in raid buff frame (clientside attribute)" }; + case SPELL_ATTR7_UNK29: return { "SPELL_ATTR7_UNK29", "SPELL_ATTR7_UNK29", "29 only 69028, 71237" }; + case SPELL_ATTR7_UNK30: return { "SPELL_ATTR7_UNK30", "SPELL_ATTR7_UNK30", "30 Burning Determination, Divine Sacrifice, Earth Shield, Prayer of Mending" }; + case SPELL_ATTR7_CLIENT_INDICATOR: return { "SPELL_ATTR7_CLIENT_INDICATOR", "SPELL_ATTR7_CLIENT_INDICATOR", "" }; + default: throw std::out_of_range("value"); + } +} + +template <> +TC_API_EXPORT size_t EnumUtils<SpellAttr7>::Count() { return 32; } + +template <> +TC_API_EXPORT SpellAttr7 EnumUtils<SpellAttr7>::FromIndex(size_t index) +{ + switch (index) + { + case 0: return SPELL_ATTR7_UNK0; + case 1: return SPELL_ATTR7_IGNORE_DURATION_MODS; + case 2: return SPELL_ATTR7_REACTIVATE_AT_RESURRECT; + case 3: return SPELL_ATTR7_IS_CHEAT_SPELL; + case 4: return SPELL_ATTR7_UNK4; + case 5: return SPELL_ATTR7_SUMMON_TOTEM; + case 6: return SPELL_ATTR7_NO_PUSHBACK_ON_DAMAGE; + case 7: return SPELL_ATTR7_UNK7; + case 8: return SPELL_ATTR7_HORDE_ONLY; + case 9: return SPELL_ATTR7_ALLIANCE_ONLY; + case 10: return SPELL_ATTR7_DISPEL_CHARGES; + case 11: return SPELL_ATTR7_INTERRUPT_ONLY_NONPLAYER; + case 12: return SPELL_ATTR7_SILENCE_ONLY_NONPLAYER; + case 13: return SPELL_ATTR7_CAN_ALWAYS_BE_INTERRUPTED; + case 14: return SPELL_ATTR7_UNK14; + case 15: return SPELL_ATTR7_UNK15; + case 16: return SPELL_ATTR7_HIDDEN_IN_SPELLBOOK_WHEN_LEARNED; + case 17: return SPELL_ATTR7_UNK17; + case 18: return SPELL_ATTR7_HAS_CHARGE_EFFECT; + case 19: return SPELL_ATTR7_ZONE_TELEPORT; + case 20: return SPELL_ATTR7_UNK20; + case 21: return SPELL_ATTR7_UNK21; + case 22: return SPELL_ATTR7_UNK22; + case 23: return SPELL_ATTR7_UNK23; + case 24: return SPELL_ATTR7_UNK24; + case 25: return SPELL_ATTR7_UNK25; + case 26: return SPELL_ATTR7_UNK26; + case 27: return SPELL_ATTR7_UNK27; + case 28: return SPELL_ATTR7_CONSOLIDATED_RAID_BUFF; + case 29: return SPELL_ATTR7_UNK29; + case 30: return SPELL_ATTR7_UNK30; + case 31: return SPELL_ATTR7_CLIENT_INDICATOR; + default: throw std::out_of_range("index"); + } +} + +/******************************************************************\ +|* data for enum 'SpellAttr8' in 'SharedDefines.h' auto-generated *| +\******************************************************************/ +template <> +TC_API_EXPORT EnumText EnumUtils<SpellAttr8>::ToString(SpellAttr8 value) +{ + switch (value) + { + case SPELL_ATTR8_CANT_MISS: return { "SPELL_ATTR8_CANT_MISS", "SPELL_ATTR8_CANT_MISS", "0" }; + case SPELL_ATTR8_UNK1: return { "SPELL_ATTR8_UNK1", "SPELL_ATTR8_UNK1", "1" }; + case SPELL_ATTR8_UNK2: return { "SPELL_ATTR8_UNK2", "SPELL_ATTR8_UNK2", "2" }; + case SPELL_ATTR8_UNK3: return { "SPELL_ATTR8_UNK3", "SPELL_ATTR8_UNK3", "3" }; + case SPELL_ATTR8_UNK4: return { "SPELL_ATTR8_UNK4", "SPELL_ATTR8_UNK4", "4" }; + case SPELL_ATTR8_UNK5: return { "SPELL_ATTR8_UNK5", "SPELL_ATTR8_UNK5", "5" }; + case SPELL_ATTR8_UNK6: return { "SPELL_ATTR8_UNK6", "SPELL_ATTR8_UNK6", "6" }; + case SPELL_ATTR8_UNK7: return { "SPELL_ATTR8_UNK7", "SPELL_ATTR8_UNK7", "7" }; + case SPELL_ATTR8_AFFECT_PARTY_AND_RAID: return { "SPELL_ATTR8_AFFECT_PARTY_AND_RAID", "SPELL_ATTR8_AFFECT_PARTY_AND_RAID", "8 Nearly all spells have \042all party and raid\042 in description" }; + case SPELL_ATTR8_DONT_RESET_PERIODIC_TIMER: return { "SPELL_ATTR8_DONT_RESET_PERIODIC_TIMER", "SPELL_ATTR8_DONT_RESET_PERIODIC_TIMER", "9 Periodic auras with this flag keep old periodic timer when refreshing at close to one tick remaining (kind of anti DoT clipping)" }; + case SPELL_ATTR8_NAME_CHANGED_DURING_TRANSFORM: return { "SPELL_ATTR8_NAME_CHANGED_DURING_TRANSFORM", "SPELL_ATTR8_NAME_CHANGED_DURING_TRANSFORM", "10 according to wowhead comments, name changes, title remains" }; + case SPELL_ATTR8_UNK11: return { "SPELL_ATTR8_UNK11", "SPELL_ATTR8_UNK11", "11" }; + case SPELL_ATTR8_AURA_SEND_AMOUNT: return { "SPELL_ATTR8_AURA_SEND_AMOUNT", "SPELL_ATTR8_AURA_SEND_AMOUNT", "12 Aura must have flag AFLAG_ANY_EFFECT_AMOUNT_SENT to send amount" }; + case SPELL_ATTR8_UNK13: return { "SPELL_ATTR8_UNK13", "SPELL_ATTR8_UNK13", "13" }; + case SPELL_ATTR8_UNK14: return { "SPELL_ATTR8_UNK14", "SPELL_ATTR8_UNK14", "14" }; + case SPELL_ATTR8_WATER_MOUNT: return { "SPELL_ATTR8_WATER_MOUNT", "SPELL_ATTR8_WATER_MOUNT", "15 only one River Boat used in Thousand Needles" }; + case SPELL_ATTR8_UNK16: return { "SPELL_ATTR8_UNK16", "SPELL_ATTR8_UNK16", "16" }; + case SPELL_ATTR8_UNK17: return { "SPELL_ATTR8_UNK17", "SPELL_ATTR8_UNK17", "17" }; + case SPELL_ATTR8_REMEMBER_SPELLS: return { "SPELL_ATTR8_REMEMBER_SPELLS", "SPELL_ATTR8_REMEMBER_SPELLS", "18 at some point in time, these auras remember spells and allow to cast them later" }; + case SPELL_ATTR8_USE_COMBO_POINTS_ON_ANY_TARGET: return { "SPELL_ATTR8_USE_COMBO_POINTS_ON_ANY_TARGET", "SPELL_ATTR8_USE_COMBO_POINTS_ON_ANY_TARGET", "19 allows to consume combo points from dead targets" }; + case SPELL_ATTR8_ARMOR_SPECIALIZATION: return { "SPELL_ATTR8_ARMOR_SPECIALIZATION", "SPELL_ATTR8_ARMOR_SPECIALIZATION", "20" }; + case SPELL_ATTR8_UNK21: return { "SPELL_ATTR8_UNK21", "SPELL_ATTR8_UNK21", "21" }; + case SPELL_ATTR8_UNK22: return { "SPELL_ATTR8_UNK22", "SPELL_ATTR8_UNK22", "22" }; + case SPELL_ATTR8_BATTLE_RESURRECTION: return { "SPELL_ATTR8_BATTLE_RESURRECTION", "SPELL_ATTR8_BATTLE_RESURRECTION", "23 Used to limit the Amount of Resurrections in Boss Encounters" }; + case SPELL_ATTR8_HEALING_SPELL: return { "SPELL_ATTR8_HEALING_SPELL", "SPELL_ATTR8_HEALING_SPELL", "24" }; + case SPELL_ATTR8_UNK25: return { "SPELL_ATTR8_UNK25", "SPELL_ATTR8_UNK25", "25" }; + case SPELL_ATTR8_RAID_MARKER: return { "SPELL_ATTR8_RAID_MARKER", "SPELL_ATTR8_RAID_MARKER", "26 probably spell no need learn to cast" }; + case SPELL_ATTR8_UNK27: return { "SPELL_ATTR8_UNK27", "SPELL_ATTR8_UNK27", "27" }; + case SPELL_ATTR8_NOT_IN_BG_OR_ARENA: return { "SPELL_ATTR8_NOT_IN_BG_OR_ARENA", "SPELL_ATTR8_NOT_IN_BG_OR_ARENA", "28 not allow to cast or deactivate currently active effect, not sure about Fast Track" }; + case SPELL_ATTR8_MASTERY_SPECIALIZATION: return { "SPELL_ATTR8_MASTERY_SPECIALIZATION", "SPELL_ATTR8_MASTERY_SPECIALIZATION", "29" }; + case SPELL_ATTR8_UNK30: return { "SPELL_ATTR8_UNK30", "SPELL_ATTR8_UNK30", "30" }; + case SPELL_ATTR8_ATTACK_IGNORE_IMMUNE_TO_PC_FLAG: return { "SPELL_ATTR8_ATTACK_IGNORE_IMMUNE_TO_PC_FLAG", "SPELL_ATTR8_ATTACK_IGNORE_IMMUNE_TO_PC_FLAG", "31 Do not check UNIT_FLAG_IMMUNE_TO_PC in IsValidAttackTarget" }; + default: throw std::out_of_range("value"); + } +} + +template <> +TC_API_EXPORT size_t EnumUtils<SpellAttr8>::Count() { return 32; } + +template <> +TC_API_EXPORT SpellAttr8 EnumUtils<SpellAttr8>::FromIndex(size_t index) +{ + switch (index) + { + case 0: return SPELL_ATTR8_CANT_MISS; + case 1: return SPELL_ATTR8_UNK1; + case 2: return SPELL_ATTR8_UNK2; + case 3: return SPELL_ATTR8_UNK3; + case 4: return SPELL_ATTR8_UNK4; + case 5: return SPELL_ATTR8_UNK5; + case 6: return SPELL_ATTR8_UNK6; + case 7: return SPELL_ATTR8_UNK7; + case 8: return SPELL_ATTR8_AFFECT_PARTY_AND_RAID; + case 9: return SPELL_ATTR8_DONT_RESET_PERIODIC_TIMER; + case 10: return SPELL_ATTR8_NAME_CHANGED_DURING_TRANSFORM; + case 11: return SPELL_ATTR8_UNK11; + case 12: return SPELL_ATTR8_AURA_SEND_AMOUNT; + case 13: return SPELL_ATTR8_UNK13; + case 14: return SPELL_ATTR8_UNK14; + case 15: return SPELL_ATTR8_WATER_MOUNT; + case 16: return SPELL_ATTR8_UNK16; + case 17: return SPELL_ATTR8_UNK17; + case 18: return SPELL_ATTR8_REMEMBER_SPELLS; + case 19: return SPELL_ATTR8_USE_COMBO_POINTS_ON_ANY_TARGET; + case 20: return SPELL_ATTR8_ARMOR_SPECIALIZATION; + case 21: return SPELL_ATTR8_UNK21; + case 22: return SPELL_ATTR8_UNK22; + case 23: return SPELL_ATTR8_BATTLE_RESURRECTION; + case 24: return SPELL_ATTR8_HEALING_SPELL; + case 25: return SPELL_ATTR8_UNK25; + case 26: return SPELL_ATTR8_RAID_MARKER; + case 27: return SPELL_ATTR8_UNK27; + case 28: return SPELL_ATTR8_NOT_IN_BG_OR_ARENA; + case 29: return SPELL_ATTR8_MASTERY_SPECIALIZATION; + case 30: return SPELL_ATTR8_UNK30; + case 31: return SPELL_ATTR8_ATTACK_IGNORE_IMMUNE_TO_PC_FLAG; + default: throw std::out_of_range("index"); + } +} + +/******************************************************************\ +|* data for enum 'SpellAttr9' in 'SharedDefines.h' auto-generated *| +\******************************************************************/ +template <> +TC_API_EXPORT EnumText EnumUtils<SpellAttr9>::ToString(SpellAttr9 value) +{ + switch (value) + { + case SPELL_ATTR9_UNK0: return { "SPELL_ATTR9_UNK0", "SPELL_ATTR9_UNK0", "0" }; + case SPELL_ATTR9_UNK1: return { "SPELL_ATTR9_UNK1", "SPELL_ATTR9_UNK1", "1" }; + case SPELL_ATTR9_RESTRICTED_FLIGHT_AREA: return { "SPELL_ATTR9_RESTRICTED_FLIGHT_AREA", "SPELL_ATTR9_RESTRICTED_FLIGHT_AREA", "2 Dalaran and Wintergrasp flight area auras have it" }; + case SPELL_ATTR9_UNK3: return { "SPELL_ATTR9_UNK3", "SPELL_ATTR9_UNK3", "3" }; + case SPELL_ATTR9_SPECIAL_DELAY_CALCULATION: return { "SPELL_ATTR9_SPECIAL_DELAY_CALCULATION", "SPELL_ATTR9_SPECIAL_DELAY_CALCULATION", "4" }; + case SPELL_ATTR9_SUMMON_PLAYER_TOTEM: return { "SPELL_ATTR9_SUMMON_PLAYER_TOTEM", "SPELL_ATTR9_SUMMON_PLAYER_TOTEM", "5" }; + case SPELL_ATTR9_UNK6: return { "SPELL_ATTR9_UNK6", "SPELL_ATTR9_UNK6", "6" }; + case SPELL_ATTR9_UNK7: return { "SPELL_ATTR9_UNK7", "SPELL_ATTR9_UNK7", "7" }; + case SPELL_ATTR9_AIMED_SHOT: return { "SPELL_ATTR9_AIMED_SHOT", "SPELL_ATTR9_AIMED_SHOT", "8" }; + case SPELL_ATTR9_NOT_USABLE_IN_ARENA: return { "SPELL_ATTR9_NOT_USABLE_IN_ARENA", "SPELL_ATTR9_NOT_USABLE_IN_ARENA", "9 Cannot be used in arenas" }; + case SPELL_ATTR9_UNK10: return { "SPELL_ATTR9_UNK10", "SPELL_ATTR9_UNK10", "10" }; + case SPELL_ATTR9_UNK11: return { "SPELL_ATTR9_UNK11", "SPELL_ATTR9_UNK11", "11" }; + case SPELL_ATTR9_UNK12: return { "SPELL_ATTR9_UNK12", "SPELL_ATTR9_UNK12", "12" }; + case SPELL_ATTR9_SLAM: return { "SPELL_ATTR9_SLAM", "SPELL_ATTR9_SLAM", "13" }; + case SPELL_ATTR9_USABLE_IN_RATED_BATTLEGROUNDS: return { "SPELL_ATTR9_USABLE_IN_RATED_BATTLEGROUNDS", "SPELL_ATTR9_USABLE_IN_RATED_BATTLEGROUNDS", "14 Can be used in Rated Battlegrounds" }; + case SPELL_ATTR9_UNK15: return { "SPELL_ATTR9_UNK15", "SPELL_ATTR9_UNK15", "15" }; + case SPELL_ATTR9_UNK16: return { "SPELL_ATTR9_UNK16", "SPELL_ATTR9_UNK16", "16" }; + case SPELL_ATTR9_UNK17: return { "SPELL_ATTR9_UNK17", "SPELL_ATTR9_UNK17", "17" }; + case SPELL_ATTR9_UNK18: return { "SPELL_ATTR9_UNK18", "SPELL_ATTR9_UNK18", "18" }; + case SPELL_ATTR9_UNK19: return { "SPELL_ATTR9_UNK19", "SPELL_ATTR9_UNK19", "19" }; + case SPELL_ATTR9_UNK20: return { "SPELL_ATTR9_UNK20", "SPELL_ATTR9_UNK20", "20" }; + case SPELL_ATTR9_UNK21: return { "SPELL_ATTR9_UNK21", "SPELL_ATTR9_UNK21", "21" }; + case SPELL_ATTR9_UNK22: return { "SPELL_ATTR9_UNK22", "SPELL_ATTR9_UNK22", "22" }; + case SPELL_ATTR9_UNK23: return { "SPELL_ATTR9_UNK23", "SPELL_ATTR9_UNK23", "23" }; + case SPELL_ATTR9_UNK24: return { "SPELL_ATTR9_UNK24", "SPELL_ATTR9_UNK24", "24" }; + case SPELL_ATTR9_UNK25: return { "SPELL_ATTR9_UNK25", "SPELL_ATTR9_UNK25", "25" }; + case SPELL_ATTR9_UNK26: return { "SPELL_ATTR9_UNK26", "SPELL_ATTR9_UNK26", "26" }; + case SPELL_ATTR9_UNK27: return { "SPELL_ATTR9_UNK27", "SPELL_ATTR9_UNK27", "27" }; + case SPELL_ATTR9_UNK28: return { "SPELL_ATTR9_UNK28", "SPELL_ATTR9_UNK28", "28" }; + case SPELL_ATTR9_UNK29: return { "SPELL_ATTR9_UNK29", "SPELL_ATTR9_UNK29", "29" }; + case SPELL_ATTR9_UNK30: return { "SPELL_ATTR9_UNK30", "SPELL_ATTR9_UNK30", "30" }; + case SPELL_ATTR9_UNK31: return { "SPELL_ATTR9_UNK31", "SPELL_ATTR9_UNK31", "31" }; + default: throw std::out_of_range("value"); + } +} + +template <> +TC_API_EXPORT size_t EnumUtils<SpellAttr9>::Count() { return 32; } + +template <> +TC_API_EXPORT SpellAttr9 EnumUtils<SpellAttr9>::FromIndex(size_t index) +{ + switch (index) + { + case 0: return SPELL_ATTR9_UNK0; + case 1: return SPELL_ATTR9_UNK1; + case 2: return SPELL_ATTR9_RESTRICTED_FLIGHT_AREA; + case 3: return SPELL_ATTR9_UNK3; + case 4: return SPELL_ATTR9_SPECIAL_DELAY_CALCULATION; + case 5: return SPELL_ATTR9_SUMMON_PLAYER_TOTEM; + case 6: return SPELL_ATTR9_UNK6; + case 7: return SPELL_ATTR9_UNK7; + case 8: return SPELL_ATTR9_AIMED_SHOT; + case 9: return SPELL_ATTR9_NOT_USABLE_IN_ARENA; + case 10: return SPELL_ATTR9_UNK10; + case 11: return SPELL_ATTR9_UNK11; + case 12: return SPELL_ATTR9_UNK12; + case 13: return SPELL_ATTR9_SLAM; + case 14: return SPELL_ATTR9_USABLE_IN_RATED_BATTLEGROUNDS; + case 15: return SPELL_ATTR9_UNK15; + case 16: return SPELL_ATTR9_UNK16; + case 17: return SPELL_ATTR9_UNK17; + case 18: return SPELL_ATTR9_UNK18; + case 19: return SPELL_ATTR9_UNK19; + case 20: return SPELL_ATTR9_UNK20; + case 21: return SPELL_ATTR9_UNK21; + case 22: return SPELL_ATTR9_UNK22; + case 23: return SPELL_ATTR9_UNK23; + case 24: return SPELL_ATTR9_UNK24; + case 25: return SPELL_ATTR9_UNK25; + case 26: return SPELL_ATTR9_UNK26; + case 27: return SPELL_ATTR9_UNK27; + case 28: return SPELL_ATTR9_UNK28; + case 29: return SPELL_ATTR9_UNK29; + case 30: return SPELL_ATTR9_UNK30; + case 31: return SPELL_ATTR9_UNK31; + default: throw std::out_of_range("index"); + } +} + +/*******************************************************************\ +|* data for enum 'SpellAttr10' in 'SharedDefines.h' auto-generated *| +\*******************************************************************/ +template <> +TC_API_EXPORT EnumText EnumUtils<SpellAttr10>::ToString(SpellAttr10 value) +{ + switch (value) + { + case SPELL_ATTR10_UNK0: return { "SPELL_ATTR10_UNK0", "SPELL_ATTR10_UNK0", "0" }; + case SPELL_ATTR10_UNK1: return { "SPELL_ATTR10_UNK1", "SPELL_ATTR10_UNK1", "1" }; + case SPELL_ATTR10_UNK2: return { "SPELL_ATTR10_UNK2", "SPELL_ATTR10_UNK2", "2" }; + case SPELL_ATTR10_UNK3: return { "SPELL_ATTR10_UNK3", "SPELL_ATTR10_UNK3", "3" }; + case SPELL_ATTR10_WATER_SPOUT: return { "SPELL_ATTR10_WATER_SPOUT", "SPELL_ATTR10_WATER_SPOUT", "4" }; + case SPELL_ATTR10_UNK5: return { "SPELL_ATTR10_UNK5", "SPELL_ATTR10_UNK5", "5" }; + case SPELL_ATTR10_UNK6: return { "SPELL_ATTR10_UNK6", "SPELL_ATTR10_UNK6", "6" }; + case SPELL_ATTR10_TELEPORT_PLAYER: return { "SPELL_ATTR10_TELEPORT_PLAYER", "SPELL_ATTR10_TELEPORT_PLAYER", "7 4 Teleport Player spells" }; + case SPELL_ATTR10_UNK8: return { "SPELL_ATTR10_UNK8", "SPELL_ATTR10_UNK8", "8" }; + case SPELL_ATTR10_UNK9: return { "SPELL_ATTR10_UNK9", "SPELL_ATTR10_UNK9", "9" }; + case SPELL_ATTR10_UNK10: return { "SPELL_ATTR10_UNK10", "SPELL_ATTR10_UNK10", "10" }; + case SPELL_ATTR10_HERB_GATHERING_MINING: return { "SPELL_ATTR10_HERB_GATHERING_MINING", "SPELL_ATTR10_HERB_GATHERING_MINING", "11 Only Herb Gathering and Mining" }; + case SPELL_ATTR10_USE_SPELL_BASE_LEVEL_FOR_SCALING: return { "SPELL_ATTR10_USE_SPELL_BASE_LEVEL_FOR_SCALING", "SPELL_ATTR10_USE_SPELL_BASE_LEVEL_FOR_SCALING", "12" }; + case SPELL_ATTR10_RESET_COOLDOWN_ON_ENCOUNTER_END: return { "SPELL_ATTR10_RESET_COOLDOWN_ON_ENCOUNTER_END", "SPELL_ATTR10_RESET_COOLDOWN_ON_ENCOUNTER_END", "13" }; + case SPELL_ATTR10_ROLLING_PERIODIC: return { "SPELL_ATTR10_ROLLING_PERIODIC", "SPELL_ATTR10_ROLLING_PERIODIC", "14 Add remaining periodic damage to new aura when refreshed" }; + case SPELL_ATTR10_UNK15: return { "SPELL_ATTR10_UNK15", "SPELL_ATTR10_UNK15", "15" }; + case SPELL_ATTR10_UNK16: return { "SPELL_ATTR10_UNK16", "SPELL_ATTR10_UNK16", "16" }; + case SPELL_ATTR10_CAN_DODGE_PARRY_WHILE_CASTING: return { "SPELL_ATTR10_CAN_DODGE_PARRY_WHILE_CASTING", "SPELL_ATTR10_CAN_DODGE_PARRY_WHILE_CASTING", "17" }; + case SPELL_ATTR10_UNK18: return { "SPELL_ATTR10_UNK18", "SPELL_ATTR10_UNK18", "18" }; + case SPELL_ATTR10_UNK19: return { "SPELL_ATTR10_UNK19", "SPELL_ATTR10_UNK19", "19" }; + case SPELL_ATTR10_UNK20: return { "SPELL_ATTR10_UNK20", "SPELL_ATTR10_UNK20", "20" }; + case SPELL_ATTR10_UNK21: return { "SPELL_ATTR10_UNK21", "SPELL_ATTR10_UNK21", "21" }; + case SPELL_ATTR10_UNK22: return { "SPELL_ATTR10_UNK22", "SPELL_ATTR10_UNK22", "22" }; + case SPELL_ATTR10_UNK23: return { "SPELL_ATTR10_UNK23", "SPELL_ATTR10_UNK23", "23" }; + case SPELL_ATTR10_UNK24: return { "SPELL_ATTR10_UNK24", "SPELL_ATTR10_UNK24", "24" }; + case SPELL_ATTR10_UNK25: return { "SPELL_ATTR10_UNK25", "SPELL_ATTR10_UNK25", "25" }; + case SPELL_ATTR10_UNK26: return { "SPELL_ATTR10_UNK26", "SPELL_ATTR10_UNK26", "26" }; + case SPELL_ATTR10_UNK27: return { "SPELL_ATTR10_UNK27", "SPELL_ATTR10_UNK27", "27" }; + case SPELL_ATTR10_UNK28: return { "SPELL_ATTR10_UNK28", "SPELL_ATTR10_UNK28", "28" }; + case SPELL_ATTR10_MOUNT_IS_NOT_ACCOUNT_WIDE: return { "SPELL_ATTR10_MOUNT_IS_NOT_ACCOUNT_WIDE", "SPELL_ATTR10_MOUNT_IS_NOT_ACCOUNT_WIDE", "29 This mount is stored per-character" }; + case SPELL_ATTR10_UNK30: return { "SPELL_ATTR10_UNK30", "SPELL_ATTR10_UNK30", "30" }; + case SPELL_ATTR10_UNK31: return { "SPELL_ATTR10_UNK31", "SPELL_ATTR10_UNK31", "31" }; + default: throw std::out_of_range("value"); + } +} + +template <> +TC_API_EXPORT size_t EnumUtils<SpellAttr10>::Count() { return 32; } + +template <> +TC_API_EXPORT SpellAttr10 EnumUtils<SpellAttr10>::FromIndex(size_t index) +{ + switch (index) + { + case 0: return SPELL_ATTR10_UNK0; + case 1: return SPELL_ATTR10_UNK1; + case 2: return SPELL_ATTR10_UNK2; + case 3: return SPELL_ATTR10_UNK3; + case 4: return SPELL_ATTR10_WATER_SPOUT; + case 5: return SPELL_ATTR10_UNK5; + case 6: return SPELL_ATTR10_UNK6; + case 7: return SPELL_ATTR10_TELEPORT_PLAYER; + case 8: return SPELL_ATTR10_UNK8; + case 9: return SPELL_ATTR10_UNK9; + case 10: return SPELL_ATTR10_UNK10; + case 11: return SPELL_ATTR10_HERB_GATHERING_MINING; + case 12: return SPELL_ATTR10_USE_SPELL_BASE_LEVEL_FOR_SCALING; + case 13: return SPELL_ATTR10_RESET_COOLDOWN_ON_ENCOUNTER_END; + case 14: return SPELL_ATTR10_ROLLING_PERIODIC; + case 15: return SPELL_ATTR10_UNK15; + case 16: return SPELL_ATTR10_UNK16; + case 17: return SPELL_ATTR10_CAN_DODGE_PARRY_WHILE_CASTING; + case 18: return SPELL_ATTR10_UNK18; + case 19: return SPELL_ATTR10_UNK19; + case 20: return SPELL_ATTR10_UNK20; + case 21: return SPELL_ATTR10_UNK21; + case 22: return SPELL_ATTR10_UNK22; + case 23: return SPELL_ATTR10_UNK23; + case 24: return SPELL_ATTR10_UNK24; + case 25: return SPELL_ATTR10_UNK25; + case 26: return SPELL_ATTR10_UNK26; + case 27: return SPELL_ATTR10_UNK27; + case 28: return SPELL_ATTR10_UNK28; + case 29: return SPELL_ATTR10_MOUNT_IS_NOT_ACCOUNT_WIDE; + case 30: return SPELL_ATTR10_UNK30; + case 31: return SPELL_ATTR10_UNK31; + default: throw std::out_of_range("index"); + } +} + +/*******************************************************************\ +|* data for enum 'SpellAttr11' in 'SharedDefines.h' auto-generated *| +\*******************************************************************/ +template <> +TC_API_EXPORT EnumText EnumUtils<SpellAttr11>::ToString(SpellAttr11 value) +{ + switch (value) + { + case SPELL_ATTR11_UNK0: return { "SPELL_ATTR11_UNK0", "SPELL_ATTR11_UNK0", "0" }; + case SPELL_ATTR11_UNK1: return { "SPELL_ATTR11_UNK1", "SPELL_ATTR11_UNK1", "1" }; + case SPELL_ATTR11_SCALES_WITH_ITEM_LEVEL: return { "SPELL_ATTR11_SCALES_WITH_ITEM_LEVEL", "SPELL_ATTR11_SCALES_WITH_ITEM_LEVEL", "2" }; + case SPELL_ATTR11_UNK3: return { "SPELL_ATTR11_UNK3", "SPELL_ATTR11_UNK3", "3" }; + case SPELL_ATTR11_UNK4: return { "SPELL_ATTR11_UNK4", "SPELL_ATTR11_UNK4", "4" }; + case SPELL_ATTR11_ABSORB_ENVIRONMENTAL_DAMAGE: return { "SPELL_ATTR11_ABSORB_ENVIRONMENTAL_DAMAGE", "SPELL_ATTR11_ABSORB_ENVIRONMENTAL_DAMAGE", "5" }; + case SPELL_ATTR11_UNK6: return { "SPELL_ATTR11_UNK6", "SPELL_ATTR11_UNK6", "6" }; + case SPELL_ATTR11_RANK_IGNORES_CASTER_LEVEL: return { "SPELL_ATTR11_RANK_IGNORES_CASTER_LEVEL", "SPELL_ATTR11_RANK_IGNORES_CASTER_LEVEL", "7 Spell_C_GetSpellRank returns SpellLevels->MaxLevel * 5 instead of std::min(SpellLevels->MaxLevel, caster->Level) * 5" }; + case SPELL_ATTR11_UNK8: return { "SPELL_ATTR11_UNK8", "SPELL_ATTR11_UNK8", "8" }; + case SPELL_ATTR11_UNK9: return { "SPELL_ATTR11_UNK9", "SPELL_ATTR11_UNK9", "9" }; + case SPELL_ATTR11_UNK10: return { "SPELL_ATTR11_UNK10", "SPELL_ATTR11_UNK10", "10" }; + case SPELL_ATTR11_NOT_USABLE_IN_INSTANCES: return { "SPELL_ATTR11_NOT_USABLE_IN_INSTANCES", "SPELL_ATTR11_NOT_USABLE_IN_INSTANCES", "11" }; + case SPELL_ATTR11_UNK12: return { "SPELL_ATTR11_UNK12", "SPELL_ATTR11_UNK12", "12" }; + case SPELL_ATTR11_UNK13: return { "SPELL_ATTR11_UNK13", "SPELL_ATTR11_UNK13", "13" }; + case SPELL_ATTR11_UNK14: return { "SPELL_ATTR11_UNK14", "SPELL_ATTR11_UNK14", "14" }; + case SPELL_ATTR11_UNK15: return { "SPELL_ATTR11_UNK15", "SPELL_ATTR11_UNK15", "15" }; + case SPELL_ATTR11_NOT_USABLE_IN_CHALLENGE_MODE: return { "SPELL_ATTR11_NOT_USABLE_IN_CHALLENGE_MODE", "SPELL_ATTR11_NOT_USABLE_IN_CHALLENGE_MODE", "16" }; + case SPELL_ATTR11_UNK17: return { "SPELL_ATTR11_UNK17", "SPELL_ATTR11_UNK17", "17" }; + case SPELL_ATTR11_UNK18: return { "SPELL_ATTR11_UNK18", "SPELL_ATTR11_UNK18", "18" }; + case SPELL_ATTR11_UNK19: return { "SPELL_ATTR11_UNK19", "SPELL_ATTR11_UNK19", "19" }; + case SPELL_ATTR11_UNK20: return { "SPELL_ATTR11_UNK20", "SPELL_ATTR11_UNK20", "20" }; + case SPELL_ATTR11_UNK21: return { "SPELL_ATTR11_UNK21", "SPELL_ATTR11_UNK21", "21" }; + case SPELL_ATTR11_UNK22: return { "SPELL_ATTR11_UNK22", "SPELL_ATTR11_UNK22", "22" }; + case SPELL_ATTR11_UNK23: return { "SPELL_ATTR11_UNK23", "SPELL_ATTR11_UNK23", "23" }; + case SPELL_ATTR11_UNK24: return { "SPELL_ATTR11_UNK24", "SPELL_ATTR11_UNK24", "24" }; + case SPELL_ATTR11_UNK25: return { "SPELL_ATTR11_UNK25", "SPELL_ATTR11_UNK25", "25" }; + case SPELL_ATTR11_UNK26: return { "SPELL_ATTR11_UNK26", "SPELL_ATTR11_UNK26", "26" }; + case SPELL_ATTR11_UNK27: return { "SPELL_ATTR11_UNK27", "SPELL_ATTR11_UNK27", "27" }; + case SPELL_ATTR11_UNK28: return { "SPELL_ATTR11_UNK28", "SPELL_ATTR11_UNK28", "28" }; + case SPELL_ATTR11_UNK29: return { "SPELL_ATTR11_UNK29", "SPELL_ATTR11_UNK29", "29" }; + case SPELL_ATTR11_UNK30: return { "SPELL_ATTR11_UNK30", "SPELL_ATTR11_UNK30", "30" }; + case SPELL_ATTR11_UNK31: return { "SPELL_ATTR11_UNK31", "SPELL_ATTR11_UNK31", "31" }; + default: throw std::out_of_range("value"); + } +} + +template <> +TC_API_EXPORT size_t EnumUtils<SpellAttr11>::Count() { return 32; } + +template <> +TC_API_EXPORT SpellAttr11 EnumUtils<SpellAttr11>::FromIndex(size_t index) +{ + switch (index) + { + case 0: return SPELL_ATTR11_UNK0; + case 1: return SPELL_ATTR11_UNK1; + case 2: return SPELL_ATTR11_SCALES_WITH_ITEM_LEVEL; + case 3: return SPELL_ATTR11_UNK3; + case 4: return SPELL_ATTR11_UNK4; + case 5: return SPELL_ATTR11_ABSORB_ENVIRONMENTAL_DAMAGE; + case 6: return SPELL_ATTR11_UNK6; + case 7: return SPELL_ATTR11_RANK_IGNORES_CASTER_LEVEL; + case 8: return SPELL_ATTR11_UNK8; + case 9: return SPELL_ATTR11_UNK9; + case 10: return SPELL_ATTR11_UNK10; + case 11: return SPELL_ATTR11_NOT_USABLE_IN_INSTANCES; + case 12: return SPELL_ATTR11_UNK12; + case 13: return SPELL_ATTR11_UNK13; + case 14: return SPELL_ATTR11_UNK14; + case 15: return SPELL_ATTR11_UNK15; + case 16: return SPELL_ATTR11_NOT_USABLE_IN_CHALLENGE_MODE; + case 17: return SPELL_ATTR11_UNK17; + case 18: return SPELL_ATTR11_UNK18; + case 19: return SPELL_ATTR11_UNK19; + case 20: return SPELL_ATTR11_UNK20; + case 21: return SPELL_ATTR11_UNK21; + case 22: return SPELL_ATTR11_UNK22; + case 23: return SPELL_ATTR11_UNK23; + case 24: return SPELL_ATTR11_UNK24; + case 25: return SPELL_ATTR11_UNK25; + case 26: return SPELL_ATTR11_UNK26; + case 27: return SPELL_ATTR11_UNK27; + case 28: return SPELL_ATTR11_UNK28; + case 29: return SPELL_ATTR11_UNK29; + case 30: return SPELL_ATTR11_UNK30; + case 31: return SPELL_ATTR11_UNK31; + default: throw std::out_of_range("index"); + } +} + +/*******************************************************************\ +|* data for enum 'SpellAttr12' in 'SharedDefines.h' auto-generated *| +\*******************************************************************/ +template <> +TC_API_EXPORT EnumText EnumUtils<SpellAttr12>::ToString(SpellAttr12 value) +{ + switch (value) + { + case SPELL_ATTR12_UNK0: return { "SPELL_ATTR12_UNK0", "SPELL_ATTR12_UNK0", "0" }; + case SPELL_ATTR12_UNK1: return { "SPELL_ATTR12_UNK1", "SPELL_ATTR12_UNK1", "1" }; + case SPELL_ATTR12_UNK2: return { "SPELL_ATTR12_UNK2", "SPELL_ATTR12_UNK2", "2" }; + case SPELL_ATTR12_UNK3: return { "SPELL_ATTR12_UNK3", "SPELL_ATTR12_UNK3", "3" }; + case SPELL_ATTR12_UNK4: return { "SPELL_ATTR12_UNK4", "SPELL_ATTR12_UNK4", "4" }; + case SPELL_ATTR12_UNK5: return { "SPELL_ATTR12_UNK5", "SPELL_ATTR12_UNK5", "5" }; + case SPELL_ATTR12_UNK6: return { "SPELL_ATTR12_UNK6", "SPELL_ATTR12_UNK6", "6" }; + case SPELL_ATTR12_UNK7: return { "SPELL_ATTR12_UNK7", "SPELL_ATTR12_UNK7", "7" }; + case SPELL_ATTR12_UNK8: return { "SPELL_ATTR12_UNK8", "SPELL_ATTR12_UNK8", "8" }; + case SPELL_ATTR12_IGNORE_CASTING_DISABLED: return { "SPELL_ATTR12_IGNORE_CASTING_DISABLED", "SPELL_ATTR12_IGNORE_CASTING_DISABLED", "9 Ignores aura 263 SPELL_AURA_DISABLE_CASTING_EXCEPT_ABILITIES" }; + case SPELL_ATTR12_UNK10: return { "SPELL_ATTR12_UNK10", "SPELL_ATTR12_UNK10", "10" }; + case SPELL_ATTR12_UNK11: return { "SPELL_ATTR12_UNK11", "SPELL_ATTR12_UNK11", "11" }; + case SPELL_ATTR12_UNK12: return { "SPELL_ATTR12_UNK12", "SPELL_ATTR12_UNK12", "12" }; + case SPELL_ATTR12_UNK13: return { "SPELL_ATTR12_UNK13", "SPELL_ATTR12_UNK13", "13" }; + case SPELL_ATTR12_UNK14: return { "SPELL_ATTR12_UNK14", "SPELL_ATTR12_UNK14", "14" }; + case SPELL_ATTR12_UNK15: return { "SPELL_ATTR12_UNK15", "SPELL_ATTR12_UNK15", "15" }; + case SPELL_ATTR12_UNK16: return { "SPELL_ATTR12_UNK16", "SPELL_ATTR12_UNK16", "16" }; + case SPELL_ATTR12_UNK17: return { "SPELL_ATTR12_UNK17", "SPELL_ATTR12_UNK17", "17" }; + case SPELL_ATTR12_UNK18: return { "SPELL_ATTR12_UNK18", "SPELL_ATTR12_UNK18", "18" }; + case SPELL_ATTR12_UNK19: return { "SPELL_ATTR12_UNK19", "SPELL_ATTR12_UNK19", "19" }; + case SPELL_ATTR12_UNK20: return { "SPELL_ATTR12_UNK20", "SPELL_ATTR12_UNK20", "20" }; + case SPELL_ATTR12_UNK21: return { "SPELL_ATTR12_UNK21", "SPELL_ATTR12_UNK21", "21" }; + case SPELL_ATTR12_UNK22: return { "SPELL_ATTR12_UNK22", "SPELL_ATTR12_UNK22", "22" }; + case SPELL_ATTR12_START_COOLDOWN_ON_CAST_START: return { "SPELL_ATTR12_START_COOLDOWN_ON_CAST_START", "SPELL_ATTR12_START_COOLDOWN_ON_CAST_START", "23" }; + case SPELL_ATTR12_IS_GARRISON_BUFF: return { "SPELL_ATTR12_IS_GARRISON_BUFF", "SPELL_ATTR12_IS_GARRISON_BUFF", "24" }; + case SPELL_ATTR12_UNK25: return { "SPELL_ATTR12_UNK25", "SPELL_ATTR12_UNK25", "25" }; + case SPELL_ATTR12_UNK26: return { "SPELL_ATTR12_UNK26", "SPELL_ATTR12_UNK26", "26" }; + case SPELL_ATTR12_IS_READINESS_SPELL: return { "SPELL_ATTR12_IS_READINESS_SPELL", "SPELL_ATTR12_IS_READINESS_SPELL", "27" }; + case SPELL_ATTR12_UNK28: return { "SPELL_ATTR12_UNK28", "SPELL_ATTR12_UNK28", "28" }; + case SPELL_ATTR12_UNK29: return { "SPELL_ATTR12_UNK29", "SPELL_ATTR12_UNK29", "29" }; + case SPELL_ATTR12_UNK30: return { "SPELL_ATTR12_UNK30", "SPELL_ATTR12_UNK30", "30" }; + case SPELL_ATTR12_UNK31: return { "SPELL_ATTR12_UNK31", "SPELL_ATTR12_UNK31", "31" }; + default: throw std::out_of_range("value"); + } +} + +template <> +TC_API_EXPORT size_t EnumUtils<SpellAttr12>::Count() { return 32; } + +template <> +TC_API_EXPORT SpellAttr12 EnumUtils<SpellAttr12>::FromIndex(size_t index) +{ + switch (index) + { + case 0: return SPELL_ATTR12_UNK0; + case 1: return SPELL_ATTR12_UNK1; + case 2: return SPELL_ATTR12_UNK2; + case 3: return SPELL_ATTR12_UNK3; + case 4: return SPELL_ATTR12_UNK4; + case 5: return SPELL_ATTR12_UNK5; + case 6: return SPELL_ATTR12_UNK6; + case 7: return SPELL_ATTR12_UNK7; + case 8: return SPELL_ATTR12_UNK8; + case 9: return SPELL_ATTR12_IGNORE_CASTING_DISABLED; + case 10: return SPELL_ATTR12_UNK10; + case 11: return SPELL_ATTR12_UNK11; + case 12: return SPELL_ATTR12_UNK12; + case 13: return SPELL_ATTR12_UNK13; + case 14: return SPELL_ATTR12_UNK14; + case 15: return SPELL_ATTR12_UNK15; + case 16: return SPELL_ATTR12_UNK16; + case 17: return SPELL_ATTR12_UNK17; + case 18: return SPELL_ATTR12_UNK18; + case 19: return SPELL_ATTR12_UNK19; + case 20: return SPELL_ATTR12_UNK20; + case 21: return SPELL_ATTR12_UNK21; + case 22: return SPELL_ATTR12_UNK22; + case 23: return SPELL_ATTR12_START_COOLDOWN_ON_CAST_START; + case 24: return SPELL_ATTR12_IS_GARRISON_BUFF; + case 25: return SPELL_ATTR12_UNK25; + case 26: return SPELL_ATTR12_UNK26; + case 27: return SPELL_ATTR12_IS_READINESS_SPELL; + case 28: return SPELL_ATTR12_UNK28; + case 29: return SPELL_ATTR12_UNK29; + case 30: return SPELL_ATTR12_UNK30; + case 31: return SPELL_ATTR12_UNK31; + default: throw std::out_of_range("index"); + } +} + +/*******************************************************************\ +|* data for enum 'SpellAttr13' in 'SharedDefines.h' auto-generated *| +\*******************************************************************/ +template <> +TC_API_EXPORT EnumText EnumUtils<SpellAttr13>::ToString(SpellAttr13 value) +{ + switch (value) + { + case SPELL_ATTR13_UNK0: return { "SPELL_ATTR13_UNK0", "SPELL_ATTR13_UNK0", "0" }; + case SPELL_ATTR13_UNK1: return { "SPELL_ATTR13_UNK1", "SPELL_ATTR13_UNK1", "1" }; + case SPELL_ATTR13_PASSIVE_IS_UPGRADE: return { "SPELL_ATTR13_PASSIVE_IS_UPGRADE", "SPELL_ATTR13_PASSIVE_IS_UPGRADE", "2 Displays \042Upgrade\042 in spell tooltip instead of \042Passive\042" }; + case SPELL_ATTR13_UNK3: return { "SPELL_ATTR13_UNK3", "SPELL_ATTR13_UNK3", "3" }; + case SPELL_ATTR13_UNK4: return { "SPELL_ATTR13_UNK4", "SPELL_ATTR13_UNK4", "4" }; + case SPELL_ATTR13_UNK5: return { "SPELL_ATTR13_UNK5", "SPELL_ATTR13_UNK5", "5" }; + case SPELL_ATTR13_UNK6: return { "SPELL_ATTR13_UNK6", "SPELL_ATTR13_UNK6", "6" }; + case SPELL_ATTR13_UNK7: return { "SPELL_ATTR13_UNK7", "SPELL_ATTR13_UNK7", "7" }; + case SPELL_ATTR13_UNK8: return { "SPELL_ATTR13_UNK8", "SPELL_ATTR13_UNK8", "8" }; + case SPELL_ATTR13_UNK9: return { "SPELL_ATTR13_UNK9", "SPELL_ATTR13_UNK9", "9" }; + case SPELL_ATTR13_UNK10: return { "SPELL_ATTR13_UNK10", "SPELL_ATTR13_UNK10", "10" }; + case SPELL_ATTR13_UNK11: return { "SPELL_ATTR13_UNK11", "SPELL_ATTR13_UNK11", "11" }; + case SPELL_ATTR13_UNK12: return { "SPELL_ATTR13_UNK12", "SPELL_ATTR13_UNK12", "12" }; + case SPELL_ATTR13_UNK13: return { "SPELL_ATTR13_UNK13", "SPELL_ATTR13_UNK13", "13" }; + case SPELL_ATTR13_UNK14: return { "SPELL_ATTR13_UNK14", "SPELL_ATTR13_UNK14", "14" }; + case SPELL_ATTR13_UNK15: return { "SPELL_ATTR13_UNK15", "SPELL_ATTR13_UNK15", "15" }; + case SPELL_ATTR13_UNK16: return { "SPELL_ATTR13_UNK16", "SPELL_ATTR13_UNK16", "16" }; + case SPELL_ATTR13_UNK17: return { "SPELL_ATTR13_UNK17", "SPELL_ATTR13_UNK17", "17" }; + case SPELL_ATTR13_ACTIVATES_REQUIRED_SHAPESHIFT: return { "SPELL_ATTR13_ACTIVATES_REQUIRED_SHAPESHIFT", "SPELL_ATTR13_ACTIVATES_REQUIRED_SHAPESHIFT", "18" }; + case SPELL_ATTR13_UNK19: return { "SPELL_ATTR13_UNK19", "SPELL_ATTR13_UNK19", "19" }; + case SPELL_ATTR13_UNK20: return { "SPELL_ATTR13_UNK20", "SPELL_ATTR13_UNK20", "20" }; + case SPELL_ATTR13_UNK21: return { "SPELL_ATTR13_UNK21", "SPELL_ATTR13_UNK21", "21" }; + case SPELL_ATTR13_UNK22: return { "SPELL_ATTR13_UNK22", "SPELL_ATTR13_UNK22", "22" }; + case SPELL_ATTR13_UNK23: return { "SPELL_ATTR13_UNK23", "SPELL_ATTR13_UNK23", "23" }; + case SPELL_ATTR13_UNK24: return { "SPELL_ATTR13_UNK24", "SPELL_ATTR13_UNK24", "24" }; + case SPELL_ATTR13_UNK25: return { "SPELL_ATTR13_UNK25", "SPELL_ATTR13_UNK25", "25" }; + case SPELL_ATTR13_UNK26: return { "SPELL_ATTR13_UNK26", "SPELL_ATTR13_UNK26", "26" }; + case SPELL_ATTR13_UNK27: return { "SPELL_ATTR13_UNK27", "SPELL_ATTR13_UNK27", "27" }; + case SPELL_ATTR13_UNK28: return { "SPELL_ATTR13_UNK28", "SPELL_ATTR13_UNK28", "28" }; + case SPELL_ATTR13_UNK29: return { "SPELL_ATTR13_UNK29", "SPELL_ATTR13_UNK29", "29" }; + case SPELL_ATTR13_UNK30: return { "SPELL_ATTR13_UNK30", "SPELL_ATTR13_UNK30", "30" }; + case SPELL_ATTR13_UNK31: return { "SPELL_ATTR13_UNK31", "SPELL_ATTR13_UNK31", "31" }; + default: throw std::out_of_range("value"); + } +} + +template <> +TC_API_EXPORT size_t EnumUtils<SpellAttr13>::Count() { return 32; } + +template <> +TC_API_EXPORT SpellAttr13 EnumUtils<SpellAttr13>::FromIndex(size_t index) +{ + switch (index) + { + case 0: return SPELL_ATTR13_UNK0; + case 1: return SPELL_ATTR13_UNK1; + case 2: return SPELL_ATTR13_PASSIVE_IS_UPGRADE; + case 3: return SPELL_ATTR13_UNK3; + case 4: return SPELL_ATTR13_UNK4; + case 5: return SPELL_ATTR13_UNK5; + case 6: return SPELL_ATTR13_UNK6; + case 7: return SPELL_ATTR13_UNK7; + case 8: return SPELL_ATTR13_UNK8; + case 9: return SPELL_ATTR13_UNK9; + case 10: return SPELL_ATTR13_UNK10; + case 11: return SPELL_ATTR13_UNK11; + case 12: return SPELL_ATTR13_UNK12; + case 13: return SPELL_ATTR13_UNK13; + case 14: return SPELL_ATTR13_UNK14; + case 15: return SPELL_ATTR13_UNK15; + case 16: return SPELL_ATTR13_UNK16; + case 17: return SPELL_ATTR13_UNK17; + case 18: return SPELL_ATTR13_ACTIVATES_REQUIRED_SHAPESHIFT; + case 19: return SPELL_ATTR13_UNK19; + case 20: return SPELL_ATTR13_UNK20; + case 21: return SPELL_ATTR13_UNK21; + case 22: return SPELL_ATTR13_UNK22; + case 23: return SPELL_ATTR13_UNK23; + case 24: return SPELL_ATTR13_UNK24; + case 25: return SPELL_ATTR13_UNK25; + case 26: return SPELL_ATTR13_UNK26; + case 27: return SPELL_ATTR13_UNK27; + case 28: return SPELL_ATTR13_UNK28; + case 29: return SPELL_ATTR13_UNK29; + case 30: return SPELL_ATTR13_UNK30; + case 31: return SPELL_ATTR13_UNK31; + default: throw std::out_of_range("index"); + } +} + +/*******************************************************************\ +|* data for enum 'SpellAttr14' in 'SharedDefines.h' auto-generated *| +\*******************************************************************/ +template <> +TC_API_EXPORT EnumText EnumUtils<SpellAttr14>::ToString(SpellAttr14 value) +{ + switch (value) + { + case SPELL_ATTR14_UNK0: return { "SPELL_ATTR14_UNK0", "SPELL_ATTR14_UNK0", "0" }; + case SPELL_ATTR14_REAGENT_COST_CONSUMES_CHARGES: return { "SPELL_ATTR14_REAGENT_COST_CONSUMES_CHARGES", "SPELL_ATTR14_REAGENT_COST_CONSUMES_CHARGES", "1 Consumes item charges for reagent costs instead of whole items" }; + case SPELL_ATTR14_UNK2: return { "SPELL_ATTR14_UNK2", "SPELL_ATTR14_UNK2", "2" }; + case SPELL_ATTR14_HIDE_PASSIVE_FROM_TOOLTIP: return { "SPELL_ATTR14_HIDE_PASSIVE_FROM_TOOLTIP", "SPELL_ATTR14_HIDE_PASSIVE_FROM_TOOLTIP", "3 Don't show \042Passive\042 or \042Upgrade\042 in tooltip" }; + case SPELL_ATTR14_UNK4: return { "SPELL_ATTR14_UNK4", "SPELL_ATTR14_UNK4", "4" }; + case SPELL_ATTR14_UNK5: return { "SPELL_ATTR14_UNK5", "SPELL_ATTR14_UNK5", "5" }; + case SPELL_ATTR14_UNK6: return { "SPELL_ATTR14_UNK6", "SPELL_ATTR14_UNK6", "6" }; + case SPELL_ATTR14_UNK7: return { "SPELL_ATTR14_UNK7", "SPELL_ATTR14_UNK7", "7" }; + case SPELL_ATTR14_UNK8: return { "SPELL_ATTR14_UNK8", "SPELL_ATTR14_UNK8", "8" }; + case SPELL_ATTR14_UNK9: return { "SPELL_ATTR14_UNK9", "SPELL_ATTR14_UNK9", "9" }; + case SPELL_ATTR14_UNK10: return { "SPELL_ATTR14_UNK10", "SPELL_ATTR14_UNK10", "10" }; + case SPELL_ATTR14_UNK11: return { "SPELL_ATTR14_UNK11", "SPELL_ATTR14_UNK11", "11" }; + case SPELL_ATTR14_UNK12: return { "SPELL_ATTR14_UNK12", "SPELL_ATTR14_UNK12", "12" }; + case SPELL_ATTR14_UNK13: return { "SPELL_ATTR14_UNK13", "SPELL_ATTR14_UNK13", "13" }; + case SPELL_ATTR14_UNK14: return { "SPELL_ATTR14_UNK14", "SPELL_ATTR14_UNK14", "14" }; + case SPELL_ATTR14_UNK15: return { "SPELL_ATTR14_UNK15", "SPELL_ATTR14_UNK15", "15" }; + case SPELL_ATTR14_UNK16: return { "SPELL_ATTR14_UNK16", "SPELL_ATTR14_UNK16", "16" }; + case SPELL_ATTR14_UNK17: return { "SPELL_ATTR14_UNK17", "SPELL_ATTR14_UNK17", "17" }; + case SPELL_ATTR14_UNK18: return { "SPELL_ATTR14_UNK18", "SPELL_ATTR14_UNK18", "18" }; + case SPELL_ATTR14_UNK19: return { "SPELL_ATTR14_UNK19", "SPELL_ATTR14_UNK19", "19" }; + case SPELL_ATTR14_UNK20: return { "SPELL_ATTR14_UNK20", "SPELL_ATTR14_UNK20", "20" }; + case SPELL_ATTR14_UNK21: return { "SPELL_ATTR14_UNK21", "SPELL_ATTR14_UNK21", "21" }; + case SPELL_ATTR14_UNK22: return { "SPELL_ATTR14_UNK22", "SPELL_ATTR14_UNK22", "22" }; + case SPELL_ATTR14_UNK23: return { "SPELL_ATTR14_UNK23", "SPELL_ATTR14_UNK23", "23" }; + case SPELL_ATTR14_UNK24: return { "SPELL_ATTR14_UNK24", "SPELL_ATTR14_UNK24", "24" }; + case SPELL_ATTR14_UNK25: return { "SPELL_ATTR14_UNK25", "SPELL_ATTR14_UNK25", "25" }; + case SPELL_ATTR14_UNK26: return { "SPELL_ATTR14_UNK26", "SPELL_ATTR14_UNK26", "26" }; + case SPELL_ATTR14_UNK27: return { "SPELL_ATTR14_UNK27", "SPELL_ATTR14_UNK27", "27" }; + case SPELL_ATTR14_UNK28: return { "SPELL_ATTR14_UNK28", "SPELL_ATTR14_UNK28", "28" }; + case SPELL_ATTR14_UNK29: return { "SPELL_ATTR14_UNK29", "SPELL_ATTR14_UNK29", "29" }; + case SPELL_ATTR14_UNK30: return { "SPELL_ATTR14_UNK30", "SPELL_ATTR14_UNK30", "30" }; + case SPELL_ATTR14_UNK31: return { "SPELL_ATTR14_UNK31", "SPELL_ATTR14_UNK31", "31" }; + default: throw std::out_of_range("value"); + } +} + +template <> +TC_API_EXPORT size_t EnumUtils<SpellAttr14>::Count() { return 32; } + +template <> +TC_API_EXPORT SpellAttr14 EnumUtils<SpellAttr14>::FromIndex(size_t index) +{ + switch (index) + { + case 0: return SPELL_ATTR14_UNK0; + case 1: return SPELL_ATTR14_REAGENT_COST_CONSUMES_CHARGES; + case 2: return SPELL_ATTR14_UNK2; + case 3: return SPELL_ATTR14_HIDE_PASSIVE_FROM_TOOLTIP; + case 4: return SPELL_ATTR14_UNK4; + case 5: return SPELL_ATTR14_UNK5; + case 6: return SPELL_ATTR14_UNK6; + case 7: return SPELL_ATTR14_UNK7; + case 8: return SPELL_ATTR14_UNK8; + case 9: return SPELL_ATTR14_UNK9; + case 10: return SPELL_ATTR14_UNK10; + case 11: return SPELL_ATTR14_UNK11; + case 12: return SPELL_ATTR14_UNK12; + case 13: return SPELL_ATTR14_UNK13; + case 14: return SPELL_ATTR14_UNK14; + case 15: return SPELL_ATTR14_UNK15; + case 16: return SPELL_ATTR14_UNK16; + case 17: return SPELL_ATTR14_UNK17; + case 18: return SPELL_ATTR14_UNK18; + case 19: return SPELL_ATTR14_UNK19; + case 20: return SPELL_ATTR14_UNK20; + case 21: return SPELL_ATTR14_UNK21; + case 22: return SPELL_ATTR14_UNK22; + case 23: return SPELL_ATTR14_UNK23; + case 24: return SPELL_ATTR14_UNK24; + case 25: return SPELL_ATTR14_UNK25; + case 26: return SPELL_ATTR14_UNK26; + case 27: return SPELL_ATTR14_UNK27; + case 28: return SPELL_ATTR14_UNK28; + case 29: return SPELL_ATTR14_UNK29; + case 30: return SPELL_ATTR14_UNK30; + case 31: return SPELL_ATTR14_UNK31; + default: throw std::out_of_range("index"); + } +} + +/*****************************************************************\ +|* data for enum 'Mechanics' in 'SharedDefines.h' auto-generated *| +\*****************************************************************/ +template <> +TC_API_EXPORT EnumText EnumUtils<Mechanics>::ToString(Mechanics value) +{ + switch (value) + { + case MECHANIC_NONE: return { "MECHANIC_NONE", "MECHANIC_NONE", "" }; + case MECHANIC_CHARM: return { "MECHANIC_CHARM", "MECHANIC_CHARM", "" }; + case MECHANIC_DISORIENTED: return { "MECHANIC_DISORIENTED", "MECHANIC_DISORIENTED", "" }; + case MECHANIC_DISARM: return { "MECHANIC_DISARM", "MECHANIC_DISARM", "" }; + case MECHANIC_DISTRACT: return { "MECHANIC_DISTRACT", "MECHANIC_DISTRACT", "" }; + case MECHANIC_FEAR: return { "MECHANIC_FEAR", "MECHANIC_FEAR", "" }; + case MECHANIC_GRIP: return { "MECHANIC_GRIP", "MECHANIC_GRIP", "" }; + case MECHANIC_ROOT: return { "MECHANIC_ROOT", "MECHANIC_ROOT", "" }; + case MECHANIC_SLOW_ATTACK: return { "MECHANIC_SLOW_ATTACK", "MECHANIC_SLOW_ATTACK", "" }; + case MECHANIC_SILENCE: return { "MECHANIC_SILENCE", "MECHANIC_SILENCE", "" }; + case MECHANIC_SLEEP: return { "MECHANIC_SLEEP", "MECHANIC_SLEEP", "" }; + case MECHANIC_SNARE: return { "MECHANIC_SNARE", "MECHANIC_SNARE", "" }; + case MECHANIC_STUN: return { "MECHANIC_STUN", "MECHANIC_STUN", "" }; + case MECHANIC_FREEZE: return { "MECHANIC_FREEZE", "MECHANIC_FREEZE", "" }; + case MECHANIC_KNOCKOUT: return { "MECHANIC_KNOCKOUT", "MECHANIC_KNOCKOUT", "" }; + case MECHANIC_BLEED: return { "MECHANIC_BLEED", "MECHANIC_BLEED", "" }; + case MECHANIC_BANDAGE: return { "MECHANIC_BANDAGE", "MECHANIC_BANDAGE", "" }; + case MECHANIC_POLYMORPH: return { "MECHANIC_POLYMORPH", "MECHANIC_POLYMORPH", "" }; + case MECHANIC_BANISH: return { "MECHANIC_BANISH", "MECHANIC_BANISH", "" }; + case MECHANIC_SHIELD: return { "MECHANIC_SHIELD", "MECHANIC_SHIELD", "" }; + case MECHANIC_SHACKLE: return { "MECHANIC_SHACKLE", "MECHANIC_SHACKLE", "" }; + case MECHANIC_MOUNT: return { "MECHANIC_MOUNT", "MECHANIC_MOUNT", "" }; + case MECHANIC_INFECTED: return { "MECHANIC_INFECTED", "MECHANIC_INFECTED", "" }; + case MECHANIC_TURN: return { "MECHANIC_TURN", "MECHANIC_TURN", "" }; + case MECHANIC_HORROR: return { "MECHANIC_HORROR", "MECHANIC_HORROR", "" }; + case MECHANIC_INVULNERABILITY: return { "MECHANIC_INVULNERABILITY", "MECHANIC_INVULNERABILITY", "" }; + case MECHANIC_INTERRUPT: return { "MECHANIC_INTERRUPT", "MECHANIC_INTERRUPT", "" }; + case MECHANIC_DAZE: return { "MECHANIC_DAZE", "MECHANIC_DAZE", "" }; + case MECHANIC_DISCOVERY: return { "MECHANIC_DISCOVERY", "MECHANIC_DISCOVERY", "" }; + case MECHANIC_IMMUNE_SHIELD: return { "MECHANIC_IMMUNE_SHIELD", "MECHANIC_IMMUNE_SHIELD", "Divine (Blessing) Shield/Protection and Ice Block" }; + case MECHANIC_SAPPED: return { "MECHANIC_SAPPED", "MECHANIC_SAPPED", "" }; + case MECHANIC_ENRAGED: return { "MECHANIC_ENRAGED", "MECHANIC_ENRAGED", "" }; + case MECHANIC_WOUNDED: return { "MECHANIC_WOUNDED", "MECHANIC_WOUNDED", "" }; + default: throw std::out_of_range("value"); + } +} + +template <> +TC_API_EXPORT size_t EnumUtils<Mechanics>::Count() { return 33; } + +template <> +TC_API_EXPORT Mechanics EnumUtils<Mechanics>::FromIndex(size_t index) +{ + switch (index) + { + case 0: return MECHANIC_NONE; + case 1: return MECHANIC_CHARM; + case 2: return MECHANIC_DISORIENTED; + case 3: return MECHANIC_DISARM; + case 4: return MECHANIC_DISTRACT; + case 5: return MECHANIC_FEAR; + case 6: return MECHANIC_GRIP; + case 7: return MECHANIC_ROOT; + case 8: return MECHANIC_SLOW_ATTACK; + case 9: return MECHANIC_SILENCE; + case 10: return MECHANIC_SLEEP; + case 11: return MECHANIC_SNARE; + case 12: return MECHANIC_STUN; + case 13: return MECHANIC_FREEZE; + case 14: return MECHANIC_KNOCKOUT; + case 15: return MECHANIC_BLEED; + case 16: return MECHANIC_BANDAGE; + case 17: return MECHANIC_POLYMORPH; + case 18: return MECHANIC_BANISH; + case 19: return MECHANIC_SHIELD; + case 20: return MECHANIC_SHACKLE; + case 21: return MECHANIC_MOUNT; + case 22: return MECHANIC_INFECTED; + case 23: return MECHANIC_TURN; + case 24: return MECHANIC_HORROR; + case 25: return MECHANIC_INVULNERABILITY; + case 26: return MECHANIC_INTERRUPT; + case 27: return MECHANIC_DAZE; + case 28: return MECHANIC_DISCOVERY; + case 29: return MECHANIC_IMMUNE_SHIELD; + case 30: return MECHANIC_SAPPED; + case 31: return MECHANIC_ENRAGED; + case 32: return MECHANIC_WOUNDED; + default: throw std::out_of_range("index"); + } +} + +/*********************************************************************\ +|* data for enum 'SpellDmgClass' in 'SharedDefines.h' auto-generated *| +\*********************************************************************/ +template <> +TC_API_EXPORT EnumText EnumUtils<SpellDmgClass>::ToString(SpellDmgClass value) +{ + switch (value) + { + case SPELL_DAMAGE_CLASS_NONE: return { "SPELL_DAMAGE_CLASS_NONE", "None", "" }; + case SPELL_DAMAGE_CLASS_MAGIC: return { "SPELL_DAMAGE_CLASS_MAGIC", "Magic", "" }; + case SPELL_DAMAGE_CLASS_MELEE: return { "SPELL_DAMAGE_CLASS_MELEE", "Melee", "" }; + case SPELL_DAMAGE_CLASS_RANGED: return { "SPELL_DAMAGE_CLASS_RANGED", "Ranged", "" }; + default: throw std::out_of_range("value"); + } +} + +template <> +TC_API_EXPORT size_t EnumUtils<SpellDmgClass>::Count() { return 4; } + +template <> +TC_API_EXPORT SpellDmgClass EnumUtils<SpellDmgClass>::FromIndex(size_t index) +{ + switch (index) + { + case 0: return SPELL_DAMAGE_CLASS_NONE; + case 1: return SPELL_DAMAGE_CLASS_MAGIC; + case 2: return SPELL_DAMAGE_CLASS_MELEE; + case 3: return SPELL_DAMAGE_CLASS_RANGED; + default: throw std::out_of_range("index"); + } +} + +/***************************************************************************\ +|* data for enum 'SpellPreventionType' in 'SharedDefines.h' auto-generated *| +\***************************************************************************/ +template <> +TC_API_EXPORT EnumText EnumUtils<SpellPreventionType>::ToString(SpellPreventionType value) +{ + switch (value) + { + case SPELL_PREVENTION_TYPE_NONE: return { "SPELL_PREVENTION_TYPE_NONE", "None", "" }; + case SPELL_PREVENTION_TYPE_SILENCE: return { "SPELL_PREVENTION_TYPE_SILENCE", "Silence", "" }; + case SPELL_PREVENTION_TYPE_PACIFY: return { "SPELL_PREVENTION_TYPE_PACIFY", "Pacify", "" }; + case SPELL_PREVENTION_TYPE_NO_ACTIONS: return { "SPELL_PREVENTION_TYPE_NO_ACTIONS", "No actions", "" }; + default: throw std::out_of_range("value"); + } +} + +template <> +TC_API_EXPORT size_t EnumUtils<SpellPreventionType>::Count() { return 4; } + +template <> +TC_API_EXPORT SpellPreventionType EnumUtils<SpellPreventionType>::FromIndex(size_t index) +{ + switch (index) + { + case 0: return SPELL_PREVENTION_TYPE_NONE; + case 1: return SPELL_PREVENTION_TYPE_SILENCE; + case 2: return SPELL_PREVENTION_TYPE_PACIFY; + case 3: return SPELL_PREVENTION_TYPE_NO_ACTIONS; + default: throw std::out_of_range("index"); + } +} + +/************************************************************************\ +|* data for enum 'SpellFamilyNames' in 'SharedDefines.h' auto-generated *| +\************************************************************************/ +template <> +TC_API_EXPORT EnumText EnumUtils<SpellFamilyNames>::ToString(SpellFamilyNames value) +{ + switch (value) + { + case SPELLFAMILY_GENERIC: return { "SPELLFAMILY_GENERIC", "Generic", "" }; + case SPELLFAMILY_UNK1: return { "SPELLFAMILY_UNK1", "Unk1 (events, holidays, ...)", "" }; + case SPELLFAMILY_MAGE: return { "SPELLFAMILY_MAGE", "Mage", "" }; + case SPELLFAMILY_WARRIOR: return { "SPELLFAMILY_WARRIOR", "Warrior", "" }; + case SPELLFAMILY_WARLOCK: return { "SPELLFAMILY_WARLOCK", "Warlock", "" }; + case SPELLFAMILY_PRIEST: return { "SPELLFAMILY_PRIEST", "Priest", "" }; + case SPELLFAMILY_DRUID: return { "SPELLFAMILY_DRUID", "Druid", "" }; + case SPELLFAMILY_ROGUE: return { "SPELLFAMILY_ROGUE", "Rogue", "" }; + case SPELLFAMILY_HUNTER: return { "SPELLFAMILY_HUNTER", "Hunter", "" }; + case SPELLFAMILY_PALADIN: return { "SPELLFAMILY_PALADIN", "Paladin", "" }; + case SPELLFAMILY_SHAMAN: return { "SPELLFAMILY_SHAMAN", "Shaman", "" }; + case SPELLFAMILY_UNK2: return { "SPELLFAMILY_UNK2", "Unk2 (Silence resistance?)", "" }; + case SPELLFAMILY_POTION: return { "SPELLFAMILY_POTION", "Potion", "" }; + case SPELLFAMILY_DEATHKNIGHT: return { "SPELLFAMILY_DEATHKNIGHT", "Death Knight", "" }; + case SPELLFAMILY_PET: return { "SPELLFAMILY_PET", "Pet", "" }; + case SPELLFAMILY_TOTEMS: return { "SPELLFAMILY_TOTEMS", "SPELLFAMILY_TOTEMS", "" }; + case SPELLFAMILY_MONK: return { "SPELLFAMILY_MONK", "SPELLFAMILY_MONK", "" }; + case SPELLFAMILY_WARLOCK_PET: return { "SPELLFAMILY_WARLOCK_PET", "SPELLFAMILY_WARLOCK_PET", "" }; + case SPELLFAMILY_UNK66: return { "SPELLFAMILY_UNK66", "SPELLFAMILY_UNK66", "" }; + case SPELLFAMILY_UNK71: return { "SPELLFAMILY_UNK71", "SPELLFAMILY_UNK71", "" }; + case SPELLFAMILY_UNK78: return { "SPELLFAMILY_UNK78", "SPELLFAMILY_UNK78", "" }; + case SPELLFAMILY_UNK91: return { "SPELLFAMILY_UNK91", "SPELLFAMILY_UNK91", "" }; + case SPELLFAMILY_UNK100: return { "SPELLFAMILY_UNK100", "SPELLFAMILY_UNK100", "" }; + case SPELLFAMILY_DEMON_HUNTER: return { "SPELLFAMILY_DEMON_HUNTER", "SPELLFAMILY_DEMON_HUNTER", "" }; + default: throw std::out_of_range("value"); + } +} + +template <> +TC_API_EXPORT size_t EnumUtils<SpellFamilyNames>::Count() { return 24; } + +template <> +TC_API_EXPORT SpellFamilyNames EnumUtils<SpellFamilyNames>::FromIndex(size_t index) +{ + switch (index) + { + case 0: return SPELLFAMILY_GENERIC; + case 1: return SPELLFAMILY_UNK1; + case 2: return SPELLFAMILY_MAGE; + case 3: return SPELLFAMILY_WARRIOR; + case 4: return SPELLFAMILY_WARLOCK; + case 5: return SPELLFAMILY_PRIEST; + case 6: return SPELLFAMILY_DRUID; + case 7: return SPELLFAMILY_ROGUE; + case 8: return SPELLFAMILY_HUNTER; + case 9: return SPELLFAMILY_PALADIN; + case 10: return SPELLFAMILY_SHAMAN; + case 11: return SPELLFAMILY_UNK2; + case 12: return SPELLFAMILY_POTION; + case 13: return SPELLFAMILY_DEATHKNIGHT; + case 14: return SPELLFAMILY_PET; + case 15: return SPELLFAMILY_TOTEMS; + case 16: return SPELLFAMILY_MONK; + case 17: return SPELLFAMILY_WARLOCK_PET; + case 18: return SPELLFAMILY_UNK66; + case 19: return SPELLFAMILY_UNK71; + case 20: return SPELLFAMILY_UNK78; + case 21: return SPELLFAMILY_UNK91; + case 22: return SPELLFAMILY_UNK100; + case 23: return SPELLFAMILY_DEMON_HUNTER; + default: throw std::out_of_range("index"); + } +} +} +} diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index a4558463224..a2e77968346 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -41,180 +41,13 @@ EndScriptData */ #include "PhasingHandler.h" #include "Player.h" #include "RBAC.h" +#include "SmartEnum.h" #include "Transport.h" #include "World.h" #include "WorldSession.h" #include <boost/core/demangle.hpp> #include <typeinfo> -template<typename E, typename T = char const*> -struct EnumName -{ - E Value; - T Name; -}; - -#define CREATE_NAMED_ENUM(VALUE) { VALUE, STRINGIZE(VALUE) } - -EnumName<NPCFlags, int32> const npcFlagTexts[] = -{ - { UNIT_NPC_FLAG_AUCTIONEER, LANG_NPCINFO_AUCTIONEER }, - { UNIT_NPC_FLAG_BANKER, LANG_NPCINFO_BANKER }, - { UNIT_NPC_FLAG_BATTLEMASTER, LANG_NPCINFO_BATTLEMASTER }, - { UNIT_NPC_FLAG_FLIGHTMASTER, LANG_NPCINFO_FLIGHTMASTER }, - { UNIT_NPC_FLAG_GOSSIP, LANG_NPCINFO_GOSSIP }, - { UNIT_NPC_FLAG_GUILD_BANKER, LANG_NPCINFO_GUILD_BANKER }, - { UNIT_NPC_FLAG_INNKEEPER, LANG_NPCINFO_INNKEEPER }, - { UNIT_NPC_FLAG_PETITIONER, LANG_NPCINFO_PETITIONER }, - { UNIT_NPC_FLAG_PLAYER_VEHICLE, LANG_NPCINFO_PLAYER_VEHICLE }, - { UNIT_NPC_FLAG_QUESTGIVER, LANG_NPCINFO_QUESTGIVER }, - { UNIT_NPC_FLAG_REPAIR, LANG_NPCINFO_REPAIR }, - { UNIT_NPC_FLAG_SPELLCLICK, LANG_NPCINFO_SPELLCLICK }, - { UNIT_NPC_FLAG_SPIRITGUIDE, LANG_NPCINFO_SPIRITGUIDE }, - { UNIT_NPC_FLAG_SPIRITHEALER, LANG_NPCINFO_SPIRITHEALER }, - { UNIT_NPC_FLAG_STABLEMASTER, LANG_NPCINFO_STABLEMASTER }, - { UNIT_NPC_FLAG_TABARDDESIGNER, LANG_NPCINFO_TABARDDESIGNER }, - { UNIT_NPC_FLAG_TRAINER, LANG_NPCINFO_TRAINER }, - { UNIT_NPC_FLAG_TRAINER_CLASS, LANG_NPCINFO_TRAINER_CLASS }, - { UNIT_NPC_FLAG_TRAINER_PROFESSION, LANG_NPCINFO_TRAINER_PROFESSION }, - { UNIT_NPC_FLAG_VENDOR, LANG_NPCINFO_VENDOR }, - { UNIT_NPC_FLAG_VENDOR_AMMO, LANG_NPCINFO_VENDOR_AMMO }, - { UNIT_NPC_FLAG_VENDOR_FOOD, LANG_NPCINFO_VENDOR_FOOD }, - { UNIT_NPC_FLAG_VENDOR_POISON, LANG_NPCINFO_VENDOR_POISON }, - { UNIT_NPC_FLAG_VENDOR_REAGENT, LANG_NPCINFO_VENDOR_REAGENT } -}; - -uint32 const NPCFLAG_COUNT = std::extent<decltype(npcFlagTexts)>::value; - -EnumName<Mechanics> const mechanicImmunes[MAX_MECHANIC] = -{ - CREATE_NAMED_ENUM(MECHANIC_NONE), - CREATE_NAMED_ENUM(MECHANIC_CHARM), - CREATE_NAMED_ENUM(MECHANIC_DISORIENTED), - CREATE_NAMED_ENUM(MECHANIC_DISARM), - CREATE_NAMED_ENUM(MECHANIC_DISTRACT), - CREATE_NAMED_ENUM(MECHANIC_FEAR), - CREATE_NAMED_ENUM(MECHANIC_GRIP), - CREATE_NAMED_ENUM(MECHANIC_ROOT), - CREATE_NAMED_ENUM(MECHANIC_SLOW_ATTACK), - CREATE_NAMED_ENUM(MECHANIC_SILENCE), - CREATE_NAMED_ENUM(MECHANIC_SLEEP), - CREATE_NAMED_ENUM(MECHANIC_SNARE), - CREATE_NAMED_ENUM(MECHANIC_STUN), - CREATE_NAMED_ENUM(MECHANIC_FREEZE), - CREATE_NAMED_ENUM(MECHANIC_KNOCKOUT), - CREATE_NAMED_ENUM(MECHANIC_BLEED), - CREATE_NAMED_ENUM(MECHANIC_BANDAGE), - CREATE_NAMED_ENUM(MECHANIC_POLYMORPH), - CREATE_NAMED_ENUM(MECHANIC_BANISH), - CREATE_NAMED_ENUM(MECHANIC_SHIELD), - CREATE_NAMED_ENUM(MECHANIC_SHACKLE), - CREATE_NAMED_ENUM(MECHANIC_MOUNT), - CREATE_NAMED_ENUM(MECHANIC_INFECTED), - CREATE_NAMED_ENUM(MECHANIC_TURN), - CREATE_NAMED_ENUM(MECHANIC_HORROR), - CREATE_NAMED_ENUM(MECHANIC_INVULNERABILITY), - CREATE_NAMED_ENUM(MECHANIC_INTERRUPT), - CREATE_NAMED_ENUM(MECHANIC_DAZE), - CREATE_NAMED_ENUM(MECHANIC_DISCOVERY), - CREATE_NAMED_ENUM(MECHANIC_IMMUNE_SHIELD), - CREATE_NAMED_ENUM(MECHANIC_SAPPED), - CREATE_NAMED_ENUM(MECHANIC_ENRAGED), - CREATE_NAMED_ENUM(MECHANIC_WOUNDED) -}; - -EnumName<UnitFlags> const unitFlags[MAX_UNIT_FLAGS] = -{ - CREATE_NAMED_ENUM(UNIT_FLAG_SERVER_CONTROLLED), - CREATE_NAMED_ENUM(UNIT_FLAG_NON_ATTACKABLE), - CREATE_NAMED_ENUM(UNIT_FLAG_REMOVE_CLIENT_CONTROL), - CREATE_NAMED_ENUM(UNIT_FLAG_PLAYER_CONTROLLED), - CREATE_NAMED_ENUM(UNIT_FLAG_RENAME), - CREATE_NAMED_ENUM(UNIT_FLAG_PREPARATION), - CREATE_NAMED_ENUM(UNIT_FLAG_UNK_6), - CREATE_NAMED_ENUM(UNIT_FLAG_NOT_ATTACKABLE_1), - CREATE_NAMED_ENUM(UNIT_FLAG_IMMUNE_TO_PC), - CREATE_NAMED_ENUM(UNIT_FLAG_IMMUNE_TO_NPC), - CREATE_NAMED_ENUM(UNIT_FLAG_LOOTING), - CREATE_NAMED_ENUM(UNIT_FLAG_PET_IN_COMBAT), - CREATE_NAMED_ENUM(UNIT_FLAG_PVP), - CREATE_NAMED_ENUM(UNIT_FLAG_SILENCED), - CREATE_NAMED_ENUM(UNIT_FLAG_CANNOT_SWIM), - CREATE_NAMED_ENUM(UNIT_FLAG_UNK_15), - CREATE_NAMED_ENUM(UNIT_FLAG_NON_ATTACKABLE_2), - CREATE_NAMED_ENUM(UNIT_FLAG_PACIFIED), - CREATE_NAMED_ENUM(UNIT_FLAG_STUNNED), - CREATE_NAMED_ENUM(UNIT_FLAG_IN_COMBAT), - CREATE_NAMED_ENUM(UNIT_FLAG_TAXI_FLIGHT), - CREATE_NAMED_ENUM(UNIT_FLAG_DISARMED), - CREATE_NAMED_ENUM(UNIT_FLAG_CONFUSED), - CREATE_NAMED_ENUM(UNIT_FLAG_FLEEING), - CREATE_NAMED_ENUM(UNIT_FLAG_POSSESSED), - CREATE_NAMED_ENUM(UNIT_FLAG_NOT_SELECTABLE), - CREATE_NAMED_ENUM(UNIT_FLAG_SKINNABLE), - CREATE_NAMED_ENUM(UNIT_FLAG_MOUNT), - CREATE_NAMED_ENUM(UNIT_FLAG_UNK_28), - CREATE_NAMED_ENUM(UNIT_FLAG_UNK_29), - CREATE_NAMED_ENUM(UNIT_FLAG_SHEATHE), - CREATE_NAMED_ENUM(UNIT_FLAG_UNK_31) -}; - -EnumName<UnitFlags2> const unitFlags2[MAX_UNIT_FLAGS_2] = -{ - CREATE_NAMED_ENUM(UNIT_FLAG2_FEIGN_DEATH), - CREATE_NAMED_ENUM(UNIT_FLAG2_UNK1), - CREATE_NAMED_ENUM(UNIT_FLAG2_IGNORE_REPUTATION), - CREATE_NAMED_ENUM(UNIT_FLAG2_COMPREHEND_LANG), - CREATE_NAMED_ENUM(UNIT_FLAG2_MIRROR_IMAGE), - CREATE_NAMED_ENUM(UNIT_FLAG2_INSTANTLY_APPEAR_MODEL), - CREATE_NAMED_ENUM(UNIT_FLAG2_FORCE_MOVEMENT), - CREATE_NAMED_ENUM(UNIT_FLAG2_DISARM_OFFHAND), - CREATE_NAMED_ENUM(UNIT_FLAG2_DISABLE_PRED_STATS), - CREATE_NAMED_ENUM(UNIT_FLAG2_DISARM_RANGED), - CREATE_NAMED_ENUM(UNIT_FLAG2_REGENERATE_POWER), - CREATE_NAMED_ENUM(UNIT_FLAG2_RESTRICT_PARTY_INTERACTION), - CREATE_NAMED_ENUM(UNIT_FLAG2_PREVENT_SPELL_CLICK), - CREATE_NAMED_ENUM(UNIT_FLAG2_ALLOW_ENEMY_INTERACT), - CREATE_NAMED_ENUM(UNIT_FLAG2_DISABLE_TURN), - CREATE_NAMED_ENUM(UNIT_FLAG2_UNK2), - CREATE_NAMED_ENUM(UNIT_FLAG2_PLAY_DEATH_ANIM), - CREATE_NAMED_ENUM(UNIT_FLAG2_ALLOW_CHEAT_SPELLS), - CREATE_NAMED_ENUM(UNIT_FLAG2_NO_ACTIONS) -}; - -EnumName<UnitFlags3> const unitFlags3[MAX_UNIT_FLAGS_3] = -{ - CREATE_NAMED_ENUM(UNIT_FLAG3_UNK1) -}; - -EnumName<CreatureFlagsExtra> const flagsExtra[] = -{ - CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_INSTANCE_BIND), - CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_CIVILIAN), - CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_NO_PARRY), - CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_NO_PARRY_HASTEN), - CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_NO_BLOCK), - CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_NO_CRUSH), - CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_NO_XP_AT_KILL), - CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_TRIGGER), - CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_NO_TAUNT), - CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_NO_MOVE_FLAGS_UPDATE), - CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_NO_SELL_VENDOR), - CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_WORLDEVENT), - CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_GUARD), - CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_NO_CRIT), - CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_NO_SKILLGAIN), - CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_TAUNT_DIMINISH), - CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_ALL_DIMINISH), - CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_NO_PLAYER_DAMAGE_REQ), - CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_DUNGEON_BOSS), - CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_IGNORE_PATHFINDING), - CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_IMMUNITY_KNOCKBACK), - CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_USE_OFFHAND_ATTACK) -}; - -uint32 const FLAGS_EXTRA_COUNT = std::extent<decltype(flagsExtra)>::value; - bool HandleNpcSpawnGroup(ChatHandler* handler, char const* args) { if (!*args) @@ -849,19 +682,19 @@ public: handler->PSendSysMessage(LANG_NPCINFO_MOVEMENT_DATA, target->GetMovementTemplate().ToString().c_str()); handler->PSendSysMessage(LANG_NPCINFO_UNIT_FIELD_FLAGS, *target->m_unitData->Flags); - for (uint8 i = 0; i < MAX_UNIT_FLAGS; ++i) - if (target->HasUnitFlag(unitFlags[i].Value)) - handler->PSendSysMessage("%s (0x%X)", unitFlags[i].Name, unitFlags[i].Value); + for (UnitFlags flag : EnumUtils::Iterate<UnitFlags>()) + if (target->HasUnitFlag(flag)) + handler->PSendSysMessage("%s (0x%X)", EnumUtils::ToTitle(flag), flag); handler->PSendSysMessage(LANG_NPCINFO_UNIT_FIELD_FLAGS_2, *target->m_unitData->Flags2); - for (uint8 i = 0; i < MAX_UNIT_FLAGS_2; ++i) - if (target->HasUnitFlag2(unitFlags2[i].Value)) - handler->PSendSysMessage("%s (0x%X)", unitFlags2[i].Name, unitFlags2[i].Value); + for (UnitFlags2 flag : EnumUtils::Iterate<UnitFlags2>()) + if (target->HasUnitFlag2(flag)) + handler->PSendSysMessage("%s (0x%X)", EnumUtils::ToTitle(flag), flag); handler->PSendSysMessage(LANG_NPCINFO_UNIT_FIELD_FLAGS_3, *target->m_unitData->Flags3); - for (uint8 i = 0; i < MAX_UNIT_FLAGS_3; ++i) - if (target->HasUnitFlag3(unitFlags3[i].Value)) - handler->PSendSysMessage("%s (0x%X)", unitFlags3[i].Name, unitFlags3[i].Value); + for (UnitFlags3 flag : EnumUtils::Iterate<UnitFlags3>()) + if (target->HasUnitFlag3(flag)) + handler->PSendSysMessage("%s (0x%X)", EnumUtils::ToTitle(flag), flag); handler->PSendSysMessage(LANG_NPCINFO_DYNAMIC_FLAGS, target->GetDynamicFlags()); handler->PSendSysMessage(LANG_COMMAND_RAWPAWNTIMES, defRespawnDelayStr.c_str(), curRespawnDelayStr.c_str()); @@ -881,19 +714,23 @@ public: if (CreatureAI const* ai = target->AI()) handler->PSendSysMessage(LANG_OBJECTINFO_AITYPE, boost::core::demangle(typeid(*ai).name()).c_str()); handler->PSendSysMessage(LANG_NPCINFO_FLAGS_EXTRA, cInfo->flags_extra); - for (uint8 i = 0; i < FLAGS_EXTRA_COUNT; ++i) - if (cInfo->flags_extra & flagsExtra[i].Value) - handler->PSendSysMessage("%s (0x%X)", flagsExtra[i].Name, flagsExtra[i].Value); + for (CreatureFlagsExtra flag : EnumUtils::Iterate<CreatureFlagsExtra>()) + if (cInfo->flags_extra & flag) + handler->PSendSysMessage("%s (0x%X)", EnumUtils::ToTitle(flag), flag); handler->PSendSysMessage(LANG_NPCINFO_NPC_FLAGS, target->m_unitData->NpcFlags[0]); - for (uint8 i = 0; i < NPCFLAG_COUNT; i++) - if (npcflags & npcFlagTexts[i].Value) - handler->PSendSysMessage(npcFlagTexts[i].Name, npcFlagTexts[i].Value); + for (NPCFlags flag : EnumUtils::Iterate<NPCFlags>()) + if (target->HasNpcFlag(flag)) + handler->PSendSysMessage("* %s (0x%X)", EnumUtils::ToTitle(flag), flag); + + for (NPCFlags2 flag : EnumUtils::Iterate<NPCFlags2>()) + if (target->HasNpcFlag2(flag)) + handler->PSendSysMessage("* %s (0x%X)", EnumUtils::ToTitle(flag), flag); handler->PSendSysMessage(LANG_NPCINFO_MECHANIC_IMMUNE, mechanicImmuneMask); - for (uint8 i = 1; i < MAX_MECHANIC; ++i) - if (mechanicImmuneMask & (1 << (mechanicImmunes[i].Value - 1))) - handler->PSendSysMessage("%s (0x%X)", mechanicImmunes[i].Name, mechanicImmunes[i].Value); + for (Mechanics m : EnumUtils::Iterate<Mechanics>()) + if (m && (mechanicImmuneMask & (1 << (m - 1)))) + handler->PSendSysMessage("%s (0x%X)", EnumUtils::ToTitle(m), m); return true; } |