Пример #1
0
  /**
   * Проверяет возможность носить эту вещь.
   *
   * @return null, если вещь носить можно, либо SystemMessage, который можно показать игроку
   */
  public static final IStaticPacket checkIfCanEquip(Player player, ItemInstance item) {
    // FIXME [G1ta0] черезмерный хардкод, переделать на условия
    int itemId = item.getItemId();
    int targetSlot = item.getTemplate().getBodyPart();
    Clan clan = player.getClan();

    // TODO: [Bonux] проверить, могут ли носить Камаэли щиты и сигили R ранга.
    if (!player.getClassId().isOfLevel(ClassLevel.AWAKED)
        && item.getGrade() != ItemGrade.R
        && item.getGrade() != ItemGrade.R95
        && item.getGrade() != ItemGrade.R99) {
      // камаэли и хеви/робы/щиты/сигилы
      if (player.getRace() == Race.KAMAEL
          && (item.getItemType() == ArmorType.HEAVY
              || item.getItemType() == ArmorType.MAGIC
              || item.getItemType() == ArmorType.SIGIL
              || item.getItemType() == WeaponType.NONE))
        return SystemMsg.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM;

      // не камаэли и рапиры/арбалеты/древние мечи
      if (player.getRace() != Race.KAMAEL
          && (item.getItemType() == WeaponType.CROSSBOW
              || item.getItemType() == WeaponType.RAPIER
              || item.getItemType() == WeaponType.ANCIENTSWORD))
        return SystemMsg.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM;
    }

    if (itemId >= 7850 && itemId <= 7859 && player.getLvlJoinedAcademy() == 0) // Clan Oath Armor
    return SystemMsg.THIS_ITEM_CAN_ONLY_BE_WORN_BY_A_MEMBER_OF_THE_CLAN_ACADEMY;

    if (isClanApellaItem(itemId) && player.getPledgeRank().ordinal() < PledgeRank.WISEMAN.ordinal())
      return SystemMsg.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM;

    if (item.getItemType() == WeaponType.DUALDAGGER
        && player.getSkillLevel(923) < 1
        && player.getSkillLevel(10502) < 1)
      return SystemMsg.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM;

    // Корона лидера клана, владеющего замком
    if (itemId == 6841 && (clan == null || !player.isClanLeader() || clan.getCastle() == 0))
      return SystemMsg.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM;

    // Нельзя одевать оружие, если уже одето проклятое оружие. Проверка двумя способами, для
    // надежности.
    if (targetSlot == ItemTemplate.SLOT_LR_HAND
        || targetSlot == ItemTemplate.SLOT_L_HAND
        || targetSlot == ItemTemplate.SLOT_R_HAND) {
      if (itemId != player.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_RHAND)
          && CursedWeaponsManager.getInstance()
              .isCursed(player.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_RHAND)))
        return SystemMsg.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM;
      if (player.isCursedWeaponEquipped() && itemId != player.getCursedWeaponEquippedId())
        return SystemMsg.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM;
    }

    // Плащи
    if (item.getTemplate().isCloak()) {
      // Can be worn by Knights or higher ranks who own castle
      if (item.getName().contains("Knight")
          && (player.getPledgeRank().ordinal() < PledgeRank.KNIGHT.ordinal()
              || player.getCastle() == null))
        return SystemMsg.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM;

      // Плащи для камаэлей
      if (item.getName().contains("Kamael") && player.getRace() != Race.KAMAEL)
        return SystemMsg.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM;

      // Плащи можно носить только с S80 или S84 сетом
      if (!player.getOpenCloak())
        return SystemMsg.THE_CLOAK_CANNOT_BE_EQUIPPED_BECAUSE_YOUR_ARMOR_SET_IS_NOT_COMPLETE;
    }

    if (targetSlot == ItemTemplate.SLOT_DECO) {
      int count = player.getTalismanCount();
      if (count <= 0)
        return new SystemMessage2(
                SystemMsg.YOU_CANNOT_WEAR_S1_BECAUSE_YOU_ARE_NOT_WEARING_A_BRACELET)
            .addItemName(itemId);

      ItemInstance deco;
      for (int slot = Inventory.PAPERDOLL_DECO1; slot <= Inventory.PAPERDOLL_DECO6; slot++) {
        deco = player.getInventory().getPaperdollItem(slot);
        if (deco != null) {
          if (deco == item) return null; // талисман уже одет и количество слотов больше нуля
          // Проверяем на количество слотов и одинаковые талисманы
          if (--count <= 0 || deco.getItemId() == itemId)
            return new SystemMessage2(
                    SystemMsg.YOU_CANNOT_EQUIP_S1_BECAUSE_YOU_DO_NOT_HAVE_ANY_AVAILABLE_SLOTS)
                .addItemName(itemId);
        }
      }
    }
    return null;
  }
  @Override
  public String onEvent(String event, QuestState st, NpcInstance npc) {
    Player player = st.getPlayer();
    if (player == null) return null;

    String htmltext = event;

    System.out.println("quest event " + event.toString());

    int classId = player.getClassId().getId();
    if (event.startsWith("UC")) {
      if (checkStartCondition(player)) {
        Quest q = QuestManager.getQuest(10779);
        player.processQuestEvent(q.getName(), "start_quest", null);
      }

      htmltext = "";
    }

    if (event.equalsIgnoreCase("start_quest") || event.equalsIgnoreCase("start_quest_7s")) {
      st.setCond(1);
      st.setState(STARTED);
      alertLetterReceived(st);
      st.showQuestHTML(st.getQuest(), "queen_letter.htm");

      htmltext = "";
    }

    if (event.equalsIgnoreCase("start_quest_delay")) {
      st.startQuestTimer("start_quest_7s", 7000);
      // only start quest after 7s to avoid crash on enterworld
      htmltext = "";
    }

    if (event.equalsIgnoreCase("Quest _10779_LetterFromTheQueen_SeaOfSpores to_oren")) {
      // System.out.println("in Quest _10779_LetterFromTheQueen_SeaOfSpores to_dion");
      if (st.getCond() == 1) {
        if (getItemCountById(player, SOE_OREN) > 0) {
          st.takeItems(SOE_OREN, 1);
          player.teleToLocation(83633, 53064, -1456);
          player.sendPacket(TutorialCloseHtmlPacket.STATIC);
        } else {
          player.sendMessage("Không tìm thấy Scroll of Escape: Town of Oren");
        }
      }
      htmltext = "";
    }
    // System.out.println("out " + event);
    if (event.equalsIgnoreCase("Quest _10779_LetterFromTheQueen_SeaOfSpores close_window")) {
      // System.out.println("in Quest _10779_LetterFromTheQueen_SeaOfSpores close_window");
      player.sendPacket(TutorialCloseHtmlPacket.STATIC);
      htmltext = "";
    }

    // Question mark clicked
    if (event.startsWith("QM")) {
      int MarkId = Integer.valueOf(event.substring(2));
      // System.out.println("Mark id " + MarkId);
      if (MarkId == 10779) {
        if (player.getRace() == Race.ERTHEIA) st.showQuestHTML(st.getQuest(), "queen_letter.htm");
        htmltext = "";
      }
    }

    if (event.equalsIgnoreCase("30191-3.htm")) {
      st.giveItems(SOE_SEA_OF_SPORES, 1);
      st.setCond(2);

      htmltext = "30191-3.htm";
    }

    if (event.equalsIgnoreCase("33845-2.htm")) {
      st.giveItems(STEEL_DOOR_COIN, 37, true);
      st.giveItems(SCROLL_EWB, 3, true);
      st.addExpAndSp(635250, 152);
      st.setState(COMPLETED);
      st.exitCurrentQuest(false);
      st.playSound(SOUND_FINISH);
      st.getPlayer()
          .sendPacket(
              new ExShowScreenMessage(
                  NEXT_LETTER_STRING,
                  7000,
                  ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER,
                  true));

      htmltext = "33845-2.htm";
    }

    if (htmltext.isEmpty()) return null;
    else return htmltext;
  }