Index: C:/workspace/c4/java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java =================================================================== --- C:/workspace/c4/java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java (revision 1605) +++ C:/workspace/c4/java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java (working copy) @@ -5200,11 +5101,10 @@ } // Check if the caster isn't sitting - if (isSitting() && !skill.isPotion()) + if (isSitting() && !skill.isPotion() && !skill.isCraftingSkillType()) { // Send a System Message to the caster sendPacket(new SystemMessage(SystemMessage.CANT_MOVE_SITTING)); - // Send a Server->Client packet ActionFailed to the L2PcInstance sendPacket(new ActionFailed()); return; Index: C:/workspace/c4/java/net/sf/l2j/gameserver/model/L2Skill.java =================================================================== --- C:/workspace/c4/java/net/sf/l2j/gameserver/model/L2Skill.java (revision 1605) +++ C:/workspace/c4/java/net/sf/l2j/gameserver/model/L2Skill.java (working copy) @@ -461,6 +460,12 @@ return _ispotion; } + public final boolean isCraftingSkillType() + { + if (getSkillType() == SkillType.DWARVEN_CRAFT || getSkillType() == SkillType.COMMON_CRAFT) return true; + return false; + } + public final int getArmorsAllowed() { return _armorsAllowed; Index: C:/workspace/c4/java/net/sf/l2j/gameserver/serverpackets/RecipeItemMakeInfo.java =================================================================== --- C:/workspace/c4/java/net/sf/l2j/gameserver/serverpackets/RecipeItemMakeInfo.java (revision 1605) +++ C:/workspace/c4/java/net/sf/l2j/gameserver/serverpackets/RecipeItemMakeInfo.java (working copy) @@ -31,14 +31,23 @@ { private static final String _S__D7_RECIPEITEMMAKEINFO = "[S] D7 RecipeItemMakeInfo"; private int _id; - private L2PcInstance _player; + private L2PcInstance _player; + private boolean _success; - public RecipeItemMakeInfo(int id, L2PcInstance player) + public RecipeItemMakeInfo(int id, L2PcInstance player, boolean success) { _id = id; - _player = player; + _player = player; + _success = success; } + public RecipeItemMakeInfo(int id,L2PcInstance player) + { + _id = id; + _player = player; + _success = true; + } + final void runImpl() { // no long-running tasks @@ -49,8 +58,10 @@ writeC(0xD7); writeD(_id); + writeD(0); // unknown writeD((int)_player.getCurrentMp()); writeD((int)_player.getMaxMp()); + writeD(_success ? 1 : 0); // item creation success/failed } /* (non-Javadoc) Index: C:/workspace/c4/java/net/sf/l2j/gameserver/RecipeController.java =================================================================== --- C:/workspace/c4/java/net/sf/l2j/gameserver/RecipeController.java (revision 1612) +++ C:/workspace/c4/java/net/sf/l2j/gameserver/RecipeController.java (working copy) @@ -57,61 +57,74 @@ public class RecipeController { protected static Logger _log = Logger.getLogger(RecipeController.class.getName()); - + private static RecipeController _instance; private Map _lists; - protected static Map activeMakers = Collections.synchronizedMap(new WeakHashMap()); - protected static final Random _rnd = new Random(); - - public static RecipeController getInstance() {return _instance == null? _instance = new RecipeController() : _instance;} - + protected static Map activeMakers = Collections.synchronizedMap(new WeakHashMap()); + protected static final Random _rnd = new Random(); + + public static RecipeController getInstance() + { + return _instance == null ? _instance = new RecipeController() : _instance; + } + public RecipeController() { _lists = new FastMap(); String line = null; LineNumberReader lnr = null; - + try { File recipesData = new File(Config.DATAPACK_ROOT, "data/recipes.csv"); - lnr = new LineNumberReader(new BufferedReader( new FileReader(recipesData))); - - while ((line=lnr.readLine()) != null) + lnr = new LineNumberReader(new BufferedReader(new FileReader(recipesData))); + + while ((line = lnr.readLine()) != null) { if (line.trim().length() == 0 || line.startsWith("#")) { continue; } - + parseList(line); - + } - _log.config("RecipeController: Loaded "+_lists.size()+" Recipes."); + _log.config("RecipeController: Loaded " + _lists.size() + " Recipes."); } catch (Exception e) { if (lnr != null) { - _log.log(Level.WARNING, "error while creating recipe controller in linenr: "+lnr.getLineNumber(), e); + _log.log(Level.WARNING, "error while creating recipe controller in linenr: " + + lnr.getLineNumber(), e); } else { _log.warning("No recipes were found in data folder"); } } - finally - { - try { lnr.close(); } catch (Exception e) { } - } + finally + { + 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++) @@ -124,120 +137,112 @@ } return null; } + public synchronized void requestBookOpen(L2PcInstance player, boolean isDwarvenCraft) - { - if (!Config.ALT_GAME_CREATION){ - RecipeBookItemList response = new RecipeBookItemList(isDwarvenCraft,player.getMaxMp()); - response.addRecipes(isDwarvenCraft ? player.getDwarvenRecipeBook() : player.getCommonRecipeBook()); + { + RecipeItemMaker maker = null; + if (Config.ALT_GAME_CREATION) maker = activeMakers.get(player); + + if (maker == null) + { + RecipeBookItemList response = new RecipeBookItemList(isDwarvenCraft, player.getMaxMp()); + response.addRecipes(isDwarvenCraft ? player.getDwarvenRecipeBook() + : player.getCommonRecipeBook()); player.sendPacket(response); return; } - - RecipeItemMaker maker = activeMakers.get(player); - - if (maker == null) { - RecipeBookItemList response = new RecipeBookItemList(isDwarvenCraft,player.getMaxMp()); - response.addRecipes(isDwarvenCraft ? player.getDwarvenRecipeBook() : player.getCommonRecipeBook()); - player.sendPacket(response); - return; - } - - SystemMessage sm = new SystemMessage(SystemMessage.CANT_ALTER_RECIPEBOOK_WHILE_CRAFTING); - player.sendPacket(sm); - 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) + + public synchronized void requestManufactureItem(L2PcInstance manufacturer, int recipeListId, + L2PcInstance player) { - L2RecipeList recipeList = getRecipeList(recipeListId-1); - - SystemMessage sm = new SystemMessage(614); - + L2RecipeList recipeList = getValidRecipeList(player, recipeListId); + + if (recipeList == null) return; manufacturer.isInCraftMode(true); - if ((recipeList == null) || (recipeList.getRecipes().length == 0) || (!manufacturer.hasRecipeList(recipeListId))) + + if (!Config.ALT_GAME_CREATION) { - sm = new SystemMessage(614); - sm.addString("No recipe for: " + recipeListId); - player.sendPacket(sm); - manufacturer.isInCraftMode(false); - return; + new RecipeItemMaker(manufacturer, recipeList, player); } - if (!Config.ALT_GAME_CREATION) { - new RecipeItemMaker(manufacturer, recipeList, player); - } else { + else + { RecipeItemMaker maker = activeMakers.get(manufacturer); if (maker != null) { - sm = new SystemMessage(614); - sm.addString("Manufacturer are busy creating."); - sm.addItemName(recipeList.getItemId()); - player.sendPacket(sm); - manufacturer.isInCraftMode(false); + player.sendMessage("Manufacturer is busy creating."); + manufacturer.isInCraftMode(false); return; } maker = new RecipeItemMaker(manufacturer, recipeList, player); - if (maker.isValid) - activeMakers.put(manufacturer, maker); + if (maker.isValid) activeMakers.put(manufacturer, maker); } } + public synchronized void requestMakeItem(L2PcInstance player, int recipeListId) { - L2RecipeList recipeList = getRecipeList(recipeListId-1); - - player.isInCraftMode(true); - if ((recipeList == null) || (recipeList.getRecipes().length == 0)) + L2RecipeList recipeList = getValidRecipeList(player, recipeListId); + + if (recipeList == null) return; + + player.isInCraftMode(true); + + if (!Config.ALT_GAME_CREATION) { - player.sendMessage("No recipe for: " + recipeListId); - player.isInCraftMode(false); - return; + new RecipeItemMaker(player, recipeList, player); } - if (!Config.ALT_GAME_CREATION) { - new RecipeItemMaker(player, recipeList, player); - } else { + else + { RecipeItemMaker maker = activeMakers.get(player); if (maker != null) { - SystemMessage 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); + player.isInCraftMode(false); return; } maker = new RecipeItemMaker(player, recipeList, player); - if (maker.isValid) - activeMakers.put(player, maker); + if (maker.isValid) activeMakers.put(player, maker); } } + private void parseList(String line) { - try + try { - StringTokenizer st = new StringTokenizer(line,";"); + 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(); - + 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); + 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()); - + //material StringTokenizer st2 = new StringTokenizer(st.nextToken(), "[],"); while (st2.hasMoreTokens()) @@ -248,28 +253,31 @@ L2RecipeInstance rp = new L2RecipeInstance(rpItemId, quantity); recipePartList.add(rp); } - + int itemId = Integer.parseInt(st.nextToken()); int count = Integer.parseInt(st.nextToken()); - + //npc fee - /*String notdoneyet = */ st.nextToken(); - + /*String notdoneyet = */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); + + 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) { + } + catch (Exception e) + { _log.severe("Exception in RecipeController.parseList() - " + e); - }; + } + ; } - public class RecipeItemMaker implements Runnable { public boolean isValid; @@ -280,103 +288,32 @@ final L2RecipeList recipeList; final L2PcInstance target; int timeReady; + int delay; + int gameTicks; int totalItems; int usedItems; - + int skillLevel; + public RecipeItemMaker(L2PcInstance player, L2RecipeList recipeList, L2PcInstance target) { this.player = player; this.target = target; this.recipeList = recipeList; this.items = new FastList(); + this.isValid = false; - int skillLevel = recipeList.isDwarvenRecipe() ? player.getSkillLevel(L2Skill.SKILL_CREATE_DWARVEN) - : player.getSkillLevel(L2Skill.SKILL_CREATE_COMMON); + skillLevel = recipeList.isDwarvenRecipe() ? player.getSkillLevel(L2Skill.SKILL_CREATE_DWARVEN) + : player.getSkillLevel(L2Skill.SKILL_CREATE_COMMON); - if (skillLevel <= 0) - { - player.sendPacket(new ActionFailed()); - player.isInCraftMode(false); - return; - } + if (!validateSkillLevel()) return; + if (!validateRecipeList()) return; + if (!validateCustomerCanAfford(target,player)) return; + if (!validateMaterials()) return; + if (!validateMp()) return; - if ((recipeList == null) || (recipeList.getRecipes().length == 0)) - { - player.sendMessage("No such recipe"); - player.isInCraftMode(false); - return; - } - - if (target != player) // target using manufacture services of player - { - 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) // check price - { - target.sendPacket(new SystemMessage(SystemMessage.YOU_NOT_ENOUGH_ADENA)); - player.isInCraftMode(false); - return; - } - break; - } - } - - if (recipeList.getLevel() > skillLevel) - { - player.sendMessage("Need skill level " + recipeList.getLevel()); - player.isInCraftMode(false); - 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())) - { - 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 && !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); - items.add(invItem); - materialsRefPrice += invItem.getReferencePrice() * invItem.getCount(); - totalItems += invItem.getCount(); - } - } - isValid = true; - timeReady = GameTimeController.TICKS_PER_SECOND + GameTimeController.getGameTicks(); - if(Config.ALT_GAME_CREATION) ClientScheduler.getInstance().scheduleLow(this, 1100); - else run(); // :) this also helps remove craft lag + updateTime(); + run(); } private void finishCrafting() @@ -385,9 +322,6 @@ if (Rnd.get(100) < recipeList.getSuccessRate()) { - int itemId = recipeList.getItemId(); - int itemCount = recipeList.getCount(); - if (target != player) { if (price > 0) @@ -395,62 +329,89 @@ target.reduceAdena("Manufacture", price, player, false); player.addAdena("Manufacture", price, target, false); } - - StatusUpdate su2 = new StatusUpdate(target.getObjectId()); - su2.addAttribute(StatusUpdate.CUR_LOAD, target.getCurrentLoad()); - target.sendPacket(su2); + updateCurLoad(); } - 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() ); - } + RewardPlayer(); + updateMakeInfo(true); // success } else { player.sendMessage("Item(s) failed to create"); + updateMakeInfo(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" - + 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)); + } - target.sendPacket(new ItemList(target, false)); - if (target == player) target.sendPacket(new RecipeItemMakeInfo(recipeList.getId(), target)); + public void run() + { + player.isInCraftMode(true); + gameTicks = GameTimeController.getGameTicks(); + if (!validateCraftingEnabled() || !validateMp()) return; + + updateTime(); + + if (Config.ALT_GAME_CREATION && !items.isEmpty()) + { + player.reduceCurrentMp(recipeList.getMpCost()); // use some mp + grabSomeItems(); // grab (equip) some more items with a nice msg to player + + MagicSkillUser msk = new MagicSkillUser( + player, + recipeList.isDwarvenRecipe() ? L2Skill.SKILL_CREATE_DWARVEN + : L2Skill.SKILL_CREATE_COMMON, + skillLevel, delay, 0); + + player.broadcastPacket(msk); + + player.sendPacket(new SetupGauge(0, delay)); + + ClientScheduler.getInstance().scheduleLow(this, 100 + delay); + } + else finishCrafting(); + + // update load and mana bar of craft window + updateMakeInfo(true); + updateCurMp(); + updateCurLoad(); + } + + private void updateTime() + { + // 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); + + delay = (timeReady - gameTicks) * GameTimeController.MILLIS_IN_TICK; + } + + private void updateMakeInfo(boolean success) + { + if (target == player) target.sendPacket(new RecipeItemMakeInfo(recipeList.getId(), target, success)); else target.sendPacket(new RecipeShopItemInfo(player.getObjectId(), recipeList.getId())); + } + private void updateCurLoad() + { + StatusUpdate su = new StatusUpdate(target.getObjectId()); + su.addAttribute(StatusUpdate.CUR_LOAD, target.getCurrentLoad()); + target.sendPacket(su); } + private void updateCurMp() + { + + StatusUpdate su = new StatusUpdate(target.getObjectId()); + su.addAttribute(StatusUpdate.CUR_MP, (int) target.getCurrentMp()); + target.sendPacket(su); + ; + } + private void grabSomeItems() { int numItems = player.getSkillLevel(172); @@ -467,7 +428,7 @@ numItems -= count; usedItems += count; - SystemMessage sm = new SystemMessage(368); + SystemMessage sm = new SystemMessage(368); // you equipped ... sm.addNumber(count); sm.addItemName(item.getItemId()); if (target == null) player.sendPacket(sm); @@ -475,64 +436,177 @@ } } - public void run() + private boolean validateCraftingEnabled() { - player.isInCraftMode(true); - int gameTicks = GameTimeController.getGameTicks(); - if (!validateCraftingEnabled() || !validateMp()) return; + if (!Config.IS_CRAFTING_ENABLED) + { + target.sendMessage("Crafting is currently disabled."); + player.isInCraftMode(false); + activeMakers.remove(player); + updateMakeInfo(false); + return false; + } + return true; + } - /* this is why craft lag happened - - if (timeReady > gameTicks) + private boolean validateCustomerCanAfford(L2PcInstance customer, L2PcInstance manufacturer) + { + if(customer==manufacturer) return true; + for (L2ManufactureItem temp : manufacturer.getCreateList().getList()) + if (temp.getRecipeId() == recipeList.getId()) // find recipe for item we want manufactured + { + int price = temp.getCost(); + if (customer.getAdena() < price) // check price + { + customer.sendPacket(new SystemMessage(SystemMessage.YOU_NOT_ENOUGH_ADENA)); + manufacturer.isInCraftMode(false); + activeMakers.remove(manufacturer); + return false; + } + break; + } + return true; + } + private boolean validateMp() + { + if (player.getCurrentMp() < recipeList.getMpCost()) { + target.sendPacket(new SystemMessage(SystemMessage.NOT_ENOUGH_MP)); player.isInCraftMode(false); - return; + activeMakers.remove(player); + updateMakeInfo(false); + return false; } - */ + return true; + } - // 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); + private boolean validateMaterials() + { + L2RecipeInstance[] recipes = recipeList.getRecipes(); - if (Config.ALT_GAME_CREATION && !items.isEmpty()) + Inventory inv = target.getInventory(); + + for (L2RecipeInstance recipe : recipes) { - if (!validateMp()) return; + 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())) + { + 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); + activeMakers.remove(player); + updateMakeInfo(false); + return false; + } + } + } - player.reduceCurrentMp(recipeList.getMpCost()); // use some mp - grabSomeItems(); // grab (equip) some more items with a nice msg to player + 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); + items.add(invItem); + materialsRefPrice += invItem.getReferencePrice() * invItem.getCount(); + totalItems += invItem.getCount(); + } + } - 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(); + return true; } - private boolean validateCraftingEnabled() + private boolean validateSkillLevel() { - if (!Config.IS_CRAFTING_ENABLED) + if (recipeList.getLevel() > skillLevel) { - target.sendMessage("Crafting is currently disabled."); + player.sendMessage("Need skill level " + recipeList.getLevel()); + player.sendPacket(new ActionFailed()); player.isInCraftMode(false); + activeMakers.remove(player); + updateMakeInfo(false); return false; } return true; } - private boolean validateMp() + private boolean validateRecipeList() { - if (player.getCurrentMp() < recipeList.getMpCost()) + if ((recipeList == null) || (recipeList.getRecipes().length == 0)) { - target.sendPacket(new SystemMessage(SystemMessage.NOT_ENOUGH_MP)); + player.sendMessage("No such recipe"); player.isInCraftMode(false); + activeMakers.remove(player); + updateMakeInfo(false); return false; } return true; } + + private void RewardPlayer() + { + 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 recipeLevel = recipeList.getLevel(); + int exp = createdItem.getReferencePrice() * itemCount; + // one variation + // exp -= materialsRefPrice; + + if (exp < 0) exp = 0; + + // another variation + exp /= recipeLevel; + for (int i = skillLevel; i > recipeLevel; 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)); + + sm = new SystemMessage(SystemMessage.YOU_EARNED_S1_EXP_AND_S2_SP); + sm.addNumber((int) player.calcStat(Stats.EXPSP_RATE, exp * Config.RATE_XP, null, null)); + sm.addNumber((int) player.calcStat(Stats.EXPSP_RATE, sp * Config.RATE_SP, null, null)); + player.sendPacket(sm); + } + } } + + private L2RecipeList getValidRecipeList(L2PcInstance player, int id) + { + L2RecipeList recipeList = getRecipeList(id - 1); + + if ((recipeList == null) || (recipeList.getRecipes().length == 0)) + { + player.sendMessage("No recipe for: " + id); + player.isInCraftMode(false); + return null; + } + return recipeList; + }; - + } +