package net.minecraft.advancements.critereon; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import java.util.Optional; import net.minecraft.advancements.CriteriaTriggers; import net.minecraft.advancements.Criterion; import net.minecraft.advancements.critereon.LocationPredicate.Builder; import net.minecraft.advancements.critereon.SimpleCriterionTrigger.SimpleInstance; import net.minecraft.core.HolderGetter; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; public class PlayerTrigger extends SimpleCriterionTrigger { @Override public Codec codec() { return PlayerTrigger.TriggerInstance.CODEC; } public void trigger(ServerPlayer player) { this.trigger(player, triggerInstance -> true); } public record TriggerInstance(Optional player) implements SimpleInstance { public static final Codec CODEC = RecordCodecBuilder.create( instance -> instance.group(EntityPredicate.ADVANCEMENT_CODEC.optionalFieldOf("player").forGetter(PlayerTrigger.TriggerInstance::player)) .apply(instance, PlayerTrigger.TriggerInstance::new) ); public static Criterion located(Builder location) { return CriteriaTriggers.LOCATION .createCriterion(new PlayerTrigger.TriggerInstance(Optional.of(EntityPredicate.wrap(EntityPredicate.Builder.entity().located(location))))); } public static Criterion located(EntityPredicate.Builder entity) { return CriteriaTriggers.LOCATION.createCriterion(new PlayerTrigger.TriggerInstance(Optional.of(EntityPredicate.wrap(entity.build())))); } public static Criterion located(Optional entity) { return CriteriaTriggers.LOCATION.createCriterion(new PlayerTrigger.TriggerInstance(EntityPredicate.wrap(entity))); } public static Criterion sleptInBed() { return CriteriaTriggers.SLEPT_IN_BED.createCriterion(new PlayerTrigger.TriggerInstance(Optional.empty())); } public static Criterion raidWon() { return CriteriaTriggers.RAID_WIN.createCriterion(new PlayerTrigger.TriggerInstance(Optional.empty())); } public static Criterion avoidVibration() { return CriteriaTriggers.AVOID_VIBRATION.createCriterion(new PlayerTrigger.TriggerInstance(Optional.empty())); } public static Criterion tick() { return CriteriaTriggers.TICK.createCriterion(new PlayerTrigger.TriggerInstance(Optional.empty())); } public static Criterion walkOnBlockWithEquipment( HolderGetter blockRegistry, HolderGetter itemRegistry, Block block, Item equipment ) { return located( EntityPredicate.Builder.entity() .equipment(EntityEquipmentPredicate.Builder.equipment().feet(ItemPredicate.Builder.item().of(itemRegistry, equipment))) .steppingOn(Builder.location().setBlock(BlockPredicate.Builder.block().of(blockRegistry, block))) ); } } }