diff options
-rw-r--r-- | src/server/game/Movement/MovementStructures.h | 1374 | ||||
-rwxr-xr-x | src/server/game/Server/Protocol/Handlers/MovementHandler.cpp | 335 | ||||
-rw-r--r-- | src/server/game/Server/WorldPacket.h | 22 | ||||
-rwxr-xr-x | src/server/game/Server/WorldSession.cpp | 105 | ||||
-rwxr-xr-x | src/server/game/Server/WorldSession.h | 2 |
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); |