Posted December 16, 20204 yr I've recently been introduced to Forge Modding lately, and with my experience of Java, I figured now would be a good time than any to start learning how to operate Forge to implement new blocks and items as a quick starting point to better understand my Java programming "skills." However, I have come across an issue with the Crafting Table. For some reason, upon extending my new block class from net.minecraft.block.CraftingTableBlock and implementing said block as normal, the GUI refuses to pop up (only for about a single frame) before exiting out back to the overworld. Does any body have an explanation for this and how to go around this? I cannot seem to find any other available resource that could explain what's going on as I seem to be the only one doing this for this version? Any references/explanations would be helpful if applicable. Edited December 17, 20204 yr by shadowdragon625
December 17, 20204 yr If you check WorkbenchContainer#canInteractWith you will see it hardcoded that the block must be Blocks.CRAFTING_TABLE in order for the player to interact with the container. Edited December 17, 20204 yr by poopoodice
December 17, 20204 yr Author 41 minutes ago, kiou.23 said: post your code All I did was just copy from the CraftingTableBlock class and thought that was it. Here's what I had. import net.minecraft.block.Block; import net.minecraft.block.CraftingTableBlock; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraftforge.common.ToolType; public class ChorusCraftingTable extends CraftingTableBlock { public ChorusCraftingTable() { super(Block.Properties.create(Material.WOOD) .sound(SoundType.WOOD) .harvestLevel(0) .hardnessAndResistance(2.5f,2.5f) .harvestTool(ToolType.AXE)); } }
December 17, 20204 yr Author 25 minutes ago, poopoodice said: If you check WorkbenchContainer#canInteractWith you will see it hardcoded that the block must be Blocks.CRAFTING_TABLE in order for the player to interact with the container. I figured it had something to do with the container itself. I'm unsure how to implement that with the code that I have just posted above. I apologize for not posting it initially.
December 17, 20204 yr Just now, shadowdragon625 said: I figured it had something to do with the container itself. I'm unsure how to implement that with the code that I have just posted above. I apologize for not posting it initially. totally forgot that canInteractWith takes the block, yeah I guess you can make a new class that extends WorkbenchContainer, and then override the canInteractWith method then in your Crafting Table Block class you can override the getContainer method to return a SimpleNamedContainerProvider that returns your container instead of the vanilla one
December 17, 20204 yr Author 9 minutes ago, kiou.23 said: totally forgot that canInteractWith takes the block, yeah I guess you can make a new class that extends WorkbenchContainer, and then override the canInteractWith method then in your Crafting Table Block class you can override the getContainer method to return a SimpleNamedContainerProvider that returns your container instead of the vanilla one That doesn't sound as bad as I had initially theorized. So, to summarize, I create a new class that extends the WorkbenchContainer, override the canInteractWith method to point to the custom crafting block from my mod with the vanilla crafting GUI, and then in my crafting block class I return the container? I am having small bits of trouble picturing this, but I believe I understand where you're coming from; I appreciate all kinds of help I can get on this small project. Edit: I also thought I had written this down on my initial post but I completely voided it on accident: I don't have a custom GUI for this table just yet, so I've just wanted to use the vanilla CraftingTable GUI as a placeholder for now. My apologies again. Edited December 17, 20204 yr by shadowdragon625
December 17, 20204 yr 23 minutes ago, shadowdragon625 said: That doesn't sound as bad as I had initially theorized. So, to summarize, I create a new class that extends the WorkbenchContainer, override the canInteractWith method to point to the custom crafting block from my mod with the vanilla crafting GUI, and then in my crafting block class I return the container? I am having small bits of trouble picturing this, but I believe I understand where you're coming from; I appreciate all kinds of help I can get on this small project. Edit: I also thought I had written this down on my initial post but I completely voided it on accident: I don't have a custom GUI for this table just yet, so I've just wanted to use the vanilla CraftingTable GUI as a placeholder for now. My apologies again. you'll also need to register the screen for the container using ScreenManager.registerFactory in the Client setup. you should enqueue the registration tho. the client setup event provides a enqueueWork method that you can use for this
December 17, 20204 yr Author 1 hour ago, kiou.23 said: you'll also need to register the screen for the container using ScreenManager.registerFactory in the Client setup. you should enqueue the registration tho. the client setup event provides a enqueueWork method that you can use for this I finally managed to make it work the way that I wanted it to. It came out great! No bugs from what I can see so far. Here's my code that I did in two separate classes (aside from registering the block, textures, rotations, etc.) ChorusCraftingTable.java package com.asonjarossa.enderhaul.blocks; import com.asonjarossa.enderhaul.inventory.container.crafting.ChorusCraftingTableContainer; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.inventory.container.INamedContainerProvider; import net.minecraft.inventory.container.SimpleNamedContainerProvider; import net.minecraft.stats.Stats; import net.minecraft.util.ActionResultType; import net.minecraft.util.Hand; import net.minecraft.util.IWorldPosCallable; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.world.World; import net.minecraftforge.common.ToolType; public class ChorusCraftingTable extends Block { private static final ITextComponent ChorusCraftingTableContainer = new TranslationTextComponent("container.crafting"); public ChorusCraftingTable() { super(Block.Properties.create(Material.WOOD) .sound(SoundType.WOOD) .harvestLevel(0) .hardnessAndResistance(2.5f,2.5f) .harvestTool(ToolType.AXE)); } @Override public ActionResultType onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { if (worldIn.isRemote) { return ActionResultType.SUCCESS; } else { player.openContainer(state.getContainer(worldIn, pos)); player.addStat(Stats.INTERACT_WITH_CRAFTING_TABLE); return ActionResultType.CONSUME; } } @Override public INamedContainerProvider getContainer(BlockState state, World world, BlockPos pos) { return new SimpleNamedContainerProvider((id, inventory, player) -> { return new ChorusCraftingTableContainer(id, inventory, IWorldPosCallable.of(world, pos)); }, ChorusCraftingTableContainer); } } ChorusCraftingTableContainer.java package com.asonjarossa.enderhaul.inventory.container.crafting; import com.asonjarossa.enderhaul.util.RegistryHandler; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.inventory.container.WorkbenchContainer; import net.minecraft.util.IWorldPosCallable; public class ChorusCraftingTableContainer extends WorkbenchContainer { private final IWorldPosCallable field_217070_e; public ChorusCraftingTableContainer(int id, PlayerInventory playerInventory, IWorldPosCallable p_i50090_3_) { super(id, playerInventory, p_i50090_3_); this.field_217070_e = p_i50090_3_; } @Override public boolean canInteractWith(PlayerEntity player) { return isWithinUsableDistance(this.field_217070_e, player, RegistryHandler.CHORUS_CRAFTING_TABLE.get()); } } Thanks for the help! I'll clean up my variables another day Edited December 17, 20204 yr by shadowdragon625
December 17, 20204 yr 30 minutes ago, shadowdragon625 said: @Override public ActionResultType onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { if (worldIn.isRemote) { return ActionResultType.SUCCESS; } else { player.openContainer(state.getContainer(worldIn, pos)); player.addStat(Stats.INTERACT_WITH_CRAFTING_TABLE); return ActionResultType.CONSUME; } } Just a little something here: 1- You should call NetworkHooks.openGui() instead of player.openContainer. 2- I don't think you should call player.addStat(Stats.INTERACT_WITH_CRAFTING_TABLE), since the player is interacting with your custom crafting table, not a vanilla one Edited December 17, 20204 yr by kiou.23
December 17, 20204 yr Author 10 minutes ago, kiou.23 said: Just a little something here: 1- You should call NetworkHooks.openGui() instead of player.openContainer. 2- I don't think you should call player.addStat(Stats.INTERACT_WITH_CRAFTING_TABLE), since the player is interacting with your custom crafting table, not a vanilla one Very fair, I'll look into that. It's just a placeholder use for now. I appreciate it
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.