package net.minecraft.data.advancements.packs; import java.util.function.Consumer; 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.critereon.DistancePredicate; import net.minecraft.advancements.critereon.EntityPredicate; import net.minecraft.advancements.critereon.PlayerTrigger; import net.minecraft.advancements.critereon.ChangeDimensionTrigger.TriggerInstance; import net.minecraft.advancements.critereon.MinMaxBounds.Doubles; 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.world.entity.EntityType; import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.levelgen.structure.BuiltinStructures; public class VanillaTheEndAdvancements implements AdvancementSubProvider { @Override public void generate(HolderLookup.Provider registries, Consumer writer) { HolderGetter> holderGetter = registries.lookupOrThrow(Registries.ENTITY_TYPE); AdvancementHolder advancementHolder = Builder.advancement() .display( Blocks.END_STONE, Component.translatable("advancements.end.root.title"), Component.translatable("advancements.end.root.description"), ResourceLocation.withDefaultNamespace("textures/gui/advancements/backgrounds/end.png"), AdvancementType.TASK, false, false, false ) .addCriterion("entered_end", TriggerInstance.changedDimensionTo(Level.END)) .save(writer, "end/root"); AdvancementHolder advancementHolder2 = Builder.advancement() .parent(advancementHolder) .display( Blocks.DRAGON_HEAD, Component.translatable("advancements.end.kill_dragon.title"), Component.translatable("advancements.end.kill_dragon.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion( "killed_dragon", net.minecraft.advancements.critereon.KilledTrigger.TriggerInstance.playerKilledEntity( EntityPredicate.Builder.entity().of(holderGetter, EntityType.ENDER_DRAGON) ) ) .save(writer, "end/kill_dragon"); AdvancementHolder advancementHolder3 = Builder.advancement() .parent(advancementHolder2) .display( Items.ENDER_PEARL, Component.translatable("advancements.end.enter_end_gateway.title"), Component.translatable("advancements.end.enter_end_gateway.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion("entered_end_gateway", net.minecraft.advancements.critereon.EnterBlockTrigger.TriggerInstance.entersBlock(Blocks.END_GATEWAY)) .save(writer, "end/enter_end_gateway"); Builder.advancement() .parent(advancementHolder2) .display( Items.END_CRYSTAL, Component.translatable("advancements.end.respawn_dragon.title"), Component.translatable("advancements.end.respawn_dragon.description"), null, AdvancementType.GOAL, true, true, false ) .addCriterion( "summoned_dragon", net.minecraft.advancements.critereon.SummonedEntityTrigger.TriggerInstance.summonedEntity( EntityPredicate.Builder.entity().of(holderGetter, EntityType.ENDER_DRAGON) ) ) .save(writer, "end/respawn_dragon"); AdvancementHolder advancementHolder4 = Builder.advancement() .parent(advancementHolder3) .display( Blocks.PURPUR_BLOCK, Component.translatable("advancements.end.find_end_city.title"), Component.translatable("advancements.end.find_end_city.description"), null, AdvancementType.TASK, true, true, false ) .addCriterion( "in_city", PlayerTrigger.TriggerInstance.located( net.minecraft.advancements.critereon.LocationPredicate.Builder.inStructure( registries.lookupOrThrow(Registries.STRUCTURE).getOrThrow(BuiltinStructures.END_CITY) ) ) ) .save(writer, "end/find_end_city"); Builder.advancement() .parent(advancementHolder2) .display( Items.DRAGON_BREATH, Component.translatable("advancements.end.dragon_breath.title"), Component.translatable("advancements.end.dragon_breath.description"), null, AdvancementType.GOAL, true, true, false ) .addCriterion("dragon_breath", net.minecraft.advancements.critereon.InventoryChangeTrigger.TriggerInstance.hasItems(Items.DRAGON_BREATH)) .save(writer, "end/dragon_breath"); Builder.advancement() .parent(advancementHolder4) .display( Items.SHULKER_SHELL, Component.translatable("advancements.end.levitate.title"), Component.translatable("advancements.end.levitate.description"), null, AdvancementType.CHALLENGE, true, true, false ) .rewards(AdvancementRewards.Builder.experience(50)) .addCriterion( "levitated", net.minecraft.advancements.critereon.LevitationTrigger.TriggerInstance.levitated(DistancePredicate.vertical(Doubles.atLeast(50.0))) ) .save(writer, "end/levitate"); Builder.advancement() .parent(advancementHolder4) .display( Items.ELYTRA, Component.translatable("advancements.end.elytra.title"), Component.translatable("advancements.end.elytra.description"), null, AdvancementType.GOAL, true, true, false ) .addCriterion("elytra", net.minecraft.advancements.critereon.InventoryChangeTrigger.TriggerInstance.hasItems(Items.ELYTRA)) .save(writer, "end/elytra"); Builder.advancement() .parent(advancementHolder2) .display( Blocks.DRAGON_EGG, Component.translatable("advancements.end.dragon_egg.title"), Component.translatable("advancements.end.dragon_egg.description"), null, AdvancementType.GOAL, true, true, false ) .addCriterion("dragon_egg", net.minecraft.advancements.critereon.InventoryChangeTrigger.TriggerInstance.hasItems(Blocks.DRAGON_EGG)) .save(writer, "end/dragon_egg"); } }