Общая логика использования 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.