Страница 1 из 1

[Citizens 2] Denizen

Добавлено: 04 апр 2016, 10:33
nucleon
Denizen
Лучше всего классифицировать данный плагин как платформу для создания сценариев.
Denizen, вероятно, лучше всего известен как способ создания скриптовых NPC Citizen.
На самом деле, весь этот проект начинался как расширение Citizens2.
NPC Данного типа могут использовать сценарии и события для взаимодействия с игроком или миром.
Например хранители порталов, Маги, Банкиры, тренера, говорящие горожане, кузнец.
Их можно использовать в любых целях: давать подсказки игрокам, квесты или администрирование.
Denizen используют собственный скриптовый язык, базирующийся на YAML.

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



Файловая система
  • denizen.jar
    как любой другой плагин и помещать в папку плагинов /plugins.
  • config.yml
    Содержит некоторые параметры для изменения поведения Denizen. Вы можете использовать все значения по умолчанию, плохо от этого не станет)
    Изменения в этот файл можно вносить и при работающем сервере, только потом может потребоваться перезагрузка плагина командой /denizen reload .
  • assignments.yml
    В этом файле описываются все варианты действия для вашего NPC. Каким образом его редактировать будет объяснено дальше.
    Изменения в этот файл можно вносить и при работающем сервере, только потом может потребоваться перезагрузка плагина командой /denizen reload .
  • saves.yml
    Ни в коем случае не редактируйте вручную этот файл при включенном сервере. Он будет заполняться автоматически. Тут содержится информация о профессии НПС, флагах игроков, расположении НПС, активные сценарии, действия и другое.
  • read-only-scripts.yml
    Еще один файл, который нельзя редактировать вручную. Сюда пишутся все скрипты которые плагин смог прочитать.
  • /scripts/ папка
    Это папка из которой плагин будет читать скрипты при загрузке и заносить их в файл read-only-scripts.yml . Такая организация скриптов очень удобна, так как количество скриптов может быть очень велико и ориентироваться по ним будет сложно.Файлы в этой директории можно называть как угодно, но формат должен быть всегда .yml .


        • Config.yml - примерное содержание файла с конфигурацией плагина:​


[spoiler]
  • # Операторы могут получать информацию о НПС с помощью правого клика.
    # Если 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

    # также.. если НПС не взаиможействует с игроком(нет скрипта взаимодействия)
    # по умолчанию чат по прежнему ориентирован на НПС
    # Вы можете отключить эту опцию поставив 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: "Извини, я тебя не понимаю."
[/spoiler]

Re: [Citizens 2]Denizen

Добавлено: 04 апр 2016, 10:57
nucleon
Скрипты взаимодействия (Interact scripts):
  • Каркас Скрипта:

    Код: Выделить всё

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

    Код: Выделить всё

    "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 - ничего. Используется при пустом листе​
[/b]

Re: [Citizens 2] Denizen

Добавлено: 04 апр 2016, 12:33
nucleon
Требования, связанные с игроком:
  • HUNGER [Full или Hungry или Starving]
    • Проверка индикатора голода. Full - полный, Hungry - полностью голодный, Starving чуть голодающий.​


    ITEM [Название_предмета или #:#] (количество)
    • Проверка наличия предмета в инвентаре​


    LEVEL [# or higher] или [At least this Level #] или [No more than this Level #]
    • проверяет уровень персонажа. Сам я это не проверял так что в работоспособности не уверен​


    NAME [Имя_игрока] ( Имя_игрока ) ( Имя_игрока ) ...
    • Позволяет сделать скрипт только под определенных игроков​


    ​POTIONEFFECT [Тип_зелья]
    • проверяет есть ли эффект от определенного зелья на персонаже​


    ​WEARING [Название_предмета или #:#]
    • Проверяет надет ли на игроке предмет по названию или ID​


Re: [Citizens 2] Denizen

Добавлено: 04 апр 2016, 12:36
nucleon
Требования, связанные с миром:
  • STORMY
    • Проверяет дождь в мире​


    SUNNY
    • Проверяет солнце в мире​


    TIME [Day или Night или Dusk или Dawn или 0-23999]
    • Время в мире. День или ночь или рассвет или закат или цифровое значение.​


    WORLD [Имя мира] ( Имя мира ) ( Имя мира ) ...
    • Позволяет сделать скрипт доступным только в определенных мирах
​[/list]

Re: [Citizens 2] Denizen

Добавлено: 04 апр 2016, 12:39
nucleon
Требования, связанные с другими скриптами
  • ACTIVITY [имя активного скрипта]
    • проверяет активен ли скрипт у игрока сейчас. Полезно при параллельных квестах.​


    ​FAILED (#) [Имя скрипта]
    • проверяет завален ли другой скрипт (не выполнен) # раз​


    ​FINISHED (#) [Имя скрипта]
    • проверяет закончен ли другой скрипт # раз​


    FLAGGED [FlagName:FlagValue or FlagName] (EXACTLY) (PLAYER or DENIZEN)
    • Проверка на флаг. В официальной вики о системе флагов ни слова

Re: [Citizens 2] Denizen

Добавлено: 04 апр 2016, 12:43
nucleon
Требования, связанные с экономикой или правами
  • GROUP [Название группы] (Название группы) (Название группы) ...
    • позволяет сделать скрипт активным только для определенной группы в пермах​


    MONEY [количество]
    • для начала работы скрипта требует денег.​


    PERMISSION [permission.node]
    • проверяет определенный перм у игрока​

​​
Разработчики так же позаботились о отрицании требования.
для этого перед требованием нужно поставить еще один "-"
например: - -STORMY означает -SUNNY

Re: [Citizens 2] Denizen

Добавлено: 04 апр 2016, 15:53
nucleon
Каждый скрипт может иметь несколько шагов, каждый из шагов, в свою очередь, может иметь несколько триггеров.
Игрок за раз может вызвать только 1 шаг скрипта.
При запуске скрипта проверяется закончил ли игрок предыдущие шаги, если нет, то скрипт начинается с 1го шага.
Рассмотрим пример.
ПРИМЕЧАНИЕ: команда ZAP перекидывает игрока на следующий шаг.
Обязательно ставьте в конце каждого шага, автоматически перекидывание не происходит.

Код: Выделить всё

'Welcome to Citi':
	Type: Interact
	Requirements:
		Mode: NONE
	Steps:
		'1':
		   Click Trigger:
				Script:
				- CHAT 'Как тебя звать, Странник?'
		   Chat Trigger:
			   '1':
					Trigger: My name is /<PLAYER>/.
					Script:
					- CHAT 'Ваше имя звучит знакомо!'
					- CHAT 'Вы из нашей округи?'
					- ZAP
		'2':
		   Click Trigger:
				Script:
				- HINT
		   Chat Trigger:
			   '1':
					Trigger: /Yes/, Я вырос в Пригороде Citi!
					Script:
					- CHAT 'Я так и думал, добро пожаловать обратно!
					Слышали ли вы о Томе Тейлор
					Разве это не просто ужасно?'
					- ZAP 3
			   '2':
					Trigger: /No/, я прибыл из далека.
					Script:
					- CHAT 'Ой, извините видимо ошибся'
					- CHAT 'Может быть вы ищете какую-то работу?
					Билл булочник нуждается в работниках!
					сейчас напряженный сезон для его пекарни.'
					- ZAP 4
		'3':
		   Click Trigger:
				Script:
				- CHAT 'Интересно, что делает Том сейчас?'
				- NARRATE 'Вы должны проведать Тома (портной)'
		'4':
		   Click Trigger:
				Script:
				- CHAT 'О, приятно видеть вас снова <Player>!'
				- CHAT 'Вы остановили пекарню?'​
надеюсь, что пробелы не шибко существенны, ибо не факт, что правильно расстaвлены
инфа взята тут