aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common/Utilities/FuzzyFind.h53
-rw-r--r--src/common/Utilities/SmartEnum.h116
-rw-r--r--src/common/Utilities/Util.h6
-rw-r--r--src/server/game/Entities/Creature/CreatureData.h6
-rw-r--r--src/server/game/Entities/Creature/enuminfo_CreatureData.cpp116
-rw-r--r--src/server/game/Entities/Unit/UnitDefines.h90
-rw-r--r--src/server/game/Entities/Unit/enuminfo_UnitDefines.cpp344
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h146
-rw-r--r--src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp1676
-rw-r--r--src/server/scripts/Commands/cs_npc.cpp209
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;
}