You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

95 lines
2.4 KiB

  1. const recipes = require('../../config/recipes/recipes');
  2. const generator = require('../../items/generator');
  3. const { applyItemStats } = require('../equipment/helpers');
  4. const buildRecipe = require('../workbench/buildRecipe');
  5. const buildMaterials = require('../workbench/buildMaterials');
  6. const buildPickedItems = require('../workbench/buildPickedItems');
  7. module.exports = (cpnWorkbench, msg) => {
  8. const { craftType, obj: { instance: { objects: { objects } } } } = cpnWorkbench;
  9. const { name: recipeName, sourceId } = msg;
  10. const crafter = objects.find(o => o.serverId === sourceId);
  11. if (!crafter || !crafter.player)
  12. return null;
  13. const recipe = recipes.getRecipe(craftType, recipeName);
  14. if (!recipe)
  15. return null;
  16. const { needItems = [] } = recipe;
  17. const { inventory, equipment, spellbook } = crafter;
  18. const materials = buildMaterials(crafter, recipe, msg);
  19. const pickedItems = buildPickedItems(crafter, recipe, msg);
  20. const canCraft = (
  21. !materials.some(m => m.noHaveEnough) &&
  22. pickedItems.length === needItems.length &&
  23. !pickedItems.some(i => !i)
  24. );
  25. if (!canCraft)
  26. return null;
  27. materials.forEach(m => inventory.destroyItem(m.id, m.needQuantity));
  28. let resultMsg = null;
  29. if (recipe.craftAction) {
  30. pickedItems.forEach(p => {
  31. if (p.eq)
  32. applyItemStats(crafter, p, false);
  33. });
  34. const oldSlots = pickedItems.map(p => p.slot);
  35. resultMsg = recipe.craftAction(crafter, pickedItems);
  36. pickedItems.forEach((p, i) => {
  37. if (!p.eq)
  38. return;
  39. applyItemStats(crafter, p, true);
  40. if (p.slot !== oldSlots[i])
  41. equipment.unequip(p.id);
  42. spellbook.calcDps();
  43. });
  44. equipment.unequipAttrRqrGear();
  45. }
  46. if (recipe.item || recipe.items) {
  47. const outputItems = recipe.item ? [ recipe.item ] : recipe.items;
  48. outputItems.forEach(itemBpt => {
  49. let item = null;
  50. if (itemBpt.generate)
  51. item = generator.generate(itemBpt);
  52. else
  53. item = extend({}, itemBpt);
  54. if (item.description)
  55. item.description += `<br /><br />(Crafted by ${crafter.name})`;
  56. else
  57. item.description = `<br /><br />(Crafted by ${crafter.name})`;
  58. const quantity = item.quantity;
  59. if (quantity && quantity.push)
  60. item.quantity = quantity[0] + ~~(Math.random() * (quantity[1] - quantity[0]));
  61. console.log(item);
  62. crafter.inventory.getItem(item);
  63. });
  64. }
  65. const result = {
  66. resultMsg,
  67. recipe: buildRecipe(craftType, crafter, msg)
  68. };
  69. return result;
  70. };