2
0
Эх сурвалжийг харах

BETA: Reworks:
* EngineInterface cleanup.
* WalkingManager now extends DocumentParser.
* Replaced Javolution where synchronization is not required.
* TODO: Merge with NpcWalkerRoutesData.
* TODO: Remove checks made by XSD.
* Added new method to DocumentParser to parse booleans.
* Separated logic from data loading in RecipeController.
* Data is now loaded in RecipeData which extends DocumentParser.
* TODO: Remove checks made by XSD.
* NpcWalkerRoutesTable renamed to NpcWalkerRoutesData, now extends DocumentParser.
* TODO: Remove checks made by XSD.

Zoey76 13 жил өмнө
parent
commit
70f23e319e
17 өөрчлөгдсөн 263 нэмэгдсэн , 637 устгасан
  1. 4 3
      L2J_Server_BETA/java/com/l2jserver/gameserver/GameServer.java
  2. 22 259
      L2J_Server_BETA/java/com/l2jserver/gameserver/RecipeController.java
  3. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/ai/L2NpcWalkerAI.java
  4. 131 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/NpcWalkerRoutesData.java
  5. 0 153
      L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/NpcWalkerRoutesTable.java
  6. 11 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/engines/DocumentParser.java
  7. 71 131
      L2J_Server_BETA/java/com/l2jserver/gameserver/instancemanager/WalkingManager.java
  8. 2 4
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2ManufactureItem.java
  9. 1 5
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2RecipeStatInstance.java
  10. 0 12
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2WalkRoute.java
  11. 3 3
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
  12. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestRecipeBookDestroy.java
  13. 3 4
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestRecipeShopListSet.java
  14. 2 7
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/RecipeItemMakeInfo.java
  15. 5 5
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/SortedWareHouseWithdrawalList.java
  16. 0 44
      L2J_Server_BETA/java/com/l2jserver/gameserver/script/EngineInterface.java
  17. 4 3
      L2J_Server_BETA/java/com/l2jserver/gameserver/script/faenor/FaenorInterface.java

+ 4 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/GameServer.java

@@ -61,9 +61,10 @@ import com.l2jserver.gameserver.datatables.MerchantPriceConfigTable;
 import com.l2jserver.gameserver.datatables.MultiSell;
 import com.l2jserver.gameserver.datatables.MultiSell;
 import com.l2jserver.gameserver.datatables.NpcBufferTable;
 import com.l2jserver.gameserver.datatables.NpcBufferTable;
 import com.l2jserver.gameserver.datatables.NpcTable;
 import com.l2jserver.gameserver.datatables.NpcTable;
-import com.l2jserver.gameserver.datatables.NpcWalkerRoutesTable;
+import com.l2jserver.gameserver.datatables.NpcWalkerRoutesData;
 import com.l2jserver.gameserver.datatables.OfflineTradersTable;
 import com.l2jserver.gameserver.datatables.OfflineTradersTable;
 import com.l2jserver.gameserver.datatables.PetDataTable;
 import com.l2jserver.gameserver.datatables.PetDataTable;
+import com.l2jserver.gameserver.datatables.RecipeData;
 import com.l2jserver.gameserver.datatables.SkillTable;
 import com.l2jserver.gameserver.datatables.SkillTable;
 import com.l2jserver.gameserver.datatables.SkillTreesData;
 import com.l2jserver.gameserver.datatables.SkillTreesData;
 import com.l2jserver.gameserver.datatables.SpawnTable;
 import com.l2jserver.gameserver.datatables.SpawnTable;
@@ -226,7 +227,7 @@ public class GameServer
 		MerchantPriceConfigTable.getInstance().loadInstances();
 		MerchantPriceConfigTable.getInstance().loadInstances();
 		TradeController.getInstance();
 		TradeController.getInstance();
 		MultiSell.getInstance();
 		MultiSell.getInstance();
-		RecipeController.getInstance();
+		RecipeData.getInstance();
 		ArmorSetsData.getInstance();
 		ArmorSetsData.getInstance();
 		FishData.getInstance();
 		FishData.getInstance();
 		FishingRodsData.getInstance();
 		FishingRodsData.getInstance();
@@ -259,7 +260,7 @@ public class GameServer
 		printSection("NPCs");
 		printSection("NPCs");
 		HerbDropTable.getInstance();
 		HerbDropTable.getInstance();
 		NpcTable.getInstance();
 		NpcTable.getInstance();
-		NpcWalkerRoutesTable.getInstance();
+		NpcWalkerRoutesData.getInstance();
 		WalkingManager.getInstance();
 		WalkingManager.getInstance();
 		StaticObjects.getInstance();
 		StaticObjects.getInstance();
 		ZoneManager.getInstance();
 		ZoneManager.getInstance();

+ 22 - 259
L2J_Server_BETA/java/com/l2jserver/gameserver/RecipeController.java

@@ -14,32 +14,20 @@
  */
  */
 package com.l2jserver.gameserver;
 package com.l2jserver.gameserver;
 
 
-import java.io.File;
-import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Arrays;
 import java.util.List;
 import java.util.List;
-import java.util.Map;
-import java.util.logging.Level;
 import java.util.logging.Logger;
 import java.util.logging.Logger;
 
 
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import javolution.util.FastList;
 import javolution.util.FastMap;
 import javolution.util.FastMap;
 
 
-import org.w3c.dom.Document;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.xml.sax.SAXException;
-
 import com.l2jserver.Config;
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.datatables.ItemTable;
 import com.l2jserver.gameserver.datatables.ItemTable;
+import com.l2jserver.gameserver.datatables.RecipeData;
 import com.l2jserver.gameserver.model.L2ManufactureItem;
 import com.l2jserver.gameserver.model.L2ManufactureItem;
 import com.l2jserver.gameserver.model.L2RecipeInstance;
 import com.l2jserver.gameserver.model.L2RecipeInstance;
 import com.l2jserver.gameserver.model.L2RecipeList;
 import com.l2jserver.gameserver.model.L2RecipeList;
 import com.l2jserver.gameserver.model.L2RecipeStatInstance;
 import com.l2jserver.gameserver.model.L2RecipeStatInstance;
-import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.TempItem;
 import com.l2jserver.gameserver.model.TempItem;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.itemcontainer.Inventory;
 import com.l2jserver.gameserver.model.itemcontainer.Inventory;
@@ -63,91 +51,33 @@ import com.l2jserver.util.Rnd;
 
 
 public class RecipeController
 public class RecipeController
 {
 {
-	protected static final Logger _log = Logger.getLogger(RecipeController.class.getName());
-	
-	private static final Map<Integer, L2RecipeList> _lists = new FastMap<Integer, L2RecipeList>();
-	protected static final Map<Integer, RecipeItemMaker> _activeMakers = new FastMap<Integer, RecipeItemMaker>().shared();
-	private static final String RECIPES_FILE = "recipes.xml";
-	
-	public static RecipeController getInstance()
-	{
-		return SingletonHolder._instance;
-	}
+	protected static final FastMap<Integer, RecipeItemMaker> _activeMakers = new FastMap<>();
 	
 	
 	protected RecipeController()
 	protected RecipeController()
 	{
 	{
-		try
-		{
-			loadFromXML();
-			_log.info("RecipeController: Loaded " + _lists.size() + " recipes.");
-		}
-		catch (Exception e)
-		{
-			_log.log(Level.SEVERE, "Failed loading recipe list", e);
-		}
-	}
-	
-	public int getRecipesCount()
-	{
-		return _lists.size();
-	}
-	
-	public L2RecipeList getRecipeList(int listId)
-	{
-		return _lists.get(listId);
-	}
-	
-	public L2RecipeList getRecipeByItemId(int itemId)
-	{
-		for (L2RecipeList find : _lists.values())
-		{
-			if (find.getRecipeId() == itemId)
-			{
-				return find;
-			}
-		}
-		return null;
-	}
-	
-	public int[] getAllItemIds()
-	{
-		int[] idList = new int[_lists.size()];
-		int i = 0;
-		for (L2RecipeList rec : _lists.values())
-		{
-			idList[i++] = rec.getRecipeId();
-		}
-		return idList;
+		_activeMakers.shared();
 	}
 	}
 	
 	
-	public synchronized void requestBookOpen(L2PcInstance player, boolean isDwarvenCraft)
+	public void requestBookOpen(L2PcInstance player, boolean isDwarvenCraft)
 	{
 	{
-		RecipeItemMaker maker = null;
-		if (Config.ALT_GAME_CREATION)
-		{
-			maker = _activeMakers.get(player.getObjectId());
-		}
-		
-		if (maker == null)
+		if (Config.ALT_GAME_CREATION && _activeMakers.containsKey(player.getObjectId()))
 		{
 		{
 			RecipeBookItemList response = new RecipeBookItemList(isDwarvenCraft, player.getMaxMp());
 			RecipeBookItemList response = new RecipeBookItemList(isDwarvenCraft, player.getMaxMp());
 			response.addRecipes(isDwarvenCraft ? player.getDwarvenRecipeBook() : player.getCommonRecipeBook());
 			response.addRecipes(isDwarvenCraft ? player.getDwarvenRecipeBook() : player.getCommonRecipeBook());
 			player.sendPacket(response);
 			player.sendPacket(response);
 			return;
 			return;
 		}
 		}
-		
 		player.sendPacket(SystemMessageId.CANT_ALTER_RECIPEBOOK_WHILE_CRAFTING);
 		player.sendPacket(SystemMessageId.CANT_ALTER_RECIPEBOOK_WHILE_CRAFTING);
 	}
 	}
 	
 	
-	public synchronized void requestMakeItemAbort(L2PcInstance player)
+	public void requestMakeItemAbort(L2PcInstance player)
 	{
 	{
 		_activeMakers.remove(player.getObjectId()); // TODO: anything else here?
 		_activeMakers.remove(player.getObjectId()); // TODO: anything else here?
 	}
 	}
 	
 	
-	public synchronized void requestManufactureItem(L2PcInstance manufacturer, int recipeListId, L2PcInstance player)
+	public void requestManufactureItem(L2PcInstance manufacturer, int recipeListId, L2PcInstance player)
 	{
 	{
-		L2RecipeList recipeList = getValidRecipeList(player, recipeListId);
-		
+		final L2RecipeList recipeList = RecipeData.getInstance().getValidRecipeList(player, recipeListId);
 		if (recipeList == null)
 		if (recipeList == null)
 		{
 		{
 			return;
 			return;
@@ -162,15 +92,14 @@ public class RecipeController
 			return;
 			return;
 		}
 		}
 		
 		
-		RecipeItemMaker maker;
-		
-		if (Config.ALT_GAME_CREATION && ((maker = _activeMakers.get(manufacturer.getObjectId())) != null)) // check if busy
+		// check if busy
+		if (Config.ALT_GAME_CREATION && _activeMakers.containsKey(manufacturer.getObjectId()))
 		{
 		{
 			player.sendMessage("Manufacturer is busy, please try later.");
 			player.sendMessage("Manufacturer is busy, please try later.");
 			return;
 			return;
 		}
 		}
 		
 		
-		maker = new RecipeItemMaker(manufacturer, recipeList, player);
+		final RecipeItemMaker maker = new RecipeItemMaker(manufacturer, recipeList, player);
 		if (maker._isValid)
 		if (maker._isValid)
 		{
 		{
 			if (Config.ALT_GAME_CREATION)
 			if (Config.ALT_GAME_CREATION)
@@ -185,7 +114,7 @@ public class RecipeController
 		}
 		}
 	}
 	}
 	
 	
-	public synchronized void requestMakeItem(L2PcInstance player, int recipeListId)
+	public void requestMakeItem(L2PcInstance player, int recipeListId)
 	{
 	{
 		if (AttackStanceTaskManager.getInstance().getAttackStanceTask(player) || player.isInDuel())
 		if (AttackStanceTaskManager.getInstance().getAttackStanceTask(player) || player.isInDuel())
 		{
 		{
@@ -193,8 +122,7 @@ public class RecipeController
 			return;
 			return;
 		}
 		}
 		
 		
-		L2RecipeList recipeList = getValidRecipeList(player, recipeListId);
-		
+		final L2RecipeList recipeList = RecipeData.getInstance().getValidRecipeList(player, recipeListId);
 		if (recipeList == null)
 		if (recipeList == null)
 		{
 		{
 			return;
 			return;
@@ -216,7 +144,7 @@ public class RecipeController
 		{
 		{
 			SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S2_S1);
 			SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S2_S1);
 			sm.addItemName(recipeList.getItemId());
 			sm.addItemName(recipeList.getItemId());
-			sm.addString("You are busy creating");
+			sm.addString("You are busy creating.");
 			player.sendPacket(sm);
 			player.sendPacket(sm);
 			return;
 			return;
 		}
 		}
@@ -236,163 +164,9 @@ public class RecipeController
 		}
 		}
 	}
 	}
 	
 	
-	private void loadFromXML() throws SAXException, IOException, ParserConfigurationException
-	{
-		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-		factory.setValidating(false);
-		factory.setIgnoringComments(true);
-		File file = new File(Config.DATAPACK_ROOT + "/data/" + RECIPES_FILE);
-		if (file.exists())
-		{
-			Document doc = factory.newDocumentBuilder().parse(file);
-			List<L2RecipeInstance> recipePartList = new FastList<L2RecipeInstance>();
-			List<L2RecipeStatInstance> recipeStatUseList = new FastList<L2RecipeStatInstance>();
-			List<L2RecipeStatInstance> recipeAltStatChangeList = new FastList<L2RecipeStatInstance>();
-			
-			for (Node n = doc.getFirstChild(); n != null; n = n.getNextSibling())
-			{
-				if ("list".equalsIgnoreCase(n.getNodeName()))
-				{
-					recipesFile: for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
-					{
-						if ("item".equalsIgnoreCase(d.getNodeName()))
-						{
-							recipePartList.clear();
-							recipeStatUseList.clear();
-							recipeAltStatChangeList.clear();
-							NamedNodeMap attrs = d.getAttributes();
-							Node att;
-							int id = -1;
-							boolean haveRare = false;
-							StatsSet set = new StatsSet();
-							
-							att = attrs.getNamedItem("id");
-							if (att == null)
-							{
-								_log.severe("Missing id for recipe item, skipping");
-								continue;
-							}
-							id = Integer.parseInt(att.getNodeValue());
-							set.set("id", id);
-							
-							att = attrs.getNamedItem("recipeId");
-							if (att == null)
-							{
-								_log.severe("Missing recipeId for recipe item id: " + id + ", skipping");
-								continue;
-							}
-							set.set("recipeId", Integer.parseInt(att.getNodeValue()));
-							
-							att = attrs.getNamedItem("name");
-							if (att == null)
-							{
-								_log.severe("Missing name for recipe item id: " + id + ", skipping");
-								continue;
-							}
-							set.set("recipeName", att.getNodeValue());
-							
-							att = attrs.getNamedItem("craftLevel");
-							if (att == null)
-							{
-								_log.severe("Missing level for recipe item id: " + id + ", skipping");
-								continue;
-							}
-							set.set("craftLevel", Integer.parseInt(att.getNodeValue()));
-							
-							att = attrs.getNamedItem("type");
-							if (att == null)
-							{
-								_log.severe("Missing type for recipe item id: " + id + ", skipping");
-								continue;
-							}
-							set.set("isDwarvenRecipe", att.getNodeValue().equalsIgnoreCase("dwarven"));
-							
-							att = attrs.getNamedItem("successRate");
-							if (att == null)
-							{
-								_log.severe("Missing successRate for recipe item id: " + id + ", skipping");
-								continue;
-							}
-							set.set("successRate", Integer.parseInt(att.getNodeValue()));
-							
-							for (Node c = d.getFirstChild(); c != null; c = c.getNextSibling())
-							{
-								if ("statUse".equalsIgnoreCase(c.getNodeName()))
-								{
-									String statName = c.getAttributes().getNamedItem("name").getNodeValue();
-									int value = Integer.parseInt(c.getAttributes().getNamedItem("value").getNodeValue());
-									try
-									{
-										recipeStatUseList.add(new L2RecipeStatInstance(statName, value));
-									}
-									catch (Exception e)
-									{
-										_log.severe("Error in StatUse parameter for recipe item id: " + id + ", skipping");
-										continue recipesFile;
-									}
-								}
-								else if ("altStatChange".equalsIgnoreCase(c.getNodeName()))
-								{
-									String statName = c.getAttributes().getNamedItem("name").getNodeValue();
-									int value = Integer.parseInt(c.getAttributes().getNamedItem("value").getNodeValue());
-									try
-									{
-										recipeAltStatChangeList.add(new L2RecipeStatInstance(statName, value));
-									}
-									catch (Exception e)
-									{
-										_log.severe("Error in AltStatChange parameter for recipe item id: " + id + ", skipping");
-										continue recipesFile;
-									}
-								}
-								else if ("ingredient".equalsIgnoreCase(c.getNodeName()))
-								{
-									int ingId = Integer.parseInt(c.getAttributes().getNamedItem("id").getNodeValue());
-									int ingCount = Integer.parseInt(c.getAttributes().getNamedItem("count").getNodeValue());
-									recipePartList.add(new L2RecipeInstance(ingId, ingCount));
-								}
-								else if ("production".equalsIgnoreCase(c.getNodeName()))
-								{
-									set.set("itemId", Integer.parseInt(c.getAttributes().getNamedItem("id").getNodeValue()));
-									set.set("count", Integer.parseInt(c.getAttributes().getNamedItem("count").getNodeValue()));
-								}
-								else if ("productionRare".equalsIgnoreCase(c.getNodeName()))
-								{
-									set.set("rareItemId", Integer.parseInt(c.getAttributes().getNamedItem("id").getNodeValue()));
-									set.set("rareCount", Integer.parseInt(c.getAttributes().getNamedItem("count").getNodeValue()));
-									set.set("rarity", Integer.parseInt(c.getAttributes().getNamedItem("rarity").getNodeValue()));
-									haveRare = true;
-								}
-							}
-							
-							L2RecipeList recipeList = new L2RecipeList(set, haveRare);
-							for (L2RecipeInstance recipePart : recipePartList)
-							{
-								recipeList.addRecipe(recipePart);
-							}
-							for (L2RecipeStatInstance recipeStatUse : recipeStatUseList)
-							{
-								recipeList.addStatUse(recipeStatUse);
-							}
-							for (L2RecipeStatInstance recipeAltStatChange : recipeAltStatChangeList)
-							{
-								recipeList.addAltStatChange(recipeAltStatChange);
-							}
-							
-							_lists.put(id, recipeList);
-						}
-					}
-				}
-			}
-		}
-		else
-		{
-			_log.severe("Recipes file (" + file.getAbsolutePath() + ") doesnt exists.");
-		}
-	}
-	
 	private static class RecipeItemMaker implements Runnable
 	private static class RecipeItemMaker implements Runnable
 	{
 	{
+		private static final Logger _log = Logger.getLogger(RecipeItemMaker.class.getName());
 		protected boolean _isValid;
 		protected boolean _isValid;
 		protected List<TempItem> _items = null;
 		protected List<TempItem> _items = null;
 		protected final L2RecipeList _recipeList;
 		protected final L2RecipeList _recipeList;
@@ -542,7 +316,7 @@ public class RecipeController
 				return;
 				return;
 			}
 			}
 			
 			
-			if (Config.ALT_GAME_CREATION && (_activeMakers.get(_player.getObjectId()) == null))
+			if (Config.ALT_GAME_CREATION && _activeMakers.containsKey(_player.getObjectId()))
 			{
 			{
 				if (_target != _player)
 				if (_target != _player)
 				{
 				{
@@ -826,7 +600,7 @@ public class RecipeController
 		{
 		{
 			L2RecipeInstance[] recipes = _recipeList.getRecipes();
 			L2RecipeInstance[] recipes = _recipeList.getRecipes();
 			Inventory inv = _target.getInventory();
 			Inventory inv = _target.getInventory();
-			List<TempItem> materials = new FastList<TempItem>();
+			List<TempItem> materials = new ArrayList<>();
 			SystemMessage sm;
 			SystemMessage sm;
 			
 			
 			for (L2RecipeInstance recipe : recipes)
 			for (L2RecipeInstance recipe : recipes)
@@ -991,28 +765,17 @@ public class RecipeController
 					_sp /= 4;
 					_sp /= 4;
 				}
 				}
 				
 				
-				// Added multiplication of Creation speed with XP/SP gain
-				// slower crafting -> more XP, faster crafting -> less XP
-				// you can use ALT_GAME_CREATION_XP_RATE/SP to
-				// modify XP/SP gained (default = 1)
-				
+				// Added multiplication of Creation speed with XP/SP gain slower crafting -> more XP,
+				// faster crafting -> less XP you can use ALT_GAME_CREATION_XP_RATE/SP to modify XP/SP gained (default = 1)
 				_player.addExpAndSp((int) _player.calcStat(Stats.EXPSP_RATE, _exp * Config.ALT_GAME_CREATION_XP_RATE * Config.ALT_GAME_CREATION_SPEED, null, null), (int) _player.calcStat(Stats.EXPSP_RATE, _sp * Config.ALT_GAME_CREATION_SP_RATE * Config.ALT_GAME_CREATION_SPEED, null, null));
 				_player.addExpAndSp((int) _player.calcStat(Stats.EXPSP_RATE, _exp * Config.ALT_GAME_CREATION_XP_RATE * Config.ALT_GAME_CREATION_SPEED, null, null), (int) _player.calcStat(Stats.EXPSP_RATE, _sp * Config.ALT_GAME_CREATION_SP_RATE * Config.ALT_GAME_CREATION_SPEED, null, null));
 			}
 			}
 			updateMakeInfo(true); // success
 			updateMakeInfo(true); // success
 		}
 		}
 	}
 	}
 	
 	
-	private L2RecipeList getValidRecipeList(L2PcInstance player, int id)
+	public static RecipeController getInstance()
 	{
 	{
-		L2RecipeList recipeList = getRecipeList(id);
-		
-		if ((recipeList == null) || (recipeList.getRecipes().length == 0))
-		{
-			player.sendMessage("No recipe for: " + id);
-			player.isInCraftMode(false);
-			return null;
-		}
-		return recipeList;
+		return SingletonHolder._instance;
 	}
 	}
 	
 	
 	private static class SingletonHolder
 	private static class SingletonHolder

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/ai/L2NpcWalkerAI.java

@@ -18,7 +18,7 @@ import java.util.List;
 
 
 import com.l2jserver.Config;
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.ThreadPoolManager;
 import com.l2jserver.gameserver.ThreadPoolManager;
-import com.l2jserver.gameserver.datatables.NpcWalkerRoutesTable;
+import com.l2jserver.gameserver.datatables.NpcWalkerRoutesData;
 import com.l2jserver.gameserver.model.L2CharPosition;
 import com.l2jserver.gameserver.model.L2CharPosition;
 import com.l2jserver.gameserver.model.L2NpcWalkerNode;
 import com.l2jserver.gameserver.model.L2NpcWalkerNode;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Character;
@@ -60,7 +60,7 @@ public class L2NpcWalkerAI extends L2CharacterAI implements Runnable
 		if (!Config.ALLOW_NPC_WALKERS)
 		if (!Config.ALLOW_NPC_WALKERS)
 			return;
 			return;
 		
 		
-		_route = NpcWalkerRoutesTable.getInstance().getRouteForNpc(getActor().getNpcId());
+		_route = NpcWalkerRoutesData.getInstance().getRouteForNpc(getActor().getNpcId());
 		
 		
 		// Here we need 1 second initial delay cause getActor().hasAI() will return null...
 		// Here we need 1 second initial delay cause getActor().hasAI() will return null...
 		// Constructor of L2NpcWalkerAI is called faster then ai object is attached in L2NpcWalkerInstance
 		// Constructor of L2NpcWalkerAI is called faster then ai object is attached in L2NpcWalkerInstance

+ 131 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/NpcWalkerRoutesData.java

@@ -0,0 +1,131 @@
+/*
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ * 
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.l2jserver.gameserver.datatables;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+
+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.L2NpcWalkerNode;
+import com.l2jserver.gameserver.network.NpcStringId;
+
+/**
+ * Main Table to Load Npc Walkers Routes and Chat.
+ * @author Rayan, JIV
+ */
+public class NpcWalkerRoutesData extends DocumentParser
+{
+	private static final Map<Integer, List<L2NpcWalkerNode>> _routes = new HashMap<>();
+	
+	protected NpcWalkerRoutesData()
+	{
+		if (Config.ALLOW_NPC_WALKERS)
+		{
+			load();
+		}
+	}
+	
+	@Override
+	public void load()
+	{
+		_routes.clear();
+		parseDatapackFile("data/WalkerRoutes.xml");
+		_log.info(getClass().getSimpleName() + ": Loaded " + _routes.size() + " Npc Walker Routes.");
+	}
+	
+	@Override
+	protected void parseDocument()
+	{
+		final Node n = getCurrentDocument().getFirstChild();
+		for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
+		{
+			if (d.getNodeName().equals("walker"))
+			{
+				List<L2NpcWalkerNode> list = new ArrayList<>(5);
+				final Integer npcId = parseInteger(d.getAttributes(), "npcId");
+				for (Node r = d.getFirstChild(); r != null; r = r.getNextSibling())
+				{
+					if (r.getNodeName().equals("route"))
+					{
+						NamedNodeMap attrs = r.getAttributes();
+						int id = parseInt(attrs, "id");
+						int x = parseInt(attrs, "X");
+						int y = parseInt(attrs, "Y");
+						int z = parseInt(attrs, "Z");
+						int delay = parseInt(attrs, "delay");
+						String chatString = null;
+						NpcStringId npcString = null;
+						Node node = attrs.getNamedItem("string");
+						if (node != null)
+						{
+							chatString = node.getNodeValue();
+						}
+						else
+						{
+							node = attrs.getNamedItem("npcString");
+							if (node != null)
+							{
+								npcString = NpcStringId.getNpcStringId(node.getNodeValue());
+								if (npcString == null)
+								{
+									_log.log(Level.WARNING, "NpcWalkerRoutersTable: Unknown npcstring '" + node.getNodeValue() + ".");
+									continue;
+								}
+							}
+							else
+							{
+								node = attrs.getNamedItem("npcStringId");
+								if (node != null)
+								{
+									npcString = NpcStringId.getNpcStringId(parseInt(node));
+									if (npcString == null)
+									{
+										_log.log(Level.WARNING, "NpcWalkerRoutersTable: Unknown npcstring '" + node.getNodeValue() + ".");
+										continue;
+									}
+								}
+							}
+						}
+						
+						list.add(new L2NpcWalkerNode(id, npcString, chatString, x, y, z, delay, parseBoolean(attrs, "run")));
+					}
+				}
+				_routes.put(npcId, list);
+			}
+		}
+	}
+	
+	public List<L2NpcWalkerNode> getRouteForNpc(int id)
+	{
+		return _routes.get(id);
+	}
+	
+	public static NpcWalkerRoutesData getInstance()
+	{
+		return SingletonHolder._instance;
+	}
+	
+	private static class SingletonHolder
+	{
+		protected static final NpcWalkerRoutesData _instance = new NpcWalkerRoutesData();
+	}
+}

+ 0 - 153
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/NpcWalkerRoutesTable.java

@@ -1,153 +0,0 @@
-/*
- * This program is free software: you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software
- * Foundation, either version 3 of the License, or (at your option) any later
- * version.
- * 
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
- * details.
- * 
- * You should have received a copy of the GNU General Public License along with
- * this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package com.l2jserver.gameserver.datatables;
-
-import gnu.trove.map.hash.TIntObjectHashMap;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import javax.xml.parsers.DocumentBuilderFactory;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-
-import com.l2jserver.Config;
-import com.l2jserver.gameserver.model.L2NpcWalkerNode;
-import com.l2jserver.gameserver.network.NpcStringId;
-
-/**
- * Main Table to Load Npc Walkers Routes and Chat.<br>
- * @author Rayan, JIV
- */
-public class NpcWalkerRoutesTable
-{
-	private static final Logger _log = Logger.getLogger(NpcWalkerRoutesTable.class.getName());
-	
-	private final TIntObjectHashMap<List<L2NpcWalkerNode>> _routes = new TIntObjectHashMap<List<L2NpcWalkerNode>>();
-	
-	public static NpcWalkerRoutesTable getInstance()
-	{
-		return SingletonHolder._instance;
-	}
-	
-	protected NpcWalkerRoutesTable()
-	{
-		if (Config.ALLOW_NPC_WALKERS)
-		{
-			_log.info("Initializing Walkers Routes Table.");
-			load();
-		}
-	}
-	
-	public void load()
-	{
-		_routes.clear();
-		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-		factory.setValidating(false);
-		factory.setIgnoringComments(true);
-		File file = new File(Config.DATAPACK_ROOT, "data/WalkerRoutes.xml");
-		Document doc = null;
-		if (file.exists())
-		{
-			try
-			{
-				doc = factory.newDocumentBuilder().parse(file);
-			}
-			catch (Exception e)
-			{
-				_log.log(Level.WARNING, "Could not parse WalkerRoutes.xml file: " + e.getMessage(), e);
-				return;
-			}
-			
-			Node n = doc.getFirstChild();
-			for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
-			{
-				if (d.getNodeName().equals("walker"))
-				{
-					List<L2NpcWalkerNode> list = new ArrayList<L2NpcWalkerNode>();
-					int npcId = Integer.parseInt(d.getAttributes().getNamedItem("npcId").getNodeValue());
-					for (Node r = d.getFirstChild(); r != null; r = r.getNextSibling())
-					{
-						if (r.getNodeName().equals("route"))
-						{
-							NamedNodeMap attrs = r.getAttributes();
-							int id = Integer.parseInt(attrs.getNamedItem("id").getNodeValue());
-							int x = Integer.parseInt(attrs.getNamedItem("X").getNodeValue());
-							int y = Integer.parseInt(attrs.getNamedItem("Y").getNodeValue());
-							int z = Integer.parseInt(attrs.getNamedItem("Z").getNodeValue());
-							int delay = Integer.parseInt(attrs.getNamedItem("delay").getNodeValue());
-							String chatString = null;
-							NpcStringId npcString = null;
-							Node node = attrs.getNamedItem("string");
-							if (node != null)
-							{
-								chatString = node.getNodeValue();
-							}
-							else
-							{
-								node = attrs.getNamedItem("npcString");
-								if (node != null)
-								{
-									npcString = NpcStringId.getNpcStringId(node.getNodeValue());
-									if (npcString == null)
-									{
-										_log.log(Level.WARNING, "NpcWalkerRoutersTable: Unknown npcstring '" + node.getNodeValue() + ".");
-										continue;
-									}
-								}
-								else
-								{
-									node = attrs.getNamedItem("npcStringId");
-									if (node != null)
-									{
-										npcString = NpcStringId.getNpcStringId(Integer.parseInt(node.getNodeValue()));
-										if (npcString == null)
-										{
-											_log.log(Level.WARNING, "NpcWalkerRoutersTable: Unknown npcstring '" + node.getNodeValue() + ".");
-											continue;
-										}
-									}
-								}
-							}
-							
-							boolean running = Boolean.parseBoolean(attrs.getNamedItem("run").getNodeValue());
-							list.add(new L2NpcWalkerNode(id, npcString, chatString, x, y, z, delay, running));
-						}
-					}
-					
-					// ArrayList has initial capacity of 10, let's trim them to size before putting it into the map.
-					((ArrayList<L2NpcWalkerNode>) list).trimToSize();
-					_routes.put(npcId, list);
-				}
-			}
-		}
-		_log.info("WalkerRoutesTable: Loaded " + _routes.size() + " Npc Walker Routes.");
-	}
-	
-	public List<L2NpcWalkerNode> getRouteForNpc(int id)
-	{
-		return _routes.get(id);
-	}
-	
-	private static class SingletonHolder
-	{
-		protected static final NpcWalkerRoutesTable _instance = new NpcWalkerRoutesTable();
-	}
-}

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

@@ -237,6 +237,17 @@ public abstract class DocumentParser
 		return (b != null) && Boolean.parseBoolean(b.getNodeValue());
 		return (b != null) && Boolean.parseBoolean(b.getNodeValue());
 	}
 	}
 	
 	
+	/**
+	 * @param n the named node map
+	 * @param name  the attribute name
+	 * @return the node string value for the given node name and named node map if exist, otherwise an empty string
+	 */
+	protected static String parseString(NamedNodeMap n, String name)
+	{
+		final Node b = n.getNamedItem(name);
+		return (b == null) ? "" : b.getNodeValue();
+	}
+	
 	/**
 	/**
 	 * Simple XML error handler.
 	 * Simple XML error handler.
 	 * @author Zoey76
 	 * @author Zoey76

+ 71 - 131
L2J_Server_BETA/java/com/l2jserver/gameserver/instancemanager/WalkingManager.java

@@ -14,26 +14,18 @@
  */
  */
 package com.l2jserver.gameserver.instancemanager;
 package com.l2jserver.gameserver.instancemanager;
 
 
-import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.ScheduledFuture;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 
-import javax.xml.parsers.DocumentBuilderFactory;
-
-import javolution.util.FastList;
-import javolution.util.FastMap;
-
-import org.w3c.dom.Document;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
 import org.w3c.dom.Node;
 
 
-import com.l2jserver.Config;
-import com.l2jserver.gameserver.Announcements;
 import com.l2jserver.gameserver.ThreadPoolManager;
 import com.l2jserver.gameserver.ThreadPoolManager;
 import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.ai.CtrlIntention;
+import com.l2jserver.gameserver.engines.DocumentParser;
 import com.l2jserver.gameserver.model.L2CharPosition;
 import com.l2jserver.gameserver.model.L2CharPosition;
 import com.l2jserver.gameserver.model.L2NpcWalkerNode;
 import com.l2jserver.gameserver.model.L2NpcWalkerNode;
 import com.l2jserver.gameserver.model.L2WalkRoute;
 import com.l2jserver.gameserver.model.L2WalkRoute;
@@ -45,18 +37,16 @@ import com.l2jserver.util.Rnd;
  * This class manages walking monsters.
  * This class manages walking monsters.
  * @author GKR
  * @author GKR
  */
  */
-public class WalkingManager
+public class WalkingManager extends DocumentParser
 {
 {
-	private static final Logger _log = Logger.getLogger(WalkingManager.class.getName());
-	
 	//Repeat style: 0 - go back, 1 - go to first point (circle style), 2 - teleport to first point (conveyor style), 3 - random walking between points.
 	//Repeat style: 0 - go back, 1 - go to first point (circle style), 2 - teleport to first point (conveyor style), 3 - random walking between points.
 	private static final byte REPEAT_GO_BACK = 0;
 	private static final byte REPEAT_GO_BACK = 0;
 	private static final byte REPEAT_GO_FIRST = 1;
 	private static final byte REPEAT_GO_FIRST = 1;
 	private static final byte REPEAT_TELE_FIRST = 2;
 	private static final byte REPEAT_TELE_FIRST = 2;
 	private static final byte REPEAT_RANDOM = 3;
 	private static final byte REPEAT_RANDOM = 3;
 	
 	
-	protected Map<Integer, L2WalkRoute> _routes; //all available routes
-	private Map<Integer, WalkInfo> _activeRoutes; //each record represents NPC, moving by predefined route from _routes, and moving progress
+	protected Map<Integer, L2WalkRoute> _routes = new HashMap<>(); //all available routes
+	private Map<Integer, WalkInfo> _activeRoutes = new HashMap<>(); //each record represents NPC, moving by predefined route from _routes, and moving progress
 	
 	
 	private class WalkInfo
 	private class WalkInfo
 	{
 	{
@@ -84,124 +74,90 @@ public class WalkingManager
 		}
 		}
 	}
 	}
 	
 	
-	public static final WalkingManager getInstance()
+	protected WalkingManager()
 	{
 	{
-		return SingletonHolder._instance;
+		load();
 	}
 	}
 	
 	
-	protected WalkingManager()
+	@Override
+	public final void load()
 	{
 	{
-		_routes = new FastMap<Integer, L2WalkRoute>();
-		_activeRoutes = new FastMap<Integer, WalkInfo>();
-		load();
+		parseDatapackFile("data/Routes.xml");
+		_log.info(getClass().getSimpleName() + ": Loaded " + _routes.size() + " walking routes.");
 	}
 	}
 	
 	
-	private final void load()
+	@Override
+	protected void parseDocument()
 	{
 	{
-		_log.info("WalkingManager: Loading walking routes...");
-		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-		factory.setValidating(false);
-		factory.setIgnoringComments(true);
-		File file = new File(Config.DATAPACK_ROOT, "data/Routes.xml");
-		Document doc = null;
-		if (file.exists())
+		Node n = getCurrentDocument().getFirstChild();
+		for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
 		{
 		{
-			try
-			{
-				doc = factory.newDocumentBuilder().parse(file);
-			}
-			catch (Exception e)
+			if (d.getNodeName().equals("route"))
 			{
 			{
-				_log.log(Level.WARNING, "Could not parse Routes.xml file: " + e.getMessage(), e);
-				return;
-			}
-			
-			Node n = doc.getFirstChild();
-			for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
-			{
-				if (d.getNodeName().equals("route"))
+				final Integer routeId = parseInteger(d.getAttributes(), "id");
+				boolean repeat = parseBoolean(d.getAttributes(), "repeat");
+				String repeatStyle = d.getAttributes().getNamedItem("repeatStyle").getNodeValue();
+				byte repeatType;
+				if (repeatStyle.equalsIgnoreCase("back"))
+					repeatType = REPEAT_GO_BACK;
+				else if (repeatStyle.equalsIgnoreCase("cycle"))
+					repeatType = REPEAT_GO_FIRST;
+				else if (repeatStyle.equalsIgnoreCase("conveyor"))
+					repeatType = REPEAT_TELE_FIRST;
+				else if (repeatStyle.equalsIgnoreCase("random"))
+					repeatType = REPEAT_RANDOM;
+				else
+					repeatType = -1;
+				
+				final List<L2NpcWalkerNode> list = new ArrayList<>();
+				for (Node r = d.getFirstChild(); r != null; r = r.getNextSibling())
 				{
 				{
-					boolean debug = false;
-					int routeId = Integer.parseInt(d.getAttributes().getNamedItem("id").getNodeValue());
-					boolean repeat = Boolean.parseBoolean(d.getAttributes().getNamedItem("repeat").getNodeValue());
-					String repeatStyle = d.getAttributes().getNamedItem("repeatStyle").getNodeValue();
-					byte repeatType;
-					
-					if (repeatStyle.equalsIgnoreCase("back"))
-						repeatType = REPEAT_GO_BACK;
-					else if (repeatStyle.equalsIgnoreCase("cycle"))
-						repeatType = REPEAT_GO_FIRST;
-					else if (repeatStyle.equalsIgnoreCase("conveyor"))
-						repeatType = REPEAT_TELE_FIRST;
-					else if (repeatStyle.equalsIgnoreCase("random"))
-						repeatType = REPEAT_RANDOM;
-					else
-						repeatType = -1;
-					
-					List<L2NpcWalkerNode> list = new FastList<L2NpcWalkerNode>();
-					for (Node r = d.getFirstChild(); r != null; r = r.getNextSibling())
+					if (r.getNodeName().equals("point"))
 					{
 					{
-						if (r.getNodeName().equals("point"))
+						NamedNodeMap attrs = r.getAttributes();
+						int x = parseInt(attrs, "X");
+						int y = parseInt(attrs, "Y");
+						int z = parseInt(attrs, "Z");
+						int delay = parseInt(attrs, "delay");
+						
+						String chatString = null;
+						NpcStringId npcString = null;
+						Node node = attrs.getNamedItem("string");
+						if (node != null)
+							chatString = node.getNodeValue();
+						else
 						{
 						{
-							NamedNodeMap attrs = r.getAttributes();
-							int x = Integer.parseInt(attrs.getNamedItem("X").getNodeValue());
-							int y = Integer.parseInt(attrs.getNamedItem("Y").getNodeValue());
-							int z = Integer.parseInt(attrs.getNamedItem("Z").getNodeValue());
-							int delay = Integer.parseInt(attrs.getNamedItem("delay").getNodeValue());
-							
-							String chatString = null;
-							NpcStringId npcString = null;
-							Node node = attrs.getNamedItem("string");
+							node = attrs.getNamedItem("npcString");
 							if (node != null)
 							if (node != null)
-								chatString = node.getNodeValue();
+							{
+								npcString = NpcStringId.getNpcStringId(node.getNodeValue());
+								if (npcString == null)
+								{
+									_log.warning(getClass().getSimpleName() + ": Unknown npcstring '" + node.getNodeValue() + ".");
+									continue;
+								}
+							}
 							else
 							else
 							{
 							{
-								node = attrs.getNamedItem("npcString");
+								node = attrs.getNamedItem("npcStringId");
 								if (node != null)
 								if (node != null)
 								{
 								{
-									npcString = NpcStringId.getNpcStringId(node.getNodeValue());
+									npcString = NpcStringId.getNpcStringId(Integer.parseInt(node.getNodeValue()));
 									if (npcString == null)
 									if (npcString == null)
 									{
 									{
-										_log.log(Level.WARNING, "NpcWalkerRoutersTable: Unknown npcstring '" + node.getNodeValue() + ".");
+										_log.warning(getClass().getSimpleName() + ": Unknown npcstring '" + node.getNodeValue() + ".");
 										continue;
 										continue;
 									}
 									}
 								}
 								}
-								else
-								{
-									node = attrs.getNamedItem("npcStringId");
-									if (node != null)
-									{
-										npcString = NpcStringId.getNpcStringId(Integer.parseInt(node.getNodeValue()));
-										if (npcString == null)
-										{
-											_log.log(Level.WARNING, "NpcWalkerRoutersTable: Unknown npcstring '" + node.getNodeValue() + ".");
-											continue;
-										}
-									}
-								}
 							}
 							}
-							
-							boolean running = Boolean.parseBoolean(attrs.getNamedItem("run").getNodeValue());
-							list.add(new L2NpcWalkerNode(0, npcString, chatString, x, y, z, delay, running));
 						}
 						}
-						else if (r.getNodeName().equals("stat"))
-						{
-							NamedNodeMap attrs = r.getAttributes();
-							String name = attrs.getNamedItem("name").getNodeValue();
-							String val = attrs.getNamedItem("val").getNodeValue();
-							
-							if (name.equalsIgnoreCase("debug"))
-								debug = Boolean.parseBoolean(val);
-						}
-					
+						list.add(new L2NpcWalkerNode(0, npcString, chatString, x, y, z, delay, parseBoolean(attrs, "run")));
 					}
 					}
-					L2WalkRoute newRoute = new L2WalkRoute(routeId, list, repeat, false, repeatType);
-					newRoute.setDebug(debug);
-					_routes.put(routeId, newRoute);
 				}
 				}
+				L2WalkRoute newRoute = new L2WalkRoute(routeId, list, repeat, false, repeatType);
+				_routes.put(routeId, newRoute);
 			}
 			}
 		}
 		}
-		_log.info("WalkingManager: loaded " + _routes.size() + " walking routes.");
 	}
 	}
 	
 	
 	public boolean isRegistered(L2Npc npc)
 	public boolean isRegistered(L2Npc npc)
@@ -225,7 +181,6 @@ public class WalkingManager
 					if (!npc.isInsideRadius(node.getMoveX(), node.getMoveY(), node.getMoveZ(), 3000, true, false)) //too far from first point, decline further operations
 					if (!npc.isInsideRadius(node.getMoveX(), node.getMoveY(), node.getMoveZ(), 3000, true, false)) //too far from first point, decline further operations
 						return;
 						return;
 					
 					
-					//Announcements.getInstance().announceToAll("Start to move!");
 					npc.setIsRunning(node.getRunning());
 					npc.setIsRunning(node.getRunning());
 					npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new L2CharPosition(node.getMoveX(), node.getMoveY(), node.getMoveZ(), 0));
 					npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new L2CharPosition(node.getMoveX(), node.getMoveY(), node.getMoveZ(), 0));
 					walk._walkCheckTask = ThreadPoolManager.getInstance().scheduleAiAtFixedRate(new Runnable() {
 					walk._walkCheckTask = ThreadPoolManager.getInstance().scheduleAiAtFixedRate(new Runnable() {
@@ -251,18 +206,14 @@ public class WalkingManager
 			}
 			}
 			else //walk was stopped due to some reason (arrived to node, script action, fight or something else), resume it
 			else //walk was stopped due to some reason (arrived to node, script action, fight or something else), resume it
 			{
 			{
-				//Announcements.getInstance().announceToAll("Here_1!");
 				if (npc.getAI().getIntention() == CtrlIntention.AI_INTENTION_ACTIVE || npc.getAI().getIntention() == CtrlIntention.AI_INTENTION_IDLE)
 				if (npc.getAI().getIntention() == CtrlIntention.AI_INTENTION_ACTIVE || npc.getAI().getIntention() == CtrlIntention.AI_INTENTION_IDLE)
 				{
 				{
-					//Announcements.getInstance().announceToAll("Here_2!");
 					WalkInfo walk = _activeRoutes.get(npc.getObjectId());
 					WalkInfo walk = _activeRoutes.get(npc.getObjectId());
-					//Announcements.getInstance().announceToAll("X = " + Integer.toString(npc.getX()) + ", Y = " +  Integer.toString(npc.getY()) + ", node = " + Integer.toString(walk._currentNode));
 					
 					
 					//Prevent call simultaneously from scheduled task and onArrived() or temporarily stop walking for resuming in future
 					//Prevent call simultaneously from scheduled task and onArrived() or temporarily stop walking for resuming in future
 					if (walk._blocked || walk._suspended)
 					if (walk._blocked || walk._suspended)
 						return;
 						return;
 					
 					
-					//Announcements.getInstance().announceToAll("Continue move!");
 					walk._blocked = true;
 					walk._blocked = true;
 					//Check this first, within the bounds of random moving, we have no conception of "first" or "last" node
 					//Check this first, within the bounds of random moving, we have no conception of "first" or "last" node
 					if (walk.getRoute().getRepeatType() == REPEAT_RANDOM && walk._nodeArrived)
 					if (walk.getRoute().getRepeatType() == REPEAT_RANDOM && walk._nodeArrived)
@@ -278,12 +229,8 @@ public class WalkingManager
 					
 					
 					else if (walk._currentNode == walk.getRoute().getNodesCount()) //Last node arrived
 					else if (walk._currentNode == walk.getRoute().getNodesCount()) //Last node arrived
 					{
 					{
-						if (walk.getRoute().debug())
-							Announcements.getInstance().announceToAll("Last node arrived!");
-						
 						if (!walk.getRoute().repeatWalk())
 						if (!walk.getRoute().repeatWalk())
 						{
 						{
-							//Announcements.getInstance().announceToAll("Stoppping!");
 							cancelMoving(npc);
 							cancelMoving(npc);
 							return;
 							return;
 						}
 						}
@@ -311,10 +258,6 @@ public class WalkingManager
 					
 					
 					L2NpcWalkerNode node = walk.getCurrentNode();
 					L2NpcWalkerNode node = walk.getCurrentNode();
 					npc.setIsRunning(node.getRunning());
 					npc.setIsRunning(node.getRunning());
-					
-					if (walk.getRoute().debug())
-						Announcements.getInstance().announceToAll("Continue to node " + Integer.toString(walk._currentNode));
-					
 					npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new L2CharPosition(node.getMoveX(), node.getMoveY(), node.getMoveZ(), 0));
 					npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new L2CharPosition(node.getMoveX(), node.getMoveY(), node.getMoveZ(), 0));
 					walk._blocked = false;
 					walk._blocked = false;
 				}
 				}
@@ -322,14 +265,13 @@ public class WalkingManager
 		}
 		}
 	}
 	}
 	
 	
-	public void cancelMoving(L2Npc npc)
+	public synchronized void cancelMoving(L2Npc npc)
 	{
 	{
 		if (_activeRoutes.containsKey(npc.getObjectId()))
 		if (_activeRoutes.containsKey(npc.getObjectId()))
 		{
 		{
-			_activeRoutes.get(npc.getObjectId())._walkCheckTask.cancel(true);
-			_activeRoutes.remove(npc.getObjectId());
+			final WalkInfo walk = _activeRoutes.remove(npc.getObjectId());
+			walk._walkCheckTask.cancel(true);
 			npc.getKnownList().stopTrackingTask();
 			npc.getKnownList().stopTrackingTask();
-			//Announcements.getInstance().announceToAll("Moving cancelled!");
 		}
 		}
 	}
 	}
 	
 	
@@ -366,12 +308,6 @@ public class WalkingManager
 				L2NpcWalkerNode node = walk.getRoute().getNodeList().get(walk._currentNode);
 				L2NpcWalkerNode node = walk.getRoute().getNodeList().get(walk._currentNode);
 				if (node.getMoveX() == npc.getX() && node.getMoveY() == npc.getY())
 				if (node.getMoveX() == npc.getX() && node.getMoveY() == npc.getY())
 				{ 
 				{ 
-					if (walk.getRoute().debug())
-					{
-						Announcements.getInstance().announceToAll("Arrived to node " + Integer.toString(walk._currentNode));
-						//Announcements.getInstance().announceToAll("Done in " + Long.toString((System.currentTimeMillis() - walk._lastActionTime) / 1000) + " s.");
-					}
-					
 					walk._nodeArrived = true;
 					walk._nodeArrived = true;
 					if (walk.getRoute().getRepeatType() != REPEAT_RANDOM)
 					if (walk.getRoute().getRepeatType() != REPEAT_RANDOM)
 					{
 					{
@@ -400,8 +336,7 @@ public class WalkingManager
 	
 	
 	public void onDeath(L2Npc npc)
 	public void onDeath(L2Npc npc)
 	{
 	{
-		if (_activeRoutes.containsKey(npc.getObjectId()))
-			cancelMoving(npc);
+		cancelMoving(npc);
 	}
 	}
 	
 	
 	private class ArrivedTask implements Runnable
 	private class ArrivedTask implements Runnable
@@ -423,6 +358,11 @@ public class WalkingManager
 		}
 		}
 	}
 	}
 	
 	
+	public static final WalkingManager getInstance()
+	{
+		return SingletonHolder._instance;
+	}
+	
 	private static class SingletonHolder
 	private static class SingletonHolder
 	{
 	{
 		protected static final WalkingManager _instance = new WalkingManager();
 		protected static final WalkingManager _instance = new WalkingManager();

+ 2 - 4
L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2ManufactureItem.java

@@ -14,8 +14,7 @@
  */
  */
 package com.l2jserver.gameserver.model;
 package com.l2jserver.gameserver.model;
 
 
-import com.l2jserver.gameserver.RecipeController;
-
+import com.l2jserver.gameserver.datatables.RecipeData;
 
 
 /**
 /**
  * This class ...
  * This class ...
@@ -32,8 +31,7 @@ public class L2ManufactureItem
 	{
 	{
 		_recipeId = recipeId;
 		_recipeId = recipeId;
 		_cost = cost;
 		_cost = cost;
-		
-		_isDwarven = RecipeController.getInstance().getRecipeList(_recipeId).isDwarvenRecipe();
+		_isDwarven = RecipeData.getInstance().getRecipeList(_recipeId).isDwarvenRecipe();
 	}
 	}
 	
 	
 	public int getRecipeId()
 	public int getRecipeId()

+ 1 - 5
L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2RecipeStatInstance.java

@@ -44,11 +44,7 @@ public class L2RecipeStatInstance
 	 */
 	 */
 	public L2RecipeStatInstance(String type, int value)
 	public L2RecipeStatInstance(String type, int value)
 	{
 	{
-		try {
-			_type = Enum.valueOf(StatType.class, type);
-		} catch (Exception e) {
-			throw new IllegalArgumentException();
-		}
+		_type = Enum.valueOf(StatType.class, type);
 		_value = value;
 		_value = value;
 	}
 	}
 	
 	

+ 0 - 12
L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2WalkRoute.java

@@ -26,7 +26,6 @@ public class L2WalkRoute
 	private final boolean _repeatWalk; // Does repeat walk, after arriving into last point in list, or not
 	private final boolean _repeatWalk; // Does repeat walk, after arriving into last point in list, or not
 	private boolean _stopAfterCycle; // Make only one cycle or endlessly
 	private boolean _stopAfterCycle; // Make only one cycle or endlessly
 	private final byte _repeatType; // Repeat style: 0 - go back, 1 - go to first point (circle style), 2 - teleport to first point (conveyor style), 3 - random walking between points
 	private final byte _repeatType; // Repeat style: 0 - go back, 1 - go to first point (circle style), 2 - teleport to first point (conveyor style), 3 - random walking between points
-	private boolean _debug;
 	
 	
 	public L2WalkRoute(int id, List<L2NpcWalkerNode> route, boolean repeat, boolean once, byte repeatType)
 	public L2WalkRoute(int id, List<L2NpcWalkerNode> route, boolean repeat, boolean once, byte repeatType)
 	{
 	{
@@ -35,7 +34,6 @@ public class L2WalkRoute
 		_nodeList = route;
 		_nodeList = route;
 		_repeatType = repeatType;
 		_repeatType = repeatType;
 		_repeatWalk = ((_repeatType >= 0) && (_repeatType <= 2)) ? repeat : false;
 		_repeatWalk = ((_repeatType >= 0) && (_repeatType <= 2)) ? repeat : false;
-		_debug = false;
 	}
 	}
 	
 	
 	public int getId()
 	public int getId()
@@ -72,14 +70,4 @@ public class L2WalkRoute
 	{
 	{
 		return _nodeList.size();
 		return _nodeList.size();
 	}
 	}
-	
-	public void setDebug(boolean val)
-	{
-		_debug = val;
-	}
-	
-	public boolean debug()
-	{
-		return _debug;
-	}
 }
 }

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

@@ -73,6 +73,7 @@ import com.l2jserver.gameserver.datatables.HennaData;
 import com.l2jserver.gameserver.datatables.ItemTable;
 import com.l2jserver.gameserver.datatables.ItemTable;
 import com.l2jserver.gameserver.datatables.NpcTable;
 import com.l2jserver.gameserver.datatables.NpcTable;
 import com.l2jserver.gameserver.datatables.PetDataTable;
 import com.l2jserver.gameserver.datatables.PetDataTable;
+import com.l2jserver.gameserver.datatables.RecipeData;
 import com.l2jserver.gameserver.datatables.SkillTable;
 import com.l2jserver.gameserver.datatables.SkillTable;
 import com.l2jserver.gameserver.datatables.SkillTreesData;
 import com.l2jserver.gameserver.datatables.SkillTreesData;
 import com.l2jserver.gameserver.handler.IItemHandler;
 import com.l2jserver.gameserver.handler.IItemHandler;
@@ -4450,7 +4451,6 @@ public final class L2PcInstance extends L2Playable
 			sendPacket(sm);
 			sendPacket(sm);
 			return false;
 			return false;
 		}
 		}
-		
 		return true;
 		return true;
 	}
 	}
 	
 	
@@ -7723,9 +7723,9 @@ public final class L2PcInstance extends L2Playable
 			_dwarvenRecipeBook.clear();
 			_dwarvenRecipeBook.clear();
 			
 			
 			L2RecipeList recipe;
 			L2RecipeList recipe;
+			RecipeData rd = RecipeData.getInstance();
 			while (rset.next()) {
 			while (rset.next()) {
-				recipe = RecipeController.getInstance().getRecipeList(rset.getInt("id"));
-				
+				recipe = rd.getRecipeList(rset.getInt("id"));
 				if (loadCommon)
 				if (loadCommon)
 				{
 				{
 					if (rset.getInt(2) == 1)
 					if (rset.getInt(2) == 1)

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestRecipeBookDestroy.java

@@ -14,7 +14,7 @@
  */
  */
 package com.l2jserver.gameserver.network.clientpackets;
 package com.l2jserver.gameserver.network.clientpackets;
 
 
-import com.l2jserver.gameserver.RecipeController;
+import com.l2jserver.gameserver.datatables.RecipeData;
 import com.l2jserver.gameserver.model.L2RecipeList;
 import com.l2jserver.gameserver.model.L2RecipeList;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.network.serverpackets.RecipeBookItemList;
 import com.l2jserver.gameserver.network.serverpackets.RecipeBookItemList;
@@ -45,7 +45,7 @@ public final class RequestRecipeBookDestroy extends L2GameClientPacket
 		if (!getClient().getFloodProtectors().getTransaction().tryPerformAction("RecipeDestroy"))
 		if (!getClient().getFloodProtectors().getTransaction().tryPerformAction("RecipeDestroy"))
 			return;
 			return;
 		
 		
-		final L2RecipeList rp = RecipeController.getInstance().getRecipeList(_recipeID);
+		final L2RecipeList rp = RecipeData.getInstance().getRecipeList(_recipeID);
 		if (rp == null)
 		if (rp == null)
 			return;
 			return;
 		activeChar.unregisterRecipeList(_recipeID);
 		activeChar.unregisterRecipeList(_recipeID);

+ 3 - 4
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestRecipeShopListSet.java

@@ -20,7 +20,7 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.List;
 
 
 import com.l2jserver.Config;
 import com.l2jserver.Config;
-import com.l2jserver.gameserver.RecipeController;
+import com.l2jserver.gameserver.datatables.RecipeData;
 import com.l2jserver.gameserver.model.L2ManufactureItem;
 import com.l2jserver.gameserver.model.L2ManufactureItem;
 import com.l2jserver.gameserver.model.L2ManufactureList;
 import com.l2jserver.gameserver.model.L2ManufactureList;
 import com.l2jserver.gameserver.model.L2RecipeList;
 import com.l2jserver.gameserver.model.L2RecipeList;
@@ -102,11 +102,10 @@ public final class RequestRecipeShopListSet extends L2GameClientPacket
 		
 		
 		List<L2RecipeList> dwarfRecipes = Arrays.asList(player.getDwarvenRecipeBook());
 		List<L2RecipeList> dwarfRecipes = Arrays.asList(player.getDwarvenRecipeBook());
 		List<L2RecipeList> commonRecipes = Arrays.asList(player.getCommonRecipeBook());
 		List<L2RecipeList> commonRecipes = Arrays.asList(player.getCommonRecipeBook());
-		
+		final RecipeData rd = RecipeData.getInstance();
 		for (Recipe i : _items)
 		for (Recipe i : _items)
 		{
 		{
-			L2RecipeList list = RecipeController.getInstance().getRecipeList(i.getRecipeId());
-			
+			L2RecipeList list = rd.getRecipeList(i.getRecipeId());
 			if (!dwarfRecipes.contains(list) && !commonRecipes.contains(list))
 			if (!dwarfRecipes.contains(list) && !commonRecipes.contains(list))
 			{
 			{
 				Util.handleIllegalPlayerAction(player, "Warning!! Player " + player.getName() + " of account " + player.getAccountName()
 				Util.handleIllegalPlayerAction(player, "Warning!! Player " + player.getName() + " of account " + player.getAccountName()

+ 2 - 7
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/RecipeItemMakeInfo.java

@@ -15,15 +15,11 @@
 package com.l2jserver.gameserver.network.serverpackets;
 package com.l2jserver.gameserver.network.serverpackets;
 
 
 import com.l2jserver.Config;
 import com.l2jserver.Config;
-import com.l2jserver.gameserver.RecipeController;
+import com.l2jserver.gameserver.datatables.RecipeData;
 import com.l2jserver.gameserver.model.L2RecipeList;
 import com.l2jserver.gameserver.model.L2RecipeList;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 
 
-
 /**
 /**
- *
- *
- *
  * format   dddd
  * format   dddd
  *
  *
  * @version $Revision: 1.1.2.1.2.3 $ $Date: 2005/03/27 15:29:57 $
  * @version $Revision: 1.1.2.1.2.3 $ $Date: 2005/03/27 15:29:57 $
@@ -53,8 +49,7 @@ public class RecipeItemMakeInfo extends L2GameServerPacket
 	@Override
 	@Override
 	protected final void writeImpl()
 	protected final void writeImpl()
 	{
 	{
-		L2RecipeList recipe = RecipeController.getInstance().getRecipeList(_id);
-		
+		final L2RecipeList recipe = RecipeData.getInstance().getRecipeList(_id);
 		if (recipe != null)
 		if (recipe != null)
 		{
 		{
 			writeC(0xdd);
 			writeC(0xdd);

+ 5 - 5
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/SortedWareHouseWithdrawalList.java

@@ -20,7 +20,7 @@ import java.util.List;
 
 
 import javolution.util.FastList;
 import javolution.util.FastList;
 
 
-import com.l2jserver.gameserver.RecipeController;
+import com.l2jserver.gameserver.datatables.RecipeData;
 import com.l2jserver.gameserver.model.L2RecipeList;
 import com.l2jserver.gameserver.model.L2RecipeList;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.items.L2Item;
 import com.l2jserver.gameserver.model.items.L2Item;
@@ -257,12 +257,12 @@ public class SortedWareHouseWithdrawalList extends L2GameServerPacket
 	{
 	{
 		private int order = 0;
 		private int order = 0;
 		
 		
-		private RecipeController rc = null;
+		private RecipeData rd = null;
 		
 		
 		protected WarehouseItemRecipeComparator(int sortOrder)
 		protected WarehouseItemRecipeComparator(int sortOrder)
 		{
 		{
 			order = sortOrder;
 			order = sortOrder;
-			rc = RecipeController.getInstance();
+			rd = RecipeData.getInstance();
 		}
 		}
 		
 		
 		@Override
 		@Override
@@ -276,8 +276,8 @@ public class SortedWareHouseWithdrawalList extends L2GameServerPacket
 			{
 			{
 				try
 				try
 				{
 				{
-					L2RecipeList rp1 = rc.getRecipeByItemId(o1.getItemId());
-					L2RecipeList rp2 = rc.getRecipeByItemId(o2.getItemId());
+					L2RecipeList rp1 = rd.getRecipeByItemId(o1.getItemId());
+					L2RecipeList rp2 = rd.getRecipeByItemId(o2.getItemId());
 					
 					
 					if (rp1 == null)
 					if (rp1 == null)
 						return (order == A2Z ? A2Z : Z2A);
 						return (order == A2Z ? A2Z : Z2A);

+ 0 - 44
L2J_Server_BETA/java/com/l2jserver/gameserver/script/EngineInterface.java

@@ -14,58 +14,14 @@
  */
  */
 package com.l2jserver.gameserver.script;
 package com.l2jserver.gameserver.script;
 
 
-import com.l2jserver.gameserver.Announcements;
-import com.l2jserver.gameserver.GameTimeController;
-import com.l2jserver.gameserver.RecipeController;
-import com.l2jserver.gameserver.datatables.CharNameTable;
-import com.l2jserver.gameserver.datatables.CharTemplateTable;
-import com.l2jserver.gameserver.datatables.ClanTable;
-import com.l2jserver.gameserver.datatables.ItemTable;
-import com.l2jserver.gameserver.datatables.LevelUpData;
-import com.l2jserver.gameserver.datatables.NpcTable;
-import com.l2jserver.gameserver.datatables.SkillTable;
-import com.l2jserver.gameserver.datatables.SkillTreesData;
-import com.l2jserver.gameserver.datatables.SpawnTable;
-import com.l2jserver.gameserver.datatables.TeleportLocationTable;
-import com.l2jserver.gameserver.idfactory.IdFactory;
-import com.l2jserver.gameserver.instancemanager.MapRegionManager;
-import com.l2jserver.gameserver.model.L2World;
-
 /**
 /**
  * @author Luis Arias
  * @author Luis Arias
  */
  */
 public interface EngineInterface
 public interface EngineInterface
 {
 {
-	// * keep the references of Singletons to prevent garbage collection
-	public CharNameTable charNametable = CharNameTable.getInstance();
-	
-	public IdFactory idFactory = IdFactory.getInstance();
-	public ItemTable itemTable = ItemTable.getInstance();
-	
-	public SkillTable skillTable = SkillTable.getInstance();
-	
-	public RecipeController recipeController = RecipeController.getInstance();
-	
-	public SkillTreesData skillTreeTable = SkillTreesData.getInstance();
-	public CharTemplateTable charTemplates = CharTemplateTable.getInstance();
-	public ClanTable clanTable = ClanTable.getInstance();
-	
-	public NpcTable npcTable = NpcTable.getInstance();
-	
-	public TeleportLocationTable teleTable = TeleportLocationTable.getInstance();
-	public LevelUpData levelUpData = LevelUpData.getInstance();
-	public L2World world = L2World.getInstance();
-	public SpawnTable spawnTable = SpawnTable.getInstance();
-	public GameTimeController gameTimeController = GameTimeController.getInstance();
-	public Announcements announcements = Announcements.getInstance();
-	public MapRegionManager mapRegions = MapRegionManager.getInstance();
-	
-	// public ArrayList getAllPlayers();
-	// public Player getPlayer(String characterName);
 	public void addQuestDrop(int npcID, int itemID, int min, int max, int chance, String questID, String[] states);
 	public void addQuestDrop(int npcID, int itemID, int min, int max, int chance, String questID, String[] states);
 	
 	
 	public void addEventDrop(int[] items, int[] count, double chance, DateRange range);
 	public void addEventDrop(int[] items, int[] count, double chance, DateRange range);
 	
 	
 	public void onPlayerLogin(String[] message, DateRange range);
 	public void onPlayerLogin(String[] message, DateRange range);
-	
 }
 }

+ 4 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/script/faenor/FaenorInterface.java

@@ -22,6 +22,7 @@ import javolution.util.FastList;
 import com.l2jserver.Config;
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.Announcements;
 import com.l2jserver.gameserver.Announcements;
 import com.l2jserver.gameserver.datatables.EventDroplist;
 import com.l2jserver.gameserver.datatables.EventDroplist;
+import com.l2jserver.gameserver.datatables.NpcTable;
 import com.l2jserver.gameserver.model.L2DropCategory;
 import com.l2jserver.gameserver.model.L2DropCategory;
 import com.l2jserver.gameserver.model.L2DropData;
 import com.l2jserver.gameserver.model.L2DropData;
 import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
 import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
@@ -52,7 +53,7 @@ public class FaenorInterface implements EngineInterface
 	@Override
 	@Override
 	public void addQuestDrop(int npcID, int itemID, int min, int max, int chance, String questID, String[] states)
 	public void addQuestDrop(int npcID, int itemID, int min, int max, int chance, String questID, String[] states)
 	{
 	{
-		L2NpcTemplate npc = npcTable.getTemplate(npcID);
+		L2NpcTemplate npc = NpcTable.getInstance().getTemplate(npcID);
 		if (npc == null)
 		if (npc == null)
 		{
 		{
 			throw new NullPointerException();
 			throw new NullPointerException();
@@ -80,7 +81,7 @@ public class FaenorInterface implements EngineInterface
 	 */
 	 */
 	public void addDrop(int npcID, int itemID, int min, int max, boolean sweep, int chance) throws NullPointerException
 	public void addDrop(int npcID, int itemID, int min, int max, boolean sweep, int chance) throws NullPointerException
 	{
 	{
-		L2NpcTemplate npc = npcTable.getTemplate(npcID);
+		L2NpcTemplate npc = NpcTable.getInstance().getTemplate(npcID);
 		if (npc == null)
 		if (npc == null)
 		{
 		{
 			if (Config.DEBUG)
 			if (Config.DEBUG)
@@ -139,7 +140,7 @@ public class FaenorInterface implements EngineInterface
 	
 	
 	public List<L2DropData> getQuestDrops(int npcID)
 	public List<L2DropData> getQuestDrops(int npcID)
 	{
 	{
-		L2NpcTemplate npc = npcTable.getTemplate(npcID);
+		L2NpcTemplate npc = NpcTable.getInstance().getTemplate(npcID);
 		if (npc == null)
 		if (npc == null)
 		{
 		{
 			return null;
 			return null;