@SubscribeEvent
  public static void drawElements(RenderGameOverlayEvent.Pre event) {
    if (event.getType() == RenderGameOverlayEvent.ElementType.HOTBAR) {
      GlStateManager.pushMatrix();
      GlStateManager.bindTexture(UITextures.GUI.getGlTextureId());
      for (Component component : components) component.atlasPass(0, event.getPartialTicks());

      GlStateManager.enableRescaleNormal();
      GlStateManager.enableAlpha();
      GlStateManager.alphaFunc(516, 0.1F);
      GlStateManager.enableBlend();
      GlStateManager.blendFunc(
          GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA);

      GlStateManager.bindTexture(mc.getTextureMapBlocks().getGlTextureId());
      for (Component component : components) component.itemPass(0, event.getPartialTicks());

      tex.bindTexture(UITextures.RSS_GLINT);
      for (Component component : components) {
        GlStateManager.pushMatrix();
        component.itemEffectPass(0, event.getPartialTicks());
        GlStateManager.popMatrix();
      }

      GlStateManager.disableAlpha();
      GlStateManager.disableRescaleNormal();
      GlStateManager.disableLighting();

      for (Component component : components) component.textPass(0, event.getPartialTicks(), font);
      GlStateManager.popMatrix();
    }
  }
  /* HUD */
  @SubscribeEvent
  public void renderHealthbar(RenderGameOverlayEvent.Pre event) {
    if (!Loader.isModLoaded("tukmc_Vz")) // Loader check to avoid conflicting
    // with a GUI mod (thanks Vazkii!)
    {
      if (event.type == ElementType.HEALTH) {
        updateCounter++;

        ScaledResolution scaledresolution =
            new ScaledResolution(this.mc.gameSettings, this.mc.displayWidth, this.mc.displayHeight);
        int scaledWidth = scaledresolution.getScaledWidth();
        int scaledHeight = scaledresolution.getScaledHeight();
        int xBasePos = scaledWidth / 2 - 91;
        int yBasePos = scaledHeight - 39;

        boolean highlight = mc.thePlayer.hurtResistantTime / 3 % 2 == 1;

        if (mc.thePlayer.hurtResistantTime < 10) {
          highlight = false;
        }

        IAttributeInstance attrMaxHealth =
            this.mc.thePlayer.getEntityAttribute(SharedMonsterAttributes.maxHealth);
        int health = MathHelper.ceiling_float_int(mc.thePlayer.getHealth());
        int healthLast = MathHelper.ceiling_float_int(mc.thePlayer.prevHealth);
        float healthMax = (float) attrMaxHealth.getAttributeValue();
        if (healthMax > 20) healthMax = 20;
        float absorb = this.mc.thePlayer.getAbsorptionAmount();

        int healthRows = MathHelper.ceiling_float_int((healthMax + absorb) / 2.0F / 10.0F);
        int rowHeight = Math.max(10 - (healthRows - 2), 3);

        this.rand.setSeed((long) (updateCounter * 312871));

        int left = scaledWidth / 2 - 91;
        int top = scaledHeight - GuiIngameForge.left_height;

        int regen = -1;
        if (mc.thePlayer.isPotionActive(Potion.regeneration)) {
          regen = updateCounter % 25;
        }

        final int TOP = 9 * (mc.theWorld.getWorldInfo().isHardcoreModeEnabled() ? 5 : 0);
        final int BACKGROUND = (highlight ? 25 : 16);
        int MARGIN = 16;
        if (mc.thePlayer.isPotionActive(Potion.poison)) MARGIN += 36;
        else if (mc.thePlayer.isPotionActive(Potion.wither)) MARGIN += 72;
        float absorbRemaining = absorb;

        for (int i = MathHelper.ceiling_float_int((healthMax + absorb) / 2.0F) - 1; i >= 0; --i) {
          int b0 = (highlight ? 1 : 0);
          int row = MathHelper.ceiling_float_int((float) (i + 1) / 10.0F) - 1;
          int x = left + i % 10 * 8;
          int y = top - row * rowHeight;

          if (health <= 4) y += rand.nextInt(2);
          if (i == regen) y -= 2;

          drawTexturedModalRect(x, y, BACKGROUND, TOP, 9, 9);

          if (highlight) {
            if (i * 2 + 1 < healthLast) drawTexturedModalRect(x, y, MARGIN + 54, TOP, 9, 9); // 6
            else if (i * 2 + 1 == healthLast)
              drawTexturedModalRect(x, y, MARGIN + 63, TOP, 9, 9); // 7
          }

          if (absorbRemaining > 0.0F) {
            if (absorbRemaining == absorb && absorb % 2.0F == 1.0F)
              drawTexturedModalRect(x, y, MARGIN + 153, TOP, 9, 9); // 17
            else drawTexturedModalRect(x, y, MARGIN + 144, TOP, 9, 9); // 16
            absorbRemaining -= 2.0F;
          } else {
            if (i * 2 + 1 < health) drawTexturedModalRect(x, y, MARGIN + 36, TOP, 9, 9); // 4
            else if (i * 2 + 1 == health) drawTexturedModalRect(x, y, MARGIN + 45, TOP, 9, 9); // 5
          }
        }

        PotionEffect potion = mc.thePlayer.getActivePotionEffect(Potion.wither);
        if (potion != null) return;
        potion = mc.thePlayer.getActivePotionEffect(Potion.poison);
        if (potion != null) return;

        // Extra hearts
        this.mc.getTextureManager().bindTexture(hearts);

        int hp = MathHelper.ceiling_float_int(this.mc.thePlayer.getHealth());
        for (int iter = 0; iter < hp / 20; iter++) {
          int renderHearts = (hp - 20 * (iter + 1)) / 2;
          if (renderHearts > 10) renderHearts = 10;
          for (int i = 0; i < renderHearts; i++) {
            this.drawTexturedModalRect(xBasePos + 8 * i, yBasePos, 0 + 18 * iter, 0, 8, 8);
          }
          if (hp % 2 == 1 && renderHearts < 10) {
            this.drawTexturedModalRect(
                xBasePos + 8 * renderHearts, yBasePos, 9 + 18 * iter, 0, 8, 8);
          }
        }

        this.mc.getTextureManager().bindTexture(icons);
        GuiIngameForge.left_height += 10;
        if (absorb > 0) GuiIngameForge.left_height += 10;

        event.setCanceled(true);
        if (event.type == ElementType.CROSSHAIRS && gs.thirdPersonView != 0) {
          event.setCanceled(true);
        }
      }
    }
  }