diff --git a/bin/conf/PseuWoW.conf.default b/bin/conf/PseuWoW.conf.default index 14b4122..b487d4e 100644 --- a/bin/conf/PseuWoW.conf.default +++ b/bin/conf/PseuWoW.conf.default @@ -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, ... diff --git a/src/Client/GUI/CM2MeshFileLoader.cpp b/src/Client/GUI/CM2MeshFileLoader.cpp index de11c5b..0e49400 100644 --- a/src/Client/GUI/CM2MeshFileLoader.cpp +++ b/src/Client/GUI/CM2MeshFileLoader.cpp @@ -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;i0) - M2MViews.clear(); -ModelView tempM2MView; -MeshFile->seek(header.ofsViews); -for(u32 i =0;igetFileName(); +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 "<read(¤tView, sizeof(ModelView)); + +//std::cout << "Skins "<0) M2MIndices.clear(); u16 tempM2Index; -MeshFile->seek(M2MViews[0].ofsIndex); -for(u32 i =0;iseek(currentView.ofsIndex); +for(u32 i =0;iread(&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;iseek(currentView.ofsTris); +for(u32 i =0;iread(&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;iseek(currentView.ofsSub); +for(u32 i =0;iread(&tempM2Submesh,sizeof(ModelViewSubmesh)); + SkinFile->read(&tempM2Submesh,sizeof(ModelViewSubmesh)); M2MSubmeshes.push_back(tempM2Submesh); // std::cout<< "Submesh " <seek(M2MViews[0].ofsTex); -for(u32 i=0;iseek(currentView.ofsTex); +for(u32 i=0;iread(&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; i0){ // 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<getAllJoints()[1]->Children.size()<<" Children\n"; //And M2MVertices are not usable like this. Thus we transform @@ -473,7 +479,7 @@ for(u32 i=0;icreateBuffer(); @@ -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<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; } diff --git a/src/Client/GUI/CM2MeshFileLoader.h b/src/Client/GUI/CM2MeshFileLoader.h index f90779c..6608b22 100644 --- a/src/Client/GUI/CM2MeshFileLoader.h +++ b/src/Client/GUI/CM2MeshFileLoader.h @@ -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 M2MVertices; - core::array M2MViews; core::array M2MIndices; core::array M2MTriangles; core::array M2MSubmeshes; diff --git a/src/Client/World/CMSGConstructor.cpp b/src/Client/World/CMSGConstructor.cpp index 1dbc974..0888ceb 100644 --- a/src/Client/World/CMSGConstructor.cpp +++ b/src/Client/World/CMSGConstructor.cpp @@ -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) diff --git a/src/Client/World/CacheHandler.cpp b/src/Client/World/CacheHandler.cpp index 4c520a8..263f0e5 100644 --- a/src/Client/World/CacheHandler.cpp +++ b/src/Client/World/CacheHandler.cpp @@ -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(); diff --git a/src/Client/World/GameObject.h b/src/Client/World/GameObject.h index b4d5bfc..722dff5 100644 --- a/src/Client/World/GameObject.h +++ b/src/Client/World/GameObject.h @@ -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 diff --git a/src/Client/World/Item.cpp b/src/Client/World/Item.cpp index e56216a..e602b9f 100644 --- a/src/Client/World/Item.cpp +++ b/src/Client/World/Item.cpp @@ -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()); diff --git a/src/Client/World/Item.h b/src/Client/World/Item.h index d3ab916..5d294ba 100644 --- a/src/Client/World/Item.h +++ b/src/Client/World/Item.h @@ -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 diff --git a/src/Client/World/Object.cpp b/src/Client/World/Object.cpp index 373b513..019f551 100644 --- a/src/Client/World/Object.cpp +++ b/src/Client/World/Object.cpp @@ -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 diff --git a/src/Client/World/ObjectDefines.h b/src/Client/World/ObjectDefines.h index 87282db..5f0fb73 100644 --- a/src/Client/World/ObjectDefines.h +++ b/src/Client/World/ObjectDefines.h @@ -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 diff --git a/src/Client/World/Opcodes.cpp b/src/Client/World/Opcodes.cpp index 976789a..726359c 100644 --- a/src/Client/World/Opcodes.cpp +++ b/src/Client/World/Opcodes.cpp @@ -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", "" }; diff --git a/src/Client/World/Opcodes.h b/src/Client/World/Opcodes.h index a2b8273..8814911 100644 --- a/src/Client/World/Opcodes.h +++ b/src/Client/World/Opcodes.h @@ -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 diff --git a/src/Client/World/Player.h b/src/Client/World/Player.h index 52ed714..fce614c 100644 --- a/src/Client/World/Player.h +++ b/src/Client/World/Player.h @@ -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 diff --git a/src/Client/World/SharedDefines.h b/src/Client/World/SharedDefines.h index 2ea48d3..00ecb2b 100644 --- a/src/Client/World/SharedDefines.h +++ b/src/Client/World/SharedDefines.h @@ -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 diff --git a/src/Client/World/Unit.h b/src/Client/World/Unit.h index 35507e2..652e197 100644 --- a/src/Client/World/Unit.h +++ b/src/Client/World/Unit.h @@ -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 diff --git a/src/Client/World/UpdateData.cpp b/src/Client/World/UpdateData.cpp index 2d63eb9..6fa759d 100644 --- a/src/Client/World/UpdateData.cpp +++ b/src/Client/World/UpdateData.cpp @@ -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[] = diff --git a/src/Client/World/UpdateData.h b/src/Client/World/UpdateData.h index 0770674..06fe88b 100644 --- a/src/Client/World/UpdateData.h +++ b/src/Client/World/UpdateData.h @@ -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; } diff --git a/src/Client/World/UpdateFields.h b/src/Client/World/UpdateFields.h index 94c2ce5..1a3e9fd 100644 --- a/src/Client/World/UpdateFields.h +++ b/src/Client/World/UpdateFields.h @@ -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 diff --git a/src/Client/World/WorldSession.cpp b/src/Client/World/WorldSession.cpp index 83bd92d..73da83c 100644 --- a/src/Client/World/WorldSession.cpp +++ b/src/Client/World/WorldSession.cpp @@ -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)<GetConf()->clientbuild)<> 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> 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; diff --git a/src/Client/World/WorldSocket.cpp b/src/Client/World/WorldSocket.cpp index fd594a9..0353e25 100644 --- a/src/Client/World/WorldSocket.cpp +++ b/src/Client/World/WorldSocket.cpp @@ -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! diff --git a/src/Client/World/WorldSocket.h b/src/Client/World/WorldSocket.h index 3efc69e..d147ca3 100644 --- a/src/Client/World/WorldSocket.h +++ b/src/Client/World/WorldSocket.h @@ -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 diff --git a/src/shared/ADTFile.cpp b/src/shared/ADTFile.cpp index c28263f..e0eb97d 100644 --- a/src/shared/ADTFile.cpp +++ b/src/shared/ADTFile.cpp @@ -158,6 +158,26 @@ bool ADTFile::LoadMem(ByteBuffer& buf) _wmosp.push_back(buf.read()); } } + 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(); @@ -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; diff --git a/src/shared/Auth/AuthCrypt.cpp b/src/shared/Auth/AuthCrypt.cpp index 7bfac29..7106f57 100644 --- a/src/shared/Auth/AuthCrypt.cpp +++ b/src/shared/Auth/AuthCrypt.cpp @@ -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; } } diff --git a/src/shared/Auth/AuthCrypt.h b/src/shared/Auth/AuthCrypt.h index 0d84311..8172082 100644 --- a/src/shared/Auth/AuthCrypt.h +++ b/src/shared/Auth/AuthCrypt.h @@ -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; } diff --git a/src/shared/ByteBuffer.h b/src/shared/ByteBuffer.h index 43aec74..5336949 100644 --- a/src/shared/ByteBuffer.h +++ b/src/shared/ByteBuffer.h @@ -91,6 +91,11 @@ class ByteBuffer append(value); return *this; } + ByteBuffer &operator<<(int32 value) + { + append(value); + return *this; + } ByteBuffer &operator<<(uint32 value) { append(value); @@ -139,6 +144,11 @@ class ByteBuffer value = read(); return *this; } + ByteBuffer &operator>>(int32 &value) + { + value = read(); + return *this; + } ByteBuffer &operator>>(uint32 &value) { value = read(); diff --git a/src/tools/stuffextract/DBCFieldData.h b/src/tools/stuffextract/DBCFieldData.h index 3af64af..d2e9de6 100644 --- a/src/tools/stuffextract/DBCFieldData.h +++ b/src/tools/stuffextract/DBCFieldData.h @@ -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 diff --git a/src/tools/stuffextract/MPQHelper.cpp b/src/tools/stuffextract/MPQHelper.cpp index 1bb6b16..94440a8 100644 --- a/src/tools/stuffextract/MPQHelper.cpp +++ b/src/tools/stuffextract/MPQHelper.cpp @@ -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++) diff --git a/src/tools/stuffextract/StormLib/StormPortLinux.cpp b/src/tools/stuffextract/StormLib/StormPortLinux.cpp index 0cd827f..c8c01dc 100644 --- a/src/tools/stuffextract/StormLib/StormPortLinux.cpp +++ b/src/tools/stuffextract/StormLib/StormPortLinux.cpp @@ -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; } diff --git a/src/tools/stuffextract/StuffExtract.cpp b/src/tools/stuffextract/StuffExtract.cpp index 3dad87c..29d68fc 100644 --- a/src/tools/stuffextract/StuffExtract.cpp +++ b/src/tools/stuffextract/StuffExtract.cpp @@ -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; }