package net.minecraft.data.advancements.packs; import java.util.Optional; import java.util.function.Consumer; import net.minecraft.advancements.Advancement; import net.minecraft.advancements.AdvancementHolder; import net.minecraft.advancements.AdvancementRewards; import net.minecraft.advancements.AdvancementType; import net.minecraft.advancements.AdvancementRequirements.Strategy; import net.minecraft.advancements.critereon.BlockPredicate; import net.minecraft.advancements.critereon.ContextAwarePredicate; import net.minecraft.advancements.critereon.DistancePredicate; import net.minecraft.advancements.critereon.EntityEquipmentPredicate; import net.minecraft.advancements.critereon.EntityPredicate; import net.minecraft.advancements.critereon.InventoryChangeTrigger; import net.minecraft.advancements.critereon.ItemPredicate; import net.minecraft.advancements.critereon.LootTableTrigger; import net.minecraft.advancements.critereon.MinMaxBounds; import net.minecraft.advancements.critereon.TagPredicate; import net.minecraft.advancements.critereon.ChangeDimensionTrigger.TriggerInstance; import net.minecraft.advancements.critereon.DamageSourcePredicate.Builder; import net.minecraft.core.HolderGetter; import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.Registries; import net.minecraft.data.advancements.AdvancementSubProvider; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.DamageTypeTags; import net.minecraft.tags.ItemTags; import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.monster.piglin.PiglinAi; import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; import net.minecraft.world.level.biome.MultiNoiseBiomeSourceParameterList.Preset; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.RespawnAnchorBlock; import net.minecraft.world.level.levelgen.structure.BuiltinStructures; import net.minecraft.world.level.storage.loot.BuiltInLootTables; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.predicates.LootItemEntityPropertyCondition; public class VanillaNetherAdvancements implements AdvancementSubProvider { @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 = Advancement.Builder.advancement() .display( Blocks.RED_NETHER_BRICKS, Component.translatable("advancements.nether.root.title"), Component.translatable("advancements.nether.root.description"), ResourceLocation.withDefaultNamespace("gui/advancements/backgrounds/nether"), AdvancementType.TASK, false, false, false ) .addCriterion("entered_nether", TriggerInstance.changedDimensionTo(Level.NETHER)) .save(writer, "nether/root"); AdvancementHolder advancementHolder2 = Advancement.Builder.advancement() .parent(advancementHolder) .display( Items.FIRE_CHARGE, Component.translatable("advancements.nether.return_to_sender.title"), Component.translatable("advancements.nether.return_to_sender.description"), null, AdvancementType.CHALLENGE, true, true, false ) .rewards(AdvancementRewards.Builder.experience(50)) .addCriterion( "killed_ghast", net.minecraft.advancements.critereon.KilledTrigger.TriggerInstance.playerKilledEntity( EntityPredicate.Builder.entity().of(holderGetter, EntityType.GHAST), Builder.damageType().tag(TagPredicate.is(DamageTypeTags.IS_PROJECTILE)).direct(EntityPredicate.Builder.entity().of(holderGetter, EntityType.FIREBALL)) ) ) .save(writer, "nether/return_to_sender"); AdvancementHolder advancementHolder3 = Advancement.Builder.advancement() .parent(advancementHolder) .display( Blocks.NETHER_BRICKS, Component.translatable("advancements.nether.find_fortress.title"), Component.translatable("advancements.nether.find_fortress.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion( "fortress", net.minecraft.advancements.critereon.PlayerTrigger.TriggerInstance.located( net.minecraft.advancements.critereon.LocationPredicate.Builder.inStructure( registries.lookupOrThrow(Registries.STRUCTURE).getOrThrow(BuiltinStructures.FORTRESS) ) ) ) .save(writer, "nether/find_fortress"); Advancement.Builder.advancement() .parent(advancementHolder) .display( Items.MAP, Component.translatable("advancements.nether.fast_travel.title"), Component.translatable("advancements.nether.fast_travel.description"), null, AdvancementType.CHALLENGE, true, true, false ) .rewards(AdvancementRewards.Builder.experience(100)) .addCriterion( "travelled", net.minecraft.advancements.critereon.DistanceTrigger.TriggerInstance.travelledThroughNether( DistancePredicate.horizontal(MinMaxBounds.Doubles.atLeast(7000.0)) ) ) .save(writer, "nether/fast_travel"); Advancement.Builder.advancement() .parent(advancementHolder2) .display( Items.GHAST_TEAR, Component.translatable("advancements.nether.uneasy_alliance.title"), Component.translatable("advancements.nether.uneasy_alliance.description"), null, AdvancementType.CHALLENGE, true, true, false ) .rewards(AdvancementRewards.Builder.experience(100)) .addCriterion( "killed_ghast", net.minecraft.advancements.critereon.KilledTrigger.TriggerInstance.playerKilledEntity( EntityPredicate.Builder.entity() .of(holderGetter, EntityType.GHAST) .located(net.minecraft.advancements.critereon.LocationPredicate.Builder.inDimension(Level.OVERWORLD)) ) ) .save(writer, "nether/uneasy_alliance"); AdvancementHolder advancementHolder4 = Advancement.Builder.advancement() .parent(advancementHolder3) .display( Blocks.WITHER_SKELETON_SKULL, Component.translatable("advancements.nether.get_wither_skull.title"), Component.translatable("advancements.nether.get_wither_skull.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion("wither_skull", InventoryChangeTrigger.TriggerInstance.hasItems(Blocks.WITHER_SKELETON_SKULL)) .save(writer, "nether/get_wither_skull"); AdvancementHolder advancementHolder5 = Advancement.Builder.advancement() .parent(advancementHolder4) .display( Items.NETHER_STAR, Component.translatable("advancements.nether.summon_wither.title"), Component.translatable("advancements.nether.summon_wither.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion( "summoned", net.minecraft.advancements.critereon.SummonedEntityTrigger.TriggerInstance.summonedEntity( EntityPredicate.Builder.entity().of(holderGetter, EntityType.WITHER) ) ) .save(writer, "nether/summon_wither"); AdvancementHolder advancementHolder6 = Advancement.Builder.advancement() .parent(advancementHolder3) .display( Items.BLAZE_ROD, Component.translatable("advancements.nether.obtain_blaze_rod.title"), Component.translatable("advancements.nether.obtain_blaze_rod.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion("blaze_rod", InventoryChangeTrigger.TriggerInstance.hasItems(Items.BLAZE_ROD)) .save(writer, "nether/obtain_blaze_rod"); AdvancementHolder advancementHolder7 = Advancement.Builder.advancement() .parent(advancementHolder5) .display( Blocks.BEACON, Component.translatable("advancements.nether.create_beacon.title"), Component.translatable("advancements.nether.create_beacon.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion("beacon", net.minecraft.advancements.critereon.ConstructBeaconTrigger.TriggerInstance.constructedBeacon(MinMaxBounds.Ints.atLeast(1))) .save(writer, "nether/create_beacon"); Advancement.Builder.advancement() .parent(advancementHolder7) .display( Blocks.BEACON, Component.translatable("advancements.nether.create_full_beacon.title"), Component.translatable("advancements.nether.create_full_beacon.description"), null, AdvancementType.GOAL, true, true, false ) .addCriterion("beacon", net.minecraft.advancements.critereon.ConstructBeaconTrigger.TriggerInstance.constructedBeacon(MinMaxBounds.Ints.exactly(4))) .save(writer, "nether/create_full_beacon"); AdvancementHolder advancementHolder8 = Advancement.Builder.advancement() .parent(advancementHolder6) .display( Items.POTION, Component.translatable("advancements.nether.brew_potion.title"), Component.translatable("advancements.nether.brew_potion.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion("potion", net.minecraft.advancements.critereon.BrewedPotionTrigger.TriggerInstance.brewedPotion()) .save(writer, "nether/brew_potion"); AdvancementHolder advancementHolder9 = Advancement.Builder.advancement() .parent(advancementHolder8) .display( Items.MILK_BUCKET, Component.translatable("advancements.nether.all_potions.title"), Component.translatable("advancements.nether.all_potions.description"), null, AdvancementType.CHALLENGE, true, true, false ) .rewards(AdvancementRewards.Builder.experience(100)) .addCriterion( "all_effects", net.minecraft.advancements.critereon.EffectsChangedTrigger.TriggerInstance.hasEffects( net.minecraft.advancements.critereon.MobEffectsPredicate.Builder.effects() .and(MobEffects.SPEED) .and(MobEffects.SLOWNESS) .and(MobEffects.STRENGTH) .and(MobEffects.JUMP_BOOST) .and(MobEffects.REGENERATION) .and(MobEffects.FIRE_RESISTANCE) .and(MobEffects.WATER_BREATHING) .and(MobEffects.INVISIBILITY) .and(MobEffects.NIGHT_VISION) .and(MobEffects.WEAKNESS) .and(MobEffects.POISON) .and(MobEffects.SLOW_FALLING) .and(MobEffects.RESISTANCE) .and(MobEffects.OOZING) .and(MobEffects.INFESTED) .and(MobEffects.WIND_CHARGED) .and(MobEffects.WEAVING) ) ) .save(writer, "nether/all_potions"); Advancement.Builder.advancement() .parent(advancementHolder9) .display( Items.BUCKET, Component.translatable("advancements.nether.all_effects.title"), Component.translatable("advancements.nether.all_effects.description"), null, AdvancementType.CHALLENGE, true, true, true ) .rewards(AdvancementRewards.Builder.experience(1000)) .addCriterion( "all_effects", net.minecraft.advancements.critereon.EffectsChangedTrigger.TriggerInstance.hasEffects( net.minecraft.advancements.critereon.MobEffectsPredicate.Builder.effects() .and(MobEffects.SPEED) .and(MobEffects.SLOWNESS) .and(MobEffects.STRENGTH) .and(MobEffects.JUMP_BOOST) .and(MobEffects.REGENERATION) .and(MobEffects.FIRE_RESISTANCE) .and(MobEffects.WATER_BREATHING) .and(MobEffects.INVISIBILITY) .and(MobEffects.NIGHT_VISION) .and(MobEffects.WEAKNESS) .and(MobEffects.POISON) .and(MobEffects.WITHER) .and(MobEffects.HASTE) .and(MobEffects.MINING_FATIGUE) .and(MobEffects.LEVITATION) .and(MobEffects.GLOWING) .and(MobEffects.ABSORPTION) .and(MobEffects.HUNGER) .and(MobEffects.NAUSEA) .and(MobEffects.RESISTANCE) .and(MobEffects.SLOW_FALLING) .and(MobEffects.CONDUIT_POWER) .and(MobEffects.DOLPHINS_GRACE) .and(MobEffects.BLINDNESS) .and(MobEffects.BAD_OMEN) .and(MobEffects.HERO_OF_THE_VILLAGE) .and(MobEffects.DARKNESS) .and(MobEffects.OOZING) .and(MobEffects.INFESTED) .and(MobEffects.WIND_CHARGED) .and(MobEffects.WEAVING) .and(MobEffects.TRIAL_OMEN) .and(MobEffects.RAID_OMEN) ) ) .save(writer, "nether/all_effects"); AdvancementHolder advancementHolder10 = Advancement.Builder.advancement() .parent(advancementHolder) .display( Items.ANCIENT_DEBRIS, Component.translatable("advancements.nether.obtain_ancient_debris.title"), Component.translatable("advancements.nether.obtain_ancient_debris.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion("ancient_debris", InventoryChangeTrigger.TriggerInstance.hasItems(Items.ANCIENT_DEBRIS)) .save(writer, "nether/obtain_ancient_debris"); Advancement.Builder.advancement() .parent(advancementHolder10) .display( Items.NETHERITE_CHESTPLATE, Component.translatable("advancements.nether.netherite_armor.title"), Component.translatable("advancements.nether.netherite_armor.description"), null, AdvancementType.CHALLENGE, true, true, false ) .rewards(AdvancementRewards.Builder.experience(100)) .addCriterion( "netherite_armor", InventoryChangeTrigger.TriggerInstance.hasItems(Items.NETHERITE_HELMET, Items.NETHERITE_CHESTPLATE, Items.NETHERITE_LEGGINGS, Items.NETHERITE_BOOTS) ) .save(writer, "nether/netherite_armor"); AdvancementHolder advancementHolder11 = Advancement.Builder.advancement() .parent(advancementHolder) .display( Items.CRYING_OBSIDIAN, Component.translatable("advancements.nether.obtain_crying_obsidian.title"), Component.translatable("advancements.nether.obtain_crying_obsidian.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion("crying_obsidian", InventoryChangeTrigger.TriggerInstance.hasItems(Items.CRYING_OBSIDIAN)) .save(writer, "nether/obtain_crying_obsidian"); Advancement.Builder.advancement() .parent(advancementHolder11) .display( Items.RESPAWN_ANCHOR, Component.translatable("advancements.nether.charge_respawn_anchor.title"), Component.translatable("advancements.nether.charge_respawn_anchor.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion( "charge_respawn_anchor", net.minecraft.advancements.critereon.ItemUsedOnLocationTrigger.TriggerInstance.itemUsedOnBlock( net.minecraft.advancements.critereon.LocationPredicate.Builder.location() .setBlock( BlockPredicate.Builder.block() .of(holderGetter3, Blocks.RESPAWN_ANCHOR) .setProperties(net.minecraft.advancements.critereon.StatePropertiesPredicate.Builder.properties().hasProperty(RespawnAnchorBlock.CHARGE, 4)) ), ItemPredicate.Builder.item().of(holderGetter2, Blocks.GLOWSTONE) ) ) .save(writer, "nether/charge_respawn_anchor"); AdvancementHolder advancementHolder12 = Advancement.Builder.advancement() .parent(advancementHolder) .display( Items.WARPED_FUNGUS_ON_A_STICK, Component.translatable("advancements.nether.ride_strider.title"), Component.translatable("advancements.nether.ride_strider.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion( "used_warped_fungus_on_a_stick", net.minecraft.advancements.critereon.ItemDurabilityTrigger.TriggerInstance.changedDurability( Optional.of(EntityPredicate.wrap(EntityPredicate.Builder.entity().vehicle(EntityPredicate.Builder.entity().of(holderGetter, EntityType.STRIDER)))), Optional.of(ItemPredicate.Builder.item().of(holderGetter2, Items.WARPED_FUNGUS_ON_A_STICK).build()), MinMaxBounds.Ints.ANY ) ) .save(writer, "nether/ride_strider"); Advancement.Builder.advancement() .parent(advancementHolder12) .display( Items.WARPED_FUNGUS_ON_A_STICK, Component.translatable("advancements.nether.ride_strider_in_overworld_lava.title"), Component.translatable("advancements.nether.ride_strider_in_overworld_lava.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion( "ride_entity_distance", net.minecraft.advancements.critereon.DistanceTrigger.TriggerInstance.rideEntityInLava( EntityPredicate.Builder.entity() .located(net.minecraft.advancements.critereon.LocationPredicate.Builder.inDimension(Level.OVERWORLD)) .vehicle(EntityPredicate.Builder.entity().of(holderGetter, EntityType.STRIDER)), DistancePredicate.horizontal(MinMaxBounds.Doubles.atLeast(50.0)) ) ) .save(writer, "nether/ride_strider_in_overworld_lava"); VanillaAdventureAdvancements.addBiomes(Advancement.Builder.advancement(), registries, Preset.NETHER.usedBiomes().toList()) .parent(advancementHolder12) .display( Items.NETHERITE_BOOTS, Component.translatable("advancements.nether.explore_nether.title"), Component.translatable("advancements.nether.explore_nether.description"), null, AdvancementType.CHALLENGE, true, true, false ) .rewards(AdvancementRewards.Builder.experience(500)) .save(writer, "nether/explore_nether"); AdvancementHolder advancementHolder13 = Advancement.Builder.advancement() .parent(advancementHolder) .display( Items.POLISHED_BLACKSTONE_BRICKS, Component.translatable("advancements.nether.find_bastion.title"), Component.translatable("advancements.nether.find_bastion.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion( "bastion", net.minecraft.advancements.critereon.PlayerTrigger.TriggerInstance.located( net.minecraft.advancements.critereon.LocationPredicate.Builder.inStructure( registries.lookupOrThrow(Registries.STRUCTURE).getOrThrow(BuiltinStructures.BASTION_REMNANT) ) ) ) .save(writer, "nether/find_bastion"); Advancement.Builder.advancement() .parent(advancementHolder13) .display( Blocks.CHEST, Component.translatable("advancements.nether.loot_bastion.title"), Component.translatable("advancements.nether.loot_bastion.description"), null, AdvancementType.TASK, true, true, false ) .requirements(Strategy.OR) .addCriterion("loot_bastion_other", LootTableTrigger.TriggerInstance.lootTableUsed(BuiltInLootTables.BASTION_OTHER)) .addCriterion("loot_bastion_treasure", LootTableTrigger.TriggerInstance.lootTableUsed(BuiltInLootTables.BASTION_TREASURE)) .addCriterion("loot_bastion_hoglin_stable", LootTableTrigger.TriggerInstance.lootTableUsed(BuiltInLootTables.BASTION_HOGLIN_STABLE)) .addCriterion("loot_bastion_bridge", LootTableTrigger.TriggerInstance.lootTableUsed(BuiltInLootTables.BASTION_BRIDGE)) .save(writer, "nether/loot_bastion"); ContextAwarePredicate contextAwarePredicate = ContextAwarePredicate.create( LootItemEntityPropertyCondition.hasProperties( LootContext.EntityTarget.THIS, EntityPredicate.Builder.entity() .equipment(EntityEquipmentPredicate.Builder.equipment().head(ItemPredicate.Builder.item().of(holderGetter2, ItemTags.PIGLIN_SAFE_ARMOR))) ) .invert() .build(), LootItemEntityPropertyCondition.hasProperties( LootContext.EntityTarget.THIS, EntityPredicate.Builder.entity() .equipment(EntityEquipmentPredicate.Builder.equipment().chest(ItemPredicate.Builder.item().of(holderGetter2, ItemTags.PIGLIN_SAFE_ARMOR))) ) .invert() .build(), LootItemEntityPropertyCondition.hasProperties( LootContext.EntityTarget.THIS, EntityPredicate.Builder.entity() .equipment(EntityEquipmentPredicate.Builder.equipment().legs(ItemPredicate.Builder.item().of(holderGetter2, ItemTags.PIGLIN_SAFE_ARMOR))) ) .invert() .build(), LootItemEntityPropertyCondition.hasProperties( LootContext.EntityTarget.THIS, EntityPredicate.Builder.entity() .equipment(EntityEquipmentPredicate.Builder.equipment().feet(ItemPredicate.Builder.item().of(holderGetter2, ItemTags.PIGLIN_SAFE_ARMOR))) ) .invert() .build() ); Advancement.Builder.advancement() .parent(advancementHolder) .requirements(Strategy.OR) .display( Items.GOLD_INGOT, Component.translatable("advancements.nether.distract_piglin.title"), Component.translatable("advancements.nether.distract_piglin.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion( "distract_piglin", net.minecraft.advancements.critereon.PickedUpItemTrigger.TriggerInstance.thrownItemPickedUpByEntity( contextAwarePredicate, Optional.of(ItemPredicate.Builder.item().of(holderGetter2, ItemTags.PIGLIN_LOVED).build()), Optional.of( EntityPredicate.wrap( EntityPredicate.Builder.entity() .of(holderGetter, EntityType.PIGLIN) .flags(net.minecraft.advancements.critereon.EntityFlagsPredicate.Builder.flags().setIsBaby(false)) ) ) ) ) .addCriterion( "distract_piglin_directly", net.minecraft.advancements.critereon.PlayerInteractTrigger.TriggerInstance.itemUsedOnEntity( Optional.of(contextAwarePredicate), ItemPredicate.Builder.item().of(holderGetter2, PiglinAi.BARTERING_ITEM), Optional.of( EntityPredicate.wrap( EntityPredicate.Builder.entity() .of(holderGetter, EntityType.PIGLIN) .flags(net.minecraft.advancements.critereon.EntityFlagsPredicate.Builder.flags().setIsBaby(false)) ) ) ) ) .save(writer, "nether/distract_piglin"); } }