- 1,634
- 1,428
Pathfinding - библиотека для реализации алгоритмов поиска пути в GTA:SA. Это означает, что данная библиотека стремится реализовать не только один алгоритм поиска пути, а несколько, пытаясь привести их в пригодное для использования состояние. На данный момент ведется работа над наиболее известным и простым в реализации алгоритмом А*.
Использование: Библиотека экспортирует всего одну основную функцию:
По аргументам:
1. Первым аргументом является название алгоритма. В данный момент, пока алгоритм один, оно может быть либо a*, либо astar (регистр не важен). Аргумент обязательный.
2-3. Вторым аргументом является вектор начальной точки и вектор конечной точки. Это не просто таблицы, а специальный тип Vector. Чтобы его получить, можно воспользоваться полем "Point", который идёт в комплекте с экспортируемой функцией. Аргументы обязательный. Примеры:
4. Четвертый аргумент - это конфигурация алгоритма, которая влияет на его результат. По сути, это просто таблица с некоторыми параметрами. Аргумент опциональный, библиотека подставит конфигурацию по умолчанию:
Демо:
В архиве с библиотекой есть папка demo. Можете взять оттуда файлик init.lua и протестировать алгоритм прямо в игре. Имеет три команды:
1. /a - возьмёт координаты локального игрока и поставит их для точки А.
2. /b - сделает тоже самое, но для точки B.
3. /path - создаст путь для этих двух точек и отрисует, либо выведет "no path" в консоль SAMPFUNCS, либо у вас всё зависнет из-за недостатка ОЗУ (зависит от расстояния между этими двумя точками).
Предостережение: Подобные алгоритмы, как ни крути, очень затратны по ОЗУ, если не адаптировать их под конкретную ситуацию. Например: вряд ли вам требуется 20+ точек, если вы пишите бота для работы в буквально узком коридорном помещении и так далее. В общем, скорость зависит от вашего процессора и количества + качества ОЗУ.
Также не стоит пытаться построить путь с точками, у которых огромное расстояние между собой. Лучше разделить их на кучу других точек, но ближе друг к другу.
Установка: Скачать библиотеку можно с GitHub. С архива нужно переместить содержимое папки src в вашу папку moonloader/lib.
Также: библиотека написана при помощи moonly
Референсы: Википедия, FiveTuning, тема c Blast.hk (a.k.a Терминатор от @Rei)
Использование: Библиотека экспортирует всего одну основную функцию:
Lua:
local pathfinding = require("pathfinding")
local path = pathfinding:process([algorithm-name: string], [start: Vector], [goal: Vector], (configuration: Configuration|nil))
1. Первым аргументом является название алгоритма. В данный момент, пока алгоритм один, оно может быть либо a*, либо astar (регистр не важен). Аргумент обязательный.
2-3. Вторым аргументом является вектор начальной точки и вектор конечной точки. Это не просто таблицы, а специальный тип Vector. Чтобы его получить, можно воспользоваться полем "Point", который идёт в комплекте с экспортируемой функцией. Аргументы обязательный. Примеры:
Lua:
-- Кейс 1:
local Point = pathfinding.Point
-- Кейс 2:
local Point = require("pathfinding.point")
-- Кейс 3: (Класс Point и встроенная библиотека в moonloader Vector3d по сути одинаковы, но Point немного упрощает конструирование)
local Vector3D = require("vector3d") -- moonloader/lib/vector3d
-- Использование:
local pointA = Point.new(1, 2) -- Указывать все координаты не обязательно, но порядок важен (X, Y, Z).
local pointB = Vector3D(3, 4, 5)
Lua:
-- Каждый параметр здесь - опционален, библиотека подставит недостающие на параметры по умолчанию.
local default_configuration = {
-- Чем больше "шаг", тем быстрее алгоритм, меньше стоимость по ОЗУ, но путь менее точен.
Step = 1.5,
-- Эвристическая функция. По умолчанию это просто дистанция от одного узла к другому.
Heuristics = function(self, node0: Node, node1: Node)
return (node0.point - node1.point):length()
end,
-- Функция для проверки точки координат на валидность. Здесь можно проверить на разницу высот...
-- Либо в принципе на то, можно ли эту точку достигнуть. Используется при создании узлов.
Validate = function(self, point: Vector)
return (point - getGroundZFor3dCoord(point:get())) <= 5
end,
-- Функция для проверки препятствий между двумя точками. Вернет true, если пусть чист и falsе, если наоборот.
Collision = function(self, target: Vector, origin: Vector)
return isLineOfSightClear(target, origin, ...)
end,
-- Функция, которая возвращает оффсеты для кординат соседних узлов. Если кратко, чем больше здесь точек вы вернете, тем больше лагов.
-- По стандарту, здесь 20+ точек. В первую очередь это нужно для мотивации изменять алгоритм под свою ситуацию, а также для тестирования.
-- step - это параметр Step, который самый первый.
Neighbors = function(self, step: number)
return {
Point.new(...),
-- другие точки.
}
end
}
В архиве с библиотекой есть папка demo. Можете взять оттуда файлик init.lua и протестировать алгоритм прямо в игре. Имеет три команды:
1. /a - возьмёт координаты локального игрока и поставит их для точки А.
2. /b - сделает тоже самое, но для точки B.
3. /path - создаст путь для этих двух точек и отрисует, либо выведет "no path" в консоль SAMPFUNCS, либо у вас всё зависнет из-за недостатка ОЗУ (зависит от расстояния между этими двумя точками).
Предостережение: Подобные алгоритмы, как ни крути, очень затратны по ОЗУ, если не адаптировать их под конкретную ситуацию. Например: вряд ли вам требуется 20+ точек, если вы пишите бота для работы в буквально узком коридорном помещении и так далее. В общем, скорость зависит от вашего процессора и количества + качества ОЗУ.
Также не стоит пытаться построить путь с точками, у которых огромное расстояние между собой. Лучше разделить их на кучу других точек, но ближе друг к другу.
Установка: Скачать библиотеку можно с GitHub. С архива нужно переместить содержимое папки src в вашу папку moonloader/lib.
Также: библиотека написана при помощи moonly
Референсы: Википедия, FiveTuning, тема c Blast.hk (a.k.a Терминатор от @Rei)