diff options
| author | Shauren <shauren.trinity@gmail.com> | 2012-07-12 21:20:34 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2012-07-12 21:20:34 +0200 |
| commit | 0b22b329d6d63af4b8ed73e2906c71236349b1bd (patch) | |
| tree | ebad14a643b7c017e5a5921566788d176c218e51 /src/server/game/Entities/Object | |
| parent | 55bd065ddad8dcf50fcda9128b86a18d1a892072 (diff) | |
Core/PacketIO: Updated SMSG_UPDATE_OBJECT structure
Diffstat (limited to 'src/server/game/Entities/Object')
| -rwxr-xr-x | src/server/game/Entities/Object/Object.cpp | 338 | ||||
| -rwxr-xr-x | src/server/game/Entities/Object/ObjectDefines.h | 35 | ||||
| -rwxr-xr-x | src/server/game/Entities/Object/Updates/UpdateData.cpp | 4 | ||||
| -rwxr-xr-x | src/server/game/Entities/Object/Updates/UpdateData.h | 30 |
4 files changed, 286 insertions, 121 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index d21ae63be45..f6c350ecb87 100755 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -295,119 +295,281 @@ void Object::DestroyForPlayer(Player* target, bool onDeath) const void Object::_BuildMovementUpdate(ByteBuffer* data, uint16 flags) const { - *data << uint16(flags); // update flags + uint32 unkLoopCounter = 0; + // Bit content + data->WriteBit(0); + data->WriteBit(0); + data->WriteBit(flags & UPDATEFLAG_ROTATION); + data->WriteBit(flags & UPDATEFLAG_ANIMKITS); + data->WriteBit(flags & UPDATEFLAG_HAS_TARGET); + data->WriteBit(flags & UPDATEFLAG_SELF); + data->WriteBit(flags & UPDATEFLAG_VEHICLE); + data->WriteBit(flags & UPDATEFLAG_LIVING); + data->WriteBits(unkLoopCounter, 24); + data->WriteBit(0); + data->WriteBit(flags & UPDATEFLAG_GO_TRANSPORT_POSITION); + data->WriteBit(flags & UPDATEFLAG_STATIONARY_POSITION); + data->WriteBit(0); + data->WriteBit(0); + data->WriteBit(flags & UPDATEFLAG_TRANSPORT); - // 0x20 if (flags & UPDATEFLAG_LIVING) { Unit const* self = ToUnit(); - self->BuildMovementPacket(data); + ObjectGuid guid = GetGUID(); + uint32 movementFlags = self->m_movementInfo.GetMovementFlags(); + uint16 movementFlagsExtra = self->m_movementInfo.GetExtraMovementFlags(); + + data->WriteBit(!movementFlags); + data->WriteBit(0); // Has Orientation + data->WriteBit(guid[7]); + data->WriteBit(guid[3]); + data->WriteBit(guid[2]); + if (movementFlags) + data->WriteBits(movementFlags, 30); + + data->WriteBit(0); + data->WriteBit(!((movementFlags & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING)) || + (movementFlagsExtra & MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING))); // Has pitch + data->WriteBit(movementFlags & MOVEMENTFLAG_SPLINE_ENABLED); // Has spline data + data->WriteBit(movementFlagsExtra & MOVEMENTFLAG2_INTERPOLATED_TURNING);// Has fall data + data->WriteBit(!(movementFlags & MOVEMENTFLAG_SPLINE_ELEVATION)); // Has spline elevation + data->WriteBit(guid[5]); + data->WriteBit(movementFlags & MOVEMENTFLAG_ONTRANSPORT); // Has transport data + data->WriteBit(0); // Is missing time + if (movementFlags & MOVEMENTFLAG_ONTRANSPORT) + { + ObjectGuid transGuid = self->m_movementInfo.t_guid; + + data->WriteBit(transGuid[1]); + data->WriteBit(movementFlagsExtra & MOVEMENTFLAG2_INTERPOLATED_MOVEMENT); + data->WriteBit(transGuid[4]); + data->WriteBit(transGuid[0]); + data->WriteBit(transGuid[6]); + data->WriteBit(0); // Has transport time 3 + data->WriteBit(transGuid[7]); + data->WriteBit(transGuid[5]); + data->WriteBit(transGuid[3]); + data->WriteBit(transGuid[2]); + } - *data << self->GetSpeed(MOVE_WALK); - *data << self->GetSpeed(MOVE_RUN); - *data << self->GetSpeed(MOVE_RUN_BACK); - *data << self->GetSpeed(MOVE_SWIM); - *data << self->GetSpeed(MOVE_SWIM_BACK); - *data << self->GetSpeed(MOVE_FLIGHT); - *data << self->GetSpeed(MOVE_FLIGHT_BACK); - *data << self->GetSpeed(MOVE_TURN_RATE); - *data << self->GetSpeed(MOVE_PITCH_RATE); + data->WriteBit(guid[4]); + if (movementFlags & MOVEMENTFLAG_SPLINE_ENABLED) + { + data->WriteBit(1); // Has extended spline data + Movement::PacketBuilder::WriteCreateBits(*self->movespline, *data); + } + + data->WriteBit(guid[6]); + if (movementFlagsExtra & MOVEMENTFLAG2_INTERPOLATED_TURNING) + data->WriteBit(movementFlags & MOVEMENTFLAG_FALLING); - // 0x08000000 - if (self->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_SPLINE_ENABLED)) - Movement::PacketBuilder::WriteCreate(*self->movespline, *data); + data->WriteBit(guid[0]); + data->WriteBit(guid[1]); + data->WriteBit(0); + data->WriteBit(!movementFlagsExtra); + if (movementFlagsExtra) + data->WriteBits(movementFlagsExtra, 12); } - else + + if (flags & UPDATEFLAG_GO_TRANSPORT_POSITION) { - WorldObject* worldObj = ((WorldObject*)this); - if (flags & UPDATEFLAG_POSITION) - { - Transport* transport = worldObj->GetTransport(); - if (transport) - data->append(transport->GetPackGUID()); - else - *data << uint8(0); - - *data << worldObj->GetPositionX(); - *data << worldObj->GetPositionY(); - *data << worldObj->GetPositionZ(); - *data << worldObj->GetOrientation(); - if (isType(TYPEMASK_UNIT)) - *data << ((Unit*)this)->GetPositionZMinusOffset(); - else - *data << worldObj->GetPositionZ(); + WorldObject const* self = static_cast<WorldObject const*>(this); + ObjectGuid transGuid = self->m_movementInfo.t_guid; + data->WriteBit(transGuid[5]); + data->WriteBit(0); // Has GO transport time 3 + data->WriteBit(transGuid[0]); + data->WriteBit(transGuid[3]); + data->WriteBit(transGuid[6]); + data->WriteBit(transGuid[1]); + data->WriteBit(transGuid[4]); + data->WriteBit(transGuid[2]); + data->WriteBit(0); // Has GO transport time 2 + data->WriteBit(transGuid[7]); + } - if (transport) - { - *data << worldObj->GetTransOffsetX(); - *data << worldObj->GetTransOffsetY(); - *data << worldObj->GetTransOffsetZ(); - } - else - { - *data << worldObj->GetPositionX(); - *data << worldObj->GetPositionY(); - if (isType(TYPEMASK_UNIT)) - *data << ((Unit*)this)->GetPositionZMinusOffset(); - else - *data << worldObj->GetPositionZ(); - } + if (flags & UPDATEFLAG_HAS_TARGET) + { + ObjectGuid victimGuid = ToUnit()->getVictim()->GetGUID(); // checked in BuildCreateUpdateBlockForPlayer + data->WriteBit(victimGuid[2]); + data->WriteBit(victimGuid[7]); + data->WriteBit(victimGuid[0]); + data->WriteBit(victimGuid[4]); + data->WriteBit(victimGuid[5]); + data->WriteBit(victimGuid[6]); + data->WriteBit(victimGuid[1]); + data->WriteBit(victimGuid[3]); + } - *data << worldObj->GetOrientation(); + if (flags & UPDATEFLAG_ANIMKITS) + { + data->WriteBit(1); // Missing AnimKit1 + data->WriteBit(1); // Missing AnimKit2 + data->WriteBit(1); // Missing AnimKit3 + } - if (GetTypeId() == TYPEID_CORPSE) - *data << worldObj->GetOrientation(); - else - *data << float(0); - } - else + data->FlushBits(); + + // Data + for (uint32 i = 0; i < unkLoopCounter; ++i) + *data << uint32(0); + + if (flags & UPDATEFLAG_LIVING) + { + Unit const* self = ToUnit(); + ObjectGuid guid = GetGUID(); + uint32 movementFlags = self->m_movementInfo.GetMovementFlags(); + uint16 movementFlagsExtra = self->m_movementInfo.GetExtraMovementFlags(); + + data->WriteByteSeq(guid[4]); + *data << self->GetSpeed(MOVE_RUN_BACK); + if (movementFlagsExtra & MOVEMENTFLAG2_INTERPOLATED_TURNING) { - // 0x40 - if (flags & UPDATEFLAG_STATIONARY_POSITION) + if (movementFlags & MOVEMENTFLAG_FALLING) { - *data << worldObj->GetPositionX(); - *data << worldObj->GetPositionY(); - if (isType(TYPEMASK_UNIT)) - *data << ((Unit*)this)->GetPositionZMinusOffset(); - else - *data << worldObj->GetPositionZ(); - *data << worldObj->GetOrientation(); + *data << float(self->m_movementInfo.j_cosAngle); + *data << float(self->m_movementInfo.j_xyspeed); + *data << float(self->m_movementInfo.j_sinAngle); } + + *data << uint32(self->m_movementInfo.fallTime); + *data << float(self->m_movementInfo.j_zspeed); } - } - // 0x4 - if (flags & UPDATEFLAG_HAS_TARGET) - { - if (Unit* victim = this->ToUnit()->getVictim()) - data->append(victim->GetPackGUID()); - else - *data << uint8(0); - } + *data << self->GetSpeed(MOVE_SWIM_BACK); + if (movementFlags & MOVEMENTFLAG_SPLINE_ELEVATION) + *data << float(self->m_movementInfo.splineElevation); - // 0x2 - if (flags & UPDATEFLAG_TRANSPORT) - *data << uint32(getMSTime()); // Unknown - getMSTime is wrong. + if (movementFlags & MOVEMENTFLAG_SPLINE_ENABLED) + Movement::PacketBuilder::WriteCreateData(*self->movespline, *data); + + *data << float(self->GetPositionZMinusOffset()); + data->WriteByteSeq(guid[5]); + if (movementFlags & MOVEMENTFLAG_ONTRANSPORT) + { + ObjectGuid transGuid = self->m_movementInfo.t_guid; + + data->WriteByteSeq(transGuid[5]); + data->WriteByteSeq(transGuid[7]); + *data << uint32(self->GetTransTime()); + *data << float(self->GetTransOffsetO()); + if (movementFlagsExtra & MOVEMENTFLAG2_INTERPOLATED_MOVEMENT) + *data << uint32(0); + + *data << float(self->GetTransOffsetY()); + *data << float(self->GetTransOffsetX()); + data->WriteByteSeq(transGuid[3]); + *data << float(self->GetTransOffsetZ()); + data->WriteByteSeq(transGuid[0]); + //if (hasTransportTime3) + // *data << uint32(0); + + *data << int8(self->GetTransSeat()); + data->WriteByteSeq(transGuid[1]); + data->WriteByteSeq(transGuid[6]); + data->WriteByteSeq(transGuid[2]); + data->WriteByteSeq(transGuid[4]); + } + + *data << float(self->GetPositionX()); + *data << self->GetSpeed(MOVE_PITCH_RATE); + data->WriteByteSeq(guid[0]); + data->WriteByteSeq(guid[3]); + *data << self->GetSpeed(MOVE_SWIM); + *data << float(self->GetPositionX()); + data->WriteByteSeq(guid[7]); + data->WriteByteSeq(guid[1]); + data->WriteByteSeq(guid[2]); + *data << self->GetSpeed(MOVE_WALK); + + //if (true) // Has time, controlled by bit just after HasTransport + *data << uint32(getMSTime()); + + *data << self->GetSpeed(MOVE_FLIGHT_BACK); + data->WriteByteSeq(guid[6]); + *data << self->GetSpeed(MOVE_TURN_RATE); + *data << float(self->GetOrientation()); + *data << self->GetSpeed(MOVE_RUN); + if ((movementFlags & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING)) || + (movementFlagsExtra & MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING)) + *data << float(self->m_movementInfo.pitch); + + *data << self->GetSpeed(MOVE_FLIGHT); + } - // 0x80 if (flags & UPDATEFLAG_VEHICLE) { - // TODO: Allow players to aquire this updateflag. - *data << uint32(((Unit*)this)->GetVehicleKit()->GetVehicleInfo()->m_ID); - *data << float(((Creature*)this)->GetOrientation()); + Unit const* self = ToUnit(); + *data << float(self->GetOrientation()); + *data << uint32(self->GetVehicleKit()->GetVehicleInfo()->m_ID); } - // 0x800 - AnimKits - if (flags & UPDATEFLAG_ANIMKITS) - *data << uint16(0) << uint16(0) << uint16(0); //unk + if (flags & UPDATEFLAG_GO_TRANSPORT_POSITION) + { + WorldObject const* self = static_cast<WorldObject const*>(this); + ObjectGuid transGuid = self->m_movementInfo.t_guid; + + data->WriteBit(transGuid[0]); + data->WriteBit(transGuid[5]); + //if (hasTransportTime3) + // *data << uint32(0); + + data->WriteBit(transGuid[3]); + *data << float(self->GetTransOffsetX()); + data->WriteBit(transGuid[4]); + data->WriteBit(transGuid[6]); + data->WriteBit(transGuid[1]); + *data << uint32(self->GetTransTime()); + *data << float(self->GetTransOffsetY()); + data->WriteBit(transGuid[2]); + data->WriteBit(transGuid[7]); + *data << float(self->GetTransOffsetZ()); + *data << int8(self->GetTransSeat()); + *data << float(self->GetTransOffsetO()); + //if (hasTransportTime2) + // *data << uint32(0); + } - // 0x200 if (flags & UPDATEFLAG_ROTATION) - *data << int64(((GameObject*)this)->GetRotation()); + *data << uint64(ToGameObject()->GetRotation()); - // 0x1000 - if (flags & UPDATEFLAG_UNK3) - *data << uint8(0);//unk counter to read uint32 values + if (flags & UPDATEFLAG_STATIONARY_POSITION) + { + WorldObject const* self = static_cast<WorldObject const*>(this); + *data << float(self->GetOrientation()); + *data << float(self->GetPositionX()); + *data << float(self->GetPositionY()); + if (Unit const* unit = ToUnit()) + *data << float(unit->GetPositionZMinusOffset()); + else + *data << float(self->GetPositionZ()); + } + + if (flags & UPDATEFLAG_HAS_TARGET) + { + ObjectGuid victimGuid = ToUnit()->getVictim()->GetGUID(); // checked in BuildCreateUpdateBlockForPlayer + data->WriteByteSeq(victimGuid[0]); + data->WriteByteSeq(victimGuid[3]); + data->WriteByteSeq(victimGuid[5]); + data->WriteByteSeq(victimGuid[7]); + data->WriteByteSeq(victimGuid[6]); + data->WriteByteSeq(victimGuid[2]); + data->WriteByteSeq(victimGuid[1]); + data->WriteByteSeq(victimGuid[4]); + } + + //if (flags & UPDATEFLAG_ANIMKITS) + //{ + // if (hasAnimKit1) + // *data << uint16(animKit1); + // if (hasAnimKit2) + // *data << uint16(animKit2); + // if (hasAnimKit3) + // *data << uint16(animKit3); + //} + + if (flags & UPDATEFLAG_TRANSPORT) + *data << uint32(getMSTime()); // Unknown - getMSTime is wrong. } void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask* updateMask, Player* target) const diff --git a/src/server/game/Entities/Object/ObjectDefines.h b/src/server/game/Entities/Object/ObjectDefines.h index a9d14b85a59..ef1eeb237b7 100755 --- a/src/server/game/Entities/Object/ObjectDefines.h +++ b/src/server/game/Entities/Object/ObjectDefines.h @@ -33,18 +33,18 @@ enum HighGuid { - HIGHGUID_ITEM = 0x4000, // blizz 4000 - HIGHGUID_CONTAINER = 0x4000, // blizz 4000 - HIGHGUID_PLAYER = 0x0000, // blizz 0000 - HIGHGUID_GAMEOBJECT = 0xF110, // blizz F110 - HIGHGUID_TRANSPORT = 0xF120, // blizz F120 (for GAMEOBJECT_TYPE_TRANSPORT) - HIGHGUID_UNIT = 0xF130, // blizz F130 - HIGHGUID_PET = 0xF140, // blizz F140 - HIGHGUID_VEHICLE = 0xF150, // blizz F550 - HIGHGUID_DYNAMICOBJECT = 0xF100, // blizz F100 + HIGHGUID_ITEM = 0x400, // blizz 4000 + HIGHGUID_CONTAINER = 0x400, // blizz 4000 + HIGHGUID_PLAYER = 0x000, // blizz 0000 + HIGHGUID_GAMEOBJECT = 0xF11, // blizz F110 + HIGHGUID_TRANSPORT = 0xF12, // blizz F120 (for GAMEOBJECT_TYPE_TRANSPORT) + HIGHGUID_UNIT = 0xF13, // blizz F130 + HIGHGUID_PET = 0xF14, // blizz F140 + HIGHGUID_VEHICLE = 0xF15, // blizz F550 + HIGHGUID_DYNAMICOBJECT = 0xF10, // blizz F100 HIGHGUID_CORPSE = 0xF101, // blizz F100 - HIGHGUID_MO_TRANSPORT = 0x1FC0, // blizz 1FC0 (for GAMEOBJECT_TYPE_MO_TRANSPORT) - HIGHGUID_GROUP = 0x1F50, + HIGHGUID_MO_TRANSPORT = 0x1FC, // blizz 1FC0 (for GAMEOBJECT_TYPE_MO_TRANSPORT) + HIGHGUID_GROUP = 0x1F5, HIGHGUID_GUILD = 0x1FF5, // new 4.x }; @@ -70,15 +70,20 @@ enum HighGuid // l - OBJECT_FIELD_GUID // e - OBJECT_FIELD_ENTRY for GO (except GAMEOBJECT_TYPE_MO_TRANSPORT) and creatures or UNIT_FIELD_PETNUMBER for pets // h - OBJECT_FIELD_GUID + 1 -#define MAKE_NEW_GUID(l, e, h) uint64(uint64(l) | (uint64(e) << 24) | (uint64(h) << 48)) +#define MAKE_NEW_GUID(l, e, h) uint64(uint64(l) | (uint64(e) << 32) | (uint64(h) << ((h == HIGHGUID_GUILD || h == HIGHGUID_CORPSE) ? 48 : 52))) -#define GUID_HIPART(x) (uint32)((uint64(x) >> 48) & 0x0000FFFF) +//#define GUID_HIPART(x) (uint32)((uint64(x) >> 52)) & 0x0000FFFF) +inline uint32 GUID_HIPART(uint64 guid) +{ + uint32 t = ((uint64(guid) >> 48) & 0x0000FFFF); + return (t == HIGHGUID_GUILD || t == HIGHGUID_CORPSE) ? t : ((uint32(t) >> 4) & 0x00000FFF); +} // We have different low and middle part size for different guid types #define _GUID_ENPART_2(x) 0 -#define _GUID_ENPART_3(x) (uint32)((uint64(x) >> 24) & UI64LIT(0x0000000000FFFFFF)) +#define _GUID_ENPART_3(x) (uint32)((uint64(x) >> 32) & UI64LIT(0x0000000000FFFFFF)) #define _GUID_LOPART_2(x) (uint32)(uint64(x) & UI64LIT(0x00000000FFFFFFFF)) -#define _GUID_LOPART_3(x) (uint32)(uint64(x) & UI64LIT(0x0000000000FFFFFF)) +#define _GUID_LOPART_3(x) (uint32)(uint64(x) & UI64LIT(0x00000000FFFFFFFF)) inline bool IsGuidHaveEnPart(uint64 guid) { diff --git a/src/server/game/Entities/Object/Updates/UpdateData.cpp b/src/server/game/Entities/Object/Updates/UpdateData.cpp index f9536122f73..1a1b0984f03 100755 --- a/src/server/game/Entities/Object/Updates/UpdateData.cpp +++ b/src/server/game/Entities/Object/Updates/UpdateData.cpp @@ -51,7 +51,7 @@ bool UpdateData::BuildPacket(WorldPacket* packet) packet->Initialize(SMSG_UPDATE_OBJECT, 2 + 4 + (m_outOfRangeGUIDs.empty() ? 0 : 1 + 4 + 9 * m_outOfRangeGUIDs.size()) + m_data.wpos()); *packet << uint16(m_map); - *packet << uint32(m_blockCount); + *packet << uint32(m_blockCount + (m_outOfRangeGUIDs.empty() ? 0 : 1)); if (!m_outOfRangeGUIDs.empty()) { @@ -59,9 +59,7 @@ bool UpdateData::BuildPacket(WorldPacket* packet) *packet << uint32(m_outOfRangeGUIDs.size()); for (std::set<uint64>::const_iterator i = m_outOfRangeGUIDs.begin(); i != m_outOfRangeGUIDs.end(); ++i) - { packet->appendPackGUID(*i); - } } packet->append(m_data); diff --git a/src/server/game/Entities/Object/Updates/UpdateData.h b/src/server/game/Entities/Object/Updates/UpdateData.h index 11d54ac488e..27a42be5c2d 100755 --- a/src/server/game/Entities/Object/Updates/UpdateData.h +++ b/src/server/game/Entities/Object/Updates/UpdateData.h @@ -32,21 +32,21 @@ enum OBJECT_UPDATE_TYPE enum OBJECT_UPDATE_FLAGS { - UPDATEFLAG_NONE = 0x0000, - UPDATEFLAG_SELF = 0x0001, - UPDATEFLAG_TRANSPORT = 0x0002, - UPDATEFLAG_HAS_TARGET = 0x0004, - UPDATEFLAG_UNKNOWN = 0x0008, - UPDATEFLAG_LOWGUID = 0x0010, - UPDATEFLAG_LIVING = 0x0020, - UPDATEFLAG_STATIONARY_POSITION = 0x0040, - UPDATEFLAG_VEHICLE = 0x0080, - UPDATEFLAG_POSITION = 0x0100, - UPDATEFLAG_ROTATION = 0x0200, - UPDATEFLAG_UNK3 = 0x0400, - UPDATEFLAG_ANIMKITS = 0x0800, - UPDATEFLAG_UNK5 = 0x1000, - UPDATEFLAG_UNK6 = 0x2000 + UPDATEFLAG_NONE = 0x0000, + UPDATEFLAG_SELF = 0x0001, + UPDATEFLAG_TRANSPORT = 0x0002, + UPDATEFLAG_HAS_TARGET = 0x0004, + UPDATEFLAG_UNKNOWN = 0x0008, + UPDATEFLAG_LOWGUID = 0x0010, + UPDATEFLAG_LIVING = 0x0020, + UPDATEFLAG_STATIONARY_POSITION = 0x0040, + UPDATEFLAG_VEHICLE = 0x0080, + UPDATEFLAG_GO_TRANSPORT_POSITION = 0x0100, + UPDATEFLAG_ROTATION = 0x0200, + UPDATEFLAG_UNK3 = 0x0400, + UPDATEFLAG_ANIMKITS = 0x0800, + UPDATEFLAG_UNK5 = 0x1000, + UPDATEFLAG_UNK6 = 0x2000, }; class UpdateData |
