protected boolean middleReached(TravelingItem item) {
   float middleLimit = item.getSpeed() * 1.01F;
   return (Math.abs(container.xCoord + 0.5 - item.xCoord) < middleLimit
       && Math.abs(
               container.yCoord + TransportUtils.getPipeFloorOf(item.getItemStack()) - item.yCoord)
           < middleLimit
       && Math.abs(container.zCoord + 0.5 - item.zCoord) < middleLimit);
 }
  private void readjustPosition(TravelingItem item) {
    double x = item.xCoord;
    double y = item.yCoord;
    double z = item.zCoord;

    x = Math.max(x, container.xCoord + 0.01);
    y = Math.max(y, container.yCoord + 0.01);
    z = Math.max(z, container.zCoord + 0.01);

    x = Math.min(x, container.xCoord + 0.99);
    y = Math.min(y, container.yCoord + 0.99);
    z = Math.min(z, container.zCoord + 0.99);

    if (item.input != ForgeDirection.UP && item.input != ForgeDirection.DOWN) {
      y = container.yCoord + TransportUtils.getPipeFloorOf(item.getItemStack());
    }

    item.setPosition(x, y, z);
  }
  private void moveSolids() {
    items.performLoad();
    items.performRemoval();

    for (TravelingItem item : items) {
      if (item.isCorrupted()) {
        items.scheduleRemoval(item);
        continue;
      }

      if (item.getContainer() != this.container) {
        items.scheduleRemoval(item);
        continue;
      }

      Position motion = new Position(0, 0, 0, item.toCenter ? item.input : item.output);
      motion.moveForwards(item.getSpeed());

      item.movePosition(motion.x, motion.y, motion.z);

      if ((item.toCenter && middleReached(item)) || outOfBounds(item)) {
        item.toCenter = false;

        // Reajusting to the middle
        item.setPosition(
            container.xCoord + 0.5,
            container.yCoord + TransportUtils.getPipeFloorOf(item.getItemStack()),
            container.zCoord + 0.5);

        if (item.output == ForgeDirection.UNKNOWN) {
          if (travelHook != null) {
            travelHook.drop(this, item);
          }

          EntityItem dropped = null;

          if (items.scheduleRemoval(item)) {
            dropped = item.toEntityItem(item.input);
          }

          if (dropped != null) {
            onDropped(dropped);
          }
        } else {
          if (travelHook != null) {
            travelHook.centerReached(this, item);
          }
        }

      } else if (!item.toCenter && endReached(item)) {
        TileEntity tile = container.getTile(item.output);

        boolean handleItem = true;
        if (travelHook != null) {
          handleItem = !travelHook.endReached(this, item, tile);
        }

        // If the item has not been scheduled to removal by the hook
        if (handleItem && items.scheduleRemoval(item)) {
          handleTileReached(item, tile);
        }
      }
    }

    items.performRemoval();
  }