From 57992c4f0d6b219cf9e694efd0f65ac4ab04b4d3 Mon Sep 17 00:00:00 2001 From: Artamedes Date: Tue, 15 Oct 2019 13:11:15 -0400 Subject: [PATCH] Core/PacketIO: Update UpdateFlags for SMSG_UPDATE_OBJECT movement update (#9) * Core/PacketIO: Update UpdateFlags for SMSG_UPDATE_OBJECT movement update * 1 * Core/NetworkOI: corrected connection type for SMSG_MOVE_UPDATE * suggestions --- src/server/game/Entities/Object/Object.cpp | 42 ++++++++++--------- src/server/game/Entities/Object/Object.h | 4 +- .../game/Entities/Object/Updates/UpdateData.h | 34 ++++++++------- src/server/game/Handlers/MovementHandler.cpp | 2 +- .../game/Movement/MovementStructures.cpp | 4 +- src/server/game/Movement/MovementStructures.h | 2 +- src/server/game/Server/Protocol/Opcodes.cpp | 2 +- src/server/game/Server/Protocol/Opcodes.h | 2 +- src/server/scripts/Commands/cs_debug.cpp | 2 +- 9 files changed, 50 insertions(+), 44 deletions(-) diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index c7ec71e5b7f..1deca057ea0 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -174,7 +174,7 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) c return; uint8 updateType = m_isNewObject ? UPDATETYPE_CREATE_OBJECT2 : UPDATETYPE_CREATE_OBJECT; - uint16 flags = m_updateFlag; + uint32 flags = m_updateFlag; /** lower flag1 **/ if (target == this) // building packet for yourself @@ -194,9 +194,14 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) c } if (Unit const* unit = ToUnit()) + { if (unit->GetVictim()) flags |= UPDATEFLAG_HAS_TARGET; + if (unit->HasUnitMovementFlag(MOVEMENTFLAG_HOVER)) + flags |= UPDATEFLAG_PLAY_HOVER_ANIM; + } + ByteBuffer buf(500); buf << uint8(updateType); buf << GetPackGUID(); @@ -312,7 +317,7 @@ ObjectGuid Object::GetGuidValue(uint16 index) const return *((ObjectGuid*)&(m_uint32Values[index])); } -void Object::BuildMovementUpdate(ByteBuffer* data, uint16 flags) const +void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const { Unit const* self = nullptr; ObjectGuid guid = GetGUID(); @@ -329,10 +334,6 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint16 flags) const bool hasAIAnimKit = false; bool hasMovementAnimKit = false; bool hasMeleeAnimKit = false; - bool hasHoverAnim = false; - - if (Unit const* unit = ToUnit()) - hasHoverAnim = unit->HasUnitMovementFlag(MOVEMENTFLAG_HOVER); uint32 stopFrameCount = 0; if (GameObject const* go = ToGameObject()) @@ -340,8 +341,8 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint16 flags) const stopFrameCount = go->GetGOValue()->Transport.StopFrames->size(); // Bit content - data->WriteBit(hasHoverAnim); - data->WriteBit(0); + data->WriteBit(flags & UPDATEFLAG_PLAY_HOVER_ANIM); + data->WriteBit(flags & UPDATEFLAG_SUPPRESSED_GREETINGS); data->WriteBit(flags & UPDATEFLAG_ROTATION); data->WriteBit(flags & UPDATEFLAG_ANIMKITS); data->WriteBit(flags & UPDATEFLAG_HAS_TARGET); @@ -349,11 +350,11 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint16 flags) const data->WriteBit(flags & UPDATEFLAG_VEHICLE); data->WriteBit(flags & UPDATEFLAG_LIVING); data->WriteBits(stopFrameCount, 24); - data->WriteBit(0); + data->WriteBit(flags & UPDATEFLAG_NO_BIRTH_ANIM); data->WriteBit(flags & UPDATEFLAG_GO_TRANSPORT_POSITION); data->WriteBit(flags & UPDATEFLAG_STATIONARY_POSITION); - data->WriteBit(flags & UPDATEFLAG_UNK5); - data->WriteBit(0); + data->WriteBit(flags & UPDATEFLAG_AREATRIGGER); + data->WriteBit(flags & UPDATEFLAG_ENABLE_PORTALS); data->WriteBit(flags & UPDATEFLAG_TRANSPORT); if (flags & UPDATEFLAG_LIVING) @@ -373,7 +374,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint16 flags) const if (GetTypeId() == TYPEID_UNIT) movementFlags &= MOVEMENTFLAG_MASK_CREATURE_ALLOWED; - data->WriteBit(!movementFlags); + data->WriteBit(!movementFlags); // !Has MoveFlags0 data->WriteBit(G3D::fuzzyEq(self->GetOrientation(), 0.0f)); // Has Orientation data->WriteBit(guid[7]); data->WriteBit(guid[3]); @@ -382,24 +383,24 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint16 flags) const data->WriteBits(movementFlags, 30); data->WriteBit(hasSpline && GetTypeId() == TYPEID_PLAYER); // Has spline (from MovementInfo) - data->WriteBit(!hasPitch); // Has pitch + data->WriteBit(!hasPitch); // !Has pitch data->WriteBit(hasSpline); // Has spline data (independent) data->WriteBit(hasFallData); // Has fall data - data->WriteBit(!hasSplineElevation); // Has spline elevation + data->WriteBit(!hasSplineElevation); // !Has spline elevation data->WriteBit(guid[5]); data->WriteBit(self->m_movementInfo.transport.guid); // Has transport data - data->WriteBit(0); // Is missing time + data->WriteBit(0); // !HasTime if (self->m_movementInfo.transport.guid) { ObjectGuid transGuid = self->m_movementInfo.transport.guid; data->WriteBit(transGuid[1]); - data->WriteBit(hasTransportTime2); // Has transport time 2 + data->WriteBit(hasTransportTime2); // Has PrevMoveTime data->WriteBit(transGuid[4]); data->WriteBit(transGuid[0]); data->WriteBit(transGuid[6]); - data->WriteBit(hasVehicleId); // Has transport time 3 + data->WriteBit(hasVehicleId); // Has VehicleRecID data->WriteBit(transGuid[7]); data->WriteBit(transGuid[5]); data->WriteBit(transGuid[3]); @@ -417,8 +418,8 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint16 flags) const data->WriteBit(guid[0]); data->WriteBit(guid[1]); - data->WriteBit(0); - data->WriteBit(!movementFlagsExtra); + data->WriteBit(0); // HeightChangeFailed + data->WriteBit(!movementFlagsExtra); // !Has MoveFlags1 if (movementFlagsExtra) data->WriteBits(movementFlagsExtra, 12); } @@ -586,8 +587,9 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint16 flags) const if (flags & UPDATEFLAG_ROTATION) *data << uint64(ToGameObject()->GetPackedLocalRotation()); - if (flags & UPDATEFLAG_UNK5) + if (flags & UPDATEFLAG_AREATRIGGER) { + // client doesn't use these values, so unk *data << float(0.0f); *data << float(0.0f); *data << float(0.0f); diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 83dc4448c89..6eaf69ad597 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -186,13 +186,13 @@ class TC_GAME_API Object uint32 GetUpdateFieldData(Player const* target, uint32*& flags) const; - void BuildMovementUpdate(ByteBuffer* data, uint16 flags) const; + void BuildMovementUpdate(ByteBuffer* data, uint32 flags) const; virtual void BuildValuesUpdate(uint8 updatetype, ByteBuffer* data, Player* target) const; uint16 m_objectType; TypeID m_objectTypeId; - uint16 m_updateFlag; + uint32 m_updateFlag; union { diff --git a/src/server/game/Entities/Object/Updates/UpdateData.h b/src/server/game/Entities/Object/Updates/UpdateData.h index dc436eb3ce2..04b1e3b3a02 100644 --- a/src/server/game/Entities/Object/Updates/UpdateData.h +++ b/src/server/game/Entities/Object/Updates/UpdateData.h @@ -36,21 +36,25 @@ 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_GO_TRANSPORT_POSITION = 0x0100, - UPDATEFLAG_ROTATION = 0x0200, - UPDATEFLAG_UNK3 = 0x0400, - UPDATEFLAG_ANIMKITS = 0x0800, - UPDATEFLAG_UNK5 = 0x1000, - UPDATEFLAG_UNK6 = 0x2000, + UPDATEFLAG_NONE = 0x00000, + UPDATEFLAG_SELF = 0x00001, + UPDATEFLAG_TRANSPORT = 0x00002, + UPDATEFLAG_HAS_TARGET = 0x00004, + UPDATEFLAG_UNKNOWN = 0x00008, + UPDATEFLAG_LOWGUID = 0x00010, + UPDATEFLAG_LIVING = 0x00020, + UPDATEFLAG_STATIONARY_POSITION = 0x00040, + UPDATEFLAG_VEHICLE = 0x00080, + UPDATEFLAG_GO_TRANSPORT_POSITION = 0x00100, + UPDATEFLAG_ROTATION = 0x00200, + UPDATEFLAG_UNK3 = 0x00400, + UPDATEFLAG_ANIMKITS = 0x00800, + UPDATEFLAG_AREATRIGGER = 0x01000, + UPDATEFLAG_UNK6 = 0x02000, + UPDATEFLAG_PLAY_HOVER_ANIM = 0x04000, + UPDATEFLAG_SUPPRESSED_GREETINGS = 0x08000, + UPDATEFLAG_NO_BIRTH_ANIM = 0x10000, + UPDATEFLAG_ENABLE_PORTALS = 0x20000, }; class UpdateData diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index 33b235df7a1..65e33327f4e 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -422,7 +422,7 @@ void WorldSession::HandleMovementOpcodes(WorldPacket& recvPacket) mover->UpdatePosition(movementInfo.pos); - WorldPacket data(SMSG_PLAYER_MOVE, recvPacket.size()); + WorldPacket data(SMSG_MOVE_UPDATE, recvPacket.size()); mover->WriteMovementInfo(data); mover->SendMessageToSet(&data, _player); diff --git a/src/server/game/Movement/MovementStructures.cpp b/src/server/game/Movement/MovementStructures.cpp index 2861548a96f..5c8efcc0531 100644 --- a/src/server/game/Movement/MovementStructures.cpp +++ b/src/server/game/Movement/MovementStructures.cpp @@ -5435,7 +5435,7 @@ MovementStatusElements const MoveUpdateFlightBackSpeed[] = MSEHasTransportGuidByte7, MSEHasTransportGuidByte6, MSEHasTransportGuidByte0, - MSEOneBit, // has_transport_time + MSEOneBit, // has_transport_time MSEHasTransportGuidByte2, MSEHasTransportGuidByte3, MSEHasTransportGuidByte5, @@ -5704,7 +5704,7 @@ MovementStatusElements const* GetMovementStatusElementsSequence(uint32 opcode) return MovementStopSwim; case MSG_MOVE_STOP_TURN: return MovementStopTurn; - case SMSG_PLAYER_MOVE: + case SMSG_MOVE_UPDATE: return PlayerMove; case CMSG_MOVE_CHNG_TRANSPORT: return MoveChngTransport; diff --git a/src/server/game/Movement/MovementStructures.h b/src/server/game/Movement/MovementStructures.h index 8125703e51e..d882e1129e8 100644 --- a/src/server/game/Movement/MovementStructures.h +++ b/src/server/game/Movement/MovementStructures.h @@ -139,7 +139,7 @@ namespace Movement class PacketSender { public: - PacketSender(Unit* unit, uint16 serverControl, uint16 playerControl, uint16 broadcast = SMSG_PLAYER_MOVE, ExtraMovementStatusElement* extras = nullptr); + PacketSender(Unit* unit, uint16 serverControl, uint16 playerControl, uint16 broadcast = SMSG_MOVE_UPDATE, ExtraMovementStatusElement* extras = nullptr); void Send() const; diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 8b6642d59c9..58fd9753a58 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1052,6 +1052,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_CAN_FLY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_HOVER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_COLLISION_HEIGHT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_FLIGHT_BACK_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_FLIGHT_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); @@ -1113,7 +1114,6 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYERBINDERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYERBOUND, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_DIFFICULTY_CHANGE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_MOVE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_SKINNED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_VEHICLE_DATA, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_DANCE, STATUS_NEVER, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 19a248b3aea..9606adf32e8 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -1008,6 +1008,7 @@ enum OpcodeServer SMSG_MOVE_UNSET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x7DB2, SMSG_MOVE_UNSET_HOVER = 0x51B3, SMSG_MOVE_UNSET_WALK_IN_AIR = 0x0000, + SMSG_MOVE_UPDATE = 0x79A2, SMSG_MOVE_UPDATE_COLLISION_HEIGHT = 0x59A3, SMSG_MOVE_UPDATE_FLIGHT_BACK_SPEED = 0x74A0, SMSG_MOVE_UPDATE_FLIGHT_SPEED = 0x30B1, @@ -1071,7 +1072,6 @@ enum OpcodeServer SMSG_PLAYERBINDERROR = 0x6A24, SMSG_PLAYERBOUND = 0x2516, SMSG_PLAYER_DIFFICULTY_CHANGE = 0x2217, - SMSG_PLAYER_MOVE = 0x79A2, SMSG_PLAYER_SKINNED = 0x0116, SMSG_PLAYER_VEHICLE_DATA = 0x4115, SMSG_PLAY_DANCE = 0x4704, diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index ee49e1e527c..15a6b687d11 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -1402,7 +1402,7 @@ public: target->DestroyForNearbyPlayers(); // Force new SMSG_UPDATE_OBJECT:CreateObject else { - WorldPacket data(SMSG_PLAYER_MOVE); + WorldPacket data(SMSG_MOVE_UPDATE); target->WriteMovementInfo(data); target->SendMessageToSet(&data, true); }