Перейти к содержимому
Mineforgian

Advancement JS

Configure more than advancements by KubeJS

245K загрузок21 подписчиковLGPL-2.1-onlyfabricforge

Обновлён 14 мая 2024 г. · опубликован 28 декабря 2023 г.

  • Add new advancement
  • Remove exist advancement
  • Set display location
  • Add new advancement to an exist advancement
  • Modify exist advancement

AdvancementJS

Configure more than advancements by KubeJS

Quick Example(for latest version 2.9.3)

Startup script

// Create a custom trigger
AdvJSEvents.trigger(event => {
    event.create("advjs:get_adv")
        // How many matches you defined, how many tests you should put in
        // In this example, we defined 2 matches
        .match(advancement => advancement.getId() == "minecraft:story/smelt_iron")
        .match(playerName => playerName == "Dev")
})

Server script

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

    // Define trigger
    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 custom trigger
    const destroy_dirt = TRIGGER.blockDestroyed(triggerBuilder => triggerBuilder.setBlock("dirt"));
    // Your custom trigger
    const get_adv = TRIGGER.custom("advjs:get_adv");

    // Create root advancement
    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 custom reward
            rewardsBuilder.addEffect("absorption", 200)
        })
        // Make it repeatable
        .repeatable();

    // Add child for root
    root.addChild("child1", childBuilder => {
        childBuilder
            .display(displayBuilder => {
                displayBuilder.setTitle(Text.red("Holy"))
                displayBuilder.setDescription(Text.red("Hell starts"))
            })
            .criteria(criteriaBuilder => {
                // 'OR' means that if you want to achieve this advancement,
                // you just need one of two triggers matched below
                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)
            })
    });

    // Remove an exist advancement by AdvancementFilter, available filter was writen in doc.
    // you can also remove by id: 'event.remove("minecraft:story/lava_bucket");'
    event.remove({
        mod: "minecraft",
        icon: "minecraft:lava_bucket",
        frame: "task"
    });

    // Modify an exist advancement
    event.get("minecraft:story/smelt_iron")
        // Apply offset to display
        .displayOffset(1, 1, true)
        .modifyDisplay(displayBuilder => displayBuilder.setIcon("diamond_pickaxe"))
        .addChild("child2", childBuilder => {
            childBuilder
                .display(displayBuilder => {
                    displayBuilder.setIcon("recovery_compass")
                    displayBuilder.setTitle('I will come back!')
                    displayBuilder.setDescription(Text.green("Good luck"))
                    // You can also apply display in DisplayBuilder
                    displayBuilder.offset(-1, 0)
                })
                // The trigger could also be created from json
                .criteria(criteriaBuilder => criteriaBuilder.add("go_back_to_home", TRIGGER.fromJson({
                    "trigger": "minecraft:changed_dimension",
                    "conditions": {
                        "from": "minecraft:the_end",
                        "to": "minecraft:overworld"
                    }
                })))
                // Check if parent done, else it will not be done
                .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");
})

// Compat with 'Better Advancements'
AdvJSEvents.betterAdv(event => {
    event.modify("advjs:hell/child1").posX(0).posY(32).hideLines()
})

PlayerEvents.advancement(event => {
    const player = event.getPlayer();
    // The first argument is use for match player predicate, the other two is the matches you defined
    CustomTriggers.of("advjs:get_adv").trigger(player, event.getAdvancement(), player.username)
})

How to reload

Just use /reload

Features

  • Command /advjs for generate builtin examples
  • You can create a custom trigger in startup event AdvJSEvents.trigger.
  • AdvJS custom trigger
    • blockDestroyed: triggers when the player breaks a block.
    • playerTouch: triggers when the player touch an entity.
    • bossEvent: triggers when the play joins a boss fight.
    • increasedKillScore: triggers when the player killed an entity.
  • AdvJS custom reward
    • addEffect: to give effect.
  • AdvJS custom method
    • displayOffset(offsetX: number, offsetY: number, modifyChildren?: boolean)
      • apply offset to advancement display and its children
    • requireParentDone()
      • check if parent done, else it will not be done.
    • requireOthersDone(requires[]: ...ResourceLocation)
      • check if advancements that you put in had done.
    • requireAnyDone(requires[]: ...ResourceLocation)
  • Compat
    • Better Advancements, the new server event: AdvJSEvents.betterAdv

Версии

ВерсияКаналИграЗагрузчикиДатаСкачать
2001forge-2.9.4Релиз1.20.1forge14 мая 2024 г..jar (212 КБ)
2001fabric-2.9.4Релиз1.20.1fabric14 мая 2024 г..jar (221 КБ)
2001forge-2.9.3-hotfixБета1.20.1forge19 марта 2024 г..jar (212 КБ)
2001forge-2.9.2Бета1.20.1forge1 марта 2024 г..jar (211 КБ)
2001fabric-2.9.0Релиз1.20.1fabric17 февраля 2024 г..jar (224 КБ)
2001forge-2.9.0Релиз1.20.1forge17 февраля 2024 г..jar (215 КБ)
2001fabric-2.8.0Релиз1.20.1fabric15 февраля 2024 г..jar (219 КБ)
2001forge-2.8.0Релиз1.20.1forge10 февраля 2024 г..jar (211 КБ)
2001fabric-2.7.0Релиз1.20.1fabric8 февраля 2024 г..jar (214 КБ)
2001forge-2.7.0Релиз1.20.1forge2 февраля 2024 г..jar (205 КБ)
1902fabric-2.6.0Релиз1.19.2fabric31 января 2024 г..jar (179 КБ)
1902forge-2.6.0Релиз1.19.2forge30 января 2024 г..jar (186 КБ)
2001fabric-2.6.0Релиз1.20.1fabric29 января 2024 г..jar (212 КБ)
2001forge-2.6.0Релиз1.20.1forge29 января 2024 г..jar (203 КБ)
2001fabric-2.5.0Релиз1.20.1fabric28 января 2024 г..jar (200 КБ)

Показаны последние 15 из 20 версий. Все версии — на Modrinth.

Ченджлог

2001fabric-2.9.4Релиз1.20.1 · 14 мая 2024 г.

Addition

  • AdvConfigureEventJS.removeAll()
  • AdvConfigureEventJS.enableRecipeAdvancementsRemoval()

Remove

  • { mod: "*" } of AdvancementFilter
2001forge-2.9.3-hotfixБета1.20.1 · 19 марта 2024 г.

Fixed a stupid bug about AdvancementFilter

2001forge-2.9.2Бета1.20.1 · 1 марта 2024 г.

Fix

  • Removed compat with Revelationary(EventHorizon), so that ProbeJS could successfully generate js doc
  • common.properties will create AdvJS configures correctly
2001forge-2.9.0Релиз1.20.1 · 17 февраля 2024 г.

Fix

  • AdvancementFilter will filter icon correctly
  • DamagePredicateBuilder.setType(predicate) -> DamagePredicateBuilder.setTypeByPredicate(predicate)

Addition

  • Client example in /advjs

Compat

  • Better Advancements: the new server event: AdvJSEvents.betterAdv
2001forge-2.8.0Релиз1.20.1 · 10 февраля 2024 г.

Addition

  • AdvLockEventJS.itemUse(toLock: Item, lockBy: ResourceLocation): void
  • AdvLockEventJS.blockInteract(toLock: Block, lockBy: ResourceLocation): void
  • AdvLockEventJS.entityInteract(toLock: EntityType<any>, lockBy: ResourceLocation): void

Binding

  • AdvHelper: for checking server player's advancement isn't done

Upgrades

  • AdvancementFilter: compound type is available
2001forge-2.7.0Релиз1.20.1 · 2 февраля 2024 г.

Addition

  • AdvBuilder.repeatable() and AdvGetter.repeatable()
    • If invoked this method, the advancement will revoke after grant automatically.
  • AdvGetter.changeParent(parentId: ResourceLocation)
  • PlayerPredicateBuilder.checkAdvancementCriterions(advancement: ResourceLocation, criterions: Map<String, Boolean>)

Fix

  • If an advancement has no display, the displayModifier will not throw error, but create a new display
  • /advjs will generate correct code

Rename

  • AdvRemoveFilter -> AdvancementFilter
  • GameType -> GameMode
  • BaseTrigger -> CustomTrigger
1902forge-2.6.0Релиз1.19.2 · 30 января 2024 г.

Updates to latest version

Diff

  • No /advjs command
  • No example script
2001forge-2.6.0Релиз1.20.1 · 29 января 2024 г.

Breaking Changes

Compat

  • Revelationary(Fabric only), the new client event: AdvJSEvents.revelation
  • EventHorizon(Forge only), the new client event: AdvJSEvents.revelation

Reconstruct

  • ServerEvents.advancement -> AdvJSEvents.advancement
  • AdvConfigureEventJS.lock -> AdvJSEvents.lock

Addition

  • The new startup event AdvJSEvents.trigger, for registering custom trigger
    • Use CustomTriggers.of(id: ResourceLocation): BaseTrigger to get your custom trigger for triggers
    • Use Trigger.custom(id: ResourceLocation): BaseTriggerInstance to create a trigger instance for criteria

Полная история изменений — на Modrinth.

Комментарии

Загружаем…