* 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:
parent
9b373f6643
commit
0b36ae85da
@ -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());
|
||||||
|
|||||||
@ -5,13 +5,15 @@
|
|||||||
|
|
||||||
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
|
||||||
@ -19,13 +21,23 @@ 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_UNKNOWN2 = 0x00000100, // 2.0.8
|
||||||
|
UNIT_FLAG_UNKNOWN3 = 0x00000800, // in combat ?2.0.8
|
||||||
UNIT_FLAG_PVP = 0x00001000,
|
UNIT_FLAG_PVP = 0x00001000,
|
||||||
UNIT_FLAG_MOUNT = 0x00002000,
|
UNIT_FLAG_MOUNT = 0x00002000,
|
||||||
UNIT_FLAG_DISABLE_ROTATE = 0x00040000,
|
UNIT_FLAG_UNKNOWN4 = 0x00004000, // 2.0.8
|
||||||
|
UNIT_FLAG_PACIFIED = 0x00020000,
|
||||||
|
UNIT_FLAG_DISABLE_ROTATE = 0x00040000, // may be it's stunned flag?
|
||||||
UNIT_FLAG_IN_COMBAT = 0x00080000,
|
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_SKINNABLE = 0x04000000,
|
||||||
|
UNIT_FLAG_UNKNOWN6 = 0x20000000, // used in Feing Death spell
|
||||||
UNIT_FLAG_SHEATHE = 0x40000000
|
UNIT_FLAG_SHEATHE = 0x40000000
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -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,38 +159,51 @@ 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)
|
||||||
{
|
{
|
||||||
recvPacket >> x >> y >> z >> o >> transguid >> tx >> ty >> tz >> to;
|
if(flags & UPDATEFLAG_TRANSPORT)
|
||||||
|
{
|
||||||
|
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 >> transguid >> tx >> ty >> tz >> to;
|
||||||
recvPacket >> unkf;
|
recvPacket >> unk32; // added in 2.0.3
|
||||||
recvPacket >> unkf;
|
|
||||||
recvPacket >> unkf;
|
|
||||||
recvPacket >> unkf;
|
|
||||||
}
|
}
|
||||||
recvPacket >> speedWalk >> speedRun >> speedSwimBack >> speedSwim >> speedWalkBack >> speedTurn;
|
}
|
||||||
|
if(flags & UPDATEFLAG_LIVING)
|
||||||
|
{
|
||||||
|
recvPacket >> unk32;
|
||||||
|
if(flags2 & 0x2000) // 0x2000 = ??
|
||||||
|
{
|
||||||
|
recvPacket >> unkf >> unkf >> unkf >> unkf;
|
||||||
|
}
|
||||||
|
recvPacket >> speedWalk >> speedRun >> speedSwimBack >> speedSwim;
|
||||||
|
recvPacket >> speedWalkBack >> speedFly >> speedFlyBack >> speedTurn; // fly added in 2.0.x
|
||||||
if(u)
|
if(u)
|
||||||
{
|
{
|
||||||
u->SetPosition(x,y,z,o);
|
u->SetPosition(x,y,z,o);
|
||||||
@ -202,73 +213,37 @@ void WorldSession::_MovementUpdate(uint8 objtypeid, uint64 uguid, WorldPacket& r
|
|||||||
u->SetSpeed(MOVE_SWIM,speedSwim);
|
u->SetSpeed(MOVE_SWIM,speedSwim);
|
||||||
u->SetSpeed(MOVE_WALKBACK,speedWalkBack);
|
u->SetSpeed(MOVE_WALKBACK,speedWalkBack);
|
||||||
u->SetSpeed(MOVE_TURN,speedTurn);
|
u->SetSpeed(MOVE_TURN,speedTurn);
|
||||||
|
u->SetSpeed(MOVE_FLY,speedFly);
|
||||||
|
u->SetSpeed(MOVE_FLYBACK,speedFlyBack);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
logcustom(2,RED,"WorldSession::_MovementUpdate for unknown guid "I64FMT" typeid=%u",uguid,objtypeid);
|
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)
|
if(flags & UPDATEFLAG_ALL)
|
||||||
{
|
{
|
||||||
recvPacket >> unk32 >> unk32 >> unk32 >> unk32 >> posCount;
|
recvPacket >> unk32;
|
||||||
|
|
||||||
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))
|
|
||||||
{
|
|
||||||
Unit *u = (Unit*)objmgr.GetObj(uguid);
|
|
||||||
if(GUID_HIPART(uguid) != HIGHGUID_TRANSPORT)
|
|
||||||
{
|
|
||||||
recvPacket >> x >> y >> z;
|
|
||||||
if(u)
|
|
||||||
u->SetPosition(x,y,z,u->GetO());
|
|
||||||
else
|
|
||||||
logcustom(2,RED,"WorldSession::_MovementUpdate for unknown guid "I64FMT" typeid=%u",uguid,objtypeid);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
recvPacket >> unk32 >> unk32 >> unk32; // should be 0?
|
|
||||||
}
|
|
||||||
recvPacket >> o;
|
|
||||||
if(u)
|
|
||||||
u->SetPosition(u->GetX(),u->GetY(),u->GetZ(),o);
|
|
||||||
else
|
|
||||||
logcustom(2,RED,"WorldSession::_MovementUpdate for unknown guid "I64FMT" typeid=%u",uguid,objtypeid);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
recvPacket >> unk32; // (uint32)0x1
|
if(flags & UPDATEFLAG_HIGHGUID)
|
||||||
|
|
||||||
if ((GUID_HIPART(uguid) == HIGHGUID_TRANSPORT))
|
|
||||||
{
|
{
|
||||||
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)
|
if(flags & UPDATEFLAG_FULLGUID)
|
||||||
recvPacket >> unk32; // ??
|
{
|
||||||
|
// 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
@ -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;
|
||||||
|
|||||||
@ -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, ...);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user