aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Object
diff options
context:
space:
mode:
authorRat <gmstreetrat@gmail.com>2011-11-27 16:06:29 +0100
committerRat <gmstreetrat@gmail.com>2011-11-27 16:06:29 +0100
commit7fdefceb4389eaf7ee6a4ae34a73b861bbcdea5c (patch)
tree78c6bab4e2603d27d29a5d72c04872c708de2970 /src/server/game/Entities/Object
parent8eac7e3fdc3c1bb1f319cc53c3b0f858f17b3901 (diff)
Core/Packets: updated update_object structure
Welcome ingame!
Diffstat (limited to 'src/server/game/Entities/Object')
-rwxr-xr-xsrc/server/game/Entities/Object/Object.cpp102
-rwxr-xr-xsrc/server/game/Entities/Object/Updates/UpdateData.cpp39
-rwxr-xr-xsrc/server/game/Entities/Object/Updates/UpdateData.h13
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;