private final void useBlockCheckerItem(final L2PcInstance castor, L2ItemInstance item) {
    final int blockCheckerArena = castor.getBlockCheckerArena();
    if (blockCheckerArena == -1) {
      SystemMessage msg = SystemMessage.getSystemMessage(SystemMessageId.S1_CANNOT_BE_USED);
      msg.addItemName(item);
      castor.sendPacket(msg);
      return;
    }

    final L2Skill sk = item.getEtcItem().getSkills()[0].getSkill();
    if (sk == null) return;

    if (!castor.destroyItem("Consume", item, 1, castor, true)) return;

    final L2BlockInstance block = (L2BlockInstance) castor.getTarget();

    final ArenaParticipantsHolder holder =
        HandysBlockCheckerManager.getInstance().getHolder(blockCheckerArena);
    if (holder != null) {
      final int team = holder.getPlayerTeam(castor);
      for (final L2PcInstance pc :
          block.getKnownList().getKnownPlayersInRadius(sk.getEffectRange())) {
        final int enemyTeam = holder.getPlayerTeam(pc);
        if (enemyTeam != -1 && enemyTeam != team) sk.getEffects(castor, pc);
      }
    } else
      _log.warning(
          "Char: "
              + castor.getName()
              + "["
              + castor.getObjectId()
              + "] has unknown block checker arena");
  }
  /* (non-Javadoc)
   * @see l2.brick.gameserver.handler.IItemHandler#useItem(l2.brick.gameserver.model.actor.L2Playable, l2.brick.gameserver.model.L2ItemInstance, boolean)
   */
  @Override
  public void useItem(L2Playable playable, L2ItemInstance item, boolean forceUse) {
    if (!(playable instanceof L2PcInstance)) return;

    final L2PcInstance activeChar = (L2PcInstance) playable;

    final int itemId = item.getItemId();
    switch (itemId) {
      case 13787: // Handy's Block Checker Bond
        useBlockCheckerItem(activeChar, item);
        break;
      case 13788: // Handy's Block Checker Land Mine
        useBlockCheckerItem(activeChar, item);
        break;
      default:
        _log.warning("EventItemHandler: Item with id: " + itemId + " is not handled");
    }
  }
  @Override
  protected void runImpl() {
    if (_skillId <= 0 || _skillLvl <= 0) // minimal sanity check
    return;

    L2PcInstance player = getClient().getActiveChar();
    if (player == null) return;

    if (player.getClassId().level() < 3) // requires to have 3rd class quest completed
    {
      player.sendPacket(SystemMessageId.YOU_CANNOT_USE_SKILL_ENCHANT_IN_THIS_CLASS);
      return;
    }

    if (player.getLevel() < 76) {
      player.sendPacket(SystemMessageId.YOU_CANNOT_USE_SKILL_ENCHANT_ON_THIS_LEVEL);
      return;
    }

    if (!player.isAllowedToEnchantSkills()) {
      player.sendPacket(SystemMessageId.YOU_CANNOT_USE_SKILL_ENCHANT_ATTACKING_TRANSFORMED_BOAT);
      return;
    }

    L2EnchantSkillLearn s = EnchantGroupsTable.getInstance().getSkillEnchantmentBySkillId(_skillId);
    if (s == null) return;

    if (_skillLvl % 100 == 0) {
      _skillLvl = s.getBaseLevel();
    }

    L2Skill skill = SkillTable.getInstance().getInfo(_skillId, _skillLvl);
    if (skill == null) return;

    int reqItemId = EnchantGroupsTable.UNTRAIN_ENCHANT_BOOK;

    final int beforeUntrainSkillLevel = player.getSkillLevel(_skillId);
    if (beforeUntrainSkillLevel - 1 != _skillLvl
        && (beforeUntrainSkillLevel % 100 != 1 || _skillLvl != s.getBaseLevel())) return;

    EnchantSkillDetail esd = s.getEnchantSkillDetail(beforeUntrainSkillLevel);

    int requiredSp = esd.getSpCost();
    int requireditems = esd.getAdenaCost();

    L2ItemInstance spb = player.getInventory().getItemByItemId(reqItemId);
    if (Config.ES_SP_BOOK_NEEDED) {
      if (spb == null) // Haven't spellbook
      {
        player.sendPacket(
            SystemMessageId.YOU_DONT_HAVE_ALL_OF_THE_ITEMS_NEEDED_TO_ENCHANT_THAT_SKILL);
        return;
      }
    }

    if (player.getInventory().getAdena() < requireditems) {
      player.sendPacket(
          SystemMessageId.YOU_DONT_HAVE_ALL_OF_THE_ITEMS_NEEDED_TO_ENCHANT_THAT_SKILL);
      return;
    }

    boolean check = true;
    if (Config.ES_SP_BOOK_NEEDED) {
      check &= player.destroyItem("Consume", spb.getObjectId(), 1, player, true);
    }

    check &=
        player.destroyItemByItemId("Consume", PcInventory.ADENA_ID, requireditems, player, true);

    if (!check) {
      player.sendPacket(
          SystemMessageId.YOU_DONT_HAVE_ALL_OF_THE_ITEMS_NEEDED_TO_ENCHANT_THAT_SKILL);
      return;
    }

    player.getStat().addSp((int) (requiredSp * 0.8));

    if (Config.LOG_SKILL_ENCHANTS) {
      LogRecord record = new LogRecord(Level.INFO, "Untrain");
      record.setParameters(new Object[] {player, skill, spb});
      record.setLoggerName("skill");
      _logEnchant.log(record);
    }

    player.addSkill(skill, true);
    player.sendPacket(ExEnchantSkillResult.valueOf(true));

    if (Config.DEBUG) {
      _log.fine(
          "Learned skill ID: "
              + _skillId
              + " Level: "
              + _skillLvl
              + " for "
              + requiredSp
              + " SP, "
              + requireditems
              + " Adena.");
    }

    player.sendPacket(new UserInfo(player));
    player.sendPacket(new ExBrExtraUserInfo(player));

    if (_skillLvl > 100) {
      SystemMessage sm =
          SystemMessage.getSystemMessage(
              SystemMessageId.UNTRAIN_SUCCESSFUL_SKILL_S1_ENCHANT_LEVEL_DECREASED_BY_ONE);
      sm.addSkillName(_skillId);
      player.sendPacket(sm);
    } else {
      SystemMessage sm =
          SystemMessage.getSystemMessage(
              SystemMessageId.UNTRAIN_SUCCESSFUL_SKILL_S1_ENCHANT_LEVEL_RESETED);
      sm.addSkillName(_skillId);
      player.sendPacket(sm);
    }
    player.sendSkillList();
    final int afterUntrainSkillLevel = player.getSkillLevel(_skillId);
    player.sendPacket(new ExEnchantSkillInfo(_skillId, afterUntrainSkillLevel));
    player.sendPacket(
        new ExEnchantSkillInfoDetail(2, _skillId, afterUntrainSkillLevel - 1, player));
    player.updateShortCuts(_skillId, afterUntrainSkillLevel);
  }