Abastro Posted August 21, 2013 Posted August 21, 2013 [move][/move]I made some coremod which changes base EntityRenderer.class (and WorldProvider.class) And I got this error. This is the Error Log: 2013-08-21 17:18:52 [iNFO] [sTDERR] [17:18:52] [ERROR] Class.getDeclaredFields0:-2->MinecraftLauncher.main:214: Unhandled error launching minecraft: java.lang.NoClassDefFoundError: Lnet/minecraft/client/renderer/EntityRenderer; 2013-08-21 17:18:52 [iNFO] [sTDERR] java.lang.Class.getDeclaredFields0(Native Method) 2013-08-21 17:18:52 [iNFO] [sTDERR] java.lang.Class.privateGetDeclaredFields(Unknown Source) 2013-08-21 17:18:52 [iNFO] [sTDERR] java.lang.Class.getDeclaredField(Unknown Source) 2013-08-21 17:18:52 [iNFO] [sTDERR] cpw.mods.fml.relauncher.ReflectionHelper.findField(ReflectionHelper.java:78) 2013-08-21 17:18:52 [iNFO] [sTDERR] cpw.mods.fml.relauncher.ReflectionHelper.setPrivateValue(ReflectionHelper.java:136) 2013-08-21 17:18:52 [iNFO] [sTDERR] cpw.mods.fml.relauncher.FMLRelauncher.setupNewClientHome(FMLRelauncher.java:135) 2013-08-21 17:18:52 [iNFO] [sTDERR] cpw.mods.fml.relauncher.FMLRelauncher.relaunchApplet(FMLRelauncher.java:260) 2013-08-21 17:18:52 [iNFO] [sTDERR] cpw.mods.fml.relauncher.FMLRelauncher.appletEntry(FMLRelauncher.java:229) 2013-08-21 17:18:52 [iNFO] [sTDERR] net.minecraft.client.MinecraftApplet.init(MinecraftApplet.java:25) 2013-08-21 17:18:52 [iNFO] [sTDERR] net.minecraft.Launcher.init(Launcher.java:85) 2013-08-21 17:18:52 [iNFO] [sTDERR] net.ftb.mclauncher.MinecraftFrame.start(MinecraftFrame.java:149) 2013-08-21 17:18:52 [iNFO] [sTDERR] net.ftb.mclauncher.MinecraftLauncher.main(MinecraftLauncher.java:208) Please Help me... Quote I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP) II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.
ILuvYouCompanionCube Posted August 21, 2013 Posted August 21, 2013 It's hard to tell where is the error looking at just a small piece of the crash report Quote
Abastro Posted August 21, 2013 Author Posted August 21, 2013 The Error log was full log. I followed coolgooner's tutorial, and this is my code: StellarClassTransformer: package stellarium.core; import java.io.*; import java.util.zip.*; import cpw.mods.fml.relauncher.IClassTransformer; public class StellarClassTransformer implements IClassTransformer { @Override public byte[] transform(String name, String transformedName, byte[] bytes) { if (name.equals("acn") || name.equals("net.minecraft.world.WorldProvider")) { System.out.println("********* INSIDE WorldProvider TRANSFORMER ABOUT TO PATCH: " + name); bytes = patchClassInJar(name, bytes, name, StellarLoadingPlugin.location); } if (name.equals("bfq") || name.equals("net.minecraft.client.renderer.EntityRenderer")) { System.out.println("********* INSIDE EntityRenderer TRANSFORMER ABOUT TO PATCH: " + name); bytes = patchClassInJar(name, bytes, name, StellarLoadingPlugin.location); } return bytes; } public byte[] patchClassInJar(String name, byte[] bytes, String ObfName, File location) { try { //open the jar as zip ZipFile zip = new ZipFile(location); ZipEntry entry = zip.getEntry(name.replace('.', '/') + ".class"); if (entry == null) { System.out.println(name + " not found in " + location.getName()); } else { //serialize the class file into the bytes array InputStream zin = zip.getInputStream(entry); bytes = new byte[(int) entry.getSize()]; zin.read(bytes); zin.close(); System.out.println("[" + "StellariumCore" + "]: " + "Class " + name + " patched!"); } zip.close(); } catch (Exception e) { throw new RuntimeException("Error overriding " + name + " from " + location.getName(), e); } //return the new bytes return bytes; } } StellarLoadingPlugin: package stellarium.core; import java.io.File; import java.util.Map; import cpw.mods.fml.relauncher.IFMLLoadingPlugin; public class StellarLoadingPlugin implements IFMLLoadingPlugin { public static File location; @Override public String[] getLibraryRequestClass() { // TODO Auto-generated method stub return null; } @Override public String[] getASMTransformerClass() { return new String[]{StellarClassTransformer.class.getName()}; } @Override public String getModContainerClass() { // TODO Auto-generated method stub return StellarDummyContainer.class.getName(); } @Override public String getSetupClass() { // TODO Auto-generated method stub return null; } @Override public void injectData(Map<String, Object> data) { location = (File) data.get("coremodLocation"); } } StellarDummyContainer: package stellarium.core; import java.util.Arrays; import com.google.common.eventbus.Subscribe; import com.google.common.eventbus.EventBus; import cpw.mods.fml.common.DummyModContainer; import cpw.mods.fml.common.LoadController; import cpw.mods.fml.common.ModMetadata; import cpw.mods.fml.common.event.FMLConstructionEvent; import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.event.FMLPostInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; public class StellarDummyContainer extends DummyModContainer { public StellarDummyContainer() { super(new ModMetadata()); ModMetadata meta = getMetadata(); meta.modId = "StellariumCore"; meta.name = "StellariumCore"; meta.version = "0.0.0"; meta.credits = "Not Decided"; meta.authorList = Arrays.asList("Abastro"); meta.description = ""; meta.url = "http://blog.naver.com/abab9579"; meta.updateUrl = ""; meta.screenshots = new String[0]; meta.logoFile = ""; } @Override public boolean registerBus(EventBus bus, LoadController controller) { bus.register(this); return true; } @Subscribe public void modConstruction(FMLConstructionEvent evt){ } @Subscribe public void preInit(FMLPreInitializationEvent evt) { } @Subscribe public void init(FMLInitializationEvent evt) { } @Subscribe public void postInit(FMLPostInitializationEvent evt) { } } Quote I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP) II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.
ILuvYouCompanionCube Posted August 21, 2013 Posted August 21, 2013 Do you get all your System.out.println() messages as expected? Meaning, all the methods are being invoked and all the if conditions are being met? Quote
Abastro Posted August 21, 2013 Author Posted August 21, 2013 Then How can I edit Base classes? Quote I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP) II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.
ILuvYouCompanionCube Posted August 21, 2013 Posted August 21, 2013 I think the way he did it is an option. When you need to change a lot of stuff, you can provide a substitute class file for the class that you need to be changed. But of course, it must have all the fields and methods of the old class, with the same descriptors. and nothing can be made less accessible than before. And the return values of methods and the values of the fields must always be coherent with the original class'. Other than that, I think he can do that, as long as he doesn't actually overwrite the original class file in it's disk location... and same fully qualified name for the class, and same annotations for methods and fields (in this last case, just to be safe... It's a large code, and some changed annotation may break something somewhere) Quote
Abastro Posted August 21, 2013 Author Posted August 21, 2013 I just only changed very few part of the class... and there was nothing changed in EntityRenderer.class. Quote I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP) II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.
Abastro Posted August 21, 2013 Author Posted August 21, 2013 I solved this problem by preventing the Entityplayer class from patching. and I'll let it collide if some other mod tries to patch the WorldProvider class. Quote I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP) II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.
ILuvYouCompanionCube Posted August 21, 2013 Posted August 21, 2013 I think something would go wrong only if another mod tryed to modify lines he already modified in his substitute of the class file, right? And wouldn't that same something go wrong as if he had modified those same lines via ClassVisitors and all that? I think that if he keeps the class as similar to the original as possible, there's as much harm in doing his way as in doing the ClassVisitor way. And even using the ClassVisitor way you could rewrite the whole class file and change it completely if you wanted. Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.