@SubscribeEvent
  public void tickStart(PlayerTickEvent evt) {

    if (evt.phase != Phase.START) {
      return;
    }
    if (lastPoll > 0) {
      --lastPoll;
      return;
    }
    lastPoll = 400;

    if (!_notificationDisplayed && _updateThread.checkComplete()) {
      _notificationDisplayed = true;
      FMLCommonHandler.instance().bus().unregister(this);
      if (_updateThread.newVersionAvailable()) {
        if (!CoFHProps.enableUpdateNotice && !_updateThread.isCriticalUpdate()) {
          return;
        }
        ModVersion newVersion = _updateThread.newVersion();

        EntityPlayer player = evt.player;
        player.addChatMessage(
            new ChatComponentText(GOLD + "[" + _mod.getModName() + "]")
                .appendText(WHITE + " A new version is available:"));
        IChatComponent chat;
        String text = newVersion.modVersion().toString();
        if (Strings.isNullOrEmpty(_downloadUrl)) {
          chat = new ChatComponentText(text).setChatStyle(version);
        } else {
          chat =
              IChatComponent.Serializer.func_150699_a(
                  "[{\"text\":\""
                      + text
                      + "\",\"color\":\"aqua\"},"
                      + "{\"text\":\" "
                      + WHITE
                      + "["
                      + GREEN
                      + "Download"
                      + WHITE
                      + "]\","
                      + "\"color\":\"green\",\"hoverEvent\":{\"action\":\"show_text\",\"value\":"
                      + "{\"text\":\"Click this to download the latest version\",\"color\":\"yellow\"}},"
                      + "\"clickEvent\":{\"action\":\"open_url\",\"value\":\""
                      + _downloadUrl
                      + "\"}}]");
        }
        player.addChatMessage(chat);
        player.addChatMessage(
            new ChatComponentText(newVersion.description()).setChatStyle(description));
      }
    }
  }
  public void func_71515_b(ICommandSender p_71515_1_, String[] p_71515_2_) throws CommandException {
    if (p_71515_2_.length < 2) {
      throw new WrongUsageException("commands.tellraw.usage", new Object[0]);
    } else {
      EntityPlayerMP var3 = func_82359_c(p_71515_1_, p_71515_2_[0]);
      String var4 = func_180529_a(p_71515_2_, 1);

      try {
        IChatComponent var5 = IChatComponent.Serializer.func_150699_a(var4);
        var3.func_145747_a(ChatComponentProcessor.func_179985_a(p_71515_1_, var5, var3));
      } catch (JsonParseException var7) {
        Throwable var6 = ExceptionUtils.getRootCause(var7);
        throw new SyntaxErrorException(
            "commands.tellraw.jsonException", new Object[] {var6 == null ? "" : var6.getMessage()});
      }
    }
  }
  /** Draws all of the hovering texts for the buttons that need explanation in the booklet */
  @SuppressWarnings("unchecked")
  public static void doHoverTexts(GuiBooklet booklet, int mouseX, int mouseY) {
    // Achievements Hover Text
    if (booklet.buttonAchievements.func_146115_a()) {
      booklet.drawHoveringText(
          Collections.singletonList(EnumChatFormatting.GOLD + "Show Achievements"), mouseX, mouseY);
    }
    // Config Hover Text
    else if (booklet.buttonConfig.func_146115_a()) {
      ArrayList list = new ArrayList();
      list.add(EnumChatFormatting.GOLD + "Show Configuration GUI");
      list.addAll(
          booklet
              .getFontRenderer()
              .listFormattedStringToWidth(
                  "It is highly recommended that you restart your game after changing anything as that prevents possible bugs occuring!",
                  GuiBooklet.TOOLTIP_SPLIT_LENGTH));
      booklet.drawHoveringText(list, mouseX, mouseY);

    }
    // Twitter Hover Text
    else if (booklet.buttonTwitter.func_146115_a()) {
      booklet.drawHoveringText(
          Collections.singletonList(
              EnumChatFormatting.GOLD + "Open @ActAddMod on Twitter in Browser"),
          mouseX,
          mouseY);
    }
    // Forum Hover Text
    else if (booklet.buttonForum.func_146115_a()) {
      booklet.drawHoveringText(
          Collections.singletonList(
              EnumChatFormatting.GOLD + "Open Minecraft Forum Post in Browser"),
          mouseX,
          mouseY);
    }
    // Update Checker Hover Text
    else if (booklet.buttonUpdate.func_146115_a()) {
      ArrayList list = new ArrayList();
      if (UpdateChecker.checkFailed) {
        list.add(
            IChatComponent.Serializer.func_150699_a(
                    StringUtil.localize("info." + ModUtil.MOD_ID_LOWER + ".update.failed"))
                .getFormattedText());
      } else if (UpdateChecker.needsUpdateNotify) {
        list.add(
            IChatComponent.Serializer.func_150699_a(
                    StringUtil.localize("info." + ModUtil.MOD_ID_LOWER + ".update.generic"))
                .getFormattedText());
        list.add(
            IChatComponent.Serializer.func_150699_a(
                    StringUtil.localizeFormatted(
                        "info." + ModUtil.MOD_ID_LOWER + ".update.versionCompare",
                        ModUtil.VERSION,
                        UpdateChecker.updateVersion))
                .getFormattedText());
        list.add(StringUtil.localize("info." + ModUtil.MOD_ID_LOWER + ".update.buttonOptions"));
      }
      booklet.drawHoveringText(list, mouseX, mouseY);
    } else {
      for (GuiButton button : booklet.bookmarkButtons) {
        if (button instanceof BookmarkButton && button.func_146115_a()) {
          ((BookmarkButton) button).drawHover(mouseX, mouseY);
        }
      }
    }
  }