rendered paste bodyIndex: 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"