* 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
ClientVersion=2.4.3
ClientBuild=8606
ClientVersion=3.0.8
ClientBuild=9506
ClientLanguage=enUS
// 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));
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.");
return 0;
}
@ -119,33 +119,37 @@ for(u32 i =0;i<header.nVertices;i++)
}
DEBUG(logdebug("Read %u/%u Vertices",M2MVertices.size(),header.nVertices));
//Views == Sets of vertices. Usage yet unknown. Global data
if(M2MViews.size()>0)
M2MViews.clear();
ModelView tempM2MView;
MeshFile->seek(header.ofsViews);
for(u32 i =0;i<header.nViews;i++)
//Views (skins) == Sets of vertices. Usage yet unknown. Global data
std::string SkinName = MeshFile->getFileName();
SkinName = SkinName.substr(0, SkinName.length()-3) + "00.skin"; // FIX ME (and stuffextract) ! as we need more skins
io::IReadFile* SkinFile = io::createReadFile(SkinName.c_str());
if (!SkinFile)
{
MeshFile->read(&tempM2MView,sizeof(ModelView));
M2MViews.push_back(tempM2MView);
printf("Error! Skin file not found: %s", SkinName.c_str());
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("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
if(M2MIndices.size()>0)
M2MIndices.clear();
u16 tempM2Index;
MeshFile->seek(M2MViews[0].ofsIndex);
for(u32 i =0;i<M2MViews[0].nIndex;i++)
SkinFile->seek(currentView.ofsIndex);
for(u32 i =0;i<currentView.nIndex;i++)
{
MeshFile->read(&tempM2Index,sizeof(u16));
SkinFile->read(&tempM2Index,sizeof(u16));
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
@ -153,26 +157,26 @@ if(M2MTriangles.size()>0)
M2MTriangles.clear();
u16 tempM2Triangle;
MeshFile->seek(M2MViews[0].ofsTris);
for(u32 i =0;i<M2MViews[0].nTris;i++)
SkinFile->seek(currentView.ofsTris);
for(u32 i =0;i<currentView.nTris;i++)
{
MeshFile->read(&tempM2Triangle,sizeof(u16));
SkinFile->read(&tempM2Triangle,sizeof(u16));
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
if(M2MSubmeshes.size()>0)
M2MSubmeshes.clear();
ModelViewSubmesh tempM2Submesh;
MeshFile->seek(M2MViews[0].ofsSub);
for(u32 i =0;i<M2MViews[0].nSub;i++)
SkinFile->seek(currentView.ofsSub);
for(u32 i =0;i<currentView.nSub;i++)
{
MeshFile->read(&tempM2Submesh,sizeof(ModelViewSubmesh));
SkinFile->read(&tempM2Submesh,sizeof(ModelViewSubmesh));
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";
}
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
TextureUnit tempM2TexUnit;
@ -180,10 +184,10 @@ if(!M2MTextureUnit.empty())
{
M2MTextureUnit.clear();
}
MeshFile->seek(M2MViews[0].ofsTex);
for(u32 i=0;i<M2MViews[0].nTex;i++)
SkinFile->seek(currentView.ofsTex);
for(u32 i=0;i<currentView.nTex;i++)
{
MeshFile->read(&tempM2TexUnit,sizeof(TextureUnit));
SkinFile->read(&tempM2TexUnit,sizeof(TextureUnit));
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));
}
@ -260,6 +264,8 @@ for(u32 i=0; i<M2MTextureDef.size(); i++)
// Animation related stuff //
///////////////////////////////////////
/* ANIMATION NEED FIX !!! - search this text to find all code blocks for animations
printf("Global Sequences: %u\n",header.nGlobalSequences);
//Ignored at the moment, as wolf.m2 has none
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->Animatedrotation=core::quaternion(0.0f,0.0f,0.0f,0.0f);
core::matrix4 positionMatrix;
/* core::matrix4 positionMatrix; ANIMATION NEED FIX !!!
// positionMatrix.setTranslation( Joint->Animatedposition );
core::matrix4 scaleMatrix;
//scaleMatrix.setScale( Joint->Animatedscale );
@ -459,7 +465,7 @@ if(M2MBones[i].scaling.header.nValues>0){
else
Joint->LocalMatrix = Joint->GlobalMatrix;
}
*/
//std::cout<<AnimatedMesh->getAllJoints()[1]->Children.size()<<" Children\n";
//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));
}
//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.
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++)
{
//std::cout << (u32)M2MVertices[j].bones[k] << " ";
/* ANIMATION NEED FIX !!!
if((M2MVertices[j].weights[k]/255.0f)>0.0f)
{
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->buffer_id=i;
}
*/
//std::cout<<weight->buffer_id << " " << weight->vertex_id << " " << weight->strength <<"|";
}
// std::cout<<'\n';
@ -563,7 +571,6 @@ M2MTextureDef.clear();
M2MSubmeshes.clear();
M2MTextureFiles.clear();
M2MTextureLookup.clear();
M2MViews.clear();
return true;
}

View File

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

View File

@ -118,8 +118,10 @@ void WorldSession::SendCastSpell(uint32 spellid, bool nocheck)
WorldPacket packet;
ByteBuffer temp;
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 << (uint8)0; // unk
if(target && my->GetTarget() != GetGuid()) // self cast?
{
if(target->GetTypeId() == TYPEID_PLAYER || target->GetTypeId() == TYPEID_UNIT)

View File

@ -11,7 +11,7 @@
#include "Item.h"
// 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 GOTEMPLATES_CACHE_VERSION = 0;
@ -214,11 +214,14 @@ void ItemProtoCache_InsertDataToSession(WorldSession *session)
buf >> proto->MaxCount;
buf >> proto->Stackable;
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].ItemStatValue;
}
buf >> proto->ScalingStatDistribution;
buf >> proto->ScalingStatValue;
for(int i = 0; i < 5; i++)
{
buf >> proto->Damage[i].DamageMin;
@ -274,6 +277,8 @@ void ItemProtoCache_InsertDataToSession(WorldSession *session)
buf >> proto->RequiredArenaRank;
buf >> proto->RequiredDisenchantSkill;
buf >> proto->ArmorDamageModifier;
buf >> proto->Duration;
buf >> proto->ItemLimitCategory;
if(proto->Id)
{
@ -343,11 +348,14 @@ void ItemProtoCache_WriteDataToCache(WorldSession *session)
buf << proto->MaxCount;
buf << proto->Stackable;
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].ItemStatValue;
}
buf << proto->ScalingStatDistribution;
buf << proto->ScalingStatValue;
for(int i = 0; i < 5; i++)
{
buf << proto->Damage[i].DamageMin;
@ -403,6 +411,8 @@ void ItemProtoCache_WriteDataToCache(WorldSession *session)
buf << proto->RequiredArenaRank;
buf << proto->RequiredDisenchantSkill;
buf << proto->ArmorDamageModifier;
buf << proto->Duration;
buf << proto->ItemLimitCategory;
//DEBUG(logdebug("ItemProtoCache: Saved %u [%s]",proto->Id, proto->Name[0].c_str()));
uint32 size = buf.size();

View File

@ -7,65 +7,107 @@
struct GameobjectTemplate
{
uint32 entry;
uint32 type;
uint32 displayId;
uint32 entry;
uint32 type;
uint32 displayId;
std::string name;
std::string castBarCaption;
uint32 faction;
uint32 flags;
float size;
uint32 faction;
uint32 flags;
float size;
union // different GO types have different data field
{
//0 GAMEOBJECT_TYPE_DOOR
struct
{
uint32 _data0;
uint32 lockId; //1
uint16 _data2lo; //2 lower part of data2, unknown
uint16 autoCloseTime; //2 (unit16)
uint32 startOpen; //0 used client side to determine GO_ACTIVATED means open/closed
uint32 lockId; //1 -> Lock.dbc
uint32 autoCloseTime; //2 secs till autoclose = autoCloseTime / 0x10000
uint32 noDamageImmune; //3 break opening whenever you recieve damage?
uint32 openTextID; //4 can be used to replace castBarCaption?
uint32 closeTextID; //5
} door;
//1 GAMEOBJECT_TYPE_BUTTON
struct
{
uint32 _data0;
uint32 lockId; //1
uint16 _data2lo; //2 lower part of data2, unknown
uint16 autoCloseTime; //2 (unit16)
uint32 _data3;
uint32 isBattlegroundObject; //4
uint32 startOpen; //0
uint32 lockId; //1 -> Lock.dbc
uint32 autoCloseTime; //2 secs till autoclose = autoCloseTime / 0x10000
uint32 linkedTrap; //3
uint32 noDamageImmune; //4 isBattlegroundObject
uint32 large; //5
uint32 openTextID; //6 can be used to replace castBarCaption?
uint32 closeTextID; //7
uint32 losOK; //8
} 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
struct
{
uint32 lockId; //0
uint32 lockId; //0 -> Lock.dbc
uint32 lootId; //1
uint32 _data2[2];
uint32 chestRestockTime; //2
uint32 consumable; //3
uint32 minSuccessOpens; //4
uint32 maxSuccessOpens; //5
uint32 eventId; //6
uint32 eventId; //6 lootedEvent
uint32 linkedTrapId; //7
uint32 questId; //8 not used currently but store quest required for GO activation for player
uint32 _data9[5];
uint32 _data14; //14 something == trap.data12 == goober.data14 (openText?)
uint32 level; //9
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;
//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
struct
{
uint32 _data0; //0 lockid???
uint32 _data1;
uint32 lockId; //0 -> Lock.dbc
uint32 level; //1
uint32 radius; //2 radius for trap activation
uint32 spellId; //3
uint32 isNeedDespawn; //4 (if >0)
uint32 _data5; //5
uint32 _data6[6];
uint32 _data12; //12 something == chest.data14 == goober.data14 (openText?)
uint32 charges; //4 need respawn (if > 0)
uint32 cooldown; //5 time in secs
uint32 autoCloseTime; //6
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;
//7 GAMEOBJECT_TYPE_CHAIR
struct
{
uint32 slots; //0 not used currently
uint32 slots; //0
uint32 height; //1
uint32 onlyCreatorUse; //2
} chair;
//8 GAMEOBJECT_TYPE_SPELL_FOCUS
struct
@ -73,39 +115,82 @@ struct GameobjectTemplate
uint32 focusId; //0
uint32 dist; //1
uint32 linkedTrapId; //2
uint32 serverOnly; //3
uint32 questID; //4
uint32 large; //5
} spellFocus;
//9 GAMEOBJECT_TYPE_TEXT
struct
{
uint32 pageID; //0
uint32 language; //1
uint32 pageMaterial; //2
uint32 allowMounted; //3
} text;
//10 GAMEOBJECT_TYPE_GOOBER
struct
{
uint32 _data0; //0 lockid ???
uint32 lockId; //0 -> Lock.dbc
uint32 questId; //1
uint32 eventId; //2
uint32 _data3[4];
uint32 autoCloseTime; //3
uint32 customAnim; //4
uint32 consumable; //5
uint32 cooldown; //6
uint32 pageId; //7
uint32 _data8[2];
uint32 language; //8
uint32 pageMaterial; //9
uint32 spellId; //10
uint32 _data11;
uint32 noDamageImmune; //11
uint32 linkedTrapId; //12
uint32 _data13;
uint32 _data14; //14 something == trap.data12 == chest.data14 (openText?)
uint32 _data15;
uint32 isBattlegroundObject; //16
uint32 large; //13
uint32 openTextID; //14 can be used to replace castBarCaption?
uint32 closeTextID; //15
uint32 losOK; //16 isBattlegroundObject
uint32 allowMounted; //17
} 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
struct
{
uint32 _data0;
uint32 lockId; //0 -> Lock.dbc
uint32 cinematicId; //1
uint32 eventID; //2
uint32 openTextID; //3 can be used to replace castBarCaption?
} camera;
//15 GAMEOBJECT_TYPE_MO_TRANSPORT
struct
{
uint32 taxiPathId; //0
uint32 moveSpeed; //1
uint32 accelRate; //2
uint32 startEventID; //3
uint32 stopEventID; //4
uint32 transportPhysics; //5
uint32 mapID; //6
} moTransport;
//17 GAMEOBJECT_TYPE_FISHINGNODE
struct
{
uint32 _data0;
uint32 _data0; //0
uint32 lootId; //1
} fishnode;
//18 GAMEOBJECT_TYPE_SUMMONING_RITUAL
@ -113,21 +198,50 @@ struct GameobjectTemplate
{
uint32 reqParticipants; //0
uint32 spellId; //1
uint32 animSpell; //2
uint32 ritualPersistent; //3
uint32 casterTargetSpell; //4
uint32 casterTargetSpellTargets; //5
uint32 castersGrouped; //6
uint32 ritualNoTargetCheck; //7
} 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
struct
{
uint32 spellId; //0
uint32 charges; //1
uint32 partyOnly; //2
uint32 spellId2; //3 (is it used in this way?)
} spellcaster;
//23 GAMEOBJECT_TYPE_MEETINGSTONE
struct
{
uint32 minLevel; //0
uint32 maxLevel; //1
uint32 areaID; //2
} 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
struct
{
@ -135,8 +249,77 @@ struct GameobjectTemplate
uint32 lootId; //1
uint32 minSuccessOpens; //2
uint32 maxSuccessOpens; //3
uint32 lockId; //4 possibly 1628 for all?
uint32 lockId; //4 -> Lock.dbc; possibly 1628 for all?
} 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
struct // GAMEOBJECT_TYPE_SPELLCASTER

View File

@ -39,11 +39,14 @@ void WorldSession::_HandleItemQuerySingleResponseOpcode(WorldPacket& recvPacket)
recvPacket >> proto->MaxCount;
recvPacket >> proto->Stackable;
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].ItemStatValue;
}
recvPacket >> proto->ScalingStatDistribution;
recvPacket >> proto->ScalingStatValue;
for(int i = 0; i < 5; i++)
{
recvPacket >> proto->Damage[i].DamageMin;
@ -97,6 +100,8 @@ void WorldSession::_HandleItemQuerySingleResponseOpcode(WorldPacket& recvPacket)
recvPacket >> proto->ExtendedCost;
recvPacket >> proto->RequiredDisenchantSkill;
recvPacket >> proto->ArmorDamageModifier;
recvPacket >> proto->Duration;
recvPacket >> proto->ItemLimitCategory;
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());

View File

@ -211,7 +211,9 @@ enum INVENTORY_CLASS
ITEM_CLASS_QUEST = 12,
ITEM_CLASS_KEY = 13,
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
@ -236,7 +238,8 @@ enum ITEM_SUBCLASS_CONTAINER
ITEM_SUBCLASS_ENGINEERING_CONTAINER = 4,
ITEM_SUBCLASS_GEM_CONTAINER = 5,
ITEM_SUBCLASS_MINING_CONTAINER = 6,
ITEM_SUBCLASS_LEATHERWORKING_CONTAINER = 7
ITEM_SUBCLASS_LEATHERWORKING_CONTAINER = 7,
ITEM_SUBCLASS_INSCRIPTION_CONTAINER = 8
};
enum INVENTORY_SUBCLASS_WEAPON
@ -272,7 +275,11 @@ enum ITEM_SUBCLASS_ARMOR
ITEM_SUBCLASS_ARMOR_MAIL = 3,
ITEM_SUBCLASS_ARMOR_PLATE = 4,
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
@ -295,7 +302,10 @@ enum ITEM_SUBCLASS_TRADE_GOODS
ITEM_SUBCLASS_HERB = 9,
ITEM_SUBCLASS_ELEMENTAZL = 10,
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
@ -376,7 +386,10 @@ struct ItemProto
uint32 MaxCount;
uint32 Stackable;
uint32 ContainerSlots;
uint32 StatsCount;
_ItemStat ItemStat[10];
uint32 ScalingStatDistribution; // id from ScalingStatDistribution.dbc
uint32 ScalingStatValue; // mask for selecting column in ScalingStatValues.dbc
_ItemDamage Damage[5];
uint32 Armor;
uint32 HolyRes;
@ -414,6 +427,8 @@ struct ItemProto
uint32 RequiredArenaRank;
uint32 RequiredDisenchantSkill;
float ArmorDamageModifier;
int32 Duration; // negative = realtime, positive = ingame time
uint32 ItemLimitCategory; // id from ItemLimitCategory.dbc
};
class Item : public Object

View File

@ -20,20 +20,20 @@ Object::~Object()
delete [] _uint32values;
}
void Object::_InitValues()
{
_uint32values = new uint32[ _valuescount ];
memset(_uint32values, 0, _valuescount*sizeof(uint32));
void Object::_InitValues()
{
_uint32values = new uint32[ _valuescount ];
memset(_uint32values, 0, _valuescount*sizeof(uint32));
}
void Object::Create( uint64 guid )
{
ASSERT(_valuescount > 0);
if(!_uint32values)
_InitValues();
SetUInt64Value( OBJECT_FIELD_GUID, guid );
SetUInt32Value( OBJECT_FIELD_TYPE, _type );
void Object::Create( uint64 guid )
{
ASSERT(_valuescount > 0);
if(!_uint32values)
_InitValues();
SetUInt64Value( OBJECT_FIELD_GUID, guid );
SetUInt32Value( OBJECT_FIELD_TYPE, _type );
}
@ -108,7 +108,9 @@ float WorldObject::GetDistanceZ(WorldObject* obj)
void WorldSession::_HandleDestroyObjectOpcode(WorldPacket& recvPacket)
{
uint64 guid;
recvPacket >> guid;
uint8 dummy;
recvPacket >> guid >> dummy;
logdebug("Destroy Object "I64FMT,guid);
// call script just before object removal

View File

@ -19,18 +19,19 @@
#ifndef MANGOS_OBJECTDEFINES_H
#define MANGOS_OBJECTDEFINES_H
enum HighGuid
{
HIGHGUID_ITEM = 0x4000, // blizz 4000
HIGHGUID_CONTAINER = 0x4000, // blizz 4000
HIGHGUID_PLAYER = 0x0000, // blizz 0000
HIGHGUID_GAMEOBJECT = 0xF110, // blizz F110
HIGHGUID_TRANSPORT = 0xF120, // blizz F120 (for GAMEOBJECT_TYPE_TRANSPORT)
HIGHGUID_UNIT = 0xF130, // blizz F130
HIGHGUID_PET = 0xF140, // blizz F140
HIGHGUID_DYNAMICOBJECT = 0xF100, // blizz F100
HIGHGUID_CORPSE = 0xF101, // blizz F100
HIGHGUID_MO_TRANSPORT = 0x1FC0, // blizz 1FC0 (for GAMEOBJECT_TYPE_MO_TRANSPORT)
enum HighGuid
{
HIGHGUID_ITEM = 0x4000, // blizz 4000
HIGHGUID_CONTAINER = 0x4000, // blizz 4000
HIGHGUID_PLAYER = 0x0000, // blizz 0000
HIGHGUID_GAMEOBJECT = 0xF110, // blizz F110
HIGHGUID_TRANSPORT = 0xF120, // blizz F120 (for GAMEOBJECT_TYPE_TRANSPORT)
HIGHGUID_UNIT = 0xF130, // blizz F130
HIGHGUID_PET = 0xF140, // blizz F140
HIGHGUID_VEHICLE = 0xF150,
HIGHGUID_DYNAMICOBJECT = 0xF100, // blizz F100
HIGHGUID_CORPSE = 0xF101, // blizz F100
HIGHGUID_MO_TRANSPORT = 0x1FC0, // blizz 1FC0 (for GAMEOBJECT_TYPE_MO_TRANSPORT)
};
#define IS_CREATURE_GUID(Guid) ( GUID_HIPART(Guid) == HIGHGUID_UNIT )
@ -41,4 +42,5 @@ enum HighGuid
#define IS_CORPSE_GUID(Guid) ( GUID_HIPART(Guid) == HIGHGUID_CORPSE )
#define IS_PLAYER_CORPSE_GUID(Guid) ( GUID_HIPART(Guid) == HIGHGUID_PLAYER_CORPSE )
#define IS_TRANSPORT(Guid) ( GUID_HIPART(Guid) == HIGHGUID_TRANSPORT )
#define IS_VEHICLE_GUID(Guid) ( GUID_HIPART(Guid) == HIGHGUID_VEHICLE )
#endif

View File

@ -42,8 +42,8 @@ const char* worldOpcodeNames[] =
"CMSG_ZONE_MAP",
"SMSG_ZONE_MAP",
"CMSG_DEBUG_CHANGECELLZONE",
"CMSG_EMBLAZON_TABARD_OBSOLETE",
"CMSG_UNEMBLAZON_TABARD_OBSOLETE",
"CMSG_MOVE_CHARACTER_CHEAT",
"SMSG_MOVE_CHARACTER_CHEAT",
"CMSG_RECHARGE",
"CMSG_LEARN_SPELL",
"CMSG_CREATEMONSTER",
@ -59,7 +59,7 @@ const char* worldOpcodeNames[] =
"SMSG_FORCEACTIONSHOW",
"CMSG_PETGODMODE",
"SMSG_PETGODMODE",
"SMSG_DEBUGINFOSPELLMISS_OBSOLETE",
"SMSG_REFER_A_FRIEND_EXPIRED",
"CMSG_WEATHER_SPEED_CHEAT",
"CMSG_UNDRESSPLAYER",
"CMSG_BEASTMASTER",
@ -79,7 +79,7 @@ const char* worldOpcodeNames[] =
"SMSG_DEBUG_AISTATE",
"CMSG_DISABLE_PVP_CHEAT",
"CMSG_ADVANCE_SPAWN_TIME",
"CMSG_PVP_PORT_OBSOLETE",
"SMSG_DESTRUCTIBLE_BUILDING_DAMAGE",
"CMSG_AUTH_SRP6_BEGIN",
"CMSG_AUTH_SRP6_PROOF",
"CMSG_AUTH_SRP6_RECODE",
@ -207,7 +207,7 @@ const char* worldOpcodeNames[] =
"SMSG_READ_ITEM_FAILED",
"SMSG_ITEM_COOLDOWN",
"CMSG_GAMEOBJ_USE",
"CMSG_GAMEOBJ_CHAIR_USE_OBSOLETE",
"CMSG_DESTROY_ITEMS",
"SMSG_GAMEOBJECT_CUSTOM_ANIM",
"CMSG_AREATRIGGER",
"MSG_MOVE_START_FORWARD",
@ -340,7 +340,7 @@ const char* worldOpcodeNames[] =
"SMSG_SPELL_COOLDOWN",
"SMSG_COOLDOWN_EVENT",
"CMSG_CANCEL_AURA",
"SMSG_UPDATE_AURA_DURATION",
"SMSG_UPDATE_AURA_DURATION_OBSOLETE",
"SMSG_PET_CAST_FAILED",
"MSG_CHANNEL_START",
"MSG_CHANNEL_UPDATE",
@ -364,10 +364,10 @@ const char* worldOpcodeNames[] =
"SMSG_DAMAGE_DONE_OBSOLETE",
"SMSG_DAMAGE_TAKEN_OBSOLETE",
"SMSG_CANCEL_COMBAT",
"SMSG_PLAYER_COMBAT_XP_GAIN_OBSOLETE",
"SMSG_SPELLBREAKLOG",
"SMSG_SPELLHEALLOG",
"SMSG_SPELLENERGIZELOG",
"CMSG_SHEATHE_OBSOLETE",
"SMSG_BREAK_TARGET",
"CMSG_SAVE_PLAYER",
"CMSG_SETDEATHBINDPOINT",
"SMSG_BINDPOINTUPDATE",
@ -571,7 +571,7 @@ const char* worldOpcodeNames[] =
"SMSG_GMTICKET_SYSTEMSTATUS",
"CMSG_SPIRIT_HEALER_ACTIVATE",
"CMSG_SET_STAT_CHEAT",
"SMSG_SET_REST_START",
"SMSG_SET_REST_START_OBSOLETE",
"CMSG_SKILL_BUY_STEP",
"CMSG_SKILL_BUY_RANK",
"CMSG_XP_CHEAT",
@ -726,8 +726,8 @@ const char* worldOpcodeNames[] =
"SMSG_SCRIPT_MESSAGE",
"SMSG_DUEL_COUNTDOWN",
"SMSG_AREA_TRIGGER_MESSAGE",
"CMSG_TOGGLE_HELM",
"CMSG_TOGGLE_CLOAK",
"CMSG_SHOWING_HELM",
"CMSG_SHOWING_CLOAK",
"SMSG_MEETINGSTONE_JOINFAILED",
"SMSG_PLAYER_SKINNED",
"SMSG_DURABILITY_DAMAGE_DEATH",
@ -960,10 +960,10 @@ const char* worldOpcodeNames[] =
"SMSG_VOICE_SESSION_ADJUST_PRIORITY",
"CMSG_VOICE_SET_TALKER_MUTED_REQUEST",
"SMSG_VOICE_SET_TALKER_MUTED",
"SMSG_INIT_EXTRA_AURA_INFO",
"SMSG_SET_EXTRA_AURA_INFO",
"SMSG_SET_EXTRA_AURA_INFO_NEED_UPDATE",
"SMSG_CLEAR_EXTRA_AURA_INFO",
"SMSG_INIT_EXTRA_AURA_INFO_OBSOLETE",
"SMSG_SET_EXTRA_AURA_INFO_OBSOLETE",
"SMSG_SET_EXTRA_AURA_INFO_NEED_UPDATE_OBSOLETE",
"SMSG_CLEAR_EXTRA_AURA_INFO_OBSOLETE",
"MSG_MOVE_START_DESCEND",
"CMSG_IGNORE_REQUIREMENTS_CHEAT",
"SMSG_IGNORE_REQUIREMENTS_CHEAT",
@ -973,6 +973,7 @@ const char* worldOpcodeNames[] =
"MSG_MOVE_UPDATE_CAN_FLY",
"MSG_RAID_READY_CHECK_CONFIRM",
"CMSG_VOICE_SESSION_ENABLE",
"SMSG_VOICE_SESSION_ENABLE",
"SMSG_VOICE_PARENTAL_CONTROLS",
"CMSG_GM_WHISPER",
"SMSG_GM_MESSAGECHAT",
@ -1089,6 +1090,142 @@ const char* worldOpcodeNames[] =
"SMSG_SPLINE_MOVE_SET_FLYING",
"SMSG_SPLINE_MOVE_UNSET_FLYING",
"SMSG_SUMMON_CANCEL",
"CMSG_CHANGE_PERSONAL_ARENA_RATING",
"CMSG_ALTER_APPEARANCE",
"SMSG_ENABLE_BARBER_SHOP",
"SMSG_BARBER_SHOP_RESULT",
"CMSG_CALENDAR_GET_CALENDAR",
"CMSG_CALENDAR_GET_EVENT",
"CMSG_CALENDAR_GUILD_FILTER",
"CMSG_CALENDAR_ARENA_TEAM",
"CMSG_CALENDAR_ADD_EVENT",
"CMSG_CALENDAR_UPDATE_EVENT",
"CMSG_CALENDAR_REMOVE_EVENT",
"CMSG_CALENDAR_COPY_EVENT",
"CMSG_CALENDAR_EVENT_INVITE",
"CMSG_CALENDAR_EVENT_RSVP",
"CMSG_CALENDAR_EVENT_REMOVE_INVITE",
"CMSG_CALENDAR_EVENT_STATUS",
"CMSG_CALENDAR_EVENT_MODERATOR_STATUS",
"SMSG_CALENDAR_SEND_CALENDAR",
"SMSG_CALENDAR_SEND_EVENT",
"SMSG_CALENDAR_FILTER_GUILD",
"SMSG_CALENDAR_ARENA_TEAM",
"SMSG_CALENDAR_EVENT_INVITE",
"SMSG_CALENDAR_EVENT_INVITE_REMOVED",
"SMSG_CALENDAR_EVENT_STATUS",
"SMSG_CALENDAR_COMMAND_RESULT",
"SMSG_CALENDAR_RAID_LOCKOUT_ADDED",
"SMSG_CALENDAR_RAID_LOCKOUT_REMOVED",
"SMSG_CALENDAR_EVENT_INVITE_ALERT",
"SMSG_CALENDAR_EVENT_INVITE_REMOVED_ALERT",
"SMSG_CALENDAR_EVENT_INVITE_STATUS_ALERT",
"SMSG_CALENDAR_EVENT_REMOVED_ALERT",
"SMSG_CALENDAR_EVENT_UPDATED_ALERT",
"SMSG_CALENDAR_EVENT_MODERATOR_STATUS_ALERT",
"CMSG_CALENDAR_COMPLAIN",
"CMSG_CALENDAR_GET_NUM_PENDING",
"SMSG_CALENDAR_SEND_NUM_PENDING",
"CMSG_SAVE_DANCE",
"SMSG_NOTIFY_DANCE",
"CMSG_PLAY_DANCE",
"SMSG_PLAY_DANCE",
"CMSG_LOAD_DANCES",
"CMSG_STOP_DANCE",
"SMSG_STOP_DANCE",
"CMSG_SYNC_DANCE",
"CMSG_DANCE_QUERY",
"SMSG_DANCE_QUERY_RESPONSE",
"SMSG_INVALIDATE_DANCE",
"CMSG_DELETE_DANCE",
"SMSG_LEARNED_DANCE_MOVES",
"CMSG_LEARN_DANCE_MOVE",
"CMSG_UNLEARN_DANCE_MOVE",
"CMSG_SET_RUNE_COUNT",
"CMSG_SET_RUNE_COOLDOWN",
"MSG_MOVE_SET_PITCH_RATE_CHEAT",
"MSG_MOVE_SET_PITCH_RATE",
"SMSG_FORCE_PITCH_RATE_CHANGE",
"CMSG_FORCE_PITCH_RATE_CHANGE_ACK",
"SMSG_SPLINE_SET_PITCH_RATE",
"SMSG_MOVE_ABANDON_TRANSPORT",
"MSG_MOVE_ABANDON_TRANSPORT",
"CMSG_MOVE_ABANDON_TRANSPORT_ACK",
"CMSG_UPDATE_MISSILE_TRAJECTORY",
"SMSG_UPDATE_ACCOUNT_DATA_COMPLETE",
"SMSG_TRIGGER_MOVIE",
"CMSG_COMPLETE_MOVIE",
"CMSG_SET_GLYPH_SLOT",
"CMSG_SET_GLYPH",
"SMSG_ACHIEVEMENT_EARNED",
"SMSG_DYNAMIC_DROP_ROLL_RESULT",
"SMSG_CRITERIA_UPDATE",
"CMSG_QUERY_INSPECT_ACHIEVEMENTS",
"SMSG_RESPOND_INSPECT_ACHIEVEMENTS",
"CMSG_DISMISS_CONTROLLED_VEHICLE",
"CMSG_COMPLETE_ACHIEVEMENT_CHEAT",
"SMSG_QUESTUPDATE_ADD_PVP_KILL",
"CMSG_SET_CRITERIA_CHEAT",
"SMSG_GROUP_SWAP_FAILED",
"CMSG_UNITANIMTIER_CHEAT",
"CMSG_CHAR_CUSTOMIZE",
"SMSG_CHAR_CUSTOMIZE",
"SMSG_PET_RENAMEABLE",
"CMSG_REQUEST_VEHICLE_EXIT",
"CMSG_REQUEST_VEHICLE_PREV_SEAT",
"CMSG_REQUEST_VEHICLE_NEXT_SEAT",
"CMSG_REQUEST_VEHICLE_SWITCH_SEAT",
"CMSG_PET_LEARN_TALENT",
"CMSG_PET_UNLEARN_TALENTS",
"SMSG_SET_PHASE_SHIFT",
"SMSG_ALL_ACHIEVEMENT_DATA",
"CMSG_FORCE_SAY_CHEAT",
"SMSG_HEALTH_UPDATE",
"SMSG_POWER_UPDATE",
"CMSG_GAMEOBJ_REPORT_USE",
"SMSG_HIGHEST_THREAT_UPDATE",
"SMSG_THREAT_UPDATE",
"SMSG_THREAT_REMOVE",
"SMSG_THREAT_CLEAR",
"SMSG_CONVERT_RUNE",
"SMSG_RESYNC_RUNES",
"SMSG_ADD_RUNE_POWER",
"CMSG_START_QUEST",
"CMSG_REMOVE_GLYPH",
"CMSG_DUMP_OBJECTS",
"SMSG_DUMP_OBJECTS_DATA",
"CMSG_DISMISS_CRITTER",
"SMSG_NOTIFY_DEST_LOC_SPELL_CAST",
"CMSG_AUCTION_LIST_PENDING_SALES",
"SMSG_AUCTION_LIST_PENDING_SALES",
"SMSG_MODIFY_COOLDOWN",
"SMSG_PET_UPDATE_COMBO_POINTS",
"CMSG_ENABLETAXI",
"SMSG_PRE_RESURRECT",
"SMSG_AURA_UPDATE_ALL",
"SMSG_AURA_UPDATE",
"CMSG_FLOOD_GRACE_CHEAT",
"SMSG_SERVER_FIRST_ACHIEVEMENT",
"SMSG_PET_LEARNED_SPELL",
"SMSG_PET_REMOVED_SPELL",
"CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE",
"CMSG_HEARTH_AND_RESURRECT",
"SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA",
"SMSG_CRITERIA_DELETED",
"SMSG_ACHIEVEMENT_DELETED",
"CMSG_SERVER_INFO_QUERY",
"SMSG_SERVER_INFO_RESPONSE",
"CMSG_CHECK_LOGIN_CRITERIA",
"SMSG_SERVER_BUCK_DATA_START",
"CMSG_QUERY_VEHICLE_STATUS",
"SMSG_PET_GUIDS",
"SMSG_CLIENTCACHE_VERSION",
"UMSG_UNKNOWN_1191",
"UMSG_UNKNOWN_1192",
"UMSG_UNKNOWN_1193",
"UMSG_UNKNOWN_1194",
"UMSG_UNKNOWN_1195",
"UMSG_UNKNOWN_1196",
""
};

View File

@ -42,8 +42,8 @@ enum OpCodes
CMSG_ZONE_MAP = 0x00A,
SMSG_ZONE_MAP = 0x00B,
CMSG_DEBUG_CHANGECELLZONE = 0x00C,
CMSG_EMBLAZON_TABARD_OBSOLETE = 0x00D,
CMSG_UNEMBLAZON_TABARD_OBSOLETE = 0x00E,
CMSG_MOVE_CHARACTER_CHEAT = 0x00D,
SMSG_MOVE_CHARACTER_CHEAT = 0x00E,
CMSG_RECHARGE = 0x00F,
CMSG_LEARN_SPELL = 0x010,
CMSG_CREATEMONSTER = 0x011,
@ -59,7 +59,7 @@ enum OpCodes
SMSG_FORCEACTIONSHOW = 0x01B,
CMSG_PETGODMODE = 0x01C,
SMSG_PETGODMODE = 0x01D,
SMSG_DEBUGINFOSPELLMISS_OBSOLETE = 0x01E,
SMSG_REFER_A_FRIEND_EXPIRED = 0x01E,
CMSG_WEATHER_SPEED_CHEAT = 0x01F,
CMSG_UNDRESSPLAYER = 0x020,
CMSG_BEASTMASTER = 0x021,
@ -79,7 +79,7 @@ enum OpCodes
SMSG_DEBUG_AISTATE = 0x02F,
CMSG_DISABLE_PVP_CHEAT = 0x030,
CMSG_ADVANCE_SPAWN_TIME = 0x031,
CMSG_PVP_PORT_OBSOLETE = 0x032,
SMSG_DESTRUCTIBLE_BUILDING_DAMAGE = 0x032,
CMSG_AUTH_SRP6_BEGIN = 0x033,
CMSG_AUTH_SRP6_PROOF = 0x034,
CMSG_AUTH_SRP6_RECODE = 0x035,
@ -207,7 +207,7 @@ enum OpCodes
SMSG_READ_ITEM_FAILED = 0x0AF,
SMSG_ITEM_COOLDOWN = 0x0B0,
CMSG_GAMEOBJ_USE = 0x0B1,
CMSG_GAMEOBJ_CHAIR_USE_OBSOLETE = 0x0B2,
CMSG_DESTROY_ITEMS = 0x0B2,
SMSG_GAMEOBJECT_CUSTOM_ANIM = 0x0B3,
CMSG_AREATRIGGER = 0x0B4,
MSG_MOVE_START_FORWARD = 0x0B5,
@ -333,14 +333,14 @@ enum OpCodes
CMSG_NEW_SPELL_SLOT = 0x12D,
CMSG_CAST_SPELL = 0x12E,
CMSG_CANCEL_CAST = 0x12F,
SMSG_CAST_FAILED = 0x130, // old SMSG_CAST_RESULT
SMSG_CAST_FAILED = 0x130,
SMSG_SPELL_START = 0x131,
SMSG_SPELL_GO = 0x132,
SMSG_SPELL_FAILURE = 0x133,
SMSG_SPELL_COOLDOWN = 0x134,
SMSG_COOLDOWN_EVENT = 0x135,
CMSG_CANCEL_AURA = 0x136,
SMSG_UPDATE_AURA_DURATION = 0x137,
SMSG_UPDATE_AURA_DURATION_OBSOLETE = 0x137,
SMSG_PET_CAST_FAILED = 0x138,
MSG_CHANNEL_START = 0x139,
MSG_CHANNEL_UPDATE = 0x13A,
@ -364,10 +364,10 @@ enum OpCodes
SMSG_DAMAGE_DONE_OBSOLETE = 0x14C,
SMSG_DAMAGE_TAKEN_OBSOLETE = 0x14D,
SMSG_CANCEL_COMBAT = 0x14E,
SMSG_PLAYER_COMBAT_XP_GAIN_OBSOLETE = 0x14F,
SMSG_SPELLBREAKLOG = 0x14F,
SMSG_SPELLHEALLOG = 0x150,
SMSG_SPELLENERGIZELOG = 0x151,
CMSG_SHEATHE_OBSOLETE = 0x152,
SMSG_BREAK_TARGET = 0x152,
CMSG_SAVE_PLAYER = 0x153,
CMSG_SETDEATHBINDPOINT = 0x154,
SMSG_BINDPOINTUPDATE = 0x155,
@ -550,7 +550,7 @@ enum OpCodes
SMSG_GMTICKET_CREATE = 0x206,
CMSG_GMTICKET_UPDATETEXT = 0x207,
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_UPDATE_ACCOUNT_DATA = 0x20B,
SMSG_UPDATE_ACCOUNT_DATA = 0x20C,
@ -571,7 +571,7 @@ enum OpCodes
SMSG_GMTICKET_SYSTEMSTATUS = 0x21B,
CMSG_SPIRIT_HEALER_ACTIVATE = 0x21C,
CMSG_SET_STAT_CHEAT = 0x21D,
SMSG_SET_REST_START = 0x21E,
SMSG_SET_REST_START_OBSOLETE = 0x21E,
CMSG_SKILL_BUY_STEP = 0x21F,
CMSG_SKILL_BUY_RANK = 0x220,
CMSG_XP_CHEAT = 0x221,
@ -726,8 +726,8 @@ enum OpCodes
SMSG_SCRIPT_MESSAGE = 0x2B6,
SMSG_DUEL_COUNTDOWN = 0x2B7,
SMSG_AREA_TRIGGER_MESSAGE = 0x2B8,
CMSG_TOGGLE_HELM = 0x2B9,
CMSG_TOGGLE_CLOAK = 0x2BA,
CMSG_SHOWING_HELM = 0x2B9,
CMSG_SHOWING_CLOAK = 0x2BA,
SMSG_MEETINGSTONE_JOINFAILED = 0x2BB,
SMSG_PLAYER_SKINNED = 0x2BC,
SMSG_DURABILITY_DAMAGE_DEATH = 0x2BD,
@ -960,10 +960,10 @@ enum OpCodes
SMSG_VOICE_SESSION_ADJUST_PRIORITY = 0x3A0,
CMSG_VOICE_SET_TALKER_MUTED_REQUEST = 0x3A1,
SMSG_VOICE_SET_TALKER_MUTED = 0x3A2,
SMSG_INIT_EXTRA_AURA_INFO = 0x3A3,
SMSG_SET_EXTRA_AURA_INFO = 0x3A4,
SMSG_SET_EXTRA_AURA_INFO_NEED_UPDATE = 0x3A5,
SMSG_CLEAR_EXTRA_AURA_INFO = 0x3A6, // old SMSG_CAST_SUCCESS
SMSG_INIT_EXTRA_AURA_INFO_OBSOLETE = 0x3A3,
SMSG_SET_EXTRA_AURA_INFO_OBSOLETE = 0x3A4,
SMSG_SET_EXTRA_AURA_INFO_NEED_UPDATE_OBSOLETE = 0x3A5,
SMSG_CLEAR_EXTRA_AURA_INFO_OBSOLETE = 0x3A6,
MSG_MOVE_START_DESCEND = 0x3A7,
CMSG_IGNORE_REQUIREMENTS_CHEAT = 0x3A8,
SMSG_IGNORE_REQUIREMENTS_CHEAT = 0x3A9,
@ -973,126 +973,263 @@ enum OpCodes
MSG_MOVE_UPDATE_CAN_FLY = 0x3AD,
MSG_RAID_READY_CHECK_CONFIRM = 0x3AE,
CMSG_VOICE_SESSION_ENABLE = 0x3AF,
SMSG_VOICE_PARENTAL_CONTROLS = 0x3B0,
CMSG_GM_WHISPER = 0x3B1,
SMSG_GM_MESSAGECHAT = 0x3B2,
MSG_GM_GEARRATING = 0x3B3,
CMSG_COMMENTATOR_ENABLE = 0x3B4,
SMSG_COMMENTATOR_STATE_CHANGED = 0x3B5,
CMSG_COMMENTATOR_GET_MAP_INFO = 0x3B6,
SMSG_COMMENTATOR_MAP_INFO = 0x3B7,
CMSG_COMMENTATOR_GET_PLAYER_INFO = 0x3B8,
SMSG_COMMENTATOR_GET_PLAYER_INFO = 0x3B9,
SMSG_COMMENTATOR_PLAYER_INFO = 0x3BA,
CMSG_COMMENTATOR_ENTER_INSTANCE = 0x3BB,
CMSG_COMMENTATOR_EXIT_INSTANCE = 0x3BC,
CMSG_COMMENTATOR_INSTANCE_COMMAND = 0x3BD,
SMSG_CLEAR_TARGET = 0x3BE,
CMSG_BOT_DETECTED = 0x3BF,
SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x3C0,
CMSG_CHEAT_PLAYER_LOGIN = 0x3C1,
CMSG_CHEAT_PLAYER_LOOKUP = 0x3C2,
SMSG_CHEAT_PLAYER_LOOKUP = 0x3C3,
SMSG_KICK_REASON = 0x3C4,
MSG_RAID_READY_CHECK_FINISHED = 0x3C5,
CMSG_COMPLAIN = 0x3C6,
SMSG_COMPLAIN_RESULT = 0x3C7,
SMSG_FEATURE_SYSTEM_STATUS = 0x3C8,
CMSG_GM_SHOW_COMPLAINTS = 0x3C9,
CMSG_GM_UNSQUELCH = 0x3CA,
CMSG_CHANNEL_SILENCE_VOICE = 0x3CB,
CMSG_CHANNEL_SILENCE_ALL = 0x3CC,
CMSG_CHANNEL_UNSILENCE_VOICE = 0x3CD,
CMSG_CHANNEL_UNSILENCE_ALL = 0x3CE,
CMSG_TARGET_CAST = 0x3CF,
CMSG_TARGET_SCRIPT_CAST = 0x3D0,
CMSG_CHANNEL_DISPLAY_LIST = 0x3D1,
CMSG_SET_ACTIVE_VOICE_CHANNEL = 0x3D2,
CMSG_GET_CHANNEL_MEMBER_COUNT = 0x3D3,
SMSG_CHANNEL_MEMBER_COUNT = 0x3D4,
CMSG_CHANNEL_VOICE_ON = 0x3D5,
CMSG_CHANNEL_VOICE_OFF = 0x3D6,
CMSG_DEBUG_LIST_TARGETS = 0x3D7,
SMSG_DEBUG_LIST_TARGETS = 0x3D8,
SMSG_AVAILABLE_VOICE_CHANNEL = 0x3D9,
CMSG_ADD_VOICE_IGNORE = 0x3DA,
CMSG_DEL_VOICE_IGNORE = 0x3DB,
CMSG_PARTY_SILENCE = 0x3DC,
CMSG_PARTY_UNSILENCE = 0x3DD,
MSG_NOTIFY_PARTY_SQUELCH = 0x3DE,
SMSG_COMSAT_RECONNECT_TRY = 0x3DF,
SMSG_COMSAT_DISCONNECT = 0x3E0,
SMSG_COMSAT_CONNECT_FAIL = 0x3E1,
SMSG_VOICE_CHAT_STATUS = 0x3E2,
CMSG_REPORT_PVP_AFK = 0x3E3,
CMSG_REPORT_PVP_AFK_RESULT = 0x3E4,
CMSG_GUILD_BANKER_ACTIVATE = 0x3E5,
CMSG_GUILD_BANK_QUERY_TAB = 0x3E6,
SMSG_GUILD_BANK_LIST = 0x3E7,
CMSG_GUILD_BANK_SWAP_ITEMS = 0x3E8,
CMSG_GUILD_BANK_BUY_TAB = 0x3E9,
CMSG_GUILD_BANK_UPDATE_TAB = 0x3EA,
CMSG_GUILD_BANK_DEPOSIT_MONEY = 0x3EB,
CMSG_GUILD_BANK_WITHDRAW_MONEY = 0x3EC,
MSG_GUILD_BANK_LOG_QUERY = 0x3ED,
CMSG_SET_CHANNEL_WATCH = 0x3EE,
SMSG_USERLIST_ADD = 0x3EF,
SMSG_USERLIST_REMOVE = 0x3F0,
SMSG_USERLIST_UPDATE = 0x3F1,
CMSG_CLEAR_CHANNEL_WATCH = 0x3F2,
SMSG_INSPECT_TALENT = 0x3F3,
SMSG_GOGOGO_OBSOLETE = 0x3F4,
SMSG_ECHO_PARTY_SQUELCH = 0x3F5,
CMSG_SET_TITLE_SUFFIX = 0x3F6,
CMSG_SPELLCLICK = 0x3F7,
SMSG_LOOT_LIST = 0x3F8,
CMSG_GM_CHARACTER_RESTORE = 0x3F9,
CMSG_GM_CHARACTER_SAVE = 0x3FA,
SMSG_VOICESESSION_FULL = 0x3FB,
MSG_GUILD_PERMISSIONS = 0x3FC,
MSG_GUILD_BANK_MONEY_WITHDRAWN = 0x3FD,
MSG_GUILD_EVENT_LOG_QUERY = 0x3FE,
CMSG_MAELSTROM_RENAME_GUILD = 0x3FF,
CMSG_GET_MIRRORIMAGE_DATA = 0x400,
SMSG_MIRRORIMAGE_DATA = 0x401,
SMSG_FORCE_DISPLAY_UPDATE = 0x402,
SMSG_SPELL_CHANCE_RESIST_PUSHBACK = 0x403,
CMSG_IGNORE_DIMINISHING_RETURNS_CHEAT = 0x404,
SMSG_IGNORE_DIMINISHING_RETURNS_CHEAT = 0x405,
CMSG_KEEP_ALIVE = 0x406,
SMSG_RAID_READY_CHECK_ERROR = 0x407,
CMSG_OPT_OUT_OF_LOOT = 0x408,
MSG_QUERY_GUILD_BANK_TEXT = 0x409,
CMSG_SET_GUILD_BANK_TEXT = 0x40A,
CMSG_SET_GRANTABLE_LEVELS = 0x40B,
CMSG_GRANT_LEVEL = 0x40C,
CMSG_REFER_A_FRIEND = 0x40D,
MSG_GM_CHANGE_ARENA_RATING = 0x40E,
CMSG_DECLINE_CHANNEL_INVITE = 0x40F,
CMSG_GROUPACTION_THROTTLED = 0x410,
SMSG_OVERRIDE_LIGHT = 0x411,
SMSG_TOTEM_CREATED = 0x412,
CMSG_TOTEM_DESTROYED = 0x413,
CMSG_EXPIRE_RAID_INSTANCE = 0x414,
CMSG_NO_SPELL_VARIANCE = 0x415,
CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY = 0x416,
SMSG_QUESTGIVER_STATUS_MULTIPLE = 0x417,
CMSG_SET_PLAYER_DECLINED_NAMES = 0x418,
SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x419,
CMSG_QUERY_SERVER_BUCK_DATA = 0x41A,
CMSG_CLEAR_SERVER_BUCK_DATA = 0x41B,
SMSG_SERVER_BUCK_DATA = 0x41C,
SMSG_SEND_UNLEARN_SPELLS = 0x41D,
SMSG_PROPOSE_LEVEL_GRANT = 0x41E,
CMSG_ACCEPT_LEVEL_GRANT = 0x41F,
SMSG_REFER_A_FRIEND_FAILURE = 0x420,
SMSG_SPLINE_MOVE_SET_FLYING = 0x421,
SMSG_SPLINE_MOVE_UNSET_FLYING = 0x422,
SMSG_SUMMON_CANCEL = 0x423
SMSG_VOICE_SESSION_ENABLE = 0x3B0,
SMSG_VOICE_PARENTAL_CONTROLS = 0x3B1,
CMSG_GM_WHISPER = 0x3B2,
SMSG_GM_MESSAGECHAT = 0x3B3,
MSG_GM_GEARRATING = 0x3B4,
CMSG_COMMENTATOR_ENABLE = 0x3B5,
SMSG_COMMENTATOR_STATE_CHANGED = 0x3B6,
CMSG_COMMENTATOR_GET_MAP_INFO = 0x3B7,
SMSG_COMMENTATOR_MAP_INFO = 0x3B8,
CMSG_COMMENTATOR_GET_PLAYER_INFO = 0x3B9,
SMSG_COMMENTATOR_GET_PLAYER_INFO = 0x3BA,
SMSG_COMMENTATOR_PLAYER_INFO = 0x3BB,
CMSG_COMMENTATOR_ENTER_INSTANCE = 0x3BC,
CMSG_COMMENTATOR_EXIT_INSTANCE = 0x3BD,
CMSG_COMMENTATOR_INSTANCE_COMMAND = 0x3BE,
SMSG_CLEAR_TARGET = 0x3BF,
CMSG_BOT_DETECTED = 0x3C0,
SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x3C1,
CMSG_CHEAT_PLAYER_LOGIN = 0x3C2,
CMSG_CHEAT_PLAYER_LOOKUP = 0x3C3,
SMSG_CHEAT_PLAYER_LOOKUP = 0x3C4,
SMSG_KICK_REASON = 0x3C5,
MSG_RAID_READY_CHECK_FINISHED = 0x3C6,
CMSG_COMPLAIN = 0x3C7,
SMSG_COMPLAIN_RESULT = 0x3C8,
SMSG_FEATURE_SYSTEM_STATUS = 0x3C9,
CMSG_GM_SHOW_COMPLAINTS = 0x3CA,
CMSG_GM_UNSQUELCH = 0x3CB,
CMSG_CHANNEL_SILENCE_VOICE = 0x3CC,
CMSG_CHANNEL_SILENCE_ALL = 0x3CD,
CMSG_CHANNEL_UNSILENCE_VOICE = 0x3CE,
CMSG_CHANNEL_UNSILENCE_ALL = 0x3CF,
CMSG_TARGET_CAST = 0x3D0,
CMSG_TARGET_SCRIPT_CAST = 0x3D1,
CMSG_CHANNEL_DISPLAY_LIST = 0x3D2,
CMSG_SET_ACTIVE_VOICE_CHANNEL = 0x3D3,
CMSG_GET_CHANNEL_MEMBER_COUNT = 0x3D4,
SMSG_CHANNEL_MEMBER_COUNT = 0x3D5,
CMSG_CHANNEL_VOICE_ON = 0x3D6,
CMSG_CHANNEL_VOICE_OFF = 0x3D7,
CMSG_DEBUG_LIST_TARGETS = 0x3D8,
SMSG_DEBUG_LIST_TARGETS = 0x3D9,
SMSG_AVAILABLE_VOICE_CHANNEL = 0x3DA,
CMSG_ADD_VOICE_IGNORE = 0x3DB,
CMSG_DEL_VOICE_IGNORE = 0x3DC,
CMSG_PARTY_SILENCE = 0x3DD,
CMSG_PARTY_UNSILENCE = 0x3DE,
MSG_NOTIFY_PARTY_SQUELCH = 0x3DF,
SMSG_COMSAT_RECONNECT_TRY = 0x3E0,
SMSG_COMSAT_DISCONNECT = 0x3E1,
SMSG_COMSAT_CONNECT_FAIL = 0x3E2,
SMSG_VOICE_CHAT_STATUS = 0x3E3,
CMSG_REPORT_PVP_AFK = 0x3E4,
CMSG_REPORT_PVP_AFK_RESULT = 0x3E5,
CMSG_GUILD_BANKER_ACTIVATE = 0x3E6,
CMSG_GUILD_BANK_QUERY_TAB = 0x3E7,
SMSG_GUILD_BANK_LIST = 0x3E8,
CMSG_GUILD_BANK_SWAP_ITEMS = 0x3E9,
CMSG_GUILD_BANK_BUY_TAB = 0x3EA,
CMSG_GUILD_BANK_UPDATE_TAB = 0x3EB,
CMSG_GUILD_BANK_DEPOSIT_MONEY = 0x3EC,
CMSG_GUILD_BANK_WITHDRAW_MONEY = 0x3ED,
MSG_GUILD_BANK_LOG_QUERY = 0x3EE,
CMSG_SET_CHANNEL_WATCH = 0x3EF,
SMSG_USERLIST_ADD = 0x3F0,
SMSG_USERLIST_REMOVE = 0x3F1,
SMSG_USERLIST_UPDATE = 0x3F2,
CMSG_CLEAR_CHANNEL_WATCH = 0x3F3,
SMSG_INSPECT_TALENT = 0x3F4,
SMSG_GOGOGO_OBSOLETE = 0x3F5,
SMSG_ECHO_PARTY_SQUELCH = 0x3F6,
CMSG_SET_TITLE_SUFFIX = 0x3F7,
CMSG_SPELLCLICK = 0x3F8,
SMSG_LOOT_LIST = 0x3F9,
CMSG_GM_CHARACTER_RESTORE = 0x3FA,
CMSG_GM_CHARACTER_SAVE = 0x3FB,
SMSG_VOICESESSION_FULL = 0x3FC,
MSG_GUILD_PERMISSIONS = 0x3FD,
MSG_GUILD_BANK_MONEY_WITHDRAWN = 0x3FE,
MSG_GUILD_EVENT_LOG_QUERY = 0x3FF,
CMSG_MAELSTROM_RENAME_GUILD = 0x400,
CMSG_GET_MIRRORIMAGE_DATA = 0x401,
SMSG_MIRRORIMAGE_DATA = 0x402,
SMSG_FORCE_DISPLAY_UPDATE = 0x403,
SMSG_SPELL_CHANCE_RESIST_PUSHBACK = 0x404,
CMSG_IGNORE_DIMINISHING_RETURNS_CHEAT = 0x405,
SMSG_IGNORE_DIMINISHING_RETURNS_CHEAT = 0x406,
CMSG_KEEP_ALIVE = 0x407,
SMSG_RAID_READY_CHECK_ERROR = 0x408,
CMSG_OPT_OUT_OF_LOOT = 0x409,
MSG_QUERY_GUILD_BANK_TEXT = 0x40A,
CMSG_SET_GUILD_BANK_TEXT = 0x40B,
CMSG_SET_GRANTABLE_LEVELS = 0x40C,
CMSG_GRANT_LEVEL = 0x40D,
CMSG_REFER_A_FRIEND = 0x40E,
MSG_GM_CHANGE_ARENA_RATING = 0x40F,
CMSG_DECLINE_CHANNEL_INVITE = 0x410,
CMSG_GROUPACTION_THROTTLED = 0x411,
SMSG_OVERRIDE_LIGHT = 0x412,
SMSG_TOTEM_CREATED = 0x413,
CMSG_TOTEM_DESTROYED = 0x414,
CMSG_EXPIRE_RAID_INSTANCE = 0x415,
CMSG_NO_SPELL_VARIANCE = 0x416,
CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY = 0x417,
SMSG_QUESTGIVER_STATUS_MULTIPLE = 0x418,
CMSG_SET_PLAYER_DECLINED_NAMES = 0x419,
SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x41A,
CMSG_QUERY_SERVER_BUCK_DATA = 0x41B,
CMSG_CLEAR_SERVER_BUCK_DATA = 0x41C,
SMSG_SERVER_BUCK_DATA = 0x41D,
SMSG_SEND_UNLEARN_SPELLS = 0x41E,
SMSG_PROPOSE_LEVEL_GRANT = 0x41F,
CMSG_ACCEPT_LEVEL_GRANT = 0x420,
SMSG_REFER_A_FRIEND_FAILURE = 0x421,
SMSG_SPLINE_MOVE_SET_FLYING = 0x422,
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
#define MAX_OPCODE_ID 1060
#define MAX_OPCODE_ID 1196
/// Results of friend related commands
enum FriendsResult

View File

@ -6,119 +6,123 @@
#include "SysDefs.h"
#include "Unit.h"
#define PLAYER_SLOT_START 0
#define EQUIPMENT_SLOT_START 0
#define EQUIPMENT_SLOT_HEAD 0
#define EQUIPMENT_SLOT_NECK 1
#define EQUIPMENT_SLOT_SHOULDERS 2
#define EQUIPMENT_SLOT_BODY 3
#define EQUIPMENT_SLOT_CHEST 4
#define EQUIPMENT_SLOT_WAIST 5
#define EQUIPMENT_SLOT_LEGS 6
#define EQUIPMENT_SLOT_FEET 7
#define EQUIPMENT_SLOT_WRISTS 8
#define EQUIPMENT_SLOT_HANDS 9
#define EQUIPMENT_SLOT_FINGER1 10
#define EQUIPMENT_SLOT_FINGER2 11
#define EQUIPMENT_SLOT_TRINKET1 12
#define EQUIPMENT_SLOT_TRINKET2 13
#define EQUIPMENT_SLOT_BACK 14
#define EQUIPMENT_SLOT_MAINHAND 15
#define EQUIPMENT_SLOT_OFFHAND 16
#define EQUIPMENT_SLOT_RANGED 17
#define EQUIPMENT_SLOT_TABARD 18
#define EQUIPMENT_SLOT_END 19
#define INVENTORY_SLOT_BAG_0 255
#define INVENTORY_SLOT_BAG_START 19
#define INVENTORY_SLOT_BAG_1 19
#define INVENTORY_SLOT_BAG_2 20
#define INVENTORY_SLOT_BAG_3 21
#define INVENTORY_SLOT_BAG_4 22
#define INVENTORY_SLOT_BAG_END 23
#define INVENTORY_SLOT_ITEM_START 23
#define INVENTORY_SLOT_ITEM_1 23
#define INVENTORY_SLOT_ITEM_2 24
#define INVENTORY_SLOT_ITEM_3 25
#define INVENTORY_SLOT_ITEM_4 26
#define INVENTORY_SLOT_ITEM_5 27
#define INVENTORY_SLOT_ITEM_6 28
#define INVENTORY_SLOT_ITEM_7 29
#define INVENTORY_SLOT_ITEM_8 30
#define INVENTORY_SLOT_ITEM_9 31
#define INVENTORY_SLOT_ITEM_10 32
#define INVENTORY_SLOT_ITEM_11 33
#define INVENTORY_SLOT_ITEM_12 34
#define INVENTORY_SLOT_ITEM_13 35
#define INVENTORY_SLOT_ITEM_14 36
#define INVENTORY_SLOT_ITEM_15 37
#define INVENTORY_SLOT_ITEM_16 38
#define INVENTORY_SLOT_ITEM_END 39
#define BANK_SLOT_ITEM_START 39
#define BANK_SLOT_ITEM_1 39
#define BANK_SLOT_ITEM_2 40
#define BANK_SLOT_ITEM_3 41
#define BANK_SLOT_ITEM_4 42
#define BANK_SLOT_ITEM_5 43
#define BANK_SLOT_ITEM_6 44
#define BANK_SLOT_ITEM_7 45
#define BANK_SLOT_ITEM_8 46
#define BANK_SLOT_ITEM_9 47
#define BANK_SLOT_ITEM_10 48
#define BANK_SLOT_ITEM_11 49
#define BANK_SLOT_ITEM_12 50
#define BANK_SLOT_ITEM_13 51
#define BANK_SLOT_ITEM_14 52
#define BANK_SLOT_ITEM_15 53
#define BANK_SLOT_ITEM_16 54
#define BANK_SLOT_ITEM_17 55
#define BANK_SLOT_ITEM_18 56
#define BANK_SLOT_ITEM_19 57
#define BANK_SLOT_ITEM_20 58
#define BANK_SLOT_ITEM_21 59
#define BANK_SLOT_ITEM_22 60
#define BANK_SLOT_ITEM_23 61
#define BANK_SLOT_ITEM_24 62
#define BANK_SLOT_ITEM_END 63
#define BANK_SLOT_BAG_START 63
#define BANK_SLOT_BAG_1 63
#define BANK_SLOT_BAG_2 64
#define BANK_SLOT_BAG_3 65
#define BANK_SLOT_BAG_4 66
#define BANK_SLOT_BAG_5 67
#define BANK_SLOT_BAG_6 68
#define BANK_SLOT_BAG_END 69
// strored in m_buybackitems
#define BUYBACK_SLOT_START 69
#define BUYBACK_SLOT_1 69
#define BUYBACK_SLOT_2 70
#define BUYBACK_SLOT_3 71
#define BUYBACK_SLOT_4 72
#define BUYBACK_SLOT_5 73
#define BUYBACK_SLOT_6 74
#define BUYBACK_SLOT_7 75
#define BUYBACK_SLOT_8 76
#define BUYBACK_SLOT_9 77
#define BUYBACK_SLOT_10 78
#define BUYBACK_SLOT_11 79
#define BUYBACK_SLOT_12 80
#define BUYBACK_SLOT_END 81
#define KEYRING_SLOT_START 81
#define KEYRING_SLOT_END 97
// last+1 slot for item stored (in any way in player m_items data)
#define PLAYER_SLOT_END 97
#define PLAYER_SLOTS_COUNT (PLAYER_SLOT_END - PLAYER_SLOT_START)
#define TRADE_SLOT_COUNT 7
#define TRADE_SLOT_TRADED_COUNT 6
/*
TODO: Update me or use UpdateFields directly
#define PLAYER_SLOT_START 0
#define EQUIPMENT_SLOT_START 0
#define EQUIPMENT_SLOT_HEAD 0
#define EQUIPMENT_SLOT_NECK 1
#define EQUIPMENT_SLOT_SHOULDERS 2
#define EQUIPMENT_SLOT_BODY 3
#define EQUIPMENT_SLOT_CHEST 4
#define EQUIPMENT_SLOT_WAIST 5
#define EQUIPMENT_SLOT_LEGS 6
#define EQUIPMENT_SLOT_FEET 7
#define EQUIPMENT_SLOT_WRISTS 8
#define EQUIPMENT_SLOT_HANDS 9
#define EQUIPMENT_SLOT_FINGER1 10
#define EQUIPMENT_SLOT_FINGER2 11
#define EQUIPMENT_SLOT_TRINKET1 12
#define EQUIPMENT_SLOT_TRINKET2 13
#define EQUIPMENT_SLOT_BACK 14
#define EQUIPMENT_SLOT_MAINHAND 15
#define EQUIPMENT_SLOT_OFFHAND 16
#define EQUIPMENT_SLOT_RANGED 17
#define EQUIPMENT_SLOT_TABARD 18
#define EQUIPMENT_SLOT_END 19
#define INVENTORY_SLOT_BAG_0 255
#define INVENTORY_SLOT_BAG_START 19
#define INVENTORY_SLOT_BAG_1 19
#define INVENTORY_SLOT_BAG_2 20
#define INVENTORY_SLOT_BAG_3 21
#define INVENTORY_SLOT_BAG_4 22
#define INVENTORY_SLOT_BAG_END 23
#define INVENTORY_SLOT_ITEM_START 23
#define INVENTORY_SLOT_ITEM_1 23
#define INVENTORY_SLOT_ITEM_2 24
#define INVENTORY_SLOT_ITEM_3 25
#define INVENTORY_SLOT_ITEM_4 26
#define INVENTORY_SLOT_ITEM_5 27
#define INVENTORY_SLOT_ITEM_6 28
#define INVENTORY_SLOT_ITEM_7 29
#define INVENTORY_SLOT_ITEM_8 30
#define INVENTORY_SLOT_ITEM_9 31
#define INVENTORY_SLOT_ITEM_10 32
#define INVENTORY_SLOT_ITEM_11 33
#define INVENTORY_SLOT_ITEM_12 34
#define INVENTORY_SLOT_ITEM_13 35
#define INVENTORY_SLOT_ITEM_14 36
#define INVENTORY_SLOT_ITEM_15 37
#define INVENTORY_SLOT_ITEM_16 38
#define INVENTORY_SLOT_ITEM_END 39
#define BANK_SLOT_ITEM_START 39
#define BANK_SLOT_ITEM_1 39
#define BANK_SLOT_ITEM_2 40
#define BANK_SLOT_ITEM_3 41
#define BANK_SLOT_ITEM_4 42
#define BANK_SLOT_ITEM_5 43
#define BANK_SLOT_ITEM_6 44
#define BANK_SLOT_ITEM_7 45
#define BANK_SLOT_ITEM_8 46
#define BANK_SLOT_ITEM_9 47
#define BANK_SLOT_ITEM_10 48
#define BANK_SLOT_ITEM_11 49
#define BANK_SLOT_ITEM_12 50
#define BANK_SLOT_ITEM_13 51
#define BANK_SLOT_ITEM_14 52
#define BANK_SLOT_ITEM_15 53
#define BANK_SLOT_ITEM_16 54
#define BANK_SLOT_ITEM_17 55
#define BANK_SLOT_ITEM_18 56
#define BANK_SLOT_ITEM_19 57
#define BANK_SLOT_ITEM_20 58
#define BANK_SLOT_ITEM_21 59
#define BANK_SLOT_ITEM_22 60
#define BANK_SLOT_ITEM_23 61
#define BANK_SLOT_ITEM_24 62
#define BANK_SLOT_ITEM_END 63
#define BANK_SLOT_BAG_START 63
#define BANK_SLOT_BAG_1 63
#define BANK_SLOT_BAG_2 64
#define BANK_SLOT_BAG_3 65
#define BANK_SLOT_BAG_4 66
#define BANK_SLOT_BAG_5 67
#define BANK_SLOT_BAG_6 68
#define BANK_SLOT_BAG_END 69
// strored in m_buybackitems
#define BUYBACK_SLOT_START 69
#define BUYBACK_SLOT_1 69
#define BUYBACK_SLOT_2 70
#define BUYBACK_SLOT_3 71
#define BUYBACK_SLOT_4 72
#define BUYBACK_SLOT_5 73
#define BUYBACK_SLOT_6 74
#define BUYBACK_SLOT_7 75
#define BUYBACK_SLOT_8 76
#define BUYBACK_SLOT_9 77
#define BUYBACK_SLOT_10 78
#define BUYBACK_SLOT_11 79
#define BUYBACK_SLOT_12 80
#define BUYBACK_SLOT_END 81
#define KEYRING_SLOT_START 81
#define KEYRING_SLOT_END 97
// last+1 slot for item stored (in any way in player m_items data)
#define PLAYER_SLOT_END 97
#define PLAYER_SLOTS_COUNT (PLAYER_SLOT_END - PLAYER_SLOT_START)
#define TRADE_SLOT_COUNT 7
#define TRADE_SLOT_TRADED_COUNT 6
#define TRADE_SLOT_NONTRADED 6
*/
struct PlayerEnumItem
{
@ -207,4 +211,4 @@ private:
};
#endif
#endif

View File

@ -55,7 +55,7 @@ enum Classes
CLASS_HUNTER = 3,
CLASS_ROGUE = 4,
CLASS_PRIEST = 5,
// CLASS_UNK1 = 6, unused
CLASS_DEATH_KNIGHT = 6,
CLASS_SHAMAN = 7,
CLASS_MAGE = 8,
CLASS_WARLOCK = 9,
@ -140,7 +140,8 @@ enum ItemQualities
ITEM_QUALITY_RARE = 3, //BLUE
ITEM_QUALITY_EPIC = 4, //PURPLE
ITEM_QUALITY_LEGENDARY = 5, //ORANGE
ITEM_QUALITY_ARTIFACT = 6 //LIGHT YELLOW
ITEM_QUALITY_ARTIFACT = 6, //LIGHT YELLOW
ITEM_QUALITY_HEIRLOOM = 7
};
enum sheathTypes
@ -209,7 +210,7 @@ enum SpellEffects
SPELL_EFFECT_TELEPORT_UNITS = 5,
SPELL_EFFECT_APPLY_AURA = 6,
SPELL_EFFECT_ENVIRONMENTAL_DAMAGE = 7,
SPELL_EFFECT_MANA_DRAIN = 8,
SPELL_EFFECT_POWER_DRAIN = 8,
SPELL_EFFECT_HEALTH_LEECH = 9,
SPELL_EFFECT_HEAL = 10,
SPELL_EFFECT_BIND = 11,
@ -236,7 +237,7 @@ enum SpellEffects
SPELL_EFFECT_TRIGGER_MISSILE = 32,
SPELL_EFFECT_OPEN_LOCK = 33,
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_SPELL_DEFENSE = 37,
SPELL_EFFECT_DISPEL = 38,
@ -246,12 +247,11 @@ enum SpellEffects
SPELL_EFFECT_SUMMON_GUARDIAN = 42,
SPELL_EFFECT_TELEPORT_UNITS_FACE_CASTER= 43,
SPELL_EFFECT_SKILL_STEP = 44,
SPELL_EFFECT_UNDEFINED_45 = 45,
SPELL_EFFECT_ADD_HONOR = 45,
SPELL_EFFECT_SPAWN = 46,
SPELL_EFFECT_TRADE_SKILL = 47,
SPELL_EFFECT_STEALTH = 48,
SPELL_EFFECT_DETECT = 49,
// SPELL_EFFECT_SUMMON_OBJECT = 50,
SPELL_EFFECT_TRANS_DOOR = 50,
SPELL_EFFECT_FORCE_CRITICAL_HIT = 51,
SPELL_EFFECT_GUARANTEE_HIT = 52,
@ -267,16 +267,16 @@ enum SpellEffects
SPELL_EFFECT_POWER_BURN = 62,
SPELL_EFFECT_THREAT = 63,
SPELL_EFFECT_TRIGGER_SPELL = 64,
SPELL_EFFECT_HEALTH_FUNNEL = 65,
SPELL_EFFECT_POWER_FUNNEL = 66,
SPELL_EFFECT_APPLY_AREA_AURA_RAID = 65,
SPELL_EFFECT_CREATE_MANA_GEM = 66,
SPELL_EFFECT_HEAL_MAX_HEALTH = 67,
SPELL_EFFECT_INTERRUPT_CAST = 68,
SPELL_EFFECT_DISTRACT = 69,
SPELL_EFFECT_PULL = 70,
SPELL_EFFECT_PICKPOCKET = 71,
SPELL_EFFECT_ADD_FARSIGHT = 72,
SPELL_EFFECT_SUMMON_POSSESSED = 73,
SPELL_EFFECT_SUMMON_TOTEM = 74,
SPELL_EFFECT_UNTRAIN_TALENTS = 73,
SPELL_EFFECT_APPLY_GLYPH = 74,
SPELL_EFFECT_HEAL_MECHANICAL = 75,
SPELL_EFFECT_SUMMON_OBJECT_WILD = 76,
SPELL_EFFECT_SCRIPT_EFFECT = 77,
@ -289,10 +289,10 @@ enum SpellEffects
SPELL_EFFECT_STUCK = 84,
SPELL_EFFECT_SUMMON_PLAYER = 85,
SPELL_EFFECT_ACTIVATE_OBJECT = 86,
SPELL_EFFECT_SUMMON_TOTEM_SLOT1 = 87,
SPELL_EFFECT_SUMMON_TOTEM_SLOT2 = 88,
SPELL_EFFECT_SUMMON_TOTEM_SLOT3 = 89,
SPELL_EFFECT_SUMMON_TOTEM_SLOT4 = 90,
SPELL_EFFECT_WMO_DAMAGE = 87,
SPELL_EFFECT_WMO_REPAIR = 88,
SPELL_EFFECT_WMO_CHANGE = 89,
SPELL_EFFECT_KILL_CREDIT = 90,
SPELL_EFFECT_THREAT_ALL = 91,
SPELL_EFFECT_ENCHANT_HELD_ITEM = 92,
SPELL_EFFECT_SUMMON_PHANTASM = 93,
@ -321,38 +321,48 @@ enum SpellEffects
SPELL_EFFECT_SKIN_PLAYER_CORPSE = 116,
SPELL_EFFECT_SPIRIT_HEAL = 117,
SPELL_EFFECT_SKILL = 118,
SPELL_EFFECT_APPLY_AURA_NEW = 119,
SPELL_EFFECT_APPLY_AREA_AURA_PET = 119,
SPELL_EFFECT_TELEPORT_GRAVEYARD = 120,
SPELL_EFFECT_NORMALIZED_WEAPON_DMG = 121,
SPELL_EFFECT_122 = 122,
SPELL_EFFECT_123 = 123,
SPELL_EFFECT_124 = 124,
SPELL_EFFECT_REDUCE_THREAT_PERCENT = 125,
SPELL_EFFECT_126 = 126,
SPELL_EFFECT_SEND_TAXI = 123,
SPELL_EFFECT_PLAYER_PULL = 124,
SPELL_EFFECT_MODIFY_THREAT_PERCENT = 125,
SPELL_EFFECT_STEAL_BENEFICIAL_BUFF = 126,
SPELL_EFFECT_PROSPECTING = 127,
SPELL_EFFECT_128 = 128,
SPELL_EFFECT_129 = 129,
SPELL_EFFECT_130 = 130,
SPELL_EFFECT_APPLY_AREA_AURA_FRIEND = 128,
SPELL_EFFECT_APPLY_AREA_AURA_ENEMY = 129,
SPELL_EFFECT_REDIRECT_THREAT = 130,
SPELL_EFFECT_131 = 131,
SPELL_EFFECT_132 = 132,
SPELL_EFFECT_133 = 133,
SPELL_EFFECT_134 = 134,
SPELL_EFFECT_UNLEARN_SPECIALIZATION = 133,
SPELL_EFFECT_KILL_CREDIT2 = 134,
SPELL_EFFECT_135 = 135,
SPELL_EFFECT_136 = 136,
SPELL_EFFECT_137 = 137,
SPELL_EFFECT_HEAL_PCT = 136,
SPELL_EFFECT_ENERGIZE_PCT = 137,
SPELL_EFFECT_138 = 138,
SPELL_EFFECT_139 = 139,
SPELL_EFFECT_140 = 140,
SPELL_EFFECT_CLEAR_QUEST = 139,
SPELL_EFFECT_FORCE_CAST = 140,
SPELL_EFFECT_141 = 141,
SPELL_EFFECT_142 = 142,
SPELL_EFFECT_143 = 143,
SPELL_EFFECT_TRIGGER_SPELL_WITH_VALUE = 142,
SPELL_EFFECT_APPLY_AREA_AURA_OWNER = 143,
SPELL_EFFECT_144 = 144,
SPELL_EFFECT_145 = 145,
SPELL_EFFECT_146 = 146,
SPELL_EFFECT_147 = 147,
SPELL_EFFECT_ACTIVATE_RUNE = 146,
SPELL_EFFECT_QUEST_FAIL = 147,
SPELL_EFFECT_148 = 148,
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
@ -404,7 +414,8 @@ enum GameobjectTypes
GAMEOBJECT_TYPE_DO_NOT_USE_YET = 32,
GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING = 33,
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
@ -924,7 +935,9 @@ enum LockType
LOCKTYPE_BLASTING = 16,
LOCKTYPE_SLOW_OPEN = 17,
LOCKTYPE_SLOW_CLOSE = 18,
LOCKTYPE_FISHING = 19
LOCKTYPE_FISHING = 19,
LOCKTYPE_INSCRIPTION = 20,
LOCKTYPE_OPEN_FROM_VEHICLE = 21
};
enum TrainerType
@ -974,7 +987,7 @@ enum CreatureFamily
CREATURE_FAMILY_IMP = 23,
CREATURE_FAMILY_BAT = 24,
CREATURE_FAMILY_HYENA = 25,
CREATURE_FAMILY_OWL = 26,
CREATURE_FAMILY_BIRD_OF_PREY = 26,
CREATURE_FAMILY_WIND_SERPENT = 27,
CREATURE_FAMILY_REMOTE_CONTROL = 28,
CREATURE_FAMILY_FELGUARD = 29,
@ -984,7 +997,17 @@ enum CreatureFamily
CREATURE_FAMILY_SPOREBAT = 33,
CREATURE_FAMILY_NETHER_RAY = 34,
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
@ -1007,7 +1030,9 @@ enum QuestTypes
QUEST_TYPE_LEGENDARY = 83,
QUEST_TYPE_ESCORT = 84,
QUEST_TYPE_HEROIC = 85,
QUEST_TYPE_DAILY = 87
QUEST_TYPE_DAILY = 87,
QUEST_TYPE_RAID_10 = 88,
QUEST_TYPE_RAID_25 = 89
};
enum CreatureType
@ -1032,7 +1057,7 @@ enum QuestSort
QUEST_SORT_SEASONAL = 22,
QUEST_SORT_UNDERCITY_OLD = 23,
QUEST_SORT_HERBALISM = 24,
QUEST_SORT_SCARLET_MONASTERY_OLD= 25,
QUEST_SORT_BATTLEGROUNDS = 25,
QUEST_SORT_ULDAMN_OLD = 41,
QUEST_SORT_WARLOCK = 61,
QUEST_SORT_WARRIOR = 81,
@ -1060,7 +1085,11 @@ enum QuestSort
QUEST_SORT_LUNAR_FESTIVAL = 366,
QUEST_SORT_REPUTATION = 367,
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
@ -1070,7 +1099,6 @@ enum SkillType
SKILL_ARMS = 26,
SKILL_COMBAT = 38,
SKILL_SUBTLETY = 39,
SKILL_POISONS = 40,
SKILL_SWORDS = 43,
SKILL_AXES = 44,
SKILL_BOWS = 45,
@ -1078,8 +1106,8 @@ enum SkillType
SKILL_BEAST_MASTERY = 50,
SKILL_SURVIVAL = 51,
SKILL_MACES = 54,
SKILL_HOLY = 56,
SKILL_2H_SWORDS = 55,
SKILL_HOLY = 56,
SKILL_SHADOW = 78,
SKILL_DEFENSE = 95,
SKILL_LANG_COMMON = 98,
@ -1135,24 +1163,20 @@ enum SkillType
SKILL_PET_BOAR = 211,
SKILL_PET_CROCILISK = 212,
SKILL_PET_CARRION_BIRD = 213,
SKILL_PET_GORILLA = 215,
SKILL_PET_CRAB = 214,
SKILL_PET_GORILLA = 215,
SKILL_PET_RAPTOR = 217,
SKILL_PET_TALLSTRIDER = 218,
SKILL_RACIAL_UNDED = 220,
SKILL_WEAPON_TALENTS = 222,
SKILL_CROSSBOWS = 226,
SKILL_SPEARS = 227,
SKILL_WANDS = 228,
SKILL_POLEARMS = 229,
SKILL_PET_SCORPID = 236,
SKILL_ARCANE = 237,
SKILL_OPEN_LOCK = 242,
SKILL_PET_TURTLE = 251,
SKILL_ASSASSINATION = 253,
SKILL_FURY = 256,
SKILL_PROTECTION = 257,
SKILL_BEAST_TRAINING = 261,
SKILL_PROTECTION2 = 267,
SKILL_PET_TALENTS = 270,
SKILL_PLATE_MAIL = 293,
@ -1182,7 +1206,7 @@ enum SkillType
SKILL_LOCKPICKING = 633,
SKILL_PET_BAT = 653,
SKILL_PET_HYENA = 654,
SKILL_PET_OWL = 655,
SKILL_PET_BIRD_OF_PREY = 655,
SKILL_PET_WIND_SERPENT = 656,
SKILL_LANG_GUTTERSPEAK = 673,
SKILL_RIDING_KODO = 713,
@ -1201,7 +1225,25 @@ enum SkillType
SKILL_PET_SPOREBAT = 765,
SKILL_PET_WARP_STALKER = 766,
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
{
TC_SKINNING_SKIFE = 1,
TC_SKINNING_SKIFE_OLD = 1,
TC_EARTH_TOTEM = 2,
TC_AIR_TOTEM = 3,
TC_FIRE_TOTEM = 4,
@ -1229,15 +1271,28 @@ enum TotemCategory
TC_GOLDEN_ROD = 8,
TC_TRUESILVER_ROD = 9,
TC_ARCANITE_ROD = 10,
TC_MINING_PICK = 11,
TC_MINING_PICK_OLD = 11,
TC_PHILOSOPHERS_STONE = 12,
TC_BLACKSMITH_HAMMER = 13,
TC_BLACKSMITH_HAMMER_OLD = 13,
TC_ARCLIGHT_SPANNER = 14,
TC_GYROMATIC_MA = 15,
TC_MASTER_TOTEM = 21,
TC_FEL_IRON_ROD = 41,
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
@ -1247,7 +1302,8 @@ enum UnitDynFlags
UNIT_DYNFLAG_OTHER_TAGGER = 0x0004,
UNIT_DYNFLAG_ROOTED = 0x0008,
UNIT_DYNFLAG_SPECIALINFO = 0x0010,
UNIT_DYNFLAG_DEAD = 0x0020
UNIT_DYNFLAG_DEAD = 0x0020,
UNIT_DYNFLAG_REFER_A_FRIEND = 0x0040
};
enum UnitFlags1
@ -1310,6 +1366,9 @@ enum ChatMsg
CHAT_MSG_BATTLEGROUND = 0x2C,
CHAT_MSG_BATTLEGROUND_LEADER = 0x2D,
CHAT_MSG_RESTRICTED = 0x2E,
CHAT_MSG_BN = 0x2F,
CHAT_MSG_ACHIEVEMENT = 0x30,
CHAT_MSG_GUILD_ACHIEVEMENT = 0x31
};
enum SpellCastTargetFlags

View File

@ -13,9 +13,10 @@ enum UnitMoveType
MOVE_TURN = 5,
MOVE_FLY = 6,
MOVE_FLYBACK = 7,
MAX_MOVE_TYPE = 8
};
MOVE_PITCH_RATE = 8,
MAX_MOVE_TYPE = 9
};
enum UnitFlags
{
UNIT_FLAG_NONE = 0x00000000,
@ -39,30 +40,30 @@ enum UnitFlags
UNIT_FLAG_SKINNABLE = 0x04000000,
UNIT_FLAG_UNKNOWN6 = 0x20000000, // used in Feing Death spell
UNIT_FLAG_SHEATHE = 0x40000000
};
struct CreatureTemplate
{
uint32 entry;
std::string name;
std::string subname;
std::string directions;
uint32 flag1;
uint32 type;
uint32 family;
uint32 rank;
//uint32 unk1;
uint32 SpellDataId;
uint32 displayid_A;
uint32 displayid_H;
uint32 displayid_AF;
uint32 displayid_HF;
//float unkf1;
//float unkf2;
uint8 RacialLeader;
};
};
struct CreatureTemplate
{
uint32 entry;
std::string name;
std::string subname;
std::string directions;
uint32 flag1;
uint32 type;
uint32 family;
uint32 rank;
//uint32 unk1;
uint32 SpellDataId;
uint32 displayid_A;
uint32 displayid_H;
uint32 displayid_AF;
uint32 displayid_HF;
//float unkf1;
//float unkf2;
uint8 RacialLeader;
};
class Unit : public WorldObject
@ -81,4 +82,4 @@ protected:
};
#endif
#endif

View File

@ -37,11 +37,12 @@ void WorldSession::_HandleCompressedUpdateObjectOpcode(WorldPacket& recvPacket)
void WorldSession::_HandleUpdateObjectOpcode(WorldPacket& recvPacket)
{
uint8 utype;
uint8 hasTransport;
//uint8 hasTransport;
uint32 usize, ublocks, readblocks=0;
uint64 uguid;
recvPacket >> ublocks >> hasTransport;
logdev("UpdateObject: blocks = %u, hasTransport = %u", ublocks, hasTransport);
recvPacket >> ublocks; // >> hasTransport;
//logdev("UpdateObject: blocks = %u, hasTransport = %u", ublocks, hasTransport);
logdev("UpdateObject: blocks = %u", ublocks);
while((recvPacket.rpos() < recvPacket.size())&& (readblocks < ublocks))
{
recvPacket >> utype;
@ -237,7 +238,7 @@ void WorldSession::_MovementUpdate(uint8 objtypeid, uint64 uguid, WorldPacket& r
uint8 flags;
float unkfx,unkfy,unkfz;
// 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;
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?)
if(flags & UPDATEFLAG_LIVING)
{
recvPacket >> mi.flags >> mi.unk1 >> mi.time;
recvPacket >> mi.flags >> mi.unkFlags >> mi.time;
}
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);
if(flags & UPDATEFLAG_HASPOSITION)
if(flags & UPDATEFLAG_HAS_POSITION)
{
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_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);
}
if(mi.flags & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_UNK5))
if((mi.flags & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_UNK5)) || (mi.unkFlags & 0x20))
{
recvPacket >> mi.s_angle;
logdev("MovementUpdate: MOVEMENTFLAG_SWIMMING is set, angle = %f!", mi.s_angle);
@ -317,18 +319,20 @@ 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 >> 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);
if(u)
{
u->SetPosition(mi.x, mi.y, mi.z, mi.o);
u->SetSpeed(MOVE_WALK,speedWalk);
u->SetSpeed(MOVE_RUN,speedRun);
u->SetSpeed(MOVE_SWIMBACK,speedSwimBack);
u->SetSpeed(MOVE_SWIM,speedSwim);
u->SetSpeed(MOVE_WALKBACK,speedWalkBack);
u->SetSpeed(MOVE_TURN,speedTurn);
u->SetSpeed(MOVE_FLY,speedFly);
u->SetSpeed(MOVE_FLYBACK,speedFlyBack);
u->SetSpeed(MOVE_WALK, speedWalk);
u->SetSpeed(MOVE_RUN, speedRun);
u->SetSpeed(MOVE_SWIMBACK, speedSwimBack);
u->SetSpeed(MOVE_SWIM, speedSwim);
u->SetSpeed(MOVE_WALKBACK, speedWalkBack);
u->SetSpeed(MOVE_TURN, speedTurn);
u->SetSpeed(MOVE_FLY, speedFly);
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
@ -353,7 +357,7 @@ void WorldSession::_MovementUpdate(uint8 objtypeid, uint64 uguid, WorldPacket& r
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
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);
}
if(flags & UPDATEFLAG_VEHICLE) // unused for now
{
uint32 vehicleId;
float facingAdj;
recvPacket >> vehicleId >> facingAdj;
}
}
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_SHADOW_SPELL_CRIT_PERCENTAGE,
(uint32)PLAYER_ARCANE_SPELL_CRIT_PERCENTAGE,
(uint32)PLAYER_FIELD_MOD_MANA_REGEN,
(uint32)PLAYER_FIELD_MOD_MANA_REGEN_INTERRUPT,
/*(uint32)PLAYER_FIELD_MOD_MANA_REGEN,
(uint32)PLAYER_FIELD_MOD_MANA_REGEN_INTERRUPT,*/
(uint32)-1
};
static uint32 floats_gameobject[] =

View File

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

View File

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

View File

@ -312,6 +312,7 @@ OpcodeHandler *WorldSession::_GetOpcodeHandlerTable() const
{MSG_MOVE_SET_TURN_RATE, &WorldSession::_HandleSetSpeedOpcode},
{MSG_MOVE_SET_FLIGHT_SPEED, &WorldSession::_HandleSetSpeedOpcode},
{MSG_MOVE_SET_FLIGHT_BACK_SPEED, &WorldSession::_HandleSetSpeedOpcode},
{MSG_MOVE_SET_PITCH_RATE, &WorldSession::_HandleSetSpeedOpcode},
// force set speed opcodes
{SMSG_FORCE_WALK_SPEED_CHANGE, &WorldSession::_HandleForceSetSpeedOpcode},
@ -322,11 +323,12 @@ OpcodeHandler *WorldSession::_GetOpcodeHandlerTable() const
{SMSG_FORCE_TURN_RATE_CHANGE, &WorldSession::_HandleForceSetSpeedOpcode},
{SMSG_FORCE_FLIGHT_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_UPDATE_OBJECT, &WorldSession::_HandleUpdateObjectOpcode},
{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_DESTROY_OBJECT, &WorldSession::_HandleDestroyObjectOpcode},
{SMSG_INITIAL_SPELLS, &WorldSession::_HandleInitialSpellsOpcode},
@ -529,7 +531,7 @@ void WorldSession::_HandleAuthChallengeOpcode(WorldPacket& recvPacket)
digest.UpdateBigNumbers(GetInstance()->GetSessionKey(),NULL);
digest.Finalize();
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);
// recvPacket << real_size
// recvPacket << ziped_UI_Plugins_Info
@ -548,7 +550,11 @@ void WorldSession::_HandleAuthChallengeOpcode(WorldPacket& recvPacket)
void WorldSession::_HandleAuthResponseOpcode(WorldPacket& recvPacket)
{
uint8 errcode;
uint8 dummy8, expansion; uint32 dummy32;
recvPacket >> errcode;
recvPacket >> dummy32 >> dummy8 >> dummy32;
recvPacket >> expansion;
if(errcode == 0xC)
{
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]._z;
recvPacket >> plr[i]._guildId;
recvPacket >> dummy8;
recvPacket >> plr[i]._flags;
recvPacket >> dummy8 >> dummy8 >> dummy8;
recvPacket >> dummy32; // at_login_customize
recvPacket >> dummy8;
recvPacket >> plr[i]._petInfoId;
recvPacket >> plr[i]._petLevel;
recvPacket >> plr[i]._petFamilyId;
@ -623,7 +629,7 @@ void WorldSession::_HandleCharEnumOpcode(WorldPacket& recvPacket)
*mapdb = GetDBMgr().GetDB("map"),
*classdb = GetDBMgr().GetDB("class");
char *zonename, *racename, *mapname, *classname;
zonename = racename = mapname = classname = NULL;
zonename = racename = mapname = classname = "";
for(unsigned int i=0;i<num;i++)
{
@ -744,6 +750,12 @@ void WorldSession::_HandleSetProficiencyOpcode(WorldPacket& recvPacket)
void WorldSession::_HandleAccountDataMD5Opcode(WorldPacket& recvPacket)
{
/*
uint32 time;
uint8 dummy;
recvPacket >> time >> dummy;
...
*/
// packet structure not yet known
}
@ -1013,9 +1025,9 @@ void WorldSession::_HandleMovementOpcode(WorldPacket& recvPacket)
uint32 flags, time, unk32;
float x, y, z, o;
uint64 guid;
uint8 unk8;
uint16 unk16;
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));
Object *obj = objmgr.GetObj(guid);
if(obj && obj->IsWorldObject())
@ -1029,7 +1041,7 @@ void WorldSession::_HandleSetSpeedOpcode(WorldPacket& recvPacket)
uint64 guid;
float x, y, z, o, speed;
uint32 unk32, movetype;
uint8 unk8;
uint16 unk16;
switch(recvPacket.GetOpcode())
{
@ -1065,6 +1077,10 @@ void WorldSession::_HandleSetSpeedOpcode(WorldPacket& recvPacket)
movetype = MOVE_FLYBACK;
break;
case MSG_MOVE_SET_PITCH_RATE:
movetype = MOVE_PITCH_RATE;
break;
default:
logerror("MSG_MOVE_SET speed change unkown case error, opcode %u !", recvPacket.GetOpcode());
return;
@ -1072,10 +1088,10 @@ void WorldSession::_HandleSetSpeedOpcode(WorldPacket& recvPacket)
guid = recvPacket.GetPackedGuid();
recvPacket >> unk32;
recvPacket >> unk8;
recvPacket >> unk16;
recvPacket >> unk32; /* getMSTime()*/
recvPacket >> x >> y >> z >> o;
recvPacket >> unk32;
recvPacket >> unk32; // falltime
recvPacket >> speed;
Object *obj = objmgr.GetObj(guid);
@ -1127,6 +1143,10 @@ void WorldSession::_HandleForceSetSpeedOpcode(WorldPacket& recvPacket)
movetype = MOVE_FLYBACK;
break;
case SMSG_FORCE_PITCH_RATE_CHANGE:
movetype = MOVE_PITCH_RATE;
break;
default:
logerror("MSG_FORCE_ speed change unkown case error, opcode %u !", recvPacket.GetOpcode());
return;
@ -1253,7 +1273,7 @@ void WorldSession::_HandleCastResultOpcode(WorldPacket& recvPacket)
{
uint32 spellid,otherr = 0;
uint8 result, castCount;
recvPacket >> spellid >> result >> castCount;
recvPacket >> castCount >> spellid >> result;
if (recvPacket.rpos()+sizeof(uint32) <= recvPacket.size())
recvPacket >> 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();
std::string s;
uint32 unk;
//uint32 unk;
float unkf;
ct->entry = entry;
recvPacket >> ct->name;
@ -1555,7 +1575,6 @@ void WorldSession::_HandleCreatureQueryResponseOpcode(WorldPacket& recvPacket)
recvPacket >> ct->type;
recvPacket >> ct->family;
recvPacket >> ct->rank;
recvPacket >> unk;
recvPacket >> ct->SpellDataId;
recvPacket >> ct->displayid_A;
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)));
break;
}
ServerPktHeader hdr;
ibuf.Read((char*)&hdr,sizeof(ServerPktHeader));
_crypt.DecryptRecv((uint8*)&hdr,sizeof(ServerPktHeader));
_remaining = ntohs(hdr.size)-2;
_opcode = hdr.cmd;
// 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;
ibuf.Read((char*)&hdr, sizeof(ServerPktHeader));
_crypt.DecryptRecv((uint8*)&hdr, sizeof(ServerPktHeader), false);
_remaining = ntohs(hdr.size)-2;
_opcode = hdr.cmd;
}
if(_opcode > MAX_OPCODE_ID)
{
logcritical("CRYPT ERROR: opcode=%u, remain=%u",_opcode,_remaining); // this should never be the case!

View File

@ -7,6 +7,12 @@
class WorldSession;
class BigNumber;
#if defined( __GNUC__ )
#pragma pack(1)
#else
#pragma pack(push,1)
#endif
struct ClientPktHeader
{
uint16 size;
@ -20,14 +26,27 @@ struct ServerPktHeader
uint16 cmd;
};
struct ServerPktHeaderBig
{
uint8 size[3];
uint16 cmd;
};
#if defined( __GNUC__ )
#pragma pack()
#else
#pragma pack(pop)
#endif
class WorldSocket : public TcpSocket
{
public:
WorldSocket(SocketHandler &h, WorldSession *s);
WorldSession *GetSession(void) { return _session; }
bool IsOk();
void OnRead();
WorldSocket(SocketHandler &h, WorldSession *s);
WorldSession *GetSession(void) { return _session; }
bool IsOk();
void OnRead();
void OnConnect();
void OnConnectFailed();
void OnDelete();
@ -41,9 +60,9 @@ private:
AuthCrypt _crypt;
bool _gothdr; // true if only the header was recieved yet
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;
};
#endif
#endif

View File

@ -158,6 +158,26 @@ bool ADTFile::LoadMem(ByteBuffer& buf)
_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"))
{
_chunks[mcnkid].hdr = buf.read<ADTMapChunkHeader>();
@ -173,8 +193,8 @@ bool ADTFile::LoadMem(ByteBuffer& buf)
// HACKS to make it work properly
if(!msize && !strcmp((char*)mfcc,"MCAL"))
continue;
if((!msize) && !strcmp((char*)mfcc,"MCLQ"))
msize = _chunks[mcnkid].hdr.sizeLiquid;
//if((!msize) && !strcmp((char*)mfcc,"MCLQ"))
// msize = _chunks[mcnkid].hdr.sizeLiquid;
//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);
}
}
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 *fcc1 = &_cc3[0];
@ -263,7 +283,7 @@ bool ADTFile::LoadMem(ByteBuffer& buf)
buf.rpos(buf.rpos()+diffbytes);
//DEBUG(printf("ADT: MCNK: MCLQ - %u junk bytes skipped\n",diffbytes));
}
}
}*/
else if(!strcmp((char*)mfcc,"MCSE"))
{
uint32 emm = _chunks[mcnkid].hdr.nSndEmitters;

View File

@ -30,20 +30,30 @@ void AuthCrypt::Init()
_initialized = true;
}
void AuthCrypt::DecryptRecv(uint8 *data, size_t len)
void AuthCrypt::DecryptRecv(uint8 *data, size_t len, bool temp)
{
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();
uint8 x = (data[t] - _recv_j) ^ _key[_recv_i];
++_recv_i;
_recv_j = data[t];
data[t] = x;
}
if (temp)
{
_recv_i = ti;
_recv_j = tj;
}
}

View File

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

View File

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

View File

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

View File

@ -18,7 +18,9 @@ MPQHelper::MPQHelper(char *archive)
// ok maybe this is a bit too much but should work fine :)
_patches.push_front(dir+archive+ext); //
_patches.push_front(dir+"common"+ext);
_patches.push_front(dir+"common-2"+ext);
_patches.push_front(dir+"expansion"+ext);
_patches.push_front(dir+"lichking"+ext);
_patches.push_front(dir+"patch"+ext);
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-locale-"+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);
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:
return (HANDLE)open(sFileName, O_RDONLY | O_LARGEFILE);
case OPEN_ALWAYS:
return (HANDLE)open(sFileName, O_RDWR | O_CREAT);
return (HANDLE)open(sFileName, O_RDWR | O_CREAT, 0666);
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:
return INVALID_HANDLE_VALUE;
}

View File

@ -728,8 +728,6 @@ void ExtractMapDependencies(void)
{
ByteBuffer bb = mpqmodel.ExtractFile((char*)mpqfn.c_str());
fh.write((const char*)bb.contents(),bb.size());
if (doTextures)
FetchTexturesFromModel(bb);
if(doMd5)
{
@ -741,6 +739,35 @@ void ExtractMapDependencies(void)
memcpy(md5ptr, h.GetDigest(), MD5_DIGEST_LENGTH);
}
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
printf("Could not write model %s\n",realfn.c_str());
@ -952,8 +979,8 @@ void FetchTexturesFromModel(ByteBuffer bb)
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) {
//printf("Not M2 model file!");
if (header.version[0] != 8 || header.version[1] != 1 || header.version[2] != 0 || header.version[3] != 0) {
printf("Not M2 model file!");
return;
}