private record CustomSpecialModel<T>(SpecialModelRenderer<T> composed) implements SpecialModelRenderer<Pair<T, ItemStack>> {
@Override
public void render(@Nullable Pair<T, ItemStack> data, ItemDisplayContext displayContext, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay, boolean glint) {
var originalData = Nullables.map(
data,
Pair::getLeft
);
composed.render(originalData, displayContext, matrices, vertexConsumers, light, overlay, glint);
}
@Override
public @NotNull Pair<T, ItemStack> getData(ItemStack stack) {
return new Pair<>(composed.getData(stack), Nullables.map(
stack.get(DataComponentTypes.CONTAINER),
ContainerComponent::copyFirstStack
));
}
}
private record CustomUnbakedShulkerSpecialModel(SpecialModelRenderer.Unbaked unbaked, MapCodec<CustomUnbakedShulkerSpecialModel> codec) implements SpecialModelRenderer.Unbaked {
CustomUnbakedShulkerSpecialModel(SpecialModelRenderer.Unbaked unbaked) {
this(unbaked, asSuper(unbaked.getCodec()).xmap(
CustomUnbakedShulkerSpecialModel::new,
CustomUnbakedShulkerSpecialModel::unbaked
));
}
@Override
public SpecialModelRenderer<?> bake(LoadedEntityModels entityModels) {
return new CustomSpecialModel<>(unbaked.bake(entityModels));`
}
@Override
public MapCodec<? extends SpecialModelRenderer.Unbaked> getCodec() {
return codec;
}
@SuppressWarnings("unchecked")
private static MapCodec<SpecialModelRenderer.Unbaked> asSuper(MapCodec<? extends SpecialModelRenderer.Unbaked> codec) {
return (MapCodec<SpecialModelRenderer.Unbaked>) codec;
}
}