Code/net/minecraft/client/renderer/item/properties/select/ComponentContents.java

60 lines
2.6 KiB
Java
Raw Permalink Normal View History

2025-07-01 06:20:03 +00:00
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<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<DataComponentType<T>> codec = ((net.minecraft.core.Registry<DataComponentType<T>>)(Object)BuiltInRegistries.DATA_COMPONENT_TYPE)
.byNameCodec()
.validate(p_392308_ -> p_392308_.isTransient() ? DataResult.error(() -> "Component can't be serialized") : DataResult.success(p_392308_));
MapCodec<SelectItemModel.UnbakedSwitch<ComponentContents<T>, 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<T>)p_393420_), (List<SelectItemModel.SwitchCase<T>>)p_393375_
),
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 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<ComponentContents<T>, T> type() {
return castType();
}
@Override
public Codec<T> valueCodec() {
return this.componentType.codecOrThrow();
}
}