From 690f9ea0f9ba48e7491237b7489db5ab455aefb5 Mon Sep 17 00:00:00 2001 From: MoePus <547007249@qq.com> Date: Mon, 8 Sep 2025 23:03:38 +0900 Subject: [PATCH] Refresh item model if itemstack changes in ItemVisual, fix #300 --- .../vanillin/visuals/ItemVisual.java | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemVisual.java index f7521151e..5e3aadc64 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemVisual.java @@ -26,18 +26,17 @@ public class ItemVisual extends AbstractEntityVisual implements Simp private static final ThreadLocal RANDOM = ThreadLocal.withInitial(RandomSource::createNewThreadLocalInstance); private final PoseStack pPoseStack = new PoseStack(); - private final BakedModel bakedModel; + private BakedModel bakedModel; + private ItemStack currentStack; - private final InstanceRecycler instances; + private InstanceRecycler instances; public ItemVisual(VisualizationContext ctx, ItemEntity entity, float partialTick) { super(ctx, entity, partialTick); - var item = entity.getItem(); - bakedModel = ItemModels.getModel(item); - - var model = ItemModels.get(level, item, ItemDisplayContext.GROUND); - + currentStack = entity.getItem(); + bakedModel = ItemModels.getModel(currentStack); + var model = ItemModels.get(level, currentStack, ItemDisplayContext.GROUND); instances = new InstanceRecycler<>(() -> ctx.instancerProvider() .instancer(InstanceTypes.TRANSFORMED, model) .createInstance()); @@ -63,8 +62,18 @@ private void animate(float partialTick) { TransformStack.of(pPoseStack) .translate(getVisualPosition(partialTick)); - instances.resetCount(); ItemStack itemstack = entity.getItem(); + if (!ItemStack.matches(itemstack, currentStack)) { + instances.delete(); + currentStack = itemstack.copy(); + bakedModel = ItemModels.getModel(currentStack); + var model = ItemModels.get(level, currentStack, ItemDisplayContext.GROUND); + instances = new InstanceRecycler<>(() -> visualizationContext.instancerProvider() + .instancer(InstanceTypes.TRANSFORMED, model) + .createInstance()); + } + instances.resetCount(); + int i = itemstack.isEmpty() ? 187 : Item.getId(itemstack.getItem()) + itemstack.getDamageValue(); var random = RANDOM.get(); random.setSeed(i);