diff options
author | Machiavelli <machiavelli.trinity@gmail.com> | 2012-03-15 10:12:43 +0100 |
---|---|---|
committer | Machiavelli <machiavelli.trinity@gmail.com> | 2012-03-15 10:12:43 +0100 |
commit | e17a9cfb85602617f1c0b94d27ad0c5c8ce77a54 (patch) | |
tree | c3e2492567b60e34258ec3411c6630af0f7668b9 /src | |
parent | afaed98b7adcd1cbd72224439afaf08e7ba56efa (diff) |
Core/Movement: Add server side filters for MOVEMENTFLAG_WATERWALKING, _FALLING_SLOW and _HOVER depending on required aura types. Fixes exploiting when aura unapply packets (such as corrected in previous commit) are blocked/altered before reaching the client.
Diffstat (limited to 'src')
-rwxr-xr-x | src/server/game/Server/WorldSession.cpp | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index c88c5c6e087..84907937de5 100755 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -807,35 +807,48 @@ void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo* mi) 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. + /*! 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 + //! 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 + //! 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 + //! 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 + //! 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 + //! 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 + //! Cannot move forwards and backwards at the same time if (mi->HasMovementFlag(MOVEMENTFLAG_FORWARD) && mi->HasMovementFlag(MOVEMENTFLAG_BACKWARD)) mi->flags &= ~(MOVEMENTFLAG_FORWARD | MOVEMENTFLAG_BACKWARD); + + //! Cannot walk on water without SPELL_AURA_WATER_WALK + if (mi->HasMovementFlag(MOVEMENTFLAG_WATERWALKING) && !GetPlayer()->HasAuraType(SPELL_AURA_WATER_WALK)) + mi->flags &= ~MOVEMENTFLAG_WATERWALKING; + + //! Cannot feather fall without SPELL_AURA_FEATHER_FALL + if (mi->HasMovementFlag(MOVEMENTFLAG_FALLING_SLOW) && !GetPlayer()->HasAuraType(SPELL_AURA_FEATHER_FALL)) + mi->flags &= ~MOVEMENTFLAG_FALLING_SLOW; + + //! Cannot hover without SPELL_AURA_HOVER + if (mi->HasMovementFlag(MOVEMENTFLAG_HOVER) && !GetPlayer()->HasAuraType(SPELL_AURA_HOVER)) + mi->flags &= ~MOVEMENTFLAG_HOVER; } void WorldSession::WriteMovementInfo(WorldPacket* data, MovementInfo* mi) |