Saturday, 21 February 2015

Minecraft Forge 1.7.2 stopped working

Minecraft Forge 1.7.2 stopped working with a new Java update. Fortunately this post details how to fix it.

I quote:

So you may have heard that as of Java 8 update 20, a bug came to light in Forge which causes a crash at startup. This appears to affect both Minecraft 1.6 and 1.7. Fortunately, later versions of Forge for 1.7.10 correct the issue. But 1.6.4 and 1.7.2 are still affected, as are many versions for 1.7.10 still in use. You could easily just use Java 7, or Java 8 update 11, and not be affected by this bug. But for future-proofing sake, in case someone wants to run Java 8 but a security issue is discovered at some point in the future which makes update 11 not very safe, I decided to just fix Forge.

Only one file is the problem, so that's all you need:

CoreModManager.class, for Forge #965 for Minecraft 1.6.4.
CoreModManager.class, for Forge #1121 / #1147 for Minecraft 1.7.2
CoreModManager.class, for Forge #1208 for Minecraft 1.7.10

-- Vanilla --

I'm going to assume you already have Forge installed into the vanilla launcher for these instructions.

From here you need to find your way into your libraries directory for Forge. On Windows, the direct route would be:

For 1.6.4: %appdata%\.minecraft\libraries\net\minecraftforge\minecraftforge\

For 1.7.2: %appdata%\.minecraft\libraries\net\minecraftforge\forge\1.7.2- (or switch 1147 for the version you're using)

For 1.7.10: %appdata%\.minecraft\libraries\net\minecraftforge\forge\1.7.10-

If you use Linux then you know your way around your home directory. And if you use OSX, then I'm sure someone else can help you find it, but I imagine that your base Minecraft directory is in your home directory somewhere as well like Linux.

You can make a backup of the JAR if you want at this point. But now open up the JAR in WinRAR or what ever program you use for such things. First, go ahead and delete the META-INF directory in the root of the JAR, or you'll get a crash related to security, just like in the old JAR-modding days. Now navigate your way through cpw/mods/fml/relauncher. You should see a CoreModManager.class in here. Just drop this patched version on top, and you should be good to go!

-- FTB --

This is relatively identical to the above instructions. The only difference is that you have to find the libraries directory inside your FTB directory instead. Then do the same process as above, and this should fix every related pack on the launcher.

-- Technic --

This is a bit different. You need to patch individual modpacks. And every time a pack is updated, you'll probably have to patch it again. But it's not a big deal. For this, first go into your packs directory. For Windows this is: %appdata%\.technic\modpacks

Now go into whichever pack you want to fix. For this example we'll use the main Tekkit. So navigate into tekkitmain, then into bin. You should see a modpack.jar here. This is basically your Forge JAR. Follow the process of above for patching the JAR, of deleting META-INF and adding the class file into the appropriate place, and your pack should now run again.

-- ATLauncher --

Again, this is slightly different, requiring you to fix per-instance like Technic. Go to your ATLauncher directory, then into instances. Find the instance you want to repair, then go into jarmods. You should see the Forge JAR here. So do the above mentioned process to patch the JAR, and the pack should be fixed. Like Technic, updates might break it.

-- MultiMC -- 

I have no easy fix for this at this time, because it automatically redownloads the Forge JAR after it detects modification, which is both nice and annoying depending on the situation!

-- Servers --

In this case, Forge will already be in the server JAR. You won't want to erase all of META-INF or the server won't launch, just deleting FORGE.DSA is enough according to DAOWAce's post below. Then just copy the class file you downloaded into the appropriate place in the JAR.

-- Misc --

Now for the technical details of what this does, for those interested. Java 8 update 20 changed the way Collections.sort works, no longer cloning a List but modifying it in-place. Since FML is iterating this list at this particular moment, you get the crash. So what this patch does is replace Collections.sort with a wrapper function inside CoreModManager.

It does this:

public static <T> void sort(List<T> list, Comparator<? super T> c)
T[] toSort = list.toArray((T[])new Object[list.size()]);
Arrays.sort(toSort, c);
for (int j = 0; j < toSort.length; j++) list.set(j, toSort[j]);

This is basically a modified version of the same code used to fix later versions of FML, just implemented differently for the sake of a patch.

What I did was compile this bit of code in an otherwise empty class, then used Java Bytecode Editor to extract the bytecode from that class and create the identical method in CoreModManager. Lastly I modified the sortTweakList method to invoke cpw/mods/fml/relauncher/CoreModManager/sort instead of java/util/Collections/sort. You can use JBE to confirm youself that that's the only difference between this patched file and the original if you're concerned at all.

There's a chance that the 1.6.4 patch will work on other versions of Forge for 1.6.x, you would just have to try it and see. The two 1.7.2 builds are the 'latest' and 'recommended' ones, and both had an identical version of CoreModManager, though it might work on earlier builds for that version as well if necessary.

Hope this helps!

No comments:

Post a Comment