Jump to content

Compiled Mod throws exception, yet works fine from IDE


Cookiehook

Recommended Posts

Hello all,

I've written a couple of methods that use reflection to access private variables from ItemArmor, as their getter methods have been marked as ClientSide only, and don't work on dedicated servers. Line 96: https://github.com/Cookiehook/Minecraft-Liquid-Enchanting/blob/MC-1.12.2/src/main/java/com/cookiehook/liquidenchanting/init/ModItems.java

I'm writing my code using Jetbrains IntellliJ. When I run this code through the IDE, everything behaves as intended. Yet when I build the mod (using gralde build) and run the compiled JAR through a Forge server, I get NoSuchField exceptions thrown. I'm honestly baffled by this.

 

Can anyone help me understand why the two versions are behaving differently?

 

Cross-posted to MinecraftForum: https://www.minecraftforum.net/forums/mapping-and-modding-java-edition/minecraft-mods/modification-development/2941131-compiled-mod-throws-exception-yet-works-fine-from

Link to comment
Share on other sites

More information (OP was pre-coffee):

 

The purpose of this getting of private variables is a workaround for using potion's NBT data in crafting recipes, which is not supported by the JSON format. On item initialisation, the ItemPotionArmor's material, slot and potion name are added to a dictionary, using these concatenated strings as a key, and the instance of the ItemPotionArmor as a value. This dictionary is later used by the ShapedArmorUpgradeRecipe crafting recipe class. Once it has confirmed that the right vanilla items are present in crafting grid, it takes the previously mentioned values from the vanilla armor / potions in the grid, concatenates them together, and retrieves the relevant ItemPotionArmor instance to pass back as a result.

 

The ModItems.getMaterialName is called during item initialisation, in the preInit stage of mod loading. You can see the exceptions being thrown and printed in the server logs at this time. It is also called again when the final item in the recipe is placed in the crafting grid. To test, I've been using standard fire resistance potions and any armor piece.
 

Link to comment
Share on other sites

https://github.com/Cookiehook/Minecraft-Liquid-Enchanting/blob/MC-1.12.2/src/main/java/com/cookiehook/liquidenchanting/init/ModItems.java#L100

This happens because minecraft's code is obfuscated, meaning that the names of the fields in the deobfuscated(dev) version don't match the names in the build version. Use ReflectionHelper/ObfuscationReflectionHelper's methods. You must provide an SRG name of the field/method to those methods(if you are using ReflectionHelper then you must also provide the dev name). You can get the SRG name using mcpbot or you can find it on your pc in your gradle caches.

Unrelated to the issue but still issues with your code:

https://github.com/Cookiehook/Minecraft-Liquid-Enchanting/blob/MC-1.12.2/src/main/java/com/cookiehook/liquidenchanting/init/ModItems.java#L28

  • Don't ever use static initializers they can and will cause numerous issues. Instantinate your stuff directly in the appropriate registry event.
  • ItemBase is an antipattern, there is already an ItemBase, it's called Item.

https://github.com/Cookiehook/Minecraft-Liquid-Enchanting/blob/MC-1.12.2/src/main/java/com/cookiehook/liquidenchanting/init/ModItems.java#L60

https://github.com/Cookiehook/Minecraft-Liquid-Enchanting/blob/MC-1.12.2/src/main/java/com/cookiehook/liquidenchanting/init/ModItems.java#L146

You can't do this, since the method will be stripped away on the physical server. You might crash with a JVM error as a result because the method referenced in the code is no longer there. If you need to perform a side-specific operation use a proxy.

 

https://github.com/Cookiehook/Minecraft-Liquid-Enchanting/blob/MC-1.12.2/src/main/java/com/cookiehook/liquidenchanting/init/ModItems.java#L103

Don't just catch exceptions, scream that they are there and continue as if nothing happened. If an exception like this occured you should crash the game.

 

https://github.com/Cookiehook/Minecraft-Liquid-Enchanting/blob/MC-1.12.2/src/main/java/com/cookiehook/liquidenchanting/proxy/CommonProxy.java

A CommonProxy makes no sense. Proxies exist to separate sided-only code. If your code is common it goes anywhere else but your proxy.

 

Quote

serverSide = Reference.COMMON_PROXY_CLASS

This makes even less sense. Your common proxy can't be your server proxy. A server proxy either provides NOOP implementations for client-only methods or utilizes code that would crash the physical client. Common code is neither.

 

https://github.com/Cookiehook/Minecraft-Liquid-Enchanting/blob/MC-1.12.2/src/main/java/com/cookiehook/liquidenchanting/util/IHasModel.java

IHasModel is stupid. All items need models, no exceptions and nothing about model registration requires access to private/protected data. Register your models directly in the ModelRegistryEvent.

 

 

  • Like 1
Link to comment
Share on other sites

That'd do it, thanks! I knew the Minecraft was obfuscated, just didn't put two and two together here.

 

As to code quailty, I've not been proud of this code for a while, I know it's got a lot of problems, the most of which being I'm learning how to use Forge through YouTube tutorials, so there's a quite an amount of strange code that I really don't like. Thanks for the feedback, I'll be taking all of these into my code, and reading into the Forge docs to properly understand how to use proxies.

 

The only real rebuttal I want to make is regarding exception handling. I know full well that you shouldn't just throw away exceptions. I've intentionally thrown them away during the dev cycle so I can reproduce and pin them down without having to restart the game every time I hit one. That code would NOT end up in the release.

Link to comment
Share on other sites

6 hours ago, Cookiehook said:

That code would NOT end up in the release.

Except then you forget about it & it does, putting something like

if not dev environment crash

might be helpful

About Me

Spoiler

My Discord - Cadiboo#8887

My WebsiteCadiboo.github.io

My ModsCadiboo.github.io/projects

My TutorialsCadiboo.github.io/tutorials

Versions below 1.14.4 are no longer supported on this forum. Use the latest version to receive support.

When asking support remember to include all relevant log files (logs are found in .minecraft/logs/), code if applicable and screenshots if possible.

Only download mods from trusted sites like CurseForge (minecraft.curseforge.com). A list of bad sites can be found here, with more information available at stopmodreposts.org

Edit your own signature at www.minecraftforge.net/forum/settings/signature/ (Make sure to check its compatibility with the Dark Theme)

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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Hi! I'm following Kaupenjoe's guide and making an entity, and I get a problem where two animations mix into one when my entity walks - idle  anim plays together with walking. As I'm pretty new into coding and modding, I don't know everything about what I do following his guide and I'd like to set up animations in specific way: 1. When entity is doing nothing, idle animation plays; 2. When entity is walking, only walk animation is playing Here's the code for this entity's animations, it only has 2 at the moment. What should I fix here to get the result I need? public final AnimationState idleAnimationState = new AnimationState(); private int idleAnimationTimeout = 0; @Override public void tick() { super.tick(); if(this.level().isClientSide()){ setupAnimationStates(); } } private void setupAnimationStates() { if(this.idleAnimationTimeout <= 0) { this.idleAnimationTimeout = this.random.nextInt(40) + 80; this.idleAnimationState.start(this.tickCount); } else { --this.idleAnimationTimeout; } } @Override protected void updateWalkAnimation(float pPartialTick) { float f; if(this.getPose() == Pose.STANDING) { f = Math.min(pPartialTick * 6F, 1f); } else { f = 0f; } this.walkAnimation.update(f, 0.2f); } Hopefully I got into right forum topic, I'm not very used to forum posting xDD  
    • DAFTAR WSOSLOT88 KLIK DISINI ATAU KETIK GOOGLE >> WSOSLOT88.COM       Slot Freebet Terbaru tanpa deposit dan tanpa syarat telah mengubah paradigma perjudian daring dengan memberikan kesempatan yang luar biasa bagi para pemain untuk menikmati permainan Slot tanpa tekanan finansial atau kendala persyaratan. Ini adalah langkah revolusioner dalam industri perjudian online yang mengutamakan pengalaman pemain. Dengan menawarkan kesempatan untuk mencoba berbagai permainan dan peluang menang tanpa modal, Slot freebet ini menjadi pilihan yang sangat menarik bagi para pecinta Slot di seluruh dunia. Jadi, jangan lewatkan kesempatan emas ini untuk merasakan sensasi keseruan permainan Slot tanpa harus membayar sepeser pun! Keyword terkait : Slot Freebet Slot Freebet Tanpa Deposit Slot Freebet Tanpa Syarat Slot Freebet Terbaru Slot Freebet Gratis Slot Freebet Tanpa Deposit 2024 Slot Freebet Tanpa Deposit Tanpa Syarat 2024 Slot Freebet 15k Tanpa Deposit Tanpa Syarat 2024 Slot Freebet 25k Tanpa Deposit Tanpa Syarat 2024 Slot Freebet 50k Tanpa Deposit Tanpa Syarat
    • Add crash-reports with sites like https://paste.ee/ and paste the link to it here   Delete the session.lock from the worldsave and test it again
    • Maybe it is a specific mod which is not working with this launcher
  • Topics

×
×
  • Create New...

Important Information

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