package net.minecraft.client.renderer.item.properties.select; import com.google.common.collect.HashMultiset; import com.google.common.collect.Multiset; import com.google.common.collect.Multiset.Entry; import com.mojang.serialization.Codec; import com.mojang.serialization.DataResult; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import com.mojang.serialization.codecs.RecordCodecBuilder.Instance; import java.util.List; import java.util.stream.Collectors; import javax.annotation.Nullable; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.item.SelectItemModel; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @OnlyIn(Dist.CLIENT) public interface SelectItemModelProperty { @Nullable T get(ItemStack p_378017_, @Nullable ClientLevel p_375849_, @Nullable LivingEntity p_377186_, int p_375524_, ItemDisplayContext p_378106_); Codec valueCodec(); SelectItemModelProperty.Type, T> type(); @OnlyIn(Dist.CLIENT) public record Type

, T>(MapCodec> switchCodec) { public static

, T> SelectItemModelProperty.Type create(MapCodec

p_376943_, Codec p_376938_) { MapCodec> mapcodec = RecordCodecBuilder.mapCodec( p_389556_ -> p_389556_.group( p_376943_.forGetter(SelectItemModel.UnbakedSwitch::property), createCasesFieldCodec(p_376938_).forGetter(SelectItemModel.UnbakedSwitch::cases) ) .apply(p_389556_, SelectItemModel.UnbakedSwitch::new) ); return new SelectItemModelProperty.Type<>(mapcodec); } public static MapCodec>> createCasesFieldCodec(Codec p_395409_) { return SelectItemModel.SwitchCase.codec(p_395409_).listOf().validate(SelectItemModelProperty.Type::validateCases).fieldOf("cases"); } private static DataResult>> validateCases(List> p_394436_) { if (p_394436_.isEmpty()) { return DataResult.error(() -> "Empty case list"); } else { Multiset multiset = HashMultiset.create(); for (SelectItemModel.SwitchCase switchcase : p_394436_) { multiset.addAll(switchcase.values()); } return multiset.size() != multiset.entrySet().size() ? DataResult.error( () -> "Duplicate case conditions: " + multiset.entrySet() .stream() .filter(p_378495_ -> p_378495_.getCount() > 1) .map(p_378161_ -> p_378161_.getElement().toString()) .collect(Collectors.joining(", ")) ) : DataResult.success(p_394436_); } } } }