package net.minecraft.client.renderer.item.properties.select; import com.mojang.serialization.Codec; import com.mojang.serialization.DataResult; import com.mojang.serialization.MapCodec; import java.util.List; import javax.annotation.Nullable; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.item.SelectItemModel; import net.minecraft.core.component.DataComponentType; import net.minecraft.core.registries.BuiltInRegistries; 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 record ComponentContents(DataComponentType componentType) implements SelectItemModelProperty { private static final SelectItemModelProperty.Type, ?> TYPE = createType(); private static SelectItemModelProperty.Type, T> createType() { Codec> codec = ((net.minecraft.core.Registry>)(Object)BuiltInRegistries.DATA_COMPONENT_TYPE) .byNameCodec() .validate(p_392308_ -> p_392308_.isTransient() ? DataResult.error(() -> "Component can't be serialized") : DataResult.success(p_392308_)); MapCodec, T>> mapcodec = codec.dispatchMap( "component", p_391524_ -> p_391524_.property().componentType, p_393420_ -> SelectItemModelProperty.Type.createCasesFieldCodec(p_393420_.codecOrThrow()) .xmap( p_393375_ -> new SelectItemModel.UnbakedSwitch<>( new ComponentContents<>((DataComponentType)p_393420_), (List>)p_393375_ ), SelectItemModel.UnbakedSwitch::cases ) ); return new SelectItemModelProperty.Type<>(mapcodec); } public static SelectItemModelProperty.Type, T> castType() { return (SelectItemModelProperty.Type, T>)TYPE; } @Nullable @Override public T get(ItemStack p_393463_, @Nullable ClientLevel p_397707_, @Nullable LivingEntity p_394890_, int p_394350_, ItemDisplayContext p_393680_) { return p_393463_.get(this.componentType); } @Override public SelectItemModelProperty.Type, T> type() { return castType(); } @Override public Codec valueCodec() { return this.componentType.codecOrThrow(); } }