@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;
  }
Esempio n. 2
0
  /**
   * Добавляет предмет в инвентарь игрока, корректно обрабатывает нестыкуемые вещи
   *
   * @param playable Владелец инвентаря
   * @param itemId ID предмета
   * @param count количество
   */
  public static void addItem(Playable playable, int itemId, long count, boolean notify) {
    if (playable == null || count < 1) return;

    Playable player;
    if (playable.isSummon()) player = playable.getPlayer();
    else player = playable;

    if (itemId > 0) {
      ItemTemplate t = ItemHolder.getInstance().getTemplate(itemId);
      if (t.isStackable()) player.getInventory().addItem(itemId, count);
      else for (long i = 0; i < count; i++) player.getInventory().addItem(itemId, 1);

      if (notify) player.sendPacket(SystemMessage2.obtainItems(itemId, count, 0));
    } else if (itemId == -100 && player.isPlayer()) {
      player.getPlayer().addPcBangPoints((int) count, false);
    } else if (itemId == -200 && player.isPlayer()) {
      if (player.getPlayer().getClan() != null)
        player.getPlayer().getClan().incReputation((int) count, false, "itemFunction");
    } else if (itemId == -300 && player.isPlayer()) {
      player.getPlayer().setFame((int) count + player.getPlayer().getFame(), "itemFunction");
    }
  }
  @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;
  }