Fix WorldClient memory leak in butterfly renderer (#113)

This commit is contained in:
Alexdoru authored and GitHub committed 2026-04-09 21:49:41 +02:00
1 parent 2635d036aa
commit 839882b783
1 file changed
+35 -31
@@ -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,11 +72,18 @@ public class RenderButterflyItem implements IItemRenderer {
.templateAsIndividual(ButterflyManager.butterflyRoot.getDefaultTemplate());
}
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;
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;
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;
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: