Jump to content

Chests and getStackInSlot [Solved]


Varogh

Recommended Posts

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?

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

        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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Here's a simple example to solve this particular issue: public class ModArmorMaterials { public static final DeferredRegister<ArmorMaterial> ARMORS = DeferredRegister.create(Registries.ARMOR_MATERIAL, MyModName.MOD_ID); public static final RegistryObject<ArmorMaterial> COPPER = registerArmor("copper", Util.make(new EnumMap<>(ArmorItem.Type.class), enumMap -> { enumMap.put(ArmorItem.Type.BOOTS, 1); enumMap.put(ArmorItem.Type.LEGGINGS, 4); enumMap.put(ArmorItem.Type.CHESTPLATE, 5); enumMap.put(ArmorItem.Type.HELMET, 2); enumMap.put(ArmorItem.Type.BODY, 4); }), 12, SoundEvents.ARMOR_EQUIP_IRON, 0.0F, 0.0F, () -> Ingredient.of(Items.COPPER_INGOT)); private static RegistryObject<ArmorMaterial> registerArmor(String pGroup, EnumMap<ArmorItem.Type, Integer> pEnumMap, int pEnchantmentValue, Holder<SoundEvent> pEquipSound, float pToughness, float pKnockbackResistance, Supplier<Ingredient> pRepairIngredient) { List<ArmorMaterial.Layer> pLayerList = List.of(new ArmorMaterial.Layer(new ResourceLocation(pGroup))); return registerArmor(pGroup, pEnumMap, pEnchantmentValue, pEquipSound, pToughness, pKnockbackResistance, pRepairIngredient, pLayerList); } private static RegistryObject<ArmorMaterial> registerArmor( String pGroup, EnumMap<ArmorItem.Type, Integer> pEnumMap, int pEnchantmentValue, Holder<SoundEvent> pEquipSound, float pToughness, float pKnockbackResistance, Supplier<Ingredient> pRepairIngredient, List<ArmorMaterial.Layer> pLayerList) { return ARMORS.register(pGroup, () -> new ArmorMaterial(pEnumMap, pEnchantmentValue, pEquipSound, pRepairIngredient, pLayerList, pToughness, pKnockbackResistance)); } public static void register(IEventBus eventBus) { ARMORS.register(eventBus); } } Essentially, the TierSortingRegistry has been removed and so you now need to set up your own DeferredRegister. Please see the minecraftforge GitHub for more information; I found this solution through their issues (https://github.com/MinecraftForge/MinecraftForge/issues/9961)
    • How did I even leave that in there? I’ll try it in a bit, that very well could be it.
    • Greetings, I met a problem with my Forge server (47.2.0-1.20.1) that I can't join with the following line. (singleplayer world working fine) [net.minecraft.server.network.ServerGamePacketListenerImpl/]: Sharyna lost connection: Internal Exception: io.netty.handler.codec.EncoderException: java.lang.NullPointerException: Cannot invoke "net.minecraft.resources.ResourceLocation.toString()" because "p_130086_" is null   At first it was errored with packet size error, but I fixed that with the Connectivity mod, however, after that this popped up and can't find the source of it. Since the logs are big, I couldn't upload on paste.gg or other site ... so here it is (if the files are deleted, please notice me and I'll upload again. Debug and Latest log
    • Дерево тис
  • Topics

×
×
  • Create New...

Important Information

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