package net.minecraft.client.renderer.item; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.resources.model.ModelManager; import net.minecraft.core.component.DataComponents; import net.minecraft.resources.Identifier; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.ItemOwner; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import org.jspecify.annotations.Nullable; public class ItemModelResolver { private final ModelManager modelManager; public ItemModelResolver(final ModelManager modelManager) { this.modelManager = modelManager; } private ClientItem.Properties getItemProperties(final Identifier modelId) { return this.modelManager.getItemProperties(modelId); } private ItemModel getItemModel(final Identifier modelId) { return this.modelManager.getItemModel(modelId); } public void updateForLiving(final ItemStackRenderState output, final ItemStack item, final ItemDisplayContext displayContext, final LivingEntity entity) { this.updateForTopItem(output, item, displayContext, entity.level(), entity, entity.getId() + displayContext.ordinal()); } public void updateForNonLiving(final ItemStackRenderState output, final ItemStack item, final ItemDisplayContext displayContext, final Entity entity) { this.updateForTopItem(output, item, displayContext, entity.level(), entity, entity.getId()); } public void updateForTopItem( final ItemStackRenderState output, final ItemStack item, final ItemDisplayContext displayContext, @Nullable final Level level, @Nullable final ItemOwner owner, final int seed ) { output.clear(); if (!item.isEmpty()) { output.displayContext = displayContext; this.appendItemLayers(output, item, displayContext, level, owner, seed); } } public void appendItemLayers( final ItemStackRenderState output, final ItemStack item, final ItemDisplayContext displayContext, @Nullable final Level level, @Nullable final ItemOwner owner, final int seed ) { Identifier modelId = (Identifier)item.get(DataComponents.ITEM_MODEL); if (modelId != null) { output.setOversizedInGui(this.getItemProperties(modelId).oversizedInGui()); this.getItemModel(modelId).update(output, item, this, displayContext, level instanceof ClientLevel clientLevel ? clientLevel : null, owner, seed); } } public boolean shouldPlaySwapAnimation(final ItemStack stack) { Identifier modelId = (Identifier)stack.get(DataComponents.ITEM_MODEL); return modelId == null ? true : this.getItemProperties(modelId).handAnimationOnSwap(); } public float swapAnimationScale(final ItemStack stack) { Identifier modelId = (Identifier)stack.get(DataComponents.ITEM_MODEL); return modelId == null ? 1.0F : this.getItemProperties(modelId).swapAnimationScale(); } }