package net.minecraft.client.data.models.model; import java.util.List; import java.util.Map; import java.util.Optional; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.color.item.Constant; import net.minecraft.client.color.item.ItemTintSource; import net.minecraft.client.renderer.item.ItemModel.Unbaked; import net.minecraft.client.renderer.item.RangeSelectItemModel.Entry; import net.minecraft.client.renderer.item.SelectItemModel.SwitchCase; import net.minecraft.client.renderer.item.SelectItemModel.UnbakedSwitch; import net.minecraft.client.renderer.item.properties.conditional.ConditionalItemModelProperty; import net.minecraft.client.renderer.item.properties.conditional.HasComponent; import net.minecraft.client.renderer.item.properties.conditional.IsUsingItem; import net.minecraft.client.renderer.item.properties.numeric.RangeSelectItemModelProperty; import net.minecraft.client.renderer.item.properties.select.ContextDimension; import net.minecraft.client.renderer.item.properties.select.ItemBlockState; import net.minecraft.client.renderer.item.properties.select.LocalTime; import net.minecraft.client.renderer.item.properties.select.SelectItemModelProperty; import net.minecraft.core.component.DataComponentType; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.properties.Property; @Environment(EnvType.CLIENT) public class ItemModelUtils { public static Unbaked plainModel(ResourceLocation model) { return new net.minecraft.client.renderer.item.BlockModelWrapper.Unbaked(model, List.of()); } public static Unbaked tintedModel(ResourceLocation model, ItemTintSource... tintSources) { return new net.minecraft.client.renderer.item.BlockModelWrapper.Unbaked(model, List.of(tintSources)); } public static ItemTintSource constantTint(int value) { return new Constant(value); } public static Unbaked composite(Unbaked... models) { return new net.minecraft.client.renderer.item.CompositeModel.Unbaked(List.of(models)); } public static Unbaked specialModel(ResourceLocation base, net.minecraft.client.renderer.special.SpecialModelRenderer.Unbaked specialModel) { return new net.minecraft.client.renderer.item.SpecialModelWrapper.Unbaked(base, specialModel); } public static Entry override(Unbaked model, float threshold) { return new Entry(threshold, model); } public static Unbaked rangeSelect(RangeSelectItemModelProperty property, Unbaked fallback, Entry... entries) { return new net.minecraft.client.renderer.item.RangeSelectItemModel.Unbaked(property, 1.0F, List.of(entries), Optional.of(fallback)); } public static Unbaked rangeSelect(RangeSelectItemModelProperty property, float scale, Unbaked fallback, Entry... entries) { return new net.minecraft.client.renderer.item.RangeSelectItemModel.Unbaked(property, scale, List.of(entries), Optional.of(fallback)); } public static Unbaked rangeSelect(RangeSelectItemModelProperty property, Unbaked fallback, List entries) { return new net.minecraft.client.renderer.item.RangeSelectItemModel.Unbaked(property, 1.0F, entries, Optional.of(fallback)); } public static Unbaked rangeSelect(RangeSelectItemModelProperty property, List entries) { return new net.minecraft.client.renderer.item.RangeSelectItemModel.Unbaked(property, 1.0F, entries, Optional.empty()); } public static Unbaked rangeSelect(RangeSelectItemModelProperty property, float scale, List entries) { return new net.minecraft.client.renderer.item.RangeSelectItemModel.Unbaked(property, scale, entries, Optional.empty()); } public static Unbaked conditional(ConditionalItemModelProperty property, Unbaked onTrue, Unbaked onFalse) { return new net.minecraft.client.renderer.item.ConditionalItemModel.Unbaked(property, onTrue, onFalse); } public static SwitchCase when(T value, Unbaked model) { return new SwitchCase<>(List.of(value), model); } public static SwitchCase when(List values, Unbaked model) { return new SwitchCase<>(values, model); } @SafeVarargs public static Unbaked select(SelectItemModelProperty property, Unbaked fallback, SwitchCase... cases) { return select(property, fallback, List.of(cases)); } public static Unbaked select(SelectItemModelProperty property, Unbaked fallback, List> cases) { return new net.minecraft.client.renderer.item.SelectItemModel.Unbaked(new UnbakedSwitch<>(property, cases), Optional.of(fallback)); } @SafeVarargs public static Unbaked select(SelectItemModelProperty property, SwitchCase... cases) { return select(property, List.of(cases)); } public static Unbaked select(SelectItemModelProperty property, List> cases) { return new net.minecraft.client.renderer.item.SelectItemModel.Unbaked(new UnbakedSwitch<>(property, cases), Optional.empty()); } public static ConditionalItemModelProperty isUsingItem() { return new IsUsingItem(); } public static ConditionalItemModelProperty hasComponent(DataComponentType componentType) { return new HasComponent(componentType, false); } public static Unbaked inOverworld(Unbaked inOverworldModel, Unbaked notInOverworldModel) { return select(new ContextDimension(), notInOverworldModel, when(Level.OVERWORLD, inOverworldModel)); } public static > Unbaked selectBlockItemProperty(Property property, Unbaked fallback, Map modelMap) { List> list = modelMap.entrySet().stream().sorted(java.util.Map.Entry.comparingByKey()).map(entry -> { String string = property.getName((T)entry.getKey()); return new SwitchCase(List.of(string), (Unbaked)entry.getValue()); }).toList(); return select(new ItemBlockState(property.getName()), fallback, list); } public static Unbaked isXmas(Unbaked xmasModel, Unbaked normalModel) { return select(LocalTime.create("MM-dd", "", Optional.empty()), normalModel, List.of(when(List.of("12-24", "12-25", "12-26"), xmasModel))); } }