@Override
 public void runImpl() throws Exception {
   _activeChar.sendActionFailed();
   _activeChar.clearCastVars(false);
   if (_activeChar.isDead() || _target.isDead()) return;
   _target.addAbsorber(_activeChar);
 }
  @Override
  public boolean useItem(Playable playable, ItemInstance item, boolean ctrl) {
    Player player;
    if (playable.isPlayer()) player = (Player) playable;
    else if (playable.isPet()) player = playable.getPlayer();
    else return false;

    GameObject target = player.getTarget();
    if (target == null || !target.isMonster()) {
      player.sendPacket(SystemMsg.THAT_IS_AN_INCORRECT_TARGET);
      return false;
    }

    MonsterInstance monster = (MonsterInstance) player.getTarget();

    if (!monster.isDead()) {
      player.sendPacket(SystemMsg.THAT_IS_AN_INCORRECT_TARGET);
      return false;
    }

    Skill skill = SkillTable.getInstance().getInfo(HARVESTER_SKILL_ID, 1);
    if (skill != null && skill.checkCondition(player, monster, false, false, true)) {
      player.getAI().Cast(skill, monster);
      return true;
    }
    return false;
  }
  @Override
  public boolean useItem(Playable playable, ItemInstance item, boolean ctrl) {
    if (playable == null || !playable.isPlayer()) return false;
    Player player = playable.getPlayer();

    if (player.getTarget() == null || !player.getTarget().isMonster()) {
      player.sendPacket(SystemMsg.INVALID_TARGET, ActionFail.STATIC);
      return false;
    }

    if (player.isImmobilized() || player.isCastingNow()) {
      player.sendActionFailed();
      return false;
    }

    MonsterInstance target = (MonsterInstance) player.getTarget();

    // u can use soul crystal only when target hp goes to <50%
    if (target.getCurrentHpPercents() >= 50) {
      player.sendPacket(
          SystemMsg.THE_SOUL_CRYSTAL_WAS_NOT_ABLE_TO_ABSORB_THE_SOUL, ActionFail.STATIC);
      return false;
    }

    // Soul Crystal Casting section
    int skillHitTime = SkillTable.getInstance().getInfo(SOUL_CRYSTAL_SKILL_ID, 1).getHitTime();
    player.broadcastPacket(new MagicSkillUse(player, SOUL_CRYSTAL_SKILL_ID, 1, skillHitTime, 0));
    player.sendPacket(new SetupGauge(player, SetupGauge.Colors.BLUE, skillHitTime));
    // End Soul Crystal Casting section

    // Continue execution later
    player._skillTask =
        ThreadPoolManager.getInstance()
            .schedule(new CrystalFinalizer(player, target), skillHitTime);
    return true;
  }