diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/game/Handlers/SpellHandler.cpp | 3 | ||||
| -rw-r--r-- | src/server/game/Handlers/VehicleHandler.cpp | 41 | ||||
| -rw-r--r-- | src/server/game/Movement/MovementStructures.cpp | 190 | ||||
| -rw-r--r-- | src/server/game/Movement/MovementStructures.h | 4 | ||||
| -rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 2 |
5 files changed, 217 insertions, 23 deletions
diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index 6ec94e4bf52..16bc5965beb 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -51,10 +51,7 @@ void WorldSession::HandleClientCastFlags(WorldPacket& recvPacket, uint8 castFlag uint8 hasMovementData; recvPacket >> hasMovementData; if (hasMovementData) - { - recvPacket.SetOpcode(Opcodes(recvPacket.read<uint32>())); HandleMovementOpcodes(recvPacket); - } } else if (castFlags & 0x8) // Archaeology { diff --git a/src/server/game/Handlers/VehicleHandler.cpp b/src/server/game/Handlers/VehicleHandler.cpp index ff277f2607b..f16e708d4c1 100644 --- a/src/server/game/Handlers/VehicleHandler.cpp +++ b/src/server/game/Handlers/VehicleHandler.cpp @@ -22,6 +22,7 @@ #include "Player.h" #include "Log.h" #include "ObjectAccessor.h" +#include "MovementStructures.h" void WorldSession::HandleDismissControlledVehicle(WorldPacket &recvData) { @@ -71,22 +72,38 @@ void WorldSession::HandleChangeSeatsOnControlledVehicle(WorldPacket& recvData) case CMSG_REQUEST_VEHICLE_NEXT_SEAT: GetPlayer()->ChangeSeat(-1, true); break; - /*case CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE: + case CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE: { - uint64 guid; // current vehicle guid - recvData.readPackGUID(guid); - + static MovementStatusElements const accessoryGuid[] = + { + MSEExtraInt8, + MSEHasGuidByte4, + MSEHasGuidByte2, + MSEHasGuidByte7, + MSEHasGuidByte6, + MSEHasGuidByte5, + MSEHasGuidByte0, + MSEHasGuidByte1, + MSEHasGuidByte3, + MSEGuidByte6, + MSEGuidByte1, + MSEGuidByte2, + MSEGuidByte5, + MSEGuidByte3, + MSEGuidByte0, + MSEGuidByte4, + MSEGuidByte7, + }; + + Movement::ExtraMovementStatusElement extra(accessoryGuid); MovementInfo movementInfo; - ReadMovementInfo(recvData, &movementInfo); + GetPlayer()->ReadMovementInfo(recvData, &movementInfo, &extra); vehicle_base->m_movementInfo = movementInfo; - uint64 accessory; // accessory guid - recvData.readPackGUID(accessory); + uint64 accessory = extra.Data.guid; + int8 seatId = extra.Data.byteData; - int8 seatId; - recvData >> seatId; - - if (vehicle_base->GetGUID() != guid) + if (vehicle_base->GetGUID() != movementInfo.guid) return; if (!accessory) @@ -98,7 +115,7 @@ void WorldSession::HandleChangeSeatsOnControlledVehicle(WorldPacket& recvData) vehUnit->HandleSpellClick(GetPlayer(), seatId); } break; - }*/ + } case CMSG_REQUEST_VEHICLE_SWITCH_SEAT: { uint64 guid; // current vehicle guid diff --git a/src/server/game/Movement/MovementStructures.cpp b/src/server/game/Movement/MovementStructures.cpp index d1bc5f20b9f..0b41fe2a14b 100644 --- a/src/server/game/Movement/MovementStructures.cpp +++ b/src/server/game/Movement/MovementStructures.cpp @@ -4742,6 +4742,167 @@ MovementStatusElements MoveNormalFall[] = MSEEnd, }; +MovementStatusElements ChangeSeatsOnControlledVehicle[] = +{ + MSEPositionY, + MSEPositionX, + MSEPositionZ, + MSEExtraElement, + MSEHasMovementFlags, + MSEHasTransportData, + MSEHasGuidByte2, + MSEHasGuidByte6, + MSEHasGuidByte4, + MSEExtraElement, + MSEExtraElement, + MSEHasOrientation, + MSEZeroBit, + MSEExtraElement, + MSEHasGuidByte7, + MSEExtraElement, + MSEHasTimestamp, + MSEHasSplineElevation, + MSEHasGuidByte5, + MSEExtraElement, + MSEHasMovementFlags2, + MSEHasPitch, + MSEExtraElement, + MSEHasGuidByte0, + MSEExtraElement, + MSEHasFallData, + MSEHasGuidByte1, + MSEHasSpline, + MSEMovementFlags, + MSEExtraElement, + MSEHasGuidByte3, + MSEHasTransportGuidByte3, + MSEHasTransportGuidByte0, + MSEHasTransportGuidByte7, + MSEHasTransportGuidByte5, + MSEHasTransportTime3, + MSEHasTransportGuidByte1, + MSEHasTransportGuidByte2, + MSEHasTransportTime2, + MSEHasTransportGuidByte4, + MSEHasTransportGuidByte6, + MSEMovementFlags2, + MSEHasFallDirection, + MSEExtraElement, + MSEGuidByte7, + MSEGuidByte5, + MSEExtraElement, + MSEExtraElement, + MSEGuidByte6, + MSEExtraElement, + MSEExtraElement, + MSEGuidByte3, + MSEExtraElement, + MSEGuidByte0, + MSEExtraElement, + MSEGuidByte4, + MSEGuidByte1, + MSEExtraElement, + MSEGuidByte2, + MSEPitch, + MSEFallSinAngle, + MSEFallCosAngle, + MSEFallHorizontalSpeed, + MSEFallTime, + MSEFallVerticalSpeed, + MSETransportGuidByte2, + MSETransportTime2, + MSETransportTime3, + MSETransportGuidByte0, + MSETransportTime, + MSETransportSeat, + MSETransportPositionX, + MSETransportOrientation, + MSETransportGuidByte7, + MSETransportGuidByte4, + MSETransportGuidByte3, + MSETransportGuidByte5, + MSETransportPositionZ, + MSETransportGuidByte1, + MSETransportGuidByte6, + MSETransportPositionY, + MSESplineElevation, + MSEOrientation, + MSETimestamp, + MSEEnd, +}; + +MovementStatusElements CastSpellEmbeddedMovement[] = +{ + MSEPositionZ, + MSEPositionY, + MSEPositionX, + MSEHasFallData, + MSEHasTimestamp, + MSEHasOrientation, + MSEZeroBit, + MSEHasSpline, + MSEHasGuidByte6, + MSEHasGuidByte4, + MSEHasMovementFlags2, + MSEHasGuidByte3, + MSEHasGuidByte5, + MSEHasSplineElevation, + MSEHasPitch, + MSEHasGuidByte7, + MSEHasTransportData, + MSEHasGuidByte2, + MSEHasMovementFlags, + MSEHasGuidByte1, + MSEHasGuidByte0, + MSEHasTransportGuidByte6, + MSEHasTransportGuidByte2, + MSEHasTransportGuidByte5, + MSEHasTransportTime2, + MSEHasTransportGuidByte7, + MSEHasTransportGuidByte4, + MSEHasTransportTime3, + MSEHasTransportGuidByte0, + MSEHasTransportGuidByte1, + MSEHasTransportGuidByte3, + MSEMovementFlags2, + MSEMovementFlags, + MSEHasFallDirection, + MSEGuidByte1, + MSEGuidByte4, + MSEGuidByte7, + MSEGuidByte3, + MSEGuidByte0, + MSEGuidByte2, + MSEGuidByte5, + MSEGuidByte6, + MSETransportSeat, + MSETransportOrientation, + MSETransportTime, + MSETransportGuidByte6, + MSETransportGuidByte5, + MSETransportTime3, + MSETransportPositionX, + MSETransportGuidByte4, + MSETransportPositionZ, + MSETransportGuidByte2, + MSETransportGuidByte0, + MSETransportTime2, + MSETransportGuidByte1, + MSETransportGuidByte3, + MSETransportPositionY, + MSETransportGuidByte7, + MSEOrientation, + MSESplineElevation, + MSEFallTime, + MSEFallHorizontalSpeed, + MSEFallCosAngle, + MSEFallSinAngle, + MSEFallVerticalSpeed, + MSETimestamp, + MSEPitch, + MSEEnd, +}; + void Movement::ExtraMovementStatusElement::ReadNextElement(ByteBuffer& packet) { MovementStatusElements element = _elements[_index++]; @@ -4758,10 +4919,16 @@ void Movement::ExtraMovementStatusElement::ReadNextElement(ByteBuffer& packet) return; } - if (element == MSEExtraFloat) + switch (element) { - packet >> Data.floatData; - return; + case MSEExtraFloat: + packet >> Data.floatData; + break; + case MSEExtraInt8: + packet >> Data.byteData; + break; + default: + break; } } @@ -4782,10 +4949,16 @@ void Movement::ExtraMovementStatusElement::WriteNextElement(ByteBuffer& packet) return; } - if (element == MSEExtraFloat) + switch (element) { - packet << Data.floatData; - return; + case MSEExtraFloat: + packet << Data.floatData; + break; + case MSEExtraInt8: + packet << Data.byteData; + break; + default: + break; } } @@ -5002,6 +5175,11 @@ MovementStatusElements* GetMovementStatusElementsSequence(Opcodes opcode) return MoveFeatherFall; case SMSG_MOVE_NORMAL_FALL: return MoveNormalFall; + case CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE: + return ChangeSeatsOnControlledVehicle; + case CMSG_CAST_SPELL: + case CMSG_PET_CAST_SPELL: + return CastSpellEmbeddedMovement; default: break; } diff --git a/src/server/game/Movement/MovementStructures.h b/src/server/game/Movement/MovementStructures.h index 7269b36c3f2..daf00c37d3c 100644 --- a/src/server/game/Movement/MovementStructures.h +++ b/src/server/game/Movement/MovementStructures.h @@ -96,8 +96,9 @@ enum MovementStatusElements 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 - // Allowed internal elements are: GUID markers (not transport) and MSEExtraFloat + // Allowed internal elements are: GUID markers (not transport), MSEExtraFloat, MSEExtraInt8 MSEExtraFloat, + MSEExtraInt8, MSE_COUNT }; @@ -115,6 +116,7 @@ namespace Movement { ObjectGuid guid; float floatData; + int8 byteData; } Data; private: diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index b6e373e92d9..0684c291c27 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -142,7 +142,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER(CMSG_CANCEL_TRADE, STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT, PROCESS_THREADUNSAFE, &WorldSession::HandleCancelTradeOpcode); DEFINE_OPCODE_HANDLER(CMSG_CAST_SPELL, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleCastSpellOpcode ); DEFINE_OPCODE_HANDLER(CMSG_CHANGEPLAYER_DIFFICULTY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - DEFINE_OPCODE_HANDLER(CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChangeSeatsOnControlledVehicle); + DEFINE_OPCODE_HANDLER(CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChangeSeatsOnControlledVehicle); DEFINE_OPCODE_HANDLER(CMSG_CHANNEL_ANNOUNCEMENTS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelAnnouncements ); DEFINE_OPCODE_HANDLER(CMSG_CHANNEL_BAN, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelBan ); DEFINE_OPCODE_HANDLER(CMSG_CHANNEL_DISPLAY_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelDisplayListQuery ); |
