* fixed an compile error that suddendly showed up in StormLib Linux Port. WTF?

* included bLumas patch for 3.0.8 as it compiles fine and doesn't crash on startup on Linux
* testing required!
This commit is contained in:
shlainn 2009-02-05 19:33:58 +00:00
parent f11a1112be
commit 1c697b84c0
29 changed files with 1512 additions and 762 deletions

View File

@ -68,8 +68,8 @@ charname=Pseuwow
// Client emulation configuration // Client emulation configuration
ClientVersion=2.4.3 ClientVersion=3.0.8
ClientBuild=8606 ClientBuild=9506
ClientLanguage=enUS ClientLanguage=enUS
// or change to enGB, deDE, ... // or change to enGB, deDE, ...

View File

@ -80,7 +80,7 @@ DEBUG(logdebug("Trying to open file %s",MeshFile->getFileName()));
MeshFile->read(&header,sizeof(ModelHeader)); MeshFile->read(&header,sizeof(ModelHeader));
if ((header.version[0] < 4 || header.version[0] > 7) || header.version[1] != 1 || header.version[2] != 0 || header.version[3] != 0) { if (header.version[0] != 8 || header.version[1] != 1 || header.version[2] != 0 || header.version[3] != 0) {
printf("Wrong header! File version doesn't match or file is not a M2 file."); printf("Wrong header! File version doesn't match or file is not a M2 file.");
return 0; return 0;
} }
@ -119,33 +119,37 @@ for(u32 i =0;i<header.nVertices;i++)
} }
DEBUG(logdebug("Read %u/%u Vertices",M2MVertices.size(),header.nVertices)); DEBUG(logdebug("Read %u/%u Vertices",M2MVertices.size(),header.nVertices));
//Views == Sets of vertices. Usage yet unknown. Global data //Views (skins) == Sets of vertices. Usage yet unknown. Global data
if(M2MViews.size()>0)
M2MViews.clear(); std::string SkinName = MeshFile->getFileName();
ModelView tempM2MView; SkinName = SkinName.substr(0, SkinName.length()-3) + "00.skin"; // FIX ME (and stuffextract) ! as we need more skins
MeshFile->seek(header.ofsViews); io::IReadFile* SkinFile = io::createReadFile(SkinName.c_str());
for(u32 i =0;i<header.nViews;i++) if (!SkinFile)
{ {
MeshFile->read(&tempM2MView,sizeof(ModelView)); printf("Error! Skin file not found: %s", SkinName.c_str());
M2MViews.push_back(tempM2MView); return 0;
} }
//std::cout << "Read "<<M2MViews.size()<<"/"<<header.nViews<<" Views\n";
ModelView currentView;
SkinFile->read(&currentView, sizeof(ModelView));
//std::cout << "Skins "<<header.nViews<<" (views)\n";
DEBUG(logdebug("Using View 0 for all further operations")); DEBUG(logdebug("Using View 0 for all further operations"));
DEBUG(logdebug("This View has %u Submeshes",M2MViews[0].nSub)); DEBUG(logdebug("This View has %u Submeshes",currentView.nSub));
//Vertex indices of a specific view.Local to View 0 //Vertex indices of a specific view.Local to View 0
if(M2MIndices.size()>0) if(M2MIndices.size()>0)
M2MIndices.clear(); M2MIndices.clear();
u16 tempM2Index; u16 tempM2Index;
MeshFile->seek(M2MViews[0].ofsIndex); SkinFile->seek(currentView.ofsIndex);
for(u32 i =0;i<M2MViews[0].nIndex;i++) for(u32 i =0;i<currentView.nIndex;i++)
{ {
MeshFile->read(&tempM2Index,sizeof(u16)); SkinFile->read(&tempM2Index,sizeof(u16));
M2MIndices.push_back(tempM2Index); M2MIndices.push_back(tempM2Index);
} }
DEBUG(logdebug("Read %u/%u Indices",M2MIndices.size(),M2MViews[0].nIndex)); DEBUG(logdebug("Read %u/%u Indices",M2MIndices.size(),currentView.nIndex));
//Triangles. Data Points point to the Vertex Indices, not the vertices themself. 3 Points = 1 Triangle, Local to View 0 //Triangles. Data Points point to the Vertex Indices, not the vertices themself. 3 Points = 1 Triangle, Local to View 0
@ -153,26 +157,26 @@ if(M2MTriangles.size()>0)
M2MTriangles.clear(); M2MTriangles.clear();
u16 tempM2Triangle; u16 tempM2Triangle;
MeshFile->seek(M2MViews[0].ofsTris); SkinFile->seek(currentView.ofsTris);
for(u32 i =0;i<M2MViews[0].nTris;i++) for(u32 i =0;i<currentView.nTris;i++)
{ {
MeshFile->read(&tempM2Triangle,sizeof(u16)); SkinFile->read(&tempM2Triangle,sizeof(u16));
M2MTriangles.push_back(tempM2Triangle); M2MTriangles.push_back(tempM2Triangle);
} }
DEBUG(logdebug("Read %u/%u Triangles",M2MTriangles.size(),M2MViews[0].nTris)); DEBUG(logdebug("Read %u/%u Triangles",M2MTriangles.size(),currentView.nTris));
//Submeshes, Local to View 0 //Submeshes, Local to View 0
if(M2MSubmeshes.size()>0) if(M2MSubmeshes.size()>0)
M2MSubmeshes.clear(); M2MSubmeshes.clear();
ModelViewSubmesh tempM2Submesh; ModelViewSubmesh tempM2Submesh;
MeshFile->seek(M2MViews[0].ofsSub); SkinFile->seek(currentView.ofsSub);
for(u32 i =0;i<M2MViews[0].nSub;i++) for(u32 i =0;i<currentView.nSub;i++)
{ {
MeshFile->read(&tempM2Submesh,sizeof(ModelViewSubmesh)); SkinFile->read(&tempM2Submesh,sizeof(ModelViewSubmesh));
M2MSubmeshes.push_back(tempM2Submesh); M2MSubmeshes.push_back(tempM2Submesh);
// std::cout<< "Submesh " <<i<<" ID "<<tempM2Submesh.meshpartId<<" starts at V/T "<<tempM2Submesh.ofsVertex<<"/"<<tempM2Submesh.ofsTris<<" and has "<<tempM2Submesh.nVertex<<"/"<<tempM2Submesh.nTris<<" V/T\n"; // std::cout<< "Submesh " <<i<<" ID "<<tempM2Submesh.meshpartId<<" starts at V/T "<<tempM2Submesh.ofsVertex<<"/"<<tempM2Submesh.ofsTris<<" and has "<<tempM2Submesh.nVertex<<"/"<<tempM2Submesh.nTris<<" V/T\n";
} }
DEBUG(logdebug("Read %u/%u Submeshes",M2MSubmeshes.size(),M2MViews[0].nSub)); DEBUG(logdebug("Read %u/%u Submeshes",M2MSubmeshes.size(),currentView.nSub));
//Texture units. Local to view 0 //Texture units. Local to view 0
TextureUnit tempM2TexUnit; TextureUnit tempM2TexUnit;
@ -180,10 +184,10 @@ if(!M2MTextureUnit.empty())
{ {
M2MTextureUnit.clear(); M2MTextureUnit.clear();
} }
MeshFile->seek(M2MViews[0].ofsTex); SkinFile->seek(currentView.ofsTex);
for(u32 i=0;i<M2MViews[0].nTex;i++) for(u32 i=0;i<currentView.nTex;i++)
{ {
MeshFile->read(&tempM2TexUnit,sizeof(TextureUnit)); SkinFile->read(&tempM2TexUnit,sizeof(TextureUnit));
M2MTextureUnit.push_back(tempM2TexUnit); M2MTextureUnit.push_back(tempM2TexUnit);
DEBUG(logdebug(" TexUnit %u: Submesh: %u %u Render Flag: %u TextureUnitNumber: %u %u TTU: %u",i,tempM2TexUnit.submeshIndex1,tempM2TexUnit.submeshIndex2, tempM2TexUnit.renderFlagsIndex, tempM2TexUnit.TextureUnitNumber, tempM2TexUnit.TextureUnitNumber2 ,tempM2TexUnit.textureIndex)); DEBUG(logdebug(" TexUnit %u: Submesh: %u %u Render Flag: %u TextureUnitNumber: %u %u TTU: %u",i,tempM2TexUnit.submeshIndex1,tempM2TexUnit.submeshIndex2, tempM2TexUnit.renderFlagsIndex, tempM2TexUnit.TextureUnitNumber, tempM2TexUnit.TextureUnitNumber2 ,tempM2TexUnit.textureIndex));
} }
@ -260,6 +264,8 @@ for(u32 i=0; i<M2MTextureDef.size(); i++)
// Animation related stuff // // Animation related stuff //
/////////////////////////////////////// ///////////////////////////////////////
/* ANIMATION NEED FIX !!! - search this text to find all code blocks for animations
printf("Global Sequences: %u\n",header.nGlobalSequences); printf("Global Sequences: %u\n",header.nGlobalSequences);
//Ignored at the moment, as wolf.m2 has none //Ignored at the moment, as wolf.m2 has none
printf("Animations: %u\n",header.nAnimations); printf("Animations: %u\n",header.nAnimations);
@ -442,7 +448,7 @@ if(M2MBones[i].scaling.header.nValues>0){
// Joint->Animatedscale=core::vector3df(1.0f,1.0f,1.0f); // Joint->Animatedscale=core::vector3df(1.0f,1.0f,1.0f);
//Joint->Animatedrotation=core::quaternion(0.0f,0.0f,0.0f,0.0f); //Joint->Animatedrotation=core::quaternion(0.0f,0.0f,0.0f,0.0f);
core::matrix4 positionMatrix; /* core::matrix4 positionMatrix; ANIMATION NEED FIX !!!
// positionMatrix.setTranslation( Joint->Animatedposition ); // positionMatrix.setTranslation( Joint->Animatedposition );
core::matrix4 scaleMatrix; core::matrix4 scaleMatrix;
//scaleMatrix.setScale( Joint->Animatedscale ); //scaleMatrix.setScale( Joint->Animatedscale );
@ -459,7 +465,7 @@ if(M2MBones[i].scaling.header.nValues>0){
else else
Joint->LocalMatrix = Joint->GlobalMatrix; Joint->LocalMatrix = Joint->GlobalMatrix;
} }
*/
//std::cout<<AnimatedMesh->getAllJoints()[1]->Children.size()<<" Children\n"; //std::cout<<AnimatedMesh->getAllJoints()[1]->Children.size()<<" Children\n";
//And M2MVertices are not usable like this. Thus we transform //And M2MVertices are not usable like this. Thus we transform
@ -473,7 +479,7 @@ for(u32 i=0;i<M2MVertices.size();i++)
M2Vertices.push_back(video::S3DVertex(core::vector3df(M2MVertices[i].pos.X,M2MVertices[i].pos.Y,M2MVertices[i].pos.Z),core::vector3df(M2MVertices[i].normal.X,M2MVertices[i].normal.Y,M2MVertices[i].normal.Z), video::SColor(255,100,100,100),M2MVertices[i].texcoords)); M2Vertices.push_back(video::S3DVertex(core::vector3df(M2MVertices[i].pos.X,M2MVertices[i].pos.Y,M2MVertices[i].pos.Z),core::vector3df(M2MVertices[i].normal.X,M2MVertices[i].normal.Y,M2MVertices[i].normal.Z), video::SColor(255,100,100,100),M2MVertices[i].texcoords));
} }
//Loop through the submeshes //Loop through the submeshes
for(u32 i=0; i < M2MViews[0].nSub;i++)// for(u32 i=0; i < currentView.nSub;i++)//
{ {
//Now, M2MTriangles refers to M2MIndices and not to M2MVertices. //Now, M2MTriangles refers to M2MIndices and not to M2MVertices.
scene::SSkinMeshBuffer *MeshBuffer = AnimatedMesh->createBuffer(); scene::SSkinMeshBuffer *MeshBuffer = AnimatedMesh->createBuffer();
@ -492,6 +498,7 @@ for(u32 i=0; i < M2MViews[0].nSub;i++)//
for(u32 k=0; k<4; k++) for(u32 k=0; k<4; k++)
{ {
//std::cout << (u32)M2MVertices[j].bones[k] << " "; //std::cout << (u32)M2MVertices[j].bones[k] << " ";
/* ANIMATION NEED FIX !!!
if((M2MVertices[j].weights[k]/255.0f)>0.0f) if((M2MVertices[j].weights[k]/255.0f)>0.0f)
{ {
scene::CSkinnedMesh::SWeight* weight = AnimatedMesh->createWeight(AnimatedMesh->getAllJoints()[(u32)M2MVertices[j].bones[k]]); scene::CSkinnedMesh::SWeight* weight = AnimatedMesh->createWeight(AnimatedMesh->getAllJoints()[(u32)M2MVertices[j].bones[k]]);
@ -499,6 +506,7 @@ for(u32 i=0; i < M2MViews[0].nSub;i++)//
weight->vertex_id=j-M2MSubmeshes[i].ofsVertex; weight->vertex_id=j-M2MSubmeshes[i].ofsVertex;
weight->buffer_id=i; weight->buffer_id=i;
} }
*/
//std::cout<<weight->buffer_id << " " << weight->vertex_id << " " << weight->strength <<"|"; //std::cout<<weight->buffer_id << " " << weight->vertex_id << " " << weight->strength <<"|";
} }
// std::cout<<'\n'; // std::cout<<'\n';
@ -563,7 +571,6 @@ M2MTextureDef.clear();
M2MSubmeshes.clear(); M2MSubmeshes.clear();
M2MTextureFiles.clear(); M2MTextureFiles.clear();
M2MTextureLookup.clear(); M2MTextureLookup.clear();
M2MViews.clear();
return true; return true;
} }

View File

@ -23,8 +23,6 @@ struct ModelHeader {
u32 ofsAnimations; u32 ofsAnimations;
u32 nC; u32 nC;
u32 ofsC; u32 ofsC;
u32 nD;
u32 ofsD;
u32 nBones; u32 nBones;
u32 ofsBones; u32 ofsBones;
u32 nF; u32 nF;
@ -32,8 +30,7 @@ struct ModelHeader {
u32 nVertices; u32 nVertices;
u32 ofsVertices; u32 ofsVertices;
u32 nViews; u32 nViews; // number of skins ?
u32 ofsViews;
u32 nColors; u32 nColors;
u32 ofsColors; u32 ofsColors;
@ -43,8 +40,6 @@ struct ModelHeader {
u32 nTransparency; // H u32 nTransparency; // H
u32 ofsTransparency; u32 ofsTransparency;
u32 nI; // always unused ?
u32 ofsI;
u32 nTexAnims; // J u32 nTexAnims; // J
u32 ofsTexAnims; u32 ofsTexAnims;
u32 nTexReplace; u32 nTexReplace;
@ -111,6 +106,7 @@ struct ModelVertex {
}; };
struct ModelView { struct ModelView {
c8 id[4]; // always "SKIN"
u32 nIndex, ofsIndex; // Vertices in this model (index into vertices[]) u32 nIndex, ofsIndex; // Vertices in this model (index into vertices[])
u32 nTris, ofsTris; // indices u32 nTris, ofsTris; // indices
u32 nProps, ofsProps; // additional vtx properties u32 nProps, ofsProps; // additional vtx properties
@ -232,7 +228,6 @@ private:
//SSkinMeshBuffer* MeshBuffer; //SSkinMeshBuffer* MeshBuffer;
//Taken from the Model file, thus m2M* //Taken from the Model file, thus m2M*
core::array<ModelVertex> M2MVertices; core::array<ModelVertex> M2MVertices;
core::array<ModelView> M2MViews;
core::array<u16> M2MIndices; core::array<u16> M2MIndices;
core::array<u16> M2MTriangles; core::array<u16> M2MTriangles;
core::array<ModelViewSubmesh> M2MSubmeshes; core::array<ModelViewSubmesh> M2MSubmeshes;

View File

@ -118,8 +118,10 @@ void WorldSession::SendCastSpell(uint32 spellid, bool nocheck)
WorldPacket packet; WorldPacket packet;
ByteBuffer temp; ByteBuffer temp;
uint32 flags=TARGET_FLAG_SELF; // target mask. spellcast implementeation needs to be changed if TARGET_MASK_SELF is != 0 uint32 flags=TARGET_FLAG_SELF; // target mask. spellcast implementeation needs to be changed if TARGET_MASK_SELF is != 0
packet << (uint8)0; // unk
packet << spellid; packet << spellid;
packet << (uint8)0; // unk packet << (uint8)0; // unk
if(target && my->GetTarget() != GetGuid()) // self cast? if(target && my->GetTarget() != GetGuid()) // self cast?
{ {
if(target->GetTypeId() == TYPEID_PLAYER || target->GetTypeId() == TYPEID_UNIT) if(target->GetTypeId() == TYPEID_PLAYER || target->GetTypeId() == TYPEID_UNIT)

View File

@ -11,7 +11,7 @@
#include "Item.h" #include "Item.h"
// increase this number whenever you change something that makes old files unusable // increase this number whenever you change something that makes old files unusable
uint32 ITEMPROTOTYPES_CACHE_VERSION = 3; uint32 ITEMPROTOTYPES_CACHE_VERSION = 4;
uint32 CREATURETEMPLATES_CACHE_VERSION = 0; uint32 CREATURETEMPLATES_CACHE_VERSION = 0;
uint32 GOTEMPLATES_CACHE_VERSION = 0; uint32 GOTEMPLATES_CACHE_VERSION = 0;
@ -214,11 +214,14 @@ void ItemProtoCache_InsertDataToSession(WorldSession *session)
buf >> proto->MaxCount; buf >> proto->MaxCount;
buf >> proto->Stackable; buf >> proto->Stackable;
buf >> proto->ContainerSlots; buf >> proto->ContainerSlots;
for(int i = 0; i < 10; i++) buf >> proto->StatsCount;
for(int i = 0; i < proto->StatsCount; i++)
{ {
buf >> proto->ItemStat[i].ItemStatType; buf >> proto->ItemStat[i].ItemStatType;
buf >> proto->ItemStat[i].ItemStatValue; buf >> proto->ItemStat[i].ItemStatValue;
} }
buf >> proto->ScalingStatDistribution;
buf >> proto->ScalingStatValue;
for(int i = 0; i < 5; i++) for(int i = 0; i < 5; i++)
{ {
buf >> proto->Damage[i].DamageMin; buf >> proto->Damage[i].DamageMin;
@ -274,6 +277,8 @@ void ItemProtoCache_InsertDataToSession(WorldSession *session)
buf >> proto->RequiredArenaRank; buf >> proto->RequiredArenaRank;
buf >> proto->RequiredDisenchantSkill; buf >> proto->RequiredDisenchantSkill;
buf >> proto->ArmorDamageModifier; buf >> proto->ArmorDamageModifier;
buf >> proto->Duration;
buf >> proto->ItemLimitCategory;
if(proto->Id) if(proto->Id)
{ {
@ -343,11 +348,14 @@ void ItemProtoCache_WriteDataToCache(WorldSession *session)
buf << proto->MaxCount; buf << proto->MaxCount;
buf << proto->Stackable; buf << proto->Stackable;
buf << proto->ContainerSlots; buf << proto->ContainerSlots;
for(int i = 0; i < 10; i++) buf << proto->StatsCount;
for(int i = 0; i < proto->StatsCount; i++)
{ {
buf << proto->ItemStat[i].ItemStatType; buf << proto->ItemStat[i].ItemStatType;
buf << proto->ItemStat[i].ItemStatValue; buf << proto->ItemStat[i].ItemStatValue;
} }
buf << proto->ScalingStatDistribution;
buf << proto->ScalingStatValue;
for(int i = 0; i < 5; i++) for(int i = 0; i < 5; i++)
{ {
buf << proto->Damage[i].DamageMin; buf << proto->Damage[i].DamageMin;
@ -403,6 +411,8 @@ void ItemProtoCache_WriteDataToCache(WorldSession *session)
buf << proto->RequiredArenaRank; buf << proto->RequiredArenaRank;
buf << proto->RequiredDisenchantSkill; buf << proto->RequiredDisenchantSkill;
buf << proto->ArmorDamageModifier; buf << proto->ArmorDamageModifier;
buf << proto->Duration;
buf << proto->ItemLimitCategory;
//DEBUG(logdebug("ItemProtoCache: Saved %u [%s]",proto->Id, proto->Name[0].c_str())); //DEBUG(logdebug("ItemProtoCache: Saved %u [%s]",proto->Id, proto->Name[0].c_str()));
uint32 size = buf.size(); uint32 size = buf.size();

View File

@ -20,52 +20,94 @@ struct GameobjectTemplate
//0 GAMEOBJECT_TYPE_DOOR //0 GAMEOBJECT_TYPE_DOOR
struct struct
{ {
uint32 _data0; uint32 startOpen; //0 used client side to determine GO_ACTIVATED means open/closed
uint32 lockId; //1 uint32 lockId; //1 -> Lock.dbc
uint16 _data2lo; //2 lower part of data2, unknown uint32 autoCloseTime; //2 secs till autoclose = autoCloseTime / 0x10000
uint16 autoCloseTime; //2 (unit16) uint32 noDamageImmune; //3 break opening whenever you recieve damage?
uint32 openTextID; //4 can be used to replace castBarCaption?
uint32 closeTextID; //5
} door; } door;
//1 GAMEOBJECT_TYPE_BUTTON //1 GAMEOBJECT_TYPE_BUTTON
struct struct
{ {
uint32 _data0; uint32 startOpen; //0
uint32 lockId; //1 uint32 lockId; //1 -> Lock.dbc
uint16 _data2lo; //2 lower part of data2, unknown uint32 autoCloseTime; //2 secs till autoclose = autoCloseTime / 0x10000
uint16 autoCloseTime; //2 (unit16) uint32 linkedTrap; //3
uint32 _data3; uint32 noDamageImmune; //4 isBattlegroundObject
uint32 isBattlegroundObject; //4 uint32 large; //5
uint32 openTextID; //6 can be used to replace castBarCaption?
uint32 closeTextID; //7
uint32 losOK; //8
} button; } button;
//2 GAMEOBJECT_TYPE_QUESTGIVER
struct
{
uint32 lockId; //0 -> Lock.dbc
uint32 questList; //1
uint32 pageMaterial; //2
uint32 gossipID; //3
uint32 customAnim; //4
uint32 noDamageImmune; //5
uint32 openTextID; //6 can be used to replace castBarCaption?
uint32 losOK; //7
uint32 allowMounted; //8
uint32 large; //9
} questgiver;
//3 GAMEOBJECT_TYPE_CHEST //3 GAMEOBJECT_TYPE_CHEST
struct struct
{ {
uint32 lockId; //0 uint32 lockId; //0 -> Lock.dbc
uint32 lootId; //1 uint32 lootId; //1
uint32 _data2[2]; uint32 chestRestockTime; //2
uint32 consumable; //3
uint32 minSuccessOpens; //4 uint32 minSuccessOpens; //4
uint32 maxSuccessOpens; //5 uint32 maxSuccessOpens; //5
uint32 eventId; //6 uint32 eventId; //6 lootedEvent
uint32 linkedTrapId; //7 uint32 linkedTrapId; //7
uint32 questId; //8 not used currently but store quest required for GO activation for player uint32 questId; //8 not used currently but store quest required for GO activation for player
uint32 _data9[5]; uint32 level; //9
uint32 _data14; //14 something == trap.data12 == goober.data14 (openText?) uint32 losOK; //10
uint32 leaveLoot; //11
uint32 notInCombat; //12
uint32 logLoot; //13
uint32 openTextID; //14 can be used to replace castBarCaption?
uint32 groupLootRules; //15
} chest; } chest;
//5 GAMEOBJECT_TYPE_GENERIC
struct
{
uint32 floatingTooltip; //0
uint32 highlight; //1
uint32 serverOnly; //2
uint32 large; //3
uint32 floatOnWater; //4
uint32 questID; //5
} _generic;
//6 GAMEOBJECT_TYPE_TRAP //6 GAMEOBJECT_TYPE_TRAP
struct struct
{ {
uint32 _data0; //0 lockid??? uint32 lockId; //0 -> Lock.dbc
uint32 _data1; uint32 level; //1
uint32 radius; //2 radius for trap activation uint32 radius; //2 radius for trap activation
uint32 spellId; //3 uint32 spellId; //3
uint32 isNeedDespawn; //4 (if >0) uint32 charges; //4 need respawn (if > 0)
uint32 _data5; //5 uint32 cooldown; //5 time in secs
uint32 _data6[6]; uint32 autoCloseTime; //6
uint32 _data12; //12 something == chest.data14 == goober.data14 (openText?) uint32 startDelay; //7
uint32 serverOnly; //8
uint32 stealthed; //9
uint32 large; //10
uint32 stealthAffected; //11
uint32 openTextID; //12 can be used to replace castBarCaption?
uint32 closeTextID; //13
} trap; } trap;
//7 GAMEOBJECT_TYPE_CHAIR //7 GAMEOBJECT_TYPE_CHAIR
struct struct
{ {
uint32 slots; //0 not used currently uint32 slots; //0
uint32 height; //1 uint32 height; //1
uint32 onlyCreatorUse; //2
} chair; } chair;
//8 GAMEOBJECT_TYPE_SPELL_FOCUS //8 GAMEOBJECT_TYPE_SPELL_FOCUS
struct struct
@ -73,39 +115,82 @@ struct GameobjectTemplate
uint32 focusId; //0 uint32 focusId; //0
uint32 dist; //1 uint32 dist; //1
uint32 linkedTrapId; //2 uint32 linkedTrapId; //2
uint32 serverOnly; //3
uint32 questID; //4
uint32 large; //5
} spellFocus; } spellFocus;
//9 GAMEOBJECT_TYPE_TEXT
struct
{
uint32 pageID; //0
uint32 language; //1
uint32 pageMaterial; //2
uint32 allowMounted; //3
} text;
//10 GAMEOBJECT_TYPE_GOOBER //10 GAMEOBJECT_TYPE_GOOBER
struct struct
{ {
uint32 _data0; //0 lockid ??? uint32 lockId; //0 -> Lock.dbc
uint32 questId; //1 uint32 questId; //1
uint32 eventId; //2 uint32 eventId; //2
uint32 _data3[4]; uint32 autoCloseTime; //3
uint32 customAnim; //4
uint32 consumable; //5
uint32 cooldown; //6
uint32 pageId; //7 uint32 pageId; //7
uint32 _data8[2]; uint32 language; //8
uint32 pageMaterial; //9
uint32 spellId; //10 uint32 spellId; //10
uint32 _data11; uint32 noDamageImmune; //11
uint32 linkedTrapId; //12 uint32 linkedTrapId; //12
uint32 _data13; uint32 large; //13
uint32 _data14; //14 something == trap.data12 == chest.data14 (openText?) uint32 openTextID; //14 can be used to replace castBarCaption?
uint32 _data15; uint32 closeTextID; //15
uint32 isBattlegroundObject; //16 uint32 losOK; //16 isBattlegroundObject
uint32 allowMounted; //17
} goober; } goober;
//11 GAMEOBJECT_TYPE_TRANSPORT
struct
{
uint32 pause; //0
uint32 startOpen; //1
uint32 autoCloseTime; //2 secs till autoclose = autoCloseTime / 0x10000
} transport;
//12 GAMEOBJECT_TYPE_AREADAMAGE
struct
{
uint32 lockId; //0
uint32 radius; //1
uint32 damageMin; //2
uint32 damageMax; //3
uint32 damageSchool; //4
uint32 autoCloseTime; //5 secs till autoclose = autoCloseTime / 0x10000
uint32 openTextID; //6
uint32 closeTextID; //7
} areadamage;
//13 GAMEOBJECT_TYPE_CAMERA //13 GAMEOBJECT_TYPE_CAMERA
struct struct
{ {
uint32 _data0; uint32 lockId; //0 -> Lock.dbc
uint32 cinematicId; //1 uint32 cinematicId; //1
uint32 eventID; //2
uint32 openTextID; //3 can be used to replace castBarCaption?
} camera; } camera;
//15 GAMEOBJECT_TYPE_MO_TRANSPORT //15 GAMEOBJECT_TYPE_MO_TRANSPORT
struct struct
{ {
uint32 taxiPathId; //0 uint32 taxiPathId; //0
uint32 moveSpeed; //1
uint32 accelRate; //2
uint32 startEventID; //3
uint32 stopEventID; //4
uint32 transportPhysics; //5
uint32 mapID; //6
} moTransport; } moTransport;
//17 GAMEOBJECT_TYPE_FISHINGNODE //17 GAMEOBJECT_TYPE_FISHINGNODE
struct struct
{ {
uint32 _data0; uint32 _data0; //0
uint32 lootId; //1 uint32 lootId; //1
} fishnode; } fishnode;
//18 GAMEOBJECT_TYPE_SUMMONING_RITUAL //18 GAMEOBJECT_TYPE_SUMMONING_RITUAL
@ -113,21 +198,50 @@ struct GameobjectTemplate
{ {
uint32 reqParticipants; //0 uint32 reqParticipants; //0
uint32 spellId; //1 uint32 spellId; //1
uint32 animSpell; //2
uint32 ritualPersistent; //3
uint32 casterTargetSpell; //4
uint32 casterTargetSpellTargets; //5
uint32 castersGrouped; //6
uint32 ritualNoTargetCheck; //7
} summoningRitual; } summoningRitual;
//20 GAMEOBJECT_TYPE_AUCTIONHOUSE
struct
{
uint32 actionHouseID; //0
} auctionhouse;
//21 GAMEOBJECT_TYPE_GUARDPOST
struct
{
uint32 creatureID; //0
uint32 charges; //1
} guardpost;
//22 GAMEOBJECT_TYPE_SPELLCASTER //22 GAMEOBJECT_TYPE_SPELLCASTER
struct struct
{ {
uint32 spellId; //0 uint32 spellId; //0
uint32 charges; //1 uint32 charges; //1
uint32 partyOnly; //2 uint32 partyOnly; //2
uint32 spellId2; //3 (is it used in this way?)
} spellcaster; } spellcaster;
//23 GAMEOBJECT_TYPE_MEETINGSTONE //23 GAMEOBJECT_TYPE_MEETINGSTONE
struct struct
{ {
uint32 minLevel; //0 uint32 minLevel; //0
uint32 maxLevel; //1 uint32 maxLevel; //1
uint32 areaID; //2
} meetingstone; } meetingstone;
//24 GAMEOBJECT_TYPE_FLAGSTAND
struct
{
uint32 lockId; //0
uint32 pickupSpell; //1
uint32 radius; //2
uint32 returnAura; //3
uint32 returnSpell; //4
uint32 noDamageImmune; //5
uint32 openTextID; //6
uint32 losOK; //7
} flagstand;
//25 GAMEOBJECT_TYPE_FISHINGHOLE // not implemented yet //25 GAMEOBJECT_TYPE_FISHINGHOLE // not implemented yet
struct struct
{ {
@ -135,8 +249,77 @@ struct GameobjectTemplate
uint32 lootId; //1 uint32 lootId; //1
uint32 minSuccessOpens; //2 uint32 minSuccessOpens; //2
uint32 maxSuccessOpens; //3 uint32 maxSuccessOpens; //3
uint32 lockId; //4 possibly 1628 for all? uint32 lockId; //4 -> Lock.dbc; possibly 1628 for all?
} fishinghole; } fishinghole;
//26 GAMEOBJECT_TYPE_FLAGDROP
struct
{
uint32 lockId; //0
uint32 eventID; //1
uint32 pickupSpell; //2
uint32 noDamageImmune; //3
uint32 openTextID; //4
} flagdrop;
//27 GAMEOBJECT_TYPE_MINI_GAME
struct
{
uint32 gameType; //0
} miniGame;
//29 GAMEOBJECT_TYPE_CAPTURE_POINT
struct
{
uint32 radius; //0
uint32 spell; //1
uint32 worldState1; //2
uint32 worldstate2; //3
uint32 winEventID1; //4
uint32 winEventID2; //5
uint32 contestedEventID1; //6
uint32 contestedEventID2; //7
uint32 progressEventID1; //8
uint32 progressEventID2; //9
uint32 neutralEventID1; //10
uint32 neutralEventID2; //11
uint32 neutralPercent; //12
uint32 worldstate3; //13
uint32 minSuperiority; //14
uint32 maxSuperiority; //15
uint32 minTime; //16
uint32 maxTime; //17
uint32 large; //18
uint32 highlight; //19
} capturePoint;
//30 GAMEOBJECT_TYPE_AURA_GENERATOR
struct
{
uint32 startOpen; //0
uint32 radius; //1
uint32 auraID1; //2
uint32 conditionID1; //3
uint32 auraID2; //4
uint32 conditionID2; //5
uint32 serverOnly; //6
} auraGenerator;
//31 GAMEOBJECT_TYPE_DUNGEON_DIFFICULTY
struct
{
uint32 mapID; //0
uint32 difficulty; //1
} dungeonDifficulty;
//32 GAMEOBJECT_TYPE_DO_NOT_USE_YET
struct
{
uint32 mapID; //0
uint32 difficulty; //1
} doNotUseYet;
//33 GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING
struct
{
uint32 dmgPctState1; //0
uint32 dmgPctState2; //1
uint32 state1Name; //2
uint32 state2Name; //3
} destructibleBuilding;
// not use for specific field access (only for output with loop by all filed), also this determinate max union size // 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 // GAMEOBJECT_TYPE_SPELLCASTER

View File

@ -39,11 +39,14 @@ void WorldSession::_HandleItemQuerySingleResponseOpcode(WorldPacket& recvPacket)
recvPacket >> proto->MaxCount; recvPacket >> proto->MaxCount;
recvPacket >> proto->Stackable; recvPacket >> proto->Stackable;
recvPacket >> proto->ContainerSlots; recvPacket >> proto->ContainerSlots;
for(int i = 0; i < 10; i++) recvPacket >> proto->StatsCount;
for(int i = 0; i < proto->StatsCount; i++)
{ {
recvPacket >> proto->ItemStat[i].ItemStatType; recvPacket >> proto->ItemStat[i].ItemStatType;
recvPacket >> proto->ItemStat[i].ItemStatValue; recvPacket >> proto->ItemStat[i].ItemStatValue;
} }
recvPacket >> proto->ScalingStatDistribution;
recvPacket >> proto->ScalingStatValue;
for(int i = 0; i < 5; i++) for(int i = 0; i < 5; i++)
{ {
recvPacket >> proto->Damage[i].DamageMin; recvPacket >> proto->Damage[i].DamageMin;
@ -97,6 +100,8 @@ void WorldSession::_HandleItemQuerySingleResponseOpcode(WorldPacket& recvPacket)
recvPacket >> proto->ExtendedCost; recvPacket >> proto->ExtendedCost;
recvPacket >> proto->RequiredDisenchantSkill; recvPacket >> proto->RequiredDisenchantSkill;
recvPacket >> proto->ArmorDamageModifier; recvPacket >> proto->ArmorDamageModifier;
recvPacket >> proto->Duration;
recvPacket >> proto->ItemLimitCategory;
logdetail("Got Item Info: Id=%u Name='%s' ReqLevel=%u Armor=%u Desc='%s'", 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()); proto->Id, proto->Name.c_str(), proto->RequiredLevel, proto->Armor, proto->Description.c_str());

View File

@ -211,7 +211,9 @@ enum INVENTORY_CLASS
ITEM_CLASS_QUEST = 12, ITEM_CLASS_QUEST = 12,
ITEM_CLASS_KEY = 13, ITEM_CLASS_KEY = 13,
ITEM_CLASS_PERMANENT = 14, ITEM_CLASS_PERMANENT = 14,
ITEM_CLASS_JUNK = 15 ITEM_CLASS_JUNK = 15,
ITEM_CLASS_MISC = 15,
ITEM_CLASS_GLYPH = 16
}; };
// Client understand only 0 subclass for ITEM_CLASS_CONSUMABLE // Client understand only 0 subclass for ITEM_CLASS_CONSUMABLE
@ -236,7 +238,8 @@ enum ITEM_SUBCLASS_CONTAINER
ITEM_SUBCLASS_ENGINEERING_CONTAINER = 4, ITEM_SUBCLASS_ENGINEERING_CONTAINER = 4,
ITEM_SUBCLASS_GEM_CONTAINER = 5, ITEM_SUBCLASS_GEM_CONTAINER = 5,
ITEM_SUBCLASS_MINING_CONTAINER = 6, ITEM_SUBCLASS_MINING_CONTAINER = 6,
ITEM_SUBCLASS_LEATHERWORKING_CONTAINER = 7 ITEM_SUBCLASS_LEATHERWORKING_CONTAINER = 7,
ITEM_SUBCLASS_INSCRIPTION_CONTAINER = 8
}; };
enum INVENTORY_SUBCLASS_WEAPON enum INVENTORY_SUBCLASS_WEAPON
@ -272,7 +275,11 @@ enum ITEM_SUBCLASS_ARMOR
ITEM_SUBCLASS_ARMOR_MAIL = 3, ITEM_SUBCLASS_ARMOR_MAIL = 3,
ITEM_SUBCLASS_ARMOR_PLATE = 4, ITEM_SUBCLASS_ARMOR_PLATE = 4,
ITEM_SUBCLASS_ARMOR_BUCKLER = 5, ITEM_SUBCLASS_ARMOR_BUCKLER = 5,
ITEM_SUBCLASS_ARMOR_SHIELD = 6 ITEM_SUBCLASS_ARMOR_SHIELD = 6,
ITEM_SUBCLASS_ARMOR_LIBRAM = 7,
ITEM_SUBCLASS_ARMOR_IDOL = 8,
ITEM_SUBCLASS_ARMOR_TOTEM = 9,
ITEM_SUBCLASS_ARMOR_SIGIL = 10
}; };
enum ITEM_SUBCLASS_PROJECTILE enum ITEM_SUBCLASS_PROJECTILE
@ -295,7 +302,10 @@ enum ITEM_SUBCLASS_TRADE_GOODS
ITEM_SUBCLASS_HERB = 9, ITEM_SUBCLASS_HERB = 9,
ITEM_SUBCLASS_ELEMENTAZL = 10, ITEM_SUBCLASS_ELEMENTAZL = 10,
ITEM_SUBCLASS_TRADE_GOODS_OTHER = 11, ITEM_SUBCLASS_TRADE_GOODS_OTHER = 11,
ITEM_SUBCLASS_ENCHANTING = 12 ITEM_SUBCLASS_ENCHANTING = 12,
ITEM_SUBCLASS_MATERIAL = 13,
ITEM_SUBCLASS_ARMOR_ENCHANTMENT = 14,
ITEM_SUBCLASS_WEAPON_ENCHANTMENT= 15
}; };
enum ITEM_SUBCLASS_BOOK enum ITEM_SUBCLASS_BOOK
@ -376,7 +386,10 @@ struct ItemProto
uint32 MaxCount; uint32 MaxCount;
uint32 Stackable; uint32 Stackable;
uint32 ContainerSlots; uint32 ContainerSlots;
uint32 StatsCount;
_ItemStat ItemStat[10]; _ItemStat ItemStat[10];
uint32 ScalingStatDistribution; // id from ScalingStatDistribution.dbc
uint32 ScalingStatValue; // mask for selecting column in ScalingStatValues.dbc
_ItemDamage Damage[5]; _ItemDamage Damage[5];
uint32 Armor; uint32 Armor;
uint32 HolyRes; uint32 HolyRes;
@ -414,6 +427,8 @@ struct ItemProto
uint32 RequiredArenaRank; uint32 RequiredArenaRank;
uint32 RequiredDisenchantSkill; uint32 RequiredDisenchantSkill;
float ArmorDamageModifier; float ArmorDamageModifier;
int32 Duration; // negative = realtime, positive = ingame time
uint32 ItemLimitCategory; // id from ItemLimitCategory.dbc
}; };
class Item : public Object class Item : public Object

View File

@ -108,7 +108,9 @@ float WorldObject::GetDistanceZ(WorldObject* obj)
void WorldSession::_HandleDestroyObjectOpcode(WorldPacket& recvPacket) void WorldSession::_HandleDestroyObjectOpcode(WorldPacket& recvPacket)
{ {
uint64 guid; uint64 guid;
recvPacket >> guid; uint8 dummy;
recvPacket >> guid >> dummy;
logdebug("Destroy Object "I64FMT,guid); logdebug("Destroy Object "I64FMT,guid);
// call script just before object removal // call script just before object removal

View File

@ -28,6 +28,7 @@ enum HighGuid
HIGHGUID_TRANSPORT = 0xF120, // blizz F120 (for GAMEOBJECT_TYPE_TRANSPORT) HIGHGUID_TRANSPORT = 0xF120, // blizz F120 (for GAMEOBJECT_TYPE_TRANSPORT)
HIGHGUID_UNIT = 0xF130, // blizz F130 HIGHGUID_UNIT = 0xF130, // blizz F130
HIGHGUID_PET = 0xF140, // blizz F140 HIGHGUID_PET = 0xF140, // blizz F140
HIGHGUID_VEHICLE = 0xF150,
HIGHGUID_DYNAMICOBJECT = 0xF100, // blizz F100 HIGHGUID_DYNAMICOBJECT = 0xF100, // blizz F100
HIGHGUID_CORPSE = 0xF101, // blizz F100 HIGHGUID_CORPSE = 0xF101, // blizz F100
HIGHGUID_MO_TRANSPORT = 0x1FC0, // blizz 1FC0 (for GAMEOBJECT_TYPE_MO_TRANSPORT) HIGHGUID_MO_TRANSPORT = 0x1FC0, // blizz 1FC0 (for GAMEOBJECT_TYPE_MO_TRANSPORT)
@ -41,4 +42,5 @@ enum HighGuid
#define IS_CORPSE_GUID(Guid) ( GUID_HIPART(Guid) == HIGHGUID_CORPSE ) #define IS_CORPSE_GUID(Guid) ( GUID_HIPART(Guid) == HIGHGUID_CORPSE )
#define IS_PLAYER_CORPSE_GUID(Guid) ( GUID_HIPART(Guid) == HIGHGUID_PLAYER_CORPSE ) #define IS_PLAYER_CORPSE_GUID(Guid) ( GUID_HIPART(Guid) == HIGHGUID_PLAYER_CORPSE )
#define IS_TRANSPORT(Guid) ( GUID_HIPART(Guid) == HIGHGUID_TRANSPORT ) #define IS_TRANSPORT(Guid) ( GUID_HIPART(Guid) == HIGHGUID_TRANSPORT )
#define IS_VEHICLE_GUID(Guid) ( GUID_HIPART(Guid) == HIGHGUID_VEHICLE )
#endif #endif

View File

@ -42,8 +42,8 @@ const char* worldOpcodeNames[] =
"CMSG_ZONE_MAP", "CMSG_ZONE_MAP",
"SMSG_ZONE_MAP", "SMSG_ZONE_MAP",
"CMSG_DEBUG_CHANGECELLZONE", "CMSG_DEBUG_CHANGECELLZONE",
"CMSG_EMBLAZON_TABARD_OBSOLETE", "CMSG_MOVE_CHARACTER_CHEAT",
"CMSG_UNEMBLAZON_TABARD_OBSOLETE", "SMSG_MOVE_CHARACTER_CHEAT",
"CMSG_RECHARGE", "CMSG_RECHARGE",
"CMSG_LEARN_SPELL", "CMSG_LEARN_SPELL",
"CMSG_CREATEMONSTER", "CMSG_CREATEMONSTER",
@ -59,7 +59,7 @@ const char* worldOpcodeNames[] =
"SMSG_FORCEACTIONSHOW", "SMSG_FORCEACTIONSHOW",
"CMSG_PETGODMODE", "CMSG_PETGODMODE",
"SMSG_PETGODMODE", "SMSG_PETGODMODE",
"SMSG_DEBUGINFOSPELLMISS_OBSOLETE", "SMSG_REFER_A_FRIEND_EXPIRED",
"CMSG_WEATHER_SPEED_CHEAT", "CMSG_WEATHER_SPEED_CHEAT",
"CMSG_UNDRESSPLAYER", "CMSG_UNDRESSPLAYER",
"CMSG_BEASTMASTER", "CMSG_BEASTMASTER",
@ -79,7 +79,7 @@ const char* worldOpcodeNames[] =
"SMSG_DEBUG_AISTATE", "SMSG_DEBUG_AISTATE",
"CMSG_DISABLE_PVP_CHEAT", "CMSG_DISABLE_PVP_CHEAT",
"CMSG_ADVANCE_SPAWN_TIME", "CMSG_ADVANCE_SPAWN_TIME",
"CMSG_PVP_PORT_OBSOLETE", "SMSG_DESTRUCTIBLE_BUILDING_DAMAGE",
"CMSG_AUTH_SRP6_BEGIN", "CMSG_AUTH_SRP6_BEGIN",
"CMSG_AUTH_SRP6_PROOF", "CMSG_AUTH_SRP6_PROOF",
"CMSG_AUTH_SRP6_RECODE", "CMSG_AUTH_SRP6_RECODE",
@ -207,7 +207,7 @@ const char* worldOpcodeNames[] =
"SMSG_READ_ITEM_FAILED", "SMSG_READ_ITEM_FAILED",
"SMSG_ITEM_COOLDOWN", "SMSG_ITEM_COOLDOWN",
"CMSG_GAMEOBJ_USE", "CMSG_GAMEOBJ_USE",
"CMSG_GAMEOBJ_CHAIR_USE_OBSOLETE", "CMSG_DESTROY_ITEMS",
"SMSG_GAMEOBJECT_CUSTOM_ANIM", "SMSG_GAMEOBJECT_CUSTOM_ANIM",
"CMSG_AREATRIGGER", "CMSG_AREATRIGGER",
"MSG_MOVE_START_FORWARD", "MSG_MOVE_START_FORWARD",
@ -340,7 +340,7 @@ const char* worldOpcodeNames[] =
"SMSG_SPELL_COOLDOWN", "SMSG_SPELL_COOLDOWN",
"SMSG_COOLDOWN_EVENT", "SMSG_COOLDOWN_EVENT",
"CMSG_CANCEL_AURA", "CMSG_CANCEL_AURA",
"SMSG_UPDATE_AURA_DURATION", "SMSG_UPDATE_AURA_DURATION_OBSOLETE",
"SMSG_PET_CAST_FAILED", "SMSG_PET_CAST_FAILED",
"MSG_CHANNEL_START", "MSG_CHANNEL_START",
"MSG_CHANNEL_UPDATE", "MSG_CHANNEL_UPDATE",
@ -364,10 +364,10 @@ const char* worldOpcodeNames[] =
"SMSG_DAMAGE_DONE_OBSOLETE", "SMSG_DAMAGE_DONE_OBSOLETE",
"SMSG_DAMAGE_TAKEN_OBSOLETE", "SMSG_DAMAGE_TAKEN_OBSOLETE",
"SMSG_CANCEL_COMBAT", "SMSG_CANCEL_COMBAT",
"SMSG_PLAYER_COMBAT_XP_GAIN_OBSOLETE", "SMSG_SPELLBREAKLOG",
"SMSG_SPELLHEALLOG", "SMSG_SPELLHEALLOG",
"SMSG_SPELLENERGIZELOG", "SMSG_SPELLENERGIZELOG",
"CMSG_SHEATHE_OBSOLETE", "SMSG_BREAK_TARGET",
"CMSG_SAVE_PLAYER", "CMSG_SAVE_PLAYER",
"CMSG_SETDEATHBINDPOINT", "CMSG_SETDEATHBINDPOINT",
"SMSG_BINDPOINTUPDATE", "SMSG_BINDPOINTUPDATE",
@ -571,7 +571,7 @@ const char* worldOpcodeNames[] =
"SMSG_GMTICKET_SYSTEMSTATUS", "SMSG_GMTICKET_SYSTEMSTATUS",
"CMSG_SPIRIT_HEALER_ACTIVATE", "CMSG_SPIRIT_HEALER_ACTIVATE",
"CMSG_SET_STAT_CHEAT", "CMSG_SET_STAT_CHEAT",
"SMSG_SET_REST_START", "SMSG_SET_REST_START_OBSOLETE",
"CMSG_SKILL_BUY_STEP", "CMSG_SKILL_BUY_STEP",
"CMSG_SKILL_BUY_RANK", "CMSG_SKILL_BUY_RANK",
"CMSG_XP_CHEAT", "CMSG_XP_CHEAT",
@ -726,8 +726,8 @@ const char* worldOpcodeNames[] =
"SMSG_SCRIPT_MESSAGE", "SMSG_SCRIPT_MESSAGE",
"SMSG_DUEL_COUNTDOWN", "SMSG_DUEL_COUNTDOWN",
"SMSG_AREA_TRIGGER_MESSAGE", "SMSG_AREA_TRIGGER_MESSAGE",
"CMSG_TOGGLE_HELM", "CMSG_SHOWING_HELM",
"CMSG_TOGGLE_CLOAK", "CMSG_SHOWING_CLOAK",
"SMSG_MEETINGSTONE_JOINFAILED", "SMSG_MEETINGSTONE_JOINFAILED",
"SMSG_PLAYER_SKINNED", "SMSG_PLAYER_SKINNED",
"SMSG_DURABILITY_DAMAGE_DEATH", "SMSG_DURABILITY_DAMAGE_DEATH",
@ -960,10 +960,10 @@ const char* worldOpcodeNames[] =
"SMSG_VOICE_SESSION_ADJUST_PRIORITY", "SMSG_VOICE_SESSION_ADJUST_PRIORITY",
"CMSG_VOICE_SET_TALKER_MUTED_REQUEST", "CMSG_VOICE_SET_TALKER_MUTED_REQUEST",
"SMSG_VOICE_SET_TALKER_MUTED", "SMSG_VOICE_SET_TALKER_MUTED",
"SMSG_INIT_EXTRA_AURA_INFO", "SMSG_INIT_EXTRA_AURA_INFO_OBSOLETE",
"SMSG_SET_EXTRA_AURA_INFO", "SMSG_SET_EXTRA_AURA_INFO_OBSOLETE",
"SMSG_SET_EXTRA_AURA_INFO_NEED_UPDATE", "SMSG_SET_EXTRA_AURA_INFO_NEED_UPDATE_OBSOLETE",
"SMSG_CLEAR_EXTRA_AURA_INFO", "SMSG_CLEAR_EXTRA_AURA_INFO_OBSOLETE",
"MSG_MOVE_START_DESCEND", "MSG_MOVE_START_DESCEND",
"CMSG_IGNORE_REQUIREMENTS_CHEAT", "CMSG_IGNORE_REQUIREMENTS_CHEAT",
"SMSG_IGNORE_REQUIREMENTS_CHEAT", "SMSG_IGNORE_REQUIREMENTS_CHEAT",
@ -973,6 +973,7 @@ const char* worldOpcodeNames[] =
"MSG_MOVE_UPDATE_CAN_FLY", "MSG_MOVE_UPDATE_CAN_FLY",
"MSG_RAID_READY_CHECK_CONFIRM", "MSG_RAID_READY_CHECK_CONFIRM",
"CMSG_VOICE_SESSION_ENABLE", "CMSG_VOICE_SESSION_ENABLE",
"SMSG_VOICE_SESSION_ENABLE",
"SMSG_VOICE_PARENTAL_CONTROLS", "SMSG_VOICE_PARENTAL_CONTROLS",
"CMSG_GM_WHISPER", "CMSG_GM_WHISPER",
"SMSG_GM_MESSAGECHAT", "SMSG_GM_MESSAGECHAT",
@ -1089,6 +1090,142 @@ const char* worldOpcodeNames[] =
"SMSG_SPLINE_MOVE_SET_FLYING", "SMSG_SPLINE_MOVE_SET_FLYING",
"SMSG_SPLINE_MOVE_UNSET_FLYING", "SMSG_SPLINE_MOVE_UNSET_FLYING",
"SMSG_SUMMON_CANCEL", "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",
"" ""
}; };

View File

@ -42,8 +42,8 @@ enum OpCodes
CMSG_ZONE_MAP = 0x00A, CMSG_ZONE_MAP = 0x00A,
SMSG_ZONE_MAP = 0x00B, SMSG_ZONE_MAP = 0x00B,
CMSG_DEBUG_CHANGECELLZONE = 0x00C, CMSG_DEBUG_CHANGECELLZONE = 0x00C,
CMSG_EMBLAZON_TABARD_OBSOLETE = 0x00D, CMSG_MOVE_CHARACTER_CHEAT = 0x00D,
CMSG_UNEMBLAZON_TABARD_OBSOLETE = 0x00E, SMSG_MOVE_CHARACTER_CHEAT = 0x00E,
CMSG_RECHARGE = 0x00F, CMSG_RECHARGE = 0x00F,
CMSG_LEARN_SPELL = 0x010, CMSG_LEARN_SPELL = 0x010,
CMSG_CREATEMONSTER = 0x011, CMSG_CREATEMONSTER = 0x011,
@ -59,7 +59,7 @@ enum OpCodes
SMSG_FORCEACTIONSHOW = 0x01B, SMSG_FORCEACTIONSHOW = 0x01B,
CMSG_PETGODMODE = 0x01C, CMSG_PETGODMODE = 0x01C,
SMSG_PETGODMODE = 0x01D, SMSG_PETGODMODE = 0x01D,
SMSG_DEBUGINFOSPELLMISS_OBSOLETE = 0x01E, SMSG_REFER_A_FRIEND_EXPIRED = 0x01E,
CMSG_WEATHER_SPEED_CHEAT = 0x01F, CMSG_WEATHER_SPEED_CHEAT = 0x01F,
CMSG_UNDRESSPLAYER = 0x020, CMSG_UNDRESSPLAYER = 0x020,
CMSG_BEASTMASTER = 0x021, CMSG_BEASTMASTER = 0x021,
@ -79,7 +79,7 @@ enum OpCodes
SMSG_DEBUG_AISTATE = 0x02F, SMSG_DEBUG_AISTATE = 0x02F,
CMSG_DISABLE_PVP_CHEAT = 0x030, CMSG_DISABLE_PVP_CHEAT = 0x030,
CMSG_ADVANCE_SPAWN_TIME = 0x031, CMSG_ADVANCE_SPAWN_TIME = 0x031,
CMSG_PVP_PORT_OBSOLETE = 0x032, SMSG_DESTRUCTIBLE_BUILDING_DAMAGE = 0x032,
CMSG_AUTH_SRP6_BEGIN = 0x033, CMSG_AUTH_SRP6_BEGIN = 0x033,
CMSG_AUTH_SRP6_PROOF = 0x034, CMSG_AUTH_SRP6_PROOF = 0x034,
CMSG_AUTH_SRP6_RECODE = 0x035, CMSG_AUTH_SRP6_RECODE = 0x035,
@ -207,7 +207,7 @@ enum OpCodes
SMSG_READ_ITEM_FAILED = 0x0AF, SMSG_READ_ITEM_FAILED = 0x0AF,
SMSG_ITEM_COOLDOWN = 0x0B0, SMSG_ITEM_COOLDOWN = 0x0B0,
CMSG_GAMEOBJ_USE = 0x0B1, CMSG_GAMEOBJ_USE = 0x0B1,
CMSG_GAMEOBJ_CHAIR_USE_OBSOLETE = 0x0B2, CMSG_DESTROY_ITEMS = 0x0B2,
SMSG_GAMEOBJECT_CUSTOM_ANIM = 0x0B3, SMSG_GAMEOBJECT_CUSTOM_ANIM = 0x0B3,
CMSG_AREATRIGGER = 0x0B4, CMSG_AREATRIGGER = 0x0B4,
MSG_MOVE_START_FORWARD = 0x0B5, MSG_MOVE_START_FORWARD = 0x0B5,
@ -333,14 +333,14 @@ enum OpCodes
CMSG_NEW_SPELL_SLOT = 0x12D, CMSG_NEW_SPELL_SLOT = 0x12D,
CMSG_CAST_SPELL = 0x12E, CMSG_CAST_SPELL = 0x12E,
CMSG_CANCEL_CAST = 0x12F, CMSG_CANCEL_CAST = 0x12F,
SMSG_CAST_FAILED = 0x130, // old SMSG_CAST_RESULT SMSG_CAST_FAILED = 0x130,
SMSG_SPELL_START = 0x131, SMSG_SPELL_START = 0x131,
SMSG_SPELL_GO = 0x132, SMSG_SPELL_GO = 0x132,
SMSG_SPELL_FAILURE = 0x133, SMSG_SPELL_FAILURE = 0x133,
SMSG_SPELL_COOLDOWN = 0x134, SMSG_SPELL_COOLDOWN = 0x134,
SMSG_COOLDOWN_EVENT = 0x135, SMSG_COOLDOWN_EVENT = 0x135,
CMSG_CANCEL_AURA = 0x136, CMSG_CANCEL_AURA = 0x136,
SMSG_UPDATE_AURA_DURATION = 0x137, SMSG_UPDATE_AURA_DURATION_OBSOLETE = 0x137,
SMSG_PET_CAST_FAILED = 0x138, SMSG_PET_CAST_FAILED = 0x138,
MSG_CHANNEL_START = 0x139, MSG_CHANNEL_START = 0x139,
MSG_CHANNEL_UPDATE = 0x13A, MSG_CHANNEL_UPDATE = 0x13A,
@ -364,10 +364,10 @@ enum OpCodes
SMSG_DAMAGE_DONE_OBSOLETE = 0x14C, SMSG_DAMAGE_DONE_OBSOLETE = 0x14C,
SMSG_DAMAGE_TAKEN_OBSOLETE = 0x14D, SMSG_DAMAGE_TAKEN_OBSOLETE = 0x14D,
SMSG_CANCEL_COMBAT = 0x14E, SMSG_CANCEL_COMBAT = 0x14E,
SMSG_PLAYER_COMBAT_XP_GAIN_OBSOLETE = 0x14F, SMSG_SPELLBREAKLOG = 0x14F,
SMSG_SPELLHEALLOG = 0x150, SMSG_SPELLHEALLOG = 0x150,
SMSG_SPELLENERGIZELOG = 0x151, SMSG_SPELLENERGIZELOG = 0x151,
CMSG_SHEATHE_OBSOLETE = 0x152, SMSG_BREAK_TARGET = 0x152,
CMSG_SAVE_PLAYER = 0x153, CMSG_SAVE_PLAYER = 0x153,
CMSG_SETDEATHBINDPOINT = 0x154, CMSG_SETDEATHBINDPOINT = 0x154,
SMSG_BINDPOINTUPDATE = 0x155, SMSG_BINDPOINTUPDATE = 0x155,
@ -550,7 +550,7 @@ enum OpCodes
SMSG_GMTICKET_CREATE = 0x206, SMSG_GMTICKET_CREATE = 0x206,
CMSG_GMTICKET_UPDATETEXT = 0x207, CMSG_GMTICKET_UPDATETEXT = 0x207,
SMSG_GMTICKET_UPDATETEXT = 0x208, SMSG_GMTICKET_UPDATETEXT = 0x208,
SMSG_ACCOUNT_DATA_TIMES = 0x209, // old SMSG_ACCOUNT_DATA_MD5 SMSG_ACCOUNT_DATA_TIMES = 0x209,
CMSG_REQUEST_ACCOUNT_DATA = 0x20A, CMSG_REQUEST_ACCOUNT_DATA = 0x20A,
CMSG_UPDATE_ACCOUNT_DATA = 0x20B, CMSG_UPDATE_ACCOUNT_DATA = 0x20B,
SMSG_UPDATE_ACCOUNT_DATA = 0x20C, SMSG_UPDATE_ACCOUNT_DATA = 0x20C,
@ -571,7 +571,7 @@ enum OpCodes
SMSG_GMTICKET_SYSTEMSTATUS = 0x21B, SMSG_GMTICKET_SYSTEMSTATUS = 0x21B,
CMSG_SPIRIT_HEALER_ACTIVATE = 0x21C, CMSG_SPIRIT_HEALER_ACTIVATE = 0x21C,
CMSG_SET_STAT_CHEAT = 0x21D, CMSG_SET_STAT_CHEAT = 0x21D,
SMSG_SET_REST_START = 0x21E, SMSG_SET_REST_START_OBSOLETE = 0x21E,
CMSG_SKILL_BUY_STEP = 0x21F, CMSG_SKILL_BUY_STEP = 0x21F,
CMSG_SKILL_BUY_RANK = 0x220, CMSG_SKILL_BUY_RANK = 0x220,
CMSG_XP_CHEAT = 0x221, CMSG_XP_CHEAT = 0x221,
@ -726,8 +726,8 @@ enum OpCodes
SMSG_SCRIPT_MESSAGE = 0x2B6, SMSG_SCRIPT_MESSAGE = 0x2B6,
SMSG_DUEL_COUNTDOWN = 0x2B7, SMSG_DUEL_COUNTDOWN = 0x2B7,
SMSG_AREA_TRIGGER_MESSAGE = 0x2B8, SMSG_AREA_TRIGGER_MESSAGE = 0x2B8,
CMSG_TOGGLE_HELM = 0x2B9, CMSG_SHOWING_HELM = 0x2B9,
CMSG_TOGGLE_CLOAK = 0x2BA, CMSG_SHOWING_CLOAK = 0x2BA,
SMSG_MEETINGSTONE_JOINFAILED = 0x2BB, SMSG_MEETINGSTONE_JOINFAILED = 0x2BB,
SMSG_PLAYER_SKINNED = 0x2BC, SMSG_PLAYER_SKINNED = 0x2BC,
SMSG_DURABILITY_DAMAGE_DEATH = 0x2BD, SMSG_DURABILITY_DAMAGE_DEATH = 0x2BD,
@ -960,10 +960,10 @@ enum OpCodes
SMSG_VOICE_SESSION_ADJUST_PRIORITY = 0x3A0, SMSG_VOICE_SESSION_ADJUST_PRIORITY = 0x3A0,
CMSG_VOICE_SET_TALKER_MUTED_REQUEST = 0x3A1, CMSG_VOICE_SET_TALKER_MUTED_REQUEST = 0x3A1,
SMSG_VOICE_SET_TALKER_MUTED = 0x3A2, SMSG_VOICE_SET_TALKER_MUTED = 0x3A2,
SMSG_INIT_EXTRA_AURA_INFO = 0x3A3, SMSG_INIT_EXTRA_AURA_INFO_OBSOLETE = 0x3A3,
SMSG_SET_EXTRA_AURA_INFO = 0x3A4, SMSG_SET_EXTRA_AURA_INFO_OBSOLETE = 0x3A4,
SMSG_SET_EXTRA_AURA_INFO_NEED_UPDATE = 0x3A5, SMSG_SET_EXTRA_AURA_INFO_NEED_UPDATE_OBSOLETE = 0x3A5,
SMSG_CLEAR_EXTRA_AURA_INFO = 0x3A6, // old SMSG_CAST_SUCCESS SMSG_CLEAR_EXTRA_AURA_INFO_OBSOLETE = 0x3A6,
MSG_MOVE_START_DESCEND = 0x3A7, MSG_MOVE_START_DESCEND = 0x3A7,
CMSG_IGNORE_REQUIREMENTS_CHEAT = 0x3A8, CMSG_IGNORE_REQUIREMENTS_CHEAT = 0x3A8,
SMSG_IGNORE_REQUIREMENTS_CHEAT = 0x3A9, SMSG_IGNORE_REQUIREMENTS_CHEAT = 0x3A9,
@ -973,126 +973,263 @@ enum OpCodes
MSG_MOVE_UPDATE_CAN_FLY = 0x3AD, MSG_MOVE_UPDATE_CAN_FLY = 0x3AD,
MSG_RAID_READY_CHECK_CONFIRM = 0x3AE, MSG_RAID_READY_CHECK_CONFIRM = 0x3AE,
CMSG_VOICE_SESSION_ENABLE = 0x3AF, CMSG_VOICE_SESSION_ENABLE = 0x3AF,
SMSG_VOICE_PARENTAL_CONTROLS = 0x3B0, SMSG_VOICE_SESSION_ENABLE = 0x3B0,
CMSG_GM_WHISPER = 0x3B1, SMSG_VOICE_PARENTAL_CONTROLS = 0x3B1,
SMSG_GM_MESSAGECHAT = 0x3B2, CMSG_GM_WHISPER = 0x3B2,
MSG_GM_GEARRATING = 0x3B3, SMSG_GM_MESSAGECHAT = 0x3B3,
CMSG_COMMENTATOR_ENABLE = 0x3B4, MSG_GM_GEARRATING = 0x3B4,
SMSG_COMMENTATOR_STATE_CHANGED = 0x3B5, CMSG_COMMENTATOR_ENABLE = 0x3B5,
CMSG_COMMENTATOR_GET_MAP_INFO = 0x3B6, SMSG_COMMENTATOR_STATE_CHANGED = 0x3B6,
SMSG_COMMENTATOR_MAP_INFO = 0x3B7, CMSG_COMMENTATOR_GET_MAP_INFO = 0x3B7,
CMSG_COMMENTATOR_GET_PLAYER_INFO = 0x3B8, SMSG_COMMENTATOR_MAP_INFO = 0x3B8,
SMSG_COMMENTATOR_GET_PLAYER_INFO = 0x3B9, CMSG_COMMENTATOR_GET_PLAYER_INFO = 0x3B9,
SMSG_COMMENTATOR_PLAYER_INFO = 0x3BA, SMSG_COMMENTATOR_GET_PLAYER_INFO = 0x3BA,
CMSG_COMMENTATOR_ENTER_INSTANCE = 0x3BB, SMSG_COMMENTATOR_PLAYER_INFO = 0x3BB,
CMSG_COMMENTATOR_EXIT_INSTANCE = 0x3BC, CMSG_COMMENTATOR_ENTER_INSTANCE = 0x3BC,
CMSG_COMMENTATOR_INSTANCE_COMMAND = 0x3BD, CMSG_COMMENTATOR_EXIT_INSTANCE = 0x3BD,
SMSG_CLEAR_TARGET = 0x3BE, CMSG_COMMENTATOR_INSTANCE_COMMAND = 0x3BE,
CMSG_BOT_DETECTED = 0x3BF, SMSG_CLEAR_TARGET = 0x3BF,
SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x3C0, CMSG_BOT_DETECTED = 0x3C0,
CMSG_CHEAT_PLAYER_LOGIN = 0x3C1, SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x3C1,
CMSG_CHEAT_PLAYER_LOOKUP = 0x3C2, CMSG_CHEAT_PLAYER_LOGIN = 0x3C2,
SMSG_CHEAT_PLAYER_LOOKUP = 0x3C3, CMSG_CHEAT_PLAYER_LOOKUP = 0x3C3,
SMSG_KICK_REASON = 0x3C4, SMSG_CHEAT_PLAYER_LOOKUP = 0x3C4,
MSG_RAID_READY_CHECK_FINISHED = 0x3C5, SMSG_KICK_REASON = 0x3C5,
CMSG_COMPLAIN = 0x3C6, MSG_RAID_READY_CHECK_FINISHED = 0x3C6,
SMSG_COMPLAIN_RESULT = 0x3C7, CMSG_COMPLAIN = 0x3C7,
SMSG_FEATURE_SYSTEM_STATUS = 0x3C8, SMSG_COMPLAIN_RESULT = 0x3C8,
CMSG_GM_SHOW_COMPLAINTS = 0x3C9, SMSG_FEATURE_SYSTEM_STATUS = 0x3C9,
CMSG_GM_UNSQUELCH = 0x3CA, CMSG_GM_SHOW_COMPLAINTS = 0x3CA,
CMSG_CHANNEL_SILENCE_VOICE = 0x3CB, CMSG_GM_UNSQUELCH = 0x3CB,
CMSG_CHANNEL_SILENCE_ALL = 0x3CC, CMSG_CHANNEL_SILENCE_VOICE = 0x3CC,
CMSG_CHANNEL_UNSILENCE_VOICE = 0x3CD, CMSG_CHANNEL_SILENCE_ALL = 0x3CD,
CMSG_CHANNEL_UNSILENCE_ALL = 0x3CE, CMSG_CHANNEL_UNSILENCE_VOICE = 0x3CE,
CMSG_TARGET_CAST = 0x3CF, CMSG_CHANNEL_UNSILENCE_ALL = 0x3CF,
CMSG_TARGET_SCRIPT_CAST = 0x3D0, CMSG_TARGET_CAST = 0x3D0,
CMSG_CHANNEL_DISPLAY_LIST = 0x3D1, CMSG_TARGET_SCRIPT_CAST = 0x3D1,
CMSG_SET_ACTIVE_VOICE_CHANNEL = 0x3D2, CMSG_CHANNEL_DISPLAY_LIST = 0x3D2,
CMSG_GET_CHANNEL_MEMBER_COUNT = 0x3D3, CMSG_SET_ACTIVE_VOICE_CHANNEL = 0x3D3,
SMSG_CHANNEL_MEMBER_COUNT = 0x3D4, CMSG_GET_CHANNEL_MEMBER_COUNT = 0x3D4,
CMSG_CHANNEL_VOICE_ON = 0x3D5, SMSG_CHANNEL_MEMBER_COUNT = 0x3D5,
CMSG_CHANNEL_VOICE_OFF = 0x3D6, CMSG_CHANNEL_VOICE_ON = 0x3D6,
CMSG_DEBUG_LIST_TARGETS = 0x3D7, CMSG_CHANNEL_VOICE_OFF = 0x3D7,
SMSG_DEBUG_LIST_TARGETS = 0x3D8, CMSG_DEBUG_LIST_TARGETS = 0x3D8,
SMSG_AVAILABLE_VOICE_CHANNEL = 0x3D9, SMSG_DEBUG_LIST_TARGETS = 0x3D9,
CMSG_ADD_VOICE_IGNORE = 0x3DA, SMSG_AVAILABLE_VOICE_CHANNEL = 0x3DA,
CMSG_DEL_VOICE_IGNORE = 0x3DB, CMSG_ADD_VOICE_IGNORE = 0x3DB,
CMSG_PARTY_SILENCE = 0x3DC, CMSG_DEL_VOICE_IGNORE = 0x3DC,
CMSG_PARTY_UNSILENCE = 0x3DD, CMSG_PARTY_SILENCE = 0x3DD,
MSG_NOTIFY_PARTY_SQUELCH = 0x3DE, CMSG_PARTY_UNSILENCE = 0x3DE,
SMSG_COMSAT_RECONNECT_TRY = 0x3DF, MSG_NOTIFY_PARTY_SQUELCH = 0x3DF,
SMSG_COMSAT_DISCONNECT = 0x3E0, SMSG_COMSAT_RECONNECT_TRY = 0x3E0,
SMSG_COMSAT_CONNECT_FAIL = 0x3E1, SMSG_COMSAT_DISCONNECT = 0x3E1,
SMSG_VOICE_CHAT_STATUS = 0x3E2, SMSG_COMSAT_CONNECT_FAIL = 0x3E2,
CMSG_REPORT_PVP_AFK = 0x3E3, SMSG_VOICE_CHAT_STATUS = 0x3E3,
CMSG_REPORT_PVP_AFK_RESULT = 0x3E4, CMSG_REPORT_PVP_AFK = 0x3E4,
CMSG_GUILD_BANKER_ACTIVATE = 0x3E5, CMSG_REPORT_PVP_AFK_RESULT = 0x3E5,
CMSG_GUILD_BANK_QUERY_TAB = 0x3E6, CMSG_GUILD_BANKER_ACTIVATE = 0x3E6,
SMSG_GUILD_BANK_LIST = 0x3E7, CMSG_GUILD_BANK_QUERY_TAB = 0x3E7,
CMSG_GUILD_BANK_SWAP_ITEMS = 0x3E8, SMSG_GUILD_BANK_LIST = 0x3E8,
CMSG_GUILD_BANK_BUY_TAB = 0x3E9, CMSG_GUILD_BANK_SWAP_ITEMS = 0x3E9,
CMSG_GUILD_BANK_UPDATE_TAB = 0x3EA, CMSG_GUILD_BANK_BUY_TAB = 0x3EA,
CMSG_GUILD_BANK_DEPOSIT_MONEY = 0x3EB, CMSG_GUILD_BANK_UPDATE_TAB = 0x3EB,
CMSG_GUILD_BANK_WITHDRAW_MONEY = 0x3EC, CMSG_GUILD_BANK_DEPOSIT_MONEY = 0x3EC,
MSG_GUILD_BANK_LOG_QUERY = 0x3ED, CMSG_GUILD_BANK_WITHDRAW_MONEY = 0x3ED,
CMSG_SET_CHANNEL_WATCH = 0x3EE, MSG_GUILD_BANK_LOG_QUERY = 0x3EE,
SMSG_USERLIST_ADD = 0x3EF, CMSG_SET_CHANNEL_WATCH = 0x3EF,
SMSG_USERLIST_REMOVE = 0x3F0, SMSG_USERLIST_ADD = 0x3F0,
SMSG_USERLIST_UPDATE = 0x3F1, SMSG_USERLIST_REMOVE = 0x3F1,
CMSG_CLEAR_CHANNEL_WATCH = 0x3F2, SMSG_USERLIST_UPDATE = 0x3F2,
SMSG_INSPECT_TALENT = 0x3F3, CMSG_CLEAR_CHANNEL_WATCH = 0x3F3,
SMSG_GOGOGO_OBSOLETE = 0x3F4, SMSG_INSPECT_TALENT = 0x3F4,
SMSG_ECHO_PARTY_SQUELCH = 0x3F5, SMSG_GOGOGO_OBSOLETE = 0x3F5,
CMSG_SET_TITLE_SUFFIX = 0x3F6, SMSG_ECHO_PARTY_SQUELCH = 0x3F6,
CMSG_SPELLCLICK = 0x3F7, CMSG_SET_TITLE_SUFFIX = 0x3F7,
SMSG_LOOT_LIST = 0x3F8, CMSG_SPELLCLICK = 0x3F8,
CMSG_GM_CHARACTER_RESTORE = 0x3F9, SMSG_LOOT_LIST = 0x3F9,
CMSG_GM_CHARACTER_SAVE = 0x3FA, CMSG_GM_CHARACTER_RESTORE = 0x3FA,
SMSG_VOICESESSION_FULL = 0x3FB, CMSG_GM_CHARACTER_SAVE = 0x3FB,
MSG_GUILD_PERMISSIONS = 0x3FC, SMSG_VOICESESSION_FULL = 0x3FC,
MSG_GUILD_BANK_MONEY_WITHDRAWN = 0x3FD, MSG_GUILD_PERMISSIONS = 0x3FD,
MSG_GUILD_EVENT_LOG_QUERY = 0x3FE, MSG_GUILD_BANK_MONEY_WITHDRAWN = 0x3FE,
CMSG_MAELSTROM_RENAME_GUILD = 0x3FF, MSG_GUILD_EVENT_LOG_QUERY = 0x3FF,
CMSG_GET_MIRRORIMAGE_DATA = 0x400, CMSG_MAELSTROM_RENAME_GUILD = 0x400,
SMSG_MIRRORIMAGE_DATA = 0x401, CMSG_GET_MIRRORIMAGE_DATA = 0x401,
SMSG_FORCE_DISPLAY_UPDATE = 0x402, SMSG_MIRRORIMAGE_DATA = 0x402,
SMSG_SPELL_CHANCE_RESIST_PUSHBACK = 0x403, SMSG_FORCE_DISPLAY_UPDATE = 0x403,
CMSG_IGNORE_DIMINISHING_RETURNS_CHEAT = 0x404, SMSG_SPELL_CHANCE_RESIST_PUSHBACK = 0x404,
SMSG_IGNORE_DIMINISHING_RETURNS_CHEAT = 0x405, CMSG_IGNORE_DIMINISHING_RETURNS_CHEAT = 0x405,
CMSG_KEEP_ALIVE = 0x406, SMSG_IGNORE_DIMINISHING_RETURNS_CHEAT = 0x406,
SMSG_RAID_READY_CHECK_ERROR = 0x407, CMSG_KEEP_ALIVE = 0x407,
CMSG_OPT_OUT_OF_LOOT = 0x408, SMSG_RAID_READY_CHECK_ERROR = 0x408,
MSG_QUERY_GUILD_BANK_TEXT = 0x409, CMSG_OPT_OUT_OF_LOOT = 0x409,
CMSG_SET_GUILD_BANK_TEXT = 0x40A, MSG_QUERY_GUILD_BANK_TEXT = 0x40A,
CMSG_SET_GRANTABLE_LEVELS = 0x40B, CMSG_SET_GUILD_BANK_TEXT = 0x40B,
CMSG_GRANT_LEVEL = 0x40C, CMSG_SET_GRANTABLE_LEVELS = 0x40C,
CMSG_REFER_A_FRIEND = 0x40D, CMSG_GRANT_LEVEL = 0x40D,
MSG_GM_CHANGE_ARENA_RATING = 0x40E, CMSG_REFER_A_FRIEND = 0x40E,
CMSG_DECLINE_CHANNEL_INVITE = 0x40F, MSG_GM_CHANGE_ARENA_RATING = 0x40F,
CMSG_GROUPACTION_THROTTLED = 0x410, CMSG_DECLINE_CHANNEL_INVITE = 0x410,
SMSG_OVERRIDE_LIGHT = 0x411, CMSG_GROUPACTION_THROTTLED = 0x411,
SMSG_TOTEM_CREATED = 0x412, SMSG_OVERRIDE_LIGHT = 0x412,
CMSG_TOTEM_DESTROYED = 0x413, SMSG_TOTEM_CREATED = 0x413,
CMSG_EXPIRE_RAID_INSTANCE = 0x414, CMSG_TOTEM_DESTROYED = 0x414,
CMSG_NO_SPELL_VARIANCE = 0x415, CMSG_EXPIRE_RAID_INSTANCE = 0x415,
CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY = 0x416, CMSG_NO_SPELL_VARIANCE = 0x416,
SMSG_QUESTGIVER_STATUS_MULTIPLE = 0x417, CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY = 0x417,
CMSG_SET_PLAYER_DECLINED_NAMES = 0x418, SMSG_QUESTGIVER_STATUS_MULTIPLE = 0x418,
SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x419, CMSG_SET_PLAYER_DECLINED_NAMES = 0x419,
CMSG_QUERY_SERVER_BUCK_DATA = 0x41A, SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x41A,
CMSG_CLEAR_SERVER_BUCK_DATA = 0x41B, CMSG_QUERY_SERVER_BUCK_DATA = 0x41B,
SMSG_SERVER_BUCK_DATA = 0x41C, CMSG_CLEAR_SERVER_BUCK_DATA = 0x41C,
SMSG_SEND_UNLEARN_SPELLS = 0x41D, SMSG_SERVER_BUCK_DATA = 0x41D,
SMSG_PROPOSE_LEVEL_GRANT = 0x41E, SMSG_SEND_UNLEARN_SPELLS = 0x41E,
CMSG_ACCEPT_LEVEL_GRANT = 0x41F, SMSG_PROPOSE_LEVEL_GRANT = 0x41F,
SMSG_REFER_A_FRIEND_FAILURE = 0x420, CMSG_ACCEPT_LEVEL_GRANT = 0x420,
SMSG_SPLINE_MOVE_SET_FLYING = 0x421, SMSG_REFER_A_FRIEND_FAILURE = 0x421,
SMSG_SPLINE_MOVE_UNSET_FLYING = 0x422, SMSG_SPLINE_MOVE_SET_FLYING = 0x422,
SMSG_SUMMON_CANCEL = 0x423 SMSG_SPLINE_MOVE_UNSET_FLYING = 0x423,
SMSG_SUMMON_CANCEL = 0x424,
CMSG_CHANGE_PERSONAL_ARENA_RATING = 0x425,
CMSG_ALTER_APPEARANCE = 0x426,
SMSG_ENABLE_BARBER_SHOP = 0x427,
SMSG_BARBER_SHOP_RESULT = 0x428,
CMSG_CALENDAR_GET_CALENDAR = 0x429,
CMSG_CALENDAR_GET_EVENT = 0x42A,
CMSG_CALENDAR_GUILD_FILTER = 0x42B,
CMSG_CALENDAR_ARENA_TEAM = 0x42C,
CMSG_CALENDAR_ADD_EVENT = 0x42D,
CMSG_CALENDAR_UPDATE_EVENT = 0x42E,
CMSG_CALENDAR_REMOVE_EVENT = 0x42F,
CMSG_CALENDAR_COPY_EVENT = 0x430,
CMSG_CALENDAR_EVENT_INVITE = 0x431,
CMSG_CALENDAR_EVENT_RSVP = 0x432,
CMSG_CALENDAR_EVENT_REMOVE_INVITE = 0x433,
CMSG_CALENDAR_EVENT_STATUS = 0x434,
CMSG_CALENDAR_EVENT_MODERATOR_STATUS = 0x435,
SMSG_CALENDAR_SEND_CALENDAR = 0x436,
SMSG_CALENDAR_SEND_EVENT = 0x437,
SMSG_CALENDAR_FILTER_GUILD = 0x438,
SMSG_CALENDAR_ARENA_TEAM = 0x439,
SMSG_CALENDAR_EVENT_INVITE = 0x43A,
SMSG_CALENDAR_EVENT_INVITE_REMOVED = 0x43B,
SMSG_CALENDAR_EVENT_STATUS = 0x43C,
SMSG_CALENDAR_COMMAND_RESULT = 0x43D,
SMSG_CALENDAR_RAID_LOCKOUT_ADDED = 0x43E,
SMSG_CALENDAR_RAID_LOCKOUT_REMOVED = 0x43F,
SMSG_CALENDAR_EVENT_INVITE_ALERT = 0x440,
SMSG_CALENDAR_EVENT_INVITE_REMOVED_ALERT = 0x441,
SMSG_CALENDAR_EVENT_INVITE_STATUS_ALERT = 0x442,
SMSG_CALENDAR_EVENT_REMOVED_ALERT = 0x443,
SMSG_CALENDAR_EVENT_UPDATED_ALERT = 0x444,
SMSG_CALENDAR_EVENT_MODERATOR_STATUS_ALERT = 0x445,
CMSG_CALENDAR_COMPLAIN = 0x446,
CMSG_CALENDAR_GET_NUM_PENDING = 0x447,
SMSG_CALENDAR_SEND_NUM_PENDING = 0x448,
CMSG_SAVE_DANCE = 0x449,
SMSG_NOTIFY_DANCE = 0x44A,
CMSG_PLAY_DANCE = 0x44B,
SMSG_PLAY_DANCE = 0x44C,
CMSG_LOAD_DANCES = 0x44D,
CMSG_STOP_DANCE = 0x44E,
SMSG_STOP_DANCE = 0x44F,
CMSG_SYNC_DANCE = 0x450,
CMSG_DANCE_QUERY = 0x451,
SMSG_DANCE_QUERY_RESPONSE = 0x452,
SMSG_INVALIDATE_DANCE = 0x453,
CMSG_DELETE_DANCE = 0x454,
SMSG_LEARNED_DANCE_MOVES = 0x455,
CMSG_LEARN_DANCE_MOVE = 0x456,
CMSG_UNLEARN_DANCE_MOVE = 0x457,
CMSG_SET_RUNE_COUNT = 0x458,
CMSG_SET_RUNE_COOLDOWN = 0x459,
MSG_MOVE_SET_PITCH_RATE_CHEAT = 0x45A,
MSG_MOVE_SET_PITCH_RATE = 0x45B,
SMSG_FORCE_PITCH_RATE_CHANGE = 0x45C,
CMSG_FORCE_PITCH_RATE_CHANGE_ACK = 0x45D,
SMSG_SPLINE_SET_PITCH_RATE = 0x45E,
SMSG_MOVE_ABANDON_TRANSPORT = 0x45F,
MSG_MOVE_ABANDON_TRANSPORT = 0x460,
CMSG_MOVE_ABANDON_TRANSPORT_ACK = 0x461,
CMSG_UPDATE_MISSILE_TRAJECTORY = 0x462,
SMSG_UPDATE_ACCOUNT_DATA_COMPLETE = 0x463,
SMSG_TRIGGER_MOVIE = 0x464,
CMSG_COMPLETE_MOVIE = 0x465,
CMSG_SET_GLYPH_SLOT = 0x466,
CMSG_SET_GLYPH = 0x467,
SMSG_ACHIEVEMENT_EARNED = 0x468,
SMSG_DYNAMIC_DROP_ROLL_RESULT = 0x469,
SMSG_CRITERIA_UPDATE = 0x46A,
CMSG_QUERY_INSPECT_ACHIEVEMENTS = 0x46B,
SMSG_RESPOND_INSPECT_ACHIEVEMENTS = 0x46C,
CMSG_DISMISS_CONTROLLED_VEHICLE = 0x46D,
CMSG_COMPLETE_ACHIEVEMENT_CHEAT = 0x46E,
SMSG_QUESTUPDATE_ADD_PVP_KILL = 0x46F,
CMSG_SET_CRITERIA_CHEAT = 0x470,
SMSG_GROUP_SWAP_FAILED = 0x471,
CMSG_UNITANIMTIER_CHEAT = 0x472,
CMSG_CHAR_CUSTOMIZE = 0x473,
SMSG_CHAR_CUSTOMIZE = 0x474,
SMSG_PET_RENAMEABLE = 0x475,
CMSG_REQUEST_VEHICLE_EXIT = 0x476,
CMSG_REQUEST_VEHICLE_PREV_SEAT = 0x477,
CMSG_REQUEST_VEHICLE_NEXT_SEAT = 0x478,
CMSG_REQUEST_VEHICLE_SWITCH_SEAT = 0x479,
CMSG_PET_LEARN_TALENT = 0x47A,
CMSG_PET_UNLEARN_TALENTS = 0x47B,
SMSG_SET_PHASE_SHIFT = 0x47C,
SMSG_ALL_ACHIEVEMENT_DATA = 0x47D,
CMSG_FORCE_SAY_CHEAT = 0x47E,
SMSG_HEALTH_UPDATE = 0x47F,
SMSG_POWER_UPDATE = 0x480,
CMSG_GAMEOBJ_REPORT_USE = 0x481,
SMSG_HIGHEST_THREAT_UPDATE = 0x482,
SMSG_THREAT_UPDATE = 0x483,
SMSG_THREAT_REMOVE = 0x484,
SMSG_THREAT_CLEAR = 0x485,
SMSG_CONVERT_RUNE = 0x486,
SMSG_RESYNC_RUNES = 0x487,
SMSG_ADD_RUNE_POWER = 0x488,
CMSG_START_QUEST = 0x489,
CMSG_REMOVE_GLYPH = 0x48A,
CMSG_DUMP_OBJECTS = 0x48B,
SMSG_DUMP_OBJECTS_DATA = 0x48C,
CMSG_DISMISS_CRITTER = 0x48D,
SMSG_NOTIFY_DEST_LOC_SPELL_CAST = 0x48E,
CMSG_AUCTION_LIST_PENDING_SALES = 0x48F,
SMSG_AUCTION_LIST_PENDING_SALES = 0x490,
SMSG_MODIFY_COOLDOWN = 0x491,
SMSG_PET_UPDATE_COMBO_POINTS = 0x492,
CMSG_ENABLETAXI = 0x493,
SMSG_PRE_RESURRECT = 0x494,
SMSG_AURA_UPDATE_ALL = 0x495,
SMSG_AURA_UPDATE = 0x496,
CMSG_FLOOD_GRACE_CHEAT = 0x497,
SMSG_SERVER_FIRST_ACHIEVEMENT = 0x498,
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
}; };
//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 //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 1060 #define MAX_OPCODE_ID 1196
/// Results of friend related commands /// Results of friend related commands
enum FriendsResult enum FriendsResult

View File

@ -6,6 +6,9 @@
#include "SysDefs.h" #include "SysDefs.h"
#include "Unit.h" #include "Unit.h"
/*
TODO: Update me or use UpdateFields directly
#define PLAYER_SLOT_START 0 #define PLAYER_SLOT_START 0
#define EQUIPMENT_SLOT_START 0 #define EQUIPMENT_SLOT_START 0
@ -119,6 +122,7 @@
#define TRADE_SLOT_COUNT 7 #define TRADE_SLOT_COUNT 7
#define TRADE_SLOT_TRADED_COUNT 6 #define TRADE_SLOT_TRADED_COUNT 6
#define TRADE_SLOT_NONTRADED 6 #define TRADE_SLOT_NONTRADED 6
*/
struct PlayerEnumItem struct PlayerEnumItem
{ {

View File

@ -55,7 +55,7 @@ enum Classes
CLASS_HUNTER = 3, CLASS_HUNTER = 3,
CLASS_ROGUE = 4, CLASS_ROGUE = 4,
CLASS_PRIEST = 5, CLASS_PRIEST = 5,
// CLASS_UNK1 = 6, unused CLASS_DEATH_KNIGHT = 6,
CLASS_SHAMAN = 7, CLASS_SHAMAN = 7,
CLASS_MAGE = 8, CLASS_MAGE = 8,
CLASS_WARLOCK = 9, CLASS_WARLOCK = 9,
@ -140,7 +140,8 @@ enum ItemQualities
ITEM_QUALITY_RARE = 3, //BLUE ITEM_QUALITY_RARE = 3, //BLUE
ITEM_QUALITY_EPIC = 4, //PURPLE ITEM_QUALITY_EPIC = 4, //PURPLE
ITEM_QUALITY_LEGENDARY = 5, //ORANGE ITEM_QUALITY_LEGENDARY = 5, //ORANGE
ITEM_QUALITY_ARTIFACT = 6 //LIGHT YELLOW ITEM_QUALITY_ARTIFACT = 6, //LIGHT YELLOW
ITEM_QUALITY_HEIRLOOM = 7
}; };
enum sheathTypes enum sheathTypes
@ -209,7 +210,7 @@ enum SpellEffects
SPELL_EFFECT_TELEPORT_UNITS = 5, SPELL_EFFECT_TELEPORT_UNITS = 5,
SPELL_EFFECT_APPLY_AURA = 6, SPELL_EFFECT_APPLY_AURA = 6,
SPELL_EFFECT_ENVIRONMENTAL_DAMAGE = 7, SPELL_EFFECT_ENVIRONMENTAL_DAMAGE = 7,
SPELL_EFFECT_MANA_DRAIN = 8, SPELL_EFFECT_POWER_DRAIN = 8,
SPELL_EFFECT_HEALTH_LEECH = 9, SPELL_EFFECT_HEALTH_LEECH = 9,
SPELL_EFFECT_HEAL = 10, SPELL_EFFECT_HEAL = 10,
SPELL_EFFECT_BIND = 11, SPELL_EFFECT_BIND = 11,
@ -236,7 +237,7 @@ enum SpellEffects
SPELL_EFFECT_TRIGGER_MISSILE = 32, SPELL_EFFECT_TRIGGER_MISSILE = 32,
SPELL_EFFECT_OPEN_LOCK = 33, SPELL_EFFECT_OPEN_LOCK = 33,
SPELL_EFFECT_SUMMON_CHANGE_ITEM = 34, SPELL_EFFECT_SUMMON_CHANGE_ITEM = 34,
SPELL_EFFECT_APPLY_AREA_AURA = 35, SPELL_EFFECT_APPLY_AREA_AURA_PARTY = 35,
SPELL_EFFECT_LEARN_SPELL = 36, SPELL_EFFECT_LEARN_SPELL = 36,
SPELL_EFFECT_SPELL_DEFENSE = 37, SPELL_EFFECT_SPELL_DEFENSE = 37,
SPELL_EFFECT_DISPEL = 38, SPELL_EFFECT_DISPEL = 38,
@ -246,12 +247,11 @@ enum SpellEffects
SPELL_EFFECT_SUMMON_GUARDIAN = 42, SPELL_EFFECT_SUMMON_GUARDIAN = 42,
SPELL_EFFECT_TELEPORT_UNITS_FACE_CASTER= 43, SPELL_EFFECT_TELEPORT_UNITS_FACE_CASTER= 43,
SPELL_EFFECT_SKILL_STEP = 44, SPELL_EFFECT_SKILL_STEP = 44,
SPELL_EFFECT_UNDEFINED_45 = 45, SPELL_EFFECT_ADD_HONOR = 45,
SPELL_EFFECT_SPAWN = 46, SPELL_EFFECT_SPAWN = 46,
SPELL_EFFECT_TRADE_SKILL = 47, SPELL_EFFECT_TRADE_SKILL = 47,
SPELL_EFFECT_STEALTH = 48, SPELL_EFFECT_STEALTH = 48,
SPELL_EFFECT_DETECT = 49, SPELL_EFFECT_DETECT = 49,
// SPELL_EFFECT_SUMMON_OBJECT = 50,
SPELL_EFFECT_TRANS_DOOR = 50, SPELL_EFFECT_TRANS_DOOR = 50,
SPELL_EFFECT_FORCE_CRITICAL_HIT = 51, SPELL_EFFECT_FORCE_CRITICAL_HIT = 51,
SPELL_EFFECT_GUARANTEE_HIT = 52, SPELL_EFFECT_GUARANTEE_HIT = 52,
@ -267,16 +267,16 @@ enum SpellEffects
SPELL_EFFECT_POWER_BURN = 62, SPELL_EFFECT_POWER_BURN = 62,
SPELL_EFFECT_THREAT = 63, SPELL_EFFECT_THREAT = 63,
SPELL_EFFECT_TRIGGER_SPELL = 64, SPELL_EFFECT_TRIGGER_SPELL = 64,
SPELL_EFFECT_HEALTH_FUNNEL = 65, SPELL_EFFECT_APPLY_AREA_AURA_RAID = 65,
SPELL_EFFECT_POWER_FUNNEL = 66, SPELL_EFFECT_CREATE_MANA_GEM = 66,
SPELL_EFFECT_HEAL_MAX_HEALTH = 67, SPELL_EFFECT_HEAL_MAX_HEALTH = 67,
SPELL_EFFECT_INTERRUPT_CAST = 68, SPELL_EFFECT_INTERRUPT_CAST = 68,
SPELL_EFFECT_DISTRACT = 69, SPELL_EFFECT_DISTRACT = 69,
SPELL_EFFECT_PULL = 70, SPELL_EFFECT_PULL = 70,
SPELL_EFFECT_PICKPOCKET = 71, SPELL_EFFECT_PICKPOCKET = 71,
SPELL_EFFECT_ADD_FARSIGHT = 72, SPELL_EFFECT_ADD_FARSIGHT = 72,
SPELL_EFFECT_SUMMON_POSSESSED = 73, SPELL_EFFECT_UNTRAIN_TALENTS = 73,
SPELL_EFFECT_SUMMON_TOTEM = 74, SPELL_EFFECT_APPLY_GLYPH = 74,
SPELL_EFFECT_HEAL_MECHANICAL = 75, SPELL_EFFECT_HEAL_MECHANICAL = 75,
SPELL_EFFECT_SUMMON_OBJECT_WILD = 76, SPELL_EFFECT_SUMMON_OBJECT_WILD = 76,
SPELL_EFFECT_SCRIPT_EFFECT = 77, SPELL_EFFECT_SCRIPT_EFFECT = 77,
@ -289,10 +289,10 @@ enum SpellEffects
SPELL_EFFECT_STUCK = 84, SPELL_EFFECT_STUCK = 84,
SPELL_EFFECT_SUMMON_PLAYER = 85, SPELL_EFFECT_SUMMON_PLAYER = 85,
SPELL_EFFECT_ACTIVATE_OBJECT = 86, SPELL_EFFECT_ACTIVATE_OBJECT = 86,
SPELL_EFFECT_SUMMON_TOTEM_SLOT1 = 87, SPELL_EFFECT_WMO_DAMAGE = 87,
SPELL_EFFECT_SUMMON_TOTEM_SLOT2 = 88, SPELL_EFFECT_WMO_REPAIR = 88,
SPELL_EFFECT_SUMMON_TOTEM_SLOT3 = 89, SPELL_EFFECT_WMO_CHANGE = 89,
SPELL_EFFECT_SUMMON_TOTEM_SLOT4 = 90, SPELL_EFFECT_KILL_CREDIT = 90,
SPELL_EFFECT_THREAT_ALL = 91, SPELL_EFFECT_THREAT_ALL = 91,
SPELL_EFFECT_ENCHANT_HELD_ITEM = 92, SPELL_EFFECT_ENCHANT_HELD_ITEM = 92,
SPELL_EFFECT_SUMMON_PHANTASM = 93, SPELL_EFFECT_SUMMON_PHANTASM = 93,
@ -321,38 +321,48 @@ enum SpellEffects
SPELL_EFFECT_SKIN_PLAYER_CORPSE = 116, SPELL_EFFECT_SKIN_PLAYER_CORPSE = 116,
SPELL_EFFECT_SPIRIT_HEAL = 117, SPELL_EFFECT_SPIRIT_HEAL = 117,
SPELL_EFFECT_SKILL = 118, SPELL_EFFECT_SKILL = 118,
SPELL_EFFECT_APPLY_AURA_NEW = 119, SPELL_EFFECT_APPLY_AREA_AURA_PET = 119,
SPELL_EFFECT_TELEPORT_GRAVEYARD = 120, SPELL_EFFECT_TELEPORT_GRAVEYARD = 120,
SPELL_EFFECT_NORMALIZED_WEAPON_DMG = 121, SPELL_EFFECT_NORMALIZED_WEAPON_DMG = 121,
SPELL_EFFECT_122 = 122, SPELL_EFFECT_122 = 122,
SPELL_EFFECT_123 = 123, SPELL_EFFECT_SEND_TAXI = 123,
SPELL_EFFECT_124 = 124, SPELL_EFFECT_PLAYER_PULL = 124,
SPELL_EFFECT_REDUCE_THREAT_PERCENT = 125, SPELL_EFFECT_MODIFY_THREAT_PERCENT = 125,
SPELL_EFFECT_126 = 126, SPELL_EFFECT_STEAL_BENEFICIAL_BUFF = 126,
SPELL_EFFECT_PROSPECTING = 127, SPELL_EFFECT_PROSPECTING = 127,
SPELL_EFFECT_128 = 128, SPELL_EFFECT_APPLY_AREA_AURA_FRIEND = 128,
SPELL_EFFECT_129 = 129, SPELL_EFFECT_APPLY_AREA_AURA_ENEMY = 129,
SPELL_EFFECT_130 = 130, SPELL_EFFECT_REDIRECT_THREAT = 130,
SPELL_EFFECT_131 = 131, SPELL_EFFECT_131 = 131,
SPELL_EFFECT_132 = 132, SPELL_EFFECT_132 = 132,
SPELL_EFFECT_133 = 133, SPELL_EFFECT_UNLEARN_SPECIALIZATION = 133,
SPELL_EFFECT_134 = 134, SPELL_EFFECT_KILL_CREDIT2 = 134,
SPELL_EFFECT_135 = 135, SPELL_EFFECT_135 = 135,
SPELL_EFFECT_136 = 136, SPELL_EFFECT_HEAL_PCT = 136,
SPELL_EFFECT_137 = 137, SPELL_EFFECT_ENERGIZE_PCT = 137,
SPELL_EFFECT_138 = 138, SPELL_EFFECT_138 = 138,
SPELL_EFFECT_139 = 139, SPELL_EFFECT_CLEAR_QUEST = 139,
SPELL_EFFECT_140 = 140, SPELL_EFFECT_FORCE_CAST = 140,
SPELL_EFFECT_141 = 141, SPELL_EFFECT_141 = 141,
SPELL_EFFECT_142 = 142, SPELL_EFFECT_TRIGGER_SPELL_WITH_VALUE = 142,
SPELL_EFFECT_143 = 143, SPELL_EFFECT_APPLY_AREA_AURA_OWNER = 143,
SPELL_EFFECT_144 = 144, SPELL_EFFECT_144 = 144,
SPELL_EFFECT_145 = 145, SPELL_EFFECT_145 = 145,
SPELL_EFFECT_146 = 146, SPELL_EFFECT_ACTIVATE_RUNE = 146,
SPELL_EFFECT_147 = 147, SPELL_EFFECT_QUEST_FAIL = 147,
SPELL_EFFECT_148 = 148, SPELL_EFFECT_148 = 148,
SPELL_EFFECT_149 = 149, SPELL_EFFECT_149 = 149,
TOTAL_SPELL_EFFECTS = 150 SPELL_EFFECT_150 = 150,
SPELL_EFFECT_TRIGGER_SPELL_2 = 151,
SPELL_EFFECT_152 = 152,
SPELL_EFFECT_153 = 153,
SPELL_EFFECT_154 = 154,
SPELL_EFFECT_TITAN_GRIP = 155,
SPELL_EFFECT_ADD_SOCKET = 156,
SPELL_EFFECT_157 = 157,
SPELL_EFFECT_MILLING = 158,
SPELL_EFFECT_ALLOW_RENAME_PET = 159,
TOTAL_SPELL_EFFECTS = 160
}; };
enum CharacterStates enum CharacterStates
@ -404,7 +414,8 @@ enum GameobjectTypes
GAMEOBJECT_TYPE_DO_NOT_USE_YET = 32, GAMEOBJECT_TYPE_DO_NOT_USE_YET = 32,
GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING = 33, GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING = 33,
GAMEOBJECT_TYPE_GUILD_BANK = 34, GAMEOBJECT_TYPE_GUILD_BANK = 34,
MAX_GAMEOBJECT_TYPE = 35 // sending to client this or greater value can crash client. GAMEOBJECT_TYPE_TRAPDOOR = 35,
MAX_GAMEOBJECT_TYPE = 36 // sending to client this or greater value can crash client.
}; };
enum TextEmote enum TextEmote
@ -924,7 +935,9 @@ enum LockType
LOCKTYPE_BLASTING = 16, LOCKTYPE_BLASTING = 16,
LOCKTYPE_SLOW_OPEN = 17, LOCKTYPE_SLOW_OPEN = 17,
LOCKTYPE_SLOW_CLOSE = 18, LOCKTYPE_SLOW_CLOSE = 18,
LOCKTYPE_FISHING = 19 LOCKTYPE_FISHING = 19,
LOCKTYPE_INSCRIPTION = 20,
LOCKTYPE_OPEN_FROM_VEHICLE = 21
}; };
enum TrainerType enum TrainerType
@ -974,7 +987,7 @@ enum CreatureFamily
CREATURE_FAMILY_IMP = 23, CREATURE_FAMILY_IMP = 23,
CREATURE_FAMILY_BAT = 24, CREATURE_FAMILY_BAT = 24,
CREATURE_FAMILY_HYENA = 25, CREATURE_FAMILY_HYENA = 25,
CREATURE_FAMILY_OWL = 26, CREATURE_FAMILY_BIRD_OF_PREY = 26,
CREATURE_FAMILY_WIND_SERPENT = 27, CREATURE_FAMILY_WIND_SERPENT = 27,
CREATURE_FAMILY_REMOTE_CONTROL = 28, CREATURE_FAMILY_REMOTE_CONTROL = 28,
CREATURE_FAMILY_FELGUARD = 29, CREATURE_FAMILY_FELGUARD = 29,
@ -984,7 +997,17 @@ enum CreatureFamily
CREATURE_FAMILY_SPOREBAT = 33, CREATURE_FAMILY_SPOREBAT = 33,
CREATURE_FAMILY_NETHER_RAY = 34, CREATURE_FAMILY_NETHER_RAY = 34,
CREATURE_FAMILY_SERPENT = 35, CREATURE_FAMILY_SERPENT = 35,
CREATURE_FAMILY_SEA_LION = 36 CREATURE_FAMILY_SEA_LION = 36,
CREATURE_FAMILY_MOTH = 37,
CREATURE_FAMILY_CHIMAERA = 38,
CREATURE_FAMILY_DEVILSAUR = 39,
CREATURE_FAMILY_GHOUL = 40,
CREATURE_FAMILY_SILITHID = 41,
CREATURE_FAMILY_WORM = 42,
CREATURE_FAMILY_RHINO = 43,
CREATURE_FAMILY_WASP = 44,
CREATURE_FAMILY_CORE_HOUND = 45,
CREATURE_FAMILY_SPIRIT_BEAST = 46
}; };
enum CreatureEliteType enum CreatureEliteType
@ -1007,7 +1030,9 @@ enum QuestTypes
QUEST_TYPE_LEGENDARY = 83, QUEST_TYPE_LEGENDARY = 83,
QUEST_TYPE_ESCORT = 84, QUEST_TYPE_ESCORT = 84,
QUEST_TYPE_HEROIC = 85, QUEST_TYPE_HEROIC = 85,
QUEST_TYPE_DAILY = 87 QUEST_TYPE_DAILY = 87,
QUEST_TYPE_RAID_10 = 88,
QUEST_TYPE_RAID_25 = 89
}; };
enum CreatureType enum CreatureType
@ -1032,7 +1057,7 @@ enum QuestSort
QUEST_SORT_SEASONAL = 22, QUEST_SORT_SEASONAL = 22,
QUEST_SORT_UNDERCITY_OLD = 23, QUEST_SORT_UNDERCITY_OLD = 23,
QUEST_SORT_HERBALISM = 24, QUEST_SORT_HERBALISM = 24,
QUEST_SORT_SCARLET_MONASTERY_OLD= 25, QUEST_SORT_BATTLEGROUNDS = 25,
QUEST_SORT_ULDAMN_OLD = 41, QUEST_SORT_ULDAMN_OLD = 41,
QUEST_SORT_WARLOCK = 61, QUEST_SORT_WARLOCK = 61,
QUEST_SORT_WARRIOR = 81, QUEST_SORT_WARRIOR = 81,
@ -1060,7 +1085,11 @@ enum QuestSort
QUEST_SORT_LUNAR_FESTIVAL = 366, QUEST_SORT_LUNAR_FESTIVAL = 366,
QUEST_SORT_REPUTATION = 367, QUEST_SORT_REPUTATION = 367,
QUEST_SORT_INVASION = 368, QUEST_SORT_INVASION = 368,
QUEST_SORT_MIDSUMMER = 369 QUEST_SORT_MIDSUMMER = 369,
QUEST_SORT_BREWFEST = 370,
QUEST_SORT_INSCRIPTION = 371,
QUEST_SORT_DEATH_KNIGHT = 372,
QUEST_SORT_JEWELCRAFTING = 373
}; };
enum SkillType enum SkillType
@ -1070,7 +1099,6 @@ enum SkillType
SKILL_ARMS = 26, SKILL_ARMS = 26,
SKILL_COMBAT = 38, SKILL_COMBAT = 38,
SKILL_SUBTLETY = 39, SKILL_SUBTLETY = 39,
SKILL_POISONS = 40,
SKILL_SWORDS = 43, SKILL_SWORDS = 43,
SKILL_AXES = 44, SKILL_AXES = 44,
SKILL_BOWS = 45, SKILL_BOWS = 45,
@ -1078,8 +1106,8 @@ enum SkillType
SKILL_BEAST_MASTERY = 50, SKILL_BEAST_MASTERY = 50,
SKILL_SURVIVAL = 51, SKILL_SURVIVAL = 51,
SKILL_MACES = 54, SKILL_MACES = 54,
SKILL_HOLY = 56,
SKILL_2H_SWORDS = 55, SKILL_2H_SWORDS = 55,
SKILL_HOLY = 56,
SKILL_SHADOW = 78, SKILL_SHADOW = 78,
SKILL_DEFENSE = 95, SKILL_DEFENSE = 95,
SKILL_LANG_COMMON = 98, SKILL_LANG_COMMON = 98,
@ -1135,24 +1163,20 @@ enum SkillType
SKILL_PET_BOAR = 211, SKILL_PET_BOAR = 211,
SKILL_PET_CROCILISK = 212, SKILL_PET_CROCILISK = 212,
SKILL_PET_CARRION_BIRD = 213, SKILL_PET_CARRION_BIRD = 213,
SKILL_PET_GORILLA = 215,
SKILL_PET_CRAB = 214, SKILL_PET_CRAB = 214,
SKILL_PET_GORILLA = 215,
SKILL_PET_RAPTOR = 217, SKILL_PET_RAPTOR = 217,
SKILL_PET_TALLSTRIDER = 218, SKILL_PET_TALLSTRIDER = 218,
SKILL_RACIAL_UNDED = 220, SKILL_RACIAL_UNDED = 220,
SKILL_WEAPON_TALENTS = 222,
SKILL_CROSSBOWS = 226, SKILL_CROSSBOWS = 226,
SKILL_SPEARS = 227,
SKILL_WANDS = 228, SKILL_WANDS = 228,
SKILL_POLEARMS = 229, SKILL_POLEARMS = 229,
SKILL_PET_SCORPID = 236, SKILL_PET_SCORPID = 236,
SKILL_ARCANE = 237, SKILL_ARCANE = 237,
SKILL_OPEN_LOCK = 242,
SKILL_PET_TURTLE = 251, SKILL_PET_TURTLE = 251,
SKILL_ASSASSINATION = 253, SKILL_ASSASSINATION = 253,
SKILL_FURY = 256, SKILL_FURY = 256,
SKILL_PROTECTION = 257, SKILL_PROTECTION = 257,
SKILL_BEAST_TRAINING = 261,
SKILL_PROTECTION2 = 267, SKILL_PROTECTION2 = 267,
SKILL_PET_TALENTS = 270, SKILL_PET_TALENTS = 270,
SKILL_PLATE_MAIL = 293, SKILL_PLATE_MAIL = 293,
@ -1182,7 +1206,7 @@ enum SkillType
SKILL_LOCKPICKING = 633, SKILL_LOCKPICKING = 633,
SKILL_PET_BAT = 653, SKILL_PET_BAT = 653,
SKILL_PET_HYENA = 654, SKILL_PET_HYENA = 654,
SKILL_PET_OWL = 655, SKILL_PET_BIRD_OF_PREY = 655,
SKILL_PET_WIND_SERPENT = 656, SKILL_PET_WIND_SERPENT = 656,
SKILL_LANG_GUTTERSPEAK = 673, SKILL_LANG_GUTTERSPEAK = 673,
SKILL_RIDING_KODO = 713, SKILL_RIDING_KODO = 713,
@ -1201,7 +1225,25 @@ enum SkillType
SKILL_PET_SPOREBAT = 765, SKILL_PET_SPOREBAT = 765,
SKILL_PET_WARP_STALKER = 766, SKILL_PET_WARP_STALKER = 766,
SKILL_PET_RAVAGER = 767, SKILL_PET_RAVAGER = 767,
SKILL_PET_SERPENT = 768 SKILL_PET_SERPENT = 768,
SKILL_INTERNAL = 769,
SKILL_DK_BLOOD = 770,
SKILL_DK_FROST = 771,
SKILL_DK_UNHOLY = 772,
SKILL_INSCRIPTION = 773,
SKILL_PET_MOTH = 775,
SKILL_RUNEFORGING = 776,
SKILL_MOUNTS = 777,
SKILL_COMPANIONS = 778,
SKILL_PET_EXOTIC_CHIMAERA = 780,
SKILL_PET_EXOTIC_DEVILSAUR = 781,
SKILL_PET_GHOUL = 782,
SKILL_PET_EXOTIC_SILITHID = 783,
SKILL_PET_EXOTIC_WORM = 784,
SKILL_PET_WASP = 785,
SKILL_PET_EXOTIC_RHINO = 786,
SKILL_PET_EXOTIC_CORE_HOUND = 787,
SKILL_PET_EXOTIC_SPIRIT_BEAST = 788
}; };
@ -1219,7 +1261,7 @@ enum SkillCategory
enum TotemCategory enum TotemCategory
{ {
TC_SKINNING_SKIFE = 1, TC_SKINNING_SKIFE_OLD = 1,
TC_EARTH_TOTEM = 2, TC_EARTH_TOTEM = 2,
TC_AIR_TOTEM = 3, TC_AIR_TOTEM = 3,
TC_FIRE_TOTEM = 4, TC_FIRE_TOTEM = 4,
@ -1229,15 +1271,28 @@ enum TotemCategory
TC_GOLDEN_ROD = 8, TC_GOLDEN_ROD = 8,
TC_TRUESILVER_ROD = 9, TC_TRUESILVER_ROD = 9,
TC_ARCANITE_ROD = 10, TC_ARCANITE_ROD = 10,
TC_MINING_PICK = 11, TC_MINING_PICK_OLD = 11,
TC_PHILOSOPHERS_STONE = 12, TC_PHILOSOPHERS_STONE = 12,
TC_BLACKSMITH_HAMMER = 13, TC_BLACKSMITH_HAMMER_OLD = 13,
TC_ARCLIGHT_SPANNER = 14, TC_ARCLIGHT_SPANNER = 14,
TC_GYROMATIC_MA = 15, TC_GYROMATIC_MA = 15,
TC_MASTER_TOTEM = 21, TC_MASTER_TOTEM = 21,
TC_FEL_IRON_ROD = 41, TC_FEL_IRON_ROD = 41,
TC_ADAMANTITE_ROD = 62, TC_ADAMANTITE_ROD = 62,
TC_ETERNIUM_ROD = 63 TC_ETERNIUM_ROD = 63,
TC_HOLLOW_QUILL = 81,
TC_RUNED_AZURITE_ROD = 101,
TC_VIRTUOSO_INKING_SET = 121,
TC_DRUMS = 141,
TC_GNOMISH_ARMY_KNIFE = 161,
TC_BLACKSMITH_HAMMER = 162,
TC_MINING_PICK = 165,
TC_SKINNING_KNIFE = 166,
TC_HAMMER_PICK = 167,
TC_BLADED_PICKAXE = 168,
TC_FLINT_AND_TINDER = 169,
TC_RUNED_COBALT_ROD = 189,
TC_RUNED_TITANIUM_ROD = 190
}; };
enum UnitDynFlags enum UnitDynFlags
@ -1247,7 +1302,8 @@ enum UnitDynFlags
UNIT_DYNFLAG_OTHER_TAGGER = 0x0004, UNIT_DYNFLAG_OTHER_TAGGER = 0x0004,
UNIT_DYNFLAG_ROOTED = 0x0008, UNIT_DYNFLAG_ROOTED = 0x0008,
UNIT_DYNFLAG_SPECIALINFO = 0x0010, UNIT_DYNFLAG_SPECIALINFO = 0x0010,
UNIT_DYNFLAG_DEAD = 0x0020 UNIT_DYNFLAG_DEAD = 0x0020,
UNIT_DYNFLAG_REFER_A_FRIEND = 0x0040
}; };
enum UnitFlags1 enum UnitFlags1
@ -1310,6 +1366,9 @@ enum ChatMsg
CHAT_MSG_BATTLEGROUND = 0x2C, CHAT_MSG_BATTLEGROUND = 0x2C,
CHAT_MSG_BATTLEGROUND_LEADER = 0x2D, CHAT_MSG_BATTLEGROUND_LEADER = 0x2D,
CHAT_MSG_RESTRICTED = 0x2E, CHAT_MSG_RESTRICTED = 0x2E,
CHAT_MSG_BN = 0x2F,
CHAT_MSG_ACHIEVEMENT = 0x30,
CHAT_MSG_GUILD_ACHIEVEMENT = 0x31
}; };
enum SpellCastTargetFlags enum SpellCastTargetFlags

View File

@ -13,7 +13,8 @@ enum UnitMoveType
MOVE_TURN = 5, MOVE_TURN = 5,
MOVE_FLY = 6, MOVE_FLY = 6,
MOVE_FLYBACK = 7, MOVE_FLYBACK = 7,
MAX_MOVE_TYPE = 8 MOVE_PITCH_RATE = 8,
MAX_MOVE_TYPE = 9
}; };
enum UnitFlags enum UnitFlags

View File

@ -37,11 +37,12 @@ void WorldSession::_HandleCompressedUpdateObjectOpcode(WorldPacket& recvPacket)
void WorldSession::_HandleUpdateObjectOpcode(WorldPacket& recvPacket) void WorldSession::_HandleUpdateObjectOpcode(WorldPacket& recvPacket)
{ {
uint8 utype; uint8 utype;
uint8 hasTransport; //uint8 hasTransport;
uint32 usize, ublocks, readblocks=0; uint32 usize, ublocks, readblocks=0;
uint64 uguid; uint64 uguid;
recvPacket >> ublocks >> hasTransport; recvPacket >> ublocks; // >> hasTransport;
logdev("UpdateObject: blocks = %u, hasTransport = %u", ublocks, hasTransport); //logdev("UpdateObject: blocks = %u, hasTransport = %u", ublocks, hasTransport);
logdev("UpdateObject: blocks = %u", ublocks);
while((recvPacket.rpos() < recvPacket.size())&& (readblocks < ublocks)) while((recvPacket.rpos() < recvPacket.size())&& (readblocks < ublocks))
{ {
recvPacket >> utype; recvPacket >> utype;
@ -237,7 +238,7 @@ void WorldSession::_MovementUpdate(uint8 objtypeid, uint64 uguid, WorldPacket& r
uint8 flags; uint8 flags;
float unkfx,unkfy,unkfz; float unkfx,unkfy,unkfz;
// uint64 fullguid; // see below // uint64 fullguid; // see below
float speedWalk, speedRun, speedSwimBack, speedSwim, speedWalkBack, speedTurn, speedFly, speedFlyBack; float speedWalk, speedRun, speedSwimBack, speedSwim, speedWalkBack, speedTurn, speedFly, speedFlyBack, speedPitchRate;
uint32 unk32; uint32 unk32;
Object *obj = (Object*)objmgr.GetObj(uguid, true); // also depleted objects Object *obj = (Object*)objmgr.GetObj(uguid, true); // also depleted objects
@ -259,7 +260,7 @@ void WorldSession::_MovementUpdate(uint8 objtypeid, uint64 uguid, WorldPacket& r
mi.flags = 0; // not sure if its correct to set it to 0 (needs some starting flag?) mi.flags = 0; // not sure if its correct to set it to 0 (needs some starting flag?)
if(flags & UPDATEFLAG_LIVING) if(flags & UPDATEFLAG_LIVING)
{ {
recvPacket >> mi.flags >> mi.unk1 >> mi.time; recvPacket >> mi.flags >> mi.unkFlags >> mi.time;
} }
else else
{ {
@ -268,7 +269,7 @@ void WorldSession::_MovementUpdate(uint8 objtypeid, uint64 uguid, WorldPacket& r
logdev("MovementUpdate: TypeID=%u GUID="I64FMT" pObj=%X flags=%u mi.flags=%u",objtypeid,uguid,obj,flags,mi.flags); logdev("MovementUpdate: TypeID=%u GUID="I64FMT" pObj=%X flags=%u mi.flags=%u",objtypeid,uguid,obj,flags,mi.flags);
if(flags & UPDATEFLAG_HASPOSITION) if(flags & UPDATEFLAG_HAS_POSITION)
{ {
if(flags & UPDATEFLAG_TRANSPORT) if(flags & UPDATEFLAG_TRANSPORT)
{ {
@ -290,10 +291,11 @@ void WorldSession::_MovementUpdate(uint8 objtypeid, uint64 uguid, WorldPacket& r
{ {
recvPacket >> mi.t_guid >> mi.t_x >> mi.t_y >> mi.t_z >> mi.t_o; recvPacket >> mi.t_guid >> mi.t_x >> mi.t_y >> mi.t_z >> mi.t_o;
recvPacket >> mi.t_time; // added in 2.0.3 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); 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);
} }
if(mi.flags & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_UNK5)) if((mi.flags & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_UNK5)) || (mi.unkFlags & 0x20))
{ {
recvPacket >> mi.s_angle; recvPacket >> mi.s_angle;
logdev("MovementUpdate: MOVEMENTFLAG_SWIMMING is set, angle = %f!", mi.s_angle); logdev("MovementUpdate: MOVEMENTFLAG_SWIMMING is set, angle = %f!", mi.s_angle);
@ -317,6 +319,7 @@ void WorldSession::_MovementUpdate(uint8 objtypeid, uint64 uguid, WorldPacket& r
recvPacket >> speedWalk >> speedRun >> speedSwimBack >> speedSwim; // speedRun can also be mounted speed if player is mounted recvPacket >> speedWalk >> speedRun >> speedSwimBack >> speedSwim; // speedRun can also be mounted speed if player is mounted
recvPacket >> speedWalkBack >> speedFly >> speedFlyBack >> speedTurn; // fly added in 2.0.x recvPacket >> speedWalkBack >> speedFly >> speedFlyBack >> speedTurn; // fly added in 2.0.x
recvPacket >> speedPitchRate;
logdev("MovementUpdate: Got speeds, walk=%f run=%f turn=%f", speedWalk, speedRun, speedTurn); logdev("MovementUpdate: Got speeds, walk=%f run=%f turn=%f", speedWalk, speedRun, speedTurn);
if(u) if(u)
{ {
@ -329,6 +332,7 @@ void WorldSession::_MovementUpdate(uint8 objtypeid, uint64 uguid, WorldPacket& r
u->SetSpeed(MOVE_TURN, speedTurn); u->SetSpeed(MOVE_TURN, speedTurn);
u->SetSpeed(MOVE_FLY, speedFly); u->SetSpeed(MOVE_FLY, speedFly);
u->SetSpeed(MOVE_FLYBACK, speedFlyBack); u->SetSpeed(MOVE_FLYBACK, speedFlyBack);
u->SetSpeed(MOVE_PITCH_RATE, speedPitchRate);
} }
// TODO: correct this one as soon as its meaning is known OR if it appears often and needs to be fixed // TODO: correct this one as soon as its meaning is known OR if it appears often and needs to be fixed
@ -353,7 +357,7 @@ void WorldSession::_MovementUpdate(uint8 objtypeid, uint64 uguid, WorldPacket& r
logdev("MovementUpdate: UPDATEFLAG_HIGHGUID is set, got %X", unk32); logdev("MovementUpdate: UPDATEFLAG_HIGHGUID is set, got %X", unk32);
} }
if(flags & UPDATEFLAG_FULLGUID) if(flags & UPDATEFLAG_HAS_TARGET)
{ {
uint64 unkguid = recvPacket.GetPackedGuid(); // MaNGOS sends uint8(0) always, but its probably be a packed guid uint64 unkguid = recvPacket.GetPackedGuid(); // MaNGOS sends uint8(0) always, but its probably be a packed guid
logdev("MovementUpdate: UPDATEFLAG_FULLGUID is set, got "I64FMT, unkguid); logdev("MovementUpdate: UPDATEFLAG_FULLGUID is set, got "I64FMT, unkguid);
@ -365,6 +369,13 @@ void WorldSession::_MovementUpdate(uint8 objtypeid, uint64 uguid, WorldPacket& r
logdev("MovementUpdate: UPDATEFLAG_TRANSPORT is set, got %u", unk32); logdev("MovementUpdate: UPDATEFLAG_TRANSPORT is set, got %u", unk32);
} }
if(flags & UPDATEFLAG_VEHICLE) // unused for now
{
uint32 vehicleId;
float facingAdj;
recvPacket >> vehicleId >> facingAdj;
}
} }
void WorldSession::_ValuesUpdate(uint64 uguid, WorldPacket& recvPacket) void WorldSession::_ValuesUpdate(uint64 uguid, WorldPacket& recvPacket)
@ -531,8 +542,8 @@ bool IsFloatField(uint8 ty, uint32 f)
(uint32)PLAYER_FROST_SPELL_CRIT_PERCENTAGE, (uint32)PLAYER_FROST_SPELL_CRIT_PERCENTAGE,
(uint32)PLAYER_SHADOW_SPELL_CRIT_PERCENTAGE, (uint32)PLAYER_SHADOW_SPELL_CRIT_PERCENTAGE,
(uint32)PLAYER_ARCANE_SPELL_CRIT_PERCENTAGE, (uint32)PLAYER_ARCANE_SPELL_CRIT_PERCENTAGE,
(uint32)PLAYER_FIELD_MOD_MANA_REGEN, /*(uint32)PLAYER_FIELD_MOD_MANA_REGEN,
(uint32)PLAYER_FIELD_MOD_MANA_REGEN_INTERRUPT, (uint32)PLAYER_FIELD_MOD_MANA_REGEN_INTERRUPT,*/
(uint32)-1 (uint32)-1
}; };
static uint32 floats_gameobject[] = static uint32 floats_gameobject[] =

View File

@ -16,11 +16,12 @@ enum OBJECT_UPDATE_FLAGS
UPDATEFLAG_NONE = 0x00, UPDATEFLAG_NONE = 0x00,
UPDATEFLAG_SELF = 0x01, UPDATEFLAG_SELF = 0x01,
UPDATEFLAG_TRANSPORT = 0x02, UPDATEFLAG_TRANSPORT = 0x02,
UPDATEFLAG_FULLGUID = 0x04, UPDATEFLAG_HAS_TARGET = 0x04,
UPDATEFLAG_LOWGUID = 0x08, UPDATEFLAG_LOWGUID = 0x08,
UPDATEFLAG_HIGHGUID = 0x10, UPDATEFLAG_HIGHGUID = 0x10,
UPDATEFLAG_LIVING = 0x20, UPDATEFLAG_LIVING = 0x20,
UPDATEFLAG_HASPOSITION = 0x40 UPDATEFLAG_HAS_POSITION = 0x40,
UPDATEFLAG_VEHICLE = 0x80
}; };
enum MovementFlags enum MovementFlags
@ -58,13 +59,14 @@ struct MovementInfo
{ {
// common // common
uint32 flags; uint32 flags;
uint8 unk1; uint16 unkFlags;
uint32 time; uint32 time;
float x, y, z, o; float x, y, z, o;
// transport // transport
uint64 t_guid; uint64 t_guid;
float t_x, t_y, t_z, t_o; float t_x, t_y, t_z, t_o;
uint32 t_time; uint32 t_time;
uint8 t_seat;
// swimming and unk // swimming and unk
float s_angle; float s_angle;
// last fall time // last fall time
@ -76,8 +78,8 @@ struct MovementInfo
MovementInfo() MovementInfo()
{ {
flags = time = t_time = fallTime = 0; flags = time = t_time = fallTime = unkFlags = 0;
unk1 = 0; t_seat = 0;
x = y = z = o = t_x = t_y = t_z = t_o = s_angle = j_unk = j_sinAngle = j_cosAngle = j_xyspeed = u_unk1 = 0.0f; x = y = z = o = t_x = t_y = t_z = t_o = s_angle = j_unk = j_sinAngle = j_cosAngle = j_xyspeed = u_unk1 = 0.0f;
t_guid = 0; t_guid = 0;
} }

View File

@ -19,7 +19,7 @@
#ifndef _UPDATEFIELDS_AUTO_H #ifndef _UPDATEFIELDS_AUTO_H
#define _UPDATEFIELDS_AUTO_H #define _UPDATEFIELDS_AUTO_H
// Auto generated for version 2, 4, 3, 8606 // Auto generated for version 3, 0, 3, 9183
enum EObjectFields enum EObjectFields
{ {
@ -41,13 +41,37 @@ enum EItemFields
ITEM_FIELD_DURATION = OBJECT_END + 0x0009, // 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_SPELL_CHARGES = OBJECT_END + 0x000A, // Size: 5, Type: INT, Flags: OWNER_ONLY, UNK2
ITEM_FIELD_FLAGS = OBJECT_END + 0x000F, // Size: 1, Type: INT, Flags: PUBLIC ITEM_FIELD_FLAGS = OBJECT_END + 0x000F, // Size: 1, Type: INT, Flags: PUBLIC
ITEM_FIELD_ENCHANTMENT = OBJECT_END + 0x0010, // Size: 33, Type: INT, Flags: PUBLIC ITEM_FIELD_ENCHANTMENT_1_1 = OBJECT_END + 0x0010, // Size: 2, Type: INT, Flags: PUBLIC
ITEM_FIELD_PROPERTY_SEED = OBJECT_END + 0x0031, // Size: 1, Type: INT, Flags: PUBLIC ITEM_FIELD_ENCHANTMENT_1_3 = OBJECT_END + 0x0012, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
ITEM_FIELD_RANDOM_PROPERTIES_ID = OBJECT_END + 0x0032, // Size: 1, Type: INT, Flags: PUBLIC ITEM_FIELD_ENCHANTMENT_2_1 = OBJECT_END + 0x0013, // Size: 2, Type: INT, Flags: PUBLIC
ITEM_FIELD_ITEM_TEXT_ID = OBJECT_END + 0x0033, // Size: 1, Type: INT, Flags: OWNER_ONLY ITEM_FIELD_ENCHANTMENT_2_3 = OBJECT_END + 0x0015, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
ITEM_FIELD_DURABILITY = OBJECT_END + 0x0034, // Size: 1, Type: INT, Flags: OWNER_ONLY, UNK2 ITEM_FIELD_ENCHANTMENT_3_1 = OBJECT_END + 0x0016, // Size: 2, Type: INT, Flags: PUBLIC
ITEM_FIELD_MAXDURABILITY = OBJECT_END + 0x0035, // Size: 1, Type: INT, Flags: OWNER_ONLY, UNK2 ITEM_FIELD_ENCHANTMENT_3_3 = OBJECT_END + 0x0018, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
ITEM_END = OBJECT_END + 0x0036, ITEM_FIELD_ENCHANTMENT_4_1 = OBJECT_END + 0x0019, // Size: 2, Type: INT, Flags: PUBLIC
ITEM_FIELD_ENCHANTMENT_4_3 = OBJECT_END + 0x001B, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
ITEM_FIELD_ENCHANTMENT_5_1 = OBJECT_END + 0x001C, // Size: 2, Type: INT, Flags: PUBLIC
ITEM_FIELD_ENCHANTMENT_5_3 = OBJECT_END + 0x001E, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
ITEM_FIELD_ENCHANTMENT_6_1 = OBJECT_END + 0x001F, // Size: 2, Type: INT, Flags: PUBLIC
ITEM_FIELD_ENCHANTMENT_6_3 = OBJECT_END + 0x0021, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
ITEM_FIELD_ENCHANTMENT_7_1 = OBJECT_END + 0x0022, // Size: 2, Type: INT, Flags: PUBLIC
ITEM_FIELD_ENCHANTMENT_7_3 = OBJECT_END + 0x0024, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
ITEM_FIELD_ENCHANTMENT_8_1 = OBJECT_END + 0x0025, // Size: 2, Type: INT, Flags: PUBLIC
ITEM_FIELD_ENCHANTMENT_8_3 = OBJECT_END + 0x0027, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
ITEM_FIELD_ENCHANTMENT_9_1 = OBJECT_END + 0x0028, // Size: 2, Type: INT, Flags: PUBLIC
ITEM_FIELD_ENCHANTMENT_9_3 = OBJECT_END + 0x002A, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
ITEM_FIELD_ENCHANTMENT_10_1 = OBJECT_END + 0x002B, // Size: 2, Type: INT, Flags: PUBLIC
ITEM_FIELD_ENCHANTMENT_10_3 = OBJECT_END + 0x002D, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
ITEM_FIELD_ENCHANTMENT_11_1 = OBJECT_END + 0x002E, // Size: 2, Type: INT, Flags: PUBLIC
ITEM_FIELD_ENCHANTMENT_11_3 = OBJECT_END + 0x0030, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
ITEM_FIELD_ENCHANTMENT_12_1 = OBJECT_END + 0x0031, // Size: 2, Type: INT, Flags: PUBLIC
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_PAD = OBJECT_END + 0x0039, // Size: 1, Type: INT, Flags: NONE
ITEM_END = OBJECT_END + 0x003A,
}; };
enum EContainerFields enum EContainerFields
@ -62,93 +86,94 @@ enum EUnitFields
{ {
UNIT_FIELD_CHARM = OBJECT_END + 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC UNIT_FIELD_CHARM = OBJECT_END + 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC
UNIT_FIELD_SUMMON = OBJECT_END + 0x0002, // Size: 2, Type: LONG, Flags: PUBLIC UNIT_FIELD_SUMMON = OBJECT_END + 0x0002, // Size: 2, Type: LONG, Flags: PUBLIC
UNIT_FIELD_CHARMEDBY = OBJECT_END + 0x0004, // Size: 2, Type: LONG, Flags: PUBLIC UNIT_FIELD_CRITTER = OBJECT_END + 0x0004, // Size: 2, Type: LONG, Flags: PRIVATE
UNIT_FIELD_SUMMONEDBY = OBJECT_END + 0x0006, // Size: 2, Type: LONG, Flags: PUBLIC UNIT_FIELD_CHARMEDBY = OBJECT_END + 0x0006, // Size: 2, Type: LONG, Flags: PUBLIC
UNIT_FIELD_CREATEDBY = OBJECT_END + 0x0008, // Size: 2, Type: LONG, Flags: PUBLIC UNIT_FIELD_SUMMONEDBY = OBJECT_END + 0x0008, // Size: 2, Type: LONG, Flags: PUBLIC
UNIT_FIELD_TARGET = OBJECT_END + 0x000A, // Size: 2, Type: LONG, Flags: PUBLIC UNIT_FIELD_CREATEDBY = OBJECT_END + 0x000A, // Size: 2, Type: LONG, Flags: PUBLIC
UNIT_FIELD_PERSUADED = OBJECT_END + 0x000C, // Size: 2, Type: LONG, Flags: PUBLIC UNIT_FIELD_TARGET = OBJECT_END + 0x000C, // Size: 2, Type: LONG, Flags: PUBLIC
UNIT_FIELD_CHANNEL_OBJECT = OBJECT_END + 0x000E, // Size: 2, Type: LONG, Flags: PUBLIC UNIT_FIELD_CHANNEL_OBJECT = OBJECT_END + 0x000E, // Size: 2, Type: LONG, Flags: PUBLIC
UNIT_FIELD_HEALTH = OBJECT_END + 0x0010, // Size: 1, Type: INT, Flags: DYNAMIC UNIT_FIELD_BYTES_0 = OBJECT_END + 0x0010, // Size: 1, Type: BYTES, Flags: PUBLIC
UNIT_FIELD_POWER1 = OBJECT_END + 0x0011, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_HEALTH = OBJECT_END + 0x0011, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_POWER2 = OBJECT_END + 0x0012, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_POWER1 = OBJECT_END + 0x0012, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_POWER3 = OBJECT_END + 0x0013, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_POWER2 = OBJECT_END + 0x0013, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_POWER4 = OBJECT_END + 0x0014, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_POWER3 = OBJECT_END + 0x0014, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_POWER5 = OBJECT_END + 0x0015, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_POWER4 = OBJECT_END + 0x0015, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_MAXHEALTH = OBJECT_END + 0x0016, // Size: 1, Type: INT, Flags: DYNAMIC UNIT_FIELD_POWER5 = OBJECT_END + 0x0016, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_MAXPOWER1 = OBJECT_END + 0x0017, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_POWER6 = OBJECT_END + 0x0017, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_MAXPOWER2 = OBJECT_END + 0x0018, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_POWER7 = OBJECT_END + 0x0018, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_MAXPOWER3 = OBJECT_END + 0x0019, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_MAXHEALTH = OBJECT_END + 0x0019, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_MAXPOWER4 = OBJECT_END + 0x001A, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_MAXPOWER1 = OBJECT_END + 0x001A, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_MAXPOWER5 = OBJECT_END + 0x001B, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_MAXPOWER2 = OBJECT_END + 0x001B, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_LEVEL = OBJECT_END + 0x001C, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_MAXPOWER3 = OBJECT_END + 0x001C, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_FACTIONTEMPLATE = OBJECT_END + 0x001D, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_MAXPOWER4 = OBJECT_END + 0x001D, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_BYTES_0 = OBJECT_END + 0x001E, // Size: 1, Type: BYTES, Flags: PUBLIC UNIT_FIELD_MAXPOWER5 = OBJECT_END + 0x001E, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_VIRTUAL_ITEM_SLOT_DISPLAY = OBJECT_END + 0x001F, // Size: 3, Type: INT, Flags: PUBLIC UNIT_FIELD_MAXPOWER6 = OBJECT_END + 0x001F, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_VIRTUAL_ITEM_INFO = OBJECT_END + 0x0022, // Size: 6, Type: BYTES, Flags: PUBLIC UNIT_FIELD_MAXPOWER7 = OBJECT_END + 0x0020, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_FLAGS = OBJECT_END + 0x0028, // 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_FLAGS_2 = OBJECT_END + 0x0029, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER = OBJECT_END + 0x0028, // Size: 7, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
UNIT_FIELD_AURA = OBJECT_END + 0x002A, // Size: 56, Type: INT, Flags: PUBLIC UNIT_FIELD_LEVEL = OBJECT_END + 0x002F, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_AURAFLAGS = OBJECT_END + 0x0062, // Size: 14, Type: BYTES, Flags: PUBLIC UNIT_FIELD_FACTIONTEMPLATE = OBJECT_END + 0x0030, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_AURALEVELS = OBJECT_END + 0x0070, // Size: 14, Type: BYTES, Flags: PUBLIC UNIT_VIRTUAL_ITEM_SLOT_ID = OBJECT_END + 0x0031, // Size: 3, Type: INT, Flags: PUBLIC
UNIT_FIELD_AURAAPPLICATIONS = OBJECT_END + 0x007E, // Size: 14, Type: BYTES, Flags: PUBLIC UNIT_FIELD_FLAGS = OBJECT_END + 0x0034, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_AURASTATE = OBJECT_END + 0x008C, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_FLAGS_2 = OBJECT_END + 0x0035, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_BASEATTACKTIME = OBJECT_END + 0x008D, // Size: 2, Type: INT, Flags: PUBLIC UNIT_FIELD_AURASTATE = OBJECT_END + 0x0036, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_RANGEDATTACKTIME = OBJECT_END + 0x008F, // Size: 1, Type: INT, Flags: PRIVATE UNIT_FIELD_BASEATTACKTIME = OBJECT_END + 0x0037, // Size: 2, Type: INT, Flags: PUBLIC
UNIT_FIELD_BOUNDINGRADIUS = OBJECT_END + 0x0090, // Size: 1, Type: FLOAT, Flags: PUBLIC UNIT_FIELD_RANGEDATTACKTIME = OBJECT_END + 0x0039, // Size: 1, Type: INT, Flags: PRIVATE
UNIT_FIELD_COMBATREACH = OBJECT_END + 0x0091, // Size: 1, Type: FLOAT, Flags: PUBLIC UNIT_FIELD_BOUNDINGRADIUS = OBJECT_END + 0x003A, // Size: 1, Type: FLOAT, Flags: PUBLIC
UNIT_FIELD_DISPLAYID = OBJECT_END + 0x0092, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_COMBATREACH = OBJECT_END + 0x003B, // Size: 1, Type: FLOAT, Flags: PUBLIC
UNIT_FIELD_NATIVEDISPLAYID = OBJECT_END + 0x0093, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_DISPLAYID = OBJECT_END + 0x003C, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_MOUNTDISPLAYID = OBJECT_END + 0x0094, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_NATIVEDISPLAYID = OBJECT_END + 0x003D, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_MINDAMAGE = OBJECT_END + 0x0095, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY, UNK3 UNIT_FIELD_MOUNTDISPLAYID = OBJECT_END + 0x003E, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_MAXDAMAGE = OBJECT_END + 0x0096, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY, UNK3 UNIT_FIELD_MINDAMAGE = OBJECT_END + 0x003F, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY, UNK3
UNIT_FIELD_MINOFFHANDDAMAGE = OBJECT_END + 0x0097, // 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_MAXOFFHANDDAMAGE = OBJECT_END + 0x0098, // 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_BYTES_1 = OBJECT_END + 0x0099, // Size: 1, Type: BYTES, Flags: PUBLIC UNIT_FIELD_MAXOFFHANDDAMAGE = OBJECT_END + 0x0042, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY, UNK3
UNIT_FIELD_PETNUMBER = OBJECT_END + 0x009A, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_BYTES_1 = OBJECT_END + 0x0043, // Size: 1, Type: BYTES, Flags: PUBLIC
UNIT_FIELD_PET_NAME_TIMESTAMP = OBJECT_END + 0x009B, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_PETNUMBER = OBJECT_END + 0x0044, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_PETEXPERIENCE = OBJECT_END + 0x009C, // Size: 1, Type: INT, Flags: OWNER_ONLY UNIT_FIELD_PET_NAME_TIMESTAMP = OBJECT_END + 0x0045, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_PETNEXTLEVELEXP = OBJECT_END + 0x009D, // Size: 1, Type: INT, Flags: OWNER_ONLY UNIT_FIELD_PETEXPERIENCE = OBJECT_END + 0x0046, // Size: 1, Type: INT, Flags: OWNER_ONLY
UNIT_DYNAMIC_FLAGS = OBJECT_END + 0x009E, // Size: 1, Type: INT, Flags: DYNAMIC UNIT_FIELD_PETNEXTLEVELEXP = OBJECT_END + 0x0047, // Size: 1, Type: INT, Flags: OWNER_ONLY
UNIT_CHANNEL_SPELL = OBJECT_END + 0x009F, // Size: 1, Type: INT, Flags: PUBLIC UNIT_DYNAMIC_FLAGS = OBJECT_END + 0x0048, // Size: 1, Type: INT, Flags: DYNAMIC
UNIT_MOD_CAST_SPEED = OBJECT_END + 0x00A0, // Size: 1, Type: FLOAT, Flags: PUBLIC UNIT_CHANNEL_SPELL = OBJECT_END + 0x0049, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_CREATED_BY_SPELL = OBJECT_END + 0x00A1, // Size: 1, Type: INT, Flags: PUBLIC UNIT_MOD_CAST_SPEED = OBJECT_END + 0x004A, // Size: 1, Type: FLOAT, Flags: PUBLIC
UNIT_NPC_FLAGS = OBJECT_END + 0x00A2, // Size: 1, Type: INT, Flags: DYNAMIC UNIT_CREATED_BY_SPELL = OBJECT_END + 0x004B, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_NPC_EMOTESTATE = OBJECT_END + 0x00A3, // Size: 1, Type: INT, Flags: PUBLIC UNIT_NPC_FLAGS = OBJECT_END + 0x004C, // Size: 1, Type: INT, Flags: DYNAMIC
UNIT_TRAINING_POINTS = OBJECT_END + 0x00A4, // Size: 1, Type: TWO_SHORT, Flags: OWNER_ONLY UNIT_NPC_EMOTESTATE = OBJECT_END + 0x004D, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_STAT0 = OBJECT_END + 0x00A5, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_STAT0 = OBJECT_END + 0x004E, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
UNIT_FIELD_STAT1 = OBJECT_END + 0x00A6, // 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 + 0x00A7, // 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 + 0x00A8, // 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 + 0x00A9, // 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 + 0x00AA, // 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 + 0x00AB, // 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 + 0x00AC, // 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 + 0x00AD, // 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 + 0x00AE, // 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 + 0x00AF, // 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 + 0x00B0, // 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 + 0x00B1, // 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 + 0x00B2, // 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 + 0x00B3, // 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 + 0x00B4, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY, UNK3 UNIT_FIELD_RESISTANCES = OBJECT_END + 0x005D, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY, UNK3
UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE = OBJECT_END + 0x00BB, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE = OBJECT_END + 0x0064, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY
UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE = OBJECT_END + 0x00C2, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE = OBJECT_END + 0x006B, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY
UNIT_FIELD_BASE_MANA = OBJECT_END + 0x00C9, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_BASE_MANA = OBJECT_END + 0x0072, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_BASE_HEALTH = OBJECT_END + 0x00CA, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_BASE_HEALTH = OBJECT_END + 0x0073, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
UNIT_FIELD_BYTES_2 = OBJECT_END + 0x00CB, // Size: 1, Type: BYTES, Flags: PUBLIC UNIT_FIELD_BYTES_2 = OBJECT_END + 0x0074, // Size: 1, Type: BYTES, Flags: PUBLIC
UNIT_FIELD_ATTACK_POWER = OBJECT_END + 0x00CC, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_ATTACK_POWER = OBJECT_END + 0x0075, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
UNIT_FIELD_ATTACK_POWER_MODS = OBJECT_END + 0x00CD, // Size: 1, Type: TWO_SHORT, 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 + 0x00CE, // Size: 1, Type: FLOAT, 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 + 0x00CF, // Size: 1, Type: INT, 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 + 0x00D0, // Size: 1, Type: TWO_SHORT, 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 + 0x00D1, // Size: 1, Type: FLOAT, 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 + 0x00D2, // 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 + 0x00D3, // 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 + 0x00D4, // Size: 7, Type: INT, 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 + 0x00DB, // Size: 7, Type: FLOAT, 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 + 0x00E2, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_MAXHEALTHMODIFIER = OBJECT_END + 0x008B, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
UNIT_FIELD_PADDING = OBJECT_END + 0x00E3, // Size: 1, Type: INT, Flags: NONE UNIT_FIELD_HOVERHEIGHT = OBJECT_END + 0x008C, // Size: 1, Type: FLOAT, Flags: PUBLIC
UNIT_END = OBJECT_END + 0x00E4, UNIT_FIELD_PADDING = OBJECT_END + 0x008D, // Size: 1, Type: INT, Flags: NONE
UNIT_END = OBJECT_END + 0x008E,
PLAYER_DUEL_ARBITER = UNIT_END + 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_DUEL_ARBITER = UNIT_END + 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC
PLAYER_FLAGS = UNIT_END + 0x0002, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_FLAGS = UNIT_END + 0x0002, // Size: 1, Type: INT, Flags: PUBLIC
@ -260,166 +285,190 @@ enum EUnitFields
PLAYER_QUEST_LOG_25_3 = UNIT_END + 0x006C, // Size: 1, Type: BYTES, 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_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_CREATOR = UNIT_END + 0x006E, // Size: 2, Type: LONG, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_1_0 = UNIT_END + 0x0070, // Size: 12, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_1_0 = UNIT_END + 0x0070, // Size: 13, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_1_PROPERTIES = UNIT_END + 0x007C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_1_PROPERTIES = UNIT_END + 0x007D, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_1_PAD = UNIT_END + 0x007D, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_1_SEED = UNIT_END + 0x007E, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_2_CREATOR = UNIT_END + 0x007E, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_VISIBLE_ITEM_1_PAD = UNIT_END + 0x007F, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_2_0 = UNIT_END + 0x0080, // Size: 12, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_2_CREATOR = UNIT_END + 0x0080, // Size: 2, Type: LONG, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_2_PROPERTIES = UNIT_END + 0x008C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_2_0 = UNIT_END + 0x0082, // Size: 13, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_2_PAD = UNIT_END + 0x008D, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_2_PROPERTIES = UNIT_END + 0x008F, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_3_CREATOR = UNIT_END + 0x008E, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_VISIBLE_ITEM_2_SEED = UNIT_END + 0x0090, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_3_0 = UNIT_END + 0x0090, // Size: 12, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_2_PAD = UNIT_END + 0x0091, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_3_PROPERTIES = UNIT_END + 0x009C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_3_CREATOR = UNIT_END + 0x0092, // Size: 2, Type: LONG, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_3_PAD = UNIT_END + 0x009D, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_3_0 = UNIT_END + 0x0094, // Size: 13, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_4_CREATOR = UNIT_END + 0x009E, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_VISIBLE_ITEM_3_PROPERTIES = UNIT_END + 0x00A1, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_4_0 = UNIT_END + 0x00A0, // Size: 12, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_3_SEED = UNIT_END + 0x00A2, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_4_PROPERTIES = UNIT_END + 0x00AC, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_3_PAD = UNIT_END + 0x00A3, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_4_PAD = UNIT_END + 0x00AD, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_4_CREATOR = UNIT_END + 0x00A4, // Size: 2, Type: LONG, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_5_CREATOR = UNIT_END + 0x00AE, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_VISIBLE_ITEM_4_0 = UNIT_END + 0x00A6, // Size: 13, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_5_0 = UNIT_END + 0x00B0, // Size: 12, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_4_PROPERTIES = UNIT_END + 0x00B3, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_5_PROPERTIES = UNIT_END + 0x00BC, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_4_SEED = UNIT_END + 0x00B4, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_5_PAD = UNIT_END + 0x00BD, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_4_PAD = UNIT_END + 0x00B5, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_6_CREATOR = UNIT_END + 0x00BE, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_VISIBLE_ITEM_5_CREATOR = UNIT_END + 0x00B6, // Size: 2, Type: LONG, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_6_0 = UNIT_END + 0x00C0, // Size: 12, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_5_0 = UNIT_END + 0x00B8, // Size: 13, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_6_PROPERTIES = UNIT_END + 0x00CC, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_5_PROPERTIES = UNIT_END + 0x00C5, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_6_PAD = UNIT_END + 0x00CD, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_5_SEED = UNIT_END + 0x00C6, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_7_CREATOR = UNIT_END + 0x00CE, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_VISIBLE_ITEM_5_PAD = UNIT_END + 0x00C7, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_7_0 = UNIT_END + 0x00D0, // Size: 12, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_6_CREATOR = UNIT_END + 0x00C8, // Size: 2, Type: LONG, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_7_PROPERTIES = UNIT_END + 0x00DC, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_6_0 = UNIT_END + 0x00CA, // Size: 13, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_7_PAD = UNIT_END + 0x00DD, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_6_PROPERTIES = UNIT_END + 0x00D7, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_8_CREATOR = UNIT_END + 0x00DE, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_VISIBLE_ITEM_6_SEED = UNIT_END + 0x00D8, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_8_0 = UNIT_END + 0x00E0, // Size: 12, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_6_PAD = UNIT_END + 0x00D9, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_8_PROPERTIES = UNIT_END + 0x00EC, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_7_CREATOR = UNIT_END + 0x00DA, // Size: 2, Type: LONG, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_8_PAD = UNIT_END + 0x00ED, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_7_0 = UNIT_END + 0x00DC, // Size: 13, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_9_CREATOR = UNIT_END + 0x00EE, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_VISIBLE_ITEM_7_PROPERTIES = UNIT_END + 0x00E9, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_9_0 = UNIT_END + 0x00F0, // Size: 12, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_7_SEED = UNIT_END + 0x00EA, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_9_PROPERTIES = UNIT_END + 0x00FC, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_7_PAD = UNIT_END + 0x00EB, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_9_PAD = UNIT_END + 0x00FD, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_8_CREATOR = UNIT_END + 0x00EC, // Size: 2, Type: LONG, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_10_CREATOR = UNIT_END + 0x00FE, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_VISIBLE_ITEM_8_0 = UNIT_END + 0x00EE, // Size: 13, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_10_0 = UNIT_END + 0x0100, // Size: 12, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_8_PROPERTIES = UNIT_END + 0x00FB, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_10_PROPERTIES = UNIT_END + 0x010C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_8_SEED = UNIT_END + 0x00FC, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_10_PAD = UNIT_END + 0x010D, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_8_PAD = UNIT_END + 0x00FD, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_11_CREATOR = UNIT_END + 0x010E, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_VISIBLE_ITEM_9_CREATOR = UNIT_END + 0x00FE, // Size: 2, Type: LONG, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_11_0 = UNIT_END + 0x0110, // Size: 12, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_9_0 = UNIT_END + 0x0100, // Size: 13, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_11_PROPERTIES = UNIT_END + 0x011C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_9_PROPERTIES = UNIT_END + 0x010D, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_11_PAD = UNIT_END + 0x011D, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_9_SEED = UNIT_END + 0x010E, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_12_CREATOR = UNIT_END + 0x011E, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_VISIBLE_ITEM_9_PAD = UNIT_END + 0x010F, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_12_0 = UNIT_END + 0x0120, // Size: 12, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_10_CREATOR = UNIT_END + 0x0110, // Size: 2, Type: LONG, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_12_PROPERTIES = UNIT_END + 0x012C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_10_0 = UNIT_END + 0x0112, // Size: 13, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_12_PAD = UNIT_END + 0x012D, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_10_PROPERTIES = UNIT_END + 0x011F, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_13_CREATOR = UNIT_END + 0x012E, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_VISIBLE_ITEM_10_SEED = UNIT_END + 0x0120, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_13_0 = UNIT_END + 0x0130, // Size: 12, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_10_PAD = UNIT_END + 0x0121, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_13_PROPERTIES = UNIT_END + 0x013C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_11_CREATOR = UNIT_END + 0x0122, // Size: 2, Type: LONG, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_13_PAD = UNIT_END + 0x013D, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_11_0 = UNIT_END + 0x0124, // Size: 13, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_14_CREATOR = UNIT_END + 0x013E, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_VISIBLE_ITEM_11_PROPERTIES = UNIT_END + 0x0131, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_14_0 = UNIT_END + 0x0140, // Size: 12, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_11_SEED = UNIT_END + 0x0132, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_14_PROPERTIES = UNIT_END + 0x014C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_11_PAD = UNIT_END + 0x0133, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_14_PAD = UNIT_END + 0x014D, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_12_CREATOR = UNIT_END + 0x0134, // Size: 2, Type: LONG, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_15_CREATOR = UNIT_END + 0x014E, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_VISIBLE_ITEM_12_0 = UNIT_END + 0x0136, // Size: 13, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_15_0 = UNIT_END + 0x0150, // Size: 12, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_12_PROPERTIES = UNIT_END + 0x0143, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_15_PROPERTIES = UNIT_END + 0x015C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_12_SEED = UNIT_END + 0x0144, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_15_PAD = UNIT_END + 0x015D, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_12_PAD = UNIT_END + 0x0145, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_16_CREATOR = UNIT_END + 0x015E, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_VISIBLE_ITEM_13_CREATOR = UNIT_END + 0x0146, // Size: 2, Type: LONG, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_16_0 = UNIT_END + 0x0160, // Size: 12, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_13_0 = UNIT_END + 0x0148, // Size: 13, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_16_PROPERTIES = UNIT_END + 0x016C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_13_PROPERTIES = UNIT_END + 0x0155, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_16_PAD = UNIT_END + 0x016D, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_13_SEED = UNIT_END + 0x0156, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_17_CREATOR = UNIT_END + 0x016E, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_VISIBLE_ITEM_13_PAD = UNIT_END + 0x0157, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_17_0 = UNIT_END + 0x0170, // Size: 12, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_14_CREATOR = UNIT_END + 0x0158, // Size: 2, Type: LONG, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_17_PROPERTIES = UNIT_END + 0x017C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_14_0 = UNIT_END + 0x015A, // Size: 13, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_17_PAD = UNIT_END + 0x017D, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_14_PROPERTIES = UNIT_END + 0x0167, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_18_CREATOR = UNIT_END + 0x017E, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_VISIBLE_ITEM_14_SEED = UNIT_END + 0x0168, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_18_0 = UNIT_END + 0x0180, // Size: 12, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_14_PAD = UNIT_END + 0x0169, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_18_PROPERTIES = UNIT_END + 0x018C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_15_CREATOR = UNIT_END + 0x016A, // Size: 2, Type: LONG, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_18_PAD = UNIT_END + 0x018D, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_15_0 = UNIT_END + 0x016C, // Size: 13, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_19_CREATOR = UNIT_END + 0x018E, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_VISIBLE_ITEM_15_PROPERTIES = UNIT_END + 0x0179, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_19_0 = UNIT_END + 0x0190, // Size: 12, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_15_SEED = UNIT_END + 0x017A, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_19_PROPERTIES = UNIT_END + 0x019C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_15_PAD = UNIT_END + 0x017B, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_19_PAD = UNIT_END + 0x019D, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_16_CREATOR = UNIT_END + 0x017C, // Size: 2, Type: LONG, Flags: PUBLIC
PLAYER_CHOSEN_TITLE = UNIT_END + 0x019E, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_16_0 = UNIT_END + 0x017E, // Size: 13, Type: INT, Flags: PUBLIC
PLAYER_FIELD_PAD_0 = UNIT_END + 0x019F, // Size: 1, Type: INT, Flags: NONE PLAYER_VISIBLE_ITEM_16_PROPERTIES = UNIT_END + 0x018B, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_FIELD_INV_SLOT_HEAD = UNIT_END + 0x01A0, // Size: 46, Type: LONG, Flags: PRIVATE PLAYER_VISIBLE_ITEM_16_SEED = UNIT_END + 0x018C, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_FIELD_PACK_SLOT_1 = UNIT_END + 0x01CE, // Size: 32, Type: LONG, Flags: PRIVATE PLAYER_VISIBLE_ITEM_16_PAD = UNIT_END + 0x018D, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_FIELD_BANK_SLOT_1 = UNIT_END + 0x01EE, // Size: 56, Type: LONG, Flags: PRIVATE PLAYER_VISIBLE_ITEM_17_CREATOR = UNIT_END + 0x018E, // Size: 2, Type: LONG, Flags: PUBLIC
PLAYER_FIELD_BANKBAG_SLOT_1 = UNIT_END + 0x0226, // Size: 14, Type: LONG, Flags: PRIVATE PLAYER_VISIBLE_ITEM_17_0 = UNIT_END + 0x0190, // Size: 13, Type: INT, Flags: PUBLIC
PLAYER_FIELD_VENDORBUYBACK_SLOT_1 = UNIT_END + 0x0234, // Size: 24, Type: LONG, Flags: PRIVATE PLAYER_VISIBLE_ITEM_17_PROPERTIES = UNIT_END + 0x019D, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_FIELD_KEYRING_SLOT_1 = UNIT_END + 0x024C, // Size: 64, Type: LONG, Flags: PRIVATE PLAYER_VISIBLE_ITEM_17_SEED = UNIT_END + 0x019E, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_FIELD_VANITYPET_SLOT_1 = UNIT_END + 0x028C, // Size: 36, Type: LONG, Flags: PRIVATE PLAYER_VISIBLE_ITEM_17_PAD = UNIT_END + 0x019F, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_FARSIGHT = UNIT_END + 0x02B0, // Size: 2, Type: LONG, Flags: PRIVATE PLAYER_VISIBLE_ITEM_18_CREATOR = UNIT_END + 0x01A0, // Size: 2, Type: LONG, Flags: PUBLIC
PLAYER__FIELD_KNOWN_TITLES = UNIT_END + 0x02B2, // Size: 2, Type: LONG, Flags: PRIVATE PLAYER_VISIBLE_ITEM_18_0 = UNIT_END + 0x01A2, // Size: 13, Type: INT, Flags: PUBLIC
PLAYER_XP = UNIT_END + 0x02B4, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_VISIBLE_ITEM_18_PROPERTIES = UNIT_END + 0x01AF, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_NEXT_LEVEL_XP = UNIT_END + 0x02B5, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_VISIBLE_ITEM_18_SEED = UNIT_END + 0x01B0, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_SKILL_INFO_1_1 = UNIT_END + 0x02B6, // Size: 384, Type: TWO_SHORT, Flags: PRIVATE PLAYER_VISIBLE_ITEM_18_PAD = UNIT_END + 0x01B1, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_CHARACTER_POINTS1 = UNIT_END + 0x0436, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_VISIBLE_ITEM_19_CREATOR = UNIT_END + 0x01B2, // Size: 2, Type: LONG, Flags: PUBLIC
PLAYER_CHARACTER_POINTS2 = UNIT_END + 0x0437, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_VISIBLE_ITEM_19_0 = UNIT_END + 0x01B4, // Size: 13, Type: INT, Flags: PUBLIC
PLAYER_TRACK_CREATURES = UNIT_END + 0x0438, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_VISIBLE_ITEM_19_PROPERTIES = UNIT_END + 0x01C1, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_TRACK_RESOURCES = UNIT_END + 0x0439, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_VISIBLE_ITEM_19_SEED = UNIT_END + 0x01C2, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_BLOCK_PERCENTAGE = UNIT_END + 0x043A, // Size: 1, Type: FLOAT, Flags: PRIVATE PLAYER_VISIBLE_ITEM_19_PAD = UNIT_END + 0x01C3, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_DODGE_PERCENTAGE = UNIT_END + 0x043B, // Size: 1, Type: FLOAT, Flags: PRIVATE PLAYER_CHOSEN_TITLE = UNIT_END + 0x01C4, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_PARRY_PERCENTAGE = UNIT_END + 0x043C, // Size: 1, Type: FLOAT, Flags: PRIVATE PLAYER_FIELD_PAD_0 = UNIT_END + 0x01C5, // Size: 1, Type: INT, Flags: NONE
PLAYER_EXPERTISE = UNIT_END + 0x043D, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_FIELD_INV_SLOT_HEAD = UNIT_END + 0x01C6, // Size: 46, Type: LONG, Flags: PRIVATE
PLAYER_OFFHAND_EXPERTISE = UNIT_END + 0x043E, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_FIELD_PACK_SLOT_1 = UNIT_END + 0x01F4, // Size: 32, Type: LONG, Flags: PRIVATE
PLAYER_CRIT_PERCENTAGE = UNIT_END + 0x043F, // Size: 1, Type: FLOAT, Flags: PRIVATE PLAYER_FIELD_BANK_SLOT_1 = UNIT_END + 0x0214, // Size: 56, Type: LONG, Flags: PRIVATE
PLAYER_RANGED_CRIT_PERCENTAGE = UNIT_END + 0x0440, // Size: 1, Type: FLOAT, Flags: PRIVATE PLAYER_FIELD_BANKBAG_SLOT_1 = UNIT_END + 0x024C, // Size: 14, Type: LONG, Flags: PRIVATE
PLAYER_OFFHAND_CRIT_PERCENTAGE = UNIT_END + 0x0441, // Size: 1, Type: FLOAT, Flags: PRIVATE PLAYER_FIELD_VENDORBUYBACK_SLOT_1 = UNIT_END + 0x025A, // Size: 24, Type: LONG, Flags: PRIVATE
PLAYER_SPELL_CRIT_PERCENTAGE1 = UNIT_END + 0x0442, // Size: 7, Type: FLOAT, 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_HOLY_SPELL_CRIT_PERCENTAGE = PLAYER_SPELL_CRIT_PERCENTAGE1+1, PLAYER_HOLY_SPELL_CRIT_PERCENTAGE = PLAYER_SPELL_CRIT_PERCENTAGE1+1,
PLAYER_FIRE_SPELL_CRIT_PERCENTAGE = PLAYER_SPELL_CRIT_PERCENTAGE1+2, PLAYER_FIRE_SPELL_CRIT_PERCENTAGE = PLAYER_SPELL_CRIT_PERCENTAGE1+2,
PLAYER_NATURE_SPELL_CRIT_PERCENTAGE = PLAYER_SPELL_CRIT_PERCENTAGE1+3, PLAYER_NATURE_SPELL_CRIT_PERCENTAGE = PLAYER_SPELL_CRIT_PERCENTAGE1+3,
PLAYER_FROST_SPELL_CRIT_PERCENTAGE = PLAYER_SPELL_CRIT_PERCENTAGE1+4, PLAYER_FROST_SPELL_CRIT_PERCENTAGE = PLAYER_SPELL_CRIT_PERCENTAGE1+4,
PLAYER_SHADOW_SPELL_CRIT_PERCENTAGE = PLAYER_SPELL_CRIT_PERCENTAGE1+5, PLAYER_SHADOW_SPELL_CRIT_PERCENTAGE = PLAYER_SPELL_CRIT_PERCENTAGE1+5,
PLAYER_ARCANE_SPELL_CRIT_PERCENTAGE = PLAYER_SPELL_CRIT_PERCENTAGE1+6, PLAYER_ARCANE_SPELL_CRIT_PERCENTAGE = PLAYER_SPELL_CRIT_PERCENTAGE1+6,
PLAYER_SHIELD_BLOCK = UNIT_END + 0x0449, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_SHIELD_BLOCK = UNIT_END + 0x04F3, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_EXPLORED_ZONES_1 = UNIT_END + 0x044A, // Size: 128, Type: BYTES, Flags: PRIVATE PLAYER_SHIELD_BLOCK_CRIT_PERCENTAGE = UNIT_END + 0x04F4, // Size: 1, Type: FLOAT, Flags: PRIVATE
PLAYER_REST_STATE_EXPERIENCE = UNIT_END + 0x04CA, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_EXPLORED_ZONES_1 = UNIT_END + 0x04F5, // Size: 128, Type: BYTES, Flags: PRIVATE
PLAYER_FIELD_COINAGE = UNIT_END + 0x04CB, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_REST_STATE_EXPERIENCE = UNIT_END + 0x0575, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_MOD_DAMAGE_DONE_POS = UNIT_END + 0x04CC, // Size: 7, Type: INT, Flags: PRIVATE PLAYER_FIELD_COINAGE = UNIT_END + 0x0576, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_MOD_DAMAGE_DONE_NEG = UNIT_END + 0x04D3, // Size: 7, Type: INT, Flags: PRIVATE PLAYER_FIELD_MOD_DAMAGE_DONE_POS = UNIT_END + 0x0577, // Size: 7, Type: INT, Flags: PRIVATE
PLAYER_FIELD_MOD_DAMAGE_DONE_PCT = UNIT_END + 0x04DA, // Size: 7, Type: INT, Flags: PRIVATE PLAYER_FIELD_MOD_DAMAGE_DONE_NEG = UNIT_END + 0x057E, // Size: 7, Type: INT, Flags: PRIVATE
PLAYER_FIELD_MOD_HEALING_DONE_POS = UNIT_END + 0x04E1, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_FIELD_MOD_DAMAGE_DONE_PCT = UNIT_END + 0x0585, // Size: 7, Type: INT, Flags: PRIVATE
PLAYER_FIELD_MOD_TARGET_RESISTANCE = UNIT_END + 0x04E2, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_FIELD_MOD_HEALING_DONE_POS = UNIT_END + 0x058C, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE = UNIT_END + 0x04E3, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_FIELD_MOD_TARGET_RESISTANCE = UNIT_END + 0x058D, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_BYTES = UNIT_END + 0x04E4, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE = UNIT_END + 0x058E, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_AMMO_ID = UNIT_END + 0x04E5, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_FIELD_BYTES = UNIT_END + 0x058F, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_SELF_RES_SPELL = UNIT_END + 0x04E6, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_AMMO_ID = UNIT_END + 0x0590, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_PVP_MEDALS = UNIT_END + 0x04E7, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_SELF_RES_SPELL = UNIT_END + 0x0591, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_BUYBACK_PRICE_1 = UNIT_END + 0x04E8, // Size: 12, Type: INT, Flags: PRIVATE PLAYER_FIELD_PVP_MEDALS = UNIT_END + 0x0592, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_BUYBACK_TIMESTAMP_1 = UNIT_END + 0x04F4, // Size: 12, Type: INT, Flags: PRIVATE PLAYER_FIELD_BUYBACK_PRICE_1 = UNIT_END + 0x0593, // Size: 12, Type: INT, Flags: PRIVATE
PLAYER_FIELD_KILLS = UNIT_END + 0x0500, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE PLAYER_FIELD_BUYBACK_TIMESTAMP_1 = UNIT_END + 0x059F, // Size: 12, Type: INT, Flags: PRIVATE
PLAYER_FIELD_TODAY_CONTRIBUTION = UNIT_END + 0x0501, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_FIELD_KILLS = UNIT_END + 0x05AB, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE
PLAYER_FIELD_YESTERDAY_CONTRIBUTION = UNIT_END + 0x0502, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_FIELD_TODAY_CONTRIBUTION = UNIT_END + 0x05AC, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_LIFETIME_HONORBALE_KILLS = UNIT_END + 0x0503, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_FIELD_YESTERDAY_CONTRIBUTION = UNIT_END + 0x05AD, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_BYTES2 = UNIT_END + 0x0504, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_FIELD_LIFETIME_HONORBALE_KILLS = UNIT_END + 0x05AE, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_WATCHED_FACTION_INDEX = UNIT_END + 0x0505, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_FIELD_BYTES2 = UNIT_END + 0x05AF, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_FIELD_COMBAT_RATING_1 = UNIT_END + 0x0506, // Size: 24, Type: INT, Flags: PRIVATE PLAYER_FIELD_WATCHED_FACTION_INDEX = UNIT_END + 0x05B0, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_ARENA_TEAM_INFO_1_1 = UNIT_END + 0x051E, // Size: 18, Type: INT, Flags: PRIVATE PLAYER_FIELD_COMBAT_RATING_1 = UNIT_END + 0x05B1, // Size: 25, Type: INT, Flags: PRIVATE
PLAYER_FIELD_HONOR_CURRENCY = UNIT_END + 0x0530, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_FIELD_ARENA_TEAM_INFO_1_1 = UNIT_END + 0x05CA, // Size: 18, Type: INT, Flags: PRIVATE
PLAYER_FIELD_ARENA_CURRENCY = UNIT_END + 0x0531, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_FIELD_HONOR_CURRENCY = UNIT_END + 0x05DC, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_MOD_MANA_REGEN = UNIT_END + 0x0532, // Size: 1, Type: FLOAT, Flags: PRIVATE PLAYER_FIELD_ARENA_CURRENCY = UNIT_END + 0x05DD, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_MOD_MANA_REGEN_INTERRUPT = UNIT_END + 0x0533, // Size: 1, Type: FLOAT, Flags: PRIVATE PLAYER_FIELD_MAX_LEVEL = UNIT_END + 0x05DE, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_MAX_LEVEL = UNIT_END + 0x0534, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_FIELD_DAILY_QUESTS_1 = UNIT_END + 0x05DF, // Size: 25, Type: INT, Flags: PRIVATE
PLAYER_FIELD_DAILY_QUESTS_1 = UNIT_END + 0x0535, // Size: 25, Type: INT, Flags: PRIVATE PLAYER_RUNE_REGEN_1 = UNIT_END + 0x05F8, // Size: 4, Type: FLOAT, Flags: PRIVATE
PLAYER_END = UNIT_END + 0x054E, 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,
}; };
enum EGameObjectFields enum EGameObjectFields
{ {
OBJECT_FIELD_CREATED_BY = OBJECT_END + 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC 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_DISPLAYID = OBJECT_END + 0x0002, // Size: 1, Type: INT, Flags: PUBLIC
GAMEOBJECT_FLAGS = OBJECT_END + 0x0003, // Size: 1, Type: INT, Flags: PUBLIC GAMEOBJECT_FLAGS = OBJECT_END + 0x0003, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
GAMEOBJECT_ROTATION = OBJECT_END + 0x0004, // Size: 4, Type: FLOAT, Flags: PUBLIC GAMEOBJECT_ROTATION = OBJECT_END + 0x0004, // Size: 2, Type: LONG, Flags: PUBLIC
GAMEOBJECT_STATE = OBJECT_END + 0x0008, // Size: 1, Type: INT, Flags: PUBLIC GAMEOBJECT_PARENTROTATION = OBJECT_END + 0x0006, // Size: 4, Type: FLOAT, Flags: PUBLIC
GAMEOBJECT_POS_X = OBJECT_END + 0x0009, // Size: 1, Type: FLOAT, Flags: PUBLIC GAMEOBJECT_POS_X = OBJECT_END + 0x000A, // Size: 1, Type: FLOAT, Flags: PUBLIC
GAMEOBJECT_POS_Y = 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 + 0x000B, // Size: 1, Type: FLOAT, Flags: PUBLIC GAMEOBJECT_POS_Z = OBJECT_END + 0x000C, // Size: 1, Type: FLOAT, Flags: PUBLIC
GAMEOBJECT_FACING = OBJECT_END + 0x000C, // Size: 1, Type: FLOAT, Flags: PUBLIC GAMEOBJECT_FACING = OBJECT_END + 0x000D, // Size: 1, Type: FLOAT, Flags: PUBLIC
GAMEOBJECT_DYN_FLAGS = OBJECT_END + 0x000D, // Size: 1, Type: INT, Flags: DYNAMIC GAMEOBJECT_DYNAMIC = OBJECT_END + 0x000E, // Size: 1, Type: TWO_SHORT, Flags: DYNAMIC
GAMEOBJECT_FACTION = OBJECT_END + 0x000E, // Size: 1, Type: INT, Flags: PUBLIC GAMEOBJECT_FACTION = OBJECT_END + 0x000F, // Size: 1, Type: INT, Flags: PUBLIC
GAMEOBJECT_TYPE_ID = OBJECT_END + 0x000F, // Size: 1, Type: INT, Flags: PUBLIC
GAMEOBJECT_LEVEL = OBJECT_END + 0x0010, // Size: 1, Type: INT, Flags: PUBLIC GAMEOBJECT_LEVEL = OBJECT_END + 0x0010, // Size: 1, Type: INT, Flags: PUBLIC
GAMEOBJECT_ARTKIT = OBJECT_END + 0x0011, // Size: 1, Type: INT, Flags: PUBLIC GAMEOBJECT_BYTES_1 = OBJECT_END + 0x0011, // Size: 1, Type: BYTES, Flags: PUBLIC
GAMEOBJECT_ANIMPROGRESS = OBJECT_END + 0x0012, // Size: 1, Type: INT, Flags: DYNAMIC GAMEOBJECT_END = OBJECT_END + 0x0012,
GAMEOBJECT_PADDING = OBJECT_END + 0x0013, // Size: 1, Type: INT, Flags: NONE
GAMEOBJECT_END = OBJECT_END + 0x0014,
}; };
enum EDynamicObjectFields enum EDynamicObjectFields

View File

@ -312,6 +312,7 @@ OpcodeHandler *WorldSession::_GetOpcodeHandlerTable() const
{MSG_MOVE_SET_TURN_RATE, &WorldSession::_HandleSetSpeedOpcode}, {MSG_MOVE_SET_TURN_RATE, &WorldSession::_HandleSetSpeedOpcode},
{MSG_MOVE_SET_FLIGHT_SPEED, &WorldSession::_HandleSetSpeedOpcode}, {MSG_MOVE_SET_FLIGHT_SPEED, &WorldSession::_HandleSetSpeedOpcode},
{MSG_MOVE_SET_FLIGHT_BACK_SPEED, &WorldSession::_HandleSetSpeedOpcode}, {MSG_MOVE_SET_FLIGHT_BACK_SPEED, &WorldSession::_HandleSetSpeedOpcode},
{MSG_MOVE_SET_PITCH_RATE, &WorldSession::_HandleSetSpeedOpcode},
// force set speed opcodes // force set speed opcodes
{SMSG_FORCE_WALK_SPEED_CHANGE, &WorldSession::_HandleForceSetSpeedOpcode}, {SMSG_FORCE_WALK_SPEED_CHANGE, &WorldSession::_HandleForceSetSpeedOpcode},
@ -322,11 +323,12 @@ OpcodeHandler *WorldSession::_GetOpcodeHandlerTable() const
{SMSG_FORCE_TURN_RATE_CHANGE, &WorldSession::_HandleForceSetSpeedOpcode}, {SMSG_FORCE_TURN_RATE_CHANGE, &WorldSession::_HandleForceSetSpeedOpcode},
{SMSG_FORCE_FLIGHT_SPEED_CHANGE, &WorldSession::_HandleForceSetSpeedOpcode}, {SMSG_FORCE_FLIGHT_SPEED_CHANGE, &WorldSession::_HandleForceSetSpeedOpcode},
{SMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE, &WorldSession::_HandleForceSetSpeedOpcode}, {SMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE, &WorldSession::_HandleForceSetSpeedOpcode},
{SMSG_FORCE_PITCH_RATE_CHANGE, &WorldSession::_HandleForceSetSpeedOpcode},
{SMSG_COMPRESSED_UPDATE_OBJECT, &WorldSession::_HandleCompressedUpdateObjectOpcode}, {SMSG_COMPRESSED_UPDATE_OBJECT, &WorldSession::_HandleCompressedUpdateObjectOpcode},
{SMSG_UPDATE_OBJECT, &WorldSession::_HandleUpdateObjectOpcode}, {SMSG_UPDATE_OBJECT, &WorldSession::_HandleUpdateObjectOpcode},
{SMSG_CAST_FAILED, &WorldSession::_HandleCastResultOpcode}, {SMSG_CAST_FAILED, &WorldSession::_HandleCastResultOpcode},
{SMSG_CLEAR_EXTRA_AURA_INFO, &WorldSession::_HandleCastSuccessOpcode}, /*{SMSG_CLEAR_EXTRA_AURA_INFO_OBSOLETE, &WorldSession::_HandleCastSuccessOpcode}, <--- RECHECK ME ! - cast success removed ?!? */
{SMSG_ITEM_QUERY_SINGLE_RESPONSE, &WorldSession::_HandleItemQuerySingleResponseOpcode}, {SMSG_ITEM_QUERY_SINGLE_RESPONSE, &WorldSession::_HandleItemQuerySingleResponseOpcode},
{SMSG_DESTROY_OBJECT, &WorldSession::_HandleDestroyObjectOpcode}, {SMSG_DESTROY_OBJECT, &WorldSession::_HandleDestroyObjectOpcode},
{SMSG_INITIAL_SPELLS, &WorldSession::_HandleInitialSpellsOpcode}, {SMSG_INITIAL_SPELLS, &WorldSession::_HandleInitialSpellsOpcode},
@ -529,7 +531,7 @@ void WorldSession::_HandleAuthChallengeOpcode(WorldPacket& recvPacket)
digest.UpdateBigNumbers(GetInstance()->GetSessionKey(),NULL); digest.UpdateBigNumbers(GetInstance()->GetSessionKey(),NULL);
digest.Finalize(); digest.Finalize();
WorldPacket auth; WorldPacket auth;
auth<<(uint32)(GetInstance()->GetConf()->clientbuild)<<unk<<acc<<clientseed_uint32; auth<<(uint32)(GetInstance()->GetConf()->clientbuild)<<unk<<acc<<unk<<clientseed_uint32;
auth.append(digest.GetDigest(),20); auth.append(digest.GetDigest(),20);
// recvPacket << real_size // recvPacket << real_size
// recvPacket << ziped_UI_Plugins_Info // recvPacket << ziped_UI_Plugins_Info
@ -548,7 +550,11 @@ void WorldSession::_HandleAuthChallengeOpcode(WorldPacket& recvPacket)
void WorldSession::_HandleAuthResponseOpcode(WorldPacket& recvPacket) void WorldSession::_HandleAuthResponseOpcode(WorldPacket& recvPacket)
{ {
uint8 errcode; uint8 errcode;
uint8 dummy8, expansion; uint32 dummy32;
recvPacket >> errcode; recvPacket >> errcode;
recvPacket >> dummy32 >> dummy8 >> dummy32;
recvPacket >> expansion;
if(errcode == 0xC) if(errcode == 0xC)
{ {
logdetail("World Authentication successful, preparing for char list request..."); logdetail("World Authentication successful, preparing for char list request...");
@ -603,9 +609,9 @@ void WorldSession::_HandleCharEnumOpcode(WorldPacket& recvPacket)
recvPacket >> plr[i]._y; recvPacket >> plr[i]._y;
recvPacket >> plr[i]._z; recvPacket >> plr[i]._z;
recvPacket >> plr[i]._guildId; recvPacket >> plr[i]._guildId;
recvPacket >> dummy8;
recvPacket >> plr[i]._flags; recvPacket >> plr[i]._flags;
recvPacket >> dummy8 >> dummy8 >> dummy8; recvPacket >> dummy32; // at_login_customize
recvPacket >> dummy8;
recvPacket >> plr[i]._petInfoId; recvPacket >> plr[i]._petInfoId;
recvPacket >> plr[i]._petLevel; recvPacket >> plr[i]._petLevel;
recvPacket >> plr[i]._petFamilyId; recvPacket >> plr[i]._petFamilyId;
@ -623,7 +629,7 @@ void WorldSession::_HandleCharEnumOpcode(WorldPacket& recvPacket)
*mapdb = GetDBMgr().GetDB("map"), *mapdb = GetDBMgr().GetDB("map"),
*classdb = GetDBMgr().GetDB("class"); *classdb = GetDBMgr().GetDB("class");
char *zonename, *racename, *mapname, *classname; char *zonename, *racename, *mapname, *classname;
zonename = racename = mapname = classname = NULL; zonename = racename = mapname = classname = "";
for(unsigned int i=0;i<num;i++) for(unsigned int i=0;i<num;i++)
{ {
@ -744,6 +750,12 @@ void WorldSession::_HandleSetProficiencyOpcode(WorldPacket& recvPacket)
void WorldSession::_HandleAccountDataMD5Opcode(WorldPacket& recvPacket) void WorldSession::_HandleAccountDataMD5Opcode(WorldPacket& recvPacket)
{ {
/*
uint32 time;
uint8 dummy;
recvPacket >> time >> dummy;
...
*/
// packet structure not yet known // packet structure not yet known
} }
@ -1013,9 +1025,9 @@ void WorldSession::_HandleMovementOpcode(WorldPacket& recvPacket)
uint32 flags, time, unk32; uint32 flags, time, unk32;
float x, y, z, o; float x, y, z, o;
uint64 guid; uint64 guid;
uint8 unk8; uint16 unk16;
guid = recvPacket.GetPackedGuid(); guid = recvPacket.GetPackedGuid();
recvPacket >> flags >> unk8 >> time >> x >> y >> z >> o >> unk32; recvPacket >> flags >> unk16 >> time >> x >> y >> z >> o >> unk32;
DEBUG(logdebug("MOVE: "I64FMT" -> time=%u flags=0x%X x=%.4f y=%.4f z=%.4f o=%.4f",guid,time,flags,x,y,z,o)); DEBUG(logdebug("MOVE: "I64FMT" -> time=%u flags=0x%X x=%.4f y=%.4f z=%.4f o=%.4f",guid,time,flags,x,y,z,o));
Object *obj = objmgr.GetObj(guid); Object *obj = objmgr.GetObj(guid);
if(obj && obj->IsWorldObject()) if(obj && obj->IsWorldObject())
@ -1029,7 +1041,7 @@ void WorldSession::_HandleSetSpeedOpcode(WorldPacket& recvPacket)
uint64 guid; uint64 guid;
float x, y, z, o, speed; float x, y, z, o, speed;
uint32 unk32, movetype; uint32 unk32, movetype;
uint8 unk8; uint16 unk16;
switch(recvPacket.GetOpcode()) switch(recvPacket.GetOpcode())
{ {
@ -1065,6 +1077,10 @@ void WorldSession::_HandleSetSpeedOpcode(WorldPacket& recvPacket)
movetype = MOVE_FLYBACK; movetype = MOVE_FLYBACK;
break; break;
case MSG_MOVE_SET_PITCH_RATE:
movetype = MOVE_PITCH_RATE;
break;
default: default:
logerror("MSG_MOVE_SET speed change unkown case error, opcode %u !", recvPacket.GetOpcode()); logerror("MSG_MOVE_SET speed change unkown case error, opcode %u !", recvPacket.GetOpcode());
return; return;
@ -1072,10 +1088,10 @@ void WorldSession::_HandleSetSpeedOpcode(WorldPacket& recvPacket)
guid = recvPacket.GetPackedGuid(); guid = recvPacket.GetPackedGuid();
recvPacket >> unk32; recvPacket >> unk32;
recvPacket >> unk8; recvPacket >> unk16;
recvPacket >> unk32; /* getMSTime()*/ recvPacket >> unk32; /* getMSTime()*/
recvPacket >> x >> y >> z >> o; recvPacket >> x >> y >> z >> o;
recvPacket >> unk32; recvPacket >> unk32; // falltime
recvPacket >> speed; recvPacket >> speed;
Object *obj = objmgr.GetObj(guid); Object *obj = objmgr.GetObj(guid);
@ -1127,6 +1143,10 @@ void WorldSession::_HandleForceSetSpeedOpcode(WorldPacket& recvPacket)
movetype = MOVE_FLYBACK; movetype = MOVE_FLYBACK;
break; break;
case SMSG_FORCE_PITCH_RATE_CHANGE:
movetype = MOVE_PITCH_RATE;
break;
default: default:
logerror("MSG_FORCE_ speed change unkown case error, opcode %u !", recvPacket.GetOpcode()); logerror("MSG_FORCE_ speed change unkown case error, opcode %u !", recvPacket.GetOpcode());
return; return;
@ -1253,7 +1273,7 @@ void WorldSession::_HandleCastResultOpcode(WorldPacket& recvPacket)
{ {
uint32 spellid,otherr = 0; uint32 spellid,otherr = 0;
uint8 result, castCount; uint8 result, castCount;
recvPacket >> spellid >> result >> castCount; recvPacket >> castCount >> spellid >> result;
if (recvPacket.rpos()+sizeof(uint32) <= recvPacket.size()) if (recvPacket.rpos()+sizeof(uint32) <= recvPacket.size())
recvPacket >> otherr; recvPacket >> otherr;
logdetail("Cast of spell %u failed. result=%u, cast count=%u, additional info=%u",spellid,result,castCount,otherr); logdetail("Cast of spell %u failed. result=%u, cast count=%u, additional info=%u",spellid,result,castCount,otherr);
@ -1542,7 +1562,7 @@ void WorldSession::_HandleCreatureQueryResponseOpcode(WorldPacket& recvPacket)
CreatureTemplate *ct = new CreatureTemplate(); CreatureTemplate *ct = new CreatureTemplate();
std::string s; std::string s;
uint32 unk; //uint32 unk;
float unkf; float unkf;
ct->entry = entry; ct->entry = entry;
recvPacket >> ct->name; recvPacket >> ct->name;
@ -1555,7 +1575,6 @@ void WorldSession::_HandleCreatureQueryResponseOpcode(WorldPacket& recvPacket)
recvPacket >> ct->type; recvPacket >> ct->type;
recvPacket >> ct->family; recvPacket >> ct->family;
recvPacket >> ct->rank; recvPacket >> ct->rank;
recvPacket >> unk;
recvPacket >> ct->SpellDataId; recvPacket >> ct->SpellDataId;
recvPacket >> ct->displayid_A; recvPacket >> ct->displayid_A;
recvPacket >> ct->displayid_H; recvPacket >> ct->displayid_H;

View File

@ -77,11 +77,32 @@ void WorldSocket::OnRead()
DEBUG(logdebug("Delaying header reading, bufsize is %u but should be >= %u",ibuf.GetLength(),sizeof(ServerPktHeader))); DEBUG(logdebug("Delaying header reading, bufsize is %u but should be >= %u",ibuf.GetLength(),sizeof(ServerPktHeader)));
break; break;
} }
// read first byte and check if size is 3 or 2 bytes
uint8 firstSizeByte;
ibuf.SoftRead((char*)&firstSizeByte, 1);
_crypt.DecryptRecv(&firstSizeByte, 1, true);
if (firstSizeByte & 0x80) // got large packet
{
ServerPktHeaderBig hdr;
ibuf.Read((char*)&hdr, 3+2);
_crypt.DecryptRecv((uint8*)&hdr, 3+2, false);
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; ServerPktHeader hdr;
ibuf.Read((char*)&hdr, sizeof(ServerPktHeader)); ibuf.Read((char*)&hdr, sizeof(ServerPktHeader));
_crypt.DecryptRecv((uint8*)&hdr,sizeof(ServerPktHeader)); _crypt.DecryptRecv((uint8*)&hdr, sizeof(ServerPktHeader), false);
_remaining = ntohs(hdr.size)-2; _remaining = ntohs(hdr.size)-2;
_opcode = hdr.cmd; _opcode = hdr.cmd;
}
if(_opcode > MAX_OPCODE_ID) if(_opcode > MAX_OPCODE_ID)
{ {
logcritical("CRYPT ERROR: opcode=%u, remain=%u",_opcode,_remaining); // this should never be the case! logcritical("CRYPT ERROR: opcode=%u, remain=%u",_opcode,_remaining); // this should never be the case!

View File

@ -7,6 +7,12 @@
class WorldSession; class WorldSession;
class BigNumber; class BigNumber;
#if defined( __GNUC__ )
#pragma pack(1)
#else
#pragma pack(push,1)
#endif
struct ClientPktHeader struct ClientPktHeader
{ {
uint16 size; uint16 size;
@ -20,6 +26,19 @@ struct ServerPktHeader
uint16 cmd; uint16 cmd;
}; };
struct ServerPktHeaderBig
{
uint8 size[3];
uint16 cmd;
};
#if defined( __GNUC__ )
#pragma pack()
#else
#pragma pack(pop)
#endif
class WorldSocket : public TcpSocket class WorldSocket : public TcpSocket
{ {
public: public:
@ -41,7 +60,7 @@ private:
AuthCrypt _crypt; AuthCrypt _crypt;
bool _gothdr; // true if only the header was recieved yet bool _gothdr; // true if only the header was recieved yet
uint16 _opcode; // stores the last recieved opcode uint16 _opcode; // stores the last recieved opcode
uint16 _remaining; // bytes amount of the next data packet uint32 _remaining; // bytes amount of the next data packet
bool _ok; bool _ok;
}; };

View File

@ -158,6 +158,26 @@ bool ADTFile::LoadMem(ByteBuffer& buf)
_wmosp.push_back(buf.read<MODF_chunk>()); _wmosp.push_back(buf.read<MODF_chunk>());
} }
} }
else if(!strcmp((char*)fourcc,"MH2O"))
{
// TODO: Implement rest of this asap water levels needed for rendering/swimming!
for(uint32 i = 0; i < CHUNKS_PER_TILE; i++)
{
uint32 ofsData1, used, ofsData2;
buf >> ofsData1 >> used >> ofsData2;
_chunks[i].haswater = used;
if (used)
{
// ... http://madx.dk/wowdev/wiki/index.php?title=ADT#MH2O_chunk
}
}
// remove me:
buf.rpos(buf.rpos()+size-(4+4+4)*CHUNKS_PER_TILE);
}
else if(!strcmp((char*)fourcc,"MCNK")) else if(!strcmp((char*)fourcc,"MCNK"))
{ {
_chunks[mcnkid].hdr = buf.read<ADTMapChunkHeader>(); _chunks[mcnkid].hdr = buf.read<ADTMapChunkHeader>();
@ -173,8 +193,8 @@ bool ADTFile::LoadMem(ByteBuffer& buf)
// HACKS to make it work properly // HACKS to make it work properly
if(!msize && !strcmp((char*)mfcc,"MCAL")) if(!msize && !strcmp((char*)mfcc,"MCAL"))
continue; continue;
if((!msize) && !strcmp((char*)mfcc,"MCLQ")) //if((!msize) && !strcmp((char*)mfcc,"MCLQ"))
msize = _chunks[mcnkid].hdr.sizeLiquid; // msize = _chunks[mcnkid].hdr.sizeLiquid;
//DEBUG(printf("ADT: MCNK: reading '%s' size %u\n",mfcc,msize)); //DEBUG(printf("ADT: MCNK: reading '%s' size %u\n",mfcc,msize));
@ -216,7 +236,7 @@ bool ADTFile::LoadMem(ByteBuffer& buf)
buf.read((uint8*)(_chunks[mcnkid].alphamap[i]),2048); buf.read((uint8*)(_chunks[mcnkid].alphamap[i]),2048);
} }
} }
else if(!strcmp((char*)mfcc,"MCLQ")) /*else if(!strcmp((char*)mfcc,"MCLQ")) // MCLQ changed to MH2O chunk for whole ADT file
{ {
uint8 _cc3[5]; uint8 _cc3[5];
uint8 *fcc1 = &_cc3[0]; uint8 *fcc1 = &_cc3[0];
@ -263,7 +283,7 @@ bool ADTFile::LoadMem(ByteBuffer& buf)
buf.rpos(buf.rpos()+diffbytes); buf.rpos(buf.rpos()+diffbytes);
//DEBUG(printf("ADT: MCNK: MCLQ - %u junk bytes skipped\n",diffbytes)); //DEBUG(printf("ADT: MCNK: MCLQ - %u junk bytes skipped\n",diffbytes));
} }
} }*/
else if(!strcmp((char*)mfcc,"MCSE")) else if(!strcmp((char*)mfcc,"MCSE"))
{ {
uint32 emm = _chunks[mcnkid].hdr.nSndEmitters; uint32 emm = _chunks[mcnkid].hdr.nSndEmitters;

View File

@ -30,20 +30,30 @@ void AuthCrypt::Init()
_initialized = true; _initialized = true;
} }
void AuthCrypt::DecryptRecv(uint8 *data, size_t len) void AuthCrypt::DecryptRecv(uint8 *data, size_t len, bool temp)
{ {
if (!_initialized) return; if (!_initialized) return;
if (len < CRYPTED_RECV_LEN) return; //if (len < CRYPTED_RECV_LEN) return;
uint8 ti, tj;
if (temp)
{
ti = _recv_i;
tj = _recv_j;
}
for (size_t t = 0; t < CRYPTED_RECV_LEN; t++) for (size_t t = 0; t < len; t++)
{ {
_recv_i %= _key.size(); _recv_i %= _key.size();
uint8 x = (data[t] - _recv_j) ^ _key[_recv_i]; uint8 x = (data[t] - _recv_j) ^ _key[_recv_i];
++_recv_i; ++_recv_i;
_recv_j = data[t]; _recv_j = data[t];
data[t] = x; data[t] = x;
}
if (temp)
{
_recv_i = ti;
_recv_j = tj;
} }
} }

View File

@ -39,7 +39,7 @@ class AuthCrypt
inline uint8 *GetKey(void) { return &_key[0]; } inline uint8 *GetKey(void) { return &_key[0]; }
inline uint32 GetKeySize(void) { return _key.size(); } inline uint32 GetKeySize(void) { return _key.size(); }
void DecryptRecv(uint8 *, size_t); void DecryptRecv(uint8 *, size_t, bool);
void EncryptSend(uint8 *, size_t); void EncryptSend(uint8 *, size_t);
bool IsInitialized() { return _initialized; } bool IsInitialized() { return _initialized; }

View File

@ -91,6 +91,11 @@ class ByteBuffer
append<uint16>(value); append<uint16>(value);
return *this; return *this;
} }
ByteBuffer &operator<<(int32 value)
{
append<int32>(value);
return *this;
}
ByteBuffer &operator<<(uint32 value) ByteBuffer &operator<<(uint32 value)
{ {
append<uint32>(value); append<uint32>(value);
@ -139,6 +144,11 @@ class ByteBuffer
value = read<uint16>(); value = read<uint16>();
return *this; return *this;
} }
ByteBuffer &operator>>(int32 &value)
{
value = read<int32>();
return *this;
}
ByteBuffer &operator>>(uint32 &value) ByteBuffer &operator>>(uint32 &value)
{ {
value = read<uint32>(); value = read<uint32>();

View File

@ -345,13 +345,13 @@ static const char *CreatureDisplayInfoFieldNames[] = {
"","model","unk","extra","scale","opacity","name1","name2","name3","", // 0-9 "","model","unk","extra","scale","opacity","name1","name2","name3","", // 0-9
"","sound","","","","","","","","", // 10-19 "","sound","","","","","","","","", // 10-19
"", "",
"" "", "", ""
}; };
static const char *CreatureDisplayInfoFormat = { static const char *CreatureDisplayInfoFormat = {
"iiiifisssx" // 0-9 "iiiifisssx" // 0-9
"xixxxxxxxx" // 10-19 "xixxxxxxxx" // 10-19
"x" "xxx"
}; };
enum NPCSoundsEnum enum NPCSoundsEnum

View File

@ -18,7 +18,9 @@ MPQHelper::MPQHelper(char *archive)
// ok maybe this is a bit too much but should work fine :) // ok maybe this is a bit too much but should work fine :)
_patches.push_front(dir+archive+ext); // _patches.push_front(dir+archive+ext); //
_patches.push_front(dir+"common"+ext); _patches.push_front(dir+"common"+ext);
_patches.push_front(dir+"common-2"+ext);
_patches.push_front(dir+"expansion"+ext); _patches.push_front(dir+"expansion"+ext);
_patches.push_front(dir+"lichking"+ext);
_patches.push_front(dir+"patch"+ext); _patches.push_front(dir+"patch"+ext);
for(uint32 i=1; i<=MAX_PATCH_NUMBER; i++) for(uint32 i=1; i<=MAX_PATCH_NUMBER; i++)
{ {
@ -32,6 +34,7 @@ MPQHelper::MPQHelper(char *archive)
_patches.push_front(ldir+"expansion-speech-"+GetLocale()+ext); _patches.push_front(ldir+"expansion-speech-"+GetLocale()+ext);
_patches.push_front(ldir+"expansion-locale-"+GetLocale()+ext); _patches.push_front(ldir+"expansion-locale-"+GetLocale()+ext);
_patches.push_front(ldir+"expansion-"+archive+"-"+GetLocale()+ext); _patches.push_front(ldir+"expansion-"+archive+"-"+GetLocale()+ext);
_patches.push_front(ldir+"lichking-locale-"+GetLocale()+ext);
_patches.push_front(ldir+"patch"+"-"+GetLocale()+ext); _patches.push_front(ldir+"patch"+"-"+GetLocale()+ext);
for(uint32 i=1; i<=MAX_PATCH_NUMBER; i++) for(uint32 i=1; i<=MAX_PATCH_NUMBER; i++)

View File

@ -77,9 +77,9 @@ HANDLE CreateFile(const char *sFileName, DWORD ulMode, DWORD ulSharing, void *pS
case OPEN_EXISTING: case OPEN_EXISTING:
return (HANDLE)open(sFileName, O_RDONLY | O_LARGEFILE); return (HANDLE)open(sFileName, O_RDONLY | O_LARGEFILE);
case OPEN_ALWAYS: case OPEN_ALWAYS:
return (HANDLE)open(sFileName, O_RDWR | O_CREAT); return (HANDLE)open(sFileName, O_RDWR | O_CREAT, 0666);
case CREATE_NEW: case CREATE_NEW:
return (HANDLE)open(sFileName, O_RDWR | O_CREAT | O_TRUNC); return (HANDLE)open(sFileName, O_RDWR | O_CREAT | O_TRUNC, 0666);
default: default:
return INVALID_HANDLE_VALUE; return INVALID_HANDLE_VALUE;
} }

View File

@ -728,8 +728,6 @@ void ExtractMapDependencies(void)
{ {
ByteBuffer bb = mpqmodel.ExtractFile((char*)mpqfn.c_str()); ByteBuffer bb = mpqmodel.ExtractFile((char*)mpqfn.c_str());
fh.write((const char*)bb.contents(),bb.size()); fh.write((const char*)bb.contents(),bb.size());
if (doTextures)
FetchTexturesFromModel(bb);
if(doMd5) if(doMd5)
{ {
@ -741,6 +739,35 @@ void ExtractMapDependencies(void)
memcpy(md5ptr, h.GetDigest(), MD5_DIGEST_LENGTH); memcpy(md5ptr, h.GetDigest(), MD5_DIGEST_LENGTH);
} }
mdone++; mdone++;
// model ok, now extract skins
// for now first skin is all what we need
std::string copy = mpqfn;
std::transform(copy.begin(), copy.end(), copy.begin(), tolower);
if (copy.find(".wmo") == std::string::npos)
{
if (doTextures)
FetchTexturesFromModel(bb);
std::string skin = mpqfn.substr(0,mpqfn.length()-3) + "00.skin";
std::string skinrealfn = pathmodel + "/" + _PathToFileName(skin);
if (mpqmodel.FileExists((char*)skin.c_str()))
{
std::fstream fhs;
fhs.open(skinrealfn.c_str(),std::ios_base::out | std::ios_base::binary);
if(fhs.is_open())
{
ByteBuffer bbs = mpqmodel.ExtractFile((char*)skin.c_str());
fhs.write((const char*)bbs.contents(),bbs.size());
}
else
printf("Could not write skin %s\n",skinrealfn.c_str());
fhs.close();
}
else
printf("Could not open skin %s\n",skin.c_str());
}
} }
else else
printf("Could not write model %s\n",realfn.c_str()); printf("Could not write model %s\n",realfn.c_str());
@ -952,8 +979,8 @@ void FetchTexturesFromModel(ByteBuffer bb)
bb.read((uint8*)&header, sizeof(header)); bb.read((uint8*)&header, sizeof(header));
if ((header.version[0] < 4 || header.version[0] > 7) || header.version[1] != 1 || header.version[2] != 0 || header.version[3] != 0) { if (header.version[0] != 8 || header.version[1] != 1 || header.version[2] != 0 || header.version[3] != 0) {
//printf("Not M2 model file!"); printf("Not M2 model file!");
return; return;
} }