Jump to content

[1.16.4] Custom Crafting Table in Mod


shadowdragon625

Recommended Posts

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 by shadowdragon625
Link to comment
Share on other sites

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));
    }
}

 

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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 by shadowdragon625
Link to comment
Share on other sites

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

Link to comment
Share on other sites

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 by shadowdragon625
Link to comment
Share on other sites

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 by kiou.23
Link to comment
Share on other sites

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

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.