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 _lists; - - protected static Map activeMakers = Collections.synchronizedMap(new WeakHashMap()); - + protected static Map activeMakers = Collections.synchronizedMap(new WeakHashMap()); 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 recipePartList = new FastList(); + try + { + StringTokenizer st = new StringTokenizer(line,";"); + List recipePartList = new FastList(); - //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 items; + int materialsRefPrice; final L2PcInstance player; - final L2PcInstance target; + int price; final L2RecipeList recipeList; - final List 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(); - - 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.">