diff --git a/dependencies.gradle b/dependencies.gradle index 9a6ea83..539c903 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -41,7 +41,7 @@ dependencies { compile(deobfCurse("biomesoplenty-220318:2499612")) //Biome Tweaker 2.0.182 - compileOnly(deobfCurse("biometweaker-228895:2279911")) + compile(deobfCurse("biometweaker-228895:2279911")) //Biome Wand 1.1.9 //Mirrored at: https://maven.falsepattern.com/mirror/mirror/1.7.10-Biome-Wand-1.1.9.jar @@ -82,7 +82,7 @@ dependencies { compileOnly(deobfCurse("lotrmod-423748:3646430")) //More Fun Quicksands Mod 1.0.8.8-fixed - compileOnly(deobfCurse("more-fun-quicksand-mod-321960:2717318")) + compile(deobfCurse("more-fun-quicksand-mod-321960:2717318")) //Nature's Compass 1.3.1 compile(deobfCurse("naturescompass-252848:2451823")) @@ -105,7 +105,7 @@ dependencies { compile(deobfCurse("twilightforest-227639:3039937")) //Underground Biomes Constructs 0.8-beta49 - compileOnly(deobfCurse("undergroundbiomesconstructs-72744:2304497")) + compile(deobfCurse("undergroundbiomesconstructs-72744:2304497")) //WorldEdit 6.1.1 compileOnly(deobfCurse("worldedit-225608:2309699")) diff --git a/src/main/java/com/falsepattern/endlessids/asm/IETransformer.java b/src/main/java/com/falsepattern/endlessids/asm/IETransformer.java index 44f1bcf..312b183 100644 --- a/src/main/java/com/falsepattern/endlessids/asm/IETransformer.java +++ b/src/main/java/com/falsepattern/endlessids/asm/IETransformer.java @@ -2,6 +2,7 @@ package com.falsepattern.endlessids.asm; import com.falsepattern.endlessids.Tags; import com.falsepattern.endlessids.asm.transformer.ChunkProviderSuperPatcher; +import com.falsepattern.endlessids.asm.transformer.DevFixer; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.objectweb.asm.ClassReader; @@ -29,7 +30,7 @@ public class IETransformer implements IClassTransformer { public byte[] transform(final String name, final String transformedName, final byte[] bytes) { if (bytes == null) { - return bytes; + return null; } ClassEdit edit = ClassEdit.get(transformedName); final ClassNode cn = new ClassNode(Opcodes.ASM5); @@ -39,9 +40,12 @@ public class IETransformer implements IClassTransformer { if (cn.interfaces.contains("apu") || cn.interfaces.contains("net/minecraft/world/chunk/IChunkProvider")) { edit = ClassEdit.ChunkProviderSuperPatcher; } else { - return bytes; + return isObfuscated ? bytes : DevFixer.fixDev(bytes); } } + if (!isObfuscated) { + DevFixer.transform(cn); + } IETransformer.logger.debug("Patching {} with {}...", transformedName, edit.getName()); try { edit.getTransformer().transform(cn, IETransformer.isObfuscated); diff --git a/src/main/java/com/falsepattern/endlessids/asm/transformer/DevFixer.java b/src/main/java/com/falsepattern/endlessids/asm/transformer/DevFixer.java new file mode 100644 index 0000000..0d45ddc --- /dev/null +++ b/src/main/java/com/falsepattern/endlessids/asm/transformer/DevFixer.java @@ -0,0 +1,78 @@ +package com.falsepattern.endlessids.asm.transformer; + +import com.falsepattern.endlessids.asm.ClassEdit; +import com.falsepattern.endlessids.asm.IClassNodeTransformer; +import com.falsepattern.endlessids.asm.IETransformer; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import lombok.SneakyThrows; +import lombok.val; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.tree.ClassNode; +import org.objectweb.asm.tree.FieldInsnNode; +import org.objectweb.asm.util.CheckClassAdapter; + +import net.minecraft.launchwrapper.Launch; + +import java.io.IOException; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class DevFixer { + private static final ClassNode blocks; + static { + if (IETransformer.isObfuscated) { + blocks = null; + } else { + try { + byte[] blox = Launch.classLoader.getClassBytes("net/minecraft/init/Blocks"); + blocks = new ClassNode(Opcodes.ASM5); + final ClassReader reader = new ClassReader(blox); + reader.accept(blocks, 0); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + + public static byte[] fixDev(byte[] classBytes) { + if (IETransformer.isObfuscated) { + return classBytes; + } + val cn = new ClassNode(Opcodes.ASM5); + val reader = new ClassReader(classBytes); + reader.accept(cn, 0); + transform(cn); + val writer = new ClassWriter(0); + val check = new CheckClassAdapter(writer); + cn.accept(check); + return writer.toByteArray(); + } + + @SneakyThrows + public static void transform(final ClassNode cn) { + if (IETransformer.isObfuscated) { + return; + } + for (val method: cn.methods) { + val instructions = method.instructions; + int insnCount = instructions.size(); + for (int i = 0; i < insnCount; i++) { + val insn = instructions.get(i); + if (insn instanceof FieldInsnNode) { + val field = (FieldInsnNode) insn; + if (field.getOpcode() == Opcodes.GETSTATIC && + field.owner.equals("net/minecraft/init/Blocks")) { + for (val blockField: blocks.fields) { + if (blockField.name.equals(field.name) && + !blockField.desc.equals(field.desc)) { + field.desc = blockField.desc; + } + } + } + } + } + } + } +} diff --git a/src/main/java/com/falsepattern/endlessids/mixin/plugin/TargetedMod.java b/src/main/java/com/falsepattern/endlessids/mixin/plugin/TargetedMod.java index 9719d67..7091d9c 100644 --- a/src/main/java/com/falsepattern/endlessids/mixin/plugin/TargetedMod.java +++ b/src/main/java/com/falsepattern/endlessids/mixin/plugin/TargetedMod.java @@ -28,14 +28,14 @@ public enum TargetedMod implements ITargetedMod { GALACTICRAFTCORE("GalactiCraftCore", false, startsWith("galacticraftcore")), ICG("Immersive Cavegen", true, startsWith("immersivecavegen")), LOTR("LOTR Mod", false, startsWith("lotrmod")), - MFQM("More Fun Quicksand Mod", false, startsWith("morefunquicksandmod-")), + MFQM("More Fun Quicksand Mod", true, startsWith("morefunquicksandmod-")), NATURESCOMPASS("Nature's Compass", true, startsWith("naturescompass")), NETHERLICIOUS("Netherlicious", true, startsWith("netherlicious-")), RTG("Realistic Terrain Generation", true, startsWith("rtg-")), THAUMCRAFT("Thaumcraft", true, startsWith("thaumcraft")), TROPICRAFT("Tropicraft", true, startsWith("tropicraft-")), TWILIGHTFOREST("Twilight Forest", true, startsWith("twilightforest")), - UBC("Underground Biomes Constructs", false, startsWith("undergroundbiomesconstructs-")), + UBC("Underground Biomes Constructs", true, startsWith("undergroundbiomesconstructs-")), WORLDEDIT("WorldEdit", false, startsWith("worldedit-")), ;