@Override
  public void renderTileEntityAt(TileEntity tileEntity, double d0, double d1, double d2, float f) {
    modelBloodAltar.renderBloodAltar((TEAltar) tileEntity, d0, d1, d2);
    modelBloodAltar.renderBloodLevel((TEAltar) tileEntity, d0, d1, d2);

    if (tileEntity instanceof TEAltar) {
      TEAltar tileAltar = (TEAltar) tileEntity;
      GL11.glDisable(GL11.GL_LIGHTING);
      GL11.glDisable(GL11.GL_CULL_FACE);
      /** Render the ghost item inside of the Altar, slowly spinning */
      GL11.glPushMatrix();

      if (tileAltar.getStackInSlot(0) != null) {
        float scaleFactor = getGhostItemScaleFactor(tileAltar.getStackInSlot(0));
        float rotationAngle = (float) (720.0 * (System.currentTimeMillis() & 0x3FFFL) / 0x3FFFL);
        EntityItem ghostEntityItem = new EntityItem(tileAltar.getWorldObj());
        ghostEntityItem.hoverStart = 0.0F;
        ghostEntityItem.setEntityItemStack(tileAltar.getStackInSlot(0));
        // translateGhostItemByOrientation(ghostEntityItem.getEntityItem(), d0, d1, d2,
        // ForgeDirection.DOWN);
        float displacement = 0.2F;

        if (ghostEntityItem.getEntityItem().getItem() instanceof ItemBlock) {
          GL11.glTranslatef((float) d0 + 0.5F, (float) d1 + displacement + 0.7F, (float) d2 + 0.5F);
        } else {
          GL11.glTranslatef((float) d0 + 0.5F, (float) d1 + displacement + 0.6F, (float) d2 + 0.5F);
        }

        // GL11.glTranslatef((float) tileAltar.xCoord + 0.5F, (float) tileAltar.yCoord + 2.7F,
        // (float) tileAltar.zCoord + 0.5F);
        GL11.glScalef(scaleFactor, scaleFactor, scaleFactor);
        GL11.glRotatef(rotationAngle, 0.0F, 1.0F, 0.0F);
        customRenderItem.doRender(ghostEntityItem, 0, 0, 0, 0, 0);
      }

      GL11.glPopMatrix();
      GL11.glEnable(GL11.GL_CULL_FACE);
      GL11.glEnable(GL11.GL_LIGHTING);
    }
  }
  @Override
  public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) {
    if (!world.isRemote) {
      EnergyItems.checkAndSetItemOwner(stack, player);
      NBTTagCompound itemTag = stack.stackTagCompound;

      if (itemTag == null || itemTag.getString("ownerName").equals("")) return stack;

      String ownerName = itemTag.getString("ownerName");

      int currentEssence = EnergyItems.getCurrentEssence(ownerName);

      TileEntity te = Utils.getTargetTile(player);
      if (te != null && te instanceof TEAltar) {
        TEAltar altar = (TEAltar) te;
        float selfSacrifiseMultiplier = altar.getSelfSacrificeMultiplier() * 10;
        float sacrifiseMultiplier = altar.getSacrificeMultiplier() * 10;

        int sacrifise = (int) (500 + ((500 / 100) * sacrifiseMultiplier));
        int selfSacrifise = (int) (200 + ((200 / 100) * selfSacrifiseMultiplier));
        player.addChatComponentMessage(
            new ChatComponentText(
                EnumChatFormatting.RED
                    + "Stored: "
                    + EnumChatFormatting.GRAY
                    + altar.getCurrentBlood()
                    + "/"
                    + altar.getCapacity()));
        player.addChatComponentMessage(
            new ChatComponentText(
                EnumChatFormatting.RED + "Tier: " + EnumChatFormatting.GRAY + altar.getTier()));
        player.addChatComponentMessage(
            new ChatComponentText(
                EnumChatFormatting.RED
                    + "Self-Sacrifice: "
                    + EnumChatFormatting.GRAY
                    + selfSacrifise
                    + " LP"));
        player.addChatComponentMessage(
            new ChatComponentText(
                EnumChatFormatting.RED
                    + "Sacrifice: "
                    + EnumChatFormatting.GRAY
                    + sacrifise
                    + " LP"));

        if (altar.getStackInSlot(0) != null) {
          AltarRecipe recipe =
              AltarRecipeRegistry.getAltarRecipeForItemAndTier(
                  altar.getStackInSlot(0), altar.getTier());
          if (recipe != null && recipe.getResult() != null) {
            player.addChatComponentMessage(
                new ChatComponentText(
                    EnumChatFormatting.RED
                        + "Progress: "
                        + EnumChatFormatting.GRAY
                        + altar.getProgress()
                        + "/"
                        + recipe.getLiquidRequired()));
            player.addChatComponentMessage(
                new ChatComponentText(
                    EnumChatFormatting.RED
                        + "Output: "
                        + EnumChatFormatting.GRAY
                        + recipe.getResult().getDisplayName()));
          }

          if (altar.getStackInSlot(0).getItem() instanceof IBloodOrb) {
            IBloodOrb orb = (IBloodOrb) altar.getStackInSlot(0).getItem();
            float orbMultiplier = altar.getOrbMultiplier() * 2;
            int orbStorage =
                (int) (orb.getMaxEssence() + ((orb.getMaxEssence() / 100) * orbMultiplier));
            player.addChatComponentMessage(
                new ChatComponentText(
                    EnumChatFormatting.RED
                        + "Orb Storage: "
                        + EnumChatFormatting.GRAY
                        + orbStorage
                        + " LP"));
          }
        }
      } else {
        World worldSave = MinecraftServer.getServer().worldServers[0];
        if (worldSave != null) {
          LifeEssenceNetwork data = EssenceHelper.getLifeEssenceNetwork(ownerName, worldSave);
          if (data != null)
            player.addChatComponentMessage(
                new ChatComponentText(
                    EnumChatFormatting.RED
                        + "Network Essence: "
                        + EnumChatFormatting.GRAY
                        + currentEssence
                        + " LP"));
        }
      }
    }
    return stack;
  }