diff --git a/src/main/java/gregtech/api/metatileentity/MetaTileEntityHolder.java b/src/main/java/gregtech/api/metatileentity/MetaTileEntityHolder.java index 901440bdbf8..6a956285927 100644 --- a/src/main/java/gregtech/api/metatileentity/MetaTileEntityHolder.java +++ b/src/main/java/gregtech/api/metatileentity/MetaTileEntityHolder.java @@ -254,4 +254,18 @@ public boolean canRenderBreaking() { public boolean hasFastRenderer() { return true; } + + public boolean hasTESR() { + if (metaTileEntity == null) return false; + if (metaTileEntity instanceof IFastRenderMetaTileEntity) { + return true; + } + for (EnumFacing side : EnumFacing.VALUES) { + CoverBehavior cover = metaTileEntity.getCoverAtSide(side); + if (cover instanceof IFastRenderMetaTileEntity) { + return true; + } + } + return false; + } } diff --git a/src/main/java/gregtech/core/GTCETransformer.java b/src/main/java/gregtech/core/GTCETransformer.java index a1b617923a0..84e3fd08999 100644 --- a/src/main/java/gregtech/core/GTCETransformer.java +++ b/src/main/java/gregtech/core/GTCETransformer.java @@ -55,6 +55,12 @@ public byte[] transform(String name, String transformedName, byte[] basicClass) classReader.accept(new TargetClassVisitor(classWriter, RegionRenderCacheBuilderVisitor.TARGET_METHOD, RegionRenderCacheBuilderVisitor::new), 0); return classWriter.toByteArray(); } + case RenderChunkVisitor.TARGET_CLASS_NAME: { + ClassReader classReader = new ClassReader(basicClass); + ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); + classReader.accept(new TargetClassVisitor(classWriter, RenderChunkVisitor.TARGET_METHOD, RenderChunkVisitor::new), 0); + return classWriter.toByteArray(); + } case EntityRendererVisitor.TARGET_CLASS_NAME: { ClassReader classReader = new ClassReader(basicClass); ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); diff --git a/src/main/java/gregtech/core/hooks/RenderChunkHooks.java b/src/main/java/gregtech/core/hooks/RenderChunkHooks.java new file mode 100644 index 00000000000..ac1452719ce --- /dev/null +++ b/src/main/java/gregtech/core/hooks/RenderChunkHooks.java @@ -0,0 +1,17 @@ +package gregtech.core.hooks; + +import gregtech.api.metatileentity.MetaTileEntityHolder; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.tileentity.TileEntity; + +import javax.annotation.Nullable; + +public class RenderChunkHooks { + public static TileEntitySpecialRenderer getRenderer(TileEntityRendererDispatcher renderer, @Nullable TileEntity tileEntityIn) { + if (tileEntityIn instanceof MetaTileEntityHolder && !((MetaTileEntityHolder) tileEntityIn).hasTESR()) { + return null; + } + return renderer.getRenderer(tileEntityIn); + } +} diff --git a/src/main/java/gregtech/core/visitors/RenderChunkVisitor.java b/src/main/java/gregtech/core/visitors/RenderChunkVisitor.java new file mode 100644 index 00000000000..4fd2dd560a8 --- /dev/null +++ b/src/main/java/gregtech/core/visitors/RenderChunkVisitor.java @@ -0,0 +1,33 @@ +package gregtech.core.visitors; + +import gregtech.core.util.ObfMapping; +import org.objectweb.asm.MethodVisitor; +import org.objectweb.asm.Opcodes; + +public class RenderChunkVisitor extends MethodVisitor implements Opcodes { + public static final String TARGET_CLASS_NAME = "net/minecraft/client/renderer/chunk/RenderChunk"; + public static final ObfMapping TARGET_METHOD = new ObfMapping(TARGET_CLASS_NAME, "func_178581_b", "(FFFLnet/minecraft/client/renderer/chunk/ChunkCompileTaskGenerator;)V"); + private static final ObfMapping METHOD_GET_RENDERER = new ObfMapping( + "net/minecraft/client/renderer/tileentity/TileEntityRendererDispatcher", + "func_147546_a", + "(Lnet/minecraft/tileentity/TileEntity;)Lnet/minecraft/client/renderer/tileentity/TileEntitySpecialRenderer;").toRuntime(); + private static final ObfMapping METHOD_GET_RENDERER_HOOKS = new ObfMapping( + "gregtech/core/hooks/RenderChunkHooks", + "getRenderer", + "(Lnet/minecraft/client/renderer/tileentity/TileEntityRendererDispatcher;Lnet/minecraft/tileentity/TileEntity;)Lnet/minecraft/client/renderer/tileentity/TileEntitySpecialRenderer;"); + + public RenderChunkVisitor(MethodVisitor mv) { + super(ASM5, mv); + } + + + @Override + public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) { + if (opcode == INVOKEVIRTUAL && (METHOD_GET_RENDERER.matches(name, desc))) { + METHOD_GET_RENDERER_HOOKS.visitMethodInsn(this, INVOKESTATIC); + return; + } + super.visitMethodInsn(opcode, owner, name, desc, itf); + } + +}