Skip to content

Челлендж

Челлендж - это испытания наподобие диалогов, поддерживающие действия с различными условиями (уровень навыка игрока, наличие предметов), проверками (с помощью роллов) и событиями при выполнении (команды, директ-экшены, изъятие предметов).

Создание челленджа

Челленджи пишутся в файлах формата .toml.

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

Например, для файла test_challenge.toml уникальный идентификатор или uid - это test_challenge.

Пример файла челленджа test_challenge.toml
name = "Завал из груды камней"

[nodes.root]
text = "Вы видите перед собой завал из груды камней."

# Снос
[nodes.root.actions.destroy]
label = "Попытаться свалить кучу камней, навалившись всем весом"
requirements = [
    "STAT focus >= 25",
    "STAT stamina >= 50"
]
type = "ROLL_ACTION"
roll_action = "PHYSICAL"
threshold = 15

[[nodes.root.actions.destroy.modifiers]]
label = "Удачно, что у вас в руке кирка"
requirements = [
    "HOLDING_ITEM minecraft:iron_pickaxe"
]
value = 100

[[nodes.root.actions.destroy.success]]
weight = 50
goto = "destroy_success"

[[nodes.root.actions.destroy.success]]
weight = 50
goto = "destroy_brain_damage"

[[nodes.root.actions.destroy.fail]]
goto = "destroy_fail"

[nodes.destroy_success]
text = "Вы успешно свалили кучу камней без каких-либо происшествий."
when_enabled = [
    { type = "DESTROY_CHALLENGE" }
]

[nodes.destroy_brain_damage]
text = "Вы успешно свалили кучу камней, но один из камней ударил вам по голове. Зато вы нашли крутой камень."
when_enabled = [
    { type = "DIRECT_ACTION", cmd = "damage_hp @p 1 KINETIC" },
    { type = "COMMAND", cmd = "give @p minecraft:stone 1 1" },
    { type = "DESTROY_CHALLENGE" }
]

[nodes.destroy_fail]
text = "У вас не получилось свалить кучу камней и вы сильно ушиблись."
when_enabled = [
    { type = "DIRECT_ACTION", cmd = "damage_hp @p 1 KINETIC" }
]

[nodes.destroy_fail.actions.retry]
type = "GOTO"
label = "Попытаться снова"
is_private = true
goto = "root"

# Демонтаж
[nodes.root.actions.deconstruct]
type = "GOTO"
label = "Попытаться вытащить камень, на котором все держится"
goto = "deconstruct_success"

[nodes.root.actions.deconstruct.requirements]
variant1 = [
    "STAT focus >= 25",
    "STAT stamina >= 50",
    "ATTRIBUTE intelligence >= 10"
]
variant2 = [
    "STAT focus >= 25",
    "STAT stamina >= 50",
    "ATTRIBUTE intelligence >= 10"
]

[nodes.deconstruct_success]
text = "Вы успешно демонтировали кучу камней"
when_enabled = [
    { type = "DIRECT_ACTION", cmd = "mod_stat @p STAMINA -50" },
    { type = "DIRECT_ACTION", cmd = "mod_stat @p FOCUS -25" },
    { type = "DESTROY_CHALLENGE" }
]

# Рандом
[nodes.root.actions.random_pick]
label = "Вытащить случайный камень и посмотреть, что будет"

type = "ROLL"
dice = "d100"
threshold = 50

[[nodes.root.actions.random_pick.modifiers]]
label = "Удачно, что у вас в руке кирка"
requirements = [
    "HOLDING_ITEM minecraft:iron_pickaxe"
]
value = 100

[[nodes.root.actions.random_pick.success]]
goto = "random_success"

[[nodes.root.actions.random_pick.fail]]
goto = "random_fail"

[nodes.random_success]
text = "Вы успешно свалили кучу камней. Это божье чудо."
is_private = true
when_enabled = [
    { type = "DIRECT_ACTION", cmd = "damage_hp @p 1 KINETIC" },
    { type = "DESTROY_CHALLENGE" }
]

[nodes.random_fail]
text = "Вся груда камней свалилась на вас. Вы не мертвы, но близки к этому."
when_enabled = [
    { type = "DIRECT_ACTION", cmd = "damage_hp @p 100 KINETIC" },
]

[nodes.random_fail.actions.retry]
type = "GOTO"
label = "Попытаться снова?"
goto = "root"
is_private = true

# Сдвиг
[nodes.root.actions.move]
label = "Использовать железную кирку, чтобы расколупать завал"
requirements = [
    "STAT focus >= 25",
    "STAT stamina >= 50",
    "HOLDING_ITEM minecraft:iron_pickaxe"
]

type = "ROLL_ACTION"
roll_action = "TECH"
threshold = 5

[[nodes.root.actions.move.success]]
goto = "move_success"

[[nodes.root.actions.move.fail]]
goto = "move_fail"

[nodes.move_success]
text = "Благодаря железной кирке, вы успешно передвинули камни и добыли кое-какие из них."
when_enabled = [
    { type = "DAMAGE_ITEM", item = "minecraft:iron_pickaxe", amount = 5 },
    { type = "COMMAND", cmd = "give @p minecraft:stone 1" },
    { type = "DIRECT_ACTION", cmd = "damage_hp @p 1 KINETIC" },
    { type = "DESTROY_CHALLENGE" }
]

[nodes.move_fail]
text = "Вы успешно свалили кучу камней, но безвозвратно сломали кирку из за нехватки знаний работы с ней."
when_enabled = [
    { type = "TAKE_ITEM", item = "minecraft:iron_pickaxe" },
    { type = "DIRECT_ACTION", cmd = "damage_hp @p 1 KINETIC" },
    { type = "DESTROY_CHALLENGE" }
]

# Установка флажка
[nodes.root.actions.add_flag]
label = "Пометить завал флажком"
requirements = [
    "!HAS_FLAG flag"
]
type = "GOTO"
goto = "placed_flag"

[nodes.placed_flag]
text = "Вы успешно пометили эту груду камней. Зачем? Интересный вопрос. Видите ли,"
when_enabled = [
    { type = "ADD_FLAGS", flags = "flag" }
]

[nodes.placed_flag.actions.return]
type = "GOTO"
label = "Вернуться к разглядыванию груды камней"
goto = "root"
is_private = true

# Убирание флажка
[nodes.root.actions.remove_flag]
label = "Убрать флажок"
requirements = [
    "HAS_FLAG flag"
]
type = "GOTO"
goto = "removed_flag"

[nodes.removed_flag]
text = "Вы успешно убрали флажок из этой груды камней."
when_enabled = [
    { type = "REMOVE_FLAGS", flags = "flag" }
]

[nodes.removed_flag.actions.return]
type = "GOTO"
label = "Вернуться к разглядыванию груды камней"
goto = "root"
is_private = true

Структура

Название (обязательно)

Задаётся в корне файла (т.е. без аннотаций) в поле name:

name = "Завал из груды камней"

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

Корневая нода (обязательно)

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

Корневая нода ничем не отличается от любой другой ноды, т.е. может иметь действия, события и т.д.

Имеет идентификатор root:

[nodes.root]
text = "Вы видите перед собой завал из груды камней."

Ноды (обязательно)

Ноды - это узлы или стадии челленджа, которые отображаются в окне челленджа или в чате всем окружающим игрокам. Ноды могут иметь сколько угодно действий и событий (о них ниже)

Задаётся с помощью кода вида:

[nodes.destroy_success]
text = "Вы успешно свалили кучу камней без каких-либо происшествий."
is_private = true
when_enabled = [
    { type = "DESTROY_CHALLENGE" }
]

  • destroy_success - любой уникальный идентификатор ноды без пробелов
  • text - этот текст будет выведен в окне челленджа
  • is_private (опционально) - если true, то не будет выводить текст ноды всем окружающим игрокам, он будет отображён только в окне
  • is_visible_if_unavailable (опционально) - если true, то при недоступности действие всё ещё будет отображаться, но прожать его будет нельзя. Полезно чтобы показать игроку, что такая возможность есть, но он не выполнил нужные условия
  • is_available_when_dead (опционально) - если true, то действие будет доступно даже если персонаж мёртв (по умолчанию все действия недоступны, если персонаж мёртв)
  • when_enabled - массив событий, которые произойдут при переходе на эту ноду (в случае root - при открытии челленджа)
  • Конкретно событие { type = "DESTROY_CHALLENGE"} удалит из мира блок или энтити, к которому привязан челлендж

Действия

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

Задаются с помощью кода вида:

[nodes.root.actions.destroy]
label = "Попытаться свалить кучу камней, навалившись всем весом"
is_private = true
requirements = [
    "STAT focus >= 25",
    "STAT stamina >= 50"
]
type = "ROLL_ACTION"
roll_action = "PHYSICAL"
threshold = 15

[[nodes.root.actions.destroy.modifiers]]
label = "Удачно, что у вас в руке кирка"
requirements = [
    "HOLDING_ITEM minecraft:iron_pickaxe"
]
value = 100

[[nodes.root.actions.destroy.success]]
weight = 50
goto = "destroy_success"

[[nodes.root.actions.destroy.success]]
weight = 50
goto = "destroy_brain_damage"

[[nodes.root.actions.destroy.fail]]
goto = "destroy_fail"

Общие для всех действий поля

  • root - идентификатор ноды, на которой будет отображаться это действие
  • destroy - идентификатор действия. Обязан быть уникальным в пределах одной ноды
  • label - текст действия, который будет отображён на кнопочке в окне челленджа, в логе и будет выведен в чате
  • is_private (опционально) - если true, то не будет выводить текст действия всем окружающим игрокам, он будет отображён только в окне
  • requirements - список условий, при которых действие будет видно игроку. Необходимо указывать через запятую (кроме последней строки). Подробнее об условиях ниже
  • Сочетаются между собой в данном списке по принципу логического И, то есть для доступности действия нужно соблюсти все условия
  • Конкретно указанные условия ("STAT focus >= 25" и "STAT stamina >= 50") проверяют, что у фокус персонажа больше или равен 25 И стамина больше или равна 50.
  • type - тип действия, подробнее о них ниже
Типы действий
  • GOTO - простой переход на другую ноду, поля:
  • goto - идентификатор ноды, на которую будет совершён переход
  • ROLL_ACTION - при нажатии будет открыто окошко небоевого броска, при выполнении которого возможны или успех, или провал, поля:
  • roll_action - тип небоевого броска:
    • COMPOSURE - Стойкость и выдержка
    • PHYSICAL - Физическое воздействие
    • CONTROL - Владение телом
    • PRESTIDIGITATION - Ловкость рук и моторика
    • ARTISTISM - Артистизм и творчество
    • ATTENTIVENESS - Внимательность
    • BIOTECH - Биотехнологии
    • ANALYSIS - Анализ
    • ENGINEERING - Мехатехнологии
    • ARCHOTECH - Аркотехнологии
    • MANATECH - Манатехнологии
    • WILLPOWER - Сила воли
    • NATURE - Природа
    • RITUAL - Ритуал
    • MYSTIC - Мистика
  • threshold - порог, который необходимо пробросить (т.е. выбросить число больше или равное) для успеха, в ином случае действие считается провалом
  • modifiers (опционально) - список модификаторов, которые будут наложены на ролл. Подробнее о них ниже
  • success - список возможных исходов при успехе. Подробнее о них ниже
  • fail - список возможных исходов при провале. Подробнее о них ниже
  • ROLL - при нажатии будет совершён скрытый ролл, при выполнении которого возможны или успех, или провал, поля:
  • dice - формула ролла в d-нотации, подробнее о ней здесь
  • threshold - порог, который необходимо пробросить (т.е. выбросить число больше или равное) для успеха, в ином случае действие считается провалом
  • modifiers (опционально) - список модификаторов, которые будут наложены на ролл. Подробнее о них ниже
  • success - список возможных исходов при успехе. Подробнее о них ниже
  • fail - список возможных исходов при провале. Подробнее о них ниже
Модификаторы

Модификаторы - добавляют или вычитают целочисленное значение из роллов (действий типа ROLL_ACTION и ROLL) при соблюдении условий.

Задаются с помощью кода вида:

[[nodes.root.actions.destroy.modifiers]]
label = "Удачно, что у вас в руке кирка"
requirements = [
    "HOLDING_ITEM minecraft:iron_pickaxe"
]
value = 100

  • root - идентификатор ноды, на которой будет отображаться это действие
  • destroy - идентификатор действия, на которое будет накладываться модификтаор. Такое действие обязано иметь тип ROLL_ACTION и ROLL!
  • label - описание модификатора, которое будет отображено игроку в окошке совершения ролла
  • requirements (опционально) - список условий, задаётся так же, как и действиям
  • value - значение, которое будет прибавлено к итоговому роллу. Может быть и отрицательным
Исходы действия

Действие может привести не к одному, а к нескольким исходам при успехе и провале. Рассмотрим пример:

[[nodes.root.actions.destroy.success]]
weight = 50
goto = "destroy_success"

[[nodes.root.actions.destroy.success]]
weight = 50
goto = "destroy_brain_damage"

[[nodes.root.actions.destroy.fail]]
goto = "destroy_fail"
- goto - идентификатор ноды, на которую будет совершён переход

У исходов успеха (конкретно в данном примере, вес можно применять и к провалам тоже) есть поле weight - вес последствия.

  • Чем больше вес исхода, тем больше шанс, что произойдёт именно оно
  • По умолчанию вес равен 1, то есть если в списке из нескольких исходов не указать вес ни одному из них, то произойдёт случайное из них
  • Или если у первого исхода стоит вес 3, а у второго вес не указан, то будет считаться, что у второго исхода вес 1. Таким образом, первый исход произойдет с вероятностью 3\4, а второй - 1\4.
  • Можно указать один исход, в таком случае будет выбран только он.

Условия

Условия - это проверки, которые выполняются для определения доступности тех или иных действий. Недоступные действия скрыты из окна челленджа. - Проверка доступности совершается единожды во время перехода на новую ноду из соображений оптимизации, учитывайте это при написании условий - Условия имеют формат, похожий на дескрипшены для предметов

Рассмотрим несколько примеров условий:

[[nodes.root.actions.destroy.modifiers]]
label = "Удачно, что у вас в руке кирка"
requirements = [
    "HOLDING_ITEM minecraft:iron_pickaxe"
]
value = 100
Данное условие будет соблюдено, если игрок держит в одной из рук железную кирку.


[nodes.root.actions.destroy]
label = "Попытаться свалить кучу камней, навалившись всем весом"
requirements = [
    "STAT focus >= 25",
    "STAT stamina >= 50"
]
type = "ROLL_ACTION"
roll_action = "PHYSICAL"
threshold = 15
...
Данное условие будет соблюдено, если у персонажа фокус >= 25 И стамина >= 50, условия в одном списке сочетаются по принципу логического И.


[nodes.root.actions.deconstruct.requirements]
variant1 = [
    "STAT focus >= 25",
    "STAT stamina >= 50",
    "ATTRIBUTE intelligence >= 10"
]
variant2 = [
    "ATTRIBUTE strength >= 10"
]
Условия могут иметь несколько вариантов, для доступности достаточно, чтобы успешным был один из, т.е. варианты сочетаются по принципу логического ИЛИ. Внутри массива, всё же, должны быть соблюдены все условия.

Таким образом, условие будет успешно если: (Фокус >= 25 И Стамина >= 50 И Интеллект >= 10) ИЛИ (Сила >= 10)

variant1, variant2 не являются обязательным форматом для варианта, там можно писать что угодно. Главное, чтобы был какой-то уникальный текстовый идентификатор варианта условия.

Инверсия

Условия можно инвертировать, если добавить в начало строки !. Т.е. следующее условие

requirements = [
    "!TAGS undead"
]
Будет соблюдено, если у персонажа нет тега undead

Типы условий

Условия отношения

Используют знаки отношения - >, <, =/==, !=/~=, >=, <= для сравнения значения параметра с числом

  • ATTRIBUTE strength > 10 - атрибут силы больше 10
    • Атрибуты: STRENGTH, AGILITY, ENDURANCE, PERCEPTION, INTELLIGENCE, DETERMINATION
  • SKILL vitaism = 0 - навык витаизма равен 0
    • Навыки: HELITICS, REBORIA, SHAN_LIGIA, ELECTRODYNAMICS, VITAISM, PSINERGICS, SEFIROMANTICS, THEURGY, CATALYSTICS, COMBISTICS, DEMIPHYSICS, PHOTOKINETICS, BIOGENETICS, CYBERSYNTHETICS, PNEUMOPRETICS
  • KNOWLEDGE divine > 0.5 - знание божественного больше 0.5
    • Знания: COMMON, DIVINE, RELICS, SHARDS, MEDIA, NATURA, FORBIDDEN, MYTHIC
  • STAT stamina >= 50 - стамина больше или равна 50
    • Если используется ROLL_ACTION, то для него будет наложено ограничение, которое не позволит использовать больше 50 стамины на усилия
    • Статы: STAMINA, FOCUS
  • STAT_NO_ADDITIONAL_COST stamina >= 50 - аналогично условию выше, но позволит вкладывать усилия без ограничений
    • Статы: STAMINA, FOCUS
  • NEED sanity >= 0.5 - менталка больше или равна 50
    • Потребности: SATURATION, SANITY, CLEANLINESS, IMMUNITY, INSPIRATION
    • Примечание: Потребности имеют значения от 0 до 1.25
  • TIME >= 0 - текущее время уже после рассвета. Стоит использовать вместе с условиями И для выбора периода времени, например два условия:
    • TIME >= 0
    • TIME <= 12000
    • Будут выполняться в дневное время
    • Время:
      • 0 - восход
      • 6000 - полдень
      • 12000 - закат
      • 18000 - полночь
  • AGE > 18 - возраст персонажа больше 18
  • SOUL > 100 - очки души персонажа больше 100
  • HEALTH_ABSOLUTE > 50 - абсолютное количество ХП персонажа больше 50
  • HEALTH_PERCENTAGE > 0.5 - у персонажа больше 50% здоровья
  • Принимает значение от 0 до 1
  • RESTORATION_LIMIT SERVICE > 0 - лимит восстановления зданий сервиса больше 0
  • Типы категорий и что они включают:
    • HOUSING - дома
    • SERVICE - баффающие здания, магазины, здания ковенантов (не ковенанты), госпитали, социальные здания, храмы, кухни, посты охраны, клининговая служба (не мусорка)
    • MACHINERY - научное оборудование (чертежный стол, письменный стол), генераторы, фильтры, крафтеры, рефайнеры, рабочие места строителя (не строительные офисы)
    • CRAFTING - научный центр, мастерская, строительный офис
    • RESOURCE - ресурсные здания
    • UTILITY - электростанция, водокачка, мусорка, вышка связи
    • POLITICAL - город, ковенант, дистрикт
    • COMBINER - кухонные комбайнеры, стандалон комбайнеры

Условия наличия

Истинно, если у игрока есть хотя бы один элемент из списка. Список указывается через запятую без пробела (foo,bar,baz)

  • CLUES event_clue_1,event_clue_2,event_clue_3 - есть хотя бы одна зацепка из event_clue_1,event_clue_2,event_clue_3
  • PERMS can_read_thoughts - есть пермишен на чтение мыслей
  • TAGS wooden_creature - есть тег древесного существа
  • TRAITS strong - есть трейт с uid strong
  • TYPE organic - является органиком
  • HAS_FLAG was_looted,failed_roll - есть ли у челленджа один из флагов was_looted,failed_roll
  • NO_FLAGS - у челленджа нет ни одного флага

Условия предметов

Истинно, если у игрока есть один предмет из списка. Список указывается через запятую без пробела (foo,bar,baz). Также поддерживается проверка по флагам предмета (см. ниже)

  • HOLDING_ITEM minecraft:iron_pickaxe,minecraft:diamond_pickaxe - держит в основной руке железную или алмазную кирку
  • HAS_ITEM minecraft:tnt - есть динамит в инвентаре
  • HAS_ITEM_ON_HOTBAR minecraft:flint_and_steel,minecraft:fire_charge - есть зажигалка или огненный заряд на хотбаре
  • HOLDING_ITEM_COUNT minecraft:stone 4 - держит в основной руке 4 или больше камня
  • HAS_ITEM_COUNT minecraft:coal$foo,minecraft:charcoal$foo 8 - имеет в инвентаре суммарно 8 предметов minecraft:coal или minecraft:charcoal с флагом (см. ниже) foo
  • Подойдет любой предмет из списка, т.е. подойдет 8 minecraft:coal$foo
  • HAS_ITEM_COUNT_ON_HOTBAR minecraft:torch - держит на тулбаре суммарно 8 и больше факелов

Флаги предметов При редактировании айтема (CTRL + ПКМ -> Редактировать) ГМы могут задавать айтемам флаги. Потом наличие этих флагов можно проверять в условиях выше. Делается это с помощью указания флагов через $ в условии, например: - HAS_ITEM minecraft:tnt$foo - у игрока в инвентаре есть айтем динамита с флагом foo

Если указано несколько флагов minecraft:tnt$foo$bar$baz, условие пройдет, если у предмета есть хотя бы один. Если есть условие проверки ALL_FLAGS (см. ниже), то условие пройдет, если у предмета есть все указанные флаги.

Флаги проверки У проверок есть свои флаги, они указываются через пробел после основного условия, например: - HOLDING_ITEM course:negotiator_1$foo$bar ANY_RARITY,ALL_FLAGS - игрок держит предмет course:negotiator_1/2/3/4/5 и если у предмета есть оба флага foo и bar

Список флагов: - ANY_RARITY - подойдут предметы любого рарити (проверка идёт по совпадению названия айтемов без последнего символа, т.е. course:negotiator_, но указывать все равно нужно с последним символом, т.е. course:negotiator_1) - ALL_FLAGS - требует наличия всех флагов у айтема, а не только одного из

Остальные условия - IS_RAINING - идёт ли сейчас дождь - IS_DEAD - мёртв ли персонаж


События

События происходят все по очереди при переходе на новую ноду. Задаются у ноды в поле when_enabled:

[nodes.move_success]
text = "Благодаря железной кирке, вы успешно передвинули камни и добыли кое-какие из них."
when_enabled = [
    { type = "DAMAGE_ITEM", item = "minecraft:iron_pickaxe", amount = 5 },
    { type = "COMMAND", cmd = "give @p minecraft:stone 1" },
    { type = "DIRECT_ACTION", cmd = "damage_hp @p 1 KINETIC" },
    { type = "DESTROY_CHALLENGE" }
]

Данный список событий поочередно:

  • Снизит прочность первой найденной в инвентаре персонажа железной кирки на 5
  • Пропишет команду /give <Ник игрока> minecraft:stone 1, то есть выдаст игроку, запустившему челлендж, 1 айтем камня
  • Пропишет команду /directaction damage_hp <Ник игрока> 1 KINETIC, то есть запустит директ-экшен на нанесение 1 единицы кинетического урона персонажу
  • Уничтожит блок челленджа

Типы событий и их поля

  • COMMAND - запускает команду cmd от лица сервера на координатах игрока, поля:
  • cmd - команда, которая будет запущена
  • DIRECT_ACTION - запускает директ-экшен cmd от лица сервера на координатах игрока, поля:
  • cmd - директэкшен с аргументами
  • DAMAGE_ITEM - снижает прочность первого найденного предмета item на amount пунктов, поля:
  • item - предмет, который будет поломан
  • amount - насколько будет поломан предмет
  • flags - флаги проверки через запятую, см. Флаги проверки у условий
  • TAKE_ITEM - забирает у игрока amount предметов item, поля:
  • item - предмет, который будет изъят
  • amount - сколько предметов будет изъято
  • flags - флаги проверки через запятую, см. Флаги проверки у условий
  • DESTROY_CHALLENGE - уничтожает челлендж. Итог варьируется в зависимости от того, к чему челлендж привязан:
  • Если к специальному блоку челленджа (course:challenge), то уничтожается сам блок
  • Если челлендж привязан к блоку, то челлендж отвязывается от него и удаляется. Сам блок остаётся как и был, но больше челлендж через него открыть нельзя
  • Есле челлендж привязан к энтити, то челлендж отвязывается от неё и удаляется. Сама энтити остаётся как и была, но больше челлендж через нее открыть нельзя
  • Есле челлендж привязан к предмету, то челлендж отвязывается от него и удаляется. Сам предмет остаётся как и был, но больше челлендж через него открыть нельзя
  • DAMAGE_ITEM_IN_MAINHAND - снижает прочность предмета в основой руке игрока на amount пунктов, поля:
  • amount - насколько будет поломан предмет
  • TAKE_ITEM_IN_MAINHAND - забирает у игрока amount единиц предмета из основной руки, поля:
  • amount - сколько предметов будет изъято
  • ADD_FLAGS - добавляет челленджу флаги из списка flags, поля:
  • flags - флаги через запятую (например, flag1,flag2,flag3)
  • REMOVE_FLAGS - удаляет флаги челленджа, указанные в списке flags, поля:
  • flags - флаги через запятую (например, flag1,flag2,flag3)
  • CLEAR_FLAGS - удаляет все флаги челленджа
  • RESTORE_OBJECT - восстанавливает здание с проверкой на наличие соответствующих лимитов. Обязательно проверяйте лимиты перед этим ивентом!
  • Только для челленжей, привязанных к блокам экономических объектов!

Форматирование в событиях

  • @p в поле cmd заменяется на ник игрока, который запустил челлендж
  • ~ в командах работает так же, как и в ванильном кубаче и может использоваться для указания позиций в команде. Например, /setblock ~ ~-1 ~ air удалит блок под блоком челленжа / энтитью
  • Рекомендуется для ванильных команд кубача, то что ниже оставьте для директэкшенов
  • @x в поле cmd заменяется на координату x позиции блока, с которого запущен челлендж (или позиции энтити, если челлендж привязан к ней)
  • @y в поле cmd заменяется на координату y позиции блока, с которого запущен челлендж (или позиции энтити, если челлендж привязан к ней)
  • @z в поле cmd заменяется на координату z позиции блока, с которого запущен челлендж (или позиции энтити, если челлендж привязан к ней)

Флаги

Флаги используются для реализации состояния челленджа, то есть для отображения изменений после действий игроков. Например, устройство может быть сломано, а после починки будут разблокированы другие действия с ним. Причем игроку не придётся повторно чинить устройство при повторном открытии челленджа.

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

Для работы с флагами используются условия HAS_FLAG и события ADD_FLAGS и REMOVE_FLAGS, подробнее о них написано выше.

Например, челлендж с мусоркой может иметь два флага: - cleared - мусор расчищен, устанавливается после действия "Покопаться в мусоре" - Действие "Покопаться в мусоре" будет недоступно при наличии этого флага - Действие "Взять что-то блестящее" доступно лишь при наличии этого флага - looted - был ли забран лут, устанавлпивается после действия "Взять что-то блестящее" - Действие "Взять что-то блестящее" будет недоступно при наличии этого флага

Пример челленджа с мусоркой
name = "Мусорный бак"

[nodes.root]
text = "Вы видите перед собой мусорный бак."

# Расчистка мусора
[nodes.root.actions.dig]
label = "Покопаться в мусоре"
requirements = [
    "!HAS_FLAG cleaned"
]
type = "GOTO"
goto = "garbage_cleaned"

[nodes.garbage_cleaned]
text = "Вы выбрасываете из мусорки весь бесполезный хлам."
when_enabled = [
    { type = "ADD_FLAGS", flags = "cleaned" },
    { type = "COMMAND", cmd = "give @p minecraft:dirt 1" }
]

[nodes.garbage_cleaned.actions.return]
type = "GOTO"
label = "Вернуться к разглядыванию мусорки"
goto = "root"
is_private = true

# Лут приколов
[nodes.root.actions.loot]
label = "Взять что-то блестящее"
requirements = [
    "HAS_FLAG cleaned",
    "!HAS_FLAG looted"
]
type = "GOTO"
goto = "garbage_looted"

[nodes.garbage_looted]
text = "Вы достаёте кое-какую добычу из мусорки"
when_enabled = [
    { type = "ADD_FLAGS", flags = "looted" },
    { type = "REMOVE_FLAGS", flags = "cleaned" },
    { type = "COMMAND", cmd = "give @p minecraft:diamond 1" }
]

[nodes.garbage_looted.actions.return]
type = "GOTO"
label = "Вернуться к разглядыванию мусорки"
goto = "root"
is_private = true

# Выбросить мусор
[nodes.root.actions.throw_trash]
label = "Выбросить мусор"
type = "GOTO"
requirements = [
    "HOLDING_ITEM minecraft:dirt"
]
goto = "garbage_filled"

[nodes.garbage_filled]
text = "Вы выбрасываете мусор в мусорку."
when_enabled = [
    { type = "REMOVE_FLAGS", flags = "cleaned,looted" },
    { type = "TAKE_ITEM", item = "minecraft:dirt", amount = 1 }
]

[nodes.garbage_filled.actions.return]
type = "GOTO"
label = "Вернуться к разглядыванию мусорки"
goto = "root"
is_private = true

Запуск челленджа

Для тестирования или ручного запуска челленджа можно использовать команду /challenge <Идентификатор челленджа> [Ник игрока], если ник не указан, челлендж откроется тому, кто написал команду

Но обычно челленджи устанавливаются с помощью блока course:challenge. Поставьте блок, нажмите на него ПКМ и выберите один из челленджей из списка. После этого челлендж будет готов к работе.

Также для создания челленджей можно использовать специальную гмскую тулзу course:challenge_setup_wand. С её помощью можно привязать челлендж к любому блоку или энтити.

А ещё челленжи можно привязывать к предметам. Это делается через вкладку "Челленжи" в окне осмотра предмета (CTRL + ПКМ). Доступно только ГМам в креативе.