Jump to content

[1.12] How to get crafting result from a custom crafting table?


ctbe

Recommended Posts

I made a custom crafting table. In the Container it has a variable of type InventoryCrafting named craftMatrix, like the ContainerWorkbench class. It also has a variable of type InventoryCraftResult named craftResult. The thing is that that when I craft something and put the resulting ItemStack in the output slot, I can take it from it, but the ItemStacks in craftMatrix, increase twice in size. I debugged for hours to find what was going on and found that the responsible for said behavior was the method slotClick from the Container class. I overrode the slotClick method and canceled the call to super, but if I do that, I can't move items in or out the custom crafting table.

 

Debugging was hard because the super slotClick method is huge and is not commented. It was hard to put so many breakpoints just to see what the code was doing and I still don't know why it does what it does. The call to super is doing this:

 

  1. Allows the player to take the item.
  2. Reduces the stack count in craftMatrix by one.
  3. It doubles the stack count in craftMatrix.

 

So for example, if you had 4 planks in one slot on the craftMatrix (not the output), after taking the output of the crafting table, it leaves you with 3 planks, and then it converts those to 6 planks. If you take a result again, it reduces the planks to 5, then it makes them be 10. All that happens in the slotClick method of the Container class. I cannot identify why or how it is doing so. This is all my code in the overridden slotClick method

 

  override def slotClick(slotId: Int, dragType: Int, clickTypeIn: ClickType, player: EntityPlayer): ItemStack = {
    super.slotClick(slotId, dragType, clickTypeIn, player)
  }

 

If I change that code to return the ItemStack of the slot that was clicked and cancel the call to super, nothing happens. I can't use the crafting table at all. Is there a way to get the result of the crafting table without the items in the craftMatrix being duplicated?

 

Edit: I found what is duplicating the size, but don't know if it is a bug. The slotClick super method is calling the method onTake on the output slot (craftResult in this case). Inside there it gets two stacks in two variables. The stacks are the same ones. Each one represent a stack in the craftingMatrix, only that the code is getting the same stack in each variable. Then it compares if the ItemStacks are equal. If they are, it grows the stacks.

 

Edit: I can finally see what is going on. It is a lengthy process. The reason it works on normal crafting tables and not on custom ones is that normal crafting tables deal with recipes of type IRecipe that are in the game registry. When that happens, the onTake method gets a list of empty stacks and as a consequence it doesn't grow the craftingMatrix of the ContainerWorkbench in the method. If you are making a custom crafting table so your table recipes are therefore custom and not registered in the game registry as IRecipe, you will get a list that is equal to that of the craftingMatrix. That causes the onTake method to decrease the stack size by one and then duplicate it.

 

Only workarounds I find is either register my custom crafting table recipes as IRecipe in the game registry or remember the stack sizes before calling super in slotClick so that I can restore it after the call. But I don't know what will happen if I register my custom recipes in the game registry. I mean, the whole point of a custom crafting table is to have crafting that can be done only on that table. If the crafting can be done on a normal crafting table then the custom crafting table is useless.

Edited by ctbe
Add information
Link to comment
Share on other sites

The problem is in your recipe class's getRemainingItems method.

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

19 minutes ago, Draco18s said:

The problem is in your recipe class's getRemainingItems method.

Yes. I just found that out and edited my main post. :(

 

I'll check how to fix it because my recipes are custom, but don't extend IRecipe. I was using another way of matching recipes, etc. Now I understand it wasn't the correct way. My question is though, if I register my custom recipes (as IRecipe) in the GameRegistry, will they be craftable in a normal crafting table? Because I want them only be craftable on my custom crafting table, not a normal one.

Edited by ctbe
Link to comment
Share on other sites

16 minutes ago, ctbe said:

if I register my custom recipes (as IRecipe) in the GameRegistry, will they be craftable in a normal crafting table? Because I want them only be craftable on my custom crafting table, not a normal one.

Edited 15 minutes ago by ctbe

Yes they will be craftable as long as they are not bigger than a 3x3. 

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

13 minutes ago, Animefan8888 said:

Yes they will be craftable as long as they are not bigger than a 3x3. 

Oh.

 

Then that defeats the purpose of having a custom crafting table. Given the circumstances I will use the workaround. Thanks.

 

Edit: I will either use the workaround in my first post, or simply don't use an InventoryCrafting slot. The only reason I was using a InventoryCrafting slots was that it was the only way to trigger onCraftMatrixChanged method when the player did something in the custom table and update everything accordingly. Because normal slots didn't trigger that method.

Edited by ctbe
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.