Posted January 12, 201411 yr Hey, in 1.6.4, it was possible to access private/protected fields and methods because Forge would make them all public on runtime, but I can't quite get it working in 1.7.2 because it's harder to edit Minecraft sources. Here's what I have got so far - I setup Forge using gradlew.bat setupDecompWorkspace eclipse, extracted the sources from Gradle cache (forge-1.7.2-10.12.0.998-src.jar) and put it in Eclipse. Now, it works fine when I run it in Eclipse, but not when I try to build it. I built a jar file with changed Minecraft sources, but I'm not quite sure how to force Gradle to use it instead of the original one - if I replace one of the jars in cache, Gradle notices and replaces it. I've never worked with Gradle before, and the ability to change accessibility is very important, so if anyone has figured out how to get it working, please let me know . Also, don't suggest reflection, that would be the very last resort.
January 12, 201411 yr Using an access transformer. The *_at.cfg file will be detected by ForgeGradle on setup, and the changes will be applied to the source.
January 12, 201411 yr Author Using an access transformer. The *_at.cfg file will be detected by ForgeGradle on setup, and the changes will be applied to the source. That's pretty fancy, got it working. Thanks!
January 12, 201411 yr You also can use reflexion to access private or protected variables or methods. I had to do it to acces a protected variable in the block class and it works fine. In fact it's easy to achieve.
January 13, 201411 yr You also can use reflexion to access private or protected variables or methods. I had to do it to acces a protected variable in the block class and it works fine. In fact it's easy to achieve. When I do that I get the Exception Message: Class [mymod] can not access a member of class net.minecraft.entity.monster.EntityEnderman with modifiers "private static" When using Reflection, are the sources also required as chylex instructed? If yes, where the gradle cache? Any help is very appreciated!
January 13, 201411 yr For private or protected methods anf fields you have to specify for your field or method that you allows acces by adding field.setAccessible(true); or method.setAccessible(true);
January 14, 201411 yr For private or protected methods anf fields you have to specify for your field or method that you allows acces by adding field.setAccessible(true); or method.setAccessible(true); Thanks for your answer, that worked!
August 15, 201411 yr Always keep in mind though that reflection gives quite a performance penalty. The penalty is not always high as shown for example here. Also if reflection is used not that often (e.g. few calls after an entity spawn or after world is created) it really doesn't matter what technique is used (but ATs are more difficult to setup and can change a lot in future versions, just as changed now with gradle). mnn.getNativeLang() != English If I helped you please click on the "thank you" button.
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.