diff --git a/src/game/Object/Unit.cpp b/src/game/Object/Unit.cpp index 21e14b691..449254578 100644 --- a/src/game/Object/Unit.cpp +++ b/src/game/Object/Unit.cpp @@ -103,6 +103,12 @@ void MovementInfo::Read(ByteBuffer& data, uint16 opcode) continue; } + if (element >= MSEGuid2Bit0 && element <= MSEGuid2Bit7) + { + guid2[element - MSEGuid2Bit0] = data.ReadBit(); + continue; + } + if (element >= MSETransportGuidBit0 && element <= MSETransportGuidBit7) { if (hasTransportData) @@ -117,6 +123,13 @@ void MovementInfo::Read(ByteBuffer& data, uint16 opcode) continue; } + if (element >= MSEGuid2Byte0 && element <= MSEGuid2Byte7) + { + if (guid2[element - MSEGuid2Byte0]) + guid2[element - MSEGuid2Byte0] ^= data.ReadUInt8(); + continue; + } + if (element >= MSETransportGuidByte0 && element <= MSETransportGuidByte7) { if (hasTransportData && t_guid[element - MSETransportGuidByte0]) @@ -256,6 +269,9 @@ void MovementInfo::Read(ByteBuffer& data, uint16 opcode) case MSEMovementCounter: data.read_skip(); break; + case MSEByteParam: + data >> byteParam; + break; default: MANGOS_ASSERT(false && "Wrong movement status element"); break; diff --git a/src/game/Object/Unit.h b/src/game/Object/Unit.h index 6c86f8bd0..887ecd5c2 100644 --- a/src/game/Object/Unit.h +++ b/src/game/Object/Unit.h @@ -738,7 +738,7 @@ class MovementInfo { public: MovementInfo() : moveFlags(MOVEFLAG_NONE), moveFlags2(MOVEFLAG2_NONE), time(0), - t_time(0), t_seat(-1), t_time2(0), s_pitch(0.0f), fallTime(0), splineElevation(0.0f) {} + t_time(0), t_seat(-1), t_time2(0), s_pitch(0.0f), fallTime(0), splineElevation(0.0f), byteParam(0) {} // Read/Write methods void Read(ByteBuffer& data, uint16 opcode); @@ -776,12 +776,14 @@ class MovementInfo t_seat = -1; } ObjectGuid const& GetGuid() const { return guid; } + ObjectGuid const& GetGuid2() const { return guid2; } ObjectGuid const& GetTransportGuid() const { return t_guid; } Position const* GetTransportPos() const { return &t_pos; } int8 GetTransportSeat() const { return t_seat; } uint32 GetTransportTime() const { return t_time; } uint32 GetTransportTime2() const { return t_time2; } uint32 GetFallTime() const { return fallTime; } + int8 GetByteParam() const { return byteParam; } void ChangeOrientation(float o) { pos.o = o; } void ChangePosition(float x, float y, float z, float o) { pos.x = x; pos.y = y; pos.z = z; pos.o = o; } void UpdateTime(uint32 _time) { time = _time; } @@ -817,6 +819,7 @@ class MovementInfo private: // common ObjectGuid guid; + ObjectGuid guid2; uint32 moveFlags; // see enum MovementFlags uint16 moveFlags2; // see enum MovementFlags2 uint32 time; @@ -837,6 +840,7 @@ class MovementInfo float splineElevation; // status info StatusInfo si; + int8 byteParam; }; inline WorldPacket& operator<< (WorldPacket& buf, MovementInfo const& mi) diff --git a/src/game/Server/Opcodes.cpp b/src/game/Server/Opcodes.cpp index 3ebbae269..4d0cc8080 100644 --- a/src/game/Server/Opcodes.cpp +++ b/src/game/Server/Opcodes.cpp @@ -1130,7 +1130,7 @@ void InitializeOpcodes() //OPCODE(CMSG_REFER_A_FRIEND, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //OPCODE(MSG_GM_CHANGE_ARENA_RATING, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //OPCODE(CMSG_DECLINE_CHANNEL_INVITE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - //OPCODE(SMSG_GROUPACTION_THROTTLED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + OPCODE(SMSG_GROUPACTION_THROTTLED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); OPCODE(SMSG_OVERRIDE_LIGHT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); OPCODE(SMSG_TOTEM_CREATED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); OPCODE(CMSG_TOTEM_DESTROYED, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleTotemDestroyed ); @@ -1231,10 +1231,10 @@ void InitializeOpcodes() OPCODE(CMSG_CHAR_CUSTOMIZE, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleCharCustomizeOpcode ); OPCODE(SMSG_CHAR_CUSTOMIZE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); OPCODE(SMSG_PET_RENAMEABLE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - OPCODE(CMSG_REQUEST_VEHICLE_EXIT, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::Handle_NULL ); - OPCODE(CMSG_REQUEST_VEHICLE_PREV_SEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - OPCODE(CMSG_REQUEST_VEHICLE_NEXT_SEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - OPCODE(CMSG_REQUEST_VEHICLE_SWITCH_SEAT, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::Handle_NULL ); + OPCODE(CMSG_REQUEST_VEHICLE_EXIT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestVehicleExit ); + OPCODE(CMSG_REQUEST_VEHICLE_PREV_SEAT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestVehiclePrevSeat ); + OPCODE(CMSG_REQUEST_VEHICLE_NEXT_SEAT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestVehicleNextSeat ); + OPCODE(CMSG_REQUEST_VEHICLE_SWITCH_SEAT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestVehicleSwitchSeat ); OPCODE(CMSG_PET_LEARN_TALENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePetLearnTalent ); //OPCODE(CMSG_PET_UNLEARN_TALENTS, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); OPCODE(SMSG_SET_PHASE_SHIFT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); @@ -1268,7 +1268,7 @@ void InitializeOpcodes() OPCODE(SMSG_SERVER_FIRST_ACHIEVEMENT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); OPCODE(SMSG_PET_LEARNED_SPELL, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); OPCODE(SMSG_PET_REMOVED_SPELL, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //OPCODE(CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::Handle_NULL ); + OPCODE(CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChangeSeatsOnControlledVehicle ); OPCODE(CMSG_HEARTH_AND_RESURRECT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleHearthandResurrect ); OPCODE(SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); OPCODE(SMSG_CRITERIA_DELETED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); @@ -1280,9 +1280,9 @@ void InitializeOpcodes() //OPCODE(CMSG_SET_BREATH, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //OPCODE(CMSG_QUERY_VEHICLE_STATUS, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //OPCODE(SMSG_BATTLEGROUND_INFO_THROTTLED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //OPCODE(SMSG_SET_VEHICLE_REC_ID, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //OPCODE(CMSG_RIDE_VEHICLE_INTERACT, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleRideVehicleInteract ); - //OPCODE(CMSG_CONTROLLER_EJECT_PASSENGER, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleEjectPassenger ); + OPCODE(SMSG_SET_VEHICLE_REC_ID, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + OPCODE(CMSG_RIDE_VEHICLE_INTERACT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRideVehicleInteract ); + OPCODE(CMSG_CONTROLLER_EJECT_PASSENGER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleEjectPassenger ); OPCODE(SMSG_PET_GUIDS, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); OPCODE(SMSG_CLIENTCACHE_VERSION, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //OPCODE(CMSG_CHANGE_GDF_ARENA_RATING, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); diff --git a/src/game/Server/Opcodes.h b/src/game/Server/Opcodes.h index 0569ab46a..ca09a842a 100644 --- a/src/game/Server/Opcodes.h +++ b/src/game/Server/Opcodes.h @@ -1263,9 +1263,9 @@ enum Opcodes CMSG_SET_BREATH = 0x0000, CMSG_QUERY_VEHICLE_STATUS = 0x0000, SMSG_BATTLEGROUND_INFO_THROTTLED = 0x0000, - SMSG_SET_VEHICLE_REC_ID = 0x0000, - CMSG_RIDE_VEHICLE_INTERACT = 0x0000, - CMSG_CONTROLLER_EJECT_PASSENGER = 0x0000, + SMSG_SET_VEHICLE_REC_ID = 0x4115, // 4.3.4 15595 + CMSG_RIDE_VEHICLE_INTERACT = 0x2705, // 4.3.4 15595 + CMSG_CONTROLLER_EJECT_PASSENGER = 0x6927, // 4.3.4 15595 SMSG_PET_GUIDS = 0x2D26, // 4.3.4 15595 SMSG_CLIENTCACHE_VERSION = 0x2734, // 4.3.4 15595 CMSG_CHANGE_GDF_ARENA_RATING = 0x0000, diff --git a/src/game/Server/WorldSession.h b/src/game/Server/WorldSession.h index ef5518f88..f108ea38d 100644 --- a/src/game/Server/WorldSession.h +++ b/src/game/Server/WorldSession.h @@ -531,6 +531,8 @@ class WorldSession void HandleRequestVehicleExit(WorldPacket& recvPacket); void HandleRequestVehicleSwitchSeat(WorldPacket& recvPacket); void HandleChangeSeatsOnControlledVehicle(WorldPacket& recvPacket); + void HandleRequestVehiclePrevSeat(WorldPacket& recv_data); + void HandleRequestVehicleNextSeat(WorldPacket& recv_data); void HandleRideVehicleInteract(WorldPacket& recvPacket); void HandleEjectPassenger(WorldPacket& recvPacket); diff --git a/src/game/WorldHandlers/MovementHandler.cpp b/src/game/WorldHandlers/MovementHandler.cpp index 1d5bf778d..90f7a2ee3 100644 --- a/src/game/WorldHandlers/MovementHandler.cpp +++ b/src/game/WorldHandlers/MovementHandler.cpp @@ -441,6 +441,11 @@ void WorldSession::HandleSetActiveMoverOpcode(WorldPacket& recv_data) _player->GetMover()->GetGuidStr().c_str(), guid.GetString().c_str()); return; } + else + { + if (Unit* mover = ObjectAccessor::GetUnit(*GetPlayer(), guid)) + _player->SetMover(mover); + } } void WorldSession::HandleMoveNotActiveMoverOpcode(WorldPacket& recv_data) diff --git a/src/game/WorldHandlers/VehicleHandler.cpp b/src/game/WorldHandlers/VehicleHandler.cpp index e98df58c2..6be0eebd3 100644 --- a/src/game/WorldHandlers/VehicleHandler.cpp +++ b/src/game/WorldHandlers/VehicleHandler.cpp @@ -96,15 +96,13 @@ void WorldSession::HandleChangeSeatsOnControlledVehicle(WorldPacket& recvPacket) DEBUG_LOG("WORLD: Received opcode CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE"); recvPacket.hexlike(); - ObjectGuid srcVehicleGuid; MovementInfo movementInfo; - ObjectGuid destVehicleGuid; uint8 seat; - recvPacket >> srcVehicleGuid.ReadAsPacked(); recvPacket >> movementInfo; // Not used at the moment - recvPacket >> destVehicleGuid.ReadAsPacked(); - recvPacket >> seat; + ObjectGuid srcVehicleGuid = movementInfo.GetGuid(); + ObjectGuid destVehicleGuid = movementInfo.GetGuid2(); + uint8 seat = movementInfo.GetByteParam(); TransportInfo* transportInfo = _player->GetTransportInfo(); if (!transportInfo || !transportInfo->IsOnVehicle()) @@ -175,3 +173,17 @@ void WorldSession::HandleEjectPassenger(WorldPacket& recvPacket) _player->RemoveSpellsCausingAura(SPELL_AURA_CONTROL_VEHICLE, passengerGuid); } + +void WorldSession::HandleRequestVehiclePrevSeat(WorldPacket& recv_data) +{ + DEBUG_LOG("WORLD: Received CMSG_REQUEST_VEHICLE_PREV_SEAT"); + + // ToDo +} + +void WorldSession::HandleRequestVehicleNextSeat(WorldPacket& recv_data) +{ + DEBUG_LOG("WORLD: Received CMSG_REQUEST_VEHICLE_NEXT_SEAT"); + + // ToDo +} diff --git a/src/game/movement/MovementStructures.h b/src/game/movement/MovementStructures.h index b40f6e20f..d0ad11929 100644 --- a/src/game/movement/MovementStructures.h +++ b/src/game/movement/MovementStructures.h @@ -36,6 +36,14 @@ enum MovementStatusElements MSEGuidBit5, MSEGuidBit6, MSEGuidBit7, + MSEGuid2Bit0, + MSEGuid2Bit1, + MSEGuid2Bit2, + MSEGuid2Bit3, + MSEGuid2Bit4, + MSEGuid2Bit5, + MSEGuid2Bit6, + MSEGuid2Bit7, MSEHasUnknownBit, MSEHasMovementFlags, MSEHasMovementFlags2, @@ -68,6 +76,14 @@ enum MovementStatusElements MSEGuidByte5, MSEGuidByte6, MSEGuidByte7, + MSEGuid2Byte0, + MSEGuid2Byte1, + MSEGuid2Byte2, + MSEGuid2Byte3, + MSEGuid2Byte4, + MSEGuid2Byte5, + MSEGuid2Byte6, + MSEGuid2Byte7, MSEPitch, MSEFallTime, MSETransportGuidByte0, @@ -92,10 +108,113 @@ enum MovementStatusElements MSETransportTime2, MSETransportTime3, MSEMovementCounter, + MSEByteParam, MSEEnd, MSE_COUNT }; +MovementStatusElements ChangeSeatsOnControlledVehicleSequence[] = +{ + MSEPositionY, + MSEPositionX, + MSEPositionZ, + MSEByteParam, + + MSEHasMovementFlags, + MSEHasTransportData, + MSEGuidBit2, + MSEGuidBit6, + MSEGuidBit4, + MSEGuid2Bit2, + MSEGuid2Bit4, + MSEHasOrientation, + + MSEHasUnknownBit, + MSEGuid2Bit7, + MSEGuidBit7, + MSEGuid2Bit6, + MSEHasTimestamp, + MSEHasSplineElevation, + MSEGuidBit5, + MSEGuid2Bit5, + + MSEHasMovementFlags2, + MSEHasPitch, + MSEGuid2Bit0, + MSEGuidBit0, + MSEGuid2Bit1, + MSEHasFallData, + MSEGuidBit1, + MSEHasSpline, + + MSEFlags, + MSEGuid2Bit3, + MSEGuidBit3, + + MSETransportGuidBit3, + MSETransportGuidBit0, + MSETransportGuidBit7, + MSETransportGuidBit5, + MSEHasTransportTime3, + MSETransportGuidBit1, + + MSETransportGuidBit2, + MSEHasTransportTime2, + MSETransportGuidBit4, + MSETransportGuidBit6, + MSEFlags2, + + MSEHasFallDirection, + + MSEGuid2Byte6, + MSEGuidByte7, + MSEGuidByte5, + MSEGuid2Byte1, + MSEGuid2Byte2, + MSEGuidByte6, + MSEGuid2Byte5, + MSEGuid2Byte3, + MSEGuidByte3, + MSEGuid2Byte0, + MSEGuidByte0, + MSEGuid2Byte4, + MSEGuidByte4, + MSEGuidByte1, + MSEGuid2Byte7, + MSEGuidByte2, + + MSEPitch, + MSEFallSinAngle, + MSEFallCosAngle, + MSEFallHorizontalSpeed, + + MSEFallTime, + MSEFallVerticalSpeed, + + MSETransportGuidByte2, + MSETransportTime2, + MSETransportTime3, + MSETransportGuidByte0, + MSETransportTime, + MSETransportSeat, + MSETransportPositionX, + MSETransportPositionO, + MSETransportGuidByte7, + MSETransportGuidByte4, + MSETransportGuidByte3, + MSETransportGuidByte5, + MSETransportPositionZ, + MSETransportGuidByte1, + MSETransportGuidByte6, + MSETransportPositionY, + + MSESplineElevation, + MSEPositionO, + MSETimestamp, + + MSEEnd, +}; + MovementStatusElements PlayerMoveSequence[] = { MSEHasFallData, @@ -2632,6 +2751,8 @@ MovementStatusElements* GetMovementStatusElementsSequence(uint16 opcode) return MoveNotActiveMoverSequence; case CMSG_DISMISS_CONTROLLED_VEHICLE: return DismissControlledVehicleSequence; + case CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE: + return ChangeSeatsOnControlledVehicleSequence; } return NULL; }