Jump to content

[1.10.2] Modifying the enchantment levels based on the the player


gibraltar

Recommended Posts

I'd like to modify the enchantment levels offered in each slot (not the enchantments themselves), based on the player (NBT tags, or items they are carrying, etc.). After looking through the ContainerEnchantment and EnchantmentHelper classes, it appears the only way to do that currently would be with IClassTransformer. But that's a no-no.

 

So, is there a different way to do this that I'm missing? If not, how would I go about adding an event to forge to make this possible? I'd be happy if the normal calculation occured, and I could just modify the levels before the actual enchantments are calculated based on the level.

Link to comment
Share on other sites

I'd like to modify the enchantment levels offered in each slot (not the enchantments themselves), based on the player (NBT tags, or items they are carrying, etc.). After looking through the ContainerEnchantment and EnchantmentHelper classes, it appears the only way to do that currently would be with IClassTransformer. But that's a no-no.

 

So, is there a different way to do this that I'm missing? If not, how would I go about adding an event to forge to make this possible? I'd be happy if the normal calculation occured, and I could just modify the levels before the actual enchantments are calculated based on the level.

Two things come to my mind that must be done. Substitute the enchantments so they can have higher levels. And the second override ContainerEnchantment using ContainerEvent.Open by calling your open event.

 

Edit: To add a event to forge you need to go to there github (search for it) and then submit a pull request you should be able to find how to do that on their github.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Link to comment
Share on other sites

The reason I'm asking about events is because I've already gone down the route of overriding the ContainerEnchantment class. To do what I'm trying to accomplish, I'd almost need to copy all of the code over (not super maintainable going forward), because I need to make minor changes inside the onCraftMatrixChanged method. And not at the beginning or end of it, or I could just call the base implementation. They have to fit in between the loop that calculates the enchant levels and the loop that uses those to get the actual enchantments. Unfortunately, it calls private methods and uses private fields, which won't be available. Making the whole thing quite hacky, if I can even get it to work.

 

 

Link to comment
Share on other sites

Post code, and private fields can be accessed through reflection; methods on the other hand should not be edited at all. Thus, the overriding the container by extending the container, you can submit a Pull Request on their github to add an event provide code and I think a patch file.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Link to comment
Share on other sites

The problem is not that the method he wants to override is private, but that that method invokes other methods which are private.  So to duplicate the base (public) function he needs to duplicate several private methods as well.

 

I'd suggest a forge PR that makes those methods and fields protected.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

Looks good, but for one thing that I made a comment about.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

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