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.
This commit is contained in:
@@ -807,35 +807,48 @@ void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo* mi)
|
|||||||
if (mi->HasMovementFlag(MOVEMENTFLAG_SPLINE_ELEVATION))
|
if (mi->HasMovementFlag(MOVEMENTFLAG_SPLINE_ELEVATION))
|
||||||
data >> mi->splineElevation;
|
data >> mi->splineElevation;
|
||||||
|
|
||||||
// This must be a packet spoofing attempt. MOVEMENTFLAG_ROOT sent from the client is not valid,
|
/*! 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
|
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.
|
it will freeze clients that receive this player's movement info.
|
||||||
|
*/
|
||||||
if (mi->HasMovementFlag(MOVEMENTFLAG_ROOT))
|
if (mi->HasMovementFlag(MOVEMENTFLAG_ROOT))
|
||||||
mi->flags &= ~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))
|
if (mi->HasMovementFlag(MOVEMENTFLAG_HOVER) && mi->HasMovementFlag(MOVEMENTFLAG_JUMPING))
|
||||||
mi->flags &= ~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))
|
if (mi->HasMovementFlag(MOVEMENTFLAG_ASCENDING) && mi->HasMovementFlag(MOVEMENTFLAG_DESCENDING))
|
||||||
mi->flags &= ~(MOVEMENTFLAG_ASCENDING | 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))
|
if (mi->HasMovementFlag(MOVEMENTFLAG_LEFT) && mi->HasMovementFlag(MOVEMENTFLAG_RIGHT))
|
||||||
mi->flags &= ~(MOVEMENTFLAG_LEFT | 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))
|
if (mi->HasMovementFlag(MOVEMENTFLAG_STRAFE_LEFT) && mi->HasMovementFlag(MOVEMENTFLAG_STRAFE_RIGHT))
|
||||||
mi->flags &= ~(MOVEMENTFLAG_STRAFE_LEFT | 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))
|
if (mi->HasMovementFlag(MOVEMENTFLAG_PITCH_UP) && mi->HasMovementFlag(MOVEMENTFLAG_PITCH_DOWN))
|
||||||
mi->flags &= ~(MOVEMENTFLAG_PITCH_UP | 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))
|
if (mi->HasMovementFlag(MOVEMENTFLAG_FORWARD) && mi->HasMovementFlag(MOVEMENTFLAG_BACKWARD))
|
||||||
mi->flags &= ~(MOVEMENTFLAG_FORWARD | 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)
|
void WorldSession::WriteMovementInfo(WorldPacket* data, MovementInfo* mi)
|
||||||
|
|||||||
Reference in New Issue
Block a user