Для Lineage 2 не рекомендуется считать с момента startingTime, ибо путь может быть криволинейным, из-за той же высоты. Сейчас Вы строете четкую прямую из A в B, но таких методов передвижения в игре почти не существует.
Рекомендую с некоторой переодичностью обновлять оригинальные координаты и считать текущую точку уже с момента обновления, и прошедшем времени движения с точки обновления. Небольшой снипет:
Код:
long timeNow = System.currentTimeMillis();
double complete = getSpeed(actor, isWalk) * (timeNow - moveModel.getPrevUpdateTime());
double divider = complete / moveModel.getEndMovePoint().getDistance3(actor.getLocation());
moveModel.setPrevUpdateTime(timeNow);
if(divider >= 1) {
if(!this.moveModel.compareAndSet(moveModel, null))
return;
actor.set(moveModel.getEndMovePoint());
completeMove();
return;
}
int dx = moveModel.getEndMovePoint().getX() - actor.getX();
int dy = moveModel.getEndMovePoint().getY() - actor.getY();
int dz = moveModel.getEndMovePoint().getZ() - actor.getZ();
int x = actor.getX() + (int)Math.round(divider * dx);
int y = actor.getY() + (int)Math.round(divider * dy);
int z = actor.getZ() + (int)Math.round(divider * dz);
actor.setXYZ(x, y, z);
В любом случае, в снипете все есть и можно переделать под поставленную задачу, без учета моих рекомендаций
P.S: Либо все тоже самое можно проделать с помощью векторов, используя вычитание, сложение, нормализацию и умножение векторов.