package net.minecraft.world.level.storage.loot.functions; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import java.util.List; import java.util.function.BiFunction; import net.minecraft.world.item.ItemStack; 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 class SequenceFunction implements LootItemFunction { public static final MapCodec MAP_CODEC = RecordCodecBuilder.mapCodec( i -> i.group(LootItemFunctions.TYPED_CODEC.listOf().fieldOf("functions").forGetter(f -> f.functions)).apply(i, SequenceFunction::new) ); public static final Codec INLINE_CODEC = LootItemFunctions.TYPED_CODEC.listOf().xmap(SequenceFunction::new, f -> f.functions); private final List functions; private final BiFunction compositeFunction; private SequenceFunction(final List functions) { this.functions = functions; this.compositeFunction = LootItemFunctions.compose(functions); } public static SequenceFunction of(final List functions) { return new SequenceFunction(List.copyOf(functions)); } public ItemStack apply(final ItemStack stack, final LootContext context) { return (ItemStack)this.compositeFunction.apply(stack, context); } @Override public void validate(final ValidationContext output) { LootItemFunction.super.validate(output); Validatable.validate(output, "functions", this.functions); } @Override public MapCodec codec() { return MAP_CODEC; } }