▶️ ЗАБЕРИ СВОИ 8 ПОДАРКОВ 🎁 ПРИ СОЗДАНИИ СВОЕГО МАЙНКРАФТ СЕРВЕРА
Моды/Advancement JS
Advancement JS

Advancement JS

Мод Advancement JS для Майнкрафт расширяет возможности KubeJS, позволяя создавать собственные достижения с уникальными триггерами, наградами и условиями. Полный контроль над прогрессией.

Оцените первым
247.0K
21

Advancement JS - создавай свои достижения в KubeJS

Advancement JS (читается как Эдвансмент ДжейЭс) - это мощное дополнение к KubeJS, которое выводит настройку достижений на новый уровень. Если обычные достижения Майнкрафта кажутся вам слишком простыми, а стандартный функционал KubeJS не даёт нужной гибкости - этот мод решит все проблемы. Он позволяет не просто создавать новые достижения, но и настраивать их логику: уникальные условия получения, кастомные награды (эффекты, рецепты, опыт), а также блокировку предметов и действий до выполнения определённых ачивок. По сути, ты получаешь полноценный инструмент для управления прогрессией игрока.

Быстрый старт с примером

Вот как выглядит создание кастомного достижения с несколькими триггерами. Сначала в startup-скрипте объявляем свой триггер:

// Создаём кастомный триггер
AdvJSEvents.trigger(event => {
    event.create("advjs:get_adv")
        // Сколько совпадений определил - столько проверок и закладывай
        // В примере их две
        .match(advancement => advancement.getId() == "minecraft:story/smelt_iron")
        .match(playerName => playerName == "Dev")
})

А в server-скрипте прописываем само достижение и его логику:

AdvJSEvents.advancement(event => {
    const { PREDICATE, TRIGGER } = event;

    // Определяем триггеры
    const jump5times = TRIGGER.tick(triggerBuilder =>
        triggerBuilder.addStat(Stats.JUMP, Stats.CUSTOM, { min: 5 }));
    const bred_in_nether = TRIGGER.bredAnimals(triggerBuilder => {
        triggerBuilder.setChildByPredicate(PREDICATE.entityFromJson({
            stepping_on: {
                dimension: "the_nether"
            }
        }))
    });
    // Встроенный триггер AdvJS - разрушение блока
    const destroy_dirt = TRIGGER.blockDestroyed(triggerBuilder => triggerBuilder.setBlock("dirt"));
    // Тот самый кастомный триггер
    const get_adv = TRIGGER.custom("advjs:get_adv");

    // Создаём корневое достижение
    const root = event.create("advjs:hell")
        .display(displayBuilder => {
            displayBuilder.setTitle("AdvancementJS")
            displayBuilder.setDescription("Quick example")
            displayBuilder.setIcon("diamond")
        })
        .criteria(criteriaBuilder => criteriaBuilder.add("dirt", destroy_dirt))
        .rewards(rewardsBuilder => {
            rewardsBuilder.setExperience(100)
            // Кастомная награда AdvJS
            rewardsBuilder.addEffect("absorption", 200)
        })
        // Делаем достижение повторяемым
        .repeatable();

    // Добавляем дочернее достижение
    root.addChild("child1", childBuilder => {
        childBuilder
            .display(displayBuilder => {
                displayBuilder.setTitle(Text.red("Holy"))
                displayBuilder.setDescription(Text.red("Hell starts"))
            })
            .criteria(criteriaBuilder => {
                // 'OR' - для выполнения достаточно одного из условий
                criteriaBuilder.setStrategy(RequirementsStrategy.OR)
                criteriaBuilder.add("bred", bred_in_nether)
                criteriaBuilder.add("jump", jump5times)
                criteriaBuilder.add("get_adv", get_adv)
            })
            .rewards(rewardsBuilder => {
                rewardsBuilder.setRecipes("minecraft:lodestone", "minecraft:brewing_stand")
                rewardsBuilder.setExperience(100)
            })
    });

    // Удаляем существующее достижение через фильтр
    // Можно по id: 'event.remove("minecraft:story/lava_bucket");'
    event.remove({
        mod: "minecraft",
        icon: "minecraft:lava_bucket",
        frame: "task"
    });

    // Изменяем существующее достижение
    event.get("minecraft:story/smelt_iron")
        .displayOffset(1, 1, true)
        .modifyDisplay(displayBuilder => displayBuilder.setIcon("diamond_pickaxe"))
        .addChild("child2", childBuilder => {
            childBuilder
                .display(displayBuilder => {
                    displayBuilder.setIcon("recovery_compass")
                    displayBuilder.setTitle('Я вернусь!')
                    displayBuilder.setDescription(Text.green("Удачи"))
                    // Смещение можно задать прямо в DisplayBuilder
                    displayBuilder.offset(-1, 0)
                })
                // Триггер можно создать из JSON
                .criteria(criteriaBuilder => criteriaBuilder.add("go_back_to_home", TRIGGER.fromJson({
                    "trigger": "minecraft:changed_dimension",
                    "conditions": {
                        "from": "minecraft:the_end",
                        "to": "minecraft:overworld"
                    }
                })))
                // Проверка, что родительское достижение выполнено
                .requireParentDone()
        });
})

AdvJSEvents.lock(event => {
    event.result("stone_slab", "minecraft:story/smelt_iron");
    event.itemUse("spyglass", "minecraft:story/smelt_iron");
    event.blockInteract("chest", "minecraft:story/smelt_iron");
    event.entityInteract("villager", "minecraft:story/smelt_iron");
})

// Совместимость с 'Better Advancements'
AdvJSEvents.betterAdv(event => {
    event.modify("advjs:hell/child1").posX(0).posY(32).hideLines()
})

PlayerEvents.advancement(event => {
    const player = event.getPlayer();
    CustomTriggers.of("advjs:get_adv").trigger(player, event.getAdvancement(), player.username)
})

Перезагрузка

Просто введи /reload - и все изменения применятся без перезапуска игры.

Возможности мода

  • Команда /advjs - генерирует встроенные примеры для изучения.

  • Кастомные триггеры - создавай свои условия в событии AdvJSEvents.trigger.

  • Встроенные триггеры AdvJS:

    • blockDestroyed - срабатывает, когда игрок ломает блок.
    • playerTouch - когда игрок касается сущности.
    • bossEvent - когда игрок участвует в битве с боссом.
    • increasedKillScore - когда игрок убивает моба.
  • Кастомные награды AdvJS:

    • addEffect - выдаёт эффект зелья.
  • Кастомные методы AdvJS:

    • displayOffset(offsetX, offsetY, modifyChildren?) - смещает отображение достижения и его потомков.
    • requireParentDone() - проверяет, выполнено ли родительское достижение.
    • requireOthersDone(requires) - проверяет, выполнены ли указанные достижения.
    • requireAnyDone(requires) - проверяет, выполнено ли хотя бы одно из указанных.
  • Совместимость с модом Better Advancements через событие AdvJSEvents.betterAdv - можно менять позиции, скрывать линии и делать интерфейс удобнее.

А зачем это всё?

По факту, Advancement JS превращает обычную систему ачивок в полноценный движок квестов. Хочешь, чтобы игрок не мог использовать верстак, пока не убьёт крипера? Легко. Или чтобы за каждую выплавленную железку выдавался эффект регенерации? Тоже без проблем. Всё это делается прямо из скриптов, без установки громоздких квестовых модов вроде FTB Quests. Если ты уже юзаешь KubeJS - это must-have расширение для управления прогрессией.

Скачай мод Advancement JS для Minecraft и настрой свою игру так, как тебе нужно!

Часто задаваемые вопросы

Совместимость

Minecraft: Java Edition

1.20.x1.19.x1.18.x

Платформы

Поддерживаемые окружения

Клиент и сервер

Зависимости

Ссылки

Детали

Лицензия:
Опубликован:2 года назад
Обновлён:2 года назад
Главная