private void showFortSelectPage(L2PcInstance activeChar) {
    int i = 0;
    final NpcHtmlMessage adminReply = new NpcHtmlMessage();
    adminReply.setFile(activeChar.getHtmlPrefix(), "data/html/admin/forts.htm");

    final List<Fort> forts = FortManager.getInstance().getForts();
    final StringBuilder cList = new StringBuilder(forts.size() * 100);

    for (Fort fort : forts) {
      if (fort != null) {
        // L2JTW uses fort.getCName() instead of fort.getName()
        StringUtil.append(
            cList,
            "<td fixwidth=90><a action=\"bypass -h admin_fortsiege ",
            String.valueOf(fort.getResidenceId()),
            "\">",
            fort.getName(),
            " id: ",
            String.valueOf(fort.getResidenceId()),
            "</a></td>");
        i++;
      }
      // L2JTW: if (i > 0)
      if (i > 2) {
        cList.append("</tr><tr>");
        i = 0;
      }
    }

    adminReply.replace("%forts%", cList.toString());
    activeChar.sendPacket(adminReply);
  }
Пример #2
0
 private final boolean isDomainFortressInContractStatus(final int castleId) {
   final int numFort = ((castleId == 1) || (castleId == 5)) ? 2 : 1;
   final List<Integer> fortList = FORTRESS.get(castleId);
   for (int i = 0; i < numFort; i++) {
     final Fort fortress = FortManager.getInstance().getFortById(fortList.get(i));
     if (fortress.getFortState() == 2) {
       return true;
     }
   }
   return false;
 }
Пример #3
0
  @Override
  public void onStart(BuffInfo info) {
    if (!info.getEffector().isPlayer()) {
      return;
    }

    final Fort fort = FortManager.getInstance().getFort(info.getEffector().getActingPlayer());
    if (fort != null) {
      fort.endOfSiege(info.getEffector().getActingPlayer().getClan());
    }
  }
  private static final void dissolveClan(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();
    if (clan.getAllyId() != 0) {
      player.sendPacket(new SystemMessage(SystemMessageId.CANNOT_DISPERSE_THE_CLANS_IN_ALLY));
      return;
    }
    if (clan.isAtWar()) {
      player.sendPacket(new SystemMessage(SystemMessageId.CANNOT_DISSOLVE_WHILE_IN_WAR));
      return;
    }
    if (clan.getHasCastle() != 0 || clan.getHasHideout() != 0 || clan.getHasFort() != 0) {
      player.sendPacket(
          new SystemMessage(SystemMessageId.CANNOT_DISSOLVE_WHILE_OWNING_CLAN_HALL_OR_CASTLE));
      return;
    }

    for (Castle castle : CastleManager.getInstance().getCastles()) {
      if (SiegeManager.getInstance().checkIsRegistered(clan, castle.getCastleId())) {
        player.sendPacket(new SystemMessage(SystemMessageId.CANNOT_DISSOLVE_WHILE_IN_SIEGE));
        return;
      }
    }
    for (Fort fort : FortManager.getInstance().getForts()) {
      if (FortSiegeManager.getInstance().checkIsRegistered(clan, fort.getFortId())) {
        player.sendPacket(new SystemMessage(SystemMessageId.CANNOT_DISSOLVE_WHILE_IN_SIEGE));
        return;
      }
    }

    if (player.isInsideZone(L2PcInstance.ZONE_SIEGE)) {
      player.sendPacket(new SystemMessage(SystemMessageId.CANNOT_DISSOLVE_WHILE_IN_SIEGE));
      return;
    }
    if (clan.getDissolvingExpiryTime() > System.currentTimeMillis()) {
      player.sendPacket(new SystemMessage(SystemMessageId.DISSOLUTION_IN_PROGRESS));
      return;
    }

    clan.setDissolvingExpiryTime(
        System.currentTimeMillis()
            + Config.ALT_CLAN_DISSOLVE_DAYS * 86400000L); // 24*60*60*1000 = 86400000
    clan.updateClanInDB();

    ClanTable.getInstance().scheduleRemoveClan(clan.getClanId());

    // The clan leader should take the XP penalty of a full death.
    player.deathPenalty(false, false, false);
  }
  @Override
  public void onSpawn() {
    super.onSpawn();

    _fort = FortManager.getInstance().getFort(getX(), getY(), getZ());
    _castle = CastleManager.getInstance().getCastle(getX(), getY(), getZ());
    _hall = getConquerableHall();
    if ((_fort == null) && (_castle == null) && (_hall == null)) {
      _log.warning(
          "L2DefenderInstance spawned outside of Fortress, Castle or Siegable hall Zone! NpcId: "
              + getId()
              + " x="
              + getX()
              + " y="
              + getY()
              + " z="
              + getZ());
    }
  }
  @Override
  public boolean testImpl(L2Character effector, L2Character effected, Skill skill, L2Item item) {
    if ((effector == null) || !effector.isPlayer()) {
      return !_val;
    }

    final L2PcInstance player = effector.getActingPlayer();
    boolean canSummonSiegeGolem = true;
    if (player.isAlikeDead() || player.isCursedWeaponEquipped() || (player.getClan() == null)) {
      canSummonSiegeGolem = false;
    }

    final Castle castle = CastleManager.getInstance().getCastle(player);
    final Fort fort = FortManager.getInstance().getFort(player);
    if ((castle == null) && (fort == null)) {
      canSummonSiegeGolem = false;
    }

    if (((fort != null) && (fort.getResidenceId() == 0))
        || ((castle != null) && (castle.getResidenceId() == 0))) {
      player.sendPacket(SystemMessageId.INCORRECT_TARGET);
      canSummonSiegeGolem = false;
    } else if (((castle != null) && !castle.getSiege().isInProgress())
        || ((fort != null) && !fort.getSiege().isInProgress())) {
      player.sendPacket(SystemMessageId.INCORRECT_TARGET);
      canSummonSiegeGolem = false;
    } else if ((player.getClanId() != 0)
        && (((castle != null) && (castle.getSiege().getAttackerClan(player.getClanId()) == null))
            || ((fort != null) && (fort.getSiege().getAttackerClan(player.getClanId()) == null)))) {
      player.sendPacket(SystemMessageId.INCORRECT_TARGET);
      canSummonSiegeGolem = false;
    } else if ((SevenSigns.getInstance().checkSummonConditions(player))) {
      canSummonSiegeGolem = false;
    }
    return (_val == canSummonSiegeGolem);
  }
Пример #7
0
  /**
   * This method will set owner for Fort
   *
   * @param clan
   * @param updateClansReputation
   * @return
   */
  public boolean setOwner(L2Clan clan, boolean updateClansReputation) {
    if (clan == null) {
      _log.warning(getClass().getSimpleName() + ": Updating Fort owner with null clan!!!");
      return false;
    }

    final SystemMessage sm =
        SystemMessage.getSystemMessage(SystemMessageId.THE_FORTRESS_BATTLE_OF_S1_HAS_FINISHED);
    sm.addCastleId(getResidenceId());
    getSiege().announceToPlayer(sm);

    final L2Clan oldowner = getOwnerClan();
    if ((oldowner != null) && (clan != oldowner)) {
      // Remove points from old owner
      updateClansReputation(oldowner, true);
      try {
        L2PcInstance oldleader = oldowner.getLeader().getPlayerInstance();
        if (oldleader != null) {
          if (oldleader.getMountType() == MountType.WYVERN) {
            oldleader.dismount();
          }
        }
      } catch (Exception e) {
        _log.log(Level.WARNING, "Exception in setOwner: " + e.getMessage(), e);
      }
      removeOwner(true);
    }
    setFortState(0, 0); // initialize fort state

    // if clan already have castle, don't store him in fortress
    if (clan.getCastleId() > 0) {
      getSiege()
          .announceToPlayer(
              SystemMessage.getSystemMessage(
                  SystemMessageId.THE_REBEL_ARMY_RECAPTURED_THE_FORTRESS));
      return false;
    }

    // Give points to new owner
    if (updateClansReputation) {
      updateClansReputation(clan, false);
    }

    spawnSpecialEnvoys();
    // if clan have already fortress, remove it
    if (clan.getFortId() > 0) {
      FortManager.getInstance().getFortByOwner(clan).removeOwner(true);
    }

    setSupplyLvL(0);
    setOwnerClan(clan);
    updateOwnerInDB(); // Update in database
    saveFortVariables();

    if (getSiege().isInProgress()) {
      getSiege().endSiege();
    }

    for (L2PcInstance member : clan.getOnlineMembers(0)) {
      giveResidentialSkills(member);
      member.sendSkillList();
    }
    return true;
  }
Пример #8
0
  @Override
  protected final void writeImpl() {
    writeC(0x00);
    writeD(_charObjId);
    writeD(_canTeleport ? 0x01 : 0);
    if (_canTeleport && (_clan != null) && !_isJailed) {
      boolean isInCastleDefense = false;
      boolean isInFortDefense = false;

      L2SiegeClan siegeClan = null;
      Castle castle = CastleManager.getInstance().getCastle(_activeChar);
      Fort fort = FortManager.getInstance().getFort(_activeChar);
      SiegableHall hall = CHSiegeManager.getInstance().getNearbyClanHall(_activeChar);
      if ((castle != null) && castle.getSiege().getIsInProgress()) {
        // siege in progress
        siegeClan = castle.getSiege().getAttackerClan(_clan);
        if ((siegeClan == null) && castle.getSiege().checkIsDefender(_clan)) {
          isInCastleDefense = true;
        }
      } else if ((fort != null) && fort.getSiege().getIsInProgress()) {
        // siege in progress
        siegeClan = fort.getSiege().getAttackerClan(_clan);
        if ((siegeClan == null) && fort.getSiege().checkIsDefender(_clan)) {
          isInFortDefense = true;
        }
      }

      writeD(_clan.getHideoutId() > 0 ? 0x01 : 0x00); // 6d 01 00 00 00 - to hide away
      writeD(
          (_clan.getCastleId() > 0) || isInCastleDefense
              ? 0x01
              : 0x00); // 6d 02 00 00 00 - to castle
      writeD(
          (TerritoryWarManager.getInstance().getFlagForClan(_clan) != null)
                  || ((siegeClan != null)
                      && !isInCastleDefense
                      && !isInFortDefense
                      && !siegeClan.getFlag().isEmpty())
                  || ((hall != null) && hall.getSiege().checkIsAttacker(_clan))
              ? 0x01
              : 0x00); // 6d 03 00 00 00 - to siege HQ
      writeD(_sweepable ? 0x01 : 0x00); // sweepable (blue glow)
      writeD(_access.allowFixedRes() ? 0x01 : 0x00); // 6d 04 00 00 00 - to FIXED
      writeD(
          (_clan.getFortId() > 0) || isInFortDefense ? 0x01 : 0x00); // 6d 05 00 00 00 - to fortress
    } else {
      writeD(0x00); // 6d 01 00 00 00 - to hide away
      writeD(0x00); // 6d 02 00 00 00 - to castle
      writeD(0x00); // 6d 03 00 00 00 - to siege HQ
      writeD(_sweepable ? 0x01 : 0x00); // sweepable (blue glow)
      writeD(_access.allowFixedRes() ? 0x01 : 0x00); // 6d 04 00 00 00 - to FIXED
      writeD(0x00); // 6d 05 00 00 00 - to fortress
    }
    // TODO: protocol 152
    // @formatter:off
    /*
     * writeC(0); //show die animation
     * writeD(0); //agathion ress button
     * writeD(0); //additional free space
     */
    // @formatter:on
  }
Пример #9
0
  @Override
  public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) {
    final Castle castle = npc.getCastle();
    final StringTokenizer st = new StringTokenizer(event, " ");
    String htmltext = null;
    switch (st.nextToken()) {
      case "chamberlain-01.html":
      case "manor-help-01.html":
      case "manor-help-02.html":
      case "manor-help-03.html":
      case "manor-help-04.html":
        {
          htmltext = event;
          break;
        }
      case "fort_status":
        {
          if (npc.isMyLord(player)) {
            final StringBuilder sb = new StringBuilder();
            final List<Integer> fort = FORTRESS.get(castle.getResidenceId());
            for (int id : fort) {
              final Fort fortress = FortManager.getInstance().getFortById(id);
              final int fortId = fortress.getResidenceId();
              final String fortType = (fortId < 112) ? "1300133" : "1300134";
              final String fortStatus;
              switch (fortress.getFortState()) {
                case 1:
                  fortStatus = "1300122";
                  break;
                case 2:
                  fortStatus = "1300124";
                  break;
                default:
                  fortStatus = "1300123";
                  break;
              }
              sb.append("<fstring>1300" + fortId + "</fstring>");
              sb.append(" (<fstring>" + fortType + "</fstring>)");
              sb.append(
                  " : <font color=\"00FFFF\"><fstring>" + fortStatus + "</fstring></font><br>");
            }
            final NpcHtmlMessage html = getHtmlPacket(player, npc, "chamberlain-28.html");
            html.replace("%list%", sb.toString());
            player.sendPacket(html);
          } else {
            htmltext = "chamberlain-21.html";
          }
          break;
        }
      case "siege_functions":
        {
          if (isOwner(player, npc) && player.hasClanPrivilege(ClanPrivilege.CS_SET_FUNCTIONS)) {
            if (castle.getSiege().isInProgress()) {
              htmltext = "chamberlain-08.html";
            } else if (!isDomainFortressInContractStatus(castle.getResidenceId())) {
              htmltext = "chamberlain-27.html";
            } else if (!SevenSigns.getInstance().isCompResultsPeriod()) {
              htmltext = "chamberlain-26.html";
            } else {
              htmltext = "chamberlain-12.html";
            }
          } else {
            htmltext = "chamberlain-21.html";
          }
          break;
        }
      case "manage_doors":
        {
          if (isOwner(player, npc) && player.hasClanPrivilege(ClanPrivilege.CS_SET_FUNCTIONS)) {
            if (st.hasMoreTokens()) {
              final StringBuilder sb = new StringBuilder();
              final NpcHtmlMessage html = getHtmlPacket(player, npc, "chamberlain-13.html");
              html.replace("%type%", st.nextToken());
              while (st.hasMoreTokens()) {
                sb.append(" " + st.nextToken());
              }
              html.replace("%doors%", sb.toString());
              player.sendPacket(html);
            } else {
              htmltext = npc.getId() + "-du.html";
            }
          } else {
            htmltext = "chamberlain-21.html";
          }
          break;
        }
      case "upgrade_doors":
        {
          if (isOwner(player, npc) && player.hasClanPrivilege(ClanPrivilege.CS_SET_FUNCTIONS)) {
            final int type = Integer.parseInt(st.nextToken());
            final int level = Integer.parseInt(st.nextToken());
            final NpcHtmlMessage html = getHtmlPacket(player, npc, "chamberlain-14.html");
            html.replace("%gate_price%", Integer.toString(getDoorUpgradePrice(type, level)));
            html.replace("%event%", event.substring("upgrade_doors".length() + 1));
            player.sendPacket(html);
          } else {
            htmltext = "chamberlain-21.html";
          }
          break;
        }
      case "upgrade_doors_confirm":
        {
          if (isOwner(player, npc) && player.hasClanPrivilege(ClanPrivilege.CS_SET_FUNCTIONS)) {
            if (castle.getSiege().isInProgress()) {
              htmltext = "chamberlain-08.html";
            } else {
              final int type = Integer.parseInt(st.nextToken());
              final int level = Integer.parseInt(st.nextToken());
              final int price = getDoorUpgradePrice(type, level);
              final int[] doors = new int[2];
              for (int i = 0; i <= st.countTokens(); i++) {
                doors[i] = Integer.parseInt(st.nextToken());
              }

              final L2DoorInstance door = castle.getDoor(doors[0]);
              if (door != null) {
                final int currentLevel = door.getStat().getUpgradeHpRatio();
                if (currentLevel >= level) {
                  final NpcHtmlMessage html = getHtmlPacket(player, npc, "chamberlain-15.html");
                  html.replace("%doorlevel%", Integer.toString(currentLevel));
                  player.sendPacket(html);
                } else if (player.getAdena() >= price) {
                  takeItems(player, Inventory.ADENA_ID, price);
                  for (int doorId : doors) {
                    castle.setDoorUpgrade(doorId, level, true);
                  }
                  htmltext = "chamberlain-16.html";
                } else {
                  htmltext = "chamberlain-09.html";
                }
              }
            }
          } else {
            htmltext = "chamberlain-21.html";
          }
          break;
        }
      case "manage_trap":
        {
          if (isOwner(player, npc) && player.hasClanPrivilege(ClanPrivilege.CS_SET_FUNCTIONS)) {
            if (st.hasMoreTokens()) {
              final NpcHtmlMessage html;
              if (castle.getName().equalsIgnoreCase("aden")) {
                html = getHtmlPacket(player, npc, "chamberlain-17a.html");
              } else {
                html = getHtmlPacket(player, npc, "chamberlain-17.html");
              }
              html.replace("%trapIndex%", st.nextToken());
              player.sendPacket(html);
            } else {
              htmltext = npc.getId() + "-tu.html";
            }
          } else {
            htmltext = "chamberlain-21.html";
          }
          break;
        }
      case "upgrade_trap":
        {
          if (isOwner(player, npc) && player.hasClanPrivilege(ClanPrivilege.CS_SET_FUNCTIONS)) {
            final String trapIndex = st.nextToken();
            final int level = Integer.parseInt(st.nextToken());
            final NpcHtmlMessage html = getHtmlPacket(player, npc, "chamberlain-18.html");
            html.replace("%trapIndex%", trapIndex);
            html.replace("%level%", Integer.toString(level));
            html.replace("%dmgzone_price%", Integer.toString(getTrapUpgradePrice(level)));
            player.sendPacket(html);
          } else {
            htmltext = "chamberlain-21.html";
          }
          break;
        }
      case "upgrade_trap_confirm":
        {
          if (isOwner(player, npc) && player.hasClanPrivilege(ClanPrivilege.CS_SET_FUNCTIONS)) {
            if (castle.getSiege().isInProgress()) {
              htmltext = "chamberlain-08.html";
            } else {
              final int trapIndex = Integer.parseInt(st.nextToken());
              final int level = Integer.parseInt(st.nextToken());
              final int price = getTrapUpgradePrice(level);
              final int currentLevel = castle.getTrapUpgradeLevel(trapIndex);

              if (currentLevel >= level) {
                final NpcHtmlMessage html = getHtmlPacket(player, npc, "chamberlain-19.html");
                html.replace("%dmglevel%", Integer.toString(currentLevel));
                player.sendPacket(html);
              } else if (player.getAdena() >= price) {
                takeItems(player, Inventory.ADENA_ID, price);
                castle.setTrapUpgrade(trapIndex, level, true);
                htmltext = "chamberlain-20.html";
              } else {
                htmltext = "chamberlain-09.html";
              }
            }
          } else {
            htmltext = "chamberlain-21.html";
          }
          break;
        }
      case "receive_report":
        {
          if (npc.isMyLord(player)) {
            if (castle.getSiege().isInProgress()) {
              htmltext = "chamberlain-07.html";
            } else {
              final L2Clan clan = ClanTable.getInstance().getClan(castle.getOwnerId());
              final NpcHtmlMessage html = getHtmlPacket(player, npc, "chamberlain-02.html");
              html.replace("%clanleadername%", clan.getLeaderName());
              html.replace("%clanname%", clan.getName());
              html.replace("%castlename%", String.valueOf(1001000 + castle.getResidenceId()));

              switch (SevenSigns.getInstance().getCurrentPeriod()) {
                case SevenSigns.PERIOD_COMP_RECRUITING:
                  html.replace("%ss_event%", "1000509");
                  break;
                case SevenSigns.PERIOD_COMPETITION:
                  html.replace("%ss_event%", "1000507");
                  break;
                case SevenSigns.PERIOD_SEAL_VALIDATION:
                case SevenSigns.PERIOD_COMP_RESULTS:
                  html.replace("%ss_event%", "1000508");
                  break;
              }
              html.replace("%ss_avarice%", getSealOwner(1));
              html.replace("%ss_gnosis%", getSealOwner(2));
              html.replace("%ss_strife%", getSealOwner(3));
              player.sendPacket(html);
            }
          } else {
            htmltext = "chamberlain-21.html";
          }
          break;
        }
      case "manage_tax":
        {
          if (isOwner(player, npc) && player.hasClanPrivilege(ClanPrivilege.CS_TAXES)) {
            if (castle.getSiege().isInProgress()) {
              htmltext = "chamberlain-08.html";
            } else {
              final NpcHtmlMessage html = getHtmlPacket(player, npc, "castlesettaxrate.html");
              html.replace("%tax_rate%", Integer.toString(castle.getTaxPercent()));
              html.replace("%next_tax_rate%", "0"); // TODO: Implement me!
              html.replace("%tax_limit%", Integer.toString(getTaxLimit()));
              player.sendPacket(html);
            }
          } else if (isOwner(player, npc)) {
            final NpcHtmlMessage html = getHtmlPacket(player, npc, "chamberlain-03.html");
            html.replace("%tax_rate%", Integer.toString(castle.getTaxPercent()));
            html.replace("%next_tax_rate%", "0"); // TODO: Implement me!
            player.sendPacket(html);
          } else {
            htmltext = "chamberlain-21.html";
          }
          break;
        }
      case "set_tax":
        {
          if (isOwner(player, npc) && player.hasClanPrivilege(ClanPrivilege.CS_TAXES)) {
            if (castle.getSiege().isInProgress()) {
              htmltext = "chamberlain-08.html";
            } else {
              final NpcHtmlMessage html;
              final int tax = (st.hasMoreTokens()) ? Integer.parseInt(st.nextToken()) : 0;
              final int taxLimit = getTaxLimit();
              if (tax > taxLimit) {
                html = getHtmlPacket(player, npc, "castletoohightaxrate.html");
                html.replace("%tax_limit%", Integer.toString(taxLimit));
              } else {
                castle.setTaxPercent(tax);
                html = getHtmlPacket(player, npc, "castleaftersettaxrate.html");
                html.replace("%next_tax_rate%", Integer.toString(tax));
              }
              player.sendPacket(html);
            }
          } else {
            htmltext = "chamberlain-21.html";
          }
          break;
        }
      case "manage_vault":
        {
          if (isOwner(player, npc) && player.hasClanPrivilege(ClanPrivilege.CS_TAXES)) {
            long seedIncome = 0;
            if (Config.ALLOW_MANOR) {
              for (SeedProduction sp :
                  CastleManorManager.getInstance()
                      .getSeedProduction(castle.getResidenceId(), false)) {
                final long diff = sp.getStartAmount() - sp.getAmount();
                if (diff != 0) {
                  seedIncome += diff * sp.getPrice();
                }
              }
            }

            final NpcHtmlMessage html = getHtmlPacket(player, npc, "castlemanagevault.html");
            html.replace("%tax_income%", Util.formatAdena(castle.getTreasury()));
            html.replace("%tax_income_reserved%", "0"); // TODO: Implement me!
            html.replace("%seed_income%", Util.formatAdena(seedIncome));
            player.sendPacket(html);
          } else {
            htmltext = "chamberlain-21.html";
          }
          break;
        }
      case "deposit":
        {
          if (isOwner(player, npc) && player.hasClanPrivilege(ClanPrivilege.CS_TAXES)) {
            final long amount = (st.hasMoreTokens()) ? Long.parseLong(st.nextToken()) : 0;
            if ((amount > 0) && (amount < Inventory.MAX_ADENA)) {
              if (player.getAdena() >= amount) {
                takeItems(player, Inventory.ADENA_ID, amount);
                castle.addToTreasuryNoTax(amount);
              } else {
                player.sendPacket(SystemMessageId.YOU_NOT_ENOUGH_ADENA);
              }
            }
            htmltext = "chamberlain-01.html";
          } else {
            htmltext = "chamberlain-21.html";
          }
          break;
        }
      case "withdraw":
        {
          if (isOwner(player, npc) && player.hasClanPrivilege(ClanPrivilege.CS_TAXES)) {
            final long amount = (st.hasMoreTokens()) ? Long.parseLong(st.nextToken()) : 0;
            if (amount <= castle.getTreasury()) {
              castle.addToTreasuryNoTax((-1) * amount);
              giveAdena(player, amount, false);
              htmltext = "chamberlain-01.html";
            } else {
              final NpcHtmlMessage html = getHtmlPacket(player, npc, "castlenotenoughbalance.html");
              html.replace("%tax_income%", Util.formatAdena(castle.getTreasury()));
              html.replace("%withdraw_amount%", Util.formatAdena(amount));
              player.sendPacket(html);
            }
          } else {
            htmltext = "chamberlain-21.html";
          }
          break;
        }
      case "manage_functions":
        {
          if (!isOwner(player, npc)) {
            htmltext = "chamberlain-21.html";
          } else if (castle.getSiege().isInProgress()) {
            htmltext = "chamberlain-08.html";
          } else {
            htmltext = "chamberlain-23.html";
          }
          break;
        }
      case "banish_foreigner_show":
        {
          if (!isOwner(player, npc) || !player.hasClanPrivilege(ClanPrivilege.CS_DISMISS)) {
            htmltext = "chamberlain-21.html";
          } else if (castle.getSiege().isInProgress()) {
            htmltext = "chamberlain-08.html";
          } else {
            htmltext = "chamberlain-10.html";
          }
          break;
        }
      case "banish_foreigner":
        {
          if (isOwner(player, npc) && player.hasClanPrivilege(ClanPrivilege.CS_DISMISS)) {
            if (castle.getSiege().isInProgress()) {
              htmltext = "chamberlain-08.html";
            } else {
              castle.banishForeigners();
              htmltext = "chamberlain-11.html";
            }
          } else {
            htmltext = "chamberlain-21.html";
          }
          break;
        }
      case "doors":
        {
          if (!isOwner(player, npc) || !player.hasClanPrivilege(ClanPrivilege.CS_OPEN_DOOR)) {
            htmltext = "chamberlain-21.html";
          } else if (castle.getSiege().isInProgress()) {
            htmltext = "chamberlain-08.html";
          } else {
            htmltext = npc.getId() + "-d.html";
          }
          break;
        }
      case "operate_door":
        {
          if (!isOwner(player, npc) || !player.hasClanPrivilege(ClanPrivilege.CS_OPEN_DOOR)) {
            htmltext = "chamberlain-21.html";
          } else if (castle.getSiege().isInProgress()) {
            htmltext = "chamberlain-08.html";
          } else {
            final boolean open = (Integer.parseInt(st.nextToken()) == 1);
            while (st.hasMoreTokens()) {
              castle.openCloseDoor(player, Integer.parseInt(st.nextToken()), open);
            }
            htmltext = (open ? "chamberlain-05.html" : "chamberlain-06.html");
          }
          break;
        }
      case "additional_functions":
        {
          htmltext =
              (isOwner(player, npc) && player.hasClanPrivilege(ClanPrivilege.CS_SET_FUNCTIONS))
                  ? "castletdecomanage.html"
                  : "chamberlain-21.html";
          break;
        }
      case "recovery":
        {
          if (isOwner(player, npc) && player.hasClanPrivilege(ClanPrivilege.CS_SET_FUNCTIONS)) {
            final NpcHtmlMessage html = getHtmlPacket(player, npc, "castledeco-AR01.html");
            funcReplace(castle, html, Castle.FUNC_RESTORE_HP, "HP");
            funcReplace(castle, html, Castle.FUNC_RESTORE_MP, "MP");
            funcReplace(castle, html, Castle.FUNC_RESTORE_EXP, "XP");
            player.sendPacket(html);
          } else {
            htmltext = "chamberlain-21.html";
          }
          break;
        }
      case "other":
        {
          if (isOwner(player, npc) && player.hasClanPrivilege(ClanPrivilege.CS_SET_FUNCTIONS)) {
            final NpcHtmlMessage html = getHtmlPacket(player, npc, "castledeco-AE01.html");
            funcReplace(castle, html, Castle.FUNC_TELEPORT, "TP");
            funcReplace(castle, html, Castle.FUNC_SUPPORT, "BF");
            player.sendPacket(html);
          } else {
            htmltext = "chamberlain-21.html";
          }
          break;
        }
      case "HP":
        {
          final int level = Integer.parseInt(st.nextToken());
          htmltext = funcConfirmHtml(player, npc, castle, Castle.FUNC_RESTORE_HP, level);
          break;
        }
      case "MP":
        {
          final int level = Integer.parseInt(st.nextToken());
          htmltext = funcConfirmHtml(player, npc, castle, Castle.FUNC_RESTORE_MP, level);
          break;
        }
      case "XP":
        {
          final int level = Integer.parseInt(st.nextToken());
          htmltext = funcConfirmHtml(player, npc, castle, Castle.FUNC_RESTORE_EXP, level);
          break;
        }
      case "TP":
        {
          final int level = Integer.parseInt(st.nextToken());
          htmltext = funcConfirmHtml(player, npc, castle, Castle.FUNC_TELEPORT, level);
          break;
        }
      case "BF":
        {
          final int level = Integer.parseInt(st.nextToken());
          htmltext = funcConfirmHtml(player, npc, castle, Castle.FUNC_SUPPORT, level);
          break;
        }
      case "set_func":
        {
          if (isOwner(player, npc) && player.hasClanPrivilege(ClanPrivilege.CS_SET_FUNCTIONS)) {
            final int func = Integer.parseInt(st.nextToken());
            final int level = Integer.parseInt(st.nextToken());
            if (level == 0) {
              castle.updateFunctions(player, func, level, 0, 0, false);
            } else if (!castle.updateFunctions(
                player,
                func,
                level,
                getFunctionFee(func, level),
                getFunctionRatio(func),
                castle.getFunction(func) == null)) {
              htmltext = "chamberlain-09.html";
            }
          } else {
            htmltext = "chamberlain-21.html";
          }
          break;
        }
      case "functions":
        {
          if (isOwner(player, npc) && player.hasClanPrivilege(ClanPrivilege.CS_USE_FUNCTIONS)) {
            final CastleFunction HP = castle.getFunction(Castle.FUNC_RESTORE_HP);
            final CastleFunction MP = castle.getFunction(Castle.FUNC_RESTORE_MP);
            final CastleFunction XP = castle.getFunction(Castle.FUNC_RESTORE_EXP);
            final NpcHtmlMessage html = getHtmlPacket(player, npc, "castledecofunction.html");
            html.replace("%HPDepth%", (HP == null) ? "0" : Integer.toString(HP.getLvl()));
            html.replace("%MPDepth%", (MP == null) ? "0" : Integer.toString(MP.getLvl()));
            html.replace("%XPDepth%", (XP == null) ? "0" : Integer.toString(XP.getLvl()));
            player.sendPacket(html);
          } else {
            htmltext = "chamberlain-21.html";
          }
          break;
        }
      case "teleport":
        {
          if (!isOwner(player, npc) || !player.hasClanPrivilege(ClanPrivilege.CS_USE_FUNCTIONS)) {
            htmltext = "chamberlain-21.html";
          } else if (castle.getFunction(Castle.FUNC_TELEPORT) == null) {
            htmltext = "castlefuncdisabled.html";
          } else {
            htmltext =
                npc.getId() + "-t" + castle.getFunction(Castle.FUNC_TELEPORT).getLvl() + ".html";
          }
          break;
        }
      case "goto":
        {
          if (isOwner(player, npc) && player.hasClanPrivilege(ClanPrivilege.CS_USE_FUNCTIONS)) {
            final int locId = Integer.parseInt(st.nextToken());
            final L2TeleportLocation list = TeleportLocationTable.getInstance().getTemplate(locId);
            if (list != null) {
              if (takeItems(player, list.getItemId(), list.getPrice())) {
                player.teleToLocation(list.getLocX(), list.getLocY(), list.getLocZ());
              }
            }
          } else {
            htmltext = "chamberlain-21.html";
          }
          break;
        }
      case "buffer":
        {
          if (isOwner(player, npc) && player.hasClanPrivilege(ClanPrivilege.CS_USE_FUNCTIONS)) {
            if (castle.getFunction(Castle.FUNC_SUPPORT) == null) {
              htmltext = "castlefuncdisabled.html";
            } else {
              final NpcHtmlMessage html =
                  getHtmlPacket(
                      player,
                      npc,
                      "castlebuff-0" + castle.getFunction(Castle.FUNC_SUPPORT).getLvl() + ".html");
              html.replace("%MPLeft%", Integer.toString((int) npc.getCurrentMp()));
              player.sendPacket(html);
            }
          } else {
            htmltext = "chamberlain-21.html";
          }
          break;
        }
      case "cast_buff":
        {
          if (isOwner(player, npc) && player.hasClanPrivilege(ClanPrivilege.CS_USE_FUNCTIONS)) {
            if (castle.getFunction(Castle.FUNC_SUPPORT) == null) {
              htmltext = "castlefuncdisabled.html";
            } else {
              final int index = Integer.parseInt(st.nextToken());
              if (BUFFS.length > index) {
                final NpcHtmlMessage html;
                final SkillHolder holder = BUFFS[index];
                if (holder.getSkill().getMpConsume() < npc.getCurrentMp()) {
                  npc.setTarget(player);
                  npc.doCast(holder.getSkill());
                  html = getHtmlPacket(player, npc, "castleafterbuff.html");
                } else {
                  html = getHtmlPacket(player, npc, "castlenotenoughmp.html");
                }

                html.replace("%MPLeft%", Integer.toString((int) npc.getCurrentMp()));
                player.sendPacket(html);
              }
            }
          } else {
            htmltext = "chamberlain-21.html";
          }
          break;
        }
      case "list_siege_clans":
        {
          if (isOwner(player, npc) && player.hasClanPrivilege(ClanPrivilege.CS_MANAGE_SIEGE)) {
            castle.getSiege().listRegisterClan(player);
          } else {
            htmltext = "chamberlain-21.html";
          }
          break;
        }
      case "list_territory_clans":
        {
          if (isOwner(player, npc) && player.hasClanPrivilege(ClanPrivilege.CS_MANAGE_SIEGE)) {
            player.sendPacket(new ExShowDominionRegistry(castle.getResidenceId(), player));
          } else {
            htmltext = "chamberlain-21.html";
          }
          break;
        }
      case "manor":
        {
          if (Config.ALLOW_MANOR) {
            htmltext =
                (isOwner(player, npc) && player.hasClanPrivilege(ClanPrivilege.CS_MANOR_ADMIN))
                    ? "manor.html"
                    : "chamberlain-21.html";
          } else {
            player.sendMessage("Manor system is deactivated.");
          }
          break;
        }
      case "products":
        {
          if (isOwner(player, npc) && player.hasClanPrivilege(ClanPrivilege.CS_USE_FUNCTIONS)) {
            final NpcHtmlMessage html = getHtmlPacket(player, npc, "chamberlain-22.html");
            html.replace("%npcId%", Integer.toString(npc.getId()));
            player.sendPacket(html);
          } else {
            htmltext = "chamberlain-21.html";
          }
          break;
        }
      case "buy":
        {
          if (isOwner(player, npc) && player.hasClanPrivilege(ClanPrivilege.CS_USE_FUNCTIONS)) {
            ((L2MerchantInstance) npc).showBuyWindow(player, Integer.parseInt(st.nextToken()));
          } else {
            htmltext = "chamberlain-21.html";
          }
          break;
        }
      case "give_crown":
        {
          if (castle.getSiege().isInProgress()) {
            htmltext = "chamberlain-08.html";
          } else if (npc.isMyLord(player)) {
            if (hasQuestItems(player, CROWN)) {
              htmltext = "chamberlain-24.html";
            } else {
              final NpcHtmlMessage html = getHtmlPacket(player, npc, "chamberlain-25.html");
              html.replace("%owner_name%", String.valueOf(player.getName()));
              html.replace(
                  "%feud_name%", String.valueOf(String.valueOf(1001000 + castle.getResidenceId())));
              player.sendPacket(html);
              giveItems(player, CROWN, 1);
            }
          } else {
            htmltext = "chamberlain-21.html";
          }
          break;
        }
      case "manors_cert":
        {
          if (npc.isMyLord(player)) {
            if (castle.getSiege().isInProgress()) {
              htmltext = "chamberlain-08.html";
            } else {
              if ((SevenSigns.getInstance().getPlayerCabal(player.getObjectId())
                      == SevenSigns.CABAL_DAWN)
                  && SevenSigns.getInstance().isCompetitionPeriod()) {
                final int ticketCount = castle.getTicketBuyCount();
                if (ticketCount
                    < (Config.SSQ_DAWN_TICKET_QUANTITY / Config.SSQ_DAWN_TICKET_BUNDLE)) {
                  final NpcHtmlMessage html = getHtmlPacket(player, npc, "ssq_selldawnticket.html");
                  html.replace(
                      "%DawnTicketLeft%",
                      String.valueOf(
                          Config.SSQ_DAWN_TICKET_QUANTITY
                              - (ticketCount * Config.SSQ_DAWN_TICKET_BUNDLE)));
                  html.replace("%DawnTicketBundle%", String.valueOf(Config.SSQ_DAWN_TICKET_BUNDLE));
                  html.replace(
                      "%DawnTicketPrice%",
                      String.valueOf(Config.SSQ_DAWN_TICKET_PRICE * Config.SSQ_DAWN_TICKET_BUNDLE));
                  player.sendPacket(html);
                } else {
                  htmltext = "ssq_notenoughticket.html";
                }
              } else {
                htmltext = "ssq_notdawnorevent.html";
              }
            }
          } else {
            htmltext = "chamberlain-21.html";
          }
          break;
        }
      case "manors_cert_confirm":
        {
          if (npc.isMyLord(player)) {
            if (castle.getSiege().isInProgress()) {
              htmltext = "chamberlain-08.html";
            } else {
              if ((SevenSigns.getInstance().getPlayerCabal(player.getObjectId())
                      == SevenSigns.CABAL_DAWN)
                  && SevenSigns.getInstance().isCompetitionPeriod()) {
                final int ticketCount = castle.getTicketBuyCount();
                if (ticketCount
                    < (Config.SSQ_DAWN_TICKET_QUANTITY / Config.SSQ_DAWN_TICKET_BUNDLE)) {
                  final long totalCost =
                      Config.SSQ_DAWN_TICKET_PRICE * Config.SSQ_DAWN_TICKET_BUNDLE;
                  if (player.getAdena() >= totalCost) {
                    takeItems(player, Inventory.ADENA_ID, totalCost);
                    giveItems(
                        player, Config.SSQ_MANORS_AGREEMENT_ID, Config.SSQ_DAWN_TICKET_BUNDLE);
                    castle.setTicketBuyCount(ticketCount + 1);
                  } else {
                    htmltext = "chamberlain-09.html";
                  }
                } else {
                  htmltext = "ssq_notenoughticket.html";
                }
              } else {
                htmltext = "ssq_notdawnorevent.html";
              }
            }
          } else {
            htmltext = "chamberlain-21.html";
          }
          break;
        }
    }
    return htmltext;
  }
  @Override
  public boolean useAdminCommand(String command, L2PcInstance activeChar) {
    StringTokenizer st = new StringTokenizer(command, " ");
    command = st.nextToken(); // Get actual command

    // Get fort
    Fort fort = null;
    int fortId = 0;
    if (st.hasMoreTokens()) {
      fortId = Integer.parseInt(st.nextToken());
      fort = FortManager.getInstance().getFortById(fortId);
    }
    // Get fort
    if (((fort == null) || (fortId == 0))) {
      // No fort specified
      showFortSelectPage(activeChar);
    } else {
      L2Object target = activeChar.getTarget();
      L2PcInstance player = null;
      if (target instanceof L2PcInstance) {
        player = (L2PcInstance) target;
      }

      if (command.equalsIgnoreCase("admin_add_fortattacker")) {
        if (player == null) {
          activeChar.sendPacket(SystemMessageId.TARGET_IS_INCORRECT);
        } else {
          if (fort.getSiege().addAttacker(player, false) == 4) {
            final SystemMessage sm =
                SystemMessage.getSystemMessage(SystemMessageId.REGISTERED_TO_S1_FORTRESS_BATTLE);
            sm.addCastleId(fort.getResidenceId());
            player.sendPacket(sm);
          } else {
            player.sendMessage("During registering error occurred!");
          }
        }
      } else if (command.equalsIgnoreCase("admin_clear_fortsiege_list")) {
        fort.getSiege().clearSiegeClan();
      } else if (command.equalsIgnoreCase("admin_endfortsiege")) {
        fort.getSiege().endSiege();
      } else if (command.equalsIgnoreCase("admin_list_fortsiege_clans")) {
        activeChar.sendMessage("Not implemented yet.");
      } else if (command.equalsIgnoreCase("admin_setfort")) {
        if ((player == null) || (player.getClan() == null)) {
          activeChar.sendPacket(SystemMessageId.TARGET_IS_INCORRECT);
        } else {
          fort.endOfSiege(player.getClan());
        }
      } else if (command.equalsIgnoreCase("admin_removefort")) {
        L2Clan clan = fort.getOwnerClan();
        if (clan != null) {
          fort.removeOwner(true);
        } else {
          activeChar.sendMessage("Unable to remove fort");
        }
      } else if (command.equalsIgnoreCase("admin_spawn_fortdoors")) {
        fort.resetDoors();
      } else if (command.equalsIgnoreCase("admin_startfortsiege")) {
        fort.getSiege().startSiege();
      }

      showFortSiegePage(activeChar, fort);
    }
    return true;
  }