Общая логика использования GPS такова: Вы единожды (как правило в начале скрипта) загружаете карту (базу точек со связями - граф) - и потом имеете возможность перемещаться по миру используя эту карту с помощью всего лишь одной строчки кода.
Т.е. всесто огромных полотен кода с последовательным вызовом Engine.MoveTo у Вас в скрипте будет только одна строчка кода с указанием финальной координаты.

База точек представляет собой граф - список точек, некоторые из которых соединены, а некоторые нет. По нему и будет бегать наш персонаж. Выглядит это примерно так:

Важно отметить, что в приведенном ниже примере перемещение подразумевается только пешее, т.е. Вы не сможете заставить персонажа переместиться из условного Диона в Гиран, используя ГК.

 

uses SysUtils;

function GPS_MoveTo(x, y, z: integer): boolean;  overload;  // GPS движение по координате
var dist: single;  i: integer;
begin  
  result:= false;
  // для начала вычисляем маршрут между нашим текущим местоположением и точкой, куда нам нужно
  // вызов этой функции записывает точки в GPS.Items, а в dist мы присваиваем длину построенного маршрута 
  dist:= GPS.GetPath(User.X, User.Y, User.Z, x, y, z);
  
  if (GPS.Count > 0) then begin   // если маршрут построился, то
    Print(Format('[GPS] Бегу в точку (x=%d, y=%d, z=%d), дистанция: %n м, всего %d точек', [x, y, z, dist, GPS.Count]));

    // для каждой точки из построенного маршрута...
    for i:= 0 to GPS.Count-1 do begin
    
      // проверяем исключительные ситуации, и если что досрочно прерываем движение, можно добавить свои условия
      if (User.Dead) then begin
        Print('[GPS] Умер во время движения...');
        exit;
      end;

      // пробуем двигаться в очередную точку маршрута, и если у нас не получается, то можно предпринять какие-то меры
      if (not Engine.MoveTo(Round(GPS.Items(i).X), Round(GPS.Items(i).Y), Round(GPS.Items(i).Z))) then begin                                                         
        Print(Format('[GPS] Ошибка при движении в точку #%d (x=%d, y=%d, z=%d)', [i, x, y, z]));
        // тут можно пытаться двигаться в предыдущую точку, или заюзать СОЕ и перезапустить скрипт
        exit;
      end;
      
    end;
    result:= Engine.MoveTo(x, y, z) or (User.DistTo(x, y, z) < 150);
  end else Print('[GPS] Не смог найти нужный маршрут');   // если же маршрут не построился, то пишем об этом
end;  

function GPS_MoveTo(spot_name: string): boolean;  overload;  // GPS движение по названию точки
var dist: single;  i, last: integer;
begin  
  result:= false;
  // единственное отличие этой функции от предыдущей - только в вызове другой функции для построения маршрута 
  dist:= GPS.GetPathByName(User.X, User.Y, User.Z, spot_name);     
  if (GPS.Count > 0) then begin
    Print(Format('[GPS] Бегу в точку <%s>, дистанция: %d м, всего %d точек', [spot_name, dist, GPS.Count]));
    for i:= 0 to GPS.Count-1 do begin
      if (User.Dead) then begin
        Print('[GPS] Умер во время движения...');
        exit;
      end;
      if (not Engine.MoveTo(Round(GPS.Items(i).X), Round(GPS.Items(i).Y), Round(GPS.Items(i).Z))) then begin                                                         
        Print(Format('[GPS] Ошибка при движении в точку #%d (x=%d, y=%d, z=%d)', [i, GPS.Items(i).X, GPS.Items(i).Y, GPS.Items(i).Z]));
        // тут можно пытаться двигаться в предыдущую точку, или заюзать СОЕ и перезапустить скрипт
        exit;
      end;         
    end;
    last:= GPS.Count-1;
    result:= Engine.MoveTo(Round(GPS.Items(last).X), Round(GPS.Items(last).Y), Round(GPS.Items(last).Z))
             or (User.DistTo(Round(GPS.Items(last).X), Round(GPS.Items(last).Y), Round(GPS.Items(last).Z)) < 150);
  end else Print('[GPS] Не смог найти нужный маршрут');  
end;

procedure GPS_LoadMap(path: string);   // функция-обертка для загрузки GPS карты
var count: integer;
begin
  if FileExists(path) then begin
    count:= GPS.LoadBase(path);
    Print('[GPS] Загружено: '+IntToStr(count)+' точек');
  end else begin
    Print('[GPS] Не смог найти карту! Остановка скрипта');
    Print('[GPS] Проверьте ее наличие: '+path);
    Script.Stop;
  end;
end;

begin
  GPS_LoadMap(ExePath+'\gps_map.db3');  // Загружаем карту на этапе инициализации скрипта
  // code..

  // и далее в коде уже под нужными условиями вызываем
  GPS_MoveTo(-91036, 248044, -3560);
  // или
  GPS_MoveTo('Elf_Newbie_Helper');

end.