Перейти к основному содержимому

Создание NPC

webapp_banner.jpg

Поместите определения в plugins/EliteMobs/npcs/, используя уникальные имена файлов с .yml. Сохраните файл и выполните /em reload перед размещением нового NPC. Игрок с правом elitemobs.place.npc может выполнить /em place npc <npcfilename.yml> в нужной позиции и с нужным направлением взгляда. Один файл поддерживает несколько размещений.

Повторное использование другого файла NPC​

Файл NPC может взять за основу другой файл NPC с помощью extends и изменить только то, что отличается:

extends: my_base_npc.yml
name: "&aSecond Guard"
spawnLocations:
- my_world,20,64,20,90,0

Файл наследует все значения базового файла и переопределяет ключи, которые задаёт сам. Вложенные разделы, например patrol, объединяются по отдельным ключам; список, например dialog, целиком заменяет список базового файла. Указывайте базовый файл только по имени, без пути к папке. Это должен быть другой файл в npcs, включая её подпапки, и он сам может расширять ещё один базовый файл.

isEnabled, spawnLocation и spawnLocations никогда не наследуются, поэтому у каждого файла остаются собственные размещения. Базовый файл с isEnabled: false может служить шаблоном: расширяющие его файлы всё равно загружаются. EliteMobs не записывает значения по умолчанию в файл, использующий extends. Отсутствующий базовый файл, путь в extends или замкнутый круг ссылок extends отключают файл с предупреждением в консоли. Редактор патрулей использует extends, когда выносит одно размещение из файла с несколькими размещениями.

Настройки конфигурации​

isEnabled​

Включает определение при загрузке конфигураций. После изменения перезагрузите их. Для появления SCROLL_APPLIER также нужна глобальная настройка useEliteItemScrolls.

КлючЗначенияПо умолчанию
isEnabledЛогическое значениеtrue
Пример
isEnabled: true

name​

Задаёт отображаемое имя с поддержкой цветовых кодов. EliteMobs регистрирует исходный текст в CSV переводов и использует перевод выбранного языка, если он есть.

КлючЗначенияПо умолчанию
nameСтрокапустая строка
Пример
name: "&aEnn Peecee"

create_npc_name.jpg


Расположение подписей​

Имя и роль имеют фиксированное расположение. Настроек nameplateScale или nameplateLineGap для отдельного NPC нет. Подписи обычных и замаскированных NPC следуют высоте тела или маскировки. Совместимые модели FreeMinecraftModels управляют своими подписями; ModelEngine сохраняет собственное имя, а EliteMobs показывает роль. Личные отметки заданий размещаются выше подписей.

При включённых азартных играх особый NPC gambling_den_owner.yml добавляет доход заведения в ту же группу подписей, обновляя её примерно раз в секунду.

scale​

Задаёт масштаб базового жителя через атрибут размера Minecraft. Модель или маскировка может управлять своим видимым размером отдельно; этот параметр не гарантирует изменение её внешнего вида вместе с жителем.

КлючЗначенияПо умолчанию
scaleМножитель1.0

При масштабировании 1.0 представляет размер по умолчанию. Чтобы сделать сущность больше, увеличьте значение (например, 1.2). Чтобы сделать сущность меньше, уменьшите значение (например, 0.8).

Пример
scale: 1.2

role​

Задаёт подпись роли под именем. Она влияет только на отображение, поддерживает цветовые коды и регистрируется в CSV переводов.

КлючЗначенияПо умолчанию
roleСтрокапустая строка
Пример
role: "&c<Red Fellow>"

create_npc_role.jpg


profession​

Задаёт профессию базового жителя и его внешний вид, когда нет ни маскировки, ни собственной модели.

КлючЗначенияПо умолчанию
professionПрофессияNITWIT
Пример
profession: NITWIT

create_npc_profession.jpg


greetings​

Приветствия, которые NPC пытается произнести, когда проверка впервые обнаруживает игрока внутри activationRadius. Случайная запись показывается над NPC в облачке, видимом только этому игроку около 5 секунд. Список регистрируется в CSV переводов. Для речи нужны canTalk и завершённая общая задержка диалога.

КлючЗначенияПо умолчанию
greetingsСписок строкнет

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

Пример
greetings:
- Hi there!
- Good day.

create_npc_greetings.jpg


dialog​

Задаёт реплики в облачках над NPC. Каждый раз выбирается случайная запись, а не следующая по порядку. Список регистрируется в CSV переводов.

Когда это срабатывает, зависит от interactionType:

  • CHAT пытается произнести реплику при взаимодействии, обычно правом клике. FreeMinecraftModels также передаёт левые клики по модели обработчику взаимодействий.
  • Другие типы пытаются говорить при последующих проверках, пока игрок остаётся внутри activationRadius; первая проверка пытается показать приветствие.

Буквальные символы \n делят облачко на несколько строк. Сохраните их одинарными кавычками YAML либо запишите \\n внутри двойных кавычек. Это относится и к приветствиям, и к прощаниям.

КлючЗначенияПо умолчанию
dialogСписок строкнет
Пример
dialog:
- I like apples!
- Sure is hot.

create_npc_dialog.jpg


farewell​

Задаёт случайно выбираемые прощания в облачках над NPC. Список регистрируется в CSV переводов.

КлючЗначенияПо умолчанию
farewellСписок строкнет

Закрытие любого окна инвентаря с непустым заголовком запускает попытки прощания у ближайших NPC. Поиск охватывает 5 блоков вдоль каждой оси вокруг игрока и не ограничен владельцем открытого меню. Говорить могут несколько NPC. Выход из activationRadius прощание не вызывает.

Пример
farewell: 
- Until next time!
- Bye!

create_npc_farewell.jpg


canTalk​

Управляет встроенными облачками речи. false подавляет greetings, dialog и farewell, но не отключает меню, команды, Lua, диалоги заданий, обнаружение близости и отметки заданий.

КлючЗначенияПо умолчанию
canTalkЛогическое значениеtrue
Пример
canTalk: true

activationRadius​

Задаёт радиус в блоках, в котором NPC может обнаружить приближающегося игрока.

КлючЗначенияПо умолчанию
activationRadiusДробное число3.0

Проверка выполняется каждые 100 тиков, около 5 секунд, по трёхмерному расстоянию без проверки прямой видимости. Стоящий NPC может смотреть на игрока, приветствовать при обнаруженном входе и говорить при следующих проверках. 0 или меньше отключает эти взаимодействия, включая Lua-хуки близости. Личные отметки QUEST_GIVER и CUSTOM_QUEST_GIVER используют отдельный радиус 30 блоков и могут появляться при activationRadius: 0; они отражают доступные и готовые к сдаче задания игрока.

Проверки и облачка подавляются при движении патруля или его редактировании. patrol.pauseNearPlayersRadius и patrol.faceNearbyPlayers управляют остановкой и поворотом возле игроков; см. Патрули.

Пример
activationRadius: 3.0

scripts​

Задаёт Lua-скрипты, привязанные к этому NPC. Файлы скриптов загружаются из plugins/EliteMobs/npc_scripts/. Расширение .lua необязательно — оно добавляется автоматически, если вы его пропустите.

КлючЗначенияПо умолчанию
scriptsСписок строкнет

Общий Lua-движок MagmaCore поддерживает on_spawn, on_game_tick, on_remove, on_npc_interact, on_npc_proximity_enter, on_npc_proximity_leave, on_zone_enter и on_zone_leave. Тиковый хук NPC называется on_game_tick. У каждого NPC свои экземпляры скриптов; меньший приоритет выполняется первым. Скрипту только с тиковым хуком также нужен on_spawn, возможно пустой, для инициализации. API и примеры приведены в разделе Lua-скрипты NPC.

Имя без соответствующего загруженного определения скрипта пропускается с предупреждением; NPC всё равно появляется. Соблюдайте регистр имени файла и перезагружайте после изменений.

Диалог задания может обработать клик до on_npc_interact. Иначе хук выполняется перед настроенным взаимодействием и не отменяет его.

Пример
scripts:
- wave.lua

interactionType​

Задаёт тип взаимодействия, которое будет выполнять NPC.

КлючЗначенияПо умолчанию
interactionTypeОсобое [1]NONE
Пример
interactionType: TELEPORT_BACK

noPreviousLocationMessage​

Сообщение TELEPORT_BACK, когда нет сохранённой точки возврата. Это исходная позиция, сохранённая при телепортации EliteMobs из-за пределов мира EliteMobs, а не последняя позиция при ходьбе или место смерти. Возврат использует обычную телепортацию EliteMobs с настроенной задержкой и правилами отмены. Сообщение поддерживает цветовые коды и регистрируется в CSV переводов.

КлючЗначенияПо умолчанию
noPreviousLocationMessageСтрокапустая строка
Пример
noPreviousLocationMessage: '&8[EliteMobs] &cCouldn''t send you back to your previous location - no previous location found!'

create_npc_noteleportlocation.jpg


timeout​

Минуты до удаления появившегося NPC. 0 или меньше отключает таймер. Размещение не удаляется, а определение не отключается: NPC может вернуться после перезагрузки, перезапуска или восстановления чанка.

Чтобы удалить размещение, включите /em remove, ударьте NPC и снова выполните /em remove для выхода из режима. Нужно право elitemobs.remove. Из списка удаляется соответствующая запись; старое определение с одной позицией отключается. При переходе на spawnLocations удалите старый ключ spawnLocation, иначе он может снова заработать после опустошения списка.

КлючЗначенияПо умолчанию
timeoutДробное число0 (таймер выключен)
Пример
timeout: 0

questFileName​

Список имён файлов из plugins/EliteMobs/customquests/, включая .yml, для CUSTOM_QUEST_GIVER. Ключ в единственном числе принимает список. Меню предлагает подходящие задания и принимает сдачу заданий, назначенную этому имени файла NPC. У NPC только для сдачи список предложений может быть пуст. Все размещения одного файла имеют ту же идентичность для заданий. Права и условия отдельных заданий продолжают действовать.

КлючЗначенияПо умолчанию
questFileNameСписок строкнет
Пример
questFileName:
- my_quest_one.yml
- my_quest_two.yml

disguise​

Задаёт маскировку и требует LibsDisguises. Успешно загруженная собственная модель имеет приоритет.

КлючЗначенияПо умолчанию
disguiseФормат LibsDisguisesнет
Пример
disguise: SKELETON

create_npc_disguise.jpg


customDisguiseData​

Задаёт данные для кастомной маскировки LibsDisguises.

КлючЗначенияПо умолчанию
customDisguiseDataФормат LibsDisguisesнет
Пример
disguise: custom:my_cool_disguise_name
customDisguiseData: player my_cool_disguise_name setskin {"id":"364acb6d-9050-46f7-b5fb-f8c3fd83a6fc","name":"Unknown","properties":[{"name":"textures","value":"ewogICJ0aW1lc3RhbXAiIDogMTYxMTk4ODA4Nzc1NSwKICAicHJvZmlsZUlkIiA6ICJkZGVkNTZlMWVmOGI0MGZlOGFkMTYyOTIwZjdhZWNkYSIsCiAgInByb2ZpbGVOYW1lIiA6ICJEaXNjb3JkQXBwIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzliYmVkODQzNWY4YmYyNzhhZmUyNmU2NGZkOTI2YjhiMzc3MzJkODhlMzM0ODk3ZGJkNTI3ZDU2ZmY5MTk5MGUiCiAgICB9CiAgfQp9","signature":"ujLq1joYVktuQAp1xpFKlxQFUVinSePiDBiVCAxxix/mA5vP86i/eAOfb1mtGjaAZ6sO0l2olbzvycnGXNBtbAxgqprguROXY4tpWiePVTDmy3iD4GdOCxHAkYLoyMV5qTT4SNsldUFFuND8GSEgbNMltKDLmhNKwzm08iCigPfpeuYpwljgJPxu6ka54PKNaQu4doI0ZDZXKqq4hPhR3Bs2Sz9MI0SmdmQWwcCzUz3DFdVno27fmQ6LwqmT+eSoOv0EttVG/XMaTYQ5lhBY61mqf6WlJyYVUSfjJk1AbYsctu7dWM+sbY8jFq5ljvXJGGr5TyKi+fs8vHy06Z2go20QgTYOw+caFxFijAS6fgm3oY57VEO/+/9OLHdD+Z9BrWqQWcIIrVeIfxjue/yt4pyeVv9jX59hjNFjhcPEwotkxJ+vZ96WlTLWDG4BiqauDr2VeGyLlVaygO9ZU0wwsN65iSh91GI3tMIA5wbDR0Hts/9ABvt9eafHbowS+4SZXN0i9mYnKg7op1eiB8nMEAGsPJg3DwsmUrh3ACAapQ6eYHiJpo59RXDqKlRcXwo7wsEFp//5LgQWbPj0NP3nxnywdpozqSAeq6236qlhE9BT9eiyJ41V9sMelYFEWMlUAltR40NdbIrHB0J3nmfuLJz44/sTwWf6P1khOy//XX0="}],"legacy":false}

create_npc_custom_disguise.jpg


customModel​

Задаёт модель FreeMinecraftModels или ModelEngine. Установите модель в выбранный плагин, прежде чем указывать её ID. Если доступны оба, предпочтение отдаётся FreeMinecraftModels; отсутствие модели FMM не переключает обработку на ModelEngine. Если модель не загрузилась, используется настроенная маскировка или обычный житель. См. Собственные модели.

КлючЗначенияПо умолчанию
customModelСтроканет
Пример
customModel: MY_MODEL_ONE

Наставники классов и транспорт​

Используйте interactionType: CLASS_TRAINER с classRoot для выбора ветви класса. Начните с включённых определений class_trainer_*.yml. Испытания и развитие описаны в Advanced Combat System.

Для interactionType: TRANSPORT поле transportRoutes содержит ID маршрутов без .yml; клик открывает выбор пункта назначения. См. Транспортные маршруты.

arena​

Задаёт имя файла арены, для которой NPC откроет меню (требует interactionType ARENA_MASTER).

КлючЗначенияПо умолчанию
arenaИмя файланет
Пример
arena: my_arena.yml

command​

Команда для COMMAND. Выполняется на следующем тике от имени кликнувшего игрока и требует его обычных прав на команду. Опустите начальный /. Поле не подставляет автоматически переменные игрока и не использует формат консольных команд EliteMobs.

КлючЗначенияПо умолчанию
commandСтроканет
Пример
command: say Look at me running a command, how cool!

create_npc_command.jpg


spawnLocation​

Задаёт одно местоположение спавна NPC. Это устаревший ключ для одного местоположения: он читается только когда spawnLocations отсутствует или пуст. Новые местоположения, размещённые в игре, записываются в spawnLocations, поэтому предпочитайте этот ключ.

Рекомендуемый формат: world,x,y,z,yaw,pitch. Указанный мир должен быть загружен заранее; эта настройка его не загружает.

КлючЗначенияПо умолчанию
spawnLocationСтроканет
Пример
spawnLocation: my_world,10,50,10,0,0

spawnLocations​

Несколько размещений одного определения. /em place npc <npcfilename.yml> добавляет позицию и направление взгляда с округлением до двух знаков после запятой и задаёт isEnabled: true. Полностью совпадающая сериализованная позиция не добавляется повторно. NPC восстанавливаются, когда их чанки могут обрабатывать тики сущностей.

Формат каждой записи: world,x,y,z,yaw,pitch.

КлючЗначенияПо умолчанию
spawnLocationsСписок строкнет
Пример
spawnLocations: 
- my_world,10,50,10,0,0
- my_world,-10,50,-10,0,0

instanced​

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

КлючЗначенияПо умолчанию
instancedЛогическое значениеfalse
Пример
instanced: false

syncMovement​

Задаёт, должно ли движение кастомной модели NPC синхронизироваться со стоящей за ним сущностью. Это имеет эффект, только когда задан customModel и модель загружена — для обычных NPC и NPC на LibsDisguises игнорируется.

Корректно настроенный patrol включает синхронизацию даже во время паузы или при значении false. Параметр по-прежнему действует на модели без патруля.

КлючЗначенияПо умолчанию
syncMovementЛогическое значениеtrue
Пример
syncMovement: true

patrol​

Добавляет NPC встроенный маршрут с автоматическим поиском пути. Узлы являются смещениями от заданной точки появления этого NPC или, с patrol.relative: false, точными координатами в его мире. Длинные участки рассчитываются и делятся автоматически, а патрули не загружают чанки принудительно. patrol.startNodeWaitSeconds заставляет NPC отдыхать у первого узла один раз за круг, доступный только для NPC patrol.pauseNearPlayersRadius приостанавливает патруль рядом с игроками, а patrol.faceNearbyPlayers поворачивает NPC к ним во время паузы. Полная схема, редактор, поведение на длинных маршрутах и Lua-управление описаны в разделе Патрули NPC и боссов.


Пример конфигурации NPC
isEnabled: true
name: "&cRed Rubin"
role: "&a<Generic NPC>"
profession: NITWIT
greetings:
- Hiya!
- Hello!
dialog:
- Great conversation!
- Pleasure talking with you!
farewell:
- Goodbye!
- Laters!
canTalk: true
activationRadius: 4
interactionType: CHAT
timeout: 0
spawnLocations:
- my_world,584,55,127,90,10

create_npc_npc.jpg


Особое [1]​

Ниже приведён список допустимых типов взаимодействия NPC:

ТипОписание
GUILD_GREETERОткрывает бонусы оружейных навыков. Нужно elitemobs.skill.npc.
CLASS_TRAINERОткрывает ветвь из classRoot. Нужно elitemobs.command.
TRANSPORTОткрывает пункты назначения из transportRoutes.
CHATПытается произнести случайную реплику dialog при взаимодействии.
CUSTOM_SHOPОткрывает собственный магазин. Нужно elitemobs.shop.custom.npc.
PROCEDURALLY_GENERATED_SHOPОткрывает генерируемый магазин. Нужно elitemobs.shop.dynamic.npc.
BARНе реализовано. Сообщает игроку, что функция скоро появится.
ARENAНичего не делает. Используйте ARENA_MASTER вместо этого.
QUEST_GIVERОткрывает генерируемые задания. Нужно elitemobs.quest.npc.
CUSTOM_QUEST_GIVERПредлагает подходящие задания из questFileName и принимает назначенную сдачу.
NONEНет встроенного действия; скрипты, близость и диалоги заданий продолжают работать.
SELLОткрывает продажу. Нужно elitemobs.shop.sell.npc.
TELEPORT_BACKИспользует сохранённую точку возврата EliteMobs. Нужно elitemobs.back.npc.
SCRAPPERОткрывает утилизацию. Нужно elitemobs.scrap.npc.
REPAIRMANОткрывает ремонт. Нужно elitemobs.repair.npc.
ENCHANTERОткрывает зачарование. Нужно elitemobs.enchant.npc.
REFINERЗАМЕНЕНО — сообщает игроку, что функция была заменена; администраторам предлагается удалить NPC
SMELTERЗАМЕНЕНО — сообщает игроку, что функция была заменена; администраторам предлагается удалить NPC
ENHANCERЗАМЕНЕНО — сообщает игроку, что функция была заменена; администраторам предлагается удалить NPC
UNBINDERОткрывает снятие привязки. Нужно elitemobs.unbind.npc.
ARENA_MASTERОткрывает меню арены для арены, заданной в arena
COMMANDВыполняет команду, заданную в command
SCROLL_APPLIERОткрывает элитные свитки предметов. Нужно elitemobs.scroll.npc; не появляется при отключённом useEliteItemScrolls.
ARROW_SHOPОткрывает магазин стрел. Нужно elitemobs.shop.arrow.npc.
GAMBLING_BLACKJACKОткрывает блэкджек. Нужно elitemobs.gambling.npc.
GAMBLING_COINFLIPОткрывает подбрасывание монеты. Нужно elitemobs.gambling.npc.
GAMBLING_SLOTSОткрывает слоты. Нужно elitemobs.gambling.npc.
GAMBLING_HIGHERLOWERОткрывает «больше/меньше». Нужно elitemobs.gambling.npc.

Подробнее о том, что делают SCRAPPER и похожие типы взаимодействия, нажмите здесь.

Примечания о поведении NPC​

Встроенное поведение также включает:

  • Движение: обычно NPC стоят и смотрят на ближайших игроков. Патрули и скрипты могут их перемещать. Патруль задаёт маршрут вместо обычного поведения жителя.
  • Порядок взаимодействий: диалог задания может обработать клик до Lua и встроенного действия. Иначе сначала выполняется Lua, затем действие и его проверки прав. Защита на один тик предотвращает повторные взаимодействия одного игрока с разными NPC. Редактирование патруля блокирует взаимодействия, обычное движение патруля — нет.
  • Защита: тела NPC не сталкиваются обычным образом. EliteMobs отменяет урон, превращения жителей и открытие обычного торгового инвентаря.
  • Подписи: имя и роль используют описанную выше фиксированную схему. Обычные и замаскированные NPC учитывают текущую высоту тела, поэтому масштаб может менять положение подписей. Совместимые модели FMM управляют именем и ролью вместе.
  • Bedrock: отображение зависит от активной интеграции моделей и подписей. Текущий механизм подписей NPC не использует сохранённый ключ bedrockNPCRoleYOffset.
  • Задержка диалога: каждый NPC делит 3 секунды ожидания между всеми игроками. Приветствие одного может помешать приветствию другого в этот период. Личные облачка исчезают примерно через 5 секунд.
  • Невидимость: NPC под эффектом зелья невидимости не будет показывать пузыри чата.
  • Чанки: NPC исчезают при выгрузке и восстанавливаются, когда чанк снова обрабатывает тики сущностей. Сущности NPC не сохраняются в мире; размещения берутся из конфигураций.
  • Переименование: обычный правый клик по базовому жителю с биркой в основной руке отменяется с сообщением. Модели используют собственные обработчики; FreeMinecraftModels передаёт и левые, и правые клики обработчику NPC.