aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp4
-rw-r--r--src/server/game/Handlers/VehicleHandler.cpp2
-rw-r--r--src/server/game/Movement/MovementStructures.cpp27
-rw-r--r--src/server/game/Movement/MovementStructures.h11
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp6
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 );