aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Handlers/SpellHandler.cpp3
-rw-r--r--src/server/game/Handlers/VehicleHandler.cpp41
-rw-r--r--src/server/game/Movement/MovementStructures.cpp190
-rw-r--r--src/server/game/Movement/MovementStructures.h4
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp2
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 );