@@ -18,24 +18,22 @@ public class BetterLoadingScreenTransformer implements IClassTransformer, Opcode
1818
1919 @ Override
2020 public byte [] transform (String name , String transformedName , byte [] basicClass ) {
21- try {
22- if (transformedName .equals ("net.minecraft.client.Minecraft" )) return transformMinecraft (basicClass );
23- if (transformedName .equals ("cpw.mods.fml.client.SplashProgress" ))
24- return transformSplashProgress (basicClass );
25- if (name .equals ("com.mumfrey.liteloader.client.api.ObjectFactoryClient" ))
26- return transformObjectFactoryClient (basicClass );
27- } catch (Throwable t ) {
28- BetterLoadingScreen .log .error ("An issue occurred while transforming " + transformedName );
29- t .printStackTrace ();
21+ if (transformedName .equals ("net.minecraft.client.Minecraft" )) {
22+ return transformMinecraft (basicClass );
23+ }
24+ if (transformedName .equals ("cpw.mods.fml.client.SplashProgress" )) {
25+ return transformSplashProgress (basicClass );
26+ }
27+ if (name .equals ("com.mumfrey.liteloader.client.api.ObjectFactoryClient" )) {
28+ return transformObjectFactoryClient (basicClass );
3029 }
3130 return basicClass ;
3231 }
3332
3433 private byte [] transformObjectFactoryClient (byte [] before ) {
3534 ClassNode classNode = new ClassNode ();
3635 ClassReader reader = new ClassReader (before );
37- reader .accept (classNode , 0 );
38-
36+ reader .accept (classNode , ClassReader .SKIP_DEBUG );
3937 for (MethodNode m : classNode .methods ) {
4038 if (m .name .equals ("preBeginGame" )) {
4139 m .instructions .clear ();
@@ -50,93 +48,82 @@ private byte[] transformObjectFactoryClient(byte[] before) {
5048 m .instructions .add (new InsnNode (RETURN ));
5149 }
5250 }
53-
54- ClassWriter cw = new ClassWriter (ClassWriter .COMPUTE_FRAMES | ClassWriter .COMPUTE_MAXS );
51+ ClassWriter cw = new ClassWriter (ClassWriter .COMPUTE_MAXS );
5552 classNode .accept (cw );
5653 return cw .toByteArray ();
5754 }
5855
5956 private byte [] transformSplashProgress (byte [] before ) {
6057 ClassNode classNode = new ClassNode ();
6158 ClassReader reader = new ClassReader (before );
62- reader .accept (classNode , 0 );
63-
59+ reader .accept (classNode , ClassReader .SKIP_DEBUG );
6460 for (MethodNode m : classNode .methods ) {
6561 if (m .name .equals ("finish" )) {
6662 m .instructions .insert (
6763 new MethodInsnNode (INVOKESTATIC , "alexiil/mods/load/ProgressDisplayer" , "close" , "()V" , false ));
6864 }
6965 }
70-
71- ClassWriter cw = new ClassWriter (ClassWriter .COMPUTE_FRAMES | ClassWriter .COMPUTE_MAXS );
66+ ClassWriter cw = new ClassWriter (0 );
7267 classNode .accept (cw );
7368 return cw .toByteArray ();
7469 }
7570
7671 private byte [] transformMinecraft (byte [] before ) {
77- boolean hasFoundFMLClientHandler = false ;
78- boolean hasFoundGL11 = false ;
7972 ClassNode classNode = new ClassNode ();
8073 ClassReader reader = new ClassReader (before );
81- reader .accept (classNode , 0 );
74+ reader .accept (classNode , ClassReader .SKIP_DEBUG );
75+ int transformations = 0 ;
8276
8377 for (MethodNode m : classNode .methods ) {
84- if (hasFoundGL11 ) break ;
85- if (m .exceptions .size () == 1 && m .exceptions .get (0 ).equals ("org/lwjgl/LWJGLException" )) {
86- for (int i = 0 ; i < m .instructions .size (); i ++) {
87- AbstractInsnNode node = m .instructions .get (i );
88- if (node instanceof MethodInsnNode ) {
89- MethodInsnNode method = (MethodInsnNode ) node ;
90- if (method .owner .equals ("org/lwjgl/opengl/GL11" ) && method .name .equals ("glFlush" )) {
91- hasFoundGL11 = true ;
92- // This method throws an LWJGL exception, and calls GL11.glFlush(). This must be
93- // Minecraft.loadScreen()!
94- m .instructions .insertBefore (m .instructions .getFirst (), new InsnNode (RETURN ));
95- // just return from the method, as if nothing happened
96- break ;
97- }
78+ if ((m .name .equals ("aj" ) || m .name .equals ("loadScreen" )) && m .desc .equals ("()V" )) {
79+ m .instructions .clear ();
80+ m .instructions .add (new InsnNode (RETURN ));
81+ m .exceptions .clear ();
82+ m .tryCatchBlocks .clear ();
83+ m .localVariables = null ;
84+ m .visitMaxs (0 , 1 );
85+ transformations ++;
86+ break ;
87+ } else if ((m .name .equals ("ag" ) || m .name .equals ("startGame" )) && m .desc .equals ("()V" )) {
88+ for (AbstractInsnNode node : m .instructions .toArray ()) {
89+ if (node instanceof MethodInsnNode
90+ && ((MethodInsnNode ) node ).owner .equals ("cpw/mods/fml/client/FMLClientHandler" )
91+ && ((MethodInsnNode ) node ).name .equals ("instance" )) {
92+ m .instructions .insertBefore (
93+ node ,
94+ new MethodInsnNode (
95+ INVOKESTATIC ,
96+ "alexiil/mods/load/ProgressDisplayer" ,
97+ "minecraftDisplayFirstProgress" ,
98+ "()V" ,
99+ false ));
100+ transformations ++;
101+ break ;
98102 }
99103 }
100104 }
101- for (int i = 0 ; i < m .instructions .size (); i ++ ) {
105+ for (AbstractInsnNode node : m .instructions .toArray () ) {
102106 /*
103107 * LiteLoader disabling -NOTE TO ANYONE FROM LITELOADER OR ANYONE ELSE: I am disabling liteloader's
104108 * overlay simply because otherwise it switches between liteloader's bar and mine. I can safely assume
105109 * that people won't want this, and as my progress bar is the entire mod, they can disable this
106110 * behaviour by removing my mod (as all my mod does is just add a loading bar)
107111 */
108- AbstractInsnNode node = m .instructions .get (i );
109112 if (node instanceof MethodInsnNode ) {
110- MethodInsnNode method = (MethodInsnNode ) node ;
111- if (method .owner .equals ("com/mumfrey/liteloader/client/gui/startup/LoadingBar" )) {
112- m .instructions .remove (method );
113- continue ;
114- }
115- }
116- // LiteLoader removing end
117-
118- if (!hasFoundFMLClientHandler ) {
119- if (node instanceof MethodInsnNode ) {
120- MethodInsnNode method = (MethodInsnNode ) node ;
121- if (method .owner .equals ("cpw/mods/fml/client/FMLClientHandler" )
122- && method .name .equals ("instance" )) {
123- MethodInsnNode newOne = new MethodInsnNode (
124- INVOKESTATIC ,
125- "alexiil/mods/load/ProgressDisplayer" ,
126- "minecraftDisplayFirstProgress" ,
127- "()V" ,
128- false );
129- m .instructions .insertBefore (method , newOne );
130- hasFoundFMLClientHandler = true ;
131- }
113+ if (((MethodInsnNode ) node ).owner .equals ("com/mumfrey/liteloader/client/gui/startup/LoadingBar" )) {
114+ m .instructions .remove (node );
132115 }
133116 }
134117 }
135118 }
136119
137- ClassWriter cw = new ClassWriter (ClassWriter .COMPUTE_FRAMES | ClassWriter .COMPUTE_MAXS );
120+ if (transformations != 2 ) {
121+ throw new IllegalStateException ("BetterLoadingScreen couldn't not transform Minecraft properly!" );
122+ }
123+ ClassWriter cw = new ClassWriter (0 );
138124 classNode .accept (cw );
125+ final byte [] byteArray = cw .toByteArray ();
139126 BetterLoadingScreen .log .debug ("Transformed Minecraft" );
140- return cw . toByteArray () ;
127+ return byteArray ;
141128 }
142129}
0 commit comments