По сути, движение в клиенте и движение на сервере - это два независимых процесса. Ну т.е для понимания, серверу для движения персонажа из точки А в точку Б не требуется клиент. Он его туда переместит независимо от того, будет ли клиент рисовать этот процесс или нет. При этом конечно, сервер заинтересован в том, чтобы клиент все же отрисовал анимацию движения персонажа из точка А в точку Б. Более того, он заинтересован в том, чтобы такая анимация отрисовалась корректно. Поэтому сервер должен строить маршрут и двигать персонажа так, чтобы в любой конкретный момент времени, координаты на сервере совпадали с координатами в клиенте. Проблема в том, что это все передается по сети и из-за всевозможных оптимизаций от 2004 года(когда в л2 играли на диалап модемах и GPRS), сервер также заинтересован в том, чтобы не разориться на трафике и не разорить клиентов.
Поэтому для оптимизации, сервер передает в клиент только точки начала и конца движения. Скорость персонажа передается отдельно в общем пакете информации о персонаже и клиент ей уже владеет на момент расчета вектора движения.
Исходя из двух полученных точек, известной скорости персонажа, клиент начинает движение из точки А в точку Б. И даже если ты прям сразу немедленно выключишь сервер или выдернешь Ethernet-кабель из мамки, то персонаж не остановится, а продолжит бежать, т.к он получил команду отрисовать движение из А в Б и сделает это не зависимо от того, будет ли связь с сервером или нет.
Поэтому, когда серверу необходимо остановить движение чара, то он шлет ему отдельный пакет остановки. Кроме того, если сервер направит новый пакет движения из Б в Ц, то персонаж побежит в Ц не из Б, а из фактической точки в клиенте, где он сейчас находится(Из-за этого возникают всевозможные рассинхронизации, когда персонаж на сервере добежал до конечной, а в клиенте нет, т.к сервер отправил пакеты движения слишком рано). По-сути, клиент при каждом получении пакета движения из точки в точку, просто меняет вектор движения и задает время окончания анимации исходя из фактического расстояния между точками.
Вот два видео с демонстрацией корректной и некорректной синхронизации.
Корректная:
Посмотреть вложение 84476
Некорректная:
Посмотреть вложение 84475