Jump to content

Recommended Posts

Posted

I'm trying to extend a LockableLootTileEntity to make a simple custom chest, similar to a vanilla barrel or chest, but looking at the code for some mods seems to require the use of packets and capabilities. , I don't understand this well. When and what should I do when using capabilities?

Posted
1 hour ago, Zemelua said:

I don't understand this well. When and what should I do when using capabilities?

if you want to create a chest / barrel that the item drops when it is destroyed you don't need a capability.

if you want to create a block like the enderchest that has its own inventory for each player, you need a capability

Posted
12 hours ago, diesieben07 said:

Do not use LockableLootTileEntity, use the ItemStackHandler to add an inventory to your tile entity.

What is the reason for doing so? Why use ItemStackHandler?

  • 2 weeks later...
Posted

Try This:

public class TestChestTile extends LockableLootTileEntity
{
    protected int Size = 36;
    private NonNullList<ItemStack> chest_items = NonNullList.withSize(Size,ItemStack.EMPTY);
    protected int numPlayerUsing;
    private IItemHandlerModifiable items = createHandler();
    private LazyOptional<IItemHandlerModifiable> itemHandler = LazyOptional.of(()-> items);
    public TestChestTile(TileEntityType<?> p_i48284_1_) {
        super(p_i48284_1_);
    }
    public TestChestTile() {
        this(TileEntityInit.TEST_CHEST_TILE.get());
    }

    @Override
    public int getSizeInventory() {
        return Size;
    }

    @Override
    public NonNullList<ItemStack> getItems() {
        return chest_items;
    }

    public void setItems(NonNullList<ItemStack> items) {
        this.chest_items = items;
    }

    @Override
    protected ITextComponent getDefaultName() {
        return new TranslationTextComponent("container.test_chest");
    }

    @Override
    protected Container createMenu(int id, PlayerInventory player) {
        return new TestChestContainer(id,player,this);
    }

    @Override
    public CompoundNBT write(CompoundNBT compound) {
        super.write(compound);
        if (!this.checkLootAndWrite(compound)) {
            ItemStackHelper.saveAllItems(compound, this.chest_items);
        }
        return compound;
    }

    @Override
    public void read(BlockState state,CompoundNBT compound) {
        super.read(state,compound);
        this.chest_items = NonNullList.withSize(this.getSizeInventory(), ItemStack.EMPTY);
        if (!this.checkLootAndRead(compound)) {
            ItemStackHelper.loadAllItems(compound, this.chest_items);
        }
    }

    @Override
    public boolean receiveClientEvent(int id, int type) {
        if(id == 1){
            this.numPlayerUsing = type;
            return true;
        } else {
            return super.receiveClientEvent(id, type);
        }
    }

    @Override
    public void openInventory(PlayerEntity playerEntity) {
        if(playerEntity.isSpectator()){
            if(this.numPlayerUsing < 0){
                this.numPlayerUsing = 0;
            }
            ++numPlayerUsing;
            this.openOrClose();
        }
    }

    @Override
    public void closeInventory(PlayerEntity playerEntity) {
        if(!playerEntity.isSpectator()){
            --this.numPlayerUsing;
            this.openOrClose();
        }
    }

    protected void openOrClose(){
        Block block = this.getBlockState().getBlock();
        if (block instanceof TestChestBlock) {
            this.world.addBlockEvent(this.pos, block, 1, this.numPlayerUsing);
            this.world.notifyNeighborsOfStateChange(this.pos, block);
        }
    }
    
    public static int getPlayersUsing(IBlockReader reader, BlockPos pos) {
        BlockState blockstate = reader.getBlockState(pos);
        if (blockstate.hasTileEntity()) {
            TileEntity tileentity = reader.getTileEntity(pos);
            if (tileentity instanceof TestChestTile) {
                return ((TestChestTile) tileentity).numPlayerUsing;
            }
        }
        return 0;
    }

    public static void swapContents(TestChestTile te, TestChestTile otherTe) {
        NonNullList<ItemStack> list = te.getItems();
        te.setItems(otherTe.getItems());
        otherTe.setItems(list);
    }

    @Override
    public void updateContainingBlockInfo() {
        super.updateContainingBlockInfo();
        if (this.itemHandler != null) {
            this.itemHandler.invalidate();
            this.itemHandler = null;
        }
    }

    @Override
    public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nonnull Direction side) {
        if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) {
            return itemHandler.cast();
        }
        return super.getCapability(cap, side);
    }

    private IItemHandlerModifiable createHandler() {
        return new InvWrapper(this);
    }

    @Override
    public void remove() {
        super.remove();
        if(itemHandler != null) {
            itemHandler.invalidate();
        }
    }

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

    • I wanted to make a horror CurseForge modpack, but my game crashed when I try to play it! Does anyone know what to do? I've looked at other forums with the same problem, but I didn't understand what the replies were talking about. I also checked the log, did everything it said, but still, it didn't work. I am playing on 1.20.1 Forge. This is my first time using Forge. I've also made another Forge modpack test, but that didn't work, and I tried it with a NeoForge modpack test, too, but that didn't work either. Fabric works fine, though. Please help. # # A fatal error has been detected by the Java Runtime Environment: # # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ffb0c676280, pid=30812, tid=27596 # # JRE version: OpenJDK Runtime Environment Microsoft-8035246 (17.0.8+7) (build 17.0.8+7-LTS) # Java VM: OpenJDK 64-Bit Server VM Microsoft-8035246 (17.0.8+7-LTS, mixed mode, tiered, compressed oops, compressed class ptrs, g1 gc, windows-amd64) # Problematic frame: # C [atio6axx.dll+0x196280] # # No core dump will be written. Minidumps are not enabled by default on client versions of Windows # # If you would like to submit a bug report, please visit: # https://aka.ms/minecraftjavacrashes # The crash happened outside the Java Virtual Machine in native code. # See problematic frame for where to report the bug. # Remember: 1. I am using CurseForge 2. I am on 1.20.1 3. I am on Forge 4. Tried the log methods   If you have any details I need to show, please tell me.
    • Server has been running fine until a restart today, at which point it crashes partway through load. I've tried swapping out the modpack to a fresh server and it boots fine, but if I bring in the world file it causes the crash so I'm guessing something is wrong in there but I have no idea how to read and understand these logs, so any advice on what to do next would be helpful, thanks! Here's the log: https://api.mclo.gs/1/raw/jYzFXVR
    • And without betterfortresses?
    • as I understand it, it helped, but a strange error happened again- https://pastes.io/minecraft-crash-6 The game crashed: feature placement Error: java.lang.IllegalArgumentException: Cannot set property DirectionProperty{name=facing, clazz=class net.minecraft.core.Direction, values=[north, south, west, east]} to down on Block{minecraft:dark_oak_button}, it is not an allowed value
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

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