minecraft-src/net/minecraft/client/renderer/item/ConditionalItemModel.java
2025-07-04 03:15:13 +03:00

69 lines
2.6 KiB
Java

package net.minecraft.client.renderer.item;
import com.mojang.serialization.MapCodec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.client.renderer.item.properties.conditional.ConditionalItemModelProperties;
import net.minecraft.client.renderer.item.properties.conditional.ConditionalItemModelProperty;
import net.minecraft.client.resources.model.ResolvableModel;
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 class ConditionalItemModel implements ItemModel {
private final ConditionalItemModelProperty property;
private final ItemModel onTrue;
private final ItemModel onFalse;
public ConditionalItemModel(ConditionalItemModelProperty property, ItemModel onTrue, ItemModel onFalse) {
this.property = property;
this.onTrue = onTrue;
this.onFalse = onFalse;
}
@Override
public void update(
ItemStackRenderState renderState,
ItemStack stack,
ItemModelResolver itemModelResolver,
ItemDisplayContext displayContext,
@Nullable ClientLevel level,
@Nullable LivingEntity entity,
int seed
) {
(this.property.get(stack, level, entity, seed, displayContext) ? this.onTrue : this.onFalse)
.update(renderState, stack, itemModelResolver, displayContext, level, entity, seed);
}
@Environment(EnvType.CLIENT)
public record Unbaked(ConditionalItemModelProperty property, ItemModel.Unbaked onTrue, ItemModel.Unbaked onFalse) implements ItemModel.Unbaked {
public static final MapCodec<ConditionalItemModel.Unbaked> MAP_CODEC = RecordCodecBuilder.mapCodec(
instance -> instance.group(
ConditionalItemModelProperties.MAP_CODEC.forGetter(ConditionalItemModel.Unbaked::property),
ItemModels.CODEC.fieldOf("on_true").forGetter(ConditionalItemModel.Unbaked::onTrue),
ItemModels.CODEC.fieldOf("on_false").forGetter(ConditionalItemModel.Unbaked::onFalse)
)
.apply(instance, ConditionalItemModel.Unbaked::new)
);
@Override
public MapCodec<ConditionalItemModel.Unbaked> type() {
return MAP_CODEC;
}
@Override
public ItemModel bake(ItemModel.BakingContext context) {
return new ConditionalItemModel(this.property, this.onTrue.bake(context), this.onFalse.bake(context));
}
@Override
public void resolveDependencies(ResolvableModel.Resolver resolver) {
this.onTrue.resolveDependencies(resolver);
this.onFalse.resolveDependencies(resolver);
}
}
}