diff --git a/src/Client/World/Bag.cpp b/src/Client/World/Bag.cpp index a3b94cc..ce712b2 100644 --- a/src/Client/World/Bag.cpp +++ b/src/Client/World/Bag.cpp @@ -2,13 +2,13 @@ Bag::Bag() : Item() { - _type |= TYPE_CONTAINER; - _typeid = TYPEID_CONTAINER; - _valuescount = CONTAINER_END; - _slot = 0; -} - -void Bag::Create(uint64 guid) -{ - Item::Create(guid); -} + _type |= TYPE_CONTAINER; + _typeid = TYPEID_CONTAINER; + _valuescount = Object::maxvalues[_typeid]; + _slot = 0; +} + +void Bag::Create(uint64 guid) +{ + Item::Create(guid); +} diff --git a/src/Client/World/Corpse.cpp b/src/Client/World/Corpse.cpp index e89ca86..d8145f8 100644 --- a/src/Client/World/Corpse.cpp +++ b/src/Client/World/Corpse.cpp @@ -4,10 +4,10 @@ Corpse::Corpse() { _type=TYPE_CORPSE; _typeid=TYPEID_CORPSE; - _valuescount=CORPSE_END; + _valuescount=Object::maxvalues[_typeid]; } void Corpse::Create(uint64 guid) { Object::Create(guid); -} +} diff --git a/src/Client/World/DynamicObject.cpp b/src/Client/World/DynamicObject.cpp index 5a77498..0d63bf7 100644 --- a/src/Client/World/DynamicObject.cpp +++ b/src/Client/World/DynamicObject.cpp @@ -5,10 +5,10 @@ DynamicObject::DynamicObject() : WorldObject() _uint32values=NULL; _type=TYPE_DYNAMICOBJECT; _typeid=TYPEID_DYNAMICOBJECT; - _valuescount=DYNAMICOBJECT_END; + _valuescount=Object::maxvalues[_typeid]; } void DynamicObject::Create(uint64 guid) { Object::Create(guid); -} +} diff --git a/src/Client/World/GameObject.cpp b/src/Client/World/GameObject.cpp index 7274d46..2272438 100644 --- a/src/Client/World/GameObject.cpp +++ b/src/Client/World/GameObject.cpp @@ -5,7 +5,7 @@ GameObject::GameObject() : WorldObject() _uint32values=NULL; _type|=TYPE_GAMEOBJECT; _typeid=TYPEID_GAMEOBJECT; - _valuescount=GAMEOBJECT_END; + _valuescount=Object::maxvalues[_typeid]; } void GameObject::Create(uint64 guid) diff --git a/src/Client/World/Item.cpp b/src/Client/World/Item.cpp index d25d867..b69d302 100644 --- a/src/Client/World/Item.cpp +++ b/src/Client/World/Item.cpp @@ -134,7 +134,7 @@ Item::Item() _type |= TYPE_ITEM; _typeid = TYPEID_ITEM; - _valuescount = ITEM_END; + _valuescount = Object::maxvalues[_typeid]; _slot = 0; //_bag = NULL; // not yet implemented } diff --git a/src/Client/World/Object.cpp b/src/Client/World/Object.cpp index e765db7..a32af02 100644 --- a/src/Client/World/Object.cpp +++ b/src/Client/World/Object.cpp @@ -9,7 +9,7 @@ Object::Object() _uint32values=NULL; _type=TYPE_OBJECT; _typeid=TYPEID_OBJECT; - _valuescount=OBJECT_END; // base class. this value will be set by derived classes + _valuescount=Object::maxvalues[_typeid]; // base class. this value will be set by derived classes } Object::~Object() diff --git a/src/Client/World/Object.h b/src/Client/World/Object.h index ed6e68f..537e044 100644 --- a/src/Client/World/Object.h +++ b/src/Client/World/Object.h @@ -32,7 +32,8 @@ enum TYPEID TYPEID_DYNAMICOBJECT = 6, TYPEID_CORPSE = 7, TYPEID_AIGROUP = 8, - TYPEID_AREATRIGGER = 9 + TYPEID_AREATRIGGER = 9, + TYPEID_MAX }; class Object @@ -100,6 +101,8 @@ public: inline bool _IsDepleted(void) { return _depleted; } inline void _SetDepleted(void) { _depleted = true; } + static uint32 maxvalues[]; + protected: Object(); void _InitValues(void); @@ -114,8 +117,10 @@ protected: uint8 _typeid; std::string _name; bool _depleted : 1; // true if the object was deleted from the objmgr, but not from memory + }; + class WorldObject : public Object { public: @@ -145,17 +150,8 @@ protected: inline uint32 GetValuesCountByTypeId(uint8 tid) { - switch(tid) - { - case TYPEID_OBJECT: return OBJECT_END; - case TYPEID_UNIT: return UNIT_END; - case TYPEID_PLAYER: return PLAYER_END; - case TYPEID_ITEM: return ITEM_END; - case TYPEID_CONTAINER: return CONTAINER_END; - case TYPEID_GAMEOBJECT: return GAMEOBJECT_END; - case TYPEID_DYNAMICOBJECT: return DYNAMICOBJECT_END; - case TYPEID_CORPSE: return CORPSE_END; - } + if(tid < TYPEID_MAX) + return Object::maxvalues[tid]; return 0; } diff --git a/src/Client/World/Player.cpp b/src/Client/World/Player.cpp index f20bafb..f8bf78e 100644 --- a/src/Client/World/Player.cpp +++ b/src/Client/World/Player.cpp @@ -13,7 +13,7 @@ Player::Player() : Unit() { _type |= TYPE_PLAYER; _typeid = TYPEID_PLAYER; - _valuescount = PLAYER_END; + _valuescount = Object::maxvalues[_typeid]; } void Player::Create(uint64 guid) @@ -71,4 +71,4 @@ uint16 MyCharacter::GetSpellSlot(uint32 spellid) if(i->id == spellid) return i->slot; return 0; -} +} diff --git a/src/Client/World/Unit.cpp b/src/Client/World/Unit.cpp index f667456..988a68f 100644 --- a/src/Client/World/Unit.cpp +++ b/src/Client/World/Unit.cpp @@ -5,7 +5,7 @@ Unit::Unit() : WorldObject() { _type |= TYPE_UNIT; _typeid = TYPEID_UNIT; - _valuescount = UNIT_END; + _valuescount = Object::maxvalues[_typeid]; } void Unit::Create(uint64 guid) diff --git a/src/Client/World/UpdateFields.h b/src/Client/World/UpdateFields.h index 6284dee..c321d39 100644 --- a/src/Client/World/UpdateFields.h +++ b/src/Client/World/UpdateFields.h @@ -72,6 +72,7 @@ enum EItemFields ITEM_FIELD_CREATE_PLAYED_TIME = OBJECT_END + 0x0038, // Size: 1, Type: INT, Flags: PUBLIC ITEM_FIELD_PAD = OBJECT_END + 0x0039, // Size: 1, Type: INT, Flags: NONE ITEM_END = OBJECT_END + 0x003A, + ITEM_END_6005 = OBJECT_END + 0x2A, }; enum EContainerFields @@ -80,6 +81,7 @@ enum EContainerFields CONTAINER_ALIGN_PAD = ITEM_END + 0x0001, // Size: 1, Type: BYTES, Flags: NONE CONTAINER_FIELD_SLOT_1 = ITEM_END + 0x0002, // Size: 72, Type: LONG, Flags: PUBLIC CONTAINER_END = ITEM_END + 0x004A, + CONTAINER_END_6005 = ITEM_END + 0x003A, }; enum EUnitFields @@ -175,6 +177,8 @@ enum EUnitFields UNIT_FIELD_PADDING = OBJECT_END + 0x008D, // Size: 1, Type: INT, Flags: NONE UNIT_END = OBJECT_END + 0x008E, + UNIT_END_6005 = OBJECT_END + 0x00B6, + PLAYER_DUEL_ARBITER = UNIT_END + 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_FLAGS = UNIT_END + 0x0002, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_GUILDID = UNIT_END + 0x0003, // Size: 1, Type: INT, Flags: PUBLIC @@ -391,6 +395,7 @@ enum EUnitFields PLAYER_GLYPHS_ENABLED = UNIT_END + 0x0498, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_PET_SPELL_POWER = UNIT_END + 0x0499, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_END = UNIT_END + 0x049A, + PLAYER_END_6005 = UNIT_END + 0x0446, }; enum EGameObjectFields @@ -404,6 +409,7 @@ enum EGameObjectFields GAMEOBJECT_LEVEL = OBJECT_END + 0x000A, // Size: 1, Type: INT, Flags: PUBLIC GAMEOBJECT_BYTES_1 = OBJECT_END + 0x000B, // Size: 1, Type: BYTES, Flags: PUBLIC GAMEOBJECT_END = OBJECT_END + 0x000C, + GAMEOBJECT_END_6005 = OBJECT_END + 0x0014, }; enum EDynamicObjectFields diff --git a/src/Client/World/WorldSession.cpp b/src/Client/World/WorldSession.cpp index b235f42..3e31e60 100644 --- a/src/Client/World/WorldSession.cpp +++ b/src/Client/World/WorldSession.cpp @@ -22,6 +22,17 @@ struct OpcodeHandler void (WorldSession::*handler)(WorldPacket& recvPacket); }; +uint32 Object::maxvalues[TYPEID_MAX]={ 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0}; + WorldSession::WorldSession(PseuInstance *in) { logdebug("-> Starting WorldSession 0x%X from instance 0x%X",this,in); // should never output a null ptr @@ -36,7 +47,34 @@ WorldSession::WorldSession(PseuInstance *in) objmgr.SetInstance(in); _lag_ms = 0; //... - + switch(in->GetConf()->client)//TODO: Add TBC/WOTLK cases + { + case CLIENT_CLASSIC_WOW: + { + Object::maxvalues[TYPEID_OBJECT]=OBJECT_END; + Object::maxvalues[TYPEID_ITEM]=ITEM_END_6005; + Object::maxvalues[TYPEID_CONTAINER]=CONTAINER_END_6005; + Object::maxvalues[TYPEID_UNIT]=UNIT_END_6005; + Object::maxvalues[TYPEID_PLAYER]=PLAYER_END_6005; + Object::maxvalues[TYPEID_GAMEOBJECT]=GAMEOBJECT_END_6005; + Object::maxvalues[TYPEID_DYNAMICOBJECT]=DYNAMICOBJECT_END; + Object::maxvalues[TYPEID_CORPSE]=CORPSE_END; + break; + } + default: + { + Object::maxvalues[TYPEID_OBJECT]=OBJECT_END; + Object::maxvalues[TYPEID_ITEM]=ITEM_END; + Object::maxvalues[TYPEID_CONTAINER]=CONTAINER_END; + Object::maxvalues[TYPEID_UNIT]=UNIT_END; + Object::maxvalues[TYPEID_PLAYER]=PLAYER_END; + Object::maxvalues[TYPEID_GAMEOBJECT]=GAMEOBJECT_END; + Object::maxvalues[TYPEID_DYNAMICOBJECT]=DYNAMICOBJECT_END; + Object::maxvalues[TYPEID_CORPSE]=CORPSE_END; + break; + } + } + in->GetScripts()->RunScriptIfExists("_onworldsessioncreate"); DEBUG(logdebug("WorldSession 0x%X constructor finished",this));