Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

Get Inventory of Container


Recommended Posts

Posted (edited)

My Background:
I'm relatively new to Modding with Forge. I have done it once before when I was new to programming, however now I am attempting it again now that I have sophisticated knowledge on coding. However that does not mean I am extremely familiar with the libraries of Forge, which is most likely the reason for this post

 

Goal:

Getting the item of a container when shift-right clicked and comparing it to another item

 

Problem(s)

 

1. Is there an event that is called when I shift right click on a block?

2. How do I get an item from the inventory of my container (1 slot container)

 

It's actually a toilet and the toilet has a container which contains just 1 slot. What I want in the end is for you right click to open the toilet, put an item inside, exit the container, shift-right click to flush: flushing will turn the item inside the toilet into fertilizer 

 

Edited by L0raxeo
Link to post
Share on other sites

So to address the points:

1. This is your block, do not use an event. You can just check if the player is sneaking within Block#use.

2. Use the capability on the tile entity or pass in the inventory itself to the server container.

Link to post
Share on other sites
2 hours ago, ChampionAsh5357 said:

So to address the points:

1. This is your block, do not use an event. You can just check if the player is sneaking within Block#use.

2. Use the capability on the tile entity or pass in the inventory itself to the server container.

Sorry I do not understand by what you mean when you say "Block#use". I googled it to no avail. Could you elaborate? Thanks for helping :)

Link to post
Share on other sites
31 minutes ago, L0raxeo said:

Sorry I do not understand by what you mean when you say "Block#use". I googled it to no avail. Could you elaborate? Thanks for helping :)

Use your source to look within the AbstractBlock class for a method named 'use'. If you using the mcp mapping set over mojmaps, then that would be 'onBlockActivated' instead.

Link to post
Share on other sites
Posted (edited)
11 minutes ago, ChampionAsh5357 said:

Use your source to look within the AbstractBlock class for a method named 'use'. If you using the mcp mapping set over mojmaps, then that would be 'onBlockActivated' instead.

Even though I didn't understand what to do with your first answer, it lead me to an even better way of accessing the toilet. I just set it to run the method onBlockClicked()! Sorry, but I'm having trouble understanding what you mean for #2. You say to "use teh capability on the tile entity". What does that even mean? I'm in the TileEntityToilet class. I just created a method:
 

public ItemStack[] getInventory() { return inventory; } // sorry I don't know how to do code notation on here I know how to do it on stackoverflow but not here (this is my first time using curseforge forums)

 

(Just making sure) This refers to the inventory of the container and not the player right? If it does refer to the inventory of the container, how do I access the specific slot? My best guess is that the first slot is 0 right? Well, my container only has one slot anyways, but I would refer to the slot as getInventory[0]? Thanks again :D

 

Also, the method being ran is onBlockClicked inside the BlockToilet class. Since that is the case, how do I access the method in TileEntityToilet (getInventory())? Should I make it static? However I woulda assume that would break it since there would be multiple instance of the block and not just one toilet. I was thinking there is like a this.getTileEntity() or something like that but I can't seem to find one. Any suggestions?

Edited by L0raxeo
Link to post
Share on other sites
2 minutes ago, L0raxeo said:

public ItemStack[] getInventory() { return inventory; } // sorry I don't know how to do code notation on here I know how to do it on stackoverflow but not here (this is my first time using curseforge forums)

This is not how you add an inventory to a tile entity. It breaks mod compatibility. For this, you should use capabilities. Specifically, you'll want to use the IItemHandler capability and implement on your own TE ItemStackHandler. Containers have special slot handlers that take in an IItemHandler.

Link to post
Share on other sites

Oh wait, sorry. My apologies, I don't think I made my situation clear. I've already added an inventory and everything. I can put items in it and take it out. I just need a way to compare the items in that one slot (that I've already coded), and to do that I need to get the inventory. I also am very new to these libraries (I just started using it a few days ago), so I'm sorry if I don't understand too easily). 

Here is a link to my code for the Tile Entity Toilet, so that you have a better understanding at where I'm at with coding the toilet. 

https://hatebin.com/kipucbzybk

and in my block class  (the one that extends to BlockContainer)currently has the onBlockClicked method. It's there that I want to get the inventory of the container (that I've already coded in), and also compare those contents to a specific item (although I think I know how to do that through the unlocalizedName)

Link to post
Share on other sites

The version of Forge you are using is not supported on the forums. The currently supported versions can be seen in the blue banner at the top of the page. Update to one of the above versions to receive support.

Link to post
Share on other sites
Just now, ChampionAsh5357 said:

The version of Forge you are using is not supported on the forums. The currently supported versions can be seen in the blue banner at the top of the page. Update to one of the above versions to receive support.

Oh :( that's unfortunate. Sorry to waste your time.

Link to post
Share on other sites
Guest
This topic is now closed to further replies.


  • Recently Browsing

    No registered users viewing this page.

  • Posts

    • I'm currently trying to make a new cauldron-type block, and I'm having difficulty implementing blockstates. Here's the relevant part of the alchemical cauldron's code:   public class AlchemicalCauldronBlock extends Block { public static final IntegerProperty LEVEL = IntegerProperty.create("level", 1, 3); private static final VoxelShape INSIDE = box(2.0D, 4.0D, 2.0D, 14.0D, 16.0D, 14.0D); protected static final VoxelShape SHAPE = VoxelShapes.join(VoxelShapes.block(), VoxelShapes.or(box(0.0D, 0.0D, 4.0D, 16.0D, 3.0D, 12.0D), box(4.0D, 0.0D, 0.0D, 12.0D, 3.0D, 16.0D), box(2.0D, 0.0D, 2.0D, 14.0D, 3.0D, 14.0D), INSIDE), IBooleanFunction.ONLY_FIRST); public AlchemicalCauldronBlock() { super(Properties.of(Material.METAL).sound(SoundType.METAL).harvestLevel(3).strength(2F,2F)); // this.registerDefaultState(this.stateDefinition.any().setValue(LEVEL, 0)); // this.registerDefaultState(this.stateDefinition.any().setValue(LEVEL, Integer.valueOf(0))); } ... When I try to run this with either of the two attempts at registerDefaultState uncommented, I get this error: https://pastebin.com/vPf3UryC. For convenience, I believe this part is most relevant: How can I avoid this? My registry classes look like this, if it helps: public class registry { public static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, AlchemyPlus.MODID); public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, AlchemyPlus.MODID); public static void register() { IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); BLOCKS.register(modEventBus); ITEMS.register(modEventBus); registerItems.register(); registerBlocks.register(); } } public class registerBlocks { public static final RegistryObject<Block> ALCHEMICAL_CAULDRON = register("alchemical_cauldron", AlchemicalCauldronBlock::new); static void register() {} private static <T extends Block> RegistryObject<T> registerNoItem(String name, Supplier<T> block) { return registry.BLOCKS.register(name, block); } private static <T extends Block> RegistryObject<T> register(String name, Supplier<T> block) { RegistryObject<T> ret = registerNoItem(name, block); registry.ITEMS.register(name, () -> new BlockItem(ret.get(), new Item.Properties().tab(ItemGroup.TAB_BREWING))); return ret; } } Full GitHub repository available here.   (Other minor problem(?):  I copied the methods getShape and getInteractionShape from net.minecraft.block.CauldronBlock and I'm getting these weird warnings. What's up with that? Do I need to worry about it?)  
    • Personally I use IForgeRegistryEntry#getRegistryName and then ResourceLocation#getNameSpace to get the id of the object.
    • you can get a block form a ResourceLocation, take a look at NBTUtil#readBlockState, do somthing like that
    • I am running forge version 1.16.5 36.1.31 on a server with a lot of mods and when a player refreshes the server list, it sends a long error in the server console. Additionally, the server list displays "Can't connect to server", despite refreshing and actually being able to connect to the server. here's the links to the logs: https://gist.github.com/WaffleTraits/83885b1539d5711fabff73a91924e665 https://gist.github.com/WaffleTraits/5ae78e6eaa330422bbc9f7226faf60ce Here's what's displayed in console when a player refreshes server listing: https://hastebin.com/ativexeyoy.properties server is running on ubuntu 20.04 and is using java 8 for this forge instance.
    • I kept getting this error whenever I tried joining my modded server I want to find a solution to this I checked every mod and it all matched Client : https://mclo.gs/Q39SSu5 server : https://mclo.gs/UO2kbDz
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.