Skip to content

Commit

Permalink
adv furnace tesr improvements and fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
Glease committed Jan 12, 2024
1 parent 9a2d34a commit 5ad8c33
Show file tree
Hide file tree
Showing 6 changed files with 90 additions and 19 deletions.
24 changes: 14 additions & 10 deletions src/main/java/net/glease/tc4tweak/ClientProxy.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,22 +23,25 @@
import net.minecraft.client.resources.IResourceManager;
import net.minecraft.client.resources.IResourceManagerReloadListener;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.StatCollector;
import net.minecraftforge.client.model.AdvancedModelLoader;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.entity.player.ItemTooltipEvent;
import net.minecraftforge.event.world.WorldEvent;
import org.apache.commons.lang3.reflect.FieldUtils;
import org.lwjgl.input.Mouse;
import thaumcraft.client.fx.other.FXSonic;
import thaumcraft.client.gui.GuiResearchRecipe;
import thaumcraft.client.gui.GuiResearchTable;
import thaumcraft.client.renderers.tile.TileAlchemyFurnaceAdvancedRenderer;
import thaumcraft.common.config.ConfigItems;

public class ClientProxy extends CommonProxy {
static long lastScroll = 0;
static Field fieldPage = null;
static Field fieldLastPage = null;
static Method methodPlayScroll = null;
static Field fieldModel = null;
static Method GuiResearchRecipeMouseClicked = null;
private static final int mPrevX = 261, mPrevY = 189, mNextX = -17, mNextY = 189;
private static final int paneWidth = 256, paneHeight = 181;
Expand Down Expand Up @@ -119,8 +122,6 @@ public void preInit(FMLPreInitializationEvent e) {
fieldLastPage.setAccessible(true);
methodPlayScroll = guiResearchTableClass.getDeclaredMethod("playButtonScroll");
methodPlayScroll.setAccessible(true);
fieldModel = FXSonic.class.getDeclaredField("model");
fieldModel.setAccessible(true);
} catch (Exception err) {
System.err.println("Cannot find thaumcraft fields. Aspect list scrolling will not properly function!");
err.printStackTrace();
Expand All @@ -139,13 +140,8 @@ public void preInit(FMLPreInitializationEvent e) {
((IReloadableResourceManager) resourceManager).registerReloadListener(new IResourceManagerReloadListener() {
@Override
public void onResourceManagerReload(IResourceManager ignored) {
try {
fieldModel.set(null, null);
} catch (IllegalAccessException | NullPointerException err) {
// illegal access exception is impossible
// NPE means ASM has failed somehow.
err.printStackTrace();
}
reflectiveReloadModel(FXSonic.class, "MODEL");
reflectiveReloadModel(TileAlchemyFurnaceAdvancedRenderer.class, "FURNACE");
}
});
}
Expand Down Expand Up @@ -207,4 +203,12 @@ public void onServerConnected(FMLNetworkEvent.ClientConnectedToServerEvent e) {
NetworkedConfiguration.resetClient();
}
}

private static void reflectiveReloadModel(Class<?> cls, String resLocationField) {
try {
FieldUtils.writeDeclaredStaticField(cls, "model", AdvancedModelLoader.loadModel((ResourceLocation) FieldUtils.readDeclaredStaticField(cls, resLocationField, true)), true);
} catch (ReflectiveOperationException e) {
// ignore
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,26 @@
import static net.glease.tc4tweak.asm.TC4Transformer.log;
import static org.objectweb.asm.Opcodes.*;

class FXSonicVisitor extends ClassVisitor {
class MakeModelStaticVisitor extends ClassVisitor {

private static final String FIELD_MODEL_DESC = "Lnet/minecraftforge/client/model/IModelCustom;";
private static final String FIELD_MODEL_NAME = "model";
private String thisName;

public FXSonicVisitor(int api, ClassVisitor cv) {
public MakeModelStaticVisitor(int api, ClassVisitor cv) {
super(api, cv);
}

@Override
public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
thisName = name;
super.visit(version, access, thisName, signature, superName, interfaces);
}

@Override
public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) {
if (name.equals(FIELD_MODEL_NAME) && desc.equals(FIELD_MODEL_DESC)) {
log.debug("Making field model static");
log.debug("Making field model static in {}", thisName);
return super.visitField(access | ACC_STATIC, name, desc, signature, value);
} else {
return super.visitField(access, name, desc, signature, value);
Expand All @@ -28,22 +35,24 @@ public FieldVisitor visitField(int access, String name, String desc, String sign

@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
return new FieldModelScrubberVisitor(api, name, desc, super.visitMethod(access, name, desc, signature, exceptions));
return new FieldModelScrubberVisitor(api, name, desc, thisName, super.visitMethod(access, name, desc, signature, exceptions));
}

private static class FieldModelScrubberVisitor extends MethodVisitor {
private final String name;
private final String desc;
private final String thisName;

public FieldModelScrubberVisitor(int api, String name, String desc, MethodVisitor mv) {
public FieldModelScrubberVisitor(int api, String name, String desc, String thisName, MethodVisitor mv) {
super(api, mv);
this.name = name;
this.desc = desc;
this.thisName = thisName;
}

@Override
public void visitFieldInsn(int opcode, String owner, String name, String desc) {
if (owner.equals("thaumcraft/client/fx/other/FXSonic") && name.equals(FIELD_MODEL_NAME) && desc.equals(FIELD_MODEL_DESC)) {
if (owner.equals(thisName) && name.equals(FIELD_MODEL_NAME) && desc.equals(FIELD_MODEL_DESC)) {
log.trace("Replacing opcode {} with {} in method {}{}", opcode, opcode - 2, this.name, this.desc);
if (opcode == GETFIELD) {
// before
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/net/glease/tc4tweak/asm/TC4Transformer.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public class TC4Transformer implements IClassTransformer {
.put("thaumcraft.client.gui.GuiResearchTable", new TransformerFactory(AddHandleMouseInputVisitor::new, Side.CLIENT))
.put("thaumcraft.client.gui.MappingThread", new TransformerFactory(MappingThreadVisitor::new, Side.CLIENT))
.put("thaumcraft.client.lib.UtilsFX", new TransformerFactory(UtilsFXVisitor::new, Side.CLIENT))
.put("thaumcraft.client.renderers.tile.TileAlchemyFurnaceAdvancedRenderer", TESRGetBlockTypeNullSafetyVisitor.FACTORY)
.put("thaumcraft.client.renderers.tile.TileAlchemyFurnaceAdvancedRenderer", TileAlchemyFurnaceAdvancedRendererVisitor.FACTORY)
.put("thaumcraft.client.renderers.tile.TileChestHungryRenderer", TESRGetBlockTypeNullSafetyVisitor.FACTORY)
.put("thaumcraft.client.renderers.tile.TileEldritchCapRenderer", TESRGetBlockTypeNullSafetyVisitor.FACTORY)
.put("thaumcraft.client.renderers.tile.TileEldritchObeliskRenderer", TESRGetBlockTypeNullSafetyVisitor.FACTORY)
Expand All @@ -61,7 +61,7 @@ public class TC4Transformer implements IClassTransformer {
.put("thaumcraft.client.renderers.tile.TileNodeRenderer", NodeLikeRendererVisitor.createFactory("renderNode"))
.put("thaumcraft.client.renderers.tile.ItemNodeRenderer", new TransformerFactory(ItemNodeRendererVisitor::new, Side.CLIENT))
.put("thaumcraft.common.tiles.TileMagicWorkbench", new TransformerFactory(TileMagicWorkbenchVisitor::new, Side.CLIENT))
.put("thaumcraft.client.fx.other.FXSonic", new TransformerFactory(FXSonicVisitor::new, Side.CLIENT))
.put("thaumcraft.client.fx.other.FXSonic", new TransformerFactory(MakeModelStaticVisitor::new, Side.CLIENT))
.put("thaumcraft.api.research.ResearchCategories", new TransformerFactory(ResearchCategoriesVisitor::new))
.put("thaumcraft.api.ThaumcraftApi", new TransformerFactory(ThaumcraftApiVisitor::new))
.put("thaumcraft.common.blocks.BlockFluxGas", new TransformerFactory(BlockFluxGasVisitor::new))
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package net.glease.tc4tweak.asm;

import org.lwjgl.opengl.GL11;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.MethodVisitor;

import static net.glease.tc4tweak.asm.TC4Transformer.log;
import static org.objectweb.asm.Opcodes.INVOKESTATIC;
import static org.objectweb.asm.Opcodes.SIPUSH;

// Bug initially discovered by @UnderscoreKilburn on github.
// inspiration: https://github.com/GTNewHorizons/Hodgepodge/pull/304
public class TileAlchemyFurnaceAdvancedRendererVisitor extends ClassVisitor {
static final TransformerFactory FACTORY = TESRGetBlockTypeNullSafetyVisitor.FACTORY
.chain(MakeModelStaticVisitor::new)
.chain(TileAlchemyFurnaceAdvancedRendererVisitor::new);

public TileAlchemyFurnaceAdvancedRendererVisitor(int api, ClassVisitor cv) {
super(api, cv);
}

@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
if (name.equals("renderQuadCenteredFromIcon")) {
log.debug("Visiting {}{}", name, desc);
return new RenderQuadCenteredFromIconVisitor(api, mv);
}
return mv;
}

private static class RenderQuadCenteredFromIconVisitor extends MethodVisitor {
public RenderQuadCenteredFromIconVisitor(int api, MethodVisitor mv) {
super(api, mv);
}

@Override
public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) {
if (opcode == INVOKESTATIC && owner.equals("net/minecraft/client/renderer/RenderHelper") && desc.equals("()V")) {
if (name.equals("disableStandardItemLighting")) {
log.trace("Replacing INVOKESTATIC {}#{}{} with GL11.glDisable(GL11.GL_LIGHTING)", owner, name, desc);
mv.visitIntInsn(SIPUSH, GL11.GL_LIGHTING);
mv.visitMethodInsn(INVOKESTATIC, "org/lwjgl/opengl/GL11", "glDisable", "(I)V", false);
} else if (name.equals("enableStandardItemLighting")) {
log.trace("Replacing INVOKESTATIC {}#{}{} with GL11.glEnable(GL11.GL_LIGHTING)", owner, name, desc);
mv.visitIntInsn(SIPUSH, GL11.GL_LIGHTING);
mv.visitMethodInsn(INVOKESTATIC, "org/lwjgl/opengl/GL11", "glEnable", "(I)V", false);
}
} else {
super.visitMethodInsn(opcode, owner, name, desc, itf);
}
}
}
}
4 changes: 4 additions & 0 deletions src/main/java/net/glease/tc4tweak/asm/TransformerFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,4 +45,8 @@ public final ClassVisitor apply(int api, ClassVisitor downstream) {
public boolean isExpandFrames() {
return expandFrames;
}

public final TransformerFactory chain(BiFunction<Integer, ClassVisitor, ClassVisitor> factory) {
return new TransformerFactory((i, cv) -> this.factory.apply(i, factory.apply(i, cv)), activeSide, expandFrames);
}
}
2 changes: 1 addition & 1 deletion version.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.5.19
1.5.20

0 comments on commit 5ad8c33

Please sign in to comment.