Войти или зарегистрироваться

Туториал Denizen 0.7 для Citizens2

  • Автор темы Автор темы ExiD
  • Дата начала Дата начала

Нужен ли продолжать этот мануал и стоит ли делать видеоуроки?

  • Нет, никому это не нужно

    Голосов: 3 2,4%
  • Да, но нужны только текстовые мануалы

    Голосов: 15 12,2%
  • Да, но нужны только Видеоуроки

    Голосов: 15 12,2%
  • Да, нужно и то и то

    Голосов: 90 73,2%

  • Всего проголосовало
    123

ExiD

Активный участник
Баллы
88
Имя в Minecraft
bars268
Denizen-Logo-Large.png
Denizen– NPCкоторые используют сценарии и события для взаимодействия с игроком или миром. Например хранители порталов, Маги, Банкиры, тренера, говорящие горожане, кузнец. Их можно использовать в любых целях: давать подсказки игрокам, квесты или администрирование. Denizenиспользуют собственный скриптовый язык, базирующийся на YAML.

Denizenэто, по сути, продолжение Citizens2, которое добавляет невероятное количество автоматизации НПС и игроков. Некоторые основные функции:
  • Скриптовый движок (The Script Engine) отправляет все команды, которые выполняются упорядоченно, это основа Denizen. В настоящее время имеется 3 очереди, для игрока, для Denizens и для задачи.
  • Скрипты для взаимодействия (Interact Scripts) это основа Dezizen, которая позволяет игрокам и НПС взаимодействовать друг с другом и с миром. Такие скрипты очень гибко настраиваются. Подробнее о таких скриптах будет ниже.
  • Скрипты действий (Activity Scripts) позволяют Denizen быть как обычные игроки. То есть они смогут ходить, общаться друг с другом, сажать деревья, строить дома и еще много чего.
  • Планировщик действий (Activity Scheduler) позволяет создавать «график» из скриптов для Denizenоснованный на одном игровом дне в minecraft.
  • Скрипты заданий (Task Scripts) это простые скрипты которые могут использоваться как «скрипты действий» и как «скрипты взаимодействия».
  • Листнер (Listeners) в настоящее время находятся в «экспериментальной фазе», но уже позволяют контролировать события Minecraft bukkit. Например если вы хотите создать квест на убийство.
  • Система флагов (Flag System) позволяет более динамичное использование Denizen. Сложная, но легко воспринимаемая система флагов была внедрена в Denizen, чтобы помочь отслеживать события, предметы, цифры, игроков и многое другое.
Файловая структура​
Важно понять файловую структуру Denizen прежде чем начинать писать скрипты. Ниже распишем для чего нужен каждый файл. Это может показаться вам бесполезным, но стоит все таки вникнуть до того как начнете использовать.



450px-Figure_1_-_Denizen_file_structure.png
​

denizen.jar
Очень часто встречается вопрос, куда же поместить этот файл? Если в прошлом, для Citizens 1.2 все типы граждан помещались в специальную папку, то для нашего случая стоит рассматривать как любой другой плагин и помещать в папку плагинов /plugins. Единственное отличие Denizen от других плагинов это то, что Denizen не создает все папки и файлы сам. Вам придется вручную создавать некоторые файлы и папки. Но есть другой выход! Скачать СТАРТОВЫЙ НАБОР и закинуть в папку плагина.



config.yml
Содержит некоторые параметры для изменения поведения Denizen. Вы можете использовать все значения по умолчанию, плохо от этого не станет)
Изменения в этот файл можно вносить и при работающем сервере, только потом может потребоваться перезагрузка плагина командой /denizen reload .

assignments.yml
В этом файле описываются все варианты действия для вашего NPC. Каким образом его редактировать будет объяснено дальше.
Изменения в этот файл можно вносить и при работающем сервере, только потом может потребоваться перезагрузка плагина командой /denizen reload .

saves.yml
Ни в коем случае не редактируйте вручную этот файл при включенном сервере. Он будет заполняться автоматически. Тут содержится информация о профессии НПС, флагах игроков, расположении НПС, активные сценарии, действия и другое.

read-only-scripts.yml
Еще один файл, который нельзя редактировать вручную. Сюда пишутся все скрипты которые плагин смог прочитать.

/scripts/ папка
Это папка из которой плагин будет читать скрипты при загрузке и заносить их в файл read-only-scripts.yml . Такая организация скриптов очень удобна, так как количество скриптов может быть очень велико и ориентироваться по ним будет сложно.Файлы в этой директории можно называть как угодно, но формать долен быть всегла .yml .

Config.yml​


# Операторы могут получать информацию о НПС с помощью правого клика.
# Если falseто команда '/denizeninfo' делает то же самое.
right_click_and_sneak_info_mode_enabled: true

# Стандартное время отката триггеров в секундах.
default_click_cooldown_in_seconds: 2.0
default_location_cooldown_in_seconds: 30.0
default_proximity_cooldown_in_seconds: 15.0
default_death_cooldown_in_seconds: 0.0
default_damage_cooldown_in_seconds: 0.5
default_chat_cooldown_in_seconds: 2.0

# Если триггер атаки (damagetrigger) (левый клик) деактивирован. Выберите falseесли хотите
# чтобы был активен только правый клик.
disabled_damage_trigger_instead_triggers_click: false

# Ожидания действия.
engage_timeout_in_seconds: 150

# Задержка взпимодействия задает темп для очереди игрока и очереди НПС.
# рекомендуется ставить значения 10-20.
interact_delay_in_ticks: 10

# Максимальная длина строки диалога
multi_line_text_maximum_length: 55

# обычно, игроки могут говорить с НПС даже если нет триггера чата.
# Измените на trueесли вы хотите чтобы чат с НПС был виден для всех
chat_globally_if_no_chat_triggers: false

# Если триггер чата включен, и игрок вызывает недоступный триггер
# который не соответствует ни одному описанному в скрипте,
# Должен ли игрок продолжать чат с НПС и получать ответы или должен
# возвращаться в глобальный чат игнорируя НПС
# Измените на trueесли хотите
# чтобы чат у НПС был глобальный если триггер чата есть,
# ноненайденысоответствия
chat_globally_if_failed_chat_triggers: false

​
 
​
Все не уместилось в 1 пост, поэтому продолжение конфига:
​
# также.. если НПС не взаиможействует с игроком(нет скрипта взаимодействия)
# по умолчанию чат по прежнему ориентирован на НПС
# Вы можете отключить эту опцию поставив true
chat_globally_if_not_interactable: false

# Должны ли игроки, взаимодействующие с Denizenслышать разговор другого игрока
bystanders_hear_player_to_npc_chat: true
bystanders_hear_npc_to_player_chat: true

# Определяет диапазоны в блоках для взаимодействия с нпс
player_to_npc_chat_range_in_blocks: 2
npc_to_player_chat_range_in_blocks: 7
npc_emote_range_in_blocks: 7
player_to_npc_shout_range_in_blocks: 15
npc_to_player_shout_range_in_blocks: 15
player_to_npc_whisper_range_in_blocks: 2
npc_to_player_whisper_range_in_blocks: 3
proximity_trigger_range_in_blocks: 3
location_trigger_range_in_blocks: 1

# Определяет как следует «разговаривать» НПС с игроком.
# <PLAYER>, <NPC> и <TEXT> стандартные теги
player_chat_to_npc: "Высказали <NPC>y, '<TEXT>'"
player_chat_to_npc_bystander: "<PLAYER> сказал <NPC>y, '<TEXT>'"
npc_chat_to_bystanders: "<NPC> говорит, '<TEXT>'"
npc_chat_to_player: "<NPC> сказалтебе, '<TEXT>'"
npc_chat_to_player_bystander: "<NPC> сказал <PLAYER>y, '<TEXT>'"

player_whisper_to_npc: "Выпрошептали <NPC>y, '<TEXT>'"
player_whisper_to_npc_bystander: "<PLAYER> прошепталчтото <NPC>у."
npc_whisper_to_bystanders: "<NPC> прошептал, '<TEXT>'"
npc_whisper_to_player: "<NPC> прошепталвам, '<TEXT>'"
npc_whisper_to_player_bystander: "<NPC> прошепталчтото <PLAYER>у."

player_shout_to_bystanders: "Выкрикнули, '<TEXT>'"
player_shout_to_bystanders_bystander: "<PLAYER> коикнул, '<TEXT>'"
npc_shout_to_bystanders: "<NPC> крикнул, '<TEXT>'"
npc_shout_to_player: "<NPC> крикнулвам, '<TEXT>'"
npc_shout_to_player_bystander: "<NPC> крикнул <PLAYER>у, '<TEXT>'"

npc_hint_prefix: "[HINT] Вы можете сказать: "

# Стандартные тексты, которые используются для взаимодейсвия.
default_denizen_unavailable_text: "Ты не видишь, я занят!"
default_no_click_trigger_text: "Мне пока нечего тебе сказать."
default_no_damage_trigger_text: "Эй!Этобольно!"
default_no_chat_trigger_text: "Извини, я тебя не понимаю."

Скрипты взаимодействия (Interact scripts)​
Для начала рассмотрим общую структуру скрипта. ВАЖНО помнить что пробелы играют важную роль в YАML, из за этого, или из за пропущенного двоеточия, возникает большинство ошибок. (для общего ознакомления советую посмотреть короткий мануал по YAML на английском, при необходимости могу его перевести).
Так вот, каркас скрипта:


YAML:
'Name of script': # Имя скрипта
 
    Type: Interact # Описание типа
 
    Requirements: # Описание требований (внутриигровых) для скрипта
 
        Mode: ... # "Режим" требований (об этом далее)
 
        List: # Список требований
 
          - требование1
 
          - ...
 
    Steps: # Шаги(циклы) скрипта
 
      1: # Описание шага
 
          Some Trigger: # Какой-нибудь триггер (об этом далее)
 
            Trigger: ...
 
            Script: # Тело скрипта
 
                - ...
 
                - ...

Вроде ничего не понятно, и вообще "какого черта тут происходит?!"
Ничего страшного, сейчас рассмотрим пример:
YAML:
"A Hint in the Sky":  #Название скрипта, тут все понятно
  Type: Interact          #тип, окей, дальше
  Requirements:        #требования
    Mode: None
  Steps:                        #первый и единственный шаг скрипта
    1:
      Proximity Trigger:  #какой то триггер…
        Script:                      #какие то команды далее
        - ^COOLDOWN 15
        - LOOK CLOSE
        - ^CHAT "Look up there! What could that possibly be used for?"
        - LOOK BOOKMARK:upthere DURATION:10
        - WAIT 1
        - CHAT "If only I could figure out how to make it, I can't find any stairs!"
Вроде что-то стало более понятно, но не совсем. Значит начинаем разбирать скрипт по байтам словам.

Требования к имени скрипта:
Имя скрипта может быть абсолютно любым, однако стоит помнить некоторые вещи:
  • Имя скрипта полностью зависит от регистра. Например 'script name' и 'SCRIPT NAME' абсолютно разные скрипты
  • Имена, содержащие пробелы, должны быть заключены в одинарные или двойные кавычки ( " ; ' )
  • Если внутри названия имеется одинарная кавычка, то все название необходимо заключить в ДВОЙНЫЕ кавычки например "John's Script"
Требования к типу:
В данном подразделе мы будем использовать только interact, но стоит знать что есть еще TASK и ACTIVITY


Формат требований:
какие есть моды (режимы) требований:
  • ALL - все без исключения из списка ниже​
  • ANY [#] - определенное вместо [#] кол-во требований из списка​
  • NONE - ничего. Используется при пустом листе​
    ​
​
​
​
​
 
Теперь что может быть включено в СПИСОК list​
​

Требования, связанные с игроком:
HUNGER [Full или Hungry или Starving]
Проверка индикатора голода. Full - полный, Hungry - полностью голодный, Starving чуть голодающий.​
​
​
ITEM [Название_предмета или #:#] (количество)
Проверка наличия предмета в инвентаре​
​
LEVEL [# or higher] или [At least this Level #] или [No more than this Level #]
проверяет уровень персонажа. Сам я это не проверял так что в работоспособности не уверен​
​
NAME [Имя_игрока] ( Имя_игрока ) ( Имя_игрока ) ...
Позволяет сделать скрипт только под определенных игроков​
​
POTIONEFFECT [Тип_зелья]
проверяет есть ли эффект от определенного зелья на персонаже​
​
WEARING [Название_предмета или #:#]
Проверяет надет ли на игроке предмет по названию или ID​
​
Требования, связанные с миром:
STORMY
Проверяет дождь в мире​
​
SUNNY
Проверяет солнце в мире​

TIME [Day или Night или Dusk или Dawn или 0-23999]
Время в мире. День или ночь или рассвет или закат или цифровое значение.​
​
WORLD [Имя мира] ( Имя мира ) ( Имя мира ) ...
Позволяет сделать скрипт доступным только в определенных мирах​
​
Требования, связанные с другими скриптами
ACTIVITY [имя активного скрипта]
проверяет активен ли скрипт у игрока сейчас. Полезно при параллельных квестах.​
​
FAILED (#) [Имя скрипта]
проверяет завален ли другой скрипт (не выполнен) # раз​
​
FINISHED (#) [Имя скрипта]
проверяет закончен ли другой скрипт # раз​
​
FLAGGED [FlagName:FlagValue or FlagName] (EXACTLY) (PLAYER or DENIZEN)
Проверка на флаг. В официальной вики о системе флагов ни слова, но позже я попытаюсь изложить свое понимание.​
​
Требования, связанные с экономикой или пермишнами
GROUP [Название группы] ( Название группы) (Название группы) ...
позволяет сделать скрипт активным только для определенной группы в пермах​

MONEY [количество]
для начала работы скрипта требует денег.​
​
PERMISSION [permission.node]
проверяет определенный перм у игрока​
​
​
Разработчики так же позаботились о отрицании требования. для этого перед требованием нужно поставить еще один "-"
например: - -STORMY означает -SUNNY
​
Описание шагов (steps) скрипта
Каждый скрипт может иметь несколько шагов, каждый из шагов, в свою очередь, может иметь несколько триггеров. Игрок за раз может вызвать только 1 шаг скрипта. При запуске скрипта проверяется закончил ли игрок предыдущие шаги, если нет, то скрипт начинается с 1го шага.
Рассмотрим пример.
ПРИМЕЧАНИЕ: команда ZAP перекидывает игрока на следующий шаг. Обязательно ставьте в конце каждого шага, автоматически перекидывание не происходит.
'Welcome to Harbortown':
Type: Interact​
Requirements:​
Mode: NONE​
Steps:​
'1':​
Click Trigger:​
Script:​
- CHAT 'What's your name, stranger?'​
Chat Trigger:​
'1':​
Trigger: My name is /<PLAYER>/.​
Script:​
- CHAT 'Ah ha, your name sounds familiar! '​
- CHAT 'Are you from around this area?'​
- ZAP​
'2':​
Click Trigger:​
Script:​
- HINT​
Chat Trigger:​
'1':​
Trigger: /Yes/, I grew up in Harbortown!​
Script:​
- CHAT 'I thought so, welcome back!​
Have you heard about Tom the Taylor?​
Isn't that just horrible?'​
- ZAP 3​
'2':​
Trigger: /No/, you must be mistaken.​
Script:​
- CHAT 'Oh, sorry about that.'​
- CHAT 'Hey, if you're looking for some work,​
Bill the Baker is understaffed!​
This is the bakery's busy season.'​
- ZAP 4​
'3':​
Click Trigger:​
Script:​
- CHAT 'I wonder if Tom the Taylor is doing any better.'​
- NARRATE 'Perhaps you should check on Tom the Taylor.'​
'4':​
Click Trigger:​
Script:​
- CHAT 'Oh, nice to see you again <PLAYER>!'​
- CHAT 'Have you stopped by the bakery?'​
 
Продолжение следует...

Далее опишу доступные триггеры и команды
Нашли ошибку? напишите в ЛС!
 
Временно приостановлено. Приношу свои извинения. По всем вопросам - в личку.
 
А можно ли вставить все, что ты описал в config.yml, в свой конфиг? Так сказать "Русифицировать"? Ну конечно, же не забыв вставить пробелы в том месте где тебе не хватило для них места.
 
А можно ли вставить все, что ты описал в config.yml, в свой конфиг? Так сказать "Русифицировать"? Ну конечно, же не забыв вставить пробелы в том месте где тебе не хватило для них места.
Конечно можно
 
ExiD, молодец! Я только подумываю о переходе на Ctitizens2, твоя тема будет очень полезна.

Скажи, а не попадалось конвертера квестов? Или какого-то механизма позволяющего использовать квесты от 1.2? А то у нас их очень много написано.
 
ExiD, молодец! Я только подумываю о переходе на Ctitizens2, твоя тема будет очень полезна.

Скажи, а не попадалось конвертера квестов? Или какого-то механизма позволяющего использовать квесты от 1.2? А то у нас их очень много написано.
На самом деле натыкался на статью, если еще найду - обязательно скину
 
Спасибо огромное!

UPD: Ээ... это не совсем то. Нужно что-то делать с квестами, это сложнее :(
 
Для версии Denizen 0.8.8 можно помощь
 
Осталось куча неизведанного !!!
Как научить ходить бота, как заставить выполнять серверные команды (например давать разрешения)
Требую Продолжения ...
Ещё и про версию 0.8.8 расказать !!!!
 
А как взаимодействовать с нпц? Допустим он меня спрашивает "Тебя подлечить? (да/нет)" - как мне ответить "Да"?
 
не могу я denizen сделать, на /trait denizen пишет Couldn't change denizen: Trait not found

уже голову сломал .....

хотя /trait blacksmith работает отлично
 
Кто нибудь может сказать как внедрить item[]() в if
И мне еще надо команду на забирание предмета из инвентаря.Если поможете спасибо
А как взаимодействовать с нпц? Допустим он меня спрашивает "Тебя подлечить? (да/нет)" - как мне ответить "Да"?
Это тебе надо chat trigger как вверху образец или давай в скайп live:aleksandr_h2001 все объясню
 
Назад
Верх