1037 lines
40 KiB
Java
1037 lines
40 KiB
Java
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.Advancement;
|
|
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.critereon.BlockPredicate;
|
|
import net.minecraft.advancements.critereon.ChanneledLightningTrigger;
|
|
import net.minecraft.advancements.critereon.DamagePredicate;
|
|
import net.minecraft.advancements.critereon.DamageSourcePredicate;
|
|
import net.minecraft.advancements.critereon.DistancePredicate;
|
|
import net.minecraft.advancements.critereon.DistanceTrigger;
|
|
import net.minecraft.advancements.critereon.EntityEquipmentPredicate;
|
|
import net.minecraft.advancements.critereon.EntityPredicate;
|
|
import net.minecraft.advancements.critereon.FallAfterExplosionTrigger;
|
|
import net.minecraft.advancements.critereon.InventoryChangeTrigger;
|
|
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.KilledByCrossbowTrigger;
|
|
import net.minecraft.advancements.critereon.KilledTrigger;
|
|
import net.minecraft.advancements.critereon.LightningBoltPredicate;
|
|
import net.minecraft.advancements.critereon.LightningStrikeTrigger;
|
|
import net.minecraft.advancements.critereon.LocationPredicate;
|
|
import net.minecraft.advancements.critereon.LootTableTrigger;
|
|
import net.minecraft.advancements.critereon.MinMaxBounds;
|
|
import net.minecraft.advancements.critereon.PlayerHurtEntityTrigger;
|
|
import net.minecraft.advancements.critereon.PlayerInteractTrigger;
|
|
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.SlideDownBlockTrigger;
|
|
import net.minecraft.advancements.critereon.StatePropertiesPredicate;
|
|
import net.minecraft.advancements.critereon.SummonedEntityTrigger;
|
|
import net.minecraft.advancements.critereon.TagPredicate;
|
|
import net.minecraft.advancements.critereon.TargetBlockTrigger;
|
|
import net.minecraft.advancements.critereon.TradeTrigger;
|
|
import net.minecraft.advancements.critereon.UsedTotemTrigger;
|
|
import net.minecraft.advancements.critereon.UsingItemTrigger;
|
|
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<EntityType<?>> 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<LightningStrikeTrigger.TriggerInstance> fireCountAndBystander(MinMaxBounds.Ints fireCount, Optional<EntityPredicate> bystander) {
|
|
return LightningStrikeTrigger.TriggerInstance.lightningStrike(
|
|
Optional.of(
|
|
EntityPredicate.Builder.entity()
|
|
.distance(DistancePredicate.absolute(MinMaxBounds.Doubles.atMost(30.0)))
|
|
.subPredicate(LightningBoltPredicate.blockSetOnFire(fireCount))
|
|
.build()
|
|
),
|
|
bystander
|
|
);
|
|
}
|
|
|
|
private static Criterion<UsingItemTrigger.TriggerInstance> lookAtThroughItem(EntityType<?> entity, Item item) {
|
|
return UsingItemTrigger.TriggerInstance.lookingAt(
|
|
EntityPredicate.Builder.entity().subPredicate(PlayerPredicate.Builder.player().setLookingAt(EntityPredicate.Builder.entity().of(entity)).build()),
|
|
ItemPredicate.Builder.item().of(item)
|
|
);
|
|
}
|
|
|
|
@Override
|
|
public void generate(HolderLookup.Provider registries, Consumer<AdvancementHolder> writer) {
|
|
AdvancementHolder advancementHolder = Advancement.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(AdvancementRequirements.Strategy.OR)
|
|
.addCriterion("killed_something", KilledTrigger.TriggerInstance.playerKilledEntity())
|
|
.addCriterion("killed_by_something", KilledTrigger.TriggerInstance.entityKilledPlayer())
|
|
.save(writer, "adventure/root");
|
|
AdvancementHolder advancementHolder2 = Advancement.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 = Advancement.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", TradeTrigger.TriggerInstance.tradedWithVillager())
|
|
.save(writer, "adventure/trade");
|
|
Advancement.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",
|
|
TradeTrigger.TriggerInstance.tradedWithVillager(
|
|
EntityPredicate.Builder.entity().located(LocationPredicate.Builder.atYLocation(MinMaxBounds.Doubles.atLeast(319.0)))
|
|
)
|
|
)
|
|
.save(writer, "adventure/trade_at_world_height");
|
|
AdvancementHolder advancementHolder4 = createMonsterHunterAdvancement(advancementHolder, writer, MOBS_TO_KILL);
|
|
AdvancementHolder advancementHolder5 = Advancement.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",
|
|
PlayerHurtEntityTrigger.TriggerInstance.playerHurtEntityWithDamage(
|
|
DamagePredicate.Builder.damageInstance()
|
|
.type(
|
|
DamageSourcePredicate.Builder.damageType()
|
|
.tag(TagPredicate.is(DamageTypeTags.IS_PROJECTILE))
|
|
.direct(EntityPredicate.Builder.entity().of(EntityTypeTags.ARROWS))
|
|
)
|
|
)
|
|
)
|
|
.save(writer, "adventure/shoot_arrow");
|
|
AdvancementHolder advancementHolder6 = Advancement.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",
|
|
PlayerHurtEntityTrigger.TriggerInstance.playerHurtEntityWithDamage(
|
|
DamagePredicate.Builder.damageInstance()
|
|
.type(
|
|
DamageSourcePredicate.Builder.damageType()
|
|
.tag(TagPredicate.is(DamageTypeTags.IS_PROJECTILE))
|
|
.direct(EntityPredicate.Builder.entity().of(EntityType.TRIDENT))
|
|
)
|
|
)
|
|
)
|
|
.save(writer, "adventure/throw_trident");
|
|
Advancement.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", ChanneledLightningTrigger.TriggerInstance.channeledLightning(EntityPredicate.Builder.entity().of(EntityType.VILLAGER)))
|
|
.save(writer, "adventure/very_very_frightening");
|
|
Advancement.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", SummonedEntityTrigger.TriggerInstance.summonedEntity(EntityPredicate.Builder.entity().of(EntityType.IRON_GOLEM)))
|
|
.save(writer, "adventure/summon_iron_golem");
|
|
Advancement.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",
|
|
KilledTrigger.TriggerInstance.playerKilledEntity(
|
|
EntityPredicate.Builder.entity().of(EntityType.SKELETON).distance(DistancePredicate.horizontal(MinMaxBounds.Doubles.atLeast(50.0))),
|
|
DamageSourcePredicate.Builder.damageType().tag(TagPredicate.is(DamageTypeTags.IS_PROJECTILE))
|
|
)
|
|
)
|
|
.save(writer, "adventure/sniper_duel");
|
|
Advancement.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(Items.TOTEM_OF_UNDYING))
|
|
.save(writer, "adventure/totem_of_undying");
|
|
AdvancementHolder advancementHolder7 = Advancement.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(Items.CROSSBOW))
|
|
.save(writer, "adventure/ol_betsy");
|
|
Advancement.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", KilledByCrossbowTrigger.TriggerInstance.crossbowKilled(EntityPredicate.Builder.entity().of(EntityType.PILLAGER)))
|
|
.save(writer, "adventure/whos_the_pillager_now");
|
|
Advancement.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",
|
|
KilledByCrossbowTrigger.TriggerInstance.crossbowKilled(
|
|
EntityPredicate.Builder.entity().of(EntityType.PHANTOM), EntityPredicate.Builder.entity().of(EntityType.PHANTOM)
|
|
)
|
|
)
|
|
.save(writer, "adventure/two_birds_one_arrow");
|
|
Advancement.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", KilledByCrossbowTrigger.TriggerInstance.crossbowKilled(MinMaxBounds.Ints.exactly(5)))
|
|
.save(writer, "adventure/arbalistic");
|
|
HolderLookup.RegistryLookup<BannerPattern> registryLookup = registries.lookupOrThrow(Registries.BANNER_PATTERN);
|
|
AdvancementHolder advancementHolder8 = Advancement.Builder.advancement()
|
|
.parent(advancementHolder)
|
|
.display(
|
|
Raid.getLeaderBannerInstance(registryLookup),
|
|
Component.translatable("advancements.adventure.voluntary_exile.title"),
|
|
Component.translatable("advancements.adventure.voluntary_exile.description"),
|
|
null,
|
|
AdvancementType.TASK,
|
|
true,
|
|
true,
|
|
true
|
|
)
|
|
.addCriterion(
|
|
"voluntary_exile",
|
|
KilledTrigger.TriggerInstance.playerKilledEntity(
|
|
EntityPredicate.Builder.entity().of(EntityTypeTags.RAIDERS).equipment(EntityEquipmentPredicate.captainPredicate(registryLookup))
|
|
)
|
|
)
|
|
.save(writer, "adventure/voluntary_exile");
|
|
Advancement.Builder.advancement()
|
|
.parent(advancementHolder8)
|
|
.display(
|
|
Raid.getLeaderBannerInstance(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");
|
|
Advancement.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", SlideDownBlockTrigger.TriggerInstance.slidesDownBlock(Blocks.HONEY_BLOCK))
|
|
.save(writer, "adventure/honey_block_slide");
|
|
Advancement.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",
|
|
TargetBlockTrigger.TriggerInstance.targetHit(
|
|
MinMaxBounds.Ints.exactly(15),
|
|
Optional.of(EntityPredicate.wrap(EntityPredicate.Builder.entity().distance(DistancePredicate.horizontal(MinMaxBounds.Doubles.atLeast(30.0)))))
|
|
)
|
|
)
|
|
.save(writer, "adventure/bullseye");
|
|
Advancement.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(Blocks.POWDER_SNOW, Items.LEATHER_BOOTS))
|
|
.save(writer, "adventure/walk_on_powder_snow_with_leather_boots");
|
|
Advancement.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(MinMaxBounds.Ints.exactly(0), Optional.of(EntityPredicate.Builder.entity().of(EntityType.VILLAGER).build()))
|
|
)
|
|
.save(writer, "adventure/lightning_rod_with_villager_no_fire");
|
|
AdvancementHolder advancementHolder9 = Advancement.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(EntityType.PARROT, Items.SPYGLASS))
|
|
.save(writer, "adventure/spyglass_at_parrot");
|
|
AdvancementHolder advancementHolder10 = Advancement.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(EntityType.GHAST, Items.SPYGLASS))
|
|
.save(writer, "adventure/spyglass_at_ghast");
|
|
Advancement.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(
|
|
LocationPredicate.Builder.location()
|
|
.setBiomes(HolderSet.direct(registries.lookupOrThrow(Registries.BIOME).getOrThrow(Biomes.MEADOW)))
|
|
.setBlock(BlockPredicate.Builder.block().of(Blocks.JUKEBOX)),
|
|
ItemPredicate.Builder.item().withSubPredicate(ItemSubPredicates.JUKEBOX_PLAYABLE, ItemJukeboxPlayablePredicate.any())
|
|
)
|
|
)
|
|
.save(writer, "adventure/play_jukebox_in_meadows");
|
|
Advancement.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(EntityType.ENDER_DRAGON, Items.SPYGLASS))
|
|
.save(writer, "adventure/spyglass_at_dragon");
|
|
Advancement.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",
|
|
DistanceTrigger.TriggerInstance.fallFromHeight(
|
|
EntityPredicate.Builder.entity().located(LocationPredicate.Builder.atYLocation(MinMaxBounds.Doubles.atMost(-59.0))),
|
|
DistancePredicate.vertical(MinMaxBounds.Doubles.atLeast(379.0)),
|
|
LocationPredicate.Builder.atYLocation(MinMaxBounds.Doubles.atLeast(319.0))
|
|
)
|
|
)
|
|
.save(writer, "adventure/fall_from_world_height");
|
|
Advancement.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", KilledTrigger.TriggerInstance.playerKilledEntityNearSculkCatalyst())
|
|
.save(writer, "adventure/kill_mob_near_sculk_catalyst");
|
|
Advancement.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(Advancement.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");
|
|
Advancement.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(
|
|
ResourceLocation.withDefaultNamespace("decorated_pot"),
|
|
List.of(
|
|
ItemPredicate.Builder.item().of(ItemTags.DECORATED_POT_SHERDS),
|
|
ItemPredicate.Builder.item().of(ItemTags.DECORATED_POT_SHERDS),
|
|
ItemPredicate.Builder.item().of(ItemTags.DECORATED_POT_SHERDS),
|
|
ItemPredicate.Builder.item().of(ItemTags.DECORATED_POT_SHERDS)
|
|
)
|
|
)
|
|
)
|
|
.save(writer, "adventure/craft_decorated_pot_using_only_sherds");
|
|
AdvancementHolder advancementHolder12 = craftingANewLook(Advancement.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(Advancement.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");
|
|
Advancement.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(AdvancementRequirements.Strategy.OR)
|
|
.addCriterion("chiseled_bookshelf", placedBlockReadByComparator(Blocks.CHISELED_BOOKSHELF))
|
|
.addCriterion("comparator", placedComparatorReadingBlock(Blocks.CHISELED_BOOKSHELF))
|
|
.save(writer, "adventure/read_power_of_chiseled_bookshelf");
|
|
Advancement.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",
|
|
PlayerInteractTrigger.TriggerInstance.itemUsedOnEntity(
|
|
ItemPredicate.Builder.item().of(Items.BRUSH), Optional.of(EntityPredicate.wrap(EntityPredicate.Builder.entity().of(EntityType.ARMADILLO)))
|
|
)
|
|
)
|
|
.save(writer, "adventure/brush_armadillo");
|
|
AdvancementHolder advancementHolder13 = Advancement.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(
|
|
LocationPredicate.Builder.inStructure(registries.lookupOrThrow(Registries.STRUCTURE).getOrThrow(BuiltinStructures.TRIAL_CHAMBERS))
|
|
)
|
|
)
|
|
.save(writer, "adventure/minecraft_trials_edition");
|
|
Advancement.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(
|
|
LocationPredicate.Builder.location()
|
|
.setBlock(
|
|
BlockPredicate.Builder.block()
|
|
.of(
|
|
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(StatePropertiesPredicate.Builder.properties().hasProperty(CopperBulbBlock.LIT, true))
|
|
),
|
|
ItemPredicate.Builder.item().of(VanillaHusbandryAdvancements.WAX_SCRAPING_TOOLS)
|
|
)
|
|
)
|
|
.save(writer, "adventure/lighten_up");
|
|
AdvancementHolder advancementHolder14 = Advancement.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(
|
|
LocationPredicate.Builder.location()
|
|
.setBlock(
|
|
BlockPredicate.Builder.block().of(Blocks.VAULT).setProperties(StatePropertiesPredicate.Builder.properties().hasProperty(VaultBlock.OMINOUS, false))
|
|
),
|
|
ItemPredicate.Builder.item().of(Items.TRIAL_KEY)
|
|
)
|
|
)
|
|
.save(writer, "adventure/under_lock_and_key");
|
|
Advancement.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(
|
|
LocationPredicate.Builder.location()
|
|
.setBlock(
|
|
BlockPredicate.Builder.block().of(Blocks.VAULT).setProperties(StatePropertiesPredicate.Builder.properties().hasProperty(VaultBlock.OMINOUS, true))
|
|
),
|
|
ItemPredicate.Builder.item().of(Items.OMINOUS_TRIAL_KEY)
|
|
)
|
|
)
|
|
.save(writer, "adventure/revaulting");
|
|
Advancement.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",
|
|
KilledTrigger.TriggerInstance.playerKilledEntity(
|
|
EntityPredicate.Builder.entity().of(EntityType.BREEZE),
|
|
DamageSourcePredicate.Builder.damageType()
|
|
.tag(TagPredicate.is(DamageTypeTags.IS_PROJECTILE))
|
|
.direct(EntityPredicate.Builder.entity().of(EntityType.BREEZE_WIND_CHARGE))
|
|
)
|
|
)
|
|
.save(writer, "adventure/blowback");
|
|
Advancement.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(ResourceLocation.withDefaultNamespace("crafter")))
|
|
.save(writer, "adventure/crafters_crafting_crafters");
|
|
Advancement.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",
|
|
FallAfterExplosionTrigger.TriggerInstance.fallAfterExplosion(
|
|
DistancePredicate.vertical(MinMaxBounds.Doubles.atLeast(7.0)), EntityPredicate.Builder.entity().of(EntityType.WIND_CHARGE)
|
|
)
|
|
)
|
|
.save(writer, "adventure/who_needs_rockets");
|
|
Advancement.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",
|
|
PlayerHurtEntityTrigger.TriggerInstance.playerHurtEntityWithDamage(
|
|
DamagePredicate.Builder.damageInstance()
|
|
.dealtDamage(MinMaxBounds.Doubles.atLeast(100.0))
|
|
.type(
|
|
DamageSourcePredicate.Builder.damageType()
|
|
.tag(TagPredicate.is(DamageTypeTags.IS_PLAYER_ATTACK))
|
|
.direct(
|
|
EntityPredicate.Builder.entity()
|
|
.of(EntityType.PLAYER)
|
|
.equipment(EntityEquipmentPredicate.Builder.equipment().mainhand(ItemPredicate.Builder.item().of(Items.MACE)))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
.save(writer, "adventure/overoverkill");
|
|
}
|
|
|
|
public static AdvancementHolder createMonsterHunterAdvancement(
|
|
AdvancementHolder advancement, Consumer<AdvancementHolder> output, List<EntityType<?>> typesRequired
|
|
) {
|
|
AdvancementHolder advancementHolder = addMobsToKill(Advancement.Builder.advancement(), typesRequired)
|
|
.parent(advancement)
|
|
.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(AdvancementRequirements.Strategy.OR)
|
|
.save(output, "adventure/kill_a_mob");
|
|
addMobsToKill(Advancement.Builder.advancement(), typesRequired)
|
|
.parent(advancementHolder)
|
|
.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(output, "adventure/kill_all_mobs");
|
|
return advancementHolder;
|
|
}
|
|
|
|
private static Criterion<ItemUsedOnLocationTrigger.TriggerInstance> placedBlockReadByComparator(Block block) {
|
|
LootItemCondition.Builder[] builders = (LootItemCondition.Builder[])ComparatorBlock.FACING.getPossibleValues().stream().map(direction -> {
|
|
StatePropertiesPredicate.Builder builder = StatePropertiesPredicate.Builder.properties().hasProperty(ComparatorBlock.FACING, direction);
|
|
BlockPredicate.Builder builder2 = BlockPredicate.Builder.block().of(Blocks.COMPARATOR).setProperties(builder);
|
|
return LocationCheck.checkLocation(LocationPredicate.Builder.location().setBlock(builder2), new BlockPos(direction.getOpposite().getNormal()));
|
|
}).toArray(LootItemCondition.Builder[]::new);
|
|
return ItemUsedOnLocationTrigger.TriggerInstance.placedBlock(
|
|
LootItemBlockStatePropertyCondition.hasBlockStateProperties(block), AnyOfCondition.anyOf(builders)
|
|
);
|
|
}
|
|
|
|
private static Criterion<ItemUsedOnLocationTrigger.TriggerInstance> placedComparatorReadingBlock(Block block) {
|
|
LootItemCondition.Builder[] builders = (LootItemCondition.Builder[])ComparatorBlock.FACING
|
|
.getPossibleValues()
|
|
.stream()
|
|
.map(
|
|
direction -> {
|
|
StatePropertiesPredicate.Builder builder = StatePropertiesPredicate.Builder.properties().hasProperty(ComparatorBlock.FACING, direction);
|
|
LootItemBlockStatePropertyCondition.Builder builder2 = new LootItemBlockStatePropertyCondition.Builder(Blocks.COMPARATOR).setProperties(builder);
|
|
LootItemCondition.Builder builder3 = LocationCheck.checkLocation(
|
|
LocationPredicate.Builder.location().setBlock(BlockPredicate.Builder.block().of(block)), new BlockPos(direction.getNormal())
|
|
);
|
|
return AllOfCondition.allOf(builder2, builder3);
|
|
}
|
|
)
|
|
.toArray(LootItemCondition.Builder[]::new);
|
|
return ItemUsedOnLocationTrigger.TriggerInstance.placedBlock(AnyOfCondition.anyOf(builders));
|
|
}
|
|
|
|
private static Advancement.Builder smithingWithStyle(Advancement.Builder builder) {
|
|
builder.requirements(AdvancementRequirements.Strategy.AND);
|
|
Set<Item> 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(), RecipeCraftedTrigger.TriggerInstance.craftedItem(trimTemplate.id())));
|
|
return builder;
|
|
}
|
|
|
|
private static Advancement.Builder craftingANewLook(Advancement.Builder builder) {
|
|
builder.requirements(AdvancementRequirements.Strategy.OR);
|
|
VanillaRecipeProvider.smithingTrims()
|
|
.map(VanillaRecipeProvider.TrimTemplate::id)
|
|
.forEach(resourceLocation -> builder.addCriterion("armor_trimmed_" + resourceLocation, RecipeCraftedTrigger.TriggerInstance.craftedItem(resourceLocation)));
|
|
return builder;
|
|
}
|
|
|
|
private static Advancement.Builder respectingTheRemnantsCriterions(Advancement.Builder builder) {
|
|
List<Pair<String, Criterion<LootTableTrigger.TriggerInstance>>> 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", InventoryChangeTrigger.TriggerInstance.hasItems(ItemPredicate.Builder.item().of(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<AdvancementHolder> writer, AdvancementHolder parent, MultiNoiseBiomeSourceParameterList.Preset preset
|
|
) {
|
|
addBiomes(Advancement.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 Advancement.Builder addMobsToKill(Advancement.Builder builder, List<EntityType<?>> mobs) {
|
|
mobs.forEach(
|
|
entityType -> builder.addCriterion(
|
|
BuiltInRegistries.ENTITY_TYPE.getKey(entityType).toString(),
|
|
KilledTrigger.TriggerInstance.playerKilledEntity(EntityPredicate.Builder.entity().of(entityType))
|
|
)
|
|
);
|
|
return builder;
|
|
}
|
|
|
|
protected static Advancement.Builder addBiomes(Advancement.Builder builder, HolderLookup.Provider levelRegistry, List<ResourceKey<Biome>> biomes) {
|
|
HolderGetter<Biome> holderGetter = levelRegistry.lookupOrThrow(Registries.BIOME);
|
|
|
|
for (ResourceKey<Biome> resourceKey : biomes) {
|
|
builder.addCriterion(
|
|
resourceKey.location().toString(), PlayerTrigger.TriggerInstance.located(LocationPredicate.Builder.inBiome(holderGetter.getOrThrow(resourceKey)))
|
|
);
|
|
}
|
|
|
|
return builder;
|
|
}
|
|
}
|