Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

Posted

I can't get the getStackInSlot function to work on a chest.

I even tried to copy the code of hoppers but it's still not working.

 

This is the code to get the inventory:

 

      public void updateEntity() {
        	TileEntity inpTile = worldObj.getBlockTileEntity(xCoord, yCoord, zCoord+1);
        	if ((inpTile != null) && (inpTile instanceof IInventory)){
        		IInventory inpInventory = (IInventory) inpTile;
        		
        		
                if (inpInventory instanceof TileEntityChest)
                {
                    int l = this.getWorldObj().getBlockId(xCoord, yCoord, zCoord+1);
                    Block block = Block.blocksList[l];

                    if (block instanceof BlockChest)
                    {
                    	inpInventory = ((BlockChest)block).getInventory(this.getWorldObj(), xCoord, yCoord, zCoord+1);
                    }
                }
        		
        		
        		
        		for (int i=0; i<inpInventory.getSizeInventory();i++){
        			if (inpInventory.getStackInSlot(i)!=null){
        				ItemStack incomingStack = inpInventory.getStackInSlot(i); //always returns null
        				//stub
        				}
        			}
        		}
        	}
        

 

The problem is, from what I can see from the debug, that inpInventory.getStackInSlot(i) always returns null.

inpInventory and inpTile aren't null and are instance of TileEntityChest, and inpInventory.getSizeInventory() correctly returns 27.

Could you tell me what's wrong?

For one, you are using different coordinates to retrieve the tile entity than you do when you retrieve the inventory if it's a chest. Where are you getting xCoord/yCoord/zCoord from, and where are you getting xChest/yChest/zChest coordinates from, and why are you using two different coordinate sets?

  • Author

They would be both xCoord, yCoord, zCoord+1 , I changed that in the code I posted to make it more clear that those were the coordinates I'm getting the chest from, but I forgot to change them in the getInventory method.

Anyway, they're the same in my code, so that's not the problem.

  • Author

        public void updateEntity() {
        	TileEntity inpTile = worldObj.getBlockTileEntity(xCoord, yCoord, zCoord+1);
        	if ((inpTile != null) && (inpTile instanceof IInventory)){
        		IInventory inpInventory = (IInventory) inpTile;
        		
        		
                if (inpInventory instanceof TileEntityChest)
                {
                    int l = this.getWorldObj().getBlockId(xCoord, yCoord, zCoord+1);
                    Block block = Block.blocksList[l];

                    if (block instanceof BlockChest)
                    {
                    	inpInventory = ((BlockChest)block).getInventory(this.getWorldObj(), xCoord, yCoord, zCoord+1);
                    }
                }
        		
        		
        		
        		for (int i=0; i<inpInventory.getSizeInventory();i++){
        			if (inpInventory.getStackInSlot(i)!=null){
        				ItemStack incomingStack = inpInventory.getStackInSlot(i);
        				//stub
        				}
        			}
        		}
        	}
        

 

But I can't really see what you would need to know why zCoord+1, since it has absolutely nothing to do with my problem.

 

PS: before you ask, yes, there is a chest at (xCoord, yCoord, zCoord + 1), and the tileentity returned by getBlockTileEntity is not null, it's a TileEntityChest instance.

I didn't mean to be rude about it, but you've got a lot of wonky stuff going on in your code. For instance, when you get the TileEntityChest, it is already an IInventory, meaning you should have access right away; why are you doing all this other weird stuff getting the block and then getting the block's inventory, when you already have it?

 

If you're absolutely 100% sure that the IInventory you want is at zCoord+1, that's fine, but it seems off to me. This code is in a TileEntity already, right? But you don't want this TileEntity's inventory, you want a different one? Ok. Still:

TileEntity te = worldObj.getBlockTileEntity(xCoord, yCoord, zCoord + 1); // going along with you here
if (te instanceof IInventory) {
// now you've got an inventory
IInventory inv = (IInventory) te;
for (int i = 0; i < inv.getSizeInventory(); ++i) {
// etc.
}
}

Should be as simple as that. If it's not working, try putting println's all over the place, if you haven't already, to make sure it's getting called and that the variables are what you think they are.

  • Author

My objective is to make a machine that gets a chest's inventory and puts it into its own inventory, that's why I'm calling to another inventory.

 

The code you wrote is identical to the code I had before looking at the TileEntityHopper class, and it's not working, so I looked how the hopper did that, and I saw it has special code for chests, so I copied the extra bit, but it's still not working.

I followed the code step by step for both my TE and the Hopper, and the only difference seems to be that, when I call getStackInSlot I get null, while the hopper gets the itemStack, as it should

I am going to ask the obvious but...

does the chest contain something ?

Simple or double chest ?

  • Author

Simple chest, and it contains things

 

 

EDIT:

 

I don't know why, but initializing 

      IInventory inpInventory = null;

before assigning its vaule to (IInventory) inpTile fixes the problem...

 

thanks everyone anyway.

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...

Important Information

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.