Всем привет! Поскольку выдалось немного свободного времени, и меня обуяло жуткое желание творить, на свет появился мой очередной плагин «NPC Go».

Идея создания данного плагина возникла из просьбы пользователя на светлой, сделать возможным движение персонажа (события) к определенным координатам. Более подробно мы обсуждали сам механизм&логику в соответствующей теме, но предложенный мной там вариант использования плагина GALV «MV Move Route Extras», на практике оказался не очень хорош в построении пути. В результате чего персонажи могли «спотыкаться» и стоять на месте. Единственный вариант было включить режим «прохождения», но тогда персонажи начинали ходить через стены, озёра итд

Мне очень сильно захотелось исправить сие недоразумение.

1.png

Немного теории. Нахождение кратчайшего пути, как оказалось это классическая задачка,аж из того ещё века. Алгоритмов есть несколько, мной был выбран алгоритм «A*» (A star). Поскольку времени всё-таки не много свободного и задача написать свой алгоритм не стояла, то мной было честно предпринята попытка слямзить готовый результат, а именно за авторством Brian Grinstead — «javascript-astar».

Библиотека оказалась достаточно удобна и быстра. В качестве параметров её подаётся матрица (двумерный массив) в котором проходимые клетки указаны как 1, а не проходимые как 0. А так же координаты начальной точки и конечной. На выходе мы получаем массив шагов как добраться из одной точки в другую.

Осталось подготовить данные, и запустить нашего персонажа по новым координатам.

В отличии от предложенной логики в теме на светлой, с моим плагином всё сильно упрощается. Достаточно в нужный момент вызвать команду плагина, передать параметры. и наш НПЦ начнёт движение. И абсолютно не важно чем он занимался до этого, стоял, бегал итд.

2.png

Код:
◆Команда плагину: npc_go ID X Y store restore
Параметров всего несколько. Первое это идёт номер события (ID), далее следуют два числа новые координаты на карте и последние два условия сохранять и восстанавливать предыдущее состояние события.

Если указать true для сохранения, то прежде чем персонаж начнёт движение к новому месту, будут сохранены, его направление взгляда (если он стоял), маршрут движения, скорость движения и скорость обновления.

Есть указать true для восстановления, то после того как персонаж придёт на новое место ему будут восстановлены все предыдущие параметры.

Так же есть один маленький нюанс. Когда персонажи двигаются с разной скоростью, то есть вероятность, что они столкнуться с друг дружкой на пути, поэтому им включен режим «прохождения» на момент движения. Но в отличии от GALV у меня они проходят только сквозь друг дружку, а ни как не через стены

Вот такой вот получился плагин.

Если кому что-то не понятно, ссылка на готовый (настроенный) проект.

Ну а сам плагин как всегда доступен на моём github.

p.s. Не смотря на то, что сам плагин имеет лицензию BSD-3 (и свободно может применяться как в бесплатных, так и в коммерческих проектах), тут таки используется чужой код под лицензией MIT, так что будьте аккуратны при использовании в коммерческих проектах, а то вдруг возникнут вопросы.

p.p.s. Небольшая демонстрашка, как это всё работает: