Jump to content

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


Recommended Posts

Posted (edited)

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
Posted

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.

Posted (edited)
  On 7/13/2017 at 2:21 AM, Draco18s said:

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

Expand  

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
Posted
  On 7/13/2017 at 2:40 AM, 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

Expand  

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.

Posted (edited)
  On 7/13/2017 at 2:57 AM, Animefan8888 said:

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

Expand  

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

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

    • Hello All,  Relatively new to this and after playing for a few hours whenever someone enters the nether the entire server will crash and my friend and I are at a bit of a loss. Deleting player data solves the issues but it still persists whenever someone enters even after deleting the DIM-1 folder. Paste: https://pastebin.com/REbpJVqe Thanks!   -Mitchell
    • Add the crash-report or latest.log (logs-folder) with sites like https://mclo.gs/ and paste the link to it here  
    • Cracked Launchers are not supported
    • Hi, I have a problem in minecraft java (only in forge 1.20.1), When I start the game after a moment the game crashed with code 1 this only in forge 1.20.1 , I tried to reinstall java, Upgrade java to 17, update the drivers to the latest version, downgrade the drivers to the pervious version, deleting .minecraft and reinstall it , but none of these ways working.   here is the log:   [Launcher] Launching Minecraft... I'm hiding! mods after C:\Users\Windows\AppData\Roaming\.minecraft\mods\tl_skin_cape_forge_1.20_1.20.1-1.32.jar [InnerMinecraftServersImpl]  search changers of the servers read servers from servers.dat [] [InnerMinecraftServersImpl]  prepare inner servers save servers to servers.dat [Launcher] Game skin type: TLAUNCHER [Launcher] Starting Minecraft Forge 1.20.1... [Launcher] Launching in: C:\Users\Windows\AppData\Roaming\.minecraft Starting garbage collector: 96 / 227 MB Garbage collector completed: 60 / 214 MB [Launcher] Processing post-launch actions. Assist launch: true =============================================================================================== [05:29:03] [main/INFO]: ModLauncher running: args [--username, *********, --version, Forge 1.20.1, --gameDir, C:\Users\Windows\AppData\Roaming\.minecraft, --assetsDir, C:\Users\Windows\AppData\Roaming\.minecraft\assets, --assetIndex, 5, --uuid, *************************************, --accessToken, вќ„вќ„вќ„вќ„вќ„вќ„вќ„вќ„, --clientId, null, --xuid, null, --userType, mojang, --versionType, modified, --width, 925, --height, 530, --launchTarget, forgeclient, --fml.forgeVersion, 47.3.22, --fml.mcVersion, 1.20.1, --fml.forgeGroup, net.minecraftforge, --fml.mcpVersion, 20230612.114412] [05:29:04] [main/INFO]: ModLauncher 10.0.9+10.0.9+main.dcd20f30 starting: java version 17.0.12 by Oracle Corporation; OS Windows 10 arch amd64 version 10.0 [05:29:15] [main/INFO]: Loading ImmediateWindowProvider fmlearlywindow [05:29:24] [main/INFO]: Trying GL version 4.6 [05:29:60] [main/INFO]: Requested GL version 4.6 got version 4.6 [05:29:67] [main/INFO]: SpongePowered MIXIN Subsystem Version=0.8.5 Source=union:/C:/Users/Windows/AppData/Roaming/.minecraft/libraries/org/spongepowered/mixin/0.8.5/mixin-0.8.5.jar%23100!/ Service=ModLauncher Env=CLIENT FATAL ERROR in native method: Thread[pool-2-thread-1,5,main]: No context is current or a function that is not available in the current context was called. The JVM will abort execution.     at org.lwjgl.opengl.GL11C.nglGetString(org.lwjgl.opengl@3.3.1+7/Native Method)     at org.lwjgl.opengl.GL11C.glGetString(org.lwjgl.opengl@3.3.1+7/GL11C.java:978)     at net.minecraftforge.fml.earlydisplay.DisplayWindow.initRender(fmlearlydisplay@1.20.1-47.3.22/DisplayWindow.java:209)     at net.minecraftforge.fml.earlydisplay.DisplayWindow.lambda$start$5(fmlearlydisplay@1.20.1-47.3.22/DisplayWindow.java:292)     at net.minecraftforge.fml.earlydisplay.DisplayWindow$$Lambda$437/0x000001fab120a618.run(fmlearlydisplay@1.20.1-47.3.22/Unknown Source)     at java.util.concurrent.Executors$RunnableAdapter.call(java.base@17.0.12/Executors.java:539)     at java.util.concurrent.FutureTask.run(java.base@17.0.12/FutureTask.java:264)     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(java.base@17.0.12/ScheduledThreadPoolExecutor.java:304)     at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@17.0.12/ThreadPoolExecutor.java:1136)     at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@17.0.12/ThreadPoolExecutor.java:635)     at java.lang.Thread.run(java.base@17.0.12/Thread.java:842) Here I am! [VersionManager] Refreshing versions locally... [VersionManager] Versions has been refreshed (6 ms) [Launcher] Launcher exited. [Launcher] Minecraft closed with exit code: 1 flush now [Launcher] [Crash] Signature "Bad video drivers" matches! [Crash] Signature "Bad video drivers" matches! [Launcher] [Crash] Crash has been recognized! [Crash] Crash has been recognized! flush now
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

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