Челлендж
Челлендж - это испытания наподобие диалогов, поддерживающие действия с различными условиями (уровень навыка игрока, наличие предметов), проверками (с помощью роллов) и событиями при выполнении (команды, директ-экшены, изъятие предметов).
Создание челленджа
Челленджи пишутся в файлах формата .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:
Данное название будет отображаться в заголовке диалогового окна и при отправке сообщений в чат.
Корневая нода (обязательно)
Каждый челлендж должен иметь корневую ноду - эта нода является стартовой и открывается сразу после начала челленджа, т.е. выводит первое сообщение в окне челленджа.
Корневая нода ничем не отличается от любой другой ноды, т.е. может иметь действия, события и т.д.
Имеет идентификатор root:
Ноды (обязательно)
Ноды - это узлы или стадии челленджа, которые отображаются в окне челленджа или в чате всем окружающим игрокам. Ноды могут иметь сколько угодно действий и событий (о них ниже)
Задаётся с помощью кода вида:
[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
...
[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 не являются обязательным форматом для варианта, там можно писать что угодно. Главное, чтобы был какой-то уникальный текстовый идентификатор варианта условия.
Инверсия
Условия можно инвертировать, если добавить в начало строки !. Т.е. следующее условие
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 >= 0TIME <= 12000- Будут выполняться в дневное время
- Время:
- 0 - восход
- 6000 - полдень
- 12000 - закат
- 18000 - полночь
AGE > 18- возраст персонажа больше 18SOUL > 100- очки души персонажа больше 100HEALTH_ABSOLUTE > 50- абсолютное количество ХП персонажа больше 50HEALTH_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_3PERMS can_read_thoughts- есть пермишен на чтение мыслейTAGS wooden_creature- есть тег древесного существаTRAITS strong- есть трейт с uidstrongTYPE organic- является органикомHAS_FLAG was_looted,failed_roll- есть ли у челленджа один из флаговwas_looted,failed_rollNO_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 + ПКМ). Доступно только ГМам в креативе.