/* CRATE BLOCK ENTITY CODE */ package com.masterquentus.hexcraft.block.entity.custom; import com.masterquentus.hexcraft.block.entity.HexcraftBlockEntities; import com.masterquentus.hexcraft.world.inventory.Crate_WhiteOakGUIMenu; import net.minecraftforge.items.wrapper.SidedInvWrapper; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.common.capabilities.Capability; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity; import net.minecraft.world.item.ItemStack; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.WorldlyContainer; import net.minecraft.world.ContainerHelper; import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; import net.minecraft.network.chat.Component; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.nbt.CompoundTag; import net.minecraft.core.NonNullList; import net.minecraft.core.Direction; import net.minecraft.core.BlockPos; import javax.annotation.Nullable; import java.util.stream.IntStream; import io.netty.buffer.Unpooled; public class Crate_WhiteOakBlockEntity extends RandomizableContainerBlockEntity implements WorldlyContainer { private NonNullList stacks = NonNullList.withSize(27, ItemStack.EMPTY); private final LazyOptional[] handlers = SidedInvWrapper.create(this, Direction.values()); public Crate_WhiteOakBlockEntity(BlockPos position, BlockState state) { super(HexcraftBlockEntities.CRATE_WHITE_OAK.get(), position, state); } @Override public void load(CompoundTag compound) { super.load(compound); if (!this.tryLoadLootTable(compound)) this.stacks = NonNullList.withSize(this.getContainerSize(), ItemStack.EMPTY); ContainerHelper.loadAllItems(compound, this.stacks); } @Override public void saveAdditional(CompoundTag compound) { super.saveAdditional(compound); if (!this.trySaveLootTable(compound)) { ContainerHelper.saveAllItems(compound, this.stacks); } } @Override public ClientboundBlockEntityDataPacket getUpdatePacket() { return ClientboundBlockEntityDataPacket.create(this); } @Override public CompoundTag getUpdateTag() { return this.saveWithFullMetadata(); } @Override public int getContainerSize() { return stacks.size(); } @Override public boolean isEmpty() { for (ItemStack itemstack : this.stacks) if (!itemstack.isEmpty()) return false; return true; } @Override public Component getDefaultName() { return Component.literal("crate_white_oak"); } @Override public int getMaxStackSize() { return 64; } @Override public AbstractContainerMenu createMenu(int id, Inventory inventory) { return new Crate_WhiteOakGUIMenu(id, inventory, new FriendlyByteBuf(Unpooled.buffer()).writeBlockPos(this.worldPosition)); } @Override public Component getDisplayName() { return Component.literal("White Oak Crate"); } @Override protected NonNullList getItems() { return this.stacks; } @Override protected void setItems(NonNullList stacks) { this.stacks = stacks; } @Override public boolean canPlaceItem(int index, ItemStack stack) { return true; } @Override public int[] getSlotsForFace(Direction side) { return IntStream.range(0, this.getContainerSize()).toArray(); } @Override public boolean canPlaceItemThroughFace(int index, ItemStack stack, @Nullable Direction direction) { return this.canPlaceItem(index, stack); } @Override public boolean canTakeItemThroughFace(int index, ItemStack stack, Direction direction) { return true; } @Override public LazyOptional getCapability(Capability capability, @Nullable Direction facing) { if (!this.remove && facing != null && capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) return handlers[facing.ordinal()].cast(); return super.getCapability(capability, facing); } @Override public void setRemoved() { super.setRemoved(); for (LazyOptional handler : handlers) handler.invalidate(); } } /* CRATE BLOCK CODE */ package com.masterquentus.hexcraft.block.custom; import com.masterquentus.hexcraft.block.entity.custom.Crate_WhiteOakBlockEntity; import com.masterquentus.hexcraft.world.inventory.Crate_WhiteOakGUIMenu; import net.minecraftforge.network.NetworkHooks; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.material.Material; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.Level; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.item.TieredItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.MenuProvider; import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionHand; import net.minecraft.world.Containers; import net.minecraft.server.level.ServerPlayer; import net.minecraft.network.chat.Component; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.core.BlockPos; import java.util.List; import java.util.Collections; import io.netty.buffer.Unpooled; public class Crate_WhiteOakBlock extends Block implements EntityBlock { public Crate_WhiteOakBlock() { super(BlockBehaviour.Properties.of(Material.STONE).sound(SoundType.WOOD).strength(2.5f, 12.5f).requiresCorrectToolForDrops()); } @Override public int getLightBlock(BlockState state, BlockGetter worldIn, BlockPos pos) { return 15; } @Override public boolean canHarvestBlock(BlockState state, BlockGetter world, BlockPos pos, Player player) { if (player.getInventory().getSelected().getItem() instanceof TieredItem tieredItem) return tieredItem.getTier().getLevel() >= 0; return false; } @Override public List getDrops(BlockState state, LootContext.Builder builder) { List dropsOriginal = super.getDrops(state, builder); if (!dropsOriginal.isEmpty()) return dropsOriginal; return Collections.singletonList(new ItemStack(this, 1)); } @Override public InteractionResult use(BlockState blockstate, Level world, BlockPos pos, Player entity, InteractionHand hand, BlockHitResult hit) { super.use(blockstate, world, pos, entity, hand, hit); if (entity instanceof ServerPlayer player) { NetworkHooks.openGui(player, new MenuProvider() { @Override public Component getDisplayName() { return Component.literal("White Oak Crate"); } @Override public AbstractContainerMenu createMenu(int id, Inventory inventory, Player player) { return new Crate_WhiteOakGUIMenu(id, inventory, new FriendlyByteBuf(Unpooled.buffer()).writeBlockPos(pos)); } }, pos); } return InteractionResult.SUCCESS; } @Override public MenuProvider getMenuProvider(BlockState state, Level worldIn, BlockPos pos) { BlockEntity tileEntity = worldIn.getBlockEntity(pos); return tileEntity instanceof MenuProvider menuProvider ? menuProvider : null; } @Override public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { return new Crate_WhiteOakBlockEntity(pos, state); } @Override public boolean triggerEvent(BlockState state, Level world, BlockPos pos, int eventID, int eventParam) { super.triggerEvent(state, world, pos, eventID, eventParam); BlockEntity blockEntity = world.getBlockEntity(pos); return blockEntity == null ? false : blockEntity.triggerEvent(eventID, eventParam); } @Override public void onRemove(BlockState state, Level world, BlockPos pos, BlockState newState, boolean isMoving) { if (state.getBlock() != newState.getBlock()) { BlockEntity blockEntity = world.getBlockEntity(pos); if (blockEntity instanceof Crate_WhiteOakBlockEntity be) { Containers.dropContents(world, pos, be); world.updateNeighbourForOutputSignal(pos, this); } super.onRemove(state, world, pos, newState, isMoving); } } @Override public boolean hasAnalogOutputSignal(BlockState state) { return true; } @Override public int getAnalogOutputSignal(BlockState blockState, Level world, BlockPos pos) { BlockEntity tileentity = world.getBlockEntity(pos); if (tileentity instanceof Crate_WhiteOakBlockEntity be) return AbstractContainerMenu.getRedstoneSignalFromContainer(be); else return 0; } }