fully working client-side prediction