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.

115 lines
2.2 KiB

  1. const learnRecipe = require('./learnRecipe');
  2. const isOnCooldown = (obj, cpnInv, { item, cd }) => {
  3. if (item.cdMax) {
  4. if (cd) {
  5. process.send({
  6. method: 'events',
  7. data: {
  8. onGetAnnouncement: [{
  9. obj: {
  10. msg: 'That item is on cooldown'
  11. },
  12. to: [obj.serverId]
  13. }]
  14. }
  15. });
  16. return true;
  17. }
  18. return false;
  19. }
  20. return false;
  21. };
  22. const placeItemOnCooldown = (obj, cpnInv, item, { cdMax }) => {
  23. item.cd = cdMax;
  24. //Find similar items and put them on cooldown too
  25. cpnInv.items.forEach(function (i) {
  26. if (i.name === item.name && i.cdMax === item.cdMax)
  27. i.cd = cdMax;
  28. });
  29. };
  30. module.exports = async (cpnInv, itemId) => {
  31. let item = cpnInv.findItem(itemId);
  32. if (!item)
  33. return;
  34. let obj = cpnInv.obj;
  35. const beforeGetCooldownMessage = {
  36. obj,
  37. item,
  38. cd: item.cd
  39. };
  40. obj.instance.eventEmitter.emit('onBeforeGetItemCd', beforeGetCooldownMessage);
  41. obj.fireEvent('onBeforeGetItemCd', beforeGetCooldownMessage);
  42. if (isOnCooldown(obj, cpnInv, beforeGetCooldownMessage))
  43. return;
  44. let result = {
  45. success: true,
  46. cdMax: item.cdMax
  47. };
  48. obj.instance.eventEmitter.emit('onBeforeUseItem', obj, item, result);
  49. obj.fireEvent('onBeforeUseItem', item, result);
  50. if (!result.success)
  51. return;
  52. placeItemOnCooldown(obj, cpnInv, item, result);
  53. if (item.recipe) {
  54. const didLearn = await learnRecipe(obj, item);
  55. if (didLearn)
  56. cpnInv.destroyItem(itemId, 1);
  57. return;
  58. }
  59. let effects = (item.effects || []);
  60. let eLen = effects.length;
  61. for (let j = 0; j < eLen; j++) {
  62. let effect = effects[j];
  63. if (!effect.events)
  64. continue;
  65. let effectEvent = effect.events.onConsumeItem;
  66. if (!effectEvent)
  67. continue;
  68. let effectResult = {
  69. success: true,
  70. errorMessage: null
  71. };
  72. effectEvent.call(obj, effectResult, item, effect);
  73. if (!effectResult.success) {
  74. obj.social.notifySelf({ message: effectResult.errorMessage });
  75. return;
  76. }
  77. }
  78. if (item.type === 'consumable') {
  79. if (item.uses) {
  80. item.uses--;
  81. if (item.uses) {
  82. obj.syncer.setArray(true, 'inventory', 'getItems', item);
  83. return;
  84. }
  85. }
  86. cpnInv.destroyItem(itemId, 1);
  87. if (item.isDefined('quickSlot'))
  88. cpnInv.obj.equipment.replaceQuickSlot(item);
  89. }
  90. };