Posted February 1, 20223 yr I'm experimenting with tile entities, and checked the vanilla source code to see examples for making a block tile entity drop its contents on break, I'm using this method, any ideas why it isn't working? public void onRemove(BlockState state, World world, BlockPos pos, BlockState blockState, boolean b) { if (!state.is(blockState.getBlock())) { TileEntity tileentity = world.getBlockEntity(pos); if (tileentity instanceof IInventory) { InventoryHelper.dropContents(world, pos, (IInventory) tileentity); world.updateNeighbourForOutputSignal(pos, this); } super.onRemove(state, world, pos, blockState, b); } }
February 1, 20223 yr Author public class BasicGemFusionBenchTile extends TileEntity implements ITickableTileEntity { private final ItemStackHandler itemHandler = createHandler(); private final LazyOptional<IItemHandler> handler = LazyOptional.of(() -> itemHandler); public BasicGemFusionBenchTile(TileEntityType<?> tileEntityTypeIn) { super(tileEntityTypeIn); } public BasicGemFusionBenchTile() { this(ModTileEntities.BASIC_GEM_FUSION_BENCH_TILE.get()); } @Override public void load(BlockState state, CompoundNBT nbt) { itemHandler.deserializeNBT(nbt.getCompound("inv")); super.load(state, nbt); } @Override public CompoundNBT save(CompoundNBT compound) { compound.put("inv", itemHandler.serializeNBT()); return super.save(compound); } private ItemStackHandler createHandler(){ return new ItemStackHandler(4){ @Override protected void onContentsChanged(int slot){ setChanged(); } @Override public boolean isItemValid(int slot, @Nonnull ItemStack stack) { switch (slot){ case 0: return stack.getItem().is(ModTags.Items.PRIMITIVE_GEMS); case 1: return stack.getItem().is(ModTags.Items.PRIMITIVE_GEMS); case 2: return stack.getItem() == Items.BLAZE_POWDER; case 3: return stack.getItem() == ModItems.PERIDOT.get() || stack.getItem() == ModItems.SUGILITE.get()|| stack.getItem() == ModItems.AMBER.get(); default: return false; } } @Nonnull @Override public ItemStack insertItem(int slot, @Nonnull ItemStack stack, boolean simulate) { if (!isItemValid(slot,stack)){ return stack; } return super.insertItem(slot, stack, simulate); } }; } @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); } public void craft(){ Inventory inv = new Inventory(itemHandler.getSlots()); for (int i = 0; i < itemHandler.getSlots(); i++) { inv.setItem(i, itemHandler.getStackInSlot(i)); } Optional<BasicGemFusionBenchRecipe> recipe = level.getRecipeManager() .getRecipeFor(ModRecipeTypes.FUSION_RECIPE, inv, level); recipe.ifPresent(iRecipe ->{ ItemStack output = iRecipe.getResultItem(); craftTheItem(output); setChanged(); }); } private void craftTheItem(ItemStack output) { itemHandler.extractItem(0,1,false); itemHandler.extractItem(1,1,false); itemHandler.extractItem(2,1,false); //blaze powder itemHandler.insertItem(3,output,false); //result } @Override public void tick() { if(level.isClientSide()){ return; } craft(); } }
February 1, 20223 yr Author 17 minutes ago, diesieben07 said: I don't know, does your TileEntity implement IItemHandler? No, it implements ITickableTileEntity 17 minutes ago, loordgek said: do you know java ? I know basic java, but I'm new to forge developing
February 1, 20223 yr Author public void onRemove(BlockState state, World world, BlockPos pos, BlockState blockState, boolean b) { if (!state.is(blockState.getBlock())) { TileEntity tileentity = world.getBlockEntity(pos); if (tileentity instanceof ITickableTileEntity) { InventoryHelper.dropContents(world, pos, (ITickableTileEntity) tileentity); world.updateNeighbourForOutputSignal(pos, this); } super.onRemove(state, world, pos, blockState, b); } } Does this look good then?
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.