@Override
  public boolean onBlockActivated(
      World world,
      int x,
      int y,
      int z,
      EntityPlayer player,
      int side,
      float hitX,
      float hitY,
      float hitZ) {

    if (player.isSneaking()) {
      if (!world.isRemote) {
        IInventoryProvider te =
            TileEntityUtils.getTileEntity(IInventoryProvider.class, world, x, y, z);
        MalisisInventory.open((EntityPlayerMP) player, te);
      }
    } else {
      TEKnifeSwitch te = TileEntityUtils.getTileEntity(TEKnifeSwitch.class, world, x, y, z);
      if (te == null) return true;

      if (te.isMoving()) return true;

      te.pushMe();
      if (te.getState() == TEGenericControl.State.TURNINGON)
        world.playSoundEffect(
            (double) x + 0.5D, (double) y + 0.5D, (double) z + 0.5D, "random.click", 0.3F, 0.6F);
      else
        world.playSoundEffect(
            (double) x + 0.5D, (double) y + 0.5D, (double) z + 0.5D, "random.click", 0.3F, 0.5F);
    }
    return true;
  }
  @Override
  public void onBlockPlacedBy(
      World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) {

    ForgeDirection dir = Utilities.metaToDir(world.getBlockMetadata(x, y, z));
    TEKnifeSwitch te = TileEntityUtils.getTileEntity(TEKnifeSwitch.class, world, x, y, z);
    if (te != null) te.setDirection(dir);
    else System.out.println("TE is NULL! :(");
  }
  @Override
  public AxisAlignedBB[] getBoundingBox(
      IBlockAccess world, int x, int y, int z, BoundingBoxType type) {
    RustyHatchTileEntity te =
        TileEntityUtils.getTileEntity(RustyHatchTileEntity.class, world, x, y, z);
    if (te == null || te.isMoving() || te.getMovement() == null || te.getMultiBlock() == null)
      return AABBUtils.identities();

    AxisAlignedBB aabb = te.getMovement().getBoundingBox(te, te.isTopBlock(x, y, z), type);
    if (aabb != null) aabb.offset(-x, -y, -z);
    return new AxisAlignedBB[] {aabb};
  }
  @Override
  public boolean onBlockActivated(
      World world,
      int x,
      int y,
      int z,
      EntityPlayer player,
      int side,
      float hitX,
      float hitY,
      float hitZ) {
    if (world.isRemote) return true;

    RustyHatchTileEntity te =
        TileEntityUtils.getTileEntity(RustyHatchTileEntity.class, world, x, y, z);
    if (te == null) return true;

    te.openOrCloseDoor();
    return true;
  }