Jump to content

Recommended Posts

Posted

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

 

Posted
  On 2/8/2022 at 11:02 PM, diesieben07 said:

Are the methods called? Check using the debugger.

Post the entire class please.

Expand  
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

Posted
  On 2/8/2022 at 11:28 PM, 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.

Expand  

what? im not using IInventory

Posted (edited)
  On 2/8/2022 at 11:33 PM, diesieben07 said:

LockableLootTileEntity extends LockableTileEntity which implements IInventory.

Expand  

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 by ElTotisPro50
Posted
  On 2/9/2022 at 10:13 AM, diesieben07 said:

Show updated code.

Expand  
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)

Posted
  On 2/9/2022 at 1:45 PM, diesieben07 said:

You still have both IInventory (through LockableLootTileEntity) and an ItemStackHandler. You have two inventories. Pick one.

Expand  

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() ?

Posted
  On 2/9/2022 at 2:21 PM, diesieben07 said:

 

Expand  

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
    }

 

Posted
  On 2/9/2022 at 3:44 PM, diesieben07 said:

Use the methods from IInventory that your TE inherits.

Expand  

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

 

Posted (edited)
  On 2/9/2022 at 3:55 PM, ElTotisPro50 said:

i cant run minecraft right now

Expand  

error? if yes post it.

  On 2/9/2022 at 3:55 PM, ElTotisPro50 said:

but this will work?

Expand  
  On 2/9/2022 at 3:55 PM, ElTotisPro50 said:
    @Override
    protected ITextComponent getDefaultName() {
        return null;
    }

    @Override
    protected Container createMenu(int id, PlayerInventory player) {
        return null;
    }
Expand  

you can not retrun null there

Edited by Luis_ST
Posted
  On 2/9/2022 at 4:56 PM, Luis_ST said:

error? if yes post it.

you can not retrun null there

Expand  

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.

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

    • Machen Sie sich bereit für unglaubliche Ersparnisse im Juli 2025 mit unserem exklusiven Temu Gutscheincode 30% Rabatt. Wir geben Ihnen den Schlüssel zu den besten Angeboten auf der Plattform mit dem Code (ACW867474), der Ihr Einkaufserlebnis verändern wird. Der Temu Gutscheincode ACW867474 wurde entwickelt, um Ihnen maximale Vorteile zu bieten, insbesondere für unsere Nutzer in Deutschland, Österreich und der gesamten Europäischen Union. Erleben Sie Shopping ohne Grenzen mit Rabatten, die wirklich einen Unterschied machen. Mit unserem Temu Gutschein 30% Rabatt schalten Sie sofortige Einsparungen frei. Nutzen Sie einfach unseren Temu 30% Rabatt Gutscheincode, um Ihr Einkaufserlebnis zu revolutionieren und bei den angesagtesten Produkten zu sparen. Was ist der Gutscheincode für Temu 30% Rabatt? Sie fragen sich vielleicht, wie Sie diesen fantastischen Rabatt erhalten können. Wir haben es Ihnen leicht gemacht! Sowohl neue als auch bestehende Kunden können erstaunliche Vorteile genießen, wenn sie unseren exklusiven 30%-Rabatt-Gutscheincode auf der Temu-App oder Website verwenden. Mit diesem Code erhalten Sie nicht nur einen einmaligen Rabatt, sondern schalten ein ganzes Paket an Sparmöglichkeiten frei. Der Temu Gutschein 30% Rabatt ist Ihr Ticket zu intelligenterem Einkaufen, und der 30% Rabatt Temu Gutschein stellt sicher, dass Sie immer den besten Preis bekommen. Hier sind die Hauptvorteile, die Sie mit unserem Code erhalten: •    ACW867474: Ein pauschaler Rabatt von 30% auf Ihre gesamte Bestellung. •    ACW867474: Ein 30% Gutschein-Paket für mehrere zukünftige Einkäufe. •    ACW867474: Ein garantierter 30% Pauschalrabatt für alle Neukunden. •    ACW867474: Ein zusätzlicher 30% Promo-Code für treue Bestandskunden. •    ACW867474: Ein spezieller 30% Gutschein für Nutzer in Deutschland/Österreich. Temu Gutscheincode 30% Rabatt für Neukunden in 2025 Wenn Sie neu bei Temu sind, erwartet Sie eine besondere Freude! Als Neukunde können Sie die höchsten Vorteile erzielen, wenn Sie unseren Temu Gutschein 30% Rabatt verwenden. Temu begrüßt neue Käufer mit offenen Armen und noch offeneren Rabatten, und unser Temu Gutscheincode 30% Rabatt ist der beste Weg, um Ihre Shopping-Reise zu beginnen. Stellen Sie sich vor, Sie erhalten die trendigsten Artikel aus Mode, Elektronik, Haushaltswaren und mehr mit einem massiven Preisnachlass direkt bei Ihrer ersten Bestellung. Nutzen Sie diese Vorteile als Neukunde: •    ACW867474: Ein sofortiger Pauschalrabatt von 30% für Neukunden. •    ACW867474: Ein 30% Gutschein-Paket für Ihre zukünftigen Bestellungen. •    ACW867474: Bis zu 30% Rabatt auf mehrere Einkäufe. •    ACW867474: Kostenloser Versand in 86 Länder, einschließlich ganz Deutschland. •    ACW867474: Extra 30% Rabatt auf jeden Einkauf als Erstnutzer.  
    • thank you for the help, i deleted yungscavebiomes and now it works   
    • first crash: https://mclo.gs/Ou66SIc second crash: https://mclo.gs/qu0W6qY
    • Add the crash-report or latest.log (logs-folder) with sites like https://mclo.gs/ and paste the link to it here  
  • Topics

×
×
  • Create New...

Important Information

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