* upgrade to 2.1.3 support. thx to bLuma for patch!!

* corrected and extended SharedDefines.h
* added handlers for SMSG_MOTD and SMSG_NOTIFICATION
* added values created by stuffextract to map.scp/race.scp before it supports 2.1.3 also.
This commit is contained in:
False.Genesis 2007-08-21 16:59:34 +00:00
parent 12b508fc9f
commit 49338c6e6a
15 changed files with 2800 additions and 2019 deletions

View File

@ -58,8 +58,8 @@ charname=Pseuwow
// Client emulation configuration // Client emulation configuration
ClientVersion=2.0.12 ClientVersion=2.1.3
ClientBuild=6546 ClientBuild=6898
ClientLanguage=enUS ClientLanguage=enUS
// or change to enGB, deDE, ... // or change to enGB, deDE, ...
@ -113,3 +113,4 @@ rmcontrolhost=localhost
// PseuWoW will need more memory with maps enabled! // PseuWoW will need more memory with maps enabled!
useMaps=0 useMaps=0

View File

@ -1,130 +1,280 @@
[0] [0]
name=Azeroth name_general=Azeroth
name=Eastern Kingdoms
[1] [1]
name=Kalimdor name_general=Kalimdor
name=Kalimdor
[2]
name=UnderMine
[13] [13]
name=Test zone name_general=test
name=Testing
[17] [25]
name=Kalidar name_general=ScottTest
name=Scott Test
[29]
name_general=Test
name=CashTest
[30] [30]
name_general=PVPZone01
name=Alterac Valley name=Alterac Valley
[33] [33]
name=Shadowfang Keep Instance name_general=Shadowfang
name=Shadowfang Keep
[34] [34]
name=The Stockade Instance name_general=StormwindJail
name=Stormwind Stockade
[35] [35]
name=Stormwind Prizon name_general=StormwindPrison
name=<unused>StormwindPrison
[36] [36]
name=Deadmines Instance name_general=DeadminesInstance
name=Deadmines
[37] [37]
name=Plains of Snow name_general=PVPZone02
name=Azshara Crater
[42]
name_general=Collin
name=Collin's Test
[43] [43]
name=Wailing Caverns Instance name_general=WailingCaverns
name=Wailing Caverns
[44] [44]
name=Monastery Interior name_general=Monastery
name=<unused> Monastery
[47] [47]
name=Razorfen Kraul Instance name_general=RazorfenKraulInstance
name=Razorfen Kraul
[48] [48]
name=Blackfathom Deeps Instance name_general=Blackfathom
name=Blackfathom Deeps
[70] [70]
name=Uldaman Instance name_general=Uldaman
name=Uldaman
[90] [90]
name=Gnomeregan Instance name_general=GnomeragonInstance
name=Gnomeregan
[109] [109]
name=Sunken Temple Instance name_general=SunkenTemple
name=Sunken Temple
[129] [129]
name=Razorfen Downs Instance name_general=RazorfenDowns
name=Razorfen Downs
[150]
name=Outland
[169] [169]
name=Emerald Forest name_general=EmeraldDream
name=Emerald Dream
[189] [189]
name=Scarlet Monastery Instance name_general=MonasteryInstances
name=Scarlet Monastery
[209] [209]
name=Zul\'Farrak Instance name_general=TanarisInstance
name=Zul'Farrak
[229] [229]
name=Blackrock Spire Instance name_general=BlackRockSpire
name=Blackrock Spire
[230] [230]
name=Blackrock Depths Instance name_general=BlackrockDepths
name=Blackrock Depths
[249] [249]
name=Onyxia\'s Lair Instance name_general=OnyxiaLairInstance
name=Onyxia's Lair
[269] [269]
name=Caverns of Time name_general=CavernsOfTime
name=Opening of the Dark Portal
[289] [289]
name=Scholomance Instance name_general=SchoolofNecromancy
name=Scholomance
[309] [309]
name=Zul'Gurub Instance name_general=Zul'gurub
name=Zul'Gurub
[329] [329]
name=Stratholme Instance name_general=Stratholme
name=Stratholme
[349] [349]
name=Mauradon Instance name_general=Mauradon
name=Maraudon
[369] [369]
name_general=DeeprunTram
name=Deeprun Tram name=Deeprun Tram
[389] [389]
name=Ragefire Chasm Instance name_general=OrgrimmarInstance
name=Ragefire Chasm
[409] [409]
name=The Molten Core Instance name_general=MoltenCore
name=Molten Core
[429] [429]
name=Dire Maul Instance name_general=DireMaul
name=Dire Maul
[449] [449]
name_general=AlliancePVPBarracks
name=Alliance PVP Barracks name=Alliance PVP Barracks
[450] [450]
name_general=HordePVPBarracks
name=Horde PVP Barracks name=Horde PVP Barracks
[451] [451]
name_general=development
name=Development Land name=Development Land
[469] [469]
name=Blackwing Lair Instance name_general=BlackwingLair
name=Blackwing Lair
[489] [489]
name_general=PVPZone03
name=Warsong Gulch name=Warsong Gulch
[509] [509]
name=Ruins of Ahn'Qiraj Instance name_general=AhnQiraj
name=Ruins of Ahn'Qiraj
[529] [529]
name_general=PVPZone04
name=Arathi Basin name=Arathi Basin
[530]
name_general=Expansion01
name=Outland
[531] [531]
name=Temple of Ahn'Qiraj Instance name_general=AhnQirajTemple
name=Ahn'Qiraj Temple
[532]
name_general=Karazahn
name=Karazhan
[533] [533]
name=Naxxramas Instance name_general=Stratholme Raid
name=Naxxramas
[534]
name_general=HyjalPast
name=The Battle for Mount Hyjal
[540]
name_general=HellfireMilitary
name=Hellfire Citadel: The Shattered Halls
[542]
name_general=HellfireDemon
name=Hellfire Citadel: The Blood Furnace
[543]
name_general=HellfireRampart
name=Hellfire Citadel: Ramparts
[544]
name_general=HellfireRaid
name=Magtheridon's Lair
[545]
name_general=CoilfangPumping
name=Coilfang: The Steamvault
[546]
name_general=CoilfangMarsh
name=Coilfang: The Underbog
[547]
name_general=CoilfangDraenei
name=Coilfang: The Slave Pens
[548]
name_general=CoilfangRaid
name=Coilfang: Serpentshrine Cavern
[550]
name_general=TempestKeepRaid
name=Tempest Keep
[552]
name_general=TempestKeepArcane
name=Tempest Keep: The Arcatraz
[553]
name_general=TempestKeepAtrium
name=Tempest Keep: The Botanica
[554]
name_general=TempestKeepFactory
name=Tempest Keep: The Mechanar
[555]
name_general=AuchindounShadow
name=Auchindoun: Shadow Labyrinth
[556]
name_general=AuchindounDemon
name=Auchindoun: Sethekk Halls
[557]
name_general=AuchindounEthereal
name=Auchindoun: Mana-Tombs
[558]
name_general=AuchindounDraenei
name=Auchindoun: Auchenai Crypts
[559]
name_general=PVPZone05
name=Nagrand Arena
[560]
name_general=HillsbradPast
name=The Escape From Durnholde
[562]
name_general=bladesedgearena
name=Blade's Edge Arena
[564]
name_general=BlackTemple
name=Black Temple
[565]
name_general=GruulsLair
name=Gruul's Lair
[566]
name_general=NetherstormBG
name=Eye of the Storm
[568]
name_general=ZulAman
name=Zul'Aman

View File

@ -1,35 +1,120 @@
// note that the faction is equal to the default language id:
// 1: Horde, Orcish
// 7: Alliance, Common
[1] [1]
model_m=49
model_f=50
name_short=Hu
faction=7 faction=7
name_general=Human
name=Human name=Human
[2] [2]
model_m=51
model_f=52
name_short=Or
faction=1 faction=1
name_general=Orc
name=Orc name=Orc
[3] [3]
model_m=53
model_f=54
name_short=Dw
faction=7 faction=7
name_general=Dwarf
name=Dwarf name=Dwarf
[4] [4]
model_m=55
model_f=56
name_short=Ni
faction=7 faction=7
name_general=NightElf
name=Night Elf name=Night Elf
[5] [5]
model_m=57
model_f=58
name_short=Sc
faction=1 faction=1
name_general=Scourge
name=Undead name=Undead
[6] [6]
model_m=59
model_f=60
name_short=Ta
faction=1 faction=1
name_general=Tauren
name=Tauren name=Tauren
[7] [7]
model_m=1563
model_f=1564
name_short=Gn
faction=7 faction=7
name_general=Gnome
name=Gnome name=Gnome
[8] [8]
model_m=1478
model_f=1479
name_short=Tr
faction=1 faction=1
name_general=Troll
name=Troll name=Troll
[9]
model_m=6894
model_f=6895
name_short=Gb
faction=7
name_general=Goblin
name=Goblin
[10]
model_m=15476
model_f=15475
name_short=Be
faction=1
name_general=BloodElf
name=Blood Elf
[11]
model_m=16125
model_f=16126
name_short=Dr
faction=7
name_general=Draenei
name=Draenei
[12]
model_m=16981
model_f=16980
name_short=Fo
faction=7
name_general=FelOrc
name=Fel Orc
[13]
model_m=17402
model_f=17403
name_short=Na
faction=7
name_general=Naga_
name=Naga
[14]
model_m=17576
model_f=17577
name_short=Br
faction=7
name_general=Broken
name=Broken
[15]
model_m=17578
model_f=17579
name_short=Sk
faction=7
name_general=Skeleton
name=Skeleton

View File

@ -745,9 +745,9 @@ DefReturnResult DefScriptPackage::SCGetFileList(CmdSet& Set)
for(DefList::iterator i = l->begin(); i != l->end(); ) for(DefList::iterator i = l->begin(); i != l->end(); )
{ {
std::string tmp = stringToLower(i->c_str() + (i->length() - ext.length())); std::string tmp = stringToLower(i->c_str() + (i->length() - ext.length()));
if( stringToLower(i->c_str() + (i->length() - ext.length())) != ext ) if( tmp != ext )
{ {
l->erase(i); i = l->erase(i);
continue; continue;
} }
i++; i++;
@ -828,3 +828,4 @@ void DefScriptPackage::My_Run(std::string line, std::string username)
} }

View File

@ -11,7 +11,7 @@
#include "Item.h" #include "Item.h"
// increase this number whenever you change something that makes old files unusable // increase this number whenever you change something that makes old files unusable
uint32 ITEMPROTOTYPES_CACHE_VERSION = 0x00000000; uint32 ITEMPROTOTYPES_CACHE_VERSION = 0x00000001;
bool PlayerNameCache::AddInfo(uint64 guid, std::string name){ bool PlayerNameCache::AddInfo(uint64 guid, std::string name){
PlayerNameCacheItem *cacheItem=new PlayerNameCacheItem; PlayerNameCacheItem *cacheItem=new PlayerNameCacheItem;
@ -162,93 +162,95 @@ void ItemProtoCache_InsertDataToSession(WorldSession *session)
buf.resize(datasize); buf.resize(datasize);
fh.read((char*)buf.contents(),datasize); fh.read((char*)buf.contents(),datasize);
ItemProto *proto = new ItemProto; ItemProto *proto = new ItemProto;
buf >> proto->Id; buf >> proto->Id;
buf >> proto->Class; buf >> proto->Class;
buf >> proto->SubClass; buf >> proto->SubClass;
buf >> unk; buf >> unk;
for(uint8 i=0;i<4;i++) for(uint8 i=0;i<4;i++)
buf >> proto->Name[i]; buf >> proto->Name[i];
buf >> proto->DisplayInfoID; buf >> proto->DisplayInfoID;
buf >> proto->Quality; buf >> proto->Quality;
buf >> proto->Flags; buf >> proto->Flags;
buf >> proto->BuyPrice; buf >> proto->BuyPrice;
buf >> proto->SellPrice; buf >> proto->SellPrice;
buf >> proto->InventoryType; buf >> proto->InventoryType;
buf >> proto->AllowableClass; buf >> proto->AllowableClass;
buf >> proto->AllowableRace; buf >> proto->AllowableRace;
buf >> proto->ItemLevel; buf >> proto->ItemLevel;
buf >> proto->RequiredLevel; buf >> proto->RequiredLevel;
buf >> proto->RequiredSkill; buf >> proto->RequiredSkill;
buf >> proto->RequiredSkillRank; buf >> proto->RequiredSkillRank;
buf >> proto->RequiredSpell; buf >> proto->RequiredSpell;
buf >> proto->RequiredHonorRank; buf >> proto->RequiredHonorRank;
buf >> proto->RequiredCityRank; buf >> proto->RequiredCityRank;
buf >> proto->RequiredReputationFaction; buf >> proto->RequiredReputationFaction;
buf >> proto->RequiredReputationRank; buf >> proto->RequiredReputationRank;
buf >> proto->MaxCount; buf >> proto->MaxCount;
buf >> proto->Stackable; buf >> proto->Stackable;
buf >> proto->ContainerSlots; buf >> proto->ContainerSlots;
for(int i = 0; i < 10; i++) for(int i = 0; i < 10; i++)
{ {
buf >> proto->ItemStat[i].ItemStatType; buf >> proto->ItemStat[i].ItemStatType;
buf >> proto->ItemStat[i].ItemStatValue; buf >> proto->ItemStat[i].ItemStatValue;
} }
for(int i = 0; i < 5; i++) for(int i = 0; i < 5; i++)
{ {
buf >> proto->Damage[i].DamageMin; buf >> proto->Damage[i].DamageMin;
buf >> proto->Damage[i].DamageMax; buf >> proto->Damage[i].DamageMax;
buf >> proto->Damage[i].DamageType; buf >> proto->Damage[i].DamageType;
} }
buf >> proto->Armor; buf >> proto->Armor;
buf >> proto->HolyRes; buf >> proto->HolyRes;
buf >> proto->FireRes; buf >> proto->FireRes;
buf >> proto->NatureRes; buf >> proto->NatureRes;
buf >> proto->FrostRes; buf >> proto->FrostRes;
buf >> proto->ShadowRes; buf >> proto->ShadowRes;
buf >> proto->ArcaneRes; buf >> proto->ArcaneRes;
buf >> proto->Delay; buf >> proto->Delay;
buf >> proto->Ammo_type; buf >> proto->Ammo_type;
buf >> (float)proto->RangedModRange; buf >> (float)proto->RangedModRange;
for(int s = 0; s < 5; s++) for(int s = 0; s < 5; s++)
{ {
buf >> proto->Spells[s].SpellId; buf >> proto->Spells[s].SpellId;
buf >> proto->Spells[s].SpellTrigger; buf >> proto->Spells[s].SpellTrigger;
buf >> proto->Spells[s].SpellCharges; buf >> proto->Spells[s].SpellCharges;
buf >> proto->Spells[s].SpellCooldown; buf >> proto->Spells[s].SpellCooldown;
buf >> proto->Spells[s].SpellCategory; buf >> proto->Spells[s].SpellCategory;
buf >> proto->Spells[s].SpellCategoryCooldown; buf >> proto->Spells[s].SpellCategoryCooldown;
} }
buf >> proto->Bonding; buf >> proto->Bonding;
buf >> proto->Description; buf >> proto->Description;
buf >> proto->PageText; buf >> proto->PageText;
buf >> proto->LanguageID; buf >> proto->LanguageID;
buf >> proto->PageMaterial; buf >> proto->PageMaterial;
buf >> proto->StartQuest; buf >> proto->StartQuest;
buf >> proto->LockID; buf >> proto->LockID;
buf >> proto->Material; buf >> proto->Material;
buf >> proto->Sheath; buf >> proto->Sheath;
buf >> proto->Extra; buf >> proto->Extra;
buf >> proto->Unk1; // added in 2.0.3 buf >> proto->Unk1; // added in 2.0.3
buf >> proto->Block; buf >> proto->Block;
buf >> proto->ItemSet; buf >> proto->ItemSet;
buf >> proto->MaxDurability; buf >> proto->MaxDurability;
buf >> proto->Area; buf >> proto->Area;
buf >> proto->Map; buf >> proto->Map;
buf >> proto->BagFamily; buf >> proto->BagFamily;
buf >> proto->TotemCategory; // Added in 1.12.x client branch buf >> proto->TotemCategory; // Added in 1.12.x client branch
for(uint32 s = 0; s < 3; s++) for(uint32 s = 0; s < 3; s++)
{ {
buf >> proto->Socket[s].Color; buf >> proto->Socket[s].Color;
buf >> proto->Socket[s].Content; buf >> proto->Socket[s].Content;
} }
buf >> proto->socketBonus; buf >> proto->socketBonus;
buf >> proto->GemProperties; buf >> proto->GemProperties;
buf >> proto->ExtendedCost; buf >> proto->ExtendedCost;
buf >> proto->RequiredDisenchantSkill; buf >> proto->RequiredDisenchantSkill;
if(proto->Id) buf >> proto->ArmorDamageModifier;
{
//DEBUG(logdebug("ItemProtoCache: Loaded %u [%s]",proto->Id, proto->Name[0].c_str())); if(proto->Id)
{
//DEBUG(logdebug("ItemProtoCache: Loaded %u [%s]",proto->Id, proto->Name[0].c_str()));
session->objmgr.Add(proto); session->objmgr.Add(proto);
counter++; counter++;
} }
@ -277,96 +279,97 @@ void ItemProtoCache_WriteDataToCache(WorldSession *session)
{ {
buf.clear(); buf.clear();
ItemProto *proto = session->objmgr.GetItemProtoByPos(i); ItemProto *proto = session->objmgr.GetItemProtoByPos(i);
buf << proto->Id; buf << proto->Id;
buf << proto->Class; buf << proto->Class;
buf << proto->SubClass; buf << proto->SubClass;
for(uint8 i=0;i<4;i++) for(uint8 i=0;i<4;i++)
buf << proto->Name[i]; buf << proto->Name[i];
buf << proto->DisplayInfoID; buf << proto->DisplayInfoID;
buf << proto->Quality; buf << proto->Quality;
buf << proto->Flags; buf << proto->Flags;
buf << proto->BuyPrice; buf << proto->BuyPrice;
buf << proto->SellPrice; buf << proto->SellPrice;
buf << proto->InventoryType; buf << proto->InventoryType;
buf << proto->AllowableClass; buf << proto->AllowableClass;
buf << proto->AllowableRace; buf << proto->AllowableRace;
buf << proto->ItemLevel; buf << proto->ItemLevel;
buf << proto->RequiredLevel; buf << proto->RequiredLevel;
buf << proto->RequiredSkill; buf << proto->RequiredSkill;
buf << proto->RequiredSkillRank; buf << proto->RequiredSkillRank;
buf << proto->RequiredSpell; buf << proto->RequiredSpell;
buf << proto->RequiredHonorRank; buf << proto->RequiredHonorRank;
buf << proto->RequiredCityRank; buf << proto->RequiredCityRank;
buf << proto->RequiredReputationFaction; buf << proto->RequiredReputationFaction;
buf << proto->RequiredReputationRank; buf << proto->RequiredReputationRank;
buf << proto->MaxCount; buf << proto->MaxCount;
buf << proto->Stackable; buf << proto->Stackable;
buf << proto->ContainerSlots; buf << proto->ContainerSlots;
for(int i = 0; i < 10; i++) for(int i = 0; i < 10; i++)
{ {
buf << proto->ItemStat[i].ItemStatType; buf << proto->ItemStat[i].ItemStatType;
buf << proto->ItemStat[i].ItemStatValue; buf << proto->ItemStat[i].ItemStatValue;
} }
for(int i = 0; i < 5; i++) for(int i = 0; i < 5; i++)
{ {
buf << proto->Damage[i].DamageMin; buf << proto->Damage[i].DamageMin;
buf << proto->Damage[i].DamageMax; buf << proto->Damage[i].DamageMax;
buf << proto->Damage[i].DamageType; buf << proto->Damage[i].DamageType;
} }
buf << proto->Armor; buf << proto->Armor;
buf << proto->HolyRes; buf << proto->HolyRes;
buf << proto->FireRes; buf << proto->FireRes;
buf << proto->NatureRes; buf << proto->NatureRes;
buf << proto->FrostRes; buf << proto->FrostRes;
buf << proto->ShadowRes; buf << proto->ShadowRes;
buf << proto->ArcaneRes; buf << proto->ArcaneRes;
buf << proto->Delay; buf << proto->Delay;
buf << proto->Ammo_type; buf << proto->Ammo_type;
buf << (float)proto->RangedModRange; buf << (float)proto->RangedModRange;
for(int s = 0; s < 5; s++) for(int s = 0; s < 5; s++)
{ {
buf << proto->Spells[s].SpellId; buf << proto->Spells[s].SpellId;
buf << proto->Spells[s].SpellTrigger; buf << proto->Spells[s].SpellTrigger;
buf << proto->Spells[s].SpellCharges; buf << proto->Spells[s].SpellCharges;
buf << proto->Spells[s].SpellCooldown; buf << proto->Spells[s].SpellCooldown;
buf << proto->Spells[s].SpellCategory; buf << proto->Spells[s].SpellCategory;
buf << proto->Spells[s].SpellCategoryCooldown; buf << proto->Spells[s].SpellCategoryCooldown;
} }
buf << proto->Bonding; buf << proto->Bonding;
buf << proto->Description; buf << proto->Description;
buf << proto->PageText; buf << proto->PageText;
buf << proto->LanguageID; buf << proto->LanguageID;
buf << proto->PageMaterial; buf << proto->PageMaterial;
buf << proto->StartQuest; buf << proto->StartQuest;
buf << proto->LockID; buf << proto->LockID;
buf << proto->Material; buf << proto->Material;
buf << proto->Sheath; buf << proto->Sheath;
buf << proto->Extra; buf << proto->Extra;
buf << proto->Unk1; // added in 2.0.3 buf << proto->Unk1; // added in 2.0.3
buf << proto->Block; buf << proto->Block;
buf << proto->ItemSet; buf << proto->ItemSet;
buf << proto->MaxDurability; buf << proto->MaxDurability;
buf << proto->Area; buf << proto->Area;
buf << proto->Map; buf << proto->Map;
buf << proto->BagFamily; buf << proto->BagFamily;
buf << proto->TotemCategory; // Added in 1.12.x client branch buf << proto->TotemCategory; // Added in 1.12.x client branch
for(uint32 s = 0; s < 3; s++) for(uint32 s = 0; s < 3; s++)
{ {
buf << proto->Socket[s].Color; buf << proto->Socket[s].Color;
buf << proto->Socket[s].Content; buf << proto->Socket[s].Content;
} }
buf << proto->socketBonus; buf << proto->socketBonus;
buf << proto->GemProperties; buf << proto->GemProperties;
buf << proto->ExtendedCost; buf << proto->ExtendedCost;
buf << proto->RequiredDisenchantSkill; buf << proto->RequiredDisenchantSkill;
buf << proto->ArmorDamageModifier;
//DEBUG(logdebug("ItemProtoCache: Saved %u [%s]",proto->Id, proto->Name[0].c_str()));
uint32 size = buf.size(); //DEBUG(logdebug("ItemProtoCache: Saved %u [%s]",proto->Id, proto->Name[0].c_str()));
uint32 size = buf.size();
fh.write((char*)&size,sizeof(uint32)); fh.write((char*)&size,sizeof(uint32));
fh.write((char*)buf.contents(),buf.size()); fh.write((char*)buf.contents(),buf.size());
counter++; counter++;
} }
fh.close(); fh.close();
log("ItemProtoCache: Saved %u Item Prototypes",counter); log("ItemProtoCache: Saved %u Item Prototypes",counter);
} }

View File

@ -110,7 +110,7 @@ void Channel::HandleNotifyOpcode(WorldPacket &packet)
switch (code) switch (code)
{ {
// Player joined channel you are on // Player joined channel you are on
case 0x00: case JOINED:
packet >> guid; packet >> guid;
if(guid){ if(guid){
name = _worldSession->plrNameCache.GetName(guid); name = _worldSession->plrNameCache.GetName(guid);
@ -227,3 +227,4 @@ void Channel::HandleListRequest(WorldPacket& recvPacket)

View File

@ -12,114 +12,115 @@ void WorldSession::_HandleItemQuerySingleResponseOpcode(WorldPacket& recvPacket)
uint32 unk; uint32 unk;
memset(field,0,64); memset(field,0,64);
if(memcmp(recvPacket.contents()+sizeof(uint32),field,64)) if(memcmp(recvPacket.contents()+sizeof(uint32),field,64))
{ {
recvPacket >> proto->Class; recvPacket >> proto->Class;
recvPacket >> proto->SubClass; recvPacket >> proto->SubClass;
recvPacket >> unk; // dont need that value? recvPacket >> unk; // dont need that value?
for(uint8 i=0;i<4;i++) for(uint8 i=0;i<4;i++)
recvPacket >> proto->Name[i]; recvPacket >> proto->Name[i];
recvPacket >> proto->DisplayInfoID; recvPacket >> proto->DisplayInfoID;
recvPacket >> proto->Quality; recvPacket >> proto->Quality;
recvPacket >> proto->Flags; recvPacket >> proto->Flags;
recvPacket >> proto->BuyPrice; recvPacket >> proto->BuyPrice;
recvPacket >> proto->SellPrice; recvPacket >> proto->SellPrice;
recvPacket >> proto->InventoryType; recvPacket >> proto->InventoryType;
recvPacket >> proto->AllowableClass; recvPacket >> proto->AllowableClass;
recvPacket >> proto->AllowableRace; recvPacket >> proto->AllowableRace;
recvPacket >> proto->ItemLevel; recvPacket >> proto->ItemLevel;
recvPacket >> proto->RequiredLevel; recvPacket >> proto->RequiredLevel;
recvPacket >> proto->RequiredSkill; recvPacket >> proto->RequiredSkill;
recvPacket >> proto->RequiredSkillRank; recvPacket >> proto->RequiredSkillRank;
recvPacket >> proto->RequiredSpell; recvPacket >> proto->RequiredSpell;
recvPacket >> proto->RequiredHonorRank; recvPacket >> proto->RequiredHonorRank;
recvPacket >> proto->RequiredCityRank; recvPacket >> proto->RequiredCityRank;
recvPacket >> proto->RequiredReputationFaction; recvPacket >> proto->RequiredReputationFaction;
recvPacket >> proto->RequiredReputationRank; recvPacket >> proto->RequiredReputationRank;
recvPacket >> proto->MaxCount; recvPacket >> proto->MaxCount;
recvPacket >> proto->Stackable; recvPacket >> proto->Stackable;
recvPacket >> proto->ContainerSlots; recvPacket >> proto->ContainerSlots;
for(int i = 0; i < 10; i++) for(int i = 0; i < 10; i++)
{ {
recvPacket >> proto->ItemStat[i].ItemStatType; recvPacket >> proto->ItemStat[i].ItemStatType;
recvPacket >> proto->ItemStat[i].ItemStatValue; recvPacket >> proto->ItemStat[i].ItemStatValue;
} }
for(int i = 0; i < 5; i++) for(int i = 0; i < 5; i++)
{ {
recvPacket >> proto->Damage[i].DamageMin; recvPacket >> proto->Damage[i].DamageMin;
recvPacket >> proto->Damage[i].DamageMax; recvPacket >> proto->Damage[i].DamageMax;
recvPacket >> proto->Damage[i].DamageType; recvPacket >> proto->Damage[i].DamageType;
} }
recvPacket >> proto->Armor; recvPacket >> proto->Armor;
recvPacket >> proto->HolyRes; recvPacket >> proto->HolyRes;
recvPacket >> proto->FireRes; recvPacket >> proto->FireRes;
recvPacket >> proto->NatureRes; recvPacket >> proto->NatureRes;
recvPacket >> proto->FrostRes; recvPacket >> proto->FrostRes;
recvPacket >> proto->ShadowRes; recvPacket >> proto->ShadowRes;
recvPacket >> proto->ArcaneRes; recvPacket >> proto->ArcaneRes;
recvPacket >> proto->Delay; recvPacket >> proto->Delay;
recvPacket >> proto->Ammo_type; recvPacket >> proto->Ammo_type;
recvPacket >> (float)proto->RangedModRange; recvPacket >> (float)proto->RangedModRange;
for(int s = 0; s < 5; s++) for(int s = 0; s < 5; s++)
{ {
recvPacket >> proto->Spells[s].SpellId; recvPacket >> proto->Spells[s].SpellId;
recvPacket >> proto->Spells[s].SpellTrigger; recvPacket >> proto->Spells[s].SpellTrigger;
recvPacket >> proto->Spells[s].SpellCharges; recvPacket >> proto->Spells[s].SpellCharges;
recvPacket >> proto->Spells[s].SpellCooldown; recvPacket >> proto->Spells[s].SpellCooldown;
recvPacket >> proto->Spells[s].SpellCategory; recvPacket >> proto->Spells[s].SpellCategory;
recvPacket >> proto->Spells[s].SpellCategoryCooldown; recvPacket >> proto->Spells[s].SpellCategoryCooldown;
} }
recvPacket >> proto->Bonding; recvPacket >> proto->Bonding;
recvPacket >> proto->Description; recvPacket >> proto->Description;
recvPacket >> proto->PageText; recvPacket >> proto->PageText;
recvPacket >> proto->LanguageID; recvPacket >> proto->LanguageID;
recvPacket >> proto->PageMaterial; recvPacket >> proto->PageMaterial;
recvPacket >> proto->StartQuest; recvPacket >> proto->StartQuest;
recvPacket >> proto->LockID; recvPacket >> proto->LockID;
recvPacket >> proto->Material; recvPacket >> proto->Material;
recvPacket >> proto->Sheath; recvPacket >> proto->Sheath;
recvPacket >> proto->Extra; recvPacket >> proto->Extra;
recvPacket >> proto->Block; recvPacket >> proto->Block;
recvPacket >> proto->ItemSet; recvPacket >> proto->ItemSet;
recvPacket >> proto->MaxDurability; recvPacket >> proto->MaxDurability;
recvPacket >> proto->Area; recvPacket >> proto->Area;
recvPacket >> proto->Map; recvPacket >> proto->Map;
recvPacket >> proto->BagFamily; recvPacket >> proto->BagFamily;
recvPacket >> proto->TotemCategory; // Added in 1.12.x client branch recvPacket >> proto->TotemCategory; // Added in 1.12.x client branch
for(uint32 s = 0; s < 3; s++) for(uint32 s = 0; s < 3; s++)
{ {
recvPacket >> proto->Socket[s].Color; recvPacket >> proto->Socket[s].Color;
recvPacket >> proto->Socket[s].Content; recvPacket >> proto->Socket[s].Content;
} }
recvPacket >> proto->socketBonus; recvPacket >> proto->socketBonus;
recvPacket >> proto->GemProperties; recvPacket >> proto->GemProperties;
recvPacket >> proto->ExtendedCost; recvPacket >> proto->ExtendedCost;
recvPacket >> proto->RequiredDisenchantSkill; recvPacket >> proto->RequiredDisenchantSkill;
recvPacket >> proto->ArmorDamageModifier;
logdetail("Got Item Info: Id=%u Name='%s' ReqLevel=%u Armor=%u Desc='%s'",
proto->Id, proto->Name[0].c_str(), proto->RequiredLevel, proto->Armor, proto->Description.c_str()); logdetail("Got Item Info: Id=%u Name='%s' ReqLevel=%u Armor=%u Desc='%s'",
objmgr.Add(proto); proto->Id, proto->Name[0].c_str(), proto->RequiredLevel, proto->Armor, proto->Description.c_str());
} objmgr.Add(proto);
else }
{ else
logdetail("Got info of nonexistent Item %u",proto->Id); {
objmgr.AddNonexistentItem(proto->Id); logdetail("Got info of nonexistent Item %u",proto->Id);
delete proto; objmgr.AddNonexistentItem(proto->Id);
} delete proto;
}
} }
Item::Item() Item::Item()
{ {
_type |= TYPE_ITEM; _type |= TYPE_ITEM;
_typeid = TYPEID_ITEM; _typeid = TYPEID_ITEM;
_valuescount = ITEM_END; _valuescount = ITEM_END;
_slot = 0; _slot = 0;
//_bag = NULL; // not yet implemented //_bag = NULL; // not yet implemented
} }
void Item::Create(uint64 guid) void Item::Create(uint64 guid)
{ {
Object::Create(guid); Object::Create(guid);
// what else? // what else?
} }

View File

@ -6,321 +6,321 @@
class Bag; class Bag;
enum InventoryChangeFailure enum InventoryChangeFailure
{ {
EQUIP_ERR_OK = 0, EQUIP_ERR_OK = 0,
EQUIP_ERR_YOU_MUST_REACH_LEVEL_N = 1, EQUIP_ERR_YOU_MUST_REACH_LEVEL_N = 1,
EQUIP_ERR_SKILL_ISNT_HIGH_ENOUGH = 2, EQUIP_ERR_SKILL_ISNT_HIGH_ENOUGH = 2,
EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT = 3, EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT = 3,
EQUIP_ERR_BAG_FULL = 4, EQUIP_ERR_BAG_FULL = 4,
EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG = 5, EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG = 5,
EQUIP_ERR_CANT_TRADE_EQUIP_BAGS = 6, EQUIP_ERR_CANT_TRADE_EQUIP_BAGS = 6,
EQUIP_ERR_ONLY_AMMO_CAN_GO_HERE = 7, EQUIP_ERR_ONLY_AMMO_CAN_GO_HERE = 7,
EQUIP_ERR_NO_REQUIRED_PROFICIENCY = 8, EQUIP_ERR_NO_REQUIRED_PROFICIENCY = 8,
EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE = 9, EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE = 9,
EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM = 10, EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM = 10,
EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM2 = 11, EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM2 = 11,
EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE2 = 12, EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE2 = 12,
EQUIP_ERR_CANT_EQUIP_WITH_TWOHANDED = 13, EQUIP_ERR_CANT_EQUIP_WITH_TWOHANDED = 13,
EQUIP_ERR_CANT_DUAL_WIELD = 14, EQUIP_ERR_CANT_DUAL_WIELD = 14,
EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG = 15, EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG = 15,
EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG2 = 16, EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG2 = 16,
EQUIP_ERR_CANT_CARRY_MORE_OF_THIS = 17, EQUIP_ERR_CANT_CARRY_MORE_OF_THIS = 17,
EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE3 = 18, EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE3 = 18,
EQUIP_ERR_ITEM_CANT_STACK = 19, EQUIP_ERR_ITEM_CANT_STACK = 19,
EQUIP_ERR_ITEM_CANT_BE_EQUIPPED = 20, EQUIP_ERR_ITEM_CANT_BE_EQUIPPED = 20,
EQUIP_ERR_ITEMS_CANT_BE_SWAPPED = 21, EQUIP_ERR_ITEMS_CANT_BE_SWAPPED = 21,
EQUIP_ERR_SLOT_IS_EMPTY = 22, EQUIP_ERR_SLOT_IS_EMPTY = 22,
EQUIP_ERR_ITEM_NOT_FOUND = 23, EQUIP_ERR_ITEM_NOT_FOUND = 23,
EQUIP_ERR_CANT_DROP_SOULBOUND = 24, EQUIP_ERR_CANT_DROP_SOULBOUND = 24,
EQUIP_ERR_OUT_OF_RANGE = 25, EQUIP_ERR_OUT_OF_RANGE = 25,
EQUIP_ERR_TRIED_TO_SPLIT_MORE_THAN_COUNT = 26, EQUIP_ERR_TRIED_TO_SPLIT_MORE_THAN_COUNT = 26,
EQUIP_ERR_COULDNT_SPLIT_ITEMS = 27, EQUIP_ERR_COULDNT_SPLIT_ITEMS = 27,
EQUIP_ERR_MISSING_REAGENT = 28, EQUIP_ERR_MISSING_REAGENT = 28,
EQUIP_ERR_NOT_ENOUGH_MONEY = 29, EQUIP_ERR_NOT_ENOUGH_MONEY = 29,
EQUIP_ERR_NOT_A_BAG = 30, EQUIP_ERR_NOT_A_BAG = 30,
EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS = 31, EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS = 31,
EQUIP_ERR_DONT_OWN_THAT_ITEM = 32, EQUIP_ERR_DONT_OWN_THAT_ITEM = 32,
EQUIP_ERR_CAN_EQUIP_ONLY1_QUIVER = 33, EQUIP_ERR_CAN_EQUIP_ONLY1_QUIVER = 33,
EQUIP_ERR_MUST_PURCHASE_THAT_BAG_SLOT = 34, EQUIP_ERR_MUST_PURCHASE_THAT_BAG_SLOT = 34,
EQUIP_ERR_TOO_FAR_AWAY_FROM_BANK = 35, EQUIP_ERR_TOO_FAR_AWAY_FROM_BANK = 35,
EQUIP_ERR_ITEM_LOCKED = 36, EQUIP_ERR_ITEM_LOCKED = 36,
EQUIP_ERR_YOU_ARE_STUNNED = 37, EQUIP_ERR_YOU_ARE_STUNNED = 37,
EQUIP_ERR_YOU_ARE_DEAD = 38, EQUIP_ERR_YOU_ARE_DEAD = 38,
EQUIP_ERR_CANT_DO_RIGHT_NOW = 39, EQUIP_ERR_CANT_DO_RIGHT_NOW = 39,
EQUIP_ERR_BAG_FULL2 = 40, EQUIP_ERR_BAG_FULL2 = 40,
EQUIP_ERR_CAN_EQUIP_ONLY1_QUIVER2 = 41, EQUIP_ERR_CAN_EQUIP_ONLY1_QUIVER2 = 41,
EQUIP_ERR_CAN_EQUIP_ONLY1_AMMOPOUCH = 42, EQUIP_ERR_CAN_EQUIP_ONLY1_AMMOPOUCH = 42,
EQUIP_ERR_STACKABLE_CANT_BE_WRAPPED = 43, EQUIP_ERR_STACKABLE_CANT_BE_WRAPPED = 43,
EQUIP_ERR_EQUIPPED_CANT_BE_WRAPPED = 44, EQUIP_ERR_EQUIPPED_CANT_BE_WRAPPED = 44,
EQUIP_ERR_WRAPPED_CANT_BE_WRAPPED = 45, EQUIP_ERR_WRAPPED_CANT_BE_WRAPPED = 45,
EQUIP_ERR_BOUND_CANT_BE_WRAPPED = 46, EQUIP_ERR_BOUND_CANT_BE_WRAPPED = 46,
EQUIP_ERR_UNIQUE_CANT_BE_WRAPPED = 47, EQUIP_ERR_UNIQUE_CANT_BE_WRAPPED = 47,
EQUIP_ERR_BAGS_CANT_BE_WRAPPED = 48, EQUIP_ERR_BAGS_CANT_BE_WRAPPED = 48,
EQUIP_ERR_ALREADY_LOOTED = 49, EQUIP_ERR_ALREADY_LOOTED = 49,
EQUIP_ERR_INVENTORY_FULL = 50, EQUIP_ERR_INVENTORY_FULL = 50,
EQUIP_ERR_BANK_FULL = 51, EQUIP_ERR_BANK_FULL = 51,
EQUIP_ERR_ITEM_IS_CURRENTLY_SOLD_OUT = 52, EQUIP_ERR_ITEM_IS_CURRENTLY_SOLD_OUT = 52,
EQUIP_ERR_BAG_FULL3 = 53, EQUIP_ERR_BAG_FULL3 = 53,
EQUIP_ERR_ITEM_NOT_FOUND2 = 54, EQUIP_ERR_ITEM_NOT_FOUND2 = 54,
EQUIP_ERR_ITEM_CANT_STACK2 = 55, EQUIP_ERR_ITEM_CANT_STACK2 = 55,
EQUIP_ERR_BAG_FULL4 = 56, EQUIP_ERR_BAG_FULL4 = 56,
EQUIP_ERR_ITEM_SOLD_OUT = 57, EQUIP_ERR_ITEM_SOLD_OUT = 57,
EQUIP_ERR_OBJECT_IS_BUSY = 58, EQUIP_ERR_OBJECT_IS_BUSY = 58,
EQUIP_ERR_NONE = 59, EQUIP_ERR_NONE = 59,
EQUIP_ERR_CANT_DO_IN_COMBAT = 60, EQUIP_ERR_CANT_DO_IN_COMBAT = 60,
EQUIP_CANT_DO_WHILE_DISARMED = 61, EQUIP_CANT_DO_WHILE_DISARMED = 61,
EQUIP_ERR_BAG_FULL6 = 62, EQUIP_ERR_BAG_FULL6 = 62,
EQUIP_ITEM_RANK_NOT_ENOUGH = 63, EQUIP_ITEM_RANK_NOT_ENOUGH = 63,
EQUIP_ITEM_REPUTATION_NOT_ENOUGH = 64, EQUIP_ITEM_REPUTATION_NOT_ENOUGH = 64,
EQUIP_MORE_THAN1_SPECIAL_BAG = 65 EQUIP_MORE_THAN1_SPECIAL_BAG = 65
};
enum BuyFailure
{
BUY_ERR_CANT_FIND_ITEM = 0,
BUY_ERR_ITEM_ALREADY_SOLD = 1,
BUY_ERR_NOT_ENOUGHT_MONEY = 2,
BUY_ERR_SELLER_DONT_LIKE_YOU = 4,
BUY_ERR_DISTANCE_TOO_FAR = 5,
BUY_ERR_CANT_CARRY_MORE = 8,
BUY_ERR_LEVEL_REQUIRE = 11,
BUY_ERR_REPUTATION_REQUIRE = 12
};
enum SellFailure
{
SELL_ERR_CANT_FIND_ITEM = 1,
SELL_ERR_CANT_SELL_ITEM = 2,
SELL_ERR_CANT_FIND_VENDOR = 3
}; };
enum ITEM_STAT_TYPE enum BuyFailure
{ {
ITEM_STAT_POWER = 0, BUY_ERR_CANT_FIND_ITEM = 0,
ITEM_STAT_HEALTH = 1, BUY_ERR_ITEM_ALREADY_SOLD = 1,
ITEM_STAT_UNKNOWN = 2, BUY_ERR_NOT_ENOUGHT_MONEY = 2,
ITEM_STAT_AGILITY = 3, BUY_ERR_SELLER_DONT_LIKE_YOU = 4,
ITEM_STAT_STRENGTH = 4, BUY_ERR_DISTANCE_TOO_FAR = 5,
ITEM_STAT_INTELLECT = 5, BUY_ERR_CANT_CARRY_MORE = 8,
ITEM_STAT_SPIRIT = 6, BUY_ERR_LEVEL_REQUIRE = 11,
ITEM_STAT_STAMINA = 7 BUY_ERR_REPUTATION_REQUIRE = 12
};
enum ITEM_DAMAGE_TYPE
{
NORMAL_DAMAGE = 0,
HOLY_DAMAGE = 1,
FIRE_DAMAGE = 2,
NATURE_DAMAGE = 3,
FROST_DAMAGE = 4,
SHADOW_DAMAGE = 5,
ARCANE_DAMAGE = 6
};
enum ITEM_SPELLTRIGGER_TYPE
{
USE = 0,
ON_EQUIP = 1,
CHANCE_ON_HIT = 2,
SOULSTONE = 4
};
enum ITEM_BONDING_TYPE
{
NO_BIND = 0,
BIND_WHEN_PICKED_UP = 1,
BIND_WHEN_EQUIPED = 2,
BIND_WHEN_USE = 3,
//TODO: Better name these
QUEST_ITEM = 4,
QUEST_ITEM1 = 5
};
// masks for ITEM_FIELD_FLAGS field
enum ITEM_FLAGS
{
ITEM_FLAGS_BINDED = 1
};
enum BAG_FAMILY
{
BAG_FAMILY_NONE = 0,
BAG_FAMILY_ARROWS = 1,
BAG_FAMILY_BULLETS = 2,
BAG_FAMILY_SOUL_SHARDS = 3,
//BAG_FAMILY_UNK1 = 4,
//BAG_FAMILY_UNK1 = 5,
BAG_FAMILY_HERBS = 6,
BAG_FAMILY_ENCHANTING_SUPP = 7,
BAG_FAMILY_ENGINEERING_SUPP = 8,
BAG_FAMILY_KEYS = 9,
BAG_FAMILY_GEMS = 10,
//BAG_FAMILY_UNK3 = 11,
BAG_FAMILY_MINING_SUPP = 12
};
enum INVENTORY_TYPES
{
INVTYPE_NON_EQUIP = 0,
INVTYPE_HEAD = 1,
INVTYPE_NECK = 2,
INVTYPE_SHOULDERS = 3,
INVTYPE_BODY = 4,
INVTYPE_CHEST = 5,
INVTYPE_WAIST = 6,
INVTYPE_LEGS = 7,
INVTYPE_FEET = 8,
INVTYPE_WRISTS = 9,
INVTYPE_HANDS = 10,
INVTYPE_FINGER = 11,
INVTYPE_TRINKET = 12,
INVTYPE_WEAPON = 13,
INVTYPE_SHIELD = 14,
INVTYPE_RANGED = 15,
INVTYPE_CLOAK = 16,
INVTYPE_2HWEAPON = 17,
INVTYPE_BAG = 18,
INVTYPE_TABARD = 19,
INVTYPE_ROBE = 20,
INVTYPE_WEAPONMAINHAND = 21,
INVTYPE_WEAPONOFFHAND = 22,
INVTYPE_HOLDABLE = 23,
INVTYPE_AMMO = 24,
INVTYPE_THROWN = 25,
INVTYPE_RANGEDRIGHT = 26,
INVTYPE_SLOT_ITEM = 27,
INVTYPE_RELIC = 28,
NUM_INVENTORY_TYPES = 29
};
enum INVENTORY_CLASS
{
ITEM_CLASS_CONSUMABLE = 0,
ITEM_CLASS_CONTAINER = 1,
ITEM_CLASS_WEAPON = 2,
ITEM_CLASS_JEWELRY = 3,
ITEM_CLASS_ARMOR = 4,
ITEM_CLASS_REAGENT = 5,
ITEM_CLASS_PROJECTILE = 6,
ITEM_CLASS_TRADE_GOODS = 7,
ITEM_CLASS_GENERIC = 8,
ITEM_CLASS_BOOK = 9,
ITEM_CLASS_MONEY = 10,
ITEM_CLASS_QUIVER = 11,
ITEM_CLASS_QUEST = 12,
ITEM_CLASS_KEY = 13,
ITEM_CLASS_PERMANENT = 14,
ITEM_CLASS_JUNK = 15
};
// Client understand only 0 subclass for ITEM_CLASS_CONSUMABLE
// but this value used in code as implementation workaround
enum ITEM_SUBCLASS_CONSUMABLE
{
ITEM_SUBCLASS_FOOD = 1,
ITEM_SUBCLASS_LIQUID = 2,
ITEM_SUBCLASS_POTION = 3,
ITEM_SUBCLASS_SCROLL = 4,
ITEM_SUBCLASS_BANDAGE = 5,
ITEM_SUBCLASS_HEALTHSTONE = 6,
ITEM_SUBCLASS_COMBAT_EFFECT = 7
};
enum ITEM_SUBCLASS_CONTAINER
{
ITEM_SUBCLASS_CONTAINER = 0,
ITEM_SUBCLASS_SOUL_CONTAINER = 1,
ITEM_SUBCLASS_HERB_CONTAINER = 2,
ITEM_SUBCLASS_ENCHANTING_CONTAINER = 3,
ITEM_SUBCLASS_ENGINEERING_CONTAINER = 4
};
enum INVENTORY_SUBCLASS_WEAPON
{
ITEM_SUBCLASS_WEAPON_AXE = 0,
ITEM_SUBCLASS_WEAPON_AXE2 = 1,
ITEM_SUBCLASS_WEAPON_BOW = 2,
ITEM_SUBCLASS_WEAPON_GUN = 3,
ITEM_SUBCLASS_WEAPON_MACE = 4,
ITEM_SUBCLASS_WEAPON_MACE2 = 5,
ITEM_SUBCLASS_WEAPON_POLEARM = 6,
ITEM_SUBCLASS_WEAPON_SWORD = 7,
ITEM_SUBCLASS_WEAPON_SWORD2 = 8,
ITEM_SUBCLASS_WEAPON_obsolete = 9,
ITEM_SUBCLASS_WEAPON_STAFF = 10,
ITEM_SUBCLASS_WEAPON_EXOTIC = 11,
ITEM_SUBCLASS_WEAPON_EXOTIC2 = 12,
ITEM_SUBCLASS_WEAPON_UNARMED = 13,
ITEM_SUBCLASS_WEAPON_GENERIC = 14,
ITEM_SUBCLASS_WEAPON_DAGGER = 15,
ITEM_SUBCLASS_WEAPON_THROWN = 16,
ITEM_SUBCLASS_WEAPON_SPEAR = 17,
ITEM_SUBCLASS_WEAPON_CROSSBOW = 18,
ITEM_SUBCLASS_WEAPON_WAND = 19,
ITEM_SUBCLASS_WEAPON_FISHING_POLE = 20
};
enum ITEM_SUBCLASS_ARMOR
{
ITEM_SUBCLASS_ARMOR_GENERIC = 0,
ITEM_SUBCLASS_ARMOR_CLOTH = 1,
ITEM_SUBCLASS_ARMOR_LEATHER = 2,
ITEM_SUBCLASS_ARMOR_MAIL = 3,
ITEM_SUBCLASS_ARMOR_PLATE = 4,
ITEM_SUBCLASS_ARMOR_BUCKLER = 5,
ITEM_SUBCLASS_ARMOR_SHIELD = 6
};
enum ITEM_SUBCLASS_PROJECTILE
{
ITEM_SUBCLASS_ARROW = 2,
ITEM_SUBCLASS_BULLET = 3
};
enum ITEM_SUBCLASS_TRADE_GOODS
{
ITEM_SUBCLASS_TRADE_GOODS = 0,
ITEM_SUBCLASS_PARTS = 1,
ITEM_SUBCLASS_EXPLOSIVES = 2,
ITEM_SUBCLASS_DEVICES = 3
};
enum ITEM_SUBCLASS_BOOK
{
ITEM_SUBCLASS_BOOK = 0,
ITEM_SUBCLASS_LEATHERWORKING_PATTERN = 1,
ITEM_SUBCLASS_TAILORING_PATTERN = 2,
ITEM_SUBCLASS_ENGINEERING_SCHEMATIC = 3,
ITEM_SUBCLASS_COOKING_RECIPE = 5,
ITEM_SUBCLASS_ALCHEMY_RECIPE = 6,
ITEM_SUBCLASS_FIRST_AID_MANUAL = 7,
ITEM_SUBCLASS_ENCHANTING_FORMULA = 8,
ITEM_SUBCLASS_FISHING_MANUAL = 9
};
enum ITEM_SUBCLASS_QUIVER
{
ITEM_SUBCLASS_QUIVER = 2,
ITEM_SUBCLASS_AMMO_POUCH = 3
}; };
struct _ItemStat enum SellFailure
{ {
uint32 ItemStatType; SELL_ERR_CANT_FIND_ITEM = 1,
uint32 ItemStatValue; SELL_ERR_CANT_SELL_ITEM = 2,
SELL_ERR_CANT_FIND_VENDOR = 3
}; };
struct _ItemSpell enum ITEM_STAT_TYPE
{ {
uint32 SpellId; ITEM_STAT_POWER = 0,
uint32 SpellTrigger; ITEM_STAT_HEALTH = 1,
uint32 SpellCharges; ITEM_STAT_UNKNOWN = 2,
uint32 SpellCooldown; ITEM_STAT_AGILITY = 3,
uint32 SpellCategory; ITEM_STAT_STRENGTH = 4,
uint32 SpellCategoryCooldown; ITEM_STAT_INTELLECT = 5,
ITEM_STAT_SPIRIT = 6,
ITEM_STAT_STAMINA = 7
};
enum ITEM_DAMAGE_TYPE
{
NORMAL_DAMAGE = 0,
HOLY_DAMAGE = 1,
FIRE_DAMAGE = 2,
NATURE_DAMAGE = 3,
FROST_DAMAGE = 4,
SHADOW_DAMAGE = 5,
ARCANE_DAMAGE = 6
};
enum ITEM_SPELLTRIGGER_TYPE
{
USE = 0,
ON_EQUIP = 1,
CHANCE_ON_HIT = 2,
SOULSTONE = 4
};
enum ITEM_BONDING_TYPE
{
NO_BIND = 0,
BIND_WHEN_PICKED_UP = 1,
BIND_WHEN_EQUIPED = 2,
BIND_WHEN_USE = 3,
//TODO: Better name these
QUEST_ITEM = 4,
QUEST_ITEM1 = 5
};
// masks for ITEM_FIELD_FLAGS field
enum ITEM_FLAGS
{
ITEM_FLAGS_BINDED = 1
};
enum BAG_FAMILY
{
BAG_FAMILY_NONE = 0,
BAG_FAMILY_ARROWS = 1,
BAG_FAMILY_BULLETS = 2,
BAG_FAMILY_SOUL_SHARDS = 3,
//BAG_FAMILY_UNK1 = 4,
//BAG_FAMILY_UNK1 = 5,
BAG_FAMILY_HERBS = 6,
BAG_FAMILY_ENCHANTING_SUPP = 7,
BAG_FAMILY_ENGINEERING_SUPP = 8,
BAG_FAMILY_KEYS = 9,
BAG_FAMILY_GEMS = 10,
//BAG_FAMILY_UNK3 = 11,
BAG_FAMILY_MINING_SUPP = 12
};
enum INVENTORY_TYPES
{
INVTYPE_NON_EQUIP = 0,
INVTYPE_HEAD = 1,
INVTYPE_NECK = 2,
INVTYPE_SHOULDERS = 3,
INVTYPE_BODY = 4,
INVTYPE_CHEST = 5,
INVTYPE_WAIST = 6,
INVTYPE_LEGS = 7,
INVTYPE_FEET = 8,
INVTYPE_WRISTS = 9,
INVTYPE_HANDS = 10,
INVTYPE_FINGER = 11,
INVTYPE_TRINKET = 12,
INVTYPE_WEAPON = 13,
INVTYPE_SHIELD = 14,
INVTYPE_RANGED = 15,
INVTYPE_CLOAK = 16,
INVTYPE_2HWEAPON = 17,
INVTYPE_BAG = 18,
INVTYPE_TABARD = 19,
INVTYPE_ROBE = 20,
INVTYPE_WEAPONMAINHAND = 21,
INVTYPE_WEAPONOFFHAND = 22,
INVTYPE_HOLDABLE = 23,
INVTYPE_AMMO = 24,
INVTYPE_THROWN = 25,
INVTYPE_RANGEDRIGHT = 26,
INVTYPE_SLOT_ITEM = 27,
INVTYPE_RELIC = 28,
NUM_INVENTORY_TYPES = 29
};
enum INVENTORY_CLASS
{
ITEM_CLASS_CONSUMABLE = 0,
ITEM_CLASS_CONTAINER = 1,
ITEM_CLASS_WEAPON = 2,
ITEM_CLASS_JEWELRY = 3,
ITEM_CLASS_ARMOR = 4,
ITEM_CLASS_REAGENT = 5,
ITEM_CLASS_PROJECTILE = 6,
ITEM_CLASS_TRADE_GOODS = 7,
ITEM_CLASS_GENERIC = 8,
ITEM_CLASS_BOOK = 9,
ITEM_CLASS_MONEY = 10,
ITEM_CLASS_QUIVER = 11,
ITEM_CLASS_QUEST = 12,
ITEM_CLASS_KEY = 13,
ITEM_CLASS_PERMANENT = 14,
ITEM_CLASS_JUNK = 15
};
// Client understand only 0 subclass for ITEM_CLASS_CONSUMABLE
// but this value used in code as implementation workaround
enum ITEM_SUBCLASS_CONSUMABLE
{
ITEM_SUBCLASS_FOOD = 1,
ITEM_SUBCLASS_LIQUID = 2,
ITEM_SUBCLASS_POTION = 3,
ITEM_SUBCLASS_SCROLL = 4,
ITEM_SUBCLASS_BANDAGE = 5,
ITEM_SUBCLASS_HEALTHSTONE = 6,
ITEM_SUBCLASS_COMBAT_EFFECT = 7
};
enum ITEM_SUBCLASS_CONTAINER
{
ITEM_SUBCLASS_CONTAINER = 0,
ITEM_SUBCLASS_SOUL_CONTAINER = 1,
ITEM_SUBCLASS_HERB_CONTAINER = 2,
ITEM_SUBCLASS_ENCHANTING_CONTAINER = 3,
ITEM_SUBCLASS_ENGINEERING_CONTAINER = 4
};
enum INVENTORY_SUBCLASS_WEAPON
{
ITEM_SUBCLASS_WEAPON_AXE = 0,
ITEM_SUBCLASS_WEAPON_AXE2 = 1,
ITEM_SUBCLASS_WEAPON_BOW = 2,
ITEM_SUBCLASS_WEAPON_GUN = 3,
ITEM_SUBCLASS_WEAPON_MACE = 4,
ITEM_SUBCLASS_WEAPON_MACE2 = 5,
ITEM_SUBCLASS_WEAPON_POLEARM = 6,
ITEM_SUBCLASS_WEAPON_SWORD = 7,
ITEM_SUBCLASS_WEAPON_SWORD2 = 8,
ITEM_SUBCLASS_WEAPON_obsolete = 9,
ITEM_SUBCLASS_WEAPON_STAFF = 10,
ITEM_SUBCLASS_WEAPON_EXOTIC = 11,
ITEM_SUBCLASS_WEAPON_EXOTIC2 = 12,
ITEM_SUBCLASS_WEAPON_UNARMED = 13,
ITEM_SUBCLASS_WEAPON_GENERIC = 14,
ITEM_SUBCLASS_WEAPON_DAGGER = 15,
ITEM_SUBCLASS_WEAPON_THROWN = 16,
ITEM_SUBCLASS_WEAPON_SPEAR = 17,
ITEM_SUBCLASS_WEAPON_CROSSBOW = 18,
ITEM_SUBCLASS_WEAPON_WAND = 19,
ITEM_SUBCLASS_WEAPON_FISHING_POLE = 20
};
enum ITEM_SUBCLASS_ARMOR
{
ITEM_SUBCLASS_ARMOR_GENERIC = 0,
ITEM_SUBCLASS_ARMOR_CLOTH = 1,
ITEM_SUBCLASS_ARMOR_LEATHER = 2,
ITEM_SUBCLASS_ARMOR_MAIL = 3,
ITEM_SUBCLASS_ARMOR_PLATE = 4,
ITEM_SUBCLASS_ARMOR_BUCKLER = 5,
ITEM_SUBCLASS_ARMOR_SHIELD = 6
};
enum ITEM_SUBCLASS_PROJECTILE
{
ITEM_SUBCLASS_ARROW = 2,
ITEM_SUBCLASS_BULLET = 3
};
enum ITEM_SUBCLASS_TRADE_GOODS
{
ITEM_SUBCLASS_TRADE_GOODS = 0,
ITEM_SUBCLASS_PARTS = 1,
ITEM_SUBCLASS_EXPLOSIVES = 2,
ITEM_SUBCLASS_DEVICES = 3
};
enum ITEM_SUBCLASS_BOOK
{
ITEM_SUBCLASS_BOOK = 0,
ITEM_SUBCLASS_LEATHERWORKING_PATTERN = 1,
ITEM_SUBCLASS_TAILORING_PATTERN = 2,
ITEM_SUBCLASS_ENGINEERING_SCHEMATIC = 3,
ITEM_SUBCLASS_COOKING_RECIPE = 5,
ITEM_SUBCLASS_ALCHEMY_RECIPE = 6,
ITEM_SUBCLASS_FIRST_AID_MANUAL = 7,
ITEM_SUBCLASS_ENCHANTING_FORMULA = 8,
ITEM_SUBCLASS_FISHING_MANUAL = 9
};
enum ITEM_SUBCLASS_QUIVER
{
ITEM_SUBCLASS_QUIVER = 2,
ITEM_SUBCLASS_AMMO_POUCH = 3
};
struct _ItemStat
{
uint32 ItemStatType;
uint32 ItemStatValue;
};
struct _ItemSpell
{
uint32 SpellId;
uint32 SpellTrigger;
uint32 SpellCharges;
uint32 SpellCooldown;
uint32 SpellCategory;
uint32 SpellCategoryCooldown;
}; };
struct _ItemSocket struct _ItemSocket
@ -329,68 +329,68 @@ struct _ItemSocket
uint32 Content; uint32 Content;
}; };
struct _ItemDamage struct _ItemDamage
{ {
float DamageMin; float DamageMin;
float DamageMax; float DamageMax;
uint32 DamageType; uint32 DamageType;
}; };
struct ItemProto struct ItemProto
{ {
uint32 Id; uint32 Id;
uint32 Class; uint32 Class;
uint32 SubClass; uint32 SubClass;
std::string Name[4]; std::string Name[4];
uint32 DisplayInfoID; uint32 DisplayInfoID;
uint32 Quality; uint32 Quality;
uint32 Flags; uint32 Flags;
uint32 BuyCount; uint32 BuyCount;
uint32 BuyPrice; uint32 BuyPrice;
uint32 SellPrice; uint32 SellPrice;
uint32 InventoryType; uint32 InventoryType;
uint32 AllowableClass; uint32 AllowableClass;
uint32 AllowableRace; uint32 AllowableRace;
uint32 ItemLevel; uint32 ItemLevel;
uint32 RequiredLevel; uint32 RequiredLevel;
uint32 RequiredSkill; uint32 RequiredSkill;
uint32 RequiredSkillRank; uint32 RequiredSkillRank;
uint32 RequiredSpell; uint32 RequiredSpell;
uint32 RequiredHonorRank; uint32 RequiredHonorRank;
uint32 RequiredCityRank; uint32 RequiredCityRank;
uint32 RequiredReputationFaction; uint32 RequiredReputationFaction;
uint32 RequiredReputationRank; uint32 RequiredReputationRank;
uint32 MaxCount; uint32 MaxCount;
uint32 Stackable; uint32 Stackable;
uint32 ContainerSlots; uint32 ContainerSlots;
_ItemStat ItemStat[10]; _ItemStat ItemStat[10];
_ItemDamage Damage[5]; _ItemDamage Damage[5];
uint32 Armor; uint32 Armor;
uint32 HolyRes; uint32 HolyRes;
uint32 FireRes; uint32 FireRes;
uint32 NatureRes; uint32 NatureRes;
uint32 FrostRes; uint32 FrostRes;
uint32 ShadowRes; uint32 ShadowRes;
uint32 ArcaneRes; uint32 ArcaneRes;
uint32 Delay; uint32 Delay;
uint32 Ammo_type; uint32 Ammo_type;
float RangedModRange; float RangedModRange;
_ItemSpell Spells[5]; _ItemSpell Spells[5];
uint32 Bonding; uint32 Bonding;
std::string Description; std::string Description;
uint32 PageText; uint32 PageText;
uint32 LanguageID; uint32 LanguageID;
uint32 PageMaterial; uint32 PageMaterial;
uint32 StartQuest; uint32 StartQuest;
uint32 LockID; uint32 LockID;
uint32 Material; uint32 Material;
uint32 Sheath; uint32 Sheath;
uint32 Extra; uint32 Extra;
uint32 Unk1; uint32 Unk1;
uint32 Block; uint32 Block;
uint32 ItemSet; uint32 ItemSet;
uint32 MaxDurability; uint32 MaxDurability;
uint32 Area; uint32 Area;
uint32 Map; uint32 Map;
uint32 BagFamily; uint32 BagFamily;
@ -399,7 +399,8 @@ struct ItemProto
uint32 socketBonus; uint32 socketBonus;
uint32 GemProperties; uint32 GemProperties;
uint32 ExtendedCost; uint32 ExtendedCost;
uint32 RequiredDisenchantSkill; uint32 RequiredDisenchantSkill;
float ArmorDamageModifier;
}; };
class Item : public Object class Item : public Object
@ -409,7 +410,7 @@ public:
void Create(uint64); void Create(uint64);
uint8 GetSlot(void) { return _slot; } uint8 GetSlot(void) { return _slot; }
void SetSlot(uint8 nr) { _slot = nr; } void SetSlot(uint8 nr) { _slot = nr; }
uint32 GetEntry() const { return GetUInt32Value(OBJECT_FIELD_ENTRY); } uint32 GetEntry() const { return GetUInt32Value(OBJECT_FIELD_ENTRY); }
uint32 GetCount() const { return GetUInt32Value(ITEM_FIELD_STACK_COUNT); } uint32 GetCount() const { return GetUInt32Value(ITEM_FIELD_STACK_COUNT); }
Bag *GetBag(void) { return _bag; } Bag *GetBag(void) { return _bag; }
bool IsInBag() const { return _bag != NULL; } bool IsInBag() const { return _bag != NULL; }
@ -423,4 +424,4 @@ protected:
#endif #endif

View File

@ -3,71 +3,72 @@
#include "UpdateFields.h" #include "UpdateFields.h"
#include "ObjectDefines.h" #include "ObjectDefines.h"
#include "common.h"
enum TYPE enum TYPE
{ {
TYPE_OBJECT = 1, TYPE_OBJECT = 1,
TYPE_ITEM = 2, TYPE_ITEM = 2,
TYPE_CONTAINER = 6, TYPE_CONTAINER = 6,
TYPE_UNIT = 8, TYPE_UNIT = 8,
TYPE_PLAYER = 16, TYPE_PLAYER = 16,
TYPE_GAMEOBJECT = 32, TYPE_GAMEOBJECT = 32,
TYPE_DYNAMICOBJECT = 64, TYPE_DYNAMICOBJECT = 64,
TYPE_CORPSE = 128, TYPE_CORPSE = 128,
TYPE_AIGROUP = 256, TYPE_AIGROUP = 256,
TYPE_AREATRIGGER = 512 TYPE_AREATRIGGER = 512
}; };
enum TYPEID enum TYPEID
{ {
TYPEID_OBJECT = 0, TYPEID_OBJECT = 0,
TYPEID_ITEM = 1, TYPEID_ITEM = 1,
TYPEID_CONTAINER = 2, TYPEID_CONTAINER = 2,
TYPEID_UNIT = 3, TYPEID_UNIT = 3,
TYPEID_PLAYER = 4, TYPEID_PLAYER = 4,
TYPEID_GAMEOBJECT = 5, TYPEID_GAMEOBJECT = 5,
TYPEID_DYNAMICOBJECT = 6, TYPEID_DYNAMICOBJECT = 6,
TYPEID_CORPSE = 7, TYPEID_CORPSE = 7,
TYPEID_AIGROUP = 8, TYPEID_AIGROUP = 8,
TYPEID_AREATRIGGER = 9 TYPEID_AREATRIGGER = 9
}; };
class Object class Object
{ {
public: public:
virtual ~Object(); virtual ~Object();
inline const uint64 GetGUID() const { return GetUInt64Value(0); } inline const uint64 GetGUID() const { return GetUInt64Value(0); }
inline const uint32 GetGUIDLow() const { return GetUInt32Value(0); } inline const uint32 GetGUIDLow() const { return GetUInt32Value(0); }
inline const uint32 GetGUIDHigh() const { return GetUInt32Value(1); } inline const uint32 GetGUIDHigh() const { return GetUInt32Value(1); }
inline uint32 GetEntry() const { return GetUInt32Value(OBJECT_FIELD_ENTRY); } inline uint32 GetEntry() const { return GetUInt32Value(OBJECT_FIELD_ENTRY); }
inline uint16 GetValuesCount(void) { return _valuescount; } inline uint16 GetValuesCount(void) { return _valuescount; }
inline const uint8 GetTypeId() { return _typeid; } inline const uint8 GetTypeId() { return _typeid; }
inline bool isType(uint8 mask) { return (mask & _type) ? true : false; } inline bool isType(uint8 mask) { return (mask & _type) ? true : false; }
inline const uint32 GetUInt32Value( uint16 index ) const inline const uint32 GetUInt32Value( uint16 index ) const
{ {
return _uint32values[ index ]; return _uint32values[ index ];
}
inline const uint64 GetUInt64Value( uint16 index ) const
{
return *((uint64*)&(_uint32values[ index ]));
} }
inline bool HasFlag( uint16 index, uint32 flag ) const inline const uint64 GetUInt64Value( uint16 index ) const
{ {
return (_uint32values[ index ] & flag) != 0; return *((uint64*)&(_uint32values[ index ]));
} }
inline const float GetFloatValue( uint16 index ) const
{ inline bool HasFlag( uint16 index, uint32 flag ) const
return _floatvalues[ index ]; {
return (_uint32values[ index ] & flag) != 0;
} }
inline void SetFloatValue( uint16 index, float value ) inline const float GetFloatValue( uint16 index ) const
{ {
return _floatvalues[ index ];
}
inline void SetFloatValue( uint16 index, float value )
{
_floatvalues[ index ] = value; _floatvalues[ index ] = value;
} }
inline void SetUInt32Value( uint16 index, uint32 value ) inline void SetUInt32Value( uint16 index, uint32 value )
{ {
_uint32values[ index ] = value; _uint32values[ index ] = value;
} }

View File

@ -950,9 +950,44 @@ const char* worldOpcodeNames[] =
"UNKNOWN", // 917 "UNKNOWN", // 917
"SMSG_UNKNOWN_918", // 918 "SMSG_UNKNOWN_918", // 918
"SMSG_UNKNOWN_919", // 919 "SMSG_UNKNOWN_919", // 919
"SMSG_UNKNOWN_920", // 920 "SMSG_UNKNOWN_920", // 920
//there would be declared new opcode, id 921 "UNKNOWN921", // 921
//do not forget to change MAX_OPCODE_ID, if you add a line here! "UNKNOWN922", // 922
"UNKNOWN923", // 923
"UNKNOWN924", // 924
"SMSG_SET_COMBO_POINTS", // 925
"UNKNOWN926", // 926
"UNKNOWN927", // 927
"UNKNOWN928", // 928
"UNKNOWN929", // 929
"UNKNOWN930", // 930
"SMSG_SET_AURA_MULTIPLY", // 931
"SMSG_SET_AURA_SINGLE", // 932
"UNKNOWN933", // 933
"SMSG_CAST_SUCCESS", // 934
"SMSG_UNKNOWN_935", // 935
"UNKNOWN936", // 936
"UNKNOWN937", // 937
"UNKNOWN938", // 938
"UNKNOWN939", // 939
"UNKNOWN940", // 940
"SMSG_UNKNOWN_941", // 941
"SMSG_UNKNOWN_942", // 942
"UNKNOWN943", // 943
"UNKNOWN944", // 944
"UNKNOWN945", // 945
"UNKNOWN946", // 946
"UNKNOWN947", // 947
"UNKNOWN948", // 948
"UNKNOWN949", // 949
"UNKNOWN950", // 950
"UNKNOWN951", // 951
"CMSG_UNKNOWN_952", // 952
"UNKNOWN953", // 953
"SMSG_UNKNOWN_954", // 954
"SMSG_UNKNOWN_955", // 955
//there would be declared new opcode, id 956
//do not forget to change MAX_OPCODE_ID, if you add a line here!
}; };
const char *GetOpcodeName(unsigned int id) const char *GetOpcodeName(unsigned int id)

View File

@ -967,10 +967,61 @@ enum OpCodes
SMSG_UNKNOWN_918 = 918, // chat message: The party leader has attempted to reset the instance you are in. Please zone out to allow the instance to reset. SMSG_UNKNOWN_918 = 918, // chat message: The party leader has attempted to reset the instance you are in. Please zone out to allow the instance to reset.
SMSG_UNKNOWN_919 = 919, // uint8(0)+uint32(0/1)+uint64(unk/guid) SMSG_UNKNOWN_919 = 919, // uint8(0)+uint32(0/1)+uint64(unk/guid)
SMSG_UNKNOWN_920 = 920, // notify message: This system is currently disabled. SMSG_UNKNOWN_920 = 920, // notify message: This system is currently disabled.
// 921
// 922
// 923
// 924
SMSG_SET_COMBO_POINTS = 925, // set combo points
// 926
// 927
// 928
// 929
// 930
SMSG_SET_AURA_MULTIPLY = 931,
/*
packed_guid
block (can repeat):
uint8 index may be it's aura slot? (increments)
uint32 spellid
uint32 duration1 (full?)
uint32 duration2 (remaining?)
*/
SMSG_SET_AURA_SINGLE = 932,
/*
packed_guid
uint8 index may be it's aura slot? (increments)
uint32 spellid
uint32 duration1 (full?)
uint32 duration2 (remaining?)
*/
// 933
SMSG_CAST_SUCCESS = 934,
SMSG_UNKNOWN_935 = 935, // teleport/movement opcode
// 936
// 937
// 938
// 939
// 940
SMSG_UNKNOWN_941 = 941, // teleport/movement opcode
SMSG_UNKNOWN_942 = 942, // Everyone is Ready! (message)
// 943
// 944
// 945
// 946
// 947
// 948
// 949
// 950
// 951
CMSG_UNKNOWN_952 = 952, // response to 942 opcode
CMSG_REPORT_SPAM = 953, // Report Spam chat button
SMSG_REPORT_SPAM_RESPONSE = 954, // Complaint Registered. (message)
SMSG_ACTIVATE_SPAM_REPORTING = 955, // unk uint8
}; };
//if you add new opcode .. Do NOT forget to change the following define MAX_OPCODE_ID and also add new opcode to table in opcodes.cpp //if you add new opcode .. Do NOT forget to change the following define MAX_OPCODE_ID and also add new opcode to table in opcodes.cpp
#define MAX_OPCODE_ID 920 #define MAX_OPCODE_ID 955
/// Results of friend related commands /// Results of friend related commands
enum FriendsResult enum FriendsResult

File diff suppressed because it is too large Load Diff

View File

@ -16,346 +16,434 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#include "Common.h"
#ifndef _UPDATEFIELDS_AUTO_H #ifndef _UPDATEFIELDS_AUTO_H
#define _UPDATEFIELDS_AUTO_H #define _UPDATEFIELDS_AUTO_H
// Auto generated for version 2.1.3, build 6898
enum EObjectFields enum EObjectFields
{ {
OBJECT_FIELD_GUID = 0x00, // Size:2 OBJECT_FIELD_GUID = 0x0000, // 2 4 1
OBJECT_FIELD_TYPE = 0x02, // Size:1 OBJECT_FIELD_TYPE = 0x0002, // 1 1 1
OBJECT_FIELD_ENTRY = 0x03, // Size:1 OBJECT_FIELD_ENTRY = 0x0003, // 1 1 1
OBJECT_FIELD_SCALE_X = 0x04, // Size:1 OBJECT_FIELD_SCALE_X = 0x0004, // 1 3 1
OBJECT_FIELD_PADDING = 0x05, // Size:1 OBJECT_FIELD_PADDING = 0x0005, // 1 1 0
OBJECT_END = 0x06, OBJECT_END = 0x0006,
}; };
enum EItemFields enum EItemFields
{ {
ITEM_FIELD_OWNER = OBJECT_END + 0x00, // Size:2 ITEM_FIELD_OWNER = 0x0006, // 2 4 1
ITEM_FIELD_CONTAINED = OBJECT_END + 0x02, // Size:2 ITEM_FIELD_CONTAINED = 0x0008, // 2 4 1
ITEM_FIELD_CREATOR = OBJECT_END + 0x04, // Size:2 ITEM_FIELD_CREATOR = 0x000A, // 2 4 1
ITEM_FIELD_GIFTCREATOR = OBJECT_END + 0x06, // Size:2 ITEM_FIELD_GIFTCREATOR = 0x000C, // 2 4 1
ITEM_FIELD_STACK_COUNT = OBJECT_END + 0x08, // Size:1 ITEM_FIELD_STACK_COUNT = 0x000E, // 1 1 20
ITEM_FIELD_DURATION = OBJECT_END + 0x09, // Size:1 ITEM_FIELD_DURATION = 0x000F, // 1 1 20
ITEM_FIELD_SPELL_CHARGES = OBJECT_END + 0x0A, // Size:5 ITEM_FIELD_SPELL_CHARGES = 0x0010, // 5 1 20
ITEM_FIELD_SPELL_CHARGES_01 = OBJECT_END + 0x0B, ITEM_FIELD_FLAGS = 0x0015, // 1 1 1
ITEM_FIELD_SPELL_CHARGES_02 = OBJECT_END + 0x0C, /*
ITEM_FIELD_SPELL_CHARGES_03 = OBJECT_END + 0x0D, There is two types of enchantments: property based and suffix based.
ITEM_FIELD_SPELL_CHARGES_04 = OBJECT_END + 0x0E, Item can have only one of the two.
ITEM_FIELD_FLAGS = OBJECT_END + 0x0F, // Size:1 Suffix based linked to item.randomproperty_2 field and property based
ITEM_FIELD_ENCHANTMENT = OBJECT_END + 0x10, // count=33 This is 21 past to item.randomproperty_1 field (item prototype).
ITEM_FIELD_SOCKETS_ENCHANTMENT = OBJECT_END + 0x25, // + (3 sockets + 1 bonus) * 3 uint32 = 12 Suffix based enchantments sent to the client as negative value, in
ITEM_FIELD_ENCHANTMENT_LAST = OBJECT_END + 0x30, addition they require ITEM_FIELD_SUFFIX_FACTOR field to be send in
ITEM_FIELD_PROPERTY_SEED = OBJECT_END + 0x31, // Size:1 order to calculate the bonus value. Property based enchantments are send
ITEM_FIELD_RANDOM_PROPERTIES_ID = OBJECT_END + 0x32, // Size:1 as positive values and do not require any aditional values since the bonuses
ITEM_FIELD_ITEM_TEXT_ID = OBJECT_END + 0x33, // Size:1 are already stored inside spellitemenchantment. Suffix based enchantments uses
ITEM_FIELD_DURABILITY = OBJECT_END + 0x34, // Size:1 6-8 fields in EnchantmentSlot while property based uses 8-10 in EnchantmentSlot.
ITEM_FIELD_MAXDURABILITY = OBJECT_END + 0x35, // Size:1 */
ITEM_END = OBJECT_END + 0x36, ITEM_FIELD_ENCHANTMENT = 0x0016, // 33 1 1
ITEM_FIELD_PROPERTY_SEED = 0x0037, // 1 1 1
ITEM_FIELD_SUFFIX_FACTOR = ITEM_FIELD_PROPERTY_SEED, //custom
ITEM_FIELD_RANDOM_PROPERTIES_ID = 0x0038, // 1 1 1
ITEM_FIELD_ITEM_TEXT_ID = 0x0039, // 1 1 4
ITEM_FIELD_DURABILITY = 0x003A, // 1 1 20
ITEM_FIELD_MAXDURABILITY = 0x003B, // 1 1 20
ITEM_END = 0x003C,
}; };
enum EContainerFields enum EContainerFields
{ {
CONTAINER_FIELD_NUM_SLOTS = ITEM_END + 0x00, // Size:1 CONTAINER_FIELD_NUM_SLOTS = 0x003C, // 1 1 1
CONTAINER_ALIGN_PAD = ITEM_END + 0x01, // Size:1 CONTAINER_ALIGN_PAD = 0x003D, // 1 5 0
CONTAINER_FIELD_SLOT_1 = ITEM_END + 0x02, // count=72 CONTAINER_FIELD_SLOT_1 = 0x003E, // 72 4 1
CONTAINER_FIELD_SLOT_LAST = ITEM_END + 0x49, CONTAINER_END = 0x0086,
CONTAINER_END = ITEM_END + 0x4A,
}; };
enum EUnitFields enum EUnitFields
{ {
UNIT_FIELD_CHARM = 0x00 + OBJECT_END, // Size:2 UNIT_FIELD_CHARM = 0x0006, // 2 4 1
UNIT_FIELD_SUMMON = 0x02 + OBJECT_END, // Size:2 UNIT_FIELD_SUMMON = 0x0008, // 2 4 1
UNIT_FIELD_CHARMEDBY = 0x04 + OBJECT_END, // Size:2 UNIT_FIELD_CHARMEDBY = 0x000A, // 2 4 1
UNIT_FIELD_SUMMONEDBY = 0x06 + OBJECT_END, // Size:2 UNIT_FIELD_SUMMONEDBY = 0x000C, // 2 4 1
UNIT_FIELD_CREATEDBY = 0x08 + OBJECT_END, // Size:2 UNIT_FIELD_CREATEDBY = 0x000E, // 2 4 1
UNIT_FIELD_TARGET = 0x0A + OBJECT_END, // Size:2 UNIT_FIELD_TARGET = 0x0010, // 2 4 1
UNIT_FIELD_PERSUADED = 0x0C + OBJECT_END, // Size:2 UNIT_FIELD_PERSUADED = 0x0012, // 2 4 1
UNIT_FIELD_CHANNEL_OBJECT = 0x0E + OBJECT_END, // Size:2 UNIT_FIELD_CHANNEL_OBJECT = 0x0014, // 2 4 1
UNIT_FIELD_HEALTH = 0x10 + OBJECT_END, // Size:1 UNIT_FIELD_HEALTH = 0x0016, // 1 1 256
UNIT_FIELD_POWER1 = 0x11 + OBJECT_END, // Size:1 UNIT_FIELD_POWER1 = 0x0017, // 1 1 1
UNIT_FIELD_POWER2 = 0x12 + OBJECT_END, // Size:1 UNIT_FIELD_POWER2 = 0x0018, // 1 1 1
UNIT_FIELD_POWER3 = 0x13 + OBJECT_END, // Size:1 UNIT_FIELD_POWER3 = 0x0019, // 1 1 1
UNIT_FIELD_POWER4 = 0x14 + OBJECT_END, // Size:1 UNIT_FIELD_POWER4 = 0x001A, // 1 1 1
UNIT_FIELD_POWER5 = 0x15 + OBJECT_END, // Size:1 UNIT_FIELD_POWER5 = 0x001B, // 1 1 1
UNIT_FIELD_MAXHEALTH = 0x16 + OBJECT_END, // Size:1 UNIT_FIELD_MAXHEALTH = 0x001C, // 1 1 256
UNIT_FIELD_MAXPOWER1 = 0x17 + OBJECT_END, // Size:1 UNIT_FIELD_MAXPOWER1 = 0x001D, // 1 1 1
UNIT_FIELD_MAXPOWER2 = 0x18 + OBJECT_END, // Size:1 UNIT_FIELD_MAXPOWER2 = 0x001E, // 1 1 1
UNIT_FIELD_MAXPOWER3 = 0x19 + OBJECT_END, // Size:1 UNIT_FIELD_MAXPOWER3 = 0x001F, // 1 1 1
UNIT_FIELD_MAXPOWER4 = 0x1A + OBJECT_END, // Size:1 UNIT_FIELD_MAXPOWER4 = 0x0020, // 1 1 1
UNIT_FIELD_MAXPOWER5 = 0x1B + OBJECT_END, // Size:1 UNIT_FIELD_MAXPOWER5 = 0x0021, // 1 1 1
UNIT_FIELD_LEVEL = 0x1C + OBJECT_END, // Size:1 UNIT_FIELD_LEVEL = 0x0022, // 1 1 1
UNIT_FIELD_FACTIONTEMPLATE = 0x1D + OBJECT_END, // Size:1 UNIT_FIELD_FACTIONTEMPLATE = 0x0023, // 1 1 1
UNIT_FIELD_BYTES_0 = 0x1E + OBJECT_END, // Size:1 UNIT_FIELD_BYTES_0 = 0x0024, // 1 5 1
UNIT_VIRTUAL_ITEM_SLOT_DISPLAY = 0x1F + OBJECT_END, // Size:3 UNIT_VIRTUAL_ITEM_SLOT_DISPLAY = 0x0025, // 3 1 1
UNIT_VIRTUAL_ITEM_SLOT_DISPLAY_01 = 0x20 + OBJECT_END, UNIT_VIRTUAL_ITEM_INFO = 0x0028, // 6 5 1
UNIT_VIRTUAL_ITEM_SLOT_DISPLAY_02 = 0x21 + OBJECT_END, UNIT_FIELD_FLAGS = 0x002E, // 1 1 1
UNIT_VIRTUAL_ITEM_INFO = 0x22 + OBJECT_END, // Size:6 UNIT_FIELD_FLAGS_2 = 0x002F, // 1 1 1
UNIT_VIRTUAL_ITEM_INFO_01 = 0x23 + OBJECT_END, UNIT_FIELD_AURA = 0x0030, // 56 1 1
UNIT_VIRTUAL_ITEM_INFO_02 = 0x24 + OBJECT_END, UNIT_FIELD_AURAFLAGS = 0x0068, // 7 5 1
UNIT_VIRTUAL_ITEM_INFO_03 = 0x25 + OBJECT_END, UNIT_FIELD_AURALEVELS = 0x006F, // 14 5 1
UNIT_VIRTUAL_ITEM_INFO_04 = 0x26 + OBJECT_END, UNIT_FIELD_AURAAPPLICATIONS = 0x007D, // 14 5 1
UNIT_VIRTUAL_ITEM_INFO_05 = 0x27 + OBJECT_END, UNIT_FIELD_AURASTATE = 0x008B, // 1 1 1
UNIT_FIELD_FLAGS = 0x28 + OBJECT_END, // Size:1 UNIT_FIELD_BASEATTACKTIME = 0x008C, // 2 1 1
UNIT_FIELD_FLAGS_2 = 0x29 + OBJECT_END, // Size:1 UNIT_FIELD_OFFHANDATTACKTIME = UNIT_FIELD_BASEATTACKTIME + 1, // custom
UNIT_FIELD_AURA = 0x2A + OBJECT_END, // Size:56 UNIT_FIELD_RANGEDATTACKTIME = 0x008E, // 1 1 2
UNIT_FIELD_AURA_LAST = 0x63 + OBJECT_END, UNIT_FIELD_BOUNDINGRADIUS = 0x008F, // 1 3 1
UNIT_FIELD_AURAFLAGS = 0x62 + OBJECT_END, // Size:7 UNIT_FIELD_COMBATREACH = 0x0090, // 1 3 1
UNIT_FIELD_AURAFLAGS_01 = 0x63 + OBJECT_END, UNIT_FIELD_DISPLAYID = 0x0091, // 1 1 1
UNIT_FIELD_AURAFLAGS_02 = 0x64 + OBJECT_END, UNIT_FIELD_NATIVEDISPLAYID = 0x0092, // 1 1 1
UNIT_FIELD_AURAFLAGS_03 = 0x65 + OBJECT_END, UNIT_FIELD_MOUNTDISPLAYID = 0x0093, // 1 1 1
UNIT_FIELD_AURAFLAGS_04 = 0x66 + OBJECT_END, UNIT_FIELD_MINDAMAGE = 0x0094, // 1 3 38
UNIT_FIELD_AURAFLAGS_05 = 0x67 + OBJECT_END, UNIT_FIELD_MAXDAMAGE = 0x0095, // 1 3 38
UNIT_FIELD_AURAFLAGS_06 = 0x68 + OBJECT_END, UNIT_FIELD_MINOFFHANDDAMAGE = 0x0096, // 1 3 38
UNIT_FIELD_AURALEVELS = 0x69 + OBJECT_END, // Size:14 UNIT_FIELD_MAXOFFHANDDAMAGE = 0x0097, // 1 3 38
UNIT_FIELD_AURALEVELS_LAST = 0x76 + OBJECT_END, UNIT_FIELD_BYTES_1 = 0x0098, // 1 5 1
UNIT_FIELD_AURAAPPLICATIONS = 0x77 + OBJECT_END, // Size:14 UNIT_FIELD_PETNUMBER = 0x0099, // 1 1 1
UNIT_FIELD_AURAAPPLICATIONS_LAST = 0x84 + OBJECT_END, UNIT_FIELD_PET_NAME_TIMESTAMP = 0x009A, // 1 1 1
UNIT_FIELD_AURASTATE = 0x85 + OBJECT_END, // Size:1 UNIT_FIELD_PETEXPERIENCE = 0x009B, // 1 1 4
UNIT_FIELD_BASEATTACKTIME = 0x86 + OBJECT_END, // Size:2 UNIT_FIELD_PETNEXTLEVELEXP = 0x009C, // 1 1 4
UNIT_FIELD_BASEATTACKTIME_01 = 0x87 + OBJECT_END, UNIT_DYNAMIC_FLAGS = 0x009D, // 1 1 256
UNIT_FIELD_OFFHANDATTACKTIME = 0x87 + OBJECT_END, // Size:2 UNIT_CHANNEL_SPELL = 0x009E, // 1 1 1
UNIT_FIELD_RANGEDATTACKTIME = 0x88 + OBJECT_END, // Size:1 UNIT_MOD_CAST_SPEED = 0x009F, // 1 3 1
UNIT_FIELD_BOUNDINGRADIUS = 0x89 + OBJECT_END, // Size:1 UNIT_CREATED_BY_SPELL = 0x00A0, // 1 1 1
UNIT_FIELD_COMBATREACH = 0x8A + OBJECT_END, // Size:1 UNIT_NPC_FLAGS = 0x00A1, // 1 1 1
UNIT_FIELD_DISPLAYID = 0x8B + OBJECT_END, // Size:1 UNIT_NPC_EMOTESTATE = 0x00A2, // 1 1 1
UNIT_FIELD_NATIVEDISPLAYID = 0x8C + OBJECT_END, // Size:1 UNIT_TRAINING_POINTS = 0x00A3, // 1 2 4
UNIT_FIELD_MOUNTDISPLAYID = 0x8D + OBJECT_END, // Size:1 UNIT_FIELD_STAT0 = 0x00A4, // 1 1 6
UNIT_FIELD_MINDAMAGE = 0x8E + OBJECT_END, // Size:1 UNIT_FIELD_STAT1 = 0x00A5, // 1 1 6
UNIT_FIELD_MAXDAMAGE = 0x8F + OBJECT_END, // Size:1 UNIT_FIELD_STAT2 = 0x00A6, // 1 1 6
UNIT_FIELD_MINOFFHANDDAMAGE = 0x90 + OBJECT_END, // Size:1 UNIT_FIELD_STAT3 = 0x00A7, // 1 1 6
UNIT_FIELD_MAXOFFHANDDAMAGE = 0x91 + OBJECT_END, // Size:1 UNIT_FIELD_STAT4 = 0x00A8, // 1 1 6
UNIT_FIELD_BYTES_1 = 0x92 + OBJECT_END, // Size:1 UNIT_FIELD_POSSTAT0 = 0x00A9, // 1 1 6
UNIT_FIELD_PETNUMBER = 0x93 + OBJECT_END, // Size:1 UNIT_FIELD_POSSTAT1 = 0x00AA, // 1 1 6
UNIT_FIELD_PET_NAME_TIMESTAMP = 0x94 + OBJECT_END, // Size:1 UNIT_FIELD_POSSTAT2 = 0x00AB, // 1 1 6
UNIT_FIELD_PETEXPERIENCE = 0x95 + OBJECT_END, // Size:1 UNIT_FIELD_POSSTAT3 = 0x00AC, // 1 1 6
UNIT_FIELD_PETNEXTLEVELEXP = 0x96 + OBJECT_END, // Size:1 UNIT_FIELD_POSSTAT4 = 0x00AD, // 1 1 6
UNIT_DYNAMIC_FLAGS = 0x97 + OBJECT_END, // Size:1 UNIT_FIELD_NEGSTAT0 = 0x00AE, // 1 1 6
UNIT_CHANNEL_SPELL = 0x98 + OBJECT_END, // Size:1 UNIT_FIELD_NEGSTAT1 = 0x00AF, // 1 1 6
UNIT_MOD_CAST_SPEED = 0x99 + OBJECT_END, // Size:1 UNIT_FIELD_NEGSTAT2 = 0x00B0, // 1 1 6
UNIT_CREATED_BY_SPELL = 0x9A + OBJECT_END, // Size:1 UNIT_FIELD_NEGSTAT3 = 0x00B1, // 1 1 6
UNIT_NPC_FLAGS = 0x9B + OBJECT_END, // Size:1 UNIT_FIELD_NEGSTAT4 = 0x00B2, // 1 1 6
UNIT_NPC_EMOTESTATE = 0x9C + OBJECT_END, // Size:1 UNIT_FIELD_RESISTANCES = 0x00B3, // 7 1 38
UNIT_TRAINING_POINTS = 0x9D + OBJECT_END, // Size:1 UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE = 0x00BA, // 7 1 6
UNIT_FIELD_STAT0 = 0x9E + OBJECT_END, // Size:1 UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE = 0x00C1, // 7 1 6
UNIT_FIELD_STAT1 = 0x9F + OBJECT_END, // Size:1 UNIT_FIELD_BASE_MANA = 0x00C8, // 1 1 6
UNIT_FIELD_STAT2 = 0xA0 + OBJECT_END, // Size:1 UNIT_FIELD_BASE_HEALTH = 0x00C9, // 1 1 6
UNIT_FIELD_STAT3 = 0xA1 + OBJECT_END, // Size:1 UNIT_FIELD_BYTES_2 = 0x00CA, // 1 5 1
UNIT_FIELD_STAT4 = 0xA2 + OBJECT_END, // Size:1 UNIT_FIELD_ATTACK_POWER = 0x00CB, // 1 1 6
UNIT_FIELD_POSSTAT0 = 0xA3 + OBJECT_END, // Size:1 UNIT_FIELD_ATTACK_POWER_MODS = 0x00CC, // 1 2 6
UNIT_FIELD_POSSTAT1 = 0xA4 + OBJECT_END, // Size:1 UNIT_FIELD_ATTACK_POWER_MULTIPLIER = 0x00CD, // 1 3 6
UNIT_FIELD_POSSTAT2 = 0xA5 + OBJECT_END, // Size:1 UNIT_FIELD_RANGED_ATTACK_POWER = 0x00CE, // 1 1 6
UNIT_FIELD_POSSTAT3 = 0xA6 + OBJECT_END, // Size:1 UNIT_FIELD_RANGED_ATTACK_POWER_MODS = 0x00CF, // 1 2 6
UNIT_FIELD_POSSTAT4 = 0xA7 + OBJECT_END, // Size:1 UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER = 0x00D0, // 1 3 6
UNIT_FIELD_NEGSTAT0 = 0xA8 + OBJECT_END, // Size:1 UNIT_FIELD_MINRANGEDDAMAGE = 0x00D1, // 1 3 6
UNIT_FIELD_NEGSTAT1 = 0xA9 + OBJECT_END, // Size:1 UNIT_FIELD_MAXRANGEDDAMAGE = 0x00D2, // 1 3 6
UNIT_FIELD_NEGSTAT2 = 0xAA + OBJECT_END, // Size:1 UNIT_FIELD_POWER_COST_MODIFIER = 0x00D3, // 7 1 6
UNIT_FIELD_NEGSTAT3 = 0xAB + OBJECT_END, // Size:1 UNIT_FIELD_POWER_COST_MULTIPLIER = 0x00DA, // 7 3 6
UNIT_FIELD_NEGSTAT4 = 0xAC + OBJECT_END, // Size:1 UNIT_FIELD_PADDING = 0x00E1, // 1 1 0
UNIT_FIELD_RESISTANCES = 0xAD + OBJECT_END, // Size:7 UNIT_END = 0x00E2,
UNIT_FIELD_RESISTANCES_01 = 0xAE + OBJECT_END,
UNIT_FIELD_RESISTANCES_02 = 0xAF + OBJECT_END,
UNIT_FIELD_RESISTANCES_03 = 0xB0 + OBJECT_END,
UNIT_FIELD_RESISTANCES_04 = 0xB1 + OBJECT_END,
UNIT_FIELD_RESISTANCES_05 = 0xB2 + OBJECT_END,
UNIT_FIELD_RESISTANCES_06 = 0xB3 + OBJECT_END,
UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE = 0xB4 + OBJECT_END, // Size:7
UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE = 0xBB + OBJECT_END, // Size:7
UNIT_FIELD_BASE_MANA = 0xC2 + OBJECT_END, // Size:1
UNIT_FIELD_BASE_HEALTH = 0xC3 + OBJECT_END, // Size:1
UNIT_FIELD_BYTES_2 = 0xC4 + OBJECT_END, // Size:1
UNIT_FIELD_ATTACK_POWER = 0xC5 + OBJECT_END, // Size:1
UNIT_FIELD_ATTACK_POWER_MODS = 0xC6 + OBJECT_END, // Size:1
UNIT_FIELD_ATTACK_POWER_MULTIPLIER = 0xC7 + OBJECT_END, // Size:1
UNIT_FIELD_RANGED_ATTACK_POWER = 0xC8 + OBJECT_END, // Size:1
UNIT_FIELD_RANGED_ATTACK_POWER_MODS = 0xC9 + OBJECT_END, // Size:1
UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER = 0xCA + OBJECT_END, // Size:1
UNIT_FIELD_MINRANGEDDAMAGE = 0xCB + OBJECT_END, // Size:1
UNIT_FIELD_MAXRANGEDDAMAGE = 0xCC + OBJECT_END, // Size:1
UNIT_FIELD_POWER_COST_MODIFIER = 0xCD + OBJECT_END, // Size:7
UNIT_FIELD_POWER_COST_MODIFIER_01 = 0xCE + OBJECT_END,
UNIT_FIELD_POWER_COST_MODIFIER_02 = 0xCF + OBJECT_END,
UNIT_FIELD_POWER_COST_MODIFIER_03 = 0xD0 + OBJECT_END,
UNIT_FIELD_POWER_COST_MODIFIER_04 = 0xD1 + OBJECT_END,
UNIT_FIELD_POWER_COST_MODIFIER_05 = 0xD2 + OBJECT_END,
UNIT_FIELD_POWER_COST_MODIFIER_06 = 0xD3 + OBJECT_END,
UNIT_FIELD_POWER_COST_MULTIPLIER = 0xD4 + OBJECT_END, // Size:7
UNIT_FIELD_POWER_COST_MULTIPLIER_01 = 0xD5 + OBJECT_END,
UNIT_FIELD_POWER_COST_MULTIPLIER_02 = 0xD6 + OBJECT_END,
UNIT_FIELD_POWER_COST_MULTIPLIER_03 = 0xD7 + OBJECT_END,
UNIT_FIELD_POWER_COST_MULTIPLIER_04 = 0xD8 + OBJECT_END,
UNIT_FIELD_POWER_COST_MULTIPLIER_05 = 0xD9 + OBJECT_END,
UNIT_FIELD_POWER_COST_MULTIPLIER_06 = 0xDA + OBJECT_END,
UNIT_FIELD_PADDING = 0xDB + OBJECT_END,
UNIT_END = 0xDC + OBJECT_END,
PLAYER_DUEL_ARBITER = 0x00 + UNIT_END, // Size:2 PLAYER_DUEL_ARBITER = 0x00E2, // 2 4 1
PLAYER_FLAGS = 0x02 + UNIT_END, // Size:1 PLAYER_FLAGS = 0x00E4, // 1 1 1
PLAYER_GUILDID = 0x03 + UNIT_END, // Size:1 PLAYER_GUILDID = 0x00E5, // 1 1 1
PLAYER_GUILDRANK = 0x04 + UNIT_END, // Size:1 PLAYER_GUILDRANK = 0x00E6, // 1 1 1
PLAYER_BYTES = 0x05 + UNIT_END, // Size:1 PLAYER_BYTES = 0x00E7, // 1 5 1
PLAYER_BYTES_2 = 0x06 + UNIT_END, // Size:1 PLAYER_BYTES_2 = 0x00E8, // 1 5 1
PLAYER_BYTES_3 = 0x07 + UNIT_END, // Size:1 PLAYER_BYTES_3 = 0x00E9, // 1 5 1
PLAYER_DUEL_TEAM = 0x08 + UNIT_END, // Size:1 PLAYER_DUEL_TEAM = 0x00EA, // 1 1 1
PLAYER_GUILD_TIMESTAMP = 0x09 + UNIT_END, // Size:1 PLAYER_GUILD_TIMESTAMP = 0x00EB, // 1 1 1
PLAYER_QUEST_LOG_1_1 = 0x0A + UNIT_END, // count = 25 PLAYER_QUEST_LOG_1_1 = 0x00EC, // 1 1 64
PLAYER_QUEST_LOG_1_2 = 0x0B + UNIT_END, PLAYER_QUEST_LOG_1_2 = 0x00ED, // 2 1 2
PLAYER_QUEST_LOG_1_3 = 0x0C + UNIT_END, PLAYER_QUEST_LOG_2_1 = 0x00EF, // 1 1 64
PLAYER_QUEST_LOG_LAST_1 = 0x52 + UNIT_END, PLAYER_QUEST_LOG_2_2 = 0x00F0, // 2 1 2
PLAYER_QUEST_LOG_LAST_2 = 0x53 + UNIT_END, PLAYER_QUEST_LOG_3_1 = 0x00F2, // 1 1 64
PLAYER_QUEST_LOG_LAST_3 = 0x54 + UNIT_END, PLAYER_QUEST_LOG_3_2 = 0x00F3, // 2 1 2
PLAYER_VISIBLE_ITEM_1_CREATOR = 0x55 + UNIT_END, // Size:2, count = 19 PLAYER_QUEST_LOG_4_1 = 0x00F5, // 1 1 64
PLAYER_VISIBLE_ITEM_1_0 = 0x57 + UNIT_END, // Size:12 PLAYER_QUEST_LOG_4_2 = 0x00F6, // 2 1 2
PLAYER_VISIBLE_ITEM_1_PROPERTIES = 0x63 + UNIT_END, // Size:1 PLAYER_QUEST_LOG_5_1 = 0x00F8, // 1 1 64
PLAYER_VISIBLE_ITEM_1_PAD = 0x64 + UNIT_END, // Size:1 PLAYER_QUEST_LOG_5_2 = 0x00F9, // 2 1 2
PLAYER_VISIBLE_ITEM_LAST_CREATOR = 0x175 + UNIT_END, PLAYER_QUEST_LOG_6_1 = 0x00FB, // 1 1 64
PLAYER_VISIBLE_ITEM_LAST_0 = 0x177 + UNIT_END, PLAYER_QUEST_LOG_6_2 = 0x00FC, // 2 1 2
PLAYER_VISIBLE_ITEM_LAST_PROPERTIES = 0x183 + UNIT_END, PLAYER_QUEST_LOG_7_1 = 0x00FE, // 1 1 64
PLAYER_VISIBLE_ITEM_LAST_PAD = 0x184 + UNIT_END, PLAYER_QUEST_LOG_7_2 = 0x00FF, // 2 1 2
PLAYER_CHOSEN_TITLE = 0x185 + UNIT_END, // Size:1 PLAYER_QUEST_LOG_8_1 = 0x0101, // 1 1 64
PLAYER_FIELD_INV_SLOT_HEAD = 0x186 + UNIT_END, // Size:46 PLAYER_QUEST_LOG_8_2 = 0x0102, // 2 1 2
PLAYER_FIELD_PACK_SLOT_1 = 0x1B4 + UNIT_END, // Size:32 PLAYER_QUEST_LOG_9_1 = 0x0104, // 1 1 64
PLAYER_FIELD_PACK_SLOT_LAST = 0x1D3 + UNIT_END, PLAYER_QUEST_LOG_9_2 = 0x0105, // 2 1 2
PLAYER_FIELD_BANK_SLOT_1 = 0x1D4 + UNIT_END, // Size:56 PLAYER_QUEST_LOG_10_1 = 0x0107, // 1 1 64
PLAYER_FIELD_BANK_SLOT_LAST = 0x20B + UNIT_END, PLAYER_QUEST_LOG_10_2 = 0x0108, // 2 1 2
PLAYER_FIELD_BANKBAG_SLOT_1 = 0x20C + UNIT_END, // Size:14 PLAYER_QUEST_LOG_11_1 = 0x010A, // 1 1 64
PLAYER_FIELD_BANKBAG_SLOT_LAST = 0x219 + UNIT_END, PLAYER_QUEST_LOG_11_2 = 0x010B, // 2 1 2
PLAYER_FIELD_VENDORBUYBACK_SLOT_1 = 0x21A + UNIT_END, // Size:24 PLAYER_QUEST_LOG_12_1 = 0x010D, // 1 1 64
PLAYER_FIELD_VENDORBUYBACK_SLOT_LAST = 0x231 + UNIT_END, PLAYER_QUEST_LOG_12_2 = 0x010E, // 2 1 2
PLAYER_FIELD_KEYRING_SLOT_1 = 0x232 + UNIT_END, // Size:64 PLAYER_QUEST_LOG_13_1 = 0x0110, // 1 1 64
PLAYER_FIELD_KEYRING_SLOT_LAST = 0x271 + UNIT_END, PLAYER_QUEST_LOG_13_2 = 0x0111, // 2 1 2
PLAYER_FARSIGHT = 0x272 + UNIT_END, // Size:2 PLAYER_QUEST_LOG_14_1 = 0x0113, // 1 1 64
PLAYER_FIELD_COMBO_TARGET = 0x274 + UNIT_END, // Size:2 PLAYER_QUEST_LOG_14_2 = 0x0114, // 2 1 2
PLAYER_FIELD_KNOWN_TITLES = 0x276 + UNIT_END, // Size:2 PLAYER_QUEST_LOG_15_1 = 0x0116, // 1 1 64
PLAYER_XP = 0x278 + UNIT_END, // Size:1 PLAYER_QUEST_LOG_15_2 = 0x0117, // 2 1 2
PLAYER_NEXT_LEVEL_XP = 0x279 + UNIT_END, // Size:1 PLAYER_QUEST_LOG_16_1 = 0x0119, // 1 1 64
PLAYER_SKILL_INFO_1_1 = 0x27A + UNIT_END, // Size:384 PLAYER_QUEST_LOG_16_2 = 0x011A, // 2 1 2
PLAYER_CHARACTER_POINTS1 = 0x3FA + UNIT_END, // Size:1 PLAYER_QUEST_LOG_17_1 = 0x011C, // 1 1 64
PLAYER_CHARACTER_POINTS2 = 0x3FB + UNIT_END, // Size:1 PLAYER_QUEST_LOG_17_2 = 0x011D, // 2 1 2
PLAYER_TRACK_CREATURES = 0x3FC + UNIT_END, // Size:1 PLAYER_QUEST_LOG_18_1 = 0x011F, // 1 1 64
PLAYER_TRACK_RESOURCES = 0x3FD + UNIT_END, // Size:1 PLAYER_QUEST_LOG_18_2 = 0x0120, // 2 1 2
PLAYER_BLOCK_PERCENTAGE = 0x3FE + UNIT_END, // Size:1 PLAYER_QUEST_LOG_19_1 = 0x0122, // 1 1 64
PLAYER_DODGE_PERCENTAGE = 0x3FF + UNIT_END, // Size:1 PLAYER_QUEST_LOG_19_2 = 0x0123, // 2 1 2
PLAYER_PARRY_PERCENTAGE = 0x400 + UNIT_END, // Size:1 PLAYER_QUEST_LOG_20_1 = 0x0125, // 1 1 64
PLAYER_CRIT_PERCENTAGE = 0x401 + UNIT_END, // Size:1 PLAYER_QUEST_LOG_20_2 = 0x0126, // 2 1 2
PLAYER_RANGED_CRIT_PERCENTAGE = 0x402 + UNIT_END, // Size:1 PLAYER_QUEST_LOG_21_1 = 0x0128, // 1 1 64
PLAYER_OFFHAND_CRIT_PERCENTAGE = 0x403 + UNIT_END, // Size:1 PLAYER_QUEST_LOG_21_2 = 0x0129, // 2 1 2
PLAYER_SPELL_CRIT_PERCENTAGE1 = 0x404 + UNIT_END, // Size:7 PLAYER_QUEST_LOG_22_1 = 0x012B, // 1 1 64
PLAYER_HOLY_SPELL_CRIT_PERCENTAGE = 0x405 + UNIT_END, // custom PLAYER_QUEST_LOG_22_2 = 0x012C, // 2 1 2
PLAYER_FIRE_SPELL_CRIT_PERCENTAGE = 0x406 + UNIT_END, // custom PLAYER_QUEST_LOG_23_1 = 0x012E, // 1 1 64
PLAYER_NATURE_SPELL_CRIT_PERCENTAGE = 0x407 + UNIT_END, // custom PLAYER_QUEST_LOG_23_2 = 0x012F, // 2 1 2
PLAYER_FROST_SPELL_CRIT_PERCENTAGE = 0x408 + UNIT_END, // custom PLAYER_QUEST_LOG_24_1 = 0x0131, // 1 1 64
PLAYER_SHADOW_SPELL_CRIT_PERCENTAGE = 0x409 + UNIT_END, // custom PLAYER_QUEST_LOG_24_2 = 0x0132, // 2 1 2
PLAYER_ARCANE_SPELL_CRIT_PERCENTAGE = 0x40A + UNIT_END, // custom PLAYER_QUEST_LOG_25_1 = 0x0134, // 1 1 64
PLAYER_EXPLORED_ZONES_1 = 0x40B + UNIT_END, // Size:64 PLAYER_QUEST_LOG_25_2 = 0x0135, // 2 1 2
PLAYER_REST_STATE_EXPERIENCE = 0x44B + UNIT_END, // Size:1 PLAYER_VISIBLE_ITEM_1_CREATOR = 0x0137, // 2 4 1
PLAYER_FIELD_COINAGE = 0x44C + UNIT_END, // Size:1 PLAYER_VISIBLE_ITEM_1_0 = 0x0139, // 12 1 1
PLAYER_FIELD_MOD_DAMAGE_DONE_POS = 0x44D + UNIT_END, // Size:7 PLAYER_VISIBLE_ITEM_1_PROPERTIES = 0x0145, // 1 2 1
PLAYER_FIELD_MOD_DAMAGE_DONE_NEG = 0x454 + UNIT_END, // Size:7 PLAYER_VISIBLE_ITEM_1_PAD = 0x0146, // 1 1 1
PLAYER_FIELD_MOD_DAMAGE_DONE_PCT = 0x45B + UNIT_END, // Size:7 PLAYER_VISIBLE_ITEM_2_CREATOR = 0x0147, // 2 4 1
PLAYER_FIELD_MOD_HEALING_DONE_POS = 0x462 + UNIT_END, // Size:1 PLAYER_VISIBLE_ITEM_2_0 = 0x0149, // 12 1 1
PLAYER_FIELD_MOD_TARGET_RESISTANCE = 0x463 + UNIT_END, // Size:1 PLAYER_VISIBLE_ITEM_2_PROPERTIES = 0x0155, // 1 2 1
PLAYER_FIELD_BYTES = 0x464 + UNIT_END, // Size:1 PLAYER_VISIBLE_ITEM_2_PAD = 0x0156, // 1 1 1
PLAYER_AMMO_ID = 0x465 + UNIT_END, // Size:1 PLAYER_VISIBLE_ITEM_3_CREATOR = 0x0157, // 2 4 1
PLAYER_SELF_RES_SPELL = 0x466 + UNIT_END, // Size:1 PLAYER_VISIBLE_ITEM_3_0 = 0x0159, // 12 1 1
PLAYER_FIELD_PVP_MEDALS = 0x467 + UNIT_END, // Size:1 PLAYER_VISIBLE_ITEM_3_PROPERTIES = 0x0165, // 1 2 1
PLAYER_FIELD_BUYBACK_PRICE_1 = 0x468 + UNIT_END, // count=12 PLAYER_VISIBLE_ITEM_3_PAD = 0x0166, // 1 1 1
PLAYER_FIELD_BUYBACK_PRICE_LAST = 0x473 + UNIT_END, PLAYER_VISIBLE_ITEM_4_CREATOR = 0x0167, // 2 4 1
PLAYER_FIELD_BUYBACK_TIMESTAMP_1 = 0x474 + UNIT_END, // count=12 PLAYER_VISIBLE_ITEM_4_0 = 0x0169, // 12 1 1
PLAYER_FIELD_BUYBACK_TIMESTAMP_LAST = 0x47A + UNIT_END, PLAYER_VISIBLE_ITEM_4_PROPERTIES = 0x0175, // 1 2 1
PLAYER_FIELD_KILLS = 0x480 + UNIT_END, // Size:1 // ((uint16)kills_today<<16) | (uint16)kills_yesterday) PLAYER_VISIBLE_ITEM_4_PAD = 0x0176, // 1 1 1
PLAYER_FIELD_HONOR_TODAY = 0x481 + UNIT_END, // Size:1 PLAYER_VISIBLE_ITEM_5_CREATOR = 0x0177, // 2 4 1
PLAYER_FIELD_HONOR_YESTERDAY = 0x482 + UNIT_END, // Size:1 PLAYER_VISIBLE_ITEM_5_0 = 0x0179, // 12 1 1
PLAYER_FIELD_KILLS_LIFETIME = 0x483 + UNIT_END, // Size:1 PLAYER_VISIBLE_ITEM_5_PROPERTIES = 0x0185, // 1 2 1
PLAYER_FIELD_BYTES2 = 0x484 + UNIT_END, // Size:1 PLAYER_VISIBLE_ITEM_5_PAD = 0x0186, // 1 1 1
PLAYER_FIELD_WATCHED_FACTION_INDEX = 0x485 + UNIT_END, // Size:1 PLAYER_VISIBLE_ITEM_6_CREATOR = 0x0187, // 2 4 1
PLAYER_FIELD_COMBAT_RATING_1 = 0x486 + UNIT_END, // Size:23 PLAYER_VISIBLE_ITEM_6_0 = 0x0189, // 12 1 1
PLAYER_FIELD_ALL_WEAPONS_SKILL_RATING = 0x486 + UNIT_END, // custom PLAYER_VISIBLE_ITEM_6_PROPERTIES = 0x0195, // 1 2 1
PLAYER_FIELD_DEFENCE_RATING = 0x487 + UNIT_END, // custom PLAYER_VISIBLE_ITEM_6_PAD = 0x0196, // 1 1 1
PLAYER_FIELD_DODGE_RATING = 0x488 + UNIT_END, // custom PLAYER_VISIBLE_ITEM_7_CREATOR = 0x0197, // 2 4 1
PLAYER_FIELD_PARRY_RATING = 0x489 + UNIT_END, // custom PLAYER_VISIBLE_ITEM_7_0 = 0x0199, // 12 1 1
PLAYER_FIELD_BLOCK_RATING = 0x48A + UNIT_END, // custom PLAYER_VISIBLE_ITEM_7_PROPERTIES = 0x01A5, // 1 2 1
PLAYER_FIELD_MELEE_HIT_RATING = 0x48B + UNIT_END, // custom PLAYER_VISIBLE_ITEM_7_PAD = 0x01A6, // 1 1 1
PLAYER_FIELD_RANGED_HIT_RATING = 0x48C + UNIT_END, // custom PLAYER_VISIBLE_ITEM_8_CREATOR = 0x01A7, // 2 4 1
PLAYER_FIELD_SPELL_HIT_RATING = 0x48D + UNIT_END, // custom PLAYER_VISIBLE_ITEM_8_0 = 0x01A9, // 12 1 1
PLAYER_FIELD_MELEE_CRIT_RATING = 0x48E + UNIT_END, // custom PLAYER_VISIBLE_ITEM_8_PROPERTIES = 0x01B5, // 1 2 1
PLAYER_FIELD_RANGED_CRIT_RATING = 0x48F + UNIT_END, // custom PLAYER_VISIBLE_ITEM_8_PAD = 0x01B6, // 1 1 1
PLAYER_FIELD_SPELL_CRIT_RATING = 0x490 + UNIT_END, // custom PLAYER_VISIBLE_ITEM_9_CREATOR = 0x01B7, // 2 4 1
PLAYER_FIELD_HIT_RATING = 0x491 + UNIT_END, // unsure, was PLAYER_FIELD_UNK1_RATING PLAYER_VISIBLE_ITEM_9_0 = 0x01B9, // 12 1 1
PLAYER_FIELD_CRIT_RATING = 0x492 + UNIT_END, // unsure, was PLAYER_FIELD_UNK2_RATING PLAYER_VISIBLE_ITEM_9_PROPERTIES = 0x01C5, // 1 2 1
PLAYER_FIELD_UNK3_RATING = 0x493 + UNIT_END, // custom PLAYER_VISIBLE_ITEM_9_PAD = 0x01C6, // 1 1 1
PLAYER_FIELD_UNK4_RATING = 0x494 + UNIT_END, // custom PLAYER_VISIBLE_ITEM_10_CREATOR = 0x01C7, // 2 4 1
PLAYER_FIELD_UNK5_RATING = 0x495 + UNIT_END, // custom PLAYER_VISIBLE_ITEM_10_0 = 0x01C9, // 12 1 1
PLAYER_FIELD_RESILIENCE_RATING = 0x496 + UNIT_END, // custom PLAYER_VISIBLE_ITEM_10_PROPERTIES = 0x01D5, // 1 2 1
PLAYER_FIELD_MELEE_HASTE_RATING = 0x497 + UNIT_END, // custom PLAYER_VISIBLE_ITEM_10_PAD = 0x01D6, // 1 1 1
PLAYER_FIELD_RANGED_HASTE_RATING = 0x498 + UNIT_END, // custom PLAYER_VISIBLE_ITEM_11_CREATOR = 0x01D7, // 2 4 1
PLAYER_FIELD_UNK6_RATING = 0x499 + UNIT_END, // custom PLAYER_VISIBLE_ITEM_11_0 = 0x01D9, // 12 1 1
PLAYER_FIELD_MELEE_WEAPON_SKILL_RATING = 0x49A + UNIT_END, // custom PLAYER_VISIBLE_ITEM_11_PROPERTIES = 0x01E5, // 1 2 1
PLAYER_FIELD_UNK7_RATING = 0x49B + UNIT_END, // custom PLAYER_VISIBLE_ITEM_11_PAD = 0x01E6, // 1 1 1
PLAYER_FIELD_RANGED_WEAPON_SKILL_RATING = 0x49C + UNIT_END, // custom PLAYER_VISIBLE_ITEM_12_CREATOR = 0x01E7, // 2 4 1
PLAYER_FIELD_ARENA_TEAM_INFO_1_1 = 0x49D + UNIT_END, // Size:9 PLAYER_VISIBLE_ITEM_12_0 = 0x01E9, // 12 1 1
PLAYER_FIELD_HONOR_CURRENCY = 0x4A6 + UNIT_END, // Size:1 PLAYER_VISIBLE_ITEM_12_PROPERTIES = 0x01F5, // 1 2 1
PLAYER_FIELD_ARENA_CURRENCY = 0x4A7 + UNIT_END, // Size:1 PLAYER_VISIBLE_ITEM_12_PAD = 0x01F6, // 1 1 1
PLAYER_FIELD_MOD_MANA_REGEN = 0x4A8 + UNIT_END, // Size:1 PLAYER_VISIBLE_ITEM_13_CREATOR = 0x01F7, // 2 4 1
PLAYER_FIELD_MOD_MANA_REGEN_INTERRUPT = 0x4A9 + UNIT_END, // Size:1 PLAYER_VISIBLE_ITEM_13_0 = 0x01F9, // 12 1 1
PLAYER_FIELD_MAX_LEVEL = 0x4AA + UNIT_END, // Size:1 PLAYER_VISIBLE_ITEM_13_PROPERTIES = 0x0205, // 1 2 1
PLAYER_FIELD_PADDING = 0x4AB + UNIT_END, // Size:1 PLAYER_VISIBLE_ITEM_13_PAD = 0x0206, // 1 1 1
PLAYER_END = 0x4AC + UNIT_END, PLAYER_VISIBLE_ITEM_14_CREATOR = 0x0207, // 2 4 1
PLAYER_VISIBLE_ITEM_14_0 = 0x0209, // 12 1 1
PLAYER_VISIBLE_ITEM_14_PROPERTIES = 0x0215, // 1 2 1
PLAYER_VISIBLE_ITEM_14_PAD = 0x0216, // 1 1 1
PLAYER_VISIBLE_ITEM_15_CREATOR = 0x0217, // 2 4 1
PLAYER_VISIBLE_ITEM_15_0 = 0x0219, // 12 1 1
PLAYER_VISIBLE_ITEM_15_PROPERTIES = 0x0225, // 1 2 1
PLAYER_VISIBLE_ITEM_15_PAD = 0x0226, // 1 1 1
PLAYER_VISIBLE_ITEM_16_CREATOR = 0x0227, // 2 4 1
PLAYER_VISIBLE_ITEM_16_0 = 0x0229, // 12 1 1
PLAYER_VISIBLE_ITEM_16_PROPERTIES = 0x0235, // 1 2 1
PLAYER_VISIBLE_ITEM_16_PAD = 0x0236, // 1 1 1
PLAYER_VISIBLE_ITEM_17_CREATOR = 0x0237, // 2 4 1
PLAYER_VISIBLE_ITEM_17_0 = 0x0239, // 12 1 1
PLAYER_VISIBLE_ITEM_17_PROPERTIES = 0x0245, // 1 2 1
PLAYER_VISIBLE_ITEM_17_PAD = 0x0246, // 1 1 1
PLAYER_VISIBLE_ITEM_18_CREATOR = 0x0247, // 2 4 1
PLAYER_VISIBLE_ITEM_18_0 = 0x0249, // 12 1 1
PLAYER_VISIBLE_ITEM_18_PROPERTIES = 0x0255, // 1 2 1
PLAYER_VISIBLE_ITEM_18_PAD = 0x0256, // 1 1 1
PLAYER_VISIBLE_ITEM_19_CREATOR = 0x0257, // 2 4 1
PLAYER_VISIBLE_ITEM_19_0 = 0x0259, // 12 1 1
PLAYER_VISIBLE_ITEM_19_PROPERTIES = 0x0265, // 1 2 1
PLAYER_VISIBLE_ITEM_19_PAD = 0x0266, // 1 1 1
PLAYER_CHOSEN_TITLE = 0x0267, // 1 1 1
PLAYER_FIELD_INV_SLOT_HEAD = 0x0268, // 46 4 2
PLAYER_FIELD_PACK_SLOT_1 = 0x0296, // 32 4 2
PLAYER_FIELD_BANK_SLOT_1 = 0x02B6, // 56 4 2
PLAYER_FIELD_BANKBAG_SLOT_1 = 0x02EE, // 14 4 2
PLAYER_FIELD_VENDORBUYBACK_SLOT_1 = 0x02FC, // 24 4 2
PLAYER_FIELD_KEYRING_SLOT_1 = 0x0314, // 64 4 2
PLAYER_FARSIGHT = 0x0354, // 2 4 2
PLAYER__FIELD_KNOWN_TITLES = 0x0356, // 2 4 2
PLAYER_XP = 0x0358, // 1 1 2
PLAYER_NEXT_LEVEL_XP = 0x0359, // 1 1 2
PLAYER_SKILL_INFO_1_1 = 0x035A, // 384 2 2
PLAYER_CHARACTER_POINTS1 = 0x04DA, // 1 1 2
PLAYER_CHARACTER_POINTS2 = 0x04DB, // 1 1 2
PLAYER_TRACK_CREATURES = 0x04DC, // 1 1 2
PLAYER_TRACK_RESOURCES = 0x04DD, // 1 1 2
PLAYER_BLOCK_PERCENTAGE = 0x04DE, // 1 3 2
PLAYER_DODGE_PERCENTAGE = 0x04DF, // 1 3 2
PLAYER_PARRY_PERCENTAGE = 0x04E0, // 1 3 2
PLAYER_CRIT_PERCENTAGE = 0x04E1, // 1 3 2
PLAYER_RANGED_CRIT_PERCENTAGE = 0x04E2, // 1 3 2
PLAYER_OFFHAND_CRIT_PERCENTAGE = 0x04E3, // 1 3 2
PLAYER_SPELL_CRIT_PERCENTAGE1 = 0x04E4, // 7 3 2
// custom
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_EXPLORED_ZONES_1 = 0x04EB, // 64 5 2
PLAYER_REST_STATE_EXPERIENCE = 0x052B, // 1 1 2
PLAYER_FIELD_COINAGE = 0x052C, // 1 1 2
PLAYER_FIELD_MOD_DAMAGE_DONE_POS = 0x052D, // 7 1 2
PLAYER_FIELD_MOD_DAMAGE_DONE_NEG = 0x0534, // 7 1 2
PLAYER_FIELD_MOD_DAMAGE_DONE_PCT = 0x053B, // 7 1 2
PLAYER_FIELD_MOD_HEALING_DONE_POS = 0x0542, // 1 1 2
PLAYER_FIELD_MOD_TARGET_RESISTANCE = 0x0543, // 1 1 2
PLAYER_FIELD_BYTES = 0x0544, // 1 5 2
PLAYER_AMMO_ID = 0x0545, // 1 1 2
PLAYER_SELF_RES_SPELL = 0x0546, // 1 1 2
PLAYER_FIELD_PVP_MEDALS = 0x0547, // 1 1 2
PLAYER_FIELD_BUYBACK_PRICE_1 = 0x0548, // 12 1 2
PLAYER_FIELD_BUYBACK_TIMESTAMP_1 = 0x0554, // 12 1 2
PLAYER_FIELD_KILLS = 0x0560, // 1 2 2
PLAYER_FIELD_TODAY_CONTRIBUTION = 0x0561, // 1 1 2
PLAYER_FIELD_YESTERDAY_CONTRIBUTION = 0x0562, // 1 1 2
PLAYER_FIELD_LIFETIME_HONORBALE_KILLS = 0x0563, // 1 1 2
PLAYER_FIELD_BYTES2 = 0x0564, // 1 5 2
PLAYER_FIELD_WATCHED_FACTION_INDEX = 0x0565, // 1 1 2
PLAYER_FIELD_COMBAT_RATING_1 = 0x0566, // 23 1 2
// custom
PLAYER_FIELD_ALL_WEAPONS_SKILL_RATING = PLAYER_FIELD_COMBAT_RATING_1,
PLAYER_FIELD_DEFENCE_RATING = PLAYER_FIELD_COMBAT_RATING_1+1,
PLAYER_FIELD_DODGE_RATING = PLAYER_FIELD_COMBAT_RATING_1+2,
PLAYER_FIELD_PARRY_RATING = PLAYER_FIELD_COMBAT_RATING_1+3,
PLAYER_FIELD_BLOCK_RATING = PLAYER_FIELD_COMBAT_RATING_1+4,
PLAYER_FIELD_MELEE_HIT_RATING = PLAYER_FIELD_COMBAT_RATING_1+5,
PLAYER_FIELD_RANGED_HIT_RATING = PLAYER_FIELD_COMBAT_RATING_1+6,
PLAYER_FIELD_SPELL_HIT_RATING = PLAYER_FIELD_COMBAT_RATING_1+7,
PLAYER_FIELD_MELEE_CRIT_RATING = PLAYER_FIELD_COMBAT_RATING_1+8,
PLAYER_FIELD_RANGED_CRIT_RATING = PLAYER_FIELD_COMBAT_RATING_1+9,
PLAYER_FIELD_SPELL_CRIT_RATING = PLAYER_FIELD_COMBAT_RATING_1+10,
PLAYER_FIELD_HIT_RATING = PLAYER_FIELD_COMBAT_RATING_1+11, // unsure, was PLAYER_FIELD_UNK1_RATING
PLAYER_FIELD_CRIT_RATING = PLAYER_FIELD_COMBAT_RATING_1+12, // unsure, was PLAYER_FIELD_UNK2_RATING
PLAYER_FIELD_UNK3_RATING = PLAYER_FIELD_COMBAT_RATING_1+13,
PLAYER_FIELD_UNK4_RATING = PLAYER_FIELD_COMBAT_RATING_1+14,
PLAYER_FIELD_UNK5_RATING = PLAYER_FIELD_COMBAT_RATING_1+15,
PLAYER_FIELD_RESILIENCE_RATING = PLAYER_FIELD_COMBAT_RATING_1+16,
PLAYER_FIELD_MELEE_HASTE_RATING = PLAYER_FIELD_COMBAT_RATING_1+17,
PLAYER_FIELD_RANGED_HASTE_RATING = PLAYER_FIELD_COMBAT_RATING_1+19,
PLAYER_FIELD_SPELL_HASTE_RATING = PLAYER_FIELD_COMBAT_RATING_1+20,
PLAYER_FIELD_MELEE_WEAPON_SKILL_RATING = PLAYER_FIELD_COMBAT_RATING_1+21,
PLAYER_FIELD_OFFHAND_WEAPON_SKILL_RATING = PLAYER_FIELD_COMBAT_RATING_1+22,
PLAYER_FIELD_RANGED_WEAPON_SKILL_RATING = PLAYER_FIELD_COMBAT_RATING_1+23,
PLAYER_FIELD_ARENA_TEAM_INFO_1_1 = 0x057D, // 15 1 2
// custom
PLAYER_FIELD_ARENA_TEAM_ID_2v2 = PLAYER_FIELD_ARENA_TEAM_INFO_1_1,
PLAYER_FIELD_ARENA_TEAM_ID_3v3 = PLAYER_FIELD_ARENA_TEAM_INFO_1_1+5,
PLAYER_FIELD_ARENA_TEAM_ID_5v5 = PLAYER_FIELD_ARENA_TEAM_INFO_1_1+10,
PLAYER_FIELD_HONOR_CURRENCY = 0x058C, // 1 1 2
PLAYER_FIELD_ARENA_CURRENCY = 0x058D, // 1 1 2
PLAYER_FIELD_MOD_MANA_REGEN = 0x058E, // 1 3 2
PLAYER_FIELD_MOD_MANA_REGEN_INTERRUPT = 0x058F, // 1 3 2
PLAYER_FIELD_MAX_LEVEL = 0x0590, // 1 1 2
PLAYER_FIELD_DAILY_QUESTS_1 = 0x0591, // 10 1 2
PLAYER_FIELD_PADDING = 0x059B, // 1 1 0
PLAYER_END = 0x059C,
}; };
enum EGameObjectFields enum EGameObjectFields
{ {
OBJECT_FIELD_CREATED_BY = OBJECT_END + 0x00, OBJECT_FIELD_CREATED_BY = 0x0006, // 2 4 1
GAMEOBJECT_DISPLAYID = OBJECT_END + 0x02, GAMEOBJECT_DISPLAYID = 0x0008, // 1 1 1
GAMEOBJECT_FLAGS = OBJECT_END + 0x03, GAMEOBJECT_FLAGS = 0x0009, // 1 1 1
GAMEOBJECT_ROTATION = OBJECT_END + 0x04, GAMEOBJECT_ROTATION = 0x000A, // 4 3 1
GAMEOBJECT_STATE = OBJECT_END + 0x08, GAMEOBJECT_STATE = 0x000E, // 1 1 1
GAMEOBJECT_POS_X = OBJECT_END + 0x09, GAMEOBJECT_POS_X = 0x000F, // 1 3 1
GAMEOBJECT_POS_Y = OBJECT_END + 0x0A, GAMEOBJECT_POS_Y = 0x0010, // 1 3 1
GAMEOBJECT_POS_Z = OBJECT_END + 0x0B, GAMEOBJECT_POS_Z = 0x0011, // 1 3 1
GAMEOBJECT_FACING = OBJECT_END + 0x0C, GAMEOBJECT_FACING = 0x0012, // 1 3 1
GAMEOBJECT_DYN_FLAGS = OBJECT_END + 0x0D, GAMEOBJECT_DYN_FLAGS = 0x0013, // 1 1 256
GAMEOBJECT_FACTION = OBJECT_END + 0x0E, GAMEOBJECT_FACTION = 0x0014, // 1 1 1
GAMEOBJECT_TYPE_ID = OBJECT_END + 0x0F, GAMEOBJECT_TYPE_ID = 0x0015, // 1 1 1
GAMEOBJECT_LEVEL = OBJECT_END + 0x10, GAMEOBJECT_LEVEL = 0x0016, // 1 1 1
GAMEOBJECT_ARTKIT = OBJECT_END + 0x11, GAMEOBJECT_ARTKIT = 0x0017, // 1 1 1
GAMEOBJECT_ANIMPROGRESS = OBJECT_END + 0x12, GAMEOBJECT_ANIMPROGRESS = 0x0018, // 1 1 256
GAMEOBJECT_PADDING = OBJECT_END + 0x13, GAMEOBJECT_PADDING = 0x0019, // 1 1 0
GAMEOBJECT_END = OBJECT_END + 0x14, GAMEOBJECT_END = 0x001A,
}; };
enum EDynamicObjectFields enum EDynamicObjectFields
{ {
DYNAMICOBJECT_CASTER = OBJECT_END + 0x00, DYNAMICOBJECT_CASTER = 0x0006, // 2 4 1
DYNAMICOBJECT_BYTES = OBJECT_END + 0x02, DYNAMICOBJECT_BYTES = 0x0008, // 1 5 1
DYNAMICOBJECT_SPELLID = OBJECT_END + 0x03, DYNAMICOBJECT_SPELLID = 0x0009, // 1 1 1
DYNAMICOBJECT_RADIUS = OBJECT_END + 0x04, DYNAMICOBJECT_RADIUS = 0x000A, // 1 3 1
DYNAMICOBJECT_POS_X = OBJECT_END + 0x05, DYNAMICOBJECT_POS_X = 0x000B, // 1 3 1
DYNAMICOBJECT_POS_Y = OBJECT_END + 0x06, DYNAMICOBJECT_POS_Y = 0x000C, // 1 3 1
DYNAMICOBJECT_POS_Z = OBJECT_END + 0x07, DYNAMICOBJECT_POS_Z = 0x000D, // 1 3 1
DYNAMICOBJECT_FACING = OBJECT_END + 0x08, DYNAMICOBJECT_FACING = 0x000E, // 1 3 1
DYNAMICOBJECT_PAD = OBJECT_END + 0x09, DYNAMICOBJECT_PAD = 0x000F, // 1 5 1
DYNAMICOBJECT_END = OBJECT_END + 0x0A, DYNAMICOBJECT_END = 0x0010,
}; };
enum ECorpseFields enum ECorpseFields
{ {
CORPSE_FIELD_OWNER = OBJECT_END + 0x00, CORPSE_FIELD_OWNER = 0x0006, // 2 4 1
CORPSE_FIELD_FACING = OBJECT_END + 0x02, CORPSE_FIELD_FACING = 0x0008, // 1 3 1
CORPSE_FIELD_POS_X = OBJECT_END + 0x03, CORPSE_FIELD_POS_X = 0x0009, // 1 3 1
CORPSE_FIELD_POS_Y = OBJECT_END + 0x04, CORPSE_FIELD_POS_Y = 0x000A, // 1 3 1
CORPSE_FIELD_POS_Z = OBJECT_END + 0x05, CORPSE_FIELD_POS_Z = 0x000B, // 1 3 1
CORPSE_FIELD_DISPLAY_ID = OBJECT_END + 0x06, CORPSE_FIELD_DISPLAY_ID = 0x000C, // 1 1 1
CORPSE_FIELD_ITEM = OBJECT_END + 0x07, // 19 CORPSE_FIELD_ITEM = 0x000D, // 19 1 1
CORPSE_FIELD_BYTES_1 = OBJECT_END + 0x1A, CORPSE_FIELD_BYTES_1 = 0x0020, // 1 5 1
CORPSE_FIELD_BYTES_2 = OBJECT_END + 0x1B, CORPSE_FIELD_BYTES_2 = 0x0021, // 1 5 1
CORPSE_FIELD_GUILD = OBJECT_END + 0x1C, CORPSE_FIELD_GUILD = 0x0022, // 1 1 1
CORPSE_FIELD_FLAGS = OBJECT_END + 0x1D, CORPSE_FIELD_FLAGS = 0x0023, // 1 1 1
CORPSE_FIELD_DYNAMIC_FLAGS = OBJECT_END + 0x1E, CORPSE_FIELD_DYNAMIC_FLAGS = 0x0024, // 1 1 256
CORPSE_FIELD_PAD = OBJECT_END + 0x1F, CORPSE_FIELD_PAD = 0x0025, // 1 1 0
CORPSE_END = OBJECT_END + 0x20, CORPSE_END = 0x0026,
}; };
#endif #endif

View File

@ -203,21 +203,22 @@ OpcodeHandler *WorldSession::_GetOpcodeHandlerTable() const
{MSG_MOVE_STOP_SWIM, &WorldSession::_HandleMovementOpcode}, {MSG_MOVE_STOP_SWIM, &WorldSession::_HandleMovementOpcode},
{MSG_MOVE_HEARTBEAT, &WorldSession::_HandleMovementOpcode}, {MSG_MOVE_HEARTBEAT, &WorldSession::_HandleMovementOpcode},
{MSG_MOVE_FALL_LAND, &WorldSession::_HandleMovementOpcode}, {MSG_MOVE_FALL_LAND, &WorldSession::_HandleMovementOpcode},
{MSG_MOVE_TELEPORT_ACK, &WorldSession::_HandleTelePortAckOpcode},
{MSG_MOVE_TELEPORT_ACK, &WorldSession::_HandleTelePortAckOpcode},
{SMSG_COMPRESSED_UPDATE_OBJECT, &WorldSession::_HandleCompressedUpdateObjectOpcode}, {SMSG_COMPRESSED_UPDATE_OBJECT, &WorldSession::_HandleCompressedUpdateObjectOpcode},
{SMSG_UPDATE_OBJECT, &WorldSession::_HandleUpdateObjectOpcode}, {SMSG_UPDATE_OBJECT, &WorldSession::_HandleUpdateObjectOpcode},
{SMSG_CAST_RESULT, &WorldSession::_HandleCastResultOpcode}, {SMSG_CAST_RESULT, &WorldSession::_HandleCastResultOpcode},
{SMSG_ITEM_QUERY_SINGLE_RESPONSE, &WorldSession::_HandleItemQuerySingleResponseOpcode}, {SMSG_ITEM_QUERY_SINGLE_RESPONSE, &WorldSession::_HandleItemQuerySingleResponseOpcode},
{SMSG_DESTROY_OBJECT, &WorldSession::_HandleDestroyObjectOpcode}, {SMSG_DESTROY_OBJECT, &WorldSession::_HandleDestroyObjectOpcode},
{SMSG_INITIAL_SPELLS, &WorldSession::_HandleInitialSpellsOpcode}, {SMSG_INITIAL_SPELLS, &WorldSession::_HandleInitialSpellsOpcode},
{SMSG_LEARNED_SPELL, &WorldSession::_HandleLearnedSpellOpcode}, {SMSG_LEARNED_SPELL, &WorldSession::_HandleLearnedSpellOpcode},
{SMSG_REMOVED_SPELL, &WorldSession::_HandleLearnedSpellOpcode}, {SMSG_REMOVED_SPELL, &WorldSession::_HandleLearnedSpellOpcode},
{SMSG_CHANNEL_LIST, &WorldSession::_HandleChannelListOpcode}, {SMSG_CHANNEL_LIST, &WorldSession::_HandleChannelListOpcode},
{SMSG_EMOTE, &WorldSession::_HandleEmoteOpcode}, {SMSG_EMOTE, &WorldSession::_HandleEmoteOpcode},
{SMSG_TEXT_EMOTE, &WorldSession::_HandleTextEmoteOpcode}, {SMSG_TEXT_EMOTE, &WorldSession::_HandleTextEmoteOpcode},
{SMSG_NEW_WORLD, &WorldSession::_HandleNewWorldOpcode}, {SMSG_NEW_WORLD, &WorldSession::_HandleNewWorldOpcode},
{SMSG_LOGIN_VERIFY_WORLD, &WorldSession::_HandleLoginVerifyWorldOpcode}, {SMSG_LOGIN_VERIFY_WORLD, &WorldSession::_HandleLoginVerifyWorldOpcode},
{SMSG_MOTD, &WorldSession::_HandleMotdOpcode},
{SMSG_NOTIFICATION, &WorldSession::_HandleNotificationOpcode},
// table termination // table termination
{ 0, NULL } { 0, NULL }
@ -434,30 +435,31 @@ void WorldSession::_HandleMessageChatOpcode(WorldPacket& recvPacket)
{ {
uint8 type=0; uint8 type=0;
uint32 lang=0; uint32 lang=0;
uint64 source_guid=0;
uint64 target_guid=0; uint64 target_guid=0;
uint32 msglen=0; uint32 msglen=0;
uint32 unk=0;
std::string msg,channel=""; std::string msg,channel="";
bool isCmd=false; bool isCmd=false;
recvPacket >> type >> lang; recvPacket >> type >> lang;
recvPacket >> source_guid >> unk; // added in 2.1.0
if (type == CHAT_MSG_CHANNEL)
{
recvPacket >> channel; // extract channel name
}
recvPacket >> target_guid >> msglen >> msg;
std::string langname = GetDBMgr().GetLangName(lang); std::string langname = GetDBMgr().GetLangName(lang);
const char* ln = langname.c_str(); const char* ln = langname.c_str();
if (type == CHAT_MSG_CHANNEL)
{
recvPacket >> channel; // extract channel name
}
recvPacket >> target_guid;
std::string plrname; std::string plrname;
if(target_guid) if(source_guid)
{ {
plrname=plrNameCache.GetName(target_guid); plrname=plrNameCache.GetName(source_guid);
if(plrname.empty()) if(plrname.empty())
{ {
SendQueryPlayerName(target_guid); SendQueryPlayerName(source_guid);
plrname="Unknown Entity"; plrname="Unknown Entity";
} }
} }
@ -465,10 +467,9 @@ void WorldSession::_HandleMessageChatOpcode(WorldPacket& recvPacket)
GetInstance()->GetScripts()->variables.Set("@thismsg",toString(target_guid)); GetInstance()->GetScripts()->variables.Set("@thismsg",toString(target_guid));
if(type == CHAT_MSG_SAY || type == CHAT_MSG_YELL || type == CHAT_MSG_PARTY) DEBUG(logdebug("Chat packet recieved, type=%u lang=%u src="I64FMT" dst="I64FMT" chn='%s' len=%u",
recvPacket >> target_guid; type,lang,source_guid,target_guid,channel.c_str(),msglen));
recvPacket >> msglen >> msg;
if (type == CHAT_MSG_SYSTEM) if (type == CHAT_MSG_SYSTEM)
{ {
logcustom(0,WHITE,"SYSMSG: \"%s\"",msg.c_str()); logcustom(0,WHITE,"SYSMSG: \"%s\"",msg.c_str());
@ -584,8 +585,27 @@ void WorldSession::_HandleMessageChatOpcode(WorldPacket& recvPacket)
} }
} }
} }
} }
void WorldSession::_HandleMotdOpcode(WorldPacket& recvPacket)
{
uint32 lines;
std::string line;
recvPacket >> lines;
for(uint32 i = 0; i < lines; i++)
{
recvPacket >> line;
logcustom(0,YELLOW,"MOTD: %s",line.c_str());
}
}
void WorldSession::_HandleNotificationOpcode(WorldPacket& recvPacket)
{
std::string text;
recvPacket >> text;
logcustom(0,YELLOW,"NOTIFY: %s",text.c_str());
}
void WorldSession::_HandleNameQueryResponseOpcode(WorldPacket& recvPacket) void WorldSession::_HandleNameQueryResponseOpcode(WorldPacket& recvPacket)
{ {
uint64 pguid; uint64 pguid;
@ -887,3 +907,4 @@ void WorldSession::_HandleLoginVerifyWorldOpcode(WorldPacket& recvPacket)
// TODO: delete world on LogoutComplete once implemented // TODO: delete world on LogoutComplete once implemented

View File

@ -91,6 +91,8 @@ private:
void _HandleTextEmoteOpcode(WorldPacket& recvPacket); void _HandleTextEmoteOpcode(WorldPacket& recvPacket);
void _HandleNewWorldOpcode(WorldPacket& recvPacket); void _HandleNewWorldOpcode(WorldPacket& recvPacket);
void _HandleLoginVerifyWorldOpcode(WorldPacket& recvPacket); void _HandleLoginVerifyWorldOpcode(WorldPacket& recvPacket);
void _HandleMotdOpcode(WorldPacket& recvPacket);
void _HandleNotificationOpcode(WorldPacket& recvPacket);
void _MovementUpdate(uint8 objtypeid, uint64 guid, WorldPacket& recvPacket); // Helper for _HandleUpdateObjectOpcode void _MovementUpdate(uint8 objtypeid, uint64 guid, WorldPacket& recvPacket); // Helper for _HandleUpdateObjectOpcode
void _ValuesUpdate(uint64 uguid, WorldPacket& recvPacket); // ... void _ValuesUpdate(uint64 uguid, WorldPacket& recvPacket); // ...