Core/PacketIO: Updated and enabled CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE and updated structure of movement packet sent in CMSG_CAST_(PET_)SPELL

This commit is contained in:
Shauren
2013-04-11 01:14:32 +02:00
parent 238f7e9253
commit f370c4e4d6
5 changed files with 216 additions and 22 deletions

View File

@@ -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
{

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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:

View File

@@ -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 );