24#include "glm/gtc/epsilon.hpp"
25#include "glm/gtc/type_ptr.hpp"
26#include "glm/gtx/norm.hpp"
30#define GL_BUFFER_OFFSET(i) ((char *)(0) + (i))
40 LOG_INFO <<
"-----------------------------------------";
51 LOG_INFO <<
" #### TEXTUREMANAGER ####";
53 LOG_INFO <<
" ########################";
57 "useTex2" <<
passes[i]->useTex2;
59 LOG_INFO <<
"-----------------------------------------";
66 LOG_INFO <<
"GL_ALPHA_TEST:" << glIsEnabled(GL_ALPHA_TEST);
67 LOG_INFO <<
"GL_BLEND:" << glIsEnabled(GL_BLEND);
68 LOG_INFO <<
"GL_CULL_FACE:" << glIsEnabled(GL_CULL_FACE);
69 glGetIntegerv(GL_FRONT_FACE, &bled);
74 else if (bled == GL_CCW)
78 LOG_INFO <<
"GL_DEPTH_TEST:" << glIsEnabled(GL_DEPTH_TEST);
79 LOG_INFO <<
"GL_DEPTH_WRITEMASK:" << glIsEnabled(GL_DEPTH_WRITEMASK);
80 LOG_INFO <<
"GL_COLOR_MATERIAL:" << glIsEnabled(GL_COLOR_MATERIAL);
81 LOG_INFO <<
"GL_LIGHT0:" << glIsEnabled(GL_LIGHT0);
82 LOG_INFO <<
"GL_LIGHT1:" << glIsEnabled(GL_LIGHT1);
83 LOG_INFO <<
"GL_LIGHT2:" << glIsEnabled(GL_LIGHT2);
84 LOG_INFO <<
"GL_LIGHT3:" << glIsEnabled(GL_LIGHT3);
85 LOG_INFO <<
"GL_LIGHTING:" << glIsEnabled(GL_LIGHTING);
86 LOG_INFO <<
"GL_TEXTURE_2D:" << glIsEnabled(GL_TEXTURE_2D);
87 glGetIntegerv(GL_BLEND_SRC, &bled);
89 glGetIntegerv(GL_BLEND_DST, &bled);
95 glDisable(GL_ALPHA_TEST);
97 glDisable(GL_COLOR_MATERIAL);
99 glDisable(GL_CULL_FACE);
100 glEnable(GL_DEPTH_TEST);
101 glDisable(GL_DEPTH_TEST);
103 glLightfv(GL_LIGHT0, GL_DIFFUSE, glm::value_ptr(glm::vec4(1.0f, 1.0f, 1.0f, 1.0f)));
104 glLightfv(GL_LIGHT0, GL_AMBIENT, glm::value_ptr(glm::vec4(1.0f, 1.0f, 1.0f, 1.0f)));
105 glLightfv(GL_LIGHT0, GL_SPECULAR, glm::value_ptr(glm::vec4(1.0f, 1.0f, 1.0f, 1.0f)));
106 glDisable(GL_LIGHT1);
107 glDisable(GL_LIGHT2);
108 glDisable(GL_LIGHT3);
109 glDisable(GL_LIGHTING);
110 glDisable(GL_TEXTURE_2D);
111 glBlendFunc(GL_ONE, GL_ZERO);
114 glDepthFunc(GL_NEVER);
119 forceAnim(forceAnim),
125 pos_ = glm::vec3(0.0f, 0.0f, 0.0f);
126 rot_ = glm::vec3(0.0f, 0.0f, 0.0f);
209 glDeleteBuffersARB(1, &
nbuf);
210 glDeleteBuffersARB(1, &
vbuf);
211 glDeleteBuffersARB(1, &
tbuf);
235 for (
const auto it :
passes)
243 glDeleteLists(
dlist, 1);
251 LOG_INFO <<
"id:" << a_header.
id[0] << a_header.
id[1] << a_header.
id[2] << a_header.
id[3];
334 for (
size_t b = 0; b < 4; b++)
336 if (ov_it->weights[b] > 0)
385 if (cols[i].color.type != 0 || cols[i].
opacity.
type != 0)
399 if (trs[i].
trans.type != 0)
460 auto lastName = list[list.size() - 1];
461 if (
auto pos = lastName.find(
".m2"); pos != std::string::npos)
462 lastName.erase(pos, 3);
475 LOG_ERROR <<
"Unable to load the Model \"" << tempname.c_str() <<
"\", appears to be corrupted.";
489 if (skelFile->
open())
515 if (parentFile && parentFile->
open() && parentFile->
setChunk(
"SKS1"))
558 LOG_INFO <<
"Adding skin file" << i <<
":" << skinfile;
590 normals[i] = glm::normalize(ov_it->normal);
592 float len = glm::length2(ov_it->pos);
626 std::vector<TXID> txids;
670 if (txids.size() > 0)
688 GAMEDIRECTORY.getFile(R
"(Item\ObjectComponents\Weapon\ArmorReflect4.BLP)"));
709 if (skelFile->
open())
721 att.
init(attachments[I]);
753 att.
init(attachments[I]);
810 if (
const DB2Table* cmdTbl =
WOWDB.getTable(
"CreatureModelData"))
812 for (
const auto& row : *cmdTbl)
827 dlist = glGenLists(1);
828 glNewList(
dlist, GL_COMPILE);
848 std::map<int, int> SDReplacementModel =
850 {1838568, 119369}, {1838570, 119376}, {1838201, 307453}, {1838592, 307454}, {1853956, 535052},
851 {1853610, 589715}, {1838560, 878772}, {1838566, 900914}, {1838578, 917116}, {1838574, 921844},
852 {1838564, 940356}, {1838580, 949470}, {1838562, 950080}, {1838584, 959310}, {1838586, 968705},
853 {1838576, 974343}, {1839008, 986648}, {1838582, 997378}, {1838572, 1000764}, {1839253, 1005887},
854 {1838385, 1011653}, {1838588, 1018060}, {1822372, 1022598}, {1838590, 1022938}, {1853408, 1100087},
855 {1839709, 1100258}, {1825438, 1593999}, {1839042, 1620605}, {1858265, 1630218}, {1859379, 1630402},
856 {1900779, 1630447}, {1894572, 1662187}, {1859345, 1733758}, {1858367, 1734034}, {1858099, 1810676},
857 {1857801, 1814471}, {1892825, 1890763}, {1892543, 1890765}, {1968838, 1968587}, {1842700, 1000764}
861 if (SDReplacementModel.count(fdid))
863 fdid = SDReplacementModel[fdid];
871 std::vector<TXID> txids;
879 txids.push_back(txid);
887 std::vector<AFID> afids;
896 afids.push_back(afid);
906 for (
uint i = 0; i < nAnimations; i++)
916 if (afids.size() > 0)
918 for (
const auto it : afids)
920 if ((it.animId ==
anims[i].animID) && (it.subAnimId ==
anims[i].subAnimID))
930 auto mpos = tempname.rfind(
".m2");
931 if (mpos == std::string::npos) mpos = tempname.rfind(
".M2");
932 if (mpos != std::string::npos) tempname.erase(mpos);
933 auto animFileName = std::format(
"{}{:04d}-{:02d}.anim", tempname,
anims[i].animID,
anims[i].subAnimID);
937 if (Anim && Anim->
open())
952 if (nAnimationLookup > 0)
957 memcpy(buffer, f->
getBuffer() + ofsAnimationLookup,
sizeof(
int16) * nAnimationLookup);
958 for (
uint i = 0; i < nAnimationLookup; i++)
976 if (skelFile->
open())
990 skelFile->
read(&skpd,
sizeof(skpd));
994 if (parentFile && parentFile->
open())
1002 parentFile->
read(&Sks1,
sizeof(Sks1));
1007 parentFile->
close();
1012 skelFile->
read(&sks1,
sizeof(sks1));
1026 if (parentFile->
open())
1030 fileToUse = parentFile;
1034 LOG_ERROR <<
"Failed to open parentFile in WoWModel::initAnimated";
1039 fileToUse->
read(&skb1,
sizeof(skb1));
1047 for (
size_t i = 0; i < skb1.
nBones; i++)
1048 bones[i].initV3(*fileToUse, mb[i], data);
1070 std::vector<AFID> afids;
1109 if (it.second.first !=
nullptr)
1110 it.second.first->close();
1113 const size_t size = (
origVertices.size() *
sizeof(float));
1118 for (
size_t i = 0; i <
origVertices.size(); i++, ++ov_it)
1124 glGenBuffersARB(1, &
vbuf);
1125 glBindBufferARB(GL_ARRAY_BUFFER_ARB,
vbuf);
1126 glBufferDataARB(GL_ARRAY_BUFFER_ARB,
vbufsize,
vertices, GL_STATIC_DRAW_ARB);
1131 glGenBuffersARB(1, &
tbuf);
1132 glBindBufferARB(GL_ARRAY_BUFFER_ARB,
tbuf);
1133 glBufferDataARB(GL_ARRAY_BUFFER_ARB, 2 * size,
texCoords, GL_STATIC_DRAW_ARB);
1138 glGenBuffersARB(1, &
nbuf);
1139 glBindBufferARB(GL_ARRAY_BUFFER_ARB,
nbuf);
1140 glBufferDataARB(GL_ARRAY_BUFFER_ARB,
vbufsize,
normals, GL_STATIC_DRAW_ARB);
1145 glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
1162 events[i].init(edefs[i]);
1244 const int numSkinFiles =
static_cast<int>(
skinFileIDs.size());
1247 LOG_ERROR <<
"Attempt to set view level when no .skin files exist.";
1254 LOG_ERROR <<
"Attempt to set view level to negative number (" << index <<
").";
1256 else if (index >= numSkinFiles)
1258 index = numSkinFiles - 1;
1259 LOG_ERROR <<
"Attempt to set view level too high (" << index <<
"). Setting LOD to valid max (" << index <<
1265 if (!g || !g->
open())
1267 LOG_ERROR <<
"Unable to load .skin file with ID" << skinfile <<
".";
1274 auto mpos = tmpname.rfind(
".m2");
1275 if (mpos == std::string::npos) mpos = tmpname.rfind(
".M2");
1276 if (mpos != std::string::npos) tmpname.erase(mpos);
1277 lodname = std::format(
"{}{:02d}.skin", tmpname, index);
1280 if (!g || !g->
open())
1302 if (view->
id[0] !=
'S' || view->
id[1] !=
'K' || view->
id[2] !=
'I' || view->
id[3] !=
'N')
1315 for (
size_t i = 0; i < view->
nTris; i++)
1331 for (
size_t i = 0; i < view->
nSub; i++)
1344 for (
size_t j = 0; j < view->
nTex; j++)
1355 for (
size_t k = 0; k < texCount; k++)
1358 if (special == 11 || special == 12 || special == 13)
1360 texOffset =
static_cast<uint>(k);
1363 LOG_INFO <<
"setLOD: texture unit" << j <<
"has" << texCount <<
"textures. Choosing texture" << k +
1364 1 <<
", which has special type =" << special;
1368 pass->
tex = texlookup[Tex[j].textureid + texOffset];
1377 pass->
color = Tex[j].colorIndex;
1379 pass->
opacity = transLookup[Tex[j].transid + texOffset];
1407 pass->
texanim = texanimlookup[Tex[j].texanimid + texOffset];
1430 for (
auto& it :
bones)
1448 int closeFistID = 0;
1522 for (
size_t i = 0; i < 5; i++)
1539 for (
size_t i = 0; i < 5; i++)
1606 for (
auto& it :
bones)
1608 it.calcMatrix(
bones, Anim, time);
1641 glBindBufferARB(GL_ARRAY_BUFFER_ARB,
vbuf);
1642 glBufferDataARB(GL_ARRAY_BUFFER_ARB, 2 *
vbufsize,
nullptr, GL_STREAM_DRAW_ARB);
1644 vertices =
static_cast<glm::vec3*
>(glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY));
1649 for (
size_t i = 0; ov_it !=
origVertices.end(); ++i, ++ov_it)
1652 glm::vec3 v(0, 0, 0), n(0, 0, 0);
1654 for (
size_t b = 0; b < 4; b++)
1656 if (ov_it->weights[b] > 0)
1658 glm::vec3 tv = glm::vec3(
bones[ov_it->bones[b]].mat * glm::vec4(ov_it->pos, 1.0f));
1659 glm::vec3 tn = glm::vec3(
bones[ov_it->bones[b]].mrot * glm::vec4(ov_it->normal, 1.0f));
1660 v += tv * (
static_cast<float>(ov_it->weights[b]) / 255.0f);
1661 n += tn * (
static_cast<float>(ov_it->weights[b]) / 255.0f);
1675 glUnmapBufferARB(GL_ARRAY_BUFFER_ARB);
1679 for (
auto& light :
lights)
1681 if (light.parent >= 0)
1683 light.tpos = glm::vec3(
bones[light.parent].mat * glm::vec4(light.pos, 1.0f));
1684 light.tdir = glm::vec3(
bones[light.parent].mrot * glm::vec4(light.dir, 1.0f));
1714 glFrontFace(GL_CCW);
1719 if (scaling != glm::vec3(1.0f, 1.0f, 1.0f))
1720 glScalef(scaling.x, scaling.y, scaling.z);
1722 if (
pos_ != glm::vec3(0.0f, 0.0f, 0.0f))
1726 if (
rot_ != glm::vec3(0.0f, 0.0f, 0.0f))
1728 glRotatef(
rot_.x, 1.0f, 0.0f, 0.0f);
1729 glRotatef(
rot_.y, 0.0f, 1.0f, 0.0f);
1730 glRotatef(
rot_.z, 0.0f, 0.0f, 1.0f);
1736 glDisable(GL_COLOR_MATERIAL);
1738 const float a[] = { 1.0f, 1.0f, 1.0f,
alpha_ };
1739 glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, a);
1744 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1748 glDisable(GL_TEXTURE_2D);
1750 glEnable(GL_TEXTURE_2D);
1762 glBindBufferARB(GL_ARRAY_BUFFER_ARB,
nbuf);
1763 glNormalPointer(GL_FLOAT, 0,
nullptr);
1767 glBindBufferARB(GL_ARRAY_BUFFER_ARB,
vbuf);
1768 glVertexPointer(3, GL_FLOAT, 0,
nullptr);
1770 glBindBufferARB(GL_ARRAY_BUFFER_ARB,
tbuf);
1771 glTexCoordPointer(2, GL_FLOAT, 0,
nullptr);
1775 glVertexPointer(3, GL_FLOAT, 0,
vertices);
1776 glNormalPointer(GL_FLOAT, 0,
normals);
1777 glTexCoordPointer(2, GL_FLOAT, 0,
texCoords);
1782 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
1786 for (
const auto it :
passes)
1796 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
1800 glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
1805 const float a[] = {1.0f, 1.0f, 1.0f, 1.0f};
1806 glMaterialfv(GL_FRONT, GL_DIFFUSE, a);
1808 glDisable(GL_BLEND);
1811 glEnable(GL_COLOR_MATERIAL);
1849 glDisable(GL_LIGHTING);
1850 glDisable(GL_TEXTURE_2D);
1858 glEnable(GL_TEXTURE_2D);
1859 glEnable(GL_LIGHTING);
1867 for (
uint i = 0, l = lbase; i <
lights.size(); i++)
1874 for (
uint i = 0, l = lbase; i <
lights.size(); i++)
1875 glDisable((GLenum)l++);
1895 glDisable(GL_DEPTH_TEST);
1897 for (
auto it :
bones)
1900 if (it.parent != -1)
1902 glVertex3fv(glm::value_ptr(it.transPivot));
1903 glVertex3fv(glm::value_ptr(
bones[it.parent].transPivot));
1907 glEnable(GL_DEPTH_TEST);
1929 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
1930 glBegin(GL_TRIANGLES);
1934 glVertex3fv(glm::value_ptr(
bounds[v]));
1936 glVertex3f(0, 0, 0);
1939 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
1957 glFrontFace(GL_CCW);
1962 if (scaling != glm::vec3(1.0f, 1.0f, 1.0f))
1963 glScalef(scaling.x, scaling.y, scaling.z);
1965 if (
rot_ != glm::vec3(0.0f, 0.0f, 0.0f))
1966 glRotatef(
rot_.y, 0.0f, 1.0f, 0.0f);
1970 if (
pos_ != glm::vec3(0.0f, 0.0f, 0.0f))
1987 for (
const auto it : *
this)
1989 if (it->slot() == slot)
1998 const auto* item =
getItem(slot);
2000 if (item ==
nullptr)
2009 if (chest ==
nullptr)
2028 if (specialTexture == special)
2041 std::map<int, std::wstring> result;
2043 static const std::map<int, std::wstring> AnimationNames =
2054 {9, L
"CombatWound"},
2055 {10, L
"CombatCritical"},
2056 {11, L
"ShuffleLeft"},
2057 {12, L
"ShuffleRight"},
2058 {13, L
"Walkbackwards"},
2060 {15, L
"HandsClosed"},
2061 {16, L
"AttackUnarmed"},
2065 {20, L
"ParryUnarmed"},
2069 {24, L
"ShieldBlock"},
2070 {25, L
"ReadyUnarmed"},
2076 {31, L
"SpellPrecast"},
2078 {33, L
"SpellCastArea"},
2079 {34, L
"NPCWelcome"},
2080 {35, L
"NPCGoodbye"},
2090 {45, L
"SwimBackwards"},
2093 {48, L
"ReadyRifle"},
2094 {49, L
"AttackRifle"},
2096 {51, L
"ReadySpellDirected"},
2097 {52, L
"ReadySpellOmni"},
2098 {53, L
"SpellCastDirected"},
2099 {54, L
"SpellCastOmni"},
2100 {55, L
"BattleRoar"},
2101 {56, L
"ReadyAbility"},
2104 {59, L
"ShieldBash"},
2108 {63, L
"EmoteUseStanding"},
2109 {64, L
"EmoteTalkExclamation"},
2110 {65, L
"EmoteTalkQuestion"},
2113 {68, L
"EmoteCheer"},
2114 {69, L
"EmoteDance"},
2115 {70, L
"EmoteLaugh"},
2116 {71, L
"EmoteSleep"},
2117 {72, L
"EmoteSitGround"},
2120 {75, L
"EmoteKneel"},
2123 {78, L
"EmoteChicken"},
2125 {80, L
"EmoteApplaud"},
2126 {81, L
"EmoteShout"},
2129 {84, L
"EmotePoint"},
2130 {85, L
"Attack1HPierce"},
2131 {86, L
"Attack2HLoosePierce"},
2133 {88, L
"AttackOffPierce"},
2139 {94, L
"MountSpecial"},
2141 {96, L
"SitGroundDown"},
2143 {98, L
"SitGroundUp"},
2147 {102, L
"SitChairLow"},
2148 {103, L
"SitChairMed"},
2149 {104, L
"SitChairHigh"},
2151 {106, L
"LoadRifle"},
2152 {107, L
"AttackThrown"},
2153 {108, L
"ReadyThrown"},
2155 {110, L
"HoldRifle"},
2156 {111, L
"HoldThrown"},
2157 {112, L
"LoadThrown"},
2158 {113, L
"EmoteSalute"},
2159 {114, L
"KneelStart"},
2160 {115, L
"KneelLoop"},
2162 {117, L
"AttackUnarmedOff"},
2163 {118, L
"SpecialUnarmed"},
2164 {119, L
"StealthWalk"},
2165 {120, L
"StealthStand"},
2166 {121, L
"Knockdown"},
2167 {122, L
"EatingLoop"},
2168 {123, L
"UseStandingLoop"},
2169 {124, L
"ChannelCastDirected"},
2170 {125, L
"ChannelCastOmni"},
2171 {126, L
"Whirlwind"},
2173 {128, L
"UseStandingStart"},
2174 {129, L
"UseStandingEnd"},
2175 {130, L
"CreatureSpecial"},
2178 {133, L
"FishingCast"},
2179 {134, L
"FishingLoop"},
2181 {136, L
"EmoteWorkNoSheathe"},
2182 {137, L
"EmoteStunNoSheathe"},
2183 {138, L
"EmoteUseStandingNoSheathe"},
2184 {139, L
"SpellSleepDown"},
2185 {140, L
"SpellKneelStart"},
2186 {141, L
"SpellKneelLoop"},
2187 {142, L
"SpellKneelEnd"},
2196 {151, L
"Destroyed"},
2206 {161, L
"BowRelease"},
2207 {162, L
"ShipStart"},
2208 {163, L
"ShipMoving"},
2210 {165, L
"GroupArrow"},
2212 {167, L
"CorpseArrow"},
2213 {168, L
"GuideArrow"},
2215 {170, L
"DruidCatPounce"},
2216 {171, L
"DruidCatRip"},
2217 {172, L
"DruidCatRake"},
2218 {173, L
"DruidCatRavage"},
2219 {174, L
"DruidCatClaw"},
2220 {175, L
"DruidCatCower"},
2221 {176, L
"DruidBearSwipe"},
2222 {177, L
"DruidBearBite"},
2223 {178, L
"DruidBearMaul"},
2224 {179, L
"DruidBearBash"},
2225 {180, L
"DragonTail"},
2226 {181, L
"DragonStomp"},
2227 {182, L
"DragonSpit"},
2228 {183, L
"DragonSpitHover"},
2229 {184, L
"DragonSpitFly"},
2232 {187, L
"JumpLandRun"},
2235 {190, L
"StandHigh"},
2239 {194, L
"SuccubusEntice"},
2240 {195, L
"EmoteTrain"},
2241 {196, L
"EmoteDead"},
2242 {197, L
"EmoteDanceOnce"},
2244 {199, L
"EmoteEatNoSheathe"},
2247 {202, L
"Submerged"},
2248 {203, L
"Cannibalize"},
2249 {204, L
"ArrowBirth"},
2250 {205, L
"GroupArrowBirth"},
2251 {206, L
"CorpseArrowBirth"},
2252 {207, L
"GuideArrowBirth"},
2253 {208, L
"EmoteTalkNoSheathe"},
2254 {209, L
"EmotePointNoSheathe"},
2255 {210, L
"EmoteSaluteNoSheathe"},
2256 {211, L
"EmoteDanceSpecial"},
2258 {213, L
"CustomSpell01"},
2259 {214, L
"CustomSpell02"},
2260 {215, L
"CustomSpell03"},
2261 {216, L
"CustomSpell04"},
2262 {217, L
"CustomSpell05"},
2263 {218, L
"CustomSpell06"},
2264 {219, L
"CustomSpell07"},
2265 {220, L
"CustomSpell08"},
2266 {221, L
"CustomSpell09"},
2267 {222, L
"CustomSpell10"},
2268 {223, L
"StealthRun"},
2272 {227, L
"GrabClosed"},
2273 {228, L
"GrabThrown"},
2282 {237, L
"FlyStandWound"},
2283 {238, L
"FlyCombatWound"},
2284 {239, L
"FlyCombatCritical"},
2285 {240, L
"FlyShuffleLeft"},
2286 {241, L
"FlyShuffleRight"},
2287 {242, L
"FlyWalkbackwards"},
2289 {244, L
"FlyHandsClosed"},
2290 {245, L
"FlyAttackUnarmed"},
2291 {246, L
"FlyAttack1H"},
2292 {247, L
"FlyAttack2H"},
2293 {248, L
"FlyAttack2HL"},
2294 {249, L
"FlyParryUnarmed"},
2295 {250, L
"FlyParry1H"},
2296 {251, L
"FlyParry2H"},
2297 {252, L
"FlyParry2HL"},
2298 {253, L
"FlyShieldBlock"},
2299 {254, L
"FlyReadyUnarmed"},
2300 {255, L
"FlyReady1H"},
2301 {256, L
"FlyReady2H"},
2302 {257, L
"FlyReady2HL"},
2303 {258, L
"FlyReadyBow"},
2305 {260, L
"FlySpellPrecast"},
2306 {261, L
"FlySpellCast"},
2307 {262, L
"FlySpellCastArea"},
2308 {263, L
"FlyNPCWelcome"},
2309 {264, L
"FlyNPCGoodbye"},
2311 {266, L
"FlyJumpStart"},
2313 {268, L
"FlyJumpEnd"},
2315 {270, L
"FlySwimIdle"},
2317 {272, L
"FlySwimLeft"},
2318 {273, L
"FlySwimRight"},
2319 {274, L
"FlySwimBackwards"},
2320 {275, L
"FlyAttackBow"},
2321 {276, L
"FlyFireBow"},
2322 {277, L
"FlyReadyRifle"},
2323 {278, L
"FlyAttackRifle"},
2325 {280, L
"FlyReadySpellDirected"},
2326 {281, L
"FlyReadySpellOmni"},
2327 {282, L
"FlySpellCastDirected"},
2328 {283, L
"FlySpellCastOmni"},
2329 {284, L
"FlyBattleRoar"},
2330 {285, L
"FlyReadyAbility"},
2331 {286, L
"FlySpecial1H"},
2332 {287, L
"FlySpecial2H"},
2333 {288, L
"FlyShieldBash"},
2334 {289, L
"FlyEmoteTalk"},
2335 {290, L
"FlyEmoteEat"},
2336 {291, L
"FlyEmoteWork"},
2337 {292, L
"FlyEmoteUseStanding"},
2338 {293, L
"FlyEmoteTalkExclamation"},
2339 {294, L
"FlyEmoteTalkQuestion"},
2340 {295, L
"FlyEmoteBow"},
2341 {296, L
"FlyEmoteWave"},
2342 {297, L
"FlyEmoteCheer"},
2343 {298, L
"FlyEmoteDance"},
2344 {299, L
"FlyEmoteLaugh"},
2345 {300, L
"FlyEmoteSleep"},
2346 {301, L
"FlyEmoteSitGround"},
2347 {302, L
"FlyEmoteRude"},
2348 {303, L
"FlyEmoteRoar"},
2349 {304, L
"FlyEmoteKneel"},
2350 {305, L
"FlyEmoteKiss"},
2351 {306, L
"FlyEmoteCry"},
2352 {307, L
"FlyEmoteChicken"},
2353 {308, L
"FlyEmoteBeg"},
2354 {309, L
"FlyEmoteApplaud"},
2355 {310, L
"FlyEmoteShout"},
2356 {311, L
"FlyEmoteFlex"},
2357 {312, L
"FlyEmoteShy"},
2358 {313, L
"FlyEmotePoint"},
2359 {314, L
"FlyAttack1HPierce"},
2360 {315, L
"FlyAttack2HLoosePierce"},
2361 {316, L
"FlyAttackOff"},
2362 {317, L
"FlyAttackOffPierce"},
2363 {318, L
"FlySheath"},
2364 {319, L
"FlyHipSheath"},
2366 {321, L
"FlyRunRight"},
2367 {322, L
"FlyRunLeft"},
2368 {323, L
"FlyMountSpecial"},
2370 {325, L
"FlySitGroundDown"},
2371 {326, L
"FlySitGround"},
2372 {327, L
"FlySitGroundUp"},
2373 {328, L
"FlySleepDown"},
2375 {330, L
"FlySleepUp"},
2376 {331, L
"FlySitChairLow"},
2377 {332, L
"FlySitChairMed"},
2378 {333, L
"FlySitChairHigh"},
2379 {334, L
"FlyLoadBow"},
2380 {335, L
"FlyLoadRifle"},
2381 {336, L
"FlyAttackThrown"},
2382 {337, L
"FlyReadyThrown"},
2383 {338, L
"FlyHoldBow"},
2384 {339, L
"FlyHoldRifle"},
2385 {340, L
"FlyHoldThrown"},
2386 {341, L
"FlyLoadThrown"},
2387 {342, L
"FlyEmoteSalute"},
2388 {343, L
"FlyKneelStart"},
2389 {344, L
"FlyKneelLoop"},
2390 {345, L
"FlyKneelEnd"},
2391 {346, L
"FlyAttackUnarmedOff"},
2392 {347, L
"FlySpecialUnarmed"},
2393 {348, L
"FlyStealthWalk"},
2394 {349, L
"FlyStealthStand"},
2395 {350, L
"FlyKnockdown"},
2396 {351, L
"FlyEatingLoop"},
2397 {352, L
"FlyUseStandingLoop"},
2398 {353, L
"FlyChannelCastDirected"},
2399 {354, L
"FlyChannelCastOmni"},
2400 {355, L
"FlyWhirlwind"},
2402 {357, L
"FlyUseStandingStart"},
2403 {358, L
"FlyUseStandingEnd"},
2404 {359, L
"FlyCreatureSpecial"},
2406 {361, L
"FlyDrowned"},
2407 {362, L
"FlyFishingCast"},
2408 {363, L
"FlyFishingLoop"},
2410 {365, L
"FlyEmoteWorkNoSheathe"},
2411 {366, L
"FlyEmoteStunNoSheathe"},
2412 {367, L
"FlyEmoteUseStandingNoSheathe"},
2413 {368, L
"FlySpellSleepDown"},
2414 {369, L
"FlySpellKneelStart"},
2415 {370, L
"FlySpellKneelLoop"},
2416 {371, L
"FlySpellKneelEnd"},
2417 {372, L
"FlySprint"},
2418 {373, L
"FlyInFlight"},
2421 {376, L
"FlyClosed"},
2423 {378, L
"FlyOpened"},
2424 {379, L
"FlyDestroy"},
2425 {380, L
"FlyDestroyed"},
2426 {381, L
"FlyRebuild"},
2427 {382, L
"FlyCustom0"},
2428 {383, L
"FlyCustom1"},
2429 {384, L
"FlyCustom2"},
2430 {385, L
"FlyCustom3"},
2431 {386, L
"FlyDespawn"},
2434 {389, L
"FlyBowPull"},
2435 {390, L
"FlyBowRelease"},
2436 {391, L
"FlyShipStart"},
2437 {392, L
"FlyShipMoving"},
2438 {393, L
"FlyShipStop"},
2439 {394, L
"FlyGroupArrow"},
2441 {396, L
"FlyCorpseArrow"},
2442 {397, L
"FlyGuideArrow"},
2444 {399, L
"FlyDruidCatPounce"},
2445 {400, L
"FlyDruidCatRip"},
2446 {401, L
"FlyDruidCatRake"},
2447 {402, L
"FlyDruidCatRavage"},
2448 {403, L
"FlyDruidCatClaw"},
2449 {404, L
"FlyDruidCatCower"},
2450 {405, L
"FlyDruidBearSwipe"},
2451 {406, L
"FlyDruidBearBite"},
2452 {407, L
"FlyDruidBearMaul"},
2453 {408, L
"FlyDruidBearBash"},
2454 {409, L
"FlyDragonTail"},
2455 {410, L
"FlyDragonStomp"},
2456 {411, L
"FlyDragonSpit"},
2457 {412, L
"FlyDragonSpitHover"},
2458 {413, L
"FlyDragonSpitFly"},
2459 {414, L
"FlyEmoteYes"},
2460 {415, L
"FlyEmoteNo"},
2461 {416, L
"FlyJumpLandRun"},
2462 {417, L
"FlyLootHold"},
2463 {418, L
"FlyLootUp"},
2464 {419, L
"FlyStandHigh"},
2465 {420, L
"FlyImpact"},
2466 {421, L
"FlyLiftOff"},
2468 {423, L
"FlySuccubusEntice"},
2469 {424, L
"FlyEmoteTrain"},
2470 {425, L
"FlyEmoteDead"},
2471 {426, L
"FlyEmoteDanceOnce"},
2472 {427, L
"FlyDeflect"},
2473 {428, L
"FlyEmoteEatNoSheathe"},
2475 {430, L
"FlySubmerge"},
2476 {431, L
"FlySubmerged"},
2477 {432, L
"FlyCannibalize"},
2478 {433, L
"FlyArrowBirth"},
2479 {434, L
"FlyGroupArrowBirth"},
2480 {435, L
"FlyCorpseArrowBirth"},
2481 {436, L
"FlyGuideArrowBirth"},
2482 {437, L
"FlyEmoteTalkNoSheathe"},
2483 {438, L
"FlyEmotePointNoSheathe"},
2484 {439, L
"FlyEmoteSaluteNoSheathe"},
2485 {440, L
"FlyEmoteDanceSpecial"},
2486 {441, L
"FlyMutilate"},
2487 {442, L
"FlyCustomSpell01"},
2488 {443, L
"FlyCustomSpell02"},
2489 {444, L
"FlyCustomSpell03"},
2490 {445, L
"FlyCustomSpell04"},
2491 {446, L
"FlyCustomSpell05"},
2492 {447, L
"FlyCustomSpell06"},
2493 {448, L
"FlyCustomSpell07"},
2494 {449, L
"FlyCustomSpell08"},
2495 {450, L
"FlyCustomSpell09"},
2496 {451, L
"FlyCustomSpell10"},
2497 {452, L
"FlyStealthRun"},
2498 {453, L
"FlyEmerge"},
2501 {456, L
"FlyGrabClosed"},
2502 {457, L
"FlyGrabThrown"},
2507 {462, L
"FlyToHover"},
2508 {463, L
"FlyToGround"},
2510 {465, L
"FlySettle"},
2511 {466, L
"DeathStart"},
2512 {467, L
"DeathLoop"},
2514 {469, L
"FlyDeathStart"},
2515 {470, L
"FlyDeathLoop"},
2516 {471, L
"FlyDeathEnd"},
2517 {472, L
"DeathEndHold"},
2518 {473, L
"FlyDeathEndHold"},
2519 {474, L
"Strangulate"},
2520 {475, L
"FlyStrangulate"},
2521 {476, L
"ReadyJoust"},
2522 {477, L
"LoadJoust"},
2523 {478, L
"HoldJoust"},
2524 {479, L
"FlyReadyJoust"},
2525 {480, L
"FlyLoadJoust"},
2526 {481, L
"FlyHoldJoust"},
2527 {482, L
"AttackJoust"},
2528 {483, L
"FlyAttackJoust"},
2529 {484, L
"ReclinedMount"},
2530 {485, L
"FlyReclinedMount"},
2531 {486, L
"ToAltered"},
2532 {487, L
"FromAltered"},
2533 {488, L
"FlyToAltered"},
2534 {489, L
"FlyFromAltered"},
2536 {491, L
"FlyInStocks"},
2537 {492, L
"VehicleGrab"},
2538 {493, L
"VehicleThrow"},
2539 {494, L
"FlyVehicleGrab"},
2540 {495, L
"FlyVehicleThrow"},
2541 {496, L
"ToAlteredPostSwap"},
2542 {497, L
"FromAlteredPostSwap"},
2543 {498, L
"FlyToAlteredPostSwap"},
2544 {499, L
"FlyFromAlteredPostSwap"},
2545 {500, L
"ReclinedMountPassenger"},
2546 {501, L
"FlyReclinedMountPassenger"},
2548 {503, L
"Carried2H"},
2549 {504, L
"FlyCarry2H"},
2550 {505, L
"FlyCarried2H"},
2551 {506, L
"EmoteSniff"},
2552 {507, L
"EmoteFlySniff"},
2553 {508, L
"AttackFist1H"},
2554 {509, L
"FlyAttackFist1H"},
2555 {510, L
"AttackFist1HOff"},
2556 {511, L
"FlyAttackFist1HOff"},
2557 {512, L
"ParryFist1H"},
2558 {513, L
"FlyParryFist1H"},
2559 {514, L
"ReadyFist1H"},
2560 {515, L
"FlyReadyFist1H"},
2561 {516, L
"SpecialFist1H"},
2562 {517, L
"FlySpecialFist1H"},
2563 {518, L
"EmoteReadStart"},
2564 {519, L
"FlyEmoteReadStart"},
2565 {520, L
"EmoteReadLoop"},
2566 {521, L
"FlyEmoteReadLoop"},
2567 {522, L
"EmoteReadEnd"},
2568 {523, L
"FlyEmoteReadEnd"},
2570 {525, L
"FlySwimRun"},
2572 {527, L
"FlySwimWalk"},
2573 {528, L
"SwimWalkBackwards"},
2574 {529, L
"FlySwimWalkBackwards"},
2575 {530, L
"SwimSprint"},
2576 {531, L
"FlySwimSprint"},
2577 {532, L
"MountSwimIdle"},
2578 {533, L
"FlyMountSwimIdle"},
2579 {534, L
"MountSwimBackwards"},
2580 {535, L
"FlyMountSwimBackwards"},
2581 {536, L
"MountSwimLeft"},
2582 {537, L
"FlyMountSwimLeft"},
2583 {538, L
"MountSwimRight"},
2584 {539, L
"FlyMountSwimRight"},
2585 {540, L
"MountSwimRun"},
2586 {541, L
"FlyMountSwimRun"},
2587 {542, L
"MountSwimSprint"},
2588 {543, L
"FlyMountSwimSprint"},
2589 {544, L
"MountSwimWalk"},
2590 {545, L
"FlyMountSwimWalk"},
2591 {546, L
"MountSwimWalkBackwards"},
2592 {547, L
"FlyMountSwimWalkBackwards"},
2593 {548, L
"MountFlightIdle"},
2594 {549, L
"FlyMountFlightIdle"},
2595 {550, L
"MountFlightBackwards"},
2596 {551, L
"FlyMountFlightBackwards"},
2597 {552, L
"MountFlightLeft"},
2598 {553, L
"FlyMountFlightLeft"},
2599 {554, L
"MountFlightRight"},
2600 {555, L
"FlyMountFlightRight"},
2601 {556, L
"MountFlightRun"},
2602 {557, L
"FlyMountFlightRun"},
2603 {558, L
"MountFlightSprint"},
2604 {559, L
"FlyMountFlightSprint"},
2605 {560, L
"MountFlightWalk"},
2606 {561, L
"FlyMountFlightWalk"},
2607 {562, L
"MountFlightWalkBackwards"},
2608 {563, L
"FlyMountFlightWalkBackwards"},
2609 {564, L
"MountFlightStart"},
2610 {565, L
"FlyMountFlightStart"},
2611 {566, L
"MountSwimStart"},
2612 {567, L
"FlyMountSwimStart"},
2613 {568, L
"MountSwimLand"},
2614 {569, L
"FlyMountSwimLand"},
2615 {570, L
"MountSwimLandRun"},
2616 {571, L
"FlyMountSwimLandRun"},
2617 {572, L
"MountFlightLand"},
2618 {573, L
"FlyMountFlightLand"},
2619 {574, L
"MountFlightLandRun"},
2620 {575, L
"FlyMountFlightLandRun"},
2621 {576, L
"ReadyBlowDart"},
2622 {577, L
"FlyReadyBlowDart"},
2623 {578, L
"LoadBlowDart"},
2624 {579, L
"FlyLoadBlowDart"},
2625 {580, L
"HoldBlowDart"},
2626 {581, L
"FlyHoldBlowDart"},
2627 {582, L
"AttackBlowDart"},
2628 {583, L
"FlyAttackBlowDart"},
2629 {584, L
"CarriageMount"},
2630 {585, L
"FlyCarriageMount"},
2631 {586, L
"CarriagePassengerMount"},
2632 {587, L
"FlyCarriagePassengerMount"},
2633 {588, L
"CarriageMountAttack"},
2634 {589, L
"FlyCarriageMountAttack"},
2635 {590, L
"BarTendStand"},
2636 {591, L
"FlyBarTendStand"},
2637 {592, L
"BarServerWalk"},
2638 {593, L
"FlyBarServerWalk"},
2639 {594, L
"BarServerRun"},
2640 {595, L
"FlyBarServerRun"},
2641 {596, L
"BarServerShuffleLeft"},
2642 {597, L
"FlyBarServerShuffleLeft"},
2643 {598, L
"BarServerShuffleRight"},
2644 {599, L
"FlyBarServerShuffleRight"},
2645 {600, L
"BarTendEmoteTalk"},
2646 {601, L
"FlyBarTendEmoteTalk"},
2647 {602, L
"BarTendEmotePoint"},
2648 {603, L
"FlyBarTendEmotePoint"},
2649 {604, L
"BarServerStand"},
2650 {605, L
"FlyBarServerStand"},
2651 {606, L
"BarSweepWalk"},
2652 {607, L
"FlyBarSweepWalk"},
2653 {608, L
"BarSweepRun"},
2654 {609, L
"FlyBarSweepRun"},
2655 {610, L
"BarSweepShuffleLeft"},
2656 {611, L
"FlyBarSweepShuffleLeft"},
2657 {612, L
"BarSweepShuffleRight"},
2658 {613, L
"FlyBarSweepShuffleRight"},
2659 {614, L
"BarSweepEmoteTalk"},
2660 {615, L
"FlyBarSweepEmoteTalk"},
2661 {616, L
"BarPatronSitEmotePoint"},
2662 {617, L
"FlyBarPatronSitEmotePoint"},
2663 {618, L
"MountSelfIdle"},
2664 {619, L
"FlyMountSelfIdle"},
2665 {620, L
"MountSelfWalk"},
2666 {621, L
"FlyMountSelfWalk"},
2667 {622, L
"MountSelfRun"},
2668 {623, L
"FlyMountSelfRun"},
2669 {624, L
"MountSelfSprint"},
2670 {625, L
"FlyMountSelfSprint"},
2671 {626, L
"MountSelfRunLeft"},
2672 {627, L
"FlyMountSelfRunLeft"},
2673 {628, L
"MountSelfRunRight"},
2674 {629, L
"FlyMountSelfRunRight"},
2675 {630, L
"MountSelfShuffleLeft"},
2676 {631, L
"FlyMountSelfShuffleLeft"},
2677 {632, L
"MountSelfShuffleRight"},
2678 {633, L
"FlyMountSelfShuffleRight"},
2679 {634, L
"MountSelfWalkBackwards"},
2680 {635, L
"FlyMountSelfWalkBackwards"},
2681 {636, L
"MountSelfSpecial"},
2682 {637, L
"FlyMountSelfSpecial"},
2683 {638, L
"MountSelfJump"},
2684 {639, L
"FlyMountSelfJump"},
2685 {640, L
"MountSelfJumpStart"},
2686 {641, L
"FlyMountSelfJumpStart"},
2687 {642, L
"MountSelfJumpEnd"},
2688 {643, L
"FlyMountSelfJumpEnd"},
2689 {644, L
"MountSelfJumpLandRun"},
2690 {645, L
"FlyMountSelfJumpLandRun"},
2691 {646, L
"MountSelfStart"},
2692 {647, L
"FlyMountSelfStart"},
2693 {648, L
"MountSelfFall"},
2694 {649, L
"FlyMountSelfFall"},
2695 {650, L
"Stormstrike"},
2696 {651, L
"FlyStormstrike"},
2697 {652, L
"ReadyJoustNoSheathe"},
2698 {653, L
"FlyReadyJoustNoSheathe"},
2701 {656, L
"DeathStrike"},
2702 {657, L
"FlyDeathStrike"},
2703 {658, L
"SwimAttackUnarmed"},
2704 {659, L
"FlySwimAttackUnarmed"},
2705 {660, L
"SpinningKick"},
2706 {661, L
"FlySpinningKick"},
2707 {662, L
"RoundHouseKick"},
2708 {663, L
"FlyRoundHouseKick"},
2709 {664, L
"RollStart"},
2710 {665, L
"FlyRollStart"},
2714 {669, L
"FlyRollEnd"},
2715 {670, L
"PalmStrike"},
2716 {671, L
"FlyPalmStrike"},
2717 {672, L
"MonkOffenseAttackUnarmed"},
2718 {673, L
"FlyMonkOffenseAttackUnarmed"},
2719 {674, L
"MonkOffenseAttackUnarmedOff"},
2720 {675, L
"FlyMonkOffenseAttackUnarmedOff"},
2721 {676, L
"MonkOffenseParryUnarmed"},
2722 {677, L
"FlyMonkOffenseParryUnarmed"},
2723 {678, L
"MonkOffenseReadyUnarmed"},
2724 {679, L
"FlyMonkOffenseReadyUnarmed"},
2725 {680, L
"MonkOffenseSpecialUnarmed"},
2726 {681, L
"FlyMonkOffenseSpecialUnarmed"},
2727 {682, L
"MonkDefenseAttackUnarmed"},
2728 {683, L
"FlyMonkDefenseAttackUnarmed"},
2729 {684, L
"MonkDefenseAttackUnarmedOff"},
2730 {685, L
"FlyMonkDefenseAttackUnarmedOff"},
2731 {686, L
"MonkDefenseParryUnarmed"},
2732 {687, L
"FlyMonkDefenseParryUnarmed"},
2733 {688, L
"MonkDefenseReadyUnarmed"},
2734 {689, L
"FlyMonkDefenseReadyUnarmed"},
2735 {690, L
"MonkDefenseSpecialUnarmed"},
2736 {691, L
"FlyMonkDefenseSpecialUnarmed"},
2737 {692, L
"MonkHealAttackUnarmed"},
2738 {693, L
"FlyMonkHealAttackUnarmed"},
2739 {694, L
"MonkHealAttackUnarmedOff"},
2740 {695, L
"FlyMonkHealAttackUnarmedOff"},
2741 {696, L
"MonkHealParryUnarmed"},
2742 {697, L
"FlyMonkHealParryUnarmed"},
2743 {698, L
"MonkHealReadyUnarmed"},
2744 {699, L
"FlyMonkHealReadyUnarmed"},
2745 {700, L
"MonkHealSpecialUnarmed"},
2746 {701, L
"FlyMonkHealSpecialUnarmed"},
2747 {702, L
"FlyingKick"},
2748 {703, L
"FlyFlyingKick"},
2749 {704, L
"FlyingKickStart"},
2750 {705, L
"FlyFlyingKickStart"},
2751 {706, L
"FlyingKickEnd"},
2752 {707, L
"FlyFlyingKickEnd"},
2753 {708, L
"CraneStart"},
2754 {709, L
"FlyCraneStart"},
2755 {710, L
"CraneLoop"},
2756 {711, L
"FlyCraneLoop"},
2758 {713, L
"FlyCraneEnd"},
2759 {714, L
"Despawned"},
2760 {715, L
"FlyDespawned"},
2761 {716, L
"ThousandFists"},
2762 {717, L
"FlyThousandFists"},
2763 {718, L
"MonkHealReadySpellDirected"},
2764 {719, L
"FlyMonkHealReadySpellDirected"},
2765 {720, L
"MonkHealReadySpellOmni"},
2766 {721, L
"FlyMonkHealReadySpellOmni"},
2767 {722, L
"MonkHealSpellCastDirected"},
2768 {723, L
"FlyMonkHealSpellCastDirected"},
2769 {724, L
"MonkHealSpellCastOmni"},
2770 {725, L
"FlyMonkHealSpellCastOmni"},
2771 {726, L
"MonkHealChannelCastDirected"},
2772 {727, L
"FlyMonkHealChannelCastDirected"},
2773 {728, L
"MonkHealChannelCastOmni"},
2774 {729, L
"FlyMonkHealChannelCastOmni"},
2776 {731, L
"FlyTorpedo"},
2778 {733, L
"FlyMeditate"},
2779 {734, L
"BreathOfFire"},
2780 {735, L
"FlyBreathOfFire"},
2781 {736, L
"RisingSunKick"},
2782 {737, L
"FlyRisingSunKick"},
2783 {738, L
"GroundKick"},
2784 {739, L
"FlyGroundKick"},
2786 {741, L
"FlyKickBack"},
2787 {742, L
"PetBattleStand"},
2788 {743, L
"FlyPetBattleStand"},
2789 {744, L
"PetBattleDeath"},
2790 {745, L
"FlyPetBattleDeath"},
2791 {746, L
"PetBattleRun"},
2792 {747, L
"FlyPetBattleRun"},
2793 {748, L
"PetBattleWound"},
2794 {749, L
"FlyPetBattleWound"},
2795 {750, L
"PetBattleAttack"},
2796 {751, L
"FlyPetBattleAttack"},
2797 {752, L
"PetBattleReadySpell"},
2798 {753, L
"FlyPetBattleReadySpell"},
2799 {754, L
"PetBattleSpellCast"},
2800 {755, L
"FlyPetBattleSpellCast"},
2801 {756, L
"PetBattleCustom0"},
2802 {757, L
"FlyPetBattleCustom0"},
2803 {758, L
"PetBattleCustom1"},
2804 {759, L
"FlyPetBattleCustom1"},
2805 {760, L
"PetBattleCustom2"},
2806 {761, L
"FlyPetBattleCustom2"},
2807 {762, L
"PetBattleCustom3"},
2808 {763, L
"FlyPetBattleCustom3"},
2809 {764, L
"PetBattleVictory"},
2810 {765, L
"FlyPetBattleVictory"},
2811 {766, L
"PetBattleLoss"},
2812 {767, L
"FlyPetBattleLoss"},
2813 {768, L
"PetBattleStun"},
2814 {769, L
"FlyPetBattleStun"},
2815 {770, L
"PetBattleDead"},
2816 {771, L
"FlyPetBattleDead"},
2817 {772, L
"PetBattleFreeze"},
2818 {773, L
"FlyPetBattleFreeze"},
2819 {774, L
"MonkOffenseAttackWeapon"},
2820 {775, L
"FlyMonkOffenseAttackWeapon"},
2821 {776, L
"BarTendEmoteWave"},
2822 {777, L
"FlyBarTendEmoteWave"},
2823 {778, L
"BarServerEmoteTalk"},
2824 {779, L
"FlyBarServerEmoteTalk"},
2825 {780, L
"BarServerEmoteWave"},
2826 {781, L
"FlyBarServerEmoteWave"},
2827 {782, L
"BarServerPourDrinks"},
2828 {783, L
"FlyBarServerPourDrinks"},
2829 {784, L
"BarServerPickup"},
2830 {785, L
"FlyBarServerPickup"},
2831 {786, L
"BarServerPutDown"},
2832 {787, L
"FlyBarServerPutDown"},
2833 {788, L
"BarSweepStand"},
2834 {789, L
"FlyBarSweepStand"},
2835 {790, L
"BarPatronSit"},
2836 {791, L
"FlyBarPatronSit"},
2837 {792, L
"BarPatronSitEmoteTalk"},
2838 {793, L
"FlyBarPatronSitEmoteTalk"},
2839 {794, L
"BarPatronStand"},
2840 {795, L
"FlyBarPatronStand"},
2841 {796, L
"BarPatronStandEmoteTalk"},
2842 {797, L
"FlyBarPatronStandEmoteTalk"},
2843 {798, L
"BarPatronStandEmotePoint"},
2844 {799, L
"FlyBarPatronStandEmotePoint"},
2845 {800, L
"CarrionSwarm"},
2846 {801, L
"FlyCarrionSwarm"},
2847 {802, L
"WheelLoop"},
2848 {803, L
"FlyWheelLoop"},
2849 {804, L
"StandCharacterCreate"},
2850 {805, L
"FlyStandCharacterCreate"},
2851 {806, L
"MountChopper"},
2852 {807, L
"FlyMountChopper"},
2854 {809, L
"FlyFacePose"},
2855 {810, L
"CombatAbility2HBig01"},
2856 {811, L
"FlyCombatAbility2HBig01"},
2857 {812, L
"CombatAbility2H01"},
2858 {813, L
"FlyCombatAbility2H01"},
2859 {814, L
"CombatWhirlwind"},
2860 {815, L
"FlyCombatWhirlwind"},
2861 {816, L
"CombatChargeLoop"},
2862 {817, L
"FlyCombatChargeLoop"},
2863 {818, L
"CombatAbility1H01"},
2864 {819, L
"FlyCombatAbility1H01"},
2865 {820, L
"CombatChargeEnd"},
2866 {821, L
"FlyCombatChargeEnd"},
2867 {822, L
"CombatAbility1H02"},
2868 {823, L
"FlyCombatAbility1H02"},
2869 {824, L
"CombatAbility1HBig01"},
2870 {825, L
"FlyCombatAbility1HBig01"},
2871 {826, L
"CombatAbility2H02"},
2872 {827, L
"FlyCombatAbility2H02"},
2873 {828, L
"ShaSpellPrecastBoth"},
2874 {829, L
"FlyShaSpellPrecastBoth"},
2875 {830, L
"ShaSpellCastBothFront"},
2876 {831, L
"FlyShaSpellCastBothFront"},
2877 {832, L
"ShaSpellCastLeftFront"},
2878 {833, L
"FlyShaSpellCastLeftFront"},
2879 {834, L
"ShaSpellCastRightFront"},
2880 {835, L
"FlyShaSpellCastRightFront"},
2881 {836, L
"ReadyCrossbow"},
2882 {837, L
"FlyReadyCrossbow"},
2883 {838, L
"LoadCrossbow"},
2884 {839, L
"FlyLoadCrossbow"},
2885 {840, L
"AttackCrossbow"},
2886 {841, L
"FlyAttackCrossbow"},
2887 {842, L
"HoldCrossbow"},
2888 {843, L
"FlyHoldCrossbow"},
2889 {844, L
"CombatAbility2HL01"},
2890 {845, L
"FlyCombatAbility2HL01"},
2891 {846, L
"CombatAbility2HL02"},
2892 {847, L
"FlyCombatAbility2HL02"},
2893 {848, L
"CombatAbility2HLBig01"},
2894 {849, L
"FlyCombatAbility2HLBig01"},
2895 {850, L
"CombatUnarmed01"},
2896 {851, L
"FlyCombatUnarmed01"},
2897 {852, L
"CombatStompLeft"},
2898 {853, L
"FlyCombatStompLeft"},
2899 {854, L
"CombatStompRight"},
2900 {855, L
"FlyCombatStompRight"},
2901 {856, L
"CombatLeapLoop"},
2902 {857, L
"FlyCombatLeapLoop"},
2903 {858, L
"CombatLeapEnd"},
2904 {859, L
"FlyCombatLeapEnd"},
2905 {860, L
"ShaReadySpellCast"},
2906 {861, L
"FlyShaReadySpellCast"},
2907 {862, L
"ShaSpellPrecastBothChannel"},
2908 {863, L
"FlyShaSpellPrecastBothChannel"},
2909 {864, L
"ShaSpellCastBothUp"},
2910 {865, L
"FlyShaSpellCastBothUp"},
2911 {866, L
"ShaSpellCastBothUpChannel"},
2912 {867, L
"FlyShaSpellCastBothUpChannel"},
2913 {868, L
"ShaSpellCastBothFrontChannel"},
2914 {869, L
"FlyShaSpellCastBothFrontChannel"},
2915 {870, L
"ShaSpellCastLeftFrontChannel"},
2916 {871, L
"FlyShaSpellCastLeftFrontChannel"},
2917 {872, L
"ShaSpellCastRightFrontChannel"},
2918 {873, L
"FlyShaSpellCastRightFrontChannel"},
2919 {874, L
"PriReadySpellCast"},
2920 {875, L
"FlyPriReadySpellCast"},
2921 {876, L
"PriSpellPrecastBoth"},
2922 {877, L
"FlyPriSpellPrecastBoth"},
2923 {878, L
"PriSpellPrecastBothChannel"},
2924 {879, L
"FlyPriSpellPrecastBothChannel"},
2925 {880, L
"PriSpellCastBothUp"},
2926 {881, L
"FlyPriSpellCastBothUp"},
2927 {882, L
"PriSpellCastBothFront"},
2928 {883, L
"FlyPriSpellCastBothFront"},
2929 {884, L
"PriSpellCastLeftFront"},
2930 {885, L
"FlyPriSpellCastLeftFront"},
2931 {886, L
"PriSpellCastRightFront"},
2932 {887, L
"FlyPriSpellCastRightFront"},
2933 {888, L
"PriSpellCastBothUpChannel"},
2934 {889, L
"FlyPriSpellCastBothUpChannel"},
2935 {890, L
"PriSpellCastBothFrontChannel"},
2936 {891, L
"FlyPriSpellCastBothFrontChannel"},
2937 {892, L
"PriSpellCastLeftFrontChannel"},
2938 {893, L
"FlyPriSpellCastLeftFrontChannel"},
2939 {894, L
"PriSpellCastRightFrontChannel"},
2940 {895, L
"FlyPriSpellCastRightFrontChannel"},
2941 {896, L
"MagReadySpellCast"},
2942 {897, L
"FlyMagReadySpellCast"},
2943 {898, L
"MagSpellPrecastBoth"},
2944 {899, L
"FlyMagSpellPrecastBoth"},
2945 {900, L
"MagSpellPrecastBothChannel"},
2946 {901, L
"FlyMagSpellPrecastBothChannel"},
2947 {902, L
"MagSpellCastBothUp"},
2948 {903, L
"FlyMagSpellCastBothUp"},
2949 {904, L
"MagSpellCastBothFront"},
2950 {905, L
"FlyMagSpellCastBothFront"},
2951 {906, L
"MagSpellCastLeftFront"},
2952 {907, L
"FlyMagSpellCastLeftFront"},
2953 {908, L
"MagSpellCastRightFront"},
2954 {909, L
"FlyMagSpellCastRightFront"},
2955 {910, L
"MagSpellCastBothUpChannel"},
2956 {911, L
"FlyMagSpellCastBothUpChannel"},
2957 {912, L
"MagSpellCastBothFrontChannel"},
2958 {913, L
"FlyMagSpellCastBothFrontChannel"},
2959 {914, L
"MagSpellCastLeftFrontChannel"},
2960 {915, L
"FlyMagSpellCastLeftFrontChannel"},
2961 {916, L
"MagSpellCastRightFrontChannel"},
2962 {917, L
"FlyMagSpellCastRightFrontChannel"},
2963 {918, L
"LocReadySpellCast"},
2964 {919, L
"FlyLocReadySpellCast"},
2965 {920, L
"LocSpellPrecastBoth"},
2966 {921, L
"FlyLocSpellPrecastBoth"},
2967 {922, L
"LocSpellPrecastBothChannel"},
2968 {923, L
"FlyLocSpellPrecastBothChannel"},
2969 {924, L
"LocSpellCastBothUp"},
2970 {925, L
"FlyLocSpellCastBothUp"},
2971 {926, L
"LocSpellCastBothFront"},
2972 {927, L
"FlyLocSpellCastBothFront"},
2973 {928, L
"LocSpellCastLeftFront"},
2974 {929, L
"FlyLocSpellCastLeftFront"},
2975 {930, L
"LocSpellCastRightFront"},
2976 {931, L
"FlyLocSpellCastRightFront"},
2977 {932, L
"LocSpellCastBothUpChannel"},
2978 {933, L
"FlyLocSpellCastBothUpChannel"},
2979 {934, L
"LocSpellCastBothFrontChannel"},
2980 {935, L
"FlyLocSpellCastBothFrontChannel"},
2981 {936, L
"LocSpellCastLeftFrontChannel"},
2982 {937, L
"FlyLocSpellCastLeftFrontChannel"},
2983 {938, L
"LocSpellCastRightFrontChannel"},
2984 {939, L
"FlyLocSpellCastRightFrontChannel"},
2985 {940, L
"DruReadySpellCast"},
2986 {941, L
"FlyDruReadySpellCast"},
2987 {942, L
"DruSpellPrecastBoth"},
2988 {943, L
"FlyDruSpellPrecastBoth"},
2989 {944, L
"DruSpellPrecastBothChannel"},
2990 {945, L
"FlyDruSpellPrecastBothChannel"},
2991 {946, L
"DruSpellCastBothUp"},
2992 {947, L
"FlyDruSpellCastBothUp"},
2993 {948, L
"DruSpellCastBothFront"},
2994 {949, L
"FlyDruSpellCastBothFront"},
2995 {950, L
"DruSpellCastLeftFront"},
2996 {951, L
"FlyDruSpellCastLeftFront"},
2997 {952, L
"DruSpellCastRightFront"},
2998 {953, L
"FlyDruSpellCastRightFront"},
2999 {954, L
"DruSpellCastBothUpChannel"},
3000 {955, L
"FlyDruSpellCastBothUpChannel"},
3001 {956, L
"DruSpellCastBothFrontChannel"},
3002 {957, L
"FlyDruSpellCastBothFrontChannel"},
3003 {958, L
"DruSpellCastLeftFrontChannel"},
3004 {959, L
"FlyDruSpellCastLeftFrontChannel"},
3005 {960, L
"DruSpellCastRightFrontChannel"},
3006 {961, L
"FlyDruSpellCastRightFrontChannel"},
3007 {962, L
"ArtMainLoop"},
3008 {963, L
"FlyArtMainLoop"},
3009 {964, L
"ArtDualLoop"},
3010 {965, L
"FlyArtDualLoop"},
3011 {966, L
"ArtFistsLoop"},
3012 {967, L
"FlyArtFistsLoop"},
3013 {968, L
"ArtBowLoop"},
3014 {969, L
"FlyArtBowLoop"},
3015 {970, L
"CombatAbility1H01Off"},
3016 {971, L
"FlyCombatAbility1H01Off"},
3017 {972, L
"CombatAbility1H02Off"},
3018 {973, L
"FlyCombatAbility1H02Off"},
3019 {974, L
"CombatFuriousStrike01"},
3020 {975, L
"FlyCombatFuriousStrike01"},
3021 {976, L
"CombatFuriousStrike02"},
3022 {977, L
"FlyCombatFuriousStrike02"},
3023 {978, L
"CombatFuriousStrikes"},
3024 {979, L
"FlyCombatFuriousStrikes"},
3025 {980, L
"CombatReadySpellCast"},
3026 {981, L
"FlyCombatReadySpellCast"},
3027 {982, L
"CombatShieldThrow"},
3028 {983, L
"FlyCombatShieldThrow"},
3029 {984, L
"PalSpellCast1HUp"},
3030 {985, L
"FlyPalSpellCast1HUp"},
3031 {986, L
"CombatReadyPostSpellCast"},
3032 {987, L
"FlyCombatReadyPostSpellCast"},
3033 {988, L
"PriReadyPostSpellCast"},
3034 {989, L
"FlyPriReadyPostSpellCast"},
3035 {990, L
"DHCombatRun"},
3036 {991, L
"FlyDHCombatRun"},
3037 {992, L
"CombatShieldBash"},
3038 {993, L
"FlyCombatShieldBash"},
3039 {994, L
"CombatThrow"},
3040 {995, L
"FlyCombatThrow"},
3041 {996, L
"CombatAbility1HPierce"},
3042 {997, L
"FlyCombatAbility1HPierce"},
3043 {998, L
"CombatAbility1HOffPierce"},
3044 {999, L
"FlyCombatAbility1HOffPierce"},
3045 {1000, L
"CombatMutilate"},
3046 {1001, L
"FlyCombatMutilate"},
3047 {1002, L
"CombatBladeStorm"},
3048 {1003, L
"FlyCombatBladeStorm"},
3049 {1004, L
"CombatFinishingMove"},
3050 {1005, L
"FlyCombatFinishingMove"},
3051 {1006, L
"CombatLeapStart"},
3052 {1007, L
"FlyCombatLeapStart"},
3053 {1008, L
"GlvThrowMain"},
3054 {1009, L
"FlyGlvThrowMain"},
3055 {1010, L
"GlvThrownOff"},
3056 {1011, L
"FlyGlvThrownOff"},
3057 {1012, L
"DHCombatSprint"},
3058 {1013, L
"FlyDHCombatSprint"},
3059 {1014, L
"CombatAbilityGlv01"},
3060 {1015, L
"FlyCombatAbilityGlv01"},
3061 {1016, L
"CombatAbilityGlv02"},
3062 {1017, L
"FlyCombatAbilityGlv02"},
3063 {1018, L
"CombatAbilityGlvOff01"},
3064 {1019, L
"FlyCombatAbilityGlvOff01"},
3065 {1020, L
"CombatAbilityGlvOff02"},
3066 {1021, L
"FlyCombatAbilityGlvOff02"},
3067 {1022, L
"CombatAbilityGlvBig01"},
3068 {1023, L
"FlyCombatAbilityGlvBig01"},
3069 {1024, L
"CombatAbilityGlvBig02"},
3070 {1025, L
"FlyCombatAbilityGlvBig02"},
3071 {1026, L
"ReadyGlv"},
3072 {1027, L
"FlyReadyGlv"},
3073 {1028, L
"CombatAbilityGlvBig03"},
3074 {1029, L
"FlyCombatAbilityGlvBig03"},
3075 {1030, L
"DoubleJumpStart"},
3076 {1031, L
"FlyDoubleJumpStart"},
3077 {1032, L
"DoubleJump"},
3078 {1033, L
"FlyDoubleJump"},
3079 {1034, L
"CombatEviscerate"},
3080 {1035, L
"FlyCombatEviscerate"},
3081 {1036, L
"DoubleJumpLandRun"},
3082 {1037, L
"FlyDoubleJumpLandRun"},
3083 {1038, L
"BackFlipStart"},
3084 {1039, L
"FlyBackFlipStart"},
3085 {1040, L
"BackFlipLoop"},
3086 {1041, L
"FlyBackFlipLoop"},
3087 {1042, L
"FelRushLoop"},
3088 {1043, L
"FlyFelRushLoop"},
3089 {1044, L
"FelRushEnd"},
3090 {1045, L
"FlyFelRushEnd"},
3091 {1046, L
"DHToAlteredStart"},
3092 {1047, L
"FlyDHToAlteredStart"},
3093 {1048, L
"DHToAlteredEnd"},
3094 {1049, L
"FlyDHToAlteredEnd"},
3096 {1051, L
"FlyDHGlide"},
3097 {1052, L
"FanOfKnives"},
3098 {1053, L
"FlyFanOfKnives"},
3099 {1054, L
"SingleJumpStart"},
3100 {1055, L
"FlySingleJumpStart"},
3101 {1056, L
"DHBladeDance1"},
3102 {1057, L
"FlyDHBladeDance1"},
3103 {1058, L
"DHBladeDance2"},
3104 {1059, L
"FlyDHBladeDance2"},
3105 {1060, L
"DHBladeDance3"},
3106 {1061, L
"FlyDHBladeDance3"},
3107 {1062, L
"DHMeteorStrike"},
3108 {1063, L
"FlyDHMeteorStrike"},
3109 {1064, L
"CombatExecute"},
3110 {1065, L
"FlyCombatExecute"},
3112 {1067, L
"FlyArtLoop"},
3113 {1068, L
"ParryGlv"},
3114 {1069, L
"FlyParryGlv"},
3115 {1070, L
"CombatUnarmed02"},
3116 {1071, L
"FlyCombatUnarmed02"},
3117 {1072, L
"CombatPistolShot"},
3118 {1073, L
"FlyCombatPistolShot"},
3119 {1074, L
"CombatPistolShotOff"},
3120 {1075, L
"FlyCombatPistolShotOff"},
3121 {1076, L
"Monk2HLIdle"},
3122 {1077, L
"FlyMonk2HLIdle"},
3123 {1078, L
"ArtShieldLoop"},
3124 {1079, L
"FlyArtShieldLoop"},
3125 {1080, L
"CombatAbility2H03"},
3126 {1081, L
"FlyCombatAbility2H03"},
3127 {1082, L
"CombatStomp"},
3128 {1083, L
"FlyCombatStomp"},
3129 {1084, L
"CombatRoar"},
3130 {1085, L
"FlyCombatRoar"},
3131 {1086, L
"PalReadySpellCast"},
3132 {1087, L
"FlyPalReadySpellCast"},
3133 {1088, L
"PalSpellPrecastRight"},
3134 {1089, L
"FlyPalSpellPrecastRight"},
3135 {1090, L
"PalSpellPrecastRightChannel"},
3136 {1091, L
"FlyPalSpellPrecastRightChannel"},
3137 {1092, L
"PalSpellCastRightFront"},
3138 {1093, L
"FlyPalSpellCastRightFront"},
3139 {1094, L
"ShaSpellCastBothOut"},
3140 {1095, L
"FlyShaSpellCastBothOut"},
3141 {1096, L
"AttackWeapon"},
3142 {1097, L
"FlyAttackWeapon"},
3143 {1098, L
"ReadyWeapon"},
3144 {1099, L
"FlyReadyWeapon"},
3145 {1100, L
"AttackWeaponOff"},
3146 {1101, L
"FlyAttackWeaponOff"},
3147 {1102, L
"SpecialDual"},
3148 {1103, L
"FlySpecialDual"},
3149 {1104, L
"DkCast1HFront"},
3150 {1105, L
"FlyDkCast1HFront"},
3151 {1106, L
"CastStrongRight"},
3152 {1107, L
"FlyCastStrongRight"},
3153 {1108, L
"CastStrongLeft"},
3154 {1109, L
"FlyCastStrongLeft"},
3155 {1110, L
"CastCurseRight"},
3156 {1111, L
"FlyCastCurseRight"},
3157 {1112, L
"CastCurseLeft"},
3158 {1113, L
"FlyCastCurseLeft"},
3159 {1114, L
"CastSweepRight"},
3160 {1115, L
"FlyCastSweepRight"},
3161 {1116, L
"CastSweepLeft"},
3162 {1117, L
"FlyCastSweepLeft"},
3163 {1118, L
"CastStrongUpLeft"},
3164 {1119, L
"FlyCastStrongUpLeft"},
3165 {1120, L
"CastTwistUpBoth"},
3166 {1121, L
"FlyCastTwistUpBoth"},
3167 {1122, L
"CastOutStrong"},
3168 {1123, L
"FlyCastOutStrong"},
3169 {1124, L
"DrumLoop"},
3170 {1125, L
"FlyDrumLoop"},
3171 {1126, L
"ParryWeapon"},
3172 {1127, L
"FlyParryWeapon"},
3174 {1129, L
"FlyReadyFL"},
3175 {1130, L
"AttackFL"},
3176 {1131, L
"FlyAttackFL"},
3177 {1132, L
"AttackFLOff"},
3178 {1133, L
"FlyAttackFLOff"},
3180 {1135, L
"FlyParryFL"},
3181 {1136, L
"SpecialFL"},
3182 {1137, L
"FlySpecialFL"},
3183 {1138, L
"PriHoverForward"},
3184 {1139, L
"FlyPriHoverForward"},
3185 {1140, L
"PriHoverBackward"},
3186 {1141, L
"FlyPriHoverBackward"},
3187 {1142, L
"PriHoverRight"},
3188 {1143, L
"FlyPriHoverRight"},
3189 {1144, L
"PriHoverLeft"},
3190 {1145, L
"FlyPriHoverLeft"},
3191 {1146, L
"RunBackwards"},
3192 {1147, L
"FlyRunBackwards"},
3193 {1148, L
"CastStrongUpRight"},
3194 {1149, L
"FlyCastStrongUpRight"},
3196 {1151, L
"FlyWAWalk"},
3198 {1153, L
"FlyWARun"},
3199 {1154, L
"WADrunkStand"},
3200 {1155, L
"FlyWADrunkStand"},
3201 {1156, L
"WADrunkShuffleLeft"},
3202 {1157, L
"FlyWADrunkShuffleLeft"},
3203 {1158, L
"WADrunkShuffleRight"},
3204 {1159, L
"FlyWADrunkShuffleRight"},
3205 {1160, L
"WADrunkWalk"},
3206 {1161, L
"FlyWADrunkWalk"},
3207 {1162, L
"WADrunkWalkBackwards"},
3208 {1163, L
"FlyWADrunkWalkBackwards"},
3209 {1164, L
"WADrunkWound"},
3210 {1165, L
"FlyWADrunkWound"},
3211 {1166, L
"WADrunkTalk"},
3212 {1167, L
"FlyWADrunkTalk"},
3213 {1168, L
"WATrance01"},
3214 {1169, L
"FlyWATrance01"},
3215 {1170, L
"WATrance02"},
3216 {1171, L
"FlyWATrance02"},
3217 {1172, L
"WAChant01"},
3218 {1173, L
"FlyWAChant01"},
3219 {1174, L
"WAChant02"},
3220 {1175, L
"FlyWAChant02"},
3221 {1176, L
"WAChant03"},
3222 {1177, L
"FlyWAChant03"},
3223 {1178, L
"WAHang01"},
3224 {1179, L
"FlyWAHang01"},
3225 {1180, L
"WAHang02"},
3226 {1181, L
"FlyWAHang02"},
3227 {1182, L
"WASummon01"},
3228 {1183, L
"FlyWASummon01"},
3229 {1184, L
"WASummon02"},
3230 {1185, L
"FlyWASummon02"},
3231 {1186, L
"WABeggarTalk"},
3232 {1187, L
"FlyWABeggarTalk"},
3233 {1188, L
"WABeggarStand"},
3234 {1189, L
"FlyWABeggarStand"},
3235 {1190, L
"WABeggarPoint"},
3236 {1191, L
"FlyWABeggarPoint"},
3237 {1192, L
"WABeggarBeg"},
3238 {1193, L
"FlyWABeggarBeg"},
3240 {1195, L
"FlyWASit01"},
3242 {1197, L
"FlyWASit02"},
3244 {1199, L
"FlyWASit03"},
3245 {1200, L
"WACrierStand01"},
3246 {1201, L
"FlyWACrierStand01"},
3247 {1202, L
"WACrierStand02"},
3248 {1203, L
"FlyWACrierStand02"},
3249 {1204, L
"WACrierStand03"},
3250 {1205, L
"FlyWACrierStand03"},
3251 {1206, L
"WACrierTalk"},
3252 {1207, L
"FlyWACrierTalk"},
3253 {1208, L
"WACrateHold"},
3254 {1209, L
"FlyWACrateHold"},
3255 {1210, L
"WABarrelHold"},
3256 {1211, L
"FlyWABarrelHold"},
3257 {1212, L
"WASackHold"},
3258 {1213, L
"FlyWASackHold"},
3259 {1214, L
"WAWheelBarrowStand"},
3260 {1215, L
"FlyWAWheelBarrowStand"},
3261 {1216, L
"WAWheelBarrowWalk"},
3262 {1217, L
"FlyWAWheelBarrowWalk"},
3263 {1218, L
"WAWheelBarrowRun"},
3264 {1219, L
"FlyWAWheelBarrowRun"},
3265 {1220, L
"WAHammerLoop"},
3266 {1221, L
"FlyWAHammerLoop"},
3267 {1222, L
"WACrankLoop"},
3268 {1223, L
"FlyWACrankLoop"},
3269 {1224, L
"WAPourStart"},
3270 {1225, L
"FlyWAPourStart"},
3271 {1226, L
"WAPourLoop"},
3272 {1227, L
"FlyWAPourLoop"},
3273 {1228, L
"WAPourEnd"},
3274 {1229, L
"FlyWAPourEnd"},
3275 {1230, L
"WAEmotePour"},
3276 {1231, L
"FlyWAEmotePour"},
3277 {1232, L
"WARowingStandRight"},
3278 {1233, L
"FlyWARowingStandRight"},
3279 {1234, L
"WARowingStandLeft"},
3280 {1235, L
"FlyWARowingStandLeft"},
3281 {1236, L
"WARowingRight"},
3282 {1237, L
"FlyWARowingRight"},
3283 {1238, L
"WARowingLeft"},
3284 {1239, L
"FlyWARowingLeft"},
3285 {1240, L
"WAGuardStand01"},
3286 {1241, L
"FlyWAGuardStand01"},
3287 {1242, L
"WAGuardStand02"},
3288 {1243, L
"FlyWAGuardStand02"},
3289 {1244, L
"WAGuardStand03"},
3290 {1245, L
"FlyWAGuardStand03"},
3291 {1246, L
"WAGuardStand04"},
3292 {1247, L
"FlyWAGuardStand04"},
3293 {1248, L
"WAFreezing01"},
3294 {1249, L
"FlyWAFreezing01"},
3295 {1250, L
"WAFreezing02"},
3296 {1251, L
"FlyWAFreezing02"},
3297 {1252, L
"WAVendorStand01"},
3298 {1253, L
"FlyWAVendorStand01"},
3299 {1254, L
"WAVendorStand02"},
3300 {1255, L
"FlyWAVendorStand02"},
3301 {1256, L
"WAVendorStand03"},
3302 {1257, L
"FlyWAVendorStand03"},
3303 {1258, L
"WAVendorTalk"},
3304 {1259, L
"FlyWAVendorTalk"},
3305 {1260, L
"WALean01"},
3306 {1261, L
"FlyWALean01"},
3307 {1262, L
"WALean02"},
3308 {1263, L
"FlyWALean02"},
3309 {1264, L
"WALean03"},
3310 {1265, L
"FlyWALean03"},
3311 {1266, L
"WALeanTalk"},
3312 {1267, L
"FlyWALeanTalk"},
3313 {1268, L
"WABoatWheel"},
3314 {1269, L
"FlyWABoatWheel"},
3315 {1270, L
"WASmithLoop"},
3316 {1271, L
"FlyWASmithLoop"},
3317 {1272, L
"WAScrubbing"},
3318 {1273, L
"FlyWAScrubbing"},
3319 {1274, L
"WAWeaponSharpen"},
3320 {1275, L
"FlyWAWeaponSharpen"},
3321 {1276, L
"WAStirring"},
3322 {1277, L
"FlyWAStirring"},
3323 {1278, L
"WAPerch01"},
3324 {1279, L
"FlyWAPerch01"},
3325 {1280, L
"WAPerch02"},
3326 {1281, L
"FlyWAPerch02"},
3327 {1282, L
"HoldWeapon"},
3328 {1283, L
"FlyHoldWeapon"},
3329 {1284, L
"WABarrelWalk"},
3330 {1285, L
"FlyWABarrelWalk"},
3331 {1286, L
"WAPourHold"},
3332 {1287, L
"FlyWAPourHold"},
3333 {1288, L
"CastStrong"},
3334 {1289, L
"FlyCastStrong"},
3335 {1290, L
"CastCurse"},
3336 {1291, L
"FlyCastCurse"},
3337 {1292, L
"CastSweep"},
3338 {1293, L
"FlyCastSweep"},
3339 {1294, L
"CastStrongUp"},
3340 {1295, L
"FlyCastStrongUp"},
3341 {1296, L
"WABoatWheelStand"},
3342 {1297, L
"FlyWABoatWheelStand"},
3343 {1298, L
"WASmithStand"},
3344 {1299, L
"FlyWASmithStand"},
3345 {1300, L
"WACrankStand"},
3346 {1301, L
"FlyWACrankStand"},
3347 {1302, L
"WAPourWalk"},
3348 {1303, L
"FlyWAPourWalk"},
3349 {1304, L
"FalconeerStart"},
3350 {1305, L
"FlyFalconeerStart"},
3351 {1306, L
"FalconeerLoop"},
3352 {1307, L
"FlyFalconeerLoop"},
3353 {1308, L
"FalconeerEnd"},
3354 {1309, L
"FlyFalconeerEnd"},
3355 {1310, L
"WADrunkDrink"},
3356 {1311, L
"FlyWADrunkDrink"},
3357 {1312, L
"WAStandEat"},
3358 {1313, L
"FlyWAStandEat"},
3359 {1314, L
"WAStandDrink"},
3360 {1315, L
"FlyWAStandDrink"},
3361 {1316, L
"WABound01"},
3362 {1317, L
"FlyWABound01"},
3363 {1318, L
"WABound02"},
3364 {1319, L
"FlyWABound02"},
3365 {1320, L
"CombatAbility1H03Off"},
3366 {1321, L
"FlyCombatAbility1H03Off"},
3367 {1322, L
"CombatAbilityDualWield01"},
3368 {1323, L
"FlyCombatAbilityDualWield01"},
3369 {1324, L
"WACradle01"},
3370 {1325, L
"FlyWACradle01"},
3371 {1326, L
"LocSummon"},
3372 {1327, L
"FlyLocSummon"},
3373 {1328, L
"LoadWeapon"},
3374 {1329, L
"FlyLoadWeapon"},
3375 {1330, L
"ArtOffLoop"},
3376 {1331, L
"FlyArtOffLoop"},
3377 {1332, L
"WADead01"},
3378 {1333, L
"FlyWADead01"},
3379 {1334, L
"WADead02"},
3380 {1335, L
"FlyWADead02"},
3381 {1336, L
"WADead03"},
3382 {1337, L
"FlyWADead03"},
3383 {1338, L
"WADead04"},
3384 {1339, L
"FlyWADead04"},
3385 {1340, L
"WADead05"},
3386 {1341, L
"FlyWADead05"},
3387 {1342, L
"WADead06"},
3388 {1343, L
"FlyWADead06"},
3389 {1344, L
"WADead07"},
3390 {1345, L
"FlyWADead07"},
3391 {1346, L
"GiantRun"},
3392 {1347, L
"FlyGiantRun"},
3393 {1348, L
"BarTendEmoteCheer"},
3394 {1349, L
"FlyBarTendEmoteCheer"},
3395 {1350, L
"BarTendEmoteTalkQuestion"},
3396 {1351, L
"FlyBarTendEmoteTalkQuestion"},
3397 {1352, L
"BarTendEmoteTalkExclamation"},
3398 {1353, L
"FlyBarTendEmoteTalkExclamation"},
3399 {1354, L
"BarTendWalk"},
3400 {1355, L
"FlyBarTendWalk"},
3401 {1356, L
"BartendShuffleLeft"},
3402 {1357, L
"FlyBartendShuffleLeft"},
3403 {1358, L
"BarTendShuffleRight"},
3404 {1359, L
"FlyBarTendShuffleRight"},
3405 {1360, L
"BarTendCustomSpell01"},
3406 {1361, L
"FlyBarTendCustomSpell01"},
3407 {1362, L
"BarTendCustomSpell02"},
3408 {1363, L
"FlyBarTendCustomSpell02"},
3409 {1364, L
"BarTendCustomSpell03"},
3410 {1365, L
"FlyBarTendCustomSpell03"},
3411 {1366, L
"BarServerEmoteCheer"},
3412 {1367, L
"FlyBarServerEmoteCheer"},
3413 {1368, L
"BarServerEmoteTalkQuestion"},
3414 {1369, L
"FlyBarServerEmoteTalkQuestion"},
3415 {1370, L
"BarServerEmoteTalkExclamation"},
3416 {1371, L
"FlyBarServerEmoteTalkExclamation"},
3417 {1372, L
"BarServerCustomSpell01"},
3418 {1373, L
"FlyBarServerCustomSpell01"},
3419 {1374, L
"BarServerCustomSpell02"},
3420 {1375, L
"FlyBarServerCustomSpell02"},
3421 {1376, L
"BarServerCustomSpell03"},
3422 {1377, L
"FlyBarServerCustomSpell03"},
3423 {1378, L
"BarPatronEmoteDrink"},
3424 {1379, L
"FlyBarPatronEmoteDrink"},
3425 {1380, L
"BarPatronEmoteCheer"},
3426 {1381, L
"FlyBarPatronEmoteCheer"},
3427 {1382, L
"BarPatronCustomSpell01"},
3428 {1383, L
"FlyBarPatronCustomSpell01"},
3429 {1384, L
"BarPatronCustomSpell02"},
3430 {1385, L
"FlyBarPatronCustomSpell02"},
3431 {1386, L
"BarPatronCustomSpell03"},
3432 {1387, L
"FlyBarPatronCustomSpell03"},
3433 {1388, L
"HoldDart"},
3434 {1389, L
"FlyHoldDart"},
3435 {1390, L
"ReadyDart"},
3436 {1391, L
"FlyReadyDart"},
3437 {1392, L
"AttackDart"},
3438 {1393, L
"FlyAttackDart"},
3439 {1394, L
"LoadDart"},
3440 {1395, L
"FlyLoadDart"},
3441 {1396, L
"WADartTargetStand"},
3442 {1397, L
"FlyWADartTargetStand"},
3443 {1398, L
"WADartTargetEmoteTalk"},
3444 {1399, L
"FlyWADartTargetEmoteTalk"},
3445 {1400, L
"BarPatronSitEmoteCheer"},
3446 {1401, L
"FlyBarPatronSitEmoteCheer"},
3447 {1402, L
"BarPatronSitCustomSpell01"},
3448 {1403, L
"FlyBarPatronSitCustomSpell01"},
3449 {1404, L
"BarPatronSitCustomSpell02"},
3450 {1405, L
"FlyBarPatronSitCustomSpell02"},
3451 {1406, L
"BarPatronSitCustomSpell03"},
3452 {1407, L
"FlyBarPatronSitCustomSpell03"},
3453 {1408, L
"BarPianoStand"},
3454 {1409, L
"FlyBarPianoStand"},
3455 {1410, L
"BarPianoEmoteTalk"},
3456 {1411, L
"FlyBarPianoEmoteTalk"},
3457 {1412, L
"WAHearthSit"},
3458 {1413, L
"FlyWAHearthSit"},
3459 {1414, L
"WAHearthSitEmoteCry"},
3460 {1415, L
"FlyWAHearthSitEmoteCry"},
3461 {1416, L
"WAHearthSitEmoteCheer"},
3462 {1417, L
"FlyWAHearthSitEmoteCheer"},
3463 {1418, L
"WAHearthSitCustomSpell01"},
3464 {1419, L
"FlyWAHearthSitCustomSpell01"},
3465 {1420, L
"WAHearthSitCustomSpell02"},
3466 {1421, L
"FlyWAHearthSitCustomSpell02"},
3467 {1422, L
"WAHearthSitCustomSpell03"},
3468 {1423, L
"FlyWAHearthSitCustomSpell03"},
3469 {1424, L
"WAHearthStand"},
3470 {1425, L
"FlyWAHearthStand"},
3471 {1426, L
"WAHearthStandEmoteCheer"},
3472 {1427, L
"FlyWAHearthStandEmoteCheer"},
3473 {1428, L
"WAHearthStandEmoteTalk"},
3474 {1429, L
"FlyWAHearthStandEmoteTalk"},
3475 {1430, L
"WAHearthStandCustomSpell01"},
3476 {1431, L
"FlyWAHearthStandCustomSpell01"},
3477 {1432, L
"WAHearthStandCustomSpell02"},
3478 {1433, L
"FlyWAHearthStandCustomSpell02"},
3479 {1434, L
"WAHearthStandCustomSpell03"},
3480 {1435, L
"FlyWAHearthStandCustomSpell03"},
3481 {1436, L
"WAScribeStart"},
3482 {1437, L
"FlyWAScribeStart"},
3483 {1438, L
"WAScribeLoop"},
3484 {1439, L
"FlyWAScribeLoop"},
3485 {1440, L
"WAScribeEnd"},
3486 {1441, L
"FlyWAScribeEnd"},
3487 {1442, L
"WAEmoteScribe"},
3488 {1443, L
"FlyWAEmoteScribe"},
3489 {1444, L
"Haymaker"},
3490 {1445, L
"FlyHaymaker"},
3491 {1446, L
"HaymakerPrecast"},
3492 {1447, L
"FlyHaymakerPrecast"},
3493 {1448, L
"ChannelCastOmniUp"},
3494 {1449, L
"FlyChannelCastOmniUp "},
3495 {1450, L
"DHJumpLandRun "},
3496 {1451, L
"FlyDHJumpLandRun "},
3497 {1452, L
"Cinematic01 "},
3498 {1453, L
"FlyCinematic01 "},
3499 {1454, L
"Cinematic02 "},
3500 {1455, L
"FlyCinematic02 "},
3501 {1456, L
"Cinematic03 "},
3502 {1457, L
"FlyCinematic03 "},
3503 {1458, L
"Cinematic04 "},
3504 {1459, L
"FlyCinematic04 "},
3505 {1460, L
"Cinematic05 "},
3506 {1461, L
"FlyCinematic05 "},
3507 {1462, L
"Cinematic06 "},
3508 {1463, L
"FlyCinematic06 "},
3509 {1464, L
"Cinematic07 "},
3510 {1465, L
"FlyCinematic07 "},
3511 {1466, L
"Cinematic08 "},
3512 {1467, L
"FlyCinematic08 "},
3513 {1468, L
"Cinematic09 "},
3514 {1469, L
"FlyCinematic09 "},
3515 {1470, L
"Cinematic10 "},
3516 {1471, L
"FlyCinematic10"},
3517 {1472, L
"TakeOffStart "},
3518 {1473, L
"FlyTakeOffStart "},
3519 {1474, L
"TakeOffFinish "},
3520 {1475, L
"FlyTakeOffFinish "},
3521 {1476, L
"LandStart "},
3522 {1477, L
"FlyLandStart "},
3523 {1478, L
"LandFinish "},
3524 {1479, L
"FlyLandFinish"},
3525 {1480, L
"WAWalkTalk "},
3526 {1481, L
"FlyWAWalkTalk "},
3527 {1482, L
"WAPerch03 "},
3528 {1483, L
"FlyWAPerch03"},
3529 {1484, L
"CarriageMountMoving "},
3530 {1485, L
"FlyCarriageMountMoving"},
3531 {1486, L
"TakeOffFinishFly "},
3532 {1487, L
"FlyTakeOffFinishFly "},
3533 {1488, L
"CombatAbility2HBig02 "},
3534 {1489, L
"FlyCombatAbility2HBig02 "},
3535 {1490, L
"MountWide "},
3536 {1491, L
"FlyMountWide"},
3537 {1492, L
"EmoteTalkSubdued "},
3538 {1493, L
"FlyEmoteTalkSubdued"},
3539 {1494, L
"WASit04 "},
3540 {1495, L
"FlyWASit04"},
3541 {1496, L
"MountSummon "},
3542 {1497, L
"FlyMountSummon"},
3543 {1498, L
"EmoteSelfie"},
3544 {1499, L
"FlyEmoteSelfie"},
3545 {1500, L
"CustomSpell11"},
3546 {1501, L
"FlyCustomSpell11"},
3547 {1502, L
"CustomSpell12"},
3548 {1503, L
"FlyCustomSpell12"},
3549 {1504, L
"CustomSpell13"},
3550 {1505, L
"FlyCustomSpell13"},
3551 {1506, L
"CustomSpell14"},
3552 {1507, L
"FlyCustomSpell14"},
3553 {1508, L
"CustomSpell15"},
3554 {1509, L
"FlyCustomSpell15"},
3555 {1510, L
"CustomSpell16"},
3556 {1511, L
"FlyCustomSpell16"},
3557 {1512, L
"CustomSpell17"},
3558 {1513, L
"FlyCustomSpell17"},
3559 {1514, L
"CustomSpell18"},
3560 {1515, L
"FlyCustomSpell18"},
3561 {1516, L
"CustomSpell19"},
3562 {1517, L
"FlyCustomSpell19"},
3563 {1518, L
"CustomSpell20"},
3564 {1519, L
"FlyCustomSpell20"},
3565 {1520, L
"AdvFlyLeft"},
3566 {1521, L
"FlyAdvFlyLeft"},
3567 {1522, L
"AdvFlyRight"},
3568 {1523, L
"FlyAdvFlyRight"},
3569 {1524, L
"AdvFlyForward"},
3570 {1525, L
"FlyAdvFlyForward"},
3571 {1526, L
"AdvFlyBackward"},
3572 {1527, L
"FlyAdvFlyBackward"},
3573 {1528, L
"AdvFlyUp"},
3574 {1529, L
"FlyAdvFlyUp"},
3575 {1530, L
"AdvFlyDown"},
3576 {1531, L
"FlyAdvFlyDown"},
3577 {1532, L
"AdvFlyForwardGlide"},
3578 {1533, L
"FlyAdvFlyForwardGlide"},
3579 {1534, L
"AdvFlyRoll"},
3580 {1535, L
"FlyAdvFlyRoll"},
3581 {1536, L
"ProfCookingLoop"},
3582 {1537, L
"FlyProfCookingLoop"},
3583 {1538, L
"ProfCookingStart"},
3584 {1539, L
"FlyProfCookingStart"},
3585 {1540, L
"ProfCookingEnd"},
3586 {1541, L
"FlyProfCookingEnd"},
3587 {1542, L
"WACurious"},
3588 {1543, L
"FlyWACurious"},
3590 {1545, L
"FlyWAAlert"},
3591 {1546, L
"WAInvestigate"},
3592 {1547, L
"FlyWAInvestigate"},
3593 {1548, L
"WAInteraction"},
3594 {1549, L
"FlyWAInteraction"},
3595 {1550, L
"WAThreaten"},
3596 {1551, L
"FlyWAThreaten"},
3597 {1552, L
"WAReact01"},
3598 {1553, L
"FlyWAReact01"},
3599 {1554, L
"WAReact02"},
3600 {1555, L
"FlyWAReact02"},
3601 {1556, L
"AdvFlyRollStart"},
3602 {1557, L
"FlyAdvFlyRollStart"},
3603 {1558, L
"AdvFlyRollEnd"},
3604 {1559, L
"FlyAdvFlyRollEnd"},
3605 {1560, L
"EmpBreathPrecast"},
3606 {1561, L
"FlyEmpBreathPrecast"},
3607 {1562, L
"EmpBreathPrecastChannel"},
3608 {1563, L
"FlyEmpBreathPrecastChannel"},
3609 {1564, L
"EmpBreathSpellCast"},
3610 {1565, L
"FlyEmpBreathSpellCast"},
3611 {1566, L
"EmpBreathSpellCastChannel"},
3612 {1567, L
"FlyEmpBreathSpellCastChannel"},
3613 {1568, L
"DracFlyBreathTakeoffStart"},
3614 {1569, L
"FlyDracFlyBreathTakeoffStart"},
3615 {1570, L
"DracFlyBreathTakeoffFinish"},
3616 {1571, L
"FlyDracFlyBreathTakeoffFinish"},
3617 {1572, L
"DracFlyBreath"},
3618 {1573, L
"FlyDracFlyBreath"},
3619 {1574, L
"DracFlyBreathLandStart"},
3620 {1575, L
"FlyDracFlyBreathLandStart"},
3621 {1576, L
"DracFlyBreathLandFinish"},
3622 {1577, L
"FlyDracFlyBreathLandFinish"},
3623 {1578, L
"DracAirDashLeft"},
3624 {1579, L
"FlyDracAirDashLeft"},
3625 {1580, L
"DracAirDashForward"},
3626 {1581, L
"FlyDracAirDashForward"},
3627 {1582, L
"DracAirDashBackward"},
3628 {1583, L
"FlyDracAirDashBackward"},
3629 {1584, L
"DracAirDashRight"},
3630 {1585, L
"FlyDracAirDashRight"},
3631 {1586, L
"LivingWorldProximityEnter"},
3632 {1587, L
"FlyLivingWorldProximityEnter"},
3633 {1588, L
"AdvFlyDownEnd"},
3634 {1589, L
"FlyAdvFlyDownEnd"},
3635 {1590, L
"LivingWorldProximityLoop"},
3636 {1591, L
"FlyLivingWorldProximityLoop"},
3637 {1592, L
"LivingWorldProximityLeave"},
3638 {1593, L
"FlyLivingWorldProximityLeave"},
3639 {1594, L
"EmpAirBarragePrecast"},
3640 {1595, L
"FlyEmpAirBarragePrecast"},
3641 {1596, L
"EmpAirBarragePrecastChannel"},
3642 {1597, L
"FlyEmpAirBarragePrecastChannel"},
3643 {1598, L
"EmpAirBarrageSpellCast"},
3644 {1599, L
"FlyEmpAirBarrageSpellCast"},
3645 {1600, L
"DracClawSwipeLeft"},
3646 {1601, L
"FlyDracClawSwipeLeft"},
3647 {1602, L
"DracClawSwipeRight"},
3648 {1603, L
"FlyDracClawSwipeRight"},
3649 {1604, L
"DracHoverIdle"},
3650 {1605, L
"FlyDracHoverIdle"},
3651 {1606, L
"DracHoverLeft"},
3652 {1607, L
"FlyDracHoverLeft"},
3653 {1608, L
"DracHoverRight"},
3654 {1609, L
"FlyDracHoverRight"},
3655 {1610, L
"DracHoverBackward"},
3656 {1611, L
"FlyDracHoverBackward"},
3657 {1612, L
"DracHoverForward"},
3658 {1613, L
"FlyDracHoverForward"},
3659 {1614, L
"DracAttackWings"},
3660 {1615, L
"FlyDracAttackWings"},
3661 {1616, L
"DracAttackTail"},
3662 {1617, L
"FlyDracAttackTail"},
3663 {1618, L
"AdvFlyStart"},
3664 {1619, L
"FlyAdvFlyStart"},
3665 {1620, L
"AdvFlyLand"},
3666 {1621, L
"FlyAdvFlyLand"},
3667 {1622, L
"AdvFlyLandRun"},
3668 {1623, L
"FlyAdvFlyLandRun"},
3669 {1624, L
"AdvFlyStrafeLeft"},
3670 {1625, L
"FlyAdvFlyStrafeLeft"},
3671 {1626, L
"AdvFlyStrafeRight"},
3672 {1627, L
"FlyAdvFlyStrafeRight"},
3673 {1628, L
"AdvFlyIdle"},
3674 {1629, L
"FlyAdvFlyIdle"},
3675 {1630, L
"AdvFlyRollRight"},
3676 {1631, L
"FlyAdvFlyRollRight"},
3677 {1632, L
"AdvFlyRollRightEnd"},
3678 {1633, L
"FlyAdvFlyRollRightEnd"},
3679 {1634, L
"AdvFlyRollLeft"},
3680 {1635, L
"FlyAdvFlyRollLeft"},
3681 {1636, L
"AdvFlyRollLeftEnd"},
3682 {1637, L
"FlyAdvFlyRollLeftEnd"},
3683 {1638, L
"AdvFlyFlap"},
3684 {1639, L
"FlyAdvFlyFlap"},
3685 {1640, L
"DracHoverDracClawSwipeLeft"},
3686 {1641, L
"FlyDracHoverDracClawSwipeLeft"},
3687 {1642, L
"DracHoverDracClawSwipeRight"},
3688 {1643, L
"FlyDracHoverDracClawSwipeRight"},
3689 {1644, L
"DracHoverDracAttackWings"},
3690 {1645, L
"FlyDracHoverDracAttackWings"},
3691 {1646, L
"DracHoverReadySpellOmni"},
3692 {1647, L
"FlyDracHoverReadySpellOmni"},
3693 {1648, L
"DracHoverSpellCastOmni"},
3694 {1649, L
"FlyDracHoverSpellCastOmni"},
3695 {1650, L
"DracHoverChannelSpellOmni"},
3696 {1651, L
"FlyDracHoverChannelSpellOmni"},
3697 {1652, L
"DracHoverReadySpellDirected"},
3698 {1653, L
"FlyDracHoverReadySpellDirected"},
3699 {1654, L
"DracHoverChannelSpellDirected"},
3700 {1655, L
"FlyDracHoverChannelSpellDirected"},
3701 {1656, L
"DracHoverSpellCastDirected"},
3702 {1657, L
"FlyDracHoverSpellCastDirected"},
3703 {1658, L
"DracHoverCastOutStrong"},
3704 {1659, L
"FlyDracHoverCastOutStrong"},
3705 {1660, L
"DracHoverBattleRoar"},
3706 {1661, L
"FlyDracHoverBattleRoar"},
3707 {1662, L
"DracHoverEmpBreathSpellCast"},
3708 {1663, L
"FlyDracHoverEmpBreathSpellCast"},
3709 {1664, L
"DracHoverEmpBreathSpellCastChannel"},
3710 {1665, L
"FlyDracHoverEmpBreathSpellCastChannel"},
3711 {1666, L
"LivingWorldTimeOfDayEnter"},
3712 {1667, L
"FlyLivingWorldTimeOfDayEnter"},
3713 {1668, L
"LivingWorldTimeOfDayLoop"},
3714 {1669, L
"FlyLivingWorldTimeOfDayLoop"},
3715 {1670, L
"LivingWorldTimeOfDayLeave"},
3716 {1671, L
"FlyLivingWorldTimeOfDayLeave"},
3717 {1672, L
"LivingWorldWeatherEnter"},
3718 {1673, L
"FlyLivingWorldWeatherEnter"},
3719 {1674, L
"LivingWorldWeatherLoop"},
3720 {1675, L
"FlyLivingWorldWeatherLoop"},
3721 {1676, L
"LivingWorldWeatherLeave"},
3722 {1677, L
"FlyLivingWorldWeatherLeave"},
3723 {1678, L
"AdvFlyDownStart"},
3724 {1679, L
"FlyAdvFlyDownStart"},
3725 {1680, L
"AdvFlyFlapBig"},
3726 {1681, L
"FlyAdvFlyFlapBig"},
3727 {1682, L
"DracHoverReadyUnarmed"},
3728 {1683, L
"FlyDracHoverReadyUnarmed"},
3729 {1684, L
"DracHoverAttackUnarmed"},
3730 {1685, L
"FlyDracHoverAttackUnarmed"},
3731 {1686, L
"DracHoverParryUnarmed"},
3732 {1687, L
"FlyDracHoverParryUnarmed"},
3733 {1688, L
"DracHoverCombatWound"},
3734 {1689, L
"FlyDracHoverCombatWound"},
3735 {1690, L
"DracHoverCombatCritical"},
3736 {1691, L
"FlyDracHoverCombatCritical"},
3737 {1692, L
"DracHoverAttackTail"},
3738 {1693, L
"FlyDracHoverAttackTail"},
3740 {1695, L
"FlyGlide"},
3741 {1696, L
"GlideEnd"},
3742 {1697, L
"FlyGlideEnd"},
3743 {1698, L
"DracClawSwipe"},
3744 {1699, L
"FlyDracClawSwipe"},
3745 {1700, L
"DracHoverDracClawSwipe"},
3746 {1701, L
"FlyDracHoverDracClawSwipe"},
3747 {1702, L
"AdvFlyFlapUp"},
3748 {1703, L
"FlyAdvFlyFlapUp"},
3749 {1704, L
"AdvFlySlowFall"},
3750 {1705, L
"FlyAdvFlySlowFall"},
3751 {1706, L
"AdvFlyFlapFoward"},
3752 {1707, L
"FlyAdvFlyFlapFoward"},
3753 {1708, L
"DracSpellCastWings"},
3754 {1709, L
"FlyDracSpellCastWings"},
3755 {1710, L
"DracHoverDracSpellCastWings"},
3756 {1711, L
"FlyDracHoverDracSpellCastWings"},
3757 {1712, L
"DracAirDashVertical"},
3758 {1713, L
"FlyDracAirDashVertical"},
3759 {1714, L
"DracAirDashRefresh"},
3760 {1715, L
"FlyDracAirDashRefresh"},
3761 {1716, L
"SkinningLoop"},
3762 {1717, L
"FlySkinningLoop"},
3763 {1718, L
"SkinningStart"},
3764 {1719, L
"FlySkinningStart"},
3765 {1720, L
"SkinningEnd"},
3766 {1721, L
"FlySkinningEnd"},
3767 {1722, L
"AdvFlyForwardGlideSlow"},
3768 {1723, L
"FlyAdvFlyForwardGlideSlow"},
3769 {1724, L
"AdvFlyForwardGlideFast"},
3770 {1725, L
"FlyAdvFlyForwardGlideFast"},
3771 {1726, L
"AdvFlySecondFlapUp"},
3772 {1727, L
"FlyAdvFlySecondFlapUp"},
3773 {1728, L
"FloatIdle"},
3774 {1729, L
"FlyFloatIdle"},
3775 {1730, L
"FloatWalk"},
3776 {1731, L
"FlyFloatWalk"},
3777 {1732, L
"CinematicTalk"},
3778 {1733, L
"FlyCinematicTalk"},
3779 {1734, L
"CinematicWAGuardEmoteSlam01"},
3780 {1735, L
"FlyCinematicWAGuardEmoteSlam01"},
3781 {1736, L
"WABlowHorn"},
3782 {1737, L
"FlyWABlowHorn"},
3783 {1738, L
"MountExtraWide"},
3784 {1739, L
"FlyMountExtraWide"},
3785 {1740, L
"WA2HIdle"},
3786 {1741, L
"FlyWA2HIdle"},
3787 {1742, L
"HerbalismLoop"},
3788 {1743, L
"FlyHerbalismLoop"},
3789 {1744, L
"CookingLoop"},
3790 {1745, L
"FlyCookingLoop"},
3791 {1746, L
"WAWeaponSharpenNoSheathe"},
3792 {1747, L
"FlyWAWeaponSharpenNoSheathe"},
3793 {1748, L
"CinematicDeath"},
3794 {1749, L
"FlyCinematicDeath"},
3795 {1750, L
"CinematicDeathPose"},
3796 {1751, L
"FlyCinematicDeathPose"},
3797 {1752, L
"EmpSlamPrecast"},
3798 {1753, L
"FlyEmpSlamPrecast"},
3799 {1754, L
"EmpSlamPrecastChannel"},
3800 {1755, L
"FlyEmpSlamPrecastChannel"},
3801 {1756, L
"EmpSlamSpellCast"},
3802 {1757, L
"FlyEmpSlamSpellCast"},
3804 {1759, L
"FlyClimb"},
3805 {1760, L
"ClimbStart"},
3806 {1761, L
"FlyClimbStart"},
3807 {1762, L
"ClimbEnd"},
3808 {1763, L
"FlyClimbEnd"},
3809 {1764, L
"MountLeanLeft"},
3810 {1765, L
"FlyMountLeanLeft"},
3811 {1766, L
"MountLeanRight"},
3812 {1767, L
"FlyMountLeanRight"},
3813 {1768, L
"MountDive"},
3814 {1769, L
"FlyMountDive"},
3815 {1770, L
"MountCrouch"},
3816 {1771, L
"FlyMountCrouch"}
3821 for (
const auto& entry : AnimationNames)
3823 result[entry.first] = entry.second;
3826 if (!result.empty())
3828 LOG_INFO <<
"Found " << result.size() <<
" animations for model";
3836 pugi::xml_node node = parentNode.append_child(
"model");
3837 node.append_child(
"file").append_attribute(
"name") =
modelname.c_str();
3858 std::string result =
"";
3860 static std::map<CharGeosets, std::string> groups =
3906 const auto it = groups.find(cg);
3907 if (it != groups.end())
3908 result = it->second;
3915 if (geosetindex <
geosets.size())
3916 geosets[geosetindex]->display = value;
3921 bool result =
false;
3923 if (geosetindex <
geosets.size())
3924 result =
geosets[geosetindex]->display;
3931 const int a =
static_cast<int>(group) * 100;
3932 const int b = (
static_cast<int>(group) + 1) * 100;
3933 const int geosetID = a + val;
3940 const int id =
geosets[i]->id;
3941 if (
id > a &&
id < b)
3965 geomax = *cgd.rbegin() + 1;
3970 LOG_ERROR <<
"setCreatureGeosetData value of " << geomax <<
3971 " detected. We were assuming the maximum was 899.";
3972 geomax = ((geomax / 100) + 1) * 100;
3983 if (
id > 0 &&
id < geomax)
3990 std::replace(
name.begin(),
name.end(),
'\\',
'/');
4013 LOG_INFO << __FUNCTION__ << fileID;
4036 if (it.second ==
true && !noRefresh)
4045 if (it->gamefile->fileDataId() == fileID)
4073 uint mergeIndex = 0;
4081 modelsIt->origVertices = modelsIt->rawVertices;
4082 modelsIt->indices = modelsIt->rawIndices;
4083 modelsIt->passes = modelsIt->rawPasses;
4084 modelsIt->restoreRawGeosets();
4092 for (
const auto it : modelsIt->geosets)
4095 geo->istart += nbIndices;
4096 geo->vstart += nbVertices;
4101 uint32 nbBonesInNewModel = modelsIt->header.nBones;
4102 int16* boneConvertTable =
new int16[nbBonesInNewModel];
4104 for (
uint i = 0; i < nbBonesInNewModel; ++i)
4105 boneConvertTable[i] = i;
4107 for (
uint i = 0; i < nbBonesInNewModel; ++i)
4109 glm::vec3 pivot = modelsIt->bones[i].pivot;
4112 if (glm::all(glm::epsilonEqual(
bones[b].pivot, pivot, glm::vec3(0.0001f))) &&
4113 (
bones[b].boneDef.unknown == modelsIt->bones[i].boneDef.unknown))
4115 boneConvertTable[i] = b;
4121#ifdef DEBUG_DH_SUPPORT
4122 for (
uint i = 0; i < nbBonesInNewModel; ++i)
4123 LOG_INFO << i <<
"=>" << boneConvertTable[i];
4127 for (
auto& it : modelsIt->origVertices)
4129 for (
uint i = 0; i < 4; ++i)
4131 if (it.weights[i] > 0)
4132 it.bones[i] = boneConvertTable[it.bones[i]];
4136 delete[] boneConvertTable;
4143 for (
const auto& it : modelsIt->indices)
4144 indices.push_back(it + nbVertices);
4148 for (
const auto it :
passes)
4150 if (
geosets[it->geoIndex]->id / 100 == 23)
4154 for (
const auto it : modelsIt->passes)
4159 if (
geosets[it->geoIndex]->id / 100 != 23)
4167#ifdef DEBUG_DH_SUPPORT
4176 for (
const auto it : modelsIt->textures)
4184 for (
auto it : modelsIt->specialTextures)
4192 for (
auto it : modelsIt->replaceTextures)
4207 normals[i] = glm::normalize(ov_it.normal);
4211 const size_t size = (
origVertices.size() *
sizeof(float));
4216 glDeleteBuffersARB(1, &
nbuf);
4217 glDeleteBuffersARB(1, &
vbuf);
4220 glGenBuffersARB(1, &
vbuf);
4221 glBindBufferARB(GL_ARRAY_BUFFER_ARB,
vbuf);
4222 glBufferDataARB(GL_ARRAY_BUFFER_ARB,
vbufsize,
vertices, GL_STATIC_DRAW_ARB);
4227 glGenBuffersARB(1, &
nbuf);
4228 glBindBufferARB(GL_ARRAY_BUFFER_ARB,
nbuf);
4229 glBufferDataARB(GL_ARRAY_BUFFER_ARB,
vbufsize,
normals, GL_STATIC_DRAW_ARB);
4234 glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
4240 std::replace(
name.begin(),
name.end(),
'\\',
'/');
4256 LOG_INFO << __FUNCTION__ << fileID;
4291 uint32_t helmetGeosetVisDataID = 0;
4293 if (
const DB2Table* imaTbl =
WOWDB.getTable(
"ItemModifiedAppearance"))
4295 for (
const auto& imaRow : *imaTbl)
4297 if (
static_cast<int>(imaRow.getUInt(
"ItemID")) == headItemId)
4299 const uint32_t itemAppearanceID = imaRow.getUInt(
"ItemAppearanceID");
4300 if (
const DB2Table* iaTbl =
WOWDB.getTable(
"ItemAppearance"))
4302 DB2Row iaRow = iaTbl->getRow(itemAppearanceID);
4305 const uint32_t displayInfoID = iaRow.
getUInt(
"ItemDisplayInfoID");
4306 if (
const DB2Table* idiTbl =
WOWDB.getTable(
"ItemDisplayInfo"))
4308 DB2Row idiRow = idiTbl->getRow(displayInfoID);
4312 ? idiRow.
getUInt(
"HelmetGeosetVis1")
4313 : idiRow.
getUInt(
"HelmetGeosetVis2");
4323 if (helmetGeosetVisDataID != 0)
4325 if (
const DB2Table* hgdTbl =
WOWDB.getTable(
"HelmetGeosetData"))
4327 for (
const auto& hgdRow : *hgdTbl)
4329 if (
static_cast<int>(hgdRow.getUInt(
"RaceID")) ==
infos.
raceID &&
4330 hgdRow.getUInt(
"HelmetGeosetVisDataID") == helmetGeosetVisDataID)
4354 for (
auto* it : *
this)
4381 const GLuint charTex = 0;
4397 constexpr int faceA =
static_cast<int>(
CG_FACE) * 100;
4398 constexpr int faceB = (
static_cast<int>(
CG_FACE) + 1) * 100;
4401 const int id =
geosets[i]->id;
4402 if (
id >= faceA &&
id < faceB)
4409 const int egtId =
CG_EYEGLOW * 100 + egt + 1;
4410 for (
size_t i = 0; i <
rawGeosets.size(); i++)
4412 const int id =
geosets[i]->id;
4442 std::vector<bool> geosetDisplayStatus;
4443 geosetDisplayStatus.reserve(rawCount);
4444 for (
size_t i = 0; i < rawCount && i <
geosets.size(); i++)
4445 geosetDisplayStatus.push_back(
geosets[i]->display);
4458 for (
size_t i = 0; i < geosetDisplayStatus.size(); i++)
4459 geosets[i]->display = geosetDisplayStatus[i];
4470 out <<
"<m2>" << endl;
4471 out <<
" <info>" << endl;
4472 out <<
" <modelname>" << m.
modelname.c_str() <<
"</modelname>" << endl;
4473 out <<
" </info>" << endl;
4474 out <<
" <header>" << endl;
4477 out <<
" <nameOfs>" << m.
header.
nameOfs <<
"</nameOfs>" << endl;
4486 out <<
" <nBones>" << m.
header.
nBones <<
"</nBones>" << endl;
4487 out <<
" <ofsBones>" << m.
header.
ofsBones <<
"</ofsBones>" << endl;
4490 out <<
" <nVertices>" << m.
header.
nVertices <<
"</nVertices>" << endl;
4492 out <<
" <nViews>" << m.
header.
nViews <<
"</nViews>" << endl;
4493 out <<
" <lodname>" << m.
lodname.c_str() <<
"</lodname>" << endl;
4494 out <<
" <nColors>" << m.
header.
nColors <<
"</nColors>" << endl;
4495 out <<
" <ofsColors>" << m.
header.
ofsColors <<
"</ofsColors>" << endl;
4496 out <<
" <nTextures>" << m.
header.
nTextures <<
"</nTextures>" << endl;
4500 out <<
" <nTexAnims>" << m.
header.
nTexAnims <<
"</nTexAnims>" << endl;
4504 out <<
" <nTexFlags>" << m.
header.
nTexFlags <<
"</nTexFlags>" << endl;
4516 out <<
" <collisionSphere>" << endl;
4518 collisionSphere.min.z <<
"</min>" << endl;
4520 collisionSphere.max.z <<
"</max>" << endl;
4522 out <<
" </collisionSphere>" << endl;
4523 out <<
" <boundSphere>" << endl;
4525 boundSphere.min.z <<
"</min>" << endl;
4527 boundSphere.max.z <<
"</min>" << endl;
4529 out <<
" </boundSphere>" << endl;
4540 out <<
" <nEvents>" << m.
header.
nEvents <<
"</nEvents>" << endl;
4541 out <<
" <ofsEvents>" << m.
header.
ofsEvents <<
"</ofsEvents>" << endl;
4542 out <<
" <nLights>" << m.
header.
nLights <<
"</nLights>" << endl;
4543 out <<
" <ofsLights>" << m.
header.
ofsLights <<
"</ofsLights>" << endl;
4544 out <<
" <nCameras>" << m.
header.
nCameras <<
"</nCameras>" << endl;
4552 out <<
" </header>" << endl;
4554 out <<
" <SkeletonAndAnimation>" << endl;
4556 out <<
" <GlobalSequences size=\"" << m.
globalSequences.size() <<
"\">" << endl;
4558 out <<
"<Sequence>" << globalSequence <<
"</Sequence>" << endl;
4559 out <<
" </GlobalSequences>" << endl;
4561 out <<
" <Animations size=\"" << m.
anims.size() <<
"\">" << endl;
4562 for (
size_t i = 0; i < m.
anims.size(); i++)
4564 out <<
" <Animation id=\"" << i <<
"\">" << endl;
4565 out <<
" <animID>" << m.
anims[i].animID <<
"</animID>" << endl;
4567 out <<
" <animName>" << strName <<
"</animName>" << endl;
4568 out <<
" <length>" << m.
anims[i].length <<
"</length>" << endl;
4569 out <<
" <moveSpeed>" << m.
anims[i].moveSpeed <<
"</moveSpeed>" << endl;
4570 out <<
" <flags>" << m.
anims[i].flags <<
"</flags>" << endl;
4571 out <<
" <probability>" << m.
anims[i].probability <<
"</probability>" << endl;
4572 out <<
" <d1>" << m.
anims[i].d1 <<
"</d1>" << endl;
4573 out <<
" <d2>" << m.
anims[i].d2 <<
"</d2>" << endl;
4574 out <<
" <playSpeed>" << m.
anims[i].playSpeed <<
"</playSpeed>" << endl;
4575 out <<
" <boxA>" << m.
anims[i].boundSphere.min.x <<
" " << m.
anims[i].boundSphere.min.y <<
" " << m.
anims[
4576 i].boundSphere.min.z <<
"</boxA>" << endl;
4577 out <<
" <boxA>" << m.
anims[i].boundSphere.max.x <<
" " << m.
anims[i].boundSphere.max.y <<
" " << m.
anims[
4578 i].boundSphere.max.z <<
"</boxA>" << endl;
4579 out <<
" <rad>" << m.
anims[i].boundSphere.radius <<
"</rad>" << endl;
4580 out <<
" <NextAnimation>" << m.
anims[i].NextAnimation <<
"</NextAnimation>" << endl;
4581 out <<
" <Index>" << m.
anims[i].Index <<
"</Index>" << endl;
4582 out <<
" </Animation>" << endl;
4584 out <<
" </Animations>" << endl;
4586 out <<
" <AnimationLookups size=\"" << m.
animLookups.size() <<
"\">" << endl;
4588 out <<
" <AnimationLookup id=\"" << i <<
"\">" << m.
animLookups[i] <<
"</AnimationLookup>" << endl;
4589 out <<
" </AnimationLookups>" << endl;
4591 out <<
" <Bones size=\"" << m.
bones.size() <<
"\">" << endl;
4592 for (
size_t i = 0; i < m.
bones.size(); i++)
4594 out <<
" <Bone id=\"" << i <<
"\">" << endl;
4595 out <<
" <keyboneid>" << m.
bones[i].boneDef.keyboneid <<
"</keyboneid>" << endl;
4596 out <<
" <billboard>" << m.
bones[i].billboard <<
"</billboard>" << endl;
4597 out <<
" <parent>" << m.
bones[i].boneDef.parent <<
"</parent>" << endl;
4598 out <<
" <geoid>" << m.
bones[i].boneDef.geoid <<
"</geoid>" << endl;
4599 out <<
" <unknown>" << m.
bones[i].boneDef.unknown <<
"</unknown>" << endl;
4602 out <<
" <trans>" << endl;
4603 out << m.
bones[i].trans;
4604 out <<
" </trans>" << endl;
4606 out <<
" <rot>" << endl;
4607 out << m.
bones[i].rot;
4608 out <<
" </rot>" << endl;
4610 out <<
" <scale>" << endl;
4611 out << m.
bones[i].scale;
4612 out <<
" </scale>" << endl;
4614 out <<
" <pivot>" << m.
bones[i].boneDef.pivot.x <<
" " << m.
bones[i].boneDef.pivot.y <<
" " << m.
bones[i].
4615 boneDef.pivot.z <<
"</pivot>" << endl;
4616 out <<
" </Bone>" << endl;
4618 out <<
" </Bones>" << endl;
4629 out <<
" <KeyBoneLookup id=\"" << i <<
"\">" << m.
keyBoneLookup[i] <<
"</KeyBoneLookup>" << endl;
4630 out <<
" </KeyBoneLookups>" << endl;
4632 out <<
" </SkeletonAndAnimation>" << endl;
4634 out <<
" <GeometryAndRendering>" << endl;
4643 out <<
" </Vertices>" << endl;
4644 out <<
" <Views>" << endl;
4655 out <<
" <RenderPasses size=\"" << m.
passes.size() <<
"\">" << endl;
4656 for (
size_t i = 0; i < m.
passes.size(); i++)
4658 out <<
" <RenderPass id=\"" << i <<
"\">" << endl;
4661 out <<
" <indexStart>" << geoset->
istart <<
"</indexStart>" << endl;
4662 out <<
" <indexCount>" << geoset->
icount <<
"</indexCount>" << endl;
4663 out <<
" <vertexStart>" << geoset->
vstart <<
"</vertexStart>" << endl;
4664 out <<
" <vertexEnd>" << geoset->
vstart + geoset->
vcount <<
"</vertexEnd>" << endl;
4665 out <<
" <tex>" << p->
tex <<
"</tex>" << endl;
4668 out <<
" <useTex2>" << p->
useTex2 <<
"</useTex2>" << endl;
4669 out <<
" <useEnvMap>" << p->
useEnvMap <<
"</useEnvMap>" << endl;
4670 out <<
" <cull>" << p->
cull <<
"</cull>" << endl;
4671 out <<
" <trans>" << p->
trans <<
"</trans>" << endl;
4672 out <<
" <unlit>" << p->
unlit <<
"</unlit>" << endl;
4673 out <<
" <noZWrite>" << p->
noZWrite <<
"</noZWrite>" << endl;
4674 out <<
" <billboard>" << p->
billboard <<
"</billboard>" << endl;
4675 out <<
" <texanim>" << p->
texanim <<
"</texanim>" << endl;
4676 out <<
" <color>" << p->
color <<
"</color>" << endl;
4677 out <<
" <opacity>" << p->
opacity <<
"</opacity>" << endl;
4678 out <<
" <blendmode>" << p->
blendmode <<
"</blendmode>" << endl;
4679 out <<
" <geoset>" << geoset->
id <<
"</geoset>" << endl;
4680 out <<
" <swrap>" << p->
swrap <<
"</swrap>" << endl;
4681 out <<
" <twrap>" << p->
twrap <<
"</twrap>" << endl;
4682 out <<
" <ocol>" << p->
ocol.x <<
" " << p->
ocol.y <<
" " << p->
ocol.z <<
" " << p->
ocol.w <<
"</ocol>" <<
4684 out <<
" <ecol>" << p->
ecol.x <<
" " << p->
ecol.y <<
" " << p->
ecol.z <<
" " << p->
ecol.w <<
"</ecol>" <<
4686 out <<
" </RenderPass>" << endl;
4688 out <<
" </RenderPasses>" << endl;
4690 out <<
" <Geosets size=\"" << m.
geosets.size() <<
"\">" << endl;
4691 for (
size_t i = 0; i < m.
geosets.size(); i++)
4693 out <<
" <Geoset id=\"" << i <<
"\">" << endl;
4694 out <<
" <id>" << m.
geosets[i]->id <<
"</id>" << endl;
4695 out <<
" <vstart>" << m.
geosets[i]->vstart <<
"</vstart>" << endl;
4696 out <<
" <vcount>" << m.
geosets[i]->vcount <<
"</vcount>" << endl;
4697 out <<
" <istart>" << m.
geosets[i]->istart <<
"</istart>" << endl;
4698 out <<
" <icount>" << m.
geosets[i]->icount <<
"</icount>" << endl;
4699 out <<
" <nSkinnedBones>" << m.
geosets[i]->nSkinnedBones <<
"</nSkinnedBones>" << endl;
4700 out <<
" <StartBones>" << m.
geosets[i]->StartBones <<
"</StartBones>" << endl;
4701 out <<
" <rootBone>" << m.
geosets[i]->rootBone <<
"</rootBone>" << endl;
4702 out <<
" <nBones>" << m.
geosets[i]->nBones <<
"</nBones>" << endl;
4703 out <<
" <BoundingBox>" << m.
geosets[i]->BoundingBox[0].x <<
" " << m.
geosets[i]->BoundingBox[0].y <<
" "
4704 << m.
geosets[i]->BoundingBox[0].z <<
"</BoundingBox>" << endl;
4705 out <<
" <BoundingBox>" << m.
geosets[i]->BoundingBox[1].x <<
" " << m.
geosets[i]->BoundingBox[1].y <<
" "
4706 << m.
geosets[i]->BoundingBox[1].z <<
"</BoundingBox>" << endl;
4707 out <<
" <radius>" << m.
geosets[i]->radius <<
"</radius>" << endl;
4708 out <<
" </Geoset>" << endl;
4710 out <<
" </Geosets>" << endl;
4732 out <<
" </Views>" << endl;
4734 out <<
" <RenderFlags></RenderFlags>" << endl;
4736 out <<
" <Colors size=\"" << m.
colors.size() <<
"\">" << endl;
4739 out <<
" <Color id=\"" << i <<
"\">" << endl;
4741 out <<
" <color>" << endl;
4742 out << m.
colors[i].color;
4743 out <<
" </color>" << endl;
4745 out <<
" <opacity>" << endl;
4746 out << m.
colors[i].opacity;
4747 out <<
" </opacity>" << endl;
4748 out <<
" </Color>" << endl;
4750 out <<
" </Colors>" << endl;
4752 out <<
" <Transparency size=\"" << m.
transparency.size() <<
"\">" << endl;
4755 out <<
" <Tran id=\"" << i <<
"\">" << endl;
4757 out <<
" <trans>" << endl;
4759 out <<
" </trans>" << endl;
4760 out <<
" </Tran>" << endl;
4762 out <<
" </Transparency>" << endl;
4764 out <<
" <TransparencyLookup></TransparencyLookup>" << endl;
4787 out <<
" <ReplacableTextureLookup></ReplacableTextureLookup>" << endl;
4789 out <<
" </GeometryAndRendering>" << endl;
4791 out <<
" <Effects>" << endl;
4793 out <<
" <TexAnims size=\"" << m.
texAnims.size() <<
"\">" << endl;
4796 out <<
" <TexAnim id=\"" << i <<
"\">" << endl;
4798 out <<
" <trans>" << endl;
4800 out <<
" </trans>" << endl;
4802 out <<
" <rot>" << endl;
4804 out <<
" </rot>" << endl;
4806 out <<
" <scale>" << endl;
4808 out <<
" </scale>" << endl;
4809 out <<
" </TexAnim>" << endl;
4811 out <<
" </TexAnims>" << endl;
4813 out <<
" <RibbonEmitters></RibbonEmitters>" << endl;
4818 out <<
" <Particle id=\"" << i <<
"\">" << endl;
4820 out <<
" </Particle>" << endl;
4822 out <<
" </Particles>" << endl;
4824 out <<
" </Effects>" << endl;
4826 out <<
" <Miscellaneous>" << endl;
4828 out <<
" <BoundingVolumes></BoundingVolumes>" << endl;
4829 out <<
" <Lights></Lights>" << endl;
4830 out <<
" <Cameras></Cameras>" << endl;
4835 out <<
" <Attachment id=\"" << i <<
"\">" << endl;
4836 out <<
" <id>" << m.
atts[i].id <<
"</id>" << endl;
4837 out <<
" <bone>" << m.
atts[i].bone <<
"</bone>" << endl;
4838 out <<
" <pos>" << m.
atts[i].pos.x <<
" " << m.
atts[i].pos.y <<
" " << m.
atts[i].pos.z <<
"</pos>" << endl;
4839 out <<
" </Attachment>" << endl;
4841 out <<
" </Attachments>" << endl;
4850 out <<
" <Events size=\"" << m.
events.size() <<
"\">" << endl;
4851 for (
size_t i = 0; i < m.
events.size(); i++)
4853 out <<
" <Event id=\"" << i <<
"\">" << endl;
4855 out <<
" </Event>" << endl;
4857 out <<
" </Events>" << endl;
4859 out <<
" </Miscellaneous>" << endl;
4862 out <<
" <TextureLists>" << endl;
4863 for (
const auto it : m.
passes)
4867 out <<
" <TextureList id=\"" << tex <<
"\">" <<
TEXTUREMANAGER.
get(tex) <<
"</TextureList>"
4870 out <<
" </TextureLists>" << endl;
4872 out <<
"</m2>" << endl;
TextureManager TEXTUREMANAGER
#define GL_BUFFER_OFFSET(i)
std::ostream & operator<<(std::ostream &out, const WoWModel &m)
@ TEXTURE_MAX
Maximum number of texture slots per model.
size_t globalTime
Global clock for global-sequence animations.
Manages animation playback for a WoWModel, supporting up to 4 queued animations, a secondary (upper-b...
size_t GetSecondaryFrame()
size_t GetSecondaryCount()
void setModel(Displayable *newmodel)
void save(pugi::xml_node &parentNode)
void reset(WoWModel *m=nullptr)
bool autoHideGeosetsForHeadItems
std::map< uint, uint > geosets
std::vector< TextureCustomization > textures
void load(const std::string &filepath)
void reset(unsigned int _layoutSizeId)
void compose(GLuint texID)
void addLayer(GameFile *file, int region, int layer, int blendMode=1)
void setName(const std::string &name)
Lightweight handle to a single row in a DB2Table.
uint32_t getUInt(const std::string &field, unsigned int arrayIndex=0) const
Provides typed, field-name-based access to records in a WDC DB2 file.
Abstract base class representing a file within the game data archive.
bool open(bool useMemoryBuffer=true)
Open the file, optionally loading into a memory buffer.
size_t getSize()
Total size of the file in bytes.
unsigned char * getBuffer() const
Pointer to the start of the internal buffer.
bool close()
Close the file and release the internal buffer.
virtual size_t read(void *dest, size_t bytes)
Read bytes from the file into dest.
const std::string & fullname() const
bool setChunk(std::string chunkName, bool resetToStart=true)
Switch the active read window to the named chunk.
bool isChunked()
True if the file has been parsed into named chunks.
bool isEof()
True if the read pointer has reached the end of the file.
const ItemRecord & getById(int id) const
Reference-counted item stored in a Manager.
void setItemName(std::string name)
virtual void del(IDTYPE id)
IDTYPE get(const std::string &name)
Extended geoset with 32-bit index start to support HD models with > 65535 indices.
Represents a single render pass (material + geometry) for an M2 model geoset.
static const uint16 INVALID_TEX
Sentinel value for an unset texture.
WoWModel * model
Owning model.
bool twrap
Texture wrapping modes (S and T).
int16 specialTex
Material property indices.
bool billboard
Render state flags.
glm::vec4 ecol
Output and emissive colours.
int geoIndex
Geoset index this pass draws.
int sexID
0 = male, 1 = female.
bool barefeet
Whether the race shows bare feet by default.
int textureLayoutID
Texture layout ID for compositing.
static bool getRaceInfosForFileID(int, RaceInfos &)
Populate a RaceInfos struct from a model file ID.
int raceID
Race ID (-1 = invalid).
virtual GLuint add(GameFile *)
Represents an equipped item on a character model.
Core WoW .m2 model: geometry, animation, textures, and character data.
std::vector< ModelAnimation > anims
std::vector< uint16 > boundTris
GLuint getGLTexture(uint16 tex) const
std::vector< GLuint > replaceTextures
void calcBones(ssize_t anim, size_t time)
uint creatureGeosetDataID
void animate(ssize_t anim)
WoWModel * mergeModel(std::string name, int type=1, bool noRefresh=false)
WoWItem * getItem(CharSlots slot)
std::map< int, std::wstring > getAnimsMap()
std::vector< TextureAnim > texAnims
void displayHeader(ModelHeader &a_header)
void readAnimsFromFile(GameFile *f, std::vector< AFID > &afids, modelAnimData &data, uint32 nAnimations, uint32 ofsAnimation, uint32 nAnimationLookup, uint32 ofsAnimationLookup)
std::vector< ModelColor > colors
std::vector< uint32 > rawIndices
void save(pugi::xml_node &parentNode)
std::vector< glm::vec3 > bounds
std::vector< ModelRenderPass * > rawPasses
std::vector< int > specialTextures
std::vector< ModelEvent > events
int16 keyBoneLookup[BONE_MAX]
void lightsOn(GLuint lbase)
WoWModel(GameFile *file, bool forceAnim=false)
static const size_t ATT_MAX
int getItemId(CharSlots slot)
std::vector< uint32 > indices
bool replaceParticleColors
std::vector< AFID > readAFIDSFromFile(GameFile *f)
bool canSetTextureFromFile(int texnum)
void updateTextureList(GameFile *tex, int special)
void load(const std::string &filepath)
std::vector< Bone > bones
std::vector< uint32 > skinFileIDs
std::vector< ModelVertex > rawVertices
std::vector< uint > replacableParticleColorIDs
std::set< WoWModel * > mergedModels
std::vector< ModelRenderPass * > passes
std::vector< uint32 > globalSequences
std::string getNameForTex(uint16 tex)
static bool sortPasses(ModelRenderPass *mrp1, ModelRenderPass *mrp2)
std::vector< RibbonEmitter > ribbons
std::vector< TXID > readTXIDSFromFile(GameFile *f)
void setCreatureGeosetData(std::set< GeosetNum > cgd)
CharModelDetails charModelDetails
std::vector< GLuint > textures
bool isGeosetDisplayed(uint geosetindex)
void updateEmitters(float dt)
std::vector< int16 > animLookups
void unmergeModel(std::string name)
std::vector< ModelGeosetHD * > rawGeosets
static std::string getCGGroupName(CharGeosets cg)
void drawBoundingVolume()
std::vector< ModelLight > lights
std::vector< particleColorSet > particleColorReplacements
WoWModel * getMergedModel(uint fileID)
std::vector< ParticleSystem > particleSystems
void lightsOff(GLuint lbase)
std::vector< ModelAttachment > atts
std::vector< ModelGeosetHD * > geosets
AnimManager * animManager
std::set< GeosetNum > creatureGeosetData
friend class ModelRenderPass
std::vector< ModelTransparency > transparency
void setGeosetGroupDisplay(CharGeosets group, int val)
std::vector< ModelVertex > origVertices
void showGeoset(uint geosetindex, bool value)
std::vector< ModelCamera > cam
Holds per-model animation metadata: index-to-id mapping, external anim files, and global sequences.
std::vector< uint32 > globalSequences
Global sequence durations.
std::map< int16, std::pair< GameFile *, GameFile * > > animfiles
Maps anim ID to (anim file, skel file) pair.
std::map< uint, int16 > animIndexToAnimId
Maps animation index to animation ID.
std::string getAnimName(uint32_t animId)
std::vector< std::string > split(const std::string &s, char delimiter)
Split a string by a single-character delimiter.
Animation file ID entry mapping anim/sub-anim to a CASC file ID (AFID chunk).
uint32 fileId
CASC file data ID.
On-disk particle emitter definition in an M2 file.
An animation sequence entry in the M2 model (block B).
On-disk attachment point definition in an M2 file.
An attachment point on a WoW model (weapon, shoulder, helmet, etc.).
void init(ModelAttachmentDef &mad)
Initialise from an on-disk attachment definition.
WoWModel * model
The model this attachment belongs to.
On-disk bone definition (block E) in an M2 file.
AnimationBlock translation
An animated camera defined within an M2 model (e.g. portrait or character-info camera).
void initv10(GameFile *f, ModelCameraDefV10 &mcd, std::vector< uint32 > &global, std::string modelname)
Initialise from a v10 camera definition block.
void init(GameFile *f, ModelCameraDef &mcd, std::vector< uint32 > &global, std::string modelname)
Initialise from an M2 camera definition block.
A submesh/geoset within a model LOD view (one material + draw call).
Lod part, A texture unit (sub of material)
A vertex as stored in the M2 file (position, bone weights, normal, texcoord).
Skeleton attachment data header (SKA1 chunk).
uint32 ofsAttachLookup
Offset to attachment lookup table.
uint32 nAttachments
Number of attachments.
uint32 nAttachLookup
Number of attachment lookup entries.
uint32 ofsAttachments
Offset to attachments.
Skeleton bone data header (SKB1 chunk).
uint32 ofsBones
Offset to bones.
uint32 nKeyBoneLookup
Number of key bone lookup entries.
uint32 ofsKeyBoneLookup
Offset to key bone lookup table.
uint32 nBones
Number of bones.
Skeleton parent data chunk (SKPD).
uint32 parentFileId
File data ID of the parent skeleton.
Skeleton sequence data header (SKS1 chunk).
uint32 nAnimationLookup
Number of animation lookup entries.
uint32 nAnimations
Number of animations.
uint32 ofsAnimations
Offset to animations.
uint32 ofsGlobalSequences
Offset to global sequences.
uint32 nGlobalSequences
Number of global sequences.
uint32 ofsAnimationLookup
Offset to animation lookup table.
glm::vec3 max
Maximum corner of the bounding box.
glm::vec3 min
Minimum corner of the bounding box.
float radius
Bounding sphere radius.
Texture file ID entry (TXID chunk).
CharGeosets
Character geoset group identifiers (mesh IDs for body/armour regions).
@ CG_MECHAGNOME_ARMS_OR_HANDS
CharSlots
Character equipment slot indices.