package net.minecraft.world.level.storage.loot.entries; import com.google.common.collect.ImmutableList; import com.mojang.datafixers.Products.P1; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder.Instance; import com.mojang.serialization.codecs.RecordCodecBuilder.Mu; import java.util.List; import java.util.function.Predicate; import net.minecraft.util.Util; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.Validatable; import net.minecraft.world.level.storage.loot.ValidationContext; import net.minecraft.world.level.storage.loot.predicates.ConditionUserBuilder; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; public abstract class LootPoolEntryContainer implements ComposableEntryContainer, Validatable { protected final List conditions; private final Predicate compositeCondition; protected LootPoolEntryContainer(final List conditions) { this.conditions = conditions; this.compositeCondition = Util.allOf(conditions); } protected static P1, List> commonFields(final Instance i) { return i.group(LootItemCondition.DIRECT_CODEC.listOf().optionalFieldOf("conditions", List.of()).forGetter(e -> e.conditions)); } @Override public void validate(final ValidationContext output) { Validatable.validate(output, "conditions", this.conditions); } protected final boolean canRun(final LootContext context) { return this.compositeCondition.test(context); } public abstract MapCodec codec(); public abstract static class Builder> implements ConditionUserBuilder { private final ImmutableList.Builder conditions = ImmutableList.builder(); protected abstract T getThis(); public T when(final LootItemCondition.Builder condition) { this.conditions.add(condition.build()); return this.getThis(); } public final T unwrap() { return this.getThis(); } protected List getConditions() { return this.conditions.build(); } public AlternativesEntry.Builder otherwise(final LootPoolEntryContainer.Builder other) { return new AlternativesEntry.Builder(this, other); } public EntryGroup.Builder append(final LootPoolEntryContainer.Builder other) { return new EntryGroup.Builder(this, other); } public SequentialEntry.Builder then(final LootPoolEntryContainer.Builder other) { return new SequentialEntry.Builder(this, other); } public abstract LootPoolEntryContainer build(); } }