minecraft-src/net/minecraft/client/data/models/model/ItemModelUtils.java
2025-09-18 12:46:36 +00:00

126 lines
5.9 KiB
Java

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<Entry> entries) {
return new net.minecraft.client.renderer.item.RangeSelectItemModel.Unbaked(property, 1.0F, entries, Optional.of(fallback));
}
public static Unbaked rangeSelect(RangeSelectItemModelProperty property, List<Entry> 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<Entry> 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 <T> SwitchCase<T> when(T value, Unbaked model) {
return new SwitchCase<>(List.of(value), model);
}
public static <T> SwitchCase<T> when(List<T> values, Unbaked model) {
return new SwitchCase<>(values, model);
}
@SafeVarargs
public static <T> Unbaked select(SelectItemModelProperty<T> property, Unbaked fallback, SwitchCase<T>... cases) {
return select(property, fallback, List.of(cases));
}
public static <T> Unbaked select(SelectItemModelProperty<T> property, Unbaked fallback, List<SwitchCase<T>> cases) {
return new net.minecraft.client.renderer.item.SelectItemModel.Unbaked(new UnbakedSwitch<>(property, cases), Optional.of(fallback));
}
@SafeVarargs
public static <T> Unbaked select(SelectItemModelProperty<T> property, SwitchCase<T>... cases) {
return select(property, List.of(cases));
}
public static <T> Unbaked select(SelectItemModelProperty<T> property, List<SwitchCase<T>> 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 <T extends Comparable<T>> Unbaked selectBlockItemProperty(Property<T> property, Unbaked fallback, Map<T, Unbaked> modelMap) {
List<SwitchCase<String>> 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)));
}
}