aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2012-07-12 21:20:34 +0200
committerShauren <shauren.trinity@gmail.com>2012-07-12 21:20:34 +0200
commit0b22b329d6d63af4b8ed73e2906c71236349b1bd (patch)
treeebad14a643b7c017e5a5921566788d176c218e51 /src
parent55bd065ddad8dcf50fcda9128b86a18d1a892072 (diff)
Core/PacketIO: Updated SMSG_UPDATE_OBJECT structure
Diffstat (limited to 'src')
-rwxr-xr-xsrc/server/game/Entities/Corpse/Corpse.cpp2
-rwxr-xr-xsrc/server/game/Entities/DynamicObject/DynamicObject.cpp2
-rwxr-xr-xsrc/server/game/Entities/GameObject/GameObject.cpp2
-rwxr-xr-xsrc/server/game/Entities/Object/Object.cpp338
-rwxr-xr-xsrc/server/game/Entities/Object/ObjectDefines.h35
-rwxr-xr-xsrc/server/game/Entities/Object/Updates/UpdateData.cpp4
-rwxr-xr-xsrc/server/game/Entities/Object/Updates/UpdateData.h30
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.cpp2
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp1
-rw-r--r--src/server/game/Movement/Spline/MovementPacketBuilder.cpp110
-rw-r--r--src/server/game/Movement/Spline/MovementPacketBuilder.h3
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp14
-rwxr-xr-xsrc/server/game/Server/WorldSocket.cpp1
13 files changed, 381 insertions, 163 deletions
diff --git a/src/server/game/Entities/Corpse/Corpse.cpp b/src/server/game/Entities/Corpse/Corpse.cpp
index 714be7d7c9e..ae76863c362 100755
--- a/src/server/game/Entities/Corpse/Corpse.cpp
+++ b/src/server/game/Entities/Corpse/Corpse.cpp
@@ -32,7 +32,7 @@ Corpse::Corpse(CorpseType type) : WorldObject(type != CORPSE_BONES)
m_objectType |= TYPEMASK_CORPSE;
m_objectTypeId = TYPEID_CORPSE;
- m_updateFlag = (UPDATEFLAG_STATIONARY_POSITION | UPDATEFLAG_POSITION);
+ m_updateFlag = UPDATEFLAG_STATIONARY_POSITION;
m_valuesCount = CORPSE_END;
diff --git a/src/server/game/Entities/DynamicObject/DynamicObject.cpp b/src/server/game/Entities/DynamicObject/DynamicObject.cpp
index 8dcafa3b2ae..23257b34758 100755
--- a/src/server/game/Entities/DynamicObject/DynamicObject.cpp
+++ b/src/server/game/Entities/DynamicObject/DynamicObject.cpp
@@ -33,7 +33,7 @@ DynamicObject::DynamicObject(bool isWorldObject) : WorldObject(isWorldObject),
m_objectType |= TYPEMASK_DYNAMICOBJECT;
m_objectTypeId = TYPEID_DYNAMICOBJECT;
- m_updateFlag = (UPDATEFLAG_STATIONARY_POSITION | UPDATEFLAG_POSITION);
+ m_updateFlag = UPDATEFLAG_STATIONARY_POSITION;
m_valuesCount = DYNAMICOBJECT_END;
}
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index 2a74d262daf..d20102e3081 100755
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -38,7 +38,7 @@ GameObject::GameObject() : WorldObject(false), m_model(NULL), m_goValue(new Game
m_objectType |= TYPEMASK_GAMEOBJECT;
m_objectTypeId = TYPEID_GAMEOBJECT;
- m_updateFlag = (UPDATEFLAG_STATIONARY_POSITION | UPDATEFLAG_POSITION | UPDATEFLAG_ROTATION);
+ m_updateFlag = (UPDATEFLAG_STATIONARY_POSITION | UPDATEFLAG_ROTATION);
m_valuesCount = GAMEOBJECT_END;
m_respawnTime = 0;
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
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 1926976cf04..743431849ab 100755
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -164,7 +164,7 @@ m_HostileRefManager(this)
m_objectType |= TYPEMASK_UNIT;
m_objectTypeId = TYPEID_UNIT;
- m_updateFlag = (UPDATEFLAG_LIVING | UPDATEFLAG_STATIONARY_POSITION);
+ m_updateFlag = UPDATEFLAG_LIVING;
m_attackTimer[BASE_ATTACK] = 0;
m_attackTimer[OFF_ATTACK] = 0;
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp
index 7800a06024f..f1e33aa708b 100644
--- a/src/server/game/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Handlers/CharacterHandler.cpp
@@ -945,6 +945,7 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder)
data.Initialize(SMSG_HOTFIX_INFO);
HotfixData const& hotfix = sObjectMgr->GetHotfixData();
data.WriteBits(hotfix.size(), 22);
+ data.FlushBits();
for (uint32 i = 0; i < hotfix.size(); ++i)
{
data << uint32(hotfix[i].Type);
diff --git a/src/server/game/Movement/Spline/MovementPacketBuilder.cpp b/src/server/game/Movement/Spline/MovementPacketBuilder.cpp
index 8aef671d2d1..2cf7bd6e2bb 100644
--- a/src/server/game/Movement/Spline/MovementPacketBuilder.cpp
+++ b/src/server/game/Movement/Spline/MovementPacketBuilder.cpp
@@ -139,44 +139,94 @@ namespace Movement
WriteLinearPath(spline, data);
}
- void PacketBuilder::WriteCreate(const MoveSpline& move_spline, ByteBuffer& data)
+ void PacketBuilder::WriteCreateBits(MoveSpline const& moveSpline, ByteBuffer& data)
{
- //WriteClientStatus(mov,data);
- //data.append<float>(&mov.m_float_values[SpeedWalk], SpeedMaxCount);
- //if (mov.SplineEnabled())
+ data.WriteBits(uint8(moveSpline.spline.mode()), 2);
+ data.WriteBit(moveSpline.splineflags & (MoveSplineFlag::Parabolic | MoveSplineFlag::Animation));
+ data.WriteBits(moveSpline.getPath().size(), 22);
+ switch (moveSpline.splineflags & MoveSplineFlag::Mask_Final_Facing)
{
- MoveSplineFlag splineFlags = move_spline.splineflags;
-
- data << splineFlags.raw();
-
- if (splineFlags.final_angle)
- {
- data << move_spline.facing.angle;
- }
- else if (splineFlags.final_target)
- {
- data << move_spline.facing.target;
- }
- else if (splineFlags.final_point)
+ case MoveSplineFlag::Final_Target:
{
- data << move_spline.facing.f.x << move_spline.facing.f.y << move_spline.facing.f.z;
+ ObjectGuid targetGuid = moveSpline.facing.target;
+ data.WriteBits(2, 2);
+ data.WriteBit(targetGuid[4]);
+ data.WriteBit(targetGuid[3]);
+ data.WriteBit(targetGuid[7]);
+ data.WriteBit(targetGuid[2]);
+ data.WriteBit(targetGuid[6]);
+ data.WriteBit(targetGuid[1]);
+ data.WriteBit(targetGuid[0]);
+ data.WriteBit(targetGuid[5]);
+ break;
}
+ case MoveSplineFlag::Final_Angle:
+ data.WriteBits(0, 2);
+ break;
+ case MoveSplineFlag::Final_Point:
+ data.WriteBits(1, 2);
+ break;
+ default:
+ data.WriteBits(3, 2);
+ break;
+ }
+
+ data.WriteBit((moveSpline.splineflags & MoveSplineFlag::Parabolic) && moveSpline.effect_start_time < moveSpline.Duration());
+ data.WriteBits(moveSpline.splineflags.raw(), 25);
+ }
+
+ void PacketBuilder::WriteCreateData(MoveSpline const& moveSpline, ByteBuffer& data)
+ {
+ MoveSplineFlag splineFlags = moveSpline.splineflags;
+
+ if ((splineFlags & MoveSplineFlag::Parabolic) && moveSpline.effect_start_time < moveSpline.Duration())
+ data << moveSpline.vertical_acceleration; // added in 3.1
+
+ data << moveSpline.timePassed();
+
+ if (splineFlags.final_angle)
+ data << moveSpline.facing.angle;
+ else if (splineFlags.final_target)
+ {
+ ObjectGuid facingGuid = moveSpline.facing.target;
+ data.WriteByteSeq(facingGuid[5]);
+ data.WriteByteSeq(facingGuid[3]);
+ data.WriteByteSeq(facingGuid[7]);
+ data.WriteByteSeq(facingGuid[1]);
+ data.WriteByteSeq(facingGuid[6]);
+ data.WriteByteSeq(facingGuid[5]);
+ data.WriteByteSeq(facingGuid[2]);
+ data.WriteByteSeq(facingGuid[0]);
+ }
+
+ uint32 nodes = moveSpline.getPath().size();
+ for (uint32 i = 0; i < nodes; ++i)
+ {
+ data << float(moveSpline.getPath()[i].z);
+ data << float(moveSpline.getPath()[i].x);
+ data << float(moveSpline.getPath()[i].y);
+ }
- data << move_spline.timePassed();
- data << move_spline.Duration();
- data << move_spline.GetId();
+ if (splineFlags.final_point)
+ data << moveSpline.facing.f.x << moveSpline.facing.f.z << moveSpline.facing.f.y;
- data << float(1.f); // splineInfo.duration_mod; added in 3.1
- data << float(1.f); // splineInfo.duration_mod_next; added in 3.1
+ data << float(1.f); // splineInfo.duration_mod_next; added in 3.1
+ data << moveSpline.Duration();
+ if (splineFlags & (MoveSplineFlag::Parabolic | MoveSplineFlag::Animation))
+ data << moveSpline.effect_start_time; // added in 3.1
- data << move_spline.vertical_acceleration; // added in 3.1
- data << move_spline.effect_start_time; // added in 3.1
+ data << float(1.f); // splineInfo.duration_mod; added in 3.1
- uint32 nodes = move_spline.getPath().size();
- data << nodes;
- data.append<Vector3>(&move_spline.getPath()[0], nodes);
- data << uint8(move_spline.spline.mode()); // added in 3.1
- data << (move_spline.isCyclic() ? Vector3::zero() : move_spline.FinalDestination());
+ if (!moveSpline.isCyclic())
+ {
+ Vector3 dest = moveSpline.FinalDestination();
+ data << float(dest.z);
+ data << float(dest.x);
+ data << float(dest.y);
}
+ else
+ data << Vector3::zero();
+
+ data << moveSpline.GetId();
}
}
diff --git a/src/server/game/Movement/Spline/MovementPacketBuilder.h b/src/server/game/Movement/Spline/MovementPacketBuilder.h
index 92a414e9b3b..a6e4e4d5d04 100644
--- a/src/server/game/Movement/Spline/MovementPacketBuilder.h
+++ b/src/server/game/Movement/Spline/MovementPacketBuilder.h
@@ -31,7 +31,8 @@ namespace Movement
public:
static void WriteMonsterMove(const MoveSpline& mov, WorldPacket& data);
- static void WriteCreate(const MoveSpline& mov, ByteBuffer& data);
+ static void WriteCreateBits(MoveSpline const& moveSpline, ByteBuffer& data);
+ static void WriteCreateData(MoveSpline const& moveSpline, ByteBuffer& data);
};
}
#endif // TRINITYSERVER_PACKET_BUILDER_H
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index cda598a5c11..328311f99ee 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -210,7 +210,7 @@ void InitOpcodes()
//DEFINE_OPCODE_HANDLER(CMSG_CREATEGAMEOBJECT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(CMSG_CREATEITEM, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(CMSG_CREATEMONSTER, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- //DEFINE_OPCODE_HANDLER(CMSG_CREATURE_QUERY, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleCreatureQueryOpcode );
+ DEFINE_OPCODE_HANDLER(CMSG_CREATURE_QUERY, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleCreatureQueryOpcode );
//DEFINE_OPCODE_HANDLER(CMSG_DANCE_QUERY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(CMSG_DBLOOKUP, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(CMSG_DEBUG_ACTIONS_START, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
@@ -257,7 +257,7 @@ void InitOpcodes()
//DEFINE_OPCODE_HANDLER(CMSG_FORCE_MOVE_ROOT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveRootAck );
//DEFINE_OPCODE_HANDLER(CMSG_FORCE_MOVE_UNROOT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveUnRootAck );
//DEFINE_OPCODE_HANDLER(CMSG_FORCE_SAY_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- //DEFINE_OPCODE_HANDLER(CMSG_GAMEOBJECT_QUERY, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleGameObjectQueryOpcode );
+ DEFINE_OPCODE_HANDLER(CMSG_GAMEOBJECT_QUERY, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleGameObjectQueryOpcode );
//DEFINE_OPCODE_HANDLER(CMSG_GAMEOBJ_REPORT_USE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGameobjectReportUse );
//DEFINE_OPCODE_HANDLER(CMSG_GAMEOBJ_USE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGameObjectUseOpcode );
//DEFINE_OPCODE_HANDLER(CMSG_GAMESPEED_SET, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
@@ -384,7 +384,7 @@ void InitOpcodes()
DEFINE_OPCODE_HANDLER(CMSG_LOAD_SCREEN, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleLoadScreenOpcode );
//DEFINE_OPCODE_HANDLER(CMSG_LOGOUT_CANCEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLogoutCancelOpcode );
//DEFINE_OPCODE_HANDLER(CMSG_LOGOUT_REQUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLogoutRequestOpcode );
- //DEFINE_OPCODE_HANDLER(CMSG_LOG_DISCONNECT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_EarlyProccess );
+ DEFINE_OPCODE_HANDLER(CMSG_LOG_DISCONNECT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_EarlyProccess );
//DEFINE_OPCODE_HANDLER(CMSG_LOOT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLootOpcode );
//DEFINE_OPCODE_HANDLER(CMSG_LOOT_MASTER_GIVE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLootMasterGiveOpcode );
//DEFINE_OPCODE_HANDLER(CMSG_LOOT_METHOD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLootMethodOpcode );
@@ -777,7 +777,7 @@ void InitOpcodes()
DEFINE_OPCODE_HANDLER(MSG_SET_RAID_DIFFICULTY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetRaidDifficultyOpcode );
//DEFINE_OPCODE_HANDLER(MSG_TABARDVENDOR_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleTabardVendorActivateOpcode);
//DEFINE_OPCODE_HANDLER(MSG_TALENT_WIPE_CONFIRM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleTalentWipeConfirmOpcode );
- //DEFINE_OPCODE_HANDLER(MSG_VERIFY_CONNECTIVITY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_EarlyProccess );
+ DEFINE_OPCODE_HANDLER(MSG_VERIFY_CONNECTIVITY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_EarlyProccess );
//DEFINE_OPCODE_HANDLER(MSG_VIEW_PHASE_SHIFT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER(SMSG_ACCOUNT_DATA_TIMES, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
DEFINE_OPCODE_HANDLER(SMSG_ACHIEVEMENT_DELETED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
@@ -917,7 +917,7 @@ void InitOpcodes()
//DEFINE_OPCODE_HANDLER(SMSG_CORPSE_IS_NOT_IN_INSTANCE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_CORPSE_MAP_POSITION_QUERY_RESPONSE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
DEFINE_OPCODE_HANDLER(SMSG_CORPSE_RECLAIM_DELAY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
- //DEFINE_OPCODE_HANDLER(SMSG_CREATURE_QUERY_RESPONSE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
+ DEFINE_OPCODE_HANDLER(SMSG_CREATURE_QUERY_RESPONSE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
DEFINE_OPCODE_HANDLER(SMSG_CRITERIA_DELETED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
DEFINE_OPCODE_HANDLER(SMSG_CRITERIA_UPDATE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_CROSSED_INEBRIATION_THRESHOLD, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
@@ -970,7 +970,7 @@ void InitOpcodes()
//DEFINE_OPCODE_HANDLER(SMSG_GAMEOBJECT_CUSTOM_ANIM, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_GAMEOBJECT_DESPAWN_ANIM, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_GAMEOBJECT_PAGETEXT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
- //DEFINE_OPCODE_HANDLER(SMSG_GAMEOBJECT_QUERY_RESPONSE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
+ DEFINE_OPCODE_HANDLER(SMSG_GAMEOBJECT_QUERY_RESPONSE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_GAMEOBJECT_RESET_STATE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_GAMESPEED_SET, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_GAMETIMEBIAS_SET, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
@@ -1365,7 +1365,7 @@ void InitOpcodes()
//DEFINE_OPCODE_HANDLER(SMSG_UPDATE_INSTANCE_OWNERSHIP, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_UPDATE_ITEM_ENCHANTMENTS, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_UPDATE_LAST_INSTANCE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
- //DEFINE_OPCODE_HANDLER(SMSG_UPDATE_OBJECT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
+ DEFINE_OPCODE_HANDLER(SMSG_UPDATE_OBJECT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
DEFINE_OPCODE_HANDLER(SMSG_UPDATE_WORLD_STATE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_USERLIST_ADD, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_USERLIST_REMOVE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp
index 78d18fe27f5..e1d3d2c1412 100755
--- a/src/server/game/Server/WorldSocket.cpp
+++ b/src/server/game/Server/WorldSocket.cpp
@@ -690,6 +690,7 @@ int WorldSocket::ProcessIncoming(WorldPacket* new_pct)
sScriptMgr->OnPacketReceive(this, WorldPacket(*new_pct));
return 0;
case CMSG_LOG_DISCONNECT:
+ new_pct->rfinish(); // contains uint32 disconnectReason;
sLog->outStaticDebug("CMSG_LOG_DISCONNECT , size: " UI64FMTD, uint64(new_pct->size()));
sScriptMgr->OnPacketReceive(this, WorldPacket(*new_pct));
return 0;