294 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			294 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| /*
 | |
|  * 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 <http://www.gnu.org/licenses/>.
 | |
|  */
 | |
| 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
 | |
| {
 | |
| 	// Zoey76: TODO: Implement using IXmlReader.
 | |
| 	private static Logger LOGGER = Logger.getLogger(MerchantPriceConfigTable.class.getName());
 | |
| 	
 | |
| 	public static MerchantPriceConfigTable getInstance()
 | |
| 	{
 | |
| 		return SingletonHolder._instance;
 | |
| 	}
 | |
| 	
 | |
| 	private static final String MPCS_FILE = "MerchantPriceConfig.xml";
 | |
| 	
 | |
| 	private final Map<Integer, MerchantPriceConfig> _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();
 | |
| 			LOGGER.info(getClass().getSimpleName() + ": Loaded " + _mpcs.size() + " merchant price configs.");
 | |
| 		}
 | |
| 		catch (Exception e)
 | |
| 		{
 | |
| 			LOGGER.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();
 | |
| 	}
 | |
| }
 | 
