Для
sergebaz , и всех остальных, которые просили от меня "формулы" по геодате.
Выкладываю алгоритм работы PathMaker'а. Он не изменялся со времен С1 до GD как минимум.
MD5 чек-сумма файла
pathnode.bin с моего (С1) и GD PathMaker'а та же самая, индексы только с GF-H5 изменились, так как там 27-y добавился. В новых хрониках не видел, не знаю.
Мужики, запилите
мне дверь уже его под L2J-подобные!
Думаю, формат геодаты не надо объяснять, он открыт, но все же: Гео-зона состоит из клеток 16х16 единиц, клетка - это минимальная дискретная единица карты с клиента. Итак,
1. Цикл по каждой клетке, ищем первую клетку, которая имеет закрытый проход в одну сторону
2. Начинаем делать два траверса вдоль припятствия (по и против часовой стрелок). Вы в пещеры ходили? Стену надо держать левой или правой рукой (руку не менять!!). Зачем два траверса? Потому что персонаж может хотеть на юго-восток (см рисунок) или северо-восток (этот траверс на самом крупном плане пропущен, но виден на среднем плане)
3. Идем вдоль препятствия, пока не дойдем до клетки, которая позволит двигаться в ту же сторону (Восток в нашем случае), но уже на открытой местности, т.е. соседние направления тоже открыты). Ура, вы нашли два пути, как обойти препятствие с востока, двигаясь на юго и северо-восток.
4. Теперь у вас есть "змейка" клеток. Вы "скомпилировали" геодату, переведя из формата "клетки" в пространственный формат "вершины и ребра" (Nodes - links), т.е. получили информацию как из одной вершины добраться до другой в целом мире LineageII. Каждая вершина имеет от 0 до 8 братьев, к которым можно через нее добраться по ребрам (право-лево, верх-низ, диагонали).
5. Эта информация используется A-* алгоритмом поиска пути
БОльшую часть из него делает PathMaker, избавляя run-time от множества расчетов (по сути, строит синие точки, которые на gif'ке выше обозначают препятствие, и варианты обхода синих точек).
6. Run-time получает 2 точки (А -> В). Через хитрожопую look-up table получает две пространственные вершины (Node). Через вычитание векторов (привет, 5ый класс) получает направление. Зная направление, движится по вершинам, от А к В, используя ее ребра для перемещения. Когда попадает в нужную вершину, просто прокладывает прямой путь до точки В. Путь построен.
Оптимизации:
PathMaker оптимизирует путь, смердживая до 20 клеток в одну PathNode'у.
PS: kick, измени плз название темы на [C1-С4] PathMaker, так как он совместим с С4 полностью