package gigaherz.survivalist.rack; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.inventory.InventoryHelper; import net.minecraft.inventory.container.INamedContainerProvider; import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.ItemStack; import net.minecraft.state.DirectionProperty; import net.minecraft.state.StateContainer; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; import net.minecraft.util.Hand; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.util.math.shapes.VoxelShapes; import net.minecraft.world.IBlockReader; import net.minecraft.world.World; import net.minecraftforge.fml.network.NetworkHooks; import net.minecraftforge.items.IItemHandler; import javax.annotation.Nullable; public class DryingRackBlock extends Block { public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING; private final VoxelShape shape1; private final VoxelShape shape2; { { VoxelShape top1 = Block.makeCuboidShape(0, 13, 0, 16, 16, 16); VoxelShape side1 = Block.makeCuboidShape(0, 0, 0, 16, 16, 2); VoxelShape side2 = Block.makeCuboidShape(0, 0, 14, 16, 16, 16); shape1 = VoxelShapes.or( top1, side1, side2 ); } { VoxelShape top1 = Block.makeCuboidShape(0, 13, 0, 16, 16, 16); VoxelShape side1 = Block.makeCuboidShape(0, 0, 0, 2, 16, 16); VoxelShape side2 = Block.makeCuboidShape(14, 0, 0, 16, 16, 16); shape2 = VoxelShapes.or( top1, side1, side2 ); } } public DryingRackBlock(Properties properties) { super(properties); setDefaultState(getStateContainer().getBaseState().with(FACING, Direction.NORTH)); } @Override public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { return (state.get(FACING).getHorizontalIndex() % 2) == 0 ? shape1 : shape2; } @Override public boolean hasTileEntity(BlockState state) { return true; } @Nullable @Override public TileEntity createTileEntity(BlockState state, IBlockReader world) { return new DryingRackTileEntity(); } @Override protected void fillStateContainer(StateContainer.Builder<Block, BlockState> builder) { builder.add(FACING); } @Nullable @Override public BlockState getStateForPlacement(BlockItemUseContext context) { return getDefaultState().with(FACING, context.getPlacementHorizontalFacing()); } @Deprecated @Override public ActionResultType onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult blockRayTraceResult) { if (worldIn.isRemote) return ActionResultType.SUCCESS; TileEntity tileEntity = worldIn.getTileEntity(pos); if (!(tileEntity instanceof INamedContainerProvider)) return ActionResultType.FAIL; NetworkHooks.openGui((ServerPlayerEntity) player, (INamedContainerProvider) tileEntity); return ActionResultType.SUCCESS; } @Override public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { if (newState.getBlock() != state.getBlock()) { TileEntity tileentity = worldIn.getTileEntity(pos); if (tileentity instanceof DryingRackTileEntity) { dropInventoryItems(worldIn, pos, ((DryingRackTileEntity) tileentity).inventory()); worldIn.updateComparatorOutputLevel(pos, this); } super.onReplaced(state, worldIn, pos, newState, isMoving); } } private static void dropInventoryItems(World worldIn, BlockPos pos, IItemHandler inventory) { for (int i = 0; i < inventory.getSlots(); ++i) { ItemStack itemstack = inventory.getStackInSlot(i); if (itemstack.getCount() > 0) { InventoryHelper.spawnItemStack(worldIn, (double) pos.getX(), (double) pos.getY(), (double) pos.getZ(), itemstack); } } } }