Yes, hook their sendpacket routine and spoof the movement state when you receive a movement packet. It may seem hard, but trust me.. its not.
Code:
if ( (wOpcode >= MSG_MOVE_START_FORWARD && wOpcode <= MSG_MOVE_WORLDPORT_ACK) || wOpcode == MSG_MOVE_HEARTBEAT )
{
gLog.Log( "Movement Flags: %08X", pBuffer[1] );
if ( pBuffer[1] & MOVEFLAG_LEVITATE )
pBuffer[1] &= ~MOVEFLAG_LEVITATE;
if ( pBuffer[1] & MOVEFLAG_WATER_WALK )
pBuffer[1] &= ~MOVEFLAG_WATER_WALK;
if ( pBuffer[1] & MOVEFLAG_FEATHER_FALL )
pBuffer[1] &= ~MOVEFLAG_FEATHER_FALL;
gLog.Log( "Patched Movement Flags: %08X", pBuffer[1] );
}