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)
4068 uint mergeIndex = 0;
4077 modelsIt->indices = modelsIt->rawIndices;
4078 modelsIt->passes = modelsIt->rawPasses;
4079 modelsIt->restoreRawGeosets();
4083 for (
auto it : modelsIt->geosets)
4085 it->istart += nbIndices;
4086 it->vstart += nbVertices;
4091 uint32 nbBonesInNewModel = modelsIt->header.nBones;
4092 int16* boneConvertTable =
new int16[nbBonesInNewModel];
4094 for (
uint i = 0; i < nbBonesInNewModel; ++i)
4095 boneConvertTable[i] = i;
4097 for (
uint i = 0; i < nbBonesInNewModel; ++i)
4099 glm::vec3 pivot = modelsIt->bones[i].pivot;
4102 if (glm::all(glm::epsilonEqual(
bones[b].pivot, pivot, glm::vec3(0.0001f))) &&
4103 (
bones[b].boneDef.unknown == modelsIt->bones[i].boneDef.unknown))
4105 boneConvertTable[i] = b;
4111#ifdef DEBUG_DH_SUPPORT
4112 for (
uint i = 0; i < nbBonesInNewModel; ++i)
4113 LOG_INFO << i <<
"=>" << boneConvertTable[i];
4117 for (
auto& it : modelsIt->origVertices)
4119 for (
uint i = 0; i < 4; ++i)
4121 if (it.weights[i] > 0)
4122 it.bones[i] = boneConvertTable[it.bones[i]];
4126 delete[] boneConvertTable;
4133 for (
const auto& it : modelsIt->indices)
4134 indices.push_back(it + nbVertices);
4138 for (
const auto it :
passes)
4140 if (
geosets[it->geoIndex]->id / 100 == 23)
4144 for (
const auto it : modelsIt->passes)
4149 if (
geosets[it->geoIndex]->id / 100 != 23)
4157#ifdef DEBUG_DH_SUPPORT
4166 for (
const auto it : modelsIt->textures)
4174 for (
auto it : modelsIt->specialTextures)
4182 for (
auto it : modelsIt->replaceTextures)
4197 normals[i] = glm::normalize(ov_it.normal);
4201 const size_t size = (
origVertices.size() *
sizeof(float));
4206 glDeleteBuffersARB(1, &
nbuf);
4207 glDeleteBuffersARB(1, &
vbuf);
4210 glGenBuffersARB(1, &
vbuf);
4211 glBindBufferARB(GL_ARRAY_BUFFER_ARB,
vbuf);
4212 glBufferDataARB(GL_ARRAY_BUFFER_ARB,
vbufsize,
vertices, GL_STATIC_DRAW_ARB);
4217 glGenBuffersARB(1, &
nbuf);
4218 glBindBufferARB(GL_ARRAY_BUFFER_ARB,
nbuf);
4219 glBufferDataARB(GL_ARRAY_BUFFER_ARB,
vbufsize,
normals, GL_STATIC_DRAW_ARB);
4224 glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
4230 std::replace(
name.begin(),
name.end(),
'\\',
'/');
4246 LOG_INFO << __FUNCTION__ << fileID;
4281 uint32_t helmetGeosetVisDataID = 0;
4283 if (
const DB2Table* imaTbl =
WOWDB.getTable(
"ItemModifiedAppearance"))
4285 for (
const auto& imaRow : *imaTbl)
4287 if (
static_cast<int>(imaRow.getUInt(
"ItemID")) == headItemId)
4289 const uint32_t itemAppearanceID = imaRow.getUInt(
"ItemAppearanceID");
4290 if (
const DB2Table* iaTbl =
WOWDB.getTable(
"ItemAppearance"))
4292 DB2Row iaRow = iaTbl->getRow(itemAppearanceID);
4295 const uint32_t displayInfoID = iaRow.
getUInt(
"ItemDisplayInfoID");
4296 if (
const DB2Table* idiTbl =
WOWDB.getTable(
"ItemDisplayInfo"))
4298 DB2Row idiRow = idiTbl->getRow(displayInfoID);
4302 ? idiRow.
getUInt(
"HelmetGeosetVis1")
4303 : idiRow.
getUInt(
"HelmetGeosetVis2");
4313 if (helmetGeosetVisDataID != 0)
4315 if (
const DB2Table* hgdTbl =
WOWDB.getTable(
"HelmetGeosetData"))
4317 for (
const auto& hgdRow : *hgdTbl)
4319 if (
static_cast<int>(hgdRow.getUInt(
"RaceID")) ==
infos.
raceID &&
4320 hgdRow.getUInt(
"HelmetGeosetVisDataID") == helmetGeosetVisDataID)
4344 for (
auto* it : *
this)
4371 const GLuint charTex = 0;
4387 constexpr int faceA =
static_cast<int>(
CG_FACE) * 100;
4388 constexpr int faceB = (
static_cast<int>(
CG_FACE) + 1) * 100;
4391 const int id =
geosets[i]->id;
4392 if (
id >= faceA &&
id < faceB)
4399 const int egtId =
CG_EYEGLOW * 100 + egt + 1;
4400 for (
size_t i = 0; i <
rawGeosets.size(); i++)
4402 const int id =
geosets[i]->id;
4432 std::vector<bool> geosetDisplayStatus;
4433 geosetDisplayStatus.reserve(rawCount);
4434 for (
size_t i = 0; i < rawCount && i <
geosets.size(); i++)
4435 geosetDisplayStatus.push_back(
geosets[i]->display);
4448 for (
size_t i = 0; i < geosetDisplayStatus.size(); i++)
4449 geosets[i]->display = geosetDisplayStatus[i];
4460 out <<
"<m2>" << endl;
4461 out <<
" <info>" << endl;
4462 out <<
" <modelname>" << m.
modelname.c_str() <<
"</modelname>" << endl;
4463 out <<
" </info>" << endl;
4464 out <<
" <header>" << endl;
4467 out <<
" <nameOfs>" << m.
header.
nameOfs <<
"</nameOfs>" << endl;
4476 out <<
" <nBones>" << m.
header.
nBones <<
"</nBones>" << endl;
4477 out <<
" <ofsBones>" << m.
header.
ofsBones <<
"</ofsBones>" << endl;
4480 out <<
" <nVertices>" << m.
header.
nVertices <<
"</nVertices>" << endl;
4482 out <<
" <nViews>" << m.
header.
nViews <<
"</nViews>" << endl;
4483 out <<
" <lodname>" << m.
lodname.c_str() <<
"</lodname>" << endl;
4484 out <<
" <nColors>" << m.
header.
nColors <<
"</nColors>" << endl;
4485 out <<
" <ofsColors>" << m.
header.
ofsColors <<
"</ofsColors>" << endl;
4486 out <<
" <nTextures>" << m.
header.
nTextures <<
"</nTextures>" << endl;
4490 out <<
" <nTexAnims>" << m.
header.
nTexAnims <<
"</nTexAnims>" << endl;
4494 out <<
" <nTexFlags>" << m.
header.
nTexFlags <<
"</nTexFlags>" << endl;
4506 out <<
" <collisionSphere>" << endl;
4508 collisionSphere.min.z <<
"</min>" << endl;
4510 collisionSphere.max.z <<
"</max>" << endl;
4512 out <<
" </collisionSphere>" << endl;
4513 out <<
" <boundSphere>" << endl;
4515 boundSphere.min.z <<
"</min>" << endl;
4517 boundSphere.max.z <<
"</min>" << endl;
4519 out <<
" </boundSphere>" << endl;
4530 out <<
" <nEvents>" << m.
header.
nEvents <<
"</nEvents>" << endl;
4531 out <<
" <ofsEvents>" << m.
header.
ofsEvents <<
"</ofsEvents>" << endl;
4532 out <<
" <nLights>" << m.
header.
nLights <<
"</nLights>" << endl;
4533 out <<
" <ofsLights>" << m.
header.
ofsLights <<
"</ofsLights>" << endl;
4534 out <<
" <nCameras>" << m.
header.
nCameras <<
"</nCameras>" << endl;
4542 out <<
" </header>" << endl;
4544 out <<
" <SkeletonAndAnimation>" << endl;
4546 out <<
" <GlobalSequences size=\"" << m.
globalSequences.size() <<
"\">" << endl;
4548 out <<
"<Sequence>" << globalSequence <<
"</Sequence>" << endl;
4549 out <<
" </GlobalSequences>" << endl;
4551 out <<
" <Animations size=\"" << m.
anims.size() <<
"\">" << endl;
4552 for (
size_t i = 0; i < m.
anims.size(); i++)
4554 out <<
" <Animation id=\"" << i <<
"\">" << endl;
4555 out <<
" <animID>" << m.
anims[i].animID <<
"</animID>" << endl;
4557 out <<
" <animName>" << strName <<
"</animName>" << endl;
4558 out <<
" <length>" << m.
anims[i].length <<
"</length>" << endl;
4559 out <<
" <moveSpeed>" << m.
anims[i].moveSpeed <<
"</moveSpeed>" << endl;
4560 out <<
" <flags>" << m.
anims[i].flags <<
"</flags>" << endl;
4561 out <<
" <probability>" << m.
anims[i].probability <<
"</probability>" << endl;
4562 out <<
" <d1>" << m.
anims[i].d1 <<
"</d1>" << endl;
4563 out <<
" <d2>" << m.
anims[i].d2 <<
"</d2>" << endl;
4564 out <<
" <playSpeed>" << m.
anims[i].playSpeed <<
"</playSpeed>" << endl;
4565 out <<
" <boxA>" << m.
anims[i].boundSphere.min.x <<
" " << m.
anims[i].boundSphere.min.y <<
" " << m.
anims[
4566 i].boundSphere.min.z <<
"</boxA>" << endl;
4567 out <<
" <boxA>" << m.
anims[i].boundSphere.max.x <<
" " << m.
anims[i].boundSphere.max.y <<
" " << m.
anims[
4568 i].boundSphere.max.z <<
"</boxA>" << endl;
4569 out <<
" <rad>" << m.
anims[i].boundSphere.radius <<
"</rad>" << endl;
4570 out <<
" <NextAnimation>" << m.
anims[i].NextAnimation <<
"</NextAnimation>" << endl;
4571 out <<
" <Index>" << m.
anims[i].Index <<
"</Index>" << endl;
4572 out <<
" </Animation>" << endl;
4574 out <<
" </Animations>" << endl;
4576 out <<
" <AnimationLookups size=\"" << m.
animLookups.size() <<
"\">" << endl;
4578 out <<
" <AnimationLookup id=\"" << i <<
"\">" << m.
animLookups[i] <<
"</AnimationLookup>" << endl;
4579 out <<
" </AnimationLookups>" << endl;
4581 out <<
" <Bones size=\"" << m.
bones.size() <<
"\">" << endl;
4582 for (
size_t i = 0; i < m.
bones.size(); i++)
4584 out <<
" <Bone id=\"" << i <<
"\">" << endl;
4585 out <<
" <keyboneid>" << m.
bones[i].boneDef.keyboneid <<
"</keyboneid>" << endl;
4586 out <<
" <billboard>" << m.
bones[i].billboard <<
"</billboard>" << endl;
4587 out <<
" <parent>" << m.
bones[i].boneDef.parent <<
"</parent>" << endl;
4588 out <<
" <geoid>" << m.
bones[i].boneDef.geoid <<
"</geoid>" << endl;
4589 out <<
" <unknown>" << m.
bones[i].boneDef.unknown <<
"</unknown>" << endl;
4592 out <<
" <trans>" << endl;
4593 out << m.
bones[i].trans;
4594 out <<
" </trans>" << endl;
4596 out <<
" <rot>" << endl;
4597 out << m.
bones[i].rot;
4598 out <<
" </rot>" << endl;
4600 out <<
" <scale>" << endl;
4601 out << m.
bones[i].scale;
4602 out <<
" </scale>" << endl;
4604 out <<
" <pivot>" << m.
bones[i].boneDef.pivot.x <<
" " << m.
bones[i].boneDef.pivot.y <<
" " << m.
bones[i].
4605 boneDef.pivot.z <<
"</pivot>" << endl;
4606 out <<
" </Bone>" << endl;
4608 out <<
" </Bones>" << endl;
4619 out <<
" <KeyBoneLookup id=\"" << i <<
"\">" << m.
keyBoneLookup[i] <<
"</KeyBoneLookup>" << endl;
4620 out <<
" </KeyBoneLookups>" << endl;
4622 out <<
" </SkeletonAndAnimation>" << endl;
4624 out <<
" <GeometryAndRendering>" << endl;
4633 out <<
" </Vertices>" << endl;
4634 out <<
" <Views>" << endl;
4645 out <<
" <RenderPasses size=\"" << m.
passes.size() <<
"\">" << endl;
4646 for (
size_t i = 0; i < m.
passes.size(); i++)
4648 out <<
" <RenderPass id=\"" << i <<
"\">" << endl;
4651 out <<
" <indexStart>" << geoset->
istart <<
"</indexStart>" << endl;
4652 out <<
" <indexCount>" << geoset->
icount <<
"</indexCount>" << endl;
4653 out <<
" <vertexStart>" << geoset->
vstart <<
"</vertexStart>" << endl;
4654 out <<
" <vertexEnd>" << geoset->
vstart + geoset->
vcount <<
"</vertexEnd>" << endl;
4655 out <<
" <tex>" << p->
tex <<
"</tex>" << endl;
4658 out <<
" <useTex2>" << p->
useTex2 <<
"</useTex2>" << endl;
4659 out <<
" <useEnvMap>" << p->
useEnvMap <<
"</useEnvMap>" << endl;
4660 out <<
" <cull>" << p->
cull <<
"</cull>" << endl;
4661 out <<
" <trans>" << p->
trans <<
"</trans>" << endl;
4662 out <<
" <unlit>" << p->
unlit <<
"</unlit>" << endl;
4663 out <<
" <noZWrite>" << p->
noZWrite <<
"</noZWrite>" << endl;
4664 out <<
" <billboard>" << p->
billboard <<
"</billboard>" << endl;
4665 out <<
" <texanim>" << p->
texanim <<
"</texanim>" << endl;
4666 out <<
" <color>" << p->
color <<
"</color>" << endl;
4667 out <<
" <opacity>" << p->
opacity <<
"</opacity>" << endl;
4668 out <<
" <blendmode>" << p->
blendmode <<
"</blendmode>" << endl;
4669 out <<
" <geoset>" << geoset->
id <<
"</geoset>" << endl;
4670 out <<
" <swrap>" << p->
swrap <<
"</swrap>" << endl;
4671 out <<
" <twrap>" << p->
twrap <<
"</twrap>" << endl;
4672 out <<
" <ocol>" << p->
ocol.x <<
" " << p->
ocol.y <<
" " << p->
ocol.z <<
" " << p->
ocol.w <<
"</ocol>" <<
4674 out <<
" <ecol>" << p->
ecol.x <<
" " << p->
ecol.y <<
" " << p->
ecol.z <<
" " << p->
ecol.w <<
"</ecol>" <<
4676 out <<
" </RenderPass>" << endl;
4678 out <<
" </RenderPasses>" << endl;
4680 out <<
" <Geosets size=\"" << m.
geosets.size() <<
"\">" << endl;
4681 for (
size_t i = 0; i < m.
geosets.size(); i++)
4683 out <<
" <Geoset id=\"" << i <<
"\">" << endl;
4684 out <<
" <id>" << m.
geosets[i]->id <<
"</id>" << endl;
4685 out <<
" <vstart>" << m.
geosets[i]->vstart <<
"</vstart>" << endl;
4686 out <<
" <vcount>" << m.
geosets[i]->vcount <<
"</vcount>" << endl;
4687 out <<
" <istart>" << m.
geosets[i]->istart <<
"</istart>" << endl;
4688 out <<
" <icount>" << m.
geosets[i]->icount <<
"</icount>" << endl;
4689 out <<
" <nSkinnedBones>" << m.
geosets[i]->nSkinnedBones <<
"</nSkinnedBones>" << endl;
4690 out <<
" <StartBones>" << m.
geosets[i]->StartBones <<
"</StartBones>" << endl;
4691 out <<
" <rootBone>" << m.
geosets[i]->rootBone <<
"</rootBone>" << endl;
4692 out <<
" <nBones>" << m.
geosets[i]->nBones <<
"</nBones>" << endl;
4693 out <<
" <BoundingBox>" << m.
geosets[i]->BoundingBox[0].x <<
" " << m.
geosets[i]->BoundingBox[0].y <<
" "
4694 << m.
geosets[i]->BoundingBox[0].z <<
"</BoundingBox>" << endl;
4695 out <<
" <BoundingBox>" << m.
geosets[i]->BoundingBox[1].x <<
" " << m.
geosets[i]->BoundingBox[1].y <<
" "
4696 << m.
geosets[i]->BoundingBox[1].z <<
"</BoundingBox>" << endl;
4697 out <<
" <radius>" << m.
geosets[i]->radius <<
"</radius>" << endl;
4698 out <<
" </Geoset>" << endl;
4700 out <<
" </Geosets>" << endl;
4722 out <<
" </Views>" << endl;
4724 out <<
" <RenderFlags></RenderFlags>" << endl;
4726 out <<
" <Colors size=\"" << m.
colors.size() <<
"\">" << endl;
4729 out <<
" <Color id=\"" << i <<
"\">" << endl;
4731 out <<
" <color>" << endl;
4732 out << m.
colors[i].color;
4733 out <<
" </color>" << endl;
4735 out <<
" <opacity>" << endl;
4736 out << m.
colors[i].opacity;
4737 out <<
" </opacity>" << endl;
4738 out <<
" </Color>" << endl;
4740 out <<
" </Colors>" << endl;
4742 out <<
" <Transparency size=\"" << m.
transparency.size() <<
"\">" << endl;
4745 out <<
" <Tran id=\"" << i <<
"\">" << endl;
4747 out <<
" <trans>" << endl;
4749 out <<
" </trans>" << endl;
4750 out <<
" </Tran>" << endl;
4752 out <<
" </Transparency>" << endl;
4754 out <<
" <TransparencyLookup></TransparencyLookup>" << endl;
4777 out <<
" <ReplacableTextureLookup></ReplacableTextureLookup>" << endl;
4779 out <<
" </GeometryAndRendering>" << endl;
4781 out <<
" <Effects>" << endl;
4783 out <<
" <TexAnims size=\"" << m.
texAnims.size() <<
"\">" << endl;
4786 out <<
" <TexAnim id=\"" << i <<
"\">" << endl;
4788 out <<
" <trans>" << endl;
4790 out <<
" </trans>" << endl;
4792 out <<
" <rot>" << endl;
4794 out <<
" </rot>" << endl;
4796 out <<
" <scale>" << endl;
4798 out <<
" </scale>" << endl;
4799 out <<
" </TexAnim>" << endl;
4801 out <<
" </TexAnims>" << endl;
4803 out <<
" <RibbonEmitters></RibbonEmitters>" << endl;
4808 out <<
" <Particle id=\"" << i <<
"\">" << endl;
4810 out <<
" </Particle>" << endl;
4812 out <<
" </Particles>" << endl;
4814 out <<
" </Effects>" << endl;
4816 out <<
" <Miscellaneous>" << endl;
4818 out <<
" <BoundingVolumes></BoundingVolumes>" << endl;
4819 out <<
" <Lights></Lights>" << endl;
4820 out <<
" <Cameras></Cameras>" << endl;
4825 out <<
" <Attachment id=\"" << i <<
"\">" << endl;
4826 out <<
" <id>" << m.
atts[i].id <<
"</id>" << endl;
4827 out <<
" <bone>" << m.
atts[i].bone <<
"</bone>" << endl;
4828 out <<
" <pos>" << m.
atts[i].pos.x <<
" " << m.
atts[i].pos.y <<
" " << m.
atts[i].pos.z <<
"</pos>" << endl;
4829 out <<
" </Attachment>" << endl;
4831 out <<
" </Attachments>" << endl;
4840 out <<
" <Events size=\"" << m.
events.size() <<
"\">" << endl;
4841 for (
size_t i = 0; i < m.
events.size(); i++)
4843 out <<
" <Event id=\"" << i <<
"\">" << endl;
4845 out <<
" </Event>" << endl;
4847 out <<
" </Events>" << endl;
4849 out <<
" </Miscellaneous>" << endl;
4852 out <<
" <TextureLists>" << endl;
4853 for (
const auto it : m.
passes)
4857 out <<
" <TextureList id=\"" << tex <<
"\">" <<
TEXTUREMANAGER.
get(tex) <<
"</TextureList>"
4860 out <<
" </TextureLists>" << endl;
4862 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.