По идее, боты должны не слишком отличаться от персонажей игроков. Разница только в том, что персонаж двигается сервером по сообщению ws от игрока, а бот - по команде от самого бота, но суть сообщений и команд одна и та же, например, "начать ехать вправо". Ну а сервер должен сразу присылать игроку изменившиеся координаты тех или иных объектов.
ботам периодически, по таймеру, предоставляется возможность оценить ситуацию и "подумать", что дальше делать, и отправить команду в механизм перемещаний.
копия мира на клиенте обновляется по сообщениям ws. Перерисовка - по requestAnimationFrame, где берутся текущие координаты. Обычно такой подход дает плавное движение.
тут есть досадный момент: например, игрок нажимает кнопку-стрелку вправо, но пока об этом дойдет по ws до сервера, пока сервер сдвинет игрока и сообщит об этом обратно на клиента, могут пройти десятки или даже сотни миллисекунд, это будет ощущаться как тормоза. Потому иногда делается "оптимистическое обновление" - на клиенте объект начинает ехать, не дождавшись сообщения от сервера. Выглядит более гладко, но возможен рассинхрон. Так что как лучше, непонятно, обычно это набор компромиссов.