/* * Copyright (C) 2004-2015 L2J Server * * This file is part of L2J Server. * * L2J Server is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * L2J Server is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package com.l2jserver.gameserver.datatables; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import com.l2jserver.gameserver.engines.DocumentParser; import com.l2jserver.gameserver.enums.CastleSide; import com.l2jserver.gameserver.model.holders.CastleSpawnHolder; /** * @author St3eT */ public final class CastleData implements DocumentParser { private final Map> _castles = new HashMap<>(); protected CastleData() { load(); } @Override public void load() { _castles.clear(); parseDatapackDirectory("data/castles", true); } @Override public void parseDocument(Document doc) { for (Node listNode = doc.getFirstChild(); listNode != null; listNode = listNode.getNextSibling()) { if ("list".equals(listNode.getNodeName())) { for (Node castleNode = listNode.getFirstChild(); castleNode != null; castleNode = castleNode.getNextSibling()) { if ("castle".equals(castleNode.getNodeName())) { final int castleId = parseInteger(castleNode.getAttributes(), "id"); final List spawns = new ArrayList<>(); for (Node tpNode = castleNode.getFirstChild(); tpNode != null; tpNode = tpNode.getNextSibling()) { if ("spawn".equals(tpNode.getNodeName())) { final CastleSide side = parseEnum(tpNode.getAttributes(), CastleSide.class, "castleSide", CastleSide.NEUTRAL); for (Node npcNode = tpNode.getFirstChild(); npcNode != null; npcNode = npcNode.getNextSibling()) { if ("npc".equals(npcNode.getNodeName())) { final NamedNodeMap np = npcNode.getAttributes(); final int npcId = parseInteger(np, "id"); final int x = parseInteger(np, "x"); final int y = parseInteger(np, "y"); final int z = parseInteger(np, "z"); final int heading = parseInteger(np, "heading"); spawns.add(new CastleSpawnHolder(npcId, side, x, y, z, heading)); } } } } _castles.put(castleId, spawns); } } } } } public final List getSpawnsForSide(int castleId, CastleSide side) { return _castles.getOrDefault(castleId, Collections.emptyList()).stream().filter(s -> s.getSide() == side).collect(Collectors.toList()); } /** * Gets the single instance of TeleportersData. * @return single instance of TeleportersData */ public static CastleData getInstance() { return SingletonHolder._instance; } private static class SingletonHolder { protected static final CastleData _instance = new CastleData(); } }