minecraft-src/net/minecraft/data/advancements/packs/VanillaHusbandryAdvancements.java
2025-07-04 02:00:41 +03:00

771 lines
27 KiB
Java

package net.minecraft.data.advancements.packs;
import com.google.common.collect.BiMap;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.stream.Stream;
import net.minecraft.advancements.AdvancementHolder;
import net.minecraft.advancements.AdvancementRewards;
import net.minecraft.advancements.AdvancementType;
import net.minecraft.advancements.Advancement.Builder;
import net.minecraft.advancements.AdvancementRequirements.Strategy;
import net.minecraft.advancements.critereon.BlockPredicate;
import net.minecraft.advancements.critereon.ConsumeItemTrigger;
import net.minecraft.advancements.critereon.EnchantmentPredicate;
import net.minecraft.advancements.critereon.EntityEquipmentPredicate;
import net.minecraft.advancements.critereon.EntityPredicate;
import net.minecraft.advancements.critereon.EntitySubPredicates;
import net.minecraft.advancements.critereon.FishingRodHookedTrigger;
import net.minecraft.advancements.critereon.ItemEnchantmentsPredicate;
import net.minecraft.advancements.critereon.ItemPredicate;
import net.minecraft.advancements.critereon.ItemSubPredicates;
import net.minecraft.advancements.critereon.ItemUsedOnLocationTrigger;
import net.minecraft.advancements.critereon.BredAnimalsTrigger.TriggerInstance;
import net.minecraft.advancements.critereon.MinMaxBounds.Ints;
import net.minecraft.core.Holder;
import net.minecraft.core.HolderGetter;
import net.minecraft.core.HolderLookup;
import net.minecraft.core.HolderSet;
import net.minecraft.core.component.DataComponentPredicate;
import net.minecraft.core.component.DataComponents;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries;
import net.minecraft.data.advancements.AdvancementSubProvider;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.BlockTags;
import net.minecraft.tags.EntityTypeTags;
import net.minecraft.tags.ItemTags;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.animal.WolfVariant;
import net.minecraft.world.item.HoneycombItem;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.enchantment.Enchantment;
import net.minecraft.world.item.enchantment.Enchantments;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
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
);
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.IRON_AXE, Items.DIAMOND_AXE, Items.NETHERITE_AXE
};
@Override
public void generate(HolderLookup.Provider registries, Consumer<AdvancementHolder> writer) {
HolderGetter<EntityType<?>> holderGetter = registries.lookupOrThrow(Registries.ENTITY_TYPE);
HolderGetter<Item> holderGetter2 = registries.lookupOrThrow(Registries.ITEM);
HolderGetter<Block> holderGetter3 = registries.lookupOrThrow(Registries.BLOCK);
HolderLookup.RegistryLookup<Enchantment> registryLookup = registries.lookupOrThrow(Registries.ENCHANTMENT);
AdvancementHolder advancementHolder = Builder.advancement()
.display(
Blocks.HAY_BLOCK,
Component.translatable("advancements.husbandry.root.title"),
Component.translatable("advancements.husbandry.root.description"),
ResourceLocation.withDefaultNamespace("textures/gui/advancements/backgrounds/husbandry.png"),
AdvancementType.TASK,
false,
false,
false
)
.addCriterion("consumed_item", ConsumeItemTrigger.TriggerInstance.usedItem())
.save(writer, "husbandry/root");
AdvancementHolder advancementHolder2 = Builder.advancement()
.parent(advancementHolder)
.display(
Items.WHEAT,
Component.translatable("advancements.husbandry.plant_seed.title"),
Component.translatable("advancements.husbandry.plant_seed.description"),
null,
AdvancementType.TASK,
true,
true,
false
)
.requirements(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(writer, "husbandry/plant_seed");
AdvancementHolder advancementHolder3 = Builder.advancement()
.parent(advancementHolder)
.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(Strategy.OR)
.addCriterion("bred", TriggerInstance.bredAnimals())
.save(writer, "husbandry/breed_an_animal");
createBreedAllAnimalsAdvancement(advancementHolder3, writer, holderGetter, BREEDABLE_ANIMALS.stream(), INDIRECTLY_BREEDABLE_ANIMALS.stream());
addFood(Builder.advancement(), holderGetter2)
.parent(advancementHolder2)
.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(writer, "husbandry/balanced_diet");
Builder.advancement()
.parent(advancementHolder2)
.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", net.minecraft.advancements.critereon.InventoryChangeTrigger.TriggerInstance.hasItems(Items.NETHERITE_HOE))
.save(writer, "husbandry/obtain_netherite_hoe");
AdvancementHolder advancementHolder4 = Builder.advancement()
.parent(advancementHolder)
.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", net.minecraft.advancements.critereon.TameAnimalTrigger.TriggerInstance.tamedAnimal())
.save(writer, "husbandry/tame_an_animal");
AdvancementHolder advancementHolder5 = addFish(Builder.advancement(), holderGetter2)
.parent(advancementHolder)
.requirements(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(writer, "husbandry/fishy_business");
AdvancementHolder advancementHolder6 = addFishBuckets(Builder.advancement(), holderGetter2)
.parent(advancementHolder5)
.requirements(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(writer, "husbandry/tactical_fishing");
AdvancementHolder advancementHolder7 = Builder.advancement()
.parent(advancementHolder6)
.requirements(Strategy.OR)
.addCriterion(
BuiltInRegistries.ITEM.getKey(Items.AXOLOTL_BUCKET).getPath(),
net.minecraft.advancements.critereon.FilledBucketTrigger.TriggerInstance.filledBucket(ItemPredicate.Builder.item().of(holderGetter2, 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(writer, "husbandry/axolotl_in_a_bucket");
Builder.advancement()
.parent(advancementHolder7)
.addCriterion(
"kill_axolotl_target",
net.minecraft.advancements.critereon.EffectsChangedTrigger.TriggerInstance.gotEffectsFrom(
EntityPredicate.Builder.entity().of(holderGetter, 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(writer, "husbandry/kill_axolotl_target");
addCatVariants(Builder.advancement())
.parent(advancementHolder4)
.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(writer, "husbandry/complete_catalogue");
addTamedWolfVariants(Builder.advancement(), registries)
.parent(advancementHolder4)
.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(writer, "husbandry/whole_pack");
AdvancementHolder advancementHolder8 = Builder.advancement()
.parent(advancementHolder)
.addCriterion(
"safely_harvest_honey",
ItemUsedOnLocationTrigger.TriggerInstance.itemUsedOnBlock(
net.minecraft.advancements.critereon.LocationPredicate.Builder.location()
.setBlock(BlockPredicate.Builder.block().of(holderGetter3, BlockTags.BEEHIVES))
.setSmokey(true),
ItemPredicate.Builder.item().of(holderGetter2, 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(writer, "husbandry/safely_harvest_honey");
AdvancementHolder advancementHolder9 = Builder.advancement()
.parent(advancementHolder8)
.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(
net.minecraft.advancements.critereon.LocationPredicate.Builder.location()
.setBlock(BlockPredicate.Builder.block().of(holderGetter3, ((BiMap)HoneycombItem.WAXABLES.get()).keySet())),
ItemPredicate.Builder.item().of(holderGetter2, Items.HONEYCOMB)
)
)
.save(writer, "husbandry/wax_on");
Builder.advancement()
.parent(advancementHolder9)
.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(
net.minecraft.advancements.critereon.LocationPredicate.Builder.location()
.setBlock(BlockPredicate.Builder.block().of(holderGetter3, ((BiMap)HoneycombItem.WAX_OFF_BY_BLOCK.get()).keySet())),
ItemPredicate.Builder.item().of(holderGetter2, WAX_SCRAPING_TOOLS)
)
)
.save(writer, "husbandry/wax_off");
AdvancementHolder advancementHolder10 = Builder.advancement()
.parent(advancementHolder)
.addCriterion(
BuiltInRegistries.ITEM.getKey(Items.TADPOLE_BUCKET).getPath(),
net.minecraft.advancements.critereon.FilledBucketTrigger.TriggerInstance.filledBucket(ItemPredicate.Builder.item().of(holderGetter2, 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(writer, "husbandry/tadpole_in_a_bucket");
AdvancementHolder advancementHolder11 = addLeashedFrogVariants(holderGetter, holderGetter2, Builder.advancement())
.parent(advancementHolder10)
.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(writer, "husbandry/leash_all_frog_variants");
Builder.advancement()
.parent(advancementHolder11)
.display(
Items.VERDANT_FROGLIGHT,
Component.translatable("advancements.husbandry.froglights.title"),
Component.translatable("advancements.husbandry.froglights.description"),
null,
AdvancementType.CHALLENGE,
true,
true,
false
)
.addCriterion(
"froglights",
net.minecraft.advancements.critereon.InventoryChangeTrigger.TriggerInstance.hasItems(
Items.OCHRE_FROGLIGHT, Items.PEARLESCENT_FROGLIGHT, Items.VERDANT_FROGLIGHT
)
)
.save(writer, "husbandry/froglights");
Builder.advancement()
.parent(advancementHolder)
.addCriterion(
"silk_touch_nest",
net.minecraft.advancements.critereon.BeeNestDestroyedTrigger.TriggerInstance.destroyedBeeNest(
Blocks.BEE_NEST,
ItemPredicate.Builder.item()
.withSubPredicate(
ItemSubPredicates.ENCHANTMENTS,
ItemEnchantmentsPredicate.enchantments(List.of(new EnchantmentPredicate(registryLookup.getOrThrow(Enchantments.SILK_TOUCH), Ints.atLeast(1))))
),
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(writer, "husbandry/silk_touch_nest");
Builder.advancement()
.parent(advancementHolder)
.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",
net.minecraft.advancements.critereon.StartRidingTrigger.TriggerInstance.playerStartsRiding(
EntityPredicate.Builder.entity()
.vehicle(
EntityPredicate.Builder.entity().of(holderGetter, EntityTypeTags.BOAT).passenger(EntityPredicate.Builder.entity().of(holderGetter, EntityType.GOAT))
)
)
)
.save(writer, "husbandry/ride_a_boat_with_a_goat");
Builder.advancement()
.parent(advancementHolder)
.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(
net.minecraft.advancements.critereon.LocationPredicate.Builder.location().setBlock(BlockPredicate.Builder.block().of(holderGetter3, BlockTags.ALL_SIGNS)),
ItemPredicate.Builder.item().of(holderGetter2, Items.GLOW_INK_SAC)
)
)
.save(writer, "husbandry/make_a_sign_glow");
AdvancementHolder advancementHolder12 = Builder.advancement()
.parent(advancementHolder)
.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",
net.minecraft.advancements.critereon.PickedUpItemTrigger.TriggerInstance.thrownItemPickedUpByPlayer(
Optional.empty(), Optional.empty(), Optional.of(EntityPredicate.wrap(EntityPredicate.Builder.entity().of(holderGetter, EntityType.ALLAY)))
)
)
.save(writer, "husbandry/allay_deliver_item_to_player");
Builder.advancement()
.parent(advancementHolder12)
.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(
net.minecraft.advancements.critereon.LocationPredicate.Builder.location().setBlock(BlockPredicate.Builder.block().of(holderGetter3, Blocks.NOTE_BLOCK)),
ItemPredicate.Builder.item().of(holderGetter2, Items.CAKE)
)
)
.save(writer, "husbandry/allay_deliver_cake_to_note_block");
AdvancementHolder advancementHolder13 = Builder.advancement()
.parent(advancementHolder)
.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", net.minecraft.advancements.critereon.InventoryChangeTrigger.TriggerInstance.hasItems(Items.SNIFFER_EGG))
.save(writer, "husbandry/obtain_sniffer_egg");
AdvancementHolder advancementHolder14 = Builder.advancement()
.parent(advancementHolder13)
.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",
net.minecraft.advancements.critereon.PlayerInteractTrigger.TriggerInstance.itemUsedOnEntity(
ItemPredicate.Builder.item().of(holderGetter2, ItemTags.SNIFFER_FOOD),
Optional.of(
EntityPredicate.wrap(
EntityPredicate.Builder.entity()
.of(holderGetter, EntityType.SNIFFER)
.flags(net.minecraft.advancements.critereon.EntityFlagsPredicate.Builder.flags().setIsBaby(true))
)
)
)
)
.save(writer, "husbandry/feed_snifflet");
Builder.advancement()
.parent(advancementHolder14)
.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(Strategy.OR)
.addCriterion("torchflower", ItemUsedOnLocationTrigger.TriggerInstance.placedBlock(Blocks.TORCHFLOWER_CROP))
.addCriterion("pitcher_pod", ItemUsedOnLocationTrigger.TriggerInstance.placedBlock(Blocks.PITCHER_CROP))
.save(writer, "husbandry/plant_any_sniffer_seed");
Builder.advancement()
.parent(advancementHolder4)
.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",
net.minecraft.advancements.critereon.PlayerInteractTrigger.TriggerInstance.itemUsedOnEntity(
ItemPredicate.Builder.item().of(holderGetter2, Items.SHEARS),
Optional.of(EntityPredicate.wrap(EntityPredicate.Builder.entity().of(holderGetter, EntityType.WOLF)))
)
)
.save(writer, "husbandry/remove_wolf_armor");
Builder.advancement()
.parent(advancementHolder4)
.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",
net.minecraft.advancements.critereon.PlayerInteractTrigger.TriggerInstance.itemUsedOnEntity(
ItemPredicate.Builder.item().of(holderGetter2, Items.ARMADILLO_SCUTE),
Optional.of(
EntityPredicate.wrap(
EntityPredicate.Builder.entity()
.of(holderGetter, EntityType.WOLF)
.equipment(
EntityEquipmentPredicate.Builder.equipment()
.body(
ItemPredicate.Builder.item()
.of(holderGetter2, Items.WOLF_ARMOR)
.hasComponents(DataComponentPredicate.builder().expect(DataComponents.DAMAGE, 0).build())
)
)
)
)
)
)
.save(writer, "husbandry/repair_wolf_armor");
}
public static AdvancementHolder createBreedAllAnimalsAdvancement(
AdvancementHolder advancementHolder,
Consumer<AdvancementHolder> consumer,
HolderGetter<EntityType<?>> holderGetter,
Stream<EntityType<?>> stream,
Stream<EntityType<?>> stream2
) {
return addBreedable(Builder.advancement(), stream, holderGetter, stream2)
.parent(advancementHolder)
.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(consumer, "husbandry/bred_all_animals");
}
private static Builder addLeashedFrogVariants(HolderGetter<EntityType<?>> holderGetter, HolderGetter<Item> holderGetter2, Builder builder) {
BuiltInRegistries.FROG_VARIANT
.listElements()
.forEach(
reference -> builder.addCriterion(
reference.key().location().toString(),
net.minecraft.advancements.critereon.PlayerInteractTrigger.TriggerInstance.itemUsedOnEntity(
ItemPredicate.Builder.item().of(holderGetter2, Items.LEAD),
Optional.of(
EntityPredicate.wrap(EntityPredicate.Builder.entity().of(holderGetter, EntityType.FROG).subPredicate(EntitySubPredicates.frogVariant(reference)))
)
)
)
);
return builder;
}
private static Builder addFood(Builder builder, HolderGetter<Item> holderGetter) {
for (Item item : EDIBLE_ITEMS) {
builder.addCriterion(BuiltInRegistries.ITEM.getKey(item).getPath(), ConsumeItemTrigger.TriggerInstance.usedItem(holderGetter, item));
}
return builder;
}
private static Builder addBreedable(Builder builder, Stream<EntityType<?>> stream, HolderGetter<EntityType<?>> holderGetter, Stream<EntityType<?>> stream2) {
stream.forEach(
entityType -> builder.addCriterion(
EntityType.getKey(entityType).toString(), TriggerInstance.bredAnimals(EntityPredicate.Builder.entity().of(holderGetter, entityType))
)
);
stream2.forEach(
entityType -> builder.addCriterion(
EntityType.getKey(entityType).toString(),
TriggerInstance.bredAnimals(
Optional.of(EntityPredicate.Builder.entity().of(holderGetter, entityType).build()),
Optional.of(EntityPredicate.Builder.entity().of(holderGetter, entityType).build()),
Optional.empty()
)
)
);
return builder;
}
private static Builder addFishBuckets(Builder builder, HolderGetter<Item> holderGetter) {
for (Item item : FISH_BUCKETS) {
builder.addCriterion(
BuiltInRegistries.ITEM.getKey(item).getPath(),
net.minecraft.advancements.critereon.FilledBucketTrigger.TriggerInstance.filledBucket(ItemPredicate.Builder.item().of(holderGetter, item))
);
}
return builder;
}
private static Builder addFish(Builder builder, HolderGetter<Item> holderGetter) {
for (Item item : FISH) {
builder.addCriterion(
BuiltInRegistries.ITEM.getKey(item).getPath(),
FishingRodHookedTrigger.TriggerInstance.fishedItem(
Optional.empty(), Optional.empty(), Optional.of(ItemPredicate.Builder.item().of(holderGetter, item).build())
)
);
}
return builder;
}
private static Builder addCatVariants(Builder builder) {
BuiltInRegistries.CAT_VARIANT
.listElements()
.sorted(Comparator.comparing(reference -> reference.key().location()))
.forEach(
reference -> builder.addCriterion(
reference.key().location().toString(),
net.minecraft.advancements.critereon.TameAnimalTrigger.TriggerInstance.tamedAnimal(
EntityPredicate.Builder.entity().subPredicate(EntitySubPredicates.catVariant(reference))
)
)
);
return builder;
}
private static Builder addTamedWolfVariants(Builder builder, HolderLookup.Provider registries) {
HolderLookup.RegistryLookup<WolfVariant> registryLookup = registries.lookupOrThrow(Registries.WOLF_VARIANT);
registryLookup.listElementIds()
.sorted(Comparator.comparing(ResourceKey::location))
.forEach(
resourceKey -> {
Holder<WolfVariant> holder = registryLookup.getOrThrow(resourceKey);
builder.addCriterion(
resourceKey.location().toString(),
net.minecraft.advancements.critereon.TameAnimalTrigger.TriggerInstance.tamedAnimal(
EntityPredicate.Builder.entity().subPredicate(EntitySubPredicates.wolfVariant(HolderSet.direct(holder)))
)
);
}
);
return builder;
}
}