aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Movement/MovementStructures.h1374
-rwxr-xr-xsrc/server/game/Server/Protocol/Handlers/MovementHandler.cpp335
-rw-r--r--src/server/game/Server/WorldPacket.h22
-rwxr-xr-xsrc/server/game/Server/WorldSession.cpp105
-rwxr-xr-xsrc/server/game/Server/WorldSession.h2
5 files changed, 1722 insertions, 116 deletions
diff --git a/src/server/game/Movement/MovementStructures.h b/src/server/game/Movement/MovementStructures.h
new file mode 100644
index 00000000000..1313f897acb
--- /dev/null
+++ b/src/server/game/Movement/MovementStructures.h
@@ -0,0 +1,1374 @@
+/*
+* Copyright (C) 2008-2011 TrinityCore <http://www.trinitycore.org/>
+* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+*
+* This program is free software; you can redistribute it and/or modify it
+* under the terms of the GNU General Public License as published by the
+* Free Software Foundation; either version 2 of the License, or (at your
+* option) any later version.
+*
+* This program is distributed in the hope that it will be useful, but WITHOUT
+* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+* more details.
+*
+* You should have received a copy of the GNU General Public License along
+* with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef _MOVEMENT_STRUCTURES_H
+#define _MOVEMENT_STRUCTURES_H
+
+enum MovementStatusElements
+{
+ MSEFlags,
+ MSEFlags2,
+ MSETimestamp,
+ MSEHavePitch,
+ MSEGuidByte0,
+ MSEGuidByte1,
+ MSEGuidByte2,
+ MSEGuidByte3,
+ MSEGuidByte4,
+ MSEGuidByte5,
+ MSEGuidByte6,
+ MSEGuidByte7,
+ MSEHaveFallData,
+ MSEHaveFallDirection,
+ MSEHaveTransportData,
+ MSETransportHaveTime2,
+ MSETransportHaveTime3,
+ MSETransportGuidByte0,
+ MSETransportGuidByte1,
+ MSETransportGuidByte2,
+ MSETransportGuidByte3,
+ MSETransportGuidByte4,
+ MSETransportGuidByte5,
+ MSETransportGuidByte6,
+ MSETransportGuidByte7,
+ MSEHaveSpline,
+ MSEHaveSplineElev,
+ MSEPositionX,
+ MSEPositionY,
+ MSEPositionZ,
+ MSEPositionO,
+ MSEGuidByte0_2,
+ MSEGuidByte1_2,
+ MSEGuidByte2_2,
+ MSEGuidByte3_2,
+ MSEGuidByte4_2,
+ MSEGuidByte5_2,
+ MSEGuidByte6_2,
+ MSEGuidByte7_2,
+ MSEPitch,
+ MSEFallTime,
+ MSETransportGuidByte0_2,
+ MSETransportGuidByte1_2,
+ MSETransportGuidByte2_2,
+ MSETransportGuidByte3_2,
+ MSETransportGuidByte4_2,
+ MSETransportGuidByte5_2,
+ MSETransportGuidByte6_2,
+ MSETransportGuidByte7_2,
+ MSESplineElev,
+ MSEFallHorizontalSpeed,
+ MSEFallVerticalSpeed,
+ MSEFallCosAngle,
+ MSEFallSinAngle,
+ MSETransportSeat,
+ MSETransportPositionO,
+ MSETransportPositionX,
+ MSETransportPositionY,
+ MSETransportPositionZ,
+ MSETransportTime,
+ MSETransportTime2,
+ MSETransportTime3,
+ MSE_COUNT
+};
+
+MovementStatusElements PlayerMoveSequence[] = {
+ MSEHavePitch,
+ MSEGuidByte6,
+ MSEHaveFallData,
+ MSEHaveFallDirection,
+ MSEGuidByte1,
+ MSEGuidByte2,
+ MSEFlags2,
+ MSEGuidByte0,
+ MSEHaveTransportData,
+ MSETransportGuidByte1,
+ MSETransportGuidByte4,
+ MSETransportGuidByte0,
+ MSETransportHaveTime2,
+ MSETransportGuidByte6,
+ MSETransportGuidByte3,
+ MSETransportGuidByte2,
+ MSETransportGuidByte7,
+ MSETransportHaveTime3,
+ MSETransportGuidByte5,
+ MSEGuidByte3,
+ MSEGuidByte4,
+ MSEGuidByte5,
+ MSEHaveSpline,
+ MSEGuidByte7,
+ MSEHaveSplineElev,
+ MSEFlags,
+ MSEPositionO,
+ MSEGuidByte0_2,
+ MSEPitch,
+ MSEGuidByte4_2,
+ MSEFallTime,
+ MSEFallHorizontalSpeed,
+ MSEFallCosAngle,
+ MSEFallSinAngle,
+ MSEFallVerticalSpeed,
+ MSETimestamp,
+ MSEGuidByte1_2,
+ MSETransportGuidByte7_2,
+ MSETransportGuidByte3_2,
+ MSETransportGuidByte1_2,
+ MSETransportSeat,
+ MSETransportTime2,
+ MSETransportGuidByte0_2,
+ MSETransportGuidByte6_2,
+ MSETransportPositionX,
+ MSETransportPositionY,
+ MSETransportPositionZ,
+ MSETransportGuidByte4_2,
+ MSETransportPositionO,
+ MSETransportTime3,
+ MSETransportGuidByte5_2,
+ MSETransportTime,
+ MSETransportGuidByte2_2,
+ MSEGuidByte2_2,
+ MSEPositionX,
+ MSEPositionY,
+ MSEPositionZ,
+ MSEGuidByte6_2,
+ MSESplineElev,
+ MSEGuidByte5_2,
+ MSEGuidByte3_2,
+ MSEGuidByte7_2
+};
+
+MovementStatusElements MovementFallLandSequence[] = {
+ MSEGuidByte5,
+ MSEGuidByte6,
+ MSEGuidByte4,
+ MSEGuidByte1,
+ MSEGuidByte2,
+ MSEHaveSpline,
+ MSEFlags2,
+ MSEGuidByte7,
+ MSEGuidByte3,
+ MSEGuidByte0,
+ MSEFlags,
+ MSEHaveFallData,
+ MSEHaveFallDirection,
+ MSEHaveTransportData,
+ MSETransportGuidByte6,
+ MSETransportGuidByte3,
+ MSETransportGuidByte7,
+ MSETransportGuidByte4,
+ MSETransportGuidByte1,
+ MSETransportGuidByte0,
+ MSETransportGuidByte2,
+ MSETransportGuidByte5,
+ MSETransportHaveTime3,
+ MSETransportHaveTime2,
+ MSEHavePitch,
+ MSEHaveSplineElev,
+ MSETimestamp,
+ MSEPositionX,
+ MSEPositionY,
+ MSEPositionZ,
+ MSEPositionO,
+ MSEGuidByte7_2,
+ MSEGuidByte2_2,
+ MSEGuidByte3_2,
+ MSEGuidByte0_2,
+ MSEGuidByte1_2,
+ MSEGuidByte5_2,
+ MSEFallVerticalSpeed,
+ MSEFallTime,
+ MSEFallHorizontalSpeed,
+ MSEFallCosAngle,
+ MSEFallSinAngle,
+ MSETransportTime,
+ MSETransportPositionX,
+ MSETransportPositionY,
+ MSETransportPositionZ,
+ MSETransportPositionO,
+ MSETransportSeat,
+ MSETransportGuidByte3_2,
+ MSETransportGuidByte1_2,
+ MSETransportTime3,
+ MSETransportGuidByte6_2,
+ MSETransportGuidByte0_2,
+ MSETransportGuidByte5_2,
+ MSETransportTime2,
+ MSETransportGuidByte7_2,
+ MSETransportGuidByte4_2,
+ MSETransportGuidByte2_2,
+ MSEPitch,
+ MSESplineElev,
+ MSEGuidByte6_2,
+ MSEGuidByte4_2,
+};
+
+MovementStatusElements MovementHeartBeatSequence[] = {
+ /*
+ 3bits
+ 8bits
+ */
+ MSEGuidByte1,
+ MSEGuidByte5,
+ MSEGuidByte2,
+ MSEFlags2,
+ MSEGuidByte3,
+ MSEGuidByte4,
+ MSEHaveSpline,
+ MSEFlags,
+ MSEGuidByte0,
+ MSEGuidByte6,
+ MSEGuidByte7,
+ MSEHaveTransportData,
+ MSETransportGuidByte6,
+ MSETransportGuidByte3,
+ MSETransportGuidByte7,
+ MSETransportGuidByte4,
+ MSETransportGuidByte1,
+ MSETransportGuidByte0,
+ MSETransportGuidByte2,
+ MSETransportGuidByte5,
+ MSETransportHaveTime3,
+ MSETransportHaveTime2,
+ MSEHavePitch,
+ MSEHaveSplineElev,
+ MSEHaveFallData,
+ MSEHaveFallDirection,
+ MSEPositionO,
+ MSEPositionX,
+ MSEPositionY,
+ MSEPositionZ,
+ MSETimestamp,
+ MSEGuidByte6_2,
+ MSETransportTime,
+ MSETransportPositionX,
+ MSETransportPositionY,
+ MSETransportPositionZ,
+ MSETransportPositionO,
+ MSETransportSeat,
+ MSETransportGuidByte3_2,
+ MSETransportGuidByte1_2,
+ MSETransportTime3,
+ MSETransportGuidByte6_2,
+ MSETransportGuidByte0_2,
+ MSETransportGuidByte5_2,
+ MSETransportTime2,
+ MSETransportGuidByte7_2,
+ MSETransportGuidByte4_2,
+ MSETransportGuidByte2_2,
+ MSEPitch,
+ MSESplineElev,
+ MSEFallVerticalSpeed,
+ MSEFallTime,
+ MSEFallHorizontalSpeed,
+ MSEFallCosAngle,
+ MSEFallSinAngle,
+ MSEGuidByte5_2,
+ MSEGuidByte1_2,
+ MSEGuidByte7_2,
+ MSEGuidByte0_2,
+ MSEGuidByte2_2,
+ MSEGuidByte4_2,
+ MSEGuidByte3_2,
+};
+
+MovementStatusElements MovementJumpSequence[] = {
+ MSEGuidByte5,
+ MSEGuidByte1,
+ MSEGuidByte6,
+ MSEFlags,
+ MSEGuidByte2,
+ MSEHaveSpline,
+ MSEGuidByte3,
+ MSEFlags2,
+ MSEGuidByte4,
+ MSEGuidByte0,
+ MSEGuidByte7,
+ MSEHaveFallData,
+ MSEHaveFallDirection,
+ MSEHaveTransportData,
+ MSETransportGuidByte6,
+ MSETransportGuidByte3,
+ MSETransportGuidByte7,
+ MSETransportGuidByte4,
+ MSETransportGuidByte1,
+ MSETransportGuidByte0,
+ MSETransportGuidByte2,
+ MSETransportGuidByte5,
+ MSETransportHaveTime3,
+ MSETransportHaveTime2,
+ MSEHaveSplineElev,
+ MSEHavePitch,
+ MSEPositionO,
+ MSEPositionX,
+ MSEPositionY,
+ MSEPositionZ,
+ MSETimestamp,
+ MSEGuidByte1_2,
+ MSEFallVerticalSpeed,
+ MSEFallTime,
+ MSEFallHorizontalSpeed,
+ MSEFallCosAngle,
+ MSEFallSinAngle,
+ MSETransportTime,
+ MSETransportPositionX,
+ MSETransportPositionY,
+ MSETransportPositionZ,
+ MSETransportPositionO,
+ MSETransportSeat,
+ MSETransportGuidByte3_2,
+ MSETransportGuidByte1_2,
+ MSETransportTime3,
+ MSETransportGuidByte6_2,
+ MSETransportGuidByte0_2,
+ MSETransportGuidByte5_2,
+ MSETransportTime2,
+ MSETransportGuidByte7_2,
+ MSETransportGuidByte4_2,
+ MSETransportGuidByte2_2,
+ MSEGuidByte6_2,
+ MSEGuidByte4_2,
+ MSESplineElev,
+ MSEGuidByte0_2,
+ MSEPitch,
+ MSEGuidByte5_2,
+ MSEGuidByte3_2,
+ MSEGuidByte7_2,
+ MSEGuidByte2_2,
+};
+
+MovementStatusElements MovementSetFacingSequence[] = {
+ MSEGuidByte3,
+ MSEGuidByte1,
+ MSEGuidByte0,
+ MSEGuidByte7,
+ MSEFlags2,
+ MSEHaveSpline,
+ MSEGuidByte4,
+ MSEFlags,
+ MSEGuidByte6,
+ MSEGuidByte5,
+ MSEGuidByte2,
+ MSEHaveFallData,
+ MSEHaveFallDirection,
+ MSEHaveTransportData,
+ MSETransportGuidByte6,
+ MSETransportGuidByte3,
+ MSETransportGuidByte7,
+ MSETransportGuidByte4,
+ MSETransportGuidByte1,
+ MSETransportGuidByte0,
+ MSETransportGuidByte2,
+ MSETransportGuidByte5,
+ MSETransportHaveTime3,
+ MSETransportHaveTime2,
+ MSEHavePitch,
+ MSEHaveSplineElev,
+ MSEPositionX,
+ MSEPositionY,
+ MSEPositionZ,
+ MSEPositionO,
+ MSETimestamp,
+ MSEFallVerticalSpeed,
+ MSEFallTime,
+ MSEFallHorizontalSpeed,
+ MSEFallCosAngle,
+ MSEFallSinAngle,
+ MSEGuidByte2_2,
+ MSEGuidByte4_2,
+ MSETransportTime,
+ MSETransportPositionX,
+ MSETransportPositionY,
+ MSETransportPositionZ,
+ MSETransportPositionO,
+ MSETransportSeat,
+ MSETransportGuidByte3_2,
+ MSETransportGuidByte1_2,
+ MSETransportTime3,
+ MSETransportGuidByte6_2,
+ MSETransportGuidByte0_2,
+ MSETransportGuidByte5_2,
+ MSETransportTime2,
+ MSETransportGuidByte7_2,
+ MSETransportGuidByte4_2,
+ MSETransportGuidByte2_2,
+ MSEGuidByte3_2,
+ MSEGuidByte7_2,
+ MSEPitch,
+ MSEGuidByte5_2,
+ MSEGuidByte1_2,
+ MSEGuidByte6_2,
+ MSESplineElev,
+ MSEGuidByte0_2,
+};
+
+MovementStatusElements MovementSetPitchSequence[] = {
+ MSEGuidByte4,
+ MSEGuidByte6,
+ MSEGuidByte2,
+ MSEFlags2,
+ MSEGuidByte1,
+ MSEGuidByte7,
+ MSEGuidByte5,
+ MSEGuidByte3,
+ MSEHaveSpline,
+ MSEGuidByte0,
+ MSEFlags,
+ MSEHaveFallData,
+ MSEHaveFallDirection,
+ MSEHaveTransportData,
+ MSETransportGuidByte6,
+ MSETransportGuidByte3,
+ MSETransportGuidByte7,
+ MSETransportGuidByte4,
+ MSETransportGuidByte1,
+ MSETransportGuidByte0,
+ MSETransportGuidByte2,
+ MSETransportGuidByte5,
+ MSETransportHaveTime3,
+ MSETransportHaveTime2,
+ MSEHaveSplineElev,
+ MSEHavePitch,
+ MSEPositionO,
+ MSETimestamp,
+ MSEPositionX,
+ MSEPositionY,
+ MSEPositionZ,
+ MSEGuidByte2_2,
+ MSEGuidByte6_2,
+ MSEGuidByte5_2,
+ MSEFallVerticalSpeed,
+ MSEFallTime,
+ MSEFallHorizontalSpeed,
+ MSEFallCosAngle,
+ MSEFallSinAngle,
+ MSEGuidByte3_2,
+ MSETransportTime,
+ MSETransportPositionX,
+ MSETransportPositionY,
+ MSETransportPositionZ,
+ MSETransportPositionO,
+ MSETransportSeat,
+ MSETransportGuidByte3_2,
+ MSETransportGuidByte1_2,
+ MSETransportTime3,
+ MSETransportGuidByte6_2,
+ MSETransportGuidByte0_2,
+ MSETransportGuidByte5_2,
+ MSETransportTime2,
+ MSETransportGuidByte7_2,
+ MSETransportGuidByte4_2,
+ MSETransportGuidByte2_2,
+ MSEGuidByte0_2,
+ MSEGuidByte1_2,
+ MSESplineElev,
+ MSEGuidByte7_2,
+ MSEGuidByte4_2,
+ MSEPitch,
+};
+
+MovementStatusElements MovementStartBackwardSequence[] = {
+ MSEGuidByte4,
+ MSEGuidByte1,
+ MSEGuidByte5,
+ MSEFlags2,
+ MSEGuidByte3,
+ MSEGuidByte6,
+ MSEGuidByte0,
+ MSEGuidByte2,
+ MSEGuidByte7,
+ MSEFlags,
+ MSEHaveSpline,
+ MSEHaveFallData,
+ MSEHaveFallDirection,
+ MSEHaveTransportData,
+ MSETransportGuidByte6,
+ MSETransportGuidByte3,
+ MSETransportGuidByte7,
+ MSETransportGuidByte4,
+ MSETransportGuidByte1,
+ MSETransportGuidByte0,
+ MSETransportGuidByte2,
+ MSETransportGuidByte5,
+ MSETransportHaveTime3,
+ MSETransportHaveTime2,
+ MSEHavePitch,
+ MSEHaveSplineElev,
+ MSEPositionX,
+ MSEPositionY,
+ MSEPositionZ,
+ MSETimestamp,
+ MSEPositionO,
+ MSEGuidByte0_2,
+ MSEGuidByte5_2,
+ MSEFallVerticalSpeed,
+ MSEFallTime,
+ MSEFallHorizontalSpeed,
+ MSEFallCosAngle,
+ MSEFallSinAngle,
+ MSEGuidByte4_2,
+ MSEGuidByte2_2,
+ MSETransportTime,
+ MSETransportPositionX,
+ MSETransportPositionY,
+ MSETransportPositionZ,
+ MSETransportPositionO,
+ MSETransportSeat,
+ MSETransportGuidByte3_2,
+ MSETransportGuidByte1_2,
+ MSETransportTime3,
+ MSETransportGuidByte6_2,
+ MSETransportGuidByte0_2,
+ MSETransportGuidByte5_2,
+ MSETransportTime2,
+ MSETransportGuidByte7_2,
+ MSETransportGuidByte4_2,
+ MSETransportGuidByte2_2,
+ MSEGuidByte6_2,
+ MSEPitch,
+ MSEGuidByte3_2,
+ MSESplineElev,
+ MSEGuidByte1_2,
+ MSEGuidByte7_2,
+};
+
+MovementStatusElements MovementStartForwardSequence[] = {
+ MSEGuidByte0,
+ MSEHaveSpline,
+ MSEGuidByte5,
+ MSEGuidByte3,
+ MSEGuidByte4,
+ MSEGuidByte2,
+ MSEGuidByte7,
+ MSEFlags2,
+ MSEFlags,
+ MSEGuidByte6,
+ MSEGuidByte1,
+ MSEHavePitch,
+ MSEHaveFallData,
+ MSEHaveFallDirection,
+ MSEHaveTransportData,
+ MSETransportGuidByte6,
+ MSETransportGuidByte3,
+ MSETransportGuidByte7,
+ MSETransportGuidByte4,
+ MSETransportGuidByte1,
+ MSETransportGuidByte0,
+ MSETransportGuidByte2,
+ MSETransportGuidByte5,
+ MSETransportHaveTime3,
+ MSETransportHaveTime2,
+ MSEHaveSplineElev,
+ MSETimestamp,
+ MSEPositionX,
+ MSEPositionY,
+ MSEPositionZ,
+ MSEPositionO,
+ MSEGuidByte7_2,
+ MSEPitch,
+ MSEGuidByte1_2,
+ MSEGuidByte2_2,
+ MSEFallVerticalSpeed,
+ MSEFallTime,
+ MSEFallHorizontalSpeed,
+ MSEFallCosAngle,
+ MSEFallSinAngle,
+ MSEGuidByte3_2,
+ MSEGuidByte5_2,
+ MSEGuidByte0_2,
+ MSEGuidByte6_2,
+ MSETransportTime,
+ MSETransportPositionX,
+ MSETransportPositionY,
+ MSETransportPositionZ,
+ MSETransportPositionO,
+ MSETransportSeat,
+ MSETransportGuidByte3_2,
+ MSETransportGuidByte1_2,
+ MSETransportTime3,
+ MSETransportGuidByte6_2,
+ MSETransportGuidByte0_2,
+ MSETransportGuidByte5_2,
+ MSETransportTime2,
+ MSETransportGuidByte7_2,
+ MSETransportGuidByte4_2,
+ MSETransportGuidByte2_2,
+ MSEGuidByte4_2,
+ MSESplineElev,
+};
+
+MovementStatusElements MovementStartStrafeLeftSequence[] = {
+ MSEGuidByte5,
+ MSEGuidByte0,
+ MSEGuidByte3,
+ MSEFlags,
+ MSEGuidByte6,
+ MSEGuidByte1,
+ MSEGuidByte4,
+ MSEFlags2,
+ MSEHaveSpline,
+ MSEGuidByte7,
+ MSEGuidByte2,
+ MSEHaveTransportData,
+ MSETransportGuidByte6,
+ MSETransportGuidByte3,
+ MSETransportGuidByte7,
+ MSETransportGuidByte4,
+ MSETransportGuidByte1,
+ MSETransportGuidByte0,
+ MSETransportGuidByte2,
+ MSETransportGuidByte5,
+ MSETransportHaveTime3,
+ MSETransportHaveTime2,
+ MSEHaveSplineElev,
+ MSEHaveFallData,
+ MSEHaveFallDirection,
+ MSEHavePitch,
+ MSEPositionO,
+ MSETimestamp,
+ MSEPositionX,
+ MSEPositionY,
+ MSEPositionZ,
+ MSEGuidByte3_2,
+ MSETransportTime,
+ MSETransportPositionX,
+ MSETransportPositionY,
+ MSETransportPositionZ,
+ MSETransportPositionO,
+ MSETransportSeat,
+ MSETransportGuidByte3_2,
+ MSETransportGuidByte1_2,
+ MSETransportTime3,
+ MSETransportGuidByte6_2,
+ MSETransportGuidByte0_2,
+ MSETransportGuidByte5_2,
+ MSETransportTime2,
+ MSETransportGuidByte7_2,
+ MSETransportGuidByte4_2,
+ MSETransportGuidByte2_2,
+ MSEGuidByte5_2,
+ MSEGuidByte1_2,
+ MSEGuidByte4_2,
+ MSEGuidByte2_2,
+ MSEGuidByte0_2,
+ MSESplineElev,
+ MSEGuidByte6_2,
+ MSEFallVerticalSpeed,
+ MSEFallTime,
+ MSEFallHorizontalSpeed,
+ MSEFallCosAngle,
+ MSEFallSinAngle,
+ MSEGuidByte7_2,
+ MSEPitch,
+};
+
+MovementStatusElements MovementStartStrafeRightSequence[] = {
+ MSEGuidByte2,
+ MSEFlags,
+ MSEGuidByte3,
+ MSEFlags2,
+ MSEGuidByte0,
+ MSEGuidByte6,
+ MSEHaveSpline,
+ MSEGuidByte1,
+ MSEGuidByte4,
+ MSEGuidByte5,
+ MSEGuidByte7,
+ MSEHaveSplineElev,
+ MSEHavePitch,
+ MSEHaveTransportData,
+ MSETransportGuidByte6,
+ MSETransportGuidByte3,
+ MSETransportGuidByte7,
+ MSETransportGuidByte4,
+ MSETransportGuidByte1,
+ MSETransportGuidByte0,
+ MSETransportGuidByte2,
+ MSETransportGuidByte5,
+ MSETransportHaveTime3,
+ MSETransportHaveTime2,
+ MSEHaveFallData,
+ MSEHaveFallDirection,
+ MSETimestamp,
+ MSEPositionO,
+ MSEPositionX,
+ MSEPositionY,
+ MSEPositionZ,
+ MSEGuidByte7_2,
+ MSEGuidByte1_2,
+ MSESplineElev,
+ MSEGuidByte3_2,
+ MSEPitch,
+ MSETransportTime,
+ MSETransportPositionX,
+ MSETransportPositionY,
+ MSETransportPositionZ,
+ MSETransportPositionO,
+ MSETransportSeat,
+ MSETransportGuidByte3_2,
+ MSETransportGuidByte1_2,
+ MSETransportTime3,
+ MSETransportGuidByte6_2,
+ MSETransportGuidByte0_2,
+ MSETransportGuidByte5_2,
+ MSETransportTime2,
+ MSETransportGuidByte7_2,
+ MSETransportGuidByte4_2,
+ MSETransportGuidByte2_2,
+ MSEGuidByte5_2,
+ MSEGuidByte2_2,
+ MSEGuidByte6_2,
+ MSEGuidByte4_2,
+ MSEGuidByte0_2,
+ MSEFallVerticalSpeed,
+ MSEFallTime,
+ MSEFallHorizontalSpeed,
+ MSEFallCosAngle,
+ MSEFallSinAngle,
+};
+
+MovementStatusElements MovementStartTurnLeftSequence[] = {
+ MSEFlags,
+ MSEGuidByte3,
+ MSEGuidByte5,
+ MSEGuidByte7,
+ MSEFlags2,
+ MSEGuidByte6,
+ MSEHaveSpline,
+ MSEGuidByte0,
+ MSEGuidByte2,
+ MSEGuidByte1,
+ MSEGuidByte4,
+ MSEHaveFallData,
+ MSEHaveFallDirection,
+ MSEHaveSplineElev,
+ MSEHavePitch,
+ MSEHaveTransportData,
+ MSETransportGuidByte6,
+ MSETransportGuidByte3,
+ MSETransportGuidByte7,
+ MSETransportGuidByte4,
+ MSETransportGuidByte1,
+ MSETransportGuidByte0,
+ MSETransportGuidByte2,
+ MSETransportGuidByte5,
+ MSETransportHaveTime3,
+ MSETransportHaveTime2,
+ MSEPositionO,
+ MSETimestamp,
+ MSEPositionX,
+ MSEPositionY,
+ MSEPositionZ,
+ MSEGuidByte2_2,
+ MSEGuidByte6_2,
+ MSEFallVerticalSpeed,
+ MSEFallTime,
+ MSEFallHorizontalSpeed,
+ MSEFallCosAngle,
+ MSEFallSinAngle,
+ MSEGuidByte4_2,
+ MSESplineElev,
+ MSEGuidByte0_2,
+ MSEGuidByte7_2,
+ MSEPitch,
+ MSEGuidByte1_2,
+ MSEGuidByte5_2,
+ MSEGuidByte3_2,
+ MSETransportTime,
+ MSETransportPositionX,
+ MSETransportPositionY,
+ MSETransportPositionZ,
+ MSETransportPositionO,
+ MSETransportSeat,
+ MSETransportGuidByte3_2,
+ MSETransportGuidByte1_2,
+ MSETransportTime3,
+ MSETransportGuidByte6_2,
+ MSETransportGuidByte0_2,
+ MSETransportGuidByte5_2,
+ MSETransportTime2,
+ MSETransportGuidByte7_2,
+ MSETransportGuidByte4_2,
+ MSETransportGuidByte2_2,
+};
+
+MovementStatusElements MovementStartTurnRightSequence[] = {
+ MSEGuidByte0,
+ MSEFlags,
+ MSEGuidByte7,
+ MSEHaveSpline,
+ MSEGuidByte4,
+ MSEGuidByte6,
+ MSEGuidByte3,
+ MSEGuidByte1,
+ MSEFlags2,
+ MSEGuidByte2,
+ MSEGuidByte5,
+ MSEHaveFallData,
+ MSEHaveFallDirection,
+ MSEHavePitch,
+ MSEHaveSplineElev,
+ MSEHaveTransportData,
+ MSETransportGuidByte6,
+ MSETransportGuidByte3,
+ MSETransportGuidByte7,
+ MSETransportGuidByte4,
+ MSETransportGuidByte1,
+ MSETransportGuidByte0,
+ MSETransportGuidByte2,
+ MSETransportGuidByte5,
+ MSETransportHaveTime3,
+ MSETransportHaveTime2,
+ MSEPositionO,
+ MSETimestamp,
+ MSEPositionX,
+ MSEPositionY,
+ MSEPositionZ,
+ MSEGuidByte1_2,
+ MSEGuidByte6_2,
+ MSEFallVerticalSpeed,
+ MSEFallTime,
+ MSEFallHorizontalSpeed,
+ MSEFallCosAngle,
+ MSEFallSinAngle,
+ MSEGuidByte0_2,
+ MSEGuidByte5_2,
+ MSEGuidByte2_2,
+ MSEPitch,
+ MSEGuidByte4_2,
+ MSEGuidByte3_2,
+ MSEGuidByte7_2,
+ MSESplineElev,
+ MSETransportTime,
+ MSETransportPositionX,
+ MSETransportPositionY,
+ MSETransportPositionZ,
+ MSETransportPositionO,
+ MSETransportSeat,
+ MSETransportGuidByte3_2,
+ MSETransportGuidByte1_2,
+ MSETransportTime3,
+ MSETransportGuidByte6_2,
+ MSETransportGuidByte0_2,
+ MSETransportGuidByte5_2,
+ MSETransportTime2,
+ MSETransportGuidByte7_2,
+ MSETransportGuidByte4_2,
+ MSETransportGuidByte2_2,
+};
+
+MovementStatusElements MovementStopSequence[] = {
+ MSEGuidByte4,
+ MSEGuidByte3,
+ MSEFlags,
+ MSEGuidByte5,
+ MSEGuidByte6,
+ MSEGuidByte0,
+ MSEGuidByte1,
+ MSEGuidByte2,
+ MSEGuidByte7,
+ MSEHaveSpline,
+ MSEFlags2,
+ MSEHavePitch,
+ MSEHaveSplineElev,
+ MSEHaveFallData,
+ MSEHaveFallDirection,
+ MSEHaveTransportData,
+ MSETransportGuidByte6,
+ MSETransportGuidByte3,
+ MSETransportGuidByte7,
+ MSETransportGuidByte4,
+ MSETransportGuidByte1,
+ MSETransportGuidByte0,
+ MSETransportGuidByte2,
+ MSETransportGuidByte5,
+ MSETransportHaveTime3,
+ MSETransportHaveTime2,
+ MSETimestamp,
+ MSEPositionX,
+ MSEPositionY,
+ MSEPositionZ,
+ MSEPositionO,
+ MSEGuidByte6_2,
+ MSEGuidByte5_2,
+ MSEGuidByte1_2,
+ MSEGuidByte3_2,
+ MSEPitch,
+ MSEGuidByte2_2,
+ MSESplineElev,
+ MSEGuidByte4_2,
+ MSEGuidByte0_2,
+ MSEGuidByte7_2,
+ MSEFallVerticalSpeed,
+ MSEFallTime,
+ MSEFallHorizontalSpeed,
+ MSEFallCosAngle,
+ MSEFallSinAngle,
+ MSETransportTime,
+ MSETransportPositionX,
+ MSETransportPositionY,
+ MSETransportPositionZ,
+ MSETransportPositionO,
+ MSETransportSeat,
+ MSETransportGuidByte3_2,
+ MSETransportGuidByte1_2,
+ MSETransportTime3,
+ MSETransportGuidByte6_2,
+ MSETransportGuidByte0_2,
+ MSETransportGuidByte5_2,
+ MSETransportTime2,
+ MSETransportGuidByte7_2,
+ MSETransportGuidByte4_2,
+ MSETransportGuidByte2_2,
+};
+
+MovementStatusElements MovementStopStrafeSequence[] = {
+ MSEGuidByte3,
+ MSEFlags,
+ MSEHaveSpline,
+ MSEGuidByte4,
+ MSEGuidByte0,
+ MSEFlags2,
+ MSEGuidByte5,
+ MSEGuidByte6,
+ MSEGuidByte7,
+ MSEGuidByte1,
+ MSEGuidByte2,
+ MSEHaveTransportData,
+ MSETransportGuidByte6,
+ MSETransportGuidByte3,
+ MSETransportGuidByte7,
+ MSETransportGuidByte4,
+ MSETransportGuidByte1,
+ MSETransportGuidByte0,
+ MSETransportGuidByte2,
+ MSETransportGuidByte5,
+ MSETransportHaveTime3,
+ MSETransportHaveTime2,
+ MSEHaveSplineElev,
+ MSEHavePitch,
+ MSEHaveFallData,
+ MSEHaveFallDirection,
+ MSEPositionX,
+ MSEPositionY,
+ MSEPositionZ,
+ MSEPositionO,
+ MSETimestamp,
+ MSEGuidByte2_2,
+ MSEGuidByte7_2,
+ MSEGuidByte5_2,
+ MSETransportTime,
+ MSETransportPositionX,
+ MSETransportPositionY,
+ MSETransportPositionZ,
+ MSETransportPositionO,
+ MSETransportSeat,
+ MSETransportGuidByte3_2,
+ MSETransportGuidByte1_2,
+ MSETransportTime3,
+ MSETransportGuidByte6_2,
+ MSETransportGuidByte0_2,
+ MSETransportGuidByte5_2,
+ MSETransportTime2,
+ MSETransportGuidByte7_2,
+ MSETransportGuidByte4_2,
+ MSETransportGuidByte2_2,
+ MSEGuidByte0_2,
+ MSESplineElev,
+ MSEPitch,
+ MSEFallVerticalSpeed,
+ MSEFallTime,
+ MSEFallHorizontalSpeed,
+ MSEFallCosAngle,
+ MSEFallSinAngle,
+ MSEGuidByte1_2,
+ MSEGuidByte3_2,
+ MSEGuidByte4_2,
+ MSEGuidByte6_2,
+};
+
+MovementStatusElements MovementStopTurnSequence[] = {
+ MSEGuidByte3,
+ MSEGuidByte5,
+ MSEGuidByte4,
+ MSEGuidByte2,
+ MSEFlags2,
+ MSEGuidByte0,
+ MSEGuidByte7,
+ MSEGuidByte6,
+ MSEGuidByte1,
+ MSEHaveSpline,
+ MSEFlags,
+ MSEHaveFallData,
+ MSEHaveFallDirection,
+ MSEHaveTransportData,
+ MSETransportGuidByte6,
+ MSETransportGuidByte3,
+ MSETransportGuidByte7,
+ MSETransportGuidByte4,
+ MSETransportGuidByte1,
+ MSETransportGuidByte0,
+ MSETransportGuidByte2,
+ MSETransportGuidByte5,
+ MSETransportHaveTime3,
+ MSETransportHaveTime2,
+ MSEHaveSplineElev,
+ MSEHavePitch,
+ MSEPositionO,
+ MSETimestamp,
+ MSEPositionX,
+ MSEPositionY,
+ MSEPositionZ,
+ MSEGuidByte4_2,
+ MSEGuidByte2_2,
+ MSEGuidByte5_2,
+ MSEFallVerticalSpeed,
+ MSEFallTime,
+ MSEFallHorizontalSpeed,
+ MSEFallCosAngle,
+ MSEFallSinAngle,
+ MSEGuidByte0_2,
+ MSEGuidByte7_2,
+ MSEGuidByte6_2,
+ MSETransportTime,
+ MSETransportPositionX,
+ MSETransportPositionY,
+ MSETransportPositionZ,
+ MSETransportPositionO,
+ MSETransportSeat,
+ MSETransportGuidByte3_2,
+ MSETransportGuidByte1_2,
+ MSETransportTime3,
+ MSETransportGuidByte6_2,
+ MSETransportGuidByte0_2,
+ MSETransportGuidByte5_2,
+ MSETransportTime2,
+ MSETransportGuidByte7_2,
+ MSETransportGuidByte4_2,
+ MSETransportGuidByte2_2,
+ MSESplineElev,
+ MSEGuidByte1_2,
+ MSEGuidByte3_2,
+ MSEPitch,
+};
+
+MovementStatusElements MovementStartAscendSequence[] = {
+ MSEGuidByte2,
+ MSEGuidByte3,
+ MSEGuidByte6,
+ MSEGuidByte4,
+ MSEGuidByte0,
+ MSEHaveSpline,
+ MSEGuidByte1,
+ MSEGuidByte5,
+ MSEFlags,
+ MSEFlags2,
+ MSEGuidByte7,
+ MSEHaveTransportData,
+ MSETransportGuidByte6,
+ MSETransportGuidByte3,
+ MSETransportGuidByte7,
+ MSETransportGuidByte4,
+ MSETransportGuidByte1,
+ MSETransportGuidByte0,
+ MSETransportGuidByte2,
+ MSETransportGuidByte5,
+ MSETransportHaveTime3,
+ MSETransportHaveTime2,
+ MSEHaveFallData,
+ MSEHaveFallDirection,
+ MSEHavePitch,
+ MSEHaveSplineElev,
+ MSEPositionO,
+ MSEPositionX,
+ MSEPositionY,
+ MSEPositionZ,
+ MSETimestamp,
+ MSETransportTime,
+ MSETransportPositionX,
+ MSETransportPositionY,
+ MSETransportPositionZ,
+ MSETransportPositionO,
+ MSETransportSeat,
+ MSETransportGuidByte3_2,
+ MSETransportGuidByte1_2,
+ MSETransportTime3,
+ MSETransportGuidByte6_2,
+ MSETransportGuidByte0_2,
+ MSETransportGuidByte5_2,
+ MSETransportTime2,
+ MSETransportGuidByte7_2,
+ MSETransportGuidByte4_2,
+ MSETransportGuidByte2_2,
+ MSEGuidByte5_2,
+ MSEGuidByte3_2,
+ MSEGuidByte4_2,
+ MSEFallVerticalSpeed,
+ MSEFallTime,
+ MSEFallHorizontalSpeed,
+ MSEFallCosAngle,
+ MSEFallSinAngle,
+ MSEGuidByte0_2,
+ MSEGuidByte2_2,
+ MSEPitch,
+ MSEGuidByte6_2,
+ MSESplineElev,
+ MSEGuidByte7_2,
+ MSEGuidByte1_2,
+};
+
+MovementStatusElements MovementStartDescendSequence[] = {
+ MSEGuidByte7,
+ MSEGuidByte0,
+ MSEGuidByte2,
+ MSEGuidByte1,
+ MSEGuidByte6,
+ MSEGuidByte4,
+ MSEGuidByte5,
+ MSEHaveSpline,
+ MSEGuidByte3,
+ MSEFlags2,
+ MSEFlags,
+ MSEHaveFallData,
+ MSEHaveFallDirection,
+ MSEHavePitch,
+ MSEHaveSplineElev,
+ MSEHaveTransportData,
+ MSETransportGuidByte6,
+ MSETransportGuidByte3,
+ MSETransportGuidByte7,
+ MSETransportGuidByte4,
+ MSETransportGuidByte1,
+ MSETransportGuidByte0,
+ MSETransportGuidByte2,
+ MSETransportGuidByte5,
+ MSETransportHaveTime3,
+ MSETransportHaveTime2,
+ MSETimestamp,
+ MSEPositionX,
+ MSEPositionY,
+ MSEPositionZ,
+ MSEPositionO,
+ MSEGuidByte3_2,
+ MSEGuidByte4_2,
+ MSEGuidByte2_2,
+ MSEFallVerticalSpeed,
+ MSEFallTime,
+ MSEFallHorizontalSpeed,
+ MSEFallCosAngle,
+ MSEFallSinAngle,
+ MSEPitch,
+ MSEGuidByte5_2,
+ MSESplineElev,
+ MSETransportTime,
+ MSETransportPositionX,
+ MSETransportPositionY,
+ MSETransportPositionZ,
+ MSETransportPositionO,
+ MSETransportSeat,
+ MSETransportGuidByte3_2,
+ MSETransportGuidByte1_2,
+ MSETransportTime3,
+ MSETransportGuidByte6_2,
+ MSETransportGuidByte0_2,
+ MSETransportGuidByte5_2,
+ MSETransportTime2,
+ MSETransportGuidByte7_2,
+ MSETransportGuidByte4_2,
+ MSETransportGuidByte2_2,
+ MSEGuidByte1_2,
+ MSEGuidByte0_2,
+ MSEGuidByte7_2,
+ MSEGuidByte6_2,
+};
+
+MovementStatusElements MovementStartSwimSequence[] = {
+ MSEGuidByte1,
+ MSEGuidByte5,
+ MSEFlags,
+ MSEGuidByte2,
+ MSEHaveSpline,
+ MSEGuidByte6,
+ MSEFlags2,
+ MSEGuidByte4,
+ MSEGuidByte7,
+ MSEGuidByte0,
+ MSEGuidByte3,
+ MSEHavePitch,
+ MSEHaveSplineElev,
+ MSEHaveFallData,
+ MSEHaveFallDirection,
+ MSEHaveTransportData,
+ MSETransportGuidByte6,
+ MSETransportGuidByte3,
+ MSETransportGuidByte7,
+ MSETransportGuidByte4,
+ MSETransportGuidByte1,
+ MSETransportGuidByte0,
+ MSETransportGuidByte2,
+ MSETransportGuidByte5,
+ MSETransportHaveTime3,
+ MSETransportHaveTime2,
+ MSEPositionO,
+ MSEPositionX,
+ MSEPositionY,
+ MSEPositionZ,
+ MSETimestamp,
+ MSEPitch,
+ MSEGuidByte4_2,
+ MSESplineElev,
+ MSEFallVerticalSpeed,
+ MSEFallTime,
+ MSEFallHorizontalSpeed,
+ MSEFallCosAngle,
+ MSEFallSinAngle,
+ MSEGuidByte0_2,
+ MSEGuidByte7_2,
+ MSETransportTime,
+ MSETransportPositionX,
+ MSETransportPositionY,
+ MSETransportPositionZ,
+ MSETransportPositionO,
+ MSETransportSeat,
+ MSETransportGuidByte3_2,
+ MSETransportGuidByte1_2,
+ MSETransportTime3,
+ MSETransportGuidByte6_2,
+ MSETransportGuidByte0_2,
+ MSETransportGuidByte5_2,
+ MSETransportTime2,
+ MSETransportGuidByte7_2,
+ MSETransportGuidByte4_2,
+ MSETransportGuidByte2_2,
+ MSEGuidByte6_2,
+ MSEGuidByte5_2,
+ MSEGuidByte2_2,
+ MSEGuidByte1_2,
+ MSEGuidByte3_2,
+};
+
+MovementStatusElements MovementStopAscendSequence[] = {
+ MSEHaveSpline,
+ MSEGuidByte5,
+ MSEGuidByte3,
+ MSEGuidByte1,
+ MSEFlags,
+ MSEGuidByte4,
+ MSEGuidByte7,
+ MSEGuidByte2,
+ MSEFlags2,
+ MSEGuidByte6,
+ MSEGuidByte0,
+ MSEHavePitch,
+ MSEHaveSplineElev,
+ MSEHaveFallData,
+ MSEHaveFallDirection,
+ MSEHaveTransportData,
+ MSETransportGuidByte6,
+ MSETransportGuidByte3,
+ MSETransportGuidByte7,
+ MSETransportGuidByte4,
+ MSETransportGuidByte1,
+ MSETransportGuidByte0,
+ MSETransportGuidByte2,
+ MSETransportGuidByte5,
+ MSETransportHaveTime3,
+ MSETransportHaveTime2,
+ MSETimestamp,
+ MSEPositionX,
+ MSEPositionY,
+ MSEPositionZ,
+ MSEPositionO,
+ MSEGuidByte5_2,
+ MSEGuidByte2_2,
+ MSEGuidByte0_2,
+ MSEGuidByte7_2,
+ MSEPitch,
+ MSEGuidByte3_2,
+ MSEGuidByte4_2,
+ MSEGuidByte1_2,
+ MSESplineElev,
+ MSEFallVerticalSpeed,
+ MSEFallTime,
+ MSEFallHorizontalSpeed,
+ MSEFallCosAngle,
+ MSEFallSinAngle,
+ MSEGuidByte6_2,
+ MSETransportTime,
+ MSETransportPositionX,
+ MSETransportPositionY,
+ MSETransportPositionZ,
+ MSETransportPositionO,
+ MSETransportSeat,
+ MSETransportGuidByte3_2,
+ MSETransportGuidByte1_2,
+ MSETransportTime3,
+ MSETransportGuidByte6_2,
+ MSETransportGuidByte0_2,
+ MSETransportGuidByte5_2,
+ MSETransportTime2,
+ MSETransportGuidByte7_2,
+ MSETransportGuidByte4_2,
+ MSETransportGuidByte2_2,
+};
+
+MovementStatusElements* GetMovementStatusElementsSequence(Opcodes opcode)
+{
+ switch(opcode)
+ {
+ case SMSG_PLAYER_MOVE:
+ return PlayerMoveSequence;
+ case MSG_MOVE_FALL_LAND:
+ return MovementFallLandSequence;
+ case MSG_MOVE_HEARTBEAT:
+ return MovementHeartBeatSequence;
+ case MSG_MOVE_JUMP:
+ return MovementJumpSequence;
+ case MSG_MOVE_SET_FACING:
+ return MovementSetFacingSequence;
+ case MSG_MOVE_SET_PITCH:
+ return MovementSetPitchSequence;
+ case MSG_MOVE_START_BACKWARD:
+ return MovementStartBackwardSequence;
+ case MSG_MOVE_START_FORWARD:
+ return MovementStartForwardSequence;
+ case MSG_MOVE_START_STRAFE_LEFT:
+ return MovementStartStrafeLeftSequence;
+ case MSG_MOVE_START_STRAFE_RIGHT:
+ return MovementStartStrafeRightSequence;
+ case MSG_MOVE_START_TURN_LEFT:
+ return MovementStartTurnLeftSequence;
+ case MSG_MOVE_START_TURN_RIGHT:
+ return MovementStartTurnRightSequence;
+ case MSG_MOVE_STOP:
+ return MovementStopSequence;
+ case MSG_MOVE_STOP_STRAFE:
+ return MovementStopStrafeSequence;
+ case MSG_MOVE_STOP_TURN:
+ return MovementStopTurnSequence;
+ case MSG_MOVE_START_ASCEND:
+ return MovementStartAscendSequence;
+ case MSG_MOVE_START_DESCEND:
+ return MovementStartDescendSequence;
+ case MSG_MOVE_START_SWIM:
+ return MovementStartSwimSequence;
+ case MSG_MOVE_STOP_ASCEND:
+ return MovementStopAscendSequence;
+ }
+ return NULL;
+}
+
+#endif
diff --git a/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp b/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp
index 22eb002ca71..4b825ea4248 100755
--- a/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp
+++ b/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp
@@ -30,6 +30,7 @@
#include "WaypointMovementGenerator.h"
#include "InstanceSaveMgr.h"
#include "ObjectMgr.h"
+#include "MovementStructures.h"
void WorldSession::HandleMoveWorldportAckOpcode(WorldPacket & /*recv_data*/)
{
@@ -257,21 +258,14 @@ void WorldSession::HandleMovementOpcodes(WorldPacket & recv_data)
return;
}
- return; //temp to prevent spamming of bytebuffer exceptions until correct structure is found
-
/* extract packet */
- uint64 guid;
-
- recv_data.readPackGUID(guid);
-
MovementInfo movementInfo;
- movementInfo.guid = guid;
ReadMovementInfo(recv_data, &movementInfo);
recv_data.rfinish(); // prevent warnings spam
// prevent tampered movement data
- if (guid != mover->GetGUID())
+ if (movementInfo.guid != mover->GetGUID())
return;
if (!movementInfo.pos.IsPositionValid())
@@ -342,10 +336,10 @@ void WorldSession::HandleMovementOpcodes(WorldPacket & recv_data)
/*----------------------*/
/* process position-change */
- WorldPacket data(Opcodes(opcode), recv_data.size());
+ WorldPacket data(SMSG_PLAYER_MOVE, recv_data.size());
movementInfo.time = getMSTime();
movementInfo.guid = mover->GetGUID();
- WriteMovementInfo(&data, &movementInfo);
+ WriteMovementInfo(data, &movementInfo);
mover->SendMessageToSet(&data, _player);
mover->m_movementInfo = movementInfo;
@@ -587,3 +581,324 @@ void WorldSession::HandleSummonResponseOpcode(WorldPacket& recv_data)
_player->SummonIfPossible(agree);
}
+void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo* mi)
+{
+ bool HaveTransportData = false,
+ HaveTransportTime2 = false,
+ HaveTransportTime3 = false,
+ HavePitch = false,
+ HaveFallData = false,
+ HaveFallDirection = false,
+ HaveSplineElevation = false,
+ HaveSpline = false;
+
+ MovementStatusElements *sequence = GetMovementStatusElementsSequence(data.GetOpcode());
+ if(sequence == NULL)
+ return;
+ uint8 guid[8];
+ uint8 tguid[8];
+ *(uint64*)guid = 0;
+ *(uint64*)tguid = 0;
+ for(uint32 i=0; i < MSE_COUNT; i++)
+ {
+ MovementStatusElements element = sequence[i];
+
+ if (element >= MSEGuidByte0 && element <= MSEGuidByte7)
+ {
+ data.ReadByteMask(guid[element - MSEGuidByte0]);
+ continue;
+ }
+
+ if (element >= MSETransportGuidByte0 &&
+ element <= MSETransportGuidByte7)
+ {
+ if (HaveTransportData)
+ data.ReadByteMask(tguid[element - MSETransportGuidByte0]);
+ continue;
+ }
+
+ if (element >= MSEGuidByte0_2 && element <= MSEGuidByte7_2)
+ {
+ data.ReadByteSeq(guid[element - MSEGuidByte0_2]);
+ continue;
+ }
+
+ if (element >= MSETransportGuidByte0_2 &&
+ element <= MSETransportGuidByte7_2)
+ {
+ if (HaveTransportData)
+ data.ReadByteSeq(tguid[element - MSETransportGuidByte0_2]);
+ continue;
+ }
+
+ switch (element)
+ {
+ case MSEFlags:
+ mi->flags = data.ReadBits(30);
+ break;
+ case MSEFlags2:
+ mi->flags2 = data.ReadBits(12);
+ break;
+ case MSETimestamp:
+ data >> mi->time;
+ break;
+ case MSEHavePitch:
+ HavePitch = data.ReadBit();
+ break;
+ case MSEHaveFallData:
+ HaveFallData = data.ReadBit();
+ break;
+ case MSEHaveFallDirection:
+ if (HaveFallData)
+ HaveFallDirection = data.ReadBit();
+ break;
+ case MSEHaveTransportData:
+ HaveTransportData = data.ReadBit();
+ break;
+ case MSETransportHaveTime2:
+ if (HaveTransportData)
+ HaveTransportTime2 = data.ReadBit();
+ break;
+ case MSETransportHaveTime3:
+ if (HaveTransportData)
+ HaveTransportTime3 = data.ReadBit();
+ break;
+ case MSEHaveSpline:
+ HaveSpline = data.ReadBit();
+ break;
+ case MSEHaveSplineElev:
+ HaveSplineElevation = data.ReadBit();
+ break;
+ case MSEPositionX:
+ data >> mi->pos.PositionXYZStream();
+ break;
+ case MSEPositionY:
+ case MSEPositionZ:
+ break; // assume they always go as vector of 3
+ case MSEPositionO:
+ data >> mi->pos.m_orientation;
+ break;
+ case MSEPitch:
+ if (HavePitch)
+ data >> mi->pitch;
+ break;
+ case MSEFallTime:
+ if (HaveFallData)
+ data >> mi->fallTime;
+ break;
+ case MSESplineElev:
+ if (HaveSplineElevation)
+ data >> mi->splineElevation;
+ break;
+ case MSEFallHorizontalSpeed:
+ if (HaveFallDirection)
+ data >> mi->j_xyspeed;
+ break;
+ case MSEFallVerticalSpeed:
+ if (HaveFallData)
+ data >> mi->j_zspeed;
+ break;
+ case MSEFallCosAngle:
+ if (HaveFallDirection)
+ data >> mi->j_cosAngle;
+ break;
+ case MSEFallSinAngle:
+ if (HaveFallDirection)
+ data >> mi->j_sinAngle;
+ break;
+ case MSETransportSeat:
+ if (HaveTransportData)
+ data >> mi->t_seat;
+ break;
+ case MSETransportPositionO:
+ if (HaveTransportData)
+ data >> mi->t_pos.m_orientation;
+ break;
+ case MSETransportPositionX:
+ if (HaveTransportData)
+ data >> mi->t_pos.PositionXYZStream();
+ break;
+ case MSETransportPositionY:
+ case MSETransportPositionZ:
+ break; // assume they always go as vector of 3
+ case MSETransportTime:
+ if (HaveTransportData)
+ data >> mi->t_time;
+ break;
+ case MSETransportTime2:
+ if (HaveTransportTime2)
+ data >> mi->t_time2;
+ break;
+ case MSETransportTime3:
+ if (HaveTransportTime3)
+ data >> mi->t_time3;
+ break;
+ default:
+ WPError(false, "Incorrect sequence element detected at ReadMovementInfo");
+ }
+ }
+
+ mi->guid = *(uint64*)guid;
+ mi->t_guid = *(uint64*)tguid;
+
+ if (HaveTransportData && mi->pos.m_positionX != mi->t_pos.m_positionX)
+ if (GetPlayer()->GetTransport())
+ GetPlayer()->GetTransport()->UpdatePosition(mi);
+}
+
+void WorldSession::WriteMovementInfo(WorldPacket &data, MovementInfo* mi)
+{
+ bool HaveTransportData = mi->HasMovementFlag(MOVEMENTFLAG_ONTRANSPORT),
+ HaveTransportTime2 = (mi->flags2 & MOVEMENTFLAG2_INTERPOLATED_MOVEMENT) != 0,
+ HaveTransportTime3 = false,
+ HavePitch = (mi->HasMovementFlag(MovementFlags(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING)))
+ || (mi->flags2 & MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING),
+ HaveFallData = mi->HasExtraMovementFlag(MOVEMENTFLAG2_INTERPOLATED_TURNING),
+ HaveFallDirection = mi->HasMovementFlag(MOVEMENTFLAG_JUMPING),
+ HaveSplineElevation = mi->HasMovementFlag(MOVEMENTFLAG_SPLINE_ELEVATION),
+ HaveSpline = false;
+
+ MovementStatusElements *sequence = GetMovementStatusElementsSequence(data.GetOpcode());
+ if(!sequence)
+ return;
+ uint8 *guid = (uint8 *)&mi->guid;
+ uint8 *tguid = (uint8 *)&mi->t_guid;
+ for(uint32 i=0; i < MSE_COUNT; i++)
+ {
+ MovementStatusElements element = sequence[i];
+
+ if (element >= MSEGuidByte0 && element <= MSEGuidByte7)
+ {
+ data.WriteByteMask(guid[element - MSEGuidByte0]);
+ continue;
+ }
+
+ if (element >= MSETransportGuidByte0 &&
+ element <= MSETransportGuidByte7)
+ {
+ if (HaveTransportData)
+ data.WriteByteMask(tguid[element - MSETransportGuidByte0]);
+ continue;
+ }
+
+ if (element >= MSEGuidByte0_2 && element <= MSEGuidByte7_2)
+ {
+ data.WriteByteSeq(guid[element - MSEGuidByte0_2]);
+ continue;
+ }
+
+ if (element >= MSETransportGuidByte0_2 &&
+ element <= MSETransportGuidByte7_2)
+ {
+ if (HaveTransportData)
+ data.WriteByteSeq(tguid[element - MSETransportGuidByte0_2]);
+ continue;
+ }
+
+ switch (element)
+ {
+ case MSEFlags:
+ data.WriteBits(mi->flags, 30);
+ break;
+ case MSEFlags2:
+ data.WriteBits(mi->flags2, 12);
+ break;
+ case MSETimestamp:
+ data << mi->time;
+ break;
+ case MSEHavePitch:
+ data.WriteBit(HavePitch);
+ break;
+ case MSEHaveFallData:
+ data.WriteBit(HaveFallData);
+ break;
+ case MSEHaveFallDirection:
+ if (HaveFallData)
+ data.WriteBit(HaveFallDirection);
+ break;
+ case MSEHaveTransportData:
+ data.WriteBit(HaveTransportData);
+ break;
+ case MSETransportHaveTime2:
+ if (HaveTransportData)
+ data.WriteBit(HaveTransportTime2);
+ break;
+ case MSETransportHaveTime3:
+ if (HaveTransportData)
+ data.WriteBit(HaveTransportTime3);
+ break;
+ case MSEHaveSpline:
+ data.WriteBit(HaveSpline);
+ break;
+ case MSEHaveSplineElev:
+ data.WriteBit(HaveSplineElevation);
+ break;
+ case MSEPositionX:
+ data << mi->pos.PositionXYZStream();
+ break;
+ case MSEPositionY:
+ case MSEPositionZ:
+ break; // assume they always go as vector of 3
+ case MSEPositionO:
+ data << mi->pos.m_orientation;
+ break;
+ case MSEPitch:
+ if (HavePitch)
+ data << mi->pitch;
+ break;
+ case MSEFallTime:
+ if (HaveFallData)
+ data << mi->fallTime;
+ break;
+ case MSESplineElev:
+ if (HaveSplineElevation)
+ data << mi->splineElevation;
+ break;
+ case MSEFallHorizontalSpeed:
+ if (HaveFallDirection)
+ data << mi->j_xyspeed;
+ break;
+ case MSEFallVerticalSpeed:
+ if (HaveFallData)
+ data << mi->j_zspeed;
+ break;
+ case MSEFallCosAngle:
+ if (HaveFallDirection)
+ data << mi->j_cosAngle;
+ break;
+ case MSEFallSinAngle:
+ if (HaveFallDirection)
+ data << mi->j_sinAngle;
+ break;
+ case MSETransportSeat:
+ if (HaveTransportData)
+ data << mi->t_seat;
+ break;
+ case MSETransportPositionO:
+ if (HaveTransportData)
+ data << mi->t_pos.m_orientation;
+ break;
+ case MSETransportPositionX:
+ if (HaveTransportData)
+ data << mi->t_pos.PositionXYZStream();
+ break;
+ case MSETransportPositionY:
+ case MSETransportPositionZ:
+ break; // assume they always go as vector of 3
+ case MSETransportTime:
+ if (HaveTransportData)
+ data << mi->t_time;
+ break;
+ case MSETransportTime2:
+ if (HaveTransportTime2)
+ data << mi->t_time2;
+ break;
+ case MSETransportTime3:
+ if (HaveTransportTime3)
+ data << mi->t_time3;
+ break;
+ default:
+ WPError(false, "Incorrect sequence element detected at ReadMovementInfo");
+ }
+ }
+} \ No newline at end of file
diff --git a/src/server/game/Server/WorldPacket.h b/src/server/game/Server/WorldPacket.h
index cd6f95c2d2e..bfecf390d68 100644
--- a/src/server/game/Server/WorldPacket.h
+++ b/src/server/game/Server/WorldPacket.h
@@ -50,6 +50,28 @@ class WorldPacket : public ByteBuffer
void SetOpcode(Opcodes opcode) { m_opcode = opcode; }
void Compress(Opcodes opcode);
+ void ReadByteMask(uint8& b)
+ {
+ b = ReadBit() ? 1 : 0;
+ }
+
+ void ReadByteSeq(uint8& b)
+ {
+ if (b != 0)
+ b ^= read<uint8>();
+ }
+
+ void WriteByteMask(uint8 b)
+ {
+ WriteBit(b);
+ }
+
+ void WriteByteSeq(uint8 b)
+ {
+ if (b != 0)
+ append<uint8>(b ^ 1);
+ }
+
protected:
Opcodes m_opcode;
void Compress(void* dst, uint32 *dst_size, const void* src, int src_size);
diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp
index 05149b41995..8087307dab6 100755
--- a/src/server/game/Server/WorldSession.cpp
+++ b/src/server/game/Server/WorldSession.cpp
@@ -728,111 +728,6 @@ void WorldSession::SaveTutorialsData(SQLTransaction &trans)
m_TutorialsChanged = false;
}
-void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo* mi)
-{
- data >> mi->flags;
- data >> mi->flags2;
- data >> mi->time;
- data >> mi->pos.PositionXYZOStream();
-
- if (mi->HasMovementFlag(MOVEMENTFLAG_ONTRANSPORT))
- {
- data.readPackGUID(mi->t_guid);
-
- data >> mi->t_pos.PositionXYZOStream();
- data >> mi->t_time;
- data >> mi->t_seat;
-
- if (mi->HasExtraMovementFlag(MOVEMENTFLAG2_INTERPOLATED_MOVEMENT))
- data >> mi->t_time2;
-
- if (mi->pos.m_positionX != mi->t_pos.m_positionX)
- if (GetPlayer()->GetTransport())
- GetPlayer()->GetTransport()->UpdatePosition(mi);
- }
-
- if (mi->HasMovementFlag(MovementFlags(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING)) || (mi->HasExtraMovementFlag(MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING)))
- data >> mi->pitch;
-
- data >> mi->fallTime;
-
- if (mi->HasMovementFlag(MOVEMENTFLAG_JUMPING))
- {
- data >> mi->j_zspeed;
- data >> mi->j_sinAngle;
- data >> mi->j_cosAngle;
- data >> mi->j_xyspeed;
- }
-
- if (mi->HasMovementFlag(MOVEMENTFLAG_SPLINE_ELEVATION))
- data >> mi->splineElevation;
-
- // This must be a packet spoofing attempt. MOVEMENTFLAG_ROOT sent from the client is not valid,
- // and when used in conjunction with any of the moving movement flags such as MOVEMENTFLAG_FORWARD
- // it will freeze clients that receive this player's movement info.
- if (mi->HasMovementFlag(MOVEMENTFLAG_ROOT))
- mi->flags &= ~MOVEMENTFLAG_ROOT;
-
- // Cannot hover and jump at the same time
- if (mi->HasMovementFlag(MOVEMENTFLAG_HOVER) && mi->HasMovementFlag(MOVEMENTFLAG_JUMPING))
- mi->flags &= ~MOVEMENTFLAG_JUMPING;
-
- // Cannot ascend and descend at the same time
- if (mi->HasMovementFlag(MOVEMENTFLAG_ASCENDING) && mi->HasMovementFlag(MOVEMENTFLAG_DESCENDING))
- mi->flags &= ~(MOVEMENTFLAG_ASCENDING | MOVEMENTFLAG_DESCENDING);
-
- // Cannot move left and right at the same time
- if (mi->HasMovementFlag(MOVEMENTFLAG_LEFT) && mi->HasMovementFlag(MOVEMENTFLAG_RIGHT))
- mi->flags &= ~(MOVEMENTFLAG_LEFT | MOVEMENTFLAG_RIGHT);
-
- // Cannot strafe left and right at the same time
- if (mi->HasMovementFlag(MOVEMENTFLAG_STRAFE_LEFT) && mi->HasMovementFlag(MOVEMENTFLAG_STRAFE_RIGHT))
- mi->flags &= ~(MOVEMENTFLAG_STRAFE_LEFT | MOVEMENTFLAG_STRAFE_RIGHT);
-
- // Cannot pitch up and down at the same time
- if (mi->HasMovementFlag(MOVEMENTFLAG_PITCH_UP) && mi->HasMovementFlag(MOVEMENTFLAG_PITCH_DOWN))
- mi->flags &= ~(MOVEMENTFLAG_PITCH_UP | MOVEMENTFLAG_PITCH_DOWN);
-
- // Cannot move forwards and backwards at the same time
- if (mi->HasMovementFlag(MOVEMENTFLAG_FORWARD) && mi->HasMovementFlag(MOVEMENTFLAG_BACKWARD))
- mi->flags &= ~(MOVEMENTFLAG_FORWARD | MOVEMENTFLAG_BACKWARD);
-}
-
-void WorldSession::WriteMovementInfo(WorldPacket* data, MovementInfo* mi)
-{
- data->appendPackGUID(mi->guid);
-
- *data << mi->flags;
- *data << mi->flags2;
- *data << mi->time;
- *data << mi->pos.PositionXYZOStream();
-
- if (mi->HasMovementFlag(MOVEMENTFLAG_ONTRANSPORT))
- {
- data->appendPackGUID(mi->t_guid);
-
- *data << mi->t_pos.PositionXYZOStream();
- *data << mi->t_time;
- *data << mi->t_seat;
- }
-
- if (mi->HasMovementFlag(MovementFlags(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING)) || mi->HasExtraMovementFlag(MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING))
- *data << mi->pitch;
-
- *data << mi->fallTime;
-
- if (mi->HasMovementFlag(MOVEMENTFLAG_JUMPING))
- {
- *data << mi->j_zspeed;
- *data << mi->j_sinAngle;
- *data << mi->j_cosAngle;
- *data << mi->j_xyspeed;
- }
-
- if (mi->HasMovementFlag(MOVEMENTFLAG_SPLINE_ELEVATION))
- *data << mi->splineElevation;
-}
-
void WorldSession::ReadAddonsInfo(WorldPacket &data)
{
if (data.rpos() + 4 > data.size())
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 97ea0173545..e19b26af374 100755
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -231,7 +231,7 @@ class WorldSession
void SendAddonsInfo();
void ReadMovementInfo(WorldPacket& data, MovementInfo* mi);
- void WriteMovementInfo(WorldPacket* data, MovementInfo* mi);
+ void WriteMovementInfo(WorldPacket &data, MovementInfo* mi);
void SendPacket(WorldPacket const* packet);
void SendNotification(const char *format, ...) ATTR_PRINTF(2, 3);