diff options
| author | Rat <gmstreetrat@gmail.com> | 2011-11-27 16:06:29 +0100 |
|---|---|---|
| committer | Rat <gmstreetrat@gmail.com> | 2011-11-27 16:06:29 +0100 |
| commit | 7fdefceb4389eaf7ee6a4ae34a73b861bbcdea5c (patch) | |
| tree | 78c6bab4e2603d27d29a5d72c04872c708de2970 /src/server/game/Entities/Object | |
| parent | 8eac7e3fdc3c1bb1f319cc53c3b0f858f17b3901 (diff) | |
Core/Packets: updated update_object structure
Welcome ingame!
Diffstat (limited to 'src/server/game/Entities/Object')
| -rwxr-xr-x | src/server/game/Entities/Object/Object.cpp | 102 | ||||
| -rwxr-xr-x | src/server/game/Entities/Object/Updates/UpdateData.cpp | 39 | ||||
| -rwxr-xr-x | src/server/game/Entities/Object/Updates/UpdateData.h | 13 |
3 files changed, 56 insertions, 98 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 93bf4e241cd..ce10a821ea4 100755 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -250,7 +250,7 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) c void Object::SendUpdateToPlayer(Player* player) { // send create update to player - UpdateData upd; + UpdateData upd(player->GetMapId()); WorldPacket packet; BuildCreateUpdateBlockForPlayer(&upd, player); @@ -296,17 +296,18 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint16 flags) const // 0x20 if (flags & UPDATEFLAG_LIVING) { - ((Unit*)this)->BuildMovementPacket(data); + const Unit* self = ToUnit(); + self->BuildMovementPacket(data); - *data << ((Unit*)this)->GetSpeed(MOVE_WALK); - *data << ((Unit*)this)->GetSpeed(MOVE_RUN); - *data << ((Unit*)this)->GetSpeed(MOVE_SWIM_BACK); - *data << ((Unit*)this)->GetSpeed(MOVE_SWIM); - *data << ((Unit*)this)->GetSpeed(MOVE_RUN_BACK); - *data << ((Unit*)this)->GetSpeed(MOVE_FLIGHT); - *data << ((Unit*)this)->GetSpeed(MOVE_FLIGHT_BACK); - *data << ((Unit*)this)->GetSpeed(MOVE_TURN_RATE); - *data << ((Unit*)this)->GetSpeed(MOVE_PITCH_RATE); + *data << self->GetSpeed(MOVE_WALK); + *data << self->GetSpeed(MOVE_RUN); + *data << self->GetSpeed(MOVE_SWIM_BACK); + *data << self->GetSpeed(MOVE_SWIM); + *data << self->GetSpeed(MOVE_RUN_BACK); + *data << self->GetSpeed(MOVE_FLIGHT); + *data << self->GetSpeed(MOVE_FLIGHT_BACK); + *data << self->GetSpeed(MOVE_TURN_RATE); + *data << self->GetSpeed(MOVE_PITCH_RATE); const Player* player = ToPlayer(); @@ -375,19 +376,20 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint16 flags) const } else { + WorldObject* worldObj = ((WorldObject*)this); if (flags & UPDATEFLAG_POSITION) { *data << uint8(0); // unk PGUID! - *data << ((WorldObject*)this)->GetPositionX(); - *data << ((WorldObject*)this)->GetPositionY(); - *data << ((WorldObject*)this)->GetPositionZ(); - *data << ((WorldObject*)this)->GetPositionX(); - *data << ((WorldObject*)this)->GetPositionY(); - *data << ((WorldObject*)this)->GetPositionZ(); - *data << ((WorldObject*)this)->GetOrientation(); + *data << worldObj->GetPositionX(); + *data << worldObj->GetPositionY(); + *data << worldObj->GetPositionZ(); + *data << worldObj->GetPositionX(); + *data << worldObj->GetPositionY(); + *data << worldObj->GetPositionZ(); + *data << worldObj->GetOrientation(); if (GetTypeId() == TYPEID_CORPSE) - *data << float(((WorldObject*)this)->GetOrientation()); + *data << worldObj->GetOrientation(); else *data << float(0); } @@ -402,58 +404,23 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint16 flags) const *data << (float)0; *data << (float)0; *data << (float)0; - *data << ((WorldObject*)this)->GetOrientation(); + *data << worldObj->GetOrientation(); } else { - *data << ((WorldObject*)this)->GetPositionX(); - *data << ((WorldObject*)this)->GetPositionY(); - *data << ((WorldObject*)this)->GetPositionZ(); - *data << ((WorldObject*)this)->GetOrientation(); + *data << worldObj->GetPositionX(); + *data << worldObj->GetPositionY(); + *data << worldObj->GetPositionZ(); + *data << worldObj->GetOrientation(); } } } } - // 0x8 - if (flags & UPDATEFLAG_LOWGUID) - { - switch (GetTypeId()) - { - case TYPEID_OBJECT: - case TYPEID_ITEM: - case TYPEID_CONTAINER: - case TYPEID_GAMEOBJECT: - case TYPEID_DYNAMICOBJECT: - case TYPEID_CORPSE: - *data << uint32(GetGUIDLow()); // GetGUIDLow() - break; - case TYPEID_UNIT: - *data << uint32(0x0000000B); // unk, can be 0xB or 0xC - break; - case TYPEID_PLAYER: - if (flags & UPDATEFLAG_SELF) - *data << uint32(0x0000002F); // unk, can be 0x15 or 0x22 - else - *data << uint32(0x00000008); // unk, can be 0x7 or 0x8 - break; - default: - *data << uint32(0x00000000); // unk - break; - } - } - - // 0x10 - if (flags & UPDATEFLAG_HIGHGUID) - { - // not high guid - *data << uint32(GetUInt32Value(OBJECT_FIELD_GUID)); // unk - } - // 0x4 if (flags & UPDATEFLAG_HAS_TARGET) // packed guid (current target guid) { - if (Unit* victim = ((Unit*)this)->getVictim()) + if (Unit *victim = this->ToUnit()->getVictim()) data->append(victim->GetPackGUID()); else *data << uint8(0); @@ -472,11 +439,14 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint16 flags) const *data << float(((Creature*)this)->GetOrientation()); // facing adjustment } - // 0x200 - if (flags & UPDATEFLAG_ROTATION) - { - *data << uint64(((GameObject*)this)->GetRotation()); - } + // 0x800 + if (flags & UPDATEFLAG_UNK2) + *data << uint16(0) << uint16(0) << uint16(0); //unk + + + // 0x1000 + if (flags & UPDATEFLAG_UNK3) + *data << uint8(0);//unk counter to read uint32 values } void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask* updateMask, Player* target) const @@ -774,7 +744,7 @@ void Object::BuildFieldsUpdate(Player* player, UpdateDataMapType& data_map) cons if (iter == data_map.end()) { - std::pair<UpdateDataMapType::iterator, bool> p = data_map.insert(UpdateDataMapType::value_type(player, UpdateData())); + std::pair<UpdateDataMapType::iterator, bool> p = data_map.insert(UpdateDataMapType::value_type(player, UpdateData(player->GetMapId()))); ASSERT(p.second); iter = p.first; } diff --git a/src/server/game/Entities/Object/Updates/UpdateData.cpp b/src/server/game/Entities/Object/Updates/UpdateData.cpp index 547c415bc73..7ad98418c7b 100755 --- a/src/server/game/Entities/Object/Updates/UpdateData.cpp +++ b/src/server/game/Entities/Object/Updates/UpdateData.cpp @@ -25,7 +25,7 @@ #include "World.h" #include "zlib.h" -UpdateData::UpdateData() : m_blockCount(0) +UpdateData::UpdateData(uint16 map) : m_blockCount(0), m_map(map) { } @@ -104,44 +104,26 @@ void UpdateData::Compress(void* dst, uint32 *dst_size, void* src, int src_size) bool UpdateData::BuildPacket(WorldPacket* packet) { ASSERT(packet->empty()); // shouldn't happen + packet->Initialize(SMSG_UPDATE_OBJECT, 2 + 4 + (m_outOfRangeGUIDs.empty() ? 0 : 1 + 4 + 9 * m_outOfRangeGUIDs.size()) + m_data.wpos()); - ByteBuffer buf(4 + (m_outOfRangeGUIDs.empty() ? 0 : 1 + 4 + 9 * m_outOfRangeGUIDs.size()) + m_data.wpos()); - - buf << (uint32) (!m_outOfRangeGUIDs.empty() ? m_blockCount + 1 : m_blockCount); + *packet << uint16(m_map); + *packet << uint32(m_blockCount); if (!m_outOfRangeGUIDs.empty()) { - buf << (uint8) UPDATETYPE_OUT_OF_RANGE_OBJECTS; - buf << (uint32) m_outOfRangeGUIDs.size(); + *packet << uint8(UPDATETYPE_OUT_OF_RANGE_OBJECTS); + *packet << uint32(m_outOfRangeGUIDs.size()); for (std::set<uint64>::const_iterator i = m_outOfRangeGUIDs.begin(); i != m_outOfRangeGUIDs.end(); ++i) { - buf.appendPackGUID(*i); + packet->appendPackGUID(*i); } } - buf.append(m_data); - - size_t pSize = buf.wpos(); // use real used data size - - if (pSize > 100) // compress large packets - { - uint32 destsize = compressBound(pSize); - packet->resize(destsize + sizeof(uint32)); - - packet->put<uint32>(0, pSize); - Compress(const_cast<uint8*>(packet->contents()) + sizeof(uint32), &destsize, (void*)buf.contents(), pSize); - if (destsize == 0) - return false; + packet->append(m_data); - packet->resize(destsize + sizeof(uint32)); - packet->SetOpcode(SMSG_COMPRESSED_UPDATE_OBJECT); - } - else // send small packets without compression - { - packet->append(buf); - packet->SetOpcode(SMSG_UPDATE_OBJECT); - } + //if (packet->wpos() > 100) + // compress meee!! return true; } @@ -151,5 +133,6 @@ void UpdateData::Clear() m_data.clear(); m_outOfRangeGUIDs.clear(); m_blockCount = 0; + m_map = 0; } diff --git a/src/server/game/Entities/Object/Updates/UpdateData.h b/src/server/game/Entities/Object/Updates/UpdateData.h index 15bc7c65d4a..526a31f206f 100755 --- a/src/server/game/Entities/Object/Updates/UpdateData.h +++ b/src/server/game/Entities/Object/Updates/UpdateData.h @@ -36,19 +36,23 @@ enum OBJECT_UPDATE_FLAGS UPDATEFLAG_SELF = 0x0001, UPDATEFLAG_TRANSPORT = 0x0002, UPDATEFLAG_HAS_TARGET = 0x0004, - UPDATEFLAG_LOWGUID = 0x0008, - UPDATEFLAG_HIGHGUID = 0x0010, + UPDATEFLAG_UNK1 = 0x0008, + UPDATEFLAG_UNK2 = 0x0010, UPDATEFLAG_LIVING = 0x0020, UPDATEFLAG_HAS_POSITION = 0x0040, UPDATEFLAG_VEHICLE = 0x0080, UPDATEFLAG_POSITION = 0x0100, - UPDATEFLAG_ROTATION = 0x0200 + UPDATEFLAG_ROTATION = 0x0200, + UPDATEFLAG_UNK3 = 0x0400, + UPDATEFLAG_UNK4 = 0x0800, + UPDATEFLAG_UNK5 = 0x1000, + UPDATEFLAG_UNK6 = 0x2000 }; class UpdateData { public: - UpdateData(); + UpdateData(uint16 map); void AddOutOfRangeGUID(std::set<uint64>& guids); void AddOutOfRangeGUID(uint64 guid); @@ -60,6 +64,7 @@ class UpdateData std::set<uint64> const& GetOutOfRangeGUIDs() const { return m_outOfRangeGUIDs; } protected: + uint16 m_map; uint32 m_blockCount; std::set<uint64> m_outOfRangeGUIDs; ByteBuffer m_data; |
