All pastes #45081 Raw Edit

Gnipi

public text v1 · immutable
#45081 ·published 2006-03-10 02:03 UTC
rendered paste body
Index: C:/workspace/c4/java/config/altsettings.properties
===================================================================
--- C:/workspace/c4/java/config/altsettings.properties	(revision 1587)
+++ C:/workspace/c4/java/config/altsettings.properties	(working copy)
@@ -23,6 +23,9 @@
 # - players get EXP/SP for crafting
 AltGameCreation = False
 
+# time multiplyer - bigger number = slower crafting, default 15
+AltGameCreationSpeed = 15
+
 # Alternative skill learn rules:
 # - all classes can learn all skills
 # - skills of another class costs x2 SP
Index: C:/workspace/c4/java/net/sf/l2j/Config.java
===================================================================
--- C:/workspace/c4/java/net/sf/l2j/Config.java	(revision 1587)
+++ C:/workspace/c4/java/net/sf/l2j/Config.java	(working copy)
@@ -87,6 +87,8 @@
     public static boolean EVERYBODY_HAS_ADMIN_RIGHTS;
     /** Alternative game crafting */
     public static boolean ALT_GAME_CREATION;
+    /** Alternative game crafting speed mutiplyer - default 15,  bigger number -> slower */
+    public static int ALT_GAME_CREATION_SPEED;
     /** Alternative game skill learning */
     public static boolean ALT_GAME_SKILL_LEARN;
     /** Cancel ATTACK/cast by hit */
@@ -860,6 +862,7 @@
 	            
 	            ALT_GAME_TIREDNESS      = Boolean.parseBoolean(altSettings.getProperty("AltGameTiredness", "false"));
 	            ALT_GAME_CREATION       = Boolean.parseBoolean(altSettings.getProperty("AltGameCreation", "false"));
+	            ALT_GAME_CREATION_SPEED = Integer.parseInt(altSettings.getProperty("AltGameCreationSpeed", "15"));
 	            ALT_GAME_SKILL_LEARN    = Boolean.parseBoolean(altSettings.getProperty("AltGameSkillLearn", "false"));
 	            ALT_GAME_CANCEL_BOW     = altSettings.getProperty("AltGameCancelByHit", "Cast").equalsIgnoreCase("bow") || altSettings.getProperty("AltGameCancelByHit", "Cast").equalsIgnoreCase("all");
 	            ALT_GAME_CANCEL_CAST    = altSettings.getProperty("AltGameCancelByHit", "Cast").equalsIgnoreCase("cast") || altSettings.getProperty("AltGameCancelByHit", "Cast").equalsIgnoreCase("all");
@@ -1217,6 +1220,7 @@
         // Alternative settings
         else if (pName.equalsIgnoreCase("AltGameTiredness")) ALT_GAME_TIREDNESS = Boolean.valueOf(pValue);
         else if (pName.equalsIgnoreCase("AltGameCreation")) ALT_GAME_CREATION = Boolean.valueOf(pValue);
+        else if (pName.equalsIgnoreCase("AltGameCreationSpeed")) ALT_GAME_CREATION_SPEED = Integer.parseInt(pValue);
         else if (pName.equalsIgnoreCase("AltGameSkillLearn")) ALT_GAME_SKILL_LEARN = Boolean.valueOf(pValue);
 
         else if (pName.equalsIgnoreCase("AltGameCancelByHit"))
Index: C:/workspace/c4/java/net/sf/l2j/gameserver/RecipeController.java
===================================================================
--- C:/workspace/c4/java/net/sf/l2j/gameserver/RecipeController.java	(revision 1587)
+++ C:/workspace/c4/java/net/sf/l2j/gameserver/RecipeController.java	(working copy)
@@ -30,10 +30,11 @@
 import java.util.WeakHashMap;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-
 import javolution.util.FastList;
 import javolution.util.FastMap;
 import net.sf.l2j.Config;
+import net.sf.l2j.gameserver.ClientScheduler;
+import net.sf.l2j.gameserver.GameTimeController;
 import net.sf.l2j.gameserver.lib.Rnd;
 import net.sf.l2j.gameserver.model.Inventory;
 import net.sf.l2j.gameserver.model.L2ItemInstance;
@@ -56,22 +57,13 @@
 public class RecipeController
 {
 	protected static Logger _log = Logger.getLogger(RecipeController.class.getName());
-	private static RecipeController _instance;
 	
+	private static RecipeController _instance;
 	private Map<Integer, L2RecipeList> _lists;
-	
-	protected static Map<L2PcInstance, ReceipeItemMaker> activeMakers = Collections.synchronizedMap(new WeakHashMap<L2PcInstance,ReceipeItemMaker>());
-	
+	protected static Map<L2PcInstance, RecipeItemMaker> activeMakers = Collections.synchronizedMap(new WeakHashMap<L2PcInstance,RecipeItemMaker>());
     protected static final Random _rnd = new Random();
 	
-	public static RecipeController getInstance()
-	{
-		if (_instance == null)
-		{
-			_instance = new RecipeController();
-		}
-		return _instance;
-	}
+	public static RecipeController getInstance()	{return _instance == null? _instance = new RecipeController() : _instance;}
 	
 	public RecipeController()
 	{
@@ -112,17 +104,14 @@
             try { lnr.close(); } catch (Exception e) { }
         }
 	}
-	
 	public int getRecipesCount()
 	{
 		return _lists.size();
 	}
-	
 	public L2RecipeList getRecipeList(int listId)
 	{
 		return _lists.get(listId);
 	}
-	
 	public L2RecipeList getRecipeByItemId(int itemId)
 	{
 		for (int i = 0; i < _lists.size(); i++)
@@ -135,37 +124,32 @@
 		}
 		return null;
 	}
-	
 	public synchronized void requestBookOpen(L2PcInstance player, boolean isDwarvenCraft)
 	{						
 		if (!Config.ALT_GAME_CREATION){
 			RecipeBookItemList response = new RecipeBookItemList(isDwarvenCraft,player.getMaxMp()); 
-		 	if (isDwarvenCraft) 
-		 		response.addRecipes(player.getDwarvenRecipeBook()); 
-		 	else 
-		 		response.addRecipes(player.getCommonRecipeBook()); 
+	 		response.addRecipes(isDwarvenCraft ? player.getDwarvenRecipeBook() : player.getCommonRecipeBook()); 
 			player.sendPacket(response);
 			return;
 		}
-        ReceipeItemMaker maker = activeMakers.get(player);
+		
+        RecipeItemMaker maker = activeMakers.get(player);
+        
         if (maker == null) {
         	RecipeBookItemList response = new RecipeBookItemList(isDwarvenCraft,player.getMaxMp()); 
-		 	if (isDwarvenCraft) 
-		 		response.addRecipes(player.getDwarvenRecipeBook()); 
-		 	else 
-		 		response.addRecipes(player.getCommonRecipeBook());
+        	response.addRecipes(isDwarvenCraft ? player.getDwarvenRecipeBook() : player.getCommonRecipeBook());
         	player.sendPacket(response);
         	return;
         }
-        if (maker.timeReady <= GameTimeController.getGameTicks()) {
-        	maker.run();
-        	return;
-        }
+        
         SystemMessage sm = new SystemMessage(SystemMessage.CANT_ALTER_RECIPEBOOK_WHILE_CRAFTING);
         player.sendPacket(sm);
         return;
 	}
-	
+	public synchronized void requestMakeItemAbort(L2PcInstance player)
+	{
+		activeMakers.remove(player);
+	}
 	public synchronized void requestManufactureItem(L2PcInstance manufacturer, int recipeListId, L2PcInstance player)
 	{
 		L2RecipeList recipeList = getRecipeList(recipeListId-1);
@@ -182,9 +166,9 @@
 			return;
 		}
 		if (!Config.ALT_GAME_CREATION) {
-			new ReceipeItemMaker(manufacturer, recipeList, player);
+			new RecipeItemMaker(manufacturer, recipeList, player);
 		} else {
-			ReceipeItemMaker maker = activeMakers.get(manufacturer);
+			RecipeItemMaker maker = activeMakers.get(manufacturer);
 			if (maker != null)
 			{
 				sm = new SystemMessage(614); 
@@ -194,7 +178,7 @@
             			manufacturer.isInCraftMode(false);
 				return;
 			}
-			maker = new ReceipeItemMaker(manufacturer, recipeList, player);
+			maker = new RecipeItemMaker(manufacturer, recipeList, player);
 			if (maker.isValid)
 				activeMakers.put(manufacturer, maker);
 		}
@@ -202,377 +186,356 @@
 	public synchronized void requestMakeItem(L2PcInstance player, int recipeListId)
 	{
 		L2RecipeList recipeList = getRecipeList(recipeListId-1);
-		
-		SystemMessage sm = new SystemMessage(614);
         
-    		player.isInCraftMode(true);
+   		player.isInCraftMode(true);
 		if ((recipeList == null) || (recipeList.getRecipes().length == 0))
 		{
-			sm = new SystemMessage(614); 
-			sm.addString("No recipe for: " + recipeListId);
-			player.sendPacket(sm);
+			player.sendMessage("No recipe for: " + recipeListId);
             player.isInCraftMode(false);
 			return;
 		}
 		if (!Config.ALT_GAME_CREATION) {
-			new ReceipeItemMaker(player, recipeList, player);
+			new RecipeItemMaker(player, recipeList, player);
 		} else {
-			ReceipeItemMaker maker = activeMakers.get(player);
+			RecipeItemMaker maker = activeMakers.get(player);
 			if (maker != null)
 			{
-				sm = new SystemMessage(614); 
+				SystemMessage sm = new SystemMessage(614); 
 				sm.addString("You are busy creating ");
 				sm.addItemName(recipeList.getItemId());
 				player.sendPacket(sm);
                 player.isInCraftMode(false);
 				return;
 			}
-			maker = new ReceipeItemMaker(player, recipeList, player);
+			maker = new RecipeItemMaker(player, recipeList, player);
 			if (maker.isValid)
 				activeMakers.put(player, maker);
 		}
 	}
-	
-	public synchronized void requestMakeItemAbort(L2PcInstance player)
-	{
-		activeMakers.remove(player);
-	}
-	
 	private void parseList(String line)
 	{
-		StringTokenizer st = new StringTokenizer(line,";");
-		List<L2RecipeInstance> recipePartList = new FastList<L2RecipeInstance>();
+		try 
+		{
+			StringTokenizer st = new StringTokenizer(line,";");
+			List<L2RecipeInstance> recipePartList = new FastList<L2RecipeInstance>();
 		
-        //we use common/dwarf for easy reading of the recipes.csv file 
-	 	String recipeTypeString = st.nextToken(); 
+			//we use common/dwarf for easy reading of the recipes.csv file 
+			String recipeTypeString = st.nextToken(); 
 	 	
-	 	//now we parse the string into a boolean 
-	 	boolean isDwarvenRecipe; 
-	 	if (recipeTypeString.equalsIgnoreCase("dwarven")) 
-	 		isDwarvenRecipe = true; 
-	 	else if (recipeTypeString.equalsIgnoreCase("common")) 
-	 		isDwarvenRecipe = false; 
-	 	else 
-	 	{
-	 		//prints a helpfull message 
-	 		_log.warning("Error parsing recipes.csv, unknow recipe type "+recipeTypeString); 
-	 		return; 
-	 	}
+			//now we parse the string into a boolean 
+			boolean isDwarvenRecipe; 
+	 	
+			if (recipeTypeString.equalsIgnoreCase("dwarven")) 		isDwarvenRecipe = true; 
+			else if (recipeTypeString.equalsIgnoreCase("common"))	isDwarvenRecipe = false; 
+			else 
+			{	//prints a helpfull message 
+				_log.warning("Error parsing recipes.csv, unknow recipe type "+recipeTypeString); 
+				return;
+			}
 		
-		String recipeName = st.nextToken();
-		int id = Integer.parseInt(st.nextToken());
-		int recipeId = Integer.parseInt(st.nextToken());
-		int level = Integer.parseInt(st.nextToken());
+			String recipeName = st.nextToken();
+			int id = Integer.parseInt(st.nextToken());
+			int recipeId = Integer.parseInt(st.nextToken());
+			int level = Integer.parseInt(st.nextToken());
 		
-		//material
-		StringTokenizer st2 = new StringTokenizer(st.nextToken(), "[],");
-		while (st2.hasMoreTokens())
-		{
-			StringTokenizer st3 = new StringTokenizer(st2.nextToken(), "()");
-			int rpItemId = Integer.parseInt(st3.nextToken());
-			int quantity = Integer.parseInt(st3.nextToken());
-			L2RecipeInstance rp = new L2RecipeInstance(rpItemId, quantity);
-			recipePartList.add(rp);
-			//recipe.addRecipe(rp);
-		}
+			//material
+			StringTokenizer st2 = new StringTokenizer(st.nextToken(), "[],");
+			while (st2.hasMoreTokens())
+			{
+				StringTokenizer st3 = new StringTokenizer(st2.nextToken(), "()");
+				int rpItemId = Integer.parseInt(st3.nextToken());
+				int quantity = Integer.parseInt(st3.nextToken());
+				L2RecipeInstance rp = new L2RecipeInstance(rpItemId, quantity);
+				recipePartList.add(rp);
+			}
 		
-		int itemId = Integer.parseInt(st.nextToken());
-		int count = Integer.parseInt(st.nextToken());
+			int itemId = Integer.parseInt(st.nextToken());
+			int count = Integer.parseInt(st.nextToken());
 		
-		//npc fee
-		/*String notdoneyet = */ st.nextToken();
+			//npc fee
+			/*String notdoneyet = */ st.nextToken();
 		
-		int mpCost = Integer.parseInt(st.nextToken());
-		int successRate = Integer.parseInt(st.nextToken());
+			int mpCost = Integer.parseInt(st.nextToken());
+			int successRate = Integer.parseInt(st.nextToken());
 		
-		L2RecipeList recipeList = new L2RecipeList(id,level,recipeId,recipeName,successRate,mpCost,itemId,count,isDwarvenRecipe);
-		for (L2RecipeInstance recipePart : recipePartList)
-		{
-			recipeList.addRecipe(recipePart);
-		}
-		_lists.put(new Integer(_lists.size()), recipeList);
+			L2RecipeList recipeList = new L2RecipeList(id,level,recipeId,recipeName,successRate,mpCost,itemId,count,isDwarvenRecipe);
+			for (L2RecipeInstance recipePart : recipePartList)
+			{
+				recipeList.addRecipe(recipePart);
+			}
+			_lists.put(new Integer(_lists.size()), recipeList);
+		} catch (Exception e) {
+			_log.severe("Exception in RecipeController.parseList() - " + e);
+		};
 	}
+
 	
-	
-	
-	
-	class ReceipeItemMaker implements Runnable
+	public class RecipeItemMaker implements Runnable
 	{
-		int   timeReady;
+		public boolean isValid;
+		final List<L2ItemInstance> items;
+		int materialsRefPrice;
 		final L2PcInstance player;
-		final L2PcInstance target;
+		int price;
 		final L2RecipeList recipeList;
-		final List<L2ItemInstance> items;
-		int   materialsRefPrice;
-		int   totalItems;
-		int   usedItems;
-		int   price;
-		boolean isValid;
-		
-		ReceipeItemMaker(L2PcInstance player, L2RecipeList recipeList, L2PcInstance target )
+		final L2PcInstance target;
+		int timeReady;
+		int totalItems;
+		int usedItems;
+
+		public RecipeItemMaker(L2PcInstance player, L2RecipeList recipeList, L2PcInstance target)
 		{
 			this.player = player;
 			this.target = target;
 			this.recipeList = recipeList;
 			this.items = new FastList<L2ItemInstance>();
-			
-			int skillLevel; 
-			if (recipeList.isDwarvenRecipe()) 
+
+			int skillLevel = recipeList.isDwarvenRecipe()	? player.getSkillLevel(L2Skill.SKILL_CREATE_DWARVEN)
+															: player.getSkillLevel(L2Skill.SKILL_CREATE_COMMON);
+
+			if (skillLevel <= 0)
 			{
-				skillLevel = player.getSkillLevel(L2Skill.SKILL_CREATE_DWARVEN); 
-				if (skillLevel <= 0) 
-				{
-					player.sendPacket(new ActionFailed()); 
-					player.isInCraftMode(false); 
-					return;
-				} 
-			} 
-			else 
-			{ 
-				skillLevel = player.getSkillLevel(L2Skill.SKILL_CREATE_COMMON); 
-				if (skillLevel <= 0) 
-				{ 
-					player.sendPacket(new ActionFailed()); 
-					player.isInCraftMode(false); 
-					return; 
-				} 
+				player.sendPacket(new ActionFailed());
+				player.isInCraftMode(false);
+				return;
 			}
-			
+
 			if ((recipeList == null) || (recipeList.getRecipes().length == 0))
 			{
-				SystemMessage sm = new SystemMessage(614); 
-				sm.addString("No such recipe");
-				player.sendPacket(sm);
-                player.isInCraftMode(false);
+				player.sendMessage("No such recipe");
+				player.isInCraftMode(false);
 				return;
 			}
-			
-			if (target != player)
+
+			if (target != player) // target using manufacture services of player 
 			{
-			    for (L2ManufactureItem temp : player.getCreateList().getList())
-					if (temp.getRecipeId() == recipeList.getId())
+				for (L2ManufactureItem temp : player.getCreateList().getList())
+					if (temp.getRecipeId() == recipeList.getId()) // find recipe for item we want manufactured
 					{
-					    price = temp.getCost();
-					    if (target.getAdena() < price)
-					    {
+						price = temp.getCost();
+						if (target.getAdena() < price) // check price
+						{
 							target.sendPacket(new SystemMessage(SystemMessage.YOU_NOT_ENOUGH_ADENA));
 							player.isInCraftMode(false);
 							return;
-					    }
-					    break;
+						}
+						break;
 					}
 			}
-			if (recipeList.getLevel()>skillLevel)
+
+			if (recipeList.getLevel() > skillLevel)
 			{
-				SystemMessage sm = new SystemMessage(614); 
-				sm.addString("Need skill level "+recipeList.getLevel());
-				player.sendPacket(sm);
-                player.isInCraftMode(false);
+				player.sendMessage("Need skill level " + recipeList.getLevel());
+				player.isInCraftMode(false);
 				return;
 			}
-			/*
-			 if (recipeList.getAdenaCost()>activeChar.getAdena())
-			 {
-			 SystemMessage sm = new SystemMessage(614); 
-			 sm.addString("Need "+recipeList.getAdenaCost()+" Adena");
-			 activeChar.sendPacket(sm);
-			 return;
-			 }*/
-			
+
 			L2RecipeInstance[] recipes = recipeList.getRecipes();
-			
+
 			Inventory inv = target.getInventory();
-			
+
 			for (L2RecipeInstance recipe : recipes)
 			{
 				if (recipe.getQuantity() != 0)
 				{
 					L2ItemInstance invItem = inv.getItemByItemId(recipe.getItemId());
-					if ((invItem == null) || ((recipeList.isConsumable() ? (int)(recipe.getQuantity() * Config.RATE_CONSUMABLE_COST) : recipe.getQuantity()) > invItem.getCount()))
+					if ((invItem == null)
+						|| ((recipeList.isConsumable()	? (int) (recipe.getQuantity() * Config.RATE_CONSUMABLE_COST)
+														: recipe.getQuantity()) > invItem.getCount()))
 					{
-						target.sendMessage("You dont have the right elements for making this item" + ((recipeList.isConsumable() && Config.RATE_CONSUMABLE_COST != 1)?".\nDue to server rates you need "+Config.RATE_CONSUMABLE_COST+"x more material than listed in recipe":""));
-                        player.isInCraftMode(false);
+						target.sendMessage("You dont have the right elements for making this item"
+							+ ((recipeList.isConsumable() && Config.RATE_CONSUMABLE_COST != 1)	? ".\nDue to server rates you need "
+																									+ Config.RATE_CONSUMABLE_COST
+																									+ "x more material than listed in recipe"
+																								: ""));
+						player.isInCraftMode(false);
 						return;
 					}
 				}
 			}
-			
-			if (!Config.ALT_GAME_CREATION)
-			{
-				if (player.getCurrentMp() < recipeList.getMpCost())
-				{
-					if (Config.DEBUG) _log.fine("not enough mana");
-					target.sendPacket(new SystemMessage(SystemMessage.NOT_ENOUGH_MP));
-					timeReady = GameTimeController.getGameTicks();
-                    player.isInCraftMode(false);
-					return;
-				}
-			}
-			
+
+			if (!Config.ALT_GAME_CREATION && !validateMp()) return;
+
 			for (L2RecipeInstance recipe : recipes)
 			{
 				if (recipe.getQuantity() != 0)
 				{
 					L2ItemInstance invItem = inv.getItemByItemId(recipe.getItemId());
-					invItem = inv.dropItem("Manufacture", invItem.getObjectId(), recipeList.isConsumable() ? (int)(recipe.getQuantity() * Config.RATE_CONSUMABLE_COST) : recipe.getQuantity(), target, player);
+					invItem = inv.dropItem(
+											"Manufacture",
+											invItem.getObjectId(),
+											recipeList.isConsumable()	? (int) (recipe.getQuantity() * Config.RATE_CONSUMABLE_COST)
+																		: recipe.getQuantity(), target,
+											player);
 					items.add(invItem);
-					materialsRefPrice += invItem.getReferencePrice()*invItem.getCount();
+					materialsRefPrice += invItem.getReferencePrice() * invItem.getCount();
 					totalItems += invItem.getCount();
 				}
 			}
-			
-			isValid = true; 
-			
+
+			isValid = true;
 			timeReady = GameTimeController.TICKS_PER_SECOND + GameTimeController.getGameTicks();
-			ClientScheduler.getInstance().scheduleLow(this, 1100);
+			if(Config.ALT_GAME_CREATION) ClientScheduler.getInstance().scheduleLow(this, 1100); 
+			else run(); // :)  this also helps remove craft lag
 		}
-		
-		public void run()
+
+		private void finishCrafting()
 		{
-            player.isInCraftMode(true);
-            
-			if ( Config.IS_CRAFTING_ENABLED ) {
-				double currentPlayerMp = player.getCurrentMp(); 
-				if (currentPlayerMp < recipeList.getMpCost()) {
-					if (Config.DEBUG) _log.fine("not enough mana");
-					target.sendPacket(new SystemMessage(SystemMessage.NOT_ENOUGH_MP));
-					timeReady = GameTimeController.getGameTicks();
-                    player.isInCraftMode(false);
-					return;
-				}
-				
-				int gameTicks = GameTimeController.getGameTicks();	
-				if (timeReady > gameTicks)
-                {
-                    player.isInCraftMode(false);
-					return;
-                }
-				
-				timeReady = gameTicks + (int)(15 * player.getMReuseRate(player.getKnownSkill(172)) * GameTimeController.TICKS_PER_SECOND);			
-				
-				if (!Config.ALT_GAME_CREATION || items.isEmpty())
-				{
-					player.reduceCurrentMp(recipeList.getMpCost());
-					
-					if(Rnd.get(100) < recipeList.getSuccessRate()) 
-					{
-						int itemId = recipeList.getItemId();
-						int itemCount = recipeList.getCount();
-						
-						if (target != player)
-						{
-						    if (price > 0)
-						    {
-								target.reduceAdena("Manufacture", price, player, false);
-								player.addAdena("Manufacture", price, target, false);
-						    }
+			player.reduceCurrentMp(recipeList.getMpCost());
 
-						    StatusUpdate su2 = new StatusUpdate(target.getObjectId());
-						    su2.addAttribute(StatusUpdate.CUR_LOAD, target.getCurrentLoad());
-						    target.sendPacket(su2);
-						}
+			if (Rnd.get(100) < recipeList.getSuccessRate())
+			{
+				int itemId = recipeList.getItemId();
+				int itemCount = recipeList.getCount();
 
-						L2ItemInstance createdItem = target.getInventory().addItem("Manufacture", itemId, itemCount, target, player);
-						SystemMessage sm = new SystemMessage(SystemMessage.EARNED_ITEM);
-						sm.addItemName(itemId);
-						sm.addNumber(itemCount);
-						target.sendPacket(sm);
-
-						if (Config.ALT_GAME_CREATION) {
-							int skillLevel;
-							if (recipeList.isDwarvenRecipe()) 
-								skillLevel = player.getSkillLevel(L2Skill.SKILL_CREATE_DWARVEN); 
-							else 
-								skillLevel = player.getSkillLevel(L2Skill.SKILL_CREATE_COMMON); 
-							int receipeLevel = recipeList.getLevel();
-							int exp = createdItem.getReferencePrice()*itemCount;
-							// one variation
-							exp -= materialsRefPrice;
-							if (exp < 0) exp = 0;
-							// another variation
-							// exp /= receipeLevel
-							for (int i=skillLevel; i > receipeLevel; i--)
-								exp /= 4;
-							int sp = exp / 10;
-                            player.addExpAndSp((int)player.calcStat(Stats.EXPSP_RATE, exp * Config.RATE_XP, null, null), 
-                                               (int)player.calcStat(Stats.EXPSP_RATE, sp * Config.RATE_SP, null, null));
-						}
-					}
-					else
+				if (target != player)
+				{
+					if (price > 0)
 					{
-						player.sendMessage("Item(s) failed to create");
-                        player.isInCraftMode(false);
+						target.reduceAdena("Manufacture", price, player, false);
+						player.addAdena("Manufacture", price, target, false);
 					}
-					activeMakers.remove(player);
-                    player.isInCraftMode(false);
-					
-					StatusUpdate su = new StatusUpdate(player.getObjectId());
-				    su.addAttribute(StatusUpdate.CUR_LOAD, player.getCurrentLoad());
-					su.addAttribute(StatusUpdate.CUR_MP, (int) player.getCurrentMp());
-					player.sendPacket(su);
 
-					target.sendPacket(new ItemList(target, false));
-				    if (target == player) target.sendPacket(new RecipeItemMakeInfo(recipeList.getId(),target));
-					else target.sendPacket(new RecipeShopItemInfo(player.getObjectId(),recipeList.getId()));
-				} 
-				else {
-					double currentMp = player.getCurrentMp(); 
-					if (currentMp < recipeList.getMpCost()) {
-						if (Config.DEBUG) _log.fine("not enough mana");
-						SystemMessage sm = new SystemMessage(SystemMessage.NOT_ENOUGH_MP); 
-						if (target == null)
-						    player.sendPacket(sm);
-						else
-						    target.sendPacket(sm);
-						timeReady = GameTimeController.getGameTicks();
-                        player.isInCraftMode(false);
-						return;
-					}
-					player.setCurrentMp(currentMp - recipeList.getMpCost());
-					
-					int numItems = player.getSkillLevel(172);
-					while (numItems > 0 && !items.isEmpty()) {
-						L2ItemInstance item = items.get(0);
-						
-						int count = item.getCount();
-						if (count >= numItems) count = numItems;
-						
-						item.setCount(item.getCount() - count);
-						if (item.getCount() <= 0) items.remove(0);
-						
-						numItems -= count;
-						usedItems += count;
-						
-						SystemMessage sm = new SystemMessage(368);
-						sm.addNumber(count);
-						sm.addItemName(item.getItemId());
-						if (target == null)
-						    player.sendPacket(sm);
-						else
-						    target.sendPacket(sm);
-						
-                        player.isInCraftMode(false);
-					}
-					
-					int delay = (timeReady-gameTicks) * GameTimeController.MILLIS_IN_TICK;
-					MagicSkillUser msk = new MagicSkillUser(player, 1050, 1, delay, 0);
-					player.broadcastPacket(msk);
-					SetupGauge sg = new SetupGauge(0, delay);
-					player.sendPacket(sg);				
-					
-					ClientScheduler.getInstance().scheduleLow(this, 100+delay);
+					StatusUpdate su2 = new StatusUpdate(target.getObjectId());
+					su2.addAttribute(StatusUpdate.CUR_LOAD, target.getCurrentLoad());
+					target.sendPacket(su2);
 				}
+
+				L2ItemInstance createdItem = target.getInventory().addItem("Manufacture", itemId, itemCount,
+																			target, player);
+				SystemMessage sm = new SystemMessage(SystemMessage.EARNED_ITEM);
+				sm.addItemName(itemId);
+				sm.addNumber(itemCount);
+				target.sendPacket(sm);
+
+				if (Config.ALT_GAME_CREATION)
+				{
+					int skillLevel;
+					skillLevel = player.getSkillLevel(recipeList.isDwarvenRecipe() ? L2Skill.SKILL_CREATE_DWARVEN : L2Skill.SKILL_CREATE_COMMON);
+					int receipeLevel = recipeList.getLevel();
+					int exp = createdItem.getReferencePrice() * itemCount;
+					// one variation
+					exp -= materialsRefPrice;
+					if (exp < 0) exp = 0;
+					// another variation
+					// exp /= receipeLevel
+					for (int i = skillLevel; i > receipeLevel; i--)
+						exp /= 4;
+					int sp = exp / 10;
+					player.addExpAndSp((int) player.calcStat(Stats.EXPSP_RATE, exp * Config.RATE_XP, null,
+																null),
+										(int) player.calcStat(Stats.EXPSP_RATE, sp * Config.RATE_SP, null,
+																null));
+					if(Config.DEBUG) 
+						_log.warning("Rewarded "+ player.calcStat(Stats.EXPSP_RATE, exp * Config.RATE_XP, null,null) + 
+					    " XP   "+(int) player.calcStat(Stats.EXPSP_RATE, sp * Config.RATE_SP, null,null) + " SP  to " + player.getName() );
+				}
 			}
-			else {
-				// crafting is disabled...
-				SystemMessage sm = new SystemMessage(614);
-				sm.addString("Crafting is currently disabled.");
-				if (target == null)
-				    player.sendPacket(sm);
-				else
-				    target.sendPacket(sm);
-                player.isInCraftMode(false);
+			else
+			{
+				player.sendMessage("Item(s) failed to create");
+				player.isInCraftMode(false);
 			}
+			activeMakers.remove(player);  // cause of this, we can't move RecipeItemMaker class out of RecipeController class
+										  // would be nice to rewrite crafting again some day, but for now I am happy with "fix craft lag"
+			
+			player.isInCraftMode(false);
+
+			StatusUpdate su = new StatusUpdate(player.getObjectId());
+			su.addAttribute(StatusUpdate.CUR_LOAD, player.getCurrentLoad());
+			su.addAttribute(StatusUpdate.CUR_MP, (int) player.getCurrentMp());
+			player.sendPacket(su);
+
+			target.sendPacket(new ItemList(target, false));
+			if (target == player) target.sendPacket(new RecipeItemMakeInfo(recipeList.getId(), target));
+			else target.sendPacket(new RecipeShopItemInfo(player.getObjectId(), recipeList.getId()));
+
 		}
+
+		private void grabSomeItems()
+		{
+			int numItems = player.getSkillLevel(172);
+			while (numItems > 0 && !items.isEmpty())
+			{
+				L2ItemInstance item = items.get(0);
+
+				int count = item.getCount();
+				if (count >= numItems) count = numItems;
+
+				item.setCount(item.getCount() - count);
+				if (item.getCount() <= 0) items.remove(0);
+
+				numItems -= count;
+				usedItems += count;
+
+				SystemMessage sm = new SystemMessage(368);
+				sm.addNumber(count);
+				sm.addItemName(item.getItemId());
+				if (target == null) player.sendPacket(sm);
+				else target.sendPacket(sm);
+
+				player.isInCraftMode(false);
+			}
+		}
+
+		public void run()
+		{
+			player.isInCraftMode(true);
+			int gameTicks = GameTimeController.getGameTicks();
+			if (!validateCraftingEnabled() || !validateMp()) return;
+
+	/*		this is why craft lag happened
+	 
+	 		if (timeReady > gameTicks)
+			{
+				player.isInCraftMode(false);
+				return;
+			}
+	*/
+
+			// divided by RATE_CONSUMABLES_COST to remove craft time increase on higher consumable rates (more mats consumed -> more time)
+			timeReady = gameTicks
+				+ (int) (Config.ALT_GAME_CREATION_SPEED * player.getMReuseRate(player.getKnownSkill(172)) * GameTimeController.TICKS_PER_SECOND / Config.RATE_CONSUMABLE_COST);
+
+			if (Config.ALT_GAME_CREATION && !items.isEmpty()) 
+			{
+				if (!validateMp()) return;
+
+				player.reduceCurrentMp(recipeList.getMpCost());		// use some mp
+				grabSomeItems();									// grab (equip) some more items with a nice msg to player
+
+				int delay = (timeReady - gameTicks) * GameTimeController.MILLIS_IN_TICK;
+				MagicSkillUser msk = new MagicSkillUser(player, 1050, 1, delay, 0);
+				player.broadcastPacket(msk);
+				SetupGauge sg = new SetupGauge(0, delay);
+				player.sendPacket(sg);
+
+				ClientScheduler.getInstance().scheduleLow(this, 100 + delay);
+			} else finishCrafting();
+		}
+
+		private boolean validateCraftingEnabled()
+		{
+			if (!Config.IS_CRAFTING_ENABLED)
+			{
+				target.sendMessage("Crafting is currently disabled.");
+				player.isInCraftMode(false);
+				return false;
+			}
+			return true;
+		}
+
+		private boolean validateMp()
+		{
+			if (player.getCurrentMp() < recipeList.getMpCost())
+			{
+				target.sendPacket(new SystemMessage(SystemMessage.NOT_ENOUGH_MP));
+				player.isInCraftMode(false);
+				return false;
+			}
+			return true;
+		}
 	}
+	
+	
 }
Index: C:/workspace/c4/build.xml
===================================================================
--- C:/workspace/c4/build.xml	(revision 1587)
+++ C:/workspace/c4/build.xml	(working copy)
@@ -61,7 +61,7 @@
             description="Compile the source.">
 
         <javac destdir="${build.classes}"
-               optimize="off"
+               optimize="on"
                debug="on"
                source="1.5"
                target="1.5"