567 lines
21 KiB
Java
567 lines
21 KiB
Java
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<AdvancementHolder> writer) {
|
|
HolderGetter<EntityType<?>> holderGetter = registries.lookupOrThrow(Registries.ENTITY_TYPE);
|
|
HolderGetter<Item> holderGetter2 = registries.lookupOrThrow(Registries.ITEM);
|
|
HolderGetter<Block> 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");
|
|
}
|
|
}
|