package net.minecraft.client.renderer.item.properties.select; import com.mojang.serialization.Codec; import com.mojang.serialization.DataResult; import com.mojang.serialization.MapCodec; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; 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 org.jetbrains.annotations.Nullable; @Environment(EnvType.CLIENT) public record ComponentContents(DataComponentType componentType) implements SelectItemModelProperty { private static final SelectItemModelProperty.Type, ?> TYPE = createType(); private static SelectItemModelProperty.Type, T> createType() { Codec> codec = BuiltInRegistries.DATA_COMPONENT_TYPE .byNameCodec() .validate( dataComponentType -> dataComponentType.isTransient() ? DataResult.error(() -> "Component can't be serialized") : DataResult.success(dataComponentType) ); MapCodec, T>> mapCodec = codec.dispatchMap( "component", unbakedSwitch -> ((ComponentContents)unbakedSwitch.property()).componentType, dataComponentType -> SelectItemModelProperty.Type.createCasesFieldCodec(dataComponentType.codecOrThrow()) .xmap(list -> new SelectItemModel.UnbakedSwitch<>(new ComponentContents(dataComponentType), list), 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 stack, @Nullable ClientLevel level, @Nullable LivingEntity entity, int seed, ItemDisplayContext displayContext) { return stack.get(this.componentType); } @Override public SelectItemModelProperty.Type, T> type() { return castType(); } @Override public Codec valueCodec() { return this.componentType.codecOrThrow(); } }