public void renderAlchemicalChest(
      TileAlchemicalChest tileAlchemicalChest, double x, double y, double z, float tick) {

    ForgeDirection direction = null;

    if (tileAlchemicalChest.getWorldObj() != null) {
      direction = ForgeDirection.getOrientation(tileAlchemicalChest.getBlockMetadata());
    }

    ForgeHooksClient.bindTexture(Sprites.MODEL_ALCHEMICAL_CHEST, 0);
    GL11.glPushMatrix();
    GL11.glEnable(GL12.GL_RESCALE_NORMAL);
    GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
    GL11.glTranslatef((float) x, (float) y + 1.0F, (float) z + 1.0F);
    GL11.glScalef(1.0F, -1.0F, -1.0F);
    GL11.glTranslatef(0.5F, 0.5F, 0.5F);
    short angle = 0;

    if (direction != null) {
      if (direction == ForgeDirection.NORTH) {
        angle = 180;
      } else if (direction == ForgeDirection.SOUTH) {
        angle = 0;
      } else if (direction == ForgeDirection.WEST) {
        angle = 90;
      } else if (direction == ForgeDirection.EAST) {
        angle = -90;
      }
    }

    GL11.glRotatef((float) angle, 0.0F, 1.0F, 0.0F);
    GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
    float adjustedLidAngle =
        tileAlchemicalChest.prevLidAngle
            + (tileAlchemicalChest.lidAngle - tileAlchemicalChest.prevLidAngle) * tick;
    adjustedLidAngle = 1.0F - adjustedLidAngle;
    adjustedLidAngle = 1.0F - adjustedLidAngle * adjustedLidAngle * adjustedLidAngle;
    this.modelChest.chestLid.rotateAngleX = -(adjustedLidAngle * (float) Math.PI / 2.0F);
    this.modelChest.renderAll();
    GL11.glDisable(GL12.GL_RESCALE_NORMAL);
    GL11.glPopMatrix();
    GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
  }
  public ContainerAlchemicalChest(
      InventoryPlayer inventoryPlayer, TileAlchemicalChest tileAlchemicalChest) {
    this.tileAlchemicalChest = tileAlchemicalChest;
    tileAlchemicalChest.openChest();

    if (this.tileAlchemicalChest.getState() == 0) {
      chestInventoryRows = SMALL_CHEST_INVENTORY_ROWS;
      chestInventoryColumns = SMALL_CHEST_INVENTORY_COLUMNS;
    } else if (this.tileAlchemicalChest.getState() == 1) {
      chestInventoryRows = MEDIUM_CHEST_INVENTORY_ROWS;
      chestInventoryColumns = MEDIUM_CHEST_INVENTORY_COLUMNS;
    } else if (this.tileAlchemicalChest.getState() == 2) {
      chestInventoryRows = LARGE_CHEST_INVENTORY_ROWS;
      chestInventoryColumns = LARGE_CHEST_INVENTORY_COLUMNS;
    }

    // Add the Alchemical Chest slots to the container
    for (int chestRowIndex = 0; chestRowIndex < chestInventoryRows; ++chestRowIndex) {
      for (int chestColumnIndex = 0; chestColumnIndex < chestInventoryColumns; ++chestColumnIndex) {
        if (this.tileAlchemicalChest.getState() == 0) {
          this.addSlotToContainer(
              new Slot(
                  tileAlchemicalChest,
                  chestColumnIndex + chestRowIndex * chestInventoryColumns,
                  8 + chestColumnIndex * 18,
                  18 + chestRowIndex * 18));
        } else if (this.tileAlchemicalChest.getState() == 1) {
          this.addSlotToContainer(
              new Slot(
                  tileAlchemicalChest,
                  chestColumnIndex + chestRowIndex * chestInventoryColumns,
                  8 + chestColumnIndex * 18,
                  18 + chestRowIndex * 18));
        } else if (this.tileAlchemicalChest.getState() == 2) {
          this.addSlotToContainer(
              new Slot(
                  tileAlchemicalChest,
                  chestColumnIndex + chestRowIndex * chestInventoryColumns,
                  8 + chestColumnIndex * 18,
                  8 + chestRowIndex * 18));
        }
      }
    }

    // Add the player's inventory slots to the container
    for (int inventoryRowIndex = 0;
        inventoryRowIndex < PLAYER_INVENTORY_ROWS;
        ++inventoryRowIndex) {
      for (int inventoryColumnIndex = 0;
          inventoryColumnIndex < PLAYER_INVENTORY_COLUMNS;
          ++inventoryColumnIndex) {
        if (this.tileAlchemicalChest.getState() == 0) {
          this.addSlotToContainer(
              new Slot(
                  inventoryPlayer,
                  inventoryColumnIndex + inventoryRowIndex * 9 + 9,
                  35 + inventoryColumnIndex * 18,
                  104 + inventoryRowIndex * 18));
        } else if (this.tileAlchemicalChest.getState() == 1) {
          this.addSlotToContainer(
              new Slot(
                  inventoryPlayer,
                  inventoryColumnIndex + inventoryRowIndex * 9 + 9,
                  35 + inventoryColumnIndex * 18,
                  158 + inventoryRowIndex * 18));
        } else if (this.tileAlchemicalChest.getState() == 2) {
          this.addSlotToContainer(
              new Slot(
                  inventoryPlayer,
                  inventoryColumnIndex + inventoryRowIndex * 9 + 9,
                  44 + inventoryColumnIndex * 18,
                  174 + inventoryRowIndex * 18));
        }
      }
    }

    // Add the player's action bar slots to the container
    for (int actionBarSlotIndex = 0;
        actionBarSlotIndex < PLAYER_INVENTORY_COLUMNS;
        ++actionBarSlotIndex) {
      if (this.tileAlchemicalChest.getState() == 0) {
        this.addSlotToContainer(
            new Slot(inventoryPlayer, actionBarSlotIndex, 35 + actionBarSlotIndex * 18, 162));
      } else if (this.tileAlchemicalChest.getState() == 1) {
        this.addSlotToContainer(
            new Slot(inventoryPlayer, actionBarSlotIndex, 35 + actionBarSlotIndex * 18, 216));
      } else if (this.tileAlchemicalChest.getState() == 2) {
        this.addSlotToContainer(
            new Slot(inventoryPlayer, actionBarSlotIndex, 44 + actionBarSlotIndex * 18, 232));
      }
    }
  }
 /** Callback for when the crafting gui is closed. */
 @Override
 public void onContainerClosed(EntityPlayer entityPlayer) {
   super.onContainerClosed(entityPlayer);
   tileAlchemicalChest.closeChest();
 }