Сети полётов
Сеть полётов — это набор узлов в одном мире, соединённых двусторонними связями. Узлы с названием — это пункты назначения. Игрок выбирает пункт назначения у NPC-распорядителя полётов или в портале полётов, и ездовое существо несёт его туда по кратчайшей цепочке связей. Сети находятся в plugins/EliteMobs/transport_networks/ и используют тех же ездовых существ и те же правила поездки, что и транспортные маршруты.
Каждый полёт строится в момент запроса игрока. EliteMobs запускает поиск A* по связям, используя прямое расстояние между узлами, а ездовое существо следует по плавной кривой через каждый узел найденного пути. Вам никогда не нужно создавать маршрут для каждой пары пунктов назначения: новый узел или связь используются каждым полётом, который они сокращают.
Как летают игроки
- Игрок щёлкает правой кнопкой по NPC-распорядителю полётов или входит в портал полётов.
- Меню Flight paths перечисляет все пункты назначения, достижимые из узла NPC или портала, начиная с ближайшего по связям, не более 54. Пункты назначения, которые игрок не открыл, отображаются серым красителем со своей подсказкой о блокировке.
- Щелчок по пункту назначения запускает обратный отсчёт, по умолчанию 60 тиков (3 секунды); по его окончании ездовое существо подхватывает игрока в точке отправления.
- Ездовое существо летит по пути и опускает игрока в пункте назначения лицом в направлении его
arrivalYaw.
Распорядитель полётов или портал могут также пропустить меню и сразу отправить игрока в один пункт назначения. См. разделы Распорядители полётов и Порталы полётов.
Щёлкая по пункту назначения, игрок должен находиться в пределах 8 блоков от NPC или портала, иначе щелчок ничего не сделает. У NPC любое движение во время обратного отсчёта отменяет отправление. У портала обратный отсчёт отменяется, только когда игрок покидает зону портала — 1.5 × sizeMultiplier + 2 блока от его центра.
Приседание не высаживает пассажира в полёте. Полёт досрочно заканчивается при смерти, телепортации, смене мира, выходе из инстанса подземелья или удалении ездового существа. Если полёт 5 секунд не продвигается, пассажир опускается в пункте назначения. Пассажир, отключившийся посреди полёта вне инстанса подземелья, при следующем входе оказывается в пункте назначения, а остановка или перезагрузка сервера тоже опускает находящихся на борту пассажиров в их пунктах назначения.
Создание сети в игре
Команды редактора доступны только игрокам с правом elitemobs.transport.admin.
- Встаньте в мире сети и выполните
/em transport network edit harbor_flights. Сеть без файла начинается как пустой черновик. - Встаньте там, где игроки должны садиться, и выполните
/em transport node add harbor. - Взлетите вверх и выполните
/em transport node add harbor_sky. Если соседи не перечислены, новый узел связывается с выбранным, а сам становится выбранным, так что цепочка командaddстроит путь. - Перейдите к следующему пункту назначения и добавьте его так же. Используйте
/em transport node link <a> <b>, чтобы соединять ветви. - Назовите каждый пункт назначения командой
/em transport node destination harbor &6Harbor. - Встаньте в пункте назначения лицом в ту сторону, куда должны смотреть прибывающие игроки, и выполните
/em transport node yaw harbor. - Проверьте путь командой
/em transport network preview harbor mineи пролетите его командой/em transport network ride harbor mine. - Выполните
/em transport network save.
ID узлов и сетей состоят из 1–64 строчных латинских букв, цифр, подчёркиваний или дефисов. Черновик записывает ваш текущий мир как мир сети. Внутри инстанса подземелья он записывает исходный мир (blueprint) подземелья. Существующую сеть можно редактировать только из её собственного мира.
Команды редактора
| Команда | Действие |
|---|---|
/em transport network edit <network> | Открыть черновик существующей сети или начать новую |
/em transport network list | Перечислить загруженные сети |
/em transport network status | Показать число узлов черновика и выбранный узел |
/em transport network preview [from] [to] | Показать путь между двумя узлами; без узлов — очистить предпросмотр |
/em transport network ride <from> <to> | Пролететь между двумя узлами черновика без сохранения |
/em transport network generate <first> <second> | Заменить связь между двумя узлами сгенерированными узлами, которые проходят над рельефом |
/em transport network undo | Отменить последнюю правку узла или связи; сохраняется до 32 правок |
/em transport network save | Сохранить черновик |
/em transport network cancel | Отбросить черновик |
/em transport node add <id> [neighbors...] | Добавить узел там, где вы стоите, связав его с перечисленными узлами, а если их нет — с выбранным |
/em transport node select [node] | Выбрать узел; без аргумента — выбрать ближайший к вам |
/em transport node link <first> <second> | Связать два узла в обоих направлениях |
/em transport node unlink <first> <second> | Убрать связь между двумя узлами |
/em transport node move <node> | Переместить узел туда, где вы стоите |
/em transport node remove <node> | Удалить узел и его связи |
/em transport node destination <node> [name] | Сделать узел пунктом назначения с таким названием в меню; без названия — снова сделать его обычной путевой точкой |
/em transport node permission <node> <permission> | Требовать разрешение для вылета из этого узла или прилёта в него; none снимает требование |
/em transport node hint <node> [text] | Задать сообщение, которое показывается, пока узел закрыт; без текста или с none — убрать сообщение |
/em transport node yaw <node> | Задать направление прибытия по тому, куда вы смотрите |
Автодополнение предлагает ID сетей для edit и ID узлов черновика для аргументов-узлов. Каждая команда, кроме edit, list, save, cancel и status, требует, чтобы вы находились в мире черновика. Редактировать можно одну сеть за раз. Черновик хранится в памяти до тех пор, пока вы не сохраните или не отмените его, не отключитесь, не выгрузится его мир или не перезагрузится EliteMobs.
/em transport network ride перемещает вас к первому узлу и отправляет оттуда, даже если вы находитесь в другом месте. Команда не проверяет разрешения узлов, а пунктом назначения может быть любой узел, с названием или без.
/em transport reload перезагружает файлы сетей вместе с файлами маршрутов. Полёты, уже находящиеся в воздухе, сохраняют прежний путь.
Вид редактора
Черновик видит только редактирующий игрок. Каждый узел в пределах 128 блоков показывает над собой свой ID, а на второй строке — название пункта назначения. Метка выбранного узла жёлтая. Связи рисуются светло-голубыми линиями. После preview путь рисуется зелёным. В остальных случаях жёлтая кривая проходит через выбранный узел до места, где вы стоите, и показывает, как изогнулся бы полёт, если бы вы добавили там узел.
Генерация узлов-заглушек
Прямая связь между двумя далёкими узлами может пройти сквозь холм. /em transport network generate <first> <second> вместо этого строит цепочку над рельефом:
- Команда считывает высоту земли каждые 4 блока вдоль линии между двумя узлами полосой шириной в три столбца. Она читает только уже сгенерированные чанки и загружает не больше двух за тик, поэтому никогда не создаёт новый рельеф.
- Каждая точка цепочки проходит на 12 блоков выше самой высокой земли в радиусе примерно 32 блоков в обе стороны и никогда не ниже прямой между двумя узлами. Она остаётся как минимум на 4 блока ниже предела высоты постройки.
- Команда ставит узел примерно каждые 48 блоков, а также узел прямо над каждым концом, если цепочка проходит больше чем на 2 блока выше этого конца.
- Команда удаляет прямую связь и соединяет два узла через цепочку.
Узлы должны находиться на расстоянии не меньше 16 блоков по горизонтали. Сгенерированные узлы называются <first>_<second>_1, <first>_<second>_2 и так далее и сохраняются с placeholder: true, чтобы вы могли найти их позже. Один undo удаляет всю цепочку. Пролетите результат перед сохранением: генератор смотрит только на рельеф, а не на постройки и деревья.
YAML сети
Для harbor_flights.yml:
isEnabled: true
world: my_world
transportEntity: transport_cannon_seat.yml
speed: 24.0
acceleration: 16.0
countdownTicks: 60
nodes:
harbor:
location: 120.5,64.0,-340.5
name: '&6Harbor'
arrivalYaw: 90.0
neighbors:
- harbor_sky
harbor_sky:
location: 120.5,96.0,-340.5
neighbors:
- harbor
- ridge_pass
ridge_pass:
location: 310.0,110.0,-180.0
neighbors:
- harbor_sky
- mine_sky
- watchtower_sky
watchtower_sky:
location: 455.5,102.0,-60.5
neighbors:
- ridge_pass
- watchtower
watchtower:
location: 455.5,81.0,-60.5
name: '&6Watchtower'
arrivalYaw: -45.0
permission: elitequest.watchtower_supplies.yml
lockedHint: '&7Finish the quest "Watchtower Supplies" to unlock this flight point.'
neighbors:
- watchtower_sky
mine_sky:
location: 260.0,95.0,20.0
neighbors:
- mine
- ridge_pass
mine:
location: 262.5,70.0,24.5
name: '&6Old Mine'
arrivalYaw: 180.0
neighbors:
- mine_sky
| Ключ | По умолчанию | Описание |
|---|---|---|
isEnabled | true | Загружает сеть |
world | нет | Мир, в котором находятся узлы. Обязателен |
transportEntity | transport_cannon_seat.yml | Включённый файл из custombosses/, используемый как ездовое существо. Тип сущности, модель и способности настраиваются там |
speed | 24 | Максимальная скорость в блоках в секунду. Должна быть положительной |
acceleration | 16 | Сколько блоков в секунду прибавляется каждую секунду до максимальной скорости. Должно быть положительным |
countdownTicks | 60 | Тики между выбором пункта назначения и посадкой. Ноль или больше |
nodes | нет | Словарь ID узлов и их секций |
Сеть без world, с transportEntity, не являющимся именем .yml-файла, или с недопустимой скоростью, ускорением или обратным отсчётом записывает предупреждение и не загружается.
Ключи узла
| Ключ | Описание |
|---|---|
location | x,y,z в мире сети. Обязателен |
name | Название в меню. Узел с названием — пункт назначения; узел без названия — путевая точка, через которую проходят полёты. Цветовые коды работают |
arrivalYaw | Направление взгляда игрока при прибытии в этот пункт назначения. По умолчанию 0 |
permission | Разрешение, нужное для вылета из этого узла или прилёта в него |
lockedHint | Текст для этого узла, пока он закрыт. По умолчанию &7You have not unlocked this flight point. |
neighbors | ID узлов, с которыми связан этот узел |
placeholder | true у узлов, созданных генератором. Полёты обрабатывают их как любые другие узлы |
Связи работают в обе стороны, поэтому достаточно указать соседа с одной стороны. EliteMobs предупреждает и отбрасывает связь с отсутствующим узлом или узлом в той же позиции, пропускает недопустимый узел, предупреждает об узле без соседей и, в сети с более чем одним пунктом назначения, предупреждает о пункте назначения, из которого нельзя долететь ни до одного другого.
Сохранение из редактора переписывает только секцию nodes и сохраняет комментарии и неизвестные ключи внутри узлов, которые всё ещё существуют. Новый файл также получает перечисленные выше настройки сети со значениями по умолчанию. Редактор отказывается сохранять поверх файла сети, который отключён или не загрузился; сначала исправьте или удалите этот файл.
Ездовое существо летит точно по кривой. Оно не обходит препятствия, поэтому оставляйте пространство между узлами свободным для ездового существа и пассажира. Ездовые существа с типом сущности «курица» или «попугай» во время полёта роняют перья и машут крыльями. О том, что происходит, когда ездовое существо не удаётся создать, см. свободное пространство и прерывание поездки.
Распорядители полётов
Распорядитель полётов — это NPC с interactionType: TRANSPORT и сетью:
interactionType: TRANSPORT
transportNetwork: harbor_flights
transportNode: harbor
Добавьте эти поля в корректное определение NPC. transportNode — узел, из которого отправляются полёты этого NPC. Ездовое существо подхватывает игрока в этом узле, поэтому разместите узел рядом с NPC. Добавьте transportDestination: mine, чтобы лететь прямо в этот пункт назначения без меню. Если задан transportNetwork, NPC игнорирует transportRoutes.
Порталы полётов
Червоточина с секцией flight открывает меню полётов вместо телепортации:
isEnabled: true
location1: my_world,120.5,66,-336.5,90,0
style: ICOSAHEDRON
particleColor: 0xf0c060
sizeMultiplier: 2.0
flight:
network: harbor_flights
node: harbor
flight.node — узел отправления, и ездовое существо подхватывает игрока именно там, поэтому разместите этот узел у портала. flight.destination отправляет прямо в этот пункт назначения без меню. Порталу полётов нужен только location1; если задан и location2, оба конца открывают одно и то же меню. Портал не списывает coinCost и не применяет blindPlayer, но его permission по-прежнему действует. Чтобы открыть меню снова, выйдите из зоны портала и войдите обратно не раньше чем через 5 секунд после последнего открытия.
Червоточины не срабатывают для игрока, который находится в полёте. Игроку, опущенному внутри портала, нужно выйти из него и подождать 5 секунд, прежде чем портал сработает снова.
Закрытые точки полёта
Узел с permission закрыт для игроков, у которых этого разрешения нет. Полёт проверяет только узлы отправления и назначения, поэтому путь может проходить через закрытые путевые точки. Чтобы открывать пункт назначения квестом, используйте в качестве разрешения узла маркер квеста questLockoutPermission, например elitequest.watchtower_supplies.yml. Игроки получают его при завершении квеста.
Когда узел отправления закрыт, игрок получает его lockedHint вместо меню. Закрытые пункты назначения остаются в меню серыми, а щелчок по такому пункту показывает его подсказку.
Игроки с включённым /em quest bypass проходят все разрешения узлов.
Полёты внутри инстансовых подземелий
Задайте в world исходный мир (blueprint) подземелья. Полёт, начатый внутри инстанса подземелья, проходит через копию мира этого игрока. Используйте в качестве точки полёта инстансовую червоточину с секцией flight или инстансового NPC. Пассажир, отключившийся посреди полёта внутри инстанса, при входе не оказывается в пункте назначения; действуют собственные правила подземелья для возвращающихся игроков.