aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2018-10-26 14:43:22 +0200
committerShauren <shauren.trinity@gmail.com>2021-11-15 21:34:03 +0100
commitc977087d589e8b1696eccb0730284f056c731b04 (patch)
tree72889b0ef8323a61beeddf6a846c3d97ee1846e1
parentdf2f6ad219a18576617e4fc3f4cd60b530ac9d9a (diff)
Core/Misc: Partial merge of 3.3.5-dbedit:
- Added SmartEnum.h for enum iteration, stringification, and more, courtesy of krabicezpapundeklu/smart_enum - Moved a bunch of enums in SharedDefines.h to the new system - Miscellaneous utility methods ported Core/Util: Redesign SmartEnum to properly work for large enums (>64 entries) and play nice with IDEs (PR #22768) (cherry picked from commit 338e8ba0fea8b4b15120c96fff15a6c4b1a52593) (cherry picked from commit f7ca0877a3736000a6e3b4ed09ac5f08b4d8e3f0) (cherry picked from commit 207093475a177e9fd29696e80fdd06a11324782d) (cherry picked from commit ee68cf33921944fd3f8c188044906998cf10ff2a) (cherry picked from commit c16d461e16f0704bb11040faff30953d33ba2188) (cherry picked from commit f6b0d99e2c0bc22b44d6f3cfdae50cbba7d51de8) (cherry picked from commit bc1f456125c1b6c90617a514152d69c40ce64886)
-rw-r--r--.gitignore1
-rw-r--r--contrib/enumutils_describe.py154
-rw-r--r--dep/CMakeLists.txt6
-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
13 files changed, 2629 insertions, 294 deletions
diff --git a/.gitignore b/.gitignore
index 9ef72e70bf3..8f53d915b4a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,3 +22,4 @@ nbproject/*
.vscode
cmake-build-*/
.vs
+*.user
diff --git a/contrib/enumutils_describe.py b/contrib/enumutils_describe.py
new file mode 100644
index 00000000000..6da72d25198
--- /dev/null
+++ b/contrib/enumutils_describe.py
@@ -0,0 +1,154 @@
+from re import compile, MULTILINE
+from os import walk, getcwd
+
+notice = ('''/*
+ * 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/>.
+ */
+
+''')
+
+if not getcwd().endswith('src'):
+ print('Run this from the src directory!')
+ print('(Invoke as \'python ../contrib/enumutils_describe.py\')')
+ exit(1)
+
+EnumPattern = compile(r'//\s*EnumUtils: DESCRIBE THIS\s+enum\s+([0-9A-Za-z]+)[^\n]*\s*{([^}]+)};')
+EnumValuesPattern = compile(r'\s+.+?(,|$)[^\n]*')
+EnumValueNamePattern = compile(r'^\s*([a-zA-Z0-9_]+)', flags=MULTILINE)
+EnumValueSkipLinePattern = compile(r'^\s*//')
+EnumValueCommentPattern = compile(r'//,?[ \t]*([^\n]+)$')
+CommentMatchFormat = compile(r'^(((TITLE +(.+?))|(DESCRIPTION +(.+?))) *){1,2}$')
+CommentSkipFormat = compile(r'^SKIP *$')
+
+def strescape(str):
+ res = ''
+ for char in str:
+ if char in ('\\', '"') or not (32 <= ord(char) < 127):
+ res += ('\\%03o' % ord(char))
+ else:
+ res += char
+ return '"' + res + '"'
+
+def processFile(path, filename):
+ input = open('%s/%s.h' % (path, filename),'r')
+ if input is None:
+ print('Failed to open %s.h' % filename)
+ return
+
+ file = input.read()
+
+ enums = []
+ for enum in EnumPattern.finditer(file):
+ name = enum.group(1)
+ values = []
+ for value in EnumValuesPattern.finditer(enum.group(2)):
+ valueData = value.group(0)
+
+ valueNameMatch = EnumValueNamePattern.search(valueData)
+ if valueNameMatch is None:
+ if EnumValueSkipLinePattern.search(valueData) is None:
+ print('Name of value not found: %s' % repr(valueData))
+ continue
+ valueName = valueNameMatch.group(1)
+
+ valueCommentMatch = EnumValueCommentPattern.search(valueData)
+ valueComment = None
+ if valueCommentMatch:
+ valueComment = valueCommentMatch.group(1)
+
+ valueTitle = None
+ valueDescription = None
+
+ if valueComment is not None:
+ if CommentSkipFormat.match(valueComment) is not None:
+ continue
+ commentMatch = CommentMatchFormat.match(valueComment)
+ if commentMatch is not None:
+ valueTitle = commentMatch.group(4)
+ valueDescription = commentMatch.group(6)
+ else:
+ valueDescription = valueComment
+
+ if valueTitle is None:
+ valueTitle = valueName
+ if valueDescription is None:
+ valueDescription = ''
+
+ values.append((valueName, valueTitle, valueDescription))
+
+ enums.append((name, values))
+ print('%s.h: Enum %s parsed with %d values' % (filename, name, len(values)))
+
+ if not enums:
+ return
+
+ print('Done parsing %s.h (in %s)\n' % (filename, path))
+ output = open('%s/enuminfo_%s.cpp' % (path, filename), 'w')
+ if output is None:
+ print('Failed to create enuminfo_%s.cpp' % filename)
+ return
+
+ # write output file
+ output.write(notice)
+ output.write('#include "%s.h"\n' % filename)
+ output.write('#include "Define.h"\n')
+ output.write('#include "SmartEnum.h"\n')
+ output.write('#include <stdexcept>\n')
+ output.write('\n')
+ output.write('namespace Trinity\n')
+ output.write('{\n')
+ output.write('namespace Impl\n')
+ output.write('{\n')
+ for name, values in enums:
+ tag = ('data for enum \'%s\' in \'%s.h\' auto-generated' % (name, filename))
+ output.write('\n')
+ output.write('/*' + ('*'*(len(tag)+2)) + '*\\\n')
+ output.write('|* ' + tag + ' *|\n')
+ output.write('\\*' + ('*'*(len(tag)+2)) + '*/\n')
+ output.write('template <>\n')
+ output.write('TC_API_EXPORT EnumText EnumUtils<%s>::ToString(%s value)\n' % (name, name))
+ output.write('{\n')
+ output.write(' switch (value)\n')
+ output.write(' {\n')
+ for label, title, description in values:
+ output.write(' case %s: return { %s, %s, %s };\n' % (label, strescape(label), strescape(title), strescape(description)))
+ output.write(' default: throw std::out_of_range("value");\n')
+ output.write(' }\n')
+ output.write('}\n')
+ output.write('\n')
+ output.write('template <>\n');
+ output.write('TC_API_EXPORT size_t EnumUtils<%s>::Count() { return %d; }\n' % (name, len(values)))
+ output.write('\n')
+ output.write('template <>\n');
+ output.write('TC_API_EXPORT %s EnumUtils<%s>::FromIndex(size_t index)\n' % (name, name))
+ output.write('{\n')
+ output.write(' switch (index)\n')
+ output.write(' {\n')
+ for i in range(len(values)):
+ output.write(' case %d: return %s;\n' % (i, values[i][0]))
+ output.write(' default: throw std::out_of_range("index");\n')
+ output.write(' }\n')
+ output.write('}\n')
+
+ output.write('}\n')
+ output.write('}\n')
+
+FilenamePattern = compile(r'^(.+)\.h$')
+for root, dirs, files in walk('.'):
+ for n in files:
+ nameMatch = FilenamePattern.match(n)
+ if nameMatch is not None:
+ processFile(root, nameMatch.group(1))
diff --git a/dep/CMakeLists.txt b/dep/CMakeLists.txt
index ee54221b66c..0913649dc0c 100644
--- a/dep/CMakeLists.txt
+++ b/dep/CMakeLists.txt
@@ -10,7 +10,7 @@
add_subdirectory(threads)
-if(SERVERS OR TOOLS)
+if (SERVERS OR TOOLS)
add_subdirectory(boost)
add_subdirectory(process)
add_subdirectory(zlib)
@@ -24,7 +24,7 @@ if(SERVERS OR TOOLS)
add_subdirectory(jemalloc)
endif()
-if(SERVERS)
+if (SERVERS)
add_subdirectory(mysql)
add_subdirectory(readline)
add_subdirectory(gsoap)
@@ -33,6 +33,6 @@ if(SERVERS)
add_subdirectory(protobuf)
endif()
-if(TOOLS)
+if (TOOLS)
add_subdirectory(CascLib)
endif()
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;
}