package net.minecraft.world.item.slot; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import java.util.List; import java.util.function.Function; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.Validatable; import net.minecraft.world.level.storage.loot.ValidationContext; public abstract class CompositeSlotSource implements SlotSource { protected final List terms; private final Function compositeSlotSource; protected CompositeSlotSource(final List terms) { this.terms = terms; this.compositeSlotSource = SlotSources.group(terms); } protected static MapCodec createCodec(final Function, T> factory) { return RecordCodecBuilder.mapCodec(i -> i.group(SlotSources.CODEC.listOf().fieldOf("terms").forGetter(t -> t.terms)).apply(i, factory)); } protected static Codec createInlineCodec(final Function, T> factory) { return SlotSources.CODEC.listOf().xmap(factory, t -> t.terms); } @Override public abstract MapCodec codec(); @Override public SlotCollection provide(final LootContext context) { return (SlotCollection)this.compositeSlotSource.apply(context); } @Override public void validate(final ValidationContext context) { SlotSource.super.validate(context); Validatable.validate(context, "terms", this.terms); } }