Ver Fonte

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 há 13 anos atrás
pai
commit
70f23e319e
17 ficheiros alterados com 263 adições e 637 exclusões
  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.NpcBufferTable;
 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.PetDataTable;
+import com.l2jserver.gameserver.datatables.RecipeData;
 import com.l2jserver.gameserver.datatables.SkillTable;
 import com.l2jserver.gameserver.datatables.SkillTreesData;
 import com.l2jserver.gameserver.datatables.SpawnTable;
@@ -226,7 +227,7 @@ public class GameServer
 		MerchantPriceConfigTable.getInstance().loadInstances();
 		TradeController.getInstance();
 		MultiSell.getInstance();
-		RecipeController.getInstance();
+		RecipeData.getInstance();
 		ArmorSetsData.getInstance();
 		FishData.getInstance();
 		FishingRodsData.getInstance();
@@ -259,7 +260,7 @@ public class GameServer
 		printSection("NPCs");
 		HerbDropTable.getInstance();
 		NpcTable.getInstance();
-		NpcWalkerRoutesTable.getInstance();
+		NpcWalkerRoutesData.getInstance();
 		WalkingManager.getInstance();
 		StaticObjects.getInstance();
 		ZoneManager.getInstance();

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

@@ -14,32 +14,20 @@
  */
 package com.l2jserver.gameserver;
 
-import java.io.File;
-import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-import java.util.Map;
-import java.util.logging.Level;
 import java.util.logging.Logger;
 
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import javolution.util.FastList;
 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.gameserver.datatables.ItemTable;
+import com.l2jserver.gameserver.datatables.RecipeData;
 import com.l2jserver.gameserver.model.L2ManufactureItem;
 import com.l2jserver.gameserver.model.L2RecipeInstance;
 import com.l2jserver.gameserver.model.L2RecipeList;
 import com.l2jserver.gameserver.model.L2RecipeStatInstance;
-import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.TempItem;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.itemcontainer.Inventory;
@@ -63,91 +51,33 @@ import com.l2jserver.util.Rnd;
 
 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()
 	{
-		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());
 			response.addRecipes(isDwarvenCraft ? player.getDwarvenRecipeBook() : player.getCommonRecipeBook());
 			player.sendPacket(response);
 			return;
 		}
-		
 		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?
 	}
 	
-	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)
 		{
 			return;
@@ -162,15 +92,14 @@ public class RecipeController
 			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.");
 			return;
 		}
 		
-		maker = new RecipeItemMaker(manufacturer, recipeList, player);
+		final RecipeItemMaker maker = new RecipeItemMaker(manufacturer, recipeList, player);
 		if (maker._isValid)
 		{
 			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())
 		{
@@ -193,8 +122,7 @@ public class RecipeController
 			return;
 		}
 		
-		L2RecipeList recipeList = getValidRecipeList(player, recipeListId);
-		
+		final L2RecipeList recipeList = RecipeData.getInstance().getValidRecipeList(player, recipeListId);
 		if (recipeList == null)
 		{
 			return;
@@ -216,7 +144,7 @@ public class RecipeController
 		{
 			SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S2_S1);
 			sm.addItemName(recipeList.getItemId());
-			sm.addString("You are busy creating");
+			sm.addString("You are busy creating.");
 			player.sendPacket(sm);
 			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 final Logger _log = Logger.getLogger(RecipeItemMaker.class.getName());
 		protected boolean _isValid;
 		protected List<TempItem> _items = null;
 		protected final L2RecipeList _recipeList;
@@ -542,7 +316,7 @@ public class RecipeController
 				return;
 			}
 			
-			if (Config.ALT_GAME_CREATION && (_activeMakers.get(_player.getObjectId()) == null))
+			if (Config.ALT_GAME_CREATION && _activeMakers.containsKey(_player.getObjectId()))
 			{
 				if (_target != _player)
 				{
@@ -826,7 +600,7 @@ public class RecipeController
 		{
 			L2RecipeInstance[] recipes = _recipeList.getRecipes();
 			Inventory inv = _target.getInventory();
-			List<TempItem> materials = new FastList<TempItem>();
+			List<TempItem> materials = new ArrayList<>();
 			SystemMessage sm;
 			
 			for (L2RecipeInstance recipe : recipes)
@@ -991,28 +765,17 @@ public class RecipeController
 					_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));
 			}
 			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

+ 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.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.L2NpcWalkerNode;
 import com.l2jserver.gameserver.model.actor.L2Character;
@@ -60,7 +60,7 @@ public class L2NpcWalkerAI extends L2CharacterAI implements Runnable
 		if (!Config.ALLOW_NPC_WALKERS)
 			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...
 		// 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());
 	}
 	
+	/**
+	 * @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.
 	 * @author Zoey76

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

@@ -14,26 +14,18 @@
  */
 package com.l2jserver.gameserver.instancemanager;
 
-import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 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.Node;
 
-import com.l2jserver.Config;
-import com.l2jserver.gameserver.Announcements;
 import com.l2jserver.gameserver.ThreadPoolManager;
 import com.l2jserver.gameserver.ai.CtrlIntention;
+import com.l2jserver.gameserver.engines.DocumentParser;
 import com.l2jserver.gameserver.model.L2CharPosition;
 import com.l2jserver.gameserver.model.L2NpcWalkerNode;
 import com.l2jserver.gameserver.model.L2WalkRoute;
@@ -45,18 +37,16 @@ import com.l2jserver.util.Rnd;
  * This class manages walking monsters.
  * @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.
 	private static final byte REPEAT_GO_BACK = 0;
 	private static final byte REPEAT_GO_FIRST = 1;
 	private static final byte REPEAT_TELE_FIRST = 2;
 	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
 	{
@@ -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)
-								chatString = node.getNodeValue();
+							{
+								npcString = NpcStringId.getNpcStringId(node.getNodeValue());
+								if (npcString == null)
+								{
+									_log.warning(getClass().getSimpleName() + ": Unknown npcstring '" + node.getNodeValue() + ".");
+									continue;
+								}
+							}
 							else
 							{
-								node = attrs.getNamedItem("npcString");
+								node = attrs.getNamedItem("npcStringId");
 								if (node != null)
 								{
-									npcString = NpcStringId.getNpcStringId(node.getNodeValue());
+									npcString = NpcStringId.getNpcStringId(Integer.parseInt(node.getNodeValue()));
 									if (npcString == null)
 									{
-										_log.log(Level.WARNING, "NpcWalkerRoutersTable: Unknown npcstring '" + node.getNodeValue() + ".");
+										_log.warning(getClass().getSimpleName() + ": 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(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)
@@ -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
 						return;
 					
-					//Announcements.getInstance().announceToAll("Start to move!");
 					npc.setIsRunning(node.getRunning());
 					npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new L2CharPosition(node.getMoveX(), node.getMoveY(), node.getMoveZ(), 0));
 					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
 			{
-				//Announcements.getInstance().announceToAll("Here_1!");
 				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());
-					//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
 					if (walk._blocked || walk._suspended)
 						return;
 					
-					//Announcements.getInstance().announceToAll("Continue move!");
 					walk._blocked = true;
 					//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)
@@ -278,12 +229,8 @@ public class WalkingManager
 					
 					else if (walk._currentNode == walk.getRoute().getNodesCount()) //Last node arrived
 					{
-						if (walk.getRoute().debug())
-							Announcements.getInstance().announceToAll("Last node arrived!");
-						
 						if (!walk.getRoute().repeatWalk())
 						{
-							//Announcements.getInstance().announceToAll("Stoppping!");
 							cancelMoving(npc);
 							return;
 						}
@@ -311,10 +258,6 @@ public class WalkingManager
 					
 					L2NpcWalkerNode node = walk.getCurrentNode();
 					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));
 					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()))
 		{
-			_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();
-			//Announcements.getInstance().announceToAll("Moving cancelled!");
 		}
 	}
 	
@@ -366,12 +308,6 @@ public class WalkingManager
 				L2NpcWalkerNode node = walk.getRoute().getNodeList().get(walk._currentNode);
 				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;
 					if (walk.getRoute().getRepeatType() != REPEAT_RANDOM)
 					{
@@ -400,8 +336,7 @@ public class WalkingManager
 	
 	public void onDeath(L2Npc npc)
 	{
-		if (_activeRoutes.containsKey(npc.getObjectId()))
-			cancelMoving(npc);
+		cancelMoving(npc);
 	}
 	
 	private class ArrivedTask implements Runnable
@@ -423,6 +358,11 @@ public class WalkingManager
 		}
 	}
 	
+	public static final WalkingManager getInstance()
+	{
+		return SingletonHolder._instance;
+	}
+	
 	private static class SingletonHolder
 	{
 		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;
 
-import com.l2jserver.gameserver.RecipeController;
-
+import com.l2jserver.gameserver.datatables.RecipeData;
 
 /**
  * This class ...
@@ -32,8 +31,7 @@ public class L2ManufactureItem
 	{
 		_recipeId = recipeId;
 		_cost = cost;
-		
-		_isDwarven = RecipeController.getInstance().getRecipeList(_recipeId).isDwarvenRecipe();
+		_isDwarven = RecipeData.getInstance().getRecipeList(_recipeId).isDwarvenRecipe();
 	}
 	
 	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)
 	{
-		try {
-			_type = Enum.valueOf(StatType.class, type);
-		} catch (Exception e) {
-			throw new IllegalArgumentException();
-		}
+		_type = Enum.valueOf(StatType.class, type);
 		_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 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 boolean _debug;
 	
 	public L2WalkRoute(int id, List<L2NpcWalkerNode> route, boolean repeat, boolean once, byte repeatType)
 	{
@@ -35,7 +34,6 @@ public class L2WalkRoute
 		_nodeList = route;
 		_repeatType = repeatType;
 		_repeatWalk = ((_repeatType >= 0) && (_repeatType <= 2)) ? repeat : false;
-		_debug = false;
 	}
 	
 	public int getId()
@@ -72,14 +70,4 @@ public class L2WalkRoute
 	{
 		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.NpcTable;
 import com.l2jserver.gameserver.datatables.PetDataTable;
+import com.l2jserver.gameserver.datatables.RecipeData;
 import com.l2jserver.gameserver.datatables.SkillTable;
 import com.l2jserver.gameserver.datatables.SkillTreesData;
 import com.l2jserver.gameserver.handler.IItemHandler;
@@ -4450,7 +4451,6 @@ public final class L2PcInstance extends L2Playable
 			sendPacket(sm);
 			return false;
 		}
-		
 		return true;
 	}
 	
@@ -7723,9 +7723,9 @@ public final class L2PcInstance extends L2Playable
 			_dwarvenRecipeBook.clear();
 			
 			L2RecipeList recipe;
+			RecipeData rd = RecipeData.getInstance();
 			while (rset.next()) {
-				recipe = RecipeController.getInstance().getRecipeList(rset.getInt("id"));
-				
+				recipe = rd.getRecipeList(rset.getInt("id"));
 				if (loadCommon)
 				{
 					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;
 
-import com.l2jserver.gameserver.RecipeController;
+import com.l2jserver.gameserver.datatables.RecipeData;
 import com.l2jserver.gameserver.model.L2RecipeList;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.network.serverpackets.RecipeBookItemList;
@@ -45,7 +45,7 @@ public final class RequestRecipeBookDestroy extends L2GameClientPacket
 		if (!getClient().getFloodProtectors().getTransaction().tryPerformAction("RecipeDestroy"))
 			return;
 		
-		final L2RecipeList rp = RecipeController.getInstance().getRecipeList(_recipeID);
+		final L2RecipeList rp = RecipeData.getInstance().getRecipeList(_recipeID);
 		if (rp == null)
 			return;
 		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 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.L2ManufactureList;
 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> commonRecipes = Arrays.asList(player.getCommonRecipeBook());
-		
+		final RecipeData rd = RecipeData.getInstance();
 		for (Recipe i : _items)
 		{
-			L2RecipeList list = RecipeController.getInstance().getRecipeList(i.getRecipeId());
-			
+			L2RecipeList list = rd.getRecipeList(i.getRecipeId());
 			if (!dwarfRecipes.contains(list) && !commonRecipes.contains(list))
 			{
 				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;
 
 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.actor.instance.L2PcInstance;
 
-
 /**
- *
- *
- *
  * format   dddd
  *
  * @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
 	protected final void writeImpl()
 	{
-		L2RecipeList recipe = RecipeController.getInstance().getRecipeList(_id);
-		
+		final L2RecipeList recipe = RecipeData.getInstance().getRecipeList(_id);
 		if (recipe != null)
 		{
 			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 com.l2jserver.gameserver.RecipeController;
+import com.l2jserver.gameserver.datatables.RecipeData;
 import com.l2jserver.gameserver.model.L2RecipeList;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.items.L2Item;
@@ -257,12 +257,12 @@ public class SortedWareHouseWithdrawalList extends L2GameServerPacket
 	{
 		private int order = 0;
 		
-		private RecipeController rc = null;
+		private RecipeData rd = null;
 		
 		protected WarehouseItemRecipeComparator(int sortOrder)
 		{
 			order = sortOrder;
-			rc = RecipeController.getInstance();
+			rd = RecipeData.getInstance();
 		}
 		
 		@Override
@@ -276,8 +276,8 @@ public class SortedWareHouseWithdrawalList extends L2GameServerPacket
 			{
 				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)
 						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;
 
-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
  */
 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 addEventDrop(int[] items, int[] count, double chance, 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.gameserver.Announcements;
 import com.l2jserver.gameserver.datatables.EventDroplist;
+import com.l2jserver.gameserver.datatables.NpcTable;
 import com.l2jserver.gameserver.model.L2DropCategory;
 import com.l2jserver.gameserver.model.L2DropData;
 import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
@@ -52,7 +53,7 @@ public class FaenorInterface implements EngineInterface
 	@Override
 	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)
 		{
 			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
 	{
-		L2NpcTemplate npc = npcTable.getTemplate(npcID);
+		L2NpcTemplate npc = NpcTable.getInstance().getTemplate(npcID);
 		if (npc == null)
 		{
 			if (Config.DEBUG)
@@ -139,7 +140,7 @@ public class FaenorInterface implements EngineInterface
 	
 	public List<L2DropData> getQuestDrops(int npcID)
 	{
-		L2NpcTemplate npc = npcTable.getTemplate(npcID);
+		L2NpcTemplate npc = NpcTable.getInstance().getTemplate(npcID);
 		if (npc == null)
 		{
 			return null;