RE:NODE

Minecraft11 мин чтения

NPC в Minecraft: Citizens или FancyNpcs

Как добавить NPC на сервер Minecraft: сравнение Citizens и FancyNpcs, скины, команды по клику, сколько NPC стоят во времени тика и типичные проблемы.

0 прочтений

Для NPC, которые стоят на месте и что-то делают по клику - торговец, селектор серверов в лобби, квестодатель, - используйте пакетный плагин вроде FancyNpcs: он бесплатный, простой и почти ничего не стоит серверу, потому что такие NPC не существуют как настоящие сущности. Для NPC, которые ходят, следуют по маршрутам, сражаются, охраняют или выполняют скрипты, используйте Citizens: он создаёт настоящие сущности с настоящим ИИ, у него есть экосистема (Sentinel для стражников, Denizen для скриптов), и тики он тратит соответственно. Оба дают NPC в виде игрока с любым скином, оба выполняют команды от консоли или игрока по клику, и оба нормально работают на Paper. Ошибки, которые совершают люди, в основном касаются скинов, команд по клику с излишними полномочиями и использования полностью симулируемого NPC для задачи, с которой справилась бы голограмма.

Это руководство сравнивает два плагина, разбирает важные команды и объясняет, во что обходится каждый. Если вам нужен парящий текст, а не персонаж, лучше подойдёт статья Голограммы, скорборды и TAB.

Настоящие сущности против пакетных NPC#

Каждый плагин NPC использует один из двух подходов, и этот выбор определяет, что NPC умеет и сколько стоит.

Настоящие сущности. Плагин создаёт сущность на сервере. Для NPC в виде игрока это фальшивый объект игрока; для других типов - обычный моб, чьим ИИ управляет плагин. Сервер его тикает, отслеживает, обрабатывает с ним коллизии и сохраняет. Он может прокладывать путь, получать урон, держать предметы, его можно толкать, он может сражаться. Это Citizens.

Пакетные NPC. Плагин отправляет клиенту пакеты, описывающие сущность, которой на сервере нет. Клиент рисует стоящего игрока; сервер лишь знает, что в этой точке нужно ловить клики. Ничего не тикает, ничего не сталкивается, ничего не сохраняется в мире. Такой NPC не может сам двигаться или сражаться, но может смотреть на игроков, носить броню, проигрывать анимации и реагировать на клики. Это FancyNpcs, ZNPCsPlus и подобные.

CitizensFancyNpcs
ЦенаБесплатные dev-сборки, платно на SpigotБесплатно
Как существуют NPCНастоящие сущностиПакеты на стороне клиента
Движение и поиск путиДа, точки маршрута и путиНет
Бой и стражаДа, с SentinelНет
СкриптыDenizen и множество интеграцийСистема действий для кликов
Нагрузка на сервер на один NPCТикает как сущностьПочти ноль
После удаления плагинаНичего не остаётся в миреНичего не остаётся в мире
Лучше всего дляКвесты, стража, движущиеся NPC, RPGЛобби, селекторы, торговцы

Для лобби с сорока NPC-селекторами очевидный ответ - FancyNpcs. Для RPG-сервера, где NPC патрулируют город, сражаются с разбойниками и разговаривают с игроками по скриптовым диалогам, Citizens - единственный реальный вариант.

Citizens: установка и нужные команды#

Citizens распространяется двумя способами: платно на SpigotMC, что поддерживает разработчика, и в виде бесплатных dev-сборок с собственного билд-сервера проекта. Это один и тот же плагин. Скачайте сборку под свою версию Minecraft - Citizens тесно привязан к внутренностям сервера, и старая сборка на новом сервере не загрузится.

Работа строится по схеме «выбрать, затем редактировать». Большинство команд /npc действуют на выбранного NPC.

code
/npc create Blacksmith/npc select/npc skin Notch/npc lookclose/npc equip/npc tphere/npc list/npc remove

Те, которыми вы будете пользоваться чаще всего:

  • /npc create <name> создаёт NPC на вашей позиции и выбирает его.
  • /npc select выбирает ближайшего NPC, на которого вы смотрите, или NPC по ID.
  • /npc skin <player> использует скин игрока по нику; /npc skin --url <url> использует скин по URL изображения - так ставится кастомный скин, не принадлежащий никакому аккаунту.
  • /npc lookclose переключает, поворачивается ли NPC к ближайшим игрокам.
  • /npc equip открывает редактор, чтобы надеть на NPC броню и дать ему предметы в руки.
  • /npc type <entity> превращает NPC из игрока в жителя, зомби или сущность любого другого типа.

NPC сохраняются в plugins/Citizens/saves.yml. Делайте его backup вместе с остальным сервером; лобби, на настройку которого ушёл вечер, не должно быть в одном повреждённом файле от исчезновения.

Команды по клику

В Citizens есть встроенный трейт команд, который выполняет команды при клике по NPC:

code
/npc command add warp shop -p/npc command add -r eco give <p> 10 --cooldown 1d/npc command add -l say Do not hit me, <p>/npc command add -p kit starter --permission server.kit.starter

Главное здесь - флаги:

ФлагЭффект
-pВыполнить от имени кликнувшего игрока, а не консоли
-oВыполнить от имени игрока с временными правами оператора
-l / -rТолько по левому / правому клику
--permission <node>Требовать право для срабатывания
--cooldown <time>Перезарядка для каждого игрока
--gcooldown <time>Общая перезарядка для всех игроков
--n <number>Ограничить число использований на игрока
--delay <ticks>Задержка перед выполнением

<p> заменяется ником игрока, а <npc> - ID NPC. Команды без -p выполняются от консоли, с полными правами. Это то, что нужно для наград (eco give <p> 10), и это опасно, если игрок может хоть как-то повлиять на команду.

FancyNpcs: установка и нужные команды#

FancyNpcs - один бесплатный плагин для Paper. NPC создаются через /npc (если установлен и Citizens, они будут бороться за эту команду; используйте что-то одно или пространство имён /fancynpcs).

code
/npc create Selector/npc skin Selector Notch/npc turn_to_player Selector true/npc displayname Selector <gold>Survival/npc glowing Selector gold/npc equipment Selector set/npc list/npc remove Selector

В командах FancyNpcs имя NPC указывается в каждой команде, а не берётся из выбора, поэтому их легко скриптовать и копировать. skin принимает ник игрока, URL или @mirror, который показывает каждому зрителю его собственный скин, - приятная деталь для лобби. turn_to_player заставляет NPC следить за ближайшими игроками. Отображаемые имена используют форматирование MiniMessage.

Поведение по клику задаётся системой триггеров и действий:

code
/npc action Selector right_click add send_to_server survival/npc action Shopkeeper any_click add message <green>Welcome to the shop/npc action Shopkeeper right_click add console_command eco give {player} 5/npc action Shopkeeper right_click add player_command warp shop

Триггеры - right_click, left_click, any_click и custom. Среди действий есть message, console_command, player_command, player_command_as_op, send_to_server (перемещает игрока на другой бэкенд в сети за прокси), wait, need_permission и play_sound. Действия выполняются по порядку, так что действие need_permission, за которым следует player_command, - это команда, закрытая правом. {player} в консольных командах - ник кликнувшего игрока; действия с сообщениями также принимают плейсхолдеры PlaceholderAPI. К player_command_as_op относится то же предупреждение, что и к -o в Citizens.

send_to_server - причина, по которой FancyNpcs так распространён в лобби сетей: ряд NPC, по одному на режим игры, каждый отправляет игрока на нужный бэкенд через прокси. Сторона прокси описана в статье Сеть серверов за прокси Velocity.

ZNPCsPlus - ещё один бесплатный пакетный плагин той же категории с похожим набором функций. Сравнение выше относится и к нему.

Скины без головной боли#

Больше всего жалоб на NPC связано со скинами. Скин NPC-игрока - это подписанная текстура с серверов Mojang. Когда вы задаёте скин по нику игрока, плагин находит текущий скин этого игрока и кеширует подписанную текстуру.

Что идёт не так:

  • Игрок меняет скин. Скины по нику могут обновиться на новый скин, когда обновится кеш. Для постоянного вида используйте скин по URL или из файла либо опцию плагина, которая хранит текстуру постоянно.
  • Ограничения частоты запросов. Mojang ограничивает частоту запросов скинов. Создание пятидесяти NPC с разными скинами за минуту может оборваться на полпути; растяните процесс во времени или используйте сохранённые текстуры.
  • Скины по URL нужно подписывать. Скин по URL нужно загрузить в сервис подписи (обычно это MineSkin, и плагины используют его незаметно для вас), прежде чем клиенты его покажут. Если не получилось, NPC показывает скин по умолчанию.
  • Серверы в офлайн-режиме. На сервере с online-mode=false без прокси, выполняющего аутентификацию, работа со скинами ненадёжна, и у вас есть проблемы посерьёзнее; см. статью Чеклист безопасности сервера.
  • Игроки Bedrock. Через Geyser NPC-игроки обычно отображаются, но скины и некоторые эффекты могут отличаться от того, что видят игроки Java.

Практическое правило: для важных NPC задайте скин один раз из URL или текстуры, убедитесь, что он работает, и не зависьте от аккаунта живого игрока.

Во что обходятся NPC#

Пакетный NPC почти ничего не стоит серверу. Плагин хранит список NPC и, когда игрок оказывается в радиусе, отправляет пакеты, которые их рисуют; когда игрок кликает, обрабатывает клик. Сорок таких в лобби не стоят того, чтобы о них думать. Нагрузка на клиент - отрисовка сорока моделей игроков со скинами - реальна, но умеренна.

NPC из Citizens - это сущность, и его стоимость зависит от того, что он делает:

  • Стоит, `lookclose` включён: мало. Он тикает, проверяет, на каких ближайших игроков смотреть, и отслеживается как любая сущность.
  • Ходит по маршруту: поиск пути стоит как у моба, при каждом пересчёте.
  • Сражается (стражники Sentinel): выбор цели, поиск пути и бой каждый тик - это стоимость на уровне моба или выше.
  • Выполняет скрипты Denizen: полностью зависит от скриптов. Плохо написанные скрипты, работающие каждый тик, - частый источник лагов на RPG-серверах.

Если RPG-сервер работает медленно, spark покажет Citizens и Denizen в дереве вызовов, когда причина в них. Как их найти, описано в статье Как читать отчёт spark. Обычные исправления - меньше движущихся NPC, более длинные интервалы между пересчётами маршрута, стражники, которые активируются только рядом с игроками, и скрипты, запускаемые событиями, а не опросом.

NPC-игроки Citizens также ненадолго видны серверу как игроки. Некоторые плагины, которые считают игроков онлайн или перебирают игроков, могут их видеть. Большинство хорошо написанных плагинов проверяют метаданные NPC, которые выставляет Citizens; некоторые - нет, и тогда вы увидите имена NPC в странных местах. У пакетных NPC такой проблемы не бывает.

Селектор в лобби от начала до конца#

Самая частая работа для NPC в любой сети - селектор режимов игры: ряд персонажей на спавне, каждый отправляет игроков на свой сервер. Вот вся работа целиком на FancyNpcs, который для этого подходит лучше всего.

  1. Встаньте туда, где должен стоять первый NPC, лицом туда, куда он должен смотреть, и выполните /npc create survival.
  2. Задайте внешний вид: /npc skin survival <url> со скином, который вы контролируете, и /npc turn_to_player survival true, чтобы он следил за подходящими.
  3. Дайте ему имя: /npc displayname survival <green>Survival. Держите имена короткими; длинные имена накладываются друг на друга, когда NPC стоят близко.
  4. Настройте клик: /npc action survival any_click add send_to_server survival. Значение - имя сервера из конфигурации вашего прокси, а не адрес.
  5. Повторите для каждого режима, расставляя NPC хотя бы в двух блоках друг от друга, чтобы таблички с именами оставались читаемыми.
  6. Если нужны живые цифры, добавьте над каждым NPC или рядом голограмму с числом игроков на этом сервере - см. статью Голограммы, скорборды и TAB.
  7. Проверьте как не-оператор. Операторы часто обходят проверки прав, на которые натыкаются обычные игроки, и селектор, работающий только для персонала, - частый сюрприз в день запуска.

Для одиночного сервера без прокси замените шаг 4 действием player_command, которое выполняет варп, или console_command, которое телепортирует {player}. Структура остаётся той же.

Два замечания по дизайну. Не ставьте селектор прямо на точку спавна: прибывающие игроки ещё загружают чанки и текстуры, и по NPC, нарисованным на блоке спавна, кликают случайно. И держите их число небольшим: пять понятно подписанных вариантов лучше двенадцати, а каждая лишняя модель игрока - то, что придётся рисовать слабому клиенту.

Типичные проблемы и решения#

NPC не появляется после перезапуска. Для Citizens проверьте консоль на ошибки при загрузке - сборка Citizens, не соответствующая версии сервера, падает именно здесь. Проверьте, что saves.yml существует. Для FancyNpcs проверьте, что плагин загрузился и что имя мира NPC не изменилось.

Команда по клику выполняется, но ничего не делает. Выполните ту же команду вручную в консоли, подставив ник игрока. Чаще всего дело в опечатке или в команде, которой нужно, чтобы игрок был онлайн в определённом мире. Строка в консоли скажет почему.

Клик по NPC заодно атакует его или открывает магазин дважды. Ограничьте триггер: -r в Citizens или right_click в FancyNpcs. При некоторых взаимодействиях срабатывают и левый, и правый клик.

Имена NPC видны в списке игроков. Citizens по умолчанию скрывает своих NPC из списка игроков; плагин TAB, который перестраивает список, может их показать. Поищите в настройках плагина TAB опцию скрытия NPC.

Два плагина NPC борются за `/npc`. Удалите один или используйте команды с пространством имён. Не держите два плагина NPC для одной задачи.

NPC вызывают лаги в лобби. Если это лобби на Citizens с множеством NPC с lookclose, переведите статичных на пакетный плагин. Если проседает FPS у клиентов, уменьшите число NPC в поле зрения.

На RE:NODE jar плагина загружается через файловый менеджер или SFTP, а в консоли есть история команд и автодополнение по Tab, что помогает при создании NPC длинными командами. Файлы данных NPC - часть файлов сервера, так что они попадают в backup из панели; сделайте его перед большой перестройкой лобби.

FAQ#

Что лучше, Citizens или FancyNpcs?

Для статичных NPC, которые выполняют команду или отправляют игроков на другой сервер, - FancyNpcs: бесплатно, просто и почти бесплатно по времени тика. Для NPC, которые двигаются, сражаются, охраняют или ведут скриптовые квесты, - Citizens, потому что пакетные NPC этого не умеют.

Учитываются ли NPC в лимите игроков?

Пакетные NPC - никогда. NPC-игроки Citizens не занимают слот, но некоторые плагины, которые перечисляют или считают игроков, могут их видеть. Большинство хорошо поддерживаемых плагинов их игнорируют.

Как дать NPC кастомный скин?

Используйте URL изображения скина: /npc skin --url <url> в Citizens или /npc skin <npc> <url> в FancyNpcs. Плагин подписывает скин через сервис вроде MineSkin. Для постоянного вида используйте URL, а не ник игрока.

Может ли NPC отправлять игроков на другой сервер моей сети?

Да. У FancyNpcs есть действие send_to_server для сетей за прокси. В Citizens выполните от имени игрока команду смены сервера из прокси или команду плагина, которая перемещает игроков между бэкендами.

Почему опасно, что мой NPC в Citizens выполняет команды от op?

Потому что временная выдача op игроку для выполнения команды может оставить его оператором или позволить цепочке команд выполниться с правами оператора, если что-то сломается. Вместо этого выдавайте награды консольными командами с ником игрока, а для игровых команд выдавайте конкретные права.


Комментарии

Полностью анонимно: без аккаунта, без почты, без cookie. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.

0/2000