diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Handlers/VehicleHandler.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Movement/MovementStructures.cpp | 27 | ||||
-rw-r--r-- | src/server/game/Movement/MovementStructures.h | 11 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 6 |
5 files changed, 42 insertions, 8 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 1c8f1dc552d..22c91aefc54 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -16242,7 +16242,7 @@ void Unit::ReadMovementInfo(WorldPacket& data, MovementInfo* mi, Movement::Extra extras->ReadNextElement(data); break; default: - ASSERT(false && "Incorrect sequence element detected at ReadMovementInfo"); + ASSERT(Movement::PrintInvalidSequenceElement(element, __FUNCTION__)); break; } } @@ -16551,7 +16551,7 @@ void Unit::WriteMovementInfo(WorldPacket& data, Movement::ExtraMovementStatusEle extras->WriteNextElement(data); break; default: - ASSERT(false && "Incorrect sequence element detected at ReadMovementInfo"); + ASSERT(Movement::PrintInvalidSequenceElement(element, __FUNCTION__)); break; } } diff --git a/src/server/game/Handlers/VehicleHandler.cpp b/src/server/game/Handlers/VehicleHandler.cpp index f16e708d4c1..d4965321550 100644 --- a/src/server/game/Handlers/VehicleHandler.cpp +++ b/src/server/game/Handlers/VehicleHandler.cpp @@ -77,8 +77,8 @@ void WorldSession::HandleChangeSeatsOnControlledVehicle(WorldPacket& recvData) static MovementStatusElements const accessoryGuid[] = { MSEExtraInt8, - MSEHasGuidByte4, MSEHasGuidByte2, + MSEHasGuidByte4, MSEHasGuidByte7, MSEHasGuidByte6, MSEHasGuidByte5, diff --git a/src/server/game/Movement/MovementStructures.cpp b/src/server/game/Movement/MovementStructures.cpp index 0b41fe2a14b..f886b5aa1f6 100644 --- a/src/server/game/Movement/MovementStructures.cpp +++ b/src/server/game/Movement/MovementStructures.cpp @@ -2462,16 +2462,25 @@ MovementStatusElements MovementUpdateRunSpeed[] = MSEPositionY, MSEExtraElement, MSEHasGuidByte6, + MSEHasMovementFlags2, + MSEHasPitch, MSEHasGuidByte2, MSEHasGuidByte5, + MSEHasSplineElevation, + MSEHasSpline, MSEHasMovementFlags, + MSEHasTimestamp, MSEHasGuidByte1, + MSEMovementFlags2, MSEHasGuidByte3, MSEMovementFlags, MSEHasGuidByte7, MSEHasGuidByte0, MSEHasOrientation, + MSEHasTransportData, MSEHasTransportGuidByte5, + MSEHasTransportTime2, + MSEHasTransportTime3, MSEHasTransportGuidByte7, MSEHasTransportGuidByte4, MSEHasTransportGuidByte2, @@ -2479,6 +2488,7 @@ MovementStatusElements MovementUpdateRunSpeed[] = MSEHasTransportGuidByte6, MSEHasTransportGuidByte1, MSEHasTransportGuidByte0, + MSEHasFallData, MSEHasFallDirection, MSEHasGuidByte4, MSEZeroBit, @@ -2492,9 +2502,11 @@ MovementStatusElements MovementUpdateRunSpeed[] = MSETransportTime, MSETransportGuidByte7, MSETransportSeat, + MSETransportTime2, MSETransportPositionY, MSETransportGuidByte3, MSETransportGuidByte2, + MSETransportTime3, MSETransportPositionZ, MSETimestamp, MSEFallSinAngle, @@ -2504,6 +2516,7 @@ MovementStatusElements MovementUpdateRunSpeed[] = MSEFallTime, MSEPitch, MSEGuidByte6, + MSESplineElevation, MSEGuidByte5, MSEGuidByte7, MSEGuidByte4, @@ -4928,11 +4941,11 @@ void Movement::ExtraMovementStatusElement::ReadNextElement(ByteBuffer& packet) packet >> Data.byteData; break; default: + ASSERT(PrintInvalidSequenceElement(element, __FUNCTION__)); break; } } - void Movement::ExtraMovementStatusElement::WriteNextElement(ByteBuffer& packet) { MovementStatusElements element = _elements[_index++]; @@ -4958,10 +4971,17 @@ void Movement::ExtraMovementStatusElement::WriteNextElement(ByteBuffer& packet) packet << Data.byteData; break; default: + ASSERT(PrintInvalidSequenceElement(element, __FUNCTION__)); break; } } +bool Movement::PrintInvalidSequenceElement(MovementStatusElements element, char const* function) +{ + sLog->outError(LOG_FILTER_UNITS, "Incorrect sequence element %d detected at %s", element, function); + return false; +} + Movement::PacketSender::PacketSender(Unit* unit, Opcodes serverControl, Opcodes playerControl, Opcodes broadcast /*= SMSG_PLAYER_MOVE*/, ExtraMovementStatusElement* extras /*= NULL*/) : _unit(unit), _extraElements(extras) { @@ -4989,6 +5009,10 @@ void Movement::PacketSender::Send() const if (_broadcast != NULL_OPCODE) { + ///! Need to reset current extra element index before writing another packet + if (_extraElements) + _extraElements->ResetIndex(); + WorldPacket data(_broadcast); _unit->WriteMovementInfo(data, _extraElements); _unit->SendMessageToSet(&data, !isPlayerMovement); @@ -5179,6 +5203,7 @@ MovementStatusElements* GetMovementStatusElementsSequence(Opcodes opcode) return ChangeSeatsOnControlledVehicle; case CMSG_CAST_SPELL: case CMSG_PET_CAST_SPELL: + case CMSG_USE_ITEM: return CastSpellEmbeddedMovement; default: break; diff --git a/src/server/game/Movement/MovementStructures.h b/src/server/game/Movement/MovementStructures.h index daf00c37d3c..bddb8cb79c2 100644 --- a/src/server/game/Movement/MovementStructures.h +++ b/src/server/game/Movement/MovementStructures.h @@ -95,7 +95,7 @@ enum MovementStatusElements MSEZeroBit, // writes bit value 1 or skips read bit MSEOneBit, // writes bit value 0 or skips read bit MSEEnd, // marks end of parsing - MSEExtraElement, // Used to sinalize reading into ExtraMovementStatusElement, element sequence inside it is declared as separate array + MSEExtraElement, // Used to signalize reading into ExtraMovementStatusElement, element sequence inside it is declared as separate array // Allowed internal elements are: GUID markers (not transport), MSEExtraFloat, MSEExtraInt8 MSEExtraFloat, MSEExtraInt8, @@ -104,8 +104,12 @@ enum MovementStatusElements namespace Movement { + class PacketSender; + class ExtraMovementStatusElement { + friend class PacketSender; + public: ExtraMovementStatusElement(MovementStatusElements const* elements) : _elements(elements), _index(0) { } @@ -119,6 +123,9 @@ namespace Movement int8 byteData; } Data; + protected: + void ResetIndex() { _index = 0; } + private: MovementStatusElements const* _elements; uint32 _index; @@ -137,6 +144,8 @@ namespace Movement Opcodes _selfOpcode; Opcodes _broadcast; }; + + bool PrintInvalidSequenceElement(MovementStatusElements element, char const* function); } MovementStatusElements* GetMovementStatusElementsSequence(Opcodes opcode); diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 0684c291c27..af76a6ad0d8 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1012,14 +1012,14 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER(SMSG_MOVE_UNSET_HOVER, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_MOVE_UPDATE_COLLISION_HEIGHT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_MOVE_UPDATE_FLIGHT_BACK_SPEED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - DEFINE_OPCODE_HANDLER(SMSG_MOVE_UPDATE_FLIGHT_SPEED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + DEFINE_OPCODE_HANDLER(SMSG_MOVE_UPDATE_FLIGHT_SPEED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(SMSG_MOVE_UPDATE_KNOCK_BACK, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_MOVE_UPDATE_PITCH_RATE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_MOVE_UPDATE_RUN_BACK_SPEED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - DEFINE_OPCODE_HANDLER(SMSG_MOVE_UPDATE_RUN_SPEED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + DEFINE_OPCODE_HANDLER(SMSG_MOVE_UPDATE_RUN_SPEED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(SMSG_MOVE_UPDATE_SWIM_BACK_SPEED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_MOVE_UPDATE_SWIM_SPEED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - DEFINE_OPCODE_HANDLER(SMSG_MOVE_UPDATE_TELEPORT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + DEFINE_OPCODE_HANDLER(SMSG_MOVE_UPDATE_TELEPORT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(SMSG_MOVE_UPDATE_TURN_RATE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_MOVE_UPDATE_WALK_SPEED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_MOVE_WATER_WALK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); |