/* * Copyright (C) 2004-2013 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.io.File; import java.io.IOException; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javolution.util.FastMap; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.xml.sax.SAXException; import com.l2jserver.Config; import com.l2jserver.gameserver.InstanceListManager; import com.l2jserver.gameserver.instancemanager.CastleManager; import com.l2jserver.gameserver.model.actor.instance.L2MerchantInstance; import com.l2jserver.gameserver.model.entity.Castle; /** * @author KenM */ public class MerchantPriceConfigTable implements InstanceListManager { private static Logger _log = Logger.getLogger(MerchantPriceConfigTable.class.getName()); public static MerchantPriceConfigTable getInstance() { return SingletonHolder._instance; } private static final String MPCS_FILE = "MerchantPriceConfig.xml"; private final Map _mpcs = new FastMap<>(); private MerchantPriceConfig _defaultMpc; public MerchantPriceConfig getMerchantPriceConfig(L2MerchantInstance npc) { for (MerchantPriceConfig mpc : _mpcs.values()) { if ((npc.getWorldRegion() != null) && npc.getWorldRegion().containsZone(mpc.getZoneId())) { return mpc; } } return _defaultMpc; } public MerchantPriceConfig getMerchantPriceConfig(int id) { return _mpcs.get(id); } public void loadXML() throws SAXException, IOException, ParserConfigurationException { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setValidating(false); factory.setIgnoringComments(true); File file = new File(Config.DATAPACK_ROOT + "/data/" + MPCS_FILE); if (file.exists()) { int defaultPriceConfigId; Document doc = factory.newDocumentBuilder().parse(file); Node n = doc.getDocumentElement(); Node dpcNode = n.getAttributes().getNamedItem("defaultPriceConfig"); if (dpcNode == null) { throw new IllegalStateException("merchantPriceConfig must define an 'defaultPriceConfig'"); } defaultPriceConfigId = Integer.parseInt(dpcNode.getNodeValue()); MerchantPriceConfig mpc; for (n = n.getFirstChild(); n != null; n = n.getNextSibling()) { mpc = parseMerchantPriceConfig(n); if (mpc != null) { _mpcs.put(mpc.getId(), mpc); } } MerchantPriceConfig defaultMpc = this.getMerchantPriceConfig(defaultPriceConfigId); if (defaultMpc == null) { throw new IllegalStateException("'defaultPriceConfig' points to an non-loaded priceConfig"); } _defaultMpc = defaultMpc; } } private MerchantPriceConfig parseMerchantPriceConfig(Node n) { if (n.getNodeName().equals("priceConfig")) { final int id; final int baseTax; int castleId = -1; int zoneId = -1; final String name; Node node = n.getAttributes().getNamedItem("id"); if (node == null) { throw new IllegalStateException("Must define the priceConfig 'id'"); } id = Integer.parseInt(node.getNodeValue()); node = n.getAttributes().getNamedItem("name"); if (node == null) { throw new IllegalStateException("Must define the priceConfig 'name'"); } name = node.getNodeValue(); node = n.getAttributes().getNamedItem("baseTax"); if (node == null) { throw new IllegalStateException("Must define the priceConfig 'baseTax'"); } baseTax = Integer.parseInt(node.getNodeValue()); node = n.getAttributes().getNamedItem("castleId"); if (node != null) { castleId = Integer.parseInt(node.getNodeValue()); } node = n.getAttributes().getNamedItem("zoneId"); if (node != null) { zoneId = Integer.parseInt(node.getNodeValue()); } return new MerchantPriceConfig(id, name, baseTax, castleId, zoneId); } return null; } @Override public void loadInstances() { try { loadXML(); _log.info(getClass().getSimpleName() + ": Loaded " + _mpcs.size() + " merchant price configs."); } catch (Exception e) { _log.log(Level.SEVERE, getClass().getSimpleName() + ": Failed loading MerchantPriceConfigTable. Reason: " + e.getMessage(), e); } } @Override public void updateReferences() { for (final MerchantPriceConfig mpc : _mpcs.values()) { mpc.updateReferences(); } } @Override public void activateInstances() { } /** * @author KenM */ public static final class MerchantPriceConfig { private final int _id; private final String _name; private final int _baseTax; private final int _castleId; private Castle _castle; private final int _zoneId; public MerchantPriceConfig(final int id, final String name, final int baseTax, final int castleId, final int zoneId) { _id = id; _name = name; _baseTax = baseTax; _castleId = castleId; _zoneId = zoneId; } /** * @return Returns the id. */ public int getId() { return _id; } /** * @return Returns the name. */ public String getName() { return _name; } /** * @return Returns the baseTax. */ public int getBaseTax() { return _baseTax; } /** * @return Returns the baseTax / 100.0. */ public double getBaseTaxRate() { return _baseTax / 100.0; } /** * @return Returns the castle. */ public Castle getCastle() { return _castle; } /** * @return Returns the zoneId. */ public int getZoneId() { return _zoneId; } public boolean hasCastle() { return getCastle() != null; } public double getCastleTaxRate() { return hasCastle() ? getCastle().getTaxRate() : 0.0; } public int getTotalTax() { return hasCastle() ? (getCastle().getTaxPercent() + getBaseTax()) : getBaseTax(); } public double getTotalTaxRate() { return getTotalTax() / 100.0; } public void updateReferences() { if (_castleId > 0) { _castle = CastleManager.getInstance().getCastleById(_castleId); } } } private static class SingletonHolder { protected static final MerchantPriceConfigTable _instance = new MerchantPriceConfigTable(); } }