* updated Object updates (SMSG_[COMPRESSeD_]UPDATE_OBJECT) to 2.0.12

* copied/updated some new unit data from MaNGOS
* new log level: legdev() - loglevel 3 and above.
* disabled item listing at entering/leaving world.
This commit is contained in:
False.Genesis 2007-04-30 23:34:38 +00:00
parent 9b373f6643
commit 0b36ae85da
6 changed files with 164 additions and 118 deletions

View File

@ -210,7 +210,7 @@ void ItemProtoCache_InsertDataToSession(WorldSession *session)
buf >> proto->Unknown2; // Added in 1.12.x client branch buf >> proto->Unknown2; // Added in 1.12.x client branch
if(proto->Id) if(proto->Id)
{ {
DEBUG(logdebug("ItemProtoCache: Loaded %u [%s]",proto->Id, proto->Name[0].c_str())); //DEBUG(logdebug("ItemProtoCache: Loaded %u [%s]",proto->Id, proto->Name[0].c_str()));
session->objmgr.Add(proto); session->objmgr.Add(proto);
counter++; counter++;
} }
@ -312,7 +312,7 @@ void ItemProtoCache_WriteDataToCache(WorldSession *session)
buf << proto->Unknown1; buf << proto->Unknown1;
buf << proto->Unknown2; // Added in 1.12.x client branch buf << proto->Unknown2; // Added in 1.12.x client branch
DEBUG(logdebug("ItemProtoCache: Saved %u [%s]",proto->Id, proto->Name[0].c_str())); //DEBUG(logdebug("ItemProtoCache: Saved %u [%s]",proto->Id, proto->Name[0].c_str()));
uint32 size = buf.size(); 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());

View File

@ -3,30 +3,42 @@
#include "Object.h" #include "Object.h"
enum UnitMoveType enum UnitMoveType
{ {
MOVE_WALK =0, MOVE_WALK = 0,
MOVE_RUN =1, MOVE_RUN = 1,
MOVE_WALKBACK =2, MOVE_WALKBACK = 2,
MOVE_SWIM =3, MOVE_SWIM = 3,
MOVE_SWIMBACK =4, MOVE_SWIMBACK = 4,
MOVE_TURN =5, MOVE_TURN = 5,
MAX_MOVE_TYPE =6 MOVE_FLY = 6,
MOVE_FLYBACK = 7,
MAX_MOVE_TYPE = 8
}; };
enum UnitFlags enum UnitFlags
{ {
UNIT_FLAG_NONE = 0x00000000, UNIT_FLAG_NONE = 0x00000000,
UNIT_FLAG_DISABLE_MOVE = 0x00000004, UNIT_FLAG_DISABLE_MOVE = 0x00000004,
UNIT_FLAG_UNKNOWN1 = 0x00000008, // essential for all units.. UNIT_FLAG_UNKNOWN1 = 0x00000008, // essential for all units..
UNIT_FLAG_RENAME = 0x00000010, // rename creature UNIT_FLAG_RENAME = 0x00000010, // rename creature, not working in 2.0.8
UNIT_FLAG_RESTING = 0x00000020, UNIT_FLAG_RESTING = 0x00000020,
UNIT_FLAG_PVP = 0x00001000, UNIT_FLAG_UNKNOWN2 = 0x00000100, // 2.0.8
UNIT_FLAG_MOUNT = 0x00002000, UNIT_FLAG_UNKNOWN3 = 0x00000800, // in combat ?2.0.8
UNIT_FLAG_DISABLE_ROTATE = 0x00040000, UNIT_FLAG_PVP = 0x00001000,
UNIT_FLAG_IN_COMBAT = 0x00080000, UNIT_FLAG_MOUNT = 0x00002000,
UNIT_FLAG_SKINNABLE = 0x04000000, UNIT_FLAG_UNKNOWN4 = 0x00004000, // 2.0.8
UNIT_FLAG_SHEATHE = 0x40000000 UNIT_FLAG_PACIFIED = 0x00020000,
UNIT_FLAG_DISABLE_ROTATE = 0x00040000, // may be it's stunned flag?
UNIT_FLAG_IN_COMBAT = 0x00080000,
UNIT_FLAG_DISARMED = 0x00200000, // disable melee spells casting..., "Required melee weapon" added to melee spells tooltip.
UNIT_FLAG_CONFUSED = 0x00400000,
UNIT_FLAG_FLEEING = 0x00800000,
UNIT_FLAG_UNKNOWN5 = 0x01000000, // used in spell Eyes of the Beast for pet...
UNIT_FLAG_NOT_SELECTABLE = 0x02000000,
UNIT_FLAG_SKINNABLE = 0x04000000,
UNIT_FLAG_UNKNOWN6 = 0x20000000, // used in Feing Death spell
UNIT_FLAG_SHEATHE = 0x40000000
}; };

View File

@ -72,8 +72,6 @@ void WorldSession::_HandleUpdateObjectOpcode(WorldPacket& recvPacket)
recvPacket >> objtypeid; recvPacket >> objtypeid;
logdebug("Create Object type %u with guid "I64FMT,objtypeid,uguid); logdebug("Create Object type %u with guid "I64FMT,objtypeid,uguid);
switch(objtypeid) switch(objtypeid)
{ {
case TYPEID_OBJECT: // no data to read case TYPEID_OBJECT: // no data to read
@ -161,114 +159,91 @@ void WorldSession::_HandleUpdateObjectOpcode(WorldPacket& recvPacket)
void WorldSession::_MovementUpdate(uint8 objtypeid, uint64 uguid, WorldPacket& recvPacket) void WorldSession::_MovementUpdate(uint8 objtypeid, uint64 uguid, WorldPacket& recvPacket)
{ {
uint8 flags; uint8 flags;
uint32 unk32,flags2,time,posCount,transtime; uint32 unk32,flags2,time,transtime,higuid;
float unkf,x,y,z,o,tx,ty,tz,to; float unkf,x,y,z,o,tx,ty,tz,to;
uint64 transguid; uint64 transguid;
float speedWalk, speedRun, speedSwimBack, speedSwim, speedWalkBack, speedTurn; // uint64 fullguid; // see below
float speedWalk, speedRun, speedSwimBack, speedSwim, speedWalkBack, speedTurn, speedFly, speedFlyBack;
Object *obj = (Object*)objmgr.GetObj(uguid);
Unit *u = (Unit*)obj; // only use for Unit:: functions!!
recvPacket >> flags; recvPacket >> flags;
flags2 = 0; // not sure if its correct to set it to 0 (needs some starting flag?)
if(objtypeid==TYPEID_PLAYER) if(flags & UPDATEFLAG_LIVING)
{ {
Unit *u = (Unit*)objmgr.GetObj(uguid); recvPacket >> flags2 >> time;
recvPacket >> flags2 >> time; }
if (flags2 & 0x02000000) // On a transport logdev("MovementUpdate TypeID=%u GUID="I64FMT" pObj=%X flags=%u flags2=%u",objtypeid,uguid,obj,flags,flags2);
if(flags & UPDATEFLAG_HASPOSITION)
{
if(flags & UPDATEFLAG_TRANSPORT)
{ {
recvPacket >> x >> y >> z >> o >> transguid >> tx >> ty >> tz >> to; recvPacket >> unkf >> unkf >> unkf >> o; // 3x (float)0 followed by orientation
} }
else else
{ {
recvPacket >> x >> y >> z >> o; recvPacket >> x >> y >> z >> o;
} }
recvPacket >> unkf; if(flags2 & FLAGS2_TRANSPORT)
if(flags2 & 0x2000) // Self update
{
// What is this data used for?
recvPacket >> unkf;
recvPacket >> unkf;
recvPacket >> unkf;
recvPacket >> unkf;
}
recvPacket >> speedWalk >> speedRun >> speedSwimBack >> speedSwim >> speedWalkBack >> speedTurn;
if(u)
{
u->SetPosition(x,y,z,o);
u->SetSpeed(MOVE_WALK,speedWalk);
u->SetSpeed(MOVE_RUN,speedRun);
u->SetSpeed(MOVE_SWIMBACK,speedSwimBack);
u->SetSpeed(MOVE_SWIM,speedSwim);
u->SetSpeed(MOVE_WALKBACK,speedWalkBack);
u->SetSpeed(MOVE_TURN,speedTurn);
}
else
{
logcustom(2,RED,"WorldSession::_MovementUpdate for unknown guid "I64FMT" typeid=%u",uguid,objtypeid);
}
}
if(objtypeid==TYPEID_UNIT)
{
Unit *u = (Unit*)objmgr.GetObj(uguid);
recvPacket >> flags2 >> unk32 >> x >> y >> z >> o >> unkf;
recvPacket >> speedWalk >> speedRun >> speedSwimBack >> speedSwim >> speedWalkBack >> speedTurn;
if (flags2 & 0x400000)
{ {
recvPacket >> unk32 >> unk32 >> unk32 >> unk32 >> posCount; recvPacket >> transguid >> tx >> ty >> tz >> to;
recvPacket >> unk32; // added in 2.0.3
for (uint8 i = 0; i < posCount + 1; i++)
{
recvPacket >> unkf >> unkf >> unkf; // Some x, y, z value
}
} }
if(u)
{
u->SetPosition(x,y,z,o);
u->SetSpeed(MOVE_WALK,speedWalk);
u->SetSpeed(MOVE_RUN,speedRun);
u->SetSpeed(MOVE_SWIMBACK,speedSwimBack);
u->SetSpeed(MOVE_SWIM,speedSwim);
u->SetSpeed(MOVE_WALKBACK,speedWalkBack);
u->SetSpeed(MOVE_TURN,speedTurn);
}
else
{
logcustom(2,RED,"WorldSession::_MovementUpdate for unknown guid "I64FMT" typeid=%u",uguid,objtypeid);
}
} }
if( (objtypeid==TYPEID_CORPSE) || (objtypeid==TYPEID_GAMEOBJECT) || (objtypeid==TYPEID_DYNAMICOBJECT)) if(flags & UPDATEFLAG_LIVING)
{ {
Unit *u = (Unit*)objmgr.GetObj(uguid); recvPacket >> unk32;
if(GUID_HIPART(uguid) != HIGHGUID_TRANSPORT) if(flags2 & 0x2000) // 0x2000 = ??
{ {
recvPacket >> x >> y >> z; recvPacket >> unkf >> unkf >> unkf >> unkf;
if(u) }
u->SetPosition(x,y,z,u->GetO()); recvPacket >> speedWalk >> speedRun >> speedSwimBack >> speedSwim;
else recvPacket >> speedWalkBack >> speedFly >> speedFlyBack >> speedTurn; // fly added in 2.0.x
logcustom(2,RED,"WorldSession::_MovementUpdate for unknown guid "I64FMT" typeid=%u",uguid,objtypeid); if(u)
} {
else u->SetPosition(x,y,z,o);
{ u->SetSpeed(MOVE_WALK,speedWalk);
recvPacket >> unk32 >> unk32 >> unk32; // should be 0? u->SetSpeed(MOVE_RUN,speedRun);
} u->SetSpeed(MOVE_SWIMBACK,speedSwimBack);
recvPacket >> o; u->SetSpeed(MOVE_SWIM,speedSwim);
if(u) u->SetSpeed(MOVE_WALKBACK,speedWalkBack);
u->SetPosition(u->GetX(),u->GetY(),u->GetZ(),o); u->SetSpeed(MOVE_TURN,speedTurn);
else u->SetSpeed(MOVE_FLY,speedFly);
logcustom(2,RED,"WorldSession::_MovementUpdate for unknown guid "I64FMT" typeid=%u",uguid,objtypeid); u->SetSpeed(MOVE_FLYBACK,speedFlyBack);
}
else
{
logcustom(2,RED,"WorldSession::_MovementUpdate for unknown guid "I64FMT" typeid=%u",uguid,objtypeid);
}
} }
recvPacket >> unk32; // (uint32)0x1 if(flags & UPDATEFLAG_ALL)
{
recvPacket >> unk32;
}
if ((GUID_HIPART(uguid) == HIGHGUID_TRANSPORT)) if(flags & UPDATEFLAG_HIGHGUID)
{ {
recvPacket >> transtime; recvPacket >> higuid; // 2.0.6 - high guid was there, unk for 2.0.12
} // not sure if this is correct
obj->SetUInt32Value(OBJECT_FIELD_GUID+1,higuid); // note that this sets only the high part of the guid
if( GUID_HIPART(uguid) == HIGHGUID_PLAYER_CORPSE) }
recvPacket >> unk32; // ??
if(flags & UPDATEFLAG_FULLGUID)
{
// unused in mangos? but what if its needed?
// recvPacket >> fullguid;
}
if(flags & UPDATEFLAG_TRANSPORT)
{
recvPacket >> transtime; // whats this used for?
}
} }
@ -289,6 +264,7 @@ void WorldSession::_ValuesUpdate(uint64 uguid, WorldPacket& recvPacket)
recvPacket.read((uint8*)updateMask, masksize); recvPacket.read((uint8*)updateMask, masksize);
umask.SetMask(updateMask); umask.SetMask(updateMask);
//delete [] updateMask; // will be deleted at ~UpdateMask() !!!! //delete [] updateMask; // will be deleted at ~UpdateMask() !!!!
logdev("ValuesUpdate TypeId=%u GUID="I64FMT" pObj=%X Blocks=%u Masksize=%u",obj->GetTypeId(),uguid,obj,blockcount,masksize);
for (uint32 i = 0; i < valuesCount; i++) for (uint32 i = 0; i < valuesCount; i++)
{ {
@ -296,7 +272,7 @@ void WorldSession::_ValuesUpdate(uint64 uguid, WorldPacket& recvPacket)
{ {
recvPacket >> value; recvPacket >> value;
// TODO: which values are float and which values are uin32 ??! // TODO: what to do here?!
/*if( obj->isType(TYPE_UNIT) && ( /*if( obj->isType(TYPE_UNIT) && (
i >= UNIT_FIELD_POWER1 && i <= UNIT_FIELD_MAXPOWER5 || i >= UNIT_FIELD_POWER1 && i <= UNIT_FIELD_MAXPOWER5 ||
i >= UNIT_FIELD_BASEATTACKTIME && i <= UNIT_FIELD_RANGEDATTACKTIME || i >= UNIT_FIELD_BASEATTACKTIME && i <= UNIT_FIELD_RANGEDATTACKTIME ||
@ -311,6 +287,8 @@ void WorldSession::_ValuesUpdate(uint64 uguid, WorldPacket& recvPacket)
obj->SetUInt32Value(i, value); obj->SetUInt32Value(i, value);
//} //}
// still nee to find out which values to interpret as floats
logdev("-> Field[%u] = %u",i,value);
} }
} }
} }

View File

@ -1,18 +1,47 @@
#ifndef _UPDATEDATA_H #ifndef _UPDATEDATA_H
#define _UPDATEDATA_H #define _UPDATEDATA_H
// old code for 1.12.x (and below)
/*
enum OBJECT_UPDATE_TYPE enum OBJECT_UPDATE_TYPE
{ {
UPDATETYPE_VALUES = 0, UPDATETYPE_VALUES = 0,
UPDATETYPE_MOVEMENT = 1, UPDATETYPE_MOVEMENT = 1,
UPDATETYPE_CREATE_OBJECT = 2, UPDATETYPE_CREATE_OBJECT = 2,
UPDATETYPE_CREATE_OBJECT2 = 3, UPDATETYPE_CREATE_OBJECT2 = 3,
UPDATETYPE_OUT_OF_RANGE_OBJECTS = 4, UPDATETYPE_OUT_OF_RANGE_OBJECTS = 4,
UPDATETYPE_NEAR_OBJECTS = 5 UPDATETYPE_NEAR_OBJECTS = 5
}; };
*/
enum OBJECT_UPDATE_TYPE
{
UPDATETYPE_VALUES = 0,
UPDATETYPE_MOVEMENT = 1,
UPDATETYPE_CREATE_OBJECT = 2,
UPDATETYPE_CREATE_OBJECT2 = 3,
UPDATETYPE_OUT_OF_RANGE_OBJECTS = 4,
UPDATETYPE_NEAR_OBJECTS = 5
};
enum OBJECT_UPDATE_FLAGS
{
UPDATEFLAG_SELF = 0x01,
UPDATEFLAG_TRANSPORT = 0x02,
UPDATEFLAG_FULLGUID = 0x04,
UPDATEFLAG_HIGHGUID = 0x08,
UPDATEFLAG_ALL = 0x10,
UPDATEFLAG_LIVING = 0x20,
UPDATEFLAG_HASPOSITION = 0x40
};
// not sure about those flags, mangos hasnt a description for it either
enum FLAGS2_UPDATE_FLAGS
{
FLAGS2_TRANSPORT = 0x200,
FLAGS2_SPIRITHEALER = 0x10000000,
};
#endif #endif

View File

@ -89,6 +89,32 @@ void logdebug(const char *str, ...)
fflush(stdout); fflush(stdout);
} }
void logdev(const char *str, ...)
{
if(!str || instance->GetConf()->debug < 3)
return;
va_list ap;
_log_setcolor(true,LMAGENTA);
va_start(ap, str);
vprintf( str, ap );
va_end(ap);
_log_resetcolor(true);
printf("\n");
if(logfile)
{
fprintf(logfile, getDateString().c_str());
va_start(ap, str);
vfprintf(logfile, str, ap);
fprintf(logfile, "\n" );
va_end(ap);
fflush(logfile);
}
fflush(stdout);
}
void logerror(const char *str, ...) void logerror(const char *str, ...)
{ {
va_list ap; va_list ap;

View File

@ -26,6 +26,7 @@ void log_prepare(char *fn, PseuInstance* p); // instance reference needed for lo
void log(const char *str, ...); void log(const char *str, ...);
void logdetail(const char *str, ...); void logdetail(const char *str, ...);
void logdebug(const char *str, ...); void logdebug(const char *str, ...);
void logdev(const char *str, ...);
void logerror(const char *str, ...); void logerror(const char *str, ...);
void logcritical(const char *str, ...); void logcritical(const char *str, ...);
void logcustom(uint8 loglevel, Color color, const char *str, ...); void logcustom(uint8 loglevel, Color color, const char *str, ...);