public int getAreaCastle(L2Character activeChar) {
    L2MapRegion region = getMapRegion(activeChar);

    if (region == null) return 0;

    return region.getCastle();
  }
  /**
   * Get town name by character position
   *
   * @param activeChar
   * @return
   */
  public String getClosestTownName(L2Character activeChar) {
    L2MapRegion region = getMapRegion(activeChar);

    if (region == null) return "Aden Castle Town";

    return region.getTown();
  }
  public final int getMapRegionLocId(int locX, int locY) {
    L2MapRegion region = getMapRegion(locX, locY);
    if (region != null) return region.getLocId();

    if (Config.DEBUG_PATH)
      _log.log(
          Level.WARNING,
          "MapRegionManager: Player outside map regions at X,Y=" + locX + "," + locY);
    return 0;
  }
  public L2MapRegion getRestartRegion(L2Character activeChar, String point) {
    try {
      L2PcInstance player = ((L2PcInstance) activeChar);
      L2MapRegion region = _regions.get(point);

      if (region.getBannedRace().containsKey(player.getRace()))
        getRestartRegion(player, region.getBannedRace().get(player.getRace()));
      return region;
    } catch (Exception e) {
      return _regions.get("talking_island_town");
    }
  }
  private static void load() {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    factory.setValidating(false);
    factory.setIgnoringComments(true);

    for (File file : Util.getDatapackFiles("mapregion", ".xml")) {
      try {
        Document doc = factory.newDocumentBuilder().parse(file);
        for (Node n = doc.getFirstChild(); n != null; n = n.getNextSibling()) {
          if ("list".equalsIgnoreCase(n.getNodeName())) {
            for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling()) {
              if ("region".equalsIgnoreCase(d.getNodeName())) {
                NamedNodeMap attrs = d.getAttributes();
                Node att;
                String name = "";
                String town = "";
                int locId = -1;
                int castle = -1;
                int bbs = -1;

                att = attrs.getNamedItem("name");
                if (att == null) {
                  _log.severe("Missing name for MapRegion, skipping");
                  continue;
                }
                name = att.getNodeValue();

                att = attrs.getNamedItem("town");
                if (att == null) {
                  _log.severe("Missing town for MapRegion name: " + name + ", skipping");
                  continue;
                }
                town = att.getNodeValue();

                att = attrs.getNamedItem("locId");
                if (att == null) {
                  _log.severe("Missing locId for MapRegion name: " + name + ", skipping");
                  continue;
                }
                locId = Integer.parseInt(att.getNodeValue());

                att = attrs.getNamedItem("castle");
                if (att == null) {
                  _log.severe("Missing castle for MapRegion name: " + name + ", skipping");
                  continue;
                }
                castle = Integer.parseInt(att.getNodeValue());

                att = attrs.getNamedItem("bbs");
                if (att == null) {
                  _log.severe("Missing bbs for MapRegion name: " + name + ", skipping");
                  continue;
                }
                bbs = Integer.parseInt(att.getNodeValue());

                L2MapRegion region = new L2MapRegion(name, town, locId, castle, bbs);
                for (Node c = d.getFirstChild(); c != null; c = c.getNextSibling()) {
                  if ("respawnPoint".equalsIgnoreCase(c.getNodeName())) {
                    attrs = c.getAttributes();
                    int spawnX = Integer.parseInt(attrs.getNamedItem("X").getNodeValue());
                    int spawnY = Integer.parseInt(attrs.getNamedItem("Y").getNodeValue());
                    int spawnZ = Integer.parseInt(attrs.getNamedItem("Z").getNodeValue());

                    Node val = attrs.getNamedItem("isOther");
                    boolean other = val != null && Boolean.parseBoolean(val.getNodeValue());

                    val = attrs.getNamedItem("isChaotic");
                    boolean chaotic = val != null && Boolean.parseBoolean(val.getNodeValue());

                    val = attrs.getNamedItem("isBanish");
                    boolean banish = val != null && Boolean.parseBoolean(val.getNodeValue());

                    if (other) region.addOtherSpawn(spawnX, spawnY, spawnZ);
                    else if (chaotic) region.addChaoticSpawn(spawnX, spawnY, spawnZ);
                    else if (banish) region.addBanishSpawn(spawnX, spawnY, spawnZ);
                    else region.addSpawn(spawnX, spawnY, spawnZ);
                  } else if ("map".equalsIgnoreCase(c.getNodeName())) {
                    attrs = c.getAttributes();
                    int mapX = Integer.parseInt(attrs.getNamedItem("X").getNodeValue());
                    int mapY = Integer.parseInt(attrs.getNamedItem("Y").getNodeValue());

                    region.addMap(mapX, mapY);
                  } else if ("banned".equalsIgnoreCase(c.getNodeName())) {
                    attrs = c.getAttributes();
                    String race = attrs.getNamedItem("race").getNodeValue();
                    String point = attrs.getNamedItem("point").getNodeValue();

                    region.addBannedRace(race, point);
                  }
                }
                _regions.put(name, region);
              }
            }
          }
        }
      } catch (Exception e) {
        _log.severe("MapRegion file (" + file.getAbsolutePath() + ") doesnt exists.");
      }
    }
  }
 public final L2MapRegion getMapRegion(int locX, int locY) {
   for (L2MapRegion region : _regions.values()) {
     if (region.isZoneInRegion(getMapRegionX(locX), getMapRegionY(locY))) return region;
   }
   return null;
 }