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.
 
 
 

124 lines
2.3 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. //Deprecated
  49. obj.instance.eventEmitter.emit('onBeforeUseItem', obj, item, result);
  50. obj.fireEvent('onBeforeUseItem', item, result);
  51. //New
  52. const eventMsg = {
  53. obj,
  54. item,
  55. cdMax: item.cdMax,
  56. success: true
  57. };
  58. obj.instance.eventEmitter.emit('beforeUseItem', eventMsg);
  59. if (!result.success || !eventMsg.success)
  60. return;
  61. placeItemOnCooldown(obj, cpnInv, item, result);
  62. if (item.recipe) {
  63. const didLearn = await learnRecipe(obj, item);
  64. if (didLearn)
  65. cpnInv.destroyItem({ itemId }, 1);
  66. return;
  67. }
  68. let effects = (item.effects || []);
  69. let eLen = effects.length;
  70. for (let j = 0; j < eLen; j++) {
  71. let effect = effects[j];
  72. if (!effect.events)
  73. continue;
  74. let effectEvent = effect.events.onConsumeItem;
  75. if (!effectEvent)
  76. continue;
  77. let effectResult = {
  78. success: true,
  79. errorMessage: null
  80. };
  81. effectEvent.call(obj, effectResult, item, effect);
  82. if (!effectResult.success) {
  83. obj.social.notifySelf({ message: effectResult.errorMessage });
  84. return;
  85. }
  86. }
  87. if (item.type === 'consumable') {
  88. if (item.uses) {
  89. item.uses--;
  90. if (item.uses) {
  91. obj.syncer.setArray(true, 'inventory', 'getItems', item);
  92. return;
  93. }
  94. }
  95. cpnInv.destroyItem({ itemId }, 1);
  96. if (item.has('quickSlot'))
  97. cpnInv.obj.equipment.replaceQuickSlot(item);
  98. }
  99. };