Posted February 8, 20223 yr i had this problem since 3 months but i tried to look minecraft classes and other mods but i didnt success, my tileentity works fine about everything except loading and saving the items when I exit the game or even only the world, im using exactly the same methods that the chest have(read and write) but is not working MY TILE ENTITY ONLY HAS 1 SLOT private NonNullList<ItemStack> items = NonNullList.withSize(1,ItemStack.EMPTY); @Override public void read(BlockState state, CompoundNBT nbt) { super.read(state, nbt); this.items = NonNullList.withSize(this.getSizeInventory(),ItemStack.EMPTY); if(!this.checkLootAndRead(nbt)) { ItemStackHelper.loadAllItems(nbt,this.items); } } @Override public CompoundNBT write(CompoundNBT compound) { super.write(compound); if(!this.checkLootAndWrite(compound)) { ItemStackHelper.saveAllItems(compound,this.items); } return compound; }
February 8, 20223 yr Author 1 hour ago, diesieben07 said: Are the methods called? Check using the debugger. Post the entire class please. public class MyTileentity extends LockableLootTileEntity { private final ItemStackHandler itemHandler = createHandler(); private NonNullList<ItemStack> items = NonNullList.withSize(1,ItemStack.EMPTY); private final LazyOptional<IItemHandler> handler = LazyOptional.of(() -> itemHandler); public PipeTile(TileEntityType<?> tileEntityTypeIn) { super(tileEntityTypeIn); } @Override protected NonNullList<ItemStack> getItems() { return this.items; } @Override protected void setItems(NonNullList<ItemStack> itemsIn) { this.items = itemsIn; } public PipeTile() { this(ModTileEntities.MY_TILEENTITY.get()); } @Override public void read(BlockState state, CompoundNBT nbt) { super.read(state, nbt); this.items = NonNullList.withSize(this.getSizeInventory(),ItemStack.EMPTY); if(!this.checkLootAndRead(nbt)) { ItemStackHelper.loadAllItems(nbt,this.items); } } @Override public CompoundNBT write(CompoundNBT compound) { super.write(compound); if(!this.checkLootAndWrite(compound)) { ItemStackHelper.saveAllItems(compound,this.items); } return compound; } @Override protected ITextComponent getDefaultName() { return null; } @Override protected Container createMenu(int id, PlayerInventory player) { return null; } private ItemStackHandler createHandler() { return new ItemStackHandler(2) { @Override protected void onContentsChanged(int slot) { markDirty(); } @Override public int getSlotLimit(int slot) { return 1; } @Nonnull @Override public ItemStack insertItem(int slot, @Nonnull ItemStack stack, boolean simulate) { if(!isItemValid(slot, stack)) { return stack; } return super.insertItem(slot, stack, simulate); } }; } public ItemStack getItemSlot0() { return this.itemHandler.getStackInSlot(0); } @Nonnull @Override public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) { if(cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { return handler.cast(); } return super.getCapability(cap, side); } @Override public int getSizeInventory() { return 1; } } well yeah those methods are called
February 8, 20223 yr Author 59 minutes ago, diesieben07 said: Do not use both IItemHandler and IInventory. Pick one or the other. Note that if you choose to use IInventory you must still expose an IItemHandler via getCapability if you want your TE to interact with automation such as hoppers. LockableLootTileEntity does this automatically, so you don't need it if you use it as your parent class. what? im not using IInventory
February 9, 20223 yr Author 1 hour ago, diesieben07 said: LockableLootTileEntity extends LockableTileEntity which implements IInventory. instead of private final LazyOptional<IItemHandler> handler = LazyOptional.of(() -> itemHandler); i used private net.minecraftforge.common.util.LazyOptional<net.minecraftforge.items.IItemHandlerModifiable> handler; (because i need a handler) im not using anymore IItemHandler because im using IInventory but is not working either Edited February 9, 20223 yr by ElTotisPro50
February 9, 20223 yr Author 4 hours ago, diesieben07 said: Show updated code. public class MyTile extends LockableLootTileEntity { private final ItemStackHandler itemHandler = createHandler(); private NonNullList<ItemStack> items = NonNullList.withSize(1,ItemStack.EMPTY); private net.minecraftforge.common.util.LazyOptional<net.minecraftforge.items.IItemHandlerModifiable> handler; public MyTile(TileEntityType<?> tileEntityTypeIn) { super(tileEntityTypeIn); } @Override protected NonNullList<ItemStack> getItems() { return this.items; } @Override protected void setItems(NonNullList<ItemStack> itemsIn) { this.items = itemsIn; } public PipeTile() { this(ModTileEntities.MY_TILE.get()); } @Override public void read(BlockState state, CompoundNBT nbt) { super.read(state, nbt); this.items = NonNullList.withSize(this.getSizeInventory(),ItemStack.EMPTY); if(!this.checkLootAndRead(nbt)) { ItemStackHelper.loadAllItems(nbt,this.items); } } @Override public CompoundNBT write(CompoundNBT compound) { super.write(compound); if(!this.checkLootAndWrite(compound)) { ItemStackHelper.saveAllItems(compound,this.items); } return compound; } @Override protected ITextComponent getDefaultName() { return null; } @Override protected Container createMenu(int id, PlayerInventory player) { return null; } private ItemStackHandler createHandler() { return new ItemStackHandler(2) { @Override protected void onContentsChanged(int slot) { markDirty(); } @Override public int getSlotLimit(int slot) { return 1; } @Nonnull @Override public ItemStack insertItem(int slot, @Nonnull ItemStack stack, boolean simulate) { if(!isItemValid(slot, stack)) { return stack; } return super.insertItem(slot, stack, simulate); } }; } public ItemStack getItemSlot0() { return this.itemHandler.getStackInSlot(0); } @Nonnull @Override public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) { if(cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { return handler.cast(); } return super.getCapability(cap, side); } @Override public int getSizeInventory() { return 1; } } besides(from what you are helping me)... for what is the number you put in create handler where you return a new ItemStackHandler(HERE I USED 2 AND WORKS BUT FOR WHAT IS THIS NUMBER)
February 9, 20223 yr Author 1 hour ago, diesieben07 said: You still have both IInventory (through LockableLootTileEntity) and an ItemStackHandler. You have two inventories. Pick one. but how i remove ItemStackHandler if i need it for getCapability(you return handler.cast()) or i just return the super that comes with getCapability() ?
February 9, 20223 yr Author 1 hour ago, diesieben07 said: You still have both IInventory (through LockableLootTileEntity) and an ItemStackHandler. You have two inventories. Pick one. and the chest use both of them and obviusly it keeps the items
February 9, 20223 yr Author 1 hour ago, diesieben07 said: IF I WANT TO INTERACT WITH HOPPERS, so i dont need it right?
February 9, 20223 yr Author 1 hour ago, diesieben07 said: (i dont care about interact with hoppers im good if my tile cant)
February 9, 20223 yr Author 2 hours ago, diesieben07 said: i deleted: private final ItemStackHandler itemHandler = createHandler(); ,but with that i can get and set items from the slots, without it how would i do that for example: public ItemStack getItemSlot0() { return this.itemHandler.getStackInSlot(0); //without itemhandler how i do this }
February 9, 20223 yr Author 1 hour ago, diesieben07 said: Use the methods from IInventory that your TE inherits. i cant run minecraft right now, but this will work? public class MyTile extends LockableLootTileEntity { private NonNullList<ItemStack> items = NonNullList.withSize(1,ItemStack.EMPTY); //private net.minecraftforge.common.util.LazyOptional<net.minecraftforge.items.IItemHandlerModifiable> handler; not using this public MyTile(TileEntityType<?> tileEntityTypeIn) { super(tileEntityTypeIn); } @Override protected NonNullList<ItemStack> getItems() { return this.items; } @Override protected void setItems(NonNullList<ItemStack> itemsIn) { this.items = itemsIn; } public PipeTile() { this(ModTileEntities.MY_TILE.get()); } @Override public void read(BlockState state, CompoundNBT nbt) { super.read(state, nbt); this.items = NonNullList.withSize(this.getSizeInventory(),ItemStack.EMPTY); if(!this.checkLootAndRead(nbt)) { ItemStackHelper.loadAllItems(nbt,this.items); } } @Override public CompoundNBT write(CompoundNBT compound) { super.write(compound); if(!this.checkLootAndWrite(compound)) { ItemStackHelper.saveAllItems(compound,this.items); } return compound; } @Override protected ITextComponent getDefaultName() { return null; } @Override protected Container createMenu(int id, PlayerInventory player) { return null; } private ItemStackHandler createHandler() { return new ItemStackHandler(2) { @Override protected void onContentsChanged(int slot) { markDirty(); } @Override public int getSlotLimit(int slot) { return 1; } @Nonnull @Override public ItemStack insertItem(int slot, @Nonnull ItemStack stack, boolean simulate) { if(!isItemValid(slot, stack)) { return stack; } return super.insertItem(slot, stack, simulate); } }; } public ItemStack getItemSlot0() { return this.getStackInSlot(0); } @Override public int getSizeInventory() { return 1; } }
February 9, 20223 yr 1 hour ago, ElTotisPro50 said: i cant run minecraft right now error? if yes post it. 1 hour ago, ElTotisPro50 said: but this will work? 1 hour ago, ElTotisPro50 said: @Override protected ITextComponent getDefaultName() { return null; } @Override protected Container createMenu(int id, PlayerInventory player) { return null; } you can not retrun null there Edited February 9, 20223 yr by Luis_ST
February 9, 20223 yr Author 3 hours ago, Luis_ST said: error? if yes post it. you can not retrun null there i cant run minecraft for something mine not because an error, and in getDefaultName() the return null doesnt give me an error, my gui doesnt open but has a slot and a gui(i know is weird but i have my reasons)
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.