Jump to content

My coremod ERRORED while changes base EntityRenderer.class...


Abastro
 Share

Recommended Posts

[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...

 

 

 

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

Link to comment
Share on other sites

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) {

	}
}

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

Link to comment
Share on other sites

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)

Link to comment
Share on other sites

I just only changed very few part of the class...

and there was nothing changed in EntityRenderer.class.

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

Link to comment
Share on other sites

I think the way he did it is an option.

If you want to do it properly: No it's not. If you go this route you do the exact same thing as a plain old base edit mod. If two mods change the same class everything goes boom.

That's not the case if you use bytecode manipulation (at least not that easy).

Link to comment
Share on other sites

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.

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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?

No. Not that simple. If two mods modify the same class file this will definitely go wrong unless the two mods know about each other and make precautions.

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.

If you only change the bytecode you really need you minimize the chance of getting in the way of others. Of course, if two people modify the exact same thing in a particular way things might explode. But the chances are much more unlikely
Link to comment
Share on other sites

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.