From d15eaffa73f2754ae24cc3bd7910660bcd619587 Mon Sep 17 00:00:00 2001 From: false_genesis Date: Sun, 19 Jul 2009 23:03:53 +0000 Subject: [PATCH] * upgrade to 3.1.3.9947. patch by bLuma, thx!! * unload WMOs when unloading map tile * removed silly old chat AI * misc stuff & cleanups --- bin/conf/PseuWoW.conf.default | 4 - src/Client/GUI/CWMOMeshFileLoader.cpp | 668 +++---- src/Client/GUI/CWMOMeshFileLoader.h | 264 +-- src/Client/GUI/SSkinnedMesh.h | 26 +- src/Client/GUI/SceneWorld.cpp | 1 + src/Client/PseuWoW.cpp | 1 - src/Client/PseuWoW.h | 1 - src/Client/World/CacheHandler.cpp | 30 +- src/Client/World/GameObject.h | 82 +- src/Client/World/Item.cpp | 20 +- src/Client/World/Item.h | 3 + src/Client/World/Opcodes.cpp | 2431 ++++++++++++----------- src/Client/World/Opcodes.h | 80 +- src/Client/World/Unit.h | 5 + src/Client/World/UpdateData.cpp | 65 +- src/Client/World/UpdateData.h | 20 +- src/Client/World/UpdateFields.h | 447 ++--- src/Client/World/WorldSession.cpp | 130 +- src/Client/World/WorldSocket.cpp | 28 +- src/Client/World/WorldSocket.h | 2 + src/PseuWoW.vcproj | 6 + src/PseuWoW_VC90.vcproj | 6 +- src/shared.vcproj | 6 + src/shared/Auth/AuthCrypt.cpp | 102 +- src/shared/Auth/AuthCrypt.h | 26 +- src/shared/Auth/Hmac.cpp | 31 +- src/shared/Auth/Hmac.h | 19 +- src/shared/Auth/Makefile.am | 2 +- src/shared/Auth/SARC4.cpp | 52 + src/shared/Auth/SARC4.h | 36 + src/shared_VC90.vcproj | 8 + src/tools/stuffextract/StuffExtract.cpp | 2 +- 32 files changed, 2396 insertions(+), 2208 deletions(-) create mode 100644 src/shared/Auth/SARC4.cpp create mode 100644 src/shared/Auth/SARC4.h diff --git a/bin/conf/PseuWoW.conf.default b/bin/conf/PseuWoW.conf.default index 3f10294..f56a938 100644 --- a/bin/conf/PseuWoW.conf.default +++ b/bin/conf/PseuWoW.conf.default @@ -92,10 +92,6 @@ allowgamecmd=0 // enable this if you plan to enter commands on the console enablecli=1 -// enable's chat ai which makes you bot respond to simple senteces -// like "Hi" and "What do you think of x" etc. -enablechatai=0 - // show ping responses notifyping=0 diff --git a/src/Client/GUI/CWMOMeshFileLoader.cpp b/src/Client/GUI/CWMOMeshFileLoader.cpp index f7e68e4..9ebd8c3 100644 --- a/src/Client/GUI/CWMOMeshFileLoader.cpp +++ b/src/Client/GUI/CWMOMeshFileLoader.cpp @@ -1,334 +1,334 @@ -#include -#include -#include "MemoryDataHolder.h" -#include "MemoryInterface.h" -#include "CWMOMeshFileLoader.h" -#include "SSkinnedMesh.h" -#include "common.h" - -inline void flipcc(irr::u8 *fcc) -{ - char t; - t=fcc[0]; - fcc[0]=fcc[3]; - fcc[3]=t; - t=fcc[1]; - fcc[1]=fcc[2]; - fcc[2]=t; -} - - - -namespace irr -{ -namespace scene -{ - -CWMOMeshFileLoader::CWMOMeshFileLoader(IrrlichtDevice* device, c8* texdir):Device(device), Texdir(texdir) -{ - Mesh = NULL; - -} - -CWMOMeshFileLoader::~CWMOMeshFileLoader() -{ - -} - - -bool CWMOMeshFileLoader::isALoadableFileExtension(const c8* filename)const -{ - return strstr(filename, ".wmo")!=0; -} - - -//! creates/loads an animated mesh from the file. -//! \return Pointer to the created mesh. Returns 0 if loading failed. -//! If you no longer need the mesh, you should call IAnimatedMesh::drop(). -//! See IUnknown::drop() for more information. -IAnimatedMesh* CWMOMeshFileLoader::createMesh(io::IReadFile* file) -{ - if(!file) - return 0; - MeshFile = file; - std::string filename=MeshFile->getFileName(); - Mesh = new scene::CSkinnedMesh(); - - if ( load(true) )//We try loading a root file first! - { - for(u32 i=0;irecalculateBoundingBox(); - Device->getSceneManager()->getMeshManipulator()->flipSurfaces(Mesh); //Fix inverted surfaces after the rotation - //Does this crash on windows? - Device->getSceneManager()->getMeshManipulator()->recalculateNormals(Mesh,true);//just to be sure - logdebug("Complete Mesh contains a total of %u submeshes!",Mesh->getMeshBufferCount()); - } - else - { - Mesh->drop(); - Mesh = 0; - } - - return Mesh; -} -bool CWMOMeshFileLoader::load(bool _root) -{ - bool isRootFile = _root; - u8 _cc[5]; - u8 *fourcc = &_cc[0]; - fourcc[4]=0; - u32 size; - u32 textureOffset; - -logdebug("Trying to open file %s",MeshFile->getFileName()); - -while(MeshFile->getPos() < MeshFile->getSize()) -{ -printf("position 0x%lX ",MeshFile->getPos()); -MeshFile->read(fourcc,4); -MeshFile->read(&size,4); -flipcc(fourcc); -printf("Reading Chunk: %s size %u\n", (char*)fourcc,size); - - if(!strcmp((char*)fourcc,"MVER")){ - logdebug("MVER Chunk: %s",(char*)fourcc); - MeshFile->seek(size,true); - } - - //Start root file parsing - else if(!strcmp((char*)fourcc,"MOHD")){ - MeshFile->read(&rootHeader,sizeof(RootHeader)); - logdebug("Read Root Header: %u Textures, %u Groups, %u Models", rootHeader.nTextures, rootHeader.nGroups, rootHeader.nModels); - if(!isRootFile)//We should be reading a group file and found a root header, abort - return 0; - } - else if(!strcmp((char*)fourcc,"MOTX")){ - textureOffset=MeshFile->getPos(); - MeshFile->seek(size,true); - } - else if(!strcmp((char*)fourcc,"MOMT")){ - if(WMOMTexDefinition.size()>0) - WMOMTexDefinition.clear(); - - MOMT_Data tempMOMT; - for(u32 i =0;i<(size/sizeof(MOMT_Data));i++) - { - MeshFile->read(&tempMOMT,sizeof(MOMT_Data)); - WMOMTexDefinition.push_back(tempMOMT); - } - logdebug("Read %u/%u TextureDefinitions",WMOMTexDefinition.size(),(size/sizeof(MOMT_Data))); - - u32 tempOffset = MeshFile->getPos();//Save current position for further reading until texture file names are read. - - if(WMOMTextureFiles.size()>0) - WMOMTextureFiles.clear(); - std::string tempTexName; - u32 texNameSize; - - for(u32 i =0;iseek(textureOffset+WMOMTexDefinition[i].startNameIndex); - MeshFile->read((void*)tempTexName.c_str(),WMOMTexDefinition[i].endNameIndex-WMOMTexDefinition[i].startNameIndex); - logdebug("Texture %u: %s",i,tempTexName.c_str()); - WMOMTextureFiles.push_back(tempTexName.c_str()); - } - - MeshFile->seek(tempOffset); - } - - - - //Start Group file parsing - else if(!strcmp((char*)fourcc,"MOGP")){ - logdebug("header okay: %s",(char*)fourcc); - MeshFile->seek(68,true); - if(isRootFile)//We should be reading a root file and found a Group header, abort - return 0; - } - else if(!strcmp((char*)fourcc,"MOPY")){//Texturing information (1 per triangle); - if(WMOMTexData.size()>0) - WMOMTexData.clear(); - submeshes.clear();//Saves last vertex of submes - u16 previous_texid=999;//outside u8 space - MOPY_Data tempMOPY; - for(u32 i =0;i<(size/sizeof(MOPY_Data));i++) - { - MeshFile->read(&tempMOPY,sizeof(MOPY_Data)); - if(previous_texid==999) - previous_texid=tempMOPY.textureID;//Initialize - WMOMTexData.push_back(tempMOPY); - if(previous_texid!=tempMOPY.textureID) - submeshes.push_back(i); - previous_texid=tempMOPY.textureID; - } - submeshes.push_back(WMOMTexData.size()-1);//last read entry - logdebug("Read %u/%u Texture Informations, counted %u submeshes",WMOMTexData.size(),(size/sizeof(MOPY_Data)),submeshes.size()); - - } - else if(!strcmp((char*)fourcc,"MOVI")){//Vertex indices (3 per triangle) - if(WMOMIndices.size()>0) - WMOMIndices.clear(); - - u16 tempWMOIndex; - for(u32 i =0;i<(size/sizeof(u16));i++) - { - MeshFile->read(&tempWMOIndex,sizeof(u16)); - WMOMIndices.push_back(tempWMOIndex); - } - logdebug("Read %u/%u Indices",WMOMIndices.size(),(size/sizeof(u16))); - - } - else if(!strcmp((char*)fourcc,"MOVT")){//Vertex coordinates - if(WMOMVertices.size()>0) - WMOMVertices.clear(); - - core::vector3df tempWMOVertex; - float tempYZ; - for(u32 i =0;i<(size/sizeof(core::vector3df));i++) - { - MeshFile->read(&tempWMOVertex,sizeof(core::vector3df)); - tempYZ = tempWMOVertex.Y; - tempWMOVertex.Y=tempWMOVertex.Z; - tempWMOVertex.Z=tempYZ; - WMOMVertices.push_back(tempWMOVertex); - } - logdebug("Read %u/%u Vertex Coordinates",WMOMVertices.size(),(size/sizeof(core::vector3df))); - - } - else if(!strcmp((char*)fourcc,"MONR")){//Normals - if(WMOMNormals.size()>0) - WMOMNormals.clear(); - - core::vector3df tempWMONormal; - float tempYZ; - for(u32 i =0;i<(size/sizeof(core::vector3df));i++) - { - MeshFile->read(&tempWMONormal,sizeof(core::vector3df)); - tempYZ = tempWMONormal.Y; - tempWMONormal.Y=tempWMONormal.Z; - tempWMONormal.Z=tempYZ; - WMOMNormals.push_back(tempWMONormal); - } - logdebug("Read %u/%u Normal Coordinates",WMOMNormals.size(),(size/sizeof(core::vector3df))); - - } - else if(!strcmp((char*)fourcc,"MOTV")){//TexCoord - if(WMOMTexcoord.size()>0) - WMOMTexcoord.clear(); - - core::vector2df tempWMOMTexcoord; - for(u32 i =0;i<(size/sizeof(core::vector2df));i++) - { - MeshFile->read(&tempWMOMTexcoord,sizeof(core::vector2df)); - WMOMTexcoord.push_back(tempWMOMTexcoord); - } - logdebug("Read %u/%u Texture Coordinates",WMOMTexcoord.size(),(size/sizeof(core::vector2df))); - - } - else if(!strcmp((char*)fourcc,"MOCV")){//Vertex colors!! Scaaaary! - if(WMOMVertexColor.size()>0) - WMOMVertexColor.clear(); - - WMOColor tempWMOMVertexColor; - - for(u32 i =0;i<(size/sizeof(WMOColor));i++) - { - MeshFile->read(&tempWMOMVertexColor,sizeof(WMOColor)); - WMOMVertexColor.push_back(video::SColor(tempWMOMVertexColor.a,tempWMOMVertexColor.r,tempWMOMVertexColor.g,tempWMOMVertexColor.b)); - } - logdebug("Read %u/%u Vertex colors",WMOMVertexColor.size(),(size/sizeof(WMOColor))); - - } - //End Group file parsing - - - else - MeshFile->seek(size,true);//Skip Chunk -} - -if(!isRootFile)//If we just read a group file, add a mesh buffer to the main Mesh -{ -if(WMOVertices.size()>0) - WMOVertices.clear(); - -for(u32 i=0;icreateBuffer(); - - //Put the Indices and Vertices of the Submesh into a mesh buffer - for(u32 j=lastindex;jIndices.push_back(WMOMIndices[j*3]); - MeshBuffer->Indices.push_back(WMOMIndices[j*3+1]); - MeshBuffer->Indices.push_back(WMOMIndices[j*3+2]); - } - } - logdebug("Inserted %u Indices/n",MeshBuffer->Indices.size()); - - for(u32 j=0;jVertices_Standard.push_back(WMOVertices[j]); - } - - logdebug("Inserted %u Vertices/n",MeshBuffer->Vertices_Standard.size()); - - std::string TexName=Texdir.c_str(); - TexName+="/"; - TexName+=WMOMTextureFiles[WMOMTexData[lastindex].textureID].c_str(); - while(TexName.find('\\')getMaterial().setTexture(0,Device->getVideoDriver()->getTexture(TexName.c_str())); - if(WMOMTexDefinition[WMOMTexData[lastindex].textureID].blendMode==1) - MeshBuffer->getMaterial().MaterialType=video::EMT_TRANSPARENT_ALPHA_CHANNEL; - MeshBuffer->recalculateBoundingBox(); - } - lastindex=submeshes[i]; - -} - -WMOMIndices.clear(); -WMOMVertices.clear(); -WMOMNormals.clear(); -WMOMTexcoord.clear(); -WMOMVertexColor.clear(); - -WMOVertices.clear(); -} -return true; - -} - -} -} +#include +#include +#include "MemoryDataHolder.h" +#include "MemoryInterface.h" +#include "CWMOMeshFileLoader.h" +#include "SSkinnedMesh.h" +#include "common.h" + +inline void flipcc(irr::u8 *fcc) +{ + char t; + t=fcc[0]; + fcc[0]=fcc[3]; + fcc[3]=t; + t=fcc[1]; + fcc[1]=fcc[2]; + fcc[2]=t; +} + + + +namespace irr +{ +namespace scene +{ + +CWMOMeshFileLoader::CWMOMeshFileLoader(IrrlichtDevice* device, c8* texdir):Device(device), Texdir(texdir) +{ + Mesh = NULL; + +} + +CWMOMeshFileLoader::~CWMOMeshFileLoader() +{ + +} + + +bool CWMOMeshFileLoader::isALoadableFileExtension(const c8* filename)const +{ + return strstr(filename, ".wmo")!=0; +} + + +//! creates/loads an animated mesh from the file. +//! \return Pointer to the created mesh. Returns 0 if loading failed. +//! If you no longer need the mesh, you should call IAnimatedMesh::drop(). +//! See IUnknown::drop() for more information. +IAnimatedMesh* CWMOMeshFileLoader::createMesh(io::IReadFile* file) +{ + if(!file) + return 0; + MeshFile = file; + std::string filename=MeshFile->getFileName(); + Mesh = new scene::CSkinnedMesh(); + + if ( load(true) )//We try loading a root file first! + { + for(u32 i=0;irecalculateBoundingBox(); + Device->getSceneManager()->getMeshManipulator()->flipSurfaces(Mesh); //Fix inverted surfaces after the rotation + //Does this crash on windows? + Device->getSceneManager()->getMeshManipulator()->recalculateNormals(Mesh,true);//just to be sure + logdebug("Complete Mesh contains a total of %u submeshes!",Mesh->getMeshBufferCount()); + } + else + { + Mesh->drop(); + Mesh = 0; + } + + return Mesh; +} +bool CWMOMeshFileLoader::load(bool _root) +{ + bool isRootFile = _root; + u8 _cc[5]; + u8 *fourcc = &_cc[0]; + fourcc[4]=0; + u32 size; + u32 textureOffset; + +logdebug("Trying to open file %s",MeshFile->getFileName()); + +while(MeshFile->getPos() < MeshFile->getSize()) +{ +printf("position 0x%lX ",MeshFile->getPos()); +MeshFile->read(fourcc,4); +MeshFile->read(&size,4); +flipcc(fourcc); +printf("Reading Chunk: %s size %u\n", (char*)fourcc,size); + + if(!strcmp((char*)fourcc,"MVER")){ + logdebug("MVER Chunk: %s",(char*)fourcc); + MeshFile->seek(size,true); + } + + //Start root file parsing + else if(!strcmp((char*)fourcc,"MOHD")){ + MeshFile->read(&rootHeader,sizeof(RootHeader)); + logdebug("Read Root Header: %u Textures, %u Groups, %u Models", rootHeader.nTextures, rootHeader.nGroups, rootHeader.nModels); + if(!isRootFile)//We should be reading a group file and found a root header, abort + return 0; + } + else if(!strcmp((char*)fourcc,"MOTX")){ + textureOffset=MeshFile->getPos(); + MeshFile->seek(size,true); + } + else if(!strcmp((char*)fourcc,"MOMT")){ + if(WMOMTexDefinition.size()>0) + WMOMTexDefinition.clear(); + + MOMT_Data tempMOMT; + for(u32 i =0;i<(size/sizeof(MOMT_Data));i++) + { + MeshFile->read(&tempMOMT,sizeof(MOMT_Data)); + WMOMTexDefinition.push_back(tempMOMT); + } + logdebug("Read %u/%u TextureDefinitions",WMOMTexDefinition.size(),(size/sizeof(MOMT_Data))); + + u32 tempOffset = MeshFile->getPos();//Save current position for further reading until texture file names are read. + + if(WMOMTextureFiles.size()>0) + WMOMTextureFiles.clear(); + std::string tempTexName; + u32 texNameSize; + + for(u32 i =0;iseek(textureOffset+WMOMTexDefinition[i].startNameIndex); + MeshFile->read((void*)tempTexName.c_str(),WMOMTexDefinition[i].endNameIndex-WMOMTexDefinition[i].startNameIndex); + logdebug("Texture %u: %s",i,tempTexName.c_str()); + WMOMTextureFiles.push_back(tempTexName.c_str()); + } + + MeshFile->seek(tempOffset); + } + + + + //Start Group file parsing + else if(!strcmp((char*)fourcc,"MOGP")){ + logdebug("header okay: %s",(char*)fourcc); + MeshFile->seek(68,true); + if(isRootFile)//We should be reading a root file and found a Group header, abort + return 0; + } + else if(!strcmp((char*)fourcc,"MOPY")){//Texturing information (1 per triangle); + if(WMOMTexData.size()>0) + WMOMTexData.clear(); + submeshes.clear();//Saves last vertex of submes + u16 previous_texid=999;//outside u8 space + MOPY_Data tempMOPY; + for(u32 i =0;i<(size/sizeof(MOPY_Data));i++) + { + MeshFile->read(&tempMOPY,sizeof(MOPY_Data)); + if(previous_texid==999) + previous_texid=tempMOPY.textureID;//Initialize + WMOMTexData.push_back(tempMOPY); + if(previous_texid!=tempMOPY.textureID) + submeshes.push_back(i); + previous_texid=tempMOPY.textureID; + } + submeshes.push_back(WMOMTexData.size()-1);//last read entry + logdebug("Read %u/%u Texture Informations, counted %u submeshes",WMOMTexData.size(),(size/sizeof(MOPY_Data)),submeshes.size()); + + } + else if(!strcmp((char*)fourcc,"MOVI")){//Vertex indices (3 per triangle) + if(WMOMIndices.size()>0) + WMOMIndices.clear(); + + u16 tempWMOIndex; + for(u32 i =0;i<(size/sizeof(u16));i++) + { + MeshFile->read(&tempWMOIndex,sizeof(u16)); + WMOMIndices.push_back(tempWMOIndex); + } + logdebug("Read %u/%u Indices",WMOMIndices.size(),(size/sizeof(u16))); + + } + else if(!strcmp((char*)fourcc,"MOVT")){//Vertex coordinates + if(WMOMVertices.size()>0) + WMOMVertices.clear(); + + core::vector3df tempWMOVertex; + float tempYZ; + for(u32 i =0;i<(size/sizeof(core::vector3df));i++) + { + MeshFile->read(&tempWMOVertex,sizeof(core::vector3df)); + tempYZ = tempWMOVertex.Y; + tempWMOVertex.Y=tempWMOVertex.Z; + tempWMOVertex.Z=tempYZ; + WMOMVertices.push_back(tempWMOVertex); + } + logdebug("Read %u/%u Vertex Coordinates",WMOMVertices.size(),(size/sizeof(core::vector3df))); + + } + else if(!strcmp((char*)fourcc,"MONR")){//Normals + if(WMOMNormals.size()>0) + WMOMNormals.clear(); + + core::vector3df tempWMONormal; + float tempYZ; + for(u32 i =0;i<(size/sizeof(core::vector3df));i++) + { + MeshFile->read(&tempWMONormal,sizeof(core::vector3df)); + tempYZ = tempWMONormal.Y; + tempWMONormal.Y=tempWMONormal.Z; + tempWMONormal.Z=tempYZ; + WMOMNormals.push_back(tempWMONormal); + } + logdebug("Read %u/%u Normal Coordinates",WMOMNormals.size(),(size/sizeof(core::vector3df))); + + } + else if(!strcmp((char*)fourcc,"MOTV")){//TexCoord + if(WMOMTexcoord.size()>0) + WMOMTexcoord.clear(); + + core::vector2df tempWMOMTexcoord; + for(u32 i =0;i<(size/sizeof(core::vector2df));i++) + { + MeshFile->read(&tempWMOMTexcoord,sizeof(core::vector2df)); + WMOMTexcoord.push_back(tempWMOMTexcoord); + } + logdebug("Read %u/%u Texture Coordinates",WMOMTexcoord.size(),(size/sizeof(core::vector2df))); + + } + else if(!strcmp((char*)fourcc,"MOCV")){//Vertex colors!! Scaaaary! + if(WMOMVertexColor.size()>0) + WMOMVertexColor.clear(); + + WMOColor tempWMOMVertexColor; + + for(u32 i =0;i<(size/sizeof(WMOColor));i++) + { + MeshFile->read(&tempWMOMVertexColor,sizeof(WMOColor)); + WMOMVertexColor.push_back(video::SColor(tempWMOMVertexColor.a,tempWMOMVertexColor.r,tempWMOMVertexColor.g,tempWMOMVertexColor.b)); + } + logdebug("Read %u/%u Vertex colors",WMOMVertexColor.size(),(size/sizeof(WMOColor))); + + } + //End Group file parsing + + + else + MeshFile->seek(size,true);//Skip Chunk +} + +if(!isRootFile)//If we just read a group file, add a mesh buffer to the main Mesh +{ +if(WMOVertices.size()>0) + WMOVertices.clear(); + +for(u32 i=0;icreateBuffer(); + + //Put the Indices and Vertices of the Submesh into a mesh buffer + for(u32 j=lastindex;jIndices.push_back(WMOMIndices[j*3]); + MeshBuffer->Indices.push_back(WMOMIndices[j*3+1]); + MeshBuffer->Indices.push_back(WMOMIndices[j*3+2]); + } + } + logdebug("Inserted %u Indices/n",MeshBuffer->Indices.size()); + + for(u32 j=0;jVertices_Standard.push_back(WMOVertices[j]); + } + + logdebug("Inserted %u Vertices/n",MeshBuffer->Vertices_Standard.size()); + + std::string TexName=Texdir.c_str(); + TexName+="/"; + TexName+=WMOMTextureFiles[WMOMTexData[lastindex].textureID].c_str(); + while(TexName.find('\\')getMaterial().setTexture(0,Device->getVideoDriver()->getTexture(TexName.c_str())); + if(WMOMTexDefinition[WMOMTexData[lastindex].textureID].blendMode==1) + MeshBuffer->getMaterial().MaterialType=video::EMT_TRANSPARENT_ALPHA_CHANNEL; + MeshBuffer->recalculateBoundingBox(); + } + lastindex=submeshes[i]; + +} + +WMOMIndices.clear(); +WMOMVertices.clear(); +WMOMNormals.clear(); +WMOMTexcoord.clear(); +WMOMVertexColor.clear(); + +WMOVertices.clear(); +} +return true; + +} + +} +} diff --git a/src/Client/GUI/CWMOMeshFileLoader.h b/src/Client/GUI/CWMOMeshFileLoader.h index 9f61bb0..cfb0605 100644 --- a/src/Client/GUI/CWMOMeshFileLoader.h +++ b/src/Client/GUI/CWMOMeshFileLoader.h @@ -1,132 +1,132 @@ -#include "irrlicht/irrlicht.h" -#include "irrlicht/IMeshLoader.h" -#include "SSkinnedMesh.h" -#include -#include -#include - -namespace irr -{ -namespace scene -{ - -struct RootHeader { -/*000h*/ u32 nTextures; -/*004h*/ u32 nGroups; -/*008h*/ u32 nPortals; -/*00Ch*/ u32 nLights; -/*010h*/ u32 nModels; -/*014h*/ u32 nDoodads; -/*018h*/ u32 nSets; -/*01Ch*/ u8 colR; -/*01Dh*/ u8 colG; -/*01Eh*/ u8 colB; -/*01Fh*/ u8 colX; -/*020h*/ u32 wmoID; -/*024h*/ float bb1[3]; -/*030h*/ float bb2[3]; -/*03Ch*/ u32 nullish; -}; -struct WMOColor{ - u8 b,g,r,a; - -}; -struct MOPY_Data{ - u8 flags,textureID; - -}; -struct MOMT_Data{ -/*000h*/ u32 flags1; -/*004h*/ u32 flags2; -/*008h*/ u32 blendMode; -/*00Ch*/ u32 startNameIndex; -/*010h*/ u32 color; -/*014h*/ u32 unk1; -/*018h*/ u32 endNameIndex; -/*01Ch*/ u32 frameSidnColor[3]; -/*020h*/ -/*024h*/ -/*028h*/ u32 envNameIndex; -/*02Ch*/ float diffColor[3]; -/*030h*/ -/*034h*/ -/*038h*/ u32 groundType; -/*03Ch*/ u32 hMaps; - -}; - - -class CWMOMeshFileLoader : public IMeshLoader -{ -public: - - //! Constructor - CWMOMeshFileLoader(IrrlichtDevice* device, c8* texdir); - - //! destructor - virtual ~CWMOMeshFileLoader(); - - //! returns true if the file maybe is able to be loaded by this class - //! based on the file extension (e.g. ".cob") - virtual bool isALoadableFileExtension(const c8* fileName)const; - - //! creates/loads an animated mesh from the file. - //! \return Pointer to the created mesh. Returns 0 if loading failed. - //! If you no longer need the mesh, you should call IAnimatedMesh::drop(). - //! See IUnknown::drop() for more information. - virtual scene::IAnimatedMesh* createMesh(io::IReadFile* file); -private: - - bool load(bool _root); - - IrrlichtDevice* Device; - core::stringc Texdir; - io::IReadFile* MeshFile; - - CSkinnedMesh* Mesh; - - -//Stuff from root file - RootHeader rootHeader; - core::array WMOMTexDefinition; - core::array WMOMTextureFiles; - - -//Stuff from group file - core::array WMOMIndices; - core::array WMOMVertices; - core::array WMOMNormals; - core::array WMOMTexcoord; - core::array WMOMVertexColor; - core::array WMOMTexData; - core::array submeshes; - - core::array WMOVertices; - SSkinMeshBuffer* MeshBuffer; -/* - ModelHeader header; - core::stringc WMOMeshName; - SMesh* Mesh; - // - //Taken from the Model file, thus m2M* - core::array WMOMVertices; - core::array WMOMViews; - core::array WMOMIndices; - core::array WMOMTriangles; - core::array WMOMSubmeshes; - core::array WMOMTextureLookup; - core::array WMOMTextureDef; - core::array WMOMTextureFiles; - core::array WMOMTextureUnit; - core::array WMOMRenderFlags; - core::array WMOMAnimations; - core::array WMOMBones; - //Used for the Mesh, thus m2_noM_* - core::array WMOVertices; - core::array WMOIndices; - core::array WMOJoints; -*/ - -}; -}//namespace scene -}//namespace irr +#include "irrlicht/irrlicht.h" +#include "irrlicht/IMeshLoader.h" +#include "SSkinnedMesh.h" +#include +#include +#include + +namespace irr +{ +namespace scene +{ + +struct RootHeader { +/*000h*/ u32 nTextures; +/*004h*/ u32 nGroups; +/*008h*/ u32 nPortals; +/*00Ch*/ u32 nLights; +/*010h*/ u32 nModels; +/*014h*/ u32 nDoodads; +/*018h*/ u32 nSets; +/*01Ch*/ u8 colR; +/*01Dh*/ u8 colG; +/*01Eh*/ u8 colB; +/*01Fh*/ u8 colX; +/*020h*/ u32 wmoID; +/*024h*/ float bb1[3]; +/*030h*/ float bb2[3]; +/*03Ch*/ u32 nullish; +}; +struct WMOColor{ + u8 b,g,r,a; + +}; +struct MOPY_Data{ + u8 flags,textureID; + +}; +struct MOMT_Data{ +/*000h*/ u32 flags1; +/*004h*/ u32 flags2; +/*008h*/ u32 blendMode; +/*00Ch*/ u32 startNameIndex; +/*010h*/ u32 color; +/*014h*/ u32 unk1; +/*018h*/ u32 endNameIndex; +/*01Ch*/ u32 frameSidnColor[3]; +/*020h*/ +/*024h*/ +/*028h*/ u32 envNameIndex; +/*02Ch*/ float diffColor[3]; +/*030h*/ +/*034h*/ +/*038h*/ u32 groundType; +/*03Ch*/ u32 hMaps; + +}; + + +class CWMOMeshFileLoader : public IMeshLoader +{ +public: + + //! Constructor + CWMOMeshFileLoader(IrrlichtDevice* device, c8* texdir); + + //! destructor + virtual ~CWMOMeshFileLoader(); + + //! returns true if the file maybe is able to be loaded by this class + //! based on the file extension (e.g. ".cob") + virtual bool isALoadableFileExtension(const c8* fileName)const; + + //! creates/loads an animated mesh from the file. + //! \return Pointer to the created mesh. Returns 0 if loading failed. + //! If you no longer need the mesh, you should call IAnimatedMesh::drop(). + //! See IUnknown::drop() for more information. + virtual scene::IAnimatedMesh* createMesh(io::IReadFile* file); +private: + + bool load(bool _root); + + IrrlichtDevice* Device; + core::stringc Texdir; + io::IReadFile* MeshFile; + + CSkinnedMesh* Mesh; + + +//Stuff from root file + RootHeader rootHeader; + core::array WMOMTexDefinition; + core::array WMOMTextureFiles; + + +//Stuff from group file + core::array WMOMIndices; + core::array WMOMVertices; + core::array WMOMNormals; + core::array WMOMTexcoord; + core::array WMOMVertexColor; + core::array WMOMTexData; + core::array submeshes; + + core::array WMOVertices; + SSkinMeshBuffer* MeshBuffer; +/* + ModelHeader header; + core::stringc WMOMeshName; + SMesh* Mesh; + // + //Taken from the Model file, thus m2M* + core::array WMOMVertices; + core::array WMOMViews; + core::array WMOMIndices; + core::array WMOMTriangles; + core::array WMOMSubmeshes; + core::array WMOMTextureLookup; + core::array WMOMTextureDef; + core::array WMOMTextureFiles; + core::array WMOMTextureUnit; + core::array WMOMRenderFlags; + core::array WMOMAnimations; + core::array WMOMBones; + //Used for the Mesh, thus m2_noM_* + core::array WMOVertices; + core::array WMOIndices; + core::array WMOJoints; +*/ + +}; +}//namespace scene +}//namespace irr diff --git a/src/Client/GUI/SSkinnedMesh.h b/src/Client/GUI/SSkinnedMesh.h index 6233ed1..8fb7db7 100755 --- a/src/Client/GUI/SSkinnedMesh.h +++ b/src/Client/GUI/SSkinnedMesh.h @@ -57,19 +57,19 @@ namespace scene //! set user axis aligned bounding box virtual void setBoundingBox( const core::aabbox3df& box); - - //! recalculates the bounding box - void recalculateBoundingBox() - { - if (LocalBuffers.size()) - { - BoundingBox = LocalBuffers[0]->getBoundingBox(); - for (u32 i=1; igetBoundingBox()); - } - else - BoundingBox.reset(0.0f, 0.0f, 0.0f); - } + + //! recalculates the bounding box + void recalculateBoundingBox() + { + if (LocalBuffers.size()) + { + BoundingBox = LocalBuffers[0]->getBoundingBox(); + for (u32 i=1; igetBoundingBox()); + } + else + BoundingBox.reset(0.0f, 0.0f, 0.0f); + } //! sets a flag of all contained materials to a new value virtual void setMaterialFlag(video::E_MATERIAL_FLAG flag, bool newvalue); diff --git a/src/Client/GUI/SceneWorld.cpp b/src/Client/GUI/SceneWorld.cpp index 5e11944..8494bd9 100644 --- a/src/Client/GUI/SceneWorld.cpp +++ b/src/Client/GUI/SceneWorld.cpp @@ -566,6 +566,7 @@ void SceneWorld::UpdateTerrain(void) UpdateMapSceneNodes(_doodads); // drop doodads on maps not loaded anymore. no maptile pointers are dereferenced here, so it can be done before acquiring the mutex UpdateMapSceneNodes(_sound_emitters); // same with sound emitters + UpdateMapSceneNodes(_wmos); mutex.acquire(); // prevent other threads from deleting maptiles diff --git a/src/Client/PseuWoW.cpp b/src/Client/PseuWoW.cpp index dd2b6ca..e76bb94 100644 --- a/src/Client/PseuWoW.cpp +++ b/src/Client/PseuWoW.cpp @@ -504,7 +504,6 @@ void PseuInstanceConf::ApplyFromVarSet(VarSet &v) hideDisabledOpcodes=(bool)atoi(v.Get("HIDEDISABLEDOPCODES").c_str()); enablecli=(bool)atoi(v.Get("ENABLECLI").c_str()); allowgamecmd=(bool)atoi(v.Get("ALLOWGAMECMD").c_str()); - enablechatai=(bool)atoi(v.Get("ENABLECHATAI").c_str()); notifyping=(bool)atoi(v.Get("NOTIFYPING").c_str()); showmyopcodes=(bool)atoi(v.Get("SHOWMYOPCODES").c_str()); disablespellcheck=(bool)atoi(v.Get("DISABLESPELLCHECK").c_str()); diff --git a/src/Client/PseuWoW.h b/src/Client/PseuWoW.h index 92442e8..a15343a 100644 --- a/src/Client/PseuWoW.h +++ b/src/Client/PseuWoW.h @@ -60,7 +60,6 @@ class PseuInstanceConf bool hideDisabledOpcodes; bool allowgamecmd; bool enablecli; - bool enablechatai; bool notifyping; bool showmyopcodes; bool disablespellcheck; diff --git a/src/Client/World/CacheHandler.cpp b/src/Client/World/CacheHandler.cpp index 831b01a..956f6b9 100644 --- a/src/Client/World/CacheHandler.cpp +++ b/src/Client/World/CacheHandler.cpp @@ -11,9 +11,9 @@ #include "Item.h" // increase this number whenever you change something that makes old files unusable -uint32 ITEMPROTOTYPES_CACHE_VERSION = 4; -uint32 CREATURETEMPLATES_CACHE_VERSION = 0; -uint32 GOTEMPLATES_CACHE_VERSION = 0; +uint32 ITEMPROTOTYPES_CACHE_VERSION = 5; +uint32 CREATURETEMPLATES_CACHE_VERSION = 1; +uint32 GOTEMPLATES_CACHE_VERSION = 1; PlayerNameCache::~PlayerNameCache() { @@ -262,6 +262,7 @@ void ItemProtoCache_InsertDataToSession(WorldSession *session) buf >> proto->ArmorDamageModifier; buf >> proto->Duration; buf >> proto->ItemLimitCategory; + buf >> proto->HolidayId; if(proto->Id) { @@ -396,6 +397,7 @@ void ItemProtoCache_WriteDataToCache(WorldSession *session) buf << proto->ArmorDamageModifier; buf << proto->Duration; buf << proto->ItemLimitCategory; + buf << proto->HolidayId; //DEBUG(logdebug("ItemProtoCache: Saved %u [%s]",proto->Id, proto->Name[0].c_str())); uint32 size = buf.size(); @@ -451,12 +453,17 @@ void CreatureTemplateCache_InsertDataToSession(WorldSession *session) buf >> ct->type; buf >> ct->family; buf >> ct->rank; - buf >> ct->SpellDataId; + //buf >> ct->SpellDataId; + for(uint32 i = 0; i < MAX_KILL_CREDIT; i++) + buf >> ct->killCredit[i]; buf >> ct->displayid_A; buf >> ct->displayid_H; buf >> ct->displayid_AF; buf >> ct->displayid_HF; buf >> ct->RacialLeader; + for(uint32 i = 0; i < 4; i++) + buf >> ct->questItems[i]; + buf >> ct->movementId; if(ct->entry) { @@ -506,12 +513,17 @@ void CreatureTemplateCache_WriteDataToCache(WorldSession *session) buf << ct->type; buf << ct->family; buf << ct->rank; - buf << ct->SpellDataId; + //buf << ct->SpellDataId; + for(uint32 i = 0; i < MAX_KILL_CREDIT; i++) + buf << ct->killCredit[i]; buf << ct->displayid_A; buf << ct->displayid_H; buf << ct->displayid_AF; buf << ct->displayid_HF; buf << ct->RacialLeader; + for(uint32 i = 0; i < 4; i++) + buf << ct->questItems[i]; + buf << ct->movementId; uint32 size = buf.size(); fh.write((char*)&size,sizeof(uint32)); @@ -564,11 +576,15 @@ void GOTemplateCache_InsertDataToSession(WorldSession *session) buf >> go->displayId; buf >> go->name; buf >> go->castBarCaption; + buf >> go->unk1; buf >> go->faction; buf >> go->flags; buf >> go->size; for(uint32 i = 0; i < GAMEOBJECT_DATA_FIELDS; i++) buf >> go->raw.data[i]; + buf >> go->size; + for(uint32 i = 0; i < 4; i++) + buf >> go->questItems[i]; if(go->entry) { @@ -616,11 +632,15 @@ void GOTemplateCache_WriteDataToCache(WorldSession *session) buf << go->displayId; buf << go->name; buf << go->castBarCaption; + buf << go->unk1; buf << go->faction; buf << go->flags; buf << go->size; for(uint32 i = 0; i < GAMEOBJECT_DATA_FIELDS; i++) buf << go->raw.data[i]; + buf << go->size; + for(uint32 i = 0; i < 4; i++) + buf << go->questItems[i]; uint32 size = buf.size(); fh.write((char*)&size,sizeof(uint32)); diff --git a/src/Client/World/GameObject.h b/src/Client/World/GameObject.h index 722dff5..c948f5d 100644 --- a/src/Client/World/GameObject.h +++ b/src/Client/World/GameObject.h @@ -12,9 +12,11 @@ struct GameobjectTemplate uint32 displayId; std::string name; std::string castBarCaption; + std::string unk1; uint32 faction; uint32 flags; float size; + uint32 questItems[4]; union // different GO types have different data field { //0 GAMEOBJECT_TYPE_DOOR @@ -26,6 +28,7 @@ struct GameobjectTemplate uint32 noDamageImmune; //3 break opening whenever you recieve damage? uint32 openTextID; //4 can be used to replace castBarCaption? uint32 closeTextID; //5 + uint32 ignoredByPathing; //6 } door; //1 GAMEOBJECT_TYPE_BUTTON struct @@ -73,7 +76,9 @@ struct GameobjectTemplate uint32 logLoot; //13 uint32 openTextID; //14 can be used to replace castBarCaption? uint32 groupLootRules; //15 + uint32 floatingTooltip; //16 } chest; + //4 GAMEOBJECT_TYPE_BINDER - empty //5 GAMEOBJECT_TYPE_GENERIC struct { @@ -101,6 +106,7 @@ struct GameobjectTemplate uint32 stealthAffected; //11 uint32 openTextID; //12 can be used to replace castBarCaption? uint32 closeTextID; //13 + uint32 ignoreTotems; //14 } trap; //7 GAMEOBJECT_TYPE_CHAIR struct @@ -108,6 +114,7 @@ struct GameobjectTemplate uint32 slots; //0 uint32 height; //1 uint32 onlyCreatorUse; //2 + uint32 triggeredEvent; //3 } chair; //8 GAMEOBJECT_TYPE_SPELL_FOCUS struct @@ -118,6 +125,7 @@ struct GameobjectTemplate uint32 serverOnly; //3 uint32 questID; //4 uint32 large; //5 + uint32 floatingTooltip; //6 } spellFocus; //9 GAMEOBJECT_TYPE_TEXT struct @@ -148,6 +156,9 @@ struct GameobjectTemplate uint32 closeTextID; //15 uint32 losOK; //16 isBattlegroundObject uint32 allowMounted; //17 + uint32 floatingTooltip; //18 + uint32 gossipID; //19 + uint32 WorldStateSetsState; //20 } goober; //11 GAMEOBJECT_TYPE_TRANSPORT struct @@ -155,6 +166,8 @@ struct GameobjectTemplate uint32 pause; //0 uint32 startOpen; //1 uint32 autoCloseTime; //2 secs till autoclose = autoCloseTime / 0x10000 + uint32 pause1EventID; //3 + uint32 pause2EventID; //4 } transport; //12 GAMEOBJECT_TYPE_AREADAMAGE struct @@ -176,6 +189,7 @@ struct GameobjectTemplate uint32 eventID; //2 uint32 openTextID; //3 can be used to replace castBarCaption? } camera; + //14 GAMEOBJECT_TYPE_MAPOBJECT - empty //15 GAMEOBJECT_TYPE_MO_TRANSPORT struct { @@ -186,13 +200,10 @@ struct GameobjectTemplate uint32 stopEventID; //4 uint32 transportPhysics; //5 uint32 mapID; //6 + uint32 worldState1; //7 } moTransport; - //17 GAMEOBJECT_TYPE_FISHINGNODE - struct - { - uint32 _data0; //0 - uint32 lootId; //1 - } fishnode; + //16 GAMEOBJECT_TYPE_DUELFLAG - empty + //17 GAMEOBJECT_TYPE_FISHINGNODE - empty //18 GAMEOBJECT_TYPE_SUMMONING_RITUAL struct { @@ -205,11 +216,8 @@ struct GameobjectTemplate uint32 castersGrouped; //6 uint32 ritualNoTargetCheck; //7 } summoningRitual; - //20 GAMEOBJECT_TYPE_AUCTIONHOUSE - struct - { - uint32 actionHouseID; //0 - } auctionhouse; + //19 GAMEOBJECT_TYPE_MAILBOX - empty + //20 GAMEOBJECT_TYPE_DONOTUSE - empty //21 GAMEOBJECT_TYPE_GUARDPOST struct { @@ -222,6 +230,8 @@ struct GameobjectTemplate uint32 spellId; //0 uint32 charges; //1 uint32 partyOnly; //2 + uint32 allowMounted; //3 + uint32 large; //4 } spellcaster; //23 GAMEOBJECT_TYPE_MEETINGSTONE struct @@ -288,6 +298,8 @@ struct GameobjectTemplate uint32 maxTime; //17 uint32 large; //18 uint32 highlight; //19 + uint32 startingValue; //20 + uint32 unidirectional; //21 } capturePoint; //30 GAMEOBJECT_TYPE_AURA_GENERATOR struct @@ -306,25 +318,53 @@ struct GameobjectTemplate uint32 mapID; //0 uint32 difficulty; //1 } dungeonDifficulty; - //32 GAMEOBJECT_TYPE_DO_NOT_USE_YET + //32 GAMEOBJECT_TYPE_BARBER_CHAIR struct { - uint32 mapID; //0 - uint32 difficulty; //1 - } doNotUseYet; + uint32 chairheight; //0 + uint32 heightOffset; //1 + } barberChair; //33 GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING struct { - uint32 dmgPctState1; //0 - uint32 dmgPctState2; //1 - uint32 state1Name; //2 - uint32 state2Name; //3 + uint32 intactNumHits; //0 + uint32 creditProxyCreature; //1 + uint32 empty1; //2 + uint32 intactEvent; //3 + uint32 empty2; //4 + uint32 damagedNumHits; //5 + uint32 empty3; //6 + uint32 empty4; //7 + uint32 empty5; //8 + uint32 damagedEvent; //9 + uint32 empty6; //10 + uint32 empty7; //11 + uint32 empty8; //12 + uint32 empty9; //13 + uint32 destroyedEvent; //14 + uint32 empty10; //15 + uint32 debuildingTimeSecs; //16 + uint32 empty11; //17 + uint32 destructibleData; //18 + uint32 rebuildingEvent; //19 + uint32 empty12; //20 + uint32 empty13; //21 + uint32 damageEvent; //22 + uint32 empty14; //23 } destructibleBuilding; + //34 GAMEOBJECT_TYPE_GUILDBANK - empty + //35 GAMEOBJECT_TYPE_TRAPDOOR + struct + { + uint32 whenToPause; // 0 + uint32 startOpen; // 1 + uint32 autoClose; // 2 + } trapDoor; // not use for specific field access (only for output with loop by all filed), also this determinate max union size - struct // GAMEOBJECT_TYPE_SPELLCASTER + struct { - uint32 data[GAMEOBJECT_DATA_FIELDS]; + uint32 data[24]; } raw; }; }; diff --git a/src/Client/World/Item.cpp b/src/Client/World/Item.cpp index 2c94d56..7d45d02 100644 --- a/src/Client/World/Item.cpp +++ b/src/Client/World/Item.cpp @@ -6,14 +6,15 @@ void WorldSession::_HandleItemQuerySingleResponseOpcode(WorldPacket& recvPacket) { - ItemProto *proto = new ItemProto(); - recvPacket >> proto->Id; - uint8 field[64]; + uint32 ItemID; uint32 unk; std::string s; - memset(field,0,64); - if(memcmp(recvPacket.contents()+sizeof(uint32),field,64)) + + recvPacket >> ItemID; + if(!(ItemID & 0x80000000)) // invalid item flag? { + ItemProto *proto = new ItemProto(); + proto->Id = ItemID; recvPacket >> proto->Class; recvPacket >> proto->SubClass; recvPacket >> unk; // dont need that value? @@ -47,7 +48,7 @@ void WorldSession::_HandleItemQuerySingleResponseOpcode(WorldPacket& recvPacket) } recvPacket >> proto->ScalingStatDistribution; recvPacket >> proto->ScalingStatValue; - for(int i = 0; i < 5; i++) + for(int i = 0; i < MAX_ITEM_PROTO_DAMAGES; i++) { recvPacket >> proto->Damage[i].DamageMin; recvPacket >> proto->Damage[i].DamageMax; @@ -102,6 +103,7 @@ void WorldSession::_HandleItemQuerySingleResponseOpcode(WorldPacket& recvPacket) recvPacket >> proto->ArmorDamageModifier; recvPacket >> proto->Duration; recvPacket >> proto->ItemLimitCategory; + recvPacket >> proto->HolidayId; logdetail("Got Item Info: Id=%u Name='%s' ReqLevel=%u Armor=%u Desc='%s'", proto->Id, proto->Name.c_str(), proto->RequiredLevel, proto->Armor, proto->Description.c_str()); @@ -111,9 +113,9 @@ void WorldSession::_HandleItemQuerySingleResponseOpcode(WorldPacket& recvPacket) } else { - logdetail("Got info of nonexistent Item %u",proto->Id); - objmgr.AddNonexistentItem(proto->Id); - delete proto; + ItemID &= 0x7FFFFFFF; // remove nonexisting item flag + logdetail("Item %u doesn't exist!",ItemID); + objmgr.AddNonexistentItem(ItemID); } } diff --git a/src/Client/World/Item.h b/src/Client/World/Item.h index 5d294ba..95da2cb 100644 --- a/src/Client/World/Item.h +++ b/src/Client/World/Item.h @@ -327,6 +327,8 @@ enum ITEM_SUBCLASS_QUIVER ITEM_SUBCLASS_AMMO_POUCH = 3 }; +#define MAX_ITEM_PROTO_DAMAGES 2 + struct _ItemStat { uint32 ItemStatType; @@ -429,6 +431,7 @@ struct ItemProto float ArmorDamageModifier; int32 Duration; // negative = realtime, positive = ingame time uint32 ItemLimitCategory; // id from ItemLimitCategory.dbc + uint32 HolidayId; }; class Item : public Object diff --git a/src/Client/World/Opcodes.cpp b/src/Client/World/Opcodes.cpp index 726359c..9bdce93 100644 --- a/src/Client/World/Opcodes.cpp +++ b/src/Client/World/Opcodes.cpp @@ -29,1210 +29,1245 @@ // when renaming opcodes, replace old name by the new one const char* worldOpcodeNames[] = { - "MSG_NULL_ACTION", - "CMSG_BOOTME", - "CMSG_DBLOOKUP", - "SMSG_DBLOOKUP", - "CMSG_QUERY_OBJECT_POSITION", - "SMSG_QUERY_OBJECT_POSITION", - "CMSG_QUERY_OBJECT_ROTATION", - "SMSG_QUERY_OBJECT_ROTATION", - "CMSG_WORLD_TELEPORT", - "CMSG_TELEPORT_TO_UNIT", - "CMSG_ZONE_MAP", - "SMSG_ZONE_MAP", - "CMSG_DEBUG_CHANGECELLZONE", - "CMSG_MOVE_CHARACTER_CHEAT", - "SMSG_MOVE_CHARACTER_CHEAT", - "CMSG_RECHARGE", - "CMSG_LEARN_SPELL", - "CMSG_CREATEMONSTER", - "CMSG_DESTROYMONSTER", - "CMSG_CREATEITEM", - "CMSG_CREATEGAMEOBJECT", - "SMSG_CHECK_FOR_BOTS", - "CMSG_MAKEMONSTERATTACKGUID", - "CMSG_BOT_DETECTED2", - "CMSG_FORCEACTION", - "CMSG_FORCEACTIONONOTHER", - "CMSG_FORCEACTIONSHOW", - "SMSG_FORCEACTIONSHOW", - "CMSG_PETGODMODE", - "SMSG_PETGODMODE", - "SMSG_REFER_A_FRIEND_EXPIRED", - "CMSG_WEATHER_SPEED_CHEAT", - "CMSG_UNDRESSPLAYER", - "CMSG_BEASTMASTER", - "CMSG_GODMODE", - "SMSG_GODMODE", - "CMSG_CHEAT_SETMONEY", - "CMSG_LEVEL_CHEAT", - "CMSG_PET_LEVEL_CHEAT", - "CMSG_SET_WORLDSTATE", - "CMSG_COOLDOWN_CHEAT", - "CMSG_USE_SKILL_CHEAT", - "CMSG_FLAG_QUEST", - "CMSG_FLAG_QUEST_FINISH", - "CMSG_CLEAR_QUEST", - "CMSG_SEND_EVENT", - "CMSG_DEBUG_AISTATE", - "SMSG_DEBUG_AISTATE", - "CMSG_DISABLE_PVP_CHEAT", - "CMSG_ADVANCE_SPAWN_TIME", - "SMSG_DESTRUCTIBLE_BUILDING_DAMAGE", - "CMSG_AUTH_SRP6_BEGIN", - "CMSG_AUTH_SRP6_PROOF", - "CMSG_AUTH_SRP6_RECODE", - "CMSG_CHAR_CREATE", - "CMSG_CHAR_ENUM", - "CMSG_CHAR_DELETE", - "SMSG_AUTH_SRP6_RESPONSE", - "SMSG_CHAR_CREATE", - "SMSG_CHAR_ENUM", - "SMSG_CHAR_DELETE", - "CMSG_PLAYER_LOGIN", - "SMSG_NEW_WORLD", - "SMSG_TRANSFER_PENDING", - "SMSG_TRANSFER_ABORTED", - "SMSG_CHARACTER_LOGIN_FAILED", - "SMSG_LOGIN_SETTIMESPEED", - "SMSG_GAMETIME_UPDATE", - "CMSG_GAMETIME_SET", - "SMSG_GAMETIME_SET", - "CMSG_GAMESPEED_SET", - "SMSG_GAMESPEED_SET", - "CMSG_SERVERTIME", - "SMSG_SERVERTIME", - "CMSG_PLAYER_LOGOUT", - "CMSG_LOGOUT_REQUEST", - "SMSG_LOGOUT_RESPONSE", - "SMSG_LOGOUT_COMPLETE", - "CMSG_LOGOUT_CANCEL", - "SMSG_LOGOUT_CANCEL_ACK", - "CMSG_NAME_QUERY", - "SMSG_NAME_QUERY_RESPONSE", - "CMSG_PET_NAME_QUERY", - "SMSG_PET_NAME_QUERY_RESPONSE", - "CMSG_GUILD_QUERY", - "SMSG_GUILD_QUERY_RESPONSE", - "CMSG_ITEM_QUERY_SINGLE", - "CMSG_ITEM_QUERY_MULTIPLE", - "SMSG_ITEM_QUERY_SINGLE_RESPONSE", - "SMSG_ITEM_QUERY_MULTIPLE_RESPONSE", - "CMSG_PAGE_TEXT_QUERY", - "SMSG_PAGE_TEXT_QUERY_RESPONSE", - "CMSG_QUEST_QUERY", - "SMSG_QUEST_QUERY_RESPONSE", - "CMSG_GAMEOBJECT_QUERY", - "SMSG_GAMEOBJECT_QUERY_RESPONSE", - "CMSG_CREATURE_QUERY", - "SMSG_CREATURE_QUERY_RESPONSE", - "CMSG_WHO", - "SMSG_WHO", - "CMSG_WHOIS", - "SMSG_WHOIS", - "CMSG_CONTACT_LIST", - "SMSG_CONTACT_LIST", - "SMSG_FRIEND_STATUS", - "CMSG_ADD_FRIEND", - "CMSG_DEL_FRIEND", - "CMSG_SET_CONTACT_NOTES", - "CMSG_ADD_IGNORE", - "CMSG_DEL_IGNORE", - "CMSG_GROUP_INVITE", - "SMSG_GROUP_INVITE", - "CMSG_GROUP_CANCEL", - "SMSG_GROUP_CANCEL", - "CMSG_GROUP_ACCEPT", - "CMSG_GROUP_DECLINE", - "SMSG_GROUP_DECLINE", - "CMSG_GROUP_UNINVITE", - "CMSG_GROUP_UNINVITE_GUID", - "SMSG_GROUP_UNINVITE", - "CMSG_GROUP_SET_LEADER", - "SMSG_GROUP_SET_LEADER", - "CMSG_LOOT_METHOD", - "CMSG_GROUP_DISBAND", - "SMSG_GROUP_DESTROYED", - "SMSG_GROUP_LIST", - "SMSG_PARTY_MEMBER_STATS", - "SMSG_PARTY_COMMAND_RESULT", - "UMSG_UPDATE_GROUP_MEMBERS", - "CMSG_GUILD_CREATE", - "CMSG_GUILD_INVITE", - "SMSG_GUILD_INVITE", - "CMSG_GUILD_ACCEPT", - "CMSG_GUILD_DECLINE", - "SMSG_GUILD_DECLINE", - "CMSG_GUILD_INFO", - "SMSG_GUILD_INFO", - "CMSG_GUILD_ROSTER", - "SMSG_GUILD_ROSTER", - "CMSG_GUILD_PROMOTE", - "CMSG_GUILD_DEMOTE", - "CMSG_GUILD_LEAVE", - "CMSG_GUILD_REMOVE", - "CMSG_GUILD_DISBAND", - "CMSG_GUILD_LEADER", - "CMSG_GUILD_MOTD", - "SMSG_GUILD_EVENT", - "SMSG_GUILD_COMMAND_RESULT", - "UMSG_UPDATE_GUILD", - "CMSG_MESSAGECHAT", - "SMSG_MESSAGECHAT", - "CMSG_JOIN_CHANNEL", - "CMSG_LEAVE_CHANNEL", - "SMSG_CHANNEL_NOTIFY", - "CMSG_CHANNEL_LIST", - "SMSG_CHANNEL_LIST", - "CMSG_CHANNEL_PASSWORD", - "CMSG_CHANNEL_SET_OWNER", - "CMSG_CHANNEL_OWNER", - "CMSG_CHANNEL_MODERATOR", - "CMSG_CHANNEL_UNMODERATOR", - "CMSG_CHANNEL_MUTE", - "CMSG_CHANNEL_UNMUTE", - "CMSG_CHANNEL_INVITE", - "CMSG_CHANNEL_KICK", - "CMSG_CHANNEL_BAN", - "CMSG_CHANNEL_UNBAN", - "CMSG_CHANNEL_ANNOUNCEMENTS", - "CMSG_CHANNEL_MODERATE", - "SMSG_UPDATE_OBJECT", - "SMSG_DESTROY_OBJECT", - "CMSG_USE_ITEM", - "CMSG_OPEN_ITEM", - "CMSG_READ_ITEM", - "SMSG_READ_ITEM_OK", - "SMSG_READ_ITEM_FAILED", - "SMSG_ITEM_COOLDOWN", - "CMSG_GAMEOBJ_USE", - "CMSG_DESTROY_ITEMS", - "SMSG_GAMEOBJECT_CUSTOM_ANIM", - "CMSG_AREATRIGGER", - "MSG_MOVE_START_FORWARD", - "MSG_MOVE_START_BACKWARD", - "MSG_MOVE_STOP", - "MSG_MOVE_START_STRAFE_LEFT", - "MSG_MOVE_START_STRAFE_RIGHT", - "MSG_MOVE_STOP_STRAFE", - "MSG_MOVE_JUMP", - "MSG_MOVE_START_TURN_LEFT", - "MSG_MOVE_START_TURN_RIGHT", - "MSG_MOVE_STOP_TURN", - "MSG_MOVE_START_PITCH_UP", - "MSG_MOVE_START_PITCH_DOWN", - "MSG_MOVE_STOP_PITCH", - "MSG_MOVE_SET_RUN_MODE", - "MSG_MOVE_SET_WALK_MODE", - "MSG_MOVE_TOGGLE_LOGGING", - "MSG_MOVE_TELEPORT", - "MSG_MOVE_TELEPORT_CHEAT", - "MSG_MOVE_TELEPORT_ACK", - "MSG_MOVE_TOGGLE_FALL_LOGGING", - "MSG_MOVE_FALL_LAND", - "MSG_MOVE_START_SWIM", - "MSG_MOVE_STOP_SWIM", - "MSG_MOVE_SET_RUN_SPEED_CHEAT", - "MSG_MOVE_SET_RUN_SPEED", - "MSG_MOVE_SET_RUN_BACK_SPEED_CHEAT", - "MSG_MOVE_SET_RUN_BACK_SPEED", - "MSG_MOVE_SET_WALK_SPEED_CHEAT", - "MSG_MOVE_SET_WALK_SPEED", - "MSG_MOVE_SET_SWIM_SPEED_CHEAT", - "MSG_MOVE_SET_SWIM_SPEED", - "MSG_MOVE_SET_SWIM_BACK_SPEED_CHEAT", - "MSG_MOVE_SET_SWIM_BACK_SPEED", - "MSG_MOVE_SET_ALL_SPEED_CHEAT", - "MSG_MOVE_SET_TURN_RATE_CHEAT", - "MSG_MOVE_SET_TURN_RATE", - "MSG_MOVE_TOGGLE_COLLISION_CHEAT", - "MSG_MOVE_SET_FACING", - "MSG_MOVE_SET_PITCH", - "MSG_MOVE_WORLDPORT_ACK", - "SMSG_MONSTER_MOVE", - "SMSG_MOVE_WATER_WALK", - "SMSG_MOVE_LAND_WALK", - "MSG_MOVE_SET_RAW_POSITION_ACK", - "CMSG_MOVE_SET_RAW_POSITION", - "SMSG_FORCE_RUN_SPEED_CHANGE", - "CMSG_FORCE_RUN_SPEED_CHANGE_ACK", - "SMSG_FORCE_RUN_BACK_SPEED_CHANGE", - "CMSG_FORCE_RUN_BACK_SPEED_CHANGE_ACK", - "SMSG_FORCE_SWIM_SPEED_CHANGE", - "CMSG_FORCE_SWIM_SPEED_CHANGE_ACK", - "SMSG_FORCE_MOVE_ROOT", - "CMSG_FORCE_MOVE_ROOT_ACK", - "SMSG_FORCE_MOVE_UNROOT", - "CMSG_FORCE_MOVE_UNROOT_ACK", - "MSG_MOVE_ROOT", - "MSG_MOVE_UNROOT", - "MSG_MOVE_HEARTBEAT", - "SMSG_MOVE_KNOCK_BACK", - "CMSG_MOVE_KNOCK_BACK_ACK", - "MSG_MOVE_KNOCK_BACK", - "SMSG_MOVE_FEATHER_FALL", - "SMSG_MOVE_NORMAL_FALL", - "SMSG_MOVE_SET_HOVER", - "SMSG_MOVE_UNSET_HOVER", - "CMSG_MOVE_HOVER_ACK", - "MSG_MOVE_HOVER", - "CMSG_TRIGGER_CINEMATIC_CHEAT", - "CMSG_OPENING_CINEMATIC", - "SMSG_TRIGGER_CINEMATIC", - "CMSG_NEXT_CINEMATIC_CAMERA", - "CMSG_COMPLETE_CINEMATIC", - "SMSG_TUTORIAL_FLAGS", - "CMSG_TUTORIAL_FLAG", - "CMSG_TUTORIAL_CLEAR", - "CMSG_TUTORIAL_RESET", - "CMSG_STANDSTATECHANGE", - "CMSG_EMOTE", - "SMSG_EMOTE", - "CMSG_TEXT_EMOTE", - "SMSG_TEXT_EMOTE", - "CMSG_AUTOEQUIP_GROUND_ITEM", - "CMSG_AUTOSTORE_GROUND_ITEM", - "CMSG_AUTOSTORE_LOOT_ITEM", - "CMSG_STORE_LOOT_IN_SLOT", - "CMSG_AUTOEQUIP_ITEM", - "CMSG_AUTOSTORE_BAG_ITEM", - "CMSG_SWAP_ITEM", - "CMSG_SWAP_INV_ITEM", - "CMSG_SPLIT_ITEM", - "CMSG_AUTOEQUIP_ITEM_SLOT", - "OBSOLETE_DROP_ITEM", - "CMSG_DESTROYITEM", - "SMSG_INVENTORY_CHANGE_FAILURE", - "SMSG_OPEN_CONTAINER", - "CMSG_INSPECT", - "SMSG_INSPECT", - "CMSG_INITIATE_TRADE", - "CMSG_BEGIN_TRADE", - "CMSG_BUSY_TRADE", - "CMSG_IGNORE_TRADE", - "CMSG_ACCEPT_TRADE", - "CMSG_UNACCEPT_TRADE", - "CMSG_CANCEL_TRADE", - "CMSG_SET_TRADE_ITEM", - "CMSG_CLEAR_TRADE_ITEM", - "CMSG_SET_TRADE_GOLD", - "SMSG_TRADE_STATUS", - "SMSG_TRADE_STATUS_EXTENDED", - "SMSG_INITIALIZE_FACTIONS", - "SMSG_SET_FACTION_VISIBLE", - "SMSG_SET_FACTION_STANDING", - "CMSG_SET_FACTION_ATWAR", - "CMSG_SET_FACTION_CHEAT", - "SMSG_SET_PROFICIENCY", - "CMSG_SET_ACTION_BUTTON", - "SMSG_ACTION_BUTTONS", - "SMSG_INITIAL_SPELLS", - "SMSG_LEARNED_SPELL", - "SMSG_SUPERCEDED_SPELL", - "CMSG_NEW_SPELL_SLOT", - "CMSG_CAST_SPELL", - "CMSG_CANCEL_CAST", - "SMSG_CAST_FAILED", - "SMSG_SPELL_START", - "SMSG_SPELL_GO", - "SMSG_SPELL_FAILURE", - "SMSG_SPELL_COOLDOWN", - "SMSG_COOLDOWN_EVENT", - "CMSG_CANCEL_AURA", - "SMSG_UPDATE_AURA_DURATION_OBSOLETE", - "SMSG_PET_CAST_FAILED", - "MSG_CHANNEL_START", - "MSG_CHANNEL_UPDATE", - "CMSG_CANCEL_CHANNELLING", - "SMSG_AI_REACTION", - "CMSG_SET_SELECTION", - "CMSG_SET_TARGET_OBSOLETE", - "CMSG_UNUSED", - "CMSG_UNUSED2", - "CMSG_ATTACKSWING", - "CMSG_ATTACKSTOP", - "SMSG_ATTACKSTART", - "SMSG_ATTACKSTOP", - "SMSG_ATTACKSWING_NOTINRANGE", - "SMSG_ATTACKSWING_BADFACING", - "SMSG_ATTACKSWING_NOTSTANDING", - "SMSG_ATTACKSWING_DEADTARGET", - "SMSG_ATTACKSWING_CANT_ATTACK", - "SMSG_ATTACKERSTATEUPDATE", - "SMSG_VICTIMSTATEUPDATE_OBSOLETE", - "SMSG_DAMAGE_DONE_OBSOLETE", - "SMSG_DAMAGE_TAKEN_OBSOLETE", - "SMSG_CANCEL_COMBAT", - "SMSG_SPELLBREAKLOG", - "SMSG_SPELLHEALLOG", - "SMSG_SPELLENERGIZELOG", - "SMSG_BREAK_TARGET", - "CMSG_SAVE_PLAYER", - "CMSG_SETDEATHBINDPOINT", - "SMSG_BINDPOINTUPDATE", - "CMSG_GETDEATHBINDZONE", - "SMSG_BINDZONEREPLY", - "SMSG_PLAYERBOUND", - "SMSG_CLIENT_CONTROL_UPDATE", - "CMSG_REPOP_REQUEST", - "SMSG_RESURRECT_REQUEST", - "CMSG_RESURRECT_RESPONSE", - "CMSG_LOOT", - "CMSG_LOOT_MONEY", - "CMSG_LOOT_RELEASE", - "SMSG_LOOT_RESPONSE", - "SMSG_LOOT_RELEASE_RESPONSE", - "SMSG_LOOT_REMOVED", - "SMSG_LOOT_MONEY_NOTIFY", - "SMSG_LOOT_ITEM_NOTIFY", - "SMSG_LOOT_CLEAR_MONEY", - "SMSG_ITEM_PUSH_RESULT", - "SMSG_DUEL_REQUESTED", - "SMSG_DUEL_OUTOFBOUNDS", - "SMSG_DUEL_INBOUNDS", - "SMSG_DUEL_COMPLETE", - "SMSG_DUEL_WINNER", - "CMSG_DUEL_ACCEPTED", - "CMSG_DUEL_CANCELLED", - "SMSG_MOUNTRESULT", - "SMSG_DISMOUNTRESULT", - "SMSG_PUREMOUNT_CANCELLED_OBSOLETE", - "CMSG_MOUNTSPECIAL_ANIM", - "SMSG_MOUNTSPECIAL_ANIM", - "SMSG_PET_TAME_FAILURE", - "CMSG_PET_SET_ACTION", - "CMSG_PET_ACTION", - "CMSG_PET_ABANDON", - "CMSG_PET_RENAME", - "SMSG_PET_NAME_INVALID", - "SMSG_PET_SPELLS", - "SMSG_PET_MODE", - "CMSG_GOSSIP_HELLO", - "CMSG_GOSSIP_SELECT_OPTION", - "SMSG_GOSSIP_MESSAGE", - "SMSG_GOSSIP_COMPLETE", - "CMSG_NPC_TEXT_QUERY", - "SMSG_NPC_TEXT_UPDATE", - "SMSG_NPC_WONT_TALK", - "CMSG_QUESTGIVER_STATUS_QUERY", - "SMSG_QUESTGIVER_STATUS", - "CMSG_QUESTGIVER_HELLO", - "SMSG_QUESTGIVER_QUEST_LIST", - "CMSG_QUESTGIVER_QUERY_QUEST", - "CMSG_QUESTGIVER_QUEST_AUTOLAUNCH", - "SMSG_QUESTGIVER_QUEST_DETAILS", - "CMSG_QUESTGIVER_ACCEPT_QUEST", - "CMSG_QUESTGIVER_COMPLETE_QUEST", - "SMSG_QUESTGIVER_REQUEST_ITEMS", - "CMSG_QUESTGIVER_REQUEST_REWARD", - "SMSG_QUESTGIVER_OFFER_REWARD", - "CMSG_QUESTGIVER_CHOOSE_REWARD", - "SMSG_QUESTGIVER_QUEST_INVALID", - "CMSG_QUESTGIVER_CANCEL", - "SMSG_QUESTGIVER_QUEST_COMPLETE", - "SMSG_QUESTGIVER_QUEST_FAILED", - "CMSG_QUESTLOG_SWAP_QUEST", - "CMSG_QUESTLOG_REMOVE_QUEST", - "SMSG_QUESTLOG_FULL", - "SMSG_QUESTUPDATE_FAILED", - "SMSG_QUESTUPDATE_FAILEDTIMER", - "SMSG_QUESTUPDATE_COMPLETE", - "SMSG_QUESTUPDATE_ADD_KILL", - "SMSG_QUESTUPDATE_ADD_ITEM", - "CMSG_QUEST_CONFIRM_ACCEPT", - "SMSG_QUEST_CONFIRM_ACCEPT", - "CMSG_PUSHQUESTTOPARTY", - "CMSG_LIST_INVENTORY", - "SMSG_LIST_INVENTORY", - "CMSG_SELL_ITEM", - "SMSG_SELL_ITEM", - "CMSG_BUY_ITEM", - "CMSG_BUY_ITEM_IN_SLOT", - "SMSG_BUY_ITEM", - "SMSG_BUY_FAILED", - "CMSG_TAXICLEARALLNODES", - "CMSG_TAXIENABLEALLNODES", - "CMSG_TAXISHOWNODES", - "SMSG_SHOWTAXINODES", - "CMSG_TAXINODE_STATUS_QUERY", - "SMSG_TAXINODE_STATUS", - "CMSG_TAXIQUERYAVAILABLENODES", - "CMSG_ACTIVATETAXI", - "SMSG_ACTIVATETAXIREPLY", - "SMSG_NEW_TAXI_PATH", - "CMSG_TRAINER_LIST", - "SMSG_TRAINER_LIST", - "CMSG_TRAINER_BUY_SPELL", - "SMSG_TRAINER_BUY_SUCCEEDED", - "SMSG_TRAINER_BUY_FAILED", - "CMSG_BINDER_ACTIVATE", - "SMSG_PLAYERBINDERROR", - "CMSG_BANKER_ACTIVATE", - "SMSG_SHOW_BANK", - "CMSG_BUY_BANK_SLOT", - "SMSG_BUY_BANK_SLOT_RESULT", - "CMSG_PETITION_SHOWLIST", - "SMSG_PETITION_SHOWLIST", - "CMSG_PETITION_BUY", - "CMSG_PETITION_SHOW_SIGNATURES", - "SMSG_PETITION_SHOW_SIGNATURES", - "CMSG_PETITION_SIGN", - "SMSG_PETITION_SIGN_RESULTS", - "MSG_PETITION_DECLINE", - "CMSG_OFFER_PETITION", - "CMSG_TURN_IN_PETITION", - "SMSG_TURN_IN_PETITION_RESULTS", - "CMSG_PETITION_QUERY", - "SMSG_PETITION_QUERY_RESPONSE", - "SMSG_FISH_NOT_HOOKED", - "SMSG_FISH_ESCAPED", - "CMSG_BUG", - "SMSG_NOTIFICATION", - "CMSG_PLAYED_TIME", - "SMSG_PLAYED_TIME", - "CMSG_QUERY_TIME", - "SMSG_QUERY_TIME_RESPONSE", - "SMSG_LOG_XPGAIN", - "SMSG_AURACASTLOG", - "CMSG_RECLAIM_CORPSE", - "CMSG_WRAP_ITEM", - "SMSG_LEVELUP_INFO", - "MSG_MINIMAP_PING", - "SMSG_RESISTLOG", - "SMSG_ENCHANTMENTLOG", - "CMSG_SET_SKILL_CHEAT", - "SMSG_START_MIRROR_TIMER", - "SMSG_PAUSE_MIRROR_TIMER", - "SMSG_STOP_MIRROR_TIMER", - "CMSG_PING", - "SMSG_PONG", - "SMSG_CLEAR_COOLDOWN", - "SMSG_GAMEOBJECT_PAGETEXT", - "CMSG_SETSHEATHED", - "SMSG_COOLDOWN_CHEAT", - "SMSG_SPELL_DELAYED", - "CMSG_PLAYER_MACRO_OBSOLETE", - "SMSG_PLAYER_MACRO_OBSOLETE", - "CMSG_GHOST", - "CMSG_GM_INVIS", - "SMSG_INVALID_PROMOTION_CODE", - "MSG_GM_BIND_OTHER", - "MSG_GM_SUMMON", - "SMSG_ITEM_TIME_UPDATE", - "SMSG_ITEM_ENCHANT_TIME_UPDATE", - "SMSG_AUTH_CHALLENGE", - "CMSG_AUTH_SESSION", - "SMSG_AUTH_RESPONSE", - "MSG_GM_SHOWLABEL", - "CMSG_PET_CAST_SPELL", - "MSG_SAVE_GUILD_EMBLEM", - "MSG_TABARDVENDOR_ACTIVATE", - "SMSG_PLAY_SPELL_VISUAL", - "CMSG_ZONEUPDATE", - "SMSG_PARTYKILLLOG", - "SMSG_COMPRESSED_UPDATE_OBJECT", - "SMSG_PLAY_SPELL_IMPACT", - "SMSG_EXPLORATION_EXPERIENCE", - "CMSG_GM_SET_SECURITY_GROUP", - "CMSG_GM_NUKE", - "MSG_RANDOM_ROLL", - "SMSG_ENVIRONMENTALDAMAGELOG", - "CMSG_RWHOIS_OBSOLETE", - "SMSG_RWHOIS", - "MSG_LOOKING_FOR_GROUP", - "CMSG_SET_LOOKING_FOR_GROUP", - "CMSG_UNLEARN_SPELL", - "CMSG_UNLEARN_SKILL", - "SMSG_REMOVED_SPELL", - "CMSG_DECHARGE", - "CMSG_GMTICKET_CREATE", - "SMSG_GMTICKET_CREATE", - "CMSG_GMTICKET_UPDATETEXT", - "SMSG_GMTICKET_UPDATETEXT", - "SMSG_ACCOUNT_DATA_TIMES", - "CMSG_REQUEST_ACCOUNT_DATA", - "CMSG_UPDATE_ACCOUNT_DATA", - "SMSG_UPDATE_ACCOUNT_DATA", - "SMSG_CLEAR_FAR_SIGHT_IMMEDIATE", - "SMSG_POWERGAINLOG_OBSOLETE", - "CMSG_GM_TEACH", - "CMSG_GM_CREATE_ITEM_TARGET", - "CMSG_GMTICKET_GETTICKET", - "SMSG_GMTICKET_GETTICKET", - "CMSG_UNLEARN_TALENTS", - "SMSG_GAMEOBJECT_SPAWN_ANIM_OBSOLETE", - "SMSG_GAMEOBJECT_DESPAWN_ANIM", - "MSG_CORPSE_QUERY", - "CMSG_GMTICKET_DELETETICKET", - "SMSG_GMTICKET_DELETETICKET", - "SMSG_CHAT_WRONG_FACTION", - "CMSG_GMTICKET_SYSTEMSTATUS", - "SMSG_GMTICKET_SYSTEMSTATUS", - "CMSG_SPIRIT_HEALER_ACTIVATE", - "CMSG_SET_STAT_CHEAT", - "SMSG_SET_REST_START_OBSOLETE", - "CMSG_SKILL_BUY_STEP", - "CMSG_SKILL_BUY_RANK", - "CMSG_XP_CHEAT", - "SMSG_SPIRIT_HEALER_CONFIRM", - "CMSG_CHARACTER_POINT_CHEAT", - "SMSG_GOSSIP_POI", - "CMSG_CHAT_IGNORED", - "CMSG_GM_VISION", - "CMSG_SERVER_COMMAND", - "CMSG_GM_SILENCE", - "CMSG_GM_REVEALTO", - "CMSG_GM_RESURRECT", - "CMSG_GM_SUMMONMOB", - "CMSG_GM_MOVECORPSE", - "CMSG_GM_FREEZE", - "CMSG_GM_UBERINVIS", - "CMSG_GM_REQUEST_PLAYER_INFO", - "SMSG_GM_PLAYER_INFO", - "CMSG_GUILD_RANK", - "CMSG_GUILD_ADD_RANK", - "CMSG_GUILD_DEL_RANK", - "CMSG_GUILD_SET_PUBLIC_NOTE", - "CMSG_GUILD_SET_OFFICER_NOTE", - "SMSG_LOGIN_VERIFY_WORLD", - "CMSG_CLEAR_EXPLORATION", - "CMSG_SEND_MAIL", - "SMSG_SEND_MAIL_RESULT", - "CMSG_GET_MAIL_LIST", - "SMSG_MAIL_LIST_RESULT", - "CMSG_BATTLEFIELD_LIST", - "SMSG_BATTLEFIELD_LIST", - "CMSG_BATTLEFIELD_JOIN", - "SMSG_BATTLEFIELD_WIN_OBSOLETE", - "SMSG_BATTLEFIELD_LOSE_OBSOLETE", - "CMSG_TAXICLEARNODE", - "CMSG_TAXIENABLENODE", - "CMSG_ITEM_TEXT_QUERY", - "SMSG_ITEM_TEXT_QUERY_RESPONSE", - "CMSG_MAIL_TAKE_MONEY", - "CMSG_MAIL_TAKE_ITEM", - "CMSG_MAIL_MARK_AS_READ", - "CMSG_MAIL_RETURN_TO_SENDER", - "CMSG_MAIL_DELETE", - "CMSG_MAIL_CREATE_TEXT_ITEM", - "SMSG_SPELLLOGMISS", - "SMSG_SPELLLOGEXECUTE", - "SMSG_DEBUGAURAPROC", - "SMSG_PERIODICAURALOG", - "SMSG_SPELLDAMAGESHIELD", - "SMSG_SPELLNONMELEEDAMAGELOG", - "CMSG_LEARN_TALENT", - "SMSG_RESURRECT_FAILED", - "CMSG_TOGGLE_PVP", - "SMSG_ZONE_UNDER_ATTACK", - "MSG_AUCTION_HELLO", - "CMSG_AUCTION_SELL_ITEM", - "CMSG_AUCTION_REMOVE_ITEM", - "CMSG_AUCTION_LIST_ITEMS", - "CMSG_AUCTION_LIST_OWNER_ITEMS", - "CMSG_AUCTION_PLACE_BID", - "SMSG_AUCTION_COMMAND_RESULT", - "SMSG_AUCTION_LIST_RESULT", - "SMSG_AUCTION_OWNER_LIST_RESULT", - "SMSG_AUCTION_BIDDER_NOTIFICATION", - "SMSG_AUCTION_OWNER_NOTIFICATION", - "SMSG_PROCRESIST", - "SMSG_STANDSTATE_CHANGE_FAILURE_OBSOLETE", - "SMSG_DISPEL_FAILED", - "SMSG_SPELLORDAMAGE_IMMUNE", - "CMSG_AUCTION_LIST_BIDDER_ITEMS", - "SMSG_AUCTION_BIDDER_LIST_RESULT", - "SMSG_SET_FLAT_SPELL_MODIFIER", - "SMSG_SET_PCT_SPELL_MODIFIER", - "CMSG_SET_AMMO", - "SMSG_CORPSE_RECLAIM_DELAY", - "CMSG_SET_ACTIVE_MOVER", - "CMSG_PET_CANCEL_AURA", - "CMSG_PLAYER_AI_CHEAT", - "CMSG_CANCEL_AUTO_REPEAT_SPELL", - "MSG_GM_ACCOUNT_ONLINE", - "MSG_LIST_STABLED_PETS", - "CMSG_STABLE_PET", - "CMSG_UNSTABLE_PET", - "CMSG_BUY_STABLE_SLOT", - "SMSG_STABLE_RESULT", - "CMSG_STABLE_REVIVE_PET", - "CMSG_STABLE_SWAP_PET", - "MSG_QUEST_PUSH_RESULT", - "SMSG_PLAY_MUSIC", - "SMSG_PLAY_OBJECT_SOUND", - "CMSG_REQUEST_PET_INFO", - "CMSG_FAR_SIGHT", - "SMSG_SPELLDISPELLOG", - "SMSG_DAMAGE_CALC_LOG", - "CMSG_ENABLE_DAMAGE_LOG", - "CMSG_GROUP_CHANGE_SUB_GROUP", - "CMSG_REQUEST_PARTY_MEMBER_STATS", - "CMSG_GROUP_SWAP_SUB_GROUP", - "CMSG_RESET_FACTION_CHEAT", - "CMSG_AUTOSTORE_BANK_ITEM", - "CMSG_AUTOBANK_ITEM", - "MSG_QUERY_NEXT_MAIL_TIME", - "SMSG_RECEIVED_MAIL", - "SMSG_RAID_GROUP_ONLY", - "CMSG_SET_DURABILITY_CHEAT", - "CMSG_SET_PVP_RANK_CHEAT", - "CMSG_ADD_PVP_MEDAL_CHEAT", - "CMSG_DEL_PVP_MEDAL_CHEAT", - "CMSG_SET_PVP_TITLE", - "SMSG_PVP_CREDIT", - "SMSG_AUCTION_REMOVED_NOTIFICATION", - "CMSG_GROUP_RAID_CONVERT", - "CMSG_GROUP_ASSISTANT_LEADER", - "CMSG_BUYBACK_ITEM", - "SMSG_SERVER_MESSAGE", - "CMSG_MEETINGSTONE_JOIN", - "CMSG_MEETINGSTONE_LEAVE", - "CMSG_MEETINGSTONE_CHEAT", - "SMSG_MEETINGSTONE_SETQUEUE", - "CMSG_MEETINGSTONE_INFO", - "SMSG_MEETINGSTONE_COMPLETE", - "SMSG_MEETINGSTONE_IN_PROGRESS", - "SMSG_MEETINGSTONE_MEMBER_ADDED", - "CMSG_GMTICKETSYSTEM_TOGGLE", - "CMSG_CANCEL_GROWTH_AURA", - "SMSG_CANCEL_AUTO_REPEAT", - "SMSG_STANDSTATE_UPDATE", - "SMSG_LOOT_ALL_PASSED", - "SMSG_LOOT_ROLL_WON", - "CMSG_LOOT_ROLL", - "SMSG_LOOT_START_ROLL", - "SMSG_LOOT_ROLL", - "CMSG_LOOT_MASTER_GIVE", - "SMSG_LOOT_MASTER_LIST", - "SMSG_SET_FORCED_REACTIONS", - "SMSG_SPELL_FAILED_OTHER", - "SMSG_GAMEOBJECT_RESET_STATE", - "CMSG_REPAIR_ITEM", - "SMSG_CHAT_PLAYER_NOT_FOUND", - "MSG_TALENT_WIPE_CONFIRM", - "SMSG_SUMMON_REQUEST", - "CMSG_SUMMON_RESPONSE", - "MSG_MOVE_TOGGLE_GRAVITY_CHEAT", - "SMSG_MONSTER_MOVE_TRANSPORT", - "SMSG_PET_BROKEN", - "MSG_MOVE_FEATHER_FALL", - "MSG_MOVE_WATER_WALK", - "CMSG_SERVER_BROADCAST", - "CMSG_SELF_RES", - "SMSG_FEIGN_DEATH_RESISTED", - "CMSG_RUN_SCRIPT", - "SMSG_SCRIPT_MESSAGE", - "SMSG_DUEL_COUNTDOWN", - "SMSG_AREA_TRIGGER_MESSAGE", - "CMSG_SHOWING_HELM", - "CMSG_SHOWING_CLOAK", - "SMSG_MEETINGSTONE_JOINFAILED", - "SMSG_PLAYER_SKINNED", - "SMSG_DURABILITY_DAMAGE_DEATH", - "CMSG_SET_EXPLORATION", - "CMSG_SET_ACTIONBAR_TOGGLES", - "UMSG_DELETE_GUILD_CHARTER", - "MSG_PETITION_RENAME", - "SMSG_INIT_WORLD_STATES", - "SMSG_UPDATE_WORLD_STATE", - "CMSG_ITEM_NAME_QUERY", - "SMSG_ITEM_NAME_QUERY_RESPONSE", - "SMSG_PET_ACTION_FEEDBACK", - "CMSG_CHAR_RENAME", - "SMSG_CHAR_RENAME", - "CMSG_MOVE_SPLINE_DONE", - "CMSG_MOVE_FALL_RESET", - "SMSG_INSTANCE_SAVE_CREATED", - "SMSG_RAID_INSTANCE_INFO", - "CMSG_REQUEST_RAID_INFO", - "CMSG_MOVE_TIME_SKIPPED", - "CMSG_MOVE_FEATHER_FALL_ACK", - "CMSG_MOVE_WATER_WALK_ACK", - "CMSG_MOVE_NOT_ACTIVE_MOVER", - "SMSG_PLAY_SOUND", - "CMSG_BATTLEFIELD_STATUS", - "SMSG_BATTLEFIELD_STATUS", - "CMSG_BATTLEFIELD_PORT", - "MSG_INSPECT_HONOR_STATS", - "CMSG_BATTLEMASTER_HELLO", - "CMSG_MOVE_START_SWIM_CHEAT", - "CMSG_MOVE_STOP_SWIM_CHEAT", - "SMSG_FORCE_WALK_SPEED_CHANGE", - "CMSG_FORCE_WALK_SPEED_CHANGE_ACK", - "SMSG_FORCE_SWIM_BACK_SPEED_CHANGE", - "CMSG_FORCE_SWIM_BACK_SPEED_CHANGE_ACK", - "SMSG_FORCE_TURN_RATE_CHANGE", - "CMSG_FORCE_TURN_RATE_CHANGE_ACK", - "MSG_PVP_LOG_DATA", - "CMSG_LEAVE_BATTLEFIELD", - "CMSG_AREA_SPIRIT_HEALER_QUERY", - "CMSG_AREA_SPIRIT_HEALER_QUEUE", - "SMSG_AREA_SPIRIT_HEALER_TIME", - "CMSG_GM_UNTEACH", - "SMSG_WARDEN_DATA", - "CMSG_WARDEN_DATA", - "SMSG_GROUP_JOINED_BATTLEGROUND", - "MSG_BATTLEGROUND_PLAYER_POSITIONS", - "CMSG_PET_STOP_ATTACK", - "SMSG_BINDER_CONFIRM", - "SMSG_BATTLEGROUND_PLAYER_JOINED", - "SMSG_BATTLEGROUND_PLAYER_LEFT", - "CMSG_BATTLEMASTER_JOIN", - "SMSG_ADDON_INFO", - "CMSG_PET_UNLEARN", - "SMSG_PET_UNLEARN_CONFIRM", - "SMSG_PARTY_MEMBER_STATS_FULL", - "CMSG_PET_SPELL_AUTOCAST", - "SMSG_WEATHER", - "SMSG_PLAY_TIME_WARNING", - "SMSG_MINIGAME_SETUP", - "SMSG_MINIGAME_STATE", - "CMSG_MINIGAME_MOVE", - "SMSG_MINIGAME_MOVE_FAILED", - "SMSG_RAID_INSTANCE_MESSAGE", - "SMSG_COMPRESSED_MOVES", - "CMSG_GUILD_INFO_TEXT", - "SMSG_CHAT_RESTRICTED", - "SMSG_SPLINE_SET_RUN_SPEED", - "SMSG_SPLINE_SET_RUN_BACK_SPEED", - "SMSG_SPLINE_SET_SWIM_SPEED", - "SMSG_SPLINE_SET_WALK_SPEED", - "SMSG_SPLINE_SET_SWIM_BACK_SPEED", - "SMSG_SPLINE_SET_TURN_RATE", - "SMSG_SPLINE_MOVE_UNROOT", - "SMSG_SPLINE_MOVE_FEATHER_FALL", - "SMSG_SPLINE_MOVE_NORMAL_FALL", - "SMSG_SPLINE_MOVE_SET_HOVER", - "SMSG_SPLINE_MOVE_UNSET_HOVER", - "SMSG_SPLINE_MOVE_WATER_WALK", - "SMSG_SPLINE_MOVE_LAND_WALK", - "SMSG_SPLINE_MOVE_START_SWIM", - "SMSG_SPLINE_MOVE_STOP_SWIM", - "SMSG_SPLINE_MOVE_SET_RUN_MODE", - "SMSG_SPLINE_MOVE_SET_WALK_MODE", - "CMSG_GM_NUKE_ACCOUNT", - "MSG_GM_DESTROY_CORPSE", - "CMSG_GM_DESTROY_ONLINE_CORPSE", - "CMSG_ACTIVATETAXIEXPRESS", - "SMSG_SET_FACTION_ATWAR", - "SMSG_GAMETIMEBIAS_SET", - "CMSG_DEBUG_ACTIONS_START", - "CMSG_DEBUG_ACTIONS_STOP", - "CMSG_SET_FACTION_INACTIVE", - "CMSG_SET_WATCHED_FACTION", - "MSG_MOVE_TIME_SKIPPED", - "SMSG_SPLINE_MOVE_ROOT", - "CMSG_SET_EXPLORATION_ALL", - "SMSG_INVALIDATE_PLAYER", - "CMSG_RESET_INSTANCES", - "SMSG_INSTANCE_RESET", - "SMSG_INSTANCE_RESET_FAILED", - "SMSG_UPDATE_LAST_INSTANCE", - "MSG_RAID_TARGET_UPDATE", - "MSG_RAID_READY_CHECK", - "CMSG_LUA_USAGE", - "SMSG_PET_ACTION_SOUND", - "SMSG_PET_DISMISS_SOUND", - "SMSG_GHOSTEE_GONE", - "CMSG_GM_UPDATE_TICKET_STATUS", - "SMSG_GM_TICKET_STATUS_UPDATE", - "MSG_SET_DUNGEON_DIFFICULTY", - "CMSG_GMSURVEY_SUBMIT", - "SMSG_UPDATE_INSTANCE_OWNERSHIP", - "CMSG_IGNORE_KNOCKBACK_CHEAT", - "SMSG_CHAT_PLAYER_AMBIGUOUS", - "MSG_DELAY_GHOST_TELEPORT", - "SMSG_SPELLINSTAKILLLOG", - "SMSG_SPELL_UPDATE_CHAIN_TARGETS", - "CMSG_CHAT_FILTERED", - "SMSG_EXPECTED_SPAM_RECORDS", - "SMSG_SPELLSTEALLOG", - "CMSG_LOTTERY_QUERY_OBSOLETE", - "SMSG_LOTTERY_QUERY_RESULT_OBSOLETE", - "CMSG_BUY_LOTTERY_TICKET_OBSOLETE", - "SMSG_LOTTERY_RESULT_OBSOLETE", - "SMSG_CHARACTER_PROFILE", - "SMSG_CHARACTER_PROFILE_REALM_CONNECTED", - "SMSG_DEFENSE_MESSAGE", - "SMSG_INSTANCE_DIFFICULTY", - "MSG_GM_RESETINSTANCELIMIT", - "SMSG_MOTD", - "SMSG_MOVE_SET_FLIGHT_OBSOLETE", - "SMSG_MOVE_UNSET_FLIGHT_OBSOLETE", - "CMSG_MOVE_FLIGHT_ACK_OBSOLETE", - "MSG_MOVE_START_SWIM_CHEAT", - "MSG_MOVE_STOP_SWIM_CHEAT", - "SMSG_MOVE_SET_CAN_FLY", - "SMSG_MOVE_UNSET_CAN_FLY", - "CMSG_MOVE_SET_CAN_FLY_ACK", - "CMSG_MOVE_SET_FLY", - "CMSG_SOCKET_GEMS", - "CMSG_ARENA_TEAM_CREATE", - "SMSG_ARENA_TEAM_COMMAND_RESULT", - "UMSG_UPDATE_ARENA_TEAM_OBSOLETE", - "CMSG_ARENA_TEAM_QUERY", - "SMSG_ARENA_TEAM_QUERY_RESPONSE", - "CMSG_ARENA_TEAM_ROSTER", - "SMSG_ARENA_TEAM_ROSTER", - "CMSG_ARENA_TEAM_INVITE", - "SMSG_ARENA_TEAM_INVITE", - "CMSG_ARENA_TEAM_ACCEPT", - "CMSG_ARENA_TEAM_DECLINE", - "CMSG_ARENA_TEAM_LEAVE", - "CMSG_ARENA_TEAM_REMOVE", - "CMSG_ARENA_TEAM_DISBAND", - "CMSG_ARENA_TEAM_LEADER", - "SMSG_ARENA_TEAM_EVENT", - "CMSG_BATTLEMASTER_JOIN_ARENA", - "MSG_MOVE_START_ASCEND", - "MSG_MOVE_STOP_ASCEND", - "SMSG_ARENA_TEAM_STATS", - "CMSG_LFG_SET_AUTOJOIN", - "CMSG_LFG_CLEAR_AUTOJOIN", - "CMSG_LFM_SET_AUTOFILL", - "CMSG_LFM_CLEAR_AUTOFILL", - "CMSG_ACCEPT_LFG_MATCH", - "CMSG_DECLINE_LFG_MATCH", - "CMSG_CANCEL_PENDING_LFG", - "CMSG_CLEAR_LOOKING_FOR_GROUP", - "CMSG_CLEAR_LOOKING_FOR_MORE", - "CMSG_SET_LOOKING_FOR_MORE", - "CMSG_SET_LFG_COMMENT", - "SMSG_LFG_TIMEDOUT", - "SMSG_LFG_OTHER_TIMEDOUT", - "SMSG_LFG_AUTOJOIN_FAILED", - "SMSG_LFG_AUTOJOIN_FAILED_NO_PLAYER", - "SMSG_LFG_LEADER_IS_LFM", - "SMSG_LFG_UPDATE", - "SMSG_LFG_UPDATE_LFM", - "SMSG_LFG_UPDATE_LFG", - "SMSG_LFG_UPDATE_QUEUED", - "SMSG_LFG_PENDING_INVITE", - "SMSG_LFG_PENDING_MATCH", - "SMSG_LFG_PENDING_MATCH_DONE", - "SMSG_TITLE_EARNED", - "CMSG_SET_TITLE", - "CMSG_CANCEL_MOUNT_AURA", - "SMSG_ARENA_ERROR", - "MSG_INSPECT_ARENA_TEAMS", - "SMSG_DEATH_RELEASE_LOC", - "CMSG_CANCEL_TEMP_ENCHANTMENT", - "SMSG_FORCED_DEATH_UPDATE", - "CMSG_CHEAT_SET_HONOR_CURRENCY", - "CMSG_CHEAT_SET_ARENA_CURRENCY", - "MSG_MOVE_SET_FLIGHT_SPEED_CHEAT", - "MSG_MOVE_SET_FLIGHT_SPEED", - "MSG_MOVE_SET_FLIGHT_BACK_SPEED_CHEAT", - "MSG_MOVE_SET_FLIGHT_BACK_SPEED", - "SMSG_FORCE_FLIGHT_SPEED_CHANGE", - "CMSG_FORCE_FLIGHT_SPEED_CHANGE_ACK", - "SMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE", - "CMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK", - "SMSG_SPLINE_SET_FLIGHT_SPEED", - "SMSG_SPLINE_SET_FLIGHT_BACK_SPEED", - "CMSG_MAELSTROM_INVALIDATE_CACHE", - "SMSG_FLIGHT_SPLINE_SYNC", - "CMSG_SET_TAXI_BENCHMARK_MODE", - "SMSG_JOINED_BATTLEGROUND_QUEUE", - "SMSG_REALM_SPLIT", - "CMSG_REALM_SPLIT", - "CMSG_MOVE_CHNG_TRANSPORT", - "MSG_PARTY_ASSIGNMENT", - "SMSG_OFFER_PETITION_ERROR", - "SMSG_TIME_SYNC_REQ", - "CMSG_TIME_SYNC_RESP", - "CMSG_SEND_LOCAL_EVENT", - "CMSG_SEND_GENERAL_TRIGGER", - "CMSG_SEND_COMBAT_TRIGGER", - "CMSG_MAELSTROM_GM_SENT_MAIL", - "SMSG_RESET_FAILED_NOTIFY", - "SMSG_REAL_GROUP_UPDATE", - "SMSG_LFG_DISABLED", - "CMSG_ACTIVE_PVP_CHEAT", - "CMSG_CHEAT_DUMP_ITEMS_DEBUG_ONLY", - "SMSG_CHEAT_DUMP_ITEMS_DEBUG_ONLY_RESPONSE", - "SMSG_CHEAT_DUMP_ITEMS_DEBUG_ONLY_RESPONSE_WRITE_FILE", - "SMSG_UPDATE_COMBO_POINTS", - "SMSG_VOICE_SESSION_ROSTER_UPDATE", - "SMSG_VOICE_SESSION_LEAVE", - "SMSG_VOICE_SESSION_ADJUST_PRIORITY", - "CMSG_VOICE_SET_TALKER_MUTED_REQUEST", - "SMSG_VOICE_SET_TALKER_MUTED", - "SMSG_INIT_EXTRA_AURA_INFO_OBSOLETE", - "SMSG_SET_EXTRA_AURA_INFO_OBSOLETE", - "SMSG_SET_EXTRA_AURA_INFO_NEED_UPDATE_OBSOLETE", - "SMSG_CLEAR_EXTRA_AURA_INFO_OBSOLETE", - "MSG_MOVE_START_DESCEND", - "CMSG_IGNORE_REQUIREMENTS_CHEAT", - "SMSG_IGNORE_REQUIREMENTS_CHEAT", - "SMSG_SPELL_CHANCE_PROC_LOG", - "CMSG_MOVE_SET_RUN_SPEED", - "SMSG_DISMOUNT", - "MSG_MOVE_UPDATE_CAN_FLY", - "MSG_RAID_READY_CHECK_CONFIRM", - "CMSG_VOICE_SESSION_ENABLE", - "SMSG_VOICE_SESSION_ENABLE", - "SMSG_VOICE_PARENTAL_CONTROLS", - "CMSG_GM_WHISPER", - "SMSG_GM_MESSAGECHAT", - "MSG_GM_GEARRATING", - "CMSG_COMMENTATOR_ENABLE", - "SMSG_COMMENTATOR_STATE_CHANGED", - "CMSG_COMMENTATOR_GET_MAP_INFO", - "SMSG_COMMENTATOR_MAP_INFO", - "CMSG_COMMENTATOR_GET_PLAYER_INFO", - "SMSG_COMMENTATOR_GET_PLAYER_INFO", - "SMSG_COMMENTATOR_PLAYER_INFO", - "CMSG_COMMENTATOR_ENTER_INSTANCE", - "CMSG_COMMENTATOR_EXIT_INSTANCE", - "CMSG_COMMENTATOR_INSTANCE_COMMAND", - "SMSG_CLEAR_TARGET", - "CMSG_BOT_DETECTED", - "SMSG_CROSSED_INEBRIATION_THRESHOLD", - "CMSG_CHEAT_PLAYER_LOGIN", - "CMSG_CHEAT_PLAYER_LOOKUP", - "SMSG_CHEAT_PLAYER_LOOKUP", - "SMSG_KICK_REASON", - "MSG_RAID_READY_CHECK_FINISHED", - "CMSG_COMPLAIN", - "SMSG_COMPLAIN_RESULT", - "SMSG_FEATURE_SYSTEM_STATUS", - "CMSG_GM_SHOW_COMPLAINTS", - "CMSG_GM_UNSQUELCH", - "CMSG_CHANNEL_SILENCE_VOICE", - "CMSG_CHANNEL_SILENCE_ALL", - "CMSG_CHANNEL_UNSILENCE_VOICE", - "CMSG_CHANNEL_UNSILENCE_ALL", - "CMSG_TARGET_CAST", - "CMSG_TARGET_SCRIPT_CAST", - "CMSG_CHANNEL_DISPLAY_LIST", - "CMSG_SET_ACTIVE_VOICE_CHANNEL", - "CMSG_GET_CHANNEL_MEMBER_COUNT", - "SMSG_CHANNEL_MEMBER_COUNT", - "CMSG_CHANNEL_VOICE_ON", - "CMSG_CHANNEL_VOICE_OFF", - "CMSG_DEBUG_LIST_TARGETS", - "SMSG_DEBUG_LIST_TARGETS", - "SMSG_AVAILABLE_VOICE_CHANNEL", - "CMSG_ADD_VOICE_IGNORE", - "CMSG_DEL_VOICE_IGNORE", - "CMSG_PARTY_SILENCE", - "CMSG_PARTY_UNSILENCE", - "MSG_NOTIFY_PARTY_SQUELCH", - "SMSG_COMSAT_RECONNECT_TRY", - "SMSG_COMSAT_DISCONNECT", - "SMSG_COMSAT_CONNECT_FAIL", - "SMSG_VOICE_CHAT_STATUS", - "CMSG_REPORT_PVP_AFK", - "CMSG_REPORT_PVP_AFK_RESULT", - "CMSG_GUILD_BANKER_ACTIVATE", - "CMSG_GUILD_BANK_QUERY_TAB", - "SMSG_GUILD_BANK_LIST", - "CMSG_GUILD_BANK_SWAP_ITEMS", - "CMSG_GUILD_BANK_BUY_TAB", - "CMSG_GUILD_BANK_UPDATE_TAB", - "CMSG_GUILD_BANK_DEPOSIT_MONEY", - "CMSG_GUILD_BANK_WITHDRAW_MONEY", - "MSG_GUILD_BANK_LOG_QUERY", - "CMSG_SET_CHANNEL_WATCH", - "SMSG_USERLIST_ADD", - "SMSG_USERLIST_REMOVE", - "SMSG_USERLIST_UPDATE", - "CMSG_CLEAR_CHANNEL_WATCH", - "SMSG_INSPECT_TALENT", - "SMSG_GOGOGO_OBSOLETE", - "SMSG_ECHO_PARTY_SQUELCH", - "CMSG_SET_TITLE_SUFFIX", - "CMSG_SPELLCLICK", - "SMSG_LOOT_LIST", - "CMSG_GM_CHARACTER_RESTORE", - "CMSG_GM_CHARACTER_SAVE", - "SMSG_VOICESESSION_FULL", - "MSG_GUILD_PERMISSIONS", - "MSG_GUILD_BANK_MONEY_WITHDRAWN", - "MSG_GUILD_EVENT_LOG_QUERY", - "CMSG_MAELSTROM_RENAME_GUILD", - "CMSG_GET_MIRRORIMAGE_DATA", - "SMSG_MIRRORIMAGE_DATA", - "SMSG_FORCE_DISPLAY_UPDATE", - "SMSG_SPELL_CHANCE_RESIST_PUSHBACK", - "CMSG_IGNORE_DIMINISHING_RETURNS_CHEAT", - "SMSG_IGNORE_DIMINISHING_RETURNS_CHEAT", - "CMSG_KEEP_ALIVE", - "SMSG_RAID_READY_CHECK_ERROR", - "CMSG_OPT_OUT_OF_LOOT", - "MSG_QUERY_GUILD_BANK_TEXT", - "CMSG_SET_GUILD_BANK_TEXT", - "CMSG_SET_GRANTABLE_LEVELS", - "CMSG_GRANT_LEVEL", - "CMSG_REFER_A_FRIEND", - "MSG_GM_CHANGE_ARENA_RATING", - "CMSG_DECLINE_CHANNEL_INVITE", - "CMSG_GROUPACTION_THROTTLED", - "SMSG_OVERRIDE_LIGHT", - "SMSG_TOTEM_CREATED", - "CMSG_TOTEM_DESTROYED", - "CMSG_EXPIRE_RAID_INSTANCE", - "CMSG_NO_SPELL_VARIANCE", - "CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY", - "SMSG_QUESTGIVER_STATUS_MULTIPLE", - "CMSG_SET_PLAYER_DECLINED_NAMES", - "SMSG_SET_PLAYER_DECLINED_NAMES_RESULT", - "CMSG_QUERY_SERVER_BUCK_DATA", - "CMSG_CLEAR_SERVER_BUCK_DATA", - "SMSG_SERVER_BUCK_DATA", - "SMSG_SEND_UNLEARN_SPELLS", - "SMSG_PROPOSE_LEVEL_GRANT", - "CMSG_ACCEPT_LEVEL_GRANT", - "SMSG_REFER_A_FRIEND_FAILURE", - "SMSG_SPLINE_MOVE_SET_FLYING", - "SMSG_SPLINE_MOVE_UNSET_FLYING", - "SMSG_SUMMON_CANCEL", - "CMSG_CHANGE_PERSONAL_ARENA_RATING", - "CMSG_ALTER_APPEARANCE", - "SMSG_ENABLE_BARBER_SHOP", - "SMSG_BARBER_SHOP_RESULT", - "CMSG_CALENDAR_GET_CALENDAR", - "CMSG_CALENDAR_GET_EVENT", - "CMSG_CALENDAR_GUILD_FILTER", - "CMSG_CALENDAR_ARENA_TEAM", - "CMSG_CALENDAR_ADD_EVENT", - "CMSG_CALENDAR_UPDATE_EVENT", - "CMSG_CALENDAR_REMOVE_EVENT", - "CMSG_CALENDAR_COPY_EVENT", - "CMSG_CALENDAR_EVENT_INVITE", - "CMSG_CALENDAR_EVENT_RSVP", - "CMSG_CALENDAR_EVENT_REMOVE_INVITE", - "CMSG_CALENDAR_EVENT_STATUS", - "CMSG_CALENDAR_EVENT_MODERATOR_STATUS", - "SMSG_CALENDAR_SEND_CALENDAR", - "SMSG_CALENDAR_SEND_EVENT", - "SMSG_CALENDAR_FILTER_GUILD", - "SMSG_CALENDAR_ARENA_TEAM", - "SMSG_CALENDAR_EVENT_INVITE", - "SMSG_CALENDAR_EVENT_INVITE_REMOVED", - "SMSG_CALENDAR_EVENT_STATUS", - "SMSG_CALENDAR_COMMAND_RESULT", - "SMSG_CALENDAR_RAID_LOCKOUT_ADDED", - "SMSG_CALENDAR_RAID_LOCKOUT_REMOVED", - "SMSG_CALENDAR_EVENT_INVITE_ALERT", - "SMSG_CALENDAR_EVENT_INVITE_REMOVED_ALERT", - "SMSG_CALENDAR_EVENT_INVITE_STATUS_ALERT", - "SMSG_CALENDAR_EVENT_REMOVED_ALERT", - "SMSG_CALENDAR_EVENT_UPDATED_ALERT", - "SMSG_CALENDAR_EVENT_MODERATOR_STATUS_ALERT", - "CMSG_CALENDAR_COMPLAIN", - "CMSG_CALENDAR_GET_NUM_PENDING", - "SMSG_CALENDAR_SEND_NUM_PENDING", - "CMSG_SAVE_DANCE", - "SMSG_NOTIFY_DANCE", - "CMSG_PLAY_DANCE", - "SMSG_PLAY_DANCE", - "CMSG_LOAD_DANCES", - "CMSG_STOP_DANCE", - "SMSG_STOP_DANCE", - "CMSG_SYNC_DANCE", - "CMSG_DANCE_QUERY", - "SMSG_DANCE_QUERY_RESPONSE", - "SMSG_INVALIDATE_DANCE", - "CMSG_DELETE_DANCE", - "SMSG_LEARNED_DANCE_MOVES", - "CMSG_LEARN_DANCE_MOVE", - "CMSG_UNLEARN_DANCE_MOVE", - "CMSG_SET_RUNE_COUNT", - "CMSG_SET_RUNE_COOLDOWN", - "MSG_MOVE_SET_PITCH_RATE_CHEAT", - "MSG_MOVE_SET_PITCH_RATE", - "SMSG_FORCE_PITCH_RATE_CHANGE", - "CMSG_FORCE_PITCH_RATE_CHANGE_ACK", - "SMSG_SPLINE_SET_PITCH_RATE", - "SMSG_MOVE_ABANDON_TRANSPORT", - "MSG_MOVE_ABANDON_TRANSPORT", - "CMSG_MOVE_ABANDON_TRANSPORT_ACK", - "CMSG_UPDATE_MISSILE_TRAJECTORY", - "SMSG_UPDATE_ACCOUNT_DATA_COMPLETE", - "SMSG_TRIGGER_MOVIE", - "CMSG_COMPLETE_MOVIE", - "CMSG_SET_GLYPH_SLOT", - "CMSG_SET_GLYPH", - "SMSG_ACHIEVEMENT_EARNED", - "SMSG_DYNAMIC_DROP_ROLL_RESULT", - "SMSG_CRITERIA_UPDATE", - "CMSG_QUERY_INSPECT_ACHIEVEMENTS", - "SMSG_RESPOND_INSPECT_ACHIEVEMENTS", - "CMSG_DISMISS_CONTROLLED_VEHICLE", - "CMSG_COMPLETE_ACHIEVEMENT_CHEAT", - "SMSG_QUESTUPDATE_ADD_PVP_KILL", - "CMSG_SET_CRITERIA_CHEAT", - "SMSG_GROUP_SWAP_FAILED", - "CMSG_UNITANIMTIER_CHEAT", - "CMSG_CHAR_CUSTOMIZE", - "SMSG_CHAR_CUSTOMIZE", - "SMSG_PET_RENAMEABLE", - "CMSG_REQUEST_VEHICLE_EXIT", - "CMSG_REQUEST_VEHICLE_PREV_SEAT", - "CMSG_REQUEST_VEHICLE_NEXT_SEAT", - "CMSG_REQUEST_VEHICLE_SWITCH_SEAT", - "CMSG_PET_LEARN_TALENT", - "CMSG_PET_UNLEARN_TALENTS", - "SMSG_SET_PHASE_SHIFT", - "SMSG_ALL_ACHIEVEMENT_DATA", - "CMSG_FORCE_SAY_CHEAT", - "SMSG_HEALTH_UPDATE", - "SMSG_POWER_UPDATE", - "CMSG_GAMEOBJ_REPORT_USE", - "SMSG_HIGHEST_THREAT_UPDATE", - "SMSG_THREAT_UPDATE", - "SMSG_THREAT_REMOVE", - "SMSG_THREAT_CLEAR", - "SMSG_CONVERT_RUNE", - "SMSG_RESYNC_RUNES", - "SMSG_ADD_RUNE_POWER", - "CMSG_START_QUEST", - "CMSG_REMOVE_GLYPH", - "CMSG_DUMP_OBJECTS", - "SMSG_DUMP_OBJECTS_DATA", - "CMSG_DISMISS_CRITTER", - "SMSG_NOTIFY_DEST_LOC_SPELL_CAST", - "CMSG_AUCTION_LIST_PENDING_SALES", - "SMSG_AUCTION_LIST_PENDING_SALES", - "SMSG_MODIFY_COOLDOWN", - "SMSG_PET_UPDATE_COMBO_POINTS", - "CMSG_ENABLETAXI", - "SMSG_PRE_RESURRECT", - "SMSG_AURA_UPDATE_ALL", - "SMSG_AURA_UPDATE", - "CMSG_FLOOD_GRACE_CHEAT", - "SMSG_SERVER_FIRST_ACHIEVEMENT", - "SMSG_PET_LEARNED_SPELL", - "SMSG_PET_REMOVED_SPELL", - "CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE", - "CMSG_HEARTH_AND_RESURRECT", - "SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA", - "SMSG_CRITERIA_DELETED", - "SMSG_ACHIEVEMENT_DELETED", - "CMSG_SERVER_INFO_QUERY", - "SMSG_SERVER_INFO_RESPONSE", - "CMSG_CHECK_LOGIN_CRITERIA", - "SMSG_SERVER_BUCK_DATA_START", - "CMSG_QUERY_VEHICLE_STATUS", - "SMSG_PET_GUIDS", - "SMSG_CLIENTCACHE_VERSION", - "UMSG_UNKNOWN_1191", - "UMSG_UNKNOWN_1192", - "UMSG_UNKNOWN_1193", - "UMSG_UNKNOWN_1194", - "UMSG_UNKNOWN_1195", - "UMSG_UNKNOWN_1196", + "MSG_NULL_ACTION", // 0x0000 + "CMSG_BOOTME", // 0x0001 + "CMSG_DBLOOKUP", // 0x0002 + "SMSG_DBLOOKUP", // 0x0003 + "CMSG_QUERY_OBJECT_POSITION", // 0x0004 + "SMSG_QUERY_OBJECT_POSITION", // 0x0005 + "CMSG_QUERY_OBJECT_ROTATION", // 0x0006 + "SMSG_QUERY_OBJECT_ROTATION", // 0x0007 + "CMSG_WORLD_TELEPORT", // 0x0008 + "CMSG_TELEPORT_TO_UNIT", // 0x0009 + "CMSG_ZONE_MAP", // 0x000A + "SMSG_ZONE_MAP", // 0x000B + "CMSG_DEBUG_CHANGECELLZONE", // 0x000C + "CMSG_MOVE_CHARACTER_CHEAT", // 0x000D + "SMSG_MOVE_CHARACTER_CHEAT", // 0x000E + "CMSG_RECHARGE", // 0x000F + "CMSG_LEARN_SPELL", // 0x0010 + "CMSG_CREATEMONSTER", // 0x0011 + "CMSG_DESTROYMONSTER", // 0x0012 + "CMSG_CREATEITEM", // 0x0013 + "CMSG_CREATEGAMEOBJECT", // 0x0014 + "SMSG_CHECK_FOR_BOTS", // 0x0015 + "CMSG_MAKEMONSTERATTACKGUID", // 0x0016 + "CMSG_BOT_DETECTED2", // 0x0017 + "CMSG_FORCEACTION", // 0x0018 + "CMSG_FORCEACTIONONOTHER", // 0x0019 + "CMSG_FORCEACTIONSHOW", // 0x001A + "SMSG_FORCEACTIONSHOW", // 0x001B + "CMSG_PETGODMODE", // 0x001C + "SMSG_PETGODMODE", // 0x001D + "SMSG_REFER_A_FRIEND_EXPIRED", // 0x001E + "CMSG_WEATHER_SPEED_CHEAT", // 0x001F + "CMSG_UNDRESSPLAYER", // 0x0020 + "CMSG_BEASTMASTER", // 0x0021 + "CMSG_GODMODE", // 0x0022 + "SMSG_GODMODE", // 0x0023 + "CMSG_CHEAT_SETMONEY", // 0x0024 + "CMSG_LEVEL_CHEAT", // 0x0025 + "CMSG_PET_LEVEL_CHEAT", // 0x0026 + "CMSG_SET_WORLDSTATE", // 0x0027 + "CMSG_COOLDOWN_CHEAT", // 0x0028 + "CMSG_USE_SKILL_CHEAT", // 0x0029 + "CMSG_FLAG_QUEST", // 0x002A + "CMSG_FLAG_QUEST_FINISH", // 0x002B + "CMSG_CLEAR_QUEST", // 0x002C + "CMSG_SEND_EVENT", // 0x002D + "CMSG_DEBUG_AISTATE", // 0x002E + "SMSG_DEBUG_AISTATE", // 0x002F + "CMSG_DISABLE_PVP_CHEAT", // 0x0030 + "CMSG_ADVANCE_SPAWN_TIME", // 0x0031 + "SMSG_DESTRUCTIBLE_BUILDING_DAMAGE", // 0x0032 + "CMSG_AUTH_SRP6_BEGIN", // 0x0033 + "CMSG_AUTH_SRP6_PROOF", // 0x0034 + "CMSG_AUTH_SRP6_RECODE", // 0x0035 + "CMSG_CHAR_CREATE", // 0x0036 + "CMSG_CHAR_ENUM", // 0x0037 + "CMSG_CHAR_DELETE", // 0x0038 + "SMSG_AUTH_SRP6_RESPONSE", // 0x0039 + "SMSG_CHAR_CREATE", // 0x003A + "SMSG_CHAR_ENUM", // 0x003B + "SMSG_CHAR_DELETE", // 0x003C + "CMSG_PLAYER_LOGIN", // 0x003D + "SMSG_NEW_WORLD", // 0x003E + "SMSG_TRANSFER_PENDING", // 0x003F + "SMSG_TRANSFER_ABORTED", // 0x0040 + "SMSG_CHARACTER_LOGIN_FAILED", // 0x0041 + "SMSG_LOGIN_SETTIMESPEED", // 0x0042 + "SMSG_GAMETIME_UPDATE", // 0x0043 + "CMSG_GAMETIME_SET", // 0x0044 + "SMSG_GAMETIME_SET", // 0x0045 + "CMSG_GAMESPEED_SET", // 0x0046 + "SMSG_GAMESPEED_SET", // 0x0047 + "CMSG_SERVERTIME", // 0x0048 + "SMSG_SERVERTIME", // 0x0049 + "CMSG_PLAYER_LOGOUT", // 0x004A + "CMSG_LOGOUT_REQUEST", // 0x004B + "SMSG_LOGOUT_RESPONSE", // 0x004C + "SMSG_LOGOUT_COMPLETE", // 0x004D + "CMSG_LOGOUT_CANCEL", // 0x004E + "SMSG_LOGOUT_CANCEL_ACK", // 0x004F + "CMSG_NAME_QUERY", // 0x0050 + "SMSG_NAME_QUERY_RESPONSE", // 0x0051 + "CMSG_PET_NAME_QUERY", // 0x0052 + "SMSG_PET_NAME_QUERY_RESPONSE", // 0x0053 + "CMSG_GUILD_QUERY", // 0x0054 + "SMSG_GUILD_QUERY_RESPONSE", // 0x0055 + "CMSG_ITEM_QUERY_SINGLE", // 0x0056 + "CMSG_ITEM_QUERY_MULTIPLE", // 0x0057 + "SMSG_ITEM_QUERY_SINGLE_RESPONSE", // 0x0058 + "SMSG_ITEM_QUERY_MULTIPLE_RESPONSE", // 0x0059 + "CMSG_PAGE_TEXT_QUERY", // 0x005A + "SMSG_PAGE_TEXT_QUERY_RESPONSE", // 0x005B + "CMSG_QUEST_QUERY", // 0x005C + "SMSG_QUEST_QUERY_RESPONSE", // 0x005D + "CMSG_GAMEOBJECT_QUERY", // 0x005E + "SMSG_GAMEOBJECT_QUERY_RESPONSE", // 0x005F + "CMSG_CREATURE_QUERY", // 0x0060 + "SMSG_CREATURE_QUERY_RESPONSE", // 0x0061 + "CMSG_WHO", // 0x0062 + "SMSG_WHO", // 0x0063 + "CMSG_WHOIS", // 0x0064 + "SMSG_WHOIS", // 0x0065 + "CMSG_CONTACT_LIST", // 0x0066 + "SMSG_CONTACT_LIST", // 0x0067 + "SMSG_FRIEND_STATUS", // 0x0068 + "CMSG_ADD_FRIEND", // 0x0069 + "CMSG_DEL_FRIEND", // 0x006A + "CMSG_SET_CONTACT_NOTES", // 0x006B + "CMSG_ADD_IGNORE", // 0x006C + "CMSG_DEL_IGNORE", // 0x006D + "CMSG_GROUP_INVITE", // 0x006E + "SMSG_GROUP_INVITE", // 0x006F + "CMSG_GROUP_CANCEL", // 0x0070 + "SMSG_GROUP_CANCEL", // 0x0071 + "CMSG_GROUP_ACCEPT", // 0x0072 + "CMSG_GROUP_DECLINE", // 0x0073 + "SMSG_GROUP_DECLINE", // 0x0074 + "CMSG_GROUP_UNINVITE", // 0x0075 + "CMSG_GROUP_UNINVITE_GUID", // 0x0076 + "SMSG_GROUP_UNINVITE", // 0x0077 + "CMSG_GROUP_SET_LEADER", // 0x0078 + "SMSG_GROUP_SET_LEADER", // 0x0079 + "CMSG_LOOT_METHOD", // 0x007A + "CMSG_GROUP_DISBAND", // 0x007B + "SMSG_GROUP_DESTROYED", // 0x007C + "SMSG_GROUP_LIST", // 0x007D + "SMSG_PARTY_MEMBER_STATS", // 0x007E + "SMSG_PARTY_COMMAND_RESULT", // 0x007F + "UMSG_UPDATE_GROUP_MEMBERS", // 0x0080 + "CMSG_GUILD_CREATE", // 0x0081 + "CMSG_GUILD_INVITE", // 0x0082 + "SMSG_GUILD_INVITE", // 0x0083 + "CMSG_GUILD_ACCEPT", // 0x0084 + "CMSG_GUILD_DECLINE", // 0x0085 + "SMSG_GUILD_DECLINE", // 0x0086 + "CMSG_GUILD_INFO", // 0x0087 + "SMSG_GUILD_INFO", // 0x0088 + "CMSG_GUILD_ROSTER", // 0x0089 + "SMSG_GUILD_ROSTER", // 0x008A + "CMSG_GUILD_PROMOTE", // 0x008B + "CMSG_GUILD_DEMOTE", // 0x008C + "CMSG_GUILD_LEAVE", // 0x008D + "CMSG_GUILD_REMOVE", // 0x008E + "CMSG_GUILD_DISBAND", // 0x008F + "CMSG_GUILD_LEADER", // 0x0090 + "CMSG_GUILD_MOTD", // 0x0091 + "SMSG_GUILD_EVENT", // 0x0092 + "SMSG_GUILD_COMMAND_RESULT", // 0x0093 + "UMSG_UPDATE_GUILD", // 0x0094 + "CMSG_MESSAGECHAT", // 0x0095 + "SMSG_MESSAGECHAT", // 0x0096 + "CMSG_JOIN_CHANNEL", // 0x0097 + "CMSG_LEAVE_CHANNEL", // 0x0098 + "SMSG_CHANNEL_NOTIFY", // 0x0099 + "CMSG_CHANNEL_LIST", // 0x009A + "SMSG_CHANNEL_LIST", // 0x009B + "CMSG_CHANNEL_PASSWORD", // 0x009C + "CMSG_CHANNEL_SET_OWNER", // 0x009D + "CMSG_CHANNEL_OWNER", // 0x009E + "CMSG_CHANNEL_MODERATOR", // 0x009F + "CMSG_CHANNEL_UNMODERATOR", // 0x00A0 + "CMSG_CHANNEL_MUTE", // 0x00A1 + "CMSG_CHANNEL_UNMUTE", // 0x00A2 + "CMSG_CHANNEL_INVITE", // 0x00A3 + "CMSG_CHANNEL_KICK", // 0x00A4 + "CMSG_CHANNEL_BAN", // 0x00A5 + "CMSG_CHANNEL_UNBAN", // 0x00A6 + "CMSG_CHANNEL_ANNOUNCEMENTS", // 0x00A7 + "CMSG_CHANNEL_MODERATE", // 0x00A8 + "SMSG_UPDATE_OBJECT", // 0x00A9 + "SMSG_DESTROY_OBJECT", // 0x00AA + "CMSG_USE_ITEM", // 0x00AB + "CMSG_OPEN_ITEM", // 0x00AC + "CMSG_READ_ITEM", // 0x00AD + "SMSG_READ_ITEM_OK", // 0x00AE + "SMSG_READ_ITEM_FAILED", // 0x00AF + "SMSG_ITEM_COOLDOWN", // 0x00B0 + "CMSG_GAMEOBJ_USE", // 0x00B1 + "CMSG_DESTROY_ITEMS", // 0x00B2 + "SMSG_GAMEOBJECT_CUSTOM_ANIM", // 0x00B3 + "CMSG_AREATRIGGER", // 0x00B4 + "MSG_MOVE_START_FORWARD", // 0x00B5 + "MSG_MOVE_START_BACKWARD", // 0x00B6 + "MSG_MOVE_STOP", // 0x00B7 + "MSG_MOVE_START_STRAFE_LEFT", // 0x00B8 + "MSG_MOVE_START_STRAFE_RIGHT", // 0x00B9 + "MSG_MOVE_STOP_STRAFE", // 0x00BA + "MSG_MOVE_JUMP", // 0x00BB + "MSG_MOVE_START_TURN_LEFT", // 0x00BC + "MSG_MOVE_START_TURN_RIGHT", // 0x00BD + "MSG_MOVE_STOP_TURN", // 0x00BE + "MSG_MOVE_START_PITCH_UP", // 0x00BF + "MSG_MOVE_START_PITCH_DOWN", // 0x00C0 + "MSG_MOVE_STOP_PITCH", // 0x00C1 + "MSG_MOVE_SET_RUN_MODE", // 0x00C2 + "MSG_MOVE_SET_WALK_MODE", // 0x00C3 + "MSG_MOVE_TOGGLE_LOGGING", // 0x00C4 + "MSG_MOVE_TELEPORT", // 0x00C5 + "MSG_MOVE_TELEPORT_CHEAT", // 0x00C6 + "MSG_MOVE_TELEPORT_ACK", // 0x00C7 + "MSG_MOVE_TOGGLE_FALL_LOGGING", // 0x00C8 + "MSG_MOVE_FALL_LAND", // 0x00C9 + "MSG_MOVE_START_SWIM", // 0x00CA + "MSG_MOVE_STOP_SWIM", // 0x00CB + "MSG_MOVE_SET_RUN_SPEED_CHEAT", // 0x00CC + "MSG_MOVE_SET_RUN_SPEED", // 0x00CD + "MSG_MOVE_SET_RUN_BACK_SPEED_CHEAT", // 0x00CE + "MSG_MOVE_SET_RUN_BACK_SPEED", // 0x00CF + "MSG_MOVE_SET_WALK_SPEED_CHEAT", // 0x00D0 + "MSG_MOVE_SET_WALK_SPEED", // 0x00D1 + "MSG_MOVE_SET_SWIM_SPEED_CHEAT", // 0x00D2 + "MSG_MOVE_SET_SWIM_SPEED", // 0x00D3 + "MSG_MOVE_SET_SWIM_BACK_SPEED_CHEAT", // 0x00D4 + "MSG_MOVE_SET_SWIM_BACK_SPEED", // 0x00D5 + "MSG_MOVE_SET_ALL_SPEED_CHEAT", // 0x00D6 + "MSG_MOVE_SET_TURN_RATE_CHEAT", // 0x00D7 + "MSG_MOVE_SET_TURN_RATE", // 0x00D8 + "MSG_MOVE_TOGGLE_COLLISION_CHEAT", // 0x00D9 + "MSG_MOVE_SET_FACING", // 0x00DA + "MSG_MOVE_SET_PITCH", // 0x00DB + "MSG_MOVE_WORLDPORT_ACK", // 0x00DC + "SMSG_MONSTER_MOVE", // 0x00DD + "SMSG_MOVE_WATER_WALK", // 0x00DE + "SMSG_MOVE_LAND_WALK", // 0x00DF + "MSG_MOVE_SET_RAW_POSITION_ACK", // 0x00E0 + "CMSG_MOVE_SET_RAW_POSITION", // 0x00E1 + "SMSG_FORCE_RUN_SPEED_CHANGE", // 0x00E2 + "CMSG_FORCE_RUN_SPEED_CHANGE_ACK", // 0x00E3 + "SMSG_FORCE_RUN_BACK_SPEED_CHANGE", // 0x00E4 + "CMSG_FORCE_RUN_BACK_SPEED_CHANGE_ACK", // 0x00E5 + "SMSG_FORCE_SWIM_SPEED_CHANGE", // 0x00E6 + "CMSG_FORCE_SWIM_SPEED_CHANGE_ACK", // 0x00E7 + "SMSG_FORCE_MOVE_ROOT", // 0x00E8 + "CMSG_FORCE_MOVE_ROOT_ACK", // 0x00E9 + "SMSG_FORCE_MOVE_UNROOT", // 0x00EA + "CMSG_FORCE_MOVE_UNROOT_ACK", // 0x00EB + "MSG_MOVE_ROOT", // 0x00EC + "MSG_MOVE_UNROOT", // 0x00ED + "MSG_MOVE_HEARTBEAT", // 0x00EE + "SMSG_MOVE_KNOCK_BACK", // 0x00EF + "CMSG_MOVE_KNOCK_BACK_ACK", // 0x00F0 + "MSG_MOVE_KNOCK_BACK", // 0x00F1 + "SMSG_MOVE_FEATHER_FALL", // 0x00F2 + "SMSG_MOVE_NORMAL_FALL", // 0x00F3 + "SMSG_MOVE_SET_HOVER", // 0x00F4 + "SMSG_MOVE_UNSET_HOVER", // 0x00F5 + "CMSG_MOVE_HOVER_ACK", // 0x00F6 + "MSG_MOVE_HOVER", // 0x00F7 + "CMSG_TRIGGER_CINEMATIC_CHEAT", // 0x00F8 + "CMSG_OPENING_CINEMATIC", // 0x00F9 + "SMSG_TRIGGER_CINEMATIC", // 0x00FA + "CMSG_NEXT_CINEMATIC_CAMERA", // 0x00FB + "CMSG_COMPLETE_CINEMATIC", // 0x00FC + "SMSG_TUTORIAL_FLAGS", // 0x00FD + "CMSG_TUTORIAL_FLAG", // 0x00FE + "CMSG_TUTORIAL_CLEAR", // 0x00FF + "CMSG_TUTORIAL_RESET", // 0x0100 + "CMSG_STANDSTATECHANGE", // 0x0101 + "CMSG_EMOTE", // 0x0102 + "SMSG_EMOTE", // 0x0103 + "CMSG_TEXT_EMOTE", // 0x0104 + "SMSG_TEXT_EMOTE", // 0x0105 + "CMSG_AUTOEQUIP_GROUND_ITEM", // 0x0106 + "CMSG_AUTOSTORE_GROUND_ITEM", // 0x0107 + "CMSG_AUTOSTORE_LOOT_ITEM", // 0x0108 + "CMSG_STORE_LOOT_IN_SLOT", // 0x0109 + "CMSG_AUTOEQUIP_ITEM", // 0x010A + "CMSG_AUTOSTORE_BAG_ITEM", // 0x010B + "CMSG_SWAP_ITEM", // 0x010C + "CMSG_SWAP_INV_ITEM", // 0x010D + "CMSG_SPLIT_ITEM", // 0x010E + "CMSG_AUTOEQUIP_ITEM_SLOT", // 0x010F + "OBSOLETE_DROP_ITEM", // 0x0110 + "CMSG_DESTROYITEM", // 0x0111 + "SMSG_INVENTORY_CHANGE_FAILURE", // 0x0112 + "SMSG_OPEN_CONTAINER", // 0x0113 + "CMSG_INSPECT", // 0x0114 + "SMSG_INSPECT", // 0x0115 + "CMSG_INITIATE_TRADE", // 0x0116 + "CMSG_BEGIN_TRADE", // 0x0117 + "CMSG_BUSY_TRADE", // 0x0118 + "CMSG_IGNORE_TRADE", // 0x0119 + "CMSG_ACCEPT_TRADE", // 0x011A + "CMSG_UNACCEPT_TRADE", // 0x011B + "CMSG_CANCEL_TRADE", // 0x011C + "CMSG_SET_TRADE_ITEM", // 0x011D + "CMSG_CLEAR_TRADE_ITEM", // 0x011E + "CMSG_SET_TRADE_GOLD", // 0x011F + "SMSG_TRADE_STATUS", // 0x0120 + "SMSG_TRADE_STATUS_EXTENDED", // 0x0121 + "SMSG_INITIALIZE_FACTIONS", // 0x0122 + "SMSG_SET_FACTION_VISIBLE", // 0x0123 + "SMSG_SET_FACTION_STANDING", // 0x0124 + "CMSG_SET_FACTION_ATWAR", // 0x0125 + "CMSG_SET_FACTION_CHEAT", // 0x0126 + "SMSG_SET_PROFICIENCY", // 0x0127 + "CMSG_SET_ACTION_BUTTON", // 0x0128 + "SMSG_ACTION_BUTTONS", // 0x0129 + "SMSG_INITIAL_SPELLS", // 0x012A + "SMSG_LEARNED_SPELL", // 0x012B + "SMSG_SUPERCEDED_SPELL", // 0x012C + "CMSG_NEW_SPELL_SLOT", // 0x012D + "CMSG_CAST_SPELL", // 0x012E + "CMSG_CANCEL_CAST", // 0x012F + "SMSG_CAST_FAILED", // 0x0130 + "SMSG_SPELL_START", // 0x0131 + "SMSG_SPELL_GO", // 0x0132 + "SMSG_SPELL_FAILURE", // 0x0133 + "SMSG_SPELL_COOLDOWN", // 0x0134 + "SMSG_COOLDOWN_EVENT", // 0x0135 + "CMSG_CANCEL_AURA", // 0x0136 + "SMSG_EQUIPMENT_SET_SAVED", // 0x0137 + "SMSG_PET_CAST_FAILED", // 0x0138 + "MSG_CHANNEL_START", // 0x0139 + "MSG_CHANNEL_UPDATE", // 0x013A + "CMSG_CANCEL_CHANNELLING", // 0x013B + "SMSG_AI_REACTION", // 0x013C + "CMSG_SET_SELECTION", // 0x013D + "CMSG_EQUIPMENT_SET_DELETE", // 0x013E + "CMSG_INSTANCE_LOCK_RESPONSE", // 0x013F + "CMSG_UNUSED2", // 0x0140 + "CMSG_ATTACKSWING", // 0x0141 + "CMSG_ATTACKSTOP", // 0x0142 + "SMSG_ATTACKSTART", // 0x0143 + "SMSG_ATTACKSTOP", // 0x0144 + "SMSG_ATTACKSWING_NOTINRANGE", // 0x0145 + "SMSG_ATTACKSWING_BADFACING", // 0x0146 + "SMSG_INSTANCE_LOCK_QUERY", // 0x0147 + "SMSG_ATTACKSWING_DEADTARGET", // 0x0148 + "SMSG_ATTACKSWING_CANT_ATTACK", // 0x0149 + "SMSG_ATTACKERSTATEUPDATE", // 0x014A + "SMSG_BATTLEFIELD_PORT_DENIED", // 0x014B + "SMSG_DAMAGE_DONE_OBSOLETE", // 0x014C + "SMSG_DAMAGE_TAKEN_OBSOLETE", // 0x014D + "SMSG_CANCEL_COMBAT", // 0x014E + "SMSG_SPELLBREAKLOG", // 0x014F + "SMSG_SPELLHEALLOG", // 0x0150 + "SMSG_SPELLENERGIZELOG", // 0x0151 + "SMSG_BREAK_TARGET", // 0x0152 + "CMSG_SAVE_PLAYER", // 0x0153 + "CMSG_SETDEATHBINDPOINT", // 0x0154 + "SMSG_BINDPOINTUPDATE", // 0x0155 + "CMSG_GETDEATHBINDZONE", // 0x0156 + "SMSG_BINDZONEREPLY", // 0x0157 + "SMSG_PLAYERBOUND", // 0x0158 + "SMSG_CLIENT_CONTROL_UPDATE", // 0x0159 + "CMSG_REPOP_REQUEST", // 0x015A + "SMSG_RESURRECT_REQUEST", // 0x015B + "CMSG_RESURRECT_RESPONSE", // 0x015C + "CMSG_LOOT", // 0x015D + "CMSG_LOOT_MONEY", // 0x015E + "CMSG_LOOT_RELEASE", // 0x015F + "SMSG_LOOT_RESPONSE", // 0x0160 + "SMSG_LOOT_RELEASE_RESPONSE", // 0x0161 + "SMSG_LOOT_REMOVED", // 0x0162 + "SMSG_LOOT_MONEY_NOTIFY", // 0x0163 + "SMSG_LOOT_ITEM_NOTIFY", // 0x0164 + "SMSG_LOOT_CLEAR_MONEY", // 0x0165 + "SMSG_ITEM_PUSH_RESULT", // 0x0166 + "SMSG_DUEL_REQUESTED", // 0x0167 + "SMSG_DUEL_OUTOFBOUNDS", // 0x0168 + "SMSG_DUEL_INBOUNDS", // 0x0169 + "SMSG_DUEL_COMPLETE", // 0x016A + "SMSG_DUEL_WINNER", // 0x016B + "CMSG_DUEL_ACCEPTED", // 0x016C + "CMSG_DUEL_CANCELLED", // 0x016D + "SMSG_MOUNTRESULT", // 0x016E + "SMSG_DISMOUNTRESULT", // 0x016F + "SMSG_PUREMOUNT_CANCELLED_OBSOLETE", // 0x0170 + "CMSG_MOUNTSPECIAL_ANIM", // 0x0171 + "SMSG_MOUNTSPECIAL_ANIM", // 0x0172 + "SMSG_PET_TAME_FAILURE", // 0x0173 + "CMSG_PET_SET_ACTION", // 0x0174 + "CMSG_PET_ACTION", // 0x0175 + "CMSG_PET_ABANDON", // 0x0176 + "CMSG_PET_RENAME", // 0x0177 + "SMSG_PET_NAME_INVALID", // 0x0178 + "SMSG_PET_SPELLS", // 0x0179 + "SMSG_PET_MODE", // 0x017A + "CMSG_GOSSIP_HELLO", // 0x017B + "CMSG_GOSSIP_SELECT_OPTION", // 0x017C + "SMSG_GOSSIP_MESSAGE", // 0x017D + "SMSG_GOSSIP_COMPLETE", // 0x017E + "CMSG_NPC_TEXT_QUERY", // 0x017F + "SMSG_NPC_TEXT_UPDATE", // 0x0180 + "SMSG_NPC_WONT_TALK", // 0x0181 + "CMSG_QUESTGIVER_STATUS_QUERY", // 0x0182 + "SMSG_QUESTGIVER_STATUS", // 0x0183 + "CMSG_QUESTGIVER_HELLO", // 0x0184 + "SMSG_QUESTGIVER_QUEST_LIST", // 0x0185 + "CMSG_QUESTGIVER_QUERY_QUEST", // 0x0186 + "CMSG_QUESTGIVER_QUEST_AUTOLAUNCH", // 0x0187 + "SMSG_QUESTGIVER_QUEST_DETAILS", // 0x0188 + "CMSG_QUESTGIVER_ACCEPT_QUEST", // 0x0189 + "CMSG_QUESTGIVER_COMPLETE_QUEST", // 0x018A + "SMSG_QUESTGIVER_REQUEST_ITEMS", // 0x018B + "CMSG_QUESTGIVER_REQUEST_REWARD", // 0x018C + "SMSG_QUESTGIVER_OFFER_REWARD", // 0x018D + "CMSG_QUESTGIVER_CHOOSE_REWARD", // 0x018E + "SMSG_QUESTGIVER_QUEST_INVALID", // 0x018F + "CMSG_QUESTGIVER_CANCEL", // 0x0190 + "SMSG_QUESTGIVER_QUEST_COMPLETE", // 0x0191 + "SMSG_QUESTGIVER_QUEST_FAILED", // 0x0192 + "CMSG_QUESTLOG_SWAP_QUEST", // 0x0193 + "CMSG_QUESTLOG_REMOVE_QUEST", // 0x0194 + "SMSG_QUESTLOG_FULL", // 0x0195 + "SMSG_QUESTUPDATE_FAILED", // 0x0196 + "SMSG_QUESTUPDATE_FAILEDTIMER", // 0x0197 + "SMSG_QUESTUPDATE_COMPLETE", // 0x0198 + "SMSG_QUESTUPDATE_ADD_KILL", // 0x0199 + "SMSG_QUESTUPDATE_ADD_ITEM", // 0x019A + "CMSG_QUEST_CONFIRM_ACCEPT", // 0x019B + "SMSG_QUEST_CONFIRM_ACCEPT", // 0x019C + "CMSG_PUSHQUESTTOPARTY", // 0x019D + "CMSG_LIST_INVENTORY", // 0x019E + "SMSG_LIST_INVENTORY", // 0x019F + "CMSG_SELL_ITEM", // 0x01A0 + "SMSG_SELL_ITEM", // 0x01A1 + "CMSG_BUY_ITEM", // 0x01A2 + "CMSG_BUY_ITEM_IN_SLOT", // 0x01A3 + "SMSG_BUY_ITEM", // 0x01A4 + "SMSG_BUY_FAILED", // 0x01A5 + "CMSG_TAXICLEARALLNODES", // 0x01A6 + "CMSG_TAXIENABLEALLNODES", // 0x01A7 + "CMSG_TAXISHOWNODES", // 0x01A8 + "SMSG_SHOWTAXINODES", // 0x01A9 + "CMSG_TAXINODE_STATUS_QUERY", // 0x01AA + "SMSG_TAXINODE_STATUS", // 0x01AB + "CMSG_TAXIQUERYAVAILABLENODES", // 0x01AC + "CMSG_ACTIVATETAXI", // 0x01AD + "SMSG_ACTIVATETAXIREPLY", // 0x01AE + "SMSG_NEW_TAXI_PATH", // 0x01AF + "CMSG_TRAINER_LIST", // 0x01B0 + "SMSG_TRAINER_LIST", // 0x01B1 + "CMSG_TRAINER_BUY_SPELL", // 0x01B2 + "SMSG_TRAINER_BUY_SUCCEEDED", // 0x01B3 + "SMSG_TRAINER_BUY_FAILED", // 0x01B4 + "CMSG_BINDER_ACTIVATE", // 0x01B5 + "SMSG_PLAYERBINDERROR", // 0x01B6 + "CMSG_BANKER_ACTIVATE", // 0x01B7 + "SMSG_SHOW_BANK", // 0x01B8 + "CMSG_BUY_BANK_SLOT", // 0x01B9 + "SMSG_BUY_BANK_SLOT_RESULT", // 0x01BA + "CMSG_PETITION_SHOWLIST", // 0x01BB + "SMSG_PETITION_SHOWLIST", // 0x01BC + "CMSG_PETITION_BUY", // 0x01BD + "CMSG_PETITION_SHOW_SIGNATURES", // 0x01BE + "SMSG_PETITION_SHOW_SIGNATURES", // 0x01BF + "CMSG_PETITION_SIGN", // 0x01C0 + "SMSG_PETITION_SIGN_RESULTS", // 0x01C1 + "MSG_PETITION_DECLINE", // 0x01C2 + "CMSG_OFFER_PETITION", // 0x01C3 + "CMSG_TURN_IN_PETITION", // 0x01C4 + "SMSG_TURN_IN_PETITION_RESULTS", // 0x01C5 + "CMSG_PETITION_QUERY", // 0x01C6 + "SMSG_PETITION_QUERY_RESPONSE", // 0x01C7 + "SMSG_FISH_NOT_HOOKED", // 0x01C8 + "SMSG_FISH_ESCAPED", // 0x01C9 + "CMSG_BUG", // 0x01CA + "SMSG_NOTIFICATION", // 0x01CB + "CMSG_PLAYED_TIME", // 0x01CC + "SMSG_PLAYED_TIME", // 0x01CD + "CMSG_QUERY_TIME", // 0x01CE + "SMSG_QUERY_TIME_RESPONSE", // 0x01CF + "SMSG_LOG_XPGAIN", // 0x01D0 + "SMSG_AURACASTLOG", // 0x01D1 + "CMSG_RECLAIM_CORPSE", // 0x01D2 + "CMSG_WRAP_ITEM", // 0x01D3 + "SMSG_LEVELUP_INFO", // 0x01D4 + "MSG_MINIMAP_PING", // 0x01D5 + "SMSG_RESISTLOG", // 0x01D6 + "SMSG_ENCHANTMENTLOG", // 0x01D7 + "CMSG_SET_SKILL_CHEAT", // 0x01D8 + "SMSG_START_MIRROR_TIMER", // 0x01D9 + "SMSG_PAUSE_MIRROR_TIMER", // 0x01DA + "SMSG_STOP_MIRROR_TIMER", // 0x01DB + "CMSG_PING", // 0x01DC + "SMSG_PONG", // 0x01DD + "SMSG_CLEAR_COOLDOWN", // 0x01DE + "SMSG_GAMEOBJECT_PAGETEXT", // 0x01DF + "CMSG_SETSHEATHED", // 0x01E0 + "SMSG_COOLDOWN_CHEAT", // 0x01E1 + "SMSG_SPELL_DELAYED", // 0x01E2 + "CMSG_PLAYER_MACRO_OBSOLETE", // 0x01E3 + "SMSG_PLAYER_MACRO_OBSOLETE", // 0x01E4 + "CMSG_GHOST", // 0x01E5 + "CMSG_GM_INVIS", // 0x01E6 + "SMSG_INVALID_PROMOTION_CODE", // 0x01E7 + "MSG_GM_BIND_OTHER", // 0x01E8 + "MSG_GM_SUMMON", // 0x01E9 + "SMSG_ITEM_TIME_UPDATE", // 0x01EA + "SMSG_ITEM_ENCHANT_TIME_UPDATE", // 0x01EB + "SMSG_AUTH_CHALLENGE", // 0x01EC + "CMSG_AUTH_SESSION", // 0x01ED + "SMSG_AUTH_RESPONSE", // 0x01EE + "MSG_GM_SHOWLABEL", // 0x01EF + "CMSG_PET_CAST_SPELL", // 0x01F0 + "MSG_SAVE_GUILD_EMBLEM", // 0x01F1 + "MSG_TABARDVENDOR_ACTIVATE", // 0x01F2 + "SMSG_PLAY_SPELL_VISUAL", // 0x01F3 + "CMSG_ZONEUPDATE", // 0x01F4 + "SMSG_PARTYKILLLOG", // 0x01F5 + "SMSG_COMPRESSED_UPDATE_OBJECT", // 0x01F6 + "SMSG_PLAY_SPELL_IMPACT", // 0x01F7 + "SMSG_EXPLORATION_EXPERIENCE", // 0x01F8 + "CMSG_GM_SET_SECURITY_GROUP", // 0x01F9 + "CMSG_GM_NUKE", // 0x01FA + "MSG_RANDOM_ROLL", // 0x01FB + "SMSG_ENVIRONMENTALDAMAGELOG", // 0x01FC + "CMSG_RWHOIS_OBSOLETE", // 0x01FD + "SMSG_RWHOIS", // 0x01FE + "MSG_LOOKING_FOR_GROUP", // 0x01FF + "CMSG_SET_LOOKING_FOR_GROUP", // 0x0200 + "CMSG_UNLEARN_SPELL", // 0x0201 + "CMSG_UNLEARN_SKILL", // 0x0202 + "SMSG_REMOVED_SPELL", // 0x0203 + "CMSG_DECHARGE", // 0x0204 + "CMSG_GMTICKET_CREATE", // 0x0205 + "SMSG_GMTICKET_CREATE", // 0x0206 + "CMSG_GMTICKET_UPDATETEXT", // 0x0207 + "SMSG_GMTICKET_UPDATETEXT", // 0x0208 + "SMSG_ACCOUNT_DATA_TIMES", // 0x0209 + "CMSG_REQUEST_ACCOUNT_DATA", // 0x020A + "CMSG_UPDATE_ACCOUNT_DATA", // 0x020B + "SMSG_UPDATE_ACCOUNT_DATA", // 0x020C + "SMSG_CLEAR_FAR_SIGHT_IMMEDIATE", // 0x020D + "SMSG_POWERGAINLOG_OBSOLETE", // 0x020E + "CMSG_GM_TEACH", // 0x020F + "CMSG_GM_CREATE_ITEM_TARGET", // 0x0210 + "CMSG_GMTICKET_GETTICKET", // 0x0211 + "SMSG_GMTICKET_GETTICKET", // 0x0212 + "CMSG_UNLEARN_TALENTS", // 0x0213 + "SMSG_GAMEOBJECT_SPAWN_ANIM_OBSOLETE", // 0x0214 + "SMSG_GAMEOBJECT_DESPAWN_ANIM", // 0x0215 + "MSG_CORPSE_QUERY", // 0x0216 + "CMSG_GMTICKET_DELETETICKET", // 0x0217 + "SMSG_GMTICKET_DELETETICKET", // 0x0218 + "SMSG_CHAT_WRONG_FACTION", // 0x0219 + "CMSG_GMTICKET_SYSTEMSTATUS", // 0x021A + "SMSG_GMTICKET_SYSTEMSTATUS", // 0x021B + "CMSG_SPIRIT_HEALER_ACTIVATE", // 0x021C + "CMSG_SET_STAT_CHEAT", // 0x021D + "SMSG_SET_REST_START_OBSOLETE", // 0x021E + "CMSG_SKILL_BUY_STEP", // 0x021F + "CMSG_SKILL_BUY_RANK", // 0x0220 + "CMSG_XP_CHEAT", // 0x0221 + "SMSG_SPIRIT_HEALER_CONFIRM", // 0x0222 + "CMSG_CHARACTER_POINT_CHEAT", // 0x0223 + "SMSG_GOSSIP_POI", // 0x0224 + "CMSG_CHAT_IGNORED", // 0x0225 + "CMSG_GM_VISION", // 0x0226 + "CMSG_SERVER_COMMAND", // 0x0227 + "CMSG_GM_SILENCE", // 0x0228 + "CMSG_GM_REVEALTO", // 0x0229 + "CMSG_GM_RESURRECT", // 0x022A + "CMSG_GM_SUMMONMOB", // 0x022B + "CMSG_GM_MOVECORPSE", // 0x022C + "CMSG_GM_FREEZE", // 0x022D + "CMSG_GM_UBERINVIS", // 0x022E + "CMSG_GM_REQUEST_PLAYER_INFO", // 0x022F + "SMSG_GM_PLAYER_INFO", // 0x0230 + "CMSG_GUILD_RANK", // 0x0231 + "CMSG_GUILD_ADD_RANK", // 0x0232 + "CMSG_GUILD_DEL_RANK", // 0x0233 + "CMSG_GUILD_SET_PUBLIC_NOTE", // 0x0234 + "CMSG_GUILD_SET_OFFICER_NOTE", // 0x0235 + "SMSG_LOGIN_VERIFY_WORLD", // 0x0236 + "CMSG_CLEAR_EXPLORATION", // 0x0237 + "CMSG_SEND_MAIL", // 0x0238 + "SMSG_SEND_MAIL_RESULT", // 0x0239 + "CMSG_GET_MAIL_LIST", // 0x023A + "SMSG_MAIL_LIST_RESULT", // 0x023B + "CMSG_BATTLEFIELD_LIST", // 0x023C + "SMSG_BATTLEFIELD_LIST", // 0x023D + "CMSG_BATTLEFIELD_JOIN", // 0x023E + "SMSG_BATTLEFIELD_WIN_OBSOLETE", // 0x023F + "SMSG_BATTLEFIELD_LOSE_OBSOLETE", // 0x0240 + "CMSG_TAXICLEARNODE", // 0x0241 + "CMSG_TAXIENABLENODE", // 0x0242 + "CMSG_ITEM_TEXT_QUERY", // 0x0243 + "SMSG_ITEM_TEXT_QUERY_RESPONSE", // 0x0244 + "CMSG_MAIL_TAKE_MONEY", // 0x0245 + "CMSG_MAIL_TAKE_ITEM", // 0x0246 + "CMSG_MAIL_MARK_AS_READ", // 0x0247 + "CMSG_MAIL_RETURN_TO_SENDER", // 0x0248 + "CMSG_MAIL_DELETE", // 0x0249 + "CMSG_MAIL_CREATE_TEXT_ITEM", // 0x024A + "SMSG_SPELLLOGMISS", // 0x024B + "SMSG_SPELLLOGEXECUTE", // 0x024C + "SMSG_DEBUGAURAPROC", // 0x024D + "SMSG_PERIODICAURALOG", // 0x024E + "SMSG_SPELLDAMAGESHIELD", // 0x024F + "SMSG_SPELLNONMELEEDAMAGELOG", // 0x0250 + "CMSG_LEARN_TALENT", // 0x0251 + "SMSG_RESURRECT_FAILED", // 0x0252 + "CMSG_TOGGLE_PVP", // 0x0253 + "SMSG_ZONE_UNDER_ATTACK", // 0x0254 + "MSG_AUCTION_HELLO", // 0x0255 + "CMSG_AUCTION_SELL_ITEM", // 0x0256 + "CMSG_AUCTION_REMOVE_ITEM", // 0x0257 + "CMSG_AUCTION_LIST_ITEMS", // 0x0258 + "CMSG_AUCTION_LIST_OWNER_ITEMS", // 0x0259 + "CMSG_AUCTION_PLACE_BID", // 0x025A + "SMSG_AUCTION_COMMAND_RESULT", // 0x025B + "SMSG_AUCTION_LIST_RESULT", // 0x025C + "SMSG_AUCTION_OWNER_LIST_RESULT", // 0x025D + "SMSG_AUCTION_BIDDER_NOTIFICATION", // 0x025E + "SMSG_AUCTION_OWNER_NOTIFICATION", // 0x025F + "SMSG_PROCRESIST", // 0x0260 + "SMSG_STANDSTATE_CHANGE_FAILURE_OBSOLETE", // 0x0261 + "SMSG_DISPEL_FAILED", // 0x0262 + "SMSG_SPELLORDAMAGE_IMMUNE", // 0x0263 + "CMSG_AUCTION_LIST_BIDDER_ITEMS", // 0x0264 + "SMSG_AUCTION_BIDDER_LIST_RESULT", // 0x0265 + "SMSG_SET_FLAT_SPELL_MODIFIER", // 0x0266 + "SMSG_SET_PCT_SPELL_MODIFIER", // 0x0267 + "CMSG_SET_AMMO", // 0x0268 + "SMSG_CORPSE_RECLAIM_DELAY", // 0x0269 + "CMSG_SET_ACTIVE_MOVER", // 0x026A + "CMSG_PET_CANCEL_AURA", // 0x026B + "CMSG_PLAYER_AI_CHEAT", // 0x026C + "CMSG_CANCEL_AUTO_REPEAT_SPELL", // 0x026D + "MSG_GM_ACCOUNT_ONLINE", // 0x026E + "MSG_LIST_STABLED_PETS", // 0x026F + "CMSG_STABLE_PET", // 0x0270 + "CMSG_UNSTABLE_PET", // 0x0271 + "CMSG_BUY_STABLE_SLOT", // 0x0272 + "SMSG_STABLE_RESULT", // 0x0273 + "CMSG_STABLE_REVIVE_PET", // 0x0274 + "CMSG_STABLE_SWAP_PET", // 0x0275 + "MSG_QUEST_PUSH_RESULT", // 0x0276 + "SMSG_PLAY_MUSIC", // 0x0277 + "SMSG_PLAY_OBJECT_SOUND", // 0x0278 + "CMSG_REQUEST_PET_INFO", // 0x0279 + "CMSG_FAR_SIGHT", // 0x027A + "SMSG_SPELLDISPELLOG", // 0x027B + "SMSG_DAMAGE_CALC_LOG", // 0x027C + "CMSG_ENABLE_DAMAGE_LOG", // 0x027D + "CMSG_GROUP_CHANGE_SUB_GROUP", // 0x027E + "CMSG_REQUEST_PARTY_MEMBER_STATS", // 0x027F + "CMSG_GROUP_SWAP_SUB_GROUP", // 0x0280 + "CMSG_RESET_FACTION_CHEAT", // 0x0281 + "CMSG_AUTOSTORE_BANK_ITEM", // 0x0282 + "CMSG_AUTOBANK_ITEM", // 0x0283 + "MSG_QUERY_NEXT_MAIL_TIME", // 0x0284 + "SMSG_RECEIVED_MAIL", // 0x0285 + "SMSG_RAID_GROUP_ONLY", // 0x0286 + "CMSG_SET_DURABILITY_CHEAT", // 0x0287 + "CMSG_SET_PVP_RANK_CHEAT", // 0x0288 + "CMSG_ADD_PVP_MEDAL_CHEAT", // 0x0289 + "CMSG_DEL_PVP_MEDAL_CHEAT", // 0x028A + "CMSG_SET_PVP_TITLE", // 0x028B + "SMSG_PVP_CREDIT", // 0x028C + "SMSG_AUCTION_REMOVED_NOTIFICATION", // 0x028D + "CMSG_GROUP_RAID_CONVERT", // 0x028E + "CMSG_GROUP_ASSISTANT_LEADER", // 0x028F + "CMSG_BUYBACK_ITEM", // 0x0290 + "SMSG_SERVER_MESSAGE", // 0x0291 + "CMSG_MEETINGSTONE_JOIN", // 0x0292 + "CMSG_MEETINGSTONE_LEAVE", // 0x0293 + "CMSG_MEETINGSTONE_CHEAT", // 0x0294 + "SMSG_MEETINGSTONE_SETQUEUE", // 0x0295 + "CMSG_MEETINGSTONE_INFO", // 0x0296 + "SMSG_MEETINGSTONE_COMPLETE", // 0x0297 + "SMSG_MEETINGSTONE_IN_PROGRESS", // 0x0298 + "SMSG_MEETINGSTONE_MEMBER_ADDED", // 0x0299 + "CMSG_GMTICKETSYSTEM_TOGGLE", // 0x029A + "CMSG_CANCEL_GROWTH_AURA", // 0x029B + "SMSG_CANCEL_AUTO_REPEAT", // 0x029C + "SMSG_STANDSTATE_UPDATE", // 0x029D + "SMSG_LOOT_ALL_PASSED", // 0x029E + "SMSG_LOOT_ROLL_WON", // 0x029F + "CMSG_LOOT_ROLL", // 0x02A0 + "SMSG_LOOT_START_ROLL", // 0x02A1 + "SMSG_LOOT_ROLL", // 0x02A2 + "CMSG_LOOT_MASTER_GIVE", // 0x02A3 + "SMSG_LOOT_MASTER_LIST", // 0x02A4 + "SMSG_SET_FORCED_REACTIONS", // 0x02A5 + "SMSG_SPELL_FAILED_OTHER", // 0x02A6 + "SMSG_GAMEOBJECT_RESET_STATE", // 0x02A7 + "CMSG_REPAIR_ITEM", // 0x02A8 + "SMSG_CHAT_PLAYER_NOT_FOUND", // 0x02A9 + "MSG_TALENT_WIPE_CONFIRM", // 0x02AA + "SMSG_SUMMON_REQUEST", // 0x02AB + "CMSG_SUMMON_RESPONSE", // 0x02AC + "MSG_MOVE_TOGGLE_GRAVITY_CHEAT", // 0x02AD + "SMSG_MONSTER_MOVE_TRANSPORT", // 0x02AE + "SMSG_PET_BROKEN", // 0x02AF + "MSG_MOVE_FEATHER_FALL", // 0x02B0 + "MSG_MOVE_WATER_WALK", // 0x02B1 + "CMSG_SERVER_BROADCAST", // 0x02B2 + "CMSG_SELF_RES", // 0x02B3 + "SMSG_FEIGN_DEATH_RESISTED", // 0x02B4 + "CMSG_RUN_SCRIPT", // 0x02B5 + "SMSG_SCRIPT_MESSAGE", // 0x02B6 + "SMSG_DUEL_COUNTDOWN", // 0x02B7 + "SMSG_AREA_TRIGGER_MESSAGE", // 0x02B8 + "CMSG_SHOWING_HELM", // 0x02B9 + "CMSG_SHOWING_CLOAK", // 0x02BA + "SMSG_MEETINGSTONE_JOINFAILED", // 0x02BB + "SMSG_PLAYER_SKINNED", // 0x02BC + "SMSG_DURABILITY_DAMAGE_DEATH", // 0x02BD + "CMSG_SET_EXPLORATION", // 0x02BE + "CMSG_SET_ACTIONBAR_TOGGLES", // 0x02BF + "UMSG_DELETE_GUILD_CHARTER", // 0x02C0 + "MSG_PETITION_RENAME", // 0x02C1 + "SMSG_INIT_WORLD_STATES", // 0x02C2 + "SMSG_UPDATE_WORLD_STATE", // 0x02C3 + "CMSG_ITEM_NAME_QUERY", // 0x02C4 + "SMSG_ITEM_NAME_QUERY_RESPONSE", // 0x02C5 + "SMSG_PET_ACTION_FEEDBACK", // 0x02C6 + "CMSG_CHAR_RENAME", // 0x02C7 + "SMSG_CHAR_RENAME", // 0x02C8 + "CMSG_MOVE_SPLINE_DONE", // 0x02C9 + "CMSG_MOVE_FALL_RESET", // 0x02CA + "SMSG_INSTANCE_SAVE_CREATED", // 0x02CB + "SMSG_RAID_INSTANCE_INFO", // 0x02CC + "CMSG_REQUEST_RAID_INFO", // 0x02CD + "CMSG_MOVE_TIME_SKIPPED", // 0x02CE + "CMSG_MOVE_FEATHER_FALL_ACK", // 0x02CF + "CMSG_MOVE_WATER_WALK_ACK", // 0x02D0 + "CMSG_MOVE_NOT_ACTIVE_MOVER", // 0x02D1 + "SMSG_PLAY_SOUND", // 0x02D2 + "CMSG_BATTLEFIELD_STATUS", // 0x02D3 + "SMSG_BATTLEFIELD_STATUS", // 0x02D4 + "CMSG_BATTLEFIELD_PORT", // 0x02D5 + "MSG_INSPECT_HONOR_STATS", // 0x02D6 + "CMSG_BATTLEMASTER_HELLO", // 0x02D7 + "CMSG_MOVE_START_SWIM_CHEAT", // 0x02D8 + "CMSG_MOVE_STOP_SWIM_CHEAT", // 0x02D9 + "SMSG_FORCE_WALK_SPEED_CHANGE", // 0x02DA + "CMSG_FORCE_WALK_SPEED_CHANGE_ACK", // 0x02DB + "SMSG_FORCE_SWIM_BACK_SPEED_CHANGE", // 0x02DC + "CMSG_FORCE_SWIM_BACK_SPEED_CHANGE_ACK", // 0x02DD + "SMSG_FORCE_TURN_RATE_CHANGE", // 0x02DE + "CMSG_FORCE_TURN_RATE_CHANGE_ACK", // 0x02DF + "MSG_PVP_LOG_DATA", // 0x02E0 + "CMSG_LEAVE_BATTLEFIELD", // 0x02E1 + "CMSG_AREA_SPIRIT_HEALER_QUERY", // 0x02E2 + "CMSG_AREA_SPIRIT_HEALER_QUEUE", // 0x02E3 + "SMSG_AREA_SPIRIT_HEALER_TIME", // 0x02E4 + "CMSG_GM_UNTEACH", // 0x02E5 + "SMSG_WARDEN_DATA", // 0x02E6 + "CMSG_WARDEN_DATA", // 0x02E7 + "SMSG_GROUP_JOINED_BATTLEGROUND", // 0x02E8 + "MSG_BATTLEGROUND_PLAYER_POSITIONS", // 0x02E9 + "CMSG_PET_STOP_ATTACK", // 0x02EA + "SMSG_BINDER_CONFIRM", // 0x02EB + "SMSG_BATTLEGROUND_PLAYER_JOINED", // 0x02EC + "SMSG_BATTLEGROUND_PLAYER_LEFT", // 0x02ED + "CMSG_BATTLEMASTER_JOIN", // 0x02EE + "SMSG_ADDON_INFO", // 0x02EF + "CMSG_PET_UNLEARN", // 0x02F0 + "SMSG_PET_UNLEARN_CONFIRM", // 0x02F1 + "SMSG_PARTY_MEMBER_STATS_FULL", // 0x02F2 + "CMSG_PET_SPELL_AUTOCAST", // 0x02F3 + "SMSG_WEATHER", // 0x02F4 + "SMSG_PLAY_TIME_WARNING", // 0x02F5 + "SMSG_MINIGAME_SETUP", // 0x02F6 + "SMSG_MINIGAME_STATE", // 0x02F7 + "CMSG_MINIGAME_MOVE", // 0x02F8 + "SMSG_MINIGAME_MOVE_FAILED", // 0x02F9 + "SMSG_RAID_INSTANCE_MESSAGE", // 0x02FA + "SMSG_COMPRESSED_MOVES", // 0x02FB + "CMSG_GUILD_INFO_TEXT", // 0x02FC + "SMSG_CHAT_RESTRICTED", // 0x02FD + "SMSG_SPLINE_SET_RUN_SPEED", // 0x02FE + "SMSG_SPLINE_SET_RUN_BACK_SPEED", // 0x02FF + "SMSG_SPLINE_SET_SWIM_SPEED", // 0x0300 + "SMSG_SPLINE_SET_WALK_SPEED", // 0x0301 + "SMSG_SPLINE_SET_SWIM_BACK_SPEED", // 0x0302 + "SMSG_SPLINE_SET_TURN_RATE", // 0x0303 + "SMSG_SPLINE_MOVE_UNROOT", // 0x0304 + "SMSG_SPLINE_MOVE_FEATHER_FALL", // 0x0305 + "SMSG_SPLINE_MOVE_NORMAL_FALL", // 0x0306 + "SMSG_SPLINE_MOVE_SET_HOVER", // 0x0307 + "SMSG_SPLINE_MOVE_UNSET_HOVER", // 0x0308 + "SMSG_SPLINE_MOVE_WATER_WALK", // 0x0309 + "SMSG_SPLINE_MOVE_LAND_WALK", // 0x030A + "SMSG_SPLINE_MOVE_START_SWIM", // 0x030B + "SMSG_SPLINE_MOVE_STOP_SWIM", // 0x030C + "SMSG_SPLINE_MOVE_SET_RUN_MODE", // 0x030D + "SMSG_SPLINE_MOVE_SET_WALK_MODE", // 0x030E + "CMSG_GM_NUKE_ACCOUNT", // 0x030F + "MSG_GM_DESTROY_CORPSE", // 0x0310 + "CMSG_GM_DESTROY_ONLINE_CORPSE", // 0x0311 + "CMSG_ACTIVATETAXIEXPRESS", // 0x0312 + "SMSG_SET_FACTION_ATWAR", // 0x0313 + "SMSG_GAMETIMEBIAS_SET", // 0x0314 + "CMSG_DEBUG_ACTIONS_START", // 0x0315 + "CMSG_DEBUG_ACTIONS_STOP", // 0x0316 + "CMSG_SET_FACTION_INACTIVE", // 0x0317 + "CMSG_SET_WATCHED_FACTION", // 0x0318 + "MSG_MOVE_TIME_SKIPPED", // 0x0319 + "SMSG_SPLINE_MOVE_ROOT", // 0x031A + "CMSG_SET_EXPLORATION_ALL", // 0x031B + "SMSG_INVALIDATE_PLAYER", // 0x031C + "CMSG_RESET_INSTANCES", // 0x031D + "SMSG_INSTANCE_RESET", // 0x031E + "SMSG_INSTANCE_RESET_FAILED", // 0x031F + "SMSG_UPDATE_LAST_INSTANCE", // 0x0320 + "MSG_RAID_TARGET_UPDATE", // 0x0321 + "MSG_RAID_READY_CHECK", // 0x0322 + "CMSG_LUA_USAGE", // 0x0323 + "SMSG_PET_ACTION_SOUND", // 0x0324 + "SMSG_PET_DISMISS_SOUND", // 0x0325 + "SMSG_GHOSTEE_GONE", // 0x0326 + "CMSG_GM_UPDATE_TICKET_STATUS", // 0x0327 + "SMSG_GM_TICKET_STATUS_UPDATE", // 0x0328 + "MSG_SET_DUNGEON_DIFFICULTY", // 0x0329 + "CMSG_GMSURVEY_SUBMIT", // 0x032A + "SMSG_UPDATE_INSTANCE_OWNERSHIP", // 0x032B + "CMSG_IGNORE_KNOCKBACK_CHEAT", // 0x032C + "SMSG_CHAT_PLAYER_AMBIGUOUS", // 0x032D + "MSG_DELAY_GHOST_TELEPORT", // 0x032E + "SMSG_SPELLINSTAKILLLOG", // 0x032F + "SMSG_SPELL_UPDATE_CHAIN_TARGETS", // 0x0330 + "CMSG_CHAT_FILTERED", // 0x0331 + "SMSG_EXPECTED_SPAM_RECORDS", // 0x0332 + "SMSG_SPELLSTEALLOG", // 0x0333 + "CMSG_LOTTERY_QUERY_OBSOLETE", // 0x0334 + "SMSG_LOTTERY_QUERY_RESULT_OBSOLETE", // 0x0335 + "CMSG_BUY_LOTTERY_TICKET_OBSOLETE", // 0x0336 + "SMSG_LOTTERY_RESULT_OBSOLETE", // 0x0337 + "SMSG_CHARACTER_PROFILE", // 0x0338 + "SMSG_CHARACTER_PROFILE_REALM_CONNECTED", // 0x0339 + "SMSG_DEFENSE_MESSAGE", // 0x033A + "SMSG_INSTANCE_DIFFICULTY", // 0x033B + "MSG_GM_RESETINSTANCELIMIT", // 0x033C + "SMSG_MOTD", // 0x033D + "SMSG_MOVE_SET_FLIGHT_OBSOLETE", // 0x033E + "SMSG_MOVE_UNSET_FLIGHT_OBSOLETE", // 0x033F + "CMSG_MOVE_FLIGHT_ACK_OBSOLETE", // 0x0340 + "MSG_MOVE_START_SWIM_CHEAT", // 0x0341 + "MSG_MOVE_STOP_SWIM_CHEAT", // 0x0342 + "SMSG_MOVE_SET_CAN_FLY", // 0x0343 + "SMSG_MOVE_UNSET_CAN_FLY", // 0x0344 + "CMSG_MOVE_SET_CAN_FLY_ACK", // 0x0345 + "CMSG_MOVE_SET_FLY", // 0x0346 + "CMSG_SOCKET_GEMS", // 0x0347 + "CMSG_ARENA_TEAM_CREATE", // 0x0348 + "SMSG_ARENA_TEAM_COMMAND_RESULT", // 0x0349 + "UMSG_UPDATE_ARENA_TEAM_OBSOLETE", // 0x034A + "CMSG_ARENA_TEAM_QUERY", // 0x034B + "SMSG_ARENA_TEAM_QUERY_RESPONSE", // 0x034C + "CMSG_ARENA_TEAM_ROSTER", // 0x034D + "SMSG_ARENA_TEAM_ROSTER", // 0x034E + "CMSG_ARENA_TEAM_INVITE", // 0x034F + "SMSG_ARENA_TEAM_INVITE", // 0x0350 + "CMSG_ARENA_TEAM_ACCEPT", // 0x0351 + "CMSG_ARENA_TEAM_DECLINE", // 0x0352 + "CMSG_ARENA_TEAM_LEAVE", // 0x0353 + "CMSG_ARENA_TEAM_REMOVE", // 0x0354 + "CMSG_ARENA_TEAM_DISBAND", // 0x0355 + "CMSG_ARENA_TEAM_LEADER", // 0x0356 + "SMSG_ARENA_TEAM_EVENT", // 0x0357 + "CMSG_BATTLEMASTER_JOIN_ARENA", // 0x0358 + "MSG_MOVE_START_ASCEND", // 0x0359 + "MSG_MOVE_STOP_ASCEND", // 0x035A + "SMSG_ARENA_TEAM_STATS", // 0x035B + "CMSG_LFG_SET_AUTOJOIN", // 0x035C + "CMSG_LFG_CLEAR_AUTOJOIN", // 0x035D + "CMSG_LFM_SET_AUTOFILL", // 0x035E + "CMSG_LFM_CLEAR_AUTOFILL", // 0x035F + "CMSG_ACCEPT_LFG_MATCH", // 0x0360 + "CMSG_DECLINE_LFG_MATCH", // 0x0361 + "CMSG_CANCEL_PENDING_LFG", // 0x0362 + "CMSG_CLEAR_LOOKING_FOR_GROUP", // 0x0363 + "CMSG_CLEAR_LOOKING_FOR_MORE", // 0x0364 + "CMSG_SET_LOOKING_FOR_MORE", // 0x0365 + "CMSG_SET_LFG_COMMENT", // 0x0366 + "SMSG_LFG_TIMEDOUT", // 0x0367 + "SMSG_LFG_OTHER_TIMEDOUT", // 0x0368 + "SMSG_LFG_AUTOJOIN_FAILED", // 0x0369 + "SMSG_LFG_AUTOJOIN_FAILED_NO_PLAYER", // 0x036A + "SMSG_LFG_LEADER_IS_LFM", // 0x036B + "SMSG_LFG_UPDATE", // 0x036C + "SMSG_LFG_UPDATE_LFM", // 0x036D + "SMSG_LFG_UPDATE_LFG", // 0x036E + "SMSG_LFG_UPDATE_QUEUED", // 0x036F + "SMSG_LFG_PENDING_INVITE", // 0x0370 + "SMSG_LFG_PENDING_MATCH", // 0x0371 + "SMSG_LFG_PENDING_MATCH_DONE", // 0x0372 + "SMSG_TITLE_EARNED", // 0x0373 + "CMSG_SET_TITLE", // 0x0374 + "CMSG_CANCEL_MOUNT_AURA", // 0x0375 + "SMSG_ARENA_ERROR", // 0x0376 + "MSG_INSPECT_ARENA_TEAMS", // 0x0377 + "SMSG_DEATH_RELEASE_LOC", // 0x0378 + "CMSG_CANCEL_TEMP_ENCHANTMENT", // 0x0379 + "SMSG_FORCED_DEATH_UPDATE", // 0x037A + "CMSG_CHEAT_SET_HONOR_CURRENCY", // 0x037B + "CMSG_CHEAT_SET_ARENA_CURRENCY", // 0x037C + "MSG_MOVE_SET_FLIGHT_SPEED_CHEAT", // 0x037D + "MSG_MOVE_SET_FLIGHT_SPEED", // 0x037E + "MSG_MOVE_SET_FLIGHT_BACK_SPEED_CHEAT", // 0x037F + "MSG_MOVE_SET_FLIGHT_BACK_SPEED", // 0x0380 + "SMSG_FORCE_FLIGHT_SPEED_CHANGE", // 0x0381 + "CMSG_FORCE_FLIGHT_SPEED_CHANGE_ACK", // 0x0382 + "SMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE", // 0x0383 + "CMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK", // 0x0384 + "SMSG_SPLINE_SET_FLIGHT_SPEED", // 0x0385 + "SMSG_SPLINE_SET_FLIGHT_BACK_SPEED", // 0x0386 + "CMSG_MAELSTROM_INVALIDATE_CACHE", // 0x0387 + "SMSG_FLIGHT_SPLINE_SYNC", // 0x0388 + "CMSG_SET_TAXI_BENCHMARK_MODE", // 0x0389 + "SMSG_JOINED_BATTLEGROUND_QUEUE", // 0x038A + "SMSG_REALM_SPLIT", // 0x038B + "CMSG_REALM_SPLIT", // 0x038C + "CMSG_MOVE_CHNG_TRANSPORT", // 0x038D + "MSG_PARTY_ASSIGNMENT", // 0x038E + "SMSG_OFFER_PETITION_ERROR", // 0x038F + "SMSG_TIME_SYNC_REQ", // 0x0390 + "CMSG_TIME_SYNC_RESP", // 0x0391 + "CMSG_SEND_LOCAL_EVENT", // 0x0392 + "CMSG_SEND_GENERAL_TRIGGER", // 0x0393 + "CMSG_SEND_COMBAT_TRIGGER", // 0x0394 + "CMSG_MAELSTROM_GM_SENT_MAIL", // 0x0395 + "SMSG_RESET_FAILED_NOTIFY", // 0x0396 + "SMSG_REAL_GROUP_UPDATE", // 0x0397 + "SMSG_LFG_DISABLED", // 0x0398 + "CMSG_ACTIVE_PVP_CHEAT", // 0x0399 + "CMSG_CHEAT_DUMP_ITEMS_DEBUG_ONLY", // 0x039A + "SMSG_CHEAT_DUMP_ITEMS_DEBUG_ONLY_RESPONSE", // 0x039B + "SMSG_CHEAT_DUMP_ITEMS_DEBUG_ONLY_RESPONSE_WRITE_FILE", // 0x039C + "SMSG_UPDATE_COMBO_POINTS", // 0x039D + "SMSG_VOICE_SESSION_ROSTER_UPDATE", // 0x039E + "SMSG_VOICE_SESSION_LEAVE", // 0x039F + "SMSG_VOICE_SESSION_ADJUST_PRIORITY", // 0x03A0 + "CMSG_VOICE_SET_TALKER_MUTED_REQUEST", // 0x03A1 + "SMSG_VOICE_SET_TALKER_MUTED", // 0x03A2 + "SMSG_INIT_EXTRA_AURA_INFO_OBSOLETE", // 0x03A3 + "SMSG_SET_EXTRA_AURA_INFO_OBSOLETE", // 0x03A4 + "SMSG_SET_EXTRA_AURA_INFO_NEED_UPDATE_OBSOLETE", // 0x03A5 + "SMSG_CLEAR_EXTRA_AURA_INFO_OBSOLETE", // 0x03A6 + "MSG_MOVE_START_DESCEND", // 0x03A7 + "CMSG_IGNORE_REQUIREMENTS_CHEAT", // 0x03A8 + "SMSG_IGNORE_REQUIREMENTS_CHEAT", // 0x03A9 + "SMSG_SPELL_CHANCE_PROC_LOG", // 0x03AA + "CMSG_MOVE_SET_RUN_SPEED", // 0x03AB + "SMSG_DISMOUNT", // 0x03AC + "MSG_MOVE_UPDATE_CAN_FLY", // 0x03AD + "MSG_RAID_READY_CHECK_CONFIRM", // 0x03AE + "CMSG_VOICE_SESSION_ENABLE", // 0x03AF + "SMSG_VOICE_SESSION_ENABLE", // 0x03B0 + "SMSG_VOICE_PARENTAL_CONTROLS", // 0x03B1 + "CMSG_GM_WHISPER", // 0x03B2 + "SMSG_GM_MESSAGECHAT", // 0x03B3 + "MSG_GM_GEARRATING", // 0x03B4 + "CMSG_COMMENTATOR_ENABLE", // 0x03B5 + "SMSG_COMMENTATOR_STATE_CHANGED", // 0x03B6 + "CMSG_COMMENTATOR_GET_MAP_INFO", // 0x03B7 + "SMSG_COMMENTATOR_MAP_INFO", // 0x03B8 + "CMSG_COMMENTATOR_GET_PLAYER_INFO", // 0x03B9 + "SMSG_COMMENTATOR_GET_PLAYER_INFO", // 0x03BA + "SMSG_COMMENTATOR_PLAYER_INFO", // 0x03BB + "CMSG_COMMENTATOR_ENTER_INSTANCE", // 0x03BC + "CMSG_COMMENTATOR_EXIT_INSTANCE", // 0x03BD + "CMSG_COMMENTATOR_INSTANCE_COMMAND", // 0x03BE + "SMSG_CLEAR_TARGET", // 0x03BF + "CMSG_BOT_DETECTED", // 0x03C0 + "SMSG_CROSSED_INEBRIATION_THRESHOLD", // 0x03C1 + "CMSG_CHEAT_PLAYER_LOGIN", // 0x03C2 + "CMSG_CHEAT_PLAYER_LOOKUP", // 0x03C3 + "SMSG_CHEAT_PLAYER_LOOKUP", // 0x03C4 + "SMSG_KICK_REASON", // 0x03C5 + "MSG_RAID_READY_CHECK_FINISHED", // 0x03C6 + "CMSG_COMPLAIN", // 0x03C7 + "SMSG_COMPLAIN_RESULT", // 0x03C8 + "SMSG_FEATURE_SYSTEM_STATUS", // 0x03C9 + "CMSG_GM_SHOW_COMPLAINTS", // 0x03CA + "CMSG_GM_UNSQUELCH", // 0x03CB + "CMSG_CHANNEL_SILENCE_VOICE", // 0x03CC + "CMSG_CHANNEL_SILENCE_ALL", // 0x03CD + "CMSG_CHANNEL_UNSILENCE_VOICE", // 0x03CE + "CMSG_CHANNEL_UNSILENCE_ALL", // 0x03CF + "CMSG_TARGET_CAST", // 0x03D0 + "CMSG_TARGET_SCRIPT_CAST", // 0x03D1 + "CMSG_CHANNEL_DISPLAY_LIST", // 0x03D2 + "CMSG_SET_ACTIVE_VOICE_CHANNEL", // 0x03D3 + "CMSG_GET_CHANNEL_MEMBER_COUNT", // 0x03D4 + "SMSG_CHANNEL_MEMBER_COUNT", // 0x03D5 + "CMSG_CHANNEL_VOICE_ON", // 0x03D6 + "CMSG_CHANNEL_VOICE_OFF", // 0x03D7 + "CMSG_DEBUG_LIST_TARGETS", // 0x03D8 + "SMSG_DEBUG_LIST_TARGETS", // 0x03D9 + "SMSG_AVAILABLE_VOICE_CHANNEL", // 0x03DA + "CMSG_ADD_VOICE_IGNORE", // 0x03DB + "CMSG_DEL_VOICE_IGNORE", // 0x03DC + "CMSG_PARTY_SILENCE", // 0x03DD + "CMSG_PARTY_UNSILENCE", // 0x03DE + "MSG_NOTIFY_PARTY_SQUELCH", // 0x03DF + "SMSG_COMSAT_RECONNECT_TRY", // 0x03E0 + "SMSG_COMSAT_DISCONNECT", // 0x03E1 + "SMSG_COMSAT_CONNECT_FAIL", // 0x03E2 + "SMSG_VOICE_CHAT_STATUS", // 0x03E3 + "CMSG_REPORT_PVP_AFK", // 0x03E4 + "CMSG_REPORT_PVP_AFK_RESULT", // 0x03E5 + "CMSG_GUILD_BANKER_ACTIVATE", // 0x03E6 + "CMSG_GUILD_BANK_QUERY_TAB", // 0x03E7 + "SMSG_GUILD_BANK_LIST", // 0x03E8 + "CMSG_GUILD_BANK_SWAP_ITEMS", // 0x03E9 + "CMSG_GUILD_BANK_BUY_TAB", // 0x03EA + "CMSG_GUILD_BANK_UPDATE_TAB", // 0x03EB + "CMSG_GUILD_BANK_DEPOSIT_MONEY", // 0x03EC + "CMSG_GUILD_BANK_WITHDRAW_MONEY", // 0x03ED + "MSG_GUILD_BANK_LOG_QUERY", // 0x03EE + "CMSG_SET_CHANNEL_WATCH", // 0x03EF + "SMSG_USERLIST_ADD", // 0x03F0 + "SMSG_USERLIST_REMOVE", // 0x03F1 + "SMSG_USERLIST_UPDATE", // 0x03F2 + "CMSG_CLEAR_CHANNEL_WATCH", // 0x03F3 + "SMSG_INSPECT_TALENT", // 0x03F4 + "SMSG_GOGOGO_OBSOLETE", // 0x03F5 + "SMSG_ECHO_PARTY_SQUELCH", // 0x03F6 + "CMSG_SET_TITLE_SUFFIX", // 0x03F7 + "CMSG_SPELLCLICK", // 0x03F8 + "SMSG_LOOT_LIST", // 0x03F9 + "CMSG_GM_CHARACTER_RESTORE", // 0x03FA + "CMSG_GM_CHARACTER_SAVE", // 0x03FB + "SMSG_VOICESESSION_FULL", // 0x03FC + "MSG_GUILD_PERMISSIONS", // 0x03FD + "MSG_GUILD_BANK_MONEY_WITHDRAWN", // 0x03FE + "MSG_GUILD_EVENT_LOG_QUERY", // 0x03FF + "CMSG_MAELSTROM_RENAME_GUILD", // 0x0400 + "CMSG_GET_MIRRORIMAGE_DATA", // 0x0401 + "SMSG_MIRRORIMAGE_DATA", // 0x0402 + "SMSG_FORCE_DISPLAY_UPDATE", // 0x0403 + "SMSG_SPELL_CHANCE_RESIST_PUSHBACK", // 0x0404 + "CMSG_IGNORE_DIMINISHING_RETURNS_CHEAT", // 0x0405 + "SMSG_IGNORE_DIMINISHING_RETURNS_CHEAT", // 0x0406 + "CMSG_KEEP_ALIVE", // 0x0407 + "SMSG_RAID_READY_CHECK_ERROR", // 0x0408 + "CMSG_OPT_OUT_OF_LOOT", // 0x0409 + "MSG_QUERY_GUILD_BANK_TEXT", // 0x040A + "CMSG_SET_GUILD_BANK_TEXT", // 0x040B + "CMSG_SET_GRANTABLE_LEVELS", // 0x040C + "CMSG_GRANT_LEVEL", // 0x040D + "CMSG_REFER_A_FRIEND", // 0x040E + "MSG_GM_CHANGE_ARENA_RATING", // 0x040F + "CMSG_DECLINE_CHANNEL_INVITE", // 0x0410 + "CMSG_GROUPACTION_THROTTLED", // 0x0411 + "SMSG_OVERRIDE_LIGHT", // 0x0412 + "SMSG_TOTEM_CREATED", // 0x0413 + "CMSG_TOTEM_DESTROYED", // 0x0414 + "CMSG_EXPIRE_RAID_INSTANCE", // 0x0415 + "CMSG_NO_SPELL_VARIANCE", // 0x0416 + "CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY", // 0x0417 + "SMSG_QUESTGIVER_STATUS_MULTIPLE", // 0x0418 + "CMSG_SET_PLAYER_DECLINED_NAMES", // 0x0419 + "SMSG_SET_PLAYER_DECLINED_NAMES_RESULT", // 0x041A + "CMSG_QUERY_SERVER_BUCK_DATA", // 0x041B + "CMSG_CLEAR_SERVER_BUCK_DATA", // 0x041C + "SMSG_SERVER_BUCK_DATA", // 0x041D + "SMSG_SEND_UNLEARN_SPELLS", // 0x041E + "SMSG_PROPOSE_LEVEL_GRANT", // 0x041F + "CMSG_ACCEPT_LEVEL_GRANT", // 0x0420 + "SMSG_REFER_A_FRIEND_FAILURE", // 0x0421 + "SMSG_SPLINE_MOVE_SET_FLYING", // 0x0422 + "SMSG_SPLINE_MOVE_UNSET_FLYING", // 0x0423 + "SMSG_SUMMON_CANCEL", // 0x0424 + "CMSG_CHANGE_PERSONAL_ARENA_RATING", // 0x0425 + "CMSG_ALTER_APPEARANCE", // 0x0426 + "SMSG_ENABLE_BARBER_SHOP", // 0x0427 + "SMSG_BARBER_SHOP_RESULT", // 0x0428 + "CMSG_CALENDAR_GET_CALENDAR", // 0x0429 + "CMSG_CALENDAR_GET_EVENT", // 0x042A + "CMSG_CALENDAR_GUILD_FILTER", // 0x042B + "CMSG_CALENDAR_ARENA_TEAM", // 0x042C + "CMSG_CALENDAR_ADD_EVENT", // 0x042D + "CMSG_CALENDAR_UPDATE_EVENT", // 0x042E + "CMSG_CALENDAR_REMOVE_EVENT", // 0x042F + "CMSG_CALENDAR_COPY_EVENT", // 0x0430 + "CMSG_CALENDAR_EVENT_INVITE", // 0x0431 + "CMSG_CALENDAR_EVENT_RSVP", // 0x0432 + "CMSG_CALENDAR_EVENT_REMOVE_INVITE", // 0x0433 + "CMSG_CALENDAR_EVENT_STATUS", // 0x0434 + "CMSG_CALENDAR_EVENT_MODERATOR_STATUS", // 0x0435 + "SMSG_CALENDAR_SEND_CALENDAR", // 0x0436 + "SMSG_CALENDAR_SEND_EVENT", // 0x0437 + "SMSG_CALENDAR_FILTER_GUILD", // 0x0438 + "SMSG_CALENDAR_ARENA_TEAM", // 0x0439 + "SMSG_CALENDAR_EVENT_INVITE", // 0x043A + "SMSG_CALENDAR_EVENT_INVITE_REMOVED", // 0x043B + "SMSG_CALENDAR_EVENT_STATUS", // 0x043C + "SMSG_CALENDAR_COMMAND_RESULT", // 0x043D + "SMSG_CALENDAR_RAID_LOCKOUT_ADDED", // 0x043E + "SMSG_CALENDAR_RAID_LOCKOUT_REMOVED", // 0x043F + "SMSG_CALENDAR_EVENT_INVITE_ALERT", // 0x0440 + "SMSG_CALENDAR_EVENT_INVITE_REMOVED_ALERT", // 0x0441 + "SMSG_CALENDAR_EVENT_INVITE_STATUS_ALERT", // 0x0442 + "SMSG_CALENDAR_EVENT_REMOVED_ALERT", // 0x0443 + "SMSG_CALENDAR_EVENT_UPDATED_ALERT", // 0x0444 + "SMSG_CALENDAR_EVENT_MODERATOR_STATUS_ALERT", // 0x0445 + "CMSG_CALENDAR_COMPLAIN", // 0x0446 + "CMSG_CALENDAR_GET_NUM_PENDING", // 0x0447 + "SMSG_CALENDAR_SEND_NUM_PENDING", // 0x0448 + "CMSG_SAVE_DANCE", // 0x0449 + "SMSG_NOTIFY_DANCE", // 0x044A + "CMSG_PLAY_DANCE", // 0x044B + "SMSG_PLAY_DANCE", // 0x044C + "CMSG_LOAD_DANCES", // 0x044D + "CMSG_STOP_DANCE", // 0x044E + "SMSG_STOP_DANCE", // 0x044F + "CMSG_SYNC_DANCE", // 0x0450 + "CMSG_DANCE_QUERY", // 0x0451 + "SMSG_DANCE_QUERY_RESPONSE", // 0x0452 + "SMSG_INVALIDATE_DANCE", // 0x0453 + "CMSG_DELETE_DANCE", // 0x0454 + "SMSG_LEARNED_DANCE_MOVES", // 0x0455 + "CMSG_LEARN_DANCE_MOVE", // 0x0456 + "CMSG_UNLEARN_DANCE_MOVE", // 0x0457 + "CMSG_SET_RUNE_COUNT", // 0x0458 + "CMSG_SET_RUNE_COOLDOWN", // 0x0459 + "MSG_MOVE_SET_PITCH_RATE_CHEAT", // 0x045A + "MSG_MOVE_SET_PITCH_RATE", // 0x045B + "SMSG_FORCE_PITCH_RATE_CHANGE", // 0x045C + "CMSG_FORCE_PITCH_RATE_CHANGE_ACK", // 0x045D + "SMSG_SPLINE_SET_PITCH_RATE", // 0x045E + "SMSG_MOVE_ABANDON_TRANSPORT", // 0x045F + "MSG_MOVE_ABANDON_TRANSPORT", // 0x0460 + "CMSG_MOVE_ABANDON_TRANSPORT_ACK", // 0x0461 + "CMSG_UPDATE_MISSILE_TRAJECTORY", // 0x0462 + "SMSG_UPDATE_ACCOUNT_DATA_COMPLETE", // 0x0463 + "SMSG_TRIGGER_MOVIE", // 0x0464 + "CMSG_COMPLETE_MOVIE", // 0x0465 + "CMSG_SET_GLYPH_SLOT", // 0x0466 + "CMSG_SET_GLYPH", // 0x0467 + "SMSG_ACHIEVEMENT_EARNED", // 0x0468 + "SMSG_DYNAMIC_DROP_ROLL_RESULT", // 0x0469 + "SMSG_CRITERIA_UPDATE", // 0x046A + "CMSG_QUERY_INSPECT_ACHIEVEMENTS", // 0x046B + "SMSG_RESPOND_INSPECT_ACHIEVEMENTS", // 0x046C + "CMSG_DISMISS_CONTROLLED_VEHICLE", // 0x046D + "CMSG_COMPLETE_ACHIEVEMENT_CHEAT", // 0x046E + "SMSG_QUESTUPDATE_ADD_PVP_KILL", // 0x046F + "CMSG_SET_CRITERIA_CHEAT", // 0x0470 + "SMSG_GROUP_SWAP_FAILED", // 0x0471 + "CMSG_UNITANIMTIER_CHEAT", // 0x0472 + "CMSG_CHAR_CUSTOMIZE", // 0x0473 + "SMSG_CHAR_CUSTOMIZE", // 0x0474 + "SMSG_PET_RENAMEABLE", // 0x0475 + "CMSG_REQUEST_VEHICLE_EXIT", // 0x0476 + "CMSG_REQUEST_VEHICLE_PREV_SEAT", // 0x0477 + "CMSG_REQUEST_VEHICLE_NEXT_SEAT", // 0x0478 + "CMSG_REQUEST_VEHICLE_SWITCH_SEAT", // 0x0479 + "CMSG_PET_LEARN_TALENT", // 0x047A + "CMSG_PET_UNLEARN_TALENTS", // 0x047B + "SMSG_SET_PHASE_SHIFT", // 0x047C + "SMSG_ALL_ACHIEVEMENT_DATA", // 0x047D + "CMSG_FORCE_SAY_CHEAT", // 0x047E + "SMSG_HEALTH_UPDATE", // 0x047F + "SMSG_POWER_UPDATE", // 0x0480 + "CMSG_GAMEOBJ_REPORT_USE", // 0x0481 + "SMSG_HIGHEST_THREAT_UPDATE", // 0x0482 + "SMSG_THREAT_UPDATE", // 0x0483 + "SMSG_THREAT_REMOVE", // 0x0484 + "SMSG_THREAT_CLEAR", // 0x0485 + "SMSG_CONVERT_RUNE", // 0x0486 + "SMSG_RESYNC_RUNES", // 0x0487 + "SMSG_ADD_RUNE_POWER", // 0x0488 + "CMSG_START_QUEST", // 0x0489 + "CMSG_REMOVE_GLYPH", // 0x048A + "CMSG_DUMP_OBJECTS", // 0x048B + "SMSG_DUMP_OBJECTS_DATA", // 0x048C + "CMSG_DISMISS_CRITTER", // 0x048D + "SMSG_NOTIFY_DEST_LOC_SPELL_CAST", // 0x048E + "CMSG_AUCTION_LIST_PENDING_SALES", // 0x048F + "SMSG_AUCTION_LIST_PENDING_SALES", // 0x0490 + "SMSG_MODIFY_COOLDOWN", // 0x0491 + "SMSG_PET_UPDATE_COMBO_POINTS", // 0x0492 + "CMSG_ENABLETAXI", // 0x0493 + "SMSG_PRE_RESURRECT", // 0x0494 + "SMSG_AURA_UPDATE_ALL", // 0x0495 + "SMSG_AURA_UPDATE", // 0x0496 + "CMSG_FLOOD_GRACE_CHEAT", // 0x0497 + "SMSG_SERVER_FIRST_ACHIEVEMENT", // 0x0498 + "SMSG_PET_LEARNED_SPELL", // 0x0499 + "SMSG_PET_REMOVED_SPELL", // 0x049A + "CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE", // 0x049B + "CMSG_HEARTH_AND_RESURRECT", // 0x049C + "SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA", // 0x049D + "SMSG_CRITERIA_DELETED", // 0x049E + "SMSG_ACHIEVEMENT_DELETED", // 0x049F + "CMSG_SERVER_INFO_QUERY", // 0x04A0 + "SMSG_SERVER_INFO_RESPONSE", // 0x04A1 + "CMSG_CHECK_LOGIN_CRITERIA", // 0x04A2 + "SMSG_SERVER_BUCK_DATA_START", // 0x04A3 + "CMSG_QUERY_VEHICLE_STATUS", // 0x04A4 + "UMSG_UNKNOWN_1189", // 0x04A5 + "SMSG_UNKNOWN_1190", // 0x04A6 + "SMSG_UNKNOWN_1191", // 0x04A7 + "CMSG_UNKNOWN_1192", // 0x04A8 + "CMSG_EJECT_PASSENGER", // 0x04A9 + "SMSG_PET_GUIDS", // 0x04AA + "SMSG_CLIENTCACHE_VERSION", // 0x04AB + "UMSG_UNKNOWN_1196", // 0x04AC + "UMSG_UNKNOWN_1197", // 0x04AD + "UMSG_UNKNOWN_1198", // 0x04AE + "UMSG_UNKNOWN_1199", // 0x04AF + "UMSG_UNKNOWN_1200", // 0x04B0 + "UMSG_UNKNOWN_1201", // 0x04B1 + "SMSG_UNKNOWN_1202", // 0x04B2 + "CMSG_UNKNOWN_1203", // 0x04B3 + "CMSG_UNKNOWN_1204", // 0x04B4 + "SMSG_UNKNOWN_1205", // 0x04B5 + "CMSG_UNKNOWN_1206", // 0x04B6 + "SMSG_UNKNOWN_1207", // 0x04B7 + "CMSG_LFG_SET_ROLES", // 0x04B8 + "UMSG_UNKNOWN_1209", // 0x04B9 + "CMSG_UNKNOWN_1210", // 0x04BA + "SMSG_UNKNOWN_1211", // 0x04BB + "SMSG_EQUIPMENT_SET_LIST", // 0x04BC + "CMSG_EQUIPMENT_SET_SAVE", // 0x04BD + "CMSG_UNKNOWN_1214", // 0x04BE + "SMSG_UNKNOWN_1215", // 0x04BF + "SMSG_TALENTS_INFO", // 0x04C0 + "CMSG_LEARN_PREVIEW_TALENTS", // 0x04C1 + "CMSG_LEARN_PREVIEW_TALENTS_PET", // 0x04C2 + "UMSG_UNKNOWN_1219", // 0x04C3 + "UMSG_UNKNOWN_1220", // 0x04C4 + "UMSG_UNKNOWN_1221", // 0x04C5 + "UMSG_UNKNOWN_1222", // 0x04C6 + "SMSG_UNKNOWN_1223", // 0x04C7 + "SMSG_UNKNOWN_1224", // 0x04C8 + "UMSG_UNKNOWN_1225", // 0x04C9 + "UMSG_UNKNOWN_1226", // 0x04CA + "CMSG_EQUIPMENT_SET_USE", // 0x04CB + "SMSG_EQUIPMENT_SET_USE_RESULT", // 0x04CC "" }; const char *GetOpcodeName(unsigned int id) { + uint32 t = sizeof(worldOpcodeNames); if(id > MAX_OPCODE_ID) - return ""; + return "OPCODE_INVALID"; + if(id >= sizeof(worldOpcodeNames) / sizeof(char*)) + return "OPCODE_NAME_UNKNOWN"; return worldOpcodeNames[id]; } diff --git a/src/Client/World/Opcodes.h b/src/Client/World/Opcodes.h index 8814911..bb205a7 100644 --- a/src/Client/World/Opcodes.h +++ b/src/Client/World/Opcodes.h @@ -340,15 +340,15 @@ enum OpCodes SMSG_SPELL_COOLDOWN = 0x134, SMSG_COOLDOWN_EVENT = 0x135, CMSG_CANCEL_AURA = 0x136, - SMSG_UPDATE_AURA_DURATION_OBSOLETE = 0x137, + SMSG_EQUIPMENT_SET_SAVED = 0x137, SMSG_PET_CAST_FAILED = 0x138, MSG_CHANNEL_START = 0x139, MSG_CHANNEL_UPDATE = 0x13A, CMSG_CANCEL_CHANNELLING = 0x13B, SMSG_AI_REACTION = 0x13C, CMSG_SET_SELECTION = 0x13D, - CMSG_SET_TARGET_OBSOLETE = 0x13E, - CMSG_UNUSED = 0x13F, + CMSG_EQUIPMENT_SET_DELETE = 0x13E, + CMSG_INSTANCE_LOCK_RESPONSE = 0x13F, CMSG_UNUSED2 = 0x140, CMSG_ATTACKSWING = 0x141, CMSG_ATTACKSTOP = 0x142, @@ -356,11 +356,11 @@ enum OpCodes SMSG_ATTACKSTOP = 0x144, SMSG_ATTACKSWING_NOTINRANGE = 0x145, SMSG_ATTACKSWING_BADFACING = 0x146, - SMSG_ATTACKSWING_NOTSTANDING = 0x147, + SMSG_INSTANCE_LOCK_QUERY = 0x147, SMSG_ATTACKSWING_DEADTARGET = 0x148, SMSG_ATTACKSWING_CANT_ATTACK = 0x149, SMSG_ATTACKERSTATEUPDATE = 0x14A, - SMSG_VICTIMSTATEUPDATE_OBSOLETE = 0x14B, + SMSG_BATTLEFIELD_PORT_DENIED = 0x14B, SMSG_DAMAGE_DONE_OBSOLETE = 0x14C, SMSG_DAMAGE_TAKEN_OBSOLETE = 0x14D, SMSG_CANCEL_COMBAT = 0x14E, @@ -688,7 +688,7 @@ enum OpCodes CMSG_BUYBACK_ITEM = 0x290, SMSG_SERVER_MESSAGE = 0x291, CMSG_MEETINGSTONE_JOIN = 0x292, - CMSG_MEETINGSTONE_LEAVE = 0x293, + CMSG_MEETINGSTONE_LEAVE = 0x293, // SMSG? CMSG_MEETINGSTONE_CHEAT = 0x294, SMSG_MEETINGSTONE_SETQUEUE = 0x295, CMSG_MEETINGSTONE_INFO = 0x296, @@ -1209,27 +1209,59 @@ enum OpCodes SMSG_PET_LEARNED_SPELL = 0x499, SMSG_PET_REMOVED_SPELL = 0x49A, CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE = 0x49B, - CMSG_HEARTH_AND_RESURRECT = 0x49C, - SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x49D, - SMSG_CRITERIA_DELETED = 0x49E, - SMSG_ACHIEVEMENT_DELETED = 0x49F, - CMSG_SERVER_INFO_QUERY = 0x4A0, - SMSG_SERVER_INFO_RESPONSE = 0x4A1, - CMSG_CHECK_LOGIN_CRITERIA = 0x4A2, - SMSG_SERVER_BUCK_DATA_START = 0x4A3, - CMSG_QUERY_VEHICLE_STATUS = 0x4A4, - SMSG_PET_GUIDS = 0x4A5, - SMSG_CLIENTCACHE_VERSION = 0x4A6, - UMSG_UNKNOWN_1191 = 0x4A7, - UMSG_UNKNOWN_1192 = 0x4A8, - UMSG_UNKNOWN_1193 = 0x4A9, - UMSG_UNKNOWN_1194 = 0x4AA, - UMSG_UNKNOWN_1195 = 0x4AB, - UMSG_UNKNOWN_1196 = 0x4AC + CMSG_HEARTH_AND_RESURRECT = 0x49C, // not changed in 3.1 + SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x49D, // not changed 9626 + SMSG_CRITERIA_DELETED = 0x49E, // not changed 9626 + SMSG_ACHIEVEMENT_DELETED = 0x49F, // not changed 9626 + CMSG_SERVER_INFO_QUERY = 0x4A0, // not found + SMSG_SERVER_INFO_RESPONSE = 0x4A1, // not found + CMSG_CHECK_LOGIN_CRITERIA = 0x4A2, // not found + SMSG_SERVER_BUCK_DATA_START = 0x4A3, // not found + CMSG_QUERY_VEHICLE_STATUS = 0x4A4, // not found + UMSG_UNKNOWN_1189 = 0x4A5, // not found, old SMSG_PET_GUIDS + SMSG_UNKNOWN_1190 = 0x4A6, // smsg unk, old SMSG_CLIENTCACHE_VERSION + SMSG_UNKNOWN_1191 = 0x4A7, // smsg guid+uint32 (vehicle) + CMSG_UNKNOWN_1192 = 0x4A8, // cmsg uint64 + CMSG_EJECT_PASSENGER = 0x4A9, // cmsg uint64 + SMSG_PET_GUIDS = 0x4AA, // shifted+5 + SMSG_CLIENTCACHE_VERSION = 0x4AB, // shifted+5 + UMSG_UNKNOWN_1196 = 0x4AC, // not found + UMSG_UNKNOWN_1197 = 0x4AD, // not found + UMSG_UNKNOWN_1198 = 0x4AE, // not found + UMSG_UNKNOWN_1199 = 0x4AF, // not found + UMSG_UNKNOWN_1200 = 0x4B0, // not found + UMSG_UNKNOWN_1201 = 0x4B1, // not found + SMSG_UNKNOWN_1202 = 0x4B2, // refund something + CMSG_UNKNOWN_1203 = 0x4B3, // refund request? + CMSG_UNKNOWN_1204 = 0x4B4, // lua: ContainerRefundItemPurchase + SMSG_UNKNOWN_1205 = 0x4B5, // refund something + CMSG_UNKNOWN_1206 = 0x4B6, // CMSG, uint32 + SMSG_UNKNOWN_1207 = 0x4B7, // SMSG, string+float + CMSG_LFG_SET_ROLES = 0x4B8, // CMSG, empty, lua: SetLFGRoles + UMSG_UNKNOWN_1209 = 0x4B9, // not found + CMSG_UNKNOWN_1210 = 0x4BA, // CMSG, uint64, lua: CalendarContextEventSignUp + SMSG_UNKNOWN_1211 = 0x4BB, // SMSG, calendar related + SMSG_EQUIPMENT_SET_LIST = 0x4BC, // SMSG, equipment manager list? + CMSG_EQUIPMENT_SET_SAVE = 0x4BD, // CMSG, lua: SaveEquipmentSet + CMSG_UNKNOWN_1214 = 0x4BE, // CMSG, missle? + SMSG_UNKNOWN_1215 = 0x4BF, // SMSG, uint64, uint8, 3 x float + SMSG_TALENTS_INFO = 0x4C0, // SMSG, talents related + CMSG_LEARN_PREVIEW_TALENTS = 0x4C1, // CMSG, lua: LearnPreviewTalents (for player?) + CMSG_LEARN_PREVIEW_TALENTS_PET = 0x4C2, // CMSG, lua: LearnPreviewTalents (for pet?) + UMSG_UNKNOWN_1219 = 0x4C3, // not found + UMSG_UNKNOWN_1220 = 0x4C4, // not found + UMSG_UNKNOWN_1221 = 0x4C5, // not found + UMSG_UNKNOWN_1222 = 0x4C6, // not found + SMSG_UNKNOWN_1223 = 0x4C7, // uint64, arena pet? + SMSG_UNKNOWN_1224 = 0x4C8, // uint32 "Can't change arena team..." + UMSG_UNKNOWN_1225 = 0x4C9, // not found + UMSG_UNKNOWN_1226 = 0x4CA, // not found + CMSG_EQUIPMENT_SET_USE = 0x4CB, // CMSG, lua: UseEquipmentSet + SMSG_EQUIPMENT_SET_USE_RESULT = 0x4CC, // SMSG, UseEquipmentSetResult? }; //if you add new opcode .. Do NOT forget to change the following define MAX_OPCODE_ID and also add new opcode to table in opcodes.cpp -#define MAX_OPCODE_ID 1196 +#define MAX_OPCODE_ID 1228 /// Results of friend related commands enum FriendsResult diff --git a/src/Client/World/Unit.h b/src/Client/World/Unit.h index 652e197..70a95fd 100644 --- a/src/Client/World/Unit.h +++ b/src/Client/World/Unit.h @@ -42,6 +42,8 @@ enum UnitFlags UNIT_FLAG_SHEATHE = 0x40000000 }; +#define MAX_KILL_CREDIT 2 + struct CreatureTemplate { uint32 entry; @@ -54,6 +56,7 @@ struct CreatureTemplate uint32 rank; //uint32 unk1; uint32 SpellDataId; + uint32 killCredit[MAX_KILL_CREDIT]; uint32 displayid_A; uint32 displayid_H; uint32 displayid_AF; @@ -61,6 +64,8 @@ struct CreatureTemplate //float unkf1; //float unkf2; uint8 RacialLeader; + uint32 questItems[4]; + uint32 movementId; }; diff --git a/src/Client/World/UpdateData.cpp b/src/Client/World/UpdateData.cpp index c4bbffe..1943b39 100644 --- a/src/Client/World/UpdateData.cpp +++ b/src/Client/World/UpdateData.cpp @@ -235,7 +235,7 @@ void WorldSession::_HandleUpdateObjectOpcode(WorldPacket& recvPacket) void WorldSession::_MovementUpdate(uint8 objtypeid, uint64 uguid, WorldPacket& recvPacket) { MovementInfo mi; // TODO: use a reference to a MovementInfo in Unit/Player class once implemented - uint8 flags; + uint16 flags; float unkfx,unkfy,unkfz; // uint64 fullguid; // see below float speedWalk, speedRun, speedSwimBack, speedSwim, speedWalkBack, speedTurn, speedFly, speedFlyBack, speedPitchRate; @@ -261,15 +261,10 @@ void WorldSession::_MovementUpdate(uint8 objtypeid, uint64 uguid, WorldPacket& r if(flags & UPDATEFLAG_LIVING) { recvPacket >> mi.flags >> mi.unkFlags >> mi.time; - } - else - { - logdev("MovementUpdate: UPDATEFLAG_LIVING *NOT* set! (no MovementInfo)"); - } logdev("MovementUpdate: TypeID=%u GUID="I64FMT" pObj=%X flags=%u mi.flags=%u",objtypeid,uguid,obj,flags,mi.flags); - if(flags & UPDATEFLAG_HAS_POSITION) + /*if(flags & UPDATEFLAG_HAS_POSITION) { if(flags & UPDATEFLAG_TRANSPORT) { @@ -277,19 +272,20 @@ void WorldSession::_MovementUpdate(uint8 objtypeid, uint64 uguid, WorldPacket& r logdev("TRANSPORT_FLOATS @ flags: x=%f y=%f z=%f o=%f", unkfx, unkfy, unkfz, mi.o); } else - { + {*/ recvPacket >> mi.x >> mi.y >> mi.z >> mi.o; logdev("FLOATS: x=%f y=%f z=%f o=%f",mi.x, mi.y, mi.z ,mi.o); if(obj && obj->IsWorldObject()) ((WorldObject*)obj)->SetPosition(mi.x, mi.y, mi.z, mi.o); - } - } + //} + //} - if(flags & UPDATEFLAG_LIVING) - { + //if(flags & UPDATEFLAG_LIVING) + //{ if(mi.flags & MOVEMENTFLAG_ONTRANSPORT) { - recvPacket >> mi.t_guid >> mi.t_x >> mi.t_y >> mi.t_z >> mi.t_o; + mi.t_guid = recvPacket.GetPackedGuid(); + recvPacket >> mi.t_x >> mi.t_y >> mi.t_z >> mi.t_o; recvPacket >> mi.t_time; // added in 2.0.3 recvPacket >> mi.t_seat; logdev("TRANSPORT @ mi.flags: guid="I64FMT" x=%f y=%f z=%f o=%f", mi.t_guid, mi.t_x, mi.t_y, mi.t_z, mi.t_o); @@ -341,6 +337,35 @@ void WorldSession::_MovementUpdate(uint8 objtypeid, uint64 uguid, WorldPacket& r logerror("MovementUpdate: MOVEMENTFLAG_SPLINE2 is set, if you see this message please report it!"); return; } + //} + } + else // !LIVING + { + //logdev("MovementUpdate: UPDATEFLAG_LIVING *NOT* set! (no MovementInfo)"); + // TODO: Find whats this and FIX! + if(flags & UPDATEFLAG_POSITION) + { + uint64 pguid = recvPacket.GetPackedGuid(); + float x,y,z,o; + recvPacket >> x >> y >> z; + recvPacket >> x >> y >> z; + recvPacket >> o >> o; + } + else + { + if(flags & UPDATEFLAG_HAS_POSITION) + { + float x,y,z,o; + if(flags & UPDATEFLAG_TRANSPORT) + { + recvPacket >> x >> y >> z >> o; + } + else + { + recvPacket >> x >> y >> z >> o; + } + } + } } if(flags & UPDATEFLAG_LOWGUID) @@ -376,6 +401,12 @@ void WorldSession::_MovementUpdate(uint8 objtypeid, uint64 uguid, WorldPacket& r recvPacket >> vehicleId >> facingAdj; } + + if(flags & UPDATEFLAG_ROTATION) + { + uint64 rotation; + recvPacket >> rotation; + } } void WorldSession::_ValuesUpdate(uint64 uguid, WorldPacket& recvPacket) @@ -548,11 +579,11 @@ bool IsFloatField(uint8 ty, uint32 f) }; static uint32 floats_gameobject[] = { - (uint32)GAMEOBJECT_ROTATION, + /*(uint32)GAMEOBJECT_ROTATION, (uint32)GAMEOBJECT_POS_X, (uint32)GAMEOBJECT_POS_Y, (uint32)GAMEOBJECT_POS_Z, - (uint32)GAMEOBJECT_FACING, + (uint32)GAMEOBJECT_FACING,*/ (uint32)-1 }; static uint32 floats_dynobject[] = @@ -565,10 +596,10 @@ bool IsFloatField(uint8 ty, uint32 f) }; static uint32 floats_corpse[] = { - (uint32)CORPSE_FIELD_FACING, + /*(uint32)CORPSE_FIELD_FACING, (uint32)CORPSE_FIELD_POS_X, (uint32)CORPSE_FIELD_POS_Y, - (uint32)CORPSE_FIELD_POS_Z, + (uint32)CORPSE_FIELD_POS_Z,*/ (uint32)-1 }; diff --git a/src/Client/World/UpdateData.h b/src/Client/World/UpdateData.h index 06fe88b..8e6f210 100644 --- a/src/Client/World/UpdateData.h +++ b/src/Client/World/UpdateData.h @@ -13,15 +13,17 @@ enum OBJECT_UPDATE_TYPE enum OBJECT_UPDATE_FLAGS { - UPDATEFLAG_NONE = 0x00, - UPDATEFLAG_SELF = 0x01, - UPDATEFLAG_TRANSPORT = 0x02, - UPDATEFLAG_HAS_TARGET = 0x04, - UPDATEFLAG_LOWGUID = 0x08, - UPDATEFLAG_HIGHGUID = 0x10, - UPDATEFLAG_LIVING = 0x20, - UPDATEFLAG_HAS_POSITION = 0x40, - UPDATEFLAG_VEHICLE = 0x80 + UPDATEFLAG_NONE = 0x0000, + UPDATEFLAG_SELF = 0x0001, + UPDATEFLAG_TRANSPORT = 0x0002, + UPDATEFLAG_HAS_TARGET = 0x0004, + UPDATEFLAG_LOWGUID = 0x0008, + UPDATEFLAG_HIGHGUID = 0x0010, + UPDATEFLAG_LIVING = 0x0020, + UPDATEFLAG_HAS_POSITION = 0x0040, + UPDATEFLAG_VEHICLE = 0x0080, + UPDATEFLAG_POSITION = 0x0100, + UPDATEFLAG_ROTATION = 0x0200 }; enum MovementFlags diff --git a/src/Client/World/UpdateFields.h b/src/Client/World/UpdateFields.h index 1a3e9fd..c771936 100644 --- a/src/Client/World/UpdateFields.h +++ b/src/Client/World/UpdateFields.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2008 MaNGOS + * Copyright (C) 2005-2009 MaNGOS * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,7 +19,7 @@ #ifndef _UPDATEFIELDS_AUTO_H #define _UPDATEFIELDS_AUTO_H -// Auto generated for version 3, 0, 3, 9183 +// Auto generated for version 3, 1, 3, 9947 enum EObjectFields { @@ -37,9 +37,9 @@ enum EItemFields ITEM_FIELD_CONTAINED = OBJECT_END + 0x0002, // Size: 2, Type: LONG, Flags: PUBLIC ITEM_FIELD_CREATOR = OBJECT_END + 0x0004, // Size: 2, Type: LONG, Flags: PUBLIC ITEM_FIELD_GIFTCREATOR = OBJECT_END + 0x0006, // Size: 2, Type: LONG, Flags: PUBLIC - ITEM_FIELD_STACK_COUNT = OBJECT_END + 0x0008, // Size: 1, Type: INT, Flags: OWNER_ONLY, UNK2 - ITEM_FIELD_DURATION = OBJECT_END + 0x0009, // Size: 1, Type: INT, Flags: OWNER_ONLY, UNK2 - ITEM_FIELD_SPELL_CHARGES = OBJECT_END + 0x000A, // Size: 5, Type: INT, Flags: OWNER_ONLY, UNK2 + ITEM_FIELD_STACK_COUNT = OBJECT_END + 0x0008, // Size: 1, Type: INT, Flags: OWNER, ITEM_OWNER + ITEM_FIELD_DURATION = OBJECT_END + 0x0009, // Size: 1, Type: INT, Flags: OWNER, ITEM_OWNER + ITEM_FIELD_SPELL_CHARGES = OBJECT_END + 0x000A, // Size: 5, Type: INT, Flags: OWNER, ITEM_OWNER ITEM_FIELD_FLAGS = OBJECT_END + 0x000F, // Size: 1, Type: INT, Flags: PUBLIC ITEM_FIELD_ENCHANTMENT_1_1 = OBJECT_END + 0x0010, // Size: 2, Type: INT, Flags: PUBLIC ITEM_FIELD_ENCHANTMENT_1_3 = OBJECT_END + 0x0012, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC @@ -67,9 +67,9 @@ enum EItemFields ITEM_FIELD_ENCHANTMENT_12_3 = OBJECT_END + 0x0033, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC ITEM_FIELD_PROPERTY_SEED = OBJECT_END + 0x0034, // Size: 1, Type: INT, Flags: PUBLIC ITEM_FIELD_RANDOM_PROPERTIES_ID = OBJECT_END + 0x0035, // Size: 1, Type: INT, Flags: PUBLIC - ITEM_FIELD_ITEM_TEXT_ID = OBJECT_END + 0x0036, // Size: 1, Type: INT, Flags: OWNER_ONLY - ITEM_FIELD_DURABILITY = OBJECT_END + 0x0037, // Size: 1, Type: INT, Flags: OWNER_ONLY, UNK2 - ITEM_FIELD_MAXDURABILITY = OBJECT_END + 0x0038, // Size: 1, Type: INT, Flags: OWNER_ONLY, UNK2 + ITEM_FIELD_ITEM_TEXT_ID = OBJECT_END + 0x0036, // Size: 1, Type: INT, Flags: OWNER + ITEM_FIELD_DURABILITY = OBJECT_END + 0x0037, // Size: 1, Type: INT, Flags: OWNER, ITEM_OWNER + ITEM_FIELD_MAXDURABILITY = OBJECT_END + 0x0038, // Size: 1, Type: INT, Flags: OWNER, ITEM_OWNER ITEM_FIELD_PAD = OBJECT_END + 0x0039, // Size: 1, Type: INT, Flags: NONE ITEM_END = OBJECT_END + 0x003A, }; @@ -109,8 +109,8 @@ enum EUnitFields UNIT_FIELD_MAXPOWER5 = OBJECT_END + 0x001E, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_MAXPOWER6 = OBJECT_END + 0x001F, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_MAXPOWER7 = OBJECT_END + 0x0020, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER = OBJECT_END + 0x0021, // Size: 7, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER = OBJECT_END + 0x0028, // Size: 7, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY + UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER = OBJECT_END + 0x0021, // Size: 7, Type: FLOAT, Flags: PRIVATE, OWNER + UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER = OBJECT_END + 0x0028, // Size: 7, Type: FLOAT, Flags: PRIVATE, OWNER UNIT_FIELD_LEVEL = OBJECT_END + 0x002F, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_FACTIONTEMPLATE = OBJECT_END + 0x0030, // Size: 1, Type: INT, Flags: PUBLIC UNIT_VIRTUAL_ITEM_SLOT_ID = OBJECT_END + 0x0031, // Size: 3, Type: INT, Flags: PUBLIC @@ -124,53 +124,53 @@ enum EUnitFields UNIT_FIELD_DISPLAYID = OBJECT_END + 0x003C, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_NATIVEDISPLAYID = OBJECT_END + 0x003D, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_MOUNTDISPLAYID = OBJECT_END + 0x003E, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_MINDAMAGE = OBJECT_END + 0x003F, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY, UNK3 - UNIT_FIELD_MAXDAMAGE = OBJECT_END + 0x0040, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY, UNK3 - UNIT_FIELD_MINOFFHANDDAMAGE = OBJECT_END + 0x0041, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY, UNK3 - UNIT_FIELD_MAXOFFHANDDAMAGE = OBJECT_END + 0x0042, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY, UNK3 + UNIT_FIELD_MINDAMAGE = OBJECT_END + 0x003F, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER, PARTY_LEADER + UNIT_FIELD_MAXDAMAGE = OBJECT_END + 0x0040, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER, PARTY_LEADER + UNIT_FIELD_MINOFFHANDDAMAGE = OBJECT_END + 0x0041, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER, PARTY_LEADER + UNIT_FIELD_MAXOFFHANDDAMAGE = OBJECT_END + 0x0042, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER, PARTY_LEADER UNIT_FIELD_BYTES_1 = OBJECT_END + 0x0043, // Size: 1, Type: BYTES, Flags: PUBLIC UNIT_FIELD_PETNUMBER = OBJECT_END + 0x0044, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_PET_NAME_TIMESTAMP = OBJECT_END + 0x0045, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_PETEXPERIENCE = OBJECT_END + 0x0046, // Size: 1, Type: INT, Flags: OWNER_ONLY - UNIT_FIELD_PETNEXTLEVELEXP = OBJECT_END + 0x0047, // Size: 1, Type: INT, Flags: OWNER_ONLY + UNIT_FIELD_PETEXPERIENCE = OBJECT_END + 0x0046, // Size: 1, Type: INT, Flags: OWNER + UNIT_FIELD_PETNEXTLEVELEXP = OBJECT_END + 0x0047, // Size: 1, Type: INT, Flags: OWNER UNIT_DYNAMIC_FLAGS = OBJECT_END + 0x0048, // Size: 1, Type: INT, Flags: DYNAMIC UNIT_CHANNEL_SPELL = OBJECT_END + 0x0049, // Size: 1, Type: INT, Flags: PUBLIC UNIT_MOD_CAST_SPEED = OBJECT_END + 0x004A, // Size: 1, Type: FLOAT, Flags: PUBLIC UNIT_CREATED_BY_SPELL = OBJECT_END + 0x004B, // Size: 1, Type: INT, Flags: PUBLIC UNIT_NPC_FLAGS = OBJECT_END + 0x004C, // Size: 1, Type: INT, Flags: DYNAMIC UNIT_NPC_EMOTESTATE = OBJECT_END + 0x004D, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_STAT0 = OBJECT_END + 0x004E, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_STAT1 = OBJECT_END + 0x004F, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_STAT2 = OBJECT_END + 0x0050, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_STAT3 = OBJECT_END + 0x0051, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_STAT4 = OBJECT_END + 0x0052, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_POSSTAT0 = OBJECT_END + 0x0053, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_POSSTAT1 = OBJECT_END + 0x0054, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_POSSTAT2 = OBJECT_END + 0x0055, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_POSSTAT3 = OBJECT_END + 0x0056, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_POSSTAT4 = OBJECT_END + 0x0057, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_NEGSTAT0 = OBJECT_END + 0x0058, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_NEGSTAT1 = OBJECT_END + 0x0059, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_NEGSTAT2 = OBJECT_END + 0x005A, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_NEGSTAT3 = OBJECT_END + 0x005B, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_NEGSTAT4 = OBJECT_END + 0x005C, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_RESISTANCES = OBJECT_END + 0x005D, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY, UNK3 - UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE = OBJECT_END + 0x0064, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE = OBJECT_END + 0x006B, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY + UNIT_FIELD_STAT0 = OBJECT_END + 0x004E, // Size: 1, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_STAT1 = OBJECT_END + 0x004F, // Size: 1, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_STAT2 = OBJECT_END + 0x0050, // Size: 1, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_STAT3 = OBJECT_END + 0x0051, // Size: 1, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_STAT4 = OBJECT_END + 0x0052, // Size: 1, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_POSSTAT0 = OBJECT_END + 0x0053, // Size: 1, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_POSSTAT1 = OBJECT_END + 0x0054, // Size: 1, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_POSSTAT2 = OBJECT_END + 0x0055, // Size: 1, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_POSSTAT3 = OBJECT_END + 0x0056, // Size: 1, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_POSSTAT4 = OBJECT_END + 0x0057, // Size: 1, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_NEGSTAT0 = OBJECT_END + 0x0058, // Size: 1, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_NEGSTAT1 = OBJECT_END + 0x0059, // Size: 1, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_NEGSTAT2 = OBJECT_END + 0x005A, // Size: 1, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_NEGSTAT3 = OBJECT_END + 0x005B, // Size: 1, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_NEGSTAT4 = OBJECT_END + 0x005C, // Size: 1, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_RESISTANCES = OBJECT_END + 0x005D, // Size: 7, Type: INT, Flags: PRIVATE, OWNER, PARTY_LEADER + UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE = OBJECT_END + 0x0064, // Size: 7, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE = OBJECT_END + 0x006B, // Size: 7, Type: INT, Flags: PRIVATE, OWNER UNIT_FIELD_BASE_MANA = OBJECT_END + 0x0072, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_BASE_HEALTH = OBJECT_END + 0x0073, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY + UNIT_FIELD_BASE_HEALTH = OBJECT_END + 0x0073, // Size: 1, Type: INT, Flags: PRIVATE, OWNER UNIT_FIELD_BYTES_2 = OBJECT_END + 0x0074, // Size: 1, Type: BYTES, Flags: PUBLIC - UNIT_FIELD_ATTACK_POWER = OBJECT_END + 0x0075, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_ATTACK_POWER_MODS = OBJECT_END + 0x0076, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x0077, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_RANGED_ATTACK_POWER = OBJECT_END + 0x0078, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_RANGED_ATTACK_POWER_MODS = OBJECT_END + 0x0079, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x007A, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_MINRANGEDDAMAGE = OBJECT_END + 0x007B, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_MAXRANGEDDAMAGE = OBJECT_END + 0x007C, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_POWER_COST_MODIFIER = OBJECT_END + 0x007D, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_POWER_COST_MULTIPLIER = OBJECT_END + 0x0084, // Size: 7, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_MAXHEALTHMODIFIER = OBJECT_END + 0x008B, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY + UNIT_FIELD_ATTACK_POWER = OBJECT_END + 0x0075, // Size: 1, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_ATTACK_POWER_MODS = OBJECT_END + 0x0076, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE, OWNER + UNIT_FIELD_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x0077, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER + UNIT_FIELD_RANGED_ATTACK_POWER = OBJECT_END + 0x0078, // Size: 1, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_RANGED_ATTACK_POWER_MODS = OBJECT_END + 0x0079, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE, OWNER + UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x007A, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER + UNIT_FIELD_MINRANGEDDAMAGE = OBJECT_END + 0x007B, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER + UNIT_FIELD_MAXRANGEDDAMAGE = OBJECT_END + 0x007C, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER + UNIT_FIELD_POWER_COST_MODIFIER = OBJECT_END + 0x007D, // Size: 7, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_POWER_COST_MULTIPLIER = OBJECT_END + 0x0084, // Size: 7, Type: FLOAT, Flags: PRIVATE, OWNER + UNIT_FIELD_MAXHEALTHMODIFIER = OBJECT_END + 0x008B, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER UNIT_FIELD_HOVERHEIGHT = OBJECT_END + 0x008C, // Size: 1, Type: FLOAT, Flags: PUBLIC UNIT_FIELD_PADDING = OBJECT_END + 0x008D, // Size: 1, Type: INT, Flags: NONE UNIT_END = OBJECT_END + 0x008E, @@ -184,291 +184,228 @@ enum EUnitFields PLAYER_BYTES_3 = UNIT_END + 0x0007, // Size: 1, Type: BYTES, Flags: PUBLIC PLAYER_DUEL_TEAM = UNIT_END + 0x0008, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_GUILD_TIMESTAMP = UNIT_END + 0x0009, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_QUEST_LOG_1_1 = UNIT_END + 0x000A, // Size: 1, Type: INT, Flags: GROUP_ONLY + PLAYER_QUEST_LOG_1_1 = UNIT_END + 0x000A, // Size: 1, Type: INT, Flags: PARTY_MEMBER PLAYER_QUEST_LOG_1_2 = UNIT_END + 0x000B, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_1_3 = UNIT_END + 0x000C, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_1_4 = UNIT_END + 0x000D, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_2_1 = UNIT_END + 0x000E, // Size: 1, Type: INT, Flags: GROUP_ONLY + PLAYER_QUEST_LOG_2_1 = UNIT_END + 0x000E, // Size: 1, Type: INT, Flags: PARTY_MEMBER PLAYER_QUEST_LOG_2_2 = UNIT_END + 0x000F, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_2_3 = UNIT_END + 0x0010, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_2_4 = UNIT_END + 0x0011, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_3_1 = UNIT_END + 0x0012, // Size: 1, Type: INT, Flags: GROUP_ONLY + PLAYER_QUEST_LOG_3_1 = UNIT_END + 0x0012, // Size: 1, Type: INT, Flags: PARTY_MEMBER PLAYER_QUEST_LOG_3_2 = UNIT_END + 0x0013, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_3_3 = UNIT_END + 0x0014, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_3_4 = UNIT_END + 0x0015, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_4_1 = UNIT_END + 0x0016, // Size: 1, Type: INT, Flags: GROUP_ONLY + PLAYER_QUEST_LOG_4_1 = UNIT_END + 0x0016, // Size: 1, Type: INT, Flags: PARTY_MEMBER PLAYER_QUEST_LOG_4_2 = UNIT_END + 0x0017, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_4_3 = UNIT_END + 0x0018, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_4_4 = UNIT_END + 0x0019, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_5_1 = UNIT_END + 0x001A, // Size: 1, Type: INT, Flags: GROUP_ONLY + PLAYER_QUEST_LOG_5_1 = UNIT_END + 0x001A, // Size: 1, Type: INT, Flags: PARTY_MEMBER PLAYER_QUEST_LOG_5_2 = UNIT_END + 0x001B, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_5_3 = UNIT_END + 0x001C, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_5_4 = UNIT_END + 0x001D, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_6_1 = UNIT_END + 0x001E, // Size: 1, Type: INT, Flags: GROUP_ONLY + PLAYER_QUEST_LOG_6_1 = UNIT_END + 0x001E, // Size: 1, Type: INT, Flags: PARTY_MEMBER PLAYER_QUEST_LOG_6_2 = UNIT_END + 0x001F, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_6_3 = UNIT_END + 0x0020, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_6_4 = UNIT_END + 0x0021, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_7_1 = UNIT_END + 0x0022, // Size: 1, Type: INT, Flags: GROUP_ONLY + PLAYER_QUEST_LOG_7_1 = UNIT_END + 0x0022, // Size: 1, Type: INT, Flags: PARTY_MEMBER PLAYER_QUEST_LOG_7_2 = UNIT_END + 0x0023, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_7_3 = UNIT_END + 0x0024, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_7_4 = UNIT_END + 0x0025, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_8_1 = UNIT_END + 0x0026, // Size: 1, Type: INT, Flags: GROUP_ONLY + PLAYER_QUEST_LOG_8_1 = UNIT_END + 0x0026, // Size: 1, Type: INT, Flags: PARTY_MEMBER PLAYER_QUEST_LOG_8_2 = UNIT_END + 0x0027, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_8_3 = UNIT_END + 0x0028, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_8_4 = UNIT_END + 0x0029, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_9_1 = UNIT_END + 0x002A, // Size: 1, Type: INT, Flags: GROUP_ONLY + PLAYER_QUEST_LOG_9_1 = UNIT_END + 0x002A, // Size: 1, Type: INT, Flags: PARTY_MEMBER PLAYER_QUEST_LOG_9_2 = UNIT_END + 0x002B, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_9_3 = UNIT_END + 0x002C, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_9_4 = UNIT_END + 0x002D, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_10_1 = UNIT_END + 0x002E, // Size: 1, Type: INT, Flags: GROUP_ONLY + PLAYER_QUEST_LOG_10_1 = UNIT_END + 0x002E, // Size: 1, Type: INT, Flags: PARTY_MEMBER PLAYER_QUEST_LOG_10_2 = UNIT_END + 0x002F, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_10_3 = UNIT_END + 0x0030, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_10_4 = UNIT_END + 0x0031, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_11_1 = UNIT_END + 0x0032, // Size: 1, Type: INT, Flags: GROUP_ONLY + PLAYER_QUEST_LOG_11_1 = UNIT_END + 0x0032, // Size: 1, Type: INT, Flags: PARTY_MEMBER PLAYER_QUEST_LOG_11_2 = UNIT_END + 0x0033, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_11_3 = UNIT_END + 0x0034, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_11_4 = UNIT_END + 0x0035, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_12_1 = UNIT_END + 0x0036, // Size: 1, Type: INT, Flags: GROUP_ONLY + PLAYER_QUEST_LOG_12_1 = UNIT_END + 0x0036, // Size: 1, Type: INT, Flags: PARTY_MEMBER PLAYER_QUEST_LOG_12_2 = UNIT_END + 0x0037, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_12_3 = UNIT_END + 0x0038, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_12_4 = UNIT_END + 0x0039, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_13_1 = UNIT_END + 0x003A, // Size: 1, Type: INT, Flags: GROUP_ONLY + PLAYER_QUEST_LOG_13_1 = UNIT_END + 0x003A, // Size: 1, Type: INT, Flags: PARTY_MEMBER PLAYER_QUEST_LOG_13_2 = UNIT_END + 0x003B, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_13_3 = UNIT_END + 0x003C, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_13_4 = UNIT_END + 0x003D, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_14_1 = UNIT_END + 0x003E, // Size: 1, Type: INT, Flags: GROUP_ONLY + PLAYER_QUEST_LOG_14_1 = UNIT_END + 0x003E, // Size: 1, Type: INT, Flags: PARTY_MEMBER PLAYER_QUEST_LOG_14_2 = UNIT_END + 0x003F, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_14_3 = UNIT_END + 0x0040, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_14_4 = UNIT_END + 0x0041, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_15_1 = UNIT_END + 0x0042, // Size: 1, Type: INT, Flags: GROUP_ONLY + PLAYER_QUEST_LOG_15_1 = UNIT_END + 0x0042, // Size: 1, Type: INT, Flags: PARTY_MEMBER PLAYER_QUEST_LOG_15_2 = UNIT_END + 0x0043, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_15_3 = UNIT_END + 0x0044, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_15_4 = UNIT_END + 0x0045, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_16_1 = UNIT_END + 0x0046, // Size: 1, Type: INT, Flags: GROUP_ONLY + PLAYER_QUEST_LOG_16_1 = UNIT_END + 0x0046, // Size: 1, Type: INT, Flags: PARTY_MEMBER PLAYER_QUEST_LOG_16_2 = UNIT_END + 0x0047, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_16_3 = UNIT_END + 0x0048, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_16_4 = UNIT_END + 0x0049, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_17_1 = UNIT_END + 0x004A, // Size: 1, Type: INT, Flags: GROUP_ONLY + PLAYER_QUEST_LOG_17_1 = UNIT_END + 0x004A, // Size: 1, Type: INT, Flags: PARTY_MEMBER PLAYER_QUEST_LOG_17_2 = UNIT_END + 0x004B, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_17_3 = UNIT_END + 0x004C, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_17_4 = UNIT_END + 0x004D, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_18_1 = UNIT_END + 0x004E, // Size: 1, Type: INT, Flags: GROUP_ONLY + PLAYER_QUEST_LOG_18_1 = UNIT_END + 0x004E, // Size: 1, Type: INT, Flags: PARTY_MEMBER PLAYER_QUEST_LOG_18_2 = UNIT_END + 0x004F, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_18_3 = UNIT_END + 0x0050, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_18_4 = UNIT_END + 0x0051, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_19_1 = UNIT_END + 0x0052, // Size: 1, Type: INT, Flags: GROUP_ONLY + PLAYER_QUEST_LOG_19_1 = UNIT_END + 0x0052, // Size: 1, Type: INT, Flags: PARTY_MEMBER PLAYER_QUEST_LOG_19_2 = UNIT_END + 0x0053, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_19_3 = UNIT_END + 0x0054, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_19_4 = UNIT_END + 0x0055, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_20_1 = UNIT_END + 0x0056, // Size: 1, Type: INT, Flags: GROUP_ONLY + PLAYER_QUEST_LOG_20_1 = UNIT_END + 0x0056, // Size: 1, Type: INT, Flags: PARTY_MEMBER PLAYER_QUEST_LOG_20_2 = UNIT_END + 0x0057, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_20_3 = UNIT_END + 0x0058, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_20_4 = UNIT_END + 0x0059, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_21_1 = UNIT_END + 0x005A, // Size: 1, Type: INT, Flags: GROUP_ONLY + PLAYER_QUEST_LOG_21_1 = UNIT_END + 0x005A, // Size: 1, Type: INT, Flags: PARTY_MEMBER PLAYER_QUEST_LOG_21_2 = UNIT_END + 0x005B, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_21_3 = UNIT_END + 0x005C, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_21_4 = UNIT_END + 0x005D, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_22_1 = UNIT_END + 0x005E, // Size: 1, Type: INT, Flags: GROUP_ONLY + PLAYER_QUEST_LOG_22_1 = UNIT_END + 0x005E, // Size: 1, Type: INT, Flags: PARTY_MEMBER PLAYER_QUEST_LOG_22_2 = UNIT_END + 0x005F, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_22_3 = UNIT_END + 0x0060, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_22_4 = UNIT_END + 0x0061, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_23_1 = UNIT_END + 0x0062, // Size: 1, Type: INT, Flags: GROUP_ONLY + PLAYER_QUEST_LOG_23_1 = UNIT_END + 0x0062, // Size: 1, Type: INT, Flags: PARTY_MEMBER PLAYER_QUEST_LOG_23_2 = UNIT_END + 0x0063, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_23_3 = UNIT_END + 0x0064, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_23_4 = UNIT_END + 0x0065, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_24_1 = UNIT_END + 0x0066, // Size: 1, Type: INT, Flags: GROUP_ONLY + PLAYER_QUEST_LOG_24_1 = UNIT_END + 0x0066, // Size: 1, Type: INT, Flags: PARTY_MEMBER PLAYER_QUEST_LOG_24_2 = UNIT_END + 0x0067, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_24_3 = UNIT_END + 0x0068, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_24_4 = UNIT_END + 0x0069, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_25_1 = UNIT_END + 0x006A, // Size: 1, Type: INT, Flags: GROUP_ONLY + PLAYER_QUEST_LOG_25_1 = UNIT_END + 0x006A, // Size: 1, Type: INT, Flags: PARTY_MEMBER PLAYER_QUEST_LOG_25_2 = UNIT_END + 0x006B, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_25_3 = UNIT_END + 0x006C, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_25_4 = UNIT_END + 0x006D, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_VISIBLE_ITEM_1_CREATOR = UNIT_END + 0x006E, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_1_0 = UNIT_END + 0x0070, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_1_PROPERTIES = UNIT_END + 0x007D, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_1_SEED = UNIT_END + 0x007E, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_1_PAD = UNIT_END + 0x007F, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_2_CREATOR = UNIT_END + 0x0080, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_2_0 = UNIT_END + 0x0082, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_2_PROPERTIES = UNIT_END + 0x008F, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_2_SEED = UNIT_END + 0x0090, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_2_PAD = UNIT_END + 0x0091, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_3_CREATOR = UNIT_END + 0x0092, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_3_0 = UNIT_END + 0x0094, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_3_PROPERTIES = UNIT_END + 0x00A1, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_3_SEED = UNIT_END + 0x00A2, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_3_PAD = UNIT_END + 0x00A3, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_4_CREATOR = UNIT_END + 0x00A4, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_4_0 = UNIT_END + 0x00A6, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_4_PROPERTIES = UNIT_END + 0x00B3, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_4_SEED = UNIT_END + 0x00B4, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_4_PAD = UNIT_END + 0x00B5, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_5_CREATOR = UNIT_END + 0x00B6, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_5_0 = UNIT_END + 0x00B8, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_5_PROPERTIES = UNIT_END + 0x00C5, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_5_SEED = UNIT_END + 0x00C6, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_5_PAD = UNIT_END + 0x00C7, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_6_CREATOR = UNIT_END + 0x00C8, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_6_0 = UNIT_END + 0x00CA, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_6_PROPERTIES = UNIT_END + 0x00D7, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_6_SEED = UNIT_END + 0x00D8, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_6_PAD = UNIT_END + 0x00D9, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_7_CREATOR = UNIT_END + 0x00DA, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_7_0 = UNIT_END + 0x00DC, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_7_PROPERTIES = UNIT_END + 0x00E9, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_7_SEED = UNIT_END + 0x00EA, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_7_PAD = UNIT_END + 0x00EB, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_8_CREATOR = UNIT_END + 0x00EC, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_8_0 = UNIT_END + 0x00EE, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_8_PROPERTIES = UNIT_END + 0x00FB, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_8_SEED = UNIT_END + 0x00FC, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_8_PAD = UNIT_END + 0x00FD, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_9_CREATOR = UNIT_END + 0x00FE, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_9_0 = UNIT_END + 0x0100, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_9_PROPERTIES = UNIT_END + 0x010D, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_9_SEED = UNIT_END + 0x010E, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_9_PAD = UNIT_END + 0x010F, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_10_CREATOR = UNIT_END + 0x0110, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_10_0 = UNIT_END + 0x0112, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_10_PROPERTIES = UNIT_END + 0x011F, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_10_SEED = UNIT_END + 0x0120, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_10_PAD = UNIT_END + 0x0121, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_11_CREATOR = UNIT_END + 0x0122, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_11_0 = UNIT_END + 0x0124, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_11_PROPERTIES = UNIT_END + 0x0131, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_11_SEED = UNIT_END + 0x0132, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_11_PAD = UNIT_END + 0x0133, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_12_CREATOR = UNIT_END + 0x0134, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_12_0 = UNIT_END + 0x0136, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_12_PROPERTIES = UNIT_END + 0x0143, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_12_SEED = UNIT_END + 0x0144, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_12_PAD = UNIT_END + 0x0145, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_13_CREATOR = UNIT_END + 0x0146, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_13_0 = UNIT_END + 0x0148, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_13_PROPERTIES = UNIT_END + 0x0155, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_13_SEED = UNIT_END + 0x0156, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_13_PAD = UNIT_END + 0x0157, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_14_CREATOR = UNIT_END + 0x0158, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_14_0 = UNIT_END + 0x015A, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_14_PROPERTIES = UNIT_END + 0x0167, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_14_SEED = UNIT_END + 0x0168, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_14_PAD = UNIT_END + 0x0169, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_15_CREATOR = UNIT_END + 0x016A, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_15_0 = UNIT_END + 0x016C, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_15_PROPERTIES = UNIT_END + 0x0179, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_15_SEED = UNIT_END + 0x017A, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_15_PAD = UNIT_END + 0x017B, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_16_CREATOR = UNIT_END + 0x017C, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_16_0 = UNIT_END + 0x017E, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_16_PROPERTIES = UNIT_END + 0x018B, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_16_SEED = UNIT_END + 0x018C, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_16_PAD = UNIT_END + 0x018D, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_17_CREATOR = UNIT_END + 0x018E, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_17_0 = UNIT_END + 0x0190, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_17_PROPERTIES = UNIT_END + 0x019D, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_17_SEED = UNIT_END + 0x019E, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_17_PAD = UNIT_END + 0x019F, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_18_CREATOR = UNIT_END + 0x01A0, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_18_0 = UNIT_END + 0x01A2, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_18_PROPERTIES = UNIT_END + 0x01AF, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_18_SEED = UNIT_END + 0x01B0, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_18_PAD = UNIT_END + 0x01B1, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_19_CREATOR = UNIT_END + 0x01B2, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_19_0 = UNIT_END + 0x01B4, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_19_PROPERTIES = UNIT_END + 0x01C1, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_19_SEED = UNIT_END + 0x01C2, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_19_PAD = UNIT_END + 0x01C3, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_CHOSEN_TITLE = UNIT_END + 0x01C4, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_FIELD_PAD_0 = UNIT_END + 0x01C5, // Size: 1, Type: INT, Flags: NONE - PLAYER_FIELD_INV_SLOT_HEAD = UNIT_END + 0x01C6, // Size: 46, Type: LONG, Flags: PRIVATE - PLAYER_FIELD_PACK_SLOT_1 = UNIT_END + 0x01F4, // Size: 32, Type: LONG, Flags: PRIVATE - PLAYER_FIELD_BANK_SLOT_1 = UNIT_END + 0x0214, // Size: 56, Type: LONG, Flags: PRIVATE - PLAYER_FIELD_BANKBAG_SLOT_1 = UNIT_END + 0x024C, // Size: 14, Type: LONG, Flags: PRIVATE - PLAYER_FIELD_VENDORBUYBACK_SLOT_1 = UNIT_END + 0x025A, // Size: 24, Type: LONG, Flags: PRIVATE - PLAYER_FIELD_KEYRING_SLOT_1 = UNIT_END + 0x0272, // Size: 64, Type: LONG, Flags: PRIVATE - PLAYER_FIELD_VANITYPET_SLOT_1 = UNIT_END + 0x02B2, // Size: 36, Type: LONG, Flags: PRIVATE - PLAYER_FIELD_CURRENCYTOKEN_SLOT_1 = UNIT_END + 0x02D6, // Size: 64, Type: LONG, Flags: PRIVATE - PLAYER_FIELD_QUESTBAG_SLOT_1 = UNIT_END + 0x0316, // Size: 64, Type: LONG, Flags: PRIVATE - PLAYER_FARSIGHT = UNIT_END + 0x0356, // Size: 2, Type: LONG, Flags: PRIVATE - PLAYER__FIELD_KNOWN_TITLES = UNIT_END + 0x0358, // Size: 2, Type: LONG, Flags: PRIVATE - PLAYER__FIELD_KNOWN_TITLES1 = UNIT_END + 0x035A, // Size: 2, Type: LONG, Flags: PRIVATE - PLAYER_FIELD_KNOWN_CURRENCIES = UNIT_END + 0x035C, // Size: 2, Type: LONG, Flags: PRIVATE - PLAYER_XP = UNIT_END + 0x035E, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_NEXT_LEVEL_XP = UNIT_END + 0x035F, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_SKILL_INFO_1_1 = UNIT_END + 0x0360, // Size: 384, Type: TWO_SHORT, Flags: PRIVATE - PLAYER_CHARACTER_POINTS1 = UNIT_END + 0x04E0, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_CHARACTER_POINTS2 = UNIT_END + 0x04E1, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_TRACK_CREATURES = UNIT_END + 0x04E2, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_TRACK_RESOURCES = UNIT_END + 0x04E3, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_BLOCK_PERCENTAGE = UNIT_END + 0x04E4, // Size: 1, Type: FLOAT, Flags: PRIVATE - PLAYER_DODGE_PERCENTAGE = UNIT_END + 0x04E5, // Size: 1, Type: FLOAT, Flags: PRIVATE - PLAYER_PARRY_PERCENTAGE = UNIT_END + 0x04E6, // Size: 1, Type: FLOAT, Flags: PRIVATE - PLAYER_EXPERTISE = UNIT_END + 0x04E7, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_OFFHAND_EXPERTISE = UNIT_END + 0x04E8, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_CRIT_PERCENTAGE = UNIT_END + 0x04E9, // Size: 1, Type: FLOAT, Flags: PRIVATE - PLAYER_RANGED_CRIT_PERCENTAGE = UNIT_END + 0x04EA, // Size: 1, Type: FLOAT, Flags: PRIVATE - PLAYER_OFFHAND_CRIT_PERCENTAGE = UNIT_END + 0x04EB, // Size: 1, Type: FLOAT, Flags: PRIVATE - PLAYER_SPELL_CRIT_PERCENTAGE1 = UNIT_END + 0x04EC, // Size: 7, Type: FLOAT, Flags: PRIVATE + PLAYER_VISIBLE_ITEM_1_ENTRYID = UNIT_END + 0x006E, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_1_ENCHANTMENT = UNIT_END + 0x006F, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_2_ENTRYID = UNIT_END + 0x0070, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_2_ENCHANTMENT = UNIT_END + 0x0071, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_3_ENTRYID = UNIT_END + 0x0072, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_3_ENCHANTMENT = UNIT_END + 0x0073, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_4_ENTRYID = UNIT_END + 0x0074, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_4_ENCHANTMENT = UNIT_END + 0x0075, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_5_ENTRYID = UNIT_END + 0x0076, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_5_ENCHANTMENT = UNIT_END + 0x0077, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_6_ENTRYID = UNIT_END + 0x0078, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_6_ENCHANTMENT = UNIT_END + 0x0079, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_7_ENTRYID = UNIT_END + 0x007A, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_7_ENCHANTMENT = UNIT_END + 0x007B, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_8_ENTRYID = UNIT_END + 0x007C, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_8_ENCHANTMENT = UNIT_END + 0x007D, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_9_ENTRYID = UNIT_END + 0x007E, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_9_ENCHANTMENT = UNIT_END + 0x007F, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_10_ENTRYID = UNIT_END + 0x0080, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_10_ENCHANTMENT = UNIT_END + 0x0081, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_11_ENTRYID = UNIT_END + 0x0082, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_11_ENCHANTMENT = UNIT_END + 0x0083, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_12_ENTRYID = UNIT_END + 0x0084, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_12_ENCHANTMENT = UNIT_END + 0x0085, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_13_ENTRYID = UNIT_END + 0x0086, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_13_ENCHANTMENT = UNIT_END + 0x0087, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_14_ENTRYID = UNIT_END + 0x0088, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_14_ENCHANTMENT = UNIT_END + 0x0089, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_15_ENTRYID = UNIT_END + 0x008A, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_15_ENCHANTMENT = UNIT_END + 0x008B, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_16_ENTRYID = UNIT_END + 0x008C, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_16_ENCHANTMENT = UNIT_END + 0x008D, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_17_ENTRYID = UNIT_END + 0x008E, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_17_ENCHANTMENT = UNIT_END + 0x008F, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_18_ENTRYID = UNIT_END + 0x0090, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_18_ENCHANTMENT = UNIT_END + 0x0091, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_19_ENTRYID = UNIT_END + 0x0092, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_19_ENCHANTMENT = UNIT_END + 0x0093, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_CHOSEN_TITLE = UNIT_END + 0x0094, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_FIELD_PAD_0 = UNIT_END + 0x0095, // Size: 1, Type: INT, Flags: NONE + PLAYER_FIELD_INV_SLOT_HEAD = UNIT_END + 0x0096, // Size: 46, Type: LONG, Flags: PRIVATE + PLAYER_FIELD_PACK_SLOT_1 = UNIT_END + 0x00C4, // Size: 32, Type: LONG, Flags: PRIVATE + PLAYER_FIELD_BANK_SLOT_1 = UNIT_END + 0x00E4, // Size: 56, Type: LONG, Flags: PRIVATE + PLAYER_FIELD_BANKBAG_SLOT_1 = UNIT_END + 0x011C, // Size: 14, Type: LONG, Flags: PRIVATE + PLAYER_FIELD_VENDORBUYBACK_SLOT_1 = UNIT_END + 0x012A, // Size: 24, Type: LONG, Flags: PRIVATE + PLAYER_FIELD_KEYRING_SLOT_1 = UNIT_END + 0x0142, // Size: 64, Type: LONG, Flags: PRIVATE + PLAYER_FIELD_CURRENCYTOKEN_SLOT_1 = UNIT_END + 0x0182, // Size: 64, Type: LONG, Flags: PRIVATE + PLAYER_FARSIGHT = UNIT_END + 0x01C2, // Size: 2, Type: LONG, Flags: PRIVATE + PLAYER__FIELD_KNOWN_TITLES = UNIT_END + 0x01C4, // Size: 2, Type: LONG, Flags: PRIVATE + PLAYER__FIELD_KNOWN_TITLES1 = UNIT_END + 0x01C6, // Size: 2, Type: LONG, Flags: PRIVATE + PLAYER__FIELD_KNOWN_TITLES2 = UNIT_END + 0x01C8, // Size: 2, Type: LONG, Flags: PRIVATE + PLAYER_FIELD_KNOWN_CURRENCIES = UNIT_END + 0x01CA, // Size: 2, Type: LONG, Flags: PRIVATE + PLAYER_XP = UNIT_END + 0x01CC, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_NEXT_LEVEL_XP = UNIT_END + 0x01CD, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_SKILL_INFO_1_1 = UNIT_END + 0x01CE, // Size: 384, Type: TWO_SHORT, Flags: PRIVATE + PLAYER_CHARACTER_POINTS1 = UNIT_END + 0x034E, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_CHARACTER_POINTS2 = UNIT_END + 0x034F, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_TRACK_CREATURES = UNIT_END + 0x0350, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_TRACK_RESOURCES = UNIT_END + 0x0351, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_BLOCK_PERCENTAGE = UNIT_END + 0x0352, // Size: 1, Type: FLOAT, Flags: PRIVATE + PLAYER_DODGE_PERCENTAGE = UNIT_END + 0x0353, // Size: 1, Type: FLOAT, Flags: PRIVATE + PLAYER_PARRY_PERCENTAGE = UNIT_END + 0x0354, // Size: 1, Type: FLOAT, Flags: PRIVATE + PLAYER_EXPERTISE = UNIT_END + 0x0355, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_OFFHAND_EXPERTISE = UNIT_END + 0x0356, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_CRIT_PERCENTAGE = UNIT_END + 0x0357, // Size: 1, Type: FLOAT, Flags: PRIVATE + PLAYER_RANGED_CRIT_PERCENTAGE = UNIT_END + 0x0358, // Size: 1, Type: FLOAT, Flags: PRIVATE + PLAYER_OFFHAND_CRIT_PERCENTAGE = UNIT_END + 0x0359, // Size: 1, Type: FLOAT, Flags: PRIVATE + PLAYER_SPELL_CRIT_PERCENTAGE1 = UNIT_END + 0x035A, // Size: 7, Type: FLOAT, Flags: PRIVATE PLAYER_HOLY_SPELL_CRIT_PERCENTAGE = PLAYER_SPELL_CRIT_PERCENTAGE1+1, PLAYER_FIRE_SPELL_CRIT_PERCENTAGE = PLAYER_SPELL_CRIT_PERCENTAGE1+2, PLAYER_NATURE_SPELL_CRIT_PERCENTAGE = PLAYER_SPELL_CRIT_PERCENTAGE1+3, PLAYER_FROST_SPELL_CRIT_PERCENTAGE = PLAYER_SPELL_CRIT_PERCENTAGE1+4, PLAYER_SHADOW_SPELL_CRIT_PERCENTAGE = PLAYER_SPELL_CRIT_PERCENTAGE1+5, PLAYER_ARCANE_SPELL_CRIT_PERCENTAGE = PLAYER_SPELL_CRIT_PERCENTAGE1+6, - PLAYER_SHIELD_BLOCK = UNIT_END + 0x04F3, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_SHIELD_BLOCK_CRIT_PERCENTAGE = UNIT_END + 0x04F4, // Size: 1, Type: FLOAT, Flags: PRIVATE - PLAYER_EXPLORED_ZONES_1 = UNIT_END + 0x04F5, // Size: 128, Type: BYTES, Flags: PRIVATE - PLAYER_REST_STATE_EXPERIENCE = UNIT_END + 0x0575, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_FIELD_COINAGE = UNIT_END + 0x0576, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_FIELD_MOD_DAMAGE_DONE_POS = UNIT_END + 0x0577, // Size: 7, Type: INT, Flags: PRIVATE - PLAYER_FIELD_MOD_DAMAGE_DONE_NEG = UNIT_END + 0x057E, // Size: 7, Type: INT, Flags: PRIVATE - PLAYER_FIELD_MOD_DAMAGE_DONE_PCT = UNIT_END + 0x0585, // Size: 7, Type: INT, Flags: PRIVATE - PLAYER_FIELD_MOD_HEALING_DONE_POS = UNIT_END + 0x058C, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_FIELD_MOD_TARGET_RESISTANCE = UNIT_END + 0x058D, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE = UNIT_END + 0x058E, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_FIELD_BYTES = UNIT_END + 0x058F, // Size: 1, Type: BYTES, Flags: PRIVATE - PLAYER_AMMO_ID = UNIT_END + 0x0590, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_SELF_RES_SPELL = UNIT_END + 0x0591, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_FIELD_PVP_MEDALS = UNIT_END + 0x0592, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_FIELD_BUYBACK_PRICE_1 = UNIT_END + 0x0593, // Size: 12, Type: INT, Flags: PRIVATE - PLAYER_FIELD_BUYBACK_TIMESTAMP_1 = UNIT_END + 0x059F, // Size: 12, Type: INT, Flags: PRIVATE - PLAYER_FIELD_KILLS = UNIT_END + 0x05AB, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE - PLAYER_FIELD_TODAY_CONTRIBUTION = UNIT_END + 0x05AC, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_FIELD_YESTERDAY_CONTRIBUTION = UNIT_END + 0x05AD, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_FIELD_LIFETIME_HONORBALE_KILLS = UNIT_END + 0x05AE, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_FIELD_BYTES2 = UNIT_END + 0x05AF, // Size: 1, Type: BYTES, Flags: PRIVATE - PLAYER_FIELD_WATCHED_FACTION_INDEX = UNIT_END + 0x05B0, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_FIELD_COMBAT_RATING_1 = UNIT_END + 0x05B1, // Size: 25, Type: INT, Flags: PRIVATE - PLAYER_FIELD_ARENA_TEAM_INFO_1_1 = UNIT_END + 0x05CA, // Size: 18, Type: INT, Flags: PRIVATE - PLAYER_FIELD_HONOR_CURRENCY = UNIT_END + 0x05DC, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_FIELD_ARENA_CURRENCY = UNIT_END + 0x05DD, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_FIELD_MAX_LEVEL = UNIT_END + 0x05DE, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_FIELD_DAILY_QUESTS_1 = UNIT_END + 0x05DF, // Size: 25, Type: INT, Flags: PRIVATE - PLAYER_RUNE_REGEN_1 = UNIT_END + 0x05F8, // Size: 4, Type: FLOAT, Flags: PRIVATE - PLAYER_NO_REAGENT_COST_1 = UNIT_END + 0x05FC, // Size: 3, Type: INT, Flags: PRIVATE - PLAYER_FIELD_GLYPH_SLOTS_1 = UNIT_END + 0x05FF, // Size: 8, Type: INT, Flags: PRIVATE - PLAYER_FIELD_GLYPHS_1 = UNIT_END + 0x0607, // Size: 8, Type: INT, Flags: PRIVATE - PLAYER_GLYPHS_ENABLED = UNIT_END + 0x060F, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_END = UNIT_END + 0x0610, + PLAYER_SHIELD_BLOCK = UNIT_END + 0x0361, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_SHIELD_BLOCK_CRIT_PERCENTAGE = UNIT_END + 0x0362, // Size: 1, Type: FLOAT, Flags: PRIVATE + PLAYER_EXPLORED_ZONES_1 = UNIT_END + 0x0363, // Size: 128, Type: BYTES, Flags: PRIVATE + PLAYER_REST_STATE_EXPERIENCE = UNIT_END + 0x03E3, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_COINAGE = UNIT_END + 0x03E4, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_MOD_DAMAGE_DONE_POS = UNIT_END + 0x03E5, // Size: 7, Type: INT, Flags: PRIVATE + PLAYER_FIELD_MOD_DAMAGE_DONE_NEG = UNIT_END + 0x03EC, // Size: 7, Type: INT, Flags: PRIVATE + PLAYER_FIELD_MOD_DAMAGE_DONE_PCT = UNIT_END + 0x03F3, // Size: 7, Type: INT, Flags: PRIVATE + PLAYER_FIELD_MOD_HEALING_DONE_POS = UNIT_END + 0x03FA, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_MOD_TARGET_RESISTANCE = UNIT_END + 0x03FB, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE = UNIT_END + 0x03FC, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_BYTES = UNIT_END + 0x03FD, // Size: 1, Type: BYTES, Flags: PRIVATE + PLAYER_AMMO_ID = UNIT_END + 0x03FE, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_SELF_RES_SPELL = UNIT_END + 0x03FF, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_PVP_MEDALS = UNIT_END + 0x0400, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_BUYBACK_PRICE_1 = UNIT_END + 0x0401, // Size: 12, Type: INT, Flags: PRIVATE + PLAYER_FIELD_BUYBACK_TIMESTAMP_1 = UNIT_END + 0x040D, // Size: 12, Type: INT, Flags: PRIVATE + PLAYER_FIELD_KILLS = UNIT_END + 0x0419, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE + PLAYER_FIELD_TODAY_CONTRIBUTION = UNIT_END + 0x041A, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_YESTERDAY_CONTRIBUTION = UNIT_END + 0x041B, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_LIFETIME_HONORBALE_KILLS = UNIT_END + 0x041C, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_BYTES2 = UNIT_END + 0x041D, // Size: 1, Type: BYTES, Flags: PRIVATE + PLAYER_FIELD_WATCHED_FACTION_INDEX = UNIT_END + 0x041E, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_COMBAT_RATING_1 = UNIT_END + 0x041F, // Size: 25, Type: INT, Flags: PRIVATE + PLAYER_FIELD_ARENA_TEAM_INFO_1_1 = UNIT_END + 0x0438, // Size: 18, Type: INT, Flags: PRIVATE + PLAYER_FIELD_HONOR_CURRENCY = UNIT_END + 0x044A, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_ARENA_CURRENCY = UNIT_END + 0x044B, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_MAX_LEVEL = UNIT_END + 0x044C, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_DAILY_QUESTS_1 = UNIT_END + 0x044D, // Size: 25, Type: INT, Flags: PRIVATE + PLAYER_RUNE_REGEN_1 = UNIT_END + 0x0466, // Size: 4, Type: FLOAT, Flags: PRIVATE + PLAYER_NO_REAGENT_COST_1 = UNIT_END + 0x046A, // Size: 3, Type: INT, Flags: PRIVATE + PLAYER_FIELD_GLYPH_SLOTS_1 = UNIT_END + 0x046D, // Size: 6, Type: INT, Flags: PRIVATE + PLAYER_FIELD_GLYPHS_1 = UNIT_END + 0x0473, // Size: 6, Type: INT, Flags: PRIVATE + PLAYER_GLYPHS_ENABLED = UNIT_END + 0x0479, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_END = UNIT_END + 0x047A, }; enum EGameObjectFields { OBJECT_FIELD_CREATED_BY = OBJECT_END + 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC GAMEOBJECT_DISPLAYID = OBJECT_END + 0x0002, // Size: 1, Type: INT, Flags: PUBLIC - GAMEOBJECT_FLAGS = OBJECT_END + 0x0003, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - GAMEOBJECT_ROTATION = OBJECT_END + 0x0004, // Size: 2, Type: LONG, Flags: PUBLIC - GAMEOBJECT_PARENTROTATION = OBJECT_END + 0x0006, // Size: 4, Type: FLOAT, Flags: PUBLIC - GAMEOBJECT_POS_X = OBJECT_END + 0x000A, // Size: 1, Type: FLOAT, Flags: PUBLIC - GAMEOBJECT_POS_Y = OBJECT_END + 0x000B, // Size: 1, Type: FLOAT, Flags: PUBLIC - GAMEOBJECT_POS_Z = OBJECT_END + 0x000C, // Size: 1, Type: FLOAT, Flags: PUBLIC - GAMEOBJECT_FACING = OBJECT_END + 0x000D, // Size: 1, Type: FLOAT, Flags: PUBLIC - GAMEOBJECT_DYNAMIC = OBJECT_END + 0x000E, // Size: 1, Type: TWO_SHORT, Flags: DYNAMIC - GAMEOBJECT_FACTION = OBJECT_END + 0x000F, // Size: 1, Type: INT, Flags: PUBLIC - GAMEOBJECT_LEVEL = OBJECT_END + 0x0010, // Size: 1, Type: INT, Flags: PUBLIC - GAMEOBJECT_BYTES_1 = OBJECT_END + 0x0011, // Size: 1, Type: BYTES, Flags: PUBLIC - GAMEOBJECT_END = OBJECT_END + 0x0012, + GAMEOBJECT_FLAGS = OBJECT_END + 0x0003, // Size: 1, Type: INT, Flags: PUBLIC + GAMEOBJECT_PARENTROTATION = OBJECT_END + 0x0004, // Size: 4, Type: FLOAT, Flags: PUBLIC + GAMEOBJECT_DYNAMIC = OBJECT_END + 0x0008, // Size: 1, Type: TWO_SHORT, Flags: DYNAMIC + GAMEOBJECT_FACTION = OBJECT_END + 0x0009, // Size: 1, Type: INT, Flags: PUBLIC + GAMEOBJECT_LEVEL = OBJECT_END + 0x000A, // Size: 1, Type: INT, Flags: PUBLIC + GAMEOBJECT_BYTES_1 = OBJECT_END + 0x000B, // Size: 1, Type: BYTES, Flags: PUBLIC + GAMEOBJECT_END = OBJECT_END + 0x000C, }; enum EDynamicObjectFields @@ -489,18 +426,14 @@ enum ECorpseFields { CORPSE_FIELD_OWNER = OBJECT_END + 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC CORPSE_FIELD_PARTY = OBJECT_END + 0x0002, // Size: 2, Type: LONG, Flags: PUBLIC - CORPSE_FIELD_FACING = OBJECT_END + 0x0004, // Size: 1, Type: FLOAT, Flags: PUBLIC - CORPSE_FIELD_POS_X = OBJECT_END + 0x0005, // Size: 1, Type: FLOAT, Flags: PUBLIC - CORPSE_FIELD_POS_Y = OBJECT_END + 0x0006, // Size: 1, Type: FLOAT, Flags: PUBLIC - CORPSE_FIELD_POS_Z = OBJECT_END + 0x0007, // Size: 1, Type: FLOAT, Flags: PUBLIC - CORPSE_FIELD_DISPLAY_ID = OBJECT_END + 0x0008, // Size: 1, Type: INT, Flags: PUBLIC - CORPSE_FIELD_ITEM = OBJECT_END + 0x0009, // Size: 19, Type: INT, Flags: PUBLIC - CORPSE_FIELD_BYTES_1 = OBJECT_END + 0x001C, // Size: 1, Type: BYTES, Flags: PUBLIC - CORPSE_FIELD_BYTES_2 = OBJECT_END + 0x001D, // Size: 1, Type: BYTES, Flags: PUBLIC - CORPSE_FIELD_GUILD = OBJECT_END + 0x001E, // Size: 1, Type: INT, Flags: PUBLIC - CORPSE_FIELD_FLAGS = OBJECT_END + 0x001F, // Size: 1, Type: INT, Flags: PUBLIC - CORPSE_FIELD_DYNAMIC_FLAGS = OBJECT_END + 0x0020, // Size: 1, Type: INT, Flags: DYNAMIC - CORPSE_FIELD_PAD = OBJECT_END + 0x0021, // Size: 1, Type: INT, Flags: NONE - CORPSE_END = OBJECT_END + 0x0022, + CORPSE_FIELD_DISPLAY_ID = OBJECT_END + 0x0004, // Size: 1, Type: INT, Flags: PUBLIC + CORPSE_FIELD_ITEM = OBJECT_END + 0x0005, // Size: 19, Type: INT, Flags: PUBLIC + CORPSE_FIELD_BYTES_1 = OBJECT_END + 0x0018, // Size: 1, Type: BYTES, Flags: PUBLIC + CORPSE_FIELD_BYTES_2 = OBJECT_END + 0x0019, // Size: 1, Type: BYTES, Flags: PUBLIC + CORPSE_FIELD_GUILD = OBJECT_END + 0x001A, // Size: 1, Type: INT, Flags: PUBLIC + CORPSE_FIELD_FLAGS = OBJECT_END + 0x001B, // Size: 1, Type: INT, Flags: PUBLIC + CORPSE_FIELD_DYNAMIC_FLAGS = OBJECT_END + 0x001C, // Size: 1, Type: INT, Flags: DYNAMIC + CORPSE_FIELD_PAD = OBJECT_END + 0x001D, // Size: 1, Type: INT, Flags: NONE + CORPSE_END = OBJECT_END + 0x001E, }; #endif diff --git a/src/Client/World/WorldSession.cpp b/src/Client/World/WorldSession.cpp index bf74bef..1c93350 100644 --- a/src/Client/World/WorldSession.cpp +++ b/src/Client/World/WorldSession.cpp @@ -809,37 +809,54 @@ void WorldSession::_HandleAccountDataMD5Opcode(WorldPacket& recvPacket) void WorldSession::_HandleMessageChatOpcode(WorldPacket& recvPacket) { - uint8 type=0; - uint32 lang=0; - uint64 source_guid=0; - uint64 target_guid=0; - uint64 npc_guid=0; // for CHAT_MSG_MONSTER_SAY - uint32 msglen=0; - uint32 unk=0; - uint32 npc_name_len; - std::string npc_name; - std::string msg,channel=""; - bool isCmd=false; + uint8 type, chatTag; + uint32 lang; + uint64 source_guid = 0, source_guid2 = 0, listener_guid = 0; + uint32 msglen; + uint32 unk32; + uint32 source_name_len = 0, listener_name_len = 0; + std::string source_name, listener_name; + std::string msg, channel = ""; recvPacket >> type >> lang; - if(lang == CHAT_MSG_MONSTER_SAY) - { - recvPacket >> npc_guid; - recvPacket >> unk; - recvPacket >> npc_name_len; - recvPacket >> npc_name; - } - if(lang == LANG_ADDON && GetInstance()->GetConf()->skipaddonchat) return; - recvPacket >> source_guid >> unk; // added in 2.1.0 - if (type == CHAT_MSG_CHANNEL) + recvPacket >> source_guid; + recvPacket >> unk32; + + switch(type) { - recvPacket >> channel; // extract channel name + case CHAT_MSG_MONSTER_SAY: + case CHAT_MSG_MONSTER_PARTY: + case CHAT_MSG_MONSTER_YELL: + case CHAT_MSG_MONSTER_WHISPER: + case CHAT_MSG_MONSTER_EMOTE: + case CHAT_MSG_RAID_BOSS_WHISPER: + case CHAT_MSG_RAID_BOSS_EMOTE: + case CHAT_MSG_BN: + recvPacket >> source_name_len; + recvPacket >> source_name; + // MaNGOS sends nothing for these, not used + recvPacket >> listener_guid; // always 0 + if(listener_guid && !IS_PLAYER_GUID(listener_guid)) + { + recvPacket >> listener_name_len; // always 1 (\0) + recvPacket >> listener_name; // always \0 + logdebug("CHAT: Listener: '%s' (guid="I64FMT" len=%u type=%u)", listener_name.c_str(), listener_guid, listener_name_len, type); + } + break; + + default: + if(type == CHAT_MSG_CHANNEL) + recvPacket >> channel; + recvPacket >> source_guid2; // no idea why it is sent twice } - recvPacket >> target_guid >> msglen >> msg; + recvPacket >> msglen; + recvPacket >> msg; + recvPacket >> chatTag; + SCPDatabase *langdb = GetDBMgr().GetDB("language"); const char* ln; @@ -847,13 +864,7 @@ void WorldSession::_HandleMessageChatOpcode(WorldPacket& recvPacket) if(langdb) langname = langdb->GetString(lang,"name"); ln = langname.c_str(); - std::string name; - - if(type == CHAT_MSG_MONSTER_SAY) - { - name = npc_name; - source_guid = npc_guid; - } + std::string name = source_name; if(source_guid && IS_PLAYER_GUID(source_guid)) { @@ -865,11 +876,11 @@ void WorldSession::_HandleMessageChatOpcode(WorldPacket& recvPacket) } } GetInstance()->GetScripts()->variables.Set("@thismsg_name",name); - GetInstance()->GetScripts()->variables.Set("@thismsg",DefScriptTools::toString(target_guid)); + GetInstance()->GetScripts()->variables.Set("@thismsg",DefScriptTools::toString(source_guid)); DEBUG(logdebug("Chat packet recieved, type=%u lang=%u src="I64FMT" dst="I64FMT" chn='%s' len=%u", - type,lang,source_guid,target_guid,channel.c_str(),msglen)); + type,lang,source_guid,source_guid,channel.c_str(),msglen)); if (type == CHAT_MSG_SYSTEM) { @@ -916,38 +927,17 @@ void WorldSession::_HandleMessageChatOpcode(WorldPacket& recvPacket) logcustom(0,WHITE,"UNK CHAT TYPE (%u): %s [%s]: %s",type,name.c_str(),ln,msg.c_str()); } - if(target_guid!=GetGuid() && msg.length()>1 && msg.at(0)=='-' && GetInstance()->GetConf()->allowgamecmd) - isCmd=true; - - // some fun code :P - if(type==CHAT_MSG_SAY && target_guid!=_myGUID && !isCmd) - { - // TODO: insert a good ChatAI here. - if (GetInstance()->GetConf()->enablechatai) - { - if(msg=="lol") - SendChatMessage(CHAT_MSG_SAY,lang,"say \"lol\" if you have nothing else to say... lol xD",""); - else if(msg.length()>4 && msg.find("you?")!=std::string::npos) - SendChatMessage(CHAT_MSG_SAY,lang,GetInstance()->GetScripts()->variables.Get("@version").append(" -- i am a bot, made by False.Genesis, my master."),""); - else if(msg=="hi") - SendChatMessage(CHAT_MSG_SAY,lang,"Hi, wadup?",""); - else if(msg.length()<12 && msg.find("wtf")!=std::string::npos) - SendChatMessage(CHAT_MSG_SAY,lang,"Yeah, WTF is a good way to say you dont understand anything... :P",""); - else if(msg.length()<15 && (msg.find("omg")!=std::string::npos || msg.find("omfg")!=std::string::npos) ) - SendChatMessage(CHAT_MSG_SAY,lang,"OMG a bot logged in, you don't believe it :O",""); - else if(msg.find("from")!=std::string::npos || msg.find("download")!=std::string::npos) - SendChatMessage(CHAT_MSG_SAY,lang,"www.mangosclient.org",""); - else if(msg.find("Genesis")!=std::string::npos || msg.find("genesis")!=std::string::npos) - SendChatMessage(CHAT_MSG_YELL,lang,"False.Genesis, they are calling you!! Come here, master xD",""); - } - } + // DefScript bindings below + bool isCmd = false; + if(source_guid != GetGuid() && msg.length() > 1 && msg.at(0) == '-' && GetInstance()->GetConf()->allowgamecmd) + isCmd = true; if(!isCmd && GetInstance()->GetScripts()->GetScript("_onchatmessage")) { CmdSet Set; Set.arg[0] = DefScriptTools::toString(type); Set.arg[1] = DefScriptTools::toString(lang); - Set.arg[2] = DefScriptTools::toString(target_guid); + Set.arg[2] = DefScriptTools::toString(source_guid); Set.arg[3] = channel; Set.defaultarg = GetInstance()->GetScripts()->SecureString(msg); GetInstance()->GetScripts()->RunScript("_onchatmessage",&Set); @@ -956,7 +946,7 @@ void WorldSession::_HandleMessageChatOpcode(WorldPacket& recvPacket) if(isCmd) { GetInstance()->GetScripts()->variables.Set("@thiscmd_name",name); - GetInstance()->GetScripts()->variables.Set("@thiscmd",DefScriptTools::toString(target_guid)); + GetInstance()->GetScripts()->variables.Set("@thiscmd",DefScriptTools::toString(source_guid)); std::string lin=msg.substr(1,msg.length()-1); try { @@ -970,7 +960,7 @@ void WorldSession::_HandleMessageChatOpcode(WorldPacket& recvPacket) } // the following block searches for items in chat and queries them if they are unknown - if(!isCmd && target_guid!=_myGUID && msg.length()>strlen(CHAT_ITEM_BEGIN_STRING)) + if(!isCmd && source_guid != GetGuid() && msg.length() > strlen(CHAT_ITEM_BEGIN_STRING)) { for(uint32 pos=0;pos> pguid >> pname; + + pguid = recvPacket.GetPackedGuid(); + recvPacket >> unk >> pname; if(pname.length()>MAX_PLAYERNAME_LENGTH || pname.length()> unk >> count; logdebug("Got initial spells list, %u spells.",count); for(uint16 i = 0; i < count; i++) @@ -1620,7 +1614,9 @@ void WorldSession::_HandleCreatureQueryResponseOpcode(WorldPacket& recvPacket) recvPacket >> ct->type; recvPacket >> ct->family; recvPacket >> ct->rank; - recvPacket >> ct->SpellDataId; + //recvPacket >> ct->SpellDataId; + for(uint32 i = 0; i < MAX_KILL_CREDIT; i++) + recvPacket >> ct->killCredit[i]; recvPacket >> ct->displayid_A; recvPacket >> ct->displayid_H; recvPacket >> ct->displayid_AF; @@ -1628,6 +1624,9 @@ void WorldSession::_HandleCreatureQueryResponseOpcode(WorldPacket& recvPacket) recvPacket >> unkf; recvPacket >> unkf; recvPacket >> ct->RacialLeader; + for(uint32 i = 0; i < 4; i++) + recvPacket >> ct->questItems[i]; + recvPacket >> ct->movementId; std::stringstream ss; ss << "Got info for creature " << entry << ":" << ct->name; @@ -1666,9 +1665,12 @@ void WorldSession::_HandleGameobjectQueryResponseOpcode(WorldPacket& recvPacket) recvPacket >> other_names; // name3 (all unused) recvPacket >> unks; recvPacket >> go->castBarCaption; - recvPacket >> unks; + recvPacket >> go->unk1; for(uint32 i = 0; i < GAMEOBJECT_DATA_FIELDS; i++) recvPacket >> go->raw.data[i]; + recvPacket >> go->size; + for(uint32 i = 0; i < 4; i++) + recvPacket >> go->questItems[i]; std::stringstream ss; ss << "Got info for gameobject " << entry << ":" << go->name; diff --git a/src/Client/World/WorldSocket.cpp b/src/Client/World/WorldSocket.cpp index 0353e25..7c4254c 100644 --- a/src/Client/World/WorldSocket.cpp +++ b/src/Client/World/WorldSocket.cpp @@ -80,26 +80,28 @@ void WorldSocket::OnRead() // read first byte and check if size is 3 or 2 bytes uint8 firstSizeByte; - ibuf.SoftRead((char*)&firstSizeByte, 1); - _crypt.DecryptRecv(&firstSizeByte, 1, true); + ibuf.Read((char*)&firstSizeByte, 1); + _crypt.DecryptRecv(&firstSizeByte, 1); if (firstSizeByte & 0x80) // got large packet { ServerPktHeaderBig hdr; - ibuf.Read((char*)&hdr, 3+2); - _crypt.DecryptRecv((uint8*)&hdr, 3+2, false); + ibuf.Read(((char*)&hdr) + 1, sizeof(ServerPktHeaderBig) - 1); // read *big* header, except first byte + _crypt.DecryptRecv(((uint8*)&hdr) + 1, sizeof(ServerPktHeaderBig) - 1); // decrypt 2 of 3 bytes (first one already decrypted above) of size, and cmd + hdr.size[0] = firstSizeByte; // assign missing first byte - uint32 realsize = ((hdr.size[0]&0x7F)<<16) | (hdr.size[1]<<8) | hdr.size[2]; + uint32 realsize = ((hdr.size[0]&0x7F) << 16) | (hdr.size[1] << 8) | hdr.size[2]; _remaining = realsize - 2; _opcode = hdr.cmd; } else // "normal" packet { ServerPktHeader hdr; - ibuf.Read((char*)&hdr, sizeof(ServerPktHeader)); - _crypt.DecryptRecv((uint8*)&hdr, sizeof(ServerPktHeader), false); + ibuf.Read(((char*)&hdr) + 1, sizeof(ServerPktHeader) - 1); // read header, except first byte + _crypt.DecryptRecv(((uint8*)&hdr) + 1, sizeof(ServerPktHeader) - 1); // decrypt all except first + hdr.size |= firstSizeByte; // add already decrypted first byte - _remaining = ntohs(hdr.size)-2; + _remaining = ntohs(hdr.size) - 2; _opcode = hdr.cmd; } @@ -108,7 +110,7 @@ void WorldSocket::OnRead() logcritical("CRYPT ERROR: opcode=%u, remain=%u",_opcode,_remaining); // this should never be the case! GetSession()->GetInstance()->SetError(); // no way to recover the crypt, must exit // if the crypt gets messy its hardly possible to recover it, especially if we dont know - // the lentgh of the following data part + // the length of the following data part // TODO: invent some way how to recover the crypt (reconnect?) return; } @@ -146,8 +148,8 @@ void WorldSocket::SendWorldPacket(WorldPacket &pkt) void WorldSocket::InitCrypt(BigNumber *k) { - _crypt.SetKey(k); - _crypt.Init(); - std::string tmp = toHexDump(_crypt.GetKey(),_crypt.GetKeySize(), false); - logdebug("WorldSocket: Crypt initialized [%s]",tmp.c_str()); + _crypt.Init(k); + const char *hexstr = k->AsHexStr(); + logdebug("WorldSocket: Crypt initialized [%s]",hexstr); + OPENSSL_free((void*)hexstr); } diff --git a/src/Client/World/WorldSocket.h b/src/Client/World/WorldSocket.h index d147ca3..3a4134e 100644 --- a/src/Client/World/WorldSocket.h +++ b/src/Client/World/WorldSocket.h @@ -22,12 +22,14 @@ struct ClientPktHeader struct ServerPktHeader { + ServerPktHeader() : size(0), cmd(0) {} uint16 size; uint16 cmd; }; struct ServerPktHeaderBig { + ServerPktHeaderBig() : cmd(0) { memset(size, 0, 3); } uint8 size[3]; uint16 cmd; }; diff --git a/src/PseuWoW.vcproj b/src/PseuWoW.vcproj index 1a07163..3410b43 100644 --- a/src/PseuWoW.vcproj +++ b/src/PseuWoW.vcproj @@ -510,6 +510,12 @@ + + + + diff --git a/src/PseuWoW_VC90.vcproj b/src/PseuWoW_VC90.vcproj index 72d52c8..dea91dd 100644 --- a/src/PseuWoW_VC90.vcproj +++ b/src/PseuWoW_VC90.vcproj @@ -55,6 +55,7 @@ BufferSecurityCheck="false" EnableFunctionLevelLinking="false" EnableEnhancedInstructionSet="0" + OpenMP="false" PrecompiledHeaderFile=".\Release/PseuWoW.pch" AssemblerListingLocation="$(SolutionDir)/temp/$(ProjectName)/$(ConfigurationName)/" ObjectFile="$(SolutionDir)/temp/$(ProjectName)/$(ConfigurationName)/" @@ -148,11 +149,13 @@ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_IRR_STATIC_LIB_" BasicRuntimeChecks="3" RuntimeLibrary="1" + EnableFunctionLevelLinking="true" + OpenMP="false" PrecompiledHeaderFile="" AssemblerListingLocation="$(SolutionDir)/temp/$(ProjectName)/$(ConfigurationName)/" ObjectFile="$(SolutionDir)/temp/$(ProjectName)/$(ConfigurationName)/" ProgramDataBaseFileName="$(SolutionDir)/temp/$(ProjectName)/$(ConfigurationName)/" - BrowseInformation="1" + BrowseInformation="0" WarningLevel="3" SuppressStartupBanner="true" DebugInformationFormat="3" @@ -246,6 +249,7 @@ BufferSecurityCheck="false" EnableFunctionLevelLinking="false" EnableEnhancedInstructionSet="0" + OpenMP="false" PrecompiledHeaderFile=".\Release/PseuWoW.pch" AssemblerListingLocation="$(SolutionDir)/temp/$(ProjectName)/$(ConfigurationName)/" ObjectFile="$(SolutionDir)/temp/$(ProjectName)/$(ConfigurationName)/" diff --git a/src/shared.vcproj b/src/shared.vcproj index 4111445..31612db 100644 --- a/src/shared.vcproj +++ b/src/shared.vcproj @@ -292,6 +292,12 @@ + + + + diff --git a/src/shared/Auth/AuthCrypt.cpp b/src/shared/Auth/AuthCrypt.cpp index 04f8965..ebfcb97 100644 --- a/src/shared/Auth/AuthCrypt.cpp +++ b/src/shared/Auth/AuthCrypt.cpp @@ -1,5 +1,5 @@ -/* - * Copyright (C) 2005,2006 MaNGOS +/* + * Copyright (C) 2005-2009 MaNGOS * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -15,81 +15,63 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include "common.h" + #include "AuthCrypt.h" #include "Hmac.h" +#include "BigNumber.h" AuthCrypt::AuthCrypt() { _initialized = false; } -void AuthCrypt::Init() +AuthCrypt::~AuthCrypt() { - _send_i = _send_j = _recv_i = _recv_j = 0; + +} + +void AuthCrypt::Init(BigNumber *K) +{ + uint8 ClientDecryptionKey[SEED_KEY_SIZE] = { 0x22, 0xBE, 0xE5, 0xCF, 0xBB, 0x07, 0x64, 0xD9, 0x00, 0x45, 0x1B, 0xD0, 0x24, 0xB8, 0xD5, 0x45 }; + HmacHash serverEncryptHmac(SEED_KEY_SIZE, (uint8*)ClientDecryptionKey); + uint8 *decryptHash = serverEncryptHmac.ComputeHash(K); + + uint8 ServerEncryptionKey[SEED_KEY_SIZE] = { 0xF4, 0x66, 0x31, 0x59, 0xFC, 0x83, 0x6E, 0x31, 0x31, 0x02, 0x51, 0xD5, 0x44, 0x31, 0x67, 0x98 }; + HmacHash clientDecryptHmac(SEED_KEY_SIZE, (uint8*)ServerEncryptionKey); + uint8 *encryptHash = clientDecryptHmac.ComputeHash(K); + + //SARC4 _serverDecrypt(encryptHash); + _decrypt.Init(decryptHash); + _encrypt.Init(encryptHash); + //SARC4 _clientEncrypt(decryptHash); + + uint8 syncBuf[1024]; + + memset(syncBuf, 0, 1024); + + _encrypt.UpdateData(1024, syncBuf); + //_clientEncrypt.UpdateData(1024, syncBuf); + + memset(syncBuf, 0, 1024); + + //_serverDecrypt.UpdateData(1024, syncBuf); + _decrypt.UpdateData(1024, syncBuf); + _initialized = true; } -void AuthCrypt::DecryptRecv(uint8 *data, size_t len, bool temp) +void AuthCrypt::DecryptRecv(uint8 *data, size_t len) { - if (!_initialized) return; - //if (len < CRYPTED_RECV_LEN) return; - uint8 ti = 0; - uint8 tj = 0; - if (temp) - { - ti = _recv_i; - tj = _recv_j; - } + if (!_initialized) + return; - for (size_t t = 0; t < len; t++) - { - _recv_i %= _key.size(); - uint8 x = (data[t] - _recv_j) ^ _key[_recv_i]; - ++_recv_i; - _recv_j = data[t]; - data[t] = x; - } - - if (temp) - { - _recv_i = ti; - _recv_j = tj; - } + _decrypt.UpdateData(len, data); } void AuthCrypt::EncryptSend(uint8 *data, size_t len) { - if (!_initialized) return; - if (len < CRYPTED_SEND_LEN) return; + if (!_initialized) + return; - for (size_t t = 0; t < CRYPTED_SEND_LEN; t++) - { - _send_i %= _key.size(); - uint8 x = (data[t] ^ _key[_send_i]) + _send_j; - ++_send_i; - data[t] = _send_j = x; - } + _encrypt.UpdateData(len, data); } - -void AuthCrypt::SetKey(BigNumber *bn) -{ - uint8 *key = new uint8[SHA_DIGEST_LENGTH]; - GenerateKey(key, bn); - _key.resize(SHA_DIGEST_LENGTH); - std::copy(key, key + SHA_DIGEST_LENGTH, _key.begin()); - delete key; -} - -void AuthCrypt::GenerateKey(uint8 *key, BigNumber *bn) -{ - HmacHash hash; - hash.UpdateBigNumber(bn); - hash.Finalize(); - memcpy(key, hash.GetDigest(), SHA_DIGEST_LENGTH); -} - -AuthCrypt::~AuthCrypt() -{ -} - diff --git a/src/shared/Auth/AuthCrypt.h b/src/shared/Auth/AuthCrypt.h index 8172082..6e49108 100644 --- a/src/shared/Auth/AuthCrypt.h +++ b/src/shared/Auth/AuthCrypt.h @@ -1,5 +1,5 @@ -/* - * Copyright (C) 2005,2006 MaNGOS +/* + * Copyright (C) 2005-2009 MaNGOS * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,8 +19,8 @@ #ifndef _AUTHCRYPT_H #define _AUTHCRYPT_H -//#include -#include +#include +#include "SARC4.h" class BigNumber; @@ -30,25 +30,15 @@ class AuthCrypt AuthCrypt(); ~AuthCrypt(); - const static size_t CRYPTED_SEND_LEN = 6; - const static size_t CRYPTED_RECV_LEN = 4; - - void Init(); - - void SetKey(BigNumber *); - inline uint8 *GetKey(void) { return &_key[0]; } - inline uint32 GetKeySize(void) { return _key.size(); } - - void DecryptRecv(uint8 *, size_t, bool); + void Init(BigNumber *K); + void DecryptRecv(uint8 *, size_t); void EncryptSend(uint8 *, size_t); bool IsInitialized() { return _initialized; } - static void GenerateKey(uint8 *, BigNumber *); private: - std::vector _key; - uint8 _send_i, _send_j, _recv_i, _recv_j; + SARC4 _decrypt; + SARC4 _encrypt; bool _initialized; }; - #endif diff --git a/src/shared/Auth/Hmac.cpp b/src/shared/Auth/Hmac.cpp index ec71001..a10f1d1 100644 --- a/src/shared/Auth/Hmac.cpp +++ b/src/shared/Auth/Hmac.cpp @@ -1,5 +1,5 @@ -/* - * Copyright (C) 2005-2008 MaNGOS +/* + * Copyright (C) 2005-2009 MaNGOS * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,20 +16,19 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include "Hmac.h" +#include "Auth/Hmac.h" #include "BigNumber.h" -HmacHash::HmacHash() +HmacHash::HmacHash(uint32 len, uint8 *seed) { - uint8 temp[SEED_KEY_SIZE] = { 0x38, 0xA7, 0x83, 0x15, 0xF8, 0x92, 0x25, 0x30, 0x71, 0x98, 0x67, 0xB1, 0x8C, 0x4, 0xE2, 0xAA }; - memcpy(&m_key, &temp, SEED_KEY_SIZE); + ASSERT(len == SEED_KEY_SIZE); + HMAC_CTX_init(&m_ctx); - HMAC_Init_ex(&m_ctx, &m_key, SEED_KEY_SIZE, EVP_sha1(), NULL); + HMAC_Init_ex(&m_ctx, seed, SEED_KEY_SIZE, EVP_sha1(), NULL); } HmacHash::~HmacHash() { - memset(&m_key, 0x00, SEED_KEY_SIZE); HMAC_CTX_cleanup(&m_ctx); } @@ -43,14 +42,16 @@ void HmacHash::UpdateData(const uint8 *data, int length) HMAC_Update(&m_ctx, data, length); } -void HmacHash::Initialize() -{ - HMAC_Init_ex(&m_ctx, &m_key, SEED_KEY_SIZE, EVP_sha1(), NULL); -} - void HmacHash::Finalize() { - unsigned int length = 0; - HMAC_Final(&m_ctx, m_digest, &length); + uint32 length = 0; + HMAC_Final(&m_ctx, (uint8*)m_digest, (unsigned int*)&length); ASSERT(length == SHA_DIGEST_LENGTH) } + +uint8 *HmacHash::ComputeHash(BigNumber *bn) +{ + HMAC_Update(&m_ctx, bn->AsByteArray(), bn->GetNumBytes()); + Finalize(); + return (uint8*)m_digest; +} diff --git a/src/shared/Auth/Hmac.h b/src/shared/Auth/Hmac.h index 9177df1..86effe3 100644 --- a/src/shared/Auth/Hmac.h +++ b/src/shared/Auth/Hmac.h @@ -1,5 +1,5 @@ -/* - * Copyright (C) 2005-2008 MaNGOS +/* + * Copyright (C) 2005-2009 MaNGOS * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,9 +19,9 @@ #ifndef _AUTH_HMAC_H #define _AUTH_HMAC_H -#include "common.h" -#include "openssl/hmac.h" -#include "openssl/sha.h" +#include "Common.h" +#include +#include class BigNumber; @@ -30,17 +30,16 @@ class BigNumber; class HmacHash { public: - HmacHash(); + HmacHash(uint32 len, uint8 *seed); ~HmacHash(); void UpdateBigNumber(BigNumber *bn); void UpdateData(const uint8 *data, int length); - void Initialize(); void Finalize(); - uint8 *GetDigest() { return m_digest; }; - int GetLength() { return SHA_DIGEST_LENGTH; }; + uint8 *ComputeHash(BigNumber *bn); + uint8 *GetDigest() { return (uint8*)m_digest; } + int GetLength() { return SHA_DIGEST_LENGTH; } private: HMAC_CTX m_ctx; - uint8 m_key[SEED_KEY_SIZE]; uint8 m_digest[SHA_DIGEST_LENGTH]; }; #endif diff --git a/src/shared/Auth/Makefile.am b/src/shared/Auth/Makefile.am index 55a953d..ed5a098 100644 --- a/src/shared/Auth/Makefile.am +++ b/src/shared/Auth/Makefile.am @@ -2,4 +2,4 @@ AM_CPPFLAGS = -I$(top_builddir)/src/Client -I$(top_builddir)/src/shared -I$(top_builddir)/src/Client/DefScript -I$(top_builddir)/src/Client/World -I$(top_builddir)/src/Client/Realm -I$(top_builddir)/src/dep/include -Wall ## Build pseuwow noinst_LIBRARIES = libauth.a -libauth_a_SOURCES = AuthCrypt.cpp BigNumber.cpp md5.c Sha1.cpp Hmac.cpp +libauth_a_SOURCES = AuthCrypt.cpp BigNumber.cpp md5.c Sha1.cpp Hmac.cpp SARC4.cpp diff --git a/src/shared/Auth/SARC4.cpp b/src/shared/Auth/SARC4.cpp new file mode 100644 index 0000000..e9c4114 --- /dev/null +++ b/src/shared/Auth/SARC4.cpp @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2009 MaNGOS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "Auth/SARC4.h" +#include + +SARC4::SARC4() +{ + EVP_CIPHER_CTX_init(&m_ctx); + EVP_EncryptInit_ex(&m_ctx, EVP_rc4(), NULL, NULL, NULL); + EVP_CIPHER_CTX_set_key_length(&m_ctx, SHA_DIGEST_LENGTH); +} + +SARC4::SARC4(uint8 *seed) +{ + EVP_CIPHER_CTX_init(&m_ctx); + EVP_EncryptInit_ex(&m_ctx, EVP_rc4(), NULL, NULL, NULL); + EVP_CIPHER_CTX_set_key_length(&m_ctx, SHA_DIGEST_LENGTH); + EVP_EncryptInit_ex(&m_ctx, NULL, NULL, seed, NULL); +} + +SARC4::~SARC4() +{ + EVP_CIPHER_CTX_cleanup(&m_ctx); +} + +void SARC4::Init(uint8 *seed) +{ + EVP_EncryptInit_ex(&m_ctx, NULL, NULL, seed, NULL); +} + +void SARC4::UpdateData(int len, uint8 *data) +{ + int outlen = 0; + EVP_EncryptUpdate(&m_ctx, data, &outlen, data, len); + EVP_EncryptFinal_ex(&m_ctx, data, &outlen); +} diff --git a/src/shared/Auth/SARC4.h b/src/shared/Auth/SARC4.h new file mode 100644 index 0000000..feca406 --- /dev/null +++ b/src/shared/Auth/SARC4.h @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2005-2009 MaNGOS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef _AUTH_SARC4_H +#define _AUTH_SARC4_H + +#include "Common.h" +#include + +class SARC4 +{ + public: + SARC4(); + SARC4(uint8 *seed); + ~SARC4(); + void Init(uint8 *seed); + void UpdateData(int len, uint8 *data); + private: + EVP_CIPHER_CTX m_ctx; +}; +#endif diff --git a/src/shared_VC90.vcproj b/src/shared_VC90.vcproj index bcc8e8b..dc0c875 100644 --- a/src/shared_VC90.vcproj +++ b/src/shared_VC90.vcproj @@ -433,6 +433,14 @@ RelativePath=".\shared\Auth\MD5Hash.h" > + + + + diff --git a/src/tools/stuffextract/StuffExtract.cpp b/src/tools/stuffextract/StuffExtract.cpp index b97fd4f..058186e 100644 --- a/src/tools/stuffextract/StuffExtract.cpp +++ b/src/tools/stuffextract/StuffExtract.cpp @@ -534,7 +534,7 @@ bool ConvertDBC(void) if(!stricmp(fn.c_str()+fn.length()-3, "mdx") || !stricmp(fn.c_str()+fn.length()-3, "mdl")) fn = fn.substr(0,fn.length()-3) + "m2"; else - logdebug("This should be a WMO: %s\n",fn.c_str()); + printf("This should be a WMO: %s\n",fn.c_str()); GameObjectDisplayInfoStorage[id].push_back(std::string(GameObjectDisplayInfoFieldNames[field]) + "=" + fn); std::string texture = value.substr(0,value.length()-3) + "blp";