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 | |
parent | 55bd065ddad8dcf50fcda9128b86a18d1a892072 (diff) |
Core/PacketIO: Updated SMSG_UPDATE_OBJECT structure
Diffstat (limited to 'src')
-rwxr-xr-x | src/server/game/Entities/Corpse/Corpse.cpp | 2 | ||||
-rwxr-xr-x | src/server/game/Entities/DynamicObject/DynamicObject.cpp | 2 | ||||
-rwxr-xr-x | src/server/game/Entities/GameObject/GameObject.cpp | 2 | ||||
-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 | ||||
-rwxr-xr-x | src/server/game/Entities/Unit/Unit.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Handlers/CharacterHandler.cpp | 1 | ||||
-rw-r--r-- | src/server/game/Movement/Spline/MovementPacketBuilder.cpp | 110 | ||||
-rw-r--r-- | src/server/game/Movement/Spline/MovementPacketBuilder.h | 3 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 14 | ||||
-rwxr-xr-x | src/server/game/Server/WorldSocket.cpp | 1 |
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; |