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 void showFishSkillList(L2PcInstance player) {
    final List<L2SkillLearn> skills =
        SkillTreesData.getInstance().getAvailableFishingSkills(player);
    final AcquireSkillList asl = new AcquireSkillList(AcquireSkillType.FISHING);

    int count = 0;

    for (L2SkillLearn s : skills) {
      final Skill sk = SkillData.getInstance().getSkill(s.getSkillId(), s.getSkillLevel());

      if (sk == null) {
        continue;
      }
      count++;
      asl.addSkill(s.getSkillId(), s.getSkillLevel(), s.getSkillLevel(), s.getLevelUpSp(), 1);
    }

    if (count == 0) {
      final int minlLevel =
          SkillTreesData.getInstance()
              .getMinLevelForNewSkill(player, SkillTreesData.getInstance().getFishingSkillTree());
      if (minlLevel > 0) {
        SystemMessage sm =
            SystemMessage.getSystemMessage(SystemMessageId.DO_NOT_HAVE_FURTHER_SKILLS_TO_LEARN_S1);
        sm.addInt(minlLevel);
        player.sendPacket(sm);
      } else {
        player.sendPacket(SystemMessageId.NO_MORE_SKILLS_TO_LEARN);
      }
    } else {
      player.sendPacket(asl);
    }
  }
  /**
   * Return True if a siege is in progress and the L2Character attacker isn't a Defender.
   *
   * @param attacker The L2Character that the L2SiegeGuardInstance try to attack
   */
  @Override
  public boolean isAutoAttackable(L2Character attacker) {
    // Attackable during siege by all except defenders
    if (!(attacker instanceof L2Playable)) {
      return false;
    }

    L2PcInstance player = attacker.getActingPlayer();

    // Check if siege is in progress
    if (((_fort != null) && _fort.getZone().isActive())
        || ((_castle != null) && _castle.getZone().isActive())
        || ((_hall != null) && _hall.getSiegeZone().isActive())) {
      int activeSiegeId =
          (_fort != null
              ? _fort.getResidenceId()
              : (_castle != null ? _castle.getResidenceId() : (_hall != null ? _hall.getId() : 0)));

      // Check if player is an enemy of this defender npc
      if ((player != null)
          && (((player.getSiegeState() == 2) && !player.isRegisteredOnThisSiegeField(activeSiegeId))
              || ((player.getSiegeState() == 1)
                  && !TerritoryWarManager.getInstance().isAllyField(player, activeSiegeId))
              || (player.getSiegeState() == 0))) {
        return true;
      }
    }
    return false;
  }
  @Override
  public void addDamageHate(L2Character attacker, int damage, int aggro) {
    if (attacker == null) {
      return;
    }

    if (!(attacker instanceof L2DefenderInstance)) {
      if ((damage == 0) && (aggro <= 1) && (attacker instanceof L2Playable)) {
        L2PcInstance player = attacker.getActingPlayer();
        // Check if siege is in progress
        if (((_fort != null) && _fort.getZone().isActive())
            || ((_castle != null) && _castle.getZone().isActive())
            || ((_hall != null) && _hall.getSiegeZone().isActive())) {
          int activeSiegeId =
              (_fort != null
                  ? _fort.getResidenceId()
                  : (_castle != null
                      ? _castle.getResidenceId()
                      : (_hall != null ? _hall.getId() : 0)));
          if ((player != null)
              && (((player.getSiegeState() == 2)
                      && player.isRegisteredOnThisSiegeField(activeSiegeId))
                  || ((player.getSiegeState() == 1)
                      && TerritoryWarManager.getInstance().isAllyField(player, activeSiegeId)))) {
            return;
          }
        }
      }
      super.addDamageHate(attacker, damage, aggro);
    }
  }
  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));
  }
Example #6
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 void doTeleport(L2PcInstance player, int val) {
    L2TeleportLocation list = TeleportLocationTable.getInstance().getTemplate(val);
    if (list != null) {
      if (player.isAlikeDead()) return;

      player.teleToLocation(list.getLocX(), list.getLocY(), list.getLocZ(), 20);
    } else _log.warning("No teleport destination with id:" + val);

    player.sendPacket(ActionFailed.STATIC_PACKET);
  }
  private static final void recoverClan(L2PcInstance player, int clanId) {
    if (!player.isClanLeader()) {
      player.sendPacket(new SystemMessage(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT));
      return;
    }

    final L2Clan clan = player.getClan();
    clan.setDissolvingExpiryTime(0);
    clan.updateClanInDB();
  }
  @Override
  public void onAction(L2PcInstance player, boolean interact) {
    if (player == null || !canTarget(player)) return;

    // Check if the L2PcInstance already target the L2NpcInstance
    if (this != player.getTarget()) {
      // Set the target of the L2PcInstance player
      player.setTarget(this);

      // Send a Server->Client packet MyTargetSelected to the L2PcInstance player
      MyTargetSelected my = new MyTargetSelected(getObjectId(), player.getLevel() - getLevel());
      player.sendPacket(my);

      // Send a Server->Client packet StatusUpdate of the L2NpcInstance to the L2PcInstance to
      // update its HP bar
      StatusUpdate su = new StatusUpdate(this);
      su.addAttribute(StatusUpdate.CUR_HP, (int) getStatus().getCurrentHp());
      su.addAttribute(StatusUpdate.MAX_HP, getMaxHp());
      player.sendPacket(su);

      // Send a Server->Client packet ValidateLocation to correct the L2NpcInstance position and
      // heading on the client
      player.sendPacket(new ValidateLocation(this));
    } else if (interact) {
      if (isAutoAttackable(player) && Math.abs(player.getZ() - getZ()) < 100)
        player.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, this);
      else {
        // Send a Server->Client ActionFailed to the L2PcInstance in order to avoid that the client
        // wait another packet
        player.sendPacket(ActionFailed.STATIC_PACKET);
      }
    }
  }
 protected int validateCondition(L2PcInstance player) {
   if (player.isGM()) return COND_OWNER;
   if (getCastle() != null && getCastle().getCastleId() > 0) {
     if (player.getClan() != null) {
       if (getCastle().getZone().isActive())
         return COND_BUSY_BECAUSE_OF_SIEGE; // Busy because of siege
       else if (getCastle().getOwnerId() == player.getClanId()) // Clan owns castle
       return COND_OWNER;
     }
   }
   return COND_ALL_FALSE;
 }
  protected boolean checkQuests(L2PcInstance player) {
    // Noble players can add subbclasses without quests
    if (player.isNoble()) return true;

    QuestState qs = player.getQuestState("234_FatesWhisper");
    if (qs == null || !qs.isCompleted()) return false;

    qs = player.getQuestState("235_MimirsElixir");
    if (qs == null || !qs.isCompleted()) return false;

    return true;
  }
  public static final void onTutorialLink(L2PcInstance player, String request) {
    if (!Config.ALTERNATE_CLASS_MASTER || request == null || !request.startsWith("CO")) return;

    if (!player.getFloodProtectors().getServerBypass().tryPerformAction("changeclass")) return;

    try {
      int val = Integer.parseInt(request.substring(2));
      checkAndChangeClass(player, val);
    } catch (NumberFormatException e) {
    }
    player.sendPacket(new TutorialCloseHtml());
  }
  private static final void renameSubPledge(
      L2PcInstance player, int pledgeType, String pledgeName) {
    if (!player.isClanLeader()) {
      player.sendPacket(new SystemMessage(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT));
      return;
    }

    final L2Clan clan = player.getClan();
    final SubPledge subPledge = player.getClan().getSubPledge(pledgeType);

    if (subPledge == null) {
      player.sendMessage("Pledge don't exists.");
      return;
    }
    if (!Util.isAlphaNumeric(pledgeName) || 2 > pledgeName.length()) {
      player.sendPacket(new SystemMessage(SystemMessageId.CLAN_NAME_INCORRECT));
      return;
    }
    if (pledgeName.length() > 16) {
      player.sendPacket(new SystemMessage(SystemMessageId.CLAN_NAME_TOO_LONG));
      return;
    }

    subPledge.setName(pledgeName);
    clan.updateSubPledgeInDB(subPledge.getId());
    clan.broadcastClanStatus();
    player.sendMessage("Pledge name changed.");
  }
  private static final void changeClanLeader(L2PcInstance player, String target) {
    if (!player.isClanLeader()) {
      player.sendPacket(new SystemMessage(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT));
      return;
    }
    if (player.getName().equalsIgnoreCase(target)) return;
    /*
     * Until proper clan leader change support is done, this is a little
     * exploit fix (leader, while fliying wyvern changes clan leader and the new leader
     * can ride the wyvern too)
     * DrHouse
     */
    if (player.isFlying()) {
      player.sendMessage("Please, stop flying");
      return;
    }

    final L2Clan clan = player.getClan();

    final L2ClanMember member = clan.getClanMember(target);
    if (member == null) {
      SystemMessage sm = new SystemMessage(SystemMessageId.S1_DOES_NOT_EXIST);
      sm.addString(target);
      player.sendPacket(sm);
      sm = null;
      return;
    }
    if (!member.isOnline()) {
      player.sendPacket(new SystemMessage(SystemMessageId.INVITED_USER_NOT_ONLINE));
      return;
    }
    clan.setNewLeader(member);
  }
  /*
   * Check new subclass classId for validity
   * (villagemaster race/type, is not contains in previous subclasses,
   * is contains in allowed subclasses)
   * Base class not added into allowed subclasses.
   */
  private final boolean isValidNewSubClass(L2PcInstance player, int classId) {
    if (!checkVillageMaster(classId)) return false;

    final ClassId cid = ClassId.values()[classId];
    for (Iterator<SubClass> subList = iterSubClasses(player); subList.hasNext(); ) {
      SubClass sub = subList.next();
      ClassId subClassId = ClassId.values()[sub.getClassId()];

      if (subClassId.equalsOrChildOf(cid)) return false;
    }

    // get player base class
    final int currentBaseId = player.getBaseClass();
    final ClassId baseCID = ClassId.values()[currentBaseId];

    // we need 2nd occupation ID
    final int baseClassId;
    if (baseCID.level() > 2) baseClassId = baseCID.getParent().ordinal();
    else baseClassId = currentBaseId;

    Set<PlayerClass> availSubs = PlayerClass.values()[baseClassId].getAvailableSubclasses(player);
    if (availSubs == null || availSubs.isEmpty()) return false;

    boolean found = false;
    for (Iterator<PlayerClass> availSub = availSubs.iterator(); availSub.hasNext(); ) {
      PlayerClass pclass = availSub.next();
      if (pclass.ordinal() == classId) {
        found = true;
        break;
      }
    }

    return found;
  }
  /*
   * Returns list of available subclasses
   * Base class and already used subclasses removed
   */
  private final Set<PlayerClass> getAvailableSubClasses(L2PcInstance player) {
    // get player base class
    final int currentBaseId = player.getBaseClass();
    final ClassId baseCID = ClassId.values()[currentBaseId];

    // we need 2nd occupation ID
    final int baseClassId;
    if (baseCID.level() > 2) baseClassId = baseCID.getParent().ordinal();
    else baseClassId = currentBaseId;

    /**
     * If the race of your main class is Elf or Dark Elf, you may not select each class as a
     * subclass to the other class.
     *
     * <p>If the race of your main class is Kamael, you may not subclass any other race If the race
     * of your main class is NOT Kamael, you may not subclass any Kamael class
     *
     * <p>You may not select Overlord and Warsmith class as a subclass.
     *
     * <p>You may not select a similar class as the subclass. The occupations classified as similar
     * classes are as follows:
     *
     * <p>Treasure Hunter, Plainswalker and Abyss Walker Hawkeye, Silver Ranger and Phantom Ranger
     * Paladin, Dark Avenger, Temple Knight and Shillien Knight Warlocks, Elemental Summoner and
     * Phantom Summoner Elder and Shillien Elder Swordsinger and Bladedancer Sorcerer, Spellsinger
     * and Spellhowler
     *
     * <p>Also, Kamael have a special, hidden 4 subclass, the inspector, which can only be taken if
     * you have already completed the other two Kamael subclasses
     */
    Set<PlayerClass> availSubs = PlayerClass.values()[baseClassId].getAvailableSubclasses(player);

    if (availSubs != null && !availSubs.isEmpty()) {
      for (Iterator<PlayerClass> availSub = availSubs.iterator(); availSub.hasNext(); ) {
        PlayerClass pclass = availSub.next();

        // check for the village master
        if (!checkVillageMaster(pclass)) {
          availSub.remove();
          continue;
        }

        // scan for already used subclasses
        int availClassId = pclass.ordinal();
        ClassId cid = ClassId.values()[availClassId];
        for (Iterator<SubClass> subList = iterSubClasses(player); subList.hasNext(); ) {
          SubClass prevSubClass = subList.next();
          ClassId subClassId = ClassId.values()[prevSubClass.getClassId()];

          if (subClassId.equalsOrChildOf(cid)) {
            availSub.remove();
            break;
          }
        }
      }
    }

    return availSubs;
  }
Example #17
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());
  }
  /**
   * Custom onAction behaviour. Note that super() is not called because guards need extra check to
   * see if a player should interact or ATTACK them when clicked.
   */
  @Override
  public void onAction(L2PcInstance player, boolean interact) {
    if (!canTarget(player)) {
      player.sendPacket(ActionFailed.STATIC_PACKET);
      return;
    }

    // Check if the L2PcInstance already target the L2NpcInstance
    if (this != player.getTarget()) {
      if (Config.DEBUG) {
        _log.info("new target selected:" + getObjectId());
      }

      // Set the target of the L2PcInstance player
      player.setTarget(this);
    } else if (interact) {
      if (isAutoAttackable(player) && !isAlikeDead()) {
        if (Math.abs(player.getZ() - getZ())
            < 600) // this max heigth difference might need some tweaking
        {
          player.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, this);
        }
      }
      if (!isAutoAttackable(player)) {
        if (!canInteract(player)) {
          // Notify the L2PcInstance AI with AI_INTENTION_INTERACT
          player.getAI().setIntention(CtrlIntention.AI_INTENTION_INTERACT, this);
        }
      }
    }
    // Send a Server->Client ActionFailed to the L2PcInstance in order to avoid that the client wait
    // another packet
    player.sendPacket(ActionFailed.STATIC_PACKET);
  }
  @Override
  public void showChatWindow(L2PcInstance player, int val) {
    String filename = null;

    if (isInsideRadius(-79884, 86529, 50, true)
        || isInsideRadius(-78858, 111358, 50, true)
        || isInsideRadius(-76973, 87136, 50, true)
        || isInsideRadius(-75850, 111968, 50, true)) {
      if (val == 0) filename = "data/html/observation/" + getNpcId() + "-Oracle.htm";
      else filename = "data/html/observation/" + getNpcId() + "-Oracle-" + val + ".htm";
    } else {
      if (val == 0) filename = "data/html/observation/" + getNpcId() + ".htm";
      else filename = "data/html/observation/" + getNpcId() + "-" + val + ".htm";
    }

    NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
    html.setFile(player.getHtmlPrefix(), filename);
    html.replace("%objectId%", String.valueOf(getObjectId()));
    player.sendPacket(html);
  }
  @Override
  public void showChatWindow(L2PcInstance player, int val) {
    player.sendPacket(ActionFailed.STATIC_PACKET);
    String filename = "data/html/castlemagician/magician-no.htm";

    int condition = validateCondition(player);
    if (condition > COND_ALL_FALSE) {
      if (condition == COND_BUSY_BECAUSE_OF_SIEGE)
        filename = "data/html/castlemagician/magician-busy.htm"; // Busy because of siege
      else if (condition == COND_OWNER) // Clan owns castle
      {
        if (val == 0) filename = "data/html/castlemagician/magician.htm";
        else filename = "data/html/castlemagician/magician-" + val + ".htm";
      }
    }

    NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
    html.setFile(player.getHtmlPrefix(), filename);
    html.replace("%objectId%", String.valueOf(getObjectId()));
    player.sendPacket(html);
  }
Example #21
0
  @Override
  public boolean doDie(L2Character killer) {
    if (!super.doDie(killer)) return false;

    L2PcInstance player = null;

    if (killer.isPlayer) player = (L2PcInstance) killer;
    else if (killer.isSummon) player = ((L2Summon) killer).getOwner();

    if (player != null) {
      SystemMessage msg = new SystemMessage(SystemMessageId.RAID_WAS_SUCCESSFUL);
      broadcastPacket(msg);
      msg = null;
      if (player.getParty() != null) {
        for (L2PcInstance member : player.getParty().getPartyMembers()) {
          RaidBossPointsManager.addPoints(member, getNpcId(), (getLevel() / 2) + Rnd.get(-5, 5));
        }
      } else RaidBossPointsManager.addPoints(player, getNpcId(), (getLevel() / 2) + Rnd.get(-5, 5));
    }
    return true;
  }
 @Override
 protected void doAction(L2PcInstance player) {
   if (isBusy()) return;
   synchronized (_sync) {
     if (!hasKey) return;
     setBusy(true);
     player.addItem("FourSepulchers", 7260, 1, null, true);
     setIsInvul(false);
     hasKey = false;
   }
   reduceCurrentHp(getMaxHp() + 1, player);
   _mausoleum.nextStage();
 }
  /**
   * Actions:
   *
   * <ul>
   *   <li>Check if the killing object is a player, and then find the party they belong to.
   *   <li>Add a blood offering item to the leader of the party.
   *   <li>Update the party leader's inventory to show the new item addition.
   * </ul>
   */
  @Override
  public void doItemDrop(L2Character lastAttacker) {
    L2PcInstance killingChar = null;

    if (!(lastAttacker instanceof L2PcInstance)) {
      return;
    }

    killingChar = (L2PcInstance) lastAttacker;
    L2Party associatedParty = killingChar.getParty();

    if (associatedParty == null) {
      return;
    }

    L2PcInstance partyLeader = associatedParty.getLeader();
    L2ItemInstance addedOfferings =
        partyLeader
            .getInventory()
            .addItem(
                "Sign",
                SevenSignsFestival.FESTIVAL_OFFERING_ID,
                _bonusMultiplier,
                partyLeader,
                this);

    InventoryUpdate iu = new InventoryUpdate();

    if (addedOfferings.getCount() != _bonusMultiplier) {
      iu.addModifiedItem(addedOfferings);
    } else {
      iu.addNewItem(addedOfferings);
    }

    partyLeader.sendPacket(iu);

    super.doItemDrop(lastAttacker); // Normal drop
  }
  public void recoverClan(L2PcInstance player, int clanId) {
    if (Config.DEBUG) {
      _log.info(
          player.getObjectId()
              + "("
              + player.getName()
              + ") requested recover a clan from "
              + getObjectId()
              + "("
              + getName()
              + ")");
    }

    if (!player.isClanLeader()) {
      player.sendPacket(new SystemMessage(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT));
      return;
    }
    L2Clan clan = player.getClan();

    clan.setDissolvingExpiryTime(0);
    clan.updateClanInDB();

    clan = null;
  }
  public L2SiegeFlagInstance(
      L2PcInstance player,
      int objectId,
      L2NpcTemplate template,
      boolean advanced,
      boolean outPost) {
    super(objectId, template);
    setInstanceType(InstanceType.L2SiegeFlagInstance);

    if (TerritoryWarManager.getInstance().isTWInProgress()) {
      _clan = player.getClan();
      _player = player;
      _canTalk = false;
      if (_clan == null) deleteMe();
      if (outPost) {
        _isAdvanced = false;
        setIsInvul(true);
      } else {
        _isAdvanced = advanced;
        setIsInvul(false);
      }
      getStatus();
      return;
    }
    _clan = player.getClan();
    _player = player;
    _canTalk = true;
    _siege = SiegeManager.getInstance().getSiege(_player.getX(), _player.getY(), _player.getZ());
    if (_siege == null)
      _siege =
          FortSiegeManager.getInstance().getSiege(_player.getX(), _player.getY(), _player.getZ());
    if (_siege == null) _siege = CHSiegeManager.getInstance().getSiege(player);
    if (_clan == null || _siege == null) {
      throw new NullPointerException(getClass().getSimpleName() + ": Initialization failed.");
    }

    L2SiegeClan sc = _siege.getAttackerClan(_clan);
    if (sc == null)
      throw new NullPointerException(getClass().getSimpleName() + ": Cannot find siege clan.");

    sc.addFlag(this);
    _isAdvanced = advanced;
    getStatus();
    setIsInvul(false);
  }
Example #26
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);
  }
  /**
   * this displays PledgeSkillList to the player.
   *
   * @param player
   */
  public void showPledgeSkillList(L2PcInstance player) {
    if (Config.DEBUG) {
      _log.info("PledgeSkillList activated on: " + getObjectId());
    }
    if (player.getClan() == null) return;

    L2PledgeSkillLearn[] skills = SkillTreeTable.getInstance().getAvailablePledgeSkills(player);
    AquireSkillList asl = new AquireSkillList(AquireSkillList.skillType.Clan);
    int counts = 0;

    for (L2PledgeSkillLearn s : skills) {
      int cost = s.getRepCost();
      counts++;

      asl.addSkill(s.getId(), s.getLevel(), s.getLevel(), cost, 0);
    }
    skills = null;

    if (counts == 0) {
      NpcHtmlMessage html = new NpcHtmlMessage(1);

      if (player.getClan().getLevel() < 8) {
        SystemMessage sm = new SystemMessage(SystemMessageId.DO_NOT_HAVE_FURTHER_SKILLS_TO_LEARN);
        sm.addNumber(player.getClan().getLevel() + 1);
        player.sendPacket(sm);
        sm = null;
      } else {
        TextBuilder sb = new TextBuilder();
        sb.append("<html><body>");
        sb.append("You've learned all skills available for your Clan.<br>");
        sb.append("</body></html>");
        html.setHtml(sb.toString());
        player.sendPacket(html);
        html = null;
        sb = null;
      }
    } else {
      player.sendPacket(asl);
    }

    asl = null;
    player.sendPacket(ActionFailed.STATIC_PACKET);
  }
Example #28
0
 @Override
 public void sendInfo(L2PcInstance activeChar) {
   activeChar.sendPacket(new StaticObject(this));
 }
  @Override
  public boolean doDie(L2Character killer) {
    if (!super.doDie(killer)) {
      return false;
    }

    final L2PcInstance player = killer.getActingPlayer();
    if (player != null) {
      broadcastPacket(
          SystemMessage.getSystemMessage(SystemMessageId.CONGRATULATIONS_YOUR_RAID_WAS_SUCCESSFUL));
      if (player.getParty() != null) {
        for (L2PcInstance member : player.getParty().getMembers()) {
          member.setRaidPoints(member.getRaidPoints() + ((getLevel() / 2) + Rnd.get(-5, 5)));
          if (member.isNoble()) {
            Hero.getInstance().setRBkilled(member.getObjectId(), getId());
          }
        }
      } else {
        player.setRaidPoints(player.getRaidPoints() + ((getLevel() / 2) + Rnd.get(-5, 5)));
        if (player.isNoble()) {
          Hero.getInstance().setRBkilled(player.getObjectId(), getId());
        }
      }
    }

    RaidBossSpawnManager.getInstance().updateStatus(this, true);
    return true;
  }
  private final Set<PlayerClass> getAvailableSubClasses(L2PcInstance player) {
    final PlayerRace npcRace = getVillageMasterRace();
    final ClassType npcTeachType = getVillageMasterTeachType();

    // get player base class
    final int currentBaseId = player.getBaseClass();
    final ClassId baseCID = ClassId.values()[currentBaseId];

    // we need 2nd occupation ID
    final int baseClassId;
    if (baseCID.level() > 2) baseClassId = baseCID.getParent().ordinal();
    else baseClassId = currentBaseId;

    PlayerClass currClass = PlayerClass.values()[baseClassId];

    /**
     * If the race of your main class is Elf or Dark Elf, you may not select each class as a
     * subclass to the other class, and you may not select Overlord and Warsmith class as a
     * subclass. You may not select a similar class as the subclass. The occupations classified as
     * similar classes are as follows: Treasure Hunter, Plainswalker and Abyss Walker Hawkeye,
     * Silver Ranger and Phantom Ranger Paladin, Dark Avenger, Temple Knight and Shillien Knight
     * Warlocks, Elemental Summoner and Phantom Summoner Elder and Shillien Elder Swordsinger and
     * Bladedancer Sorcerer, Spellsinger and Spellhowler
     */
    Set<PlayerClass> availSubs = currClass.getAvailableSubclasses(player);

    if (availSubs != null && !availSubs.isEmpty()) {
      for (PlayerClass availSub : availSubs) {
        for (SubClass subClass : player.getSubClasses().values())
          if (subClass.getClassId() == availSub.ordinal()) {
            availSubs.remove(PlayerClass.values()[availSub.ordinal()]);
          }
        for (Iterator<SubClass> subList = iterSubClasses(player); subList.hasNext(); ) {
          SubClass prevSubClass = subList.next();
          int subClassId = prevSubClass.getClassId();
          if (subClassId >= 88) {
            subClassId = ClassId.values()[subClassId].getParent().getId();
          }

          if (availSub.ordinal() == subClassId || availSub.ordinal() == player.getBaseClass()) {
            availSubs.remove(PlayerClass.values()[availSub.ordinal()]);
          }
        }

        if (npcRace == PlayerRace.Human || npcRace == PlayerRace.LightElf) {
          // If the master is human or light elf, ensure that fighter-type
          // masters only teach fighter classes, and priest-type masters
          // only teach priest classes etc.
          if (!availSub.isOfType(npcTeachType)) {
            availSubs.remove(availSub);
          } else if (!availSub.isOfRace(PlayerRace.Human)
              && !availSub.isOfRace(PlayerRace.LightElf)) {
            availSubs.remove(availSub);
          }
        } else {
          // If the master is not human and not light elf,
          // then remove any classes not of the same race as the master.
          if (npcRace != PlayerRace.Human
              && npcRace != PlayerRace.LightElf
              && !availSub.isOfRace(npcRace)) {
            availSubs.remove(availSub);
          }
        }
      }
    }

    currClass = null;
    return availSubs;
  }