From 839882b7837f3b9ad9e08b8522653ee0f347c7f9 Mon Sep 17 00:00:00 2001 From: Alexdoru <57050655+Alexdoru@users.noreply.github.com> Date: Thu, 9 Apr 2026 21:49:41 +0200 Subject: [PATCH] Fix WorldClient memory leak in butterfly renderer (#113) --- .../render/RenderButterflyItem.java | 80 ++++++++++--------- 1 file changed, 42 insertions(+), 38 deletions(-) diff --git a/src/main/java/forestry/lepidopterology/render/RenderButterflyItem.java b/src/main/java/forestry/lepidopterology/render/RenderButterflyItem.java index b933cdb5b..c05399146 100644 --- a/src/main/java/forestry/lepidopterology/render/RenderButterflyItem.java +++ b/src/main/java/forestry/lepidopterology/render/RenderButterflyItem.java @@ -25,13 +25,8 @@ import forestry.lepidopterology.entities.EntityButterfly; public class RenderButterflyItem implements IItemRenderer { - private final ModelButterfly model; private EntityButterfly entity; - public RenderButterflyItem() { - model = new ModelButterfly(); - } - private static float getWingYaw(IButterfly butterfly) { float wingYaw = 1f; @@ -77,10 +72,17 @@ public class RenderButterflyItem implements IItemRenderer { .templateAsIndividual(ButterflyManager.butterflyRoot.getDefaultTemplate()); } - if (entity == null) { - entity = new EntityButterfly(Proxies.common.getRenderWorld(), butterfly, 0, 0, 0); - } else { - entity.setIndividual(butterfly); + try { + if (entity == null) { + entity = new EntityButterfly(Proxies.common.getRenderWorld(), butterfly, 0, 0, 0); + } else { + entity.setWorld(Proxies.common.getRenderWorld()); + entity.setIndividual(butterfly); + } + } finally { + if (entity != null) { + entity.setWorld(null); + } } return butterfly; @@ -111,7 +113,12 @@ public class RenderButterflyItem implements IItemRenderer { entity.rotationPitch = 0; entity.rotationYawHead = entity.rotationYaw; - RenderManager.instance.renderEntityWithPosYaw(entity, 0.0D, 0.0D, 0.0D, 0.0F, 1.0f); + try { + entity.setWorld(Proxies.common.getRenderWorld()); + RenderManager.instance.renderEntityWithPosYaw(entity, 0.0D, 0.0D, 0.0D, 0.0F, 1.0f); + } finally { + entity.setWorld(null); + } } else { GL11.glTranslatef(translateX, translateY, translateZ); @@ -119,14 +126,19 @@ public class RenderButterflyItem implements IItemRenderer { GL11.glScalef(-2.0f, 2.0f, 2.0f); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); GL11.glRotatef(-135.0F, 0.0F, 1.0F, 0.0F); - GL11.glRotatef(-((float) Math.atan((double) (pitch / 40.0F))) * 20.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(-((float) Math.atan(pitch / 40.0F)) * 20.0F, 1.0F, 0.0F, 0.0F); - entity.renderYawOffset = (float) Math.atan((double) (yaw / 40.0F)) * 20.0F; - entity.rotationYaw = (float) Math.atan((double) (yaw / 40.0F)) * 40.0F; - entity.rotationPitch = -((float) Math.atan((double) (pitch / 40.0F))) * 20.0F; + entity.renderYawOffset = (float) Math.atan(yaw / 40.0F) * 20.0F; + entity.rotationYaw = (float) Math.atan(yaw / 40.0F) * 40.0F; + entity.rotationPitch = -((float) Math.atan(pitch / 40.0F)) * 20.0F; entity.rotationYawHead = entity.rotationYaw; - RenderManager.instance.renderEntityWithPosYaw(entity, 0.0D, 0.0D, 0.0D, 0.0F, getWingYaw(butterfly)); + try { + entity.setWorld(Proxies.common.getRenderWorld()); + RenderManager.instance.renderEntityWithPosYaw(entity, 0.0D, 0.0D, 0.0D, 0.0F, getWingYaw(butterfly)); + } finally { + entity.setWorld(null); + } } GL11.glPopMatrix(); @@ -160,8 +172,12 @@ public class RenderButterflyItem implements IItemRenderer { entity.rotationPitch = 0; entity.rotationYawHead = entity.rotationYaw; - RenderManager.instance.renderEntityWithPosYaw(entity, 0.0D, 0.0D, 0.0D, 0.0F, getWingYaw(butterfly)); - + try { + entity.setWorld(Proxies.common.getRenderWorld()); + RenderManager.instance.renderEntityWithPosYaw(entity, 0.0D, 0.0D, 0.0D, 0.0F, getWingYaw(butterfly)); + } finally { + entity.setWorld(null); + } GL11.glPopMatrix(); RenderHelper.disableStandardItemLighting(); GL11.glDisable(GL12.GL_RESCALE_NORMAL); @@ -173,39 +189,27 @@ public class RenderButterflyItem implements IItemRenderer { @Override public boolean handleRenderType(ItemStack item, ItemRenderType type) { - switch (type) { - case ENTITY: - case EQUIPPED: - case EQUIPPED_FIRST_PERSON: - case INVENTORY: - return true; - default: - return false; - } + return switch (type) { + case ENTITY, EQUIPPED, EQUIPPED_FIRST_PERSON, INVENTORY -> true; + default -> false; + }; } @Override public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { - switch (helper) { - case ENTITY_BOBBING: - case ENTITY_ROTATION: - return false; - default: - return true; - } + return switch (helper) { + case ENTITY_BOBBING, ENTITY_ROTATION -> false; + default -> true; + }; } @Override public void renderItem(ItemRenderType type, ItemStack item, Object... data) { - switch (type) { case ENTITY: renderButterflyItem(initButterfly(item), 0f, -0.5f, 0f); break; - case EQUIPPED: - renderButterflyItem(initButterfly(item), 0.5f, -0.9f, 1.0f); - break; - case EQUIPPED_FIRST_PERSON: + case EQUIPPED, EQUIPPED_FIRST_PERSON: renderButterflyItem(initButterfly(item), 0.5f, -0.9f, 1.0f); break; case INVENTORY: