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.core.Holder; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; public class BeeNestDestroyedTrigger extends SimpleCriterionTrigger { @Override public Codec codec() { return BeeNestDestroyedTrigger.TriggerInstance.CODEC; } public void trigger(ServerPlayer player, BlockState state, ItemStack stack, int numBees) { this.trigger(player, triggerInstance -> triggerInstance.matches(state, stack, numBees)); } public record TriggerInstance( Optional player, Optional> block, Optional item, MinMaxBounds.Ints beesInside ) implements SimpleCriterionTrigger.SimpleInstance { public static final Codec CODEC = RecordCodecBuilder.create( instance -> instance.group( EntityPredicate.ADVANCEMENT_CODEC.optionalFieldOf("player").forGetter(BeeNestDestroyedTrigger.TriggerInstance::player), BuiltInRegistries.BLOCK.holderByNameCodec().optionalFieldOf("block").forGetter(BeeNestDestroyedTrigger.TriggerInstance::block), ItemPredicate.CODEC.optionalFieldOf("item").forGetter(BeeNestDestroyedTrigger.TriggerInstance::item), MinMaxBounds.Ints.CODEC.optionalFieldOf("num_bees_inside", MinMaxBounds.Ints.ANY).forGetter(BeeNestDestroyedTrigger.TriggerInstance::beesInside) ) .apply(instance, BeeNestDestroyedTrigger.TriggerInstance::new) ); public static Criterion destroyedBeeNest(Block block, ItemPredicate.Builder item, MinMaxBounds.Ints numBees) { return CriteriaTriggers.BEE_NEST_DESTROYED .createCriterion( new BeeNestDestroyedTrigger.TriggerInstance(Optional.empty(), Optional.of(block.builtInRegistryHolder()), Optional.of(item.build()), numBees) ); } public boolean matches(BlockState state, ItemStack stack, int numBees) { if (this.block.isPresent() && !state.is((Holder)this.block.get())) { return false; } else { return this.item.isPresent() && !((ItemPredicate)this.item.get()).test(stack) ? false : this.beesInside.matches(numBees); } } } }