Browse Source

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 năm trước cách đây
mục cha
commit
f6ea003acd
17 tập tin đã thay đổi với 392 bổ sung273 xóa
  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();