minecraft-src/net/minecraft/client/renderer/item/properties/select/ComponentContents.java
2025-07-04 03:45:38 +03:00

55 lines
2.3 KiB
Java

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<T>(DataComponentType<T> componentType) implements SelectItemModelProperty<T> {
private static final SelectItemModelProperty.Type<? extends ComponentContents<?>, ?> TYPE = createType();
private static <T> SelectItemModelProperty.Type<ComponentContents<T>, T> createType() {
Codec<? extends DataComponentType<?>> codec = BuiltInRegistries.DATA_COMPONENT_TYPE
.byNameCodec()
.validate(
dataComponentType -> dataComponentType.isTransient() ? DataResult.error(() -> "Component can't be serialized") : DataResult.success(dataComponentType)
);
MapCodec<SelectItemModel.UnbakedSwitch<ComponentContents<T>, 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 <T> SelectItemModelProperty.Type<ComponentContents<T>, T> castType() {
return (SelectItemModelProperty.Type<ComponentContents<T>, 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<ComponentContents<T>, T> type() {
return castType();
}
@Override
public Codec<T> valueCodec() {
return this.componentType.codecOrThrow();
}
}