Jump to content

[1.11.2] Quick Question About Accessing Private Fields With Java Reflection


Recommended Posts

Posted

Hello, I'm creating a mod in which I'd like to adjust a value of one private variables in the Minecraft's original MapGenVillage.class. 

 

The variables I'm trying to change:

 

private int distance;

 

I made an attempts using the Reflection Helper to access and modify these values but:

 

ReflectionHelper.setPrivateValue(MapGenVillage.class, null, 8, 2);

 

Doesn't solve the problem at all (I think it throws a NullPointerException).

 

Is there a way I can change the value without an instance of the class?

Posted

No, it's an instance field so you need to specify which instance to change the field's value for.

 

If you get/set the value of a field or call a method with reflection more than once, you should use ReflectionHelper.findField/findMethod to look up the Field/Method object, store it in a private static field and then use it whenever you need to interact with the field/method. Looking up the Field/Method object is relatively slow, so you should only do it once.

  • Like 1

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

Posted

Thanks for the response, but the problem is that I want to edit that private value so that it allows villages to spawn closer together when vanilla minecraft generates them... I don't need to reference the value in my own mod's code. But if I need an instance, I might as well create my own custom MapGenVillage.class. I wasn't planning on doing this simply because I thought that'll be a lot of effort when I could just to change one private variable in vanilla minecraft's code to solve my problem

 

 

Posted

InitMapGen is fired when ChunkProviderOverworld/ChunkProviderHell initialise their MapGenBase instances, you can use this to replace or modify them.

 

InitMapGenEvent#getType will return InitMapGenEvent.EventType.VILLAGE when the MapGenBase being initialised (InitMapGenEvent#getOriginalGen) is a MapGenVillage.

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

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
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
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.

Announcements



×
×
  • Create New...

Important Information

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