VanillaHusbandryAdvancements.java

net.minecraft.data.advancements.packs.VanillaHusbandryAdvancements

信息

  • 全限定名:net.minecraft.data.advancements.packs.VanillaHusbandryAdvancements
  • 类型:public class
  • 包:net.minecraft.data.advancements.packs
  • 源码路径:src/main/java/net/minecraft/data/advancements/packs/VanillaHusbandryAdvancements.java
  • 起始行号:L62
  • 实现:AdvancementSubProvider
  • 职责:

    TODO

字段/常量

  • BREEDABLE_ANIMALS

    • 类型: List<EntityType<?>>
    • 修饰符: public static final
    • 源码定位: L63
    • 说明:

      TODO

  • INDIRECTLY_BREEDABLE_ANIMALS

    • 类型: List<EntityType<?>>
    • 修饰符: public static final
    • 源码定位: L88
    • 说明:

      TODO

  • FISH

    • 类型: Item[]
    • 修饰符: private static final
    • 源码定位: L89
    • 说明:

      TODO

  • FISH_BUCKETS

    • 类型: Item[]
    • 修饰符: private static final
    • 源码定位: L90
    • 说明:

      TODO

  • EDIBLE_ITEMS

    • 类型: Item[]
    • 修饰符: private static final
    • 源码定位: L91
    • 说明:

      TODO

  • WAX_SCRAPING_TOOLS

    • 类型: Item[]
    • 修饰符: public static final
    • 源码定位: L133
    • 说明:

      TODO

  • HOLDER_KEY_COMPARATOR

    • 类型: Comparator<Holder.Reference<?>>
    • 修饰符: private static final
    • 源码定位: L136
    • 说明:

      TODO

内部类/嵌套类型

构造器

方法

下面的方法块按源码顺序生成。

public void generate(HolderLookup.Provider registries, Consumer<AdvancementHolder> output) @ L138

  • 方法名:generate
  • 源码定位:L138
  • 返回类型:void
  • 修饰符:public

参数:

  • registries: HolderLookup.Provider
  • output: Consumer

说明:

TODO

public static AdvancementHolder createBreedAllAnimalsAdvancement(AdvancementHolder parent, Consumer<AdvancementHolder> output, HolderGetter<EntityType<?>> entityTypes, Stream<EntityType<?>> breedable, Stream<EntityType<?>> indirectlyBreedable) @ L681

  • 方法名:createBreedAllAnimalsAdvancement
  • 源码定位:L681
  • 返回类型:AdvancementHolder
  • 修饰符:public static

参数:

  • parent: AdvancementHolder
  • output: Consumer
  • entityTypes: HolderGetter<EntityType<?>>
  • breedable: Stream<EntityType<?>>
  • indirectlyBreedable: Stream<EntityType<?>>

说明:

TODO

private static Advancement.Builder addLeashedFrogVariants(HolderGetter<EntityType<?>> entityTypes, HolderGetter<Item> items, HolderLookup<FrogVariant> frogVariants, Advancement.Builder advancement) @ L704

  • 方法名:addLeashedFrogVariants
  • 源码定位:L704
  • 返回类型:Advancement.Builder
  • 修饰符:private static

参数:

  • entityTypes: HolderGetter<EntityType<?>>
  • items: HolderGetter
  • frogVariants: HolderLookup
  • advancement: Advancement.Builder

说明:

TODO

private static <T> Stream<Holder.Reference<T>> sortedVariants(HolderLookup<T> variants) @ L730

  • 方法名:sortedVariants
  • 源码定位:L730
  • 返回类型: Stream<Holder.Reference>
  • 修饰符:private static

参数:

  • variants: HolderLookup

说明:

TODO

private static Advancement.Builder addFood(Advancement.Builder advancement, HolderGetter<Item> items) @ L734

  • 方法名:addFood
  • 源码定位:L734
  • 返回类型:Advancement.Builder
  • 修饰符:private static

参数:

  • advancement: Advancement.Builder
  • items: HolderGetter

说明:

TODO

private static Advancement.Builder addBreedable(Advancement.Builder advancement, Stream<EntityType<?>> breedable, HolderGetter<EntityType<?>> entityTypes, Stream<EntityType<?>> indirectlyBreedable) @ L742

  • 方法名:addBreedable
  • 源码定位:L742
  • 返回类型:Advancement.Builder
  • 修饰符:private static

参数:

  • advancement: Advancement.Builder
  • breedable: Stream<EntityType<?>>
  • entityTypes: HolderGetter<EntityType<?>>
  • indirectlyBreedable: Stream<EntityType<?>>

说明:

TODO

private static Advancement.Builder addFishBuckets(Advancement.Builder advancement, HolderGetter<Item> items) @ L764

  • 方法名:addFishBuckets
  • 源码定位:L764
  • 返回类型:Advancement.Builder
  • 修饰符:private static

参数:

  • advancement: Advancement.Builder
  • items: HolderGetter

说明:

TODO

private static Advancement.Builder addFish(Advancement.Builder advancement, HolderGetter<Item> items) @ L775

  • 方法名:addFish
  • 源码定位:L775
  • 返回类型:Advancement.Builder
  • 修饰符:private static

参数:

  • advancement: Advancement.Builder
  • items: HolderGetter

说明:

TODO

private static Advancement.Builder addCatVariants(Advancement.Builder advancement, HolderLookup<CatVariant> catVariants) @ L788

  • 方法名:addCatVariants
  • 源码定位:L788
  • 返回类型:Advancement.Builder
  • 修饰符:private static

参数:

  • advancement: Advancement.Builder
  • catVariants: HolderLookup

说明:

TODO

private static Advancement.Builder addTamedWolfVariants(Advancement.Builder advancement, HolderLookup<WolfVariant> wolfVariants) @ L804

  • 方法名:addTamedWolfVariants
  • 源码定位:L804
  • 返回类型:Advancement.Builder
  • 修饰符:private static

参数:

  • advancement: Advancement.Builder
  • wolfVariants: HolderLookup

说明:

TODO

代码

public class VanillaHusbandryAdvancements implements AdvancementSubProvider {
    public static final List<EntityType<?>> BREEDABLE_ANIMALS = List.of(
        EntityType.HORSE,
        EntityType.DONKEY,
        EntityType.MULE,
        EntityType.SHEEP,
        EntityType.COW,
        EntityType.MOOSHROOM,
        EntityType.PIG,
        EntityType.CHICKEN,
        EntityType.WOLF,
        EntityType.OCELOT,
        EntityType.RABBIT,
        EntityType.LLAMA,
        EntityType.CAT,
        EntityType.PANDA,
        EntityType.FOX,
        EntityType.BEE,
        EntityType.HOGLIN,
        EntityType.STRIDER,
        EntityType.GOAT,
        EntityType.AXOLOTL,
        EntityType.CAMEL,
        EntityType.ARMADILLO,
        EntityType.NAUTILUS
    );
    public static final List<EntityType<?>> INDIRECTLY_BREEDABLE_ANIMALS = List.of(EntityType.TURTLE, EntityType.FROG, EntityType.SNIFFER);
    private static final Item[] FISH = new Item[]{Items.COD, Items.TROPICAL_FISH, Items.PUFFERFISH, Items.SALMON};
    private static final Item[] FISH_BUCKETS = new Item[]{Items.COD_BUCKET, Items.TROPICAL_FISH_BUCKET, Items.PUFFERFISH_BUCKET, Items.SALMON_BUCKET};
    private static final Item[] EDIBLE_ITEMS = new Item[]{
        Items.APPLE,
        Items.MUSHROOM_STEW,
        Items.BREAD,
        Items.PORKCHOP,
        Items.COOKED_PORKCHOP,
        Items.GOLDEN_APPLE,
        Items.ENCHANTED_GOLDEN_APPLE,
        Items.COD,
        Items.SALMON,
        Items.TROPICAL_FISH,
        Items.PUFFERFISH,
        Items.COOKED_COD,
        Items.COOKED_SALMON,
        Items.COOKIE,
        Items.MELON_SLICE,
        Items.BEEF,
        Items.COOKED_BEEF,
        Items.CHICKEN,
        Items.COOKED_CHICKEN,
        Items.ROTTEN_FLESH,
        Items.SPIDER_EYE,
        Items.CARROT,
        Items.POTATO,
        Items.BAKED_POTATO,
        Items.POISONOUS_POTATO,
        Items.GOLDEN_CARROT,
        Items.PUMPKIN_PIE,
        Items.RABBIT,
        Items.COOKED_RABBIT,
        Items.RABBIT_STEW,
        Items.MUTTON,
        Items.COOKED_MUTTON,
        Items.CHORUS_FRUIT,
        Items.BEETROOT,
        Items.BEETROOT_SOUP,
        Items.DRIED_KELP,
        Items.SUSPICIOUS_STEW,
        Items.SWEET_BERRIES,
        Items.HONEY_BOTTLE,
        Items.GLOW_BERRIES
    };
    public static final Item[] WAX_SCRAPING_TOOLS = new Item[]{
        Items.WOODEN_AXE, Items.GOLDEN_AXE, Items.STONE_AXE, Items.COPPER_AXE, Items.IRON_AXE, Items.DIAMOND_AXE, Items.NETHERITE_AXE
    };
    private static final Comparator<Holder.Reference<?>> HOLDER_KEY_COMPARATOR = Comparator.comparing(e -> e.key().identifier());
 
    @Override
    public void generate(HolderLookup.Provider registries, Consumer<AdvancementHolder> output) {
        HolderGetter<EntityType<?>> entityTypes = registries.lookupOrThrow(Registries.ENTITY_TYPE);
        HolderGetter<Item> items = registries.lookupOrThrow(Registries.ITEM);
        HolderGetter<Block> blocks = registries.lookupOrThrow(Registries.BLOCK);
        HolderLookup<FrogVariant> frogVariants = registries.lookupOrThrow(Registries.FROG_VARIANT);
        HolderLookup<CatVariant> catVariants = registries.lookupOrThrow(Registries.CAT_VARIANT);
        HolderLookup<WolfVariant> wolfVariants = registries.lookupOrThrow(Registries.WOLF_VARIANT);
        HolderLookup.RegistryLookup<Enchantment> enchantments = registries.lookupOrThrow(Registries.ENCHANTMENT);
        AdvancementHolder root = Advancement.Builder.advancement()
            .display(
                Blocks.HAY_BLOCK,
                Component.translatable("advancements.husbandry.root.title"),
                Component.translatable("advancements.husbandry.root.description"),
                Identifier.withDefaultNamespace("gui/advancements/backgrounds/husbandry"),
                AdvancementType.TASK,
                false,
                false,
                false
            )
            .addCriterion("consumed_item", ConsumeItemTrigger.TriggerInstance.usedItem())
            .save(output, "husbandry/root");
        AdvancementHolder plantSeed = Advancement.Builder.advancement()
            .parent(root)
            .display(
                Items.WHEAT,
                Component.translatable("advancements.husbandry.plant_seed.title"),
                Component.translatable("advancements.husbandry.plant_seed.description"),
                null,
                AdvancementType.TASK,
                true,
                true,
                false
            )
            .requirements(AdvancementRequirements.Strategy.OR)
            .addCriterion("wheat", ItemUsedOnLocationTrigger.TriggerInstance.placedBlock(Blocks.WHEAT))
            .addCriterion("pumpkin_stem", ItemUsedOnLocationTrigger.TriggerInstance.placedBlock(Blocks.PUMPKIN_STEM))
            .addCriterion("melon_stem", ItemUsedOnLocationTrigger.TriggerInstance.placedBlock(Blocks.MELON_STEM))
            .addCriterion("beetroots", ItemUsedOnLocationTrigger.TriggerInstance.placedBlock(Blocks.BEETROOTS))
            .addCriterion("nether_wart", ItemUsedOnLocationTrigger.TriggerInstance.placedBlock(Blocks.NETHER_WART))
            .addCriterion("torchflower", ItemUsedOnLocationTrigger.TriggerInstance.placedBlock(Blocks.TORCHFLOWER_CROP))
            .addCriterion("pitcher_pod", ItemUsedOnLocationTrigger.TriggerInstance.placedBlock(Blocks.PITCHER_CROP))
            .save(output, "husbandry/plant_seed");
        AdvancementHolder breedAnAnimalAdvancement = Advancement.Builder.advancement()
            .parent(root)
            .display(
                Items.WHEAT,
                Component.translatable("advancements.husbandry.breed_an_animal.title"),
                Component.translatable("advancements.husbandry.breed_an_animal.description"),
                null,
                AdvancementType.TASK,
                true,
                true,
                false
            )
            .requirements(AdvancementRequirements.Strategy.OR)
            .addCriterion("bred", BredAnimalsTrigger.TriggerInstance.bredAnimals())
            .save(output, "husbandry/breed_an_animal");
        createBreedAllAnimalsAdvancement(breedAnAnimalAdvancement, output, entityTypes, BREEDABLE_ANIMALS.stream(), INDIRECTLY_BREEDABLE_ANIMALS.stream());
        addFood(Advancement.Builder.advancement(), items)
            .parent(plantSeed)
            .display(
                Items.APPLE,
                Component.translatable("advancements.husbandry.balanced_diet.title"),
                Component.translatable("advancements.husbandry.balanced_diet.description"),
                null,
                AdvancementType.CHALLENGE,
                true,
                true,
                false
            )
            .rewards(AdvancementRewards.Builder.experience(100))
            .save(output, "husbandry/balanced_diet");
        Advancement.Builder.advancement()
            .parent(plantSeed)
            .display(
                Items.NETHERITE_HOE,
                Component.translatable("advancements.husbandry.netherite_hoe.title"),
                Component.translatable("advancements.husbandry.netherite_hoe.description"),
                null,
                AdvancementType.CHALLENGE,
                true,
                true,
                false
            )
            .rewards(AdvancementRewards.Builder.experience(100))
            .addCriterion("netherite_hoe", InventoryChangeTrigger.TriggerInstance.hasItems(Items.NETHERITE_HOE))
            .save(output, "husbandry/obtain_netherite_hoe");
        AdvancementHolder tameAnAnimal = Advancement.Builder.advancement()
            .parent(root)
            .display(
                Items.LEAD,
                Component.translatable("advancements.husbandry.tame_an_animal.title"),
                Component.translatable("advancements.husbandry.tame_an_animal.description"),
                null,
                AdvancementType.TASK,
                true,
                true,
                false
            )
            .addCriterion("tamed_animal", TameAnimalTrigger.TriggerInstance.tamedAnimal())
            .save(output, "husbandry/tame_an_animal");
        AdvancementHolder fishyBusiness = addFish(Advancement.Builder.advancement(), items)
            .parent(root)
            .requirements(AdvancementRequirements.Strategy.OR)
            .display(
                Items.FISHING_ROD,
                Component.translatable("advancements.husbandry.fishy_business.title"),
                Component.translatable("advancements.husbandry.fishy_business.description"),
                null,
                AdvancementType.TASK,
                true,
                true,
                false
            )
            .save(output, "husbandry/fishy_business");
        AdvancementHolder tacticalFishing = addFishBuckets(Advancement.Builder.advancement(), items)
            .parent(fishyBusiness)
            .requirements(AdvancementRequirements.Strategy.OR)
            .display(
                Items.PUFFERFISH_BUCKET,
                Component.translatable("advancements.husbandry.tactical_fishing.title"),
                Component.translatable("advancements.husbandry.tactical_fishing.description"),
                null,
                AdvancementType.TASK,
                true,
                true,
                false
            )
            .save(output, "husbandry/tactical_fishing");
        AdvancementHolder theCutestPredetor = Advancement.Builder.advancement()
            .parent(tacticalFishing)
            .requirements(AdvancementRequirements.Strategy.OR)
            .addCriterion(
                BuiltInRegistries.ITEM.getKey(Items.AXOLOTL_BUCKET).getPath(),
                FilledBucketTrigger.TriggerInstance.filledBucket(ItemPredicate.Builder.item().of(items, Items.AXOLOTL_BUCKET))
            )
            .display(
                Items.AXOLOTL_BUCKET,
                Component.translatable("advancements.husbandry.axolotl_in_a_bucket.title"),
                Component.translatable("advancements.husbandry.axolotl_in_a_bucket.description"),
                null,
                AdvancementType.TASK,
                true,
                true,
                false
            )
            .save(output, "husbandry/axolotl_in_a_bucket");
        Advancement.Builder.advancement()
            .parent(theCutestPredetor)
            .addCriterion(
                "kill_axolotl_target",
                EffectsChangedTrigger.TriggerInstance.gotEffectsFrom(EntityPredicate.Builder.entity().of(entityTypes, EntityType.AXOLOTL))
            )
            .display(
                Items.TROPICAL_FISH_BUCKET,
                Component.translatable("advancements.husbandry.kill_axolotl_target.title"),
                Component.translatable("advancements.husbandry.kill_axolotl_target.description"),
                null,
                AdvancementType.TASK,
                true,
                true,
                false
            )
            .save(output, "husbandry/kill_axolotl_target");
        addCatVariants(Advancement.Builder.advancement(), catVariants)
            .parent(tameAnAnimal)
            .display(
                Items.COD,
                Component.translatable("advancements.husbandry.complete_catalogue.title"),
                Component.translatable("advancements.husbandry.complete_catalogue.description"),
                null,
                AdvancementType.CHALLENGE,
                true,
                true,
                false
            )
            .rewards(AdvancementRewards.Builder.experience(50))
            .save(output, "husbandry/complete_catalogue");
        addTamedWolfVariants(Advancement.Builder.advancement(), wolfVariants)
            .parent(tameAnAnimal)
            .display(
                Items.BONE,
                Component.translatable("advancements.husbandry.whole_pack.title"),
                Component.translatable("advancements.husbandry.whole_pack.description"),
                null,
                AdvancementType.CHALLENGE,
                true,
                true,
                false
            )
            .rewards(AdvancementRewards.Builder.experience(50))
            .save(output, "husbandry/whole_pack");
        AdvancementHolder safelyHarvestHoney = Advancement.Builder.advancement()
            .parent(root)
            .addCriterion(
                "safely_harvest_honey",
                ItemUsedOnLocationTrigger.TriggerInstance.itemUsedOnBlock(
                    LocationPredicate.Builder.location().setBlock(BlockPredicate.Builder.block().of(blocks, BlockTags.BEEHIVES)).setSmokey(true),
                    ItemPredicate.Builder.item().of(items, Items.GLASS_BOTTLE)
                )
            )
            .display(
                Items.HONEY_BOTTLE,
                Component.translatable("advancements.husbandry.safely_harvest_honey.title"),
                Component.translatable("advancements.husbandry.safely_harvest_honey.description"),
                null,
                AdvancementType.TASK,
                true,
                true,
                false
            )
            .save(output, "husbandry/safely_harvest_honey");
        AdvancementHolder waxOn = Advancement.Builder.advancement()
            .parent(safelyHarvestHoney)
            .display(
                Items.HONEYCOMB,
                Component.translatable("advancements.husbandry.wax_on.title"),
                Component.translatable("advancements.husbandry.wax_on.description"),
                null,
                AdvancementType.TASK,
                true,
                true,
                false
            )
            .addCriterion(
                "wax_on",
                ItemUsedOnLocationTrigger.TriggerInstance.itemUsedOnBlock(
                    LocationPredicate.Builder.location().setBlock(BlockPredicate.Builder.block().of(blocks, HoneycombItem.WAXABLES.get().keySet())),
                    ItemPredicate.Builder.item().of(items, Items.HONEYCOMB)
                )
            )
            .save(output, "husbandry/wax_on");
        Advancement.Builder.advancement()
            .parent(waxOn)
            .display(
                Items.STONE_AXE,
                Component.translatable("advancements.husbandry.wax_off.title"),
                Component.translatable("advancements.husbandry.wax_off.description"),
                null,
                AdvancementType.TASK,
                true,
                true,
                false
            )
            .addCriterion(
                "wax_off",
                ItemUsedOnLocationTrigger.TriggerInstance.itemUsedOnBlock(
                    LocationPredicate.Builder.location().setBlock(BlockPredicate.Builder.block().of(blocks, HoneycombItem.WAX_OFF_BY_BLOCK.get().keySet())),
                    ItemPredicate.Builder.item().of(items, WAX_SCRAPING_TOOLS)
                )
            )
            .save(output, "husbandry/wax_off");
        AdvancementHolder tadpoleInABucket = Advancement.Builder.advancement()
            .parent(root)
            .addCriterion(
                BuiltInRegistries.ITEM.getKey(Items.TADPOLE_BUCKET).getPath(),
                FilledBucketTrigger.TriggerInstance.filledBucket(ItemPredicate.Builder.item().of(items, Items.TADPOLE_BUCKET))
            )
            .display(
                Items.TADPOLE_BUCKET,
                Component.translatable("advancements.husbandry.tadpole_in_a_bucket.title"),
                Component.translatable("advancements.husbandry.tadpole_in_a_bucket.description"),
                null,
                AdvancementType.TASK,
                true,
                true,
                false
            )
            .save(output, "husbandry/tadpole_in_a_bucket");
        AdvancementHolder allFrogsOnALeash = addLeashedFrogVariants(entityTypes, items, frogVariants, Advancement.Builder.advancement())
            .parent(tadpoleInABucket)
            .display(
                Items.LEAD,
                Component.translatable("advancements.husbandry.leash_all_frog_variants.title"),
                Component.translatable("advancements.husbandry.leash_all_frog_variants.description"),
                null,
                AdvancementType.TASK,
                true,
                true,
                false
            )
            .save(output, "husbandry/leash_all_frog_variants");
        Advancement.Builder.advancement()
            .parent(allFrogsOnALeash)
            .display(
                Items.VERDANT_FROGLIGHT,
                Component.translatable("advancements.husbandry.froglights.title"),
                Component.translatable("advancements.husbandry.froglights.description"),
                null,
                AdvancementType.CHALLENGE,
                true,
                true,
                false
            )
            .addCriterion(
                "froglights", InventoryChangeTrigger.TriggerInstance.hasItems(Items.OCHRE_FROGLIGHT, Items.PEARLESCENT_FROGLIGHT, Items.VERDANT_FROGLIGHT)
            )
            .save(output, "husbandry/froglights");
        Advancement.Builder.advancement()
            .parent(root)
            .addCriterion(
                "silk_touch_nest",
                BeeNestDestroyedTrigger.TriggerInstance.destroyedBeeNest(
                    Blocks.BEE_NEST,
                    ItemPredicate.Builder.item()
                        .withComponents(
                            DataComponentMatchers.Builder.components()
                                .partial(
                                    DataComponentPredicates.ENCHANTMENTS,
                                    EnchantmentsPredicate.enchantments(
                                        List.of(new EnchantmentPredicate(enchantments.getOrThrow(Enchantments.SILK_TOUCH), MinMaxBounds.Ints.atLeast(1)))
                                    )
                                )
                                .build()
                        ),
                    MinMaxBounds.Ints.exactly(3)
                )
            )
            .display(
                Blocks.BEE_NEST,
                Component.translatable("advancements.husbandry.silk_touch_nest.title"),
                Component.translatable("advancements.husbandry.silk_touch_nest.description"),
                null,
                AdvancementType.TASK,
                true,
                true,
                false
            )
            .save(output, "husbandry/silk_touch_nest");
        Advancement.Builder.advancement()
            .parent(root)
            .display(
                Items.OAK_BOAT,
                Component.translatable("advancements.husbandry.ride_a_boat_with_a_goat.title"),
                Component.translatable("advancements.husbandry.ride_a_boat_with_a_goat.description"),
                null,
                AdvancementType.TASK,
                true,
                true,
                false
            )
            .addCriterion(
                "ride_a_boat_with_a_goat",
                StartRidingTrigger.TriggerInstance.playerStartsRiding(
                    EntityPredicate.Builder.entity()
                        .vehicle(
                            EntityPredicate.Builder.entity()
                                .of(entityTypes, EntityTypeTags.BOAT)
                                .passenger(EntityPredicate.Builder.entity().of(entityTypes, EntityType.GOAT))
                        )
                )
            )
            .save(output, "husbandry/ride_a_boat_with_a_goat");
        Advancement.Builder.advancement()
            .parent(root)
            .display(
                Items.GLOW_INK_SAC,
                Component.translatable("advancements.husbandry.make_a_sign_glow.title"),
                Component.translatable("advancements.husbandry.make_a_sign_glow.description"),
                null,
                AdvancementType.TASK,
                true,
                true,
                false
            )
            .addCriterion(
                "make_a_sign_glow",
                ItemUsedOnLocationTrigger.TriggerInstance.itemUsedOnBlock(
                    LocationPredicate.Builder.location().setBlock(BlockPredicate.Builder.block().of(blocks, BlockTags.ALL_SIGNS)),
                    ItemPredicate.Builder.item().of(items, Items.GLOW_INK_SAC)
                )
            )
            .save(output, "husbandry/make_a_sign_glow");
        AdvancementHolder itemDeliveredToPlayer = Advancement.Builder.advancement()
            .parent(root)
            .display(
                Items.COOKIE,
                Component.translatable("advancements.husbandry.allay_deliver_item_to_player.title"),
                Component.translatable("advancements.husbandry.allay_deliver_item_to_player.description"),
                null,
                AdvancementType.TASK,
                true,
                true,
                true
            )
            .addCriterion(
                "allay_deliver_item_to_player",
                PickedUpItemTrigger.TriggerInstance.thrownItemPickedUpByPlayer(
                    Optional.empty(), Optional.empty(), Optional.of(EntityPredicate.wrap(EntityPredicate.Builder.entity().of(entityTypes, EntityType.ALLAY)))
                )
            )
            .save(output, "husbandry/allay_deliver_item_to_player");
        Advancement.Builder.advancement()
            .parent(itemDeliveredToPlayer)
            .display(
                Items.NOTE_BLOCK,
                Component.translatable("advancements.husbandry.allay_deliver_cake_to_note_block.title"),
                Component.translatable("advancements.husbandry.allay_deliver_cake_to_note_block.description"),
                null,
                AdvancementType.TASK,
                true,
                true,
                true
            )
            .addCriterion(
                "allay_deliver_cake_to_note_block",
                ItemUsedOnLocationTrigger.TriggerInstance.allayDropItemOnBlock(
                    LocationPredicate.Builder.location().setBlock(BlockPredicate.Builder.block().of(blocks, Blocks.NOTE_BLOCK)),
                    ItemPredicate.Builder.item().of(items, Items.CAKE)
                )
            )
            .save(output, "husbandry/allay_deliver_cake_to_note_block");
        AdvancementHolder obtainSnifferEgg = Advancement.Builder.advancement()
            .parent(root)
            .display(
                Items.SNIFFER_EGG,
                Component.translatable("advancements.husbandry.obtain_sniffer_egg.title"),
                Component.translatable("advancements.husbandry.obtain_sniffer_egg.description"),
                null,
                AdvancementType.TASK,
                true,
                true,
                true
            )
            .addCriterion("obtain_sniffer_egg", InventoryChangeTrigger.TriggerInstance.hasItems(Items.SNIFFER_EGG))
            .save(output, "husbandry/obtain_sniffer_egg");
        AdvancementHolder feedSnifflet = Advancement.Builder.advancement()
            .parent(obtainSnifferEgg)
            .display(
                Items.TORCHFLOWER_SEEDS,
                Component.translatable("advancements.husbandry.feed_snifflet.title"),
                Component.translatable("advancements.husbandry.feed_snifflet.description"),
                null,
                AdvancementType.TASK,
                true,
                true,
                true
            )
            .addCriterion(
                "feed_snifflet",
                PlayerInteractTrigger.TriggerInstance.itemUsedOnEntity(
                    ItemPredicate.Builder.item().of(items, ItemTags.SNIFFER_FOOD),
                    Optional.of(
                        EntityPredicate.wrap(
                            EntityPredicate.Builder.entity().of(entityTypes, EntityType.SNIFFER).flags(EntityFlagsPredicate.Builder.flags().setIsBaby(true))
                        )
                    )
                )
            )
            .save(output, "husbandry/feed_snifflet");
        Advancement.Builder.advancement()
            .parent(feedSnifflet)
            .display(
                Items.PITCHER_POD,
                Component.translatable("advancements.husbandry.plant_any_sniffer_seed.title"),
                Component.translatable("advancements.husbandry.plant_any_sniffer_seed.description"),
                null,
                AdvancementType.TASK,
                true,
                true,
                true
            )
            .requirements(AdvancementRequirements.Strategy.OR)
            .addCriterion("torchflower", ItemUsedOnLocationTrigger.TriggerInstance.placedBlock(Blocks.TORCHFLOWER_CROP))
            .addCriterion("pitcher_pod", ItemUsedOnLocationTrigger.TriggerInstance.placedBlock(Blocks.PITCHER_CROP))
            .save(output, "husbandry/plant_any_sniffer_seed");
        Advancement.Builder.advancement()
            .parent(tameAnAnimal)
            .display(
                Items.SHEARS,
                Component.translatable("advancements.husbandry.remove_wolf_armor.title"),
                Component.translatable("advancements.husbandry.remove_wolf_armor.description"),
                null,
                AdvancementType.TASK,
                true,
                true,
                false
            )
            .addCriterion(
                "remove_wolf_armor",
                PlayerInteractTrigger.TriggerInstance.equipmentSheared(
                    ItemPredicate.Builder.item().of(items, Items.WOLF_ARMOR),
                    Optional.of(EntityPredicate.wrap(EntityPredicate.Builder.entity().of(entityTypes, EntityType.WOLF)))
                )
            )
            .save(output, "husbandry/remove_wolf_armor");
        Advancement.Builder.advancement()
            .parent(tameAnAnimal)
            .display(
                Items.WOLF_ARMOR,
                Component.translatable("advancements.husbandry.repair_wolf_armor.title"),
                Component.translatable("advancements.husbandry.repair_wolf_armor.description"),
                null,
                AdvancementType.TASK,
                true,
                true,
                false
            )
            .addCriterion(
                "repair_wolf_armor",
                PlayerInteractTrigger.TriggerInstance.itemUsedOnEntity(
                    ItemPredicate.Builder.item().of(items, Items.ARMADILLO_SCUTE),
                    Optional.of(
                        EntityPredicate.wrap(
                            EntityPredicate.Builder.entity()
                                .of(entityTypes, EntityType.WOLF)
                                .equipment(
                                    EntityEquipmentPredicate.Builder.equipment()
                                        .body(
                                            ItemPredicate.Builder.item()
                                                .of(items, Items.WOLF_ARMOR)
                                                .withComponents(
                                                    DataComponentMatchers.Builder.components()
                                                        .exact(DataComponentExactPredicate.expect(DataComponents.DAMAGE, 0))
                                                        .build()
                                                )
                                        )
                                )
                        )
                    )
                )
            )
            .save(output, "husbandry/repair_wolf_armor");
        Advancement.Builder.advancement()
            .parent(root)
            .display(
                Items.DRIED_GHAST,
                Component.translatable("advancements.husbandry.place_dried_ghast_in_water.title"),
                Component.translatable("advancements.husbandry.place_dried_ghast_in_water.description"),
                null,
                AdvancementType.TASK,
                true,
                true,
                false
            )
            .addCriterion(
                "place_dried_ghast_in_water",
                ItemUsedOnLocationTrigger.TriggerInstance.placedBlockWithProperties(Blocks.DRIED_GHAST, BlockStateProperties.WATERLOGGED, true)
            )
            .save(output, "husbandry/place_dried_ghast_in_water");
    }
 
    public static AdvancementHolder createBreedAllAnimalsAdvancement(
        AdvancementHolder parent,
        Consumer<AdvancementHolder> output,
        HolderGetter<EntityType<?>> entityTypes,
        Stream<EntityType<?>> breedable,
        Stream<EntityType<?>> indirectlyBreedable
    ) {
        return addBreedable(Advancement.Builder.advancement(), breedable, entityTypes, indirectlyBreedable)
            .parent(parent)
            .display(
                Items.GOLDEN_CARROT,
                Component.translatable("advancements.husbandry.breed_all_animals.title"),
                Component.translatable("advancements.husbandry.breed_all_animals.description"),
                null,
                AdvancementType.CHALLENGE,
                true,
                true,
                false
            )
            .rewards(AdvancementRewards.Builder.experience(100))
            .save(output, "husbandry/bred_all_animals");
    }
 
    private static Advancement.Builder addLeashedFrogVariants(
        HolderGetter<EntityType<?>> entityTypes, HolderGetter<Item> items, HolderLookup<FrogVariant> frogVariants, Advancement.Builder advancement
    ) {
        sortedVariants(frogVariants)
            .forEach(
                frogVariant -> advancement.addCriterion(
                    frogVariant.key().identifier().toString(),
                    PlayerInteractTrigger.TriggerInstance.itemUsedOnEntity(
                        ItemPredicate.Builder.item().of(items, Items.LEAD),
                        Optional.of(
                            EntityPredicate.wrap(
                                EntityPredicate.Builder.entity()
                                    .of(entityTypes, EntityType.FROG)
                                    .components(
                                        DataComponentMatchers.Builder.components()
                                            .exact(DataComponentExactPredicate.expect(DataComponents.FROG_VARIANT, frogVariant))
                                            .build()
                                    )
                            )
                        )
                    )
                )
            );
        return advancement;
    }
 
    private static <T> Stream<Holder.Reference<T>> sortedVariants(HolderLookup<T> variants) {
        return variants.listElements().sorted(HOLDER_KEY_COMPARATOR);
    }
 
    private static Advancement.Builder addFood(Advancement.Builder advancement, HolderGetter<Item> items) {
        for (Item food : EDIBLE_ITEMS) {
            advancement.addCriterion(BuiltInRegistries.ITEM.getKey(food).getPath(), ConsumeItemTrigger.TriggerInstance.usedItem(items, food));
        }
 
        return advancement;
    }
 
    private static Advancement.Builder addBreedable(
        Advancement.Builder advancement, Stream<EntityType<?>> breedable, HolderGetter<EntityType<?>> entityTypes, Stream<EntityType<?>> indirectlyBreedable
    ) {
        breedable.forEach(
            animal -> advancement.addCriterion(
                EntityType.getKey((EntityType<?>)animal).toString(),
                BredAnimalsTrigger.TriggerInstance.bredAnimals(EntityPredicate.Builder.entity().of(entityTypes, (EntityType<?>)animal))
            )
        );
        indirectlyBreedable.forEach(
            animal -> advancement.addCriterion(
                EntityType.getKey((EntityType<?>)animal).toString(),
                BredAnimalsTrigger.TriggerInstance.bredAnimals(
                    Optional.of(EntityPredicate.Builder.entity().of(entityTypes, (EntityType<?>)animal).build()),
                    Optional.of(EntityPredicate.Builder.entity().of(entityTypes, (EntityType<?>)animal).build()),
                    Optional.empty()
                )
            )
        );
        return advancement;
    }
 
    private static Advancement.Builder addFishBuckets(Advancement.Builder advancement, HolderGetter<Item> items) {
        for (Item bucket : FISH_BUCKETS) {
            advancement.addCriterion(
                BuiltInRegistries.ITEM.getKey(bucket).getPath(),
                FilledBucketTrigger.TriggerInstance.filledBucket(ItemPredicate.Builder.item().of(items, bucket))
            );
        }
 
        return advancement;
    }
 
    private static Advancement.Builder addFish(Advancement.Builder advancement, HolderGetter<Item> items) {
        for (Item fish : FISH) {
            advancement.addCriterion(
                BuiltInRegistries.ITEM.getKey(fish).getPath(),
                FishingRodHookedTrigger.TriggerInstance.fishedItem(
                    Optional.empty(), Optional.empty(), Optional.of(ItemPredicate.Builder.item().of(items, fish).build())
                )
            );
        }
 
        return advancement;
    }
 
    private static Advancement.Builder addCatVariants(Advancement.Builder advancement, HolderLookup<CatVariant> catVariants) {
        sortedVariants(catVariants)
            .forEach(
                v -> advancement.addCriterion(
                    v.key().identifier().toString(),
                    TameAnimalTrigger.TriggerInstance.tamedAnimal(
                        EntityPredicate.Builder.entity()
                            .components(
                                DataComponentMatchers.Builder.components().exact(DataComponentExactPredicate.expect(DataComponents.CAT_VARIANT, v)).build()
                            )
                    )
                )
            );
        return advancement;
    }
 
    private static Advancement.Builder addTamedWolfVariants(Advancement.Builder advancement, HolderLookup<WolfVariant> wolfVariants) {
        sortedVariants(wolfVariants)
            .forEach(
                v -> advancement.addCriterion(
                    v.key().identifier().toString(),
                    TameAnimalTrigger.TriggerInstance.tamedAnimal(
                        EntityPredicate.Builder.entity()
                            .components(
                                DataComponentMatchers.Builder.components().exact(DataComponentExactPredicate.expect(DataComponents.WOLF_VARIANT, v)).build()
                            )
                    )
                )
            );
        return advancement;
    }
}

引用的其他类

  • Advancement

    • 引用位置: 参数/方法调用/返回值
    • 关联成员: Advancement.Builder.advancement()
  • AdvancementHolder

    • 引用位置: 参数/返回值
  • AdvancementRewards

    • 引用位置: 方法调用
    • 关联成员: AdvancementRewards.Builder.experience()
  • BeeNestDestroyedTrigger

    • 引用位置: 方法调用
    • 关联成员: BeeNestDestroyedTrigger.TriggerInstance.destroyedBeeNest()
  • BlockPredicate

    • 引用位置: 方法调用
    • 关联成员: BlockPredicate.Builder.block()
  • BredAnimalsTrigger

    • 引用位置: 方法调用
    • 关联成员: BredAnimalsTrigger.TriggerInstance.bredAnimals()
  • ConsumeItemTrigger

    • 引用位置: 方法调用
    • 关联成员: ConsumeItemTrigger.TriggerInstance.usedItem()
  • DataComponentMatchers

    • 引用位置: 方法调用
    • 关联成员: DataComponentMatchers.Builder.components()
  • EffectsChangedTrigger

    • 引用位置: 方法调用
    • 关联成员: EffectsChangedTrigger.TriggerInstance.gotEffectsFrom()
  • EnchantmentPredicate

    • 引用位置: 构造调用
    • 关联成员: EnchantmentPredicate()
  • EntityEquipmentPredicate

    • 引用位置: 方法调用
    • 关联成员: EntityEquipmentPredicate.Builder.equipment()
  • EntityFlagsPredicate

    • 引用位置: 方法调用
    • 关联成员: EntityFlagsPredicate.Builder.flags()
  • EntityPredicate

    • 引用位置: 方法调用
    • 关联成员: EntityPredicate.Builder.entity(), EntityPredicate.wrap()
  • FilledBucketTrigger

    • 引用位置: 方法调用
    • 关联成员: FilledBucketTrigger.TriggerInstance.filledBucket()
  • FishingRodHookedTrigger

    • 引用位置: 方法调用
    • 关联成员: FishingRodHookedTrigger.TriggerInstance.fishedItem()
  • InventoryChangeTrigger

    • 引用位置: 方法调用
    • 关联成员: InventoryChangeTrigger.TriggerInstance.hasItems()
  • ItemPredicate

    • 引用位置: 方法调用
    • 关联成员: ItemPredicate.Builder.item()
  • ItemUsedOnLocationTrigger

    • 引用位置: 方法调用
    • 关联成员: ItemUsedOnLocationTrigger.TriggerInstance.allayDropItemOnBlock(), ItemUsedOnLocationTrigger.TriggerInstance.itemUsedOnBlock(), ItemUsedOnLocationTrigger.TriggerInstance.placedBlock(), ItemUsedOnLocationTrigger.TriggerInstance.placedBlockWithProperties()
  • LocationPredicate

    • 引用位置: 方法调用
    • 关联成员: LocationPredicate.Builder.location()
  • MinMaxBounds

    • 引用位置: 方法调用
    • 关联成员: MinMaxBounds.Ints.atLeast(), MinMaxBounds.Ints.exactly()
  • PickedUpItemTrigger

    • 引用位置: 方法调用
    • 关联成员: PickedUpItemTrigger.TriggerInstance.thrownItemPickedUpByPlayer()
  • PlayerInteractTrigger

    • 引用位置: 方法调用
    • 关联成员: PlayerInteractTrigger.TriggerInstance.equipmentSheared(), PlayerInteractTrigger.TriggerInstance.itemUsedOnEntity()
  • StartRidingTrigger

    • 引用位置: 方法调用
    • 关联成员: StartRidingTrigger.TriggerInstance.playerStartsRiding()
  • TameAnimalTrigger

    • 引用位置: 方法调用
    • 关联成员: TameAnimalTrigger.TriggerInstance.tamedAnimal()
  • Holder

    • 引用位置: 字段/返回值
  • HolderGetter

    • 引用位置: 参数
  • HolderLookup

    • 引用位置: 参数
  • DataComponentExactPredicate

    • 引用位置: 方法调用
    • 关联成员: DataComponentExactPredicate.expect()
  • EnchantmentsPredicate

    • 引用位置: 方法调用
    • 关联成员: EnchantmentsPredicate.enchantments()
  • AdvancementSubProvider

    • 引用位置: 实现
  • Component

    • 引用位置: 方法调用
    • 关联成员: Component.translatable()
  • Identifier

    • 引用位置: 方法调用
    • 关联成员: Identifier.withDefaultNamespace()
  • EntityType

    • 引用位置: 参数/字段/方法调用
    • 关联成员: EntityType.getKey()
  • CatVariant

    • 引用位置: 参数
  • FrogVariant

    • 引用位置: 参数
  • WolfVariant

    • 引用位置: 参数
  • Item

    • 引用位置: 参数/字段