* Fixed SMSG_COMPRESSED_UPDATE_OBJECT

Probably needs more thorough checking
This commit is contained in:
shlainn 2011-09-07 23:39:37 +02:00
parent feafa87372
commit 5aaeba6aa5
2 changed files with 31 additions and 4 deletions

View File

@ -37,10 +37,12 @@ void WorldSession::_HandleCompressedUpdateObjectOpcode(WorldPacket& recvPacket)
void WorldSession::_HandleUpdateObjectOpcode(WorldPacket& recvPacket) void WorldSession::_HandleUpdateObjectOpcode(WorldPacket& recvPacket)
{ {
uint8 utype; uint8 utype;
//uint8 hasTransport; uint8 hasTransport;
uint32 usize, ublocks, readblocks=0; uint32 usize, ublocks, readblocks=0;
uint64 uguid; uint64 uguid;
recvPacket >> ublocks; // >> hasTransport; recvPacket >> ublocks; // >> hasTransport;
if(GetInstance()->GetConf()->clientbuild <= 6005)
recvPacket >> hasTransport;
//logdev("UpdateObject: blocks = %u, hasTransport = %u", ublocks, hasTransport); //logdev("UpdateObject: blocks = %u, hasTransport = %u", ublocks, hasTransport);
logdev("UpdateObject: blocks = %u", ublocks); logdev("UpdateObject: blocks = %u", ublocks);
while((recvPacket.rpos() < recvPacket.size())&& (readblocks < ublocks)) while((recvPacket.rpos() < recvPacket.size())&& (readblocks < ublocks))
@ -238,10 +240,13 @@ void WorldSession::_MovementUpdate(uint8 objtypeid, uint64 uguid, WorldPacket& r
{ {
MovementInfo mi; // TODO: use a reference to a MovementInfo in Unit/Player class once implemented MovementInfo mi; // TODO: use a reference to a MovementInfo in Unit/Player class once implemented
uint16 flags; uint16 flags;
uint8 flags_6005;
// uint64 fullguid; // see below // uint64 fullguid; // see below
float speedWalk, speedRun, speedSwimBack, speedSwim, speedWalkBack, speedTurn, speedFly, speedFlyBack, speedPitchRate; float speedWalk, speedRun, speedSwimBack, speedSwim, speedWalkBack, speedTurn, speedFly, speedFlyBack, speedPitchRate;
uint32 unk32; uint32 unk32;
uint16 cb = GetInstance()->GetConf()->clientbuild;
Object *obj = (Object*)objmgr.GetObj(uguid, true); // also depleted objects Object *obj = (Object*)objmgr.GetObj(uguid, true); // also depleted objects
Unit *u = NULL; Unit *u = NULL;
if(obj) if(obj)
@ -256,7 +261,13 @@ void WorldSession::_MovementUpdate(uint8 objtypeid, uint64 uguid, WorldPacket& r
logerror("MovementUpdate for unknown object "I64FMT" typeid=%u",uguid,objtypeid); logerror("MovementUpdate for unknown object "I64FMT" typeid=%u",uguid,objtypeid);
} }
recvPacket >> flags; if(cb > 6005)
recvPacket >> flags;
else
{
recvPacket >> flags_6005;
flags = flags_6005;
}
mi.flags = 0; // not sure if its correct to set it to 0 (needs some starting flag?) mi.flags = 0; // not sure if its correct to set it to 0 (needs some starting flag?)
if(flags & UPDATEFLAG_LIVING) if(flags & UPDATEFLAG_LIVING)
@ -358,19 +369,26 @@ void WorldSession::_MovementUpdate(uint8 objtypeid, uint64 uguid, WorldPacket& r
} }
} }
if(flags & UPDATEFLAG_LOWGUID) if(cb > 6005 && flags & UPDATEFLAG_LOWGUID)
{ {
recvPacket >> unk32; recvPacket >> unk32;
logdev("MovementUpdate: UPDATEFLAG_LOWGUID is set, got %X", unk32); logdev("MovementUpdate: UPDATEFLAG_LOWGUID is set, got %X", unk32);
} }
if(flags & UPDATEFLAG_HIGHGUID) if(cb > 6005 && flags & UPDATEFLAG_HIGHGUID)
{ {
recvPacket >> unk32; // 2.0.6 - high guid was there, unk for 2.0.12 recvPacket >> unk32; // 2.0.6 - high guid was there, unk for 2.0.12
// not sure if this is correct, MaNGOS sends 0 always. // not sure if this is correct, MaNGOS sends 0 always.
//obj->SetUInt32Value(OBJECT_FIELD_GUID+1,higuid); // note that this sets only the high part of the guid //obj->SetUInt32Value(OBJECT_FIELD_GUID+1,higuid); // note that this sets only the high part of the guid
logdev("MovementUpdate: UPDATEFLAG_HIGHGUID is set, got %X", unk32); logdev("MovementUpdate: UPDATEFLAG_HIGHGUID is set, got %X", unk32);
} }
if(cb <= 6005 && flags & UPDATEFLAG_ALL_6005)
{
recvPacket >> unk32;
// MaNGOS sends 1 always.
logdev("MovementUpdate: UPDATEFLAG_ALL is set, got %X", unk32);
}
if(flags & UPDATEFLAG_HAS_TARGET) if(flags & UPDATEFLAG_HAS_TARGET)
{ {

View File

@ -26,6 +26,15 @@ enum OBJECT_UPDATE_FLAGS
UPDATEFLAG_ROTATION = 0x0200 UPDATEFLAG_ROTATION = 0x0200
}; };
enum OBJECT_UPDATE_FLAGS_6005 //UPDATEFLAGS with different meaning in 1.12.x
{
UPDATEFLAG_FULLGUID_6005= 0x0004,//6005 Never used in MaNGOS
UPDATEFLAG_HIGHGUID_6005= 0x0008,//6005 Never used in MaNGOS
UPDATEFLAG_ALL_6005 = 0x0010 //6005
};
enum MovementFlags enum MovementFlags
{ {
MOVEMENTFLAG_NONE = 0x00000000, MOVEMENTFLAG_NONE = 0x00000000,