Ver código fonte

BETA: Misc fixes:
* Added parseDatapackFile(String) to avoid useless imports.
* Instead of using a boolean the getClassCode() method has been split in two different methods.
* InstanceManager now extends DocumentParser.
* MapRegionManager now extends DocumentParser.
* Reverting [5246], using escaped string in proper places.
* Fixing [http://www.l2jserver.com/forum/viewtopic.php?f=81&t=25148 L2VillageMasterInstance], retail has the class names in links hardcoded, we have them partially hardcoded...
* Avoiding Javolution (FastList and FastMap) where synchronization is not required.

Zoey76 13 anos atrás
pai
commit
f6ea003acd
17 arquivos alterados com 392 adições e 273 exclusões
  1. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/communitybbs/Manager/RegionBBSManager.java
  2. 1 3
      L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/ClassListData.java
  3. 1 3
      L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/ExperienceTable.java
  4. 1 3
      L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/HennaData.java
  5. 1 3
      L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/HitConditionBonus.java
  6. 1 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/InitialEquipmentData.java
  7. 1 3
      L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/StaticObjects.java
  8. 21 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/engines/DocumentParser.java
  9. 128 65
      L2J_Server_BETA/java/com/l2jserver/gameserver/instancemanager/InstanceManager.java
  10. 164 149
      L2J_Server_BETA/java/com/l2jserver/gameserver/instancemanager/MapRegionManager.java
  11. 35 10
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2MapRegion.java
  12. 9 12
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2ClassMasterInstance.java
  13. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
  14. 10 10
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2VillageMasterInstance.java
  15. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/templates/L2PcTemplate.java
  16. 14 5
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/base/ClassInfo.java
  17. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/Hero.java

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/communitybbs/Manager/RegionBBSManager.java

@@ -132,7 +132,7 @@ public class RegionBBSManager extends BaseBBSManager
 			else if (player.getLevel() >= 20)
 				levelApprox = "medium";
 			
-			StringUtil.append(htmlCode, "<table border=0><tr><td>", player.getName(), " (", sex, " ", ClassListData.getInstance().getClass(player.getClassId()).getClassName(true), "):</td></tr>"
+			StringUtil.append(htmlCode, "<table border=0><tr><td>", player.getName(), " (", sex, " ", ClassListData.getInstance().getClass(player.getClassId()).getClientCode(), "):</td></tr>"
 					+ "<tr><td>Level: ", levelApprox, "</td></tr>" + "<tr><td><br></td></tr>");
 			
 			if (activeChar != null

+ 1 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/ClassListData.java

@@ -14,7 +14,6 @@
  */
 package com.l2jserver.gameserver.datatables;
 
-import java.io.File;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -22,7 +21,6 @@ import org.w3c.dom.Document;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
 
-import com.l2jserver.Config;
 import com.l2jserver.gameserver.engines.DocumentParser;
 import com.l2jserver.gameserver.model.base.ClassId;
 import com.l2jserver.gameserver.model.base.ClassInfo;
@@ -39,7 +37,7 @@ public final class ClassListData extends DocumentParser
 	private ClassListData()
 	{
 		_classData.clear();
-		parseFile(new File(Config.DATAPACK_ROOT, "data/stats/chars/classList.xml"));
+		parseDatapackFile("data/stats/chars/classList.xml");
 		_log.info(getClass().getSimpleName() + ": Loaded " + _classData.size() + " Class data.");
 	}
 	

+ 1 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/ExperienceTable.java

@@ -14,7 +14,6 @@
  */
 package com.l2jserver.gameserver.datatables;
 
-import java.io.File;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -22,7 +21,6 @@ import org.w3c.dom.Document;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
 
-import com.l2jserver.Config;
 import com.l2jserver.gameserver.engines.DocumentParser;
 
 /**
@@ -39,7 +37,7 @@ public final class ExperienceTable extends DocumentParser
 	private ExperienceTable()
 	{
 		_expTable.clear();
-		parseFile(new File(Config.DATAPACK_ROOT, "data/stats/experience.xml"));
+		parseDatapackFile("data/stats/experience.xml");
 		_log.info(getClass().getSimpleName() + ": Loaded " + _expTable.size() + " levels.");
 		_log.info(getClass().getSimpleName() + ": Max Player Level is: " + (MAX_LEVEL - 1));
 		_log.info(getClass().getSimpleName() + ": Max Pet Level is: " + (MAX_PET_LEVEL - 1));

+ 1 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/HennaData.java

@@ -14,7 +14,6 @@
  */
 package com.l2jserver.gameserver.datatables;
 
-import java.io.File;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -24,7 +23,6 @@ import org.w3c.dom.Document;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
 
-import com.l2jserver.Config;
 import com.l2jserver.gameserver.engines.DocumentParser;
 import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.base.ClassId;
@@ -44,7 +42,7 @@ public final class HennaData extends DocumentParser
 	private HennaData()
 	{
 		_hennaList.clear();
-		parseFile(new File(Config.DATAPACK_ROOT, "data/stats/hennaList.xml"));
+		parseDatapackFile("data/stats/hennaList.xml");
 		_log.info(getClass().getSimpleName() + ": Loaded " + _hennaList.size() + " Henna data.");
 	}
 	

+ 1 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/HitConditionBonus.java

@@ -14,8 +14,6 @@
  */
 package com.l2jserver.gameserver.datatables;
 
-import java.io.File;
-
 import org.w3c.dom.Document;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
@@ -41,7 +39,7 @@ public final class HitConditionBonus extends DocumentParser
 	
 	private HitConditionBonus()
 	{
-		parseFile(new File(Config.DATAPACK_ROOT, "data/stats/hitConditionBonus.xml"));
+		parseDatapackFile("data/stats/hitConditionBonus.xml");
 		_log.info(getClass().getSimpleName() + ": Loaded Hit Condition bonuses.");
 		if (Config.DEBUG)
 		{

+ 1 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/InitialEquipmentData.java

@@ -14,7 +14,6 @@
  */
 package com.l2jserver.gameserver.datatables;
 
-import java.io.File;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -44,7 +43,7 @@ public final class InitialEquipmentData extends DocumentParser
 	private InitialEquipmentData()
 	{
 		_initialEquipmentList.clear();
-		parseFile(new File(Config.DATAPACK_ROOT, Config.INITIAL_EQUIPMENT_EVENT ? filePathEvent : filePathNormal));
+		parseDatapackFile(Config.INITIAL_EQUIPMENT_EVENT ? filePathEvent : filePathNormal);
 		_log.info(getClass().getSimpleName() + ": Loaded " + _initialEquipmentList.size() + " Initial Equipment data.");
 	}
 	

+ 1 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/StaticObjects.java

@@ -14,7 +14,6 @@
  */
 package com.l2jserver.gameserver.datatables;
 
-import java.io.File;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
@@ -23,7 +22,6 @@ import org.w3c.dom.Document;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
 
-import com.l2jserver.Config;
 import com.l2jserver.gameserver.engines.DocumentParser;
 import com.l2jserver.gameserver.idfactory.IdFactory;
 import com.l2jserver.gameserver.model.StatsSet;
@@ -41,7 +39,7 @@ public final class StaticObjects extends DocumentParser
 	private StaticObjects()
 	{
 		_staticObjects.clear();
-		parseFile(new File(Config.DATAPACK_ROOT, "data/staticObjects.xml"));
+		parseDatapackFile("data/staticObjects.xml");
 		_log.info("StaticObject: Loaded " + _staticObjects.size() + " StaticObject Templates.");
 	}
 	

+ 21 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/engines/DocumentParser.java

@@ -26,6 +26,7 @@ import org.w3c.dom.Node;
 import org.xml.sax.ErrorHandler;
 import org.xml.sax.SAXParseException;
 
+import com.l2jserver.Config;
 import com.l2jserver.util.file.filter.XMLFilter;
 
 /**
@@ -42,6 +43,15 @@ public abstract class DocumentParser
 	
 	private static final XMLFilter xmlFilter = new XMLFilter();
 	
+	/**
+	 * Wrapper for {@link #parseFile(File)} method.
+	 * @param path the relative path to the datapack root of the XML file to parse.
+	 */
+	protected void parseDatapackFile(String path)
+	{
+		parseFile(new File(Config.DATAPACK_ROOT, path));
+	}
+	
 	/**
 	 * Parses a single XML file.<br>
 	 * If the file was successfully parsed, call {@link #parseDocument(Document)} for the parsed document.
@@ -162,6 +172,17 @@ public abstract class DocumentParser
 		return Long.valueOf(n.getNamedItem(name).getNodeValue());
 	}
 	
+	/**
+	 * @param n the named node map.
+	 * @param name the attribute name.
+	 * @return {@code true} if the attribute exists and it's value is {@code true}, {@code false} otherwise.
+	 */
+	protected static boolean parseBoolean(NamedNodeMap n, String name)
+	{
+		final Node b = n.getNamedItem(name);
+		return (b != null) && Boolean.parseBoolean(b.getNodeValue());
+	}
+	
 	/**
 	 * Simple XML error handler.
 	 * @author Zoey76

+ 128 - 65
L2J_Server_BETA/java/com/l2jserver/gameserver/instancemanager/InstanceManager.java

@@ -14,68 +14,91 @@
  */
 package com.l2jserver.gameserver.instancemanager;
 
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.InputStream;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
+import java.util.HashMap;
 import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
-import javolution.io.UTF8StreamReader;
 import javolution.util.FastList;
 import javolution.util.FastMap;
-import javolution.xml.stream.XMLStreamConstants;
-import javolution.xml.stream.XMLStreamException;
-import javolution.xml.stream.XMLStreamReaderImpl;
 
-import com.l2jserver.Config;
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
 import com.l2jserver.L2DatabaseFactory;
+import com.l2jserver.gameserver.engines.DocumentParser;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.entity.Instance;
 
-
 /**
  * @author evill33t, GodKratos
- * 
  */
-public class InstanceManager
+public class InstanceManager extends DocumentParser
 {
-	private final static Logger _log = Logger.getLogger(InstanceManager.class.getName());
-	private FastMap<Integer, Instance> _instanceList = new FastMap<Integer, Instance>();
-	private FastMap<Integer, InstanceWorld> _instanceWorlds = new FastMap<Integer, InstanceWorld>();
+	private static final FastMap<Integer, Instance> _instanceList = new FastMap<>();
+	private final FastMap<Integer, InstanceWorld> _instanceWorlds = new FastMap<>();
 	private int _dynamic = 300000;
 	
 	// InstanceId Names
-	private final static Map<Integer, String> _instanceIdNames = new FastMap<Integer, String>();
-	private Map<Integer,Map<Integer,Long>> _playerInstanceTimes = new FastMap<Integer, Map<Integer,Long>>();
+	private final static Map<Integer, String> _instanceIdNames = new HashMap<>();
+	private final Map<Integer, Map<Integer, Long>> _playerInstanceTimes = new FastMap<>();
 	
 	private static final String ADD_INSTANCE_TIME = "INSERT INTO character_instance_time (charId,instanceId,time) values (?,?,?) ON DUPLICATE KEY UPDATE time=?";
 	private static final String RESTORE_INSTANCE_TIMES = "SELECT instanceId,time FROM character_instance_time WHERE charId=?";
 	private static final String DELETE_INSTANCE_TIME = "DELETE FROM character_instance_time WHERE charId=? AND instanceId=?";
 	
+	private InstanceManager()
+	{
+		_instanceIdNames.clear();
+		parseDatapackFile("data/instancenames.xml");
+		_log.info(getClass().getSimpleName() + ": Loaded " + _instanceIdNames.size() + " instance names.");
+		createWorld();
+	}
+	
+	/**
+	 * @param playerObjId
+	 * @param id
+	 * @return
+	 */
 	public long getInstanceTime(int playerObjId, int id)
 	{
 		if (!_playerInstanceTimes.containsKey(playerObjId))
+		{
 			restoreInstanceTimes(playerObjId);
+		}
 		if (_playerInstanceTimes.get(playerObjId).containsKey(id))
+		{
 			return _playerInstanceTimes.get(playerObjId).get(id);
+		}
 		return -1;
 	}
 	
-	public Map<Integer,Long> getAllInstanceTimes(int playerObjId)
+	/**
+	 * @param playerObjId
+	 * @return
+	 */
+	public Map<Integer, Long> getAllInstanceTimes(int playerObjId)
 	{
 		if (!_playerInstanceTimes.containsKey(playerObjId))
+		{
 			restoreInstanceTimes(playerObjId);
+		}
 		return _playerInstanceTimes.get(playerObjId);
 	}
 	
+	/**
+	 * @param playerObjId
+	 * @param id
+	 * @param time
+	 */
 	public void setInstanceTime(int playerObjId, int id, long time)
 	{
 		if (!_playerInstanceTimes.containsKey(playerObjId))
+		{
 			restoreInstanceTimes(playerObjId);
+		}
 		Connection con = null;
 		try
 		{
@@ -91,7 +114,7 @@ public class InstanceManager
 		}
 		catch (Exception e)
 		{
-			_log.log(Level.WARNING, "Could not insert character instance time data: "+ e.getMessage(), e); 
+			_log.warning(getClass().getSimpleName() + ": Could not insert character instance time data: " + e.getMessage());
 		}
 		finally
 		{
@@ -99,6 +122,10 @@ public class InstanceManager
 		}
 	}
 	
+	/**
+	 * @param playerObjId
+	 * @param id
+	 */
 	public void deleteInstanceTime(int playerObjId, int id)
 	{
 		Connection con = null;
@@ -114,7 +141,7 @@ public class InstanceManager
 		}
 		catch (Exception e)
 		{
-			_log.log(Level.WARNING, "Could not delete character instance time data: "+ e.getMessage(), e);
+			_log.warning(getClass().getSimpleName() + ": Could not delete character instance time data: " + e.getMessage());
 		}
 		finally
 		{
@@ -122,10 +149,15 @@ public class InstanceManager
 		}
 	}
 	
+	/**
+	 * @param playerObjId
+	 */
 	public void restoreInstanceTimes(int playerObjId)
 	{
 		if (_playerInstanceTimes.containsKey(playerObjId))
+		{
 			return; // already restored
+		}
 		_playerInstanceTimes.put(playerObjId, new FastMap<Integer, Long>());
 		Connection con = null;
 		try
@@ -140,9 +172,13 @@ public class InstanceManager
 				int id = rset.getInt("instanceId");
 				long time = rset.getLong("time");
 				if (time < System.currentTimeMillis())
+				{
 					deleteInstanceTime(playerObjId, id);
+				}
 				else
+				{
 					_playerInstanceTimes.get(playerObjId).put(id, time);
+				}
 			}
 			
 			rset.close();
@@ -150,7 +186,7 @@ public class InstanceManager
 		}
 		catch (Exception e)
 		{
-			_log.log(Level.WARNING, "Could not delete character instance time data: "+ e.getMessage(), e);
+			_log.warning(getClass().getSimpleName() + ": Could not delete character instance time data: " + e.getMessage());
 		}
 		finally
 		{
@@ -158,52 +194,37 @@ public class InstanceManager
 		}
 	}
 	
+	/**
+	 * @param id
+	 * @return
+	 */
 	public String getInstanceIdName(int id)
 	{
 		if (_instanceIdNames.containsKey(id))
+		{
 			return _instanceIdNames.get(id);
+		}
 		return ("UnknownInstance");
 	}
 	
-	private void loadInstanceNames()
+	@Override
+	protected void parseDocument(Document doc)
 	{
-		InputStream in = null;
-		try
+		for (Node n = doc.getFirstChild(); n != null; n = n.getNextSibling())
 		{
-			in = new FileInputStream(Config.DATAPACK_ROOT + "/data/instancenames.xml");
-			XMLStreamReaderImpl xpp = new XMLStreamReaderImpl();
-			xpp.setInput(new UTF8StreamReader().setInput(in));
-			for (int e = xpp.getEventType(); e != XMLStreamConstants.END_DOCUMENT; e = xpp.next())
+			if ("list".equals(n.getNodeName()))
 			{
-				if (e == XMLStreamConstants.START_ELEMENT)
+				NamedNodeMap attrs;
+				for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
 				{
-					if (xpp.getLocalName().toString().equals("instance"))
+					if ("instance".equals(d.getNodeName()))
 					{
-						Integer id = Integer.valueOf(xpp.getAttributeValue(null, "id").toString());
-						String name = xpp.getAttributeValue(null, "name").toString();
-						_instanceIdNames.put(id, name);
+						attrs = d.getAttributes();
+						_instanceIdNames.put(parseInteger(attrs, "id"), attrs.getNamedItem("name").getNodeValue());
 					}
 				}
 			}
 		}
-		catch (FileNotFoundException e)
-		{
-			_log.warning("instancenames.xml could not be loaded: file not found");
-		}
-		catch (XMLStreamException xppe)
-		{
-			_log.log(Level.WARNING, "Error while loading instance names: " + xppe.getMessage(), xppe);
-		}
-		finally
-		{
-			try
-			{
-				in.close();
-			}
-			catch (Exception e)
-			{
-			}
-		}
 	}
 	
 	public static class InstanceWorld
@@ -214,42 +235,44 @@ public class InstanceManager
 		public volatile int status;
 	}
 	
+	/**
+	 * @param world
+	 */
 	public void addWorld(InstanceWorld world)
 	{
 		_instanceWorlds.put(world.instanceId, world);
 	}
 	
+	/**
+	 * @param instanceId
+	 * @return
+	 */
 	public InstanceWorld getWorld(int instanceId)
 	{
 		return _instanceWorlds.get(instanceId);
 	}
 	
+	/**
+	 * @param player
+	 * @return
+	 */
 	public InstanceWorld getPlayerWorld(L2PcInstance player)
 	{
 		for (InstanceWorld temp : _instanceWorlds.values())
 		{
 			if (temp == null)
+			{
 				continue;
+			}
 			// check if the player have a World Instance where he/she is allowed to enter
 			if (temp.allowed.contains(player.getObjectId()))
+			{
 				return temp;
+			}
 		}
 		return null;
 	}
 	
-	private InstanceManager()
-	{
-		_log.info("Initializing InstanceManager");
-		loadInstanceNames();
-		_log.info("Loaded " + _instanceIdNames.size() + " instance names");
-		createWorld();
-	}
-	
-	public static final InstanceManager getInstance()
-	{
-		return SingletonHolder._instance;
-	}
-	
 	private void createWorld()
 	{
 		Instance themultiverse = new Instance(-1);
@@ -263,10 +286,15 @@ public class InstanceManager
 		_log.info("Universe Instance created");
 	}
 	
+	/**
+	 * @param instanceid
+	 */
 	public void destroyInstance(int instanceid)
 	{
 		if (instanceid <= 0)
+		{
 			return;
+		}
 		Instance temp = _instanceList.get(instanceid);
 		if (temp != null)
 		{
@@ -276,48 +304,78 @@ public class InstanceManager
 			temp.cancelTimer();
 			_instanceList.remove(instanceid);
 			if (_instanceWorlds.containsKey(instanceid))
+			{
 				_instanceWorlds.remove(instanceid);
+			}
 		}
 	}
 	
+	/**
+	 * @param instanceid
+	 * @return
+	 */
 	public Instance getInstance(int instanceid)
 	{
 		return _instanceList.get(instanceid);
 	}
 	
+	/**
+	 * @return
+	 */
 	public FastMap<Integer, Instance> getInstances()
 	{
 		return _instanceList;
 	}
 	
+	/**
+	 * @param objectId
+	 * @return
+	 */
 	public int getPlayerInstance(int objectId)
 	{
 		for (Instance temp : _instanceList.values())
 		{
 			if (temp == null)
+			{
 				continue;
+			}
 			// check if the player is in any active instance
 			if (temp.containsPlayer(objectId))
+			{
 				return temp.getId();
+			}
 		}
 		// 0 is default instance aka the world
 		return 0;
 	}
 	
+	/**
+	 * @param id
+	 * @return
+	 */
 	public boolean createInstance(int id)
 	{
 		if (getInstance(id) != null)
+		{
 			return false;
+		}
 		
 		Instance instance = new Instance(id);
 		_instanceList.put(id, instance);
 		return true;
 	}
 	
+	/**
+	 * @param id
+	 * @param template
+	 * @return
+	 */
 	public boolean createInstanceFromTemplate(int id, String template)
 	{
 		if (getInstance(id) != null)
+		{
 			return false;
+		}
 		
 		Instance instance = new Instance(id);
 		_instanceList.put(id, instance);
@@ -351,6 +409,11 @@ public class InstanceManager
 		return _dynamic;
 	}
 	
+	public static final InstanceManager getInstance()
+	{
+		return SingletonHolder._instance;
+	}
+	
 	@SuppressWarnings("synthetic-access")
 	private static class SingletonHolder
 	{

+ 164 - 149
L2J_Server_BETA/java/com/l2jserver/gameserver/instancemanager/MapRegionManager.java

@@ -15,14 +15,9 @@
 package com.l2jserver.gameserver.instancemanager;
 
 import java.io.File;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import javax.xml.parsers.DocumentBuilderFactory;
-
-import javolution.util.FastMap;
 
 import org.w3c.dom.Document;
 import org.w3c.dom.NamedNodeMap;
@@ -30,6 +25,7 @@ import org.w3c.dom.Node;
 
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.SevenSigns;
+import com.l2jserver.gameserver.engines.DocumentParser;
 import com.l2jserver.gameserver.model.L2MapRegion;
 import com.l2jserver.gameserver.model.L2Object;
 import com.l2jserver.gameserver.model.Location;
@@ -44,15 +40,14 @@ import com.l2jserver.gameserver.model.entity.Instance;
 import com.l2jserver.gameserver.model.entity.clanhall.SiegableHall;
 import com.l2jserver.gameserver.model.zone.type.L2ClanHallZone;
 import com.l2jserver.gameserver.model.zone.type.L2RespawnZone;
-import com.l2jserver.gameserver.util.Util;
 
 /**
  * @author Nyaran
  */
-public class MapRegionManager
+public class MapRegionManager extends DocumentParser
 {
-	protected static final Logger _log = Logger.getLogger(MapRegionManager.class.getName());
-	private static Map<String, L2MapRegion> _regions;
+	private static final Map<String, L2MapRegion> _regions = new HashMap<>();
+	private static final String defaultRespawn = "talking_island_town";
 	
 	public static enum TeleportWhereType
 	{
@@ -68,186 +63,153 @@ public class MapRegionManager
 		Territory_banish
 	}
 	
-	public static MapRegionManager getInstance()
-	{
-		return SingletonHolder._instance;
-	}
-	
 	private MapRegionManager()
 	{
-		_regions = new FastMap<String, L2MapRegion>();
-		
-		try
-		{
-			load();
-		}
-		catch (Exception e)
-		{
-			_log.log(Level.SEVERE, "Failed loading MapRegion", e);
-		}
+		_regions.clear();
+		parseDirectory(new File(Config.DATAPACK_ROOT, "data/mapregion/"));
+		_log.info(getClass().getSimpleName() + ": Loaded " + _regions.size() + " map regions.");
 	}
 	
-	private static void load()
+	@Override
+	protected void parseDocument(Document doc)
 	{
-		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-		factory.setValidating(false);
-		factory.setIgnoringComments(true);
+		NamedNodeMap attrs;
+		String name;
+		String town;
+		int locId;
+		int castle;
+		int bbs;
 		
-		for (File file : Util.getDatapackFiles("mapregion", ".xml"))
+		for (Node n = doc.getFirstChild(); n != null; n = n.getNextSibling())
 		{
-			try
+			if ("list".equalsIgnoreCase(n.getNodeName()))
 			{
-				Document doc = factory.newDocumentBuilder().parse(file);
-				for (Node n = doc.getFirstChild(); n != null; n = n.getNextSibling())
+				for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
 				{
-					if ("list".equalsIgnoreCase(n.getNodeName()))
+					if ("region".equalsIgnoreCase(d.getNodeName()))
 					{
-						for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
+						attrs = d.getAttributes();
+						name = attrs.getNamedItem("name").getNodeValue();
+						town = attrs.getNamedItem("town").getNodeValue();
+						locId = parseInt(attrs, "locId");
+						castle = parseInt(attrs, "castle");
+						bbs = parseInt(attrs, "bbs");
+						
+						L2MapRegion region = new L2MapRegion(name, town, locId, castle, bbs);
+						for (Node c = d.getFirstChild(); c != null; c = c.getNextSibling())
 						{
-							if ("region".equalsIgnoreCase(d.getNodeName()))
+							attrs = c.getAttributes();
+							if ("respawnPoint".equalsIgnoreCase(c.getNodeName()))
 							{
-								NamedNodeMap attrs = d.getAttributes();
-								Node att;
-								String name = "";
-								String town = "";
-								int locId = -1;
-								int castle = -1;
-								int bbs = -1;
+								int spawnX = parseInt(attrs, "X");
+								int spawnY = parseInt(attrs, "Y");
+								int spawnZ = parseInt(attrs, "Z");
 								
-								att = attrs.getNamedItem("name");
-								if (att == null)
-								{
-									_log.severe("Missing name for MapRegion, skipping");
-									continue;
-								}
-								name = att.getNodeValue();
+								boolean other = parseBoolean(attrs, "isOther");
+								boolean chaotic = parseBoolean(attrs, "isChaotic");
+								boolean banish = parseBoolean(attrs, "isBanish");
 								
-								att = attrs.getNamedItem("town");
-								if (att == null)
+								if (other)
 								{
-									_log.severe("Missing town for MapRegion name: " + name + ", skipping");
-									continue;
+									region.addOtherSpawn(spawnX, spawnY, spawnZ);
 								}
-								town = att.getNodeValue();
-								
-								att = attrs.getNamedItem("locId");
-								if (att == null)
+								else if (chaotic)
 								{
-									_log.severe("Missing locId for MapRegion name: " + name + ", skipping");
-									continue;
+									region.addChaoticSpawn(spawnX, spawnY, spawnZ);
 								}
-								locId = Integer.parseInt(att.getNodeValue());
-								
-								att = attrs.getNamedItem("castle");
-								if (att == null)
+								else if (banish)
 								{
-									_log.severe("Missing castle for MapRegion name: " + name + ", skipping");
-									continue;
+									region.addBanishSpawn(spawnX, spawnY, spawnZ);
 								}
-								castle = Integer.parseInt(att.getNodeValue());
-								
-								att = attrs.getNamedItem("bbs");
-								if (att == null)
+								else
 								{
-									_log.severe("Missing bbs for MapRegion name: " + name + ", skipping");
-									continue;
+									region.addSpawn(spawnX, spawnY, spawnZ);
 								}
-								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);
+							}
+							else if ("map".equalsIgnoreCase(c.getNodeName()))
+							{
+								region.addMap(parseInt(attrs, "X"), parseInt(attrs, "Y"));
+							}
+							else if ("banned".equalsIgnoreCase(c.getNodeName()))
+							{
+								region.addBannedRace(attrs.getNamedItem("race").getNodeValue(), attrs.getNamedItem("point").getNodeValue());
 							}
 						}
+						_regions.put(name, region);
 					}
 				}
 			}
-			catch (Exception e)
-			{
-				_log.severe("MapRegion file (" + file.getAbsolutePath() + ") doesnt exists.");
-			}
 		}
 	}
 	
+	/**
+	 * @param locX
+	 * @param locY
+	 * @return
+	 */
 	public final L2MapRegion getMapRegion(int locX, int locY)
 	{
 		for (L2MapRegion region : _regions.values())
 		{
 			if (region.isZoneInRegion(getMapRegionX(locX), getMapRegionY(locY)))
+			{
 				return region;
+			}
 		}
 		return null;
 	}
 	
+	/**
+	 * @param locX
+	 * @param locY
+	 * @return
+	 */
 	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);
+		if (Config.DEBUG)
+		{
+			_log.warning(getClass().getSimpleName() + ": Player outside map regions at X,Y=" + locX + "," + locY);
+		}
 		return 0;
 	}
 	
+	/**
+	 * @param obj
+	 * @return
+	 */
 	public final L2MapRegion getMapRegion(L2Object obj)
 	{
 		return getMapRegion(obj.getX(), obj.getY());
 	}
 	
+	/**
+	 * @param obj
+	 * @return
+	 */
 	public final int getMapRegionLocId(L2Object obj)
 	{
 		return getMapRegionLocId(obj.getX(), obj.getY());
 	}
 	
+	/**
+	 * @param posX
+	 * @return
+	 */
 	public final int getMapRegionX(int posX)
 	{
 		return (posX >> 15) + 9 + 11;// + centerTileX;
 	}
 	
+	/**
+	 * @param posY
+	 * @return
+	 */
 	public final int getMapRegionY(int posY)
 	{
 		return (posY >> 15) + 10 + 8;// + centerTileX;
@@ -263,21 +225,34 @@ public class MapRegionManager
 		L2MapRegion region = getMapRegion(activeChar);
 		
 		if (region == null)
+		{
 			return "Aden Castle Town";
+		}
 		
 		return region.getTown();
 	}
 	
+	/**
+	 * @param activeChar
+	 * @return
+	 */
 	public int getAreaCastle(L2Character activeChar)
 	{
 		L2MapRegion region = getMapRegion(activeChar);
 		
 		if (region == null)
+		{
 			return 0;
+		}
 		
 		return region.getCastle();
 	}
 	
+	/**
+	 * @param activeChar
+	 * @param teleportWhere
+	 * @return
+	 */
 	public Location getTeleToLocation(L2Character activeChar, TeleportWhereType teleportWhere)
 	{
 		int[] coord;
@@ -290,7 +265,7 @@ public class MapRegionManager
 			Fort fort = null;
 			ClanHall clanhall = null;
 			
-			if (player.getClan() != null && !player.isFlyingMounted() && !player.isFlying()) // flying players in gracia cant use teleports to aden continent
+			if ((player.getClan() != null) && !player.isFlyingMounted() && !player.isFlying()) // flying players in gracia cant use teleports to aden continent
 			{
 				// If teleport to clan hall
 				if (teleportWhere == TeleportWhereType.ClanHall)
@@ -299,10 +274,12 @@ public class MapRegionManager
 					if (clanhall != null)
 					{
 						L2ClanHallZone zone = clanhall.getZone();
-						if (zone != null && !player.isFlyingMounted())
+						if ((zone != null) && !player.isFlyingMounted())
 						{
 							if (player.getKarma() > 0)
+							{
 								return zone.getChaoticSpawnLoc();
+							}
 							return zone.getSpawnLoc();
 						}
 					}
@@ -317,14 +294,18 @@ public class MapRegionManager
 					if (castle == null)
 					{
 						castle = CastleManager.getInstance().getCastle(player);
-						if (!(castle != null && castle.getSiege().getIsInProgress() && castle.getSiege().getDefenderClan(player.getClan()) != null))
+						if (!((castle != null) && castle.getSiege().getIsInProgress() && (castle.getSiege().getDefenderClan(player.getClan()) != null)))
+						{
 							castle = null;
+						}
 					}
 					
-					if (castle != null && castle.getCastleId() > 0)
+					if ((castle != null) && (castle.getCastleId() > 0))
 					{
 						if (player.getKarma() > 0)
+						{
 							return castle.getCastleZone().getChaoticSpawnLoc();
+						}
 						return castle.getCastleZone().getSpawnLoc();
 					}
 				}
@@ -338,14 +319,18 @@ public class MapRegionManager
 					if (fort == null)
 					{
 						fort = FortManager.getInstance().getFort(player);
-						if (!(fort != null && fort.getSiege().getIsInProgress() && fort.getOwnerClan() == player.getClan()))
+						if (!((fort != null) && fort.getSiege().getIsInProgress() && (fort.getOwnerClan() == player.getClan())))
+						{
 							fort = null;
+						}
 					}
 					
-					if (fort != null && fort.getFortId() > 0)
+					if ((fort != null) && (fort.getFortId() > 0))
 					{
 						if (player.getKarma() > 0)
+						{
 							return fort.getFortZone().getChaoticSpawnLoc();
+						}
 						return fort.getFortZone().getSpawnLoc();
 					}
 				}
@@ -358,14 +343,16 @@ public class MapRegionManager
 					clanhall = ClanHallManager.getInstance().getNearbyAbstractHall(activeChar.getX(), activeChar.getY(), 10000);
 					L2SiegeFlagInstance tw_flag = TerritoryWarManager.getInstance().getFlagForClan(player.getClan());
 					if (tw_flag != null)
+					{
 						return new Location(tw_flag.getX(), tw_flag.getY(), tw_flag.getZ());
+					}
 					else if (castle != null)
 					{
 						if (castle.getSiege().getIsInProgress())
 						{
 							// Check if player's clan is attacker
 							List<L2Npc> flags = castle.getSiege().getFlag(player.getClan());
-							if (flags != null && !flags.isEmpty())
+							if ((flags != null) && !flags.isEmpty())
 							{
 								// Spawn to flag - Need more work to get player to the nearest flag
 								L2Npc flag = flags.get(0);
@@ -380,7 +367,7 @@ public class MapRegionManager
 						{
 							// Check if player's clan is attacker
 							List<L2Npc> flags = fort.getSiege().getFlag(player.getClan());
-							if (flags != null && !flags.isEmpty())
+							if ((flags != null) && !flags.isEmpty())
 							{
 								// Spawn to flag - Need more work to get player to the nearest flag
 								L2Npc flag = flags.get(0);
@@ -388,11 +375,11 @@ public class MapRegionManager
 							}
 						}
 					}
-					else if(clanhall != null && clanhall.isSiegableHall())
+					else if ((clanhall != null) && clanhall.isSiegableHall())
 					{
-						SiegableHall sHall = (SiegableHall)clanhall;
+						SiegableHall sHall = (SiegableHall) clanhall;
 						List<L2Npc> flags = sHall.getSiege().getFlag(player.getClan());
-						if(flags != null && !flags.isEmpty())
+						if ((flags != null) && !flags.isEmpty())
 						{
 							L2Npc flag = flags.get(0);
 							return new Location(flag.getX(), flag.getY(), flag.getZ());
@@ -405,49 +392,60 @@ public class MapRegionManager
 			{
 				castle = CastleManager.getInstance().getCastle(player);
 				if (castle != null)
+				{
 					return castle.getCastleZone().getBanishSpawnLoc();
+				}
 			}
 			else if (teleportWhere == TeleportWhereType.Fortress_banish)
 			{
 				fort = FortManager.getInstance().getFort(activeChar);
 				if (fort != null)
+				{
 					return fort.getFortZone().getBanishSpawnLoc();
+				}
 			}
 			else if (teleportWhere == TeleportWhereType.ClanHall_banish)
 			{
 				clanhall = ClanHallManager.getInstance().getClanHall(activeChar);
 				if (clanhall != null)
+				{
 					return clanhall.getZone().getBanishSpawnLoc();
+				}
 			}
 			
-			
-			//Karma player land out of city
+			// Karma player land out of city
 			if (player.getKarma() > 0)
 			{
 				try
 				{
 					L2RespawnZone zone = ZoneManager.getInstance().getZone(player, L2RespawnZone.class);
 					if (zone != null)
+					{
 						return getRestartRegion(activeChar, zone.getRespawnPoint((L2PcInstance) activeChar)).getChaoticSpawnLoc();
+					}
 					return getMapRegion(activeChar).getChaoticSpawnLoc();
 				}
 				catch (Exception e)
 				{
-					if (player.isFlyingMounted()) // prevent flying players to teleport outside of gracia
+					if (player.isFlyingMounted())
+					{
 						return _regions.get("union_base_of_kserth").getChaoticSpawnLoc();
-					return _regions.get("talking_island_town").getChaoticSpawnLoc();
+					}
+					return _regions.get(defaultRespawn).getChaoticSpawnLoc();
 				}
 			}
 			
-			//Checking if needed to be respawned in "far" town from the castle;
+			// Checking if needed to be respawned in "far" town from the castle;
 			castle = CastleManager.getInstance().getCastle(player);
 			if (castle != null)
 			{
 				if (castle.getSiege().getIsInProgress())
 				{
 					// Check if player's clan is participating
-					if ((castle.getSiege().checkIsDefender(player.getClan()) || castle.getSiege().checkIsAttacker(player.getClan())) && SevenSigns.getInstance().getSealOwner(SevenSigns.SEAL_STRIFE) == SevenSigns.CABAL_DAWN)
+					if ((castle.getSiege().checkIsDefender(player.getClan()) || castle.getSiege().checkIsAttacker(player.getClan())) && (SevenSigns.getInstance().getSealOwner(SevenSigns.SEAL_STRIFE) == SevenSigns.CABAL_DAWN))
+					{
 						return castle.getCastleZone().getOtherSpawnLoc();
+					}
 				}
 			}
 			
@@ -458,8 +456,10 @@ public class MapRegionManager
 				if (inst != null)
 				{
 					coord = inst.getSpawnLoc();
-					if (coord[0] != 0 && coord[1] != 0 && coord[2] != 0)
+					if ((coord[0] != 0) && (coord[1] != 0) && (coord[2] != 0))
+					{
 						return new Location(coord[0], coord[1], coord[2]);
+					}
 				}
 			}
 		}
@@ -469,18 +469,27 @@ public class MapRegionManager
 		{
 			L2RespawnZone zone = ZoneManager.getInstance().getZone(activeChar, L2RespawnZone.class);
 			if (zone != null)
+			{
 				return getRestartRegion(activeChar, zone.getRespawnPoint((L2PcInstance) activeChar)).getSpawnLoc();
+			}
 			return getMapRegion(activeChar).getSpawnLoc();
 		}
 		catch (Exception e)
 		{
-			// port to the Talking Island if no closest town found
+			// Port to the default respawn if no closest town found.
 			if (Config.DEBUG)
-				_log.log(Level.WARNING, "Not defined respawn point for coords loc X=" + activeChar.getX() + " Y=" + activeChar.getY() + " Z=" + activeChar.getZ());
-			return _regions.get("talking_island_town").getSpawnLoc();
+			{
+				_log.warning(getClass().getSimpleName() + ": Not defined respawn point for coords loc X=" + activeChar.getX() + " Y=" + activeChar.getY() + " Z=" + activeChar.getZ());
+			}
+			return _regions.get(defaultRespawn).getSpawnLoc();
 		}
 	}
 	
+	/**
+	 * @param activeChar
+	 * @param point
+	 * @return
+	 */
 	public L2MapRegion getRestartRegion(L2Character activeChar, String point)
 	{
 		try
@@ -489,12 +498,14 @@ public class MapRegionManager
 			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");
+			return _regions.get(defaultRespawn);
 		}
 	}
 	
@@ -507,10 +518,14 @@ public class MapRegionManager
 		return _regions.get(regionName);
 	}
 	
+	public static MapRegionManager getInstance()
+	{
+		return SingletonHolder._instance;
+	}
+	
 	@SuppressWarnings("synthetic-access")
 	private static class SingletonHolder
 	{
 		protected static final MapRegionManager _instance = new MapRegionManager();
 	}
-	
 }

+ 35 - 10
L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2MapRegion.java

@@ -15,11 +15,10 @@
 package com.l2jserver.gameserver.model;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import javolution.util.FastMap;
-
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.model.base.Race;
 import com.l2jserver.util.Rnd;
@@ -29,11 +28,11 @@ import com.l2jserver.util.Rnd;
  */
 public class L2MapRegion
 {
-	private String _name = null;
-	private String _town = null;
-	private int _locId = -1;
-	private int _castle = -1;
-	private int _bbs = -1;
+	private final String _name;
+	private final String _town;
+	private final int _locId;
+	private final int _castle;
+	private final int _bbs;
 	private List<int[]> _maps = null;
 	
 	private List<Location> _spawnLocs = null;
@@ -41,7 +40,7 @@ public class L2MapRegion
 	private List<Location> _chaoticSpawnLocs = null;
 	private List<Location> _banishSpawnLocs = null;
 	
-	private Map<Race, String> _bannedRace = new FastMap<Race, String>();
+	private final Map<Race, String> _bannedRace = new HashMap<>();
 	
 	public L2MapRegion(String name, String town, int locId, int castle, int bbs)
 	{
@@ -80,9 +79,15 @@ public class L2MapRegion
 	public final void addMap(int x, int y)
 	{
 		if (_maps == null)
+		{
 			_maps = new ArrayList<int[]>();
+		}
 		
-		_maps.add(new int[] { x, y });
+		_maps.add(new int[]
+		{
+			x,
+			y
+		});
 	}
 	
 	public final List<int[]> getMaps()
@@ -93,12 +98,16 @@ public class L2MapRegion
 	public final boolean isZoneInRegion(int x, int y)
 	{
 		if (_maps == null)
+		{
 			return false;
+		}
 		
 		for (int[] map : _maps)
 		{
-			if (map[0] == x && map[1] == y)
+			if ((map[0] == x) && (map[1] == y))
+			{
 				return true;
+			}
 		}
 		return false;
 	}
@@ -107,7 +116,9 @@ public class L2MapRegion
 	public final void addSpawn(int x, int y, int z)
 	{
 		if (_spawnLocs == null)
+		{
 			_spawnLocs = new ArrayList<Location>();
+		}
 		
 		_spawnLocs.add(new Location(x, y, z));
 	}
@@ -115,7 +126,9 @@ public class L2MapRegion
 	public final void addOtherSpawn(int x, int y, int z)
 	{
 		if (_otherSpawnLocs == null)
+		{
 			_otherSpawnLocs = new ArrayList<Location>();
+		}
 		
 		_otherSpawnLocs.add(new Location(x, y, z));
 	}
@@ -123,7 +136,9 @@ public class L2MapRegion
 	public final void addChaoticSpawn(int x, int y, int z)
 	{
 		if (_chaoticSpawnLocs == null)
+		{
 			_chaoticSpawnLocs = new ArrayList<Location>();
+		}
 		
 		_chaoticSpawnLocs.add(new Location(x, y, z));
 	}
@@ -131,7 +146,9 @@ public class L2MapRegion
 	public final void addBanishSpawn(int x, int y, int z)
 	{
 		if (_banishSpawnLocs == null)
+		{
 			_banishSpawnLocs = new ArrayList<Location>();
+		}
 		
 		_banishSpawnLocs.add(new Location(x, y, z));
 	}
@@ -144,7 +161,9 @@ public class L2MapRegion
 	public final Location getSpawnLoc()
 	{
 		if (Config.RANDOM_RESPAWN_IN_TOWN_ENABLED)
+		{
 			return _spawnLocs.get(Rnd.get(_spawnLocs.size()));
+		}
 		return _spawnLocs.get(0);
 	}
 	
@@ -153,7 +172,9 @@ public class L2MapRegion
 		if (_otherSpawnLocs != null)
 		{
 			if (Config.RANDOM_RESPAWN_IN_TOWN_ENABLED)
+			{
 				return _otherSpawnLocs.get(Rnd.get(_otherSpawnLocs.size()));
+			}
 			return _otherSpawnLocs.get(0);
 		}
 		return getSpawnLoc();
@@ -164,7 +185,9 @@ public class L2MapRegion
 		if (_chaoticSpawnLocs != null)
 		{
 			if (Config.RANDOM_RESPAWN_IN_TOWN_ENABLED)
+			{
 				return _chaoticSpawnLocs.get(Rnd.get(_chaoticSpawnLocs.size()));
+			}
 			return _chaoticSpawnLocs.get(0);
 		}
 		return getSpawnLoc();
@@ -175,7 +198,9 @@ public class L2MapRegion
 		if (_banishSpawnLocs != null)
 		{
 			if (Config.RANDOM_RESPAWN_IN_TOWN_ENABLED)
+			{
 				return _banishSpawnLocs.get(Rnd.get(_banishSpawnLocs.size()));
+			}
 			return _banishSpawnLocs.get(0);
 		}
 		return getSpawnLoc();

+ 9 - 12
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2ClassMasterInstance.java

@@ -14,8 +14,6 @@
  */
 package com.l2jserver.gameserver.model.actor.instance;
 
-import java.util.regex.Matcher;
-
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.cache.HtmCache;
 import com.l2jserver.gameserver.datatables.ClassListData;
@@ -84,9 +82,9 @@ public final class L2ClassMasterInstance extends L2MerchantInstance
 			
 			if (checkAndChangeClass(player, val))
 			{
-				NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
+				final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
 				html.setFile(player.getHtmlPrefix(), "data/html/classmaster/ok.htm");
-				html.replace("%name%", Matcher.quoteReplacement(ClassListData.getInstance().getClass(val).getClassName(true)));
+				html.replace("%name%", ClassListData.getInstance().getClass(val).getClientCode());
 				player.sendPacket(html);
 			}
 		}
@@ -244,7 +242,7 @@ public final class L2ClassMasterInstance extends L2MerchantInstance
 									"<a action=\"bypass -h npc_%objectId%_change_class ",
 									String.valueOf(cid.getId()),
 									"\">",
-									ClassListData.getInstance().getClass(cid).getClassName(true),
+									ClassListData.getInstance().getClass(cid).getClientCode(),
 									"</a><br>"
 							);
 						}
@@ -253,8 +251,8 @@ public final class L2ClassMasterInstance extends L2MerchantInstance
 					if (menu.length() > 0)
 					{
 						html.setFile(player.getHtmlPrefix(), "data/html/classmaster/template.htm");
-						html.replace("%name%", Matcher.quoteReplacement(ClassListData.getInstance().getClass(currentClassId).getClassName(true)));
-						html.replace("%menu%", Matcher.quoteReplacement(menu.toString()));
+						html.replace("%name%", ClassListData.getInstance().getClass(currentClassId).getClientCode());
+						html.replace("%menu%", menu.toString());
 					}
 					else
 					{
@@ -288,8 +286,7 @@ public final class L2ClassMasterInstance extends L2MerchantInstance
 			return;
 		
 		String msg = HtmCache.getInstance().getHtm(player.getHtmlPrefix(), "data/html/classmaster/tutorialtemplate.htm");
-		
-		msg = msg.replaceAll("%name%", Matcher.quoteReplacement(ClassListData.getInstance().getClass(currentClassId).getClassName(true)));
+		msg = msg.replaceAll("%name%", ClassListData.getInstance().getClass(currentClassId).getClientCode());
 		
 		final StringBuilder menu = new StringBuilder(100);
 		for (ClassId cid : ClassId.values())
@@ -302,14 +299,14 @@ public final class L2ClassMasterInstance extends L2MerchantInstance
 						"<a action=\"link CO",
 						String.valueOf(cid.getId()),
 						"\">",
-						ClassListData.getInstance().getClass(cid).getClassName(true),
+						ClassListData.getInstance().getClass(cid).getClientCode(),
 						"</a><br>"
 				);
 			}
 		}
 		
-		msg = msg.replaceAll("%menu%", Matcher.quoteReplacement(menu.toString()));
-		msg = msg.replace("%req_items%", Matcher.quoteReplacement(getRequiredItems(currentClassId.level()+1)));
+		msg = msg.replaceAll("%menu%", menu.toString());
+		msg = msg.replace("%req_items%", getRequiredItems(currentClassId.level() + 1));
 		player.sendPacket(new TutorialShowHtml(msg));
 	}
 	

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java

@@ -8334,7 +8334,7 @@ public final class L2PcInstance extends L2Playable
 					if (!SkillTreesData.getInstance().isSkillAllowed(this, skill))
 					{
 						Util.handleIllegalPlayerAction(this, "Player " + getName() + " has invalid skill " + skill.getName() +
-							" ("+skill.getId() + "/" + skill.getLevel() + "), class:" + ClassListData.getInstance().getClass(getClassId()).getClassName(false), 1);
+							" ("+skill.getId() + "/" + skill.getLevel() + "), class:" + ClassListData.getInstance().getClass(getClassId()).getClassName(), 1);
 						if (Config.SKILL_CHECK_REMOVE)
 							removeSkill(skill);
 					}

+ 10 - 10
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2VillageMasterInstance.java

@@ -275,9 +275,9 @@ public class L2VillageMasterInstance extends L2NpcInstance
 									"<a action=\"bypass -h npc_%objectId%_Subclass 4 ",
 									String.valueOf(subClass.ordinal()),
 									"\" msg=\"1268;",
-									ClassListData.getInstance().getClass(subClass.ordinal()).getClassName(true),
+									ClassListData.getInstance().getClass(subClass.ordinal()).getClassName(),
 									"\">",
-									ClassListData.getInstance().getClass(subClass.ordinal()).getClassName(true),
+									ClassListData.getInstance().getClass(subClass.ordinal()).getClientCode(),
 									"</a><br>");
 						}
 						html.replace("%list%", content1.toString());
@@ -312,7 +312,7 @@ public class L2VillageMasterInstance extends L2NpcInstance
 						{
 							StringUtil.append(content2,
 									"<a action=\"bypass -h npc_%objectId%_Subclass 5 0\">",
-									ClassListData.getInstance().getClass(player.getBaseClass()).getClassName(true),
+									ClassListData.getInstance().getClass(player.getBaseClass()).getClientCode(),
 									"</a><br>");
 						}
 						
@@ -325,7 +325,7 @@ public class L2VillageMasterInstance extends L2NpcInstance
 										"<a action=\"bypass -h npc_%objectId%_Subclass 5 ",
 										String.valueOf(subClass.getClassIndex()),
 										"\">",
-										ClassListData.getInstance().getClass(subClass.getClassId()).getClassName(true),
+										ClassListData.getInstance().getClass(subClass.getClassId()).getClientCode(),
 										"</a><br>");
 							}
 						}
@@ -364,7 +364,7 @@ public class L2VillageMasterInstance extends L2NpcInstance
 									"<a action=\"bypass -h npc_%objectId%_Subclass 6 ",
 									String.valueOf(subClass.getClassIndex()),
 									"\">",
-									ClassListData.getInstance().getClass(subClass.getClassId()).getClassName(true),
+									ClassListData.getInstance().getClass(subClass.getClassId()).getClientCode(),
 									"</a><br>");
 						}
 						html.replace("%list%", content3.toString());
@@ -374,17 +374,17 @@ public class L2VillageMasterInstance extends L2NpcInstance
 						// retail html contain only 3 subclasses
 						html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_Modify.htm");
 						if (player.getSubClasses().containsKey(1))
-							html.replace("%sub1%", ClassListData.getInstance().getClass(player.getSubClasses().get(1).getClassId()).getClassName(true));
+							html.replace("%sub1%", ClassListData.getInstance().getClass(player.getSubClasses().get(1).getClassId()).getClientCode());
 						else
 							html.replace("<a action=\"bypass -h npc_%objectId%_Subclass 6 1\">%sub1%</a><br>", "");
 						
 						if (player.getSubClasses().containsKey(2))
-							html.replace("%sub2%", ClassListData.getInstance().getClass(player.getSubClasses().get(2).getClassId()).getClassName(true));
+							html.replace("%sub2%", ClassListData.getInstance().getClass(player.getSubClasses().get(2).getClassId()).getClientCode());
 						else
 							html.replace("<a action=\"bypass -h npc_%objectId%_Subclass 6 2\">%sub2%</a><br>", "");
 						
 						if (player.getSubClasses().containsKey(3))
-							html.replace("%sub3%", ClassListData.getInstance().getClass(player.getSubClasses().get(3).getClassId()).getClassName(true));
+							html.replace("%sub3%", ClassListData.getInstance().getClass(player.getSubClasses().get(3).getClassId()).getClientCode());
 						else
 							html.replace("<a action=\"bypass -h npc_%objectId%_Subclass 6 3\">%sub3%</a><br>", "");
 					}
@@ -512,7 +512,7 @@ public class L2VillageMasterInstance extends L2NpcInstance
 								String.valueOf(subClass.ordinal()),
 								"\" msg=\"1445;",
 								"\">",
-								ClassListData.getInstance().getClass(subClass.ordinal()).getClassName(true),
+								ClassListData.getInstance().getClass(subClass.ordinal()).getClientCode(),
 								"</a><br>");
 					}
 					
@@ -555,7 +555,7 @@ public class L2VillageMasterInstance extends L2NpcInstance
 						player.setActiveClass(paramOne);
 						
 						html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_ModifyOk.htm");
-						html.replace("%name%", ClassListData.getInstance().getClass(paramTwo).getClassName(true));
+						html.replace("%name%", ClassListData.getInstance().getClass(paramTwo).getClientCode());
 						
 						player.sendPacket(SystemMessageId.ADD_NEW_SUBCLASS); // Subclass added.
 					}

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/templates/L2PcTemplate.java

@@ -101,7 +101,7 @@ public class L2PcTemplate extends L2CharTemplate
 	
 	/**
 	 * @return the template server side class name.
-	 * @deprecated replaced by {@link ClassInfo#getClassName(boolean)}
+	 * @deprecated replaced by {@link ClassInfo#getClassName()}
 	 */
 	@Deprecated
 	public String getClassName()

+ 14 - 5
L2J_Server_BETA/java/com/l2jserver/gameserver/model/base/ClassInfo.java

@@ -14,6 +14,8 @@
  */
 package com.l2jserver.gameserver.model.base;
 
+import java.util.regex.Matcher;
+
 /**
  * This class will hold the information of the player classes.
  * @author Zoey76
@@ -49,12 +51,11 @@ public final class ClassInfo
 	}
 	
 	/**
-	 * @param displayClientName if {@code true} the code to display the client side name will be returned, <b>HTMLs only</b>.
-	 * @return the in-game class name.
+	 * @return the hardcoded in-game class name.
 	 */
-	public String getClassName(boolean displayClientName)
+	public String getClassName()
 	{
-		return displayClientName ? getClassClientCode() : _className;
+		return _className;
 	}
 	
 	/**
@@ -81,11 +82,19 @@ public final class ClassInfo
 	/**
 	 * @return the class client Id formatted to be displayed on a HTML.
 	 */
-	private String getClassClientCode()
+	public String getClientCode()
 	{
 		return "&$" + getClassClientId() + ";";
 	}
 	
+	/**
+	 * @return the escaped class client Id formatted to be displayed on a HTML.
+	 */
+	public String getEscapedClientCode()
+	{
+		return Matcher.quoteReplacement(getClientCode());
+	}
+	
 	/**
 	 * @return the server side class name.
 	 */

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/Hero.java

@@ -390,7 +390,7 @@ public class Hero
 				if (charId == charOneId)
 				{
 					String name = CharNameTable.getInstance().getNameById(charTwoId);
-					String cls = ClassListData.getInstance().getClass(charTwoClass).getClassName(true);
+					String cls = ClassListData.getInstance().getClass(charTwoClass).getClientCode();
 					if(name != null && cls != null)
 					{
 						StatsSet fight = new StatsSet();
@@ -426,7 +426,7 @@ public class Hero
 				else if (charId == charTwoId)
 				{
 					String name = CharNameTable.getInstance().getNameById(charOneId);
-					String cls = ClassListData.getInstance().getClass(charOneClass).getClassName(true);
+					String cls = ClassListData.getInstance().getClass(charOneClass).getClientCode();
 					if(name != null && cls != null)
 					{
 						StatsSet fight = new StatsSet();