Advertisement
Guest User

CraftManager

a guest
Sep 22nd, 2015
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 27.15 KB | None | 0 0
  1. /*
  2. * This program is free software; you can redistribute it and/or modify
  3. * it under the terms of the GNU General Public License as published by
  4. * the Free Software Foundation; either version 2, or (at your option)
  5. * any later version.
  6. *
  7. * This program is distributed in the hope that it will be useful,
  8. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. * GNU General Public License for more details.
  11. *
  12. * You should have received a copy of the GNU General Public License
  13. * along with this program; if not, write to the Free Software
  14. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  15. * 02111-1307, USA.
  16. *
  17. * http://www.gnu.org/copyleft/gpl.html
  18. */
  19. package net.sf.l2j.gameserver.model.actor.instance;
  20.  
  21. import java.util.ArrayList;
  22. import java.util.StringTokenizer;
  23.  
  24. import javolution.text.TextBuilder;
  25. import net.sf.l2j.Config;
  26. import net.sf.l2j.gameserver.RecipeController;
  27. import net.sf.l2j.gameserver.datatables.ItemTable;
  28. import net.sf.l2j.gameserver.model.Inventory;
  29. import net.sf.l2j.gameserver.model.L2ItemInstance;
  30. import net.sf.l2j.gameserver.model.L2Multisell;
  31. import net.sf.l2j.gameserver.model.L2RecipeInstance;
  32. import net.sf.l2j.gameserver.model.L2RecipeList;
  33. import net.sf.l2j.gameserver.serverpackets.InventoryUpdate;
  34. import net.sf.l2j.gameserver.serverpackets.NpcHtmlMessage;
  35. import net.sf.l2j.gameserver.serverpackets.SystemMessage;
  36. import net.sf.l2j.gameserver.templates.L2EtcItemType;
  37. import net.sf.l2j.gameserver.templates.L2Item;
  38. import net.sf.l2j.gameserver.templates.L2NpcTemplate;
  39. import net.sf.l2j.util.Rnd;
  40.  
  41. import javolution.text.TextBuilder;
  42.  
  43.  
  44.  
  45. public class L2CraftManagerInstance extends L2MerchantInstance
  46. {
  47. public static final int ADENA_ID = 57;
  48. public static final int ITEMS_PER_PAGE = 5; // items list size in craft and crystallize pages
  49.  
  50. public L2CraftManagerInstance(int objectId, L2NpcTemplate template)
  51. {
  52. super(objectId, template);
  53. }
  54.  
  55. @Override
  56. public void onBypassFeedback(L2PcInstance player, String command)
  57. {
  58. if (command.startsWith("multisell"))
  59. {
  60. L2Multisell.getInstance().createMultiSell(Integer.parseInt(command.substring(9).trim()), player, false, this);
  61. }
  62. else if (command.startsWith("Crystallize")) // List player inventory items for crystallization
  63. {
  64. int _pageId;
  65.  
  66. ArrayList<Integer> _itemsSelected = new ArrayList<Integer>();
  67.  
  68. Inventory _inventory = player.getInventory();
  69.  
  70. StringTokenizer st = new StringTokenizer(command.substring(11).trim());
  71.  
  72. try
  73. {
  74. if (st.countTokens()>1)
  75. {
  76. _pageId= Integer.parseInt(st.nextToken());
  77.  
  78. while (st.hasMoreTokens())
  79. {
  80. int _itemObjId=Integer.parseInt(st.nextToken());
  81.  
  82. if ((_inventory.getItemByObjectId(_itemObjId)!=null)&&
  83. (!_itemsSelected.contains(_itemObjId)))
  84. _itemsSelected.add(_itemObjId);
  85. }
  86. }
  87. else
  88. _pageId= Integer.parseInt(command.substring(11).trim());
  89. }
  90. catch (NumberFormatException e)
  91. {
  92. _pageId=0;
  93. }
  94. ArrayList<Integer> _items = new ArrayList<Integer>();
  95.  
  96. int _priceTotal = 0;
  97.  
  98. ArrayList<Integer> _crystals = new ArrayList<Integer>();
  99.  
  100. _crystals.add(0,0);_crystals.add(1,0);_crystals.add(2,0);
  101. _crystals.add(3,0);_crystals.add(4,0);_crystals.add(5,0);
  102.  
  103. for(L2ItemInstance _item : _inventory.getItems())
  104. {
  105. if (!_item.isStackable() && _item.getItem().getCrystalType() != L2Item.CRYSTAL_NONE && _item.getItem().getCrystalCount() > 0
  106. && _item.getItem().getCrystalType() != L2Item.CRYSTAL_S)
  107. {
  108. _items.add(_item.getObjectId());
  109.  
  110. if (_itemsSelected.contains(_item.getObjectId()))
  111. {
  112. int _count =_crystals.get(_item.getItem().getCrystalType())+_item.getCrystalCount();
  113. _crystals.set(_item.getItem().getCrystalType(), _count);
  114.  
  115. int _crystalId = 1457 + _item.getItem().getCrystalType();
  116.  
  117. int _price = (int)( Config.ALT_CRAFT_PRICE * _count * ItemTable.getInstance().getTemplate(_crystalId).getReferencePrice());
  118. if (_price==0) _price=Config.ALT_CRAFT_DEFAULT_PRICE;
  119.  
  120. _priceTotal+=_price;
  121. }
  122. }
  123. }
  124. if (_items.size()==0)
  125. {
  126. sendOutOfItems(player,"at least one","breakable item");
  127. return;
  128. }
  129.  
  130. int _itemsOnPage=ITEMS_PER_PAGE;
  131. int _pages = _items.size()/_itemsOnPage;
  132.  
  133. if (_items.size()>_pages*_itemsOnPage) _pages++;
  134. if (_pageId>_pages) _pageId=_pages;
  135.  
  136. int _itemStart=_pageId*_itemsOnPage;
  137. int _itemEnd=_items.size();
  138.  
  139. if (_itemEnd - _itemStart > _itemsOnPage)
  140. _itemEnd = _itemStart + _itemsOnPage;
  141.  
  142. String _elementsSelected="";
  143.  
  144. for (int i=0;i<_itemsSelected.size();i++)
  145. _elementsSelected+=" "+_itemsSelected.get(i);
  146. NpcHtmlMessage npcReply = new NpcHtmlMessage(1);
  147.  
  148. TextBuilder replyMSG = new TextBuilder("<html><body>");
  149.  
  150. replyMSG.append("<center>Items to Crystallize</center>");
  151. replyMSG.append("<img src=\"L2UI.SquareWhite\" width=270 height=1> <img src=\"L2UI.SquareBlank\" width=1 height=3>");
  152. replyMSG.append("<table width=270><tr>");
  153. replyMSG.append("<td width=66><button value=\"Back\" action=\"bypass -h npc_"+getObjectId()+((_pageId==0)?"_Chat 0":"_Crystallize ")+(_pageId-1)+_elementsSelected+"\" width=66 height=16 back=\"L2UI.DefaultButton_click\" fore=\"L2UI.DefaultButton\"></td>");
  154. replyMSG.append("<td width=138></td>");
  155. replyMSG.append("<td width=66>"+((_pageId+1<_pages)?"<button value=\"Next\" action=\"bypass -h npc_"+getObjectId()+"_Crystallize "+(_pageId+1)+_elementsSelected+"\" width=66 height=16 back=\"L2UI.DefaultButton_click\" fore=\"L2UI.DefaultButton\">":"")+"</td>");
  156. replyMSG.append("</tr></table>");
  157. replyMSG.append("<br><br>");
  158. replyMSG.append("<table width=270><tr>");
  159. if (Config.ALT_CRAFT_ALLOW_CRYSTALLIZE)
  160. {
  161. replyMSG.append("<td width=35><button value=\"\" action=\"bypass -h npc_"+getObjectId()+"_BreakItem"+_elementsSelected+"\" width=32 height=32 back=\"icon.skill0248\" fore=\"icon.skill0248\"></td>");
  162. replyMSG.append("<td width=135>");
  163. replyMSG.append("<table border=0 width=100%>");
  164. replyMSG.append("<tr><td><font color=\"B09878\">Cristallize</font></td></tr>");
  165. replyMSG.append("<tr><td><font color=\"B09878\">selected items "+(_itemsSelected.size()==0?"":"("+_itemsSelected.size()+")")+"</font></td></tr></table></td>");
  166. replyMSG.append("<td width=100>");
  167. replyMSG.append("<table border=0 width=100%>");
  168. replyMSG.append("<tr><td><font color=\"A2A0A2\">Total price:</font></td></tr>");
  169. replyMSG.append("<tr><td><font color=\"B09878\">"+_priceTotal+" Adena</font></td></tr></table></td>");
  170. }
  171. replyMSG.append("</tr></table><br>");
  172.  
  173. for (int i=_itemStart;i<_itemEnd;i++)
  174. {
  175. L2ItemInstance _item = _inventory.getItemByObjectId(_items.get(i));
  176.  
  177. if (_item==null) continue;
  178.  
  179. int _crystalId = 1457 + _item.getItem().getCrystalType();
  180.  
  181. String _crystal = _item.getItem().getCrystalType()==1?"D":
  182. _item.getItem().getCrystalType()==2?"C":
  183. _item.getItem().getCrystalType()==3?"B":
  184. _item.getItem().getCrystalType()==4?"A":"S";
  185.  
  186. int _count =_item.getCrystalCount();
  187.  
  188. int _price = (int)(Config.ALT_CRAFT_PRICE * _count * ItemTable.getInstance().getTemplate(_crystalId).getReferencePrice());
  189. if (_price == 0)
  190. _price=Config.ALT_CRAFT_DEFAULT_PRICE;
  191.  
  192. replyMSG.append("<br><table width=270><tr>");
  193. replyMSG.append("<td width=35><img src="+getCrystalIcon(_item.getItem().getCrystalType())+" width=32 height=32 align=left></td>");
  194. replyMSG.append("<td width=215>");
  195. replyMSG.append("<table border=0 width=100%>");
  196. replyMSG.append("<tr><td><font color=\"A2A0A2\">"+ItemTable.getInstance().getTemplate(_item.getItemId()).getName()+(_item.getEnchantLevel()==0?"":" +"+_item.getEnchantLevel())+"</font></td></tr>");
  197. replyMSG.append("<tr><td><font color=\"A2A0A2\">"+_crystal+" Crystals:</font> <font color=\"B09878\">"+_count+"</font></td></tr></table></td>");
  198.  
  199. if (Config.ALT_CRAFT_ALLOW_CRYSTALLIZE)
  200. {
  201. if (_itemsSelected.contains(_items.get(i)))
  202. replyMSG.append("<td valign=center width=20><button value=\"\" action=\"bypass -h npc_"+getObjectId()+"_Crystallize "+_pageId+_elementsSelected.replace(" "+_items.get(i).toString(),"") +"\" width=16 height=16 back=\"L2UI.CheckBox_checked\" fore=\"L2UI.CheckBox_checked\"></td>");
  203. else
  204. replyMSG.append("<td valign=center width=20><button value=\"\" action=\"bypass -h npc_"+getObjectId()+"_Crystallize "+_pageId+" "+_items.get(i).toString()+_elementsSelected+"\" width=16 height=16 back=\"L2UI.CheckBox\" fore=\"L2UI.CheckBox\"></td>");
  205. }
  206. else replyMSG.append("<td valign=center width=20></td>");
  207.  
  208. replyMSG.append("</tr></table>");
  209. }
  210.  
  211. replyMSG.append("</body></html>");
  212.  
  213. npcReply.setHtml(replyMSG.toString());
  214. player.sendPacket(npcReply);
  215. }
  216. else if (command.startsWith("BreakItem") &&Config.ALT_CRAFT_ALLOW_CRYSTALLIZE)
  217. // Crystallize selected items
  218. {
  219. ArrayList<Integer> _itemsSelected = new ArrayList<Integer>();
  220. Inventory _inventory = player.getInventory();
  221.  
  222. StringTokenizer st = new StringTokenizer(command.substring(9).trim());
  223.  
  224. try
  225. {
  226. while (st.hasMoreTokens())
  227. {
  228. int _itemObjId=Integer.parseInt(st.nextToken());
  229.  
  230. if ((_inventory.getItemByObjectId(_itemObjId)!=null)&&
  231. (!_itemsSelected.contains(_itemObjId)))
  232. _itemsSelected.add(_itemObjId);
  233. }
  234. }
  235. catch (NumberFormatException e){}
  236.  
  237. if (_itemsSelected.size()==0)
  238. {
  239. sendOutOfItems(player,"at least one","breakable items");
  240. return;
  241. }
  242.  
  243. int _priceTotal = 0;
  244.  
  245. ArrayList<Integer> _crystals = new ArrayList<Integer>();
  246.  
  247. _crystals.add(0,0);_crystals.add(1,0);_crystals.add(2,0);
  248. _crystals.add(3,0);_crystals.add(4,0);_crystals.add(5,0);
  249.  
  250. for (int i=0;i<_itemsSelected.size();i++)
  251. {
  252.  
  253. L2ItemInstance _item = _inventory.getItemByObjectId(_itemsSelected.get(i));
  254.  
  255. if( _item!=null &&
  256. _item.getOwnerId()==player.getObjectId() &&
  257. !_item.isStackable() &&
  258. _item.getItem().getCrystalType() != L2Item.CRYSTAL_NONE &&
  259. _item.getItem().getCrystalCount() > 0 &&
  260. i<_itemsSelected.size())
  261. {
  262. int _count =_crystals.get(_item.getItem().getCrystalType())+_item.getCrystalCount();
  263.  
  264. _crystals.set(_item.getItem().getCrystalType(), _count);
  265.  
  266. int _crystalId = 1457 + _item.getItem().getCrystalType();
  267.  
  268. int _price = (int)(Config.ALT_CRAFT_PRICE * _count * ItemTable.getInstance().getTemplate(_crystalId).getReferencePrice());
  269. if (_price==0)
  270. _price=Config.ALT_CRAFT_DEFAULT_PRICE;
  271.  
  272. _priceTotal+=_price;
  273. }
  274. else
  275. _itemsSelected.remove(i);
  276. }
  277. if (_inventory.getInventoryItemCount(ADENA_ID,0)<_priceTotal)
  278. {
  279. sendOutOfItems(player,Integer.toString(_priceTotal),"Adena");
  280. return;
  281. }
  282.  
  283. InventoryUpdate iu = new InventoryUpdate();
  284.  
  285. player.destroyItemByItemId("CraftManager", ADENA_ID, _priceTotal, player, true);
  286. iu.addModifiedItem(player.getInventory().getItemByItemId(ADENA_ID));
  287. for (int i=0;i<_itemsSelected.size();i++)
  288. {
  289. L2ItemInstance _item = _inventory.getItemByObjectId(_itemsSelected.get(i));
  290.  
  291. if( _item!=null &&
  292. _item.getOwnerId()==player.getObjectId() &&
  293. !_item.isStackable() &&
  294. _item.getItem().getCrystalType() != L2Item.CRYSTAL_NONE &&
  295. _item.getItem().getCrystalCount() > 0)
  296. {
  297.  
  298. if (_item.isEquipped())
  299. {
  300. L2ItemInstance[] unequiped = player.getInventory().unEquipItemInSlotAndRecord(_item.getEquipSlot());
  301.  
  302. if (_item.isEquipped())
  303. for (L2ItemInstance element : unequiped)
  304. iu.addModifiedItem(element);
  305. }
  306.  
  307. player.destroyItem("CraftManager", _itemsSelected.get(i), 1, player, true);
  308. iu.addModifiedItem(player.getInventory().getItemByObjectId(_itemsSelected.get(i)));
  309. }
  310. }
  311.  
  312. for (int i=0;i<_crystals.size();i++)
  313. {
  314. if (_crystals.get(i)>0)
  315. {
  316. int _crystalId = 1457 + i;
  317.  
  318. SystemMessage sm = new SystemMessage(SystemMessage.EARNED_S2_S1_s);
  319. sm.addItemName(_crystalId);
  320. sm.addNumber(_crystals.get(i));
  321. player.sendPacket(sm);
  322.  
  323. _inventory.addItem("CraftManager", _crystalId, _crystals.get(i), player, player.getTarget());
  324.  
  325. iu.addModifiedItem(player.getInventory().getItemByItemId(_crystalId));
  326. }
  327. }
  328. player.sendPacket(iu);
  329. player.broadcastUserInfo();
  330. }
  331. else if (command.startsWith("Manufacture"))
  332. // List recipes from player inventory
  333.  
  334. {
  335. int _pageId;
  336.  
  337. try
  338. {
  339. _pageId= Integer.parseInt(command.substring(11).trim());
  340. }
  341. catch (NumberFormatException e)
  342. {
  343. _pageId=0;
  344. }
  345.  
  346. Inventory _inventory = player.getInventory();
  347.  
  348. ArrayList<Integer> _recipes = new ArrayList<Integer>();
  349. for(L2ItemInstance _item : _inventory.getItems())
  350. {
  351. if (_item.getItemType()==L2EtcItemType.RECEIPE)
  352. {
  353. L2RecipeList _recipe = RecipeController.getInstance().getRecipeByItemId(_item.getItemId());
  354.  
  355. if (_recipe!=null)_recipes.add(_item.getObjectId());
  356. }
  357. }
  358.  
  359. if (_recipes.size()==0)
  360. {
  361. sendOutOfItems(player,"at least one","recipe");
  362. return;
  363. }
  364.  
  365. int _itemsOnPage=ITEMS_PER_PAGE;
  366. int _pages = _recipes.size()/_itemsOnPage;
  367.  
  368. if (_recipes.size()>_pages*_itemsOnPage) _pages++;
  369. if (_pageId>_pages) _pageId=_pages;
  370.  
  371. int _itemStart=_pageId*_itemsOnPage;
  372. int _itemEnd=_recipes.size();
  373. if (_itemEnd - _itemStart > _itemsOnPage)
  374.  
  375. _itemEnd = _itemStart + _itemsOnPage;
  376. NpcHtmlMessage npcReply = new NpcHtmlMessage(1);
  377.  
  378. TextBuilder replyMSG = new TextBuilder("<html><body>");
  379.  
  380. replyMSG.append("<center>List of Recipes</center>");
  381. replyMSG.append("<img src=\"L2UI.SquareWhite\" width=270 height=1> <img src=\"L2UI.SquareBlank\" width=1 height=3>");
  382. replyMSG.append("<table width=270><tr>");
  383. replyMSG.append("<td width=66><button value=\"Back\" action=\"bypass -h npc_"+getObjectId()+((_pageId==0)?"_Chat 0":"_Manufacture ")+(_pageId-1)+"\" width=66 height=16 back=\"L2UI.DefaultButton_click\" fore=\"L2UI.DefaultButton\"></td>");
  384. replyMSG.append("<td width=138></td>");
  385. replyMSG.append("<td width=66>"+((_pageId+1<_pages)?"<button value=\"Next\" action=\"bypass -h npc_"+getObjectId()+"_Manufacture "+(_pageId+1)+"\" width=66 height=16 back=\"L2UI.DefaultButton_click\" fore=\"L2UI.DefaultButton\">":"")+"</td>");
  386. replyMSG.append("</tr></table>");
  387. replyMSG.append("<br>");
  388.  
  389. for (int i=_itemStart;i<_itemEnd;i++)
  390. {
  391. L2ItemInstance _recipe = _inventory.getItemByObjectId(_recipes.get(i));
  392.  
  393. if (_recipe==null) continue;
  394.  
  395. L2RecipeList _recipeList = RecipeController.getInstance().getRecipeByItemId(_recipe.getItemId());
  396.  
  397. boolean _isConsumable = ItemTable.getInstance().getTemplate(_recipeList.getItemId()).isConsumable();
  398.  
  399. if (_recipeList==null) continue;
  400.  
  401. int _price = (int)(Config.ALT_CRAFT_PRICE * _recipeList.getSuccessRate()/100 * ItemTable.getInstance().getTemplate(_recipeList.getItemId()).getReferencePrice());
  402. if (_price == 0) _price=Config.ALT_CRAFT_DEFAULT_PRICE;
  403.  
  404. int _grade = ItemTable.getInstance().getTemplate(_recipeList.getItemId()).getCrystalType();
  405.  
  406. String _recipeIcon = _recipeList.isDwarvenRecipe() ? getRecipeIcon(_grade):"icon.etc_recipe_green_i00";
  407.  
  408. replyMSG.append("<br>");
  409. replyMSG.append("<table width=270><tr>");
  410. replyMSG.append("<td valign=top width=35><button value=\"\" action=\"bypass -h npc_"+getObjectId()+"_CraftInfo "+_recipes.get(i)+" 1 "+_pageId+"\" width=32 height=32 back=\""+_recipeIcon +"\" fore=\""+_recipeIcon +"\"></td>");
  411. replyMSG.append("<td valign=top width=235>");
  412. replyMSG.append("<table border=0 width=100%>");
  413. replyMSG.append("<tr><td><font color=\"A2A0A2\">"+ItemTable.getInstance().getTemplate(_recipe.getItemId()).getName()+"</font></td></tr>");
  414. replyMSG.append("<tr><td><font color=\"A2A0A2\">Product:</font> <font color=\"B09878\">"+(_isConsumable?_recipeList.getCount()+" ":"")+ItemTable.getInstance().getTemplate(_recipeList.getItemId()).getName()+"</font></td></tr></table></td>");
  415. replyMSG.append("</tr></table>");
  416. replyMSG.append("<br>");
  417. }
  418.  
  419. replyMSG.append("</body></html>");
  420.  
  421. npcReply.setHtml(replyMSG.toString());
  422.  
  423. player.sendPacket(npcReply);
  424. }
  425. else if (command.startsWith("CraftInfo"))
  426. // Show information about choosen recipe
  427. {
  428. int _recipeObjId=0;
  429. int _pageId=0;
  430. int _quantity=1;
  431.  
  432. StringTokenizer st = new StringTokenizer(command.substring(9).trim());
  433.  
  434. try
  435. {
  436. if (st.countTokens()>2)
  437. {
  438. _recipeObjId = Integer.parseInt(st.nextToken());
  439. _quantity = Integer.parseInt(st.nextToken());
  440. }
  441. else _recipeObjId = Integer.parseInt(st.nextToken());
  442.  
  443. _pageId = Integer.parseInt(st.nextToken());
  444. }
  445. catch (NumberFormatException e){}
  446.  
  447. Inventory _inventory = player.getInventory();
  448.  
  449. L2ItemInstance _recipe = _inventory.getItemByObjectId(_recipeObjId);
  450. L2RecipeList _recipeList = RecipeController.getInstance().getRecipeByItemId(_recipe.getItemId());
  451.  
  452. boolean _isConsumable = ItemTable.getInstance().getTemplate(_recipeList.getItemId()).isConsumable();
  453.  
  454. if( _recipe!=null &&
  455. _recipe.getOwnerId()==player.getObjectId() &&
  456. _recipe.getItemType()==L2EtcItemType.RECEIPE &&
  457. _recipeList!=null)
  458. {
  459. int _price =(int)(Config.ALT_CRAFT_PRICE * _recipeList.getSuccessRate()/100 * _quantity * (_isConsumable?_recipeList.getCount():1) * ItemTable.getInstance().getTemplate(_recipeList.getItemId()).getReferencePrice());
  460. if (_price==0) _price=Config.ALT_CRAFT_DEFAULT_PRICE;
  461.  
  462. NpcHtmlMessage npcReply = new NpcHtmlMessage(1);
  463.  
  464. TextBuilder replyMSG = new TextBuilder("<html><body>");
  465.  
  466. replyMSG.append("<center>Craft Info</center>");
  467. replyMSG.append("<img src=\"L2UI.SquareWhite\" width=270 height=1> <img src=\"L2UI.SquareBlank\" width=1 height=3>");
  468. replyMSG.append("<table width=270><tr>");
  469. replyMSG.append("<td width=66><button value=\"Back\" action=\"bypass -h npc_"+getObjectId()+"_Manufacture "+_pageId+"\" width=66 height=16 back=\"L2UI.DefaultButton_click\" fore=\"L2UI.DefaultButton\"></td>");
  470. replyMSG.append("<td width=138></td>");
  471. replyMSG.append("<td width=66></td>");
  472. replyMSG.append("</tr></table>");
  473. replyMSG.append("<br>");
  474. replyMSG.append("<table width=270><tr>");
  475.  
  476. if ((_recipeList.isDwarvenRecipe()&&Config.ALT_CRAFT_ALLOW_CRAFT)||(!_recipeList.isDwarvenRecipe()&&Config.ALT_CRAFT_ALLOW_COMMON))
  477. replyMSG.append("<td valign=top width=35><button value=\"\" action=\"bypass -h npc_"+getObjectId()+"_CraftItem "+_recipeObjId+" "+_quantity+"\" width=32 height=32 back=\"icon.skill0172\" fore=\"icon.skill0172\"></td>");
  478. else
  479. replyMSG.append("<td valign=top width=35><img src=icon.skill0172 width=32 height=32 align=left></td>");
  480.  
  481. replyMSG.append("<td valign=top width=235>");
  482. replyMSG.append("<table border=0 width=100%>");
  483. replyMSG.append("<tr><td><font color=\"A2A0A2\">"+ItemTable.getInstance().getTemplate(_recipeList.getItemId()).getName()+"</font></td></tr>");
  484. replyMSG.append("<tr><td><font color=\"A2A0A2\">Product:</font> <font color=\"B09878\">"+(_isConsumable?_recipeList.getCount()*_quantity+" ":_quantity>1?_quantity:"")+ItemTable.getInstance().getTemplate(_recipeList.getItemId()).getName()+"</font></td></tr>");
  485.  
  486. if ((_recipeList.isDwarvenRecipe()&&Config.ALT_CRAFT_ALLOW_CRAFT)||(!_recipeList.isDwarvenRecipe()&&Config.ALT_CRAFT_ALLOW_COMMON))
  487. replyMSG.append("<tr><td><font color=\"A2A0A2\">Price:</font> <font color=\"B09878\">"+_price+" Adena</font></td></tr></table></td>");
  488. else
  489. replyMSG.append("<tr><td></td></tr></table></td>");
  490.  
  491. replyMSG.append("</tr></table>");
  492. replyMSG.append("<br>");
  493. replyMSG.append("<center>");
  494. replyMSG.append("<table width=210>");
  495. replyMSG.append("<tr><td valign=top width=70><font color=\"B09878\">Enter quantity:</font></td><td></td></tr>");
  496. replyMSG.append("<tr><td valign=top width=70><edit var=\"quantity\" width=70></td>");
  497. replyMSG.append("<td valign=top width=70><button value=\"Calculate\" action=\"bypass -h npc_"+getObjectId()+"_CraftInfo "+_recipeObjId+" $quantity "+_pageId+"\" width=66 height=16 back=\"L2UI.DefaultButton_click\" fore=\"L2UI.DefaultButton\"></td>");
  498. replyMSG.append("</tr></table>");
  499. replyMSG.append("</center>");
  500. replyMSG.append("<br>");
  501. replyMSG.append("<br>");
  502. replyMSG.append("<table width=270><tr>");
  503. replyMSG.append("<td width=220><font color=\"A2A0A2\">Ingredients</font></td>");
  504. replyMSG.append("<td width=50><font color=\"A2A0A2\">Quantity</font></td></tr>");
  505.  
  506. L2RecipeInstance[] _recipeItems = _recipeList.getRecipes();
  507.  
  508. for (L2RecipeInstance _recipeItem:_recipeItems)
  509. {
  510. L2ItemInstance _item = _inventory.getItemByItemId(_recipeItem.getItemId());
  511.  
  512. String _quantityState="<font color=\"55FF55\">"+_quantity*_recipeItem.getQuantity()+"</font>";
  513.  
  514. if ((_item==null)||(_item.getCount()<_quantity*_recipeItem.getQuantity()))
  515. _quantityState="<font color=\"FF5555\">"+(int)(_quantity*_recipeItem.getQuantity()*Config.ALT_RATE_CRAFT_COST)+"</font>";
  516.  
  517. replyMSG.append("<tr><td width=220>"+ItemTable.getInstance().getTemplate(_recipeItem.getItemId()).getName()+"</td>");
  518. replyMSG.append("<td width=50>"+_quantityState+"</td></tr>");
  519. }
  520.  
  521. replyMSG.append("</table>");
  522. replyMSG.append("</body></html>");
  523.  
  524. npcReply.setHtml(replyMSG.toString());
  525. player.sendPacket(npcReply);
  526. }
  527. }
  528. else if (command.startsWith("CraftItem") && (Config.ALT_CRAFT_ALLOW_CRAFT || Config.ALT_CRAFT_ALLOW_COMMON))
  529. // Craft amount of items using selected recipe
  530. {
  531. int _recipeObjId=0;
  532. int _quantity=1;
  533. StringTokenizer st = new StringTokenizer(command.substring(9).trim());
  534.  
  535. if (st.countTokens()!=2) return;
  536.  
  537. try
  538. {
  539. _recipeObjId = Integer.parseInt(st.nextToken());
  540. _quantity = Integer.parseInt(st.nextToken());
  541. }
  542. catch (NumberFormatException e){}
  543. Inventory _inventory = player.getInventory();
  544.  
  545. L2ItemInstance _recipe = _inventory.getItemByObjectId(_recipeObjId);
  546. L2RecipeList _recipeList = RecipeController.getInstance().getRecipeByItemId(_recipe.getItemId());
  547.  
  548. boolean _isConsumable = ItemTable.getInstance().getTemplate(_recipeList.getItemId()).isConsumable();
  549. if( _recipe!=null &&
  550. _recipe.getOwnerId()==player.getObjectId() &&
  551. _recipe.getItemType()==L2EtcItemType.RECEIPE &&
  552. _recipeList!=null &&
  553. ((_recipeList.isDwarvenRecipe()&&Config.ALT_CRAFT_ALLOW_CRAFT)||(!_recipeList.isDwarvenRecipe()&&Config.ALT_CRAFT_ALLOW_COMMON)))
  554. {
  555. L2RecipeInstance[] _recipeItems = _recipeList.getRecipes();
  556.  
  557. boolean _enoughtMaterials=true;
  558.  
  559. for (L2RecipeInstance _recipeItem:_recipeItems)
  560. {
  561. L2ItemInstance _item = _inventory.getItemByItemId(_recipeItem.getItemId());
  562. if ((_item==null)||(_item.getCount()<(int)(_quantity*_recipeItem.getQuantity()*Config.ALT_RATE_CRAFT_COST)))
  563. _enoughtMaterials=false;
  564. }
  565.  
  566. int _price =(int)(Config.ALT_CRAFT_PRICE * _recipeList.getSuccessRate()/100 * _quantity * _recipeList.getCount() * ItemTable.getInstance().getTemplate(_recipeList.getItemId()).getReferencePrice());
  567. if (_price==0) _price=Config.ALT_CRAFT_DEFAULT_PRICE;
  568.  
  569. if (_inventory.getInventoryItemCount(ADENA_ID,0)<_price)
  570. {
  571. sendOutOfItems(player,Integer.toString(_price),"Adena");
  572. return;
  573. }
  574.  
  575. if (!_enoughtMaterials)
  576. {
  577. sendOutOfItems(player,"proper amount","materials");
  578. return;
  579. }
  580.  
  581. int _quantitySuccess=0;
  582.  
  583. for(int i=0;i<_quantity;i++)
  584. if (Rnd.get(100) < _recipeList.getSuccessRate()) _quantitySuccess++;
  585.  
  586. InventoryUpdate iu = new InventoryUpdate();
  587.  
  588. for (L2RecipeInstance _recipeItem:_recipeItems)
  589. {
  590. player.destroyItemByItemId("CraftManager", _recipeItem.getItemId(), (int)(_quantity*_recipeItem.getQuantity()*Config.ALT_RATE_CRAFT_COST), player, true);
  591. iu.addModifiedItem(player.getInventory().getItemByItemId(_recipeItem.getItemId()));
  592. }
  593.  
  594. player.destroyItemByItemId("CraftManager", ADENA_ID, _price, player, true);
  595. iu.addModifiedItem(player.getInventory().getItemByItemId(ADENA_ID));
  596.  
  597. if (_quantitySuccess>0)
  598. {
  599. SystemMessage sm = new SystemMessage(SystemMessage.EARNED_S2_S1_s);
  600. sm.addItemName(_recipeList.getItemId());
  601. sm.addNumber(_quantitySuccess * _recipeList.getCount());
  602. player.sendPacket(sm);
  603. sm=null;
  604.  
  605. iu.addModifiedItem(player.getInventory().getItemByItemId(_recipeList.getItemId()));
  606. _inventory.addItem("CraftManager", _recipeList.getItemId(), _quantitySuccess * (_isConsumable?_recipeList.getCount():1), player, player.getTarget());
  607. }
  608.  
  609. player.sendPacket(iu);
  610. iu=null;
  611.  
  612. player.broadcastUserInfo();
  613. sendCraftedItems(player,_quantitySuccess * (_isConsumable?_recipeList.getCount():1),(_quantity-_quantitySuccess)* (_isConsumable?_recipeList.getCount():1),ItemTable.getInstance().getTemplate(_recipeList.getItemId()).getName());
  614. }
  615. }
  616. else
  617. super.onBypassFeedback(player,command);
  618. }
  619.  
  620. public String getRecipeIcon(int grade)
  621. {
  622. return "icon.etc_recipe_"+(
  623. grade==1?"blue":
  624. grade==2?"yellow":
  625. grade==3?"red":
  626. grade==4?"violet":
  627. grade==5?"black":"white")+"_i00";
  628. }
  629.  
  630. public String getCrystalIcon(int grade)
  631. {
  632. return "icon.etc_crystal_"+(grade==1?"blue":
  633. grade==2?"green":
  634. grade==3?"red":
  635. grade==4?"silver":"gold")+"_i00";
  636. }
  637.  
  638. public void sendOutOfItems(L2PcInstance player, String count, String itemname)
  639. {
  640. NpcHtmlMessage npcReply = new NpcHtmlMessage(1);
  641.  
  642. TextBuilder replyMSG = new TextBuilder("<html><body>");
  643.  
  644. replyMSG.append(getName()+":<br>");
  645. replyMSG.append("Come back later, when you will have "+count+" of "+itemname+".");
  646. replyMSG.append("</body></html>");
  647.  
  648. npcReply.setHtml(replyMSG.toString());
  649.  
  650. player.sendPacket(npcReply);
  651. }
  652.  
  653. public void sendCraftedItems(L2PcInstance player, int success, int failed, String itemname)
  654. {
  655. NpcHtmlMessage npcReply = new NpcHtmlMessage(1);
  656.  
  657. TextBuilder replyMSG = new TextBuilder("<html><body>");
  658.  
  659. replyMSG.append(getName()+":<br>");
  660.  
  661. if (success==0)
  662. replyMSG.append("I am sorry, "+player.getName()+", but all attempts to create <font color=\"LEVEL\">"+itemname+"</font> failed. All your materials have been lost.");
  663. else
  664. if (failed==0)
  665. replyMSG.append("Congratulations, "+player.getName()+", I created "+success+" <font color=\"LEVEL\">"+itemname+"</font> for you!");
  666. else
  667. replyMSG.append("Here you go, "+player.getName()+", "+success+" <font color=\"LEVEL\">"+itemname+"</font> successfully created, but "+failed+" broken while craft.");
  668.  
  669. replyMSG.append("</body></html>");
  670.  
  671. npcReply.setHtml(replyMSG.toString());
  672.  
  673. player.sendPacket(npcReply);
  674. }
  675.  
  676. @Override
  677. public String getHtmlPath(int npcId, int val)
  678. {
  679. String pom = "";
  680. if (val == 0)
  681. {
  682. pom = "" + npcId;
  683. }
  684. else
  685. {
  686. pom = npcId + "-" + val;
  687. }
  688.  
  689. return "data/html/default/" + pom + ".htm";
  690. }
  691. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement