Posted December 4, 201410 yr Hi, im playing round with a dead mod someone has asked to come back, and it has over 80 items to add, i cant be bothered defining all of them in the useual way so im writing a method that gets all the classes within a directory, the items directory and initializes them for me, GameRegistry and all. now i am new to classloader, i did it in a test project like so: /**** SampleClass.class ****/ private int numberz; public SampleClass(int number) { numberz = number; } public get() { return numberz; } /**** Main Class ****/ File file = (ClassLoader.getSystemResource("test").getPath()); //the package File[] files = file.listFiles(); for(File : files) System.out.println(f.getName().replace(".class","")); Class<?> claz = Class.forName("test.SampleClass"); Constructor<?> constr = claz.getConstructor(int.class); Object object = constr.newInstance(5); System.out.println(((SampleClass)object).get()); /**** Console ****/ file:/C:/****/eclipse/test/bin/test App SampleClass 5 so as you can see, it worked perfectly in that example. however when i applied it to the mod, it gets stuck on ClassLoader.getResource(classPath); the exception is NullPointerException, but when i run it in debug mode, it clearly does get passed the directory of the item classes: EDIT: i found that i have to use FML's class loader, didnt realise there was more than one, its called: "LaunchClassLoader" and i did this: private String[] searchClasspath(String classPath) { URL url = LaunchClassLoader.getSystemResource(classPath); String path = url.getPath(); File file = new File(path); File[] files = file.listFiles(); String[] names= new String[files.length]; for(int i = 0; i<files.length; i++) names[i] = classPath+"."+(files[i].getName().replace(".class", "")); return names; } when it passes Url url = * url is null, it didnt get anything, the class path i gave it is right, does any one know what im doing wrong, help would be apreciated. <iframe src="http://widget.mcf.li/mc-mods/minecraft/225523-gnomgnoms-utils" width="100%" style="border: none;"></iframe>
December 4, 201410 yr Author i found an event i thought i could use, FMLConstructionEvent. but when i use it, all the urls in it, get resource("") : Enumeration<URL>, geturls : URL[], findResource() : URL all return null. <iframe src="http://widget.mcf.li/mc-mods/minecraft/225523-gnomgnoms-utils" width="100%" style="border: none;"></iframe>
December 4, 201410 yr i found an event i thought i could use, FMLConstructionEvent. but when i use it, all the urls in it, get resource("") : Enumeration<URL>, geturls : URL[], findResource() : URL all return null. For what you are trying to do, I don't think you need a classloader.
December 4, 201410 yr Author Curiosity, aswell as there being 80+ item classes, and initializing & registering them all is a pain, be even more of a pain when the next version comes round, the idea of this is to setup the item classes so they setup themselves (this.setunlololizedname();this.setTexture();this.setCreativeTab()), put them all in one package, get all the files within that package, build a class from each of them and initialize/register them all in a loop, then add them to a hashmap, the key being the unlocolized name. this means i can also easily use it in other mods aswell. <iframe src="http://widget.mcf.li/mc-mods/minecraft/225523-gnomgnoms-utils" width="100%" style="border: none;"></iframe>
December 4, 201410 yr Or, you could write a small java program to automatically generate a text file containing the appropriate source code for registering all the items, then add that source code to your project. Probably a lot faster... -TGG
December 4, 201410 yr Author i dont think making a seperate program like that would be quicker. and i got it working. it was only like 30 odd lines for code to do it, but works fune now. thanks for then help. <iframe src="http://widget.mcf.li/mc-mods/minecraft/225523-gnomgnoms-utils" width="100%" style="border: none;"></iframe>
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.