package net.minecraft.data.advancements.packs; import com.mojang.datafixers.util.Pair; import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.Set; import java.util.function.Consumer; import net.minecraft.advancements.AdvancementHolder; import net.minecraft.advancements.AdvancementRequirements; import net.minecraft.advancements.AdvancementRewards; import net.minecraft.advancements.AdvancementType; import net.minecraft.advancements.Criterion; import net.minecraft.advancements.Advancement.Builder; import net.minecraft.advancements.AdvancementRequirements.Strategy; import net.minecraft.advancements.critereon.BlockPredicate; import net.minecraft.advancements.critereon.DistancePredicate; import net.minecraft.advancements.critereon.EntityEquipmentPredicate; import net.minecraft.advancements.critereon.EntityPredicate; import net.minecraft.advancements.critereon.ItemJukeboxPlayablePredicate; import net.minecraft.advancements.critereon.ItemPredicate; import net.minecraft.advancements.critereon.ItemSubPredicates; import net.minecraft.advancements.critereon.ItemUsedOnLocationTrigger; import net.minecraft.advancements.critereon.KilledByArrowTrigger; import net.minecraft.advancements.critereon.LightningBoltPredicate; import net.minecraft.advancements.critereon.LootTableTrigger; import net.minecraft.advancements.critereon.PlayerPredicate; import net.minecraft.advancements.critereon.PlayerTrigger; import net.minecraft.advancements.critereon.RecipeCraftedTrigger; import net.minecraft.advancements.critereon.ShotCrossbowTrigger; import net.minecraft.advancements.critereon.TagPredicate; import net.minecraft.advancements.critereon.UsedTotemTrigger; import net.minecraft.advancements.critereon.LightningStrikeTrigger.TriggerInstance; import net.minecraft.advancements.critereon.MinMaxBounds.Doubles; import net.minecraft.advancements.critereon.MinMaxBounds.Ints; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderGetter; import net.minecraft.core.HolderLookup; import net.minecraft.core.HolderSet; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.data.advancements.AdvancementSubProvider; import net.minecraft.data.recipes.packs.VanillaRecipeProvider; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.DamageTypeTags; import net.minecraft.tags.EntityTypeTags; import net.minecraft.tags.ItemTags; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.raid.Raid; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biomes; import net.minecraft.world.level.biome.MultiNoiseBiomeSourceParameterList; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.ComparatorBlock; import net.minecraft.world.level.block.CopperBulbBlock; import net.minecraft.world.level.block.VaultBlock; import net.minecraft.world.level.block.entity.BannerPattern; import net.minecraft.world.level.block.entity.DecoratedPotBlockEntity; import net.minecraft.world.level.block.entity.PotDecorations; import net.minecraft.world.level.levelgen.structure.BuiltinStructures; import net.minecraft.world.level.storage.loot.BuiltInLootTables; import net.minecraft.world.level.storage.loot.predicates.AllOfCondition; import net.minecraft.world.level.storage.loot.predicates.AnyOfCondition; import net.minecraft.world.level.storage.loot.predicates.LocationCheck; import net.minecraft.world.level.storage.loot.predicates.LootItemBlockStatePropertyCondition; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; public class VanillaAdventureAdvancements implements AdvancementSubProvider { private static final int DISTANCE_FROM_BOTTOM_TO_TOP = 384; private static final int Y_COORDINATE_AT_TOP = 320; private static final int Y_COORDINATE_AT_BOTTOM = -64; private static final int BEDROCK_THICKNESS = 5; protected static final List> MOBS_TO_KILL = Arrays.asList( EntityType.BLAZE, EntityType.BOGGED, EntityType.BREEZE, EntityType.CAVE_SPIDER, EntityType.CREEPER, EntityType.DROWNED, EntityType.ELDER_GUARDIAN, EntityType.ENDER_DRAGON, EntityType.ENDERMAN, EntityType.ENDERMITE, EntityType.EVOKER, EntityType.GHAST, EntityType.GUARDIAN, EntityType.HOGLIN, EntityType.HUSK, EntityType.MAGMA_CUBE, EntityType.PHANTOM, EntityType.PIGLIN, EntityType.PIGLIN_BRUTE, EntityType.PILLAGER, EntityType.RAVAGER, EntityType.SHULKER, EntityType.SILVERFISH, EntityType.SKELETON, EntityType.SLIME, EntityType.SPIDER, EntityType.STRAY, EntityType.VEX, EntityType.VINDICATOR, EntityType.WITCH, EntityType.WITHER_SKELETON, EntityType.WITHER, EntityType.ZOGLIN, EntityType.ZOMBIE_VILLAGER, EntityType.ZOMBIE, EntityType.ZOMBIFIED_PIGLIN ); private static Criterion fireCountAndBystander(Ints fireCount, Optional bystander) { return TriggerInstance.lightningStrike( Optional.of( EntityPredicate.Builder.entity() .distance(DistancePredicate.absolute(Doubles.atMost(30.0))) .subPredicate(LightningBoltPredicate.blockSetOnFire(fireCount)) .build() ), bystander ); } private static Criterion lookAtThroughItem( EntityPredicate.Builder builder, ItemPredicate.Builder builder2 ) { return net.minecraft.advancements.critereon.UsingItemTrigger.TriggerInstance.lookingAt( EntityPredicate.Builder.entity().subPredicate(PlayerPredicate.Builder.player().setLookingAt(builder).build()), builder2 ); } @Override public void generate(HolderLookup.Provider registries, Consumer writer) { HolderGetter> holderGetter = registries.lookupOrThrow(Registries.ENTITY_TYPE); HolderGetter holderGetter2 = registries.lookupOrThrow(Registries.ITEM); HolderGetter holderGetter3 = registries.lookupOrThrow(Registries.BLOCK); AdvancementHolder advancementHolder = Builder.advancement() .display( Items.MAP, Component.translatable("advancements.adventure.root.title"), Component.translatable("advancements.adventure.root.description"), ResourceLocation.withDefaultNamespace("textures/gui/advancements/backgrounds/adventure.png"), AdvancementType.TASK, false, false, false ) .requirements(Strategy.OR) .addCriterion("killed_something", net.minecraft.advancements.critereon.KilledTrigger.TriggerInstance.playerKilledEntity()) .addCriterion("killed_by_something", net.minecraft.advancements.critereon.KilledTrigger.TriggerInstance.entityKilledPlayer()) .save(writer, "adventure/root"); AdvancementHolder advancementHolder2 = Builder.advancement() .parent(advancementHolder) .display( Blocks.RED_BED, Component.translatable("advancements.adventure.sleep_in_bed.title"), Component.translatable("advancements.adventure.sleep_in_bed.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion("slept_in_bed", PlayerTrigger.TriggerInstance.sleptInBed()) .save(writer, "adventure/sleep_in_bed"); createAdventuringTime(registries, writer, advancementHolder2, MultiNoiseBiomeSourceParameterList.Preset.OVERWORLD); AdvancementHolder advancementHolder3 = Builder.advancement() .parent(advancementHolder) .display( Items.EMERALD, Component.translatable("advancements.adventure.trade.title"), Component.translatable("advancements.adventure.trade.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion("traded", net.minecraft.advancements.critereon.TradeTrigger.TriggerInstance.tradedWithVillager()) .save(writer, "adventure/trade"); Builder.advancement() .parent(advancementHolder3) .display( Items.EMERALD, Component.translatable("advancements.adventure.trade_at_world_height.title"), Component.translatable("advancements.adventure.trade_at_world_height.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion( "trade_at_world_height", net.minecraft.advancements.critereon.TradeTrigger.TriggerInstance.tradedWithVillager( EntityPredicate.Builder.entity().located(net.minecraft.advancements.critereon.LocationPredicate.Builder.atYLocation(Doubles.atLeast(319.0))) ) ) .save(writer, "adventure/trade_at_world_height"); AdvancementHolder advancementHolder4 = createMonsterHunterAdvancement(advancementHolder, writer, holderGetter, MOBS_TO_KILL); AdvancementHolder advancementHolder5 = Builder.advancement() .parent(advancementHolder4) .display( Items.BOW, Component.translatable("advancements.adventure.shoot_arrow.title"), Component.translatable("advancements.adventure.shoot_arrow.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion( "shot_arrow", net.minecraft.advancements.critereon.PlayerHurtEntityTrigger.TriggerInstance.playerHurtEntityWithDamage( net.minecraft.advancements.critereon.DamagePredicate.Builder.damageInstance() .type( net.minecraft.advancements.critereon.DamageSourcePredicate.Builder.damageType() .tag(TagPredicate.is(DamageTypeTags.IS_PROJECTILE)) .direct(EntityPredicate.Builder.entity().of(holderGetter, EntityTypeTags.ARROWS)) ) ) ) .save(writer, "adventure/shoot_arrow"); AdvancementHolder advancementHolder6 = Builder.advancement() .parent(advancementHolder4) .display( Items.TRIDENT, Component.translatable("advancements.adventure.throw_trident.title"), Component.translatable("advancements.adventure.throw_trident.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion( "shot_trident", net.minecraft.advancements.critereon.PlayerHurtEntityTrigger.TriggerInstance.playerHurtEntityWithDamage( net.minecraft.advancements.critereon.DamagePredicate.Builder.damageInstance() .type( net.minecraft.advancements.critereon.DamageSourcePredicate.Builder.damageType() .tag(TagPredicate.is(DamageTypeTags.IS_PROJECTILE)) .direct(EntityPredicate.Builder.entity().of(holderGetter, EntityType.TRIDENT)) ) ) ) .save(writer, "adventure/throw_trident"); Builder.advancement() .parent(advancementHolder6) .display( Items.TRIDENT, Component.translatable("advancements.adventure.very_very_frightening.title"), Component.translatable("advancements.adventure.very_very_frightening.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion( "struck_villager", net.minecraft.advancements.critereon.ChanneledLightningTrigger.TriggerInstance.channeledLightning( EntityPredicate.Builder.entity().of(holderGetter, EntityType.VILLAGER) ) ) .save(writer, "adventure/very_very_frightening"); Builder.advancement() .parent(advancementHolder3) .display( Blocks.CARVED_PUMPKIN, Component.translatable("advancements.adventure.summon_iron_golem.title"), Component.translatable("advancements.adventure.summon_iron_golem.description"), null, AdvancementType.GOAL, true, true, false ) .addCriterion( "summoned_golem", net.minecraft.advancements.critereon.SummonedEntityTrigger.TriggerInstance.summonedEntity( EntityPredicate.Builder.entity().of(holderGetter, EntityType.IRON_GOLEM) ) ) .save(writer, "adventure/summon_iron_golem"); Builder.advancement() .parent(advancementHolder5) .display( Items.ARROW, Component.translatable("advancements.adventure.sniper_duel.title"), Component.translatable("advancements.adventure.sniper_duel.description"), null, AdvancementType.CHALLENGE, true, true, false ) .rewards(AdvancementRewards.Builder.experience(50)) .addCriterion( "killed_skeleton", net.minecraft.advancements.critereon.KilledTrigger.TriggerInstance.playerKilledEntity( EntityPredicate.Builder.entity().of(holderGetter, EntityType.SKELETON).distance(DistancePredicate.horizontal(Doubles.atLeast(50.0))), net.minecraft.advancements.critereon.DamageSourcePredicate.Builder.damageType().tag(TagPredicate.is(DamageTypeTags.IS_PROJECTILE)) ) ) .save(writer, "adventure/sniper_duel"); Builder.advancement() .parent(advancementHolder4) .display( Items.TOTEM_OF_UNDYING, Component.translatable("advancements.adventure.totem_of_undying.title"), Component.translatable("advancements.adventure.totem_of_undying.description"), null, AdvancementType.GOAL, true, true, false ) .addCriterion("used_totem", UsedTotemTrigger.TriggerInstance.usedTotem(holderGetter2, Items.TOTEM_OF_UNDYING)) .save(writer, "adventure/totem_of_undying"); AdvancementHolder advancementHolder7 = Builder.advancement() .parent(advancementHolder) .display( Items.CROSSBOW, Component.translatable("advancements.adventure.ol_betsy.title"), Component.translatable("advancements.adventure.ol_betsy.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion("shot_crossbow", ShotCrossbowTrigger.TriggerInstance.shotCrossbow(holderGetter2, Items.CROSSBOW)) .save(writer, "adventure/ol_betsy"); Builder.advancement() .parent(advancementHolder7) .display( Items.CROSSBOW, Component.translatable("advancements.adventure.whos_the_pillager_now.title"), Component.translatable("advancements.adventure.whos_the_pillager_now.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion( "kill_pillager", KilledByArrowTrigger.TriggerInstance.crossbowKilled(holderGetter2, EntityPredicate.Builder.entity().of(holderGetter, EntityType.PILLAGER)) ) .save(writer, "adventure/whos_the_pillager_now"); Builder.advancement() .parent(advancementHolder7) .display( Items.CROSSBOW, Component.translatable("advancements.adventure.two_birds_one_arrow.title"), Component.translatable("advancements.adventure.two_birds_one_arrow.description"), null, AdvancementType.CHALLENGE, true, true, false ) .rewards(AdvancementRewards.Builder.experience(65)) .addCriterion( "two_birds", KilledByArrowTrigger.TriggerInstance.crossbowKilled( holderGetter2, EntityPredicate.Builder.entity().of(holderGetter, EntityType.PHANTOM), EntityPredicate.Builder.entity().of(holderGetter, EntityType.PHANTOM) ) ) .save(writer, "adventure/two_birds_one_arrow"); Builder.advancement() .parent(advancementHolder7) .display( Items.CROSSBOW, Component.translatable("advancements.adventure.arbalistic.title"), Component.translatable("advancements.adventure.arbalistic.description"), null, AdvancementType.CHALLENGE, true, true, true ) .rewards(AdvancementRewards.Builder.experience(85)) .addCriterion("arbalistic", KilledByArrowTrigger.TriggerInstance.crossbowKilled(holderGetter2, Ints.exactly(5))) .save(writer, "adventure/arbalistic"); HolderLookup.RegistryLookup registryLookup = registries.lookupOrThrow(Registries.BANNER_PATTERN); AdvancementHolder advancementHolder8 = Builder.advancement() .parent(advancementHolder) .display( Raid.getOminousBannerInstance(registryLookup), Component.translatable("advancements.adventure.voluntary_exile.title"), Component.translatable("advancements.adventure.voluntary_exile.description"), null, AdvancementType.TASK, true, true, true ) .addCriterion( "voluntary_exile", net.minecraft.advancements.critereon.KilledTrigger.TriggerInstance.playerKilledEntity( EntityPredicate.Builder.entity() .of(holderGetter, EntityTypeTags.RAIDERS) .equipment(EntityEquipmentPredicate.captainPredicate(holderGetter2, registryLookup)) ) ) .save(writer, "adventure/voluntary_exile"); Builder.advancement() .parent(advancementHolder8) .display( Raid.getOminousBannerInstance(registryLookup), Component.translatable("advancements.adventure.hero_of_the_village.title"), Component.translatable("advancements.adventure.hero_of_the_village.description"), null, AdvancementType.CHALLENGE, true, true, true ) .rewards(AdvancementRewards.Builder.experience(100)) .addCriterion("hero_of_the_village", PlayerTrigger.TriggerInstance.raidWon()) .save(writer, "adventure/hero_of_the_village"); Builder.advancement() .parent(advancementHolder) .display( Blocks.HONEY_BLOCK.asItem(), Component.translatable("advancements.adventure.honey_block_slide.title"), Component.translatable("advancements.adventure.honey_block_slide.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion("honey_block_slide", net.minecraft.advancements.critereon.SlideDownBlockTrigger.TriggerInstance.slidesDownBlock(Blocks.HONEY_BLOCK)) .save(writer, "adventure/honey_block_slide"); Builder.advancement() .parent(advancementHolder5) .display( Blocks.TARGET.asItem(), Component.translatable("advancements.adventure.bullseye.title"), Component.translatable("advancements.adventure.bullseye.description"), null, AdvancementType.CHALLENGE, true, true, false ) .rewards(AdvancementRewards.Builder.experience(50)) .addCriterion( "bullseye", net.minecraft.advancements.critereon.TargetBlockTrigger.TriggerInstance.targetHit( Ints.exactly(15), Optional.of(EntityPredicate.wrap(EntityPredicate.Builder.entity().distance(DistancePredicate.horizontal(Doubles.atLeast(30.0))))) ) ) .save(writer, "adventure/bullseye"); Builder.advancement() .parent(advancementHolder2) .display( Items.LEATHER_BOOTS, Component.translatable("advancements.adventure.walk_on_powder_snow_with_leather_boots.title"), Component.translatable("advancements.adventure.walk_on_powder_snow_with_leather_boots.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion( "walk_on_powder_snow_with_leather_boots", PlayerTrigger.TriggerInstance.walkOnBlockWithEquipment(holderGetter3, holderGetter2, Blocks.POWDER_SNOW, Items.LEATHER_BOOTS) ) .save(writer, "adventure/walk_on_powder_snow_with_leather_boots"); Builder.advancement() .parent(advancementHolder) .display( Items.LIGHTNING_ROD, Component.translatable("advancements.adventure.lightning_rod_with_villager_no_fire.title"), Component.translatable("advancements.adventure.lightning_rod_with_villager_no_fire.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion( "lightning_rod_with_villager_no_fire", fireCountAndBystander(Ints.exactly(0), Optional.of(EntityPredicate.Builder.entity().of(holderGetter, EntityType.VILLAGER).build())) ) .save(writer, "adventure/lightning_rod_with_villager_no_fire"); AdvancementHolder advancementHolder9 = Builder.advancement() .parent(advancementHolder) .display( Items.SPYGLASS, Component.translatable("advancements.adventure.spyglass_at_parrot.title"), Component.translatable("advancements.adventure.spyglass_at_parrot.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion( "spyglass_at_parrot", lookAtThroughItem(EntityPredicate.Builder.entity().of(holderGetter, EntityType.PARROT), ItemPredicate.Builder.item().of(holderGetter2, Items.SPYGLASS)) ) .save(writer, "adventure/spyglass_at_parrot"); AdvancementHolder advancementHolder10 = Builder.advancement() .parent(advancementHolder9) .display( Items.SPYGLASS, Component.translatable("advancements.adventure.spyglass_at_ghast.title"), Component.translatable("advancements.adventure.spyglass_at_ghast.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion( "spyglass_at_ghast", lookAtThroughItem(EntityPredicate.Builder.entity().of(holderGetter, EntityType.GHAST), ItemPredicate.Builder.item().of(holderGetter2, Items.SPYGLASS)) ) .save(writer, "adventure/spyglass_at_ghast"); Builder.advancement() .parent(advancementHolder2) .display( Items.JUKEBOX, Component.translatable("advancements.adventure.play_jukebox_in_meadows.title"), Component.translatable("advancements.adventure.play_jukebox_in_meadows.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion( "play_jukebox_in_meadows", ItemUsedOnLocationTrigger.TriggerInstance.itemUsedOnBlock( net.minecraft.advancements.critereon.LocationPredicate.Builder.location() .setBiomes(HolderSet.direct(registries.lookupOrThrow(Registries.BIOME).getOrThrow(Biomes.MEADOW))) .setBlock(BlockPredicate.Builder.block().of(holderGetter3, Blocks.JUKEBOX)), ItemPredicate.Builder.item().withSubPredicate(ItemSubPredicates.JUKEBOX_PLAYABLE, ItemJukeboxPlayablePredicate.any()) ) ) .save(writer, "adventure/play_jukebox_in_meadows"); Builder.advancement() .parent(advancementHolder10) .display( Items.SPYGLASS, Component.translatable("advancements.adventure.spyglass_at_dragon.title"), Component.translatable("advancements.adventure.spyglass_at_dragon.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion( "spyglass_at_dragon", lookAtThroughItem( EntityPredicate.Builder.entity().of(holderGetter, EntityType.ENDER_DRAGON), ItemPredicate.Builder.item().of(holderGetter2, Items.SPYGLASS) ) ) .save(writer, "adventure/spyglass_at_dragon"); Builder.advancement() .parent(advancementHolder) .display( Items.WATER_BUCKET, Component.translatable("advancements.adventure.fall_from_world_height.title"), Component.translatable("advancements.adventure.fall_from_world_height.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion( "fall_from_world_height", net.minecraft.advancements.critereon.DistanceTrigger.TriggerInstance.fallFromHeight( EntityPredicate.Builder.entity().located(net.minecraft.advancements.critereon.LocationPredicate.Builder.atYLocation(Doubles.atMost(-59.0))), DistancePredicate.vertical(Doubles.atLeast(379.0)), net.minecraft.advancements.critereon.LocationPredicate.Builder.atYLocation(Doubles.atLeast(319.0)) ) ) .save(writer, "adventure/fall_from_world_height"); Builder.advancement() .parent(advancementHolder4) .display( Blocks.SCULK_CATALYST, Component.translatable("advancements.adventure.kill_mob_near_sculk_catalyst.title"), Component.translatable("advancements.adventure.kill_mob_near_sculk_catalyst.description"), null, AdvancementType.CHALLENGE, true, true, false ) .addCriterion("kill_mob_near_sculk_catalyst", net.minecraft.advancements.critereon.KilledTrigger.TriggerInstance.playerKilledEntityNearSculkCatalyst()) .save(writer, "adventure/kill_mob_near_sculk_catalyst"); Builder.advancement() .parent(advancementHolder) .display( Blocks.SCULK_SENSOR, Component.translatable("advancements.adventure.avoid_vibration.title"), Component.translatable("advancements.adventure.avoid_vibration.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion("avoid_vibration", PlayerTrigger.TriggerInstance.avoidVibration()) .save(writer, "adventure/avoid_vibration"); AdvancementHolder advancementHolder11 = respectingTheRemnantsCriterions(holderGetter2, Builder.advancement()) .parent(advancementHolder) .display( Items.BRUSH, Component.translatable("advancements.adventure.salvage_sherd.title"), Component.translatable("advancements.adventure.salvage_sherd.description"), null, AdvancementType.TASK, true, true, false ) .save(writer, "adventure/salvage_sherd"); Builder.advancement() .parent(advancementHolder11) .display( DecoratedPotBlockEntity.createDecoratedPotItem( new PotDecorations(Optional.empty(), Optional.of(Items.HEART_POTTERY_SHERD), Optional.empty(), Optional.of(Items.EXPLORER_POTTERY_SHERD)) ), Component.translatable("advancements.adventure.craft_decorated_pot_using_only_sherds.title"), Component.translatable("advancements.adventure.craft_decorated_pot_using_only_sherds.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion( "pot_crafted_using_only_sherds", RecipeCraftedTrigger.TriggerInstance.craftedItem( ResourceKey.create(Registries.RECIPE, ResourceLocation.withDefaultNamespace("decorated_pot")), List.of( ItemPredicate.Builder.item().of(holderGetter2, ItemTags.DECORATED_POT_SHERDS), ItemPredicate.Builder.item().of(holderGetter2, ItemTags.DECORATED_POT_SHERDS), ItemPredicate.Builder.item().of(holderGetter2, ItemTags.DECORATED_POT_SHERDS), ItemPredicate.Builder.item().of(holderGetter2, ItemTags.DECORATED_POT_SHERDS) ) ) ) .save(writer, "adventure/craft_decorated_pot_using_only_sherds"); AdvancementHolder advancementHolder12 = craftingANewLook(Builder.advancement()) .parent(advancementHolder) .display( new ItemStack(Items.DUNE_ARMOR_TRIM_SMITHING_TEMPLATE), Component.translatable("advancements.adventure.trim_with_any_armor_pattern.title"), Component.translatable("advancements.adventure.trim_with_any_armor_pattern.description"), null, AdvancementType.TASK, true, true, false ) .save(writer, "adventure/trim_with_any_armor_pattern"); smithingWithStyle(Builder.advancement()) .parent(advancementHolder12) .display( new ItemStack(Items.SILENCE_ARMOR_TRIM_SMITHING_TEMPLATE), Component.translatable("advancements.adventure.trim_with_all_exclusive_armor_patterns.title"), Component.translatable("advancements.adventure.trim_with_all_exclusive_armor_patterns.description"), null, AdvancementType.CHALLENGE, true, true, false ) .rewards(AdvancementRewards.Builder.experience(150)) .save(writer, "adventure/trim_with_all_exclusive_armor_patterns"); Builder.advancement() .parent(advancementHolder) .display( Items.CHISELED_BOOKSHELF, Component.translatable("advancements.adventure.read_power_from_chiseled_bookshelf.title"), Component.translatable("advancements.adventure.read_power_from_chiseled_bookshelf.description"), null, AdvancementType.TASK, true, true, false ) .requirements(Strategy.OR) .addCriterion("chiseled_bookshelf", placedBlockReadByComparator(holderGetter3, Blocks.CHISELED_BOOKSHELF)) .addCriterion("comparator", placedComparatorReadingBlock(holderGetter3, Blocks.CHISELED_BOOKSHELF)) .save(writer, "adventure/read_power_of_chiseled_bookshelf"); Builder.advancement() .parent(advancementHolder) .display( Items.ARMADILLO_SCUTE, Component.translatable("advancements.adventure.brush_armadillo.title"), Component.translatable("advancements.adventure.brush_armadillo.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion( "brush_armadillo", net.minecraft.advancements.critereon.PlayerInteractTrigger.TriggerInstance.itemUsedOnEntity( ItemPredicate.Builder.item().of(holderGetter2, Items.BRUSH), Optional.of(EntityPredicate.wrap(EntityPredicate.Builder.entity().of(holderGetter, EntityType.ARMADILLO))) ) ) .save(writer, "adventure/brush_armadillo"); AdvancementHolder advancementHolder13 = Builder.advancement() .parent(advancementHolder) .display( Blocks.CHISELED_TUFF, Component.translatable("advancements.adventure.minecraft_trials_edition.title"), Component.translatable("advancements.adventure.minecraft_trials_edition.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion( "minecraft_trials_edition", PlayerTrigger.TriggerInstance.located( net.minecraft.advancements.critereon.LocationPredicate.Builder.inStructure( registries.lookupOrThrow(Registries.STRUCTURE).getOrThrow(BuiltinStructures.TRIAL_CHAMBERS) ) ) ) .save(writer, "adventure/minecraft_trials_edition"); Builder.advancement() .parent(advancementHolder13) .display( Items.COPPER_BULB, Component.translatable("advancements.adventure.lighten_up.title"), Component.translatable("advancements.adventure.lighten_up.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion( "lighten_up", ItemUsedOnLocationTrigger.TriggerInstance.itemUsedOnBlock( net.minecraft.advancements.critereon.LocationPredicate.Builder.location() .setBlock( BlockPredicate.Builder.block() .of( holderGetter3, Blocks.OXIDIZED_COPPER_BULB, Blocks.WEATHERED_COPPER_BULB, Blocks.EXPOSED_COPPER_BULB, Blocks.WAXED_OXIDIZED_COPPER_BULB, Blocks.WAXED_WEATHERED_COPPER_BULB, Blocks.WAXED_EXPOSED_COPPER_BULB ) .setProperties(net.minecraft.advancements.critereon.StatePropertiesPredicate.Builder.properties().hasProperty(CopperBulbBlock.LIT, true)) ), ItemPredicate.Builder.item().of(holderGetter2, VanillaHusbandryAdvancements.WAX_SCRAPING_TOOLS) ) ) .save(writer, "adventure/lighten_up"); AdvancementHolder advancementHolder14 = Builder.advancement() .parent(advancementHolder13) .display( Items.TRIAL_KEY, Component.translatable("advancements.adventure.under_lock_and_key.title"), Component.translatable("advancements.adventure.under_lock_and_key.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion( "under_lock_and_key", ItemUsedOnLocationTrigger.TriggerInstance.itemUsedOnBlock( net.minecraft.advancements.critereon.LocationPredicate.Builder.location() .setBlock( BlockPredicate.Builder.block() .of(holderGetter3, Blocks.VAULT) .setProperties(net.minecraft.advancements.critereon.StatePropertiesPredicate.Builder.properties().hasProperty(VaultBlock.OMINOUS, false)) ), ItemPredicate.Builder.item().of(holderGetter2, Items.TRIAL_KEY) ) ) .save(writer, "adventure/under_lock_and_key"); Builder.advancement() .parent(advancementHolder14) .display( Items.OMINOUS_TRIAL_KEY, Component.translatable("advancements.adventure.revaulting.title"), Component.translatable("advancements.adventure.revaulting.description"), null, AdvancementType.GOAL, true, true, false ) .addCriterion( "revaulting", ItemUsedOnLocationTrigger.TriggerInstance.itemUsedOnBlock( net.minecraft.advancements.critereon.LocationPredicate.Builder.location() .setBlock( BlockPredicate.Builder.block() .of(holderGetter3, Blocks.VAULT) .setProperties(net.minecraft.advancements.critereon.StatePropertiesPredicate.Builder.properties().hasProperty(VaultBlock.OMINOUS, true)) ), ItemPredicate.Builder.item().of(holderGetter2, Items.OMINOUS_TRIAL_KEY) ) ) .save(writer, "adventure/revaulting"); Builder.advancement() .parent(advancementHolder13) .display( Items.WIND_CHARGE, Component.translatable("advancements.adventure.blowback.title"), Component.translatable("advancements.adventure.blowback.description"), null, AdvancementType.CHALLENGE, true, true, false ) .rewards(AdvancementRewards.Builder.experience(40)) .addCriterion( "blowback", net.minecraft.advancements.critereon.KilledTrigger.TriggerInstance.playerKilledEntity( EntityPredicate.Builder.entity().of(holderGetter, EntityType.BREEZE), net.minecraft.advancements.critereon.DamageSourcePredicate.Builder.damageType() .tag(TagPredicate.is(DamageTypeTags.IS_PROJECTILE)) .direct(EntityPredicate.Builder.entity().of(holderGetter, EntityType.BREEZE_WIND_CHARGE)) ) ) .save(writer, "adventure/blowback"); Builder.advancement() .parent(advancementHolder) .display( Items.CRAFTER, Component.translatable("advancements.adventure.crafters_crafting_crafters.title"), Component.translatable("advancements.adventure.crafters_crafting_crafters.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion( "crafter_crafted_crafter", RecipeCraftedTrigger.TriggerInstance.crafterCraftedItem(ResourceKey.create(Registries.RECIPE, ResourceLocation.withDefaultNamespace("crafter"))) ) .save(writer, "adventure/crafters_crafting_crafters"); Builder.advancement() .parent(advancementHolder13) .display( Items.WIND_CHARGE, Component.translatable("advancements.adventure.who_needs_rockets.title"), Component.translatable("advancements.adventure.who_needs_rockets.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion( "who_needs_rockets", net.minecraft.advancements.critereon.FallAfterExplosionTrigger.TriggerInstance.fallAfterExplosion( DistancePredicate.vertical(Doubles.atLeast(7.0)), EntityPredicate.Builder.entity().of(holderGetter, EntityType.WIND_CHARGE) ) ) .save(writer, "adventure/who_needs_rockets"); Builder.advancement() .parent(advancementHolder13) .display( Items.MACE, Component.translatable("advancements.adventure.overoverkill.title"), Component.translatable("advancements.adventure.overoverkill.description"), null, AdvancementType.CHALLENGE, true, true, false ) .rewards(AdvancementRewards.Builder.experience(50)) .addCriterion( "overoverkill", net.minecraft.advancements.critereon.PlayerHurtEntityTrigger.TriggerInstance.playerHurtEntityWithDamage( net.minecraft.advancements.critereon.DamagePredicate.Builder.damageInstance() .dealtDamage(Doubles.atLeast(100.0)) .type( net.minecraft.advancements.critereon.DamageSourcePredicate.Builder.damageType() .tag(TagPredicate.is(DamageTypeTags.IS_MACE_SMASH)) .direct( EntityPredicate.Builder.entity() .of(holderGetter, EntityType.PLAYER) .equipment(EntityEquipmentPredicate.Builder.equipment().mainhand(ItemPredicate.Builder.item().of(holderGetter2, Items.MACE))) ) ) ) ) .save(writer, "adventure/overoverkill"); } public static AdvancementHolder createMonsterHunterAdvancement( AdvancementHolder advancementHolder, Consumer consumer, HolderGetter> holderGetter, List> list ) { AdvancementHolder advancementHolder2 = addMobsToKill(Builder.advancement(), holderGetter, list) .parent(advancementHolder) .display( Items.IRON_SWORD, Component.translatable("advancements.adventure.kill_a_mob.title"), Component.translatable("advancements.adventure.kill_a_mob.description"), null, AdvancementType.TASK, true, true, false ) .requirements(Strategy.OR) .save(consumer, "adventure/kill_a_mob"); addMobsToKill(Builder.advancement(), holderGetter, list) .parent(advancementHolder2) .display( Items.DIAMOND_SWORD, Component.translatable("advancements.adventure.kill_all_mobs.title"), Component.translatable("advancements.adventure.kill_all_mobs.description"), null, AdvancementType.CHALLENGE, true, true, false ) .rewards(AdvancementRewards.Builder.experience(100)) .save(consumer, "adventure/kill_all_mobs"); return advancementHolder2; } private static Criterion placedBlockReadByComparator(HolderGetter holderGetter, Block block) { LootItemCondition.Builder[] builders = (LootItemCondition.Builder[])ComparatorBlock.FACING .getPossibleValues() .stream() .map( direction -> { net.minecraft.advancements.critereon.StatePropertiesPredicate.Builder builder = net.minecraft.advancements.critereon.StatePropertiesPredicate.Builder.properties() .hasProperty(ComparatorBlock.FACING, direction); BlockPredicate.Builder builder2 = BlockPredicate.Builder.block().of(holderGetter, Blocks.COMPARATOR).setProperties(builder); return LocationCheck.checkLocation( net.minecraft.advancements.critereon.LocationPredicate.Builder.location().setBlock(builder2), new BlockPos(direction.getOpposite().getUnitVec3i()) ); } ) .toArray(LootItemCondition.Builder[]::new); return ItemUsedOnLocationTrigger.TriggerInstance.placedBlock( LootItemBlockStatePropertyCondition.hasBlockStateProperties(block), AnyOfCondition.anyOf(builders) ); } private static Criterion placedComparatorReadingBlock(HolderGetter holderGetter, Block block) { LootItemCondition.Builder[] builders = (LootItemCondition.Builder[])ComparatorBlock.FACING .getPossibleValues() .stream() .map( direction -> { net.minecraft.advancements.critereon.StatePropertiesPredicate.Builder builder = net.minecraft.advancements.critereon.StatePropertiesPredicate.Builder.properties() .hasProperty(ComparatorBlock.FACING, direction); LootItemBlockStatePropertyCondition.Builder builder2 = new LootItemBlockStatePropertyCondition.Builder(Blocks.COMPARATOR).setProperties(builder); LootItemCondition.Builder builder3 = LocationCheck.checkLocation( net.minecraft.advancements.critereon.LocationPredicate.Builder.location().setBlock(BlockPredicate.Builder.block().of(holderGetter, block)), new BlockPos(direction.getUnitVec3i()) ); return AllOfCondition.allOf(builder2, builder3); } ) .toArray(LootItemCondition.Builder[]::new); return ItemUsedOnLocationTrigger.TriggerInstance.placedBlock(AnyOfCondition.anyOf(builders)); } private static Builder smithingWithStyle(Builder builder) { builder.requirements(Strategy.AND); Set set = Set.of( Items.SPIRE_ARMOR_TRIM_SMITHING_TEMPLATE, Items.SNOUT_ARMOR_TRIM_SMITHING_TEMPLATE, Items.RIB_ARMOR_TRIM_SMITHING_TEMPLATE, Items.WARD_ARMOR_TRIM_SMITHING_TEMPLATE, Items.SILENCE_ARMOR_TRIM_SMITHING_TEMPLATE, Items.VEX_ARMOR_TRIM_SMITHING_TEMPLATE, Items.TIDE_ARMOR_TRIM_SMITHING_TEMPLATE, Items.WAYFINDER_ARMOR_TRIM_SMITHING_TEMPLATE ); VanillaRecipeProvider.smithingTrims() .filter(trimTemplate -> set.contains(trimTemplate.template())) .forEach( trimTemplate -> builder.addCriterion("armor_trimmed_" + trimTemplate.id().location(), RecipeCraftedTrigger.TriggerInstance.craftedItem(trimTemplate.id())) ); return builder; } private static Builder craftingANewLook(Builder builder) { builder.requirements(Strategy.OR); VanillaRecipeProvider.smithingTrims() .map(VanillaRecipeProvider.TrimTemplate::id) .forEach(resourceKey -> builder.addCriterion("armor_trimmed_" + resourceKey.location(), RecipeCraftedTrigger.TriggerInstance.craftedItem(resourceKey))); return builder; } private static Builder respectingTheRemnantsCriterions(HolderGetter holderGetter, Builder builder) { List>> list = List.of( Pair.of("desert_pyramid", LootTableTrigger.TriggerInstance.lootTableUsed(BuiltInLootTables.DESERT_PYRAMID_ARCHAEOLOGY)), Pair.of("desert_well", LootTableTrigger.TriggerInstance.lootTableUsed(BuiltInLootTables.DESERT_WELL_ARCHAEOLOGY)), Pair.of("ocean_ruin_cold", LootTableTrigger.TriggerInstance.lootTableUsed(BuiltInLootTables.OCEAN_RUIN_COLD_ARCHAEOLOGY)), Pair.of("ocean_ruin_warm", LootTableTrigger.TriggerInstance.lootTableUsed(BuiltInLootTables.OCEAN_RUIN_WARM_ARCHAEOLOGY)), Pair.of("trail_ruins_rare", LootTableTrigger.TriggerInstance.lootTableUsed(BuiltInLootTables.TRAIL_RUINS_ARCHAEOLOGY_RARE)), Pair.of("trail_ruins_common", LootTableTrigger.TriggerInstance.lootTableUsed(BuiltInLootTables.TRAIL_RUINS_ARCHAEOLOGY_COMMON)) ); list.forEach(pair -> builder.addCriterion((String)pair.getFirst(), (Criterion)pair.getSecond())); String string = "has_sherd"; builder.addCriterion( "has_sherd", net.minecraft.advancements.critereon.InventoryChangeTrigger.TriggerInstance.hasItems( ItemPredicate.Builder.item().of(holderGetter, ItemTags.DECORATED_POT_SHERDS) ) ); builder.requirements(new AdvancementRequirements(List.of(list.stream().map(Pair::getFirst).toList(), List.of("has_sherd")))); return builder; } protected static void createAdventuringTime( HolderLookup.Provider levelRegistry, Consumer writer, AdvancementHolder parent, MultiNoiseBiomeSourceParameterList.Preset preset ) { addBiomes(Builder.advancement(), levelRegistry, preset.usedBiomes().toList()) .parent(parent) .display( Items.DIAMOND_BOOTS, Component.translatable("advancements.adventure.adventuring_time.title"), Component.translatable("advancements.adventure.adventuring_time.description"), null, AdvancementType.CHALLENGE, true, true, false ) .rewards(AdvancementRewards.Builder.experience(500)) .save(writer, "adventure/adventuring_time"); } private static Builder addMobsToKill(Builder builder, HolderGetter> holderGetter, List> list) { list.forEach( entityType -> builder.addCriterion( BuiltInRegistries.ENTITY_TYPE.getKey(entityType).toString(), net.minecraft.advancements.critereon.KilledTrigger.TriggerInstance.playerKilledEntity(EntityPredicate.Builder.entity().of(holderGetter, entityType)) ) ); return builder; } protected static Builder addBiomes(Builder builder, HolderLookup.Provider levelRegistry, List> biomes) { HolderGetter holderGetter = levelRegistry.lookupOrThrow(Registries.BIOME); for (ResourceKey resourceKey : biomes) { builder.addCriterion( resourceKey.location().toString(), PlayerTrigger.TriggerInstance.located(net.minecraft.advancements.critereon.LocationPredicate.Builder.inBiome(holderGetter.getOrThrow(resourceKey))) ); } return builder; } }