private static final boolean checkAndChangeClass(L2PcInstance player, int val) {
    final ClassId currentClassId = player.getClassId();
    if (getMinLevel(currentClassId.level()) > player.getLevel() && !Config.ALLOW_ENTIRE_TREE)
      return false;

    if (!validateClassId(currentClassId, val)) return false;

    int newJobLevel = currentClassId.level() + 1;

    // Weight/Inventory check
    if (!Config.CLASS_MASTER_SETTINGS.getRewardItems(newJobLevel).isEmpty()
        && !player.isInventoryUnder80(false)) {
      player.sendPacket(
          SystemMessage.getSystemMessage(SystemMessageId.INVENTORY_LESS_THAN_80_PERCENT));
      return false;
    }

    // check if player have all required items for class transfer
    for (int _itemId : Config.CLASS_MASTER_SETTINGS.getRequireItems(newJobLevel).keys()) {
      int _count = Config.CLASS_MASTER_SETTINGS.getRequireItems(newJobLevel).get(_itemId);
      if (player.getInventory().getInventoryItemCount(_itemId, -1) < _count) {
        player.sendPacket(SystemMessageId.NOT_ENOUGH_ITEMS);
        return false;
      }
    }

    // get all required items for class transfer
    for (int _itemId : Config.CLASS_MASTER_SETTINGS.getRequireItems(newJobLevel).keys()) {
      int _count = Config.CLASS_MASTER_SETTINGS.getRequireItems(newJobLevel).get(_itemId);
      if (!player.destroyItemByItemId("ClassMaster", _itemId, _count, player, true)) return false;
    }

    // reward player with items
    for (int _itemId : Config.CLASS_MASTER_SETTINGS.getRewardItems(newJobLevel).keys()) {
      int _count = Config.CLASS_MASTER_SETTINGS.getRewardItems(newJobLevel).get(_itemId);
      player.addItem("ClassMaster", _itemId, _count, player, true);
    }

    player.setClassId(val);

    if (player.isSubClassActive())
      player.getSubClasses().get(player.getClassIndex()).setClassId(player.getActiveClass());
    else player.setBaseClass(player.getActiveClass());

    Quest q = QuestManager.getInstance().getQuest("SkillTransfer");
    if (q != null) q.startQuestTimer("givePormanders", 1, null, player);

    player.broadcastUserInfo();

    if (Config.CLASS_MASTER_SETTINGS.isAllowed(player.getClassId().level() + 1)
        && Config.ALTERNATE_CLASS_MASTER
        && ((player.getClassId().level() == 1 && player.getLevel() >= 40)
            || (player.getClassId().level() == 2 && player.getLevel() >= 76)))
      showQuestionMark(player);

    return true;
  }
Ejemplo n.º 2
0
  /**
   * This method displays EnchantSkillList to the player.
   *
   * @param player The player who requested the method.
   * @param npc The L2Npc linked to the request.
   * @param classId The classId asked. Used to sort available enchant skill list.
   */
  public static void showEnchantSkillList(L2PcInstance player, L2Npc npc, ClassId classId) {
    if (((L2NpcInstance) npc).getClassesToTeach() == null) {
      NpcHtmlMessage html = new NpcHtmlMessage(npc.getObjectId());
      final String sb =
          StringUtil.concat(
              "<html><body>I cannot teach you. My class list is empty.<br>Your admin needs to add me teachTo informations.<br>NpcId:",
              String.valueOf(npc.getTemplate().getNpcId()),
              ", your classId:",
              String.valueOf(player.getClassId().getId()),
              "</body></html>");
      html.setHtml(sb);
      player.sendPacket(html);
      return;
    }

    if (!npc.getTemplate().canTeach(classId)) {
      NpcHtmlMessage html = new NpcHtmlMessage(npc.getObjectId());
      html.setFile("data/html/trainer/" + npc.getTemplate().getNpcId() + "-noskills.htm");
      player.sendPacket(html);
      return;
    }

    if (player.getClassId().level() < 3) {
      NpcHtmlMessage html = new NpcHtmlMessage(npc.getObjectId());
      html.setHtml("<html><body> You must have 3rd class change quest completed.</body></html>");
      player.sendPacket(html);
      return;
    }

    ExEnchantSkillList esl = new ExEnchantSkillList();
    boolean empty = true;

    List<L2EnchantSkillLearn> esll = SkillTreeTable.getInstance().getAvailableEnchantSkills(player);
    for (L2EnchantSkillLearn skill : esll) {
      L2Skill sk = SkillTable.getInstance().getInfo(skill.getId(), skill.getLevel());
      if (sk == null) continue;

      L2EnchantSkillData data =
          SkillTreeTable.getInstance().getEnchantSkillData(skill.getEnchant());
      if (data == null) continue;

      esl.addSkill(skill.getId(), skill.getLevel(), data.getCostSp(), data.getCostExp());
      empty = false;
    }

    if (empty) {
      player.sendPacket(SystemMessageId.THERE_IS_NO_SKILL_THAT_ENABLES_ENCHANT);

      if (player.getLevel() < 74)
        player.sendPacket(
            SystemMessage.getSystemMessage(SystemMessageId.DO_NOT_HAVE_FURTHER_SKILLS_TO_LEARN_S1)
                .addNumber(74));
      else player.sendPacket(SystemMessageId.NO_MORE_SKILLS_TO_LEARN);
    } else player.sendPacket(esl);

    player.sendPacket(ActionFailed.STATIC_PACKET);
  }
Ejemplo n.º 3
0
 @Override
 public void onBypassFeedback(L2PcInstance player, String command) {
   if (command.startsWith("SkillList")) {
     player.setSkillLearningClassId(player.getClassId());
     showSkillList(player, this, player.getClassId());
   } else if (command.startsWith("EnchantSkillList"))
     showEnchantSkillList(player, this, player.getClassId());
   else if (command.startsWith("GiveBlessing")) giveBlessingSupport(player);
   else super.onBypassFeedback(player, command);
 }
  private static final void showTutorialHtml(L2PcInstance player) {
    final ClassId currentClassId = player.getClassId();
    if (getMinLevel(currentClassId.level()) > player.getLevel() && !Config.ALLOW_ENTIRE_TREE)
      return;

    String msg =
        HtmCache.getInstance()
            .getHtm(player.getHtmlPrefix(), "data/html/classmaster/tutorialtemplate.htm");

    msg =
        msg.replaceAll(
            "%name%", CharTemplateTable.getInstance().getClassNameById(currentClassId.getId()));

    final StringBuilder menu = new StringBuilder(100);
    for (ClassId cid : ClassId.values()) {
      if (cid == ClassId.inspector && player.getTotalSubClasses() < 2) continue;
      if (validateClassId(currentClassId, cid)) {
        StringUtil.append(
            menu,
            "<a action=\"link CO",
            String.valueOf(cid.getId()),
            "\">",
            CharTemplateTable.getInstance().getClassNameById(cid.getId()),
            "</a><br>");
      }
    }

    msg = msg.replaceAll("%menu%", menu.toString());
    msg = msg.replace("%req_items%", getRequiredItems(currentClassId.level() + 1));
    player.sendPacket(new TutorialShowHtml(msg));
  }
  public static final void showQuestionMark(L2PcInstance player) {
    if (!Config.ALTERNATE_CLASS_MASTER) return;

    final ClassId classId = player.getClassId();
    if (getMinLevel(classId.level()) > player.getLevel()) return;

    if (!Config.CLASS_MASTER_SETTINGS.isAllowed(classId.level() + 1)) return;

    player.sendPacket(new TutorialShowQuestionMark(1001));
  }
Ejemplo n.º 6
0
  public void giveBlessingSupport(L2PcInstance player) {
    if (player == null) return;

    // Select the player
    setTarget(player);

    // If the player is too high level, display a message and return
    if (player.getLevel() > 39 || player.getClassId().level() >= 2) {
      NpcHtmlMessage npcReply = new NpcHtmlMessage(getObjectId());
      npcReply.setHtml(
          "<html><body>Newbie Guide:<br>I'm sorry, but you are not eligible to receive the protection blessing.<br1>It can only be bestowed on <font color=\"LEVEL\">characters below level 39 who have not made a seccond transfer.</font></body></html>");
      npcReply.replace("%objectId%", getObjectId());
      player.sendPacket(npcReply);
      return;
    }
    doCast(FrequentSkill.BLESSING_OF_PROTECTION.getSkill());
  }
Ejemplo n.º 7
0
  /**
   * This method displays SkillList to the player.
   *
   * @param player The player who requested the method.
   * @param npc The L2Npc linked to the request.
   * @param classId The classId asked. Used to sort available skill list.
   */
  public static void showSkillList(L2PcInstance player, L2Npc npc, ClassId classId) {
    if (((L2NpcInstance) npc).getClassesToTeach() == null) {
      NpcHtmlMessage html = new NpcHtmlMessage(npc.getObjectId());
      final String sb =
          StringUtil.concat(
              "<html><body>I cannot teach you. My class list is empty.<br>Your admin needs to add me teachTo informations.<br>NpcId:",
              String.valueOf(npc.getTemplate().getNpcId()),
              ", your classId:",
              String.valueOf(player.getClassId().getId()),
              "</body></html>");
      html.setHtml(sb);
      player.sendPacket(html);
      return;
    }

    if (!npc.getTemplate().canTeach(classId)) {
      NpcHtmlMessage html = new NpcHtmlMessage(npc.getObjectId());
      html.setFile("data/html/trainer/" + npc.getTemplate().getNpcId() + "-noskills.htm");
      player.sendPacket(html);
      return;
    }

    AcquireSkillList asl = new AcquireSkillList(AcquireSkillList.SkillType.Usual);
    boolean empty = true;

    for (L2SkillLearn sl : SkillTreeTable.getInstance().getAvailableSkills(player, classId)) {
      L2Skill sk = SkillTable.getInstance().getInfo(sl.getId(), sl.getLevel());
      if (sk == null) continue;

      asl.addSkill(sl.getId(), sl.getLevel(), sl.getLevel(), sl.getSpCost(), 0);
      empty = false;
    }

    if (empty) {
      int minlevel = SkillTreeTable.getInstance().getMinLevelForNewSkill(player, classId);

      if (minlevel > 0)
        player.sendPacket(
            SystemMessage.getSystemMessage(SystemMessageId.DO_NOT_HAVE_FURTHER_SKILLS_TO_LEARN_S1)
                .addNumber(minlevel));
      else player.sendPacket(SystemMessageId.NO_MORE_SKILLS_TO_LEARN);
    } else player.sendPacket(asl);

    player.sendPacket(ActionFailed.STATIC_PACKET);
  }
  private static final void showHtmlMenu(L2PcInstance player, int objectId, int level) {
    NpcHtmlMessage html = new NpcHtmlMessage(objectId);

    if (!Config.ALLOW_CLASS_MASTERS) {
      html.setFile(player.getHtmlPrefix(), "data/html/classmaster/disabled.htm");
    } else if (!Config.CLASS_MASTER_SETTINGS.isAllowed(level)) {
      int jobLevel = player.getClassId().level();
      final StringBuilder sb = new StringBuilder(100);
      sb.append("<html><body>");
      switch (jobLevel) {
        case 0:
          if (Config.CLASS_MASTER_SETTINGS.isAllowed(1))
            sb.append("Come back here when you reached level 20 to change your class.<br>");
          else if (Config.CLASS_MASTER_SETTINGS.isAllowed(2))
            sb.append("Come back after your first occupation change.<br>");
          else if (Config.CLASS_MASTER_SETTINGS.isAllowed(3))
            sb.append("Come back after your second occupation change.<br>");
          else sb.append("I can't change your occupation.<br>");
          break;
        case 1:
          if (Config.CLASS_MASTER_SETTINGS.isAllowed(2))
            sb.append("Come back here when you reached level 40 to change your class.<br>");
          else if (Config.CLASS_MASTER_SETTINGS.isAllowed(3))
            sb.append("Come back after your second occupation change.<br>");
          else sb.append("I can't change your occupation.<br>");
          break;
        case 2:
          if (Config.CLASS_MASTER_SETTINGS.isAllowed(3))
            sb.append("Come back here when you reached level 76 to change your class.<br>");
          else sb.append("I can't change your occupation.<br>");
          break;
        case 3:
          sb.append("There is no class change available for you anymore.<br>");
          break;
      }
      sb.append("</body></html>");
      html.setHtml(sb.toString());
    } else {
      final ClassId currentClassId = player.getClassId();
      if (currentClassId.level() >= level) {
        html.setFile(player.getHtmlPrefix(), "data/html/classmaster/nomore.htm");
      } else {
        final int minLevel = getMinLevel(currentClassId.level());
        if (player.getLevel() >= minLevel || Config.ALLOW_ENTIRE_TREE) {
          final StringBuilder menu = new StringBuilder(100);
          for (ClassId cid : ClassId.values()) {
            if (cid == ClassId.inspector && player.getTotalSubClasses() < 2) continue;
            if (validateClassId(currentClassId, cid) && cid.level() == level) {
              StringUtil.append(
                  menu,
                  "<a action=\"bypass -h npc_%objectId%_change_class ",
                  String.valueOf(cid.getId()),
                  "\">",
                  CharTemplateTable.getInstance().getClassNameById(cid.getId()),
                  "</a><br>");
            }
          }

          if (menu.length() > 0) {
            html.setFile(player.getHtmlPrefix(), "data/html/classmaster/template.htm");
            html.replace(
                "%name%", CharTemplateTable.getInstance().getClassNameById(currentClassId.getId()));
            html.replace("%menu%", menu.toString());
          } else {
            html.setFile(player.getHtmlPrefix(), "data/html/classmaster/comebacklater.htm");
            html.replace("%level%", String.valueOf(getMinLevel(level - 1)));
          }
        } else {
          if (minLevel < Integer.MAX_VALUE) {
            html.setFile(player.getHtmlPrefix(), "data/html/classmaster/comebacklater.htm");
            html.replace("%level%", String.valueOf(minLevel));
          } else html.setFile(player.getHtmlPrefix(), "data/html/classmaster/nomore.htm");
        }
      }
    }

    html.replace("%objectId%", String.valueOf(objectId));
    html.replace("%req_items%", getRequiredItems(level));
    player.sendPacket(html);
  }