* First step away from hardcoded updatefields: max field values are now set depending on conf client version

This commit is contained in:
shlainn 2011-09-15 15:01:31 +02:00
parent bd9424b0c2
commit c024fac446
11 changed files with 73 additions and 33 deletions

View File

@ -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);
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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)

View File

@ -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
}

View File

@ -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()

View File

@ -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;
}

View File

@ -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;
}
}

View File

@ -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)

View File

@ -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

View File

@ -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));