Jump to content

Recommended Posts

Posted (edited)

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
Posted (edited)

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 by poopoodice
Posted
  On 12/17/2020 at 12:05 AM, kiou.23 said:

post your code

Expand  

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

 

Posted
  On 12/17/2020 at 12:22 AM, 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.

Expand  

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.

Posted
  On 12/17/2020 at 12:48 AM, 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.

Expand  

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

Posted (edited)
  On 12/17/2020 at 12:52 AM, 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

Expand  

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
Posted
  On 12/17/2020 at 12:57 AM, 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.

Expand  

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

Posted (edited)
  On 12/17/2020 at 1:23 AM, 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

Expand  

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
Posted (edited)
  On 12/17/2020 at 2:47 AM, 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;
        }
    }

 

Expand  

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
Posted
  On 12/17/2020 at 3:17 AM, 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

Expand  

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.

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

    • Im trying to make a server for me and my friends. I have no mods on it, (yet) but i keep getting this on the terminal right before it closes out. it insist even open long enogth m=for me to log on .this is my most resent crash report thanks in advance.   ---- Minecraft Crash Report ---- // I blame Dinnerbone. Time: 2025-05-01 18:17:25 Description: Exception in server tick loop java.lang.IllegalStateException: Failed to initialize server     at TRANSFORMER/minecraft@1.21.5/net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:676) ~[server-1.21.5-20250325.162830-srg.jar%23141!/:?] {re:classloading,pl:accesstransformer:B}     at TRANSFORMER/minecraft@1.21.5/net.minecraft.server.MinecraftServer.lambda$spin$2(MinecraftServer.java:276) ~[server-1.21.5-20250325.162830-srg.jar%23141!/:?] {re:classloading,pl:accesstransformer:B}     at java.base/java.lang.Thread.run(Thread.java:1583) [?:?] {} A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- System Details -- Details:     Minecraft Version: 1.21.5     Minecraft Version ID: 1.21.5     Operating System: Linux (amd64) version 6.11.0-19-generic     Java Version: 21.0.6, Ubuntu     Java VM Version: OpenJDK 64-Bit Server VM (mixed mode, sharing), Ubuntu     Memory: 99161192 bytes (94 MiB) / 233832448 bytes (223 MiB) up to 1004535808 bytes (958 MiB)     CPUs: 2     Processor Vendor: GenuineIntel     Processor Name: Intel(R) Pentium(R) CPU B950 @ 2.10GHz     Identifier: Intel64 Family 6 Model 42 Stepping 7     Microarchitecture: Sandy Bridge (Client)     Frequency (GHz): 2.10     Number of physical packages: 1     Number of physical CPUs: 2     Number of logical CPUs: 2     Graphics card #0 name: 2nd Generation Core Processor Family Integrated Graphics Controller     Graphics card #0 vendor: Intel Corporation (0x8086)     Graphics card #0 VRAM (MiB): 256.00     Graphics card #0 deviceId: 0x0106     Graphics card #0 versionInfo: unknown     Virtual memory max (MiB): 5743.06     Virtual memory used (MiB): 3361.15     Swap memory total (MiB): 3828.00     Swap memory used (MiB): 811.72     Space in storage for jna.tmpdir (MiB): <path not set>     Space in storage for org.lwjgl.system.SharedLibraryExtractPath (MiB): <path not set>     Space in storage for io.netty.native.workdir (MiB): <path not set>     Space in storage for java.io.tmpdir (MiB): available: 421206.25, total: 467297.75     Space in storage for workdir (MiB): available: 421206.25, total: 467297.75     JVM Flags: 0 total;     Server Running: true     Active Data Packs: vanilla, mod_data, mod/neoforge     Available Data Packs: minecart_improvements, redstone_experiments, trade_rebalance, vanilla, mod/neoforge, mod_data     Enabled Feature Flags: minecraft:vanilla     World Generation: Stable     World Seed: -7131934175611965967     Suppressed Exceptions: ~~NONE~~     Is Modded: Definitely; Server brand changed to 'neoforge'     Type: Dedicated Server (map_server.txt)     ModLauncher: 11.0.4+main.d2e20e43     ModLauncher launch target: neoforgeserver     ModLauncher services:         sponge-mixin-0.15.2+mixin.0.8.7.jar mixin PLUGINSERVICE         loader-7.0.10.jar slf4jfixer PLUGINSERVICE         loader-7.0.10.jar runtime_enum_extender PLUGINSERVICE         at-modlauncher-11.0.2.jar accesstransformer PLUGINSERVICE         loader-7.0.10.jar runtimedistcleaner PLUGINSERVICE         modlauncher-11.0.4.jar mixin TRANSFORMATIONSERVICE         modlauncher-11.0.4.jar fml TRANSFORMATIONSERVICE     FML Language Providers:         javafml@7.0         minecraft@7.0     Mod List:         server-1.21.5-20250325.162830-srg.jar             |Minecraft                     |minecraft                     |1.21.5              |Manifest: NOSIGNATURE         neoforge-21.5.63-beta-universal.jar               |NeoForge                      |neoforge                      |21.5.63-beta        |Manifest: NOSIGNATURE     Crash Report UUID: 99fdd6a6-3898-4cfe-ab2c-80b1ace92081     FML: 7.0.10     NeoForge: 21.5.63-beta
    • My minecraft version is 1.20.1, I haven't had too many issues other than a mod not working sometimes, in which case I usually just delete and sift through the preexisting mods to try to find the issue, but I hit a big wall of not knowing what my issue is now. I just want to make a modpack for me and my partner!!! Here's the latest log url, https://pastebin.com/9LjctgYN 
    • i was having same problem, thanks 
    • I have no idea - look like it just stops
    • https://mclo.gs/Fy9ZzcR UPDATED LOGS still stays stuck at 0% when trying to load a world   https://mclo.gs/Fy9ZzcR UPDATED LOGS still stays stuck at 0% when trying to load a world  
  • Topics

×
×
  • Create New...

Important Information

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